18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Intel(R) Trace Hub pci driver 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2014-2015 Intel Corporation. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/types.h> 118c2ecf20Sopenharmony_ci#include <linux/module.h> 128c2ecf20Sopenharmony_ci#include <linux/device.h> 138c2ecf20Sopenharmony_ci#include <linux/sysfs.h> 148c2ecf20Sopenharmony_ci#include <linux/pci.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include "intel_th.h" 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define DRIVER_NAME "intel_th_pci" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cienum { 218c2ecf20Sopenharmony_ci TH_PCI_CONFIG_BAR = 0, 228c2ecf20Sopenharmony_ci TH_PCI_STH_SW_BAR = 2, 238c2ecf20Sopenharmony_ci TH_PCI_RTIT_BAR = 4, 248c2ecf20Sopenharmony_ci}; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define BAR_MASK (BIT(TH_PCI_CONFIG_BAR) | BIT(TH_PCI_STH_SW_BAR)) 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define PCI_REG_NPKDSC 0x80 298c2ecf20Sopenharmony_ci#define NPKDSC_TSACT BIT(5) 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic int intel_th_pci_activate(struct intel_th *th) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci struct pci_dev *pdev = to_pci_dev(th->dev); 348c2ecf20Sopenharmony_ci u32 npkdsc; 358c2ecf20Sopenharmony_ci int err; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci if (!INTEL_TH_CAP(th, tscu_enable)) 388c2ecf20Sopenharmony_ci return 0; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci err = pci_read_config_dword(pdev, PCI_REG_NPKDSC, &npkdsc); 418c2ecf20Sopenharmony_ci if (!err) { 428c2ecf20Sopenharmony_ci npkdsc |= NPKDSC_TSACT; 438c2ecf20Sopenharmony_ci err = pci_write_config_dword(pdev, PCI_REG_NPKDSC, npkdsc); 448c2ecf20Sopenharmony_ci } 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci if (err) 478c2ecf20Sopenharmony_ci dev_err(&pdev->dev, "failed to read NPKDSC register\n"); 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci return err; 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistatic void intel_th_pci_deactivate(struct intel_th *th) 538c2ecf20Sopenharmony_ci{ 548c2ecf20Sopenharmony_ci struct pci_dev *pdev = to_pci_dev(th->dev); 558c2ecf20Sopenharmony_ci u32 npkdsc; 568c2ecf20Sopenharmony_ci int err; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci if (!INTEL_TH_CAP(th, tscu_enable)) 598c2ecf20Sopenharmony_ci return; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci err = pci_read_config_dword(pdev, PCI_REG_NPKDSC, &npkdsc); 628c2ecf20Sopenharmony_ci if (!err) { 638c2ecf20Sopenharmony_ci npkdsc |= NPKDSC_TSACT; 648c2ecf20Sopenharmony_ci err = pci_write_config_dword(pdev, PCI_REG_NPKDSC, npkdsc); 658c2ecf20Sopenharmony_ci } 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci if (err) 688c2ecf20Sopenharmony_ci dev_err(&pdev->dev, "failed to read NPKDSC register\n"); 698c2ecf20Sopenharmony_ci} 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_cistatic int intel_th_pci_probe(struct pci_dev *pdev, 728c2ecf20Sopenharmony_ci const struct pci_device_id *id) 738c2ecf20Sopenharmony_ci{ 748c2ecf20Sopenharmony_ci struct intel_th_drvdata *drvdata = (void *)id->driver_data; 758c2ecf20Sopenharmony_ci struct resource resource[TH_MMIO_END + TH_NVEC_MAX] = { 768c2ecf20Sopenharmony_ci [TH_MMIO_CONFIG] = pdev->resource[TH_PCI_CONFIG_BAR], 778c2ecf20Sopenharmony_ci [TH_MMIO_SW] = pdev->resource[TH_PCI_STH_SW_BAR], 788c2ecf20Sopenharmony_ci }; 798c2ecf20Sopenharmony_ci int err, r = TH_MMIO_SW + 1, i; 808c2ecf20Sopenharmony_ci struct intel_th *th; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci err = pcim_enable_device(pdev); 838c2ecf20Sopenharmony_ci if (err) 848c2ecf20Sopenharmony_ci return err; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci err = pcim_iomap_regions_request_all(pdev, BAR_MASK, DRIVER_NAME); 878c2ecf20Sopenharmony_ci if (err) 888c2ecf20Sopenharmony_ci return err; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci if (pdev->resource[TH_PCI_RTIT_BAR].start) { 918c2ecf20Sopenharmony_ci resource[TH_MMIO_RTIT] = pdev->resource[TH_PCI_RTIT_BAR]; 928c2ecf20Sopenharmony_ci r++; 938c2ecf20Sopenharmony_ci } 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci err = pci_alloc_irq_vectors(pdev, 1, 8, PCI_IRQ_ALL_TYPES); 968c2ecf20Sopenharmony_ci if (err > 0) 978c2ecf20Sopenharmony_ci for (i = 0; i < err; i++, r++) { 988c2ecf20Sopenharmony_ci resource[r].flags = IORESOURCE_IRQ; 998c2ecf20Sopenharmony_ci resource[r].start = pci_irq_vector(pdev, i); 1008c2ecf20Sopenharmony_ci } 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci th = intel_th_alloc(&pdev->dev, drvdata, resource, r); 1038c2ecf20Sopenharmony_ci if (IS_ERR(th)) { 1048c2ecf20Sopenharmony_ci err = PTR_ERR(th); 1058c2ecf20Sopenharmony_ci goto err_free_irq; 1068c2ecf20Sopenharmony_ci } 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci th->activate = intel_th_pci_activate; 1098c2ecf20Sopenharmony_ci th->deactivate = intel_th_pci_deactivate; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci pci_set_master(pdev); 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci return 0; 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_cierr_free_irq: 1168c2ecf20Sopenharmony_ci pci_free_irq_vectors(pdev); 1178c2ecf20Sopenharmony_ci return err; 1188c2ecf20Sopenharmony_ci} 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_cistatic void intel_th_pci_remove(struct pci_dev *pdev) 1218c2ecf20Sopenharmony_ci{ 1228c2ecf20Sopenharmony_ci struct intel_th *th = pci_get_drvdata(pdev); 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci intel_th_free(th); 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci pci_free_irq_vectors(pdev); 1278c2ecf20Sopenharmony_ci} 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_cistatic const struct intel_th_drvdata intel_th_1x_multi_is_broken = { 1308c2ecf20Sopenharmony_ci .multi_is_broken = 1, 1318c2ecf20Sopenharmony_ci}; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistatic const struct intel_th_drvdata intel_th_2x = { 1348c2ecf20Sopenharmony_ci .tscu_enable = 1, 1358c2ecf20Sopenharmony_ci .has_mintctl = 1, 1368c2ecf20Sopenharmony_ci}; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_cistatic const struct pci_device_id intel_th_pci_id_table[] = { 1398c2ecf20Sopenharmony_ci { 1408c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9d26), 1418c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)0, 1428c2ecf20Sopenharmony_ci }, 1438c2ecf20Sopenharmony_ci { 1448c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa126), 1458c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)0, 1468c2ecf20Sopenharmony_ci }, 1478c2ecf20Sopenharmony_ci { 1488c2ecf20Sopenharmony_ci /* Apollo Lake */ 1498c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a8e), 1508c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)0, 1518c2ecf20Sopenharmony_ci }, 1528c2ecf20Sopenharmony_ci { 1538c2ecf20Sopenharmony_ci /* Broxton */ 1548c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0a80), 1558c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)0, 1568c2ecf20Sopenharmony_ci }, 1578c2ecf20Sopenharmony_ci { 1588c2ecf20Sopenharmony_ci /* Broxton B-step */ 1598c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1a8e), 1608c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)0, 1618c2ecf20Sopenharmony_ci }, 1628c2ecf20Sopenharmony_ci { 1638c2ecf20Sopenharmony_ci /* Kaby Lake PCH-H */ 1648c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa2a6), 1658c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_1x_multi_is_broken, 1668c2ecf20Sopenharmony_ci }, 1678c2ecf20Sopenharmony_ci { 1688c2ecf20Sopenharmony_ci /* Denverton */ 1698c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x19e1), 1708c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)0, 1718c2ecf20Sopenharmony_ci }, 1728c2ecf20Sopenharmony_ci { 1738c2ecf20Sopenharmony_ci /* Lewisburg PCH */ 1748c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa1a6), 1758c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)0, 1768c2ecf20Sopenharmony_ci }, 1778c2ecf20Sopenharmony_ci { 1788c2ecf20Sopenharmony_ci /* Lewisburg PCH */ 1798c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa226), 1808c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)0, 1818c2ecf20Sopenharmony_ci }, 1828c2ecf20Sopenharmony_ci { 1838c2ecf20Sopenharmony_ci /* Gemini Lake */ 1848c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x318e), 1858c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 1868c2ecf20Sopenharmony_ci }, 1878c2ecf20Sopenharmony_ci { 1888c2ecf20Sopenharmony_ci /* Cannon Lake H */ 1898c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa326), 1908c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 1918c2ecf20Sopenharmony_ci }, 1928c2ecf20Sopenharmony_ci { 1938c2ecf20Sopenharmony_ci /* Cannon Lake LP */ 1948c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9da6), 1958c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 1968c2ecf20Sopenharmony_ci }, 1978c2ecf20Sopenharmony_ci { 1988c2ecf20Sopenharmony_ci /* Cedar Fork PCH */ 1998c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x18e1), 2008c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2018c2ecf20Sopenharmony_ci }, 2028c2ecf20Sopenharmony_ci { 2038c2ecf20Sopenharmony_ci /* Ice Lake PCH */ 2048c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x34a6), 2058c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2068c2ecf20Sopenharmony_ci }, 2078c2ecf20Sopenharmony_ci { 2088c2ecf20Sopenharmony_ci /* Comet Lake */ 2098c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x02a6), 2108c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2118c2ecf20Sopenharmony_ci }, 2128c2ecf20Sopenharmony_ci { 2138c2ecf20Sopenharmony_ci /* Comet Lake PCH */ 2148c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x06a6), 2158c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2168c2ecf20Sopenharmony_ci }, 2178c2ecf20Sopenharmony_ci { 2188c2ecf20Sopenharmony_ci /* Comet Lake PCH-V */ 2198c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa3a6), 2208c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_1x_multi_is_broken, 2218c2ecf20Sopenharmony_ci }, 2228c2ecf20Sopenharmony_ci { 2238c2ecf20Sopenharmony_ci /* Ice Lake NNPI */ 2248c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5), 2258c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2268c2ecf20Sopenharmony_ci }, 2278c2ecf20Sopenharmony_ci { 2288c2ecf20Sopenharmony_ci /* Ice Lake CPU */ 2298c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8a29), 2308c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2318c2ecf20Sopenharmony_ci }, 2328c2ecf20Sopenharmony_ci { 2338c2ecf20Sopenharmony_ci /* Tiger Lake CPU */ 2348c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9a33), 2358c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2368c2ecf20Sopenharmony_ci }, 2378c2ecf20Sopenharmony_ci { 2388c2ecf20Sopenharmony_ci /* Tiger Lake PCH */ 2398c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa0a6), 2408c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2418c2ecf20Sopenharmony_ci }, 2428c2ecf20Sopenharmony_ci { 2438c2ecf20Sopenharmony_ci /* Tiger Lake PCH-H */ 2448c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x43a6), 2458c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2468c2ecf20Sopenharmony_ci }, 2478c2ecf20Sopenharmony_ci { 2488c2ecf20Sopenharmony_ci /* Jasper Lake PCH */ 2498c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), 2508c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2518c2ecf20Sopenharmony_ci }, 2528c2ecf20Sopenharmony_ci { 2538c2ecf20Sopenharmony_ci /* Jasper Lake CPU */ 2548c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4e29), 2558c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2568c2ecf20Sopenharmony_ci }, 2578c2ecf20Sopenharmony_ci { 2588c2ecf20Sopenharmony_ci /* Elkhart Lake CPU */ 2598c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4529), 2608c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2618c2ecf20Sopenharmony_ci }, 2628c2ecf20Sopenharmony_ci { 2638c2ecf20Sopenharmony_ci /* Elkhart Lake */ 2648c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26), 2658c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2668c2ecf20Sopenharmony_ci }, 2678c2ecf20Sopenharmony_ci { 2688c2ecf20Sopenharmony_ci /* Emmitsburg PCH */ 2698c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1bcc), 2708c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2718c2ecf20Sopenharmony_ci }, 2728c2ecf20Sopenharmony_ci { 2738c2ecf20Sopenharmony_ci /* Alder Lake */ 2748c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7aa6), 2758c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2768c2ecf20Sopenharmony_ci }, 2778c2ecf20Sopenharmony_ci { 2788c2ecf20Sopenharmony_ci /* Alder Lake-P */ 2798c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x51a6), 2808c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2818c2ecf20Sopenharmony_ci }, 2828c2ecf20Sopenharmony_ci { 2838c2ecf20Sopenharmony_ci /* Alder Lake-M */ 2848c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x54a6), 2858c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2868c2ecf20Sopenharmony_ci }, 2878c2ecf20Sopenharmony_ci { 2888c2ecf20Sopenharmony_ci /* Meteor Lake-P */ 2898c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7e24), 2908c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2918c2ecf20Sopenharmony_ci }, 2928c2ecf20Sopenharmony_ci { 2938c2ecf20Sopenharmony_ci /* Raptor Lake-S */ 2948c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7a26), 2958c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 2968c2ecf20Sopenharmony_ci }, 2978c2ecf20Sopenharmony_ci { 2988c2ecf20Sopenharmony_ci /* Raptor Lake-S CPU */ 2998c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa76f), 3008c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 3018c2ecf20Sopenharmony_ci }, 3028c2ecf20Sopenharmony_ci { 3038c2ecf20Sopenharmony_ci /* Alder Lake CPU */ 3048c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x466f), 3058c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 3068c2ecf20Sopenharmony_ci }, 3078c2ecf20Sopenharmony_ci { 3088c2ecf20Sopenharmony_ci /* Rocket Lake CPU */ 3098c2ecf20Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4c19), 3108c2ecf20Sopenharmony_ci .driver_data = (kernel_ulong_t)&intel_th_2x, 3118c2ecf20Sopenharmony_ci }, 3128c2ecf20Sopenharmony_ci { 0 }, 3138c2ecf20Sopenharmony_ci}; 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(pci, intel_th_pci_id_table); 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_cistatic struct pci_driver intel_th_pci_driver = { 3188c2ecf20Sopenharmony_ci .name = DRIVER_NAME, 3198c2ecf20Sopenharmony_ci .id_table = intel_th_pci_id_table, 3208c2ecf20Sopenharmony_ci .probe = intel_th_pci_probe, 3218c2ecf20Sopenharmony_ci .remove = intel_th_pci_remove, 3228c2ecf20Sopenharmony_ci}; 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_cimodule_pci_driver(intel_th_pci_driver); 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 3278c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Intel(R) Trace Hub PCI controller driver"); 3288c2ecf20Sopenharmony_ciMODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@intel.com>"); 329