aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwtracing/intel_th/pci.c
diff options
context:
space:
mode:
authorAlexander Shishkin <alexander.shishkin@linux.intel.com>2019-05-03 11:44:40 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-05-03 18:14:30 +0200
commit7b7036d47c356a40818e516a69ac81a5dcc1613f (patch)
tree636c5602becf6d0a6c3e6b4f9d63049ffcfab63d /drivers/hwtracing/intel_th/pci.c
parentintel_th: Communicate IRQ via resource (diff)
downloadlinux-dev-7b7036d47c356a40818e516a69ac81a5dcc1613f.tar.xz
linux-dev-7b7036d47c356a40818e516a69ac81a5dcc1613f.zip
intel_th: pci: Use MSI interrupt signalling
Since Intel TH is capable of MSI interrupt signalling, make use of it. The way it works is, each of the 7 interrupt triggering events has its own vector in this mode, as opposed to interrupt line delivery, where all events are signalled via the same line. Failing to enable MSI, the driver falls back to using an interrupt line. Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hwtracing/intel_th/pci.c')
-rw-r--r--drivers/hwtracing/intel_th/pci.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c
index 03d6894cd9c9..f5643444481b 100644
--- a/drivers/hwtracing/intel_th/pci.c
+++ b/drivers/hwtracing/intel_th/pci.c
@@ -72,11 +72,11 @@ static int intel_th_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *id)
{
struct intel_th_drvdata *drvdata = (void *)id->driver_data;
- struct resource resource[TH_MMIO_END + 1] = {
+ struct resource resource[TH_MMIO_END + TH_NVEC_MAX] = {
[TH_MMIO_CONFIG] = pdev->resource[TH_PCI_CONFIG_BAR],
[TH_MMIO_SW] = pdev->resource[TH_PCI_STH_SW_BAR],
};
- int err, r = TH_MMIO_SW + 1;
+ int err, r = TH_MMIO_SW + 1, i;
struct intel_th *th;
err = pcim_enable_device(pdev);
@@ -92,10 +92,12 @@ static int intel_th_pci_probe(struct pci_dev *pdev,
r++;
}
- if (pdev->irq > 0) {
- resource[r].flags = IORESOURCE_IRQ;
- resource[r++].start = pdev->irq;
- }
+ err = pci_alloc_irq_vectors(pdev, 1, 8, PCI_IRQ_ALL_TYPES);
+ if (err > 0)
+ for (i = 0; i < err; i++, r++) {
+ resource[r].flags = IORESOURCE_IRQ;
+ resource[r].start = pci_irq_vector(pdev, i);
+ }
th = intel_th_alloc(&pdev->dev, drvdata, resource, r);
if (IS_ERR(th))
@@ -114,6 +116,8 @@ static void intel_th_pci_remove(struct pci_dev *pdev)
struct intel_th *th = pci_get_drvdata(pdev);
intel_th_free(th);
+
+ pci_free_irq_vectors(pdev);
}
static const struct intel_th_drvdata intel_th_2x = {