263 lines
8.7 KiB
C
263 lines
8.7 KiB
C
/* 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 */
|