MIPS: Netlogic: Update function to read DRAM BARs
authorJayachandran C <jchandra@broadcom.com>
Wed, 7 Jan 2015 11:28:33 +0000 (16:58 +0530)
committerRalf Baechle <ralf@linux-mips.org>
Wed, 1 Apr 2015 15:21:52 +0000 (17:21 +0200)
Change name of xlp_get_dram_map to nlm_get_dram_map to be consistent
with the rest of the functions in the file. Pass the the size of the
array 'dram_map' to the function, and ensure that it does not write
past the end of the array.

Signed-off-by: Jayachandran C <jchandra@broadcom.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/8892/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/netlogic/xlp-hal/xlp.h
arch/mips/netlogic/xlp/nlm_hal.c
arch/mips/netlogic/xlp/setup.c

index a862b93223cc4830e724c21e82bc999fdd747654..c0b2a807a791a03a4c42201c6779af0d2adfd130 100644 (file)
@@ -89,7 +89,7 @@ void xlp_wakeup_secondary_cpus(void);
 
 void xlp_mmu_init(void);
 void nlm_hal_init(void);
-int xlp_get_dram_map(int n, uint64_t *dram_map);
+int nlm_get_dram_map(int node, uint64_t *dram_map, int nentries);
 
 struct pci_dev;
 int xlp_socdev_to_node(const struct pci_dev *dev);
index b80d893da9ad41f58980b92e1d33ea257bac4259..c6c31e3c0949d1c4ebe8cda6cd7ea962be30867f 100644 (file)
@@ -449,19 +449,21 @@ unsigned int nlm_get_cpu_frequency(void)
 
 /*
  * Fills upto 8 pairs of entries containing the DRAM map of a node
- * if n < 0, get dram map for all nodes
+ * if node < 0, get dram map for all nodes
  */
-int xlp_get_dram_map(int n, uint64_t *dram_map)
+int nlm_get_dram_map(int node, uint64_t *dram_map, int nentries)
 {
        uint64_t bridgebase, base, lim;
        uint32_t val;
        unsigned int barreg, limreg, xlatreg;
-       int i, node, rv;
+       int i, n, rv;
 
        /* Look only at mapping on Node 0, we don't handle crazy configs */
        bridgebase = nlm_get_bridge_regbase(0);
        rv = 0;
        for (i = 0; i < 8; i++) {
+               if (rv + 1 >= nentries)
+                       break;
                if (cpu_is_xlp9xx()) {
                        barreg = BRIDGE_9XX_DRAM_BAR(i);
                        limreg = BRIDGE_9XX_DRAM_LIMIT(i);
@@ -471,10 +473,10 @@ int xlp_get_dram_map(int n, uint64_t *dram_map)
                        limreg = BRIDGE_DRAM_LIMIT(i);
                        xlatreg = BRIDGE_DRAM_NODE_TRANSLN(i);
                }
-               if (n >= 0) {
+               if (node >= 0) {
                        /* node specified, get node mapping of BAR */
                        val = nlm_read_bridge_reg(bridgebase, xlatreg);
-                       node = (val >> 1) & 0x3;
+                       n = (val >> 1) & 0x3;
                        if (n != node)
                                continue;
                }
index 27113a17f18d1f324a551a7b456cc10351ffae26..f743fd9da32366c787d438e81285fe399c41bc15 100644 (file)
@@ -81,7 +81,7 @@ static void __init xlp_init_mem_from_bars(void)
        uint64_t map[16];
        int i, n;
 
-       n = xlp_get_dram_map(-1, map);  /* -1: info for all nodes */
+       n = nlm_get_dram_map(-1, map, ARRAY_SIZE(map)); /* -1 : all nodes */
        for (i = 0; i < n; i += 2) {
                /* exclude 0x1000_0000-0x2000_0000, u-boot device */
                if (map[i] <= 0x10000000 && map[i+1] > 0x10000000)