123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #
- # (C) Copyright 2015
- # Texas Instruments Incorporated - http://www.ti.com/
- # SPDX-License-Identifier: GPL-2.0+
- #
- Remote Processor Framework
- ==========================
- TOC:
- 1. Introduction
- 2. How does it work - The driver
- 3. Describing the device using platform data
- 4. Describing the device using device tree
- 1. 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.
- 2. 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:
- 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.
- 3. 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:
- 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",
- .platdata = &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.
- 3. Describing the device using device tree
- ==========================================
- / {
- ...
- 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.
|