From mboxrd@z Thu Jan 1 00:00:00 1970 From: Suman Anna Date: Mon, 27 Jul 2020 12:17:59 -0500 Subject: [PATCH v2 06/18] arm: mach-k3: sysfw-loader: Add support for rom loading sysfw image In-Reply-To: <20200727094543.28484-7-lokeshvutla@ti.com> References: <20200727094543.28484-1-lokeshvutla@ti.com> <20200727094543.28484-7-lokeshvutla@ti.com> Message-ID: <4b488be6-e2fc-6844-933e-186582231e1e@ti.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Lokesh, On 7/27/20 4:45 AM, Lokesh Vutla wrote: > 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 > --- > arch/arm/mach-k3/am6_init.c | 2 +- > arch/arm/mach-k3/include/mach/sysfw-loader.h | 4 +- > arch/arm/mach-k3/j721e_init.c | 2 +- > 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 abdec76d73..4250ac355b 100644 > --- a/arch/arm/mach-k3/am6_init.c > +++ b/arch/arm/mach-k3/am6_init.c > @@ -155,7 +155,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); Any reason why you want to add the new argument at the front, rather than the end which is typical? > > /* 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 513be09c68..f62bfa995c 100644 > --- a/arch/arm/mach-k3/sysfw-loader.c > +++ b/arch/arm/mach-k3/sysfw-loader.c > @@ -32,6 +32,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; > > @@ -71,6 +77,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) Are you expecting the SYSTEM_CONTROLLER_RPROC_ID to be a different value from 0? Do you really need the rproc_id argument, rather than directly using it in code? regards Suman > +{ > + 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; > @@ -90,23 +116,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, > @@ -222,7 +234,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 }; > @@ -230,6 +243,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); >