150352fa7SAlexander Shishkin // SPDX-License-Identifier: GPL-2.0 22b0b16d3SAlexander Shishkin /* 32b0b16d3SAlexander Shishkin * Intel(R) Trace Hub pci driver 42b0b16d3SAlexander Shishkin * 52b0b16d3SAlexander Shishkin * Copyright (C) 2014-2015 Intel Corporation. 62b0b16d3SAlexander Shishkin */ 72b0b16d3SAlexander Shishkin 82b0b16d3SAlexander Shishkin #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 92b0b16d3SAlexander Shishkin 102b0b16d3SAlexander Shishkin #include <linux/types.h> 112b0b16d3SAlexander Shishkin #include <linux/module.h> 122b0b16d3SAlexander Shishkin #include <linux/device.h> 132b0b16d3SAlexander Shishkin #include <linux/sysfs.h> 142b0b16d3SAlexander Shishkin #include <linux/pci.h> 152b0b16d3SAlexander Shishkin 162b0b16d3SAlexander Shishkin #include "intel_th.h" 172b0b16d3SAlexander Shishkin 182b0b16d3SAlexander Shishkin #define DRIVER_NAME "intel_th_pci" 192b0b16d3SAlexander Shishkin 20db73a059SAlexander Shishkin enum { 21db73a059SAlexander Shishkin TH_PCI_CONFIG_BAR = 0, 22db73a059SAlexander Shishkin TH_PCI_STH_SW_BAR = 2, 23fc027f4cSAlexander Shishkin TH_PCI_RTIT_BAR = 4, 24db73a059SAlexander Shishkin }; 25db73a059SAlexander Shishkin 262b0b16d3SAlexander Shishkin 27a0e7df33SAlexander Shishkin #define PCI_REG_NPKDSC 0x80 28a0e7df33SAlexander Shishkin #define NPKDSC_TSACT BIT(5) 29a0e7df33SAlexander Shishkin 30a0e7df33SAlexander Shishkin static int intel_th_pci_activate(struct intel_th *th) 31a0e7df33SAlexander Shishkin { 32a0e7df33SAlexander Shishkin struct pci_dev *pdev = to_pci_dev(th->dev); 33a0e7df33SAlexander Shishkin u32 npkdsc; 34a0e7df33SAlexander Shishkin int err; 35a0e7df33SAlexander Shishkin 36a0e7df33SAlexander Shishkin if (!INTEL_TH_CAP(th, tscu_enable)) 37a0e7df33SAlexander Shishkin return 0; 38a0e7df33SAlexander Shishkin 39a0e7df33SAlexander Shishkin err = pci_read_config_dword(pdev, PCI_REG_NPKDSC, &npkdsc); 40a0e7df33SAlexander Shishkin if (!err) { 41a0e7df33SAlexander Shishkin npkdsc |= NPKDSC_TSACT; 42a0e7df33SAlexander Shishkin err = pci_write_config_dword(pdev, PCI_REG_NPKDSC, npkdsc); 43a0e7df33SAlexander Shishkin } 44a0e7df33SAlexander Shishkin 45a0e7df33SAlexander Shishkin if (err) 46a0e7df33SAlexander Shishkin dev_err(&pdev->dev, "failed to read NPKDSC register\n"); 47a0e7df33SAlexander Shishkin 48a0e7df33SAlexander Shishkin return err; 49a0e7df33SAlexander Shishkin } 50a0e7df33SAlexander Shishkin 51a0e7df33SAlexander Shishkin static void intel_th_pci_deactivate(struct intel_th *th) 52a0e7df33SAlexander Shishkin { 53a0e7df33SAlexander Shishkin struct pci_dev *pdev = to_pci_dev(th->dev); 54a0e7df33SAlexander Shishkin u32 npkdsc; 55a0e7df33SAlexander Shishkin int err; 56a0e7df33SAlexander Shishkin 57a0e7df33SAlexander Shishkin if (!INTEL_TH_CAP(th, tscu_enable)) 58a0e7df33SAlexander Shishkin return; 59a0e7df33SAlexander Shishkin 60a0e7df33SAlexander Shishkin err = pci_read_config_dword(pdev, PCI_REG_NPKDSC, &npkdsc); 61a0e7df33SAlexander Shishkin if (!err) { 62a0e7df33SAlexander Shishkin npkdsc |= NPKDSC_TSACT; 63a0e7df33SAlexander Shishkin err = pci_write_config_dword(pdev, PCI_REG_NPKDSC, npkdsc); 64a0e7df33SAlexander Shishkin } 65a0e7df33SAlexander Shishkin 66a0e7df33SAlexander Shishkin if (err) 67a0e7df33SAlexander Shishkin dev_err(&pdev->dev, "failed to read NPKDSC register\n"); 68a0e7df33SAlexander Shishkin } 69a0e7df33SAlexander Shishkin 702b0b16d3SAlexander Shishkin static int intel_th_pci_probe(struct pci_dev *pdev, 712b0b16d3SAlexander Shishkin const struct pci_device_id *id) 722b0b16d3SAlexander Shishkin { 73a525ed17SAlexander Shishkin const struct intel_th_drvdata *drvdata = (void *)id->driver_data; 747b7036d4SAlexander Shishkin struct resource resource[TH_MMIO_END + TH_NVEC_MAX] = { 75db73a059SAlexander Shishkin [TH_MMIO_CONFIG] = pdev->resource[TH_PCI_CONFIG_BAR], 76db73a059SAlexander Shishkin [TH_MMIO_SW] = pdev->resource[TH_PCI_STH_SW_BAR], 77db73a059SAlexander Shishkin }; 787b7036d4SAlexander Shishkin int err, r = TH_MMIO_SW + 1, i; 792b0b16d3SAlexander Shishkin struct intel_th *th; 802b0b16d3SAlexander Shishkin 812b0b16d3SAlexander Shishkin err = pcim_enable_device(pdev); 822b0b16d3SAlexander Shishkin if (err) 832b0b16d3SAlexander Shishkin return err; 842b0b16d3SAlexander Shishkin 85abbc299cSPhilipp Stanner err = pcim_request_all_regions(pdev, DRIVER_NAME); 862b0b16d3SAlexander Shishkin if (err) 872b0b16d3SAlexander Shishkin return err; 882b0b16d3SAlexander Shishkin 89abbc299cSPhilipp Stanner if (!pcim_iomap(pdev, TH_PCI_CONFIG_BAR, 0)) 90abbc299cSPhilipp Stanner return -ENOMEM; 91abbc299cSPhilipp Stanner 92abbc299cSPhilipp Stanner if (!pcim_iomap(pdev, TH_PCI_STH_SW_BAR, 0)) 93abbc299cSPhilipp Stanner return -ENOMEM; 94abbc299cSPhilipp Stanner 95fc027f4cSAlexander Shishkin if (pdev->resource[TH_PCI_RTIT_BAR].start) { 96fc027f4cSAlexander Shishkin resource[TH_MMIO_RTIT] = pdev->resource[TH_PCI_RTIT_BAR]; 97fc027f4cSAlexander Shishkin r++; 98fc027f4cSAlexander Shishkin } 99fc027f4cSAlexander Shishkin 1007b7036d4SAlexander Shishkin err = pci_alloc_irq_vectors(pdev, 1, 8, PCI_IRQ_ALL_TYPES); 1017b7036d4SAlexander Shishkin if (err > 0) 1027b7036d4SAlexander Shishkin for (i = 0; i < err; i++, r++) { 10362a59302SAlexander Shishkin resource[r].flags = IORESOURCE_IRQ; 1047b7036d4SAlexander Shishkin resource[r].start = pci_irq_vector(pdev, i); 10562a59302SAlexander Shishkin } 10662a59302SAlexander Shishkin 10762a59302SAlexander Shishkin th = intel_th_alloc(&pdev->dev, drvdata, resource, r); 108086c28abSChristophe JAILLET if (IS_ERR(th)) { 109086c28abSChristophe JAILLET err = PTR_ERR(th); 110086c28abSChristophe JAILLET goto err_free_irq; 111086c28abSChristophe JAILLET } 1122b0b16d3SAlexander Shishkin 113a0e7df33SAlexander Shishkin th->activate = intel_th_pci_activate; 114a0e7df33SAlexander Shishkin th->deactivate = intel_th_pci_deactivate; 115a0e7df33SAlexander Shishkin 116e9b2b3e7SAlexander Shishkin pci_set_master(pdev); 117e9b2b3e7SAlexander Shishkin 1182b0b16d3SAlexander Shishkin return 0; 119086c28abSChristophe JAILLET 120086c28abSChristophe JAILLET err_free_irq: 121086c28abSChristophe JAILLET pci_free_irq_vectors(pdev); 122086c28abSChristophe JAILLET return err; 1232b0b16d3SAlexander Shishkin } 1242b0b16d3SAlexander Shishkin 1252b0b16d3SAlexander Shishkin static void intel_th_pci_remove(struct pci_dev *pdev) 1262b0b16d3SAlexander Shishkin { 1272b0b16d3SAlexander Shishkin struct intel_th *th = pci_get_drvdata(pdev); 1282b0b16d3SAlexander Shishkin 1292b0b16d3SAlexander Shishkin intel_th_free(th); 1307b7036d4SAlexander Shishkin 1317b7036d4SAlexander Shishkin pci_free_irq_vectors(pdev); 1322b0b16d3SAlexander Shishkin } 1332b0b16d3SAlexander Shishkin 134397c7729SAlexander Shishkin static const struct intel_th_drvdata intel_th_1x_multi_is_broken = { 135397c7729SAlexander Shishkin .multi_is_broken = 1, 136397c7729SAlexander Shishkin }; 137397c7729SAlexander Shishkin 138a0e7df33SAlexander Shishkin static const struct intel_th_drvdata intel_th_2x = { 139a0e7df33SAlexander Shishkin .tscu_enable = 1, 1404c5bb6ebSAlexander Shishkin .has_mintctl = 1, 141a0e7df33SAlexander Shishkin }; 142a0e7df33SAlexander Shishkin 1432b0b16d3SAlexander Shishkin static const struct pci_device_id intel_th_pci_id_table[] = { 1442b0b16d3SAlexander Shishkin { 1452b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9d26), 1462b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1472b0b16d3SAlexander Shishkin }, 1482b0b16d3SAlexander Shishkin { 1492b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa126), 1502b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1512b0b16d3SAlexander Shishkin }, 1526396b912SAlexander Shishkin { 1536396b912SAlexander Shishkin /* Apollo Lake */ 1546396b912SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a8e), 1556396b912SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1566396b912SAlexander Shishkin }, 1573f040887SAlexander Shishkin { 1583f040887SAlexander Shishkin /* Broxton */ 1593f040887SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0a80), 1603f040887SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1613f040887SAlexander Shishkin }, 162aaa3ca82SAlexander Shishkin { 163aaa3ca82SAlexander Shishkin /* Broxton B-step */ 164aaa3ca82SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1a8e), 165aaa3ca82SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 166aaa3ca82SAlexander Shishkin }, 1677a1a47ceSAlexander Shishkin { 1687a1a47ceSAlexander Shishkin /* Kaby Lake PCH-H */ 1697a1a47ceSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa2a6), 170397c7729SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_1x_multi_is_broken, 1717a1a47ceSAlexander Shishkin }, 1725118ccd3SAlexander Shishkin { 1735118ccd3SAlexander Shishkin /* Denverton */ 1745118ccd3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x19e1), 1755118ccd3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1765118ccd3SAlexander Shishkin }, 177340837f9SAlexander Shishkin { 17824600840SAlexander Shishkin /* Lewisburg PCH */ 17924600840SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa1a6), 18024600840SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 18124600840SAlexander Shishkin }, 18224600840SAlexander Shishkin { 183164eb56eSAlexander Shishkin /* Lewisburg PCH */ 184164eb56eSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa226), 185164eb56eSAlexander Shishkin .driver_data = (kernel_ulong_t)0, 186164eb56eSAlexander Shishkin }, 187164eb56eSAlexander Shishkin { 188340837f9SAlexander Shishkin /* Gemini Lake */ 189340837f9SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x318e), 190a0e7df33SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 191340837f9SAlexander Shishkin }, 19284331e13SAlexander Shishkin { 19384331e13SAlexander Shishkin /* Cannon Lake H */ 19484331e13SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa326), 195a0e7df33SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 19684331e13SAlexander Shishkin }, 197efb3669eSAlexander Shishkin { 198efb3669eSAlexander Shishkin /* Cannon Lake LP */ 199efb3669eSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9da6), 200a0e7df33SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 201efb3669eSAlexander Shishkin }, 202920ce7c3SAlexander Shishkin { 203920ce7c3SAlexander Shishkin /* Cedar Fork PCH */ 204920ce7c3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x18e1), 205920ce7c3SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 206920ce7c3SAlexander Shishkin }, 20759d08d00SAlexander Shishkin { 20859d08d00SAlexander Shishkin /* Ice Lake PCH */ 20959d08d00SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x34a6), 21059d08d00SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 21159d08d00SAlexander Shishkin }, 212e60e9a4bSAlexander Shishkin { 213e60e9a4bSAlexander Shishkin /* Comet Lake */ 214e60e9a4bSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x02a6), 215e60e9a4bSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 216e60e9a4bSAlexander Shishkin }, 2174aa5aed2SAlexander Shishkin { 2183adbb571SAlexander Shishkin /* Comet Lake PCH */ 2193adbb571SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x06a6), 2203adbb571SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2213adbb571SAlexander Shishkin }, 2223adbb571SAlexander Shishkin { 223e4de2a5dSAlexander Shishkin /* Comet Lake PCH-V */ 224e4de2a5dSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa3a6), 225397c7729SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_1x_multi_is_broken, 226e4de2a5dSAlexander Shishkin }, 227e4de2a5dSAlexander Shishkin { 2284aa5aed2SAlexander Shishkin /* Ice Lake NNPI */ 2294aa5aed2SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5), 2304aa5aed2SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2314aa5aed2SAlexander Shishkin }, 2329c78255fSAlexander Shishkin { 2336a174342SAlexander Shishkin /* Ice Lake CPU */ 2346a174342SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8a29), 2356a174342SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2366a174342SAlexander Shishkin }, 2376a174342SAlexander Shishkin { 2386e6c18bcSAlexander Shishkin /* Tiger Lake CPU */ 2396e6c18bcSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9a33), 2406e6c18bcSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2416e6c18bcSAlexander Shishkin }, 2426e6c18bcSAlexander Shishkin { 2439c78255fSAlexander Shishkin /* Tiger Lake PCH */ 2449c78255fSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa0a6), 2459c78255fSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2469c78255fSAlexander Shishkin }, 2479d55499dSAlexander Shishkin { 2486227585dSAlexander Shishkin /* Tiger Lake PCH-H */ 2496227585dSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x43a6), 2506227585dSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2516227585dSAlexander Shishkin }, 2526227585dSAlexander Shishkin { 2539d55499dSAlexander Shishkin /* Jasper Lake PCH */ 2549d55499dSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), 2559d55499dSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2569d55499dSAlexander Shishkin }, 25788385866SAlexander Shishkin { 258203c1f61SAlexander Shishkin /* Jasper Lake CPU */ 259203c1f61SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4e29), 260203c1f61SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 261203c1f61SAlexander Shishkin }, 262203c1f61SAlexander Shishkin { 263add492d2SAlexander Shishkin /* Elkhart Lake CPU */ 264add492d2SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4529), 265add492d2SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 266add492d2SAlexander Shishkin }, 267add492d2SAlexander Shishkin { 26888385866SAlexander Shishkin /* Elkhart Lake */ 26988385866SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26), 27088385866SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 27188385866SAlexander Shishkin }, 272fd73d74aSAlexander Shishkin { 273fd73d74aSAlexander Shishkin /* Emmitsburg PCH */ 274fd73d74aSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1bcc), 275fd73d74aSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 276fd73d74aSAlexander Shishkin }, 277951e4d71SAlexander Shishkin { 278951e4d71SAlexander Shishkin /* Alder Lake */ 279951e4d71SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7aa6), 280951e4d71SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 281951e4d71SAlexander Shishkin }, 2829f126c56SAlexander Shishkin { 283cb5c681aSAlexander Shishkin /* Alder Lake-P */ 284cb5c681aSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x51a6), 285cb5c681aSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 286cb5c681aSAlexander Shishkin }, 287cb5c681aSAlexander Shishkin { 28848cb1753SAlexander Shishkin /* Alder Lake-M */ 28948cb1753SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x54a6), 29048cb1753SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 29148cb1753SAlexander Shishkin }, 29248cb1753SAlexander Shishkin { 293802a9a0bSAlexander Shishkin /* Meteor Lake-P */ 294802a9a0bSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7e24), 295802a9a0bSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 296802a9a0bSAlexander Shishkin }, 297802a9a0bSAlexander Shishkin { 298c4a30defSAlexander Shishkin /* Meteor Lake-S */ 299c4a30defSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7f26), 300c4a30defSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 301c4a30defSAlexander Shishkin }, 302c4a30defSAlexander Shishkin { 303a4f813c3SAlexander Shishkin /* Meteor Lake-S CPU */ 304a4f813c3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xae24), 305a4f813c3SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 306a4f813c3SAlexander Shishkin }, 307a4f813c3SAlexander Shishkin { 30823e2de58SAlexander Shishkin /* Raptor Lake-S */ 30923e2de58SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7a26), 31023e2de58SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 31123e2de58SAlexander Shishkin }, 31223e2de58SAlexander Shishkin { 313ff46a601SAlexander Shishkin /* Raptor Lake-S CPU */ 314ff46a601SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa76f), 315ff46a601SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 316ff46a601SAlexander Shishkin }, 317ff46a601SAlexander Shishkin { 318e4493788SAlexander Shishkin /* Granite Rapids */ 319e4493788SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0963), 320e4493788SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 321e4493788SAlexander Shishkin }, 322e4493788SAlexander Shishkin { 323854afe46SAlexander Shishkin /* Granite Rapids SOC */ 324854afe46SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3256), 325854afe46SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 326854afe46SAlexander Shishkin }, 327854afe46SAlexander Shishkin { 3282e1da7efSAlexander Shishkin /* Sapphire Rapids SOC */ 3292e1da7efSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3456), 3302e1da7efSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 3312e1da7efSAlexander Shishkin }, 3322e1da7efSAlexander Shishkin { 333f866b653SAlexander Shishkin /* Lunar Lake */ 334f866b653SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa824), 335f866b653SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 336f866b653SAlexander Shishkin }, 337f866b653SAlexander Shishkin { 338b5edccaeSPawel Chmielewski /* Arrow Lake */ 339b5edccaeSPawel Chmielewski PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7724), 340b5edccaeSPawel Chmielewski .driver_data = (kernel_ulong_t)&intel_th_2x, 341b5edccaeSPawel Chmielewski }, 342b5edccaeSPawel Chmielewski { 343*a70034d6SAlexander Shishkin /* Panther Lake-H */ 344*a70034d6SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe324), 345*a70034d6SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 346*a70034d6SAlexander Shishkin }, 347*a70034d6SAlexander Shishkin { 3489f126c56SAlexander Shishkin /* Alder Lake CPU */ 3499f126c56SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x466f), 3509f126c56SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 3519f126c56SAlexander Shishkin }, 3529f7f2a5eSAlexander Shishkin { 3539f7f2a5eSAlexander Shishkin /* Rocket Lake CPU */ 3549f7f2a5eSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4c19), 3559f7f2a5eSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 3569f7f2a5eSAlexander Shishkin }, 3572b0b16d3SAlexander Shishkin { 0 }, 3582b0b16d3SAlexander Shishkin }; 3592b0b16d3SAlexander Shishkin 3602b0b16d3SAlexander Shishkin MODULE_DEVICE_TABLE(pci, intel_th_pci_id_table); 3612b0b16d3SAlexander Shishkin 3622b0b16d3SAlexander Shishkin static struct pci_driver intel_th_pci_driver = { 3632b0b16d3SAlexander Shishkin .name = DRIVER_NAME, 3642b0b16d3SAlexander Shishkin .id_table = intel_th_pci_id_table, 3652b0b16d3SAlexander Shishkin .probe = intel_th_pci_probe, 3662b0b16d3SAlexander Shishkin .remove = intel_th_pci_remove, 3672b0b16d3SAlexander Shishkin }; 3682b0b16d3SAlexander Shishkin 3692b0b16d3SAlexander Shishkin module_pci_driver(intel_th_pci_driver); 3702b0b16d3SAlexander Shishkin 3712b0b16d3SAlexander Shishkin MODULE_LICENSE("GPL v2"); 3722b0b16d3SAlexander Shishkin MODULE_DESCRIPTION("Intel(R) Trace Hub PCI controller driver"); 3732b0b16d3SAlexander Shishkin MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@intel.com>"); 374