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_OFFSET	28
25 #define UNCORE_DISCOVERY_PCI_DOMAIN(data)			\
26 		((data >> UNCORE_DISCOVERY_PCI_DOMAIN_OFFSET) & 0x7)
27 #define UNCORE_DISCOVERY_PCI_BUS_OFFSET		20
28 #define UNCORE_DISCOVERY_PCI_BUS(data)				\
29 		((data >> UNCORE_DISCOVERY_PCI_BUS_OFFSET) & 0xff)
30 #define UNCORE_DISCOVERY_PCI_DEVFN_OFFSET	12
31 #define UNCORE_DISCOVERY_PCI_DEVFN(data)			\
32 		((data >> UNCORE_DISCOVERY_PCI_DEVFN_OFFSET) & 0xff)
33 #define UNCORE_DISCOVERY_PCI_BOX_CTRL(data)	(data & 0xfff)
34 
35 
36 #define uncore_discovery_invalid_unit(unit)			\
37 	(!unit.table1 || !unit.ctl || \
38 	 unit.table1 == -1ULL || unit.ctl == -1ULL ||	\
39 	 unit.table3 == -1ULL)
40 
41 #define GENERIC_PMON_CTL_EV_SEL_MASK	0x000000ff
42 #define GENERIC_PMON_CTL_UMASK_MASK	0x0000ff00
43 #define GENERIC_PMON_CTL_EDGE_DET	(1 << 18)
44 #define GENERIC_PMON_CTL_INVERT		(1 << 23)
45 #define GENERIC_PMON_CTL_TRESH_MASK	0xff000000
46 #define GENERIC_PMON_RAW_EVENT_MASK	(GENERIC_PMON_CTL_EV_SEL_MASK | \
47 					 GENERIC_PMON_CTL_UMASK_MASK | \
48 					 GENERIC_PMON_CTL_EDGE_DET | \
49 					 GENERIC_PMON_CTL_INVERT | \
50 					 GENERIC_PMON_CTL_TRESH_MASK)
51 
52 #define GENERIC_PMON_BOX_CTL_FRZ	(1 << 0)
53 #define GENERIC_PMON_BOX_CTL_RST_CTRL	(1 << 8)
54 #define GENERIC_PMON_BOX_CTL_RST_CTRS	(1 << 9)
55 #define GENERIC_PMON_BOX_CTL_INT	(GENERIC_PMON_BOX_CTL_RST_CTRL | \
56 					 GENERIC_PMON_BOX_CTL_RST_CTRS)
57 
58 enum uncore_access_type {
59 	UNCORE_ACCESS_MSR	= 0,
60 	UNCORE_ACCESS_MMIO,
61 	UNCORE_ACCESS_PCI,
62 
63 	UNCORE_ACCESS_MAX,
64 };
65 
66 struct uncore_global_discovery {
67 	union {
68 		u64	table1;
69 		struct {
70 			u64	type : 8,
71 				stride : 8,
72 				max_units : 10,
73 				__reserved_1 : 36,
74 				access_type : 2;
75 		};
76 	};
77 
78 	u64	ctl;		/* Global Control Address */
79 
80 	union {
81 		u64	table3;
82 		struct {
83 			u64	status_offset : 8,
84 				num_status : 16,
85 				__reserved_2 : 40;
86 		};
87 	};
88 };
89 
90 struct uncore_unit_discovery {
91 	union {
92 		u64	table1;
93 		struct {
94 			u64	num_regs : 8,
95 				ctl_offset : 8,
96 				bit_width : 8,
97 				ctr_offset : 8,
98 				status_offset : 8,
99 				__reserved_1 : 22,
100 				access_type : 2;
101 			};
102 		};
103 
104 	u64	ctl;		/* Unit Control Address */
105 
106 	union {
107 		u64	table3;
108 		struct {
109 			u64	box_type : 16,
110 				box_id : 16,
111 				__reserved_2 : 32;
112 		};
113 	};
114 };
115 
116 struct intel_uncore_discovery_unit {
117 	struct rb_node	node;
118 	unsigned int	pmu_idx;	/* The idx of the corresponding PMU */
119 	unsigned int	id;		/* Unit ID */
120 	unsigned int	die;		/* Die ID */
121 	u64		addr;		/* Unit Control Address */
122 };
123 
124 struct intel_uncore_discovery_type {
125 	struct rb_node	node;
126 	enum uncore_access_type	access_type;
127 	struct rb_root	units;		/* Unit ctrl addr for all units */
128 	u16		type;		/* Type ID of the uncore block */
129 	u8		num_counters;
130 	u8		counter_width;
131 	u8		ctl_offset;	/* Counter Control 0 offset */
132 	u8		ctr_offset;	/* Counter 0 offset */
133 	u16		num_units;	/* number of units */
134 };
135 
136 bool intel_uncore_has_discovery_tables(int *ignore);
137 void intel_uncore_clear_discovery_tables(void);
138 void intel_uncore_generic_uncore_cpu_init(void);
139 int intel_uncore_generic_uncore_pci_init(void);
140 void intel_uncore_generic_uncore_mmio_init(void);
141 
142 void intel_generic_uncore_msr_init_box(struct intel_uncore_box *box);
143 void intel_generic_uncore_msr_disable_box(struct intel_uncore_box *box);
144 void intel_generic_uncore_msr_enable_box(struct intel_uncore_box *box);
145 
146 void intel_generic_uncore_mmio_init_box(struct intel_uncore_box *box);
147 void intel_generic_uncore_mmio_disable_box(struct intel_uncore_box *box);
148 void intel_generic_uncore_mmio_enable_box(struct intel_uncore_box *box);
149 void intel_generic_uncore_mmio_disable_event(struct intel_uncore_box *box,
150 					     struct perf_event *event);
151 void intel_generic_uncore_mmio_enable_event(struct intel_uncore_box *box,
152 					    struct perf_event *event);
153 
154 void intel_generic_uncore_pci_init_box(struct intel_uncore_box *box);
155 void intel_generic_uncore_pci_disable_box(struct intel_uncore_box *box);
156 void intel_generic_uncore_pci_enable_box(struct intel_uncore_box *box);
157 void intel_generic_uncore_pci_disable_event(struct intel_uncore_box *box,
158 					    struct perf_event *event);
159 u64 intel_generic_uncore_pci_read_counter(struct intel_uncore_box *box,
160 					  struct perf_event *event);
161 
162 struct intel_uncore_type **
163 intel_uncore_generic_init_uncores(enum uncore_access_type type_id, int num_extra);
164 
165 int intel_uncore_find_discovery_unit_id(struct rb_root *units, int die,
166 					unsigned int pmu_idx);
167 bool intel_generic_uncore_assign_hw_event(struct perf_event *event,
168 					  struct intel_uncore_box *box);
169 void uncore_find_add_unit(struct intel_uncore_discovery_unit *node,
170 			  struct rb_root *root, u16 *num_units);
171