armv7: preserve bootblock invocation parameter

Some platforms may pass as a parameter the maskrom or vendor startup
code information when calling the bootblock.

Make sure the bootblock startup code saves this parameter for use by
coreboot. As we don't want to touch memory before caches are
initialized, save the passed in parameter in r10 for the duration of
cache initialization.

Added warning comments to help enforcing that cache initialization
code does not touch r10.

BRANCH=storm
BUG=chrome-os-partner:30623
TEST=with the rest of the patches applied see the QCA uber-sbl report
     in the coreboot console output.

Change-Id: Ic6a09e8c3cf13ac4f2d12ee91c7ab41bc9aa95da
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: e41584f769eb042604883275b0d0bdfbf5b0d358
Original-Change-Id: I517a79dc95040326f46f0b80ee4e74bdddde8bf4
Original-Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/255144
Original-Reviewed-by: Julius Werner <jwerner@chromium.org>
Original-Commit-Queue: Vadim Bendebury <vbendeb@gmail.com>
Reviewed-on: http://review.coreboot.org/9842
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
Vadim Bendebury 2015-03-02 11:33:13 -08:00 committed by Patrick Georgi
parent 90fe5824b1
commit be7124ee1d
3 changed files with 27 additions and 2 deletions

View File

@ -32,6 +32,16 @@
#include <arch/asm.h> #include <arch/asm.h>
.arm .arm
/*
* Just in case the maskrom or the vendor basic firmware passes on a
* parameter when calling the bootblock, store it here for handling by C
* code.
*/
.section .bss, "aw" @nobits
.global maskrom_param
maskrom_param:
.word 0
ENTRY(_start) ENTRY(_start)
/* /*
* Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data * Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data
@ -45,6 +55,10 @@ ENDPROC(_start)
.thumb .thumb
ENTRY(_thumb_start) ENTRY(_thumb_start)
/* Preserve the maskrom passed value, if any */
mov r10, r0
bl arm_init_caches bl arm_init_caches
/* /*
@ -71,9 +85,14 @@ init_stack_loop:
cmp r0, r1 cmp r0, r1
bne init_stack_loop bne init_stack_loop
/* Set stackpointer in internal RAM to call bootblock main() */
call_bootblock: call_bootblock:
ldr sp, =_estack /* Set up stack pointer */
/* Restore parameter passed in by maskrom/vendor firmware. */
ldr r0, =maskrom_param
str r10, [r0]
/* Set stackpointer in internal RAM to call bootblock main() */
ldr sp, =_estack
ldr r0,=0x00000000 ldr r0,=0x00000000
/* /*
* The current design of cpu_info places the struct at the top of the * The current design of cpu_info places the struct at the top of the

View File

@ -43,6 +43,8 @@
* through the magic of double subtraction. It's quite ingenius, really. * through the magic of double subtraction. It's quite ingenius, really.
* Takes care to only use r0-r3 and ip so it's pefectly ABI-compatible without * Takes care to only use r0-r3 and ip so it's pefectly ABI-compatible without
* needing to write to memory. * needing to write to memory.
*
* THIS FUNCTION MUST PRESERVE THE VALUE OF r10
*/ */
.macro dcache_apply_all crm .macro dcache_apply_all crm
@ -109,6 +111,8 @@
* known state regarding caches/SCTLR. Completely cleans and invalidates * known state regarding caches/SCTLR. Completely cleans and invalidates
* icache/dcache, disables MMU and dcache (if active), and enables unaligned * icache/dcache, disables MMU and dcache (if active), and enables unaligned
* accesses, icache and branch prediction (if inactive). Clobbers r4 and r5. * accesses, icache and branch prediction (if inactive). Clobbers r4 and r5.
*
* THIS FUNCTION MUST PRESERVE THE VALUE OF r10
*/ */
ENTRY(arm_init_caches) ENTRY(arm_init_caches)
/* r4: SCTLR, return address: r5 (stay valid for the whole function) */ /* r4: SCTLR, return address: r5 (stay valid for the whole function) */

View File

@ -62,4 +62,6 @@ typedef struct {
#define UBER_SBL_SHARED_INFO_START_MAGIC 0x5552504d // URPM #define UBER_SBL_SHARED_INFO_START_MAGIC 0x5552504d // URPM
#define UBER_SBL_SHARED_INFO_END_MAGIC 0x554b5254 // UKRT #define UBER_SBL_SHARED_INFO_END_MAGIC 0x554b5254 // UKRT
extern uber_sbl_shared_info *maskrom_param;
#endif #endif