blob: 63721cfe320a243211b31b94aac1a72bdafd2765 [file] [log] [blame] [view]
<!--
Copright 2019, Data61
Commonwealth Scientific and Industrial Research Organisation (CSIRO)
ABN 41 687 119 230.
This software may be distributed and modified according to the terms of
the GNU General Public License version 2. Note that NO WARRANTY is provided.
See "LICENSE_GPLv2.txt" for details.
@TAG(DATA61_GPL)
-->
libtx2bpmp
==========
This library contains drivers necessary to interface with the Boot and Power
Management Processor (BPMP) co-processor on the NVIDIA TX2. The BPMP is
responsible for handling boot and power management functions and also controls
a few other devices. These devices are the clock controller, and an I2C
channel.
The child devices of the BPMP are managed by sending requests to the BPMP
module via inter-processor communication mechanisms which involve the Inter-VM
Communication (IVC) protocol, Hardware Synchronisation Primitives (HSP) device
module, and some shared memory.
HSP
---
The HSP module offers a number of primitives that can be used to synchronise
state between the processor and the co-processors on the board. These include:
- Shared mailboxes, which are essentially small data transfer buffers
- Shared semaphores
- Arbitrated sempahores, which are essentially semaphores that also include
state to avoid busy waiting
- Doorbells, which are essentially signals
The HSP driver in this library currently only supports the doorbell mechanisms.
This driver is mainly used only by the BPMP driver in this library, but it can
be used for other purposes as well.
Doorbells can be setup with the CPU complex/CPU subsystem (CCPLEX), Sensor
Processing Engine (SPE), Safety Cluster Engine (SCE), and the Audio Processing
Engine (APE) device modules. To first setup a doorbell, `tx2_hsp_init()` needs
to be called first to initialise the HSP interfaces. Afterwards, the doorbells
can to the device modules can be rung or checked by calling
`tx2_hsp_doorbell_ring()` or `tx2_hsp_doorbell_check()` respectively with the
right doorbell ID.
IVC
---
The IVC protocol is used to facilitate communication over a shared memory
channel between the processor and other remote entities. The protocol functions
similar to the producer-consumer pattern. The channel is split into fixed size
message buffers that can be pushed or popped from the channel when messages
need to be sent or received.