mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
perf/arm-cmn: Add workarounds for CMN-S3 on Graviton5
Graviton5 uses a customised CMN-S3 implementation where certain discovery registers report zeroed fields. Add the following workarounds: - Introduce a dedicated ACPI HID to identify the Graviton5 CMN variant. - Derive the DTC domain from the XP node ID, since the unit info register reports it as zero. - Set the DTC logical ID from the XP's logical ID, since the node info register's logical ID field is also zeroed. Signed-off-by: Aviv Bakal <avivb@amazon.com> Reviewed-by: Robin Murphy <robin.murphy@arm.com> Reviewed-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
56603c28d9
commit
9d0b1714e1
|
|
@ -31,7 +31,8 @@
|
|||
#define CMN_CHILD_NODE_ADDR GENMASK(29, 0)
|
||||
#define CMN_CHILD_NODE_EXTERNAL BIT(31)
|
||||
|
||||
#define CMN_MAX_DIMENSION 12
|
||||
/* Some implementations use a mesh larger than the architectural max of 12 */
|
||||
#define CMN_MAX_DIMENSION 14
|
||||
#define CMN_MAX_XPS (CMN_MAX_DIMENSION * CMN_MAX_DIMENSION)
|
||||
#define CMN_MAX_DTMS (CMN_MAX_XPS + (CMN_MAX_DIMENSION - 1) * 4)
|
||||
|
||||
|
|
@ -215,6 +216,8 @@ enum cmn_part {
|
|||
PART_CMN700 = 0x43c,
|
||||
PART_CI700 = 0x43a,
|
||||
PART_CMN_S3 = 0x43e,
|
||||
/* Synthetic part number, overridden to PART_CMN_S3 during discovery */
|
||||
PART_GRAVITON5 = 0xa5,
|
||||
};
|
||||
|
||||
/* CMN-600 r0px shouldn't exist in silicon, thankfully */
|
||||
|
|
@ -2253,6 +2256,18 @@ static unsigned int arm_cmn_dtc_domain(struct arm_cmn *cmn, void __iomem *xp_reg
|
|||
return FIELD_GET(CMN_DTM_UNIT_INFO_DTC_DOMAIN, readl_relaxed(xp_region + offset));
|
||||
}
|
||||
|
||||
static unsigned int arm_cmn_graviton5_dtc_domain(u16 xp_id)
|
||||
{
|
||||
unsigned int x = (xp_id >> 7) & 0xf;
|
||||
unsigned int y = (xp_id >> 3) & 0xf;
|
||||
|
||||
/*
|
||||
* The unit info register reads as zero; derive the DTC domain from
|
||||
* the XP's mesh coordinates over the 10x14 mesh.
|
||||
*/
|
||||
return (x / 5) + (y / 7) * 2;
|
||||
}
|
||||
|
||||
static void arm_cmn_init_node_info(struct arm_cmn *cmn, u32 offset, struct arm_cmn_node *node)
|
||||
{
|
||||
int level;
|
||||
|
|
@ -2298,6 +2313,7 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
|
|||
u64 reg;
|
||||
int i, j;
|
||||
size_t sz;
|
||||
bool graviton5_workaround = false;
|
||||
|
||||
arm_cmn_init_node_info(cmn, rgn_offset, &cfg);
|
||||
if (cfg.type != CMN_TYPE_CFG)
|
||||
|
|
@ -2308,6 +2324,13 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
|
|||
reg = readq_relaxed(cfg_region + CMN_CFGM_PERIPH_ID_01);
|
||||
part = FIELD_GET(CMN_CFGM_PID0_PART_0, reg);
|
||||
part |= FIELD_GET(CMN_CFGM_PID1_PART_1, reg) << 8;
|
||||
|
||||
/* Graviton5 has a customised CMN-S3 which needs some fixups */
|
||||
if (cmn->part == PART_GRAVITON5) {
|
||||
cmn->part = PART_CMN_S3;
|
||||
graviton5_workaround = true;
|
||||
}
|
||||
|
||||
/* 600AE is close enough that it's not really worth more complexity */
|
||||
if (part == PART_CMN600AE)
|
||||
part = PART_CMN600;
|
||||
|
|
@ -2397,6 +2420,8 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
|
|||
|
||||
if (cmn->part == PART_CMN600)
|
||||
xp->dtc = -1;
|
||||
else if (graviton5_workaround)
|
||||
xp->dtc = arm_cmn_graviton5_dtc_domain(xp->id);
|
||||
else
|
||||
xp->dtc = arm_cmn_dtc_domain(cmn, xp_region);
|
||||
|
||||
|
|
@ -2475,6 +2500,10 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
|
|||
|
||||
switch (dn->type) {
|
||||
case CMN_TYPE_DTC:
|
||||
if (graviton5_workaround) {
|
||||
/* Node info logical ID is zeroed; use the XP's */
|
||||
dn->logid = xp->logid;
|
||||
}
|
||||
cmn->num_dtcs++;
|
||||
dn++;
|
||||
break;
|
||||
|
|
@ -2690,6 +2719,7 @@ static const struct acpi_device_id arm_cmn_acpi_match[] = {
|
|||
{ "ARMHC650" },
|
||||
{ "ARMHC700" },
|
||||
{ "ARMHC003" },
|
||||
{ "AMZN0070", PART_GRAVITON5 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, arm_cmn_acpi_match);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user