Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[linux-2.6-microblaze.git] / drivers / hwtracing / coresight / coresight-cfg-afdo.c
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) */