drm/i915/guc/slpc: Enable ARAT timer interrupt

This interrupt is enabled during RPS initialization, and
now needs to be done by SLPC code. It allows ARAT timer
expiry interrupts to get forwarded to GuC.

v2: Fix comment (Matthew Brost)
v3: checkpatch()

Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210730202119.23810-11-vinay.belgaumkar@intel.com
This commit is contained in:
Vinay Belgaumkar 2021-07-30 13:21:15 -07:00 committed by John Harrison
parent f1928ac2a1
commit 899a0fd73a
3 changed files with 27 additions and 0 deletions

View File

@ -396,6 +396,21 @@ int intel_guc_slpc_get_min_freq(struct intel_guc_slpc *slpc, u32 *val)
return ret; return ret;
} }
void intel_guc_pm_intrmsk_enable(struct intel_gt *gt)
{
u32 pm_intrmsk_mbz = 0;
/*
* Allow GuC to receive ARAT timer expiry event.
* This interrupt register is setup by RPS code
* when host based Turbo is enabled.
*/
pm_intrmsk_mbz |= ARAT_EXPIRED_INTRMSK;
intel_uncore_rmw(gt->uncore,
GEN6_PMINTRMSK, pm_intrmsk_mbz, 0);
}
/* /*
* intel_guc_slpc_enable() - Start SLPC * intel_guc_slpc_enable() - Start SLPC
* @slpc: pointer to intel_guc_slpc. * @slpc: pointer to intel_guc_slpc.
@ -429,6 +444,8 @@ int intel_guc_slpc_enable(struct intel_guc_slpc *slpc)
if (unlikely(ret < 0)) if (unlikely(ret < 0))
return ret; return ret;
intel_guc_pm_intrmsk_enable(&i915->gt);
return 0; return 0;
} }

View File

@ -9,6 +9,7 @@
#include "intel_guc_submission.h" #include "intel_guc_submission.h"
#include "intel_guc_slpc_types.h" #include "intel_guc_slpc_types.h"
struct intel_gt;
struct drm_printer; struct drm_printer;
static inline bool intel_guc_slpc_is_supported(struct intel_guc *guc) static inline bool intel_guc_slpc_is_supported(struct intel_guc *guc)
@ -36,5 +37,6 @@ int intel_guc_slpc_set_min_freq(struct intel_guc_slpc *slpc, u32 val);
int intel_guc_slpc_get_max_freq(struct intel_guc_slpc *slpc, u32 *val); int intel_guc_slpc_get_max_freq(struct intel_guc_slpc *slpc, u32 *val);
int intel_guc_slpc_get_min_freq(struct intel_guc_slpc *slpc, u32 *val); int intel_guc_slpc_get_min_freq(struct intel_guc_slpc *slpc, u32 *val);
int intel_guc_slpc_print_info(struct intel_guc_slpc *slpc, struct drm_printer *p); int intel_guc_slpc_print_info(struct intel_guc_slpc *slpc, struct drm_printer *p);
void intel_guc_pm_intrmsk_enable(struct intel_gt *gt);
#endif #endif

View File

@ -655,6 +655,7 @@ void intel_uc_suspend(struct intel_uc *uc)
static int __uc_resume(struct intel_uc *uc, bool enable_communication) static int __uc_resume(struct intel_uc *uc, bool enable_communication)
{ {
struct intel_guc *guc = &uc->guc; struct intel_guc *guc = &uc->guc;
struct intel_gt *gt = guc_to_gt(guc);
int err; int err;
if (!intel_guc_is_fw_running(guc)) if (!intel_guc_is_fw_running(guc))
@ -666,6 +667,13 @@ static int __uc_resume(struct intel_uc *uc, bool enable_communication)
if (enable_communication) if (enable_communication)
guc_enable_communication(guc); guc_enable_communication(guc);
/* If we are only resuming GuC communication but not reloading
* GuC, we need to ensure the ARAT timer interrupt is enabled
* again. In case of GuC reload, it is enabled during SLPC enable.
*/
if (enable_communication && intel_uc_uses_guc_slpc(uc))
intel_guc_pm_intrmsk_enable(gt);
err = intel_guc_resume(guc); err = intel_guc_resume(guc);
if (err) { if (err) {
DRM_DEBUG_DRIVER("Failed to resume GuC, err=%d", err); DRM_DEBUG_DRIVER("Failed to resume GuC, err=%d", err);