diff options
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-k3/am6_init.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-k3/include/mach/sysfw-loader.h | 4 | ||||
-rw-r--r-- | arch/arm/mach-k3/j721e_init.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-k3/sysfw-loader.c | 56 |
4 files changed, 43 insertions, 21 deletions
diff --git a/arch/arm/mach-k3/am6_init.c b/arch/arm/mach-k3/am6_init.c index e66d1c1fe1..603834e507 100644 --- a/arch/arm/mach-k3/am6_init.c +++ b/arch/arm/mach-k3/am6_init.c @@ -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(); diff --git a/arch/arm/mach-k3/include/mach/sysfw-loader.h b/arch/arm/mach-k3/include/mach/sysfw-loader.h index 6f5612b4fd..b23a9e821e 100644 --- a/arch/arm/mach-k3/include/mach/sysfw-loader.h +++ b/arch/arm/mach-k3/include/mach/sysfw-loader.h @@ -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 diff --git a/arch/arm/mach-k3/j721e_init.c b/arch/arm/mach-k3/j721e_init.c index 2010cab1d1..461a9d7f8f 100644 --- a/arch/arm/mach-k3/j721e_init.c +++ b/arch/arm/mach-k3/j721e_init.c @@ -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(); diff --git a/arch/arm/mach-k3/sysfw-loader.c b/arch/arm/mach-k3/sysfw-loader.c index f4b0d4a928..78c158c63f 100644 --- a/arch/arm/mach-k3/sysfw-loader.c +++ b/arch/arm/mach-k3/sysfw-loader.c @@ -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); |