MIPS: BCM47XX: Slightly clean memory detection
authorRafał Miłecki <zajec5@gmail.com>
Sat, 19 Apr 2014 10:49:46 +0000 (12:49 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Fri, 30 May 2014 09:00:21 +0000 (11:00 +0200)
Patch was tested on devices with 64 MiB and 256 MiB of RAM.
It documents every part nicely and drops this hacky part of code:
max = off | ((128 << 20) - 1);

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Cc: linux-mips@linux-mips.org
Cc: Hauke Mehrtens <hauke@hauke-m.de>
Patchwork: https://patchwork.linux-mips.org/patch/6808/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/bcm47xx/prom.c

index 0af808dfd1ca778fdf95022bf4a6b93e561334ad..1a03a2f43496738979993731b3538ca4e562a045 100644 (file)
@@ -69,15 +69,18 @@ static __init void prom_init_mem(void)
         * BCM47XX uses 128MB for addressing the ram, if the system contains
         * less that that amount of ram it remaps the ram more often into the
         * available space.
-        * Accessing memory after 128MB will cause an exception.
-        * max contains the biggest possible address supported by the platform.
-        * If the method wants to try something above we assume 128MB ram.
         */
-       off = (unsigned long)prom_init;
-       max = off | ((128 << 20) - 1);
-       for (mem = (1 << 20); mem < (128 << 20); mem += (1 << 20)) {
-               if ((off + mem) > max) {
-                       mem = (128 << 20);
+
+       /* Physical address, without mapping to any kernel segment */
+       off = CPHYSADDR((unsigned long)prom_init);
+
+       /* Accessing memory after 128 MiB will cause an exception */
+       max = 128 << 20;
+
+       for (mem = 1 << 20; mem < max; mem += 1 << 20) {
+               /* Loop condition may be not enough, off may be over 1 MiB */
+               if (off + mem >= max) {
+                       mem = max;
                        printk(KERN_DEBUG "assume 128MB RAM\n");
                        break;
                }