]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - arch/x86/pci/amd_bus.c
x86: Move range related operation to one file
[net-next-2.6.git] / arch / x86 / pci / amd_bus.c
index 95ecbd495955094ac22c7502fe992ea2af7ad444..2356ea18697d151b8bb3e38bbf5ee4aaf278af24 100644 (file)
@@ -2,6 +2,8 @@
 #include <linux/pci.h>
 #include <linux/topology.h>
 #include <linux/cpu.h>
+#include <linux/range.h>
+
 #include <asm/pci_x86.h>
 
 #ifdef CONFIG_X86_64
 
 #ifdef CONFIG_X86_64
 
-#define RANGE_NUM 16
-
-struct res_range {
-       size_t start;
-       size_t end;
-};
-
-static void __init update_range(struct res_range *range, size_t start,
-                               size_t end)
-{
-       int i;
-       int j;
-
-       for (j = 0; j < RANGE_NUM; j++) {
-               if (!range[j].end)
-                       continue;
-
-               if (start <= range[j].start && end >= range[j].end) {
-                       range[j].start = 0;
-                       range[j].end = 0;
-                       continue;
-               }
-
-               if (start <= range[j].start && end < range[j].end && range[j].start < end + 1) {
-                       range[j].start = end + 1;
-                       continue;
-               }
-
-
-               if (start > range[j].start && end >= range[j].end && range[j].end > start - 1) {
-                       range[j].end = start - 1;
-                       continue;
-               }
-
-               if (start > range[j].start && end < range[j].end) {
-                       /* find the new spare */
-                       for (i = 0; i < RANGE_NUM; i++) {
-                               if (range[i].end == 0)
-                                       break;
-                       }
-                       if (i < RANGE_NUM) {
-                               range[i].end = range[j].end;
-                               range[i].start = end + 1;
-                       } else {
-                               printk(KERN_ERR "run of slot in ranges\n");
-                       }
-                       range[j].end = start - 1;
-                       continue;
-               }
-       }
-}
-
 struct pci_hostbridge_probe {
        u32 bus;
        u32 slot;
@@ -111,6 +61,8 @@ static void __init get_pci_mmcfg_amd_fam10h_range(void)
        fam10h_mmconf_end = base + (1ULL<<(segn_busn_bits + 20)) - 1;
 }
 
+#define RANGE_NUM 16
+
 /**
  * early_fill_mp_bus_to_node()
  * called before pcibios_scan_root and pci_scan_bus
@@ -132,7 +84,7 @@ static int __init early_fill_mp_bus_info(void)
        struct resource *res;
        size_t start;
        size_t end;
-       struct res_range range[RANGE_NUM];
+       struct range range[RANGE_NUM];
        u64 val;
        u32 address;
 
@@ -226,7 +178,7 @@ static int __init early_fill_mp_bus_info(void)
                if (end > 0xffff)
                        end = 0xffff;
                update_res(info, start, end, IORESOURCE_IO, 1);
-               update_range(range, start, end);
+               subtract_range(range, RANGE_NUM, start, end);
        }
        /* add left over io port range to def node/link, [0, 0xffff] */
        /* find the position */
@@ -256,14 +208,14 @@ static int __init early_fill_mp_bus_info(void)
        end = (val & 0xffffff800000ULL);
        printk(KERN_INFO "TOM: %016lx aka %ldM\n", end, end>>20);
        if (end < (1ULL<<32))
-               update_range(range, 0, end - 1);
+               subtract_range(range, RANGE_NUM, 0, end - 1);
 
        /* get mmconfig */
        get_pci_mmcfg_amd_fam10h_range();
        /* need to take out mmconf range */
        if (fam10h_mmconf_end) {
                printk(KERN_DEBUG "Fam 10h mmconf [%llx, %llx]\n", fam10h_mmconf_start, fam10h_mmconf_end);
-               update_range(range, fam10h_mmconf_start, fam10h_mmconf_end);
+               subtract_range(range, RANGE_NUM, fam10h_mmconf_start, fam10h_mmconf_end);
        }
 
        /* mmio resource */
@@ -318,7 +270,7 @@ static int __init early_fill_mp_bus_info(void)
                                /* we got a hole */
                                endx = fam10h_mmconf_start - 1;
                                update_res(info, start, endx, IORESOURCE_MEM, 0);
-                               update_range(range, start, endx);
+                               subtract_range(range, RANGE_NUM, start, endx);
                                printk(KERN_CONT " ==> [%llx, %llx]", (u64)start, endx);
                                start = fam10h_mmconf_end + 1;
                                changed = 1;
@@ -334,7 +286,7 @@ static int __init early_fill_mp_bus_info(void)
                }
 
                update_res(info, start, end, IORESOURCE_MEM, 1);
-               update_range(range, start, end);
+               subtract_range(range, RANGE_NUM, start, end);
                printk(KERN_CONT "\n");
        }
 
@@ -349,7 +301,7 @@ static int __init early_fill_mp_bus_info(void)
                rdmsrl(address, val);
                end = (val & 0xffffff800000ULL);
                printk(KERN_INFO "TOM2: %016lx aka %ldM\n", end, end>>20);
-               update_range(range, 1ULL<<32, end - 1);
+               subtract_range(range, RANGE_NUM, 1ULL<<32, end - 1);
        }
 
        /*