| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (c) 2020 Linaro Limited, All rights reserved.
- * Author: Mike Leach <mike.leach@linaro.org>
- */
- #ifndef _CORESIGHT_CORESIGHT_CONFIG_H
- #define _CORESIGHT_CORESIGHT_CONFIG_H
- #include <linux/coresight.h>
- #include <linux/types.h>
- /* CoreSight Configuration Management - component and system wide configuration */
- /*
- * Register type flags for register value descriptor:
- * describe how the value is interpreted, and handled.
- */
- #define CS_CFG_REG_TYPE_STD 0x80 /* reg is standard reg */
- #define CS_CFG_REG_TYPE_RESOURCE 0x40 /* reg is a resource */
- #define CS_CFG_REG_TYPE_VAL_PARAM 0x08 /* reg value uses param */
- #define CS_CFG_REG_TYPE_VAL_MASK 0x04 /* reg value bit masked */
- #define CS_CFG_REG_TYPE_VAL_64BIT 0x02 /* reg value 64 bit */
- #define CS_CFG_REG_TYPE_VAL_SAVE 0x01 /* reg value save on disable */
- /*
- * flags defining what device class a feature will match to when processing a
- * system configuration - used by config data and devices.
- */
- #define CS_CFG_MATCH_CLASS_SRC_ALL 0x0001 /* match any source */
- #define CS_CFG_MATCH_CLASS_SRC_ETM4 0x0002 /* match any ETMv4 device */
- /* flags defining device instance matching - used in config match desc data. */
- #define CS_CFG_MATCH_INST_ANY 0x80000000 /* any instance of a class */
- /*
- * Limit number of presets in a configuration
- * This is related to the number of bits (4) we use to select the preset on
- * the perf command line. Preset 0 is always none selected.
- * See PMU_FORMAT_ATTR(preset, "config:0-3") in coresight-etm-perf.c
- */
- #define CS_CFG_CONFIG_PRESET_MAX 15
- /**
- * Parameter descriptor for a device feature.
- *
- * @name: Name of parameter.
- * @value: Initial or default value.
- */
- struct cscfg_parameter_desc {
- const char *name;
- u64 value;
- };
- /**
- * Representation of register value and a descriptor of register usage.
- *
- * Used as a descriptor in the feature descriptors.
- * Used as a value in when in a feature loading into a csdev.
- *
- * Supports full 64 bit register value, or 32 bit value with optional mask
- * value.
- *
- * @type: define register usage and interpretation.
- * @offset: the address offset for register in the hardware device (per device specification).
- * @hw_info: optional hardware device type specific information. (ETM / CTI specific etc)
- * @val64: 64 bit value.
- * @val32: 32 bit value.
- * @mask32: 32 bit mask when using 32 bit value to access device register - if mask type.
- * @param_idx: parameter index value into parameter array if param type.
- */
- struct cscfg_regval_desc {
- struct {
- u32 type:8;
- u32 offset:12;
- u32 hw_info:12;
- };
- union {
- u64 val64;
- struct {
- u32 val32;
- u32 mask32;
- };
- u32 param_idx;
- };
- };
- /**
- * Device feature descriptor - combination of registers and parameters to
- * program a device to implement a specific complex function.
- *
- * @name: feature name.
- * @description: brief description of the feature.
- * @item: List entry.
- * @match_flags: matching information if loading into a device
- * @nr_params: number of parameters used.
- * @params_desc: array of parameters used.
- * @nr_regs: number of registers used.
- * @regs_desc: array of registers used.
- * @load_owner: handle to load owner for dynamic load and unload of features.
- * @fs_group: reference to configfs group for dynamic unload.
- */
- struct cscfg_feature_desc {
- const char *name;
- const char *description;
- struct list_head item;
- u32 match_flags;
- int nr_params;
- struct cscfg_parameter_desc *params_desc;
- int nr_regs;
- struct cscfg_regval_desc *regs_desc;
- void *load_owner;
- struct config_group *fs_group;
- };
- /**
- * Configuration descriptor - describes selectable system configuration.
- *
- * A configuration describes device features in use, and may provide preset
- * values for the parameters in those features.
- *
- * A single set of presets is the sum of the parameters declared by
- * all the features in use - this value is @nr_total_params.
- *
- * @name: name of the configuration - used for selection.
- * @description: description of the purpose of the configuration.
- * @item: list entry.
- * @nr_feat_refs: Number of features used in this configuration.
- * @feat_ref_names: references to features used in this configuration.
- * @nr_presets: Number of sets of presets supplied by this configuration.
- * @nr_total_params: Sum of all parameters declared by used features
- * @presets: Array of preset values.
- * @event_ea: Extended attribute for perf event value
- * @active_cnt: ref count for activate on this configuration.
- * @load_owner: handle to load owner for dynamic load and unload of configs.
- * @fs_group: reference to configfs group for dynamic unload.
- * @available: config can be activated - multi-stage load sets true on completion.
- */
- struct cscfg_config_desc {
- const char *name;
- const char *description;
- struct list_head item;
- int nr_feat_refs;
- const char **feat_ref_names;
- int nr_presets;
- int nr_total_params;
- const u64 *presets; /* nr_presets * nr_total_params */
- struct dev_ext_attribute *event_ea;
- atomic_t active_cnt;
- void *load_owner;
- struct config_group *fs_group;
- bool available;
- };
- /**
- * config register instance - part of a loaded feature.
- * maps register values to csdev driver structures
- *
- * @reg_desc: value to use when setting feature on device / store for
- * readback of volatile values.
- * @driver_regval: pointer to internal driver element used to set the value
- * in hardware.
- */
- struct cscfg_regval_csdev {
- struct cscfg_regval_desc reg_desc;
- void *driver_regval;
- };
- /**
- * config parameter instance - part of a loaded feature.
- *
- * @feat_csdev: parent feature
- * @reg_csdev: register value updated by this parameter.
- * @current_value: current value of parameter - may be set by user via
- * sysfs, or modified during device operation.
- * @val64: true if 64 bit value
- */
- struct cscfg_parameter_csdev {
- struct cscfg_feature_csdev *feat_csdev;
- struct cscfg_regval_csdev *reg_csdev;
- u64 current_value;
- bool val64;
- };
- /**
- * Feature instance loaded into a CoreSight device.
- *
- * When a feature is loaded into a specific device, then this structure holds
- * the connections between the register / parameter values used and the
- * internal data structures that are written when the feature is enabled.
- *
- * Since applying a feature modifies internal data structures in the device,
- * then we have a reference to the device spinlock to protect access to these
- * structures (@drv_spinlock).
- *
- * @feat_desc: pointer to the static descriptor for this feature.
- * @csdev: parent CoreSight device instance.
- * @node: list entry into feature list for this device.
- * @drv_spinlock: device spinlock for access to driver register data.
- * @nr_params: number of parameters.
- * @params_csdev: current parameter values on this device
- * @nr_regs: number of registers to be programmed.
- * @regs_csdev: Programming details for the registers
- */
- struct cscfg_feature_csdev {
- const struct cscfg_feature_desc *feat_desc;
- struct coresight_device *csdev;
- struct list_head node;
- spinlock_t *drv_spinlock;
- int nr_params;
- struct cscfg_parameter_csdev *params_csdev;
- int nr_regs;
- struct cscfg_regval_csdev *regs_csdev;
- };
- /**
- * Configuration instance when loaded into a CoreSight device.
- *
- * The instance contains references to loaded features on this device that are
- * used by the configuration.
- *
- * @config_desc:reference to the descriptor for this configuration
- * @csdev: parent coresight device for this configuration instance.
- * @enabled: true if configuration is enabled on this device.
- * @node: list entry within the coresight device
- * @nr_feat: Number of features on this device that are used in the
- * configuration.
- * @feats_csdev:references to the device features to enable.
- */
- struct cscfg_config_csdev {
- const struct cscfg_config_desc *config_desc;
- struct coresight_device *csdev;
- bool enabled;
- struct list_head node;
- int nr_feat;
- struct cscfg_feature_csdev *feats_csdev[];
- };
- /**
- * Coresight device operations.
- *
- * Registered coresight devices provide these operations to manage feature
- * instances compatible with the device hardware and drivers
- *
- * @load_feat: Pass a feature descriptor into the device and create the
- * loaded feature instance (struct cscfg_feature_csdev).
- */
- struct cscfg_csdev_feat_ops {
- int (*load_feat)(struct coresight_device *csdev,
- struct cscfg_feature_csdev *feat_csdev);
- };
- /* coresight config helper functions*/
- /* enable / disable config on a device - called with appropriate locks set.*/
- int cscfg_csdev_enable_config(struct cscfg_config_csdev *config_csdev, int preset);
- void cscfg_csdev_disable_config(struct cscfg_config_csdev *config_csdev);
- /* reset a feature to default values */
- void cscfg_reset_feat(struct cscfg_feature_csdev *feat_csdev);
- #endif /* _CORESIGHT_CORESIGHT_CONFIG_H */
|