// 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) */