1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (c) 2020 Linaro Limited, All rights reserved.
4 * Author: Mike Leach <mike.leach@linaro.org>
7 #ifndef _CORESIGHT_CORESIGHT_CONFIG_H
8 #define _CORESIGHT_CORESIGHT_CONFIG_H
10 #include <linux/coresight.h>
11 #include <linux/types.h>
13 /* CoreSight Configuration Management - component and system wide configuration */
16 * Register type flags for register value descriptor:
17 * describe how the value is interpreted, and handled.
19 #define CS_CFG_REG_TYPE_STD 0x80 /* reg is standard reg */
20 #define CS_CFG_REG_TYPE_RESOURCE 0x40 /* reg is a resource */
21 #define CS_CFG_REG_TYPE_VAL_PARAM 0x08 /* reg value uses param */
22 #define CS_CFG_REG_TYPE_VAL_MASK 0x04 /* reg value bit masked */
23 #define CS_CFG_REG_TYPE_VAL_64BIT 0x02 /* reg value 64 bit */
24 #define CS_CFG_REG_TYPE_VAL_SAVE 0x01 /* reg value save on disable */
27 * flags defining what device class a feature will match to when processing a
28 * system configuration - used by config data and devices.
30 #define CS_CFG_MATCH_CLASS_SRC_ALL 0x0001 /* match any source */
31 #define CS_CFG_MATCH_CLASS_SRC_ETM4 0x0002 /* match any ETMv4 device */
33 /* flags defining device instance matching - used in config match desc data. */
34 #define CS_CFG_MATCH_INST_ANY 0x80000000 /* any instance of a class */
37 * Limit number of presets in a configuration
38 * This is related to the number of bits (4) we use to select the preset on
39 * the perf command line. Preset 0 is always none selected.
40 * See PMU_FORMAT_ATTR(preset, "config:0-3") in coresight-etm-perf.c
42 #define CS_CFG_CONFIG_PRESET_MAX 15
45 * Parameter descriptor for a device feature.
47 * @name: Name of parameter.
48 * @value: Initial or default value.
50 struct cscfg_parameter_desc
{
56 * Representation of register value and a descriptor of register usage.
58 * Used as a descriptor in the feature descriptors.
59 * Used as a value in when in a feature loading into a csdev.
61 * Supports full 64 bit register value, or 32 bit value with optional mask
64 * @type: define register usage and interpretation.
65 * @offset: the address offset for register in the hardware device (per device specification).
66 * @hw_info: optional hardware device type specific information. (ETM / CTI specific etc)
67 * @val64: 64 bit value.
68 * @val32: 32 bit value.
69 * @mask32: 32 bit mask when using 32 bit value to access device register - if mask type.
70 * @param_idx: parameter index value into parameter array if param type.
72 struct cscfg_regval_desc
{
89 * Device feature descriptor - combination of registers and parameters to
90 * program a device to implement a specific complex function.
92 * @name: feature name.
93 * @description: brief description of the feature.
95 * @match_flags: matching information if loading into a device
96 * @nr_params: number of parameters used.
97 * @params_desc: array of parameters used.
98 * @nr_regs: number of registers used.
99 * @regs_desc: array of registers used.
100 * @load_owner: handle to load owner for dynamic load and unload of features.
101 * @fs_group: reference to configfs group for dynamic unload.
103 struct cscfg_feature_desc
{
105 const char *description
;
106 struct list_head item
;
109 struct cscfg_parameter_desc
*params_desc
;
111 struct cscfg_regval_desc
*regs_desc
;
113 struct config_group
*fs_group
;
117 * Configuration descriptor - describes selectable system configuration.
119 * A configuration describes device features in use, and may provide preset
120 * values for the parameters in those features.
122 * A single set of presets is the sum of the parameters declared by
123 * all the features in use - this value is @nr_total_params.
125 * @name: name of the configuration - used for selection.
126 * @description: description of the purpose of the configuration.
128 * @nr_feat_refs: Number of features used in this configuration.
129 * @feat_ref_names: references to features used in this configuration.
130 * @nr_presets: Number of sets of presets supplied by this configuration.
131 * @nr_total_params: Sum of all parameters declared by used features
132 * @presets: Array of preset values.
133 * @event_ea: Extended attribute for perf event value
134 * @active_cnt: ref count for activate on this configuration.
135 * @load_owner: handle to load owner for dynamic load and unload of configs.
136 * @fs_group: reference to configfs group for dynamic unload.
137 * @available: config can be activated - multi-stage load sets true on completion.
139 struct cscfg_config_desc
{
141 const char *description
;
142 struct list_head item
;
144 const char **feat_ref_names
;
147 const u64
*presets
; /* nr_presets * nr_total_params */
148 struct dev_ext_attribute
*event_ea
;
151 struct config_group
*fs_group
;
156 * config register instance - part of a loaded feature.
157 * maps register values to csdev driver structures
159 * @reg_desc: value to use when setting feature on device / store for
160 * readback of volatile values.
161 * @driver_regval: pointer to internal driver element used to set the value
164 struct cscfg_regval_csdev
{
165 struct cscfg_regval_desc reg_desc
;
170 * config parameter instance - part of a loaded feature.
172 * @feat_csdev: parent feature
173 * @reg_csdev: register value updated by this parameter.
174 * @current_value: current value of parameter - may be set by user via
175 * sysfs, or modified during device operation.
176 * @val64: true if 64 bit value
178 struct cscfg_parameter_csdev
{
179 struct cscfg_feature_csdev
*feat_csdev
;
180 struct cscfg_regval_csdev
*reg_csdev
;
186 * Feature instance loaded into a CoreSight device.
188 * When a feature is loaded into a specific device, then this structure holds
189 * the connections between the register / parameter values used and the
190 * internal data structures that are written when the feature is enabled.
192 * Since applying a feature modifies internal data structures in the device,
193 * then we have a reference to the device spinlock to protect access to these
194 * structures (@drv_spinlock).
196 * @feat_desc: pointer to the static descriptor for this feature.
197 * @csdev: parent CoreSight device instance.
198 * @node: list entry into feature list for this device.
199 * @drv_spinlock: device spinlock for access to driver register data.
200 * @nr_params: number of parameters.
201 * @params_csdev: current parameter values on this device
202 * @nr_regs: number of registers to be programmed.
203 * @regs_csdev: Programming details for the registers
205 struct cscfg_feature_csdev
{
206 const struct cscfg_feature_desc
*feat_desc
;
207 struct coresight_device
*csdev
;
208 struct list_head node
;
209 spinlock_t
*drv_spinlock
;
211 struct cscfg_parameter_csdev
*params_csdev
;
213 struct cscfg_regval_csdev
*regs_csdev
;
217 * Configuration instance when loaded into a CoreSight device.
219 * The instance contains references to loaded features on this device that are
220 * used by the configuration.
222 * @config_desc:reference to the descriptor for this configuration
223 * @csdev: parent coresight device for this configuration instance.
224 * @enabled: true if configuration is enabled on this device.
225 * @node: list entry within the coresight device
226 * @nr_feat: Number of features on this device that are used in the
228 * @feats_csdev:references to the device features to enable.
230 struct cscfg_config_csdev
{
231 const struct cscfg_config_desc
*config_desc
;
232 struct coresight_device
*csdev
;
234 struct list_head node
;
236 struct cscfg_feature_csdev
*feats_csdev
[];
240 * Coresight device operations.
242 * Registered coresight devices provide these operations to manage feature
243 * instances compatible with the device hardware and drivers
245 * @load_feat: Pass a feature descriptor into the device and create the
246 * loaded feature instance (struct cscfg_feature_csdev).
248 struct cscfg_csdev_feat_ops
{
249 int (*load_feat
)(struct coresight_device
*csdev
,
250 struct cscfg_feature_csdev
*feat_csdev
);
253 /* coresight config helper functions*/
255 /* enable / disable config on a device - called with appropriate locks set.*/
256 int cscfg_csdev_enable_config(struct cscfg_config_csdev
*config_csdev
, int preset
);
257 void cscfg_csdev_disable_config(struct cscfg_config_csdev
*config_csdev
);
259 /* reset a feature to default values */
260 void cscfg_reset_feat(struct cscfg_feature_csdev
*feat_csdev
);
262 #endif /* _CORESIGHT_CORESIGHT_CONFIG_H */