]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
PCI: vmd: Add bus 224-255 restriction decode
authorJon Derrick <jonathan.derrick@intel.com>
Tue, 12 Nov 2019 12:47:52 +0000 (05:47 -0700)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Wed, 20 Nov 2019 16:29:59 +0000 (16:29 +0000)
VMD bus restrictions are required when IO fabric is multiplexed such
that VMD cannot use the entire bus range. This patch adds another bus
restriction decode bit that can be set by firmware to restrict the VMD
bus range to between 224-255.

Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
drivers/pci/controller/vmd.c

index a35d3f3996d7be139e9a0e542b9f8ca60c2891b9..15302a17ee3f37e4941c32e3e521583435195a3c 100644 (file)
@@ -602,16 +602,30 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
 
        /*
         * Certain VMD devices may have a root port configuration option which
-        * limits the bus range to between 0-127 or 128-255
+        * limits the bus range to between 0-127, 128-255, or 224-255
         */
        if (features & VMD_FEAT_HAS_BUS_RESTRICTIONS) {
-               u32 vmcap, vmconfig;
-
-               pci_read_config_dword(vmd->dev, PCI_REG_VMCAP, &vmcap);
-               pci_read_config_dword(vmd->dev, PCI_REG_VMCONFIG, &vmconfig);
-               if (BUS_RESTRICT_CAP(vmcap) &&
-                   (BUS_RESTRICT_CFG(vmconfig) == 0x1))
-                       vmd->busn_start = 128;
+               u16 reg16;
+
+               pci_read_config_word(vmd->dev, PCI_REG_VMCAP, &reg16);
+               if (BUS_RESTRICT_CAP(reg16)) {
+                       pci_read_config_word(vmd->dev, PCI_REG_VMCONFIG,
+                                            &reg16);
+
+                       switch (BUS_RESTRICT_CFG(reg16)) {
+                       case 1:
+                               vmd->busn_start = 128;
+                               break;
+                       case 2:
+                               vmd->busn_start = 224;
+                               break;
+                       case 3:
+                               pci_err(vmd->dev, "Unknown Bus Offset Setting\n");
+                               return -ENODEV;
+                       default:
+                               break;
+                       }
+               }
        }
 
        res = &vmd->dev->resource[VMD_CFGBAR];