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 26db73a059SAlexander Shishkin #define BAR_MASK (BIT(TH_PCI_CONFIG_BAR) | BIT(TH_PCI_STH_SW_BAR)) 272b0b16d3SAlexander Shishkin 28a0e7df33SAlexander Shishkin #define PCI_REG_NPKDSC 0x80 29a0e7df33SAlexander Shishkin #define NPKDSC_TSACT BIT(5) 30a0e7df33SAlexander Shishkin 31a0e7df33SAlexander Shishkin static int intel_th_pci_activate(struct intel_th *th) 32a0e7df33SAlexander Shishkin { 33a0e7df33SAlexander Shishkin struct pci_dev *pdev = to_pci_dev(th->dev); 34a0e7df33SAlexander Shishkin u32 npkdsc; 35a0e7df33SAlexander Shishkin int err; 36a0e7df33SAlexander Shishkin 37a0e7df33SAlexander Shishkin if (!INTEL_TH_CAP(th, tscu_enable)) 38a0e7df33SAlexander Shishkin return 0; 39a0e7df33SAlexander Shishkin 40a0e7df33SAlexander Shishkin err = pci_read_config_dword(pdev, PCI_REG_NPKDSC, &npkdsc); 41a0e7df33SAlexander Shishkin if (!err) { 42a0e7df33SAlexander Shishkin npkdsc |= NPKDSC_TSACT; 43a0e7df33SAlexander Shishkin err = pci_write_config_dword(pdev, PCI_REG_NPKDSC, npkdsc); 44a0e7df33SAlexander Shishkin } 45a0e7df33SAlexander Shishkin 46a0e7df33SAlexander Shishkin if (err) 47a0e7df33SAlexander Shishkin dev_err(&pdev->dev, "failed to read NPKDSC register\n"); 48a0e7df33SAlexander Shishkin 49a0e7df33SAlexander Shishkin return err; 50a0e7df33SAlexander Shishkin } 51a0e7df33SAlexander Shishkin 52a0e7df33SAlexander Shishkin static void intel_th_pci_deactivate(struct intel_th *th) 53a0e7df33SAlexander Shishkin { 54a0e7df33SAlexander Shishkin struct pci_dev *pdev = to_pci_dev(th->dev); 55a0e7df33SAlexander Shishkin u32 npkdsc; 56a0e7df33SAlexander Shishkin int err; 57a0e7df33SAlexander Shishkin 58a0e7df33SAlexander Shishkin if (!INTEL_TH_CAP(th, tscu_enable)) 59a0e7df33SAlexander Shishkin return; 60a0e7df33SAlexander Shishkin 61a0e7df33SAlexander Shishkin err = pci_read_config_dword(pdev, PCI_REG_NPKDSC, &npkdsc); 62a0e7df33SAlexander Shishkin if (!err) { 63a0e7df33SAlexander Shishkin npkdsc |= NPKDSC_TSACT; 64a0e7df33SAlexander Shishkin err = pci_write_config_dword(pdev, PCI_REG_NPKDSC, npkdsc); 65a0e7df33SAlexander Shishkin } 66a0e7df33SAlexander Shishkin 67a0e7df33SAlexander Shishkin if (err) 68a0e7df33SAlexander Shishkin dev_err(&pdev->dev, "failed to read NPKDSC register\n"); 69a0e7df33SAlexander Shishkin } 70a0e7df33SAlexander Shishkin 712b0b16d3SAlexander Shishkin static int intel_th_pci_probe(struct pci_dev *pdev, 722b0b16d3SAlexander Shishkin const struct pci_device_id *id) 732b0b16d3SAlexander Shishkin { 74a525ed17SAlexander Shishkin const struct intel_th_drvdata *drvdata = (void *)id->driver_data; 757b7036d4SAlexander Shishkin struct resource resource[TH_MMIO_END + TH_NVEC_MAX] = { 76db73a059SAlexander Shishkin [TH_MMIO_CONFIG] = pdev->resource[TH_PCI_CONFIG_BAR], 77db73a059SAlexander Shishkin [TH_MMIO_SW] = pdev->resource[TH_PCI_STH_SW_BAR], 78db73a059SAlexander Shishkin }; 797b7036d4SAlexander Shishkin int err, r = TH_MMIO_SW + 1, i; 802b0b16d3SAlexander Shishkin struct intel_th *th; 812b0b16d3SAlexander Shishkin 822b0b16d3SAlexander Shishkin err = pcim_enable_device(pdev); 832b0b16d3SAlexander Shishkin if (err) 842b0b16d3SAlexander Shishkin return err; 852b0b16d3SAlexander Shishkin 862b0b16d3SAlexander Shishkin err = pcim_iomap_regions_request_all(pdev, BAR_MASK, DRIVER_NAME); 872b0b16d3SAlexander Shishkin if (err) 882b0b16d3SAlexander Shishkin return err; 892b0b16d3SAlexander Shishkin 90fc027f4cSAlexander Shishkin if (pdev->resource[TH_PCI_RTIT_BAR].start) { 91fc027f4cSAlexander Shishkin resource[TH_MMIO_RTIT] = pdev->resource[TH_PCI_RTIT_BAR]; 92fc027f4cSAlexander Shishkin r++; 93fc027f4cSAlexander Shishkin } 94fc027f4cSAlexander Shishkin 957b7036d4SAlexander Shishkin err = pci_alloc_irq_vectors(pdev, 1, 8, PCI_IRQ_ALL_TYPES); 967b7036d4SAlexander Shishkin if (err > 0) 977b7036d4SAlexander Shishkin for (i = 0; i < err; i++, r++) { 9862a59302SAlexander Shishkin resource[r].flags = IORESOURCE_IRQ; 997b7036d4SAlexander Shishkin resource[r].start = pci_irq_vector(pdev, i); 10062a59302SAlexander Shishkin } 10162a59302SAlexander Shishkin 10262a59302SAlexander Shishkin th = intel_th_alloc(&pdev->dev, drvdata, resource, r); 103086c28abSChristophe JAILLET if (IS_ERR(th)) { 104086c28abSChristophe JAILLET err = PTR_ERR(th); 105086c28abSChristophe JAILLET goto err_free_irq; 106086c28abSChristophe JAILLET } 1072b0b16d3SAlexander Shishkin 108a0e7df33SAlexander Shishkin th->activate = intel_th_pci_activate; 109a0e7df33SAlexander Shishkin th->deactivate = intel_th_pci_deactivate; 110a0e7df33SAlexander Shishkin 111e9b2b3e7SAlexander Shishkin pci_set_master(pdev); 112e9b2b3e7SAlexander Shishkin 1132b0b16d3SAlexander Shishkin return 0; 114086c28abSChristophe JAILLET 115086c28abSChristophe JAILLET err_free_irq: 116086c28abSChristophe JAILLET pci_free_irq_vectors(pdev); 117086c28abSChristophe JAILLET return err; 1182b0b16d3SAlexander Shishkin } 1192b0b16d3SAlexander Shishkin 1202b0b16d3SAlexander Shishkin static void intel_th_pci_remove(struct pci_dev *pdev) 1212b0b16d3SAlexander Shishkin { 1222b0b16d3SAlexander Shishkin struct intel_th *th = pci_get_drvdata(pdev); 1232b0b16d3SAlexander Shishkin 1242b0b16d3SAlexander Shishkin intel_th_free(th); 1257b7036d4SAlexander Shishkin 1267b7036d4SAlexander Shishkin pci_free_irq_vectors(pdev); 1272b0b16d3SAlexander Shishkin } 1282b0b16d3SAlexander Shishkin 129397c7729SAlexander Shishkin static const struct intel_th_drvdata intel_th_1x_multi_is_broken = { 130397c7729SAlexander Shishkin .multi_is_broken = 1, 131397c7729SAlexander Shishkin }; 132397c7729SAlexander Shishkin 133a0e7df33SAlexander Shishkin static const struct intel_th_drvdata intel_th_2x = { 134a0e7df33SAlexander Shishkin .tscu_enable = 1, 1354c5bb6ebSAlexander Shishkin .has_mintctl = 1, 136a0e7df33SAlexander Shishkin }; 137a0e7df33SAlexander Shishkin 1382b0b16d3SAlexander Shishkin static const struct pci_device_id intel_th_pci_id_table[] = { 1392b0b16d3SAlexander Shishkin { 1402b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9d26), 1412b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1422b0b16d3SAlexander Shishkin }, 1432b0b16d3SAlexander Shishkin { 1442b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa126), 1452b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1462b0b16d3SAlexander Shishkin }, 1476396b912SAlexander Shishkin { 1486396b912SAlexander Shishkin /* Apollo Lake */ 1496396b912SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a8e), 1506396b912SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1516396b912SAlexander Shishkin }, 1523f040887SAlexander Shishkin { 1533f040887SAlexander Shishkin /* Broxton */ 1543f040887SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0a80), 1553f040887SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1563f040887SAlexander Shishkin }, 157aaa3ca82SAlexander Shishkin { 158aaa3ca82SAlexander Shishkin /* Broxton B-step */ 159aaa3ca82SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1a8e), 160aaa3ca82SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 161aaa3ca82SAlexander Shishkin }, 1627a1a47ceSAlexander Shishkin { 1637a1a47ceSAlexander Shishkin /* Kaby Lake PCH-H */ 1647a1a47ceSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa2a6), 165397c7729SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_1x_multi_is_broken, 1667a1a47ceSAlexander Shishkin }, 1675118ccd3SAlexander Shishkin { 1685118ccd3SAlexander Shishkin /* Denverton */ 1695118ccd3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x19e1), 1705118ccd3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 1715118ccd3SAlexander Shishkin }, 172340837f9SAlexander Shishkin { 17324600840SAlexander Shishkin /* Lewisburg PCH */ 17424600840SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa1a6), 17524600840SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 17624600840SAlexander Shishkin }, 17724600840SAlexander Shishkin { 178164eb56eSAlexander Shishkin /* Lewisburg PCH */ 179164eb56eSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa226), 180164eb56eSAlexander Shishkin .driver_data = (kernel_ulong_t)0, 181164eb56eSAlexander Shishkin }, 182164eb56eSAlexander Shishkin { 183340837f9SAlexander Shishkin /* Gemini Lake */ 184340837f9SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x318e), 185a0e7df33SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 186340837f9SAlexander Shishkin }, 18784331e13SAlexander Shishkin { 18884331e13SAlexander Shishkin /* Cannon Lake H */ 18984331e13SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa326), 190a0e7df33SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 19184331e13SAlexander Shishkin }, 192efb3669eSAlexander Shishkin { 193efb3669eSAlexander Shishkin /* Cannon Lake LP */ 194efb3669eSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9da6), 195a0e7df33SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 196efb3669eSAlexander Shishkin }, 197920ce7c3SAlexander Shishkin { 198920ce7c3SAlexander Shishkin /* Cedar Fork PCH */ 199920ce7c3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x18e1), 200920ce7c3SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 201920ce7c3SAlexander Shishkin }, 20259d08d00SAlexander Shishkin { 20359d08d00SAlexander Shishkin /* Ice Lake PCH */ 20459d08d00SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x34a6), 20559d08d00SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 20659d08d00SAlexander Shishkin }, 207e60e9a4bSAlexander Shishkin { 208e60e9a4bSAlexander Shishkin /* Comet Lake */ 209e60e9a4bSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x02a6), 210e60e9a4bSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 211e60e9a4bSAlexander Shishkin }, 2124aa5aed2SAlexander Shishkin { 2133adbb571SAlexander Shishkin /* Comet Lake PCH */ 2143adbb571SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x06a6), 2153adbb571SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2163adbb571SAlexander Shishkin }, 2173adbb571SAlexander Shishkin { 218e4de2a5dSAlexander Shishkin /* Comet Lake PCH-V */ 219e4de2a5dSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa3a6), 220397c7729SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_1x_multi_is_broken, 221e4de2a5dSAlexander Shishkin }, 222e4de2a5dSAlexander Shishkin { 2234aa5aed2SAlexander Shishkin /* Ice Lake NNPI */ 2244aa5aed2SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5), 2254aa5aed2SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2264aa5aed2SAlexander Shishkin }, 2279c78255fSAlexander Shishkin { 2286a174342SAlexander Shishkin /* Ice Lake CPU */ 2296a174342SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8a29), 2306a174342SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2316a174342SAlexander Shishkin }, 2326a174342SAlexander Shishkin { 2336e6c18bcSAlexander Shishkin /* Tiger Lake CPU */ 2346e6c18bcSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9a33), 2356e6c18bcSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2366e6c18bcSAlexander Shishkin }, 2376e6c18bcSAlexander Shishkin { 2389c78255fSAlexander Shishkin /* Tiger Lake PCH */ 2399c78255fSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa0a6), 2409c78255fSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2419c78255fSAlexander Shishkin }, 2429d55499dSAlexander Shishkin { 2436227585dSAlexander Shishkin /* Tiger Lake PCH-H */ 2446227585dSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x43a6), 2456227585dSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2466227585dSAlexander Shishkin }, 2476227585dSAlexander Shishkin { 2489d55499dSAlexander Shishkin /* Jasper Lake PCH */ 2499d55499dSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), 2509d55499dSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 2519d55499dSAlexander Shishkin }, 25288385866SAlexander Shishkin { 253203c1f61SAlexander Shishkin /* Jasper Lake CPU */ 254203c1f61SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4e29), 255203c1f61SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 256203c1f61SAlexander Shishkin }, 257203c1f61SAlexander Shishkin { 258add492d2SAlexander Shishkin /* Elkhart Lake CPU */ 259add492d2SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4529), 260add492d2SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 261add492d2SAlexander Shishkin }, 262add492d2SAlexander Shishkin { 26388385866SAlexander Shishkin /* Elkhart Lake */ 26488385866SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26), 26588385866SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 26688385866SAlexander Shishkin }, 267fd73d74aSAlexander Shishkin { 268fd73d74aSAlexander Shishkin /* Emmitsburg PCH */ 269fd73d74aSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1bcc), 270fd73d74aSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 271fd73d74aSAlexander Shishkin }, 272951e4d71SAlexander Shishkin { 273951e4d71SAlexander Shishkin /* Alder Lake */ 274951e4d71SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7aa6), 275951e4d71SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 276951e4d71SAlexander Shishkin }, 2779f126c56SAlexander Shishkin { 278cb5c681aSAlexander Shishkin /* Alder Lake-P */ 279cb5c681aSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x51a6), 280cb5c681aSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 281cb5c681aSAlexander Shishkin }, 282cb5c681aSAlexander Shishkin { 28348cb1753SAlexander Shishkin /* Alder Lake-M */ 28448cb1753SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x54a6), 28548cb1753SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 28648cb1753SAlexander Shishkin }, 28748cb1753SAlexander Shishkin { 288802a9a0bSAlexander Shishkin /* Meteor Lake-P */ 289802a9a0bSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7e24), 290802a9a0bSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 291802a9a0bSAlexander Shishkin }, 292802a9a0bSAlexander Shishkin { 293c4a30defSAlexander Shishkin /* Meteor Lake-S */ 294c4a30defSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7f26), 295c4a30defSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 296c4a30defSAlexander Shishkin }, 297c4a30defSAlexander Shishkin { 298a4f813c3SAlexander Shishkin /* Meteor Lake-S CPU */ 299a4f813c3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xae24), 300a4f813c3SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 301a4f813c3SAlexander Shishkin }, 302a4f813c3SAlexander Shishkin { 30323e2de58SAlexander Shishkin /* Raptor Lake-S */ 30423e2de58SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7a26), 30523e2de58SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 30623e2de58SAlexander Shishkin }, 30723e2de58SAlexander Shishkin { 308ff46a601SAlexander Shishkin /* Raptor Lake-S CPU */ 309ff46a601SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa76f), 310ff46a601SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 311ff46a601SAlexander Shishkin }, 312ff46a601SAlexander Shishkin { 313e4493788SAlexander Shishkin /* Granite Rapids */ 314e4493788SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0963), 315e4493788SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 316e4493788SAlexander Shishkin }, 317e4493788SAlexander Shishkin { 318854afe46SAlexander Shishkin /* Granite Rapids SOC */ 319854afe46SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3256), 320854afe46SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 321854afe46SAlexander Shishkin }, 322854afe46SAlexander Shishkin { 3232e1da7efSAlexander Shishkin /* Sapphire Rapids SOC */ 3242e1da7efSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3456), 3252e1da7efSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 3262e1da7efSAlexander Shishkin }, 3272e1da7efSAlexander Shishkin { 328*f866b653SAlexander Shishkin /* Lunar Lake */ 329*f866b653SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa824), 330*f866b653SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 331*f866b653SAlexander Shishkin }, 332*f866b653SAlexander Shishkin { 3339f126c56SAlexander Shishkin /* Alder Lake CPU */ 3349f126c56SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x466f), 3359f126c56SAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 3369f126c56SAlexander Shishkin }, 3379f7f2a5eSAlexander Shishkin { 3389f7f2a5eSAlexander Shishkin /* Rocket Lake CPU */ 3399f7f2a5eSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4c19), 3409f7f2a5eSAlexander Shishkin .driver_data = (kernel_ulong_t)&intel_th_2x, 3419f7f2a5eSAlexander Shishkin }, 3422b0b16d3SAlexander Shishkin { 0 }, 3432b0b16d3SAlexander Shishkin }; 3442b0b16d3SAlexander Shishkin 3452b0b16d3SAlexander Shishkin MODULE_DEVICE_TABLE(pci, intel_th_pci_id_table); 3462b0b16d3SAlexander Shishkin 3472b0b16d3SAlexander Shishkin static struct pci_driver intel_th_pci_driver = { 3482b0b16d3SAlexander Shishkin .name = DRIVER_NAME, 3492b0b16d3SAlexander Shishkin .id_table = intel_th_pci_id_table, 3502b0b16d3SAlexander Shishkin .probe = intel_th_pci_probe, 3512b0b16d3SAlexander Shishkin .remove = intel_th_pci_remove, 3522b0b16d3SAlexander Shishkin }; 3532b0b16d3SAlexander Shishkin 3542b0b16d3SAlexander Shishkin module_pci_driver(intel_th_pci_driver); 3552b0b16d3SAlexander Shishkin 3562b0b16d3SAlexander Shishkin MODULE_LICENSE("GPL v2"); 3572b0b16d3SAlexander Shishkin MODULE_DESCRIPTION("Intel(R) Trace Hub PCI controller driver"); 3582b0b16d3SAlexander Shishkin MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@intel.com>"); 359