diff options
Diffstat (limited to 'arch/arm/boot/compressed/head.S')
| -rw-r--r-- | arch/arm/boot/compressed/head.S | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index ba5c552f8c69..9f5ac11ccd8e 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
| @@ -246,6 +246,38 @@ restart: adr r0, LC0 | |||
| 246 | cmp lr, r1 | 246 | cmp lr, r1 |
| 247 | bne dtb_check_done @ not found | 247 | bne dtb_check_done @ not found |
| 248 | 248 | ||
| 249 | #ifdef CONFIG_ARM_ATAG_DTB_COMPAT | ||
| 250 | /* | ||
| 251 | * OK... Let's do some funky business here. | ||
| 252 | * If we do have a DTB appended to zImage, and we do have | ||
| 253 | * an ATAG list around, we want the later to be translated | ||
| 254 | * and folded into the former here. To be on the safe side, | ||
| 255 | * let's temporarily move the stack away into the malloc | ||
| 256 | * area. No GOT fixup has occurred yet, but none of the | ||
| 257 | * code we're about to call uses any global variable. | ||
| 258 | */ | ||
| 259 | add sp, sp, #0x10000 | ||
| 260 | stmfd sp!, {r0-r3, ip, lr} | ||
| 261 | mov r0, r8 | ||
| 262 | mov r1, r6 | ||
| 263 | sub r2, sp, r6 | ||
| 264 | bl atags_to_fdt | ||
| 265 | |||
| 266 | /* | ||
| 267 | * If returned value is 1, there is no ATAG at the location | ||
| 268 | * pointed by r8. Try the typical 0x100 offset from start | ||
| 269 | * of RAM and hope for the best. | ||
| 270 | */ | ||
| 271 | cmp r0, #1 | ||
| 272 | sub r0, r4, #(TEXT_OFFSET - 0x100) | ||
| 273 | mov r1, r6 | ||
| 274 | sub r2, sp, r6 | ||
| 275 | blne atags_to_fdt | ||
| 276 | |||
| 277 | ldmfd sp!, {r0-r3, ip, lr} | ||
| 278 | sub sp, sp, #0x10000 | ||
| 279 | #endif | ||
| 280 | |||
| 249 | mov r8, r6 @ use the appended device tree | 281 | mov r8, r6 @ use the appended device tree |
| 250 | 282 | ||
| 251 | /* | 283 | /* |
