| .. SPDX-License-Identifier: GPL-2.0+ |
| .. (C) Copyright 2015 |
| .. Texas Instruments Incorporated - http://www.ti.com/ |
| |
| Remote Processor Framework |
| ========================== |
| |
| Introduction |
| ------------ |
| |
| This is an introduction to driver-model for Remote Processors found |
| on various System on Chip(SoCs). The term remote processor is used to |
| indicate that this is not the processor on which U-Boot is operating |
| on, instead is yet another processing entity that may be controlled by |
| the processor on which we are functional. |
| |
| The simplified model depends on a single UCLASS - UCLASS_REMOTEPROC |
| |
| UCLASS_REMOTEPROC: |
| - drivers/remoteproc/rproc-uclass.c |
| - include/remoteproc.h |
| |
| Commands: |
| - common/cmd_remoteproc.c |
| |
| Configuration: |
| - CONFIG_REMOTEPROC is selected by drivers as needed |
| - CONFIG_CMD_REMOTEPROC for the commands if required. |
| |
| How does it work - The driver |
| ----------------------------- |
| |
| Overall, the driver statemachine transitions are typically as follows:: |
| |
| (entry) |
| +-------+ |
| +---+ init | |
| | | | <---------------------+ |
| | +-------+ | |
| | | |
| | | |
| | +--------+ | |
| Load| | reset | | |
| | | | <----------+ | |
| | +--------+ | | |
| | |Load | | |
| | | | | |
| | +----v----+ reset | | |
| +-> | | (opt) | | |
| | Loaded +-----------+ | |
| | | | |
| +----+----+ | |
| | Start | |
| +---v-----+ (opt) | |
| +->| Running | Stop | |
| Ping +- | +--------------------+ |
| (opt) +---------+ |
| |
| (is_running does not change state) |
| opt: Optional state transition implemented by driver. |
| |
| NOTE: It depends on the remote processor as to the exact behavior |
| of the statemachine, remoteproc core does not intent to implement |
| statemachine logic. Certain processors may allow start/stop without |
| reloading the image in the middle, certain other processors may only |
| allow us to start the processor(image from a EEPROM/OTP) etc. |
| |
| It is hence the responsibility of the driver to handle the requisite |
| state transitions of the device as necessary. |
| |
| Basic design assumptions: |
| |
| Remote processor can operate on a certain firmware that maybe loaded |
| and released from reset. |
| |
| The driver follows a standard UCLASS DM. |
| |
| in the bare minimum form: |
| |
| .. code-block:: c |
| |
| static const struct dm_rproc_ops sandbox_testproc_ops = { |
| .load = sandbox_testproc_load, |
| .start = sandbox_testproc_start, |
| }; |
| |
| static const struct udevice_id sandbox_ids[] = { |
| {.compatible = "sandbox,test-processor"}, |
| {} |
| }; |
| |
| U_BOOT_DRIVER(sandbox_testproc) = { |
| .name = "sandbox_test_proc", |
| .of_match = sandbox_ids, |
| .id = UCLASS_REMOTEPROC, |
| .ops = &sandbox_testproc_ops, |
| .probe = sandbox_testproc_probe, |
| }; |
| |
| This allows for the device to be probed as part of the "init" command |
| or invocation of 'rproc_init()' function as the system dependencies define. |
| |
| The driver is expected to maintain it's own statemachine which is |
| appropriate for the device it maintains. It must, at the very least |
| provide a load and start function. We assume here that the device |
| needs to be loaded and started, else, there is no real purpose of |
| using the remoteproc framework. |
| |
| Describing the device using platform data |
| ----------------------------------------- |
| |
| *IMPORTANT* NOTE: THIS SUPPORT IS NOT MEANT FOR USE WITH NEWER PLATFORM |
| SUPPORT. THIS IS ONLY FOR LEGACY DEVICES. THIS MODE OF INITIALIZATION |
| *WILL* BE EVENTUALLY REMOVED ONCE ALL NECESSARY PLATFORMS HAVE MOVED |
| TO DM/FDT. |
| |
| Considering that many platforms are yet to move to device-tree model, |
| a simplified definition of a device is as follows: |
| |
| .. code-block:: c |
| |
| struct dm_rproc_uclass_pdata proc_3_test = { |
| .name = "proc_3_legacy", |
| .mem_type = RPROC_INTERNAL_MEMORY_MAPPED, |
| .driver_plat_data = &mydriver_data; |
| }; |
| |
| U_BOOT_DEVICE(proc_3_demo) = { |
| .name = "sandbox_test_proc", |
| .plat = &proc_3_test, |
| }; |
| |
| There can be additional data that may be desired depending on the |
| remoteproc driver specific needs (for example: SoC integration |
| details such as clock handle or something similar). See appropriate |
| documentation for specific remoteproc driver for further details. |
| These are passed via driver_plat_data. |
| |
| Describing the device using device tree |
| --------------------------------------- |
| |
| .. code-block: none |
| |
| / { |
| ... |
| aliases { |
| ... |
| remoteproc0 = &rproc_1; |
| remoteproc1 = &rproc_2; |
| |
| }; |
| ... |
| |
| rproc_1: rproc@1 { |
| compatible = "sandbox,test-processor"; |
| remoteproc-name = "remoteproc-test-dev1"; |
| }; |
| |
| rproc_2: rproc@2 { |
| compatible = "sandbox,test-processor"; |
| internal-memory-mapped; |
| remoteproc-name = "remoteproc-test-dev2"; |
| }; |
| ... |
| }; |
| |
| aliases usage is optional, but it is usually recommended to ensure the |
| users have a consistent usage model for a platform. |
| the compatible string used here is specific to the remoteproc driver involved. |