From 55f79d6a83dc642b281f2df95b268417fef75cae Mon Sep 17 00:00:00 2001 From: Olivier Deprez Date: Fri, 14 Feb 2020 14:38:21 +0100 Subject: tftf: update SPCI svc header to latest Beta1 spec Signed-off-by: Olivier Deprez Change-Id: I5b70debe318fe1505c6d56ea347e6c09d1bf9247 --- include/runtime_services/spci_svc.h | 220 +++++++++++++++++++----------------- 1 file changed, 118 insertions(+), 102 deletions(-) diff --git a/include/runtime_services/spci_svc.h b/include/runtime_services/spci_svc.h index f0ea57e..926f52a 100644 --- a/include/runtime_services/spci_svc.h +++ b/include/runtime_services/spci_svc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2019, Arm Limited. All rights reserved. + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -7,118 +7,134 @@ #ifndef SPCI_SVC_H #define SPCI_SVC_H +#include #include -#include +#include -/* SPCI_VERSION helpers */ +/* SPCI error codes. */ +#define SPCI_ERROR_NOT_SUPPORTED -1 +#define SPCI_ERROR_INVALID_PARAMETER -2 +#define SPCI_ERROR_NO_MEMORY -3 +#define SPCI_ERROR_BUSY -4 +#define SPCI_ERROR_INTERRUPTED -5 +#define SPCI_ERROR_DENIED -6 +#define SPCI_ERROR_RETRY -7 + +/* The macros below are used to identify SPCI calls from the SMC function ID */ +#define SPCI_FNUM_MIN_VALUE U(0x60) +#define SPCI_FNUM_MAX_VALUE U(0x7f) +#define is_spci_fid(fid) __extension__ ({ \ + __typeof__(fid) _fid = (fid); \ + ((GET_SMC_NUM(_fid) >= SPCI_FNUM_MIN_VALUE) && \ + (GET_SMC_NUM(_fid) <= SPCI_FNUM_MAX_VALUE)); }) +/* SPCI_VERSION helpers */ #define SPCI_VERSION_MAJOR U(0) #define SPCI_VERSION_MAJOR_SHIFT 16 #define SPCI_VERSION_MAJOR_MASK U(0x7FFF) -#define SPCI_VERSION_MINOR U(1) +#define SPCI_VERSION_MINOR U(9) #define SPCI_VERSION_MINOR_SHIFT 0 #define SPCI_VERSION_MINOR_MASK U(0xFFFF) -#define SPCI_VERSION_FORM(major, minor) ((((major) & SPCI_VERSION_MAJOR_MASK) \ - << SPCI_VERSION_MAJOR_SHIFT) | \ - ((minor) & SPCI_VERSION_MINOR_MASK)) -#define SPCI_VERSION_COMPILED SPCI_VERSION_FORM(SPCI_VERSION_MAJOR, \ - SPCI_VERSION_MINOR) - -/* Definitions to build the complete SMC ID */ - -#define SPCI_FID_MISC_FLAG (U(0) << 27) -#define SPCI_FID_MISC_SHIFT U(20) -#define SPCI_FID_MISC_MASK U(0x7F) - -#define SPCI_FID_TUN_FLAG (U(1) << 27) -#define SPCI_FID_TUN_SHIFT U(24) -#define SPCI_FID_TUN_MASK U(0x7) - -#define OEN_SPCI_START U(0x30) -#define OEN_SPCI_END U(0x3F) - -#define SPCI_SMC(spci_fid) ((OEN_SPCI_START << FUNCID_OEN_SHIFT) | \ - (U(1) << 31) | (spci_fid)) -#define SPCI_MISC_32(misc_fid) ((SMC_32 << FUNCID_CC_SHIFT) | \ - SPCI_FID_MISC_FLAG | \ - SPCI_SMC((misc_fid) << SPCI_FID_MISC_SHIFT)) -#define SPCI_MISC_64(misc_fid) ((SMC_64 << FUNCID_CC_SHIFT) | \ - SPCI_FID_MISC_FLAG | \ - SPCI_SMC((misc_fid) << SPCI_FID_MISC_SHIFT)) -#define SPCI_TUN_32(tun_fid) ((SMC_32 << FUNCID_CC_SHIFT) | \ - SPCI_FID_TUN_FLAG | \ - SPCI_SMC((tun_fid) << SPCI_FID_TUN_SHIFT)) -#define SPCI_TUN_64(tun_fid) ((SMC_64 << FUNCID_CC_SHIFT) | \ - SPCI_FID_TUN_FLAG | \ - SPCI_SMC((tun_fid) << SPCI_FID_TUN_SHIFT)) - -/* SPCI miscellaneous functions */ - -#define SPCI_FID_VERSION U(0x0) -#define SPCI_FID_SERVICE_HANDLE_OPEN U(0x2) -#define SPCI_FID_SERVICE_HANDLE_CLOSE U(0x3) -#define SPCI_FID_SERVICE_MEM_REGISTER U(0x4) -#define SPCI_FID_SERVICE_MEM_UNREGISTER U(0x5) -#define SPCI_FID_SERVICE_MEM_PUBLISH U(0x6) -#define SPCI_FID_SERVICE_REQUEST_BLOCKING U(0x7) -#define SPCI_FID_SERVICE_REQUEST_START U(0x8) -#define SPCI_FID_SERVICE_GET_RESPONSE U(0x9) -#define SPCI_FID_SERVICE_RESET_CLIENT_STATE U(0xA) - -/* SPCI tunneling functions */ - -#define SPCI_FID_SERVICE_TUN_REQUEST_START U(0x0) -#define SPCI_FID_SERVICE_REQUEST_RESUME U(0x1) -#define SPCI_FID_SERVICE_TUN_REQUEST_BLOCKING U(0x2) - -/* Complete SMC IDs and associated values */ - -#define SPCI_VERSION SPCI_MISC_32(SPCI_FID_VERSION) - -#define SPCI_SERVICE_HANDLE_OPEN SPCI_MISC_32(SPCI_FID_SERVICE_HANDLE_OPEN) -#define SPCI_SERVICE_HANDLE_OPEN_NOTIFY_BIT U(1) +#define SPCI_VERSION_BIT31_MASK (1 << 31) -#define SPCI_SERVICE_HANDLE_CLOSE SPCI_MISC_32(SPCI_FID_SERVICE_HANDLE_CLOSE) - -#define SPCI_SERVICE_MEM_REGISTER_AARCH32 SPCI_MISC_32(SPCI_FID_SERVICE_MEM_REGISTER) -#define SPCI_SERVICE_MEM_REGISTER_AARCH64 SPCI_MISC_64(SPCI_FID_SERVICE_MEM_REGISTER) - -#define SPCI_SERVICE_MEM_UNREGISTER_AARCH32 SPCI_MISC_32(SPCI_FID_SERVICE_MEM_UNREGISTER) -#define SPCI_SERVICE_MEM_UNREGISTER_AARCH64 SPCI_MISC_64(SPCI_FID_SERVICE_MEM_UNREGISTER) - -#define SPCI_SERVICE_MEM_PUBLISH_AARCH32 SPCI_MISC_32(SPCI_FID_SERVICE_MEM_PUBLISH) -#define SPCI_SERVICE_MEM_PUBLISH_AARCH64 SPCI_MISC_64(SPCI_FID_SERVICE_MEM_PUBLISH) - -#define SPCI_SERVICE_REQUEST_BLOCKING_AARCH32 SPCI_MISC_32(SPCI_FID_SERVICE_REQUEST_BLOCKING) -#define SPCI_SERVICE_REQUEST_BLOCKING_AARCH64 SPCI_MISC_64(SPCI_FID_SERVICE_REQUEST_BLOCKING) - -#define SPCI_SERVICE_REQUEST_START_AARCH32 SPCI_MISC_32(SPCI_FID_SERVICE_REQUEST_START) -#define SPCI_SERVICE_REQUEST_START_AARCH64 SPCI_MISC_64(SPCI_FID_SERVICE_REQUEST_START) - -#define SPCI_SERVICE_GET_RESPONSE_AARCH32 SPCI_MISC_32(SPCI_FID_SERVICE_GET_RESPONSE) -#define SPCI_SERVICE_GET_RESPONSE_AARCH64 SPCI_MISC_64(SPCI_FID_SERVICE_GET_RESPONSE) - -#define SPCI_SERVICE_RESET_CLIENT_STATE_AARCH32 SPCI_MISC_32(SPCI_FID_SERVICE_RESET_CLIENT_STATE) -#define SPCI_SERVICE_RESET_CLIENT_STATE_AARCH64 SPCI_MISC_64(SPCI_FID_SERVICE_RESET_CLIENT_STATE) - -#define SPCI_SERVICE_TUN_REQUEST_START_AARCH32 SPCI_TUN_32(SPCI_FID_SERVICE_TUN_REQUEST_START) -#define SPCI_SERVICE_TUN_REQUEST_START_AARCH64 SPCI_TUN_64(SPCI_FID_SERVICE_TUN_REQUEST_START) - -#define SPCI_SERVICE_REQUEST_RESUME_AARCH32 SPCI_TUN_32(SPCI_FID_SERVICE_REQUEST_RESUME) -#define SPCI_SERVICE_REQUEST_RESUME_AARCH64 SPCI_TUN_64(SPCI_FID_SERVICE_REQUEST_RESUME) +#define MAKE_SPCI_VERSION(major, minor) \ + ((((major) & SPCI_VERSION_MAJOR_MASK) << SPCI_VERSION_MAJOR_SHIFT) | \ + (((minor) & SPCI_VERSION_MINOR_MASK) << SPCI_VERSION_MINOR_SHIFT)) +#define SPCI_VERSION_COMPILED MAKE_SPCI_VERSION(SPCI_VERSION_MAJOR, \ + SPCI_VERSION_MINOR) -#define SPCI_SERVICE_TUN_REQUEST_BLOCKING_AARCH32 SPCI_TUN_32(SPCI_FID_SERVICE_TUN_REQUEST_BLOCKING) -#define SPCI_SERVICE_TUN_REQUEST_BLOCKING_AARCH64 SPCI_TUN_64(SPCI_FID_SERVICE_TUN_REQUEST_BLOCKING) +/* SPCI_MSG_SEND helpers */ +#define SPCI_MSG_SEND_ATTRS_BLK_SHIFT U(0) +#define SPCI_MSG_SEND_ATTRS_BLK_MASK U(0x1) +#define SPCI_MSG_SEND_ATTRS_BLK U(0) +#define SPCI_MSG_SEND_ATTRS_BLK_NOT U(1) +#define SPCI_MSG_SEND_ATTRS(blk) \ + (((blk) & SPCI_MSG_SEND_ATTRS_BLK_MASK) \ + << SPCI_MSG_SEND_ATTRS_BLK_SHIFT) + +/* Get SPCI fastcall std FID from function number */ +#define SPCI_FID(smc_cc, func_num) \ + ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \ + ((smc_cc) << FUNCID_CC_SHIFT) | \ + (OEN_STD_START << FUNCID_OEN_SHIFT) | \ + ((func_num) << FUNCID_NUM_SHIFT)) + +/* SPCI function numbers */ +#define SPCI_FNUM_ERROR U(0x60) +#define SPCI_FNUM_SUCCESS U(0x61) +#define SPCI_FNUM_INTERRUPT U(0x62) +#define SPCI_FNUM_VERSION U(0x63) +#define SPCI_FNUM_FEATURES U(0x64) +#define SPCI_FNUM_RX_RELEASE U(0x65) +#define SPCI_FNUM_RXTX_MAP U(0x66) +#define SPCI_FNUM_RXTX_UNMAP U(0x67) +#define SPCI_FNUM_PARTITION_INFO_GET U(0x68) +#define SPCI_FNUM_ID_GET U(0x69) +#define SPCI_FNUM_MSG_POLL U(0x6A) +#define SPCI_FNUM_MSG_WAIT U(0x6B) +#define SPCI_FNUM_MSG_YIELD U(0x6C) +#define SPCI_FNUM_MSG_RUN U(0x6D) +#define SPCI_FNUM_MSG_SEND U(0x6E) +#define SPCI_FNUM_MSG_SEND_DIRECT_REQ U(0x6F) +#define SPCI_FNUM_MSG_SEND_DIRECT_RESP U(0x70) +#define SPCI_FNUM_MEM_DONATE U(0x71) +#define SPCI_FNUM_MEM_LEND U(0x72) +#define SPCI_FNUM_MEM_SHARE U(0x73) +#define SPCI_FNUM_MEM_RETRIEVE_REQ U(0x74) +#define SPCI_FNUM_MEM_RETRIEVE_RESP U(0x75) +#define SPCI_FNUM_MEM_RELINQUISH U(0x76) +#define SPCI_FNUM_MEM_RECLAIM U(0x77) + +/* SPCI SMC32 FIDs */ +#define SPCI_ERROR SPCI_FID(SMC_32, SPCI_FNUM_ERROR) +#define SPCI_SUCCESS_SMC32 SPCI_FID(SMC_32, SPCI_FNUM_SUCCESS) +#define SPCI_INTERRUPT SPCI_FID(SMC_32, SPCI_FNUM_INTERRUPT) +#define SPCI_VERSION SPCI_FID(SMC_32, SPCI_FNUM_VERSION) +#define SPCI_FEATURES SPCI_FID(SMC_32, SPCI_FNUM_FEATURES) +#define SPCI_RX_RELEASE SPCI_FID(SMC_32, SPCI_FNUM_RX_RELEASE) +#define SPCI_RXTX_MAP_SMC32 SPCI_FID(SMC_32, SPCI_FNUM_RXTX_MAP) +#define SPCI_RXTX_UNMAP SPCI_FID(SMC_32, SPCI_FNUM_RXTX_UNMAP) +#define SPCI_PARTITION_INFO_GET SPCI_FID(SMC_32, SPCI_FNUM_PARTITION_INFO_GET) +#define SPCI_ID_GET SPCI_FID(SMC_32, SPCI_FNUM_ID_GET) +#define SPCI_MSG_POLL SPCI_FID(SMC_32, SPCI_FNUM_MSG_POLL) +#define SPCI_MSG_WAIT SPCI_FID(SMC_32, SPCI_FNUM_MSG_WAIT) +#define SPCI_MSG_YIELD SPCI_FID(SMC_32, SPCI_FNUM_MSG_YIELD) +#define SPCI_MSG_RUN SPCI_FID(SMC_32, SPCI_FNUM_MSG_RUN) +#define SPCI_MSG_SEND SPCI_FID(SMC_32, SPCI_FNUM_MSG_SEND) +#define SPCI_MSG_SEND_DIRECT_REQ_SMC32 \ + SPCI_FID(SMC_32, SPCI_FNUM_MSG_SEND_DIRECT_REQ) +#define SPCI_MSG_SEND_DIRECT_RESP_SMC32 \ + SPCI_FID(SMC_32, SPCI_FNUM_MSG_SEND_DIRECT_RESP) +#define SPCI_MEM_DONATE_SMC32 SPCI_FID(SMC_32, SPCI_FNUM_MEM_DONATE) +#define SPCI_MEM_LEND_SMC32 SPCI_FID(SMC_32, SPCI_FNUM_MEM_LEND) +#define SPCI_MEM_SHARE_SMC32 SPCI_FID(SMC_32, SPCI_FNUM_MEM_SHARE) +#define SPCI_MEM_RETRIEVE_REQ_SMC32 \ + SPCI_FID(SMC_32, SPCI_FNUM_MEM_RETRIEVE_REQ) +#define SPCI_MEM_RETRIEVE_RESP SPCI_FID(SMC_32, SPCI_FNUM_MEM_RETRIEVE_RESP) +#define SPCI_MEM_RELINQUISH SPCI_FID(SMC_32, SPCI_FNUM_MEM_RELINQUISH) +#define SPCI_MEM_RECLAIM SPCI_FID(SMC_32, SPCI_FNUM_MEM_RECLAIM) + +/* SPCI SMC64 FIDs */ +#define SPCI_SUCCESS_SMC64 SPCI_FID(SMC_64, SPCI_FNUM_SUCCESS) +#define SPCI_RXTX_MAP_SMC64 SPCI_FID(SMC_64, SPCI_FNUM_RXTX_MAP) +#define SPCI_MSG_SEND_DIRECT_REQ_SMC64 \ + SPCI_FID(SMC_64, SPCI_FNUM_MSG_SEND_DIRECT_REQ) +#define SPCI_MSG_SEND_DIRECT_RESP_SMC64 \ + SPCI_FID(SMC_64, SPCI_FNUM_MSG_SEND_DIRECT_RESP) +#define SPCI_MEM_DONATE_SMC64 SPCI_FID(SMC_64, SPCI_FNUM_MEM_DONATE) +#define SPCI_MEM_LEND_SMC64 SPCI_FID(SMC_64, SPCI_FNUM_MEM_LEND) +#define SPCI_MEM_SHARE_SMC64 SPCI_FID(SMC_64, SPCI_FNUM_MEM_SHARE) +#define SPCI_MEM_RETRIEVE_REQ_SMC64 \ + SPCI_FID(SMC_64, SPCI_FNUM_MEM_RETRIEVE_REQ) -/* SPCI error codes. */ +/* + * Reserve a special value for traffic targeted to the Hypervisor or SPM. + */ +#define SPCI_TARGET_INFO_MBZ U(0x0) -#define SPCI_SUCCESS 0 -#define SPCI_NOT_SUPPORTED -1 -#define SPCI_INVALID_PARAMETER -2 -#define SPCI_NO_MEMORY -3 -#define SPCI_BUSY -4 -#define SPCI_QUEUED -5 -#define SPCI_DENIED -6 -#define SPCI_NOT_PRESENT -7 +/* + * Reserve a special value for MBZ parameters. + */ +#define SPCI_PARAM_MBZ U(0x0) #endif /* SPCI_SVC_H */ -- cgit v1.2.3