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