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

Merge tag 'amd-drm-fixes-6.19-2026-01-15' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes

amd-drm-fixes-6.19-2026-01-15:

amdgpu:
- GC 9 PTE mtype fix
- Non-DC display kernel panic helper fix
- Merge fix
- GART vram access fix
- Userq fixes
- PSR debugging fix
- HDMI fixes
- Backlight fix
- SMU 14 fix
- TLB flush fixes

amdkfd:
- KFD node cleanup for eGPU disconnect
- Memory leak fix
- MES evict process fix

Signed-off-by: Simona Vetter <simona.vetter@ffwll.ch>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patch.msgid.link/20260115205405.1890089-1-alexander.deucher@amd.com

+116 -50
+2
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 274 274 extern int amdgpu_wbrf; 275 275 extern int amdgpu_user_queue; 276 276 277 + extern uint amdgpu_hdmi_hpd_debounce_delay_ms; 278 + 277 279 #define AMDGPU_VM_MAX_NUM_CTX 4096 278 280 #define AMDGPU_SG_THRESHOLD (256*1024*1024) 279 281 #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000
+8
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 5063 5063 5064 5064 amdgpu_ttm_set_buffer_funcs_status(adev, false); 5065 5065 5066 + /* 5067 + * device went through surprise hotplug; we need to destroy topology 5068 + * before ip_fini_early to prevent kfd locking refcount issues by calling 5069 + * amdgpu_amdkfd_suspend() 5070 + */ 5071 + if (drm_dev_is_unplugged(adev_to_drm(adev))) 5072 + amdgpu_amdkfd_device_fini_sw(adev); 5073 + 5066 5074 amdgpu_device_ip_fini_early(adev); 5067 5075 5068 5076 amdgpu_irq_fini_hw(adev);
+6 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
··· 1880 1880 struct drm_scanout_buffer *sb) 1881 1881 { 1882 1882 struct amdgpu_bo *abo; 1883 - struct drm_framebuffer *fb = plane->state->fb; 1883 + struct drm_framebuffer *fb; 1884 + 1885 + if (drm_drv_uses_atomic_modeset(plane->dev)) 1886 + fb = plane->state->fb; 1887 + else 1888 + fb = plane->fb; 1884 1889 1885 1890 if (!fb) 1886 1891 return -EINVAL;
-12
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
··· 95 95 bo->flags & AMDGPU_GEM_CREATE_GFX12_DCC) 96 96 attach->peer2peer = false; 97 97 98 - /* 99 - * Disable peer-to-peer access for DCC-enabled VRAM surfaces on GFX12+. 100 - * Such buffers cannot be safely accessed over P2P due to device-local 101 - * compression metadata. Fallback to system-memory path instead. 102 - * Device supports GFX12 (GC 12.x or newer) 103 - * BO was created with the AMDGPU_GEM_CREATE_GFX12_DCC flag 104 - * 105 - */ 106 - if (amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(12, 0, 0) && 107 - bo->flags & AMDGPU_GEM_CREATE_GFX12_DCC) 108 - attach->peer2peer = false; 109 - 110 98 if (!amdgpu_dmabuf_is_xgmi_accessible(attach_adev, bo) && 111 99 pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0) 112 100 attach->peer2peer = false;
+11
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
··· 247 247 int amdgpu_umsch_mm_fwlog; 248 248 int amdgpu_rebar = -1; /* auto */ 249 249 int amdgpu_user_queue = -1; 250 + uint amdgpu_hdmi_hpd_debounce_delay_ms; 250 251 251 252 DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0, 252 253 "DRM_UT_CORE", ··· 1123 1122 */ 1124 1123 MODULE_PARM_DESC(user_queue, "Enable user queues (-1 = auto (default), 0 = disable, 1 = enable, 2 = enable UQs and disable KQs)"); 1125 1124 module_param_named(user_queue, amdgpu_user_queue, int, 0444); 1125 + 1126 + /* 1127 + * DOC: hdmi_hpd_debounce_delay_ms (uint) 1128 + * HDMI HPD disconnect debounce delay in milliseconds. 1129 + * 1130 + * Used to filter short disconnect->reconnect HPD toggles some HDMI sinks 1131 + * generate while entering/leaving power save. Set to 0 to disable by default. 1132 + */ 1133 + MODULE_PARM_DESC(hdmi_hpd_debounce_delay_ms, "HDMI HPD disconnect debounce delay in milliseconds (0 to disable (by default), 1500 is common)"); 1134 + module_param_named(hdmi_hpd_debounce_delay_ms, amdgpu_hdmi_hpd_debounce_delay_ms, uint, 0644); 1126 1135 1127 1136 /* These devices are not supported by amdgpu. 1128 1137 * They are supported by the mach64, r128, radeon drivers
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
··· 375 375 * @start_page: first page to map in the GART aperture 376 376 * @num_pages: number of pages to be mapped 377 377 * @flags: page table entry flags 378 - * @dst: CPU address of the GART table 378 + * @dst: valid CPU address of GART table, cannot be null 379 379 * 380 380 * Binds a BO that is allocated in VRAM to the GART page table 381 381 * (all ASICs). ··· 396 396 return; 397 397 398 398 for (i = 0; i < num_pages; ++i) { 399 - amdgpu_gmc_set_pte_pde(adev, adev->gart.ptr, 399 + amdgpu_gmc_set_pte_pde(adev, dst, 400 400 start_page + i, pa + AMDGPU_GPU_PAGE_SIZE * i, flags); 401 401 } 402 402
+4
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
··· 732 732 return 0; 733 733 734 734 if (!adev->gmc.flush_pasid_uses_kiq || !ring->sched.ready) { 735 + 736 + if (!adev->gmc.gmc_funcs->flush_gpu_tlb_pasid) 737 + return 0; 738 + 735 739 if (adev->gmc.flush_tlb_needs_extra_type_2) 736 740 adev->gmc.gmc_funcs->flush_gpu_tlb_pasid(adev, pasid, 737 741 2, all_hub,
+16
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
··· 885 885 return 0; 886 886 } 887 887 888 + bool amdgpu_userq_enabled(struct drm_device *dev) 889 + { 890 + struct amdgpu_device *adev = drm_to_adev(dev); 891 + int i; 892 + 893 + for (i = 0; i < AMDGPU_HW_IP_NUM; i++) { 894 + if (adev->userq_funcs[i]) 895 + return true; 896 + } 897 + 898 + return false; 899 + } 900 + 888 901 int amdgpu_userq_ioctl(struct drm_device *dev, void *data, 889 902 struct drm_file *filp) 890 903 { 891 904 union drm_amdgpu_userq *args = data; 892 905 int r; 906 + 907 + if (!amdgpu_userq_enabled(dev)) 908 + return -ENOTSUPP; 893 909 894 910 if (amdgpu_userq_input_args_validate(dev, args, filp) < 0) 895 911 return -EINVAL;
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
··· 141 141 struct drm_file *filp); 142 142 143 143 u32 amdgpu_userq_get_supported_ip_mask(struct amdgpu_device *adev); 144 + bool amdgpu_userq_enabled(struct drm_device *dev); 144 145 145 146 int amdgpu_userq_suspend(struct amdgpu_device *adev); 146 147 int amdgpu_userq_resume(struct amdgpu_device *adev);
+8
drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
··· 141 141 void 142 142 amdgpu_userq_fence_driver_free(struct amdgpu_usermode_queue *userq) 143 143 { 144 + dma_fence_put(userq->last_fence); 145 + 144 146 amdgpu_userq_walk_and_drop_fence_drv(&userq->fence_drv_xa); 145 147 xa_destroy(&userq->fence_drv_xa); 146 148 /* Drop the fence_drv reference held by user queue */ ··· 473 471 struct drm_exec exec; 474 472 u64 wptr; 475 473 474 + if (!amdgpu_userq_enabled(dev)) 475 + return -ENOTSUPP; 476 + 476 477 num_syncobj_handles = args->num_syncobj_handles; 477 478 syncobj_handles = memdup_user(u64_to_user_ptr(args->syncobj_handles), 478 479 size_mul(sizeof(u32), num_syncobj_handles)); ··· 657 652 u16 num_points, num_fences = 0; 658 653 int r, i, rentry, wentry, cnt; 659 654 struct drm_exec exec; 655 + 656 + if (!amdgpu_userq_enabled(dev)) 657 + return -ENOTSUPP; 660 658 661 659 num_read_bo_handles = wait_info->num_bo_read_handles; 662 660 bo_handles_read = memdup_user(u64_to_user_ptr(wait_info->bo_read_handles),
+1 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 1069 1069 } 1070 1070 1071 1071 /* Prepare a TLB flush fence to be attached to PTs */ 1072 - if (!params->unlocked && 1073 - /* SI doesn't support pasid or KIQ/MES */ 1074 - params->adev->family > AMDGPU_FAMILY_SI) { 1072 + if (!params->unlocked) { 1075 1073 amdgpu_vm_tlb_fence_create(params->adev, vm, fence); 1076 1074 1077 1075 /* Makes sure no PD/PT is freed before the flush */
+4 -4
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 1235 1235 *flags = AMDGPU_PTE_MTYPE_VG10(*flags, MTYPE_NC); 1236 1236 break; 1237 1237 case AMDGPU_VM_MTYPE_WC: 1238 - *flags |= AMDGPU_PTE_MTYPE_VG10(*flags, MTYPE_WC); 1238 + *flags = AMDGPU_PTE_MTYPE_VG10(*flags, MTYPE_WC); 1239 1239 break; 1240 1240 case AMDGPU_VM_MTYPE_RW: 1241 - *flags |= AMDGPU_PTE_MTYPE_VG10(*flags, MTYPE_RW); 1241 + *flags = AMDGPU_PTE_MTYPE_VG10(*flags, MTYPE_RW); 1242 1242 break; 1243 1243 case AMDGPU_VM_MTYPE_CC: 1244 - *flags |= AMDGPU_PTE_MTYPE_VG10(*flags, MTYPE_CC); 1244 + *flags = AMDGPU_PTE_MTYPE_VG10(*flags, MTYPE_CC); 1245 1245 break; 1246 1246 case AMDGPU_VM_MTYPE_UC: 1247 - *flags |= AMDGPU_PTE_MTYPE_VG10(*flags, MTYPE_UC); 1247 + *flags = AMDGPU_PTE_MTYPE_VG10(*flags, MTYPE_UC); 1248 1248 break; 1249 1249 } 1250 1250
+12 -19
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
··· 1209 1209 pr_debug_ratelimited("Evicting process pid %d queues\n", 1210 1210 pdd->process->lead_thread->pid); 1211 1211 1212 - if (dqm->dev->kfd->shared_resources.enable_mes) { 1212 + if (dqm->dev->kfd->shared_resources.enable_mes) 1213 1213 pdd->last_evict_timestamp = get_jiffies_64(); 1214 - retval = suspend_all_queues_mes(dqm); 1215 - if (retval) { 1216 - dev_err(dev, "Suspending all queues failed"); 1217 - goto out; 1218 - } 1219 - } 1220 1214 1221 1215 /* Mark all queues as evicted. Deactivate all active queues on 1222 1216 * the qpd. ··· 1240 1246 KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES : 1241 1247 KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, 1242 1248 USE_DEFAULT_GRACE_PERIOD); 1243 - } else { 1244 - retval = resume_all_queues_mes(dqm); 1245 - if (retval) 1246 - dev_err(dev, "Resuming all queues failed"); 1247 1249 } 1248 1250 1249 1251 out: ··· 2909 2919 return retval; 2910 2920 } 2911 2921 2922 + static void deallocate_hiq_sdma_mqd(struct kfd_node *dev, 2923 + struct kfd_mem_obj *mqd) 2924 + { 2925 + WARN(!mqd, "No hiq sdma mqd trunk to free"); 2926 + 2927 + amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem); 2928 + } 2929 + 2912 2930 struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev) 2913 2931 { 2914 2932 struct device_queue_manager *dqm; ··· 3040 3042 return dqm; 3041 3043 } 3042 3044 3045 + if (!dev->kfd->shared_resources.enable_mes) 3046 + deallocate_hiq_sdma_mqd(dev, &dqm->hiq_sdma_mqd); 3047 + 3043 3048 out_free: 3044 3049 kfree(dqm); 3045 3050 return NULL; 3046 - } 3047 - 3048 - static void deallocate_hiq_sdma_mqd(struct kfd_node *dev, 3049 - struct kfd_mem_obj *mqd) 3050 - { 3051 - WARN(!mqd, "No hiq sdma mqd trunk to free"); 3052 - 3053 - amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem); 3054 3051 } 3055 3052 3056 3053 void device_queue_manager_uninit(struct device_queue_manager *dqm)
+31 -5
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 5266 5266 struct amdgpu_dm_backlight_caps *caps; 5267 5267 char bl_name[16]; 5268 5268 int min, max; 5269 + int real_brightness; 5270 + int init_brightness; 5269 5271 5270 5272 if (aconnector->bl_idx == -1) 5271 5273 return; ··· 5292 5290 } else 5293 5291 props.brightness = props.max_brightness = MAX_BACKLIGHT_LEVEL; 5294 5292 5293 + init_brightness = props.brightness; 5294 + 5295 5295 if (caps->data_points && !(amdgpu_dc_debug_mask & DC_DISABLE_CUSTOM_BRIGHTNESS_CURVE)) { 5296 5296 drm_info(drm, "Using custom brightness curve\n"); 5297 5297 props.scale = BACKLIGHT_SCALE_NON_LINEAR; ··· 5312 5308 if (IS_ERR(dm->backlight_dev[aconnector->bl_idx])) { 5313 5309 drm_err(drm, "DM: Backlight registration failed!\n"); 5314 5310 dm->backlight_dev[aconnector->bl_idx] = NULL; 5315 - } else 5311 + } else { 5312 + /* 5313 + * dm->brightness[x] can be inconsistent just after startup until 5314 + * ops.get_brightness is called. 5315 + */ 5316 + real_brightness = 5317 + amdgpu_dm_backlight_ops.get_brightness(dm->backlight_dev[aconnector->bl_idx]); 5318 + 5319 + if (real_brightness != init_brightness) { 5320 + dm->actual_brightness[aconnector->bl_idx] = real_brightness; 5321 + dm->brightness[aconnector->bl_idx] = real_brightness; 5322 + } 5316 5323 drm_dbg_driver(drm, "DM: Registered Backlight device: %s\n", bl_name); 5324 + } 5317 5325 } 5318 5326 5319 5327 static int initialize_plane(struct amdgpu_display_manager *dm, ··· 5642 5626 5643 5627 if (psr_feature_enabled) { 5644 5628 amdgpu_dm_set_psr_caps(link); 5645 - drm_info(adev_to_drm(adev), "PSR support %d, DC PSR ver %d, sink PSR ver %d DPCD caps 0x%x su_y_granularity %d\n", 5629 + drm_info(adev_to_drm(adev), "%s: PSR support %d, DC PSR ver %d, sink PSR ver %d DPCD caps 0x%x su_y_granularity %d\n", 5630 + aconnector->base.name, 5646 5631 link->psr_settings.psr_feature_enabled, 5647 5632 link->psr_settings.psr_version, 5648 5633 link->dpcd_caps.psr_info.psr_version, ··· 8947 8930 mutex_init(&aconnector->hpd_lock); 8948 8931 mutex_init(&aconnector->handle_mst_msg_ready); 8949 8932 8950 - aconnector->hdmi_hpd_debounce_delay_ms = AMDGPU_DM_HDMI_HPD_DEBOUNCE_MS; 8951 - INIT_DELAYED_WORK(&aconnector->hdmi_hpd_debounce_work, hdmi_hpd_debounce_work); 8952 - aconnector->hdmi_prev_sink = NULL; 8933 + /* 8934 + * If HDMI HPD debounce delay is set, use the minimum between selected 8935 + * value and AMDGPU_DM_MAX_HDMI_HPD_DEBOUNCE_MS 8936 + */ 8937 + if (amdgpu_hdmi_hpd_debounce_delay_ms) { 8938 + aconnector->hdmi_hpd_debounce_delay_ms = min(amdgpu_hdmi_hpd_debounce_delay_ms, 8939 + AMDGPU_DM_MAX_HDMI_HPD_DEBOUNCE_MS); 8940 + INIT_DELAYED_WORK(&aconnector->hdmi_hpd_debounce_work, hdmi_hpd_debounce_work); 8941 + aconnector->hdmi_prev_sink = NULL; 8942 + } else { 8943 + aconnector->hdmi_hpd_debounce_delay_ms = 0; 8944 + } 8953 8945 8954 8946 /* 8955 8947 * configure support HPD hot plug connector_>polled default value is 0
+4 -1
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
··· 59 59 60 60 #define AMDGPU_HDR_MULT_DEFAULT (0x100000000LL) 61 61 62 - #define AMDGPU_DM_HDMI_HPD_DEBOUNCE_MS 1500 62 + /* 63 + * Maximum HDMI HPD debounce delay in milliseconds 64 + */ 65 + #define AMDGPU_DM_MAX_HDMI_HPD_DEBOUNCE_MS 5000 63 66 /* 64 67 #include "include/amdgpu_dal_power_if.h" 65 68 #include "amdgpu_dm_irq.h"
+1 -1
drivers/gpu/drm/amd/display/dc/dc_hdmi_types.h
··· 41 41 /* kHZ*/ 42 42 #define DP_ADAPTOR_DVI_MAX_TMDS_CLK 165000 43 43 /* kHZ*/ 44 - #define DP_ADAPTOR_HDMI_SAFE_MAX_TMDS_CLK 165000 44 + #define DP_ADAPTOR_HDMI_SAFE_MAX_TMDS_CLK 340000 45 45 46 46 struct dp_hdmi_dongle_signature_data { 47 47 int8_t id[15];/* "DP-HDMI ADAPTOR"*/
+2 -1
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
··· 1702 1702 table_context->power_play_table; 1703 1703 PPTable_t *pptable = table_context->driver_pptable; 1704 1704 CustomSkuTable_t *skutable = &pptable->CustomSkuTable; 1705 - uint32_t power_limit, od_percent_upper = 0, od_percent_lower = 0; 1705 + int16_t od_percent_upper = 0, od_percent_lower = 0; 1706 1706 uint32_t msg_limit = pptable->SkuTable.MsgLimits.Power[PPT_THROTTLER_PPT0][POWER_SOURCE_AC]; 1707 + uint32_t power_limit; 1707 1708 1708 1709 if (smu_v14_0_get_current_power_limit(smu, &power_limit)) 1709 1710 power_limit = smu->adev->pm.ac_power ?