Commit 4c2896e8 authored by Grant Likely's avatar Grant Likely

arm/dt: Make __vet_atags also accept a dtb image

The dtb is passed to the kernel via register r2, which is the same
method that is used to pass an atags pointer.  This patch modifies
__vet_atags to not clear r2 when it encounters a dtb image.

v2: fixed bugs pointed out by Nicolas Pitre
Tested-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 7ee4b98e
...@@ -15,6 +15,12 @@ ...@@ -15,6 +15,12 @@
#define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2) #define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2)
#define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2) #define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2)
#ifdef CONFIG_CPU_BIG_ENDIAN
#define OF_DT_MAGIC 0xd00dfeed
#else
#define OF_DT_MAGIC 0xedfe0dd0 /* 0xd00dfeed in big-endian */
#endif
/* /*
* Exception handling. Something went wrong and we can't proceed. We * Exception handling. Something went wrong and we can't proceed. We
* ought to tell the user, but since we don't have any guarantee that * ought to tell the user, but since we don't have any guarantee that
...@@ -28,20 +34,26 @@ ...@@ -28,20 +34,26 @@
/* Determine validity of the r2 atags pointer. The heuristic requires /* Determine validity of the r2 atags pointer. The heuristic requires
* that the pointer be aligned, in the first 16k of physical RAM and * that the pointer be aligned, in the first 16k of physical RAM and
* that the ATAG_CORE marker is first and present. Future revisions * that the ATAG_CORE marker is first and present. If CONFIG_OF_FLATTREE
* is selected, then it will also accept a dtb pointer. Future revisions
* of this function may be more lenient with the physical address and * of this function may be more lenient with the physical address and
* may also be able to move the ATAGS block if necessary. * may also be able to move the ATAGS block if necessary.
* *
* Returns: * Returns:
* r2 either valid atags pointer, or zero * r2 either valid atags pointer, valid dtb pointer, or zero
* r5, r6 corrupted * r5, r6 corrupted
*/ */
__vet_atags: __vet_atags:
tst r2, #0x3 @ aligned? tst r2, #0x3 @ aligned?
bne 1f bne 1f
ldr r5, [r2, #0] @ is first tag ATAG_CORE? ldr r5, [r2, #0]
cmp r5, #ATAG_CORE_SIZE #ifdef CONFIG_OF_FLATTREE
ldr r6, =OF_DT_MAGIC @ is it a DTB?
cmp r5, r6
beq 2f
#endif
cmp r5, #ATAG_CORE_SIZE @ is first tag ATAG_CORE?
cmpne r5, #ATAG_CORE_SIZE_EMPTY cmpne r5, #ATAG_CORE_SIZE_EMPTY
bne 1f bne 1f
ldr r5, [r2, #4] ldr r5, [r2, #4]
...@@ -49,7 +61,7 @@ __vet_atags: ...@@ -49,7 +61,7 @@ __vet_atags:
cmp r5, r6 cmp r5, r6
bne 1f bne 1f
mov pc, lr @ atag pointer is ok 2: mov pc, lr @ atag/dtb pointer is ok
1: mov r2, #0 1: mov r2, #0
mov pc, lr mov pc, lr
...@@ -61,7 +73,7 @@ ENDPROC(__vet_atags) ...@@ -61,7 +73,7 @@ ENDPROC(__vet_atags)
* *
* r0 = cp#15 control register * r0 = cp#15 control register
* r1 = machine ID * r1 = machine ID
* r2 = atags pointer * r2 = atags/dtb pointer
* r9 = processor ID * r9 = processor ID
*/ */
__INIT __INIT
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
* *
* This is normally called from the decompressor code. The requirements * This is normally called from the decompressor code. The requirements
* are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0, * are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
* r1 = machine nr, r2 = atags pointer. * r1 = machine nr, r2 = atags or dtb pointer.
* *
* This code is mostly position independent, so if you link the kernel at * This code is mostly position independent, so if you link the kernel at
* 0xc0008000, you call this at __pa(0xc0008000). * 0xc0008000, you call this at __pa(0xc0008000).
...@@ -91,7 +91,7 @@ ENTRY(stext) ...@@ -91,7 +91,7 @@ ENTRY(stext)
#endif #endif
/* /*
* r1 = machine no, r2 = atags, * r1 = machine no, r2 = atags or dtb,
* r8 = phys_offset, r9 = cpuid, r10 = procinfo * r8 = phys_offset, r9 = cpuid, r10 = procinfo
*/ */
bl __vet_atags bl __vet_atags
...@@ -339,7 +339,7 @@ __secondary_data: ...@@ -339,7 +339,7 @@ __secondary_data:
* *
* r0 = cp#15 control register * r0 = cp#15 control register
* r1 = machine ID * r1 = machine ID
* r2 = atags pointer * r2 = atags or dtb pointer
* r4 = page table pointer * r4 = page table pointer
* r9 = processor ID * r9 = processor ID
* r13 = *virtual* address to jump to upon completion * r13 = *virtual* address to jump to upon completion
...@@ -376,7 +376,7 @@ ENDPROC(__enable_mmu) ...@@ -376,7 +376,7 @@ ENDPROC(__enable_mmu)
* *
* r0 = cp#15 control register * r0 = cp#15 control register
* r1 = machine ID * r1 = machine ID
* r2 = atags pointer * r2 = atags or dtb pointer
* r9 = processor ID * r9 = processor ID
* r13 = *virtual* address to jump to upon completion * r13 = *virtual* address to jump to upon completion
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment