PCI: Reorder pci_enable_acs() and dependencies
authorRajat Jain <rajatja@google.com>
Tue, 7 Jul 2020 22:46:01 +0000 (15:46 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 10 Jul 2020 18:47:11 +0000 (13:47 -0500)
Move pci_enable_acs() and dependencies further up in the source code to
avoid having to forward declare it when we make it static in near future.

No functional changes intended.

Link: https://lore.kernel.org/r/20200707224604.3737893-1-rajatja@google.com
Signed-off-by: Rajat Jain <rajatja@google.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pci.c

index ce09627..eec625f 100644 (file)
@@ -777,6 +777,133 @@ int pci_wait_for_pending(struct pci_dev *dev, int pos, u16 mask)
        return 0;
 }
 
+static int pci_acs_enable;
+
+/**
+ * pci_request_acs - ask for ACS to be enabled if supported
+ */
+void pci_request_acs(void)
+{
+       pci_acs_enable = 1;
+}
+
+static const char *disable_acs_redir_param;
+
+/**
+ * pci_disable_acs_redir - disable ACS redirect capabilities
+ * @dev: the PCI device
+ *
+ * For only devices specified in the disable_acs_redir parameter.
+ */
+static void pci_disable_acs_redir(struct pci_dev *dev)
+{
+       int ret = 0;
+       const char *p;
+       int pos;
+       u16 ctrl;
+
+       if (!disable_acs_redir_param)
+               return;
+
+       p = disable_acs_redir_param;
+       while (*p) {
+               ret = pci_dev_str_match(dev, p, &p);
+               if (ret < 0) {
+                       pr_info_once("PCI: Can't parse disable_acs_redir parameter: %s\n",
+                                    disable_acs_redir_param);
+
+                       break;
+               } else if (ret == 1) {
+                       /* Found a match */
+                       break;
+               }
+
+               if (*p != ';' && *p != ',') {
+                       /* End of param or invalid format */
+                       break;
+               }
+               p++;
+       }
+
+       if (ret != 1)
+               return;
+
+       if (!pci_dev_specific_disable_acs_redir(dev))
+               return;
+
+       pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);
+       if (!pos) {
+               pci_warn(dev, "cannot disable ACS redirect for this hardware as it does not have ACS capabilities\n");
+               return;
+       }
+
+       pci_read_config_word(dev, pos + PCI_ACS_CTRL, &ctrl);
+
+       /* P2P Request & Completion Redirect */
+       ctrl &= ~(PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_EC);
+
+       pci_write_config_word(dev, pos + PCI_ACS_CTRL, ctrl);
+
+       pci_info(dev, "disabled ACS redirect\n");
+}
+
+/**
+ * pci_std_enable_acs - enable ACS on devices using standard ACS capabilities
+ * @dev: the PCI device
+ */
+static void pci_std_enable_acs(struct pci_dev *dev)
+{
+       int pos;
+       u16 cap;
+       u16 ctrl;
+
+       pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);
+       if (!pos)
+               return;
+
+       pci_read_config_word(dev, pos + PCI_ACS_CAP, &cap);
+       pci_read_config_word(dev, pos + PCI_ACS_CTRL, &ctrl);
+
+       /* Source Validation */
+       ctrl |= (cap & PCI_ACS_SV);
+
+       /* P2P Request Redirect */
+       ctrl |= (cap & PCI_ACS_RR);
+
+       /* P2P Completion Redirect */
+       ctrl |= (cap & PCI_ACS_CR);
+
+       /* Upstream Forwarding */
+       ctrl |= (cap & PCI_ACS_UF);
+
+       pci_write_config_word(dev, pos + PCI_ACS_CTRL, ctrl);
+}
+
+/**
+ * pci_enable_acs - enable ACS if hardware support it
+ * @dev: the PCI device
+ */
+void pci_enable_acs(struct pci_dev *dev)
+{
+       if (!pci_acs_enable)
+               goto disable_acs_redir;
+
+       if (!pci_dev_specific_enable_acs(dev))
+               goto disable_acs_redir;
+
+       pci_std_enable_acs(dev);
+
+disable_acs_redir:
+       /*
+        * Note: pci_disable_acs_redir() must be called even if ACS was not
+        * enabled by the kernel because it may have been enabled by
+        * platform firmware.  So if we are told to disable it, we should
+        * always disable it after setting the kernel's default
+        * preferences.
+        */
+       pci_disable_acs_redir(dev);
+}
+
 /**
  * pci_restore_bars - restore a device's BAR values (e.g. after wake-up)
  * @dev: PCI device to have its BARs restored
@@ -3230,133 +3357,6 @@ void pci_configure_ari(struct pci_dev *dev)
        }
 }
 
-static int pci_acs_enable;
-
-/**
- * pci_request_acs - ask for ACS to be enabled if supported
- */
-void pci_request_acs(void)
-{
-       pci_acs_enable = 1;
-}
-
-static const char *disable_acs_redir_param;
-
-/**
- * pci_disable_acs_redir - disable ACS redirect capabilities
- * @dev: the PCI device
- *
- * For only devices specified in the disable_acs_redir parameter.
- */
-static void pci_disable_acs_redir(struct pci_dev *dev)
-{
-       int ret = 0;
-       const char *p;
-       int pos;
-       u16 ctrl;
-
-       if (!disable_acs_redir_param)
-               return;
-
-       p = disable_acs_redir_param;
-       while (*p) {
-               ret = pci_dev_str_match(dev, p, &p);
-               if (ret < 0) {
-                       pr_info_once("PCI: Can't parse disable_acs_redir parameter: %s\n",
-                                    disable_acs_redir_param);
-
-                       break;
-               } else if (ret == 1) {
-                       /* Found a match */
-                       break;
-               }
-
-               if (*p != ';' && *p != ',') {
-                       /* End of param or invalid format */
-                       break;
-               }
-               p++;
-       }
-
-       if (ret != 1)
-               return;
-
-       if (!pci_dev_specific_disable_acs_redir(dev))
-               return;
-
-       pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);
-       if (!pos) {
-               pci_warn(dev, "cannot disable ACS redirect for this hardware as it does not have ACS capabilities\n");
-               return;
-       }
-
-       pci_read_config_word(dev, pos + PCI_ACS_CTRL, &ctrl);
-
-       /* P2P Request & Completion Redirect */
-       ctrl &= ~(PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_EC);
-
-       pci_write_config_word(dev, pos + PCI_ACS_CTRL, ctrl);
-
-       pci_info(dev, "disabled ACS redirect\n");
-}
-
-/**
- * pci_std_enable_acs - enable ACS on devices using standard ACS capabilities
- * @dev: the PCI device
- */
-static void pci_std_enable_acs(struct pci_dev *dev)
-{
-       int pos;
-       u16 cap;
-       u16 ctrl;
-
-       pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);
-       if (!pos)
-               return;
-
-       pci_read_config_word(dev, pos + PCI_ACS_CAP, &cap);
-       pci_read_config_word(dev, pos + PCI_ACS_CTRL, &ctrl);
-
-       /* Source Validation */
-       ctrl |= (cap & PCI_ACS_SV);
-
-       /* P2P Request Redirect */
-       ctrl |= (cap & PCI_ACS_RR);
-
-       /* P2P Completion Redirect */
-       ctrl |= (cap & PCI_ACS_CR);
-
-       /* Upstream Forwarding */
-       ctrl |= (cap & PCI_ACS_UF);
-
-       pci_write_config_word(dev, pos + PCI_ACS_CTRL, ctrl);
-}
-
-/**
- * pci_enable_acs - enable ACS if hardware support it
- * @dev: the PCI device
- */
-void pci_enable_acs(struct pci_dev *dev)
-{
-       if (!pci_acs_enable)
-               goto disable_acs_redir;
-
-       if (!pci_dev_specific_enable_acs(dev))
-               goto disable_acs_redir;
-
-       pci_std_enable_acs(dev);
-
-disable_acs_redir:
-       /*
-        * Note: pci_disable_acs_redir() must be called even if ACS was not
-        * enabled by the kernel because it may have been enabled by
-        * platform firmware.  So if we are told to disable it, we should
-        * always disable it after setting the kernel's default
-        * preferences.
-        */
-       pci_disable_acs_redir(dev);
-}
-
 static bool pci_acs_flags_enabled(struct pci_dev *pdev, u16 acs_flags)
 {
        int pos;