Skip to content

Commit 3d08a42

Browse files
committed
Merge tag 'drm-fixes-2025-10-24' of https://gitlab.freedesktop.org/drm/kernel
Pull drm fixes from Simona Vetter: "Very quiet, all just small stuff and nothing scary pending to my knowledge: - drm_panic: bunch of size calculation fixes - pantor: fix kernel panic on partial gpu va unmap - rockchip: hdmi hotplug setup fix - amdgpu: dp mst, dc/display fixes - i915: fix panic structure leak - xe: madvise uapi fix, wq alloc error, vma flag handling fix" * tag 'drm-fixes-2025-10-24' of https://gitlab.freedesktop.org/drm/kernel: drm/xe: Check return value of GGTT workqueue allocation drm/amd/display: use GFP_NOWAIT for allocation in interrupt handler drm/amd/display: increase max link count and fix link->enc NULL pointer access drm/amd/display: Fix NULL pointer dereference drm/panic: Fix 24bit pixel crossing page boundaries drm/panic: Fix divide by 0 if the screen width < font width drm/panic: Fix kmsg text drawing rectangle drm/panic: Fix qr_code, ensure vmargin is positive drm/panic: Fix overlap between qr code and logo drm/panic: Fix drawing the logo on a small narrow screen drm/xe/uapi: Hide the madvise autoreset behind a VM_BIND flag drm/xe: Retain vma flags when recreating and splitting vmas for madvise drm/i915/panic: fix panic structure allocation memory leak drm/panthor: Fix kernel panic on partial unmap of a GPU VA region drm/rockchip: dw_hdmi: use correct SCLIN mask for RK3228
2 parents 3100929 + 18b1ce0 commit 3d08a42

File tree

14 files changed

+153
-95
lines changed

14 files changed

+153
-95
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -551,13 +551,13 @@ static void schedule_dc_vmin_vmax(struct amdgpu_device *adev,
551551
struct dc_stream_state *stream,
552552
struct dc_crtc_timing_adjust *adjust)
553553
{
554-
struct vupdate_offload_work *offload_work = kzalloc(sizeof(*offload_work), GFP_KERNEL);
554+
struct vupdate_offload_work *offload_work = kzalloc(sizeof(*offload_work), GFP_NOWAIT);
555555
if (!offload_work) {
556556
drm_dbg_driver(adev_to_drm(adev), "Failed to allocate vupdate_offload_work\n");
557557
return;
558558
}
559559

560-
struct dc_crtc_timing_adjust *adjust_copy = kzalloc(sizeof(*adjust_copy), GFP_KERNEL);
560+
struct dc_crtc_timing_adjust *adjust_copy = kzalloc(sizeof(*adjust_copy), GFP_NOWAIT);
561561
if (!adjust_copy) {
562562
drm_dbg_driver(adev_to_drm(adev), "Failed to allocate adjust_copy\n");
563563
kfree(offload_work);

drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,9 @@ void dcn401_init_hw(struct dc *dc)
200200
*/
201201
struct dc_link *link = dc->links[i];
202202

203+
if (link->ep_type != DISPLAY_ENDPOINT_PHY)
204+
continue;
205+
203206
link->link_enc->funcs->hw_init(link->link_enc);
204207

205208
/* Check for enabled DIG to identify enabled display */

drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,13 @@
4444
*/
4545
#define MAX_PIPES 6
4646
#define MAX_PHANTOM_PIPES (MAX_PIPES / 2)
47-
#define MAX_LINKS (MAX_PIPES * 2 +2)
47+
48+
#define MAX_DPIA 6
49+
#define MAX_CONNECTOR 6
50+
#define MAX_VIRTUAL_LINKS 4
51+
52+
#define MAX_LINKS (MAX_DPIA + MAX_CONNECTOR + MAX_VIRTUAL_LINKS)
53+
4854
#define MAX_DIG_LINK_ENCODERS 7
4955
#define MAX_DWB_PIPES 1
5056
#define MAX_HPO_DP2_ENCODERS 4

drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ static void dp_retrain_link_dp_test(struct dc_link *link,
7878
struct audio_output audio_output[MAX_PIPES];
7979
struct dc_stream_state *streams_on_link[MAX_PIPES];
8080
int num_streams_on_link = 0;
81+
struct dc *dc = (struct dc *)link->dc;
8182

8283
needs_divider_update = (link->dc->link_srv->dp_get_encoding_format(link_setting) !=
8384
link->dc->link_srv->dp_get_encoding_format((const struct dc_link_settings *) &link->cur_link_settings));
@@ -150,7 +151,7 @@ static void dp_retrain_link_dp_test(struct dc_link *link,
150151
if (streams_on_link[i] && streams_on_link[i]->link && streams_on_link[i]->link == link) {
151152
stream_update.stream = streams_on_link[i];
152153
stream_update.dpms_off = &dpms_off;
153-
dc_update_planes_and_stream(state->clk_mgr->ctx->dc, NULL, 0, streams_on_link[i], &stream_update);
154+
dc_update_planes_and_stream(dc, NULL, 0, streams_on_link[i], &stream_update);
154155
}
155156
}
156157
}

drivers/gpu/drm/drm_panic.c

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,33 @@ static void drm_panic_write_pixel24(void *vaddr, unsigned int offset, u32 color)
174174
*p = color & 0xff;
175175
}
176176

177+
/*
178+
* Special case if the pixel crosses page boundaries
179+
*/
180+
static void drm_panic_write_pixel24_xpage(void *vaddr, struct page *next_page,
181+
unsigned int offset, u32 color)
182+
{
183+
u8 *vaddr2;
184+
u8 *p = vaddr + offset;
185+
186+
vaddr2 = kmap_local_page_try_from_panic(next_page);
187+
188+
*p++ = color & 0xff;
189+
color >>= 8;
190+
191+
if (offset == PAGE_SIZE - 1)
192+
p = vaddr2;
193+
194+
*p++ = color & 0xff;
195+
color >>= 8;
196+
197+
if (offset == PAGE_SIZE - 2)
198+
p = vaddr2;
199+
200+
*p = color & 0xff;
201+
kunmap_local(vaddr2);
202+
}
203+
177204
static void drm_panic_write_pixel32(void *vaddr, unsigned int offset, u32 color)
178205
{
179206
u32 *p = vaddr + offset;
@@ -231,7 +258,14 @@ static void drm_panic_blit_page(struct page **pages, unsigned int dpitch,
231258
page = new_page;
232259
vaddr = kmap_local_page_try_from_panic(pages[page]);
233260
}
234-
if (vaddr)
261+
if (!vaddr)
262+
continue;
263+
264+
// Special case for 24bit, as a pixel might cross page boundaries
265+
if (cpp == 3 && offset + 3 > PAGE_SIZE)
266+
drm_panic_write_pixel24_xpage(vaddr, pages[page + 1],
267+
offset, fg32);
268+
else
235269
drm_panic_write_pixel(vaddr, offset, fg32, cpp);
236270
}
237271
}
@@ -321,7 +355,15 @@ static void drm_panic_fill_page(struct page **pages, unsigned int dpitch,
321355
page = new_page;
322356
vaddr = kmap_local_page_try_from_panic(pages[page]);
323357
}
324-
drm_panic_write_pixel(vaddr, offset, color, cpp);
358+
if (!vaddr)
359+
continue;
360+
361+
// Special case for 24bit, as a pixel might cross page boundaries
362+
if (cpp == 3 && offset + 3 > PAGE_SIZE)
363+
drm_panic_write_pixel24_xpage(vaddr, pages[page + 1],
364+
offset, color);
365+
else
366+
drm_panic_write_pixel(vaddr, offset, color, cpp);
325367
}
326368
}
327369
if (vaddr)
@@ -429,6 +471,9 @@ static void drm_panic_logo_rect(struct drm_rect *rect, const struct font_desc *f
429471
static void drm_panic_logo_draw(struct drm_scanout_buffer *sb, struct drm_rect *rect,
430472
const struct font_desc *font, u32 fg_color)
431473
{
474+
if (rect->x2 > sb->width || rect->y2 > sb->height)
475+
return;
476+
432477
if (logo_mono)
433478
drm_panic_blit(sb, rect, logo_mono->data,
434479
DIV_ROUND_UP(drm_rect_width(rect), 8), 1, fg_color);
@@ -477,7 +522,7 @@ static int draw_line_with_wrap(struct drm_scanout_buffer *sb, const struct font_
477522
struct drm_panic_line *line, int yoffset, u32 fg_color)
478523
{
479524
int chars_per_row = sb->width / font->width;
480-
struct drm_rect r_txt = DRM_RECT_INIT(0, yoffset, sb->width, sb->height);
525+
struct drm_rect r_txt = DRM_RECT_INIT(0, yoffset, sb->width, font->height);
481526
struct drm_panic_line line_wrap;
482527

483528
if (line->len > chars_per_row) {
@@ -520,7 +565,7 @@ static void draw_panic_static_kmsg(struct drm_scanout_buffer *sb)
520565
struct drm_panic_line line;
521566
int yoffset;
522567

523-
if (!font)
568+
if (!font || font->width > sb->width)
524569
return;
525570

526571
yoffset = sb->height - font->height - (sb->height % font->height) / 2;
@@ -733,7 +778,10 @@ static int _draw_panic_static_qr_code(struct drm_scanout_buffer *sb)
733778
pr_debug("QR width %d and scale %d\n", qr_width, scale);
734779
r_qr_canvas = DRM_RECT_INIT(0, 0, qr_canvas_width * scale, qr_canvas_width * scale);
735780

736-
v_margin = (sb->height - drm_rect_height(&r_qr_canvas) - drm_rect_height(&r_msg)) / 5;
781+
v_margin = sb->height - drm_rect_height(&r_qr_canvas) - drm_rect_height(&r_msg);
782+
if (v_margin < 0)
783+
return -ENOSPC;
784+
v_margin /= 5;
737785

738786
drm_rect_translate(&r_qr_canvas, (sb->width - r_qr_canvas.x2) / 2, 2 * v_margin);
739787
r_qr = DRM_RECT_INIT(r_qr_canvas.x1 + QR_MARGIN * scale, r_qr_canvas.y1 + QR_MARGIN * scale,
@@ -746,7 +794,7 @@ static int _draw_panic_static_qr_code(struct drm_scanout_buffer *sb)
746794
/* Fill with the background color, and draw text on top */
747795
drm_panic_fill(sb, &r_screen, bg_color);
748796

749-
if (!drm_rect_overlap(&r_logo, &r_msg) && !drm_rect_overlap(&r_logo, &r_qr))
797+
if (!drm_rect_overlap(&r_logo, &r_msg) && !drm_rect_overlap(&r_logo, &r_qr_canvas))
750798
drm_panic_logo_draw(sb, &r_logo, font, fg_color);
751799

752800
draw_txt_rectangle(sb, font, panic_msg, panic_msg_lines, true, &r_msg, fg_color);

drivers/gpu/drm/i915/display/intel_fb.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2117,6 +2117,7 @@ static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
21172117

21182118
intel_frontbuffer_put(intel_fb->frontbuffer);
21192119

2120+
kfree(intel_fb->panic);
21202121
kfree(intel_fb);
21212122
}
21222123

@@ -2215,16 +2216,22 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
22152216
struct intel_display *display = to_intel_display(obj->dev);
22162217
struct drm_framebuffer *fb = &intel_fb->base;
22172218
u32 max_stride;
2218-
int ret = -EINVAL;
2219+
int ret;
22192220
int i;
22202221

2222+
intel_fb->panic = intel_panic_alloc();
2223+
if (!intel_fb->panic)
2224+
return -ENOMEM;
2225+
22212226
/*
22222227
* intel_frontbuffer_get() must be done before
22232228
* intel_fb_bo_framebuffer_init() to avoid set_tiling vs. addfb race.
22242229
*/
22252230
intel_fb->frontbuffer = intel_frontbuffer_get(obj);
2226-
if (!intel_fb->frontbuffer)
2227-
return -ENOMEM;
2231+
if (!intel_fb->frontbuffer) {
2232+
ret = -ENOMEM;
2233+
goto err_free_panic;
2234+
}
22282235

22292236
ret = intel_fb_bo_framebuffer_init(fb, obj, mode_cmd);
22302237
if (ret)
@@ -2323,6 +2330,9 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
23232330
intel_fb_bo_framebuffer_fini(obj);
23242331
err_frontbuffer_put:
23252332
intel_frontbuffer_put(intel_fb->frontbuffer);
2333+
err_free_panic:
2334+
kfree(intel_fb->panic);
2335+
23262336
return ret;
23272337
}
23282338

@@ -2349,20 +2359,11 @@ intel_user_framebuffer_create(struct drm_device *dev,
23492359
struct intel_framebuffer *intel_framebuffer_alloc(void)
23502360
{
23512361
struct intel_framebuffer *intel_fb;
2352-
struct intel_panic *panic;
23532362

23542363
intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
23552364
if (!intel_fb)
23562365
return NULL;
23572366

2358-
panic = intel_panic_alloc();
2359-
if (!panic) {
2360-
kfree(intel_fb);
2361-
return NULL;
2362-
}
2363-
2364-
intel_fb->panic = panic;
2365-
23662367
return intel_fb;
23672368
}
23682369

drivers/gpu/drm/panthor/panthor_mmu.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,10 +1175,14 @@ panthor_vm_op_ctx_prealloc_vmas(struct panthor_vm_op_ctx *op_ctx)
11751175
break;
11761176

11771177
case DRM_PANTHOR_VM_BIND_OP_TYPE_UNMAP:
1178-
/* Partial unmaps might trigger a remap with either a prev or a next VA,
1179-
* but not both.
1178+
/* Two VMAs can be needed for an unmap, as an unmap can happen
1179+
* in the middle of a drm_gpuva, requiring a remap with both
1180+
* prev & next VA. Or an unmap can span more than one drm_gpuva
1181+
* where the first and last ones are covered partially, requring
1182+
* a remap for the first with a prev VA and remap for the last
1183+
* with a next VA.
11801184
*/
1181-
vma_count = 1;
1185+
vma_count = 2;
11821186
break;
11831187

11841188
default:

drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ static void dw_hdmi_rk3228_setup_hpd(struct dw_hdmi *dw_hdmi, void *data)
361361

362362
regmap_write(hdmi->regmap, RK3228_GRF_SOC_CON2,
363363
FIELD_PREP_WM16(RK3228_HDMI_SDAIN_MSK, 1) |
364-
FIELD_PREP_WM16(RK3328_HDMI_SCLIN_MSK, 1));
364+
FIELD_PREP_WM16(RK3228_HDMI_SCLIN_MSK, 1));
365365
}
366366

367367
static enum drm_connector_status

drivers/gpu/drm/xe/xe_ggtt.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,9 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
292292
ggtt->pt_ops = &xelp_pt_ops;
293293

294294
ggtt->wq = alloc_workqueue("xe-ggtt-wq", 0, WQ_MEM_RECLAIM);
295+
if (!ggtt->wq)
296+
return -ENOMEM;
297+
295298
__xe_ggtt_init_early(ggtt, xe_wopcm_size(xe));
296299

297300
err = drmm_add_action_or_reset(&xe->drm, ggtt_fini_early, ggtt);

drivers/gpu/drm/xe/xe_pt.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,7 +2022,7 @@ static int op_prepare(struct xe_vm *vm,
20222022
case DRM_GPUVA_OP_MAP:
20232023
if ((!op->map.immediate && xe_vm_in_fault_mode(vm) &&
20242024
!op->map.invalidate_on_bind) ||
2025-
op->map.is_cpu_addr_mirror)
2025+
(op->map.vma_flags & XE_VMA_SYSTEM_ALLOCATOR))
20262026
break;
20272027

20282028
err = bind_op_prepare(vm, tile, pt_update_ops, op->map.vma,
@@ -2252,7 +2252,7 @@ static void op_commit(struct xe_vm *vm,
22522252
switch (op->base.op) {
22532253
case DRM_GPUVA_OP_MAP:
22542254
if ((!op->map.immediate && xe_vm_in_fault_mode(vm)) ||
2255-
op->map.is_cpu_addr_mirror)
2255+
(op->map.vma_flags & XE_VMA_SYSTEM_ALLOCATOR))
22562256
break;
22572257

22582258
bind_op_commit(vm, tile, pt_update_ops, op->map.vma, fence,

0 commit comments

Comments
 (0)