Skip to content

Commit fe3b3ed

Browse files
lucacoelhojnikula
authored andcommitted
drm/i915/display: don't allow DMC wakelock on older hardware
Only allow running DMC wakelock code if the display version is 20 or greater. Also check if DMC is loaded before enabling. Reviewed-by: Uma Shankar <[email protected]> Signed-off-by: Luca Coelho <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Jani Nikula <[email protected]>
1 parent 765425f commit fe3b3ed

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

drivers/gpu/drm/i915/display/intel_display_driver.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ void intel_display_driver_early_probe(struct drm_i915_private *i915)
198198
intel_dpll_init_clock_hook(i915);
199199
intel_init_display_hooks(i915);
200200
intel_fdi_init_hook(i915);
201+
intel_dmc_wl_init(i915);
201202
}
202203

203204
/* part #1: call before irq install */

drivers/gpu/drm/i915/display/intel_dmc_wl.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <linux/kernel.h>
77

88
#include "intel_de.h"
9+
#include "intel_dmc.h"
910
#include "intel_dmc_regs.h"
1011
#include "intel_dmc_wl.h"
1112

@@ -105,10 +106,23 @@ static bool intel_dmc_wl_check_range(u32 address)
105106
return wl_needed;
106107
}
107108

109+
static bool __intel_dmc_wl_supported(struct drm_i915_private *i915)
110+
{
111+
if (DISPLAY_VER(i915) < 20 ||
112+
!intel_dmc_has_payload(i915))
113+
return false;
114+
115+
return true;
116+
}
117+
108118
void intel_dmc_wl_init(struct drm_i915_private *i915)
109119
{
110120
struct intel_dmc_wl *wl = &i915->display.wl;
111121

122+
/* don't call __intel_dmc_wl_supported(), DMC is not loaded yet */
123+
if (DISPLAY_VER(i915) < 20)
124+
return;
125+
112126
INIT_DELAYED_WORK(&wl->work, intel_dmc_wl_work);
113127
spin_lock_init(&wl->lock);
114128
refcount_set(&wl->refcount, 0);
@@ -119,6 +133,9 @@ void intel_dmc_wl_enable(struct drm_i915_private *i915)
119133
struct intel_dmc_wl *wl = &i915->display.wl;
120134
unsigned long flags;
121135

136+
if (!__intel_dmc_wl_supported(i915))
137+
return;
138+
122139
spin_lock_irqsave(&wl->lock, flags);
123140

124141
if (wl->enabled)
@@ -143,6 +160,9 @@ void intel_dmc_wl_disable(struct drm_i915_private *i915)
143160
struct intel_dmc_wl *wl = &i915->display.wl;
144161
unsigned long flags;
145162

163+
if (!__intel_dmc_wl_supported(i915))
164+
return;
165+
146166
flush_delayed_work(&wl->work);
147167

148168
spin_lock_irqsave(&wl->lock, flags);
@@ -166,6 +186,9 @@ void intel_dmc_wl_get(struct drm_i915_private *i915, i915_reg_t reg)
166186
struct intel_dmc_wl *wl = &i915->display.wl;
167187
unsigned long flags;
168188

189+
if (!__intel_dmc_wl_supported(i915))
190+
return;
191+
169192
if (!intel_dmc_wl_check_range(reg.reg))
170193
return;
171194

@@ -211,6 +234,9 @@ void intel_dmc_wl_put(struct drm_i915_private *i915, i915_reg_t reg)
211234
struct intel_dmc_wl *wl = &i915->display.wl;
212235
unsigned long flags;
213236

237+
if (!__intel_dmc_wl_supported(i915))
238+
return;
239+
214240
if (!intel_dmc_wl_check_range(reg.reg))
215241
return;
216242

0 commit comments

Comments
 (0)