12b0b16d3SAlexander Shishkin /* 22b0b16d3SAlexander Shishkin * Intel(R) Trace Hub pci driver 32b0b16d3SAlexander Shishkin * 42b0b16d3SAlexander Shishkin * Copyright (C) 2014-2015 Intel Corporation. 52b0b16d3SAlexander Shishkin * 62b0b16d3SAlexander Shishkin * This program is free software; you can redistribute it and/or modify it 72b0b16d3SAlexander Shishkin * under the terms and conditions of the GNU General Public License, 82b0b16d3SAlexander Shishkin * version 2, as published by the Free Software Foundation. 92b0b16d3SAlexander Shishkin * 102b0b16d3SAlexander Shishkin * This program is distributed in the hope it will be useful, but WITHOUT 112b0b16d3SAlexander Shishkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 122b0b16d3SAlexander Shishkin * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 132b0b16d3SAlexander Shishkin * more details. 142b0b16d3SAlexander Shishkin */ 152b0b16d3SAlexander Shishkin 162b0b16d3SAlexander Shishkin #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 172b0b16d3SAlexander Shishkin 182b0b16d3SAlexander Shishkin #include <linux/types.h> 192b0b16d3SAlexander Shishkin #include <linux/module.h> 202b0b16d3SAlexander Shishkin #include <linux/device.h> 212b0b16d3SAlexander Shishkin #include <linux/sysfs.h> 222b0b16d3SAlexander Shishkin #include <linux/pci.h> 232b0b16d3SAlexander Shishkin 242b0b16d3SAlexander Shishkin #include "intel_th.h" 252b0b16d3SAlexander Shishkin 262b0b16d3SAlexander Shishkin #define DRIVER_NAME "intel_th_pci" 272b0b16d3SAlexander Shishkin 282b0b16d3SAlexander Shishkin #define BAR_MASK (BIT(TH_MMIO_CONFIG) | BIT(TH_MMIO_SW)) 292b0b16d3SAlexander Shishkin 302b0b16d3SAlexander Shishkin static int intel_th_pci_probe(struct pci_dev *pdev, 312b0b16d3SAlexander Shishkin const struct pci_device_id *id) 322b0b16d3SAlexander Shishkin { 332b0b16d3SAlexander Shishkin struct intel_th *th; 342b0b16d3SAlexander Shishkin int err; 352b0b16d3SAlexander Shishkin 362b0b16d3SAlexander Shishkin err = pcim_enable_device(pdev); 372b0b16d3SAlexander Shishkin if (err) 382b0b16d3SAlexander Shishkin return err; 392b0b16d3SAlexander Shishkin 402b0b16d3SAlexander Shishkin err = pcim_iomap_regions_request_all(pdev, BAR_MASK, DRIVER_NAME); 412b0b16d3SAlexander Shishkin if (err) 422b0b16d3SAlexander Shishkin return err; 432b0b16d3SAlexander Shishkin 442b0b16d3SAlexander Shishkin th = intel_th_alloc(&pdev->dev, pdev->resource, 452b0b16d3SAlexander Shishkin DEVICE_COUNT_RESOURCE, pdev->irq); 462b0b16d3SAlexander Shishkin if (IS_ERR(th)) 472b0b16d3SAlexander Shishkin return PTR_ERR(th); 482b0b16d3SAlexander Shishkin 49e9b2b3e7SAlexander Shishkin pci_set_master(pdev); 50e9b2b3e7SAlexander Shishkin 512b0b16d3SAlexander Shishkin return 0; 522b0b16d3SAlexander Shishkin } 532b0b16d3SAlexander Shishkin 542b0b16d3SAlexander Shishkin static void intel_th_pci_remove(struct pci_dev *pdev) 552b0b16d3SAlexander Shishkin { 562b0b16d3SAlexander Shishkin struct intel_th *th = pci_get_drvdata(pdev); 572b0b16d3SAlexander Shishkin 582b0b16d3SAlexander Shishkin intel_th_free(th); 592b0b16d3SAlexander Shishkin } 602b0b16d3SAlexander Shishkin 612b0b16d3SAlexander Shishkin static const struct pci_device_id intel_th_pci_id_table[] = { 622b0b16d3SAlexander Shishkin { 632b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9d26), 642b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 652b0b16d3SAlexander Shishkin }, 662b0b16d3SAlexander Shishkin { 672b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa126), 682b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 692b0b16d3SAlexander Shishkin }, 706396b912SAlexander Shishkin { 716396b912SAlexander Shishkin /* Apollo Lake */ 726396b912SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a8e), 736396b912SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 746396b912SAlexander Shishkin }, 753f040887SAlexander Shishkin { 763f040887SAlexander Shishkin /* Broxton */ 773f040887SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0a80), 783f040887SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 793f040887SAlexander Shishkin }, 80aaa3ca82SAlexander Shishkin { 81aaa3ca82SAlexander Shishkin /* Broxton B-step */ 82aaa3ca82SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1a8e), 83aaa3ca82SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 84aaa3ca82SAlexander Shishkin }, 857a1a47ceSAlexander Shishkin { 867a1a47ceSAlexander Shishkin /* Kaby Lake PCH-H */ 877a1a47ceSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa2a6), 887a1a47ceSAlexander Shishkin .driver_data = (kernel_ulong_t)0, 897a1a47ceSAlexander Shishkin }, 905118ccd3SAlexander Shishkin { 915118ccd3SAlexander Shishkin /* Denverton */ 925118ccd3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x19e1), 935118ccd3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 945118ccd3SAlexander Shishkin }, 95340837f9SAlexander Shishkin { 96340837f9SAlexander Shishkin /* Gemini Lake */ 97340837f9SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x318e), 98340837f9SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 99340837f9SAlexander Shishkin }, 10084331e13SAlexander Shishkin { 10184331e13SAlexander Shishkin /* Cannon Lake H */ 10284331e13SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa326), 10384331e13SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 10484331e13SAlexander Shishkin }, 105*efb3669eSAlexander Shishkin { 106*efb3669eSAlexander Shishkin /* Cannon Lake LP */ 107*efb3669eSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9da6), 108*efb3669eSAlexander Shishkin .driver_data = (kernel_ulong_t)0, 109*efb3669eSAlexander Shishkin }, 1102b0b16d3SAlexander Shishkin { 0 }, 1112b0b16d3SAlexander Shishkin }; 1122b0b16d3SAlexander Shishkin 1132b0b16d3SAlexander Shishkin MODULE_DEVICE_TABLE(pci, intel_th_pci_id_table); 1142b0b16d3SAlexander Shishkin 1152b0b16d3SAlexander Shishkin static struct pci_driver intel_th_pci_driver = { 1162b0b16d3SAlexander Shishkin .name = DRIVER_NAME, 1172b0b16d3SAlexander Shishkin .id_table = intel_th_pci_id_table, 1182b0b16d3SAlexander Shishkin .probe = intel_th_pci_probe, 1192b0b16d3SAlexander Shishkin .remove = intel_th_pci_remove, 1202b0b16d3SAlexander Shishkin }; 1212b0b16d3SAlexander Shishkin 1222b0b16d3SAlexander Shishkin module_pci_driver(intel_th_pci_driver); 1232b0b16d3SAlexander Shishkin 1242b0b16d3SAlexander Shishkin MODULE_LICENSE("GPL v2"); 1252b0b16d3SAlexander Shishkin MODULE_DESCRIPTION("Intel(R) Trace Hub PCI controller driver"); 1262b0b16d3SAlexander Shishkin MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@intel.com>"); 127