|
@@ -15,6 +15,12 @@
|
|
|
#define ATAG_CORE_SIZE ((2*4 + 3*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
|
|
|
* ought to tell the user, but since we don't have any guarantee that
|
|
@@ -28,20 +34,26 @@
|
|
|
|
|
|
/* 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 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
|
|
|
* may also be able to move the ATAGS block if necessary.
|
|
|
*
|
|
|
* Returns:
|
|
|
- * r2 either valid atags pointer, or zero
|
|
|
+ * r2 either valid atags pointer, valid dtb pointer, or zero
|
|
|
* r5, r6 corrupted
|
|
|
*/
|
|
|
__vet_atags:
|
|
|
tst r2, #0x3 @ aligned?
|
|
|
bne 1f
|
|
|
|
|
|
- ldr r5, [r2, #0] @ is first tag ATAG_CORE?
|
|
|
- cmp r5, #ATAG_CORE_SIZE
|
|
|
+ ldr r5, [r2, #0]
|
|
|
+#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
|
|
|
bne 1f
|
|
|
ldr r5, [r2, #4]
|
|
@@ -49,7 +61,7 @@ __vet_atags:
|
|
|
cmp r5, r6
|
|
|
bne 1f
|
|
|
|
|
|
- mov pc, lr @ atag pointer is ok
|
|
|
+2: mov pc, lr @ atag/dtb pointer is ok
|
|
|
|
|
|
1: mov r2, #0
|
|
|
mov pc, lr
|
|
@@ -61,7 +73,7 @@ ENDPROC(__vet_atags)
|
|
|
*
|
|
|
* r0 = cp#15 control register
|
|
|
* r1 = machine ID
|
|
|
- * r2 = atags pointer
|
|
|
+ * r2 = atags/dtb pointer
|
|
|
* r9 = processor ID
|
|
|
*/
|
|
|
__INIT
|