0001
0002
0003
0004
0005
0006
0007 #include "coresight-config.h"
0008
0009
0010 #if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X)
0011 #include "coresight-etm4x-cfg.h"
0012
0013
0014
0015
0016
0017
0018 static struct cscfg_parameter_desc strobe_params[] = {
0019 {
0020 .name = "window",
0021 .value = 5000,
0022 },
0023 {
0024 .name = "period",
0025 .value = 10000,
0026 },
0027 };
0028
0029 static struct cscfg_regval_desc strobe_regs[] = {
0030
0031 {
0032 .type = CS_CFG_REG_TYPE_RESOURCE,
0033 .offset = TRCRSCTLRn(2),
0034 .hw_info = ETM4_CFG_RES_SEL,
0035 .val32 = 0x20001,
0036 },
0037 {
0038 .type = CS_CFG_REG_TYPE_RESOURCE,
0039 .offset = TRCRSCTLRn(3),
0040 .hw_info = ETM4_CFG_RES_SEQ,
0041 .val32 = 0x20002,
0042 },
0043
0044 {
0045 .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_SAVE,
0046 .offset = TRCCNTVRn(0),
0047 .hw_info = ETM4_CFG_RES_CTR,
0048 },
0049 {
0050 .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_PARAM,
0051 .offset = TRCCNTRLDVRn(0),
0052 .hw_info = ETM4_CFG_RES_CTR,
0053 .val32 = 0,
0054 },
0055 {
0056 .type = CS_CFG_REG_TYPE_RESOURCE,
0057 .offset = TRCCNTCTLRn(0),
0058 .hw_info = ETM4_CFG_RES_CTR,
0059 .val32 = 0x10001,
0060 },
0061
0062 {
0063 .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_SAVE,
0064 .offset = TRCCNTVRn(1),
0065 .hw_info = ETM4_CFG_RES_CTR,
0066 },
0067 {
0068 .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_PARAM,
0069 .offset = TRCCNTRLDVRn(1),
0070 .hw_info = ETM4_CFG_RES_CTR,
0071 .val32 = 1,
0072 },
0073 {
0074 .type = CS_CFG_REG_TYPE_RESOURCE,
0075 .offset = TRCCNTCTLRn(1),
0076 .hw_info = ETM4_CFG_RES_CTR,
0077 .val32 = 0x8102,
0078 },
0079
0080 {
0081 .type = CS_CFG_REG_TYPE_RESOURCE,
0082 .offset = TRCSEQEVRn(0),
0083 .hw_info = ETM4_CFG_RES_SEQ,
0084 .val32 = 0x0081,
0085 },
0086 {
0087 .type = CS_CFG_REG_TYPE_RESOURCE,
0088 .offset = TRCSEQEVRn(1),
0089 .hw_info = ETM4_CFG_RES_SEQ,
0090 .val32 = 0x0000,
0091 },
0092
0093 {
0094 .type = CS_CFG_REG_TYPE_STD | CS_CFG_REG_TYPE_VAL_MASK,
0095 .offset = TRCVICTLR,
0096 .val32 = 0x0003,
0097 .mask32 = 0x0003,
0098 },
0099
0100 };
0101
0102 struct cscfg_feature_desc strobe_etm4x = {
0103 .name = "strobing",
0104 .description = "Generate periodic trace capture windows.\n"
0105 "parameter \'window\': a number of CPU cycles (W)\n"
0106 "parameter \'period\': trace enabled for W cycles every period x W cycles\n",
0107 .match_flags = CS_CFG_MATCH_CLASS_SRC_ETM4,
0108 .nr_params = ARRAY_SIZE(strobe_params),
0109 .params_desc = strobe_params,
0110 .nr_regs = ARRAY_SIZE(strobe_regs),
0111 .regs_desc = strobe_regs,
0112 };
0113
0114
0115
0116
0117 #define AFDO_NR_PRESETS 9
0118
0119 #define AFDO_NR_PARAMS ARRAY_SIZE(strobe_params)
0120
0121 static const char *afdo_ref_names[] = {
0122 "strobing",
0123 };
0124
0125
0126
0127
0128
0129 static u64 afdo_presets[AFDO_NR_PRESETS][AFDO_NR_PARAMS] = {
0130 { 5000, 2 },
0131 { 5000, 4 },
0132 { 5000, 8 },
0133 { 5000, 16 },
0134 { 5000, 64 },
0135 { 5000, 128 },
0136 { 5000, 512 },
0137 { 5000, 1024 },
0138 { 5000, 4096 },
0139 };
0140
0141 struct cscfg_config_desc afdo_etm4x = {
0142 .name = "autofdo",
0143 .description = "Setup ETMs with strobing for autofdo\n"
0144 "Supplied presets allow experimentation with mark-space ratio for various loads\n",
0145 .nr_feat_refs = ARRAY_SIZE(afdo_ref_names),
0146 .feat_ref_names = afdo_ref_names,
0147 .nr_presets = AFDO_NR_PRESETS,
0148 .nr_total_params = AFDO_NR_PARAMS,
0149 .presets = &afdo_presets[0][0],
0150 };
0151
0152
0153 #endif