drm/xe: enable idle msg and set hysteresis for GSCCS
authorDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Thu, 17 Aug 2023 22:17:07 +0000 (15:17 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:40:21 +0000 (11:40 -0500)
On MTL (and only on MTL) the GSCCS defaults with idle messaging
disabled. This means that, once awoken, the GSCCS will never signal its
idleness to the GT. To allow the GT to enter the proper low-power state,
we need therefore to turn idle messaging on. As part of this, we also
need to set a proper hysteresis value for the engine.

v2: use MEDIA_VERSION() and CLR() for the RTP rule and action, add reg
bit define in descending order (Matt)

Bspec: 71496
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://lore.kernel.org/r/20230817221707.1602873-1-daniele.ceraolospurio@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/regs/xe_engine_regs.h
drivers/gpu/drm/xe/xe_hw_engine.c

index 79873bf..d57fd85 100644 (file)
 #define RING_PSMI_CTL(base)                    XE_REG((base) + 0x50, XE_REG_OPTION_MASKED)
 #define   RC_SEMA_IDLE_MSG_DISABLE             REG_BIT(12)
 #define   WAIT_FOR_EVENT_POWER_DOWN_DISABLE    REG_BIT(7)
+#define   IDLE_MSG_DISABLE                     REG_BIT(0)
+
+#define RING_PWRCTX_MAXCNT(base)               XE_REG((base) + 0x54)
+#define   IDLE_WAIT_TIME                       REG_GENMASK(19, 0)
 
 #define RING_ACTHD_UDW(base)                   XE_REG((base) + 0x5c)
 #define RING_DMA_FADD_UDW(base)                        XE_REG((base) + 0x60)
index 81281e9..24b5226 100644 (file)
@@ -339,6 +339,22 @@ hw_engine_setup_default_state(struct xe_hw_engine *hwe)
                                           ring_cmd_cctl_val,
                                           XE_RTP_ACTION_FLAG(ENGINE_BASE)))
                },
+               /*
+                * To allow the GSC engine to go idle on MTL we need to enable
+                * idle messaging and set the hysteresis value (we use 0xA=5us
+                * as recommended in spec). On platforms after MTL this is
+                * enabled by default.
+                */
+               { XE_RTP_NAME("MTL GSCCS IDLE MSG enable"),
+                 XE_RTP_RULES(MEDIA_VERSION(1300), ENGINE_CLASS(OTHER)),
+                 XE_RTP_ACTIONS(CLR(RING_PSMI_CTL(0),
+                                    IDLE_MSG_DISABLE,
+                                    XE_RTP_ACTION_FLAG(ENGINE_BASE)),
+                                FIELD_SET(RING_PWRCTX_MAXCNT(0),
+                                          IDLE_WAIT_TIME,
+                                          0xA,
+                                          XE_RTP_ACTION_FLAG(ENGINE_BASE)))
+               },
                {}
        };