cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

coresight-config.h (8776B)


      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#ifndef _CORESIGHT_CORESIGHT_CONFIG_H
      8#define _CORESIGHT_CORESIGHT_CONFIG_H
      9
     10#include <linux/coresight.h>
     11#include <linux/types.h>
     12
     13/* CoreSight Configuration Management - component and system wide configuration */
     14
     15/*
     16 * Register type flags for register value descriptor:
     17 * describe how the value is interpreted, and handled.
     18 */
     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 */
     25
     26/*
     27 * flags defining what device class a feature will match to when processing a
     28 * system configuration - used by config data and devices.
     29 */
     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 */
     32
     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 */
     35
     36/*
     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
     41 */
     42#define CS_CFG_CONFIG_PRESET_MAX 15
     43
     44/**
     45 * Parameter descriptor for a device feature.
     46 *
     47 * @name:  Name of parameter.
     48 * @value: Initial or default value.
     49 */
     50struct cscfg_parameter_desc {
     51	const char *name;
     52	u64 value;
     53};
     54
     55/**
     56 * Representation of register value and a descriptor of register usage.
     57 *
     58 * Used as a descriptor in the feature descriptors.
     59 * Used as a value in when in a feature loading into a csdev.
     60 *
     61 * Supports full 64 bit register value, or 32 bit value with optional mask
     62 * value.
     63 *
     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.
     71 */
     72struct cscfg_regval_desc {
     73	struct {
     74		u32 type:8;
     75		u32 offset:12;
     76		u32 hw_info:12;
     77	};
     78	union {
     79		u64 val64;
     80		struct {
     81			u32 val32;
     82			u32 mask32;
     83		};
     84		u32 param_idx;
     85	};
     86};
     87
     88/**
     89 * Device feature descriptor - combination of registers and parameters to
     90 * program a device to implement a specific complex function.
     91 *
     92 * @name:	 feature name.
     93 * @description: brief description of the feature.
     94 * @item:	 List entry.
     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.
    102 */
    103struct cscfg_feature_desc {
    104	const char *name;
    105	const char *description;
    106	struct list_head item;
    107	u32 match_flags;
    108	int nr_params;
    109	struct cscfg_parameter_desc *params_desc;
    110	int nr_regs;
    111	struct cscfg_regval_desc *regs_desc;
    112	void *load_owner;
    113	struct config_group *fs_group;
    114};
    115
    116/**
    117 * Configuration descriptor - describes selectable system configuration.
    118 *
    119 * A configuration describes device features in use, and may provide preset
    120 * values for the parameters in those features.
    121 *
    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.
    124 *
    125 * @name:		name of the configuration - used for selection.
    126 * @description:	description of the purpose of the configuration.
    127 * @item:		list entry.
    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 */
    138struct cscfg_config_desc {
    139	const char *name;
    140	const char *description;
    141	struct list_head item;
    142	int nr_feat_refs;
    143	const char **feat_ref_names;
    144	int nr_presets;
    145	int nr_total_params;
    146	const u64 *presets; /* nr_presets * nr_total_params */
    147	struct dev_ext_attribute *event_ea;
    148	atomic_t active_cnt;
    149	void *load_owner;
    150	struct config_group *fs_group;
    151};
    152
    153/**
    154 * config register instance - part of a loaded feature.
    155 *                            maps register values to csdev driver structures
    156 *
    157 * @reg_desc:		value to use when setting feature on device / store for
    158 *			readback of volatile values.
    159 * @driver_regval:	pointer to internal driver element used to set the value
    160 *			in hardware.
    161 */
    162struct cscfg_regval_csdev {
    163	struct cscfg_regval_desc reg_desc;
    164	void *driver_regval;
    165};
    166
    167/**
    168 * config parameter instance - part of a loaded feature.
    169 *
    170 * @feat_csdev:		parent feature
    171 * @reg_csdev:		register value updated by this parameter.
    172 * @current_value:	current value of parameter - may be set by user via
    173 *			sysfs, or modified during device operation.
    174 * @val64:		true if 64 bit value
    175 */
    176struct cscfg_parameter_csdev {
    177	struct cscfg_feature_csdev *feat_csdev;
    178	struct cscfg_regval_csdev *reg_csdev;
    179	u64 current_value;
    180	bool val64;
    181};
    182
    183/**
    184 * Feature instance loaded into a CoreSight device.
    185 *
    186 * When a feature is loaded into a specific device, then this structure holds
    187 * the connections between the register / parameter values used and the
    188 * internal data structures that are written when the feature is enabled.
    189 *
    190 * Since applying a feature modifies internal data structures in the device,
    191 * then we have a reference to the device spinlock to protect access to these
    192 * structures (@drv_spinlock).
    193 *
    194 * @feat_desc:		pointer to the static descriptor for this feature.
    195 * @csdev:		parent CoreSight device instance.
    196 * @node:		list entry into feature list for this device.
    197 * @drv_spinlock:	device spinlock for access to driver register data.
    198 * @nr_params:		number of parameters.
    199 * @params_csdev:	current parameter values on this device
    200 * @nr_regs:		number of registers to be programmed.
    201 * @regs_csdev:		Programming details for the registers
    202 */
    203struct cscfg_feature_csdev {
    204	const struct cscfg_feature_desc *feat_desc;
    205	struct coresight_device *csdev;
    206	struct list_head node;
    207	spinlock_t *drv_spinlock;
    208	int nr_params;
    209	struct cscfg_parameter_csdev *params_csdev;
    210	int nr_regs;
    211	struct cscfg_regval_csdev *regs_csdev;
    212};
    213
    214/**
    215 * Configuration instance when loaded into a CoreSight device.
    216 *
    217 * The instance contains references to loaded features on this device that are
    218 * used by the configuration.
    219 *
    220 * @config_desc:reference to the descriptor for this configuration
    221 * @csdev:	parent coresight device for this configuration instance.
    222 * @enabled:	true if configuration is enabled on this device.
    223 * @node:	list entry within the coresight device
    224 * @nr_feat:	Number of features on this device that are used in the
    225 *		configuration.
    226 * @feats_csdev:references to the device features to enable.
    227 */
    228struct cscfg_config_csdev {
    229	const struct cscfg_config_desc *config_desc;
    230	struct coresight_device *csdev;
    231	bool enabled;
    232	struct list_head node;
    233	int nr_feat;
    234	struct cscfg_feature_csdev *feats_csdev[];
    235};
    236
    237/**
    238 * Coresight device operations.
    239 *
    240 * Registered coresight devices provide these operations to manage feature
    241 * instances compatible with the device hardware and drivers
    242 *
    243 * @load_feat:	Pass a feature descriptor into the device and create the
    244 *		loaded feature instance (struct cscfg_feature_csdev).
    245 */
    246struct cscfg_csdev_feat_ops {
    247	int (*load_feat)(struct coresight_device *csdev,
    248			 struct cscfg_feature_csdev *feat_csdev);
    249};
    250
    251/* coresight config helper functions*/
    252
    253/* enable / disable config on a device - called with appropriate locks set.*/
    254int cscfg_csdev_enable_config(struct cscfg_config_csdev *config_csdev, int preset);
    255void cscfg_csdev_disable_config(struct cscfg_config_csdev *config_csdev);
    256
    257/* reset a feature to default values */
    258void cscfg_reset_feat(struct cscfg_feature_csdev *feat_csdev);
    259
    260#endif /* _CORESIGHT_CORESIGHT_CONFIG_H */