123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435 |
- Arm SiP Services
- ================
- This document enumerates and describes the Arm SiP (Silicon Provider) services.
- SiP services are non-standard, platform-specific services offered by the silicon
- implementer or platform provider. They are accessed via ``SMC`` ("SMC calls")
- instruction executed from Exception Levels below EL3. SMC calls for SiP
- services:
- - Follow `SMC Calling Convention`_;
- - Use SMC function IDs that fall in the SiP range, which are ``0xc2000000`` -
- ``0xc200ffff`` for 64-bit calls, and ``0x82000000`` - ``0x8200ffff`` for 32-bit
- calls.
- The Arm SiP implementation offers the following services:
- - Performance Measurement Framework (PMF)
- - Execution State Switching service
- - DebugFS interface
- Source definitions for Arm SiP service are located in the ``arm_sip_svc.h`` header
- file.
- Performance Measurement Framework (PMF)
- ---------------------------------------
- The :ref:`Performance Measurement Framework <firmware_design_pmf>`
- allows callers to retrieve timestamps captured at various paths in TF-A
- execution.
- Execution State Switching service
- ---------------------------------
- Execution State Switching service provides a mechanism for a non-secure lower
- Exception Level (either EL2, or NS EL1 if EL2 isn't implemented) to request to
- switch its execution state (a.k.a. Register Width), either from AArch64 to
- AArch32, or from AArch32 to AArch64, for the calling CPU. This service is only
- available when Trusted Firmware-A (TF-A) is built for AArch64 (i.e. when build
- option ``ARCH`` is set to ``aarch64``).
- ``ARM_SIP_SVC_EXE_STATE_SWITCH``
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ::
- Arguments:
- uint32_t Function ID
- uint32_t PC hi
- uint32_t PC lo
- uint32_t Cookie hi
- uint32_t Cookie lo
- Return:
- uint32_t
- The function ID parameter must be ``0x82000020``. It uniquely identifies the
- Execution State Switching service being requested.
- The parameters *PC hi* and *PC lo* defines upper and lower words, respectively,
- of the entry point (physical address) at which execution should start, after
- Execution State has been switched. When calling from AArch64, *PC hi* must be 0.
- When execution starts at the supplied entry point after Execution State has been
- switched, the parameters *Cookie hi* and *Cookie lo* are passed in CPU registers
- 0 and 1, respectively. When calling from AArch64, *Cookie hi* must be 0.
- This call can only be made on the primary CPU, before any secondaries were
- brought up with ``CPU_ON`` PSCI call. Otherwise, the call will always fail.
- The effect of switching execution state is as if the Exception Level were
- entered for the first time, following power on. This means CPU registers that
- have a defined reset value by the Architecture will assume that value. Other
- registers should not be expected to hold their values before the call was made.
- CPU endianness, however, is preserved from the previous execution state. Note
- that this switches the execution state of the calling CPU only. This is not a
- substitute for PSCI ``SYSTEM_RESET``.
- The service may return the following error codes:
- - ``STATE_SW_E_PARAM``: If any of the parameters were deemed invalid for
- a specific request.
- - ``STATE_SW_E_DENIED``: If the call is not successful, or when TF-A is
- built for AArch32.
- If the call is successful, the caller wouldn't observe the SMC returning.
- Instead, execution starts at the supplied entry point, with the CPU registers 0
- and 1 populated with the supplied *Cookie hi* and *Cookie lo* values,
- respectively.
- DebugFS interface
- -----------------
- The optional DebugFS interface is accessed through an SMC SiP service. Refer
- to the component documentation for details.
- String parameters are passed through a shared buffer using a specific union:
- .. code:: c
- union debugfs_parms {
- struct {
- char fname[MAX_PATH_LEN];
- } open;
- struct mount {
- char srv[MAX_PATH_LEN];
- char where[MAX_PATH_LEN];
- char spec[MAX_PATH_LEN];
- } mount;
- struct {
- char path[MAX_PATH_LEN];
- dir_t dir;
- } stat;
- struct {
- char oldpath[MAX_PATH_LEN];
- char newpath[MAX_PATH_LEN];
- } bind;
- };
- Format of the dir_t structure as such:
- .. code:: c
- typedef struct {
- char name[NAMELEN];
- long length;
- unsigned char mode;
- unsigned char index;
- unsigned char dev;
- qid_t qid;
- } dir_t;
- * Identifiers
- ======================== =============================================
- SMC_OK 0
- SMC_UNK -1
- DEBUGFS_E_INVALID_PARAMS -2
- ======================== =============================================
- ======================== =============================================
- MOUNT 0
- CREATE 1
- OPEN 2
- CLOSE 3
- READ 4
- WRITE 5
- SEEK 6
- BIND 7
- STAT 8
- INIT 10
- VERSION 11
- ======================== =============================================
- MOUNT
- ~~~~~
- Description
- ^^^^^^^^^^^
- This operation mounts a blob of data pointed to by path stored in `src`, at
- filesystem location pointed to by path stored in `where`, using driver pointed
- to by path in `spec`.
- Parameters
- ^^^^^^^^^^
- ======== ============================================================
- uint32_t FunctionID (0x82000030 / 0xC2000030)
- uint32_t ``MOUNT``
- ======== ============================================================
- Return values
- ^^^^^^^^^^^^^
- =============== ==========================================================
- int32_t w0 == SMC_OK on success
- w0 == DEBUGFS_E_INVALID_PARAMS if mount operation failed
- =============== ==========================================================
- OPEN
- ~~~~
- Description
- ^^^^^^^^^^^
- This operation opens the file path pointed to by `fname`.
- Parameters
- ^^^^^^^^^^
- ======== ============================================================
- uint32_t FunctionID (0x82000030 / 0xC2000030)
- uint32_t ``OPEN``
- uint32_t mode
- ======== ============================================================
- mode can be one of:
- .. code:: c
- enum mode {
- O_READ = 1 << 0,
- O_WRITE = 1 << 1,
- O_RDWR = 1 << 2,
- O_BIND = 1 << 3,
- O_DIR = 1 << 4,
- O_STAT = 1 << 5
- };
- Return values
- ^^^^^^^^^^^^^
- =============== ==========================================================
- int32_t w0 == SMC_OK on success
- w0 == DEBUGFS_E_INVALID_PARAMS if open operation failed
- uint32_t w1: file descriptor id on success.
- =============== ==========================================================
- CLOSE
- ~~~~~
- Description
- ^^^^^^^^^^^
- This operation closes a file described by a file descriptor obtained by a
- previous call to OPEN.
- Parameters
- ^^^^^^^^^^
- ======== ============================================================
- uint32_t FunctionID (0x82000030 / 0xC2000030)
- uint32_t ``CLOSE``
- uint32_t File descriptor id returned by OPEN
- ======== ============================================================
- Return values
- ^^^^^^^^^^^^^
- =============== ==========================================================
- int32_t w0 == SMC_OK on success
- w0 == DEBUGFS_E_INVALID_PARAMS if close operation failed
- =============== ==========================================================
- READ
- ~~~~
- Description
- ^^^^^^^^^^^
- This operation reads a number of bytes from a file descriptor obtained by
- a previous call to OPEN.
- Parameters
- ^^^^^^^^^^
- ======== ============================================================
- uint32_t FunctionID (0x82000030 / 0xC2000030)
- uint32_t ``READ``
- uint32_t File descriptor id returned by OPEN
- uint32_t Number of bytes to read
- ======== ============================================================
- Return values
- ^^^^^^^^^^^^^
- On success, the read data is retrieved from the shared buffer after the
- operation.
- =============== ==========================================================
- int32_t w0 == SMC_OK on success
- w0 == DEBUGFS_E_INVALID_PARAMS if read operation failed
- uint32_t w1: number of bytes read on success.
- =============== ==========================================================
- SEEK
- ~~~~
- Description
- ^^^^^^^^^^^
- Move file pointer for file described by given `file descriptor` of given
- `offset` related to `whence`.
- Parameters
- ^^^^^^^^^^
- ======== ============================================================
- uint32_t FunctionID (0x82000030 / 0xC2000030)
- uint32_t ``SEEK``
- uint32_t File descriptor id returned by OPEN
- sint32_t offset in the file relative to whence
- uint32_t whence
- ======== ============================================================
- whence can be one of:
- ========= ============================================================
- KSEEK_SET 0
- KSEEK_CUR 1
- KSEEK_END 2
- ========= ============================================================
- Return values
- ^^^^^^^^^^^^^
- =============== ==========================================================
- int32_t w0 == SMC_OK on success
- w0 == DEBUGFS_E_INVALID_PARAMS if seek operation failed
- =============== ==========================================================
- BIND
- ~~~~
- Description
- ^^^^^^^^^^^
- Create a link from `oldpath` to `newpath`.
- Parameters
- ^^^^^^^^^^
- ======== ============================================================
- uint32_t FunctionID (0x82000030 / 0xC2000030)
- uint32_t ``BIND``
- ======== ============================================================
- Return values
- ^^^^^^^^^^^^^
- =============== ==========================================================
- int32_t w0 == SMC_OK on success
- w0 == DEBUGFS_E_INVALID_PARAMS if bind operation failed
- =============== ==========================================================
- STAT
- ~~~~
- Description
- ^^^^^^^^^^^
- Perform a stat operation on provided file `name` and returns the directory
- entry statistics into `dir`.
- Parameters
- ^^^^^^^^^^
- ======== ============================================================
- uint32_t FunctionID (0x82000030 / 0xC2000030)
- uint32_t ``STAT``
- ======== ============================================================
- Return values
- ^^^^^^^^^^^^^
- =============== ==========================================================
- int32_t w0 == SMC_OK on success
- w0 == DEBUGFS_E_INVALID_PARAMS if stat operation failed
- =============== ==========================================================
- INIT
- ~~~~
- Description
- ^^^^^^^^^^^
- Initial call to setup the shared exchange buffer. Notice if successful once,
- subsequent calls fail after a first initialization. The caller maps the same
- page frame in its virtual space and uses this buffer to exchange string
- parameters with filesystem primitives.
- Parameters
- ^^^^^^^^^^
- ======== ============================================================
- uint32_t FunctionID (0x82000030 / 0xC2000030)
- uint32_t ``INIT``
- uint64_t Physical address of the shared buffer.
- ======== ============================================================
- Return values
- ^^^^^^^^^^^^^
- =============== ======================================================
- int32_t w0 == SMC_OK on success
- w0 == DEBUGFS_E_INVALID_PARAMS if already initialized,
- or internal error occurred.
- =============== ======================================================
- VERSION
- ~~~~~~~
- Description
- ^^^^^^^^^^^
- Returns the debugfs interface version if implemented in TF-A.
- Parameters
- ^^^^^^^^^^
- ======== ============================================================
- uint32_t FunctionID (0x82000030 / 0xC2000030)
- uint32_t ``VERSION``
- ======== ============================================================
- Return values
- ^^^^^^^^^^^^^
- =============== ======================================================
- int32_t w0 == SMC_OK on success
- w0 == SMC_UNK if interface is not implemented
- uint32_t w1: On success, debugfs interface version, 32 bits
- value with major version number in upper 16 bits and
- minor version in lower 16 bits.
- =============== ======================================================
- * CREATE(1) and WRITE (5) command identifiers are unimplemented and
- return `SMC_UNK`.
- --------------
- *Copyright (c) 2017-2020, Arm Limited and Contributors. All rights reserved.*
- .. _SMC Calling Convention: https://developer.arm.com/docs/den0028/latest
|