[PATCH 1/3] coresight etm4x: Early clear TRCOSLAR.OSLK prior to TRCIDR1 read
Mike Leach
mike.leach at linaro.org
Fri Jan 20 03:45:03 PST 2023
Hi Steve,
On Fri, 20 Jan 2023 at 00:52, Steve Clevenger
<scclevenger at os.amperecomputing.com> wrote:
>
> Add Ampere early clear of ETM TRCOSLAR.OSLK prior to TRCIDR1 access.
> Ampere Computing erratum AC03_DEBUG_06 describes an Ampere
> Computing design decision MMIO reads are considered the same as an
> external debug access. If TRCOSLAR.OSLK is set, the TRCIDR1 access
> results in a bus fault followed by a kernel panic. A TRCIDR1 read
> is valid regardless of TRCOSLAR.OSLK provided MMIO access
> (now deprecated) is supported.
> AC03_DEBUG_06 is described in the AmpereOne Developer Errata:
> https://solutions.amperecomputing.com/customer-connect/products/AmpereOne-device-documentation
>
> Add Ampere ETM PID required for Coresight ETM driver support.
>
> Signed-off-by: Steve Clevenger <scclevenger at os.amperecomputing.com>
> ---
> .../coresight/coresight-etm4x-core.c | 36 +++++++++++++++----
> drivers/hwtracing/coresight/coresight-etm4x.h | 2 ++
> 2 files changed, 32 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> index 1cc052979e01..533be1928a09 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
> +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> @@ -1091,19 +1091,34 @@ static void etm4_init_arch_data(void *info)
> drvdata = dev_get_drvdata(init_arg->dev);
> csa = init_arg->csa;
>
As far as I can tell there appears to be an initialisation issue here.
etm_probe()
...
struct csdev_access access = { 0 };
...
init_arg.csa = &access
::call=> etm4_init_arch_data(init_arg)
Thus csa is uninitialised?
> + /* Detect the support for OS Lock before we actually use it */
> + etm_detect_os_lock(drvdata, csa);
> +
> + /*
> + * For ETM implementations that consider MMIO an external access
> + * clear TRCOSLAR.OSLK early.
> + */
> + if (drvdata->mmio_external)
> + etm4_os_unlock_csa(drvdata, csa);
> +
> /*
> * If we are unable to detect the access mechanism,
> * or unable to detect the trace unit type, fail
> - * early.
> + * early. Reset TRCOSLAR.OSLK if cleared.
> */
> - if (!etm4_init_csdev_access(drvdata, csa))
> + if (!etm4_init_csdev_access(drvdata, csa)) {
This call initialises csa according to sysreg / iomem access requirements
> + if (drvdata->mmio_external)
> + etm4_os_lock(drvdata);
> return;
> + }
>
> - /* Detect the support for OS Lock before we actually use it */
> - etm_detect_os_lock(drvdata, csa);
> + /*
> + * Make sure all registers are accessible
> + * TRCOSLAR.OSLK may already be clear
> + */
> + if (!drvdata->mmio_external)
> + etm4_os_unlock_csa(drvdata, csa);
>
> - /* Make sure all registers are accessible */
> - etm4_os_unlock_csa(drvdata, csa);
> etm4_cs_unlock(drvdata, csa);
>
> etm4_check_arch_features(drvdata, init_arg->pid);
> @@ -2027,6 +2042,14 @@ static int etm4_probe(struct device *dev, void __iomem *base, u32 etm_pid)
> init_arg.csa = &access;
> init_arg.pid = etm_pid;
>
> + /*
> + * Ampere ETM v4.6 considers MMIO access as external. This mask
> + * isolates the manufacturer JEP106 ID in the PID.
> + * TRCPIDR2 (JEDC|DES_1) << 16 | TRCPIDR1 (DES_0) << 8)
> + */
> + if ((init_arg.pid & 0x000FF000) == 0x00096000)
> + drvdata->mmio_external = true;
> +
> /*
> * Serialize against CPUHP callbacks to avoid race condition
> * between the smp call and saving the delayed probe.
> @@ -2192,6 +2215,7 @@ static const struct amba_id etm4_ids[] = {
> CS_AMBA_ID(0x000bb95e), /* Cortex-A57 */
> CS_AMBA_ID(0x000bb95a), /* Cortex-A72 */
> CS_AMBA_ID(0x000bb959), /* Cortex-A73 */
> + CS_AMBA_UCI_ID(0x00096000, uci_id_etm4),/* Ampere ARMv8 */
> CS_AMBA_UCI_ID(0x000bb9da, uci_id_etm4),/* Cortex-A35 */
> CS_AMBA_UCI_ID(0x000bbd05, uci_id_etm4),/* Cortex-A55 */
> CS_AMBA_UCI_ID(0x000bbd0a, uci_id_etm4),/* Cortex-A75 */
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h
> index 4b21bb79f168..cf4f9f2e1807 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x.h
> +++ b/drivers/hwtracing/coresight/coresight-etm4x.h
> @@ -1015,6 +1015,7 @@ struct etmv4_save_state {
> * @skip_power_up: Indicates if an implementation can skip powering up
> * the trace unit.
> * @arch_features: Bitmap of arch features of etmv4 devices.
> + * @mmio_external: True if ETM considers MMIO an external access.
> */
> struct etmv4_drvdata {
> void __iomem *base;
> @@ -1067,6 +1068,7 @@ struct etmv4_drvdata {
> bool state_needs_restore;
> bool skip_power_up;
> DECLARE_BITMAP(arch_features, ETM4_IMPDEF_FEATURE_MAX);
Rather than continue to add bools - is it not worthwhile adding to the
bitmap above and extending the arch features API to allow a
"has_feature" call?
> + bool mmio_external;
> };
>
> /* Address comparator access types */
> --
> 2.25.1
>
Regards
Mike
--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK
More information about the linux-arm-kernel
mailing list