linux/drivers/remoteproc
Suman Anna 6dedbd1d54 remoteproc: k3-r5: Add a remoteproc driver for R5F subsystem
The TI K3 family of SoCs typically have one or more dual-core Arm Cortex
R5F processor clusters/subsystems (R5FSS). This R5F subsystem/cluster
can be configured at boot time to be either run in a LockStep mode or in
an Asymmetric Multi Processing (AMP) fashion in Split-mode. This subsystem
has 64 KB each Tightly-Coupled Memory (TCM) internal memories for each
core split between two banks - TCMA and TCMB (further interleaved into
two banks). The subsystem does not have an MMU, but has a Region Address
Translater (RAT) module that is accessible only from the R5Fs for providing
translations between 32-bit CPU addresses into larger system bus addresses.

Add a remoteproc driver to support this subsystem to be able to load and
boot the R5F cores primarily in LockStep mode. The code also includes the
base support for Split mode. Error Recovery and Power Management features
are not currently supported. Loading support includes the internal TCMs
and DDR. RAT support is left for a future patch, and as such the reserved
memory carveout regions are all expected to be using memory regions within
the first 2 GB.

The R5F remote processors do not have an MMU, and so require fixed memory
carveout regions matching the firmware image addresses. Support for this
is provided by mandating multiple memory regions to be attached to the
remoteproc device. The first memory region will be used to serve as the
DMA pool for all dynamic allocations like the vrings and vring buffers.
The remaining memory regions are mapped into the kernel at device probe
time, and are used to provide address translations for firmware image
segments without the need for any RSC_CARVEOUT entries. Any firmware
image using memory outside of the supplied reserved memory carveout
regions will be errored out.

The R5F processors on TI K3 SoCs require a specific sequence for booting
and shutting down the processors. This sequence is also dependent on the
mode (LockStep or Split) the R5F cluster is configured for. The R5F cores
have a Memory Protection Unit (MPU) that has a default configuration that
does not allow the cores to run out of DDR out of reset. This is resolved
by using the TCMs for boot-strapping code that applies the appropriate
executable permissions on desired DDR memory. The loading into the TCMs
requires that the resets be released first with the cores in halted state.
The Power Sleep Controller (PSC) module on K3 SoCs requires that the cores
be in WFI/WFE states with no active bus transactions before the cores can
be put back into reset. Support for this is provided by using the newly
introduced .prepare() and .unprepare() ops in the remoteproc core. The
.prepare() ops is invoked before any loading, and the .unprepare() ops
is invoked after the remoteproc resource cleanup. The R5F core resets
are deasserted in .prepare() and asserted in .unprepare(), and the cores
themselves are started and halted in .start() and .stop() ops. This
ensures symmetric usage and allows the R5F cores state machine to be
maintained properly between using the sysfs 'state' variable, bind/unbind
and regular module load/unload flows.

The subsystem is represented as a single remoteproc in LockStep mode, and
as two remoteprocs in Split mode. The driver uses various TI-SCI interfaces
to talk to the System Controller (DMSC) for managing configuration, power
and reset management of these cores. IPC between the A53 cores and the R5
cores is supported through the virtio rpmsg stack using shared memory and
OMAP Mailboxes.

The AM65x SoCs typically have a single R5FSS in the MCU voltage domain. The
J721E SoCs uses a slightly revised IP and typically have three R5FSSs, with
one cluster present within the MCU voltage domain (MCU_R5FSS0), and the
remaining two clusters present in the MAIN voltage domain (MAIN_R5FSS0 and
MAIN_R5FSS1). The integration of these clusters on J721E SoC is also
slightly different in that these IPs do support an actual local reset line,
while they are a no-op on AM65x SoCs.

Signed-off-by: Suman Anna <s-anna@ti.com>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Link: https://lore.kernel.org/r/20201002234234.20704-3-s-anna@ti.com
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
2020-10-13 18:34:38 -05:00
..
da8xx_remoteproc.c remoteproc: Remove dev_err() usage after platform_get_irq() 2019-08-26 21:59:58 -07:00
imx_rproc.c remoteproc: Use size_t type for len in da_to_va 2020-03-25 22:29:38 -07:00
ingenic_rproc.c remoteproc: ingenic: Move clock handling to prepare/unprepare callbacks 2020-07-01 16:05:18 -07:00
Kconfig remoteproc: k3-r5: Add a remoteproc driver for R5F subsystem 2020-10-13 18:34:38 -05:00
keystone_remoteproc.c remoteproc: Use size_t type for len in da_to_va 2020-03-25 22:29:38 -07:00
Makefile remoteproc: k3-r5: Add a remoteproc driver for R5F subsystem 2020-10-13 18:34:38 -05:00
mtk_common.h remoteproc/mediatek: Add support for mt8192 SCP 2020-09-25 23:37:42 -05:00
mtk_scp_ipi.c remoteproc/mediatek: Add support for mt8192 SCP 2020-09-25 23:37:42 -05:00
mtk_scp.c remoteproc/mediatek: Add support for mt8192 SCP 2020-09-25 23:37:42 -05:00
omap_remoteproc.c remoteproc/omap: Fix set_load call in omap_rproc_request_timer 2020-04-03 10:47:21 -07:00
omap_remoteproc.h remoteproc/omap: Switch to SPDX license identifiers 2020-03-25 22:29:51 -07:00
qcom_common.c remoteproc: qcom: Add missing slab.h 2020-07-13 11:54:27 -07:00
qcom_common.h remoteproc: qcom: Add per subsystem SSR notification 2020-07-08 21:45:03 -07:00
qcom_pil_info.c remoteproc: qcom: pil-info: Fix shift overflow 2020-07-16 21:30:35 -07:00
qcom_pil_info.h remoteproc: qcom: Introduce helper to store pil info in IMEM 2020-07-01 22:10:18 -07:00
qcom_q6v5_adsp.c remoteproc: qcom: Update PIL relocation info on load 2020-07-01 22:10:19 -07:00
qcom_q6v5_mss.c remoteproc: qcom_q6v5: Assign mpss region to Q6 before MBA boot 2020-09-25 23:33:23 -05:00
qcom_q6v5_pas.c remoteproc: qcom: Update PIL relocation info on load 2020-07-01 22:10:19 -07:00
qcom_q6v5_wcss.c remoteproc: qcom: Update PIL relocation info on load 2020-07-01 22:10:19 -07:00
qcom_q6v5.c remoteproc: qcom: q6v5: Update running state before requesting stop 2020-07-27 23:21:31 -07:00
qcom_q6v5.h remoteproc: qcom: q6v5: Add common panic handler 2020-03-25 22:29:45 -07:00
qcom_sysmon.c remoteproc: qcom_sysmon: Solve function header bitrot issues 2020-07-15 12:18:20 -07:00
qcom_wcnss_iris.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 174 2019-05-30 11:26:41 -07:00
qcom_wcnss.c remoteproc: qcom: Update PIL relocation info on load 2020-07-01 22:10:19 -07:00
qcom_wcnss.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
remoteproc_cdev.c remoteproc: Add remoteproc character device interface 2020-08-04 20:16:37 -07:00
remoteproc_core.c remoteproc: core: Register the character device interface 2020-08-04 20:17:08 -07:00
remoteproc_coredump.c remoteproc: Add inline coredump functionality 2020-07-21 14:03:57 -07:00
remoteproc_debugfs.c remoteproc: Fixup coredump debugfs disable request 2020-09-25 23:33:23 -05:00
remoteproc_elf_helpers.h remoteproc: Add elf helpers to access elf64 and elf32 fields 2020-03-25 22:29:39 -07:00
remoteproc_elf_loader.c remoteproc: remove rproc_elf32_sanity_check 2020-04-22 21:57:26 -07:00
remoteproc_internal.h remoteproc: Add remoteproc character device interface 2020-08-04 20:16:37 -07:00
remoteproc_sysfs.c remoteproc: Properly handle firmware name when attaching 2020-07-16 23:06:15 -07:00
remoteproc_virtio.c remoteproc: Fall back to using parent memory pool if no dedicated available 2020-05-12 16:08:00 -07:00
st_remoteproc.c remoteproc: remove rproc_elf32_sanity_check 2020-04-22 21:57:26 -07:00
st_slim_rproc.c remoteproc: remove rproc_elf32_sanity_check 2020-04-22 21:57:26 -07:00
stm32_rproc.c remoteproc: stm32: Fix pointer assignement 2020-09-15 03:45:57 +00:00
ti_k3_dsp_remoteproc.c remoteproc: k3-dsp: Add support for C71x DSPs 2020-07-28 17:08:32 -07:00
ti_k3_r5_remoteproc.c remoteproc: k3-r5: Add a remoteproc driver for R5F subsystem 2020-10-13 18:34:38 -05:00
ti_sci_proc.h remoteproc: k3: Add TI-SCI processor control helper functions 2020-07-28 17:06:43 -07:00
wkup_m3_rproc.c remoteproc: Use size_t type for len in da_to_va 2020-03-25 22:29:38 -07:00