drm/xe/xe3p_lpm: Add special check in Media GT for Main GAMCTRL

For Xe3p arch some subunits of an IP may be different. The GMD_ID
register returns the Xe3p arch and dedicates the reserved field to mark
possible subunit differences. Generally this is an under-the-hood
implementation detail that drivers don't need to worry about, but the
new Main_GAMCTRL may be enabled or not depending on those.

Those reserved bits are described for Xe3p as: "If Zero, No special case
to be handled. If Non-Zero, special case to be handled by Software
agent.". That special case is defined per Arch. So if media version is
35, also check the additional reserved bits. To avoid confusion with the
usual meaning of "reserved", define them as GMD_ID_SUBIP_FLAG_MASK.

Bspec: 74201
Signed-off-by: Balasubramani Vivekanandan <balasubramani.vivekanandan@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://lore.kernel.org/r/20251019-xe3p-gamctrl-v1-2-ad66d3c1908f@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
This commit is contained in:
Balasubramani Vivekanandan
2025-10-19 19:05:47 -07:00
committed by Lucas De Marchi
parent 94edd65186
commit e681ddca30
2 changed files with 25 additions and 0 deletions

View File

@@ -37,6 +37,12 @@
#define GMD_ID XE_REG(0xd8c)
#define GMD_ID_ARCH_MASK REG_GENMASK(31, 22)
#define GMD_ID_RELEASE_MASK REG_GENMASK(21, 14)
/*
* Spec defines these bits as "Reserved", but then make them assume some
* meaning that depends on the ARCH. To avoid any confusion, call them
* SUBIP_FLAG_MASK.
*/
#define GMD_ID_SUBIP_FLAG_MASK REG_GENMASK(13, 6)
#define GMD_ID_REVID REG_GENMASK(5, 0)
#define FORCEWAKE_ACK_GSC XE_REG(0xdf8)

View File

@@ -1681,6 +1681,25 @@ bool xe_guc_using_main_gamctrl_queues(struct xe_guc *guc)
{
struct xe_gt *gt = guc_to_gt(guc);
/*
* For Xe3p media gt (35), the GuC and the CS subunits may be still Xe3
* that lacks the Main GAMCTRL support. Reserved bits from the GMD_ID
* inform the IP version of the subunits.
*/
if (xe_gt_is_media_type(gt) && MEDIA_VER(gt_to_xe(gt)) == 35) {
u32 val = xe_mmio_read32(&gt->mmio, GMD_ID);
u32 subip = REG_FIELD_GET(GMD_ID_SUBIP_FLAG_MASK, val);
if (!subip)
return true;
xe_gt_WARN(gt, subip != 1,
"GMD_ID has unknown value in the SUBIP_FLAG field - 0x%x\n",
subip);
return false;
}
return GT_VER(gt) >= 35;
}