Merge tag 'drm-fixes-2025-08-16' of https://gitlab.freedesktop.org/drm/kernel

Pull drm fixes from Dave Airlie:
"Relatively quiet week, usual amdgpu/i915/xe fixes along with a set of
fixes for fbdev format info, which fix some regressions seen in with
rc1.

bridge:
- fix OF-node leak
- fix documentation

fbdev-emulation:
- pass correct format info to drm_helper_mode_fill_fb_struct()

panfrost:
- print correct RSS size

amdgpu:
- PSP fix
- VRAM reservation fix
- CSA fix
- Process kill fix

i915:
- Fix the implementation of wa_18038517565 [fbc]
- Do not trigger Frame Change events from frontbuffer flush [psr]

xe:
- Some more xe_migrate_access_memory fixes (Auld)
- Defer buffer object shrinker write-backs and GPU waits (Thomas)
- HWMON fix for clamping limits (Karthik)
- SRIOV-PF: Set VF LMEM BAR size (Michal)"

* tag 'drm-fixes-2025-08-16' of https://gitlab.freedesktop.org/drm/kernel:
drm/xe/pf: Set VF LMEM BAR size
drm/amdgpu: fix task hang from failed job submission during process kill
drm/amdgpu: fix incorrect vm flags to map bo
drm/amdgpu: fix vram reservation issue
drm/amdgpu: Add PSP fw version check for fw reserve GFX command
drm/xe/hwmon: Add SW clamp for power limits writes
drm/xe: Defer buffer object shrinker write-backs and GPU waits
drm/xe/migrate: prevent potential UAF
drm/xe/migrate: don't overflow max copy size
drm/xe/migrate: prevent infinite recursion
drm/i915/psr: Do not trigger Frame Change events from frontbuffer flush
drm/i915/fbc: fix the implementation of wa_18038517565
drm/panfrost: Print RSS for tiler heap BO's in debugfs GEMS file
drm/radeon: Pass along the format info from .fb_create() to drm_helper_mode_fill_fb_struct()
drm/nouveau: Pass along the format info from .fb_create() to drm_helper_mode_fill_fb_struct()
drm/omap: Pass along the format info from .fb_create() to drm_helper_mode_fill_fb_struct()
drm/bridge: document HDMI CEC callbacks
drm/bridge: Describe the newly introduced drm_connector parameter for drm_bridge_detect
drm/bridge: fix OF node leak

+3
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
··· 1139 1139 } 1140 1140 } 1141 1141 1142 + if (!amdgpu_vm_ready(vm)) 1143 + return -EINVAL; 1144 + 1142 1145 r = amdgpu_vm_clear_freed(adev, vm, NULL); 1143 1146 if (r) 1144 1147 return r;
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
··· 88 88 } 89 89 90 90 r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, size, 91 - AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE | 92 - AMDGPU_PTE_EXECUTABLE); 91 + AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE | 92 + AMDGPU_VM_PAGE_EXECUTABLE); 93 93 94 94 if (r) { 95 95 DRM_ERROR("failed to do bo_map on static CSA, err=%d\n", r);
+16 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
··· 1039 1039 { 1040 1040 int ret; 1041 1041 uint64_t reserv_addr, reserv_addr_ext; 1042 - uint32_t reserv_size, reserv_size_ext; 1042 + uint32_t reserv_size, reserv_size_ext, mp0_ip_ver; 1043 1043 struct amdgpu_device *adev = psp->adev; 1044 + 1045 + mp0_ip_ver = amdgpu_ip_version(adev, MP0_HWIP, 0); 1044 1046 1045 1047 if (amdgpu_sriov_vf(psp->adev)) 1046 1048 return 0; 1047 1049 1048 - if ((amdgpu_ip_version(adev, MP0_HWIP, 0) != IP_VERSION(14, 0, 2)) && 1049 - (amdgpu_ip_version(adev, MP0_HWIP, 0) != IP_VERSION(14, 0, 3))) 1050 + switch (mp0_ip_ver) { 1051 + case IP_VERSION(14, 0, 2): 1052 + if (adev->psp.sos.fw_version < 0x3b0e0d) 1053 + return 0; 1054 + break; 1055 + 1056 + case IP_VERSION(14, 0, 3): 1057 + if (adev->psp.sos.fw_version < 0x3a0e14) 1058 + return 0; 1059 + break; 1060 + 1061 + default: 1050 1062 return 0; 1063 + } 1051 1064 1052 1065 ret = psp_get_fw_reservation_info(psp, GFX_CMD_ID_FB_FW_RESERV_ADDR, &reserv_addr, &reserv_size); 1053 1066 if (ret)
+11 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 654 654 * Check if all VM PDs/PTs are ready for updates 655 655 * 656 656 * Returns: 657 - * True if VM is not evicting. 657 + * True if VM is not evicting and all VM entities are not stopped 658 658 */ 659 659 bool amdgpu_vm_ready(struct amdgpu_vm *vm) 660 660 { 661 - bool empty; 662 661 bool ret; 663 662 664 663 amdgpu_vm_eviction_lock(vm); ··· 665 666 amdgpu_vm_eviction_unlock(vm); 666 667 667 668 spin_lock(&vm->status_lock); 668 - empty = list_empty(&vm->evicted); 669 + ret &= list_empty(&vm->evicted); 669 670 spin_unlock(&vm->status_lock); 670 671 671 - return ret && empty; 672 + spin_lock(&vm->immediate.lock); 673 + ret &= !vm->immediate.stopped; 674 + spin_unlock(&vm->immediate.lock); 675 + 676 + spin_lock(&vm->delayed.lock); 677 + ret &= !vm->delayed.stopped; 678 + spin_unlock(&vm->delayed.lock); 679 + 680 + return ret; 672 681 } 673 682 674 683 /**
+1 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
··· 648 648 list_for_each_entry(block, &vres->blocks, link) 649 649 vis_usage += amdgpu_vram_mgr_vis_size(adev, block); 650 650 651 - amdgpu_vram_mgr_do_reserve(man); 652 - 653 651 drm_buddy_free_list(mm, &vres->blocks, vres->flags); 652 + amdgpu_vram_mgr_do_reserve(man); 654 653 mutex_unlock(&mgr->lock); 655 654 656 655 atomic64_sub(vis_usage, &mgr->vis_usage);
+2
drivers/gpu/drm/bridge/aux-bridge.c
··· 18 18 { 19 19 struct auxiliary_device *adev = to_auxiliary_dev(dev); 20 20 21 + of_node_put(dev->of_node); 21 22 ida_free(&drm_aux_bridge_ida, adev->id); 22 23 23 24 kfree(adev); ··· 66 65 67 66 ret = auxiliary_device_init(adev); 68 67 if (ret) { 68 + of_node_put(adev->dev.of_node); 69 69 ida_free(&drm_aux_bridge_ida, adev->id); 70 70 kfree(adev); 71 71 return ret;
+1
drivers/gpu/drm/drm_bridge.c
··· 1227 1227 /** 1228 1228 * drm_bridge_detect - check if anything is attached to the bridge output 1229 1229 * @bridge: bridge control structure 1230 + * @connector: attached connector 1230 1231 * 1231 1232 * If the bridge supports output detection, as reported by the 1232 1233 * DRM_BRIDGE_OP_DETECT bridge ops flag, call &drm_bridge_funcs.detect for the
+4 -4
drivers/gpu/drm/i915/display/intel_fbc.c
··· 552 552 if (dpfc_ctl & DPFC_CTL_EN) { 553 553 dpfc_ctl &= ~DPFC_CTL_EN; 554 554 intel_de_write(display, ILK_DPFC_CONTROL(fbc->id), dpfc_ctl); 555 - 556 - /* wa_18038517565 Enable DPFC clock gating after FBC disable */ 557 - if (display->platform.dg2 || DISPLAY_VER(display) >= 14) 558 - fbc_compressor_clkgate_disable_wa(fbc, false); 559 555 } 560 556 } 561 557 ··· 1705 1709 intel_fbc_invalidate_dirty_rect(fbc); 1706 1710 1707 1711 __intel_fbc_cleanup_cfb(fbc); 1712 + 1713 + /* wa_18038517565 Enable DPFC clock gating after FBC disable */ 1714 + if (display->platform.dg2 || DISPLAY_VER(display) >= 14) 1715 + fbc_compressor_clkgate_disable_wa(fbc, false); 1708 1716 1709 1717 fbc->state.plane = NULL; 1710 1718 fbc->flip_pending = false;
+9 -5
drivers/gpu/drm/i915/display/intel_psr.c
··· 3275 3275 3276 3276 static void _psr_invalidate_handle(struct intel_dp *intel_dp) 3277 3277 { 3278 - if (intel_dp->psr.psr2_sel_fetch_enabled) { 3278 + struct intel_display *display = to_intel_display(intel_dp); 3279 + 3280 + if (DISPLAY_VER(display) < 20 && intel_dp->psr.psr2_sel_fetch_enabled) { 3279 3281 if (!intel_dp->psr.psr2_sel_fetch_cff_enabled) { 3280 3282 intel_dp->psr.psr2_sel_fetch_cff_enabled = true; 3281 3283 intel_psr_configure_full_frame_update(intel_dp); ··· 3363 3361 { 3364 3362 struct intel_display *display = to_intel_display(intel_dp); 3365 3363 3366 - if (intel_dp->psr.psr2_sel_fetch_enabled) { 3364 + if (DISPLAY_VER(display) < 20 && intel_dp->psr.psr2_sel_fetch_enabled) { 3367 3365 if (intel_dp->psr.psr2_sel_fetch_cff_enabled) { 3368 3366 /* can we turn CFF off? */ 3369 3367 if (intel_dp->psr.busy_frontbuffer_bits == 0) ··· 3380 3378 * existing SU configuration 3381 3379 */ 3382 3380 intel_psr_configure_full_frame_update(intel_dp); 3381 + 3382 + intel_psr_force_update(intel_dp); 3383 + } else { 3384 + intel_psr_exit(intel_dp); 3383 3385 } 3384 3386 3385 - intel_psr_force_update(intel_dp); 3386 - 3387 - if (!intel_dp->psr.psr2_sel_fetch_enabled && !intel_dp->psr.active && 3387 + if ((!intel_dp->psr.psr2_sel_fetch_enabled || DISPLAY_VER(display) >= 20) && 3388 3388 !intel_dp->psr.busy_frontbuffer_bits) 3389 3389 queue_work(display->wq.unordered, &intel_dp->psr.work); 3390 3390 }
+3 -6
drivers/gpu/drm/nouveau/nouveau_display.c
··· 253 253 254 254 int 255 255 nouveau_framebuffer_new(struct drm_device *dev, 256 + const struct drm_format_info *info, 256 257 const struct drm_mode_fb_cmd2 *mode_cmd, 257 258 struct drm_gem_object *gem, 258 259 struct drm_framebuffer **pfb) ··· 261 260 struct nouveau_drm *drm = nouveau_drm(dev); 262 261 struct nouveau_bo *nvbo = nouveau_gem_object(gem); 263 262 struct drm_framebuffer *fb; 264 - const struct drm_format_info *info; 265 263 unsigned int height, i; 266 264 uint32_t tile_mode; 267 265 uint8_t kind; ··· 295 295 kind = nvbo->kind; 296 296 } 297 297 298 - info = drm_get_format_info(dev, mode_cmd->pixel_format, 299 - mode_cmd->modifier[0]); 300 - 301 298 for (i = 0; i < info->num_planes; i++) { 302 299 height = drm_format_info_plane_height(info, 303 300 mode_cmd->height, ··· 318 321 if (!(fb = *pfb = kzalloc(sizeof(*fb), GFP_KERNEL))) 319 322 return -ENOMEM; 320 323 321 - drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd); 324 + drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd); 322 325 fb->obj[0] = gem; 323 326 324 327 ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs); ··· 341 344 if (!gem) 342 345 return ERR_PTR(-ENOENT); 343 346 344 - ret = nouveau_framebuffer_new(dev, mode_cmd, gem, &fb); 347 + ret = nouveau_framebuffer_new(dev, info, mode_cmd, gem, &fb); 345 348 if (ret == 0) 346 349 return fb; 347 350
+3
drivers/gpu/drm/nouveau/nouveau_display.h
··· 8 8 9 9 #include <drm/drm_framebuffer.h> 10 10 11 + struct drm_format_info; 12 + 11 13 int 12 14 nouveau_framebuffer_new(struct drm_device *dev, 15 + const struct drm_format_info *info, 13 16 const struct drm_mode_fb_cmd2 *mode_cmd, 14 17 struct drm_gem_object *gem, 15 18 struct drm_framebuffer **pfb);
+10 -13
drivers/gpu/drm/omapdrm/omap_fb.c
··· 351 351 } 352 352 } 353 353 354 - fb = omap_framebuffer_init(dev, mode_cmd, bos); 354 + fb = omap_framebuffer_init(dev, info, mode_cmd, bos); 355 355 if (IS_ERR(fb)) 356 356 goto error; 357 357 ··· 365 365 } 366 366 367 367 struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, 368 + const struct drm_format_info *info, 368 369 const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos) 369 370 { 370 - const struct drm_format_info *format = NULL; 371 371 struct omap_framebuffer *omap_fb = NULL; 372 372 struct drm_framebuffer *fb = NULL; 373 373 unsigned int pitch = mode_cmd->pitches[0]; ··· 377 377 dev, mode_cmd, mode_cmd->width, mode_cmd->height, 378 378 (char *)&mode_cmd->pixel_format); 379 379 380 - format = drm_get_format_info(dev, mode_cmd->pixel_format, 381 - mode_cmd->modifier[0]); 382 - 383 380 for (i = 0; i < ARRAY_SIZE(formats); i++) { 384 381 if (formats[i] == mode_cmd->pixel_format) 385 382 break; 386 383 } 387 384 388 - if (!format || i == ARRAY_SIZE(formats)) { 385 + if (i == ARRAY_SIZE(formats)) { 389 386 dev_dbg(dev->dev, "unsupported pixel format: %4.4s\n", 390 387 (char *)&mode_cmd->pixel_format); 391 388 ret = -EINVAL; ··· 396 399 } 397 400 398 401 fb = &omap_fb->base; 399 - omap_fb->format = format; 402 + omap_fb->format = info; 400 403 mutex_init(&omap_fb->lock); 401 404 402 405 /* ··· 404 407 * that the two planes of multiplane formats need the same number of 405 408 * bytes per pixel. 406 409 */ 407 - if (format->num_planes == 2 && pitch != mode_cmd->pitches[1]) { 410 + if (info->num_planes == 2 && pitch != mode_cmd->pitches[1]) { 408 411 dev_dbg(dev->dev, "pitches differ between planes 0 and 1\n"); 409 412 ret = -EINVAL; 410 413 goto fail; 411 414 } 412 415 413 - if (pitch % format->cpp[0]) { 416 + if (pitch % info->cpp[0]) { 414 417 dev_dbg(dev->dev, 415 418 "buffer pitch (%u bytes) is not a multiple of pixel size (%u bytes)\n", 416 - pitch, format->cpp[0]); 419 + pitch, info->cpp[0]); 417 420 ret = -EINVAL; 418 421 goto fail; 419 422 } 420 423 421 - for (i = 0; i < format->num_planes; i++) { 424 + for (i = 0; i < info->num_planes; i++) { 422 425 struct plane *plane = &omap_fb->planes[i]; 423 - unsigned int vsub = i == 0 ? 1 : format->vsub; 426 + unsigned int vsub = i == 0 ? 1 : info->vsub; 424 427 unsigned int size; 425 428 426 429 size = pitch * mode_cmd->height / vsub; ··· 437 440 plane->dma_addr = 0; 438 441 } 439 442 440 - drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd); 443 + drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd); 441 444 442 445 ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs); 443 446 if (ret) {
+2
drivers/gpu/drm/omapdrm/omap_fb.h
··· 13 13 struct drm_device; 14 14 struct drm_file; 15 15 struct drm_framebuffer; 16 + struct drm_format_info; 16 17 struct drm_gem_object; 17 18 struct drm_mode_fb_cmd2; 18 19 struct drm_plane_state; ··· 24 23 struct drm_file *file, const struct drm_format_info *info, 25 24 const struct drm_mode_fb_cmd2 *mode_cmd); 26 25 struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, 26 + const struct drm_format_info *info, 27 27 const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos); 28 28 int omap_framebuffer_pin(struct drm_framebuffer *fb); 29 29 void omap_framebuffer_unpin(struct drm_framebuffer *fb);
+4 -1
drivers/gpu/drm/omapdrm/omap_fbdev.c
··· 197 197 goto fail; 198 198 } 199 199 200 - fb = omap_framebuffer_init(dev, &mode_cmd, &bo); 200 + fb = omap_framebuffer_init(dev, 201 + drm_get_format_info(dev, mode_cmd.pixel_format, 202 + mode_cmd.modifier[0]), 203 + &mode_cmd, &bo); 201 204 if (IS_ERR(fb)) { 202 205 dev_err(dev->dev, "failed to allocate fb\n"); 203 206 /* note: if fb creation failed, we can't rely on fb destroy
+1 -1
drivers/gpu/drm/panfrost/panfrost_gem.c
··· 432 432 if (!refcount) 433 433 return; 434 434 435 - resident_size = bo->base.pages ? bo->base.base.size : 0; 435 + resident_size = panfrost_gem_rss(&bo->base.base); 436 436 437 437 snprintf(creator_info, sizeof(creator_info), 438 438 "%s/%d", bo->debugfs.creator.process_name, bo->debugfs.creator.tgid);
+3 -2
drivers/gpu/drm/radeon/radeon_display.c
··· 1297 1297 int 1298 1298 radeon_framebuffer_init(struct drm_device *dev, 1299 1299 struct drm_framebuffer *fb, 1300 + const struct drm_format_info *info, 1300 1301 const struct drm_mode_fb_cmd2 *mode_cmd, 1301 1302 struct drm_gem_object *obj) 1302 1303 { 1303 1304 int ret; 1304 1305 fb->obj[0] = obj; 1305 - drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd); 1306 + drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd); 1306 1307 ret = drm_framebuffer_init(dev, fb, &radeon_fb_funcs); 1307 1308 if (ret) { 1308 1309 fb->obj[0] = NULL; ··· 1342 1341 return ERR_PTR(-ENOMEM); 1343 1342 } 1344 1343 1345 - ret = radeon_framebuffer_init(dev, fb, mode_cmd, obj); 1344 + ret = radeon_framebuffer_init(dev, fb, info, mode_cmd, obj); 1346 1345 if (ret) { 1347 1346 kfree(fb); 1348 1347 drm_gem_object_put(obj);
+6 -5
drivers/gpu/drm/radeon/radeon_fbdev.c
··· 53 53 } 54 54 55 55 static int radeon_fbdev_create_pinned_object(struct drm_fb_helper *fb_helper, 56 + const struct drm_format_info *info, 56 57 struct drm_mode_fb_cmd2 *mode_cmd, 57 58 struct drm_gem_object **gobj_p) 58 59 { 59 - const struct drm_format_info *info; 60 60 struct radeon_device *rdev = fb_helper->dev->dev_private; 61 61 struct drm_gem_object *gobj = NULL; 62 62 struct radeon_bo *rbo = NULL; ··· 67 67 int height = mode_cmd->height; 68 68 u32 cpp; 69 69 70 - info = drm_get_format_info(rdev_to_drm(rdev), mode_cmd->pixel_format, 71 - mode_cmd->modifier[0]); 72 70 cpp = info->cpp[0]; 73 71 74 72 /* need to align pitch with crtc limits */ ··· 204 206 struct drm_fb_helper_surface_size *sizes) 205 207 { 206 208 struct radeon_device *rdev = fb_helper->dev->dev_private; 209 + const struct drm_format_info *format_info; 207 210 struct drm_mode_fb_cmd2 mode_cmd = { }; 208 211 struct fb_info *info; 209 212 struct drm_gem_object *gobj; ··· 223 224 mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, 224 225 sizes->surface_depth); 225 226 226 - ret = radeon_fbdev_create_pinned_object(fb_helper, &mode_cmd, &gobj); 227 + format_info = drm_get_format_info(rdev_to_drm(rdev), mode_cmd.pixel_format, 228 + mode_cmd.modifier[0]); 229 + ret = radeon_fbdev_create_pinned_object(fb_helper, format_info, &mode_cmd, &gobj); 227 230 if (ret) { 228 231 DRM_ERROR("failed to create fbcon object %d\n", ret); 229 232 return ret; ··· 237 236 ret = -ENOMEM; 238 237 goto err_radeon_fbdev_destroy_pinned_object; 239 238 } 240 - ret = radeon_framebuffer_init(rdev_to_drm(rdev), fb, &mode_cmd, gobj); 239 + ret = radeon_framebuffer_init(rdev_to_drm(rdev), fb, format_info, &mode_cmd, gobj); 241 240 if (ret) { 242 241 DRM_ERROR("failed to initialize framebuffer %d\n", ret); 243 242 goto err_kfree;
+2
drivers/gpu/drm/radeon/radeon_mode.h
··· 40 40 41 41 struct drm_fb_helper; 42 42 struct drm_fb_helper_surface_size; 43 + struct drm_format_info; 43 44 44 45 struct edid; 45 46 struct drm_edid; ··· 891 890 radeon_combios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on); 892 891 int radeon_framebuffer_init(struct drm_device *dev, 893 892 struct drm_framebuffer *rfb, 893 + const struct drm_format_info *info, 894 894 const struct drm_mode_fb_cmd2 *mode_cmd, 895 895 struct drm_gem_object *obj); 896 896
+1
drivers/gpu/drm/xe/regs/xe_bars.h
··· 7 7 8 8 #define GTTMMADR_BAR 0 /* MMIO + GTT */ 9 9 #define LMEM_BAR 2 /* VRAM */ 10 + #define VF_LMEM_BAR 9 /* VF VRAM */ 10 11 11 12 #endif
+29
drivers/gpu/drm/xe/xe_hwmon.c
··· 332 332 int ret = 0; 333 333 u32 reg_val, max; 334 334 struct xe_reg rapl_limit; 335 + u64 max_supp_power_limit = 0; 335 336 336 337 mutex_lock(&hwmon->hwmon_lock); 337 338 ··· 355 354 ret = -EOPNOTSUPP; 356 355 } 357 356 goto unlock; 357 + } 358 + 359 + /* 360 + * If the sysfs value exceeds the maximum pcode supported power limit value, clamp it to 361 + * the supported maximum (U12.3 format). 362 + * This is to avoid truncation during reg_val calculation below and ensure the valid 363 + * power limit is sent for pcode which would clamp it to card-supported value. 364 + */ 365 + max_supp_power_limit = ((PWR_LIM_VAL) >> hwmon->scl_shift_power) * SF_POWER; 366 + if (value > max_supp_power_limit) { 367 + value = max_supp_power_limit; 368 + drm_info(&hwmon->xe->drm, 369 + "Power limit clamped as selected %s exceeds channel %d limit\n", 370 + PWR_ATTR_TO_STR(attr), channel); 358 371 } 359 372 360 373 /* Computation in 64-bits to avoid overflow. Round to nearest. */ ··· 754 739 { 755 740 int ret; 756 741 u32 uval; 742 + u64 max_crit_power_curr = 0; 757 743 758 744 mutex_lock(&hwmon->hwmon_lock); 759 745 746 + /* 747 + * If the sysfs value exceeds the pcode mailbox cmd POWER_SETUP_SUBCOMMAND_WRITE_I1 748 + * max supported value, clamp it to the command's max (U10.6 format). 749 + * This is to avoid truncation during uval calculation below and ensure the valid power 750 + * limit is sent for pcode which would clamp it to card-supported value. 751 + */ 752 + max_crit_power_curr = (POWER_SETUP_I1_DATA_MASK >> POWER_SETUP_I1_SHIFT) * scale_factor; 753 + if (value > max_crit_power_curr) { 754 + value = max_crit_power_curr; 755 + drm_info(&hwmon->xe->drm, 756 + "Power limit clamped as selected exceeds channel %d limit\n", 757 + channel); 758 + } 760 759 uval = DIV_ROUND_CLOSEST_ULL(value << POWER_SETUP_I1_SHIFT, scale_factor); 761 760 ret = xe_hwmon_pcode_write_i1(hwmon, uval); 762 761
+27 -15
drivers/gpu/drm/xe/xe_migrate.c
··· 1820 1820 if (!IS_ALIGNED(len, XE_CACHELINE_BYTES) || 1821 1821 !IS_ALIGNED((unsigned long)buf + offset, XE_CACHELINE_BYTES)) { 1822 1822 int buf_offset = 0; 1823 + void *bounce; 1824 + int err; 1825 + 1826 + BUILD_BUG_ON(!is_power_of_2(XE_CACHELINE_BYTES)); 1827 + bounce = kmalloc(XE_CACHELINE_BYTES, GFP_KERNEL); 1828 + if (!bounce) 1829 + return -ENOMEM; 1823 1830 1824 1831 /* 1825 1832 * Less than ideal for large unaligned access but this should be 1826 1833 * fairly rare, can fixup if this becomes common. 1827 1834 */ 1828 1835 do { 1829 - u8 bounce[XE_CACHELINE_BYTES]; 1830 - void *ptr = (void *)bounce; 1831 - int err; 1832 1836 int copy_bytes = min_t(int, bytes_left, 1833 1837 XE_CACHELINE_BYTES - 1834 1838 (offset & XE_CACHELINE_MASK)); ··· 1841 1837 err = xe_migrate_access_memory(m, bo, 1842 1838 offset & 1843 1839 ~XE_CACHELINE_MASK, 1844 - (void *)ptr, 1845 - sizeof(bounce), 0); 1840 + bounce, 1841 + XE_CACHELINE_BYTES, 0); 1846 1842 if (err) 1847 - return err; 1843 + break; 1848 1844 1849 1845 if (write) { 1850 - memcpy(ptr + ptr_offset, buf + buf_offset, copy_bytes); 1846 + memcpy(bounce + ptr_offset, buf + buf_offset, copy_bytes); 1851 1847 1852 1848 err = xe_migrate_access_memory(m, bo, 1853 1849 offset & ~XE_CACHELINE_MASK, 1854 - (void *)ptr, 1855 - sizeof(bounce), write); 1850 + bounce, 1851 + XE_CACHELINE_BYTES, write); 1856 1852 if (err) 1857 - return err; 1853 + break; 1858 1854 } else { 1859 - memcpy(buf + buf_offset, ptr + ptr_offset, 1855 + memcpy(buf + buf_offset, bounce + ptr_offset, 1860 1856 copy_bytes); 1861 1857 } 1862 1858 ··· 1865 1861 offset += copy_bytes; 1866 1862 } while (bytes_left); 1867 1863 1868 - return 0; 1864 + kfree(bounce); 1865 + return err; 1869 1866 } 1870 1867 1871 1868 dma_addr = xe_migrate_dma_map(xe, buf, len + page_offset, write); ··· 1887 1882 else 1888 1883 current_bytes = min_t(int, bytes_left, cursor.size); 1889 1884 1890 - if (fence) 1891 - dma_fence_put(fence); 1885 + if (current_bytes & ~PAGE_MASK) { 1886 + int pitch = 4; 1887 + 1888 + current_bytes = min_t(int, current_bytes, S16_MAX * pitch); 1889 + } 1892 1890 1893 1891 __fence = xe_migrate_vram(m, current_bytes, 1894 1892 (unsigned long)buf & ~PAGE_MASK, ··· 1900 1892 XE_MIGRATE_COPY_TO_VRAM : 1901 1893 XE_MIGRATE_COPY_TO_SRAM); 1902 1894 if (IS_ERR(__fence)) { 1903 - if (fence) 1895 + if (fence) { 1904 1896 dma_fence_wait(fence, false); 1897 + dma_fence_put(fence); 1898 + } 1905 1899 fence = __fence; 1906 1900 goto out_err; 1907 1901 } 1902 + 1903 + dma_fence_put(fence); 1908 1904 fence = __fence; 1909 1905 1910 1906 buf += current_bytes;
+22
drivers/gpu/drm/xe/xe_pci_sriov.c
··· 3 3 * Copyright © 2023-2024 Intel Corporation 4 4 */ 5 5 6 + #include <linux/bitops.h> 7 + #include <linux/pci.h> 8 + 9 + #include "regs/xe_bars.h" 6 10 #include "xe_assert.h" 7 11 #include "xe_device.h" 8 12 #include "xe_gt_sriov_pf_config.h" ··· 132 128 } 133 129 } 134 130 131 + static int resize_vf_vram_bar(struct xe_device *xe, int num_vfs) 132 + { 133 + struct pci_dev *pdev = to_pci_dev(xe->drm.dev); 134 + u32 sizes; 135 + 136 + sizes = pci_iov_vf_bar_get_sizes(pdev, VF_LMEM_BAR, num_vfs); 137 + if (!sizes) 138 + return 0; 139 + 140 + return pci_iov_vf_bar_set_size(pdev, VF_LMEM_BAR, __fls(sizes)); 141 + } 142 + 135 143 static int pf_enable_vfs(struct xe_device *xe, int num_vfs) 136 144 { 137 145 struct pci_dev *pdev = to_pci_dev(xe->drm.dev); ··· 173 157 err = pf_provision_vfs(xe, num_vfs); 174 158 if (err < 0) 175 159 goto failed; 160 + 161 + if (IS_DGFX(xe)) { 162 + err = resize_vf_vram_bar(xe, num_vfs); 163 + if (err) 164 + xe_sriov_info(xe, "Failed to set VF LMEM BAR size: %d\n", err); 165 + } 176 166 177 167 err = pci_enable_sriov(pdev, num_vfs); 178 168 if (err < 0)
+47 -4
drivers/gpu/drm/xe/xe_shrinker.c
··· 54 54 write_unlock(&shrinker->lock); 55 55 } 56 56 57 - static s64 xe_shrinker_walk(struct xe_device *xe, 58 - struct ttm_operation_ctx *ctx, 59 - const struct xe_bo_shrink_flags flags, 60 - unsigned long to_scan, unsigned long *scanned) 57 + static s64 __xe_shrinker_walk(struct xe_device *xe, 58 + struct ttm_operation_ctx *ctx, 59 + const struct xe_bo_shrink_flags flags, 60 + unsigned long to_scan, unsigned long *scanned) 61 61 { 62 62 unsigned int mem_type; 63 63 s64 freed = 0, lret; ··· 88 88 } 89 89 /* Trylocks should never error, just fail. */ 90 90 xe_assert(xe, !IS_ERR(ttm_bo)); 91 + } 92 + 93 + return freed; 94 + } 95 + 96 + /* 97 + * Try shrinking idle objects without writeback first, then if not sufficient, 98 + * try also non-idle objects and finally if that's not sufficient either, 99 + * add writeback. This avoids stalls and explicit writebacks with light or 100 + * moderate memory pressure. 101 + */ 102 + static s64 xe_shrinker_walk(struct xe_device *xe, 103 + struct ttm_operation_ctx *ctx, 104 + const struct xe_bo_shrink_flags flags, 105 + unsigned long to_scan, unsigned long *scanned) 106 + { 107 + bool no_wait_gpu = true; 108 + struct xe_bo_shrink_flags save_flags = flags; 109 + s64 lret, freed; 110 + 111 + swap(no_wait_gpu, ctx->no_wait_gpu); 112 + save_flags.writeback = false; 113 + lret = __xe_shrinker_walk(xe, ctx, save_flags, to_scan, scanned); 114 + swap(no_wait_gpu, ctx->no_wait_gpu); 115 + if (lret < 0 || *scanned >= to_scan) 116 + return lret; 117 + 118 + freed = lret; 119 + if (!ctx->no_wait_gpu) { 120 + lret = __xe_shrinker_walk(xe, ctx, save_flags, to_scan, scanned); 121 + if (lret < 0) 122 + return lret; 123 + freed += lret; 124 + if (*scanned >= to_scan) 125 + return freed; 126 + } 127 + 128 + if (flags.writeback) { 129 + lret = __xe_shrinker_walk(xe, ctx, flags, to_scan, scanned); 130 + if (lret < 0) 131 + return lret; 132 + freed += lret; 91 133 } 92 134 93 135 return freed; ··· 241 199 runtime_pm = xe_shrinker_runtime_pm_get(shrinker, true, 0, can_backup); 242 200 243 201 shrink_flags.purge = false; 202 + 244 203 lret = xe_shrinker_walk(shrinker->xe, &ctx, shrink_flags, 245 204 nr_to_scan, &nr_scanned); 246 205 if (lret >= 0)
+48
include/drm/drm_bridge.h
··· 866 866 struct drm_connector *connector, 867 867 bool enable, int direction); 868 868 869 + /** 870 + * @hdmi_cec_init: 871 + * 872 + * Initialize CEC part of the bridge. 873 + * 874 + * This callback is optional, it can be implemented by bridges that 875 + * set the @DRM_BRIDGE_OP_HDMI_CEC_ADAPTER flag in their 876 + * &drm_bridge->ops. 877 + * 878 + * Returns: 879 + * 0 on success, a negative error code otherwise 880 + */ 869 881 int (*hdmi_cec_init)(struct drm_bridge *bridge, 870 882 struct drm_connector *connector); 871 883 884 + /** 885 + * @hdmi_cec_enable: 886 + * 887 + * Enable or disable the CEC adapter inside the bridge. 888 + * 889 + * This callback is optional, it can be implemented by bridges that 890 + * set the @DRM_BRIDGE_OP_HDMI_CEC_ADAPTER flag in their 891 + * &drm_bridge->ops. 892 + * 893 + * Returns: 894 + * 0 on success, a negative error code otherwise 895 + */ 872 896 int (*hdmi_cec_enable)(struct drm_bridge *bridge, bool enable); 873 897 898 + /** 899 + * @hdmi_cec_log_addr: 900 + * 901 + * Set the logical address of the CEC adapter inside the bridge. 902 + * 903 + * This callback is optional, it can be implemented by bridges that 904 + * set the @DRM_BRIDGE_OP_HDMI_CEC_ADAPTER flag in their 905 + * &drm_bridge->ops. 906 + * 907 + * Returns: 908 + * 0 on success, a negative error code otherwise 909 + */ 874 910 int (*hdmi_cec_log_addr)(struct drm_bridge *bridge, u8 logical_addr); 875 911 912 + /** 913 + * @hdmi_cec_transmit: 914 + * 915 + * Transmit the message using the CEC adapter inside the bridge. 916 + * 917 + * This callback is optional, it can be implemented by bridges that 918 + * set the @DRM_BRIDGE_OP_HDMI_CEC_ADAPTER flag in their 919 + * &drm_bridge->ops. 920 + * 921 + * Returns: 922 + * 0 on success, a negative error code otherwise 923 + */ 876 924 int (*hdmi_cec_transmit)(struct drm_bridge *bridge, u8 attempts, 877 925 u32 signal_free_time, struct cec_msg *msg); 878 926