| .. | .. |
|---|
| 17 | 17 | |
|---|
| 18 | 18 | #define DRIVER_NAME "intel_th_pci" |
|---|
| 19 | 19 | |
|---|
| 20 | | -#define BAR_MASK (BIT(TH_MMIO_CONFIG) | BIT(TH_MMIO_SW)) |
|---|
| 20 | +enum { |
|---|
| 21 | + TH_PCI_CONFIG_BAR = 0, |
|---|
| 22 | + TH_PCI_STH_SW_BAR = 2, |
|---|
| 23 | + TH_PCI_RTIT_BAR = 4, |
|---|
| 24 | +}; |
|---|
| 25 | + |
|---|
| 26 | +#define BAR_MASK (BIT(TH_PCI_CONFIG_BAR) | BIT(TH_PCI_STH_SW_BAR)) |
|---|
| 21 | 27 | |
|---|
| 22 | 28 | #define PCI_REG_NPKDSC 0x80 |
|---|
| 23 | 29 | #define NPKDSC_TSACT BIT(5) |
|---|
| .. | .. |
|---|
| 66 | 72 | const struct pci_device_id *id) |
|---|
| 67 | 73 | { |
|---|
| 68 | 74 | struct intel_th_drvdata *drvdata = (void *)id->driver_data; |
|---|
| 75 | + struct resource resource[TH_MMIO_END + TH_NVEC_MAX] = { |
|---|
| 76 | + [TH_MMIO_CONFIG] = pdev->resource[TH_PCI_CONFIG_BAR], |
|---|
| 77 | + [TH_MMIO_SW] = pdev->resource[TH_PCI_STH_SW_BAR], |
|---|
| 78 | + }; |
|---|
| 79 | + int err, r = TH_MMIO_SW + 1, i; |
|---|
| 69 | 80 | struct intel_th *th; |
|---|
| 70 | | - int err; |
|---|
| 71 | 81 | |
|---|
| 72 | 82 | err = pcim_enable_device(pdev); |
|---|
| 73 | 83 | if (err) |
|---|
| .. | .. |
|---|
| 77 | 87 | if (err) |
|---|
| 78 | 88 | return err; |
|---|
| 79 | 89 | |
|---|
| 80 | | - th = intel_th_alloc(&pdev->dev, drvdata, pdev->resource, |
|---|
| 81 | | - DEVICE_COUNT_RESOURCE, pdev->irq); |
|---|
| 82 | | - if (IS_ERR(th)) |
|---|
| 83 | | - return PTR_ERR(th); |
|---|
| 90 | + if (pdev->resource[TH_PCI_RTIT_BAR].start) { |
|---|
| 91 | + resource[TH_MMIO_RTIT] = pdev->resource[TH_PCI_RTIT_BAR]; |
|---|
| 92 | + r++; |
|---|
| 93 | + } |
|---|
| 94 | + |
|---|
| 95 | + err = pci_alloc_irq_vectors(pdev, 1, 8, PCI_IRQ_ALL_TYPES); |
|---|
| 96 | + if (err > 0) |
|---|
| 97 | + for (i = 0; i < err; i++, r++) { |
|---|
| 98 | + resource[r].flags = IORESOURCE_IRQ; |
|---|
| 99 | + resource[r].start = pci_irq_vector(pdev, i); |
|---|
| 100 | + } |
|---|
| 101 | + |
|---|
| 102 | + th = intel_th_alloc(&pdev->dev, drvdata, resource, r); |
|---|
| 103 | + if (IS_ERR(th)) { |
|---|
| 104 | + err = PTR_ERR(th); |
|---|
| 105 | + goto err_free_irq; |
|---|
| 106 | + } |
|---|
| 84 | 107 | |
|---|
| 85 | 108 | th->activate = intel_th_pci_activate; |
|---|
| 86 | 109 | th->deactivate = intel_th_pci_deactivate; |
|---|
| .. | .. |
|---|
| 88 | 111 | pci_set_master(pdev); |
|---|
| 89 | 112 | |
|---|
| 90 | 113 | return 0; |
|---|
| 114 | + |
|---|
| 115 | +err_free_irq: |
|---|
| 116 | + pci_free_irq_vectors(pdev); |
|---|
| 117 | + return err; |
|---|
| 91 | 118 | } |
|---|
| 92 | 119 | |
|---|
| 93 | 120 | static void intel_th_pci_remove(struct pci_dev *pdev) |
|---|
| .. | .. |
|---|
| 95 | 122 | struct intel_th *th = pci_get_drvdata(pdev); |
|---|
| 96 | 123 | |
|---|
| 97 | 124 | intel_th_free(th); |
|---|
| 125 | + |
|---|
| 126 | + pci_free_irq_vectors(pdev); |
|---|
| 98 | 127 | } |
|---|
| 128 | + |
|---|
| 129 | +static const struct intel_th_drvdata intel_th_1x_multi_is_broken = { |
|---|
| 130 | + .multi_is_broken = 1, |
|---|
| 131 | +}; |
|---|
| 99 | 132 | |
|---|
| 100 | 133 | static const struct intel_th_drvdata intel_th_2x = { |
|---|
| 101 | 134 | .tscu_enable = 1, |
|---|
| 135 | + .has_mintctl = 1, |
|---|
| 102 | 136 | }; |
|---|
| 103 | 137 | |
|---|
| 104 | 138 | static const struct pci_device_id intel_th_pci_id_table[] = { |
|---|
| .. | .. |
|---|
| 128 | 162 | { |
|---|
| 129 | 163 | /* Kaby Lake PCH-H */ |
|---|
| 130 | 164 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa2a6), |
|---|
| 131 | | - .driver_data = (kernel_ulong_t)0, |
|---|
| 165 | + .driver_data = (kernel_ulong_t)&intel_th_1x_multi_is_broken, |
|---|
| 132 | 166 | }, |
|---|
| 133 | 167 | { |
|---|
| 134 | 168 | /* Denverton */ |
|---|
| .. | .. |
|---|
| 183 | 217 | { |
|---|
| 184 | 218 | /* Comet Lake PCH-V */ |
|---|
| 185 | 219 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa3a6), |
|---|
| 186 | | - .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 220 | + .driver_data = (kernel_ulong_t)&intel_th_1x_multi_is_broken, |
|---|
| 187 | 221 | }, |
|---|
| 188 | 222 | { |
|---|
| 189 | 223 | /* Ice Lake NNPI */ |
|---|
| .. | .. |
|---|
| 231 | 265 | .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 232 | 266 | }, |
|---|
| 233 | 267 | { |
|---|
| 234 | | - /* Alder Lake-P */ |
|---|
| 235 | | - PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x51a6), |
|---|
| 236 | | - .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 237 | | - }, |
|---|
| 238 | | - { |
|---|
| 239 | 268 | /* Emmitsburg PCH */ |
|---|
| 240 | 269 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1bcc), |
|---|
| 241 | 270 | .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 242 | 271 | }, |
|---|
| 243 | 272 | { |
|---|
| 273 | + /* Alder Lake */ |
|---|
| 274 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7aa6), |
|---|
| 275 | + .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 276 | + }, |
|---|
| 277 | + { |
|---|
| 278 | + /* Alder Lake-P */ |
|---|
| 279 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x51a6), |
|---|
| 280 | + .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 281 | + }, |
|---|
| 282 | + { |
|---|
| 244 | 283 | /* Alder Lake-M */ |
|---|
| 245 | 284 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x54a6), |
|---|
| 246 | 285 | .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 247 | 286 | }, |
|---|
| 248 | 287 | { |
|---|
| 288 | + /* Meteor Lake-P */ |
|---|
| 289 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7e24), |
|---|
| 290 | + .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 291 | + }, |
|---|
| 292 | + { |
|---|
| 293 | + /* Raptor Lake-S */ |
|---|
| 294 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7a26), |
|---|
| 295 | + .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 296 | + }, |
|---|
| 297 | + { |
|---|
| 298 | + /* Raptor Lake-S CPU */ |
|---|
| 299 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa76f), |
|---|
| 300 | + .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 301 | + }, |
|---|
| 302 | + { |
|---|
| 303 | + /* Alder Lake CPU */ |
|---|
| 304 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x466f), |
|---|
| 305 | + .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|
| 306 | + }, |
|---|
| 307 | + { |
|---|
| 249 | 308 | /* Rocket Lake CPU */ |
|---|
| 250 | 309 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4c19), |
|---|
| 251 | 310 | .driver_data = (kernel_ulong_t)&intel_th_2x, |
|---|