[PATCH] powerpc: Auto reserve of device tree blob
authorJimi Xenidis <jimix@watson.ibm.com>
Thu, 18 May 2006 22:03:05 +0000 (17:03 -0500)
committerPaul Mackerras <paulus@samba.org>
Fri, 19 May 2006 05:02:26 +0000 (15:02 +1000)
A devtree compiler (dtc) generated devtree blob is "relocatable" and so
does not contain a reserved_map entry for the blob itself.  This means
that if passed to Linux, Linux will not get lmb_reserve() the blob and
it could be over.  The following patch will explicitly reserve the
"blob" as it was given to us and stops prom_init.c from creating a
reserved mapping for the blob.

NOTE: that the dtc/kexec should not generate the blob reservation entry.
Although if they do, LMB reserver handles overlaps.

Signed-off-by: <jimix@watson.ibm.com>
Acked-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/prom_init.c

index 8d0415b080bb1f623bd3a576d5f4f984b10a6539..969f4abcc0be64bc625685facacf0edeb55f7b5f 100644 (file)
@@ -1267,6 +1267,11 @@ static void __init early_reserve_mem(void)
 
        reserve_map = (u64 *)(((unsigned long)initial_boot_params) +
                                        initial_boot_params->off_mem_rsvmap);
+
+       /* before we do anything, lets reserve the dt blob */
+       lmb_reserve(__pa((unsigned long)initial_boot_params),
+                   initial_boot_params->totalsize);
+
 #ifdef CONFIG_PPC32
        /* 
         * Handle the case where we might be booting from an old kexec
index 2442361772e2fc868c70f465a46641fe597b6d4d..98e201c38d27dbe69b425a821fc3cc40896c48aa 100644 (file)
@@ -1950,11 +1950,7 @@ static void __init flatten_device_tree(void)
        /* Version 16 is not backward compatible */
        hdr->last_comp_version = 0x10;
 
-       /* Reserve the whole thing and copy the reserve map in, we
-        * also bump mem_reserve_cnt to cause further reservations to
-        * fail since it's too late.
-        */
-       reserve_mem(RELOC(dt_header_start), hdr->totalsize);
+       /* Copy the reserve map in */
        memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map));
 
 #ifdef DEBUG_PROM
@@ -1967,6 +1963,9 @@ static void __init flatten_device_tree(void)
                                    RELOC(mem_reserve_map)[i].size);
        }
 #endif
+       /* Bump mem_reserve_cnt to cause further reservations to fail
+        * since it's too late.
+        */
        RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE;
 
        prom_printf("Device tree strings 0x%x -> 0x%x\n",