In some versions of Intel TH, the Software Trace Hub (STH) has a second
MMIO BAR dedicated to the input from Intel PT. This calls for a new
subdevice that will be enumerated if the corresponding BAR is present.

Signed-off-by: Alexander Shishkin <[email protected]>
---
 drivers/hwtracing/intel_th/core.c     | 18 ++++++++++++++++++
 drivers/hwtracing/intel_th/intel_th.h |  1 +
 drivers/hwtracing/intel_th/pci.c      | 11 ++++++++---
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/hwtracing/intel_th/core.c 
b/drivers/hwtracing/intel_th/core.c
index 8c221e1ed12d..a0b8b0182daa 100644
--- a/drivers/hwtracing/intel_th/core.c
+++ b/drivers/hwtracing/intel_th/core.c
@@ -500,6 +500,24 @@ static const struct intel_th_subdevice {
                .name   = "sth",
                .type   = INTEL_TH_SOURCE,
        },
+       {
+               .nres   = 2,
+               .res    = {
+                       {
+                               .start  = REG_STH_OFFSET,
+                               .end    = REG_STH_OFFSET + REG_STH_LENGTH - 1,
+                               .flags  = IORESOURCE_MEM,
+                       },
+                       {
+                               .start  = TH_MMIO_RTIT,
+                               .end    = 0,
+                               .flags  = IORESOURCE_MEM,
+                       },
+               },
+               .id     = -1,
+               .name   = "rtit",
+               .type   = INTEL_TH_SOURCE,
+       },
        {
                .nres   = 1,
                .res    = {
diff --git a/drivers/hwtracing/intel_th/intel_th.h 
b/drivers/hwtracing/intel_th/intel_th.h
index 8c90c8d01867..3fca86d78fdd 100644
--- a/drivers/hwtracing/intel_th/intel_th.h
+++ b/drivers/hwtracing/intel_th/intel_th.h
@@ -228,6 +228,7 @@ int intel_th_output_enable(struct intel_th *th, unsigned 
int otype);
 enum th_mmio_idx {
        TH_MMIO_CONFIG = 0,
        TH_MMIO_SW = 1,
+       TH_MMIO_RTIT = 2,
        TH_MMIO_END,
 };
 
diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c
index 9dd2d75bd539..fd8267bbaf2c 100644
--- a/drivers/hwtracing/intel_th/pci.c
+++ b/drivers/hwtracing/intel_th/pci.c
@@ -20,6 +20,7 @@
 enum {
        TH_PCI_CONFIG_BAR       = 0,
        TH_PCI_STH_SW_BAR       = 2,
+       TH_PCI_RTIT_BAR         = 4,
 };
 
 #define BAR_MASK (BIT(TH_PCI_CONFIG_BAR) | BIT(TH_PCI_STH_SW_BAR))
@@ -75,8 +76,8 @@ static int intel_th_pci_probe(struct pci_dev *pdev,
                [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;
        struct intel_th *th;
-       int err;
 
        err = pcim_enable_device(pdev);
        if (err)
@@ -86,8 +87,12 @@ static int intel_th_pci_probe(struct pci_dev *pdev,
        if (err)
                return err;
 
-       th = intel_th_alloc(&pdev->dev, drvdata, resource, TH_MMIO_END,
-                           pdev->irq);
+       if (pdev->resource[TH_PCI_RTIT_BAR].start) {
+               resource[TH_MMIO_RTIT] = pdev->resource[TH_PCI_RTIT_BAR];
+               r++;
+       }
+
+       th = intel_th_alloc(&pdev->dev, drvdata, resource, r, pdev->irq);
        if (IS_ERR(th))
                return PTR_ERR(th);
 
-- 
2.20.1

Reply via email to