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