Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-intel-fixes-2024-05-30' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-fixes

drm/i915 fixes for v6.10-rc2:
- Fix a race in audio component by registering it later
- Make DPT object unshrinkable to avoid shrinking when framebuffer has
not shrunk
- Fix CCS id calculation to fix a perf regression
- Fix selftest caching mode
- Fix FIELD_PREP compiler warnings
- Fix indefinite wait for GT wakeref release
- Revert overeager multi-gt pm reference removal

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/87a5k7iwod.fsf@intel.com

+71 -25
+21 -11
drivers/gpu/drm/i915/display/intel_audio.c
··· 1252 1252 static void i915_audio_component_init(struct drm_i915_private *i915) 1253 1253 { 1254 1254 u32 aud_freq, aud_freq_init; 1255 - int ret; 1256 - 1257 - ret = component_add_typed(i915->drm.dev, 1258 - &i915_audio_component_bind_ops, 1259 - I915_COMPONENT_AUDIO); 1260 - if (ret < 0) { 1261 - drm_err(&i915->drm, 1262 - "failed to add audio component (%d)\n", ret); 1263 - /* continue with reduced functionality */ 1264 - return; 1265 - } 1266 1255 1267 1256 if (DISPLAY_VER(i915) >= 9) { 1268 1257 aud_freq_init = intel_de_read(i915, AUD_FREQ_CNTRL); ··· 1274 1285 1275 1286 /* init with current cdclk */ 1276 1287 intel_audio_cdclk_change_post(i915); 1288 + } 1289 + 1290 + static void i915_audio_component_register(struct drm_i915_private *i915) 1291 + { 1292 + int ret; 1293 + 1294 + ret = component_add_typed(i915->drm.dev, 1295 + &i915_audio_component_bind_ops, 1296 + I915_COMPONENT_AUDIO); 1297 + if (ret < 0) { 1298 + drm_err(&i915->drm, 1299 + "failed to add audio component (%d)\n", ret); 1300 + /* continue with reduced functionality */ 1301 + return; 1302 + } 1277 1303 1278 1304 i915->display.audio.component_registered = true; 1279 1305 } ··· 1319 1315 { 1320 1316 if (intel_lpe_audio_init(i915) < 0) 1321 1317 i915_audio_component_init(i915); 1318 + } 1319 + 1320 + void intel_audio_register(struct drm_i915_private *i915) 1321 + { 1322 + if (!i915->display.audio.lpe.platdev) 1323 + i915_audio_component_register(i915); 1322 1324 } 1323 1325 1324 1326 /**
+1
drivers/gpu/drm/i915/display/intel_audio.h
··· 28 28 void intel_audio_cdclk_change_pre(struct drm_i915_private *dev_priv); 29 29 void intel_audio_cdclk_change_post(struct drm_i915_private *dev_priv); 30 30 void intel_audio_init(struct drm_i915_private *dev_priv); 31 + void intel_audio_register(struct drm_i915_private *i915); 31 32 void intel_audio_deinit(struct drm_i915_private *dev_priv); 32 33 void intel_audio_sdp_split_update(const struct intel_crtc_state *crtc_state); 33 34
+2
drivers/gpu/drm/i915/display/intel_display_driver.c
··· 540 540 541 541 intel_display_driver_enable_user_access(i915); 542 542 543 + intel_audio_register(i915); 544 + 543 545 intel_display_debugfs_register(i915); 544 546 545 547 /*
+18
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
··· 255 255 struct intel_context *context; /* logical state for the request */ 256 256 struct i915_gem_context *gem_context; /** caller's context */ 257 257 intel_wakeref_t wakeref; 258 + intel_wakeref_t wakeref_gt0; 258 259 259 260 /** our requests to build */ 260 261 struct i915_request *requests[MAX_ENGINE_INSTANCE + 1]; ··· 2686 2685 eb_select_engine(struct i915_execbuffer *eb) 2687 2686 { 2688 2687 struct intel_context *ce, *child; 2688 + struct intel_gt *gt; 2689 2689 unsigned int idx; 2690 2690 int err; 2691 2691 ··· 2710 2708 } 2711 2709 } 2712 2710 eb->num_batches = ce->parallel.number_children + 1; 2711 + gt = ce->engine->gt; 2713 2712 2714 2713 for_each_child(ce, child) 2715 2714 intel_context_get(child); 2716 2715 eb->wakeref = intel_gt_pm_get(ce->engine->gt); 2716 + /* 2717 + * Keep GT0 active on MTL so that i915_vma_parked() doesn't 2718 + * free VMAs while execbuf ioctl is validating VMAs. 2719 + */ 2720 + if (gt->info.id) 2721 + eb->wakeref_gt0 = intel_gt_pm_get(to_gt(gt->i915)); 2717 2722 2718 2723 if (!test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) { 2719 2724 err = intel_context_alloc_state(ce); ··· 2759 2750 return err; 2760 2751 2761 2752 err: 2753 + if (gt->info.id) 2754 + intel_gt_pm_put(to_gt(gt->i915), eb->wakeref_gt0); 2755 + 2762 2756 intel_gt_pm_put(ce->engine->gt, eb->wakeref); 2763 2757 for_each_child(ce, child) 2764 2758 intel_context_put(child); ··· 2775 2763 struct intel_context *child; 2776 2764 2777 2765 i915_vm_put(eb->context->vm); 2766 + /* 2767 + * This works in conjunction with eb_select_engine() to prevent 2768 + * i915_vma_parked() from interfering while execbuf validates vmas. 2769 + */ 2770 + if (eb->gt->info.id) 2771 + intel_gt_pm_put(to_gt(eb->gt->i915), eb->wakeref_gt0); 2778 2772 intel_gt_pm_put(eb->context->engine->gt, eb->wakeref); 2779 2773 for_each_child(eb->context, child) 2780 2774 intel_context_put(child);
+3 -1
drivers/gpu/drm/i915/gem/i915_gem_object.h
··· 284 284 static inline bool 285 285 i915_gem_object_is_shrinkable(const struct drm_i915_gem_object *obj) 286 286 { 287 - return i915_gem_object_type_has(obj, I915_GEM_OBJECT_IS_SHRINKABLE); 287 + /* TODO: make DPT shrinkable when it has no bound vmas */ 288 + return i915_gem_object_type_has(obj, I915_GEM_OBJECT_IS_SHRINKABLE) && 289 + !obj->is_dpt; 288 290 } 289 291 290 292 static inline bool
+1 -1
drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
··· 196 196 if (err) 197 197 goto out_file; 198 198 199 - mode = intel_gt_coherent_map_type(to_gt(i915), native_obj, true); 199 + mode = intel_gt_coherent_map_type(to_gt(i915), native_obj, false); 200 200 vaddr = i915_gem_object_pin_map_unlocked(native_obj, mode); 201 201 if (IS_ERR(vaddr)) { 202 202 err = PTR_ERR(vaddr);
+7 -8
drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
··· 263 263 i915_request_put(rq); 264 264 } 265 265 266 + /* Lazy irq enabling after HW submission */ 266 267 if (!READ_ONCE(b->irq_armed) && !list_empty(&b->signalers)) 267 268 intel_breadcrumbs_arm_irq(b); 269 + 270 + /* And confirm that we still want irqs enabled before we yield */ 271 + if (READ_ONCE(b->irq_armed) && !atomic_read(&b->active)) 272 + intel_breadcrumbs_disarm_irq(b); 268 273 } 269 274 270 275 struct intel_breadcrumbs * ··· 320 315 return; 321 316 322 317 /* Kick the work once more to drain the signalers, and disarm the irq */ 323 - irq_work_sync(&b->irq_work); 324 - while (READ_ONCE(b->irq_armed) && !atomic_read(&b->active)) { 325 - local_irq_disable(); 326 - signal_irq_work(&b->irq_work); 327 - local_irq_enable(); 328 - cond_resched(); 329 - } 318 + irq_work_queue(&b->irq_work); 330 319 } 331 320 332 321 void intel_breadcrumbs_free(struct kref *kref) ··· 403 404 * the request as it may have completed and raised the interrupt as 404 405 * we were attaching it into the lists. 405 406 */ 406 - if (!b->irq_armed || __i915_request_is_complete(rq)) 407 + if (!READ_ONCE(b->irq_armed) || __i915_request_is_complete(rq)) 407 408 irq_work_queue(&b->irq_work); 408 409 } 409 410
+6
drivers/gpu/drm/i915/gt/intel_engine_cs.c
··· 885 885 if (IS_DG2(gt->i915)) { 886 886 u8 first_ccs = __ffs(CCS_MASK(gt)); 887 887 888 + /* 889 + * Store the number of active cslices before 890 + * changing the CCS engine configuration 891 + */ 892 + gt->ccs.cslices = CCS_MASK(gt); 893 + 888 894 /* Mask off all the CCS engine */ 889 895 info->engine_mask &= ~GENMASK(CCS3, CCS0); 890 896 /* Put back in the first CCS engine */
+1 -1
drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c
··· 19 19 20 20 /* Build the value for the fixed CCS load balancing */ 21 21 for (cslice = 0; cslice < I915_MAX_CCS; cslice++) { 22 - if (CCS_MASK(gt) & BIT(cslice)) 22 + if (gt->ccs.cslices & BIT(cslice)) 23 23 /* 24 24 * If available, assign the cslice 25 25 * to the first available engine...
+8
drivers/gpu/drm/i915/gt/intel_gt_types.h
··· 207 207 [MAX_ENGINE_INSTANCE + 1]; 208 208 enum intel_submission_method submission_method; 209 209 210 + struct { 211 + /* 212 + * Mask of the non fused CCS slices 213 + * to be used for the load balancing 214 + */ 215 + intel_engine_mask_t cslices; 216 + } ccs; 217 + 210 218 /* 211 219 * Default address space (either GGTT or ppGTT depending on arch). 212 220 *
+3 -3
drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
··· 29 29 */ 30 30 31 31 #define GUC_KLV_LEN_MIN 1u 32 - #define GUC_KLV_0_KEY (0xffff << 16) 33 - #define GUC_KLV_0_LEN (0xffff << 0) 34 - #define GUC_KLV_n_VALUE (0xffffffff << 0) 32 + #define GUC_KLV_0_KEY (0xffffu << 16) 33 + #define GUC_KLV_0_LEN (0xffffu << 0) 34 + #define GUC_KLV_n_VALUE (0xffffffffu << 0) 35 35 36 36 /** 37 37 * DOC: GuC Self Config KLVs