rpi3: Do prescaler and control setup in C
authorAndre Przywara <andre.przywara@arm.com>
Mon, 15 Jul 2019 08:02:15 +0000 (09:02 +0100)
committerAndre Przywara <andre.przywara@arm.com>
Fri, 13 Sep 2019 15:54:21 +0000 (16:54 +0100)
To initialise the arch timer configuration and some clock prescaler, we
need to do two MMIO access *once*, early during boot.

As tempting as it may sound, plat_reset_handler() is not the right place
to do this, as it will be called on every CPU coming up, both for
secondary cores as well as during warmboots. So this access will be done
multiple times, and even during a rich OS' runtime. Whether doing so anyway
is actually harmful is hard to say, but we should definitely avoid this if
possible.

Move the initialisation of these registers to C code in
bl1_early_platform_setup(), where it will still be executed early enough
(before enabling the console), but only once during the whole boot
process.

Change-Id: I081c41a5476d424411411488ff8f633e87d3bcc5
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
plat/rpi/rpi3/aarch64/plat_helpers.S
plat/rpi/rpi3/rpi3_bl1_setup.c

index 556d87212b20a0466baeedf821ae5c8a2ddbc958..24278bdf6e9880725f402f3d8384ab7401e08127 100644 (file)
@@ -18,7 +18,6 @@
        .globl  plat_get_my_entrypoint
        .globl  plat_is_my_cpu_primary
        .globl  plat_my_core_pos
-       .globl  plat_reset_handler
        .globl  plat_rpi3_calc_core_pos
        .globl  plat_secondary_cold_boot_setup
 
@@ -164,16 +163,3 @@ func plat_crash_console_flush
        mov_imm x0, PLAT_RPI3_UART_BASE
        b       console_16550_core_flush
 endfunc plat_crash_console_flush
-
-       /* ---------------------------------------------
-        * void plat_reset_handler(void);
-        * ---------------------------------------------
-        */
-func plat_reset_handler
-       /* use the 19.2 MHz clock for the architected timer */
-       mov     x0, #RPI3_INTC_BASE_ADDRESS
-       mov     w1, #0x80000000
-       str     wzr, [x0, #RPI3_INTC_CONTROL_OFFSET]
-       str     w1, [x0, #RPI3_INTC_PRESCALER_OFFSET]
-       ret
-endfunc plat_reset_handler
index 31ad31c19e0291c391962425ddfbc750cbf19637..3ac30e0f0bee5c1e95aa7608afe4931182068318 100644 (file)
@@ -10,6 +10,7 @@
 #include <arch_helpers.h>
 #include <common/bl_common.h>
 #include <common/debug.h>
+#include <lib/mmio.h>
 #include <lib/xlat_tables/xlat_mmu_helpers.h>
 #include <lib/xlat_tables/xlat_tables_defs.h>
 
@@ -28,6 +29,11 @@ meminfo_t *bl1_plat_sec_mem_layout(void)
  ******************************************************************************/
 void bl1_early_platform_setup(void)
 {
+       /* use the 19.2 MHz clock for the architected timer */
+       mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_CONTROL_OFFSET, 0);
+       mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_PRESCALER_OFFSET,
+                     0x80000000);
+
        /* Initialize the console to provide early debug support */
        rpi3_console_init();