2021-08-18 22:40:12 +03:00
/* 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 .
2021-11-24 23:00:33 +03:00
* @ load_owner : handle to load owner for dynamic load and unload of features .
2021-11-24 23:00:34 +03:00
* @ fs_group : reference to configfs group for dynamic unload .
2021-08-18 22:40:12 +03:00
*/
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 ;
2021-11-24 23:00:33 +03:00
void * load_owner ;
2021-11-24 23:00:34 +03:00
struct config_group * fs_group ;
2021-08-18 22:40:12 +03:00
} ;
/**
* 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 .
2021-08-18 22:40:15 +03:00
* @ event_ea : Extended attribute for perf event value
2021-08-18 22:40:16 +03:00
* @ active_cnt : ref count for activate on this configuration .
2021-11-24 23:00:33 +03:00
* @ load_owner : handle to load owner for dynamic load and unload of configs .
2021-11-24 23:00:34 +03:00
* @ fs_group : reference to configfs group for dynamic unload .
2022-06-28 20:30:04 +03:00
* @ available : config can be activated - multi - stage load sets true on completion .
2021-08-18 22:40:12 +03:00
*/
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 */
2021-08-18 22:40:15 +03:00
struct dev_ext_attribute * event_ea ;
2021-08-18 22:40:16 +03:00
atomic_t active_cnt ;
2021-11-24 23:00:33 +03:00
void * load_owner ;
2021-11-24 23:00:34 +03:00
struct config_group * fs_group ;
2022-06-28 20:30:04 +03:00
bool available ;
2021-08-18 22:40:12 +03:00
} ;
2021-08-18 22:40:13 +03:00
/**
* 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 ;
2022-02-15 04:11:44 +03:00
struct cscfg_feature_csdev * feats_csdev [ ] ;
2021-08-18 22:40:13 +03:00
} ;
/**
* 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 ) ;
} ;
2021-08-18 22:40:14 +03:00
/* 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 ) ;
2021-08-18 22:40:12 +03:00
# endif /* _CORESIGHT_CORESIGHT_CONFIG_H */