Skip to content

Commit 8185461

Browse files
committed
Merge tag 'drm-fixes-2026-02-06' of https://gitlab.freedesktop.org/drm/kernel
Pull drm fixes from Dave Airlie: "The usual xe/amdgpu selection, and a couple of misc changes for gma500, mgag200 and bridge. There is a nouveau revert, and also a set of changes that fix a regression since we moved to 570 firmware. Suspend/resume was broken on a bunch of GPUs. The fix looks big, but it's mostly just refactoring to pass an extra bit down the nouveau abstractions to the firmware command. amdgpu: - MES 11 old firmware compatibility fix - ASPM fix - DC LUT fixes amdkfd: - Fix possible double deletion of validate list xe: - Fix topology query pointer advance - A couple of kerneldoc fixes - Disable D3Cold for BMG only on specific platforms - Fix CFI violation in debugfs access nouveau: - Revert adding atomic commit functions as it regresses pre-nv50 - Fix suspend/resume bugs exposed by enabling 570 firmware gma500: - Revert a regression caused by vblank changes mgag200: - Replace a busy loop with a polling loop to fix that blocking 1 cpu for 300 ms roughly every 20 minutes bridge: - imx8mp-hdmi-pa: Use runtime pm to fix a bug in channel ordering" * tag 'drm-fixes-2026-02-06' of https://gitlab.freedesktop.org/drm/kernel: drm/xe/guc: Fix CFI violation in debugfs access. drm/bridge: imx8mp-hdmi-pai: enable PM runtime drm/xe/pm: Disable D3Cold for BMG only on specific platforms drm/xe: Fix kerneldoc for xe_tlb_inval_job_alloc_dep drm/xe: Fix kerneldoc for xe_gt_tlb_inval_init_early drm/xe: Fix kerneldoc for xe_migrate_exec_queue drm/xe/query: Fix topology query pointer advance drm/mgag200: fix mgag200_bmc_stop_scanout() nouveau/gsp: fix suspend/resume regression on r570 firmware nouveau: add a third state to the fini handler. nouveau/gsp: use rpc sequence numbers properly. drm/amdgpu: Fix double deletion of validate_list drm/amd/display: remove assert around dpp_base replacement drm/amd/display: extend delta clamping logic to CM3 LUT helper drm/amd/display: fix wrong color value mapping on MCM shaper LUT Revert "drm/amd: Check if ASPM is enabled from PCIe subsystem" drm/amd: Set minimum version for set_hw_resource_1 on gfx11 to 0x52 Revert "drm/gma500: use drm_crtc_vblank_crtc()" Revert "drm/nouveau/disp: Set drm_mode_config_funcs.atomic_(check|commit)"
2 parents 06bc4e2 + 7ef92d2 commit 8185461

82 files changed

Lines changed: 288 additions & 187 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1920,21 +1920,21 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
19201920

19211921
/* Make sure restore workers don't access the BO any more */
19221922
mutex_lock(&process_info->lock);
1923-
list_del(&mem->validate_list);
1923+
if (!list_empty(&mem->validate_list))
1924+
list_del_init(&mem->validate_list);
19241925
mutex_unlock(&process_info->lock);
19251926

1927+
ret = reserve_bo_and_cond_vms(mem, NULL, BO_VM_ALL, &ctx);
1928+
if (unlikely(ret))
1929+
return ret;
1930+
19261931
/* Cleanup user pages and MMU notifiers */
19271932
if (amdgpu_ttm_tt_get_usermm(mem->bo->tbo.ttm)) {
19281933
amdgpu_hmm_unregister(mem->bo);
1929-
mutex_lock(&process_info->notifier_lock);
19301934
amdgpu_hmm_range_free(mem->range);
1931-
mutex_unlock(&process_info->notifier_lock);
1935+
mem->range = NULL;
19321936
}
19331937

1934-
ret = reserve_bo_and_cond_vms(mem, NULL, BO_VM_ALL, &ctx);
1935-
if (unlikely(ret))
1936-
return ret;
1937-
19381938
amdgpu_amdkfd_remove_eviction_fence(mem->bo,
19391939
process_info->eviction_fence);
19401940
pr_debug("Release VA 0x%llx - 0x%llx\n", mem->va,

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2405,9 +2405,6 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
24052405
return -ENODEV;
24062406
}
24072407

2408-
if (amdgpu_aspm == -1 && !pcie_aspm_enabled(pdev))
2409-
amdgpu_aspm = 0;
2410-
24112408
if (amdgpu_virtual_display ||
24122409
amdgpu_device_asic_has_dc_support(pdev, flags & AMD_ASIC_MASK))
24132410
supports_atomic = true;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1671,7 +1671,7 @@ static int mes_v11_0_hw_init(struct amdgpu_ip_block *ip_block)
16711671
if (r)
16721672
goto failure;
16731673

1674-
if ((adev->mes.sched_version & AMDGPU_MES_VERSION_MASK) >= 0x50) {
1674+
if ((adev->mes.sched_version & AMDGPU_MES_VERSION_MASK) >= 0x52) {
16751675
r = mes_v11_0_set_hw_resources_1(&adev->mes);
16761676
if (r) {
16771677
DRM_ERROR("failed mes_v11_0_set_hw_resources_1, r=%d\n", r);

drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,12 @@ void cm_helper_program_gamcor_xfer_func(
105105
#define NUMBER_REGIONS 32
106106
#define NUMBER_SW_SEGMENTS 16
107107

108-
bool cm3_helper_translate_curve_to_hw_format(
109-
const struct dc_transfer_func *output_tf,
110-
struct pwl_params *lut_params, bool fixpoint)
108+
#define DC_LOGGER \
109+
ctx->logger
110+
111+
bool cm3_helper_translate_curve_to_hw_format(struct dc_context *ctx,
112+
const struct dc_transfer_func *output_tf,
113+
struct pwl_params *lut_params, bool fixpoint)
111114
{
112115
struct curve_points3 *corner_points;
113116
struct pwl_result_data *rgb_resulted;
@@ -163,6 +166,11 @@ bool cm3_helper_translate_curve_to_hw_format(
163166
hw_points += (1 << seg_distr[k]);
164167
}
165168

169+
// DCN3+ have 257 pts in lieu of no separate slope registers
170+
// Prior HW had 256 base+slope pairs
171+
// Shaper LUT (i.e. fixpoint == true) is still 256 bases and 256 deltas
172+
hw_points = fixpoint ? (hw_points - 1) : hw_points;
173+
166174
j = 0;
167175
for (k = 0; k < (region_end - region_start); k++) {
168176
increment = NUMBER_SW_SEGMENTS / (1 << seg_distr[k]);
@@ -223,8 +231,6 @@ bool cm3_helper_translate_curve_to_hw_format(
223231
corner_points[1].green.slope = dc_fixpt_zero;
224232
corner_points[1].blue.slope = dc_fixpt_zero;
225233

226-
// DCN3+ have 257 pts in lieu of no separate slope registers
227-
// Prior HW had 256 base+slope pairs
228234
lut_params->hw_points_num = hw_points + 1;
229235

230236
k = 0;
@@ -248,6 +254,10 @@ bool cm3_helper_translate_curve_to_hw_format(
248254
if (fixpoint == true) {
249255
i = 1;
250256
while (i != hw_points + 2) {
257+
uint32_t red_clamp;
258+
uint32_t green_clamp;
259+
uint32_t blue_clamp;
260+
251261
if (i >= hw_points) {
252262
if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
253263
rgb_plus_1->red = dc_fixpt_add(rgb->red,
@@ -260,9 +270,20 @@ bool cm3_helper_translate_curve_to_hw_format(
260270
rgb_minus_1->delta_blue);
261271
}
262272

263-
rgb->delta_red_reg = dc_fixpt_clamp_u0d10(rgb->delta_red);
264-
rgb->delta_green_reg = dc_fixpt_clamp_u0d10(rgb->delta_green);
265-
rgb->delta_blue_reg = dc_fixpt_clamp_u0d10(rgb->delta_blue);
273+
rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
274+
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
275+
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
276+
277+
red_clamp = dc_fixpt_clamp_u0d14(rgb->delta_red);
278+
green_clamp = dc_fixpt_clamp_u0d14(rgb->delta_green);
279+
blue_clamp = dc_fixpt_clamp_u0d14(rgb->delta_blue);
280+
281+
if (red_clamp >> 10 || green_clamp >> 10 || blue_clamp >> 10)
282+
DC_LOG_ERROR("Losing delta precision while programming shaper LUT.");
283+
284+
rgb->delta_red_reg = red_clamp & 0x3ff;
285+
rgb->delta_green_reg = green_clamp & 0x3ff;
286+
rgb->delta_blue_reg = blue_clamp & 0x3ff;
266287
rgb->red_reg = dc_fixpt_clamp_u0d14(rgb->red);
267288
rgb->green_reg = dc_fixpt_clamp_u0d14(rgb->green);
268289
rgb->blue_reg = dc_fixpt_clamp_u0d14(rgb->blue);

drivers/gpu/drm/amd/display/dc/dwb/dcn30/dcn30_cm_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void cm_helper_program_gamcor_xfer_func(
5959
const struct pwl_params *params,
6060
const struct dcn3_xfer_func_reg *reg);
6161

62-
bool cm3_helper_translate_curve_to_hw_format(
62+
bool cm3_helper_translate_curve_to_hw_format(struct dc_context *ctx,
6363
const struct dc_transfer_func *output_tf,
6464
struct pwl_params *lut_params, bool fixpoint);
6565

drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ bool dcn30_set_blend_lut(
239239
if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
240240
blend_lut = &plane_state->blend_tf.pwl;
241241
else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
242-
result = cm3_helper_translate_curve_to_hw_format(
242+
result = cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
243243
&plane_state->blend_tf, &dpp_base->regamma_params, false);
244244
if (!result)
245245
return result;
@@ -334,8 +334,9 @@ bool dcn30_set_input_transfer_func(struct dc *dc,
334334
if (plane_state->in_transfer_func.type == TF_TYPE_HWPWL)
335335
params = &plane_state->in_transfer_func.pwl;
336336
else if (plane_state->in_transfer_func.type == TF_TYPE_DISTRIBUTED_POINTS &&
337-
cm3_helper_translate_curve_to_hw_format(&plane_state->in_transfer_func,
338-
&dpp_base->degamma_params, false))
337+
cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
338+
&plane_state->in_transfer_func,
339+
&dpp_base->degamma_params, false))
339340
params = &dpp_base->degamma_params;
340341

341342
result = dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params);
@@ -406,7 +407,7 @@ bool dcn30_set_output_transfer_func(struct dc *dc,
406407
params = &stream->out_transfer_func.pwl;
407408
else if (pipe_ctx->stream->out_transfer_func.type ==
408409
TF_TYPE_DISTRIBUTED_POINTS &&
409-
cm3_helper_translate_curve_to_hw_format(
410+
cm3_helper_translate_curve_to_hw_format(stream->ctx,
410411
&stream->out_transfer_func,
411412
&mpc->blender_params, false))
412413
params = &mpc->blender_params;

drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -486,8 +486,9 @@ bool dcn32_set_mcm_luts(
486486
if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
487487
lut_params = &plane_state->blend_tf.pwl;
488488
else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
489-
result = cm3_helper_translate_curve_to_hw_format(&plane_state->blend_tf,
490-
&dpp_base->regamma_params, false);
489+
result = cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
490+
&plane_state->blend_tf,
491+
&dpp_base->regamma_params, false);
491492
if (!result)
492493
return result;
493494

@@ -501,9 +502,9 @@ bool dcn32_set_mcm_luts(
501502
lut_params = &plane_state->in_shaper_func.pwl;
502503
else if (plane_state->in_shaper_func.type == TF_TYPE_DISTRIBUTED_POINTS) {
503504
// TODO: dpp_base replace
504-
ASSERT(false);
505-
cm3_helper_translate_curve_to_hw_format(&plane_state->in_shaper_func,
506-
&dpp_base->shaper_params, true);
505+
cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
506+
&plane_state->in_shaper_func,
507+
&dpp_base->shaper_params, true);
507508
lut_params = &dpp_base->shaper_params;
508509
}
509510

@@ -543,8 +544,9 @@ bool dcn32_set_input_transfer_func(struct dc *dc,
543544
if (plane_state->in_transfer_func.type == TF_TYPE_HWPWL)
544545
params = &plane_state->in_transfer_func.pwl;
545546
else if (plane_state->in_transfer_func.type == TF_TYPE_DISTRIBUTED_POINTS &&
546-
cm3_helper_translate_curve_to_hw_format(&plane_state->in_transfer_func,
547-
&dpp_base->degamma_params, false))
547+
cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
548+
&plane_state->in_transfer_func,
549+
&dpp_base->degamma_params, false))
548550
params = &dpp_base->degamma_params;
549551

550552
dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params);
@@ -575,7 +577,7 @@ bool dcn32_set_output_transfer_func(struct dc *dc,
575577
params = &stream->out_transfer_func.pwl;
576578
else if (pipe_ctx->stream->out_transfer_func.type ==
577579
TF_TYPE_DISTRIBUTED_POINTS &&
578-
cm3_helper_translate_curve_to_hw_format(
580+
cm3_helper_translate_curve_to_hw_format(stream->ctx,
579581
&stream->out_transfer_func,
580582
&mpc->blender_params, false))
581583
params = &mpc->blender_params;

drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ void dcn401_populate_mcm_luts(struct dc *dc,
430430
if (mcm_luts.lut1d_func->type == TF_TYPE_HWPWL)
431431
m_lut_params.pwl = &mcm_luts.lut1d_func->pwl;
432432
else if (mcm_luts.lut1d_func->type == TF_TYPE_DISTRIBUTED_POINTS) {
433-
rval = cm3_helper_translate_curve_to_hw_format(
433+
rval = cm3_helper_translate_curve_to_hw_format(mpc->ctx,
434434
mcm_luts.lut1d_func,
435435
&dpp_base->regamma_params, false);
436436
m_lut_params.pwl = rval ? &dpp_base->regamma_params : NULL;
@@ -450,7 +450,7 @@ void dcn401_populate_mcm_luts(struct dc *dc,
450450
m_lut_params.pwl = &mcm_luts.shaper->pwl;
451451
else if (mcm_luts.shaper->type == TF_TYPE_DISTRIBUTED_POINTS) {
452452
ASSERT(false);
453-
rval = cm3_helper_translate_curve_to_hw_format(
453+
rval = cm3_helper_translate_curve_to_hw_format(mpc->ctx,
454454
mcm_luts.shaper,
455455
&dpp_base->regamma_params, true);
456456
m_lut_params.pwl = rval ? &dpp_base->regamma_params : NULL;
@@ -627,8 +627,9 @@ bool dcn401_set_mcm_luts(struct pipe_ctx *pipe_ctx,
627627
if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
628628
lut_params = &plane_state->blend_tf.pwl;
629629
else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
630-
rval = cm3_helper_translate_curve_to_hw_format(&plane_state->blend_tf,
631-
&dpp_base->regamma_params, false);
630+
rval = cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
631+
&plane_state->blend_tf,
632+
&dpp_base->regamma_params, false);
632633
lut_params = rval ? &dpp_base->regamma_params : NULL;
633634
}
634635
result = mpc->funcs->program_1dlut(mpc, lut_params, mpcc_id);
@@ -639,8 +640,9 @@ bool dcn401_set_mcm_luts(struct pipe_ctx *pipe_ctx,
639640
lut_params = &plane_state->in_shaper_func.pwl;
640641
else if (plane_state->in_shaper_func.type == TF_TYPE_DISTRIBUTED_POINTS) {
641642
// TODO: dpp_base replace
642-
rval = cm3_helper_translate_curve_to_hw_format(&plane_state->in_shaper_func,
643-
&dpp_base->shaper_params, true);
643+
rval = cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
644+
&plane_state->in_shaper_func,
645+
&dpp_base->shaper_params, true);
644646
lut_params = rval ? &dpp_base->shaper_params : NULL;
645647
}
646648
result &= mpc->funcs->program_shaper(mpc, lut_params, mpcc_id);
@@ -674,7 +676,7 @@ bool dcn401_set_output_transfer_func(struct dc *dc,
674676
params = &stream->out_transfer_func.pwl;
675677
else if (pipe_ctx->stream->out_transfer_func.type ==
676678
TF_TYPE_DISTRIBUTED_POINTS &&
677-
cm3_helper_translate_curve_to_hw_format(
679+
cm3_helper_translate_curve_to_hw_format(stream->ctx,
678680
&stream->out_transfer_func,
679681
&mpc->blender_params, false))
680682
params = &mpc->blender_params;

drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pai.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <linux/module.h>
99
#include <linux/of_platform.h>
1010
#include <linux/platform_device.h>
11+
#include <linux/pm_runtime.h>
1112
#include <linux/regmap.h>
1213
#include <drm/bridge/dw_hdmi.h>
1314
#include <sound/asoundef.h>
@@ -33,6 +34,7 @@
3334

3435
struct imx8mp_hdmi_pai {
3536
struct regmap *regmap;
37+
struct device *dev;
3638
};
3739

3840
static void imx8mp_hdmi_pai_enable(struct dw_hdmi *dw_hdmi, int channel,
@@ -43,6 +45,9 @@ static void imx8mp_hdmi_pai_enable(struct dw_hdmi *dw_hdmi, int channel,
4345
struct imx8mp_hdmi_pai *hdmi_pai = pdata->priv_audio;
4446
int val;
4547

48+
if (pm_runtime_resume_and_get(hdmi_pai->dev) < 0)
49+
return;
50+
4651
/* PAI set control extended */
4752
val = WTMK_HIGH(3) | WTMK_LOW(3);
4853
val |= NUM_CH(channel);
@@ -85,6 +90,8 @@ static void imx8mp_hdmi_pai_disable(struct dw_hdmi *dw_hdmi)
8590

8691
/* Stop PAI */
8792
regmap_write(hdmi_pai->regmap, HTX_PAI_CTRL, 0);
93+
94+
pm_runtime_put_sync(hdmi_pai->dev);
8895
}
8996

9097
static const struct regmap_config imx8mp_hdmi_pai_regmap_config = {
@@ -101,6 +108,7 @@ static int imx8mp_hdmi_pai_bind(struct device *dev, struct device *master, void
101108
struct imx8mp_hdmi_pai *hdmi_pai;
102109
struct resource *res;
103110
void __iomem *base;
111+
int ret;
104112

105113
hdmi_pai = devm_kzalloc(dev, sizeof(*hdmi_pai), GFP_KERNEL);
106114
if (!hdmi_pai)
@@ -121,6 +129,13 @@ static int imx8mp_hdmi_pai_bind(struct device *dev, struct device *master, void
121129
plat_data->disable_audio = imx8mp_hdmi_pai_disable;
122130
plat_data->priv_audio = hdmi_pai;
123131

132+
hdmi_pai->dev = dev;
133+
ret = devm_pm_runtime_enable(dev);
134+
if (ret < 0) {
135+
dev_err(dev, "failed to enable PM runtime: %d\n", ret);
136+
return ret;
137+
}
138+
124139
return 0;
125140
}
126141

drivers/gpu/drm/gma500/psb_irq.c

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,6 @@ static irqreturn_t gma_irq_handler(int irq, void *arg)
250250
void gma_irq_preinstall(struct drm_device *dev)
251251
{
252252
struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
253-
struct drm_crtc *crtc;
254253
unsigned long irqflags;
255254

256255
spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
@@ -261,15 +260,10 @@ void gma_irq_preinstall(struct drm_device *dev)
261260
PSB_WSGX32(0x00000000, PSB_CR_EVENT_HOST_ENABLE);
262261
PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE);
263262

264-
drm_for_each_crtc(crtc, dev) {
265-
struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
266-
267-
if (vblank->enabled) {
268-
u32 mask = drm_crtc_index(crtc) ? _PSB_VSYNC_PIPEB_FLAG :
269-
_PSB_VSYNC_PIPEA_FLAG;
270-
dev_priv->vdc_irq_mask |= mask;
271-
}
272-
}
263+
if (dev->vblank[0].enabled)
264+
dev_priv->vdc_irq_mask |= _PSB_VSYNC_PIPEA_FLAG;
265+
if (dev->vblank[1].enabled)
266+
dev_priv->vdc_irq_mask |= _PSB_VSYNC_PIPEB_FLAG;
273267

274268
/* Revisit this area - want per device masks ? */
275269
if (dev_priv->ops->hotplug)
@@ -284,8 +278,8 @@ void gma_irq_preinstall(struct drm_device *dev)
284278
void gma_irq_postinstall(struct drm_device *dev)
285279
{
286280
struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
287-
struct drm_crtc *crtc;
288281
unsigned long irqflags;
282+
unsigned int i;
289283

290284
spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
291285

@@ -298,13 +292,11 @@ void gma_irq_postinstall(struct drm_device *dev)
298292
PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
299293
PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
300294

301-
drm_for_each_crtc(crtc, dev) {
302-
struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
303-
304-
if (vblank->enabled)
305-
gma_enable_pipestat(dev_priv, drm_crtc_index(crtc), PIPE_VBLANK_INTERRUPT_ENABLE);
295+
for (i = 0; i < dev->num_crtcs; ++i) {
296+
if (dev->vblank[i].enabled)
297+
gma_enable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
306298
else
307-
gma_disable_pipestat(dev_priv, drm_crtc_index(crtc), PIPE_VBLANK_INTERRUPT_ENABLE);
299+
gma_disable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
308300
}
309301

310302
if (dev_priv->ops->hotplug_enable)
@@ -345,8 +337,8 @@ void gma_irq_uninstall(struct drm_device *dev)
345337
{
346338
struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
347339
struct pci_dev *pdev = to_pci_dev(dev->dev);
348-
struct drm_crtc *crtc;
349340
unsigned long irqflags;
341+
unsigned int i;
350342

351343
if (!dev_priv->irq_enabled)
352344
return;
@@ -358,11 +350,9 @@ void gma_irq_uninstall(struct drm_device *dev)
358350

359351
PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
360352

361-
drm_for_each_crtc(crtc, dev) {
362-
struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
363-
364-
if (vblank->enabled)
365-
gma_disable_pipestat(dev_priv, drm_crtc_index(crtc), PIPE_VBLANK_INTERRUPT_ENABLE);
353+
for (i = 0; i < dev->num_crtcs; ++i) {
354+
if (dev->vblank[i].enabled)
355+
gma_disable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
366356
}
367357

368358
dev_priv->vdc_irq_mask &= _PSB_IRQ_SGX_FLAG |

0 commit comments

Comments
 (0)