Eliminate firmware rendezvous
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Fri, 6 Jan 2017 08:13:53 +0000 (00:13 -0800)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Fri, 6 Jan 2017 08:18:51 +0000 (00:18 -0800)
The firmware rendezvous relied on a custom mailbox replacement to
coordinate ARM's bringup with the VPU sleeping. In practice, this is not
necessary as the VPU continues on as a parallel processor, and ARM
simply needs to wait for peripheral access (a feat it can do simply and
directly).

arm_chainloader/Makefile
arm_chainloader/firmware_rendezvous.c [deleted file]
arm_chainloader/main.c
arm_chainloader/start.s
arm_loader.c
hardware.h

index 937a3d1..6ae426c 100644 (file)
@@ -24,7 +24,6 @@ SRCS = \
        ../lib/panic.c \
        ../lib/udelay.c \
        ../lib/tlsf/tlsf.c \
-       firmware_rendezvous.c \
        minicxx.cc \
        loader.cc \
        main.c
diff --git a/arm_chainloader/firmware_rendezvous.c b/arm_chainloader/firmware_rendezvous.c
deleted file mode 100644 (file)
index 0b8064a..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdint.h>\r
-#include <hardware.h>\r
-#include <chainloader.h>\r
-\r
-extern void main();\r
-extern void uart_putc(int c);\r
-\r
-void _firmware_rendezvous() {\r
-       /* Channels to talk to the firmware */\r
-       volatile uint32_t* arm_membase = (volatile uint32_t*)0x0;\r
-       volatile uint32_t* comm1 = arm_membase + 8;\r
-       volatile uint32_t* comm2 = arm_membase + 9;\r
-       volatile uint32_t* comm3 = arm_membase + 10;\r
-       volatile uint32_t* comm4 = arm_membase + 11;\r
-\r
-       *comm1 = 0xCAFEEEEE;\r
-\r
-       /* \r
-        * check if we have peripheral access\r
-        * if so, we don't need the VPU anymore\r
-        */\r
-       if (ARM_ID != ARM_IDVAL) {\r
-               *comm1 = 0xDEADCAFE;\r
-               return;\r
-       }\r
-\r
-       *comm4 = VPU_KILL_COMMAND;\r
-\r
-       /* stall for a bit to let the VPU commit suicide */\r
-       for (int i = 0; i < 0x10000; i++)\r
-               *comm2 = i;\r
-\r
-       main();\r
-}
\ No newline at end of file
index c3df8d9..d83eefc 100644 (file)
@@ -31,6 +31,9 @@ static void heap_init() {
 }
 
 void main() {
+       /* wait for peripheral access */
+       while(ARM_ID != ARM_IDVAL);
+
        logf("Started on ARM, continuing boot from here ...\n");
 
        heap_init();
index 77ae42a..183f033 100644 (file)
@@ -37,12 +37,6 @@ _start:
        nop\r
        nop\r
 \r
-       /* comm chan */\r
-       nop\r
-       nop\r
-       nop\r
-       nop\r
-\r
 L_all_cores_start:\r
         /* check CPU id */\r
        mrc p15, 0, r0, c0, c0, 5       @ read MPIDR\r
@@ -60,7 +54,7 @@ L_core0:
         orr r0, r0, #1\r
         mcr p15, 0, r0, c1, c1, 0\r
 \r
-       b _firmware_rendezvous\r
+       b main\r
 \r
 L_deadloop:\r
        b L_deadloop\r
index 7ef48e5..775d758 100644 (file)
@@ -266,18 +266,4 @@ void arm_init() {
        enable_power();\r
        /* start io bridge */\r
        setup_bridge(true);\r
-       logf("polling ARM state ...\n");\r
-\r
-       volatile uint32_t* arm_membase = (volatile uint32_t*)ARM_MEMORY_BASE;\r
-\r
-       /* skip vectors and get to comm chan */\r
-       arm_membase += 8;\r
-\r
-       for (;;/*int i = 0; i < 10; i++*/) {\r
-               if (arm_membase[3] == VPU_KILL_COMMAND) {\r
-                       return;\r
-               }\r
-               logf("0x%X 0x%X 0x%X 0x%X\n", arm_membase[0], arm_membase[1], arm_membase[2], arm_membase[3]);\r
-               udelay(5000);\r
-       }\r
 }\r
index 23faed4..8f599f6 100644 (file)
@@ -20,8 +20,6 @@ that are missing from the release. This is also used by ARM.
 \r
 #pragma once\r
 \r
-#define VPU_KILL_COMMAND 0xAAAAFFFF\r
-\r
 #define VC4_PERIPH_BASE 0x7E000000\r
 #define ARM_PERIPH_BASE 0x3F000000\r
 \r
This page took 0.033362 seconds and 4 git commands to generate.