| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Suman Anna <s-anna@ti.com> |
| Date: Tue, 16 May 2017 17:13:45 -0500 |
| Subject: ARM: davinci: da8xx: Create DSP device only when assigned memory |
| |
| From: Suman Anna <s-anna@ti.com> |
| |
| |
| [ Upstream commit f97f03578b997a8ec2b9bc4928f958a865137268 ] |
| |
| The DSP device on Davinci platforms does not have an MMU and requires |
| specific DDR memory to boot. This memory is reserved using the rproc_mem |
| kernel boot parameter and is assigned to the device on non-DT boots. |
| The remoteproc core uses the DMA API and so will fall back to assigning |
| random memory if this memory is not assigned to the device, but the DSP |
| remote processor boot will not be successful in such cases. So, check |
| that memory has been reserved and assigned to the device specifically |
| before even creating the DSP device. |
| |
| Signed-off-by: Suman Anna <s-anna@ti.com> |
| Signed-off-by: Sekhar Nori <nsekhar@ti.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/arm/mach-davinci/devices-da8xx.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| --- a/arch/arm/mach-davinci/devices-da8xx.c |
| +++ b/arch/arm/mach-davinci/devices-da8xx.c |
| @@ -821,6 +821,8 @@ static struct platform_device da8xx_dsp |
| .resource = da8xx_rproc_resources, |
| }; |
| |
| +static bool rproc_mem_inited __initdata; |
| + |
| #if IS_ENABLED(CONFIG_DA8XX_REMOTEPROC) |
| |
| static phys_addr_t rproc_base __initdata; |
| @@ -859,6 +861,8 @@ void __init da8xx_rproc_reserve_cma(void |
| ret = dma_declare_contiguous(&da8xx_dsp.dev, rproc_size, rproc_base, 0); |
| if (ret) |
| pr_err("%s: dma_declare_contiguous failed %d\n", __func__, ret); |
| + else |
| + rproc_mem_inited = true; |
| } |
| |
| #else |
| @@ -873,6 +877,12 @@ int __init da8xx_register_rproc(void) |
| { |
| int ret; |
| |
| + if (!rproc_mem_inited) { |
| + pr_warn("%s: memory not reserved for DSP, not registering DSP device\n", |
| + __func__); |
| + return -ENOMEM; |
| + } |
| + |
| ret = platform_device_register(&da8xx_dsp); |
| if (ret) |
| pr_err("%s: can't register DSP device: %d\n", __func__, ret); |