xref: /linux/drivers/hwtracing/coresight/coresight-cfg-afdo.c (revision 230a7a71f92212e723fa435d4ca5922de33ec88a)
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