Skip to content

Commit f69f31e

Browse files
committed
Merge tag 'drm-intel-fixes-2025-10-16' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-fixes
- Skip GuC communication warning if reset is in progress (Zhanjun) - Couple frontbuffer related fixes (Ville) - Deactivate PSR only on LNL and when selective fetch enabled (Jouni) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://lore.kernel.org/r/aPDoguxlhXlvjNAi@intel.com
2 parents 3a86608 + 9535576 commit f69f31e

File tree

5 files changed

+47
-24
lines changed

5 files changed

+47
-24
lines changed

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

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2113,10 +2113,10 @@ static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
21132113
if (intel_fb_uses_dpt(fb))
21142114
intel_dpt_destroy(intel_fb->dpt_vm);
21152115

2116-
intel_frontbuffer_put(intel_fb->frontbuffer);
2117-
21182116
intel_fb_bo_framebuffer_fini(intel_fb_bo(fb));
21192117

2118+
intel_frontbuffer_put(intel_fb->frontbuffer);
2119+
21202120
kfree(intel_fb);
21212121
}
21222122

@@ -2218,15 +2218,17 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
22182218
int ret = -EINVAL;
22192219
int i;
22202220

2221+
/*
2222+
* intel_frontbuffer_get() must be done before
2223+
* intel_fb_bo_framebuffer_init() to avoid set_tiling vs. addfb race.
2224+
*/
2225+
intel_fb->frontbuffer = intel_frontbuffer_get(obj);
2226+
if (!intel_fb->frontbuffer)
2227+
return -ENOMEM;
2228+
22212229
ret = intel_fb_bo_framebuffer_init(fb, obj, mode_cmd);
22222230
if (ret)
2223-
return ret;
2224-
2225-
intel_fb->frontbuffer = intel_frontbuffer_get(obj);
2226-
if (!intel_fb->frontbuffer) {
2227-
ret = -ENOMEM;
2228-
goto err;
2229-
}
2231+
goto err_frontbuffer_put;
22302232

22312233
ret = -EINVAL;
22322234
if (!drm_any_plane_has_format(display->drm,
@@ -2235,7 +2237,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
22352237
drm_dbg_kms(display->drm,
22362238
"unsupported pixel format %p4cc / modifier 0x%llx\n",
22372239
&mode_cmd->pixel_format, mode_cmd->modifier[0]);
2238-
goto err_frontbuffer_put;
2240+
goto err_bo_framebuffer_fini;
22392241
}
22402242

22412243
max_stride = intel_fb_max_stride(display, mode_cmd->pixel_format,
@@ -2246,15 +2248,15 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
22462248
mode_cmd->modifier[0] != DRM_FORMAT_MOD_LINEAR ?
22472249
"tiled" : "linear",
22482250
mode_cmd->pitches[0], max_stride);
2249-
goto err_frontbuffer_put;
2251+
goto err_bo_framebuffer_fini;
22502252
}
22512253

22522254
/* FIXME need to adjust LINOFF/TILEOFF accordingly. */
22532255
if (mode_cmd->offsets[0] != 0) {
22542256
drm_dbg_kms(display->drm,
22552257
"plane 0 offset (0x%08x) must be 0\n",
22562258
mode_cmd->offsets[0]);
2257-
goto err_frontbuffer_put;
2259+
goto err_bo_framebuffer_fini;
22582260
}
22592261

22602262
drm_helper_mode_fill_fb_struct(display->drm, fb, info, mode_cmd);
@@ -2264,15 +2266,15 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
22642266

22652267
if (mode_cmd->handles[i] != mode_cmd->handles[0]) {
22662268
drm_dbg_kms(display->drm, "bad plane %d handle\n", i);
2267-
goto err_frontbuffer_put;
2269+
goto err_bo_framebuffer_fini;
22682270
}
22692271

22702272
stride_alignment = intel_fb_stride_alignment(fb, i);
22712273
if (fb->pitches[i] & (stride_alignment - 1)) {
22722274
drm_dbg_kms(display->drm,
22732275
"plane %d pitch (%d) must be at least %u byte aligned\n",
22742276
i, fb->pitches[i], stride_alignment);
2275-
goto err_frontbuffer_put;
2277+
goto err_bo_framebuffer_fini;
22762278
}
22772279

22782280
if (intel_fb_is_gen12_ccs_aux_plane(fb, i)) {
@@ -2282,7 +2284,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
22822284
drm_dbg_kms(display->drm,
22832285
"ccs aux plane %d pitch (%d) must be %d\n",
22842286
i, fb->pitches[i], ccs_aux_stride);
2285-
goto err_frontbuffer_put;
2287+
goto err_bo_framebuffer_fini;
22862288
}
22872289
}
22882290

@@ -2291,7 +2293,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
22912293

22922294
ret = intel_fill_fb_info(display, intel_fb);
22932295
if (ret)
2294-
goto err_frontbuffer_put;
2296+
goto err_bo_framebuffer_fini;
22952297

22962298
if (intel_fb_uses_dpt(fb)) {
22972299
struct i915_address_space *vm;
@@ -2317,10 +2319,10 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
23172319
err_free_dpt:
23182320
if (intel_fb_uses_dpt(fb))
23192321
intel_dpt_destroy(intel_fb->dpt_vm);
2322+
err_bo_framebuffer_fini:
2323+
intel_fb_bo_framebuffer_fini(obj);
23202324
err_frontbuffer_put:
23212325
intel_frontbuffer_put(intel_fb->frontbuffer);
2322-
err:
2323-
intel_fb_bo_framebuffer_fini(obj);
23242326
return ret;
23252327
}
23262328

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,8 @@ static void frontbuffer_release(struct kref *ref)
270270
spin_unlock(&display->fb_tracking.lock);
271271

272272
i915_active_fini(&front->write);
273+
274+
drm_gem_object_put(obj);
273275
kfree_rcu(front, rcu);
274276
}
275277

@@ -287,6 +289,8 @@ intel_frontbuffer_get(struct drm_gem_object *obj)
287289
if (!front)
288290
return NULL;
289291

292+
drm_gem_object_get(obj);
293+
290294
front->obj = obj;
291295
kref_init(&front->ref);
292296
atomic_set(&front->bits, 0);
@@ -299,8 +303,12 @@ intel_frontbuffer_get(struct drm_gem_object *obj)
299303
spin_lock(&display->fb_tracking.lock);
300304
cur = intel_bo_set_frontbuffer(obj, front);
301305
spin_unlock(&display->fb_tracking.lock);
302-
if (cur != front)
306+
307+
if (cur != front) {
308+
drm_gem_object_put(obj);
303309
kfree(front);
310+
}
311+
304312
return cur;
305313
}
306314

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3402,6 +3402,7 @@ static void _psr_flush_handle(struct intel_dp *intel_dp)
34023402
struct intel_display *display = to_intel_display(intel_dp);
34033403

34043404
if (DISPLAY_VER(display) < 20 && intel_dp->psr.psr2_sel_fetch_enabled) {
3405+
/* Selective fetch prior LNL */
34053406
if (intel_dp->psr.psr2_sel_fetch_cff_enabled) {
34063407
/* can we turn CFF off? */
34073408
if (intel_dp->psr.busy_frontbuffer_bits == 0)
@@ -3420,12 +3421,19 @@ static void _psr_flush_handle(struct intel_dp *intel_dp)
34203421
intel_psr_configure_full_frame_update(intel_dp);
34213422

34223423
intel_psr_force_update(intel_dp);
3424+
} else if (!intel_dp->psr.psr2_sel_fetch_enabled) {
3425+
/*
3426+
* PSR1 on all platforms
3427+
* PSR2 HW tracking
3428+
* Panel Replay Full frame update
3429+
*/
3430+
intel_psr_force_update(intel_dp);
34233431
} else {
3432+
/* Selective update LNL onwards */
34243433
intel_psr_exit(intel_dp);
34253434
}
34263435

3427-
if ((!intel_dp->psr.psr2_sel_fetch_enabled || DISPLAY_VER(display) >= 20) &&
3428-
!intel_dp->psr.busy_frontbuffer_bits)
3436+
if (!intel_dp->psr.active && !intel_dp->psr.busy_frontbuffer_bits)
34293437
queue_work(display->wq.unordered, &intel_dp->psr.work);
34303438
}
34313439

drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,10 @@ i915_gem_object_set_frontbuffer(struct drm_i915_gem_object *obj,
8989

9090
if (!front) {
9191
RCU_INIT_POINTER(obj->frontbuffer, NULL);
92-
drm_gem_object_put(intel_bo_to_drm_bo(obj));
9392
} else if (rcu_access_pointer(obj->frontbuffer)) {
9493
cur = rcu_dereference_protected(obj->frontbuffer, true);
9594
kref_get(&cur->ref);
9695
} else {
97-
drm_gem_object_get(intel_bo_to_drm_bo(obj));
9896
rcu_assign_pointer(obj->frontbuffer, front);
9997
}
10098

drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1325,9 +1325,16 @@ static int ct_receive(struct intel_guc_ct *ct)
13251325

13261326
static void ct_try_receive_message(struct intel_guc_ct *ct)
13271327
{
1328+
struct intel_guc *guc = ct_to_guc(ct);
13281329
int ret;
13291330

1330-
if (GEM_WARN_ON(!ct->enabled))
1331+
if (!ct->enabled) {
1332+
GEM_WARN_ON(!guc_to_gt(guc)->uc.reset_in_progress);
1333+
return;
1334+
}
1335+
1336+
/* When interrupt disabled, message handling is not expected */
1337+
if (!guc->interrupts.enabled)
13311338
return;
13321339

13331340
ret = ct_receive(ct);

0 commit comments

Comments
 (0)