From: Ville Syrjälä <[email protected]>

Now that we have the mmio read/write vfuncs we can get rid of
any runtime overhead from the DMC wakelock checks for the
platforms that don't support wakelock (pre-LNL).

Signed-off-by: Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_de.c | 50 ++++++++++++++++++++++++-
 drivers/gpu/drm/i915/display/intel_de.h | 15 +-------
 2 files changed, 50 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_de.c 
b/drivers/gpu/drm/i915/display/intel_de.c
index cde2886fe2ca..66de0d6be569 100644
--- a/drivers/gpu/drm/i915/display/intel_de.c
+++ b/drivers/gpu/drm/i915/display/intel_de.c
@@ -163,14 +163,36 @@ u16 intel_de_read16(struct intel_display *display, 
intel_reg_t reg)
        return intel_uncore_read16(__to_uncore(display), reg);
 }
 
+#define __MMIO_WAKELOCK                BIT(0)
+
+static __always_inline void
+__mmio_wakelock_pre(struct intel_display *display, intel_reg_t reg,
+                   const unsigned int mmio_flags)
+{
+       if (mmio_flags & __MMIO_WAKELOCK)
+               intel_dmc_wl_get(display, reg);
+}
+
+static __always_inline void
+__mmio_wakelock_post(struct intel_display *display, intel_reg_t reg,
+                    const unsigned int mmio_flags)
+{
+       if (mmio_flags & __MMIO_WAKELOCK)
+               intel_dmc_wl_put(display, reg);
+}
+
 static __always_inline u32
 __intel_de_read(struct intel_display *display, intel_reg_t reg,
                const unsigned int mmio_flags)
 {
        u32 val;
 
+       __mmio_wakelock_pre(display, reg, mmio_flags);
+
        val = intel_uncore_read(__to_uncore(display), reg);
 
+       __mmio_wakelock_post(display, reg, mmio_flags);
+
        return val;
 }
 
@@ -178,7 +200,11 @@ static __always_inline void
 __intel_de_write(struct intel_display *display, intel_reg_t reg, u32 val,
                 const unsigned int mmio_flags)
 {
+       __mmio_wakelock_pre(display, reg, mmio_flags);
+
        intel_uncore_write(__to_uncore(display), reg, val);
+
+       __mmio_wakelock_post(display, reg, mmio_flags);
 }
 
 #define I9XX_MMIO_FLAGS 0
@@ -200,9 +226,31 @@ static const struct intel_mmio_funcs i9xx_mmio_funcs = {
        .write = i9xx_mmio_write,
 };
 
+#define LNL_MMIO_FLAGS __MMIO_WAKELOCK
+
+static u32 lnl_mmio_read(struct intel_display *display, intel_reg_t reg)
+{
+       return __intel_de_read(display, reg, LNL_MMIO_FLAGS);
+}
+
+static void lnl_mmio_write(struct intel_display *display, intel_reg_t reg, u32 
val)
+{
+       __intel_de_write(display, reg, val, LNL_MMIO_FLAGS);
+}
+
+#undef LNL_MMIO_FLAGS
+
+static const struct intel_mmio_funcs lnl_mmio_funcs = {
+       .read = lnl_mmio_read,
+       .write = lnl_mmio_write,
+};
+
 void intel_de_init(struct intel_display *display)
 {
        display->mmio.uncore = to_intel_uncore(display->drm);
 
-       display->mmio.funcs = &i9xx_mmio_funcs;
+       if (DISPLAY_VER(display) >= 20)
+               display->mmio.funcs = &lnl_mmio_funcs;
+       else
+               display->mmio.funcs = &i9xx_mmio_funcs;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_de.h 
b/drivers/gpu/drm/i915/display/intel_de.h
index 63aef17e6ed3..760b8bc31f9b 100644
--- a/drivers/gpu/drm/i915/display/intel_de.h
+++ b/drivers/gpu/drm/i915/display/intel_de.h
@@ -7,7 +7,6 @@
 #define __INTEL_DE_H__
 
 #include "intel_display_core.h"
-#include "intel_dmc_wl.h"
 #include "intel_dsb.h"
 #include "intel_uncore.h"
 #include "intel_uncore_trace.h"
@@ -31,15 +30,7 @@ u16 intel_de_read16(struct intel_display *display, 
intel_reg_t reg);
 static inline u32
 intel_de_read(struct intel_display *display, intel_reg_t reg)
 {
-       u32 val;
-
-       intel_dmc_wl_get(display, reg);
-
-       val = display->mmio.funcs->read(display, reg);
-
-       intel_dmc_wl_put(display, reg);
-
-       return val;
+       return display->mmio.funcs->read(display, reg);
 }
 
 static inline u64
@@ -63,11 +54,7 @@ intel_de_posting_read(struct intel_display *display, 
intel_reg_t reg)
 static inline void
 intel_de_write(struct intel_display *display, intel_reg_t reg, u32 val)
 {
-       intel_dmc_wl_get(display, reg);
-
        display->mmio.funcs->write(display, reg, val);
-
-       intel_dmc_wl_put(display, reg);
 }
 
 static inline u32
-- 
2.56.0

Reply via email to