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