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