Refactor the logic to match devices to pci_dev_acs_ops by factoring out
the loop and device matching into its own routine. This eliminates some
duplicate code between pci_dev_specific_enable_acs() and
pci_dev_specific_disable_acs_redir(), and will also be used in a
subsequent commit to check if a device requires device-specific
enable_acs() during a Live Update.

No functional change intended.

Signed-off-by: David Matlack <[email protected]>
---
 drivers/pci/quirks.c | 50 ++++++++++++++++++--------------------------
 1 file changed, 20 insertions(+), 30 deletions(-)

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index caaed1a01dc0..171caec2bc47 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -5384,9 +5384,6 @@ static void pci_quirk_enable_intel_rp_mpc_acs(struct 
pci_dev *dev)
  */
 static int pci_quirk_enable_intel_pch_acs(struct pci_dev *dev)
 {
-       if (!pci_quirk_intel_pch_acs_match(dev))
-               return -ENOTTY;
-
        if (pci_quirk_enable_intel_lpc_acs(dev)) {
                pci_warn(dev, "Failed to enable Intel PCH ACS quirk\n");
                return 0;
@@ -5406,9 +5403,6 @@ static int pci_quirk_enable_intel_spt_pch_acs(struct 
pci_dev *dev)
        int pos;
        u32 cap, ctrl;
 
-       if (!pci_quirk_intel_spt_pch_acs_match(dev))
-               return -ENOTTY;
-
        pos = dev->acs_cap;
        if (!pos)
                return -ENOTTY;
@@ -5436,9 +5430,6 @@ static int 
pci_quirk_disable_intel_spt_pch_acs_redir(struct pci_dev *dev)
        int pos;
        u32 cap, ctrl;
 
-       if (!pci_quirk_intel_spt_pch_acs_match(dev))
-               return -ENOTTY;
-
        pos = dev->acs_cap;
        if (!pos)
                return -ENOTTY;
@@ -5458,22 +5449,25 @@ static int 
pci_quirk_disable_intel_spt_pch_acs_redir(struct pci_dev *dev)
 static const struct pci_dev_acs_ops {
        u16 vendor;
        u16 device;
+       bool (*match)(struct pci_dev *dev);
        int (*enable_acs)(struct pci_dev *dev);
        int (*disable_acs_redir)(struct pci_dev *dev);
 } pci_dev_acs_ops[] = {
        { PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
+           .match = pci_quirk_intel_pch_acs_match,
            .enable_acs = pci_quirk_enable_intel_pch_acs,
        },
        { PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
+           .match = pci_quirk_intel_spt_pch_acs_match,
            .enable_acs = pci_quirk_enable_intel_spt_pch_acs,
            .disable_acs_redir = pci_quirk_disable_intel_spt_pch_acs_redir,
        },
 };
 
-int pci_dev_specific_enable_acs(struct pci_dev *dev)
+static const struct pci_dev_acs_ops *pci_dev_acs_ops_get(struct pci_dev *dev)
 {
        const struct pci_dev_acs_ops *p;
-       int i, ret;
+       int i;
 
        for (i = 0; i < ARRAY_SIZE(pci_dev_acs_ops); i++) {
                p = &pci_dev_acs_ops[i];
@@ -5481,33 +5475,29 @@ int pci_dev_specific_enable_acs(struct pci_dev *dev)
                     p->vendor == (u16)PCI_ANY_ID) &&
                    (p->device == dev->device ||
                     p->device == (u16)PCI_ANY_ID) &&
-                   p->enable_acs) {
-                       ret = p->enable_acs(dev);
-                       if (ret >= 0)
-                               return ret;
-               }
+                   p->match(dev))
+                       return p;
        }
 
+       return NULL;
+}
+
+int pci_dev_specific_enable_acs(struct pci_dev *dev)
+{
+       const struct pci_dev_acs_ops *p = pci_dev_acs_ops_get(dev);
+
+       if (p && p->enable_acs)
+               return p->enable_acs(dev);
+
        return -ENOTTY;
 }
 
 int pci_dev_specific_disable_acs_redir(struct pci_dev *dev)
 {
-       const struct pci_dev_acs_ops *p;
-       int i, ret;
+       const struct pci_dev_acs_ops *p = pci_dev_acs_ops_get(dev);
 
-       for (i = 0; i < ARRAY_SIZE(pci_dev_acs_ops); i++) {
-               p = &pci_dev_acs_ops[i];
-               if ((p->vendor == dev->vendor ||
-                    p->vendor == (u16)PCI_ANY_ID) &&
-                   (p->device == dev->device ||
-                    p->device == (u16)PCI_ANY_ID) &&
-                   p->disable_acs_redir) {
-                       ret = p->disable_acs_redir(dev);
-                       if (ret >= 0)
-                               return ret;
-               }
-       }
+       if (p && p->disable_acs_redir)
+               return p->disable_acs_redir(dev);
 
        return -ENOTTY;
 }
-- 
2.54.0.746.g67dd491aae-goog


Reply via email to