]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arm: mach-k3: sysfw-loader: Add support for rom loading sysfw image
authorLokesh Vutla <lokeshvutla@ti.com>
Wed, 5 Aug 2020 17:14:18 +0000 (22:44 +0530)
committerLokesh Vutla <lokeshvutla@ti.com>
Tue, 11 Aug 2020 15:04:46 +0000 (20:34 +0530)
Starting J7200 SoC, ROM supports for loading sysfw directly from boot
image. In such cases, SPL need not load sysfw from boot media, but need
to receive boot notification message from sysfw. So separate out
remoteproc calls for system controller from sysfw loader and just
receive the boot notification if sysfw is already loaded.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Reviewed-by: Suman Anna <s-anna@ti.com>
arch/arm/mach-k3/am6_init.c
arch/arm/mach-k3/include/mach/sysfw-loader.h
arch/arm/mach-k3/j721e_init.c
arch/arm/mach-k3/sysfw-loader.c

index e66d1c1fe14af6ebb74953b55d5b4582fc92bc32..603834e5078b5a1645753de6d347a830e1fc5da1 100644 (file)
@@ -216,7 +216,7 @@ void board_init_f(ulong dummy)
         * Load, start up, and configure system controller firmware while
         * also populating the SYSFW post-PM configuration callback hook.
         */
-       k3_sysfw_loader(k3_mmc_stop_clock, k3_mmc_restart_clock);
+       k3_sysfw_loader(false, k3_mmc_stop_clock, k3_mmc_restart_clock);
 
        /* Prepare console output */
        preloader_console_init();
index 6f5612b4fd3fdf46f1e4f584ebe554cc1bd27430..b23a9e821ed974cca56fe10ca80bcc5204293bc2 100644 (file)
@@ -7,6 +7,8 @@
 #ifndef _SYSFW_LOADER_H_
 #define _SYSFW_LOADER_H_
 
-void k3_sysfw_loader(void (*config_pm_pre_callback)(void), void (*config_pm_done_callback)(void));
+void k3_sysfw_loader(bool rom_loaded_sysfw,
+                    void (*config_pm_pre_callback)(void),
+                    void (*config_pm_done_callback)(void));
 
 #endif
index 2010cab1d1da865f8b53c6c12ce486beb175a2de..461a9d7f8f6807339642f18b61b4cca6ee80c2e8 100644 (file)
@@ -174,7 +174,7 @@ void board_init_f(ulong dummy)
         * callback hook, effectively switching on (or over) the console
         * output.
         */
-       k3_sysfw_loader(k3_mmc_stop_clock, k3_mmc_restart_clock);
+       k3_sysfw_loader(false, k3_mmc_stop_clock, k3_mmc_restart_clock);
 
        /* Prepare console output */
        preloader_console_init();
index f4b0d4a92830466c9ee250bffbedab54a5e974fa..78c158c63f71f3220dc57507f344d2428a3c3199 100644 (file)
@@ -33,6 +33,12 @@ DECLARE_GLOBAL_DATA_PTR;
 #define SYSFW_CFG_RM                   "rm-cfg.bin"
 #define SYSFW_CFG_SEC                  "sec-cfg.bin"
 
+/*
+ * It is assumed that remoteproc device 0 is the corresponding
+ * system-controller that runs SYSFW. Make sure DT reflects the same.
+ */
+#define K3_SYSTEM_CONTROLLER_RPROC_ID  0
+
 static bool sysfw_loaded;
 static void *sysfw_load_address;
 
@@ -72,6 +78,26 @@ static int fit_get_data_by_name(const void *fit, int images, const char *name,
        return fit_image_get_data(fit, node_offset, addr, size);
 }
 
+static void k3_start_system_controller(int rproc_id, bool rproc_loaded,
+                                      ulong addr, ulong size)
+{
+       int ret;
+
+       ret = rproc_dev_init(rproc_id);
+       if (ret)
+               panic("rproc failed to be initialized (%d)\n", ret);
+
+       if (!rproc_loaded) {
+               ret = rproc_load(rproc_id, addr, size);
+               if (ret)
+                       panic("Firmware failed to start on rproc (%d)\n", ret);
+       }
+
+       ret = rproc_start(0);
+       if (ret)
+               panic("Firmware init failed on rproc (%d)\n", ret);
+}
+
 static void k3_sysfw_load_using_fit(void *fit)
 {
        int images;
@@ -91,23 +117,9 @@ static void k3_sysfw_load_using_fit(void *fit)
                panic("Error accessing %s node in FIT (%d)\n", SYSFW_FIRMWARE,
                      ret);
 
-       /*
-        * Start up system controller firmware
-        *
-        * It is assumed that remoteproc device 0 is the corresponding
-        * system-controller that runs SYSFW. Make sure DT reflects the same.
-        */
-       ret = rproc_dev_init(0);
-       if (ret)
-               panic("rproc failed to be initialized (%d)\n", ret);
-
-       ret = rproc_load(0, (ulong)sysfw_addr, (ulong)sysfw_size);
-       if (ret)
-               panic("Firmware failed to start on rproc (%d)\n", ret);
-
-       ret = rproc_start(0);
-       if (ret)
-               panic("Firmware init failed on rproc (%d)\n", ret);
+       /* Start up system controller firmware */
+       k3_start_system_controller(K3_SYSTEM_CONTROLLER_RPROC_ID, false,
+                                  (ulong)sysfw_addr, (ulong)sysfw_size);
 }
 
 static void k3_sysfw_configure_using_fit(void *fit,
@@ -223,7 +235,8 @@ static void *k3_sysfw_get_spi_addr(void)
 }
 #endif
 
-void k3_sysfw_loader(void (*config_pm_pre_callback) (void),
+void k3_sysfw_loader(bool rom_loaded_sysfw,
+                    void (*config_pm_pre_callback)(void),
                     void (*config_pm_done_callback)(void))
 {
        struct spl_image_info spl_image = { 0 };
@@ -231,6 +244,13 @@ void k3_sysfw_loader(void (*config_pm_pre_callback) (void),
        struct ti_sci_handle *ti_sci;
        int ret = 0;
 
+       if (rom_loaded_sysfw) {
+               k3_start_system_controller(K3_SYSTEM_CONTROLLER_RPROC_ID,
+                                          rom_loaded_sysfw, 0, 0);
+               sysfw_loaded = true;
+               return;
+       }
+
        /* Reserve a block of aligned memory for loading the SYSFW image */
        sysfw_load_address = memalign(ARCH_DMA_MINALIGN,
                                      CONFIG_K3_SYSFW_IMAGE_SIZE_MAX);