remoteproc: stm32: load resource table from firmware
Load the optional resource table from the firmware, and write its address in the dedicated backup register. Signed-off-by: Fabien Dessenne <fabien.dessenne@st.com> Acked-by: Patrick Delaunay <patrick.delaunay@st.com>
This commit is contained in:
parent
790d5b3670
commit
33fd41951a
@ -22,12 +22,14 @@
|
|||||||
* @hold_boot_regmap: regmap for remote processor reset hold boot
|
* @hold_boot_regmap: regmap for remote processor reset hold boot
|
||||||
* @hold_boot_offset: offset of the register controlling the hold boot setting
|
* @hold_boot_offset: offset of the register controlling the hold boot setting
|
||||||
* @hold_boot_mask: bitmask of the register for the hold boot field
|
* @hold_boot_mask: bitmask of the register for the hold boot field
|
||||||
|
* @rsc_table_addr: resource table address
|
||||||
*/
|
*/
|
||||||
struct stm32_copro_privdata {
|
struct stm32_copro_privdata {
|
||||||
struct reset_ctl reset_ctl;
|
struct reset_ctl reset_ctl;
|
||||||
struct regmap *hold_boot_regmap;
|
struct regmap *hold_boot_regmap;
|
||||||
uint hold_boot_offset;
|
uint hold_boot_offset;
|
||||||
uint hold_boot_mask;
|
uint hold_boot_mask;
|
||||||
|
ulong rsc_table_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -139,6 +141,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)
|
static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size)
|
||||||
{
|
{
|
||||||
struct stm32_copro_privdata *priv;
|
struct stm32_copro_privdata *priv;
|
||||||
|
ulong rsc_table_size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
priv = dev_get_priv(dev);
|
priv = dev_get_priv(dev);
|
||||||
@ -153,6 +156,12 @@ static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size)
|
|||||||
return ret;
|
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);
|
return rproc_elf32_load_image(dev, addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,8 +172,11 @@ static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size)
|
|||||||
*/
|
*/
|
||||||
static int stm32_copro_start(struct udevice *dev)
|
static int stm32_copro_start(struct udevice *dev)
|
||||||
{
|
{
|
||||||
|
struct stm32_copro_privdata *priv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
priv = dev_get_priv(dev);
|
||||||
|
|
||||||
/* move hold boot from true to false start the copro */
|
/* move hold boot from true to false start the copro */
|
||||||
ret = stm32_copro_set_hold_boot(dev, false);
|
ret = stm32_copro_set_hold_boot(dev, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -177,6 +189,10 @@ static int stm32_copro_start(struct udevice *dev)
|
|||||||
ret = stm32_copro_set_hold_boot(dev, true);
|
ret = stm32_copro_set_hold_boot(dev, true);
|
||||||
writel(ret ? TAMP_COPRO_STATE_OFF : TAMP_COPRO_STATE_CRUN,
|
writel(ret ? TAMP_COPRO_STATE_OFF : TAMP_COPRO_STATE_CRUN,
|
||||||
TAMP_COPRO_STATE);
|
TAMP_COPRO_STATE);
|
||||||
|
if (!ret)
|
||||||
|
/* Store rsc_address in bkp register */
|
||||||
|
writel(priv->rsc_table_addr, TAMP_COPRO_RSC_TBL_ADDRESS);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user