]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
PCI: prepare pci=realloc for multiple options
authorYinghai Lu <yinghai@kernel.org>
Fri, 24 Feb 2012 03:23:30 +0000 (19:23 -0800)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 24 Feb 2012 16:47:42 +0000 (08:47 -0800)
Let the user could enable and disable with pci=realloc=on or pci=realloc=off

Also
1. move variable and functions near the place they are used.
2. change macro to function
3. change related functions and variable to static and _init
4. update parameter description accordingly.

This will let us add a config option to control default behavior, and
still allow the user to turn off automatic reallocation if it fails on
their platform until a permanent solution is found.

-v2: still honor pci=realloc, and treat it as pci=realloc=on
     also use enum instead of ...
-v3: update kernel-paramenters.txt according to Jesse.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Documentation/kernel-parameters.txt
drivers/pci/pci.c
drivers/pci/pci.h
drivers/pci/setup-bus.c

index 7fb7a4b161ff9de8e8d3efa8a9811b6382a42666..7dc523e082a28b47756784cd6cd7db95fc2a07e1 100644 (file)
@@ -2109,8 +2109,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                                the default.
                                off: Turn ECRC off
                                on: Turn ECRC on.
-               realloc         reallocate PCI resources if allocations done by BIOS
-                               are erroneous.
+               realloc=        Enable/disable reallocating PCI bridge resources
+                               if allocations done by BIOS are too small to
+                               accommodate resources required by all child
+                               devices.
+                               off: Turn realloc off
+                               on: Turn realloc on
+               realloc         same as realloc=on
 
        pcie_aspm=      [PCIE] Forcibly enable or disable PCIe Active State Power
                        Management.
index 8f30736dbf3f7fb6e876a65d19ec8c6b55fccf02..e9f9dc183cfcac82f45fb3feb8bb273a472f955f 100644 (file)
@@ -3772,8 +3772,10 @@ static int __init pci_setup(char *str)
                                pci_no_msi();
                        } else if (!strcmp(str, "noaer")) {
                                pci_no_aer();
+                       } else if (!strncmp(str, "realloc=", 8)) {
+                               pci_realloc_get_opt(str + 8);
                        } else if (!strncmp(str, "realloc", 7)) {
-                               pci_realloc();
+                               pci_realloc_get_opt("on");
                        } else if (!strcmp(str, "nodomains")) {
                                pci_no_domains();
                        } else if (!strncmp(str, "cbiosize=", 9)) {
index 586ac9b097e420838377a2176bc7a2cbce1e77b5..1fc63b39f83fc115884aa6ff78b5034b85c14b45 100644 (file)
@@ -149,7 +149,7 @@ static inline void pci_no_msi(void) { }
 static inline void pci_msi_init_pci_dev(struct pci_dev *dev) { }
 #endif
 
-extern void pci_realloc(void);
+void pci_realloc_get_opt(char *);
 
 static inline int pci_no_d1d2(struct pci_dev *dev)
 {
index 162edfb356b674761b89e02780795bdabe1680ef..219722df68d6f294489b981a97821bd2307bd4e6 100644 (file)
@@ -48,13 +48,6 @@ static void free_list(struct list_head *head)
        }
 }
 
-int pci_realloc_enable = 0;
-#define pci_realloc_enabled() pci_realloc_enable
-void pci_realloc(void)
-{
-       pci_realloc_enable = 1;
-}
-
 /**
  * add_to_list() - add a new resource tracker to the list
  * @head:      Head of the list
@@ -1273,6 +1266,33 @@ static int __init pci_get_max_depth(void)
        return depth;
 }
 
+/*
+ * -1: undefined, will auto detect later
+ *  0: disabled by user
+ *  1: disabled by auto detect
+ *  2: enabled by user
+ *  3: enabled by auto detect
+ */
+enum enable_type {
+       undefined = -1,
+       user_disabled,
+       auto_disabled,
+       user_enabled,
+       auto_enabled,
+};
+
+static enum enable_type pci_realloc_enable __initdata = undefined;
+void __init pci_realloc_get_opt(char *str)
+{
+       if (!strncmp(str, "off", 3))
+               pci_realloc_enable = user_disabled;
+       else if (!strncmp(str, "on", 2))
+               pci_realloc_enable = user_enabled;
+}
+static bool __init pci_realloc_enabled(void)
+{
+       return pci_realloc_enable >= user_enabled;
+}
 
 /*
  * first try will not touch pci bridge res