15a4bd5185
The unit control and ID information are retrieved from the unit control RB tree. No one uses the old structure anymore. Remove them. Signed-off-by: Kan Liang <kan.liang@linux.intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Yunying Sun <yunying.sun@intel.com> Link: https://lore.kernel.org/r/20240614134631.1092359-8-kan.liang@linux.intel.com
171 lines
5.3 KiB
C
171 lines
5.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
/* Generic device ID of a discovery table device */
|
|
#define UNCORE_DISCOVERY_TABLE_DEVICE 0x09a7
|
|
/* Capability ID for a discovery table device */
|
|
#define UNCORE_EXT_CAP_ID_DISCOVERY 0x23
|
|
/* First DVSEC offset */
|
|
#define UNCORE_DISCOVERY_DVSEC_OFFSET 0x8
|
|
/* Mask of the supported discovery entry type */
|
|
#define UNCORE_DISCOVERY_DVSEC_ID_MASK 0xffff
|
|
/* PMON discovery entry type ID */
|
|
#define UNCORE_DISCOVERY_DVSEC_ID_PMON 0x1
|
|
/* Second DVSEC offset */
|
|
#define UNCORE_DISCOVERY_DVSEC2_OFFSET 0xc
|
|
/* Mask of the discovery table BAR offset */
|
|
#define UNCORE_DISCOVERY_DVSEC2_BIR_MASK 0x7
|
|
/* Discovery table BAR base offset */
|
|
#define UNCORE_DISCOVERY_BIR_BASE 0x10
|
|
/* Discovery table BAR step */
|
|
#define UNCORE_DISCOVERY_BIR_STEP 0x4
|
|
/* Global discovery table size */
|
|
#define UNCORE_DISCOVERY_GLOBAL_MAP_SIZE 0x20
|
|
|
|
#define UNCORE_DISCOVERY_PCI_DOMAIN_OFFSET 28
|
|
#define UNCORE_DISCOVERY_PCI_DOMAIN(data) \
|
|
((data >> UNCORE_DISCOVERY_PCI_DOMAIN_OFFSET) & 0x7)
|
|
#define UNCORE_DISCOVERY_PCI_BUS_OFFSET 20
|
|
#define UNCORE_DISCOVERY_PCI_BUS(data) \
|
|
((data >> UNCORE_DISCOVERY_PCI_BUS_OFFSET) & 0xff)
|
|
#define UNCORE_DISCOVERY_PCI_DEVFN_OFFSET 12
|
|
#define UNCORE_DISCOVERY_PCI_DEVFN(data) \
|
|
((data >> UNCORE_DISCOVERY_PCI_DEVFN_OFFSET) & 0xff)
|
|
#define UNCORE_DISCOVERY_PCI_BOX_CTRL(data) (data & 0xfff)
|
|
|
|
|
|
#define uncore_discovery_invalid_unit(unit) \
|
|
(!unit.table1 || !unit.ctl || \
|
|
unit.table1 == -1ULL || unit.ctl == -1ULL || \
|
|
unit.table3 == -1ULL)
|
|
|
|
#define GENERIC_PMON_CTL_EV_SEL_MASK 0x000000ff
|
|
#define GENERIC_PMON_CTL_UMASK_MASK 0x0000ff00
|
|
#define GENERIC_PMON_CTL_EDGE_DET (1 << 18)
|
|
#define GENERIC_PMON_CTL_INVERT (1 << 23)
|
|
#define GENERIC_PMON_CTL_TRESH_MASK 0xff000000
|
|
#define GENERIC_PMON_RAW_EVENT_MASK (GENERIC_PMON_CTL_EV_SEL_MASK | \
|
|
GENERIC_PMON_CTL_UMASK_MASK | \
|
|
GENERIC_PMON_CTL_EDGE_DET | \
|
|
GENERIC_PMON_CTL_INVERT | \
|
|
GENERIC_PMON_CTL_TRESH_MASK)
|
|
|
|
#define GENERIC_PMON_BOX_CTL_FRZ (1 << 0)
|
|
#define GENERIC_PMON_BOX_CTL_RST_CTRL (1 << 8)
|
|
#define GENERIC_PMON_BOX_CTL_RST_CTRS (1 << 9)
|
|
#define GENERIC_PMON_BOX_CTL_INT (GENERIC_PMON_BOX_CTL_RST_CTRL | \
|
|
GENERIC_PMON_BOX_CTL_RST_CTRS)
|
|
|
|
enum uncore_access_type {
|
|
UNCORE_ACCESS_MSR = 0,
|
|
UNCORE_ACCESS_MMIO,
|
|
UNCORE_ACCESS_PCI,
|
|
|
|
UNCORE_ACCESS_MAX,
|
|
};
|
|
|
|
struct uncore_global_discovery {
|
|
union {
|
|
u64 table1;
|
|
struct {
|
|
u64 type : 8,
|
|
stride : 8,
|
|
max_units : 10,
|
|
__reserved_1 : 36,
|
|
access_type : 2;
|
|
};
|
|
};
|
|
|
|
u64 ctl; /* Global Control Address */
|
|
|
|
union {
|
|
u64 table3;
|
|
struct {
|
|
u64 status_offset : 8,
|
|
num_status : 16,
|
|
__reserved_2 : 40;
|
|
};
|
|
};
|
|
};
|
|
|
|
struct uncore_unit_discovery {
|
|
union {
|
|
u64 table1;
|
|
struct {
|
|
u64 num_regs : 8,
|
|
ctl_offset : 8,
|
|
bit_width : 8,
|
|
ctr_offset : 8,
|
|
status_offset : 8,
|
|
__reserved_1 : 22,
|
|
access_type : 2;
|
|
};
|
|
};
|
|
|
|
u64 ctl; /* Unit Control Address */
|
|
|
|
union {
|
|
u64 table3;
|
|
struct {
|
|
u64 box_type : 16,
|
|
box_id : 16,
|
|
__reserved_2 : 32;
|
|
};
|
|
};
|
|
};
|
|
|
|
struct intel_uncore_discovery_unit {
|
|
struct rb_node node;
|
|
unsigned int pmu_idx; /* The idx of the corresponding PMU */
|
|
unsigned int id; /* Unit ID */
|
|
unsigned int die; /* Die ID */
|
|
u64 addr; /* Unit Control Address */
|
|
};
|
|
|
|
struct intel_uncore_discovery_type {
|
|
struct rb_node node;
|
|
enum uncore_access_type access_type;
|
|
struct rb_root units; /* Unit ctrl addr for all units */
|
|
u16 type; /* Type ID of the uncore block */
|
|
u8 num_counters;
|
|
u8 counter_width;
|
|
u8 ctl_offset; /* Counter Control 0 offset */
|
|
u8 ctr_offset; /* Counter 0 offset */
|
|
u16 num_units; /* number of units */
|
|
};
|
|
|
|
bool intel_uncore_has_discovery_tables(int *ignore);
|
|
void intel_uncore_clear_discovery_tables(void);
|
|
void intel_uncore_generic_uncore_cpu_init(void);
|
|
int intel_uncore_generic_uncore_pci_init(void);
|
|
void intel_uncore_generic_uncore_mmio_init(void);
|
|
|
|
void intel_generic_uncore_msr_init_box(struct intel_uncore_box *box);
|
|
void intel_generic_uncore_msr_disable_box(struct intel_uncore_box *box);
|
|
void intel_generic_uncore_msr_enable_box(struct intel_uncore_box *box);
|
|
|
|
void intel_generic_uncore_mmio_init_box(struct intel_uncore_box *box);
|
|
void intel_generic_uncore_mmio_disable_box(struct intel_uncore_box *box);
|
|
void intel_generic_uncore_mmio_enable_box(struct intel_uncore_box *box);
|
|
void intel_generic_uncore_mmio_disable_event(struct intel_uncore_box *box,
|
|
struct perf_event *event);
|
|
void intel_generic_uncore_mmio_enable_event(struct intel_uncore_box *box,
|
|
struct perf_event *event);
|
|
|
|
void intel_generic_uncore_pci_init_box(struct intel_uncore_box *box);
|
|
void intel_generic_uncore_pci_disable_box(struct intel_uncore_box *box);
|
|
void intel_generic_uncore_pci_enable_box(struct intel_uncore_box *box);
|
|
void intel_generic_uncore_pci_disable_event(struct intel_uncore_box *box,
|
|
struct perf_event *event);
|
|
u64 intel_generic_uncore_pci_read_counter(struct intel_uncore_box *box,
|
|
struct perf_event *event);
|
|
|
|
struct intel_uncore_type **
|
|
intel_uncore_generic_init_uncores(enum uncore_access_type type_id, int num_extra);
|
|
|
|
int intel_uncore_find_discovery_unit_id(struct rb_root *units, int die,
|
|
unsigned int pmu_idx);
|
|
bool intel_generic_uncore_assign_hw_event(struct perf_event *event,
|
|
struct intel_uncore_box *box);
|
|
void uncore_find_add_unit(struct intel_uncore_discovery_unit *node,
|
|
struct rb_root *root, u16 *num_units);
|