linux/drivers/hwtracing/coresight/coresight-cfg-pstop.c
Linu Cherian 4b7e62627a coresight: config: Add preloaded configuration
Add a preloaded configuration for generating
external trigger on address match. This can be
used by CTI and ETR blocks to stop trace capture
on kernel panic.

Kernel address for "panic" function is used as the
default trigger address.

This new configuration is available as,
/sys/kernel/config/cs-syscfg/configurations/panicstop

Signed-off-by: Linu Cherian <lcherian@marvell.com>
Reviewed-by: James Clark <james.clark@arm.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250212114918.548431-8-lcherian@marvell.com
2025-02-21 16:17:36 +00:00

84 lines
2.0 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* Copyright(C) 2023 Marvell.
* Based on coresight-cfg-afdo.c
*/
#include "coresight-config.h"
/* ETMv4 includes and features */
#if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X)
#include "coresight-etm4x-cfg.h"
/* preload configurations and features */
/* preload in features for ETMv4 */
/* panic_stop feature */
static struct cscfg_parameter_desc gen_etrig_params[] = {
{
.name = "address",
.value = (u64)panic,
},
};
static struct cscfg_regval_desc gen_etrig_regs[] = {
/* resource selector */
{
.type = CS_CFG_REG_TYPE_RESOURCE,
.offset = TRCRSCTLRn(2),
.hw_info = ETM4_CFG_RES_SEL,
.val32 = 0x40001,
},
/* single address comparator */
{
.type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_64BIT |
CS_CFG_REG_TYPE_VAL_PARAM,
.offset = TRCACVRn(0),
.val32 = 0x0,
},
{
.type = CS_CFG_REG_TYPE_RESOURCE,
.offset = TRCACATRn(0),
.val64 = 0xf00,
},
/* Driver external output[0] with comparator out */
{
.type = CS_CFG_REG_TYPE_RESOURCE,
.offset = TRCEVENTCTL0R,
.val32 = 0x2,
},
/* end of regs */
};
struct cscfg_feature_desc gen_etrig_etm4x = {
.name = "gen_etrig",
.description = "Generate external trigger on address match\n"
"parameter \'address\': address of kernel address\n",
.match_flags = CS_CFG_MATCH_CLASS_SRC_ETM4,
.nr_params = ARRAY_SIZE(gen_etrig_params),
.params_desc = gen_etrig_params,
.nr_regs = ARRAY_SIZE(gen_etrig_regs),
.regs_desc = gen_etrig_regs,
};
/* create a panic stop configuration */
/* the total number of parameters in used features */
#define PSTOP_NR_PARAMS ARRAY_SIZE(gen_etrig_params)
static const char *pstop_ref_names[] = {
"gen_etrig",
};
struct cscfg_config_desc pstop_etm4x = {
.name = "panicstop",
.description = "Stop ETM on kernel panic\n",
.nr_feat_refs = ARRAY_SIZE(pstop_ref_names),
.feat_ref_names = pstop_ref_names,
.nr_total_params = PSTOP_NR_PARAMS,
};
/* end of ETM4x configurations */
#endif /* IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X) */