Merge pull request #5 from bobbybee/master
[rpi-open-firmware.git] / arm_loader.c
old mode 100755 (executable)
new mode 100644 (file)
index 748a810..9d1d977
@@ -17,10 +17,12 @@ ARM initialization stuff.
 \r
 =============================================================================*/\r
 \r
-#include "lib/common.h"\r
+#include <common.h>\r
 #include "hardware.h"\r
 \r
 \r
+#define logf(fmt, ...) printf("[ARMLDR:%s]: " fmt, __FUNCTION__, ##__VA_ARGS__);\r
+\r
 extern char L_arm_code_start;\r
 extern char L_arm_code_end;\r
 \r
@@ -30,7 +32,7 @@ extern char L_arm_code_end;
 /* XXX: What is this? */\r
 #define PM_UNK_CFG_CLR 0xFFFCFFFF\r
 \r
-static bool arm_power_wait_bit(uint32_t bit) {\r
+static bool power_wait_bit(uint32_t bit) {\r
        for (int i = 0; i < 20; i++) {\r
                if (PM_PROC & bit) {\r
                        return true;\r
@@ -40,18 +42,18 @@ static bool arm_power_wait_bit(uint32_t bit) {
        return false;\r
 }\r
 \r
-static inline void arm_assert_global_reset() {\r
-       printf("%s: RSTN ...\n", __FUNCTION__);\r
+static inline void assert_global_reset() {\r
+       logf("RSTN ...\n");\r
        PM_PROC |= PM_PASSWORD | PM_PROC_ARMRSTN_SET;\r
        udelay(300);\r
 }\r
 \r
-static void arm_enable_power() {\r
+static void enable_power() {\r
        uint32_t pmv;\r
 \r
-       printf("%s: INIT PM_PROC: 0x%X\n", __FUNCTION__, PM_PROC);\r
+       logf("INIT PM_PROC: 0x%X\n", PM_PROC);\r
 \r
-       printf("%s: requesting power up ...\n", __FUNCTION__);\r
+       logf("requesting power up ...\n");\r
 \r
        /* deassert all reset lines */\r
        pmv = ((PM_PROC & PM_PROC_ARMRSTN_CLR) & PM_UNK_CFG_CLR) | PM_PASSWORD;\r
@@ -62,19 +64,19 @@ static void arm_enable_power() {
        udelay(10);\r
        PM_PROC = pmv;\r
 \r
-       printf("%s: POWUP PM_PROC: 0x%X\n", __FUNCTION__, PM_PROC); \r
+       logf("POWUP PM_PROC: 0x%X\n", PM_PROC); \r
 \r
        /* wait for POWOK */\r
-       printf("%s: waiting for power up ...\n", __FUNCTION__);\r
+       logf("waiting for power up ...\n");\r
        for (int i = 1; i < 5; i++) {\r
-               if (!arm_power_wait_bit(PM_PROC_POWOK_SET)) {\r
+               if (!power_wait_bit(PM_PROC_POWOK_SET)) {\r
                        /* only go up to 3 */\r
                        if (i == 4) {\r
                                panic("timed out waiting for power up, state of PM_PROC is: 0x%X", PM_PROC);\r
                        }\r
 \r
                        pmv = (pmv & PM_UNK_CFG_CLR) | (i << PM_PROC_CFG_LSB);\r
-                       printf("%s: timed out, trying different CFG: 0x%X \n", __FUNCTION__, pmv);\r
+                       logf("timed out, trying different CFG: 0x%X \n", pmv);\r
                        PM_PROC = pmv;\r
                }\r
        }\r
@@ -85,20 +87,20 @@ static void arm_enable_power() {
        pmv |= PM_PROC_MEMREP_SET;\r
        PM_PROC = pmv;\r
 \r
-       printf("%s: waiting for MRDONE ...\n", __FUNCTION__);\r
-       if (!arm_power_wait_bit(PM_PROC_MRDONE_SET)) {\r
+       logf("waiting for MRDONE ...\n");\r
+       if (!power_wait_bit(PM_PROC_MRDONE_SET)) {\r
                panic("timed out waiting for MRDONE, state of PM_PROC is: 0x%X", PM_PROC);\r
        }\r
 \r
-       printf("%s: setting ISFUNC ...\n", __FUNCTION__);\r
+       logf("setting ISFUNC ...\n");\r
 \r
        pmv |= PM_PROC_ISFUNC_SET;\r
        PM_PROC = pmv;\r
 \r
-       printf("%s: ARM power domain initialized succesfully, state of PM_PROC is: 0x%X!\n", __FUNCTION__, PM_PROC);\r
+       logf("ARM power domain initialized succesfully, state of PM_PROC is: 0x%X!\n", PM_PROC);\r
 }\r
 \r
-static void arm_bresp_cycle_write(uint32_t bits) {\r
+static void bresp_cycle_write(uint32_t bits) {\r
        ARM_CONTROL0 = (ARM_CONTROL0 & ~(ARM_C0_BRESP1|ARM_C0_BRESP2)) | bits;\r
        printf("0x%X,", bits);\r
        udelay(30);\r
@@ -111,12 +113,12 @@ static uint32_t g_BrespTab[] = {
        0x10, 0x14, 0x18, 0x14, 0x10, 0x14, 0x10, 0x14, 0x10, 0x14, 0x10, 0x14, 0x10, 0x0,\r
        0x10, 0x14, 0x18, 0x14, 0x18, 0x14, 0x10, 0x14, 0x10, 0x14, 0x10, 0x14, 0x18, 0x0\r
 };\r
-static void arm_bresp_cycle() {\r
+static void do_bresp_cycle() {\r
        /* my little axi - peripherals are magic */\r
-       printf("Cycling AXI bits ...\n\t", __FUNCTION__);\r
+       logf("Cycling AXI bits ...\n\t");\r
        \r
        for (int i = 0; i < sizeof(g_BrespTab)/sizeof(g_BrespTab[0]); i++) {\r
-               arm_bresp_cycle_write(g_BrespTab[i]);\r
+               bresp_cycle_write(g_BrespTab[i]);\r
 \r
                if (i && ((i % 14) == 0))\r
                        printf("\n\t");\r
@@ -125,13 +127,13 @@ static void arm_bresp_cycle() {
        printf("\n");\r
 }\r
 \r
-void arm_setup_bridge(bool bresp_cycle) {\r
-       printf("%s: setting up async bridge ...\n", __FUNCTION__);\r
+void setup_bridge(bool bresp_cycle) {\r
+       logf("setting up async bridge ...\n");\r
  \r
        if (bresp_cycle) {\r
-               arm_assert_global_reset();\r
-               arm_bresp_cycle();\r
-               arm_assert_global_reset();\r
+               assert_global_reset();\r
+               do_bresp_cycle();\r
+               assert_global_reset();\r
                udelay(300);\r
        }\r
 \r
@@ -139,17 +141,17 @@ void arm_setup_bridge(bool bresp_cycle) {
        udelay(300);\r
 \r
        if (!bresp_cycle) \r
-               arm_assert_global_reset();\r
+               assert_global_reset();\r
        \r
-       printf("%s: bridge init done, PM_PROC is now: 0x%X!\n", __FUNCTION__, PM_PROC);\r
+       logf("bridge init done, PM_PROC is now: 0x%X!\n", PM_PROC);\r
 }\r
 \r
-static void arm_set_clock_source(unsigned int source) {\r
+static void set_clock_source(unsigned int source) {\r
        CM_ARMCTL = CM_PASSWORD | source | CM_ARMCTL_ENAB_SET;\r
 }\r
 \r
-static void arm_enable_clock() {\r
-       printf("%s: initializing PLLB ...\n", __FUNCTION__);\r
+static void enable_clock() {\r
+       logf("initializing PLLB ...\n");\r
 \r
        /* oscillator->pllb */\r
        A2W_XOSC_CTRL |= A2W_PASSWORD | A2W_XOSC_CTRL_PLLBEN_SET;\r
@@ -183,12 +185,12 @@ static void arm_enable_clock() {
        CM_PLLB = CM_PASSWORD | CM_PLLB_DIGRST_SET | CM_PLLB_ANARST_SET | CM_PLLB_HOLDARM_SET;\r
        CM_PLLB = CM_PASSWORD;\r
 \r
-       arm_set_clock_source(4);\r
+       set_clock_source(4);\r
 \r
-       printf("KAIP  = 0x%X\n", A2W_PLLB_ANA_KAIP);\r
-       printf("MULTI = 0x%X\n", A2W_PLLB_ANA_MULTI);\r
+       logf("KAIP  = 0x%X\n", A2W_PLLB_ANA_KAIP);\r
+       logf("MULTI = 0x%X\n", A2W_PLLB_ANA_MULTI);\r
 \r
-       printf("%s: ARM clock succesfully initialized!\n", __FUNCTION__);\r
+       logf("ARM clock succesfully initialized!\n");\r
 }\r
 \r
 static void arm_load_code() {\r
@@ -200,7 +202,7 @@ static void arm_load_code() {
 \r
        bcopy(start, mem, size);\r
 \r
-       printf("%s: copied %d bytes to 0x%X!\n", __FUNCTION__, size, ARM_MEMORY_BASE);\r
+       logf("copied %d bytes to 0x%X!\n", size, ARM_MEMORY_BASE);\r
 \r
        /* verify */\r
        for (int i = 0; i < size; i++) {\r
@@ -219,7 +221,7 @@ static void arm_pmap_enter(uint32_t bus_address, uint32_t arm_address) {
 \r
        tte[index] = pte; \r
 \r
-       printf("Translation: [0x%X => 0x%X] 0x%X => 0x%X\n", index * 4, bus_address >> 21, bus_address, arm_address);\r
+       //logf("Translation: [0x%X => 0x%X] 0x%X => 0x%X\n", index * 4, bus_address >> 21, bus_address, arm_address);\r
 }\r
 \r
 /*\r
@@ -229,37 +231,39 @@ static void arm_pmap_enter(uint32_t bus_address, uint32_t arm_address) {
  */\r
 \r
 void arm_init() {\r
-       printf("ARM LOADER: build date %s %s\n", __DATE__, __TIME__);\r
-\r
-       printf("%s: starting ARM initialization!\n", __FUNCTION__);\r
+       logf("arm init started\n");\r
 \r
        arm_load_code();\r
 \r
-       printf("%s: original memstart: 0x%X\n", __FUNCTION__, *((volatile uint32_t*)ARM_MEMORY_BASE));\r
+       logf("original memstart: 0x%X\n", *((volatile uint32_t*)ARM_MEMORY_BASE));\r
 \r
-       for (uint32_t i = 0; i < 6; i++) {\r
+       for (uint32_t i = 0; i < 62; i++) {\r
                uint32_t offset = i * 0x1000000;\r
-               arm_pmap_enter(0xC0000000 + offset, 0x0 + offset);\r
+               arm_pmap_enter(ARM_MEMORY_BASE + offset, 0x0 + offset);\r
        }\r
 \r
+       logf("mapped VC 0x%X to ARM 0x%X\n", ARM_MEMORY_BASE, 0);\r
+\r
        arm_pmap_enter(VC4_PERIPH_BASE, ARM_PERIPH_BASE);\r
 \r
+       logf("mapped peripherals VC 0x%X to ARM 0x%X\n", VC4_PERIPH_BASE, ARM_PERIPH_BASE);\r
+\r
        /* see if the ARM block is responding */\r
-       printf("%s: ARM ID: 0x%X C0: 0x%X\n", __FUNCTION__, ARM_ID, ARM_CONTROL0);\r
+       logf("ARM ID: 0x%X C0: 0x%X\n", ARM_ID, ARM_CONTROL0);\r
 \r
        /*\r
         * enable peripheral access, map arm secure bits to axi secure bits 1:1 and\r
         * set the mem size for who knows what reason.\r
         */\r
-       ARM_CONTROL0 |= 0x000 | ARM_C0_APROTSYST | ARM_C0_SIZ1G | ARM_C0_FULLPERI;\r
+       ARM_CONTROL0 |= 0x008 | ARM_C0_APROTSYST | ARM_C0_SIZ1G | ARM_C0_FULLPERI;\r
 \r
-       printf("%s: using C0: 0x%X\n", __FUNCTION__, ARM_CONTROL0);\r
+       logf("using C0: 0x%X\n", ARM_CONTROL0);\r
 \r
-       arm_enable_clock();\r
-       arm_enable_power();\r
+       enable_clock();\r
+       enable_power();\r
        /* start io bridge */\r
-       arm_setup_bridge(true);\r
-       printf("%s: polling ARM state ...\n", __FUNCTION__);\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
@@ -268,9 +272,9 @@ void arm_init() {
 \r
        for (;;/*int i = 0; i < 10; i++*/) {\r
                if (arm_membase[3] == VPU_KILL_COMMAND) {\r
-                       panic("ARM requested VPU halt, gooodbye VPU ...");\r
+                       return;\r
                }\r
-               printf("0x%X 0x%X 0x%X 0x%X\n", arm_membase[0], arm_membase[1], arm_membase[2], arm_membase[3]);\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
 }
\ No newline at end of file
This page took 0.038857 seconds and 4 git commands to generate.