coresight: config: Add preloaded configurations
Preload set of configurations. This patch creates a small set of preloaded configurations and features that are available immediately after coresight has been initialised. The current set provides a strobing feature for ETMv4, that creates a periodic sampling of trace by switching trace generation on and off using counters in the ETM. A configuration called "autofdo" is also provided that uses the 'strobing' feature and provides a couple of preset values, selectable on the perf command line. Link: https://lore.kernel.org/r/20210723165444.1048-9-mike.leach@linaro.org Signed-off-by: Mike Leach <mike.leach@linaro.org> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Link: https://lore.kernel.org/r/20210818194022.379573-9-mathieu.poirier@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
810ac401db
Коммит
7fdc9bb2ce
|
@ -4,7 +4,8 @@
|
|||
#
|
||||
obj-$(CONFIG_CORESIGHT) += coresight.o
|
||||
coresight-y := coresight-core.o coresight-etm-perf.o coresight-platform.o \
|
||||
coresight-sysfs.o coresight-syscfg.o coresight-config.o
|
||||
coresight-sysfs.o coresight-syscfg.o coresight-config.o \
|
||||
coresight-cfg-preload.o coresight-cfg-afdo.o
|
||||
obj-$(CONFIG_CORESIGHT_LINK_AND_SINK_TMC) += coresight-tmc.o
|
||||
coresight-tmc-y := coresight-tmc-core.o coresight-tmc-etf.o \
|
||||
coresight-tmc-etr.o
|
||||
|
|
|
@ -0,0 +1,153 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright(C) 2020 Linaro Limited. All rights reserved.
|
||||
* Author: Mike Leach <mike.leach@linaro.org>
|
||||
*/
|
||||
|
||||
#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 */
|
||||
|
||||
/* strobe feature */
|
||||
static struct cscfg_parameter_desc strobe_params[] = {
|
||||
{
|
||||
.name = "window",
|
||||
.value = 5000,
|
||||
},
|
||||
{
|
||||
.name = "period",
|
||||
.value = 10000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct cscfg_regval_desc strobe_regs[] = {
|
||||
/* resource selectors */
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE,
|
||||
.offset = TRCRSCTLRn(2),
|
||||
.hw_info = ETM4_CFG_RES_SEL,
|
||||
.val32 = 0x20001,
|
||||
},
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE,
|
||||
.offset = TRCRSCTLRn(3),
|
||||
.hw_info = ETM4_CFG_RES_SEQ,
|
||||
.val32 = 0x20002,
|
||||
},
|
||||
/* strobe window counter 0 - reload from param 0 */
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_SAVE,
|
||||
.offset = TRCCNTVRn(0),
|
||||
.hw_info = ETM4_CFG_RES_CTR,
|
||||
},
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_PARAM,
|
||||
.offset = TRCCNTRLDVRn(0),
|
||||
.hw_info = ETM4_CFG_RES_CTR,
|
||||
.val32 = 0,
|
||||
},
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE,
|
||||
.offset = TRCCNTCTLRn(0),
|
||||
.hw_info = ETM4_CFG_RES_CTR,
|
||||
.val32 = 0x10001,
|
||||
},
|
||||
/* strobe period counter 1 - reload from param 1 */
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_SAVE,
|
||||
.offset = TRCCNTVRn(1),
|
||||
.hw_info = ETM4_CFG_RES_CTR,
|
||||
},
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_PARAM,
|
||||
.offset = TRCCNTRLDVRn(1),
|
||||
.hw_info = ETM4_CFG_RES_CTR,
|
||||
.val32 = 1,
|
||||
},
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE,
|
||||
.offset = TRCCNTCTLRn(1),
|
||||
.hw_info = ETM4_CFG_RES_CTR,
|
||||
.val32 = 0x8102,
|
||||
},
|
||||
/* sequencer */
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE,
|
||||
.offset = TRCSEQEVRn(0),
|
||||
.hw_info = ETM4_CFG_RES_SEQ,
|
||||
.val32 = 0x0081,
|
||||
},
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_RESOURCE,
|
||||
.offset = TRCSEQEVRn(1),
|
||||
.hw_info = ETM4_CFG_RES_SEQ,
|
||||
.val32 = 0x0000,
|
||||
},
|
||||
/* view-inst */
|
||||
{
|
||||
.type = CS_CFG_REG_TYPE_STD | CS_CFG_REG_TYPE_VAL_MASK,
|
||||
.offset = TRCVICTLR,
|
||||
.val32 = 0x0003,
|
||||
.mask32 = 0x0003,
|
||||
},
|
||||
/* end of regs */
|
||||
};
|
||||
|
||||
struct cscfg_feature_desc strobe_etm4x = {
|
||||
.name = "strobing",
|
||||
.description = "Generate periodic trace capture windows.\n"
|
||||
"parameter \'window\': a number of CPU cycles (W)\n"
|
||||
"parameter \'period\': trace enabled for W cycles every period x W cycles\n",
|
||||
.match_flags = CS_CFG_MATCH_CLASS_SRC_ETM4,
|
||||
.nr_params = ARRAY_SIZE(strobe_params),
|
||||
.params_desc = strobe_params,
|
||||
.nr_regs = ARRAY_SIZE(strobe_regs),
|
||||
.regs_desc = strobe_regs,
|
||||
};
|
||||
|
||||
/* create an autofdo configuration */
|
||||
|
||||
/* we will provide 9 sets of preset parameter values */
|
||||
#define AFDO_NR_PRESETS 9
|
||||
/* the total number of parameters in used features */
|
||||
#define AFDO_NR_PARAMS ARRAY_SIZE(strobe_params)
|
||||
|
||||
static const char *afdo_ref_names[] = {
|
||||
"strobing",
|
||||
};
|
||||
|
||||
/*
|
||||
* set of presets leaves strobing window constant while varying period to allow
|
||||
* experimentation with mark / space ratios for various workloads
|
||||
*/
|
||||
static u64 afdo_presets[AFDO_NR_PRESETS][AFDO_NR_PARAMS] = {
|
||||
{ 5000, 2 },
|
||||
{ 5000, 4 },
|
||||
{ 5000, 8 },
|
||||
{ 5000, 16 },
|
||||
{ 5000, 64 },
|
||||
{ 5000, 128 },
|
||||
{ 5000, 512 },
|
||||
{ 5000, 1024 },
|
||||
{ 5000, 4096 },
|
||||
};
|
||||
|
||||
struct cscfg_config_desc afdo_etm4x = {
|
||||
.name = "autofdo",
|
||||
.description = "Setup ETMs with strobing for autofdo\n"
|
||||
"Supplied presets allow experimentation with mark-space ratio for various loads\n",
|
||||
.nr_feat_refs = ARRAY_SIZE(afdo_ref_names),
|
||||
.feat_ref_names = afdo_ref_names,
|
||||
.nr_presets = AFDO_NR_PRESETS,
|
||||
.nr_total_params = AFDO_NR_PARAMS,
|
||||
.presets = &afdo_presets[0][0],
|
||||
};
|
||||
|
||||
/* end of ETM4x configurations */
|
||||
#endif /* IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X) */
|
|
@ -0,0 +1,31 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright(C) 2020 Linaro Limited. All rights reserved.
|
||||
* Author: Mike Leach <mike.leach@linaro.org>
|
||||
*/
|
||||
|
||||
#include "coresight-cfg-preload.h"
|
||||
#include "coresight-config.h"
|
||||
#include "coresight-syscfg.h"
|
||||
|
||||
/* Basic features and configurations pre-loaded on initialisation */
|
||||
|
||||
static struct cscfg_feature_desc *preload_feats[] = {
|
||||
#if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X)
|
||||
&strobe_etm4x,
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct cscfg_config_desc *preload_cfgs[] = {
|
||||
#if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X)
|
||||
&afdo_etm4x,
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
/* preload called on initialisation */
|
||||
int cscfg_preload(void)
|
||||
{
|
||||
return cscfg_load_config_sets(preload_cfgs, preload_feats);
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright(C) 2020 Linaro Limited. All rights reserved.
|
||||
* Author: Mike Leach <mike.leach@linaro.org>
|
||||
*/
|
||||
|
||||
/* declare preloaded configurations and features */
|
||||
|
||||
/* from coresight-cfg-afdo.c - etm 4x features */
|
||||
#if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X)
|
||||
extern struct cscfg_feature_desc strobe_etm4x;
|
||||
extern struct cscfg_config_desc afdo_etm4x;
|
||||
#endif
|
|
@ -9,6 +9,21 @@
|
|||
#include "coresight-config.h"
|
||||
#include "coresight-etm4x.h"
|
||||
|
||||
/* ETMv4 specific config defines */
|
||||
|
||||
/* resource IDs */
|
||||
|
||||
#define ETM4_CFG_RES_CTR 0x001
|
||||
#define ETM4_CFG_RES_CMP 0x002
|
||||
#define ETM4_CFG_RES_CMP_PAIR0 0x003
|
||||
#define ETM4_CFG_RES_CMP_PAIR1 0x004
|
||||
#define ETM4_CFG_RES_SEL 0x005
|
||||
#define ETM4_CFG_RES_SEL_PAIR0 0x006
|
||||
#define ETM4_CFG_RES_SEL_PAIR1 0x007
|
||||
#define ETM4_CFG_RES_SEQ 0x008
|
||||
#define ETM4_CFG_RES_TS 0x009
|
||||
#define ETM4_CFG_RES_MASK 0x00F
|
||||
|
||||
/* ETMv4 specific config functions */
|
||||
int etm4_cscfg_register(struct coresight_device *csdev);
|
||||
|
||||
|
|
|
@ -752,8 +752,17 @@ int __init cscfg_init(void)
|
|||
INIT_LIST_HEAD(&cscfg_mgr->config_desc_list);
|
||||
atomic_set(&cscfg_mgr->sys_active_cnt, 0);
|
||||
|
||||
/* preload built-in configurations */
|
||||
err = cscfg_preload();
|
||||
if (err)
|
||||
goto exit_err;
|
||||
|
||||
dev_info(cscfg_device(), "CoreSight Configuration manager initialised");
|
||||
return 0;
|
||||
|
||||
exit_err:
|
||||
cscfg_clear_device();
|
||||
return err;
|
||||
}
|
||||
|
||||
void cscfg_exit(void)
|
||||
|
|
|
@ -56,6 +56,7 @@ struct cscfg_registered_csdev {
|
|||
/* internal core operations for cscfg */
|
||||
int __init cscfg_init(void);
|
||||
void cscfg_exit(void);
|
||||
int cscfg_preload(void);
|
||||
|
||||
/* syscfg manager external API */
|
||||
int cscfg_load_config_sets(struct cscfg_config_desc **cfg_descs,
|
||||
|
|
Загрузка…
Ссылка в новой задаче