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:
parent
f1928ac2a1
commit
899a0fd73a
|
@ -396,6 +396,21 @@ int intel_guc_slpc_get_min_freq(struct intel_guc_slpc *slpc, u32 *val)
|
|||
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
|
||||
* @slpc: pointer to intel_guc_slpc.
|
||||
|
@ -429,6 +444,8 @@ int intel_guc_slpc_enable(struct intel_guc_slpc *slpc)
|
|||
if (unlikely(ret < 0))
|
||||
return ret;
|
||||
|
||||
intel_guc_pm_intrmsk_enable(&i915->gt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "intel_guc_submission.h"
|
||||
#include "intel_guc_slpc_types.h"
|
||||
|
||||
struct intel_gt;
|
||||
struct drm_printer;
|
||||
|
||||
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_min_freq(struct intel_guc_slpc *slpc, u32 *val);
|
||||
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
|
||||
|
|
|
@ -655,6 +655,7 @@ void intel_uc_suspend(struct intel_uc *uc)
|
|||
static int __uc_resume(struct intel_uc *uc, bool enable_communication)
|
||||
{
|
||||
struct intel_guc *guc = &uc->guc;
|
||||
struct intel_gt *gt = guc_to_gt(guc);
|
||||
int err;
|
||||
|
||||
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)
|
||||
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);
|
||||
if (err) {
|
||||
DRM_DEBUG_DRIVER("Failed to resume GuC, err=%d", err);
|
||||
|
|
Loading…
Reference in New Issue