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

uncore_discovery.h (4756B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2
      3/* Generic device ID of a discovery table device */
      4#define UNCORE_DISCOVERY_TABLE_DEVICE		0x09a7
      5/* Capability ID for a discovery table device */
      6#define UNCORE_EXT_CAP_ID_DISCOVERY		0x23
      7/* First DVSEC offset */
      8#define UNCORE_DISCOVERY_DVSEC_OFFSET		0x8
      9/* Mask of the supported discovery entry type */
     10#define UNCORE_DISCOVERY_DVSEC_ID_MASK		0xffff
     11/* PMON discovery entry type ID */
     12#define UNCORE_DISCOVERY_DVSEC_ID_PMON		0x1
     13/* Second DVSEC offset */
     14#define UNCORE_DISCOVERY_DVSEC2_OFFSET		0xc
     15/* Mask of the discovery table BAR offset */
     16#define UNCORE_DISCOVERY_DVSEC2_BIR_MASK	0x7
     17/* Discovery table BAR base offset */
     18#define UNCORE_DISCOVERY_BIR_BASE		0x10
     19/* Discovery table BAR step */
     20#define UNCORE_DISCOVERY_BIR_STEP		0x4
     21/* Global discovery table size */
     22#define UNCORE_DISCOVERY_GLOBAL_MAP_SIZE	0x20
     23
     24#define UNCORE_DISCOVERY_PCI_DOMAIN(data)	((data >> 28) & 0x7)
     25#define UNCORE_DISCOVERY_PCI_BUS(data)		((data >> 20) & 0xff)
     26#define UNCORE_DISCOVERY_PCI_DEVFN(data)	((data >> 12) & 0xff)
     27#define UNCORE_DISCOVERY_PCI_BOX_CTRL(data)	(data & 0xfff)
     28
     29
     30#define uncore_discovery_invalid_unit(unit)			\
     31	(!unit.table1 || !unit.ctl || \
     32	 unit.table1 == -1ULL || unit.ctl == -1ULL ||	\
     33	 unit.table3 == -1ULL)
     34
     35#define GENERIC_PMON_CTL_EV_SEL_MASK	0x000000ff
     36#define GENERIC_PMON_CTL_UMASK_MASK	0x0000ff00
     37#define GENERIC_PMON_CTL_EDGE_DET	(1 << 18)
     38#define GENERIC_PMON_CTL_INVERT		(1 << 23)
     39#define GENERIC_PMON_CTL_TRESH_MASK	0xff000000
     40#define GENERIC_PMON_RAW_EVENT_MASK	(GENERIC_PMON_CTL_EV_SEL_MASK | \
     41					 GENERIC_PMON_CTL_UMASK_MASK | \
     42					 GENERIC_PMON_CTL_EDGE_DET | \
     43					 GENERIC_PMON_CTL_INVERT | \
     44					 GENERIC_PMON_CTL_TRESH_MASK)
     45
     46#define GENERIC_PMON_BOX_CTL_FRZ	(1 << 0)
     47#define GENERIC_PMON_BOX_CTL_RST_CTRL	(1 << 8)
     48#define GENERIC_PMON_BOX_CTL_RST_CTRS	(1 << 9)
     49#define GENERIC_PMON_BOX_CTL_INT	(GENERIC_PMON_BOX_CTL_RST_CTRL | \
     50					 GENERIC_PMON_BOX_CTL_RST_CTRS)
     51
     52enum uncore_access_type {
     53	UNCORE_ACCESS_MSR	= 0,
     54	UNCORE_ACCESS_MMIO,
     55	UNCORE_ACCESS_PCI,
     56
     57	UNCORE_ACCESS_MAX,
     58};
     59
     60struct uncore_global_discovery {
     61	union {
     62		u64	table1;
     63		struct {
     64			u64	type : 8,
     65				stride : 8,
     66				max_units : 10,
     67				__reserved_1 : 36,
     68				access_type : 2;
     69		};
     70	};
     71
     72	u64	ctl;		/* Global Control Address */
     73
     74	union {
     75		u64	table3;
     76		struct {
     77			u64	status_offset : 8,
     78				num_status : 16,
     79				__reserved_2 : 40;
     80		};
     81	};
     82};
     83
     84struct uncore_unit_discovery {
     85	union {
     86		u64	table1;
     87		struct {
     88			u64	num_regs : 8,
     89				ctl_offset : 8,
     90				bit_width : 8,
     91				ctr_offset : 8,
     92				status_offset : 8,
     93				__reserved_1 : 22,
     94				access_type : 2;
     95			};
     96		};
     97
     98	u64	ctl;		/* Unit Control Address */
     99
    100	union {
    101		u64	table3;
    102		struct {
    103			u64	box_type : 16,
    104				box_id : 16,
    105				__reserved_2 : 32;
    106		};
    107	};
    108};
    109
    110struct intel_uncore_discovery_type {
    111	struct rb_node	node;
    112	enum uncore_access_type	access_type;
    113	u64		box_ctrl;	/* Unit ctrl addr of the first box */
    114	u64		*box_ctrl_die;	/* Unit ctrl addr of the first box of each die */
    115	u16		type;		/* Type ID of the uncore block */
    116	u8		num_counters;
    117	u8		counter_width;
    118	u8		ctl_offset;	/* Counter Control 0 offset */
    119	u8		ctr_offset;	/* Counter 0 offset */
    120	u16		num_boxes;	/* number of boxes for the uncore block */
    121	unsigned int	*ids;		/* Box IDs */
    122	unsigned int	*box_offset;	/* Box offset */
    123};
    124
    125bool intel_uncore_has_discovery_tables(void);
    126void intel_uncore_clear_discovery_tables(void);
    127void intel_uncore_generic_uncore_cpu_init(void);
    128int intel_uncore_generic_uncore_pci_init(void);
    129void intel_uncore_generic_uncore_mmio_init(void);
    130
    131void intel_generic_uncore_msr_init_box(struct intel_uncore_box *box);
    132void intel_generic_uncore_msr_disable_box(struct intel_uncore_box *box);
    133void intel_generic_uncore_msr_enable_box(struct intel_uncore_box *box);
    134
    135void intel_generic_uncore_mmio_init_box(struct intel_uncore_box *box);
    136void intel_generic_uncore_mmio_disable_box(struct intel_uncore_box *box);
    137void intel_generic_uncore_mmio_enable_box(struct intel_uncore_box *box);
    138void intel_generic_uncore_mmio_disable_event(struct intel_uncore_box *box,
    139					     struct perf_event *event);
    140void intel_generic_uncore_mmio_enable_event(struct intel_uncore_box *box,
    141					    struct perf_event *event);
    142
    143void intel_generic_uncore_pci_init_box(struct intel_uncore_box *box);
    144void intel_generic_uncore_pci_disable_box(struct intel_uncore_box *box);
    145void intel_generic_uncore_pci_enable_box(struct intel_uncore_box *box);
    146void intel_generic_uncore_pci_disable_event(struct intel_uncore_box *box,
    147					    struct perf_event *event);
    148u64 intel_generic_uncore_pci_read_counter(struct intel_uncore_box *box,
    149					  struct perf_event *event);
    150
    151struct intel_uncore_type **
    152intel_uncore_generic_init_uncores(enum uncore_access_type type_id, int num_extra);