Skip to content

Commit ca10367

Browse files
committed
Merge tag 'drm-misc-fixes-2024-09-05' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
A zpos normalization fix for komeda, a register bitmask fix for nouveau, a memory leak fix for imagination, three fixes for the recent bridge HDMI work, a potential DoS fix and a cache coherency for panthor, a change of panel compatible and a deferred-io fix when used with non-highmem memory. Signed-off-by: Dave Airlie <[email protected]> From: Maxime Ripard <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/20240905-original-radical-guan-e7a2ae@houat
2 parents 4de4a0f + 5a498d4 commit ca10367

File tree

33 files changed

+202
-47
lines changed

33 files changed

+202
-47
lines changed

Documentation/devicetree/bindings/display/panel/wl-355608-a8.yaml renamed to Documentation/devicetree/bindings/display/panel/anbernic,rg35xx-plus-panel.yaml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
22
%YAML 1.2
33
---
4-
$id: http://devicetree.org/schemas/display/panel/wl-355608-a8.yaml#
4+
$id: http://devicetree.org/schemas/display/panel/anbernic,rg35xx-plus-panel.yaml#
55
$schema: http://devicetree.org/meta-schemas/core.yaml#
66

7-
title: WL-355608-A8 3.5" (640x480 pixels) 24-bit IPS LCD panel
7+
title: Anbernic RG35XX series (WL-355608-A8) 3.5" 640x480 24-bit IPS LCD panel
88

99
maintainers:
1010
- Ryan Walklin <[email protected]>
@@ -15,7 +15,14 @@ allOf:
1515

1616
properties:
1717
compatible:
18-
const: wl-355608-a8
18+
oneOf:
19+
- const: anbernic,rg35xx-plus-panel
20+
- items:
21+
- enum:
22+
- anbernic,rg35xx-2024-panel
23+
- anbernic,rg35xx-h-panel
24+
- anbernic,rg35xx-sp-panel
25+
- const: anbernic,rg35xx-plus-panel
1926

2027
reg:
2128
maxItems: 1
@@ -40,7 +47,7 @@ examples:
4047
#size-cells = <0>;
4148
4249
panel@0 {
43-
compatible = "wl-355608-a8";
50+
compatible = "anbernic,rg35xx-plus-panel";
4451
reg = <0>;
4552
4653
spi-3wire;

MAINTAINERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7457,8 +7457,8 @@ S: Maintained
74577457
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
74587458
F: Documentation/devicetree/bindings/display/bridge/
74597459
F: drivers/gpu/drm/bridge/
7460+
F: drivers/gpu/drm/display/drm_bridge_connector.c
74607461
F: drivers/gpu/drm/drm_bridge.c
7461-
F: drivers/gpu/drm/drm_bridge_connector.c
74627462
F: include/drm/drm_bridge.h
74637463
F: include/drm/drm_bridge_connector.h
74647464

drivers/gpu/drm/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ obj-$(CONFIG_DRM_TTM_HELPER) += drm_ttm_helper.o
128128
drm_kms_helper-y := \
129129
drm_atomic_helper.o \
130130
drm_atomic_state_helper.o \
131-
drm_bridge_connector.o \
132131
drm_crtc_helper.o \
133132
drm_damage_helper.o \
134133
drm_encoder_slave.o \

drivers/gpu/drm/arm/display/komeda/komeda_kms.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc *crtc,
160160
struct drm_plane *plane;
161161
struct list_head zorder_list;
162162
int order = 0, err;
163+
u32 slave_zpos = 0;
163164

164165
DRM_DEBUG_ATOMIC("[CRTC:%d:%s] calculating normalized zpos values\n",
165166
crtc->base.id, crtc->name);
@@ -199,10 +200,13 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc *crtc,
199200
plane_st->zpos, plane_st->normalized_zpos);
200201

201202
/* calculate max slave zorder */
202-
if (has_bit(drm_plane_index(plane), kcrtc->slave_planes))
203+
if (has_bit(drm_plane_index(plane), kcrtc->slave_planes)) {
204+
slave_zpos = plane_st->normalized_zpos;
205+
if (to_kplane_st(plane_st)->layer_split)
206+
slave_zpos++;
203207
kcrtc_st->max_slave_zorder =
204-
max(plane_st->normalized_zpos,
205-
kcrtc_st->max_slave_zorder);
208+
max(slave_zpos, kcrtc_st->max_slave_zorder);
209+
}
206210
}
207211

208212
crtc_st->zpos_changed = true;

drivers/gpu/drm/bridge/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,7 @@ config DRM_TI_SN65DSI86
390390
depends on OF
391391
select DRM_DISPLAY_DP_HELPER
392392
select DRM_DISPLAY_HELPER
393+
select DRM_BRIDGE_CONNECTOR
393394
select DRM_KMS_HELPER
394395
select REGMAP_I2C
395396
select DRM_PANEL

drivers/gpu/drm/display/Kconfig

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
# SPDX-License-Identifier: MIT
22

3+
config DRM_DISPLAY_DP_AUX_BUS
4+
tristate
5+
depends on DRM
6+
depends on OF || COMPILE_TEST
7+
38
config DRM_DISPLAY_HELPER
49
tristate
510
depends on DRM
611
help
712
DRM helpers for display adapters.
813

9-
config DRM_DISPLAY_DP_AUX_BUS
10-
tristate
11-
depends on DRM
12-
depends on OF || COMPILE_TEST
14+
if DRM_DISPLAY_HELPER
15+
16+
config DRM_BRIDGE_CONNECTOR
17+
bool
18+
select DRM_DISPLAY_HDMI_STATE_HELPER
19+
help
20+
DRM connector implementation terminating DRM bridge chains.
1321

1422
config DRM_DISPLAY_DP_AUX_CEC
1523
bool "Enable DisplayPort CEC-Tunneling-over-AUX HDMI support"
16-
depends on DRM && DRM_DISPLAY_HELPER
1724
select DRM_DISPLAY_DP_HELPER
1825
select CEC_CORE
1926
help
@@ -25,7 +32,6 @@ config DRM_DISPLAY_DP_AUX_CEC
2532

2633
config DRM_DISPLAY_DP_AUX_CHARDEV
2734
bool "DRM DP AUX Interface"
28-
depends on DRM && DRM_DISPLAY_HELPER
2935
select DRM_DISPLAY_DP_HELPER
3036
help
3137
Choose this option to enable a /dev/drm_dp_auxN node that allows to
@@ -34,7 +40,6 @@ config DRM_DISPLAY_DP_AUX_CHARDEV
3440

3541
config DRM_DISPLAY_DP_HELPER
3642
bool
37-
depends on DRM_DISPLAY_HELPER
3843
help
3944
DRM display helpers for DisplayPort.
4045

@@ -61,19 +66,18 @@ config DRM_DISPLAY_DP_TUNNEL_STATE_DEBUG
6166

6267
config DRM_DISPLAY_HDCP_HELPER
6368
bool
64-
depends on DRM_DISPLAY_HELPER
6569
help
6670
DRM display helpers for HDCP.
6771

6872
config DRM_DISPLAY_HDMI_HELPER
6973
bool
70-
depends on DRM_DISPLAY_HELPER
7174
help
7275
DRM display helpers for HDMI.
7376

7477
config DRM_DISPLAY_HDMI_STATE_HELPER
7578
bool
76-
depends on DRM_DISPLAY_HELPER
7779
select DRM_DISPLAY_HDMI_HELPER
7880
help
7981
DRM KMS state helpers for HDMI.
82+
83+
endif # DRM_DISPLAY_HELPER

drivers/gpu/drm/display/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
obj-$(CONFIG_DRM_DISPLAY_DP_AUX_BUS) += drm_dp_aux_bus.o
44

55
drm_display_helper-y := drm_display_helper_mod.o
6+
drm_display_helper-$(CONFIG_DRM_BRIDGE_CONNECTOR) += \
7+
drm_bridge_connector.o
68
drm_display_helper-$(CONFIG_DRM_DISPLAY_DP_HELPER) += \
79
drm_dp_dual_mode_helper.o \
810
drm_dp_helper.o \

drivers/gpu/drm/drm_bridge_connector.c renamed to drivers/gpu/drm/display/drm_bridge_connector.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,19 @@ static void drm_bridge_connector_debugfs_init(struct drm_connector *connector,
216216
}
217217
}
218218

219+
static void drm_bridge_connector_reset(struct drm_connector *connector)
220+
{
221+
struct drm_bridge_connector *bridge_connector =
222+
to_drm_bridge_connector(connector);
223+
224+
drm_atomic_helper_connector_reset(connector);
225+
if (bridge_connector->bridge_hdmi)
226+
__drm_atomic_helper_connector_hdmi_reset(connector,
227+
connector->state);
228+
}
229+
219230
static const struct drm_connector_funcs drm_bridge_connector_funcs = {
220-
.reset = drm_atomic_helper_connector_reset,
231+
.reset = drm_bridge_connector_reset,
221232
.detect = drm_bridge_connector_detect,
222233
.fill_modes = drm_helper_probe_single_connector_modes,
223234
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,

drivers/gpu/drm/drm_fbdev_dma.c

Lines changed: 64 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,11 @@ static int drm_fbdev_dma_fb_release(struct fb_info *info, int user)
3636
return 0;
3737
}
3838

39-
FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(drm_fbdev_dma,
40-
drm_fb_helper_damage_range,
41-
drm_fb_helper_damage_area);
42-
4339
static int drm_fbdev_dma_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
4440
{
4541
struct drm_fb_helper *fb_helper = info->par;
46-
struct drm_framebuffer *fb = fb_helper->fb;
47-
struct drm_gem_dma_object *dma = drm_fb_dma_get_gem_obj(fb, 0);
4842

49-
if (!dma->map_noncoherent)
50-
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
51-
52-
return fb_deferred_io_mmap(info, vma);
43+
return drm_gem_prime_mmap(fb_helper->buffer->gem, vma);
5344
}
5445

5546
static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
@@ -70,13 +61,40 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
7061
}
7162

7263
static const struct fb_ops drm_fbdev_dma_fb_ops = {
64+
.owner = THIS_MODULE,
65+
.fb_open = drm_fbdev_dma_fb_open,
66+
.fb_release = drm_fbdev_dma_fb_release,
67+
__FB_DEFAULT_DMAMEM_OPS_RDWR,
68+
DRM_FB_HELPER_DEFAULT_OPS,
69+
__FB_DEFAULT_DMAMEM_OPS_DRAW,
70+
.fb_mmap = drm_fbdev_dma_fb_mmap,
71+
.fb_destroy = drm_fbdev_dma_fb_destroy,
72+
};
73+
74+
FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(drm_fbdev_dma,
75+
drm_fb_helper_damage_range,
76+
drm_fb_helper_damage_area);
77+
78+
static int drm_fbdev_dma_deferred_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
79+
{
80+
struct drm_fb_helper *fb_helper = info->par;
81+
struct drm_framebuffer *fb = fb_helper->fb;
82+
struct drm_gem_dma_object *dma = drm_fb_dma_get_gem_obj(fb, 0);
83+
84+
if (!dma->map_noncoherent)
85+
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
86+
87+
return fb_deferred_io_mmap(info, vma);
88+
}
89+
90+
static const struct fb_ops drm_fbdev_dma_deferred_fb_ops = {
7391
.owner = THIS_MODULE,
7492
.fb_open = drm_fbdev_dma_fb_open,
7593
.fb_release = drm_fbdev_dma_fb_release,
7694
__FB_DEFAULT_DEFERRED_OPS_RDWR(drm_fbdev_dma),
7795
DRM_FB_HELPER_DEFAULT_OPS,
7896
__FB_DEFAULT_DEFERRED_OPS_DRAW(drm_fbdev_dma),
79-
.fb_mmap = drm_fbdev_dma_fb_mmap,
97+
.fb_mmap = drm_fbdev_dma_deferred_fb_mmap,
8098
.fb_destroy = drm_fbdev_dma_fb_destroy,
8199
};
82100

@@ -89,6 +107,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
89107
{
90108
struct drm_client_dev *client = &fb_helper->client;
91109
struct drm_device *dev = fb_helper->dev;
110+
bool use_deferred_io = false;
92111
struct drm_client_buffer *buffer;
93112
struct drm_gem_dma_object *dma_obj;
94113
struct drm_framebuffer *fb;
@@ -111,6 +130,15 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
111130

112131
fb = buffer->fb;
113132

133+
/*
134+
* Deferred I/O requires struct page for framebuffer memory,
135+
* which is not guaranteed for all DMA ranges. We thus only
136+
* install deferred I/O if we have a framebuffer that requires
137+
* it.
138+
*/
139+
if (fb->funcs->dirty)
140+
use_deferred_io = true;
141+
114142
ret = drm_client_buffer_vmap(buffer, &map);
115143
if (ret) {
116144
goto err_drm_client_buffer_delete;
@@ -130,7 +158,10 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
130158

131159
drm_fb_helper_fill_info(info, fb_helper, sizes);
132160

133-
info->fbops = &drm_fbdev_dma_fb_ops;
161+
if (use_deferred_io)
162+
info->fbops = &drm_fbdev_dma_deferred_fb_ops;
163+
else
164+
info->fbops = &drm_fbdev_dma_fb_ops;
134165

135166
/* screen */
136167
info->flags |= FBINFO_VIRTFB; /* system memory */
@@ -144,14 +175,28 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
144175
}
145176
info->fix.smem_len = info->screen_size;
146177

147-
/* deferred I/O */
148-
fb_helper->fbdefio.delay = HZ / 20;
149-
fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
178+
/*
179+
* Only set up deferred I/O if the screen buffer supports
180+
* it. If this disagrees with the previous test for ->dirty,
181+
* mmap on the /dev/fb file might not work correctly.
182+
*/
183+
if (!is_vmalloc_addr(info->screen_buffer) && info->fix.smem_start) {
184+
unsigned long pfn = info->fix.smem_start >> PAGE_SHIFT;
150185

151-
info->fbdefio = &fb_helper->fbdefio;
152-
ret = fb_deferred_io_init(info);
153-
if (ret)
154-
goto err_drm_fb_helper_release_info;
186+
if (drm_WARN_ON(dev, !pfn_to_page(pfn)))
187+
use_deferred_io = false;
188+
}
189+
190+
/* deferred I/O */
191+
if (use_deferred_io) {
192+
fb_helper->fbdefio.delay = HZ / 20;
193+
fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
194+
195+
info->fbdefio = &fb_helper->fbdefio;
196+
ret = fb_deferred_io_init(info);
197+
if (ret)
198+
goto err_drm_fb_helper_release_info;
199+
}
155200

156201
return 0;
157202

drivers/gpu/drm/imagination/pvr_vm.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ struct pvr_vm_gpuva {
114114
struct drm_gpuva base;
115115
};
116116

117+
#define to_pvr_vm_gpuva(va) container_of_const(va, struct pvr_vm_gpuva, base)
118+
117119
enum pvr_vm_bind_type {
118120
PVR_VM_BIND_TYPE_MAP,
119121
PVR_VM_BIND_TYPE_UNMAP,
@@ -386,6 +388,7 @@ pvr_vm_gpuva_unmap(struct drm_gpuva_op *op, void *op_ctx)
386388

387389
drm_gpuva_unmap(&op->unmap);
388390
drm_gpuva_unlink(op->unmap.va);
391+
kfree(to_pvr_vm_gpuva(op->unmap.va));
389392

390393
return 0;
391394
}
@@ -433,6 +436,7 @@ pvr_vm_gpuva_remap(struct drm_gpuva_op *op, void *op_ctx)
433436
}
434437

435438
drm_gpuva_unlink(op->remap.unmap->va);
439+
kfree(to_pvr_vm_gpuva(op->remap.unmap->va));
436440

437441
return 0;
438442
}

0 commit comments

Comments
 (0)