Commit 088a422c authored by Badal Nilawar's avatar Badal Nilawar Committed by Jani Nikula

drm/i915/mtl: Disable MC6 for MTL A step

The Wa_14017073508 require to send Media Busy/Idle mailbox while
accessing Media tile. As of now it is getting handled while __gt_unpark,
__gt_park. But there are various corner cases where forcewakes are taken
without __gt_unpark i.e. without sending Busy Mailbox especially during
register reads. Forcewakes are taken without busy mailbox leads to
GPU HANG. So bringing mailbox calls under forcewake calls are no feasible
option as forcewake calls are atomic and mailbox calls are blocking.
The issue already fixed in B step so disabling MC6 on A step and
reverting previous commit which handles Wa_14017073508

Fixes: 8f70f1ec ("drm/i915/mtl: Add Wa_14017073508 for SAMedia")
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: default avatarBadal Nilawar <badal.nilawar@intel.com>
Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: default avatarAnshuman Gupta <anshuman.gupta@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230310061339.2495416-2-badal.nilawar@intel.com
(cherry picked from commit 038a2483)
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 3a84f2c6
...@@ -21,31 +21,10 @@ ...@@ -21,31 +21,10 @@
#include "intel_rc6.h" #include "intel_rc6.h"
#include "intel_rps.h" #include "intel_rps.h"
#include "intel_wakeref.h" #include "intel_wakeref.h"
#include "intel_pcode.h"
#include "pxp/intel_pxp_pm.h" #include "pxp/intel_pxp_pm.h"
#define I915_GT_SUSPEND_IDLE_TIMEOUT (HZ / 2) #define I915_GT_SUSPEND_IDLE_TIMEOUT (HZ / 2)
static void mtl_media_busy(struct intel_gt *gt)
{
/* Wa_14017073508: mtl */
if (IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
gt->type == GT_MEDIA)
snb_pcode_write_p(gt->uncore, PCODE_MBOX_GT_STATE,
PCODE_MBOX_GT_STATE_MEDIA_BUSY,
PCODE_MBOX_GT_STATE_DOMAIN_MEDIA, 0);
}
static void mtl_media_idle(struct intel_gt *gt)
{
/* Wa_14017073508: mtl */
if (IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
gt->type == GT_MEDIA)
snb_pcode_write_p(gt->uncore, PCODE_MBOX_GT_STATE,
PCODE_MBOX_GT_STATE_MEDIA_NOT_BUSY,
PCODE_MBOX_GT_STATE_DOMAIN_MEDIA, 0);
}
static void user_forcewake(struct intel_gt *gt, bool suspend) static void user_forcewake(struct intel_gt *gt, bool suspend)
{ {
int count = atomic_read(&gt->user_wakeref); int count = atomic_read(&gt->user_wakeref);
...@@ -93,9 +72,6 @@ static int __gt_unpark(struct intel_wakeref *wf) ...@@ -93,9 +72,6 @@ static int __gt_unpark(struct intel_wakeref *wf)
GT_TRACE(gt, "\n"); GT_TRACE(gt, "\n");
/* Wa_14017073508: mtl */
mtl_media_busy(gt);
/* /*
* It seems that the DMC likes to transition between the DC states a lot * It seems that the DMC likes to transition between the DC states a lot
* when there are no connected displays (no active power domains) during * when there are no connected displays (no active power domains) during
...@@ -145,9 +121,6 @@ static int __gt_park(struct intel_wakeref *wf) ...@@ -145,9 +121,6 @@ static int __gt_park(struct intel_wakeref *wf)
GEM_BUG_ON(!wakeref); GEM_BUG_ON(!wakeref);
intel_display_power_put_async(i915, POWER_DOMAIN_GT_IRQ, wakeref); intel_display_power_put_async(i915, POWER_DOMAIN_GT_IRQ, wakeref);
/* Wa_14017073508: mtl */
mtl_media_idle(gt);
return 0; return 0;
} }
......
...@@ -486,6 +486,7 @@ static bool bxt_check_bios_rc6_setup(struct intel_rc6 *rc6) ...@@ -486,6 +486,7 @@ static bool bxt_check_bios_rc6_setup(struct intel_rc6 *rc6)
static bool rc6_supported(struct intel_rc6 *rc6) static bool rc6_supported(struct intel_rc6 *rc6)
{ {
struct drm_i915_private *i915 = rc6_to_i915(rc6); struct drm_i915_private *i915 = rc6_to_i915(rc6);
struct intel_gt *gt = rc6_to_gt(rc6);
if (!HAS_RC6(i915)) if (!HAS_RC6(i915))
return false; return false;
...@@ -502,6 +503,13 @@ static bool rc6_supported(struct intel_rc6 *rc6) ...@@ -502,6 +503,13 @@ static bool rc6_supported(struct intel_rc6 *rc6)
return false; return false;
} }
if (IS_MTL_MEDIA_STEP(gt->i915, STEP_A0, STEP_B0) &&
gt->type == GT_MEDIA) {
drm_notice(&i915->drm,
"Media RC6 disabled on A step\n");
return false;
}
return true; return true;
} }
......
...@@ -11,20 +11,9 @@ ...@@ -11,20 +11,9 @@
static bool __guc_rc_supported(struct intel_guc *guc) static bool __guc_rc_supported(struct intel_guc *guc)
{ {
struct intel_gt *gt = guc_to_gt(guc);
/*
* Wa_14017073508: mtl
* Do not enable gucrc to avoid additional interrupts which
* may disrupt pcode wa.
*/
if (IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
gt->type == GT_MEDIA)
return false;
/* GuC RC is unavailable for pre-Gen12 */ /* GuC RC is unavailable for pre-Gen12 */
return guc->submission_supported && return guc->submission_supported &&
GRAPHICS_VER(gt->i915) >= 12; GRAPHICS_VER(guc_to_gt(guc)->i915) >= 12;
} }
static bool __guc_rc_selected(struct intel_guc *guc) static bool __guc_rc_selected(struct intel_guc *guc)
......
...@@ -6598,15 +6598,6 @@ ...@@ -6598,15 +6598,6 @@
/* XEHP_PCODE_FREQUENCY_CONFIG param2 */ /* XEHP_PCODE_FREQUENCY_CONFIG param2 */
#define PCODE_MBOX_DOMAIN_NONE 0x0 #define PCODE_MBOX_DOMAIN_NONE 0x0
#define PCODE_MBOX_DOMAIN_MEDIAFF 0x3 #define PCODE_MBOX_DOMAIN_MEDIAFF 0x3
/* Wa_14017210380: mtl */
#define PCODE_MBOX_GT_STATE 0x50
/* sub-commands (param1) */
#define PCODE_MBOX_GT_STATE_MEDIA_BUSY 0x1
#define PCODE_MBOX_GT_STATE_MEDIA_NOT_BUSY 0x2
/* param2 */
#define PCODE_MBOX_GT_STATE_DOMAIN_MEDIA 0x1
#define GEN6_PCODE_DATA _MMIO(0x138128) #define GEN6_PCODE_DATA _MMIO(0x138128)
#define GEN6_PCODE_FREQ_IA_RATIO_SHIFT 8 #define GEN6_PCODE_FREQ_IA_RATIO_SHIFT 8
#define GEN6_PCODE_FREQ_RING_RATIO_SHIFT 16 #define GEN6_PCODE_FREQ_RING_RATIO_SHIFT 16
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment