1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Copyright(C) 2020 Linaro Limited. All rights reserved. |
4 | * Author: Mike Leach <mike.leach@linaro.org> |
5 | */ |
6 | |
7 | #include "coresight-config.h" |
8 | |
9 | /* ETMv4 includes and features */ |
10 | #if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X) |
11 | #include "coresight-etm4x-cfg.h" |
12 | #include "coresight-cfg-preload.h" |
13 | |
14 | /* preload configurations and features */ |
15 | |
16 | /* preload in features for ETMv4 */ |
17 | |
18 | /* strobe feature */ |
19 | static struct cscfg_parameter_desc strobe_params[] = { |
20 | { |
21 | .name = "window" , |
22 | .value = 5000, |
23 | }, |
24 | { |
25 | .name = "period" , |
26 | .value = 10000, |
27 | }, |
28 | }; |
29 | |
30 | static struct cscfg_regval_desc strobe_regs[] = { |
31 | /* resource selectors */ |
32 | { |
33 | .type = CS_CFG_REG_TYPE_RESOURCE, |
34 | .offset = TRCRSCTLRn(2), |
35 | .hw_info = ETM4_CFG_RES_SEL, |
36 | .val32 = 0x20001, |
37 | }, |
38 | { |
39 | .type = CS_CFG_REG_TYPE_RESOURCE, |
40 | .offset = TRCRSCTLRn(3), |
41 | .hw_info = ETM4_CFG_RES_SEQ, |
42 | .val32 = 0x20002, |
43 | }, |
44 | /* strobe window counter 0 - reload from param 0 */ |
45 | { |
46 | .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_SAVE, |
47 | .offset = TRCCNTVRn(0), |
48 | .hw_info = ETM4_CFG_RES_CTR, |
49 | }, |
50 | { |
51 | .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_PARAM, |
52 | .offset = TRCCNTRLDVRn(0), |
53 | .hw_info = ETM4_CFG_RES_CTR, |
54 | .val32 = 0, |
55 | }, |
56 | { |
57 | .type = CS_CFG_REG_TYPE_RESOURCE, |
58 | .offset = TRCCNTCTLRn(0), |
59 | .hw_info = ETM4_CFG_RES_CTR, |
60 | .val32 = 0x10001, |
61 | }, |
62 | /* strobe period counter 1 - reload from param 1 */ |
63 | { |
64 | .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_SAVE, |
65 | .offset = TRCCNTVRn(1), |
66 | .hw_info = ETM4_CFG_RES_CTR, |
67 | }, |
68 | { |
69 | .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_PARAM, |
70 | .offset = TRCCNTRLDVRn(1), |
71 | .hw_info = ETM4_CFG_RES_CTR, |
72 | .val32 = 1, |
73 | }, |
74 | { |
75 | .type = CS_CFG_REG_TYPE_RESOURCE, |
76 | .offset = TRCCNTCTLRn(1), |
77 | .hw_info = ETM4_CFG_RES_CTR, |
78 | .val32 = 0x8102, |
79 | }, |
80 | /* sequencer */ |
81 | { |
82 | .type = CS_CFG_REG_TYPE_RESOURCE, |
83 | .offset = TRCSEQEVRn(0), |
84 | .hw_info = ETM4_CFG_RES_SEQ, |
85 | .val32 = 0x0081, |
86 | }, |
87 | { |
88 | .type = CS_CFG_REG_TYPE_RESOURCE, |
89 | .offset = TRCSEQEVRn(1), |
90 | .hw_info = ETM4_CFG_RES_SEQ, |
91 | .val32 = 0x0000, |
92 | }, |
93 | /* view-inst */ |
94 | { |
95 | .type = CS_CFG_REG_TYPE_STD | CS_CFG_REG_TYPE_VAL_MASK, |
96 | .offset = TRCVICTLR, |
97 | .val32 = 0x0003, |
98 | .mask32 = 0x0003, |
99 | }, |
100 | /* end of regs */ |
101 | }; |
102 | |
103 | struct cscfg_feature_desc strobe_etm4x = { |
104 | .name = "strobing" , |
105 | .description = "Generate periodic trace capture windows.\n" |
106 | "parameter \'window\': a number of CPU cycles (W)\n" |
107 | "parameter \'period\': trace enabled for W cycles every period x W cycles\n" , |
108 | .match_flags = CS_CFG_MATCH_CLASS_SRC_ETM4, |
109 | .nr_params = ARRAY_SIZE(strobe_params), |
110 | .params_desc = strobe_params, |
111 | .nr_regs = ARRAY_SIZE(strobe_regs), |
112 | .regs_desc = strobe_regs, |
113 | }; |
114 | |
115 | /* create an autofdo configuration */ |
116 | |
117 | /* we will provide 9 sets of preset parameter values */ |
118 | #define AFDO_NR_PRESETS 9 |
119 | /* the total number of parameters in used features */ |
120 | #define AFDO_NR_PARAMS ARRAY_SIZE(strobe_params) |
121 | |
122 | static const char *afdo_ref_names[] = { |
123 | "strobing" , |
124 | }; |
125 | |
126 | /* |
127 | * set of presets leaves strobing window constant while varying period to allow |
128 | * experimentation with mark / space ratios for various workloads |
129 | */ |
130 | static u64 afdo_presets[AFDO_NR_PRESETS][AFDO_NR_PARAMS] = { |
131 | { 5000, 2 }, |
132 | { 5000, 4 }, |
133 | { 5000, 8 }, |
134 | { 5000, 16 }, |
135 | { 5000, 64 }, |
136 | { 5000, 128 }, |
137 | { 5000, 512 }, |
138 | { 5000, 1024 }, |
139 | { 5000, 4096 }, |
140 | }; |
141 | |
142 | struct cscfg_config_desc afdo_etm4x = { |
143 | .name = "autofdo" , |
144 | .description = "Setup ETMs with strobing for autofdo\n" |
145 | "Supplied presets allow experimentation with mark-space ratio for various loads\n" , |
146 | .nr_feat_refs = ARRAY_SIZE(afdo_ref_names), |
147 | .feat_ref_names = afdo_ref_names, |
148 | .nr_presets = AFDO_NR_PRESETS, |
149 | .nr_total_params = AFDO_NR_PARAMS, |
150 | .presets = &afdo_presets[0][0], |
151 | }; |
152 | |
153 | /* end of ETM4x configurations */ |
154 | #endif /* IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X) */ |
155 | |