Skip to content

Commit 00ddc3f

Browse files
committed
Merge tag 'drm-fixes-2025-03-14' of https://gitlab.freedesktop.org/drm/kernel
Pull drm fixes from Dave Airlie: "Regular weekly fixes pull, the usual leaders in amdgpu/xe, a couple of i915, and some scattered misc fixes. panic: - two clippy fixes dp_mst - locking fix atomic: - fix redundant DPMS calls i915: - Do cdclk post plane programming later - Bump MMAP_GTT_VERSION: missing indication of partial mmaps support xe: - Release guc ids before cancelling work - Fix new warnings around userptr - Temporaritly disable D3Cold on BMG - Retry and wait longer for GuC PC to start - Remove redundant check in xe_vm_create_ioctl amdgpu: - GC 12.x DCC fix - DC DCE 6.x fix - Hibernation fix - HPD fix - Backlight fixes - Color depth fix - UAF fix in hdcp_work - VCE 2.x fix - GC 12.x PTE fix amdkfd: - Queue eviction fix gma500: - fix NULL pointer check" * tag 'drm-fixes-2025-03-14' of https://gitlab.freedesktop.org/drm/kernel: (23 commits) drm/amdgpu: NULL-check BO's backing store when determining GFX12 PTE flags drm/amd/amdkfd: Evict all queues even HWS remove queue failed drm/i915: Increase I915_PARAM_MMAP_GTT_VERSION version to indicate support for partial mmaps drm/dp_mst: Fix locking when skipping CSN before topology probing drm/amdgpu/vce2: fix ip block reference drm/amd/display: Fix slab-use-after-free on hdcp_work drm/amd/display: Assign normalized_pix_clk when color depth = 14 drm/amd/display: Restore correct backlight brightness after a GPU reset drm/amd/display: fix default brightness drm/amd/display: Disable unneeded hpd interrupts during dm_init drm/amd: Keep display off while going into S4 drm/amd/display: fix missing .is_two_pixels_per_container drm/amdgpu/display: Allow DCC for video formats on GFX12 drm/xe: remove redundant check in xe_vm_create_ioctl() drm/atomic: Filter out redundant DPMS calls drm/xe/guc_pc: Retry and wait longer for GuC PC start drm/xe/pm: Temporarily disable D3Cold on BMG drm/i915/cdclk: Do cdclk post plane programming later drm/xe/userptr: Fix an incorrect assert drm/xe: Release guc ids before cancelling work ...
2 parents e3a854b + d1d7732 commit 00ddc3f

22 files changed

+200
-79
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2555,7 +2555,6 @@ static int amdgpu_pmops_freeze(struct device *dev)
25552555
int r;
25562556

25572557
r = amdgpu_device_suspend(drm_dev, true);
2558-
adev->in_s4 = false;
25592558
if (r)
25602559
return r;
25612560

@@ -2567,8 +2566,13 @@ static int amdgpu_pmops_freeze(struct device *dev)
25672566
static int amdgpu_pmops_thaw(struct device *dev)
25682567
{
25692568
struct drm_device *drm_dev = dev_get_drvdata(dev);
2569+
struct amdgpu_device *adev = drm_to_adev(drm_dev);
2570+
int r;
25702571

2571-
return amdgpu_device_resume(drm_dev, true);
2572+
r = amdgpu_device_resume(drm_dev, true);
2573+
adev->in_s4 = false;
2574+
2575+
return r;
25722576
}
25732577

25742578
static int amdgpu_pmops_poweroff(struct device *dev)
@@ -2581,6 +2585,9 @@ static int amdgpu_pmops_poweroff(struct device *dev)
25812585
static int amdgpu_pmops_restore(struct device *dev)
25822586
{
25832587
struct drm_device *drm_dev = dev_get_drvdata(dev);
2588+
struct amdgpu_device *adev = drm_to_adev(drm_dev);
2589+
2590+
adev->in_s4 = false;
25842591

25852592
return amdgpu_device_resume(drm_dev, true);
25862593
}

drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,8 +528,9 @@ static void gmc_v12_0_get_vm_pte(struct amdgpu_device *adev,
528528

529529
bo_adev = amdgpu_ttm_adev(bo->tbo.bdev);
530530
coherent = bo->flags & AMDGPU_GEM_CREATE_COHERENT;
531-
is_system = (bo->tbo.resource->mem_type == TTM_PL_TT) ||
532-
(bo->tbo.resource->mem_type == AMDGPU_PL_PREEMPT);
531+
is_system = bo->tbo.resource &&
532+
(bo->tbo.resource->mem_type == TTM_PL_TT ||
533+
bo->tbo.resource->mem_type == AMDGPU_PL_PREEMPT);
533534

534535
if (bo && bo->flags & AMDGPU_GEM_CREATE_GFX12_DCC)
535536
*flags |= AMDGPU_PTE_DCC;

drivers/gpu/drm/amd/amdgpu/vce_v2_0.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ static int vce_v2_0_stop(struct amdgpu_device *adev)
284284
return 0;
285285
}
286286

287-
ip_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_VCN);
287+
ip_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_VCE);
288288
if (!ip_block)
289289
return -EINVAL;
290290

drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,11 +1230,13 @@ static int evict_process_queues_cpsch(struct device_queue_manager *dqm,
12301230
decrement_queue_count(dqm, qpd, q);
12311231

12321232
if (dqm->dev->kfd->shared_resources.enable_mes) {
1233-
retval = remove_queue_mes(dqm, q, qpd);
1234-
if (retval) {
1233+
int err;
1234+
1235+
err = remove_queue_mes(dqm, q, qpd);
1236+
if (err) {
12351237
dev_err(dev, "Failed to evict queue %d\n",
12361238
q->properties.queue_id);
1237-
goto out;
1239+
retval = err;
12381240
}
12391241
}
12401242
}

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,10 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
245245
static void handle_hpd_irq_helper(struct amdgpu_dm_connector *aconnector);
246246
static void handle_hpd_rx_irq(void *param);
247247

248+
static void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
249+
int bl_idx,
250+
u32 user_brightness);
251+
248252
static bool
249253
is_timing_unchanged_for_freesync(struct drm_crtc_state *old_crtc_state,
250254
struct drm_crtc_state *new_crtc_state);
@@ -3371,8 +3375,19 @@ static int dm_resume(struct amdgpu_ip_block *ip_block)
33713375

33723376
mutex_unlock(&dm->dc_lock);
33733377

3378+
/* set the backlight after a reset */
3379+
for (i = 0; i < dm->num_of_edps; i++) {
3380+
if (dm->backlight_dev[i])
3381+
amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
3382+
}
3383+
33743384
return 0;
33753385
}
3386+
3387+
/* leave display off for S4 sequence */
3388+
if (adev->in_s4)
3389+
return 0;
3390+
33763391
/* Recreate dc_state - DC invalidates it when setting power state to S3. */
33773392
dc_state_release(dm_state->context);
33783393
dm_state->context = dc_state_create(dm->dc, NULL);
@@ -4906,6 +4921,7 @@ amdgpu_dm_register_backlight_device(struct amdgpu_dm_connector *aconnector)
49064921
dm->backlight_dev[aconnector->bl_idx] =
49074922
backlight_device_register(bl_name, aconnector->base.kdev, dm,
49084923
&amdgpu_dm_backlight_ops, &props);
4924+
dm->brightness[aconnector->bl_idx] = props.brightness;
49094925

49104926
if (IS_ERR(dm->backlight_dev[aconnector->bl_idx])) {
49114927
DRM_ERROR("DM: Backlight registration failed!\n");
@@ -4973,7 +4989,6 @@ static void setup_backlight_device(struct amdgpu_display_manager *dm,
49734989
aconnector->bl_idx = bl_idx;
49744990

49754991
amdgpu_dm_update_backlight_caps(dm, bl_idx);
4976-
dm->brightness[bl_idx] = AMDGPU_MAX_BL_LEVEL;
49774992
dm->backlight_link[bl_idx] = link;
49784993
dm->num_of_edps++;
49794994

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,7 @@ void hdcp_destroy(struct kobject *kobj, struct hdcp_workqueue *hdcp_work)
455455
for (i = 0; i < hdcp_work->max_link; i++) {
456456
cancel_delayed_work_sync(&hdcp_work[i].callback_dwork);
457457
cancel_delayed_work_sync(&hdcp_work[i].watchdog_timer_dwork);
458+
cancel_delayed_work_sync(&hdcp_work[i].property_validate_dwork);
458459
}
459460

460461
sysfs_remove_bin_file(kobj, &hdcp_work[0].attr);

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

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -894,8 +894,16 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
894894
struct drm_device *dev = adev_to_drm(adev);
895895
struct drm_connector *connector;
896896
struct drm_connector_list_iter iter;
897+
int irq_type;
897898
int i;
898899

900+
/* First, clear all hpd and hpdrx interrupts */
901+
for (i = DC_IRQ_SOURCE_HPD1; i <= DC_IRQ_SOURCE_HPD6RX; i++) {
902+
if (!dc_interrupt_set(adev->dm.dc, i, false))
903+
drm_err(dev, "Failed to clear hpd(rx) source=%d on init\n",
904+
i);
905+
}
906+
899907
drm_connector_list_iter_begin(dev, &iter);
900908
drm_for_each_connector_iter(connector, &iter) {
901909
struct amdgpu_dm_connector *amdgpu_dm_connector;
@@ -908,10 +916,31 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
908916

909917
dc_link = amdgpu_dm_connector->dc_link;
910918

919+
/*
920+
* Get a base driver irq reference for hpd ints for the lifetime
921+
* of dm. Note that only hpd interrupt types are registered with
922+
* base driver; hpd_rx types aren't. IOW, amdgpu_irq_get/put on
923+
* hpd_rx isn't available. DM currently controls hpd_rx
924+
* explicitly with dc_interrupt_set()
925+
*/
911926
if (dc_link->irq_source_hpd != DC_IRQ_SOURCE_INVALID) {
912-
dc_interrupt_set(adev->dm.dc,
913-
dc_link->irq_source_hpd,
914-
true);
927+
irq_type = dc_link->irq_source_hpd - DC_IRQ_SOURCE_HPD1;
928+
/*
929+
* TODO: There's a mismatch between mode_info.num_hpd
930+
* and what bios reports as the # of connectors with hpd
931+
* sources. Since the # of hpd source types registered
932+
* with base driver == mode_info.num_hpd, we have to
933+
* fallback to dc_interrupt_set for the remaining types.
934+
*/
935+
if (irq_type < adev->mode_info.num_hpd) {
936+
if (amdgpu_irq_get(adev, &adev->hpd_irq, irq_type))
937+
drm_err(dev, "DM_IRQ: Failed get HPD for source=%d)!\n",
938+
dc_link->irq_source_hpd);
939+
} else {
940+
dc_interrupt_set(adev->dm.dc,
941+
dc_link->irq_source_hpd,
942+
true);
943+
}
915944
}
916945

917946
if (dc_link->irq_source_hpd_rx != DC_IRQ_SOURCE_INVALID) {
@@ -921,12 +950,6 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
921950
}
922951
}
923952
drm_connector_list_iter_end(&iter);
924-
925-
/* Update reference counts for HPDs */
926-
for (i = DC_IRQ_SOURCE_HPD1; i <= adev->mode_info.num_hpd; i++) {
927-
if (amdgpu_irq_get(adev, &adev->hpd_irq, i - DC_IRQ_SOURCE_HPD1))
928-
drm_err(dev, "DM_IRQ: Failed get HPD for source=%d)!\n", i);
929-
}
930953
}
931954

932955
/**
@@ -942,7 +965,7 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
942965
struct drm_device *dev = adev_to_drm(adev);
943966
struct drm_connector *connector;
944967
struct drm_connector_list_iter iter;
945-
int i;
968+
int irq_type;
946969

947970
drm_connector_list_iter_begin(dev, &iter);
948971
drm_for_each_connector_iter(connector, &iter) {
@@ -956,9 +979,18 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
956979
dc_link = amdgpu_dm_connector->dc_link;
957980

958981
if (dc_link->irq_source_hpd != DC_IRQ_SOURCE_INVALID) {
959-
dc_interrupt_set(adev->dm.dc,
960-
dc_link->irq_source_hpd,
961-
false);
982+
irq_type = dc_link->irq_source_hpd - DC_IRQ_SOURCE_HPD1;
983+
984+
/* TODO: See same TODO in amdgpu_dm_hpd_init() */
985+
if (irq_type < adev->mode_info.num_hpd) {
986+
if (amdgpu_irq_put(adev, &adev->hpd_irq, irq_type))
987+
drm_err(dev, "DM_IRQ: Failed put HPD for source=%d!\n",
988+
dc_link->irq_source_hpd);
989+
} else {
990+
dc_interrupt_set(adev->dm.dc,
991+
dc_link->irq_source_hpd,
992+
false);
993+
}
962994
}
963995

964996
if (dc_link->irq_source_hpd_rx != DC_IRQ_SOURCE_INVALID) {
@@ -968,10 +1000,4 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
9681000
}
9691001
}
9701002
drm_connector_list_iter_end(&iter);
971-
972-
/* Update reference counts for HPDs */
973-
for (i = DC_IRQ_SOURCE_HPD1; i <= adev->mode_info.num_hpd; i++) {
974-
if (amdgpu_irq_put(adev, &adev->hpd_irq, i - DC_IRQ_SOURCE_HPD1))
975-
drm_err(dev, "DM_IRQ: Failed put HPD for source=%d!\n", i);
976-
}
9771003
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,11 @@ static int amdgpu_dm_plane_validate_dcc(struct amdgpu_device *adev,
277277
if (!dcc->enable)
278278
return 0;
279279

280-
if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN ||
281-
!dc->cap_funcs.get_dcc_compression_cap)
280+
if (adev->family < AMDGPU_FAMILY_GC_12_0_0 &&
281+
format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
282+
return -EINVAL;
283+
284+
if (!dc->cap_funcs.get_dcc_compression_cap)
282285
return -EINVAL;
283286

284287
input.format = format;

drivers/gpu/drm/amd/display/dc/core/dc_resource.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3389,10 +3389,13 @@ static int get_norm_pix_clk(const struct dc_crtc_timing *timing)
33893389
break;
33903390
case COLOR_DEPTH_121212:
33913391
normalized_pix_clk = (pix_clk * 36) / 24;
3392-
break;
3392+
break;
3393+
case COLOR_DEPTH_141414:
3394+
normalized_pix_clk = (pix_clk * 42) / 24;
3395+
break;
33933396
case COLOR_DEPTH_161616:
33943397
normalized_pix_clk = (pix_clk * 48) / 24;
3395-
break;
3398+
break;
33963399
default:
33973400
ASSERT(0);
33983401
break;

drivers/gpu/drm/amd/display/dc/dce60/dce60_timing_generator.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ static const struct timing_generator_funcs dce60_tg_funcs = {
239239
dce60_timing_generator_enable_advanced_request,
240240
.configure_crc = dce60_configure_crc,
241241
.get_crc = dce110_get_crc,
242+
.is_two_pixels_per_container = dce110_is_two_pixels_per_container,
242243
};
243244

244245
void dce60_timing_generator_construct(

0 commit comments

Comments
 (0)