Commit 735e7b30 authored by Suzuki K Poulose's avatar Suzuki K Poulose

coresight: etm4x: Do not access TRCIDR1 for identification

CoreSight ETM4x architecture clearly provides ways to identify a device
via registers in the "Management" class, TRCDEVARCH and TRCDEVTYPE. These
registers can be accessed without the Trace domain being powered on.
We additionally added TRCIDR1 as fallback in order to cover for any
ETMs that may not have implemented TRCDEVARCH. So far, nobody has
reported hitting a WARNING we placed to catch such systems.

Also, more importantly it is problematic to access TRCIDR1, which is a
"Trace" register via MMIO access, without clearing the OSLK. But we cannot
mess with the OSLK until we know for sure that this is an ETMv4 device.
Thus, this kind of creates a chicken and egg problem unnecessarily for
systems "which are compliant" to the ETMv4 architecture.

Let us remove the TRCIDR1 fall back check and rely only on TRCDEVARCH.

Fixes: 8b94db1e ("coresight: etm4x: Use TRCDEVARCH for component discovery")
Cc: stable@vger.kernel.org
Reported-by: default avatarSteve Clevenger <scclevenger@os.amperecomputing.com>
Link: https://lore.kernel.org/all/143540e5623d4c7393d24833f2b80600d8d745d2.1677881753.git.scclevenger@os.amperecomputing.com/
Cc: Mike Leach <mike.leach@linaro.org>
Cc: James Clark <james.clark@arm.com>
Reviewed-by: default avatarMike Leach <mike.leach@linaro.org>
Reviewed-by: default avatarAnshuman Khandual <anshuman.khandual@arm.com>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20230321104530.1547136-1-suzuki.poulose@arm.com
parent bf84937e
...@@ -1070,25 +1070,21 @@ static bool etm4_init_iomem_access(struct etmv4_drvdata *drvdata, ...@@ -1070,25 +1070,21 @@ static bool etm4_init_iomem_access(struct etmv4_drvdata *drvdata,
struct csdev_access *csa) struct csdev_access *csa)
{ {
u32 devarch = readl_relaxed(drvdata->base + TRCDEVARCH); u32 devarch = readl_relaxed(drvdata->base + TRCDEVARCH);
u32 idr1 = readl_relaxed(drvdata->base + TRCIDR1);
/* /*
* All ETMs must implement TRCDEVARCH to indicate that * All ETMs must implement TRCDEVARCH to indicate that
* the component is an ETMv4. To support any broken * the component is an ETMv4. Even though TRCIDR1 also
* implementations we fall back to TRCIDR1 check, which * contains the information, it is part of the "Trace"
* is not really reliable. * register and must be accessed with the OSLK cleared,
* with MMIO. But we cannot touch the OSLK until we are
* sure this is an ETM. So rely only on the TRCDEVARCH.
*/ */
if ((devarch & ETM_DEVARCH_ID_MASK) == ETM_DEVARCH_ETMv4x_ARCH) { if ((devarch & ETM_DEVARCH_ID_MASK) != ETM_DEVARCH_ETMv4x_ARCH) {
drvdata->arch = etm_devarch_to_arch(devarch); pr_warn_once("TRCDEVARCH doesn't match ETMv4 architecture\n");
} else { return false;
pr_warn("CPU%d: ETM4x incompatible TRCDEVARCH: %x, falling back to TRCIDR1\n",
smp_processor_id(), devarch);
if (ETM_TRCIDR1_ARCH_MAJOR(idr1) != ETM_TRCIDR1_ARCH_ETMv4)
return false;
drvdata->arch = etm_trcidr_to_arch(idr1);
} }
drvdata->arch = etm_devarch_to_arch(devarch);
*csa = CSDEV_ACCESS_IOMEM(drvdata->base); *csa = CSDEV_ACCESS_IOMEM(drvdata->base);
return true; return true;
} }
......
...@@ -753,14 +753,12 @@ ...@@ -753,14 +753,12 @@
* TRCDEVARCH - CoreSight architected register * TRCDEVARCH - CoreSight architected register
* - Bits[15:12] - Major version * - Bits[15:12] - Major version
* - Bits[19:16] - Minor version * - Bits[19:16] - Minor version
* TRCIDR1 - ETM architected register *
* - Bits[11:8] - Major version * We must rely only on TRCDEVARCH for the version information. Even though,
* - Bits[7:4] - Minor version * TRCIDR1 also provides the architecture version, it is a "Trace" register
* We must rely on TRCDEVARCH for the version information, * and as such must be accessed only with Trace power domain ON. This may
* however we don't want to break the support for potential * not be available at probe time.
* old implementations which might not implement it. Thus *
* we fall back to TRCIDR1 if TRCDEVARCH is not implemented
* for memory mapped components.
* Now to make certain decisions easier based on the version * Now to make certain decisions easier based on the version
* we use an internal representation of the version in the * we use an internal representation of the version in the
* driver, as follows : * driver, as follows :
...@@ -786,12 +784,6 @@ static inline u8 etm_devarch_to_arch(u32 devarch) ...@@ -786,12 +784,6 @@ static inline u8 etm_devarch_to_arch(u32 devarch)
ETM_DEVARCH_REVISION(devarch)); ETM_DEVARCH_REVISION(devarch));
} }
static inline u8 etm_trcidr_to_arch(u32 trcidr1)
{
return ETM_ARCH_VERSION(ETM_TRCIDR1_ARCH_MAJOR(trcidr1),
ETM_TRCIDR1_ARCH_MINOR(trcidr1));
}
enum etm_impdef_type { enum etm_impdef_type {
ETM4_IMPDEF_HISI_CORE_COMMIT, ETM4_IMPDEF_HISI_CORE_COMMIT,
ETM4_IMPDEF_FEATURE_MAX, ETM4_IMPDEF_FEATURE_MAX,
......
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