From mboxrd@z Thu Jan 1 00:00:00 1970 From: Fabien Dessenne Date: Wed, 9 Oct 2019 17:36:27 +0200 Subject: [U-Boot] [PATCH 3/5] remoteproc: stm32: load resource table from firmware In-Reply-To: <1570635389-8445-1-git-send-email-fabien.dessenne@st.com> References: <1570635389-8445-1-git-send-email-fabien.dessenne@st.com> Message-ID: <1570635389-8445-4-git-send-email-fabien.dessenne@st.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Load the optional resource table from the firmware, and write its address in the dedicated backup register. Signed-off-by: Fabien Dessenne --- drivers/remoteproc/stm32_copro.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/remoteproc/stm32_copro.c b/drivers/remoteproc/stm32_copro.c index 40bba37..eef3416 100644 --- a/drivers/remoteproc/stm32_copro.c +++ b/drivers/remoteproc/stm32_copro.c @@ -23,6 +23,7 @@ * @hold_boot_offset: offset of the register controlling the hold boot setting * @hold_boot_mask: bitmask of the register for the hold boot field * @is_running: is the remote processor running + * @rsc_table_addr: resource table address */ struct stm32_copro_privdata { struct reset_ctl reset_ctl; @@ -30,6 +31,7 @@ struct stm32_copro_privdata { uint hold_boot_offset; uint hold_boot_mask; bool is_running; + ulong rsc_table_addr; }; /** @@ -141,6 +143,7 @@ static void *stm32_copro_device_to_virt(struct udevice *dev, ulong da, static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size) { struct stm32_copro_privdata *priv; + ulong rsc_table_size; int ret; priv = dev_get_priv(dev); @@ -155,6 +158,12 @@ static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size) return ret; } + if (rproc_elf32_load_rsc_table(dev, addr, size, &priv->rsc_table_addr, + &rsc_table_size)) { + priv->rsc_table_addr = 0; + dev_warn(dev, "No valid resource table for this firmware\n"); + } + return rproc_elf32_load_image(dev, addr, size); } @@ -180,6 +189,10 @@ static int stm32_copro_start(struct udevice *dev) * rebooting autonomously */ ret = stm32_copro_set_hold_boot(dev, true); + if (!ret) + /* Store rsc_address in bkp register */ + writel(priv->rsc_table_addr, TAMP_COPRO_RSC_TBL_ADDRESS); + priv->is_running = !ret; return ret; } -- 2.7.4