uboot/include/mm_communication.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 *  Headers for EFI variable service via StandAloneMM, EDK2 application running
   4 *  in OP-TEE
   5 *
   6 *  Copyright (c) 2017, Intel Corporation. All rights reserved.
   7 *  Copyright (C) 2020 Linaro Ltd. <sughosh.ganu@linaro.org>
   8 *  Copyright (C) 2020 Linaro Ltd. <ilias.apalodimas@linaro.org>
   9 */
  10
  11#ifndef _MM_COMMUNICATION_H_
  12#define _MM_COMMUNICATION_H_
  13
  14#include <part_efi.h>
  15
  16/*
  17 * Interface to the pseudo Trusted Application (TA), which provides a
  18 * communication channel with the Standalone MM (Management Mode)
  19 * Secure Partition running at Secure-EL0
  20 */
  21
  22#define PTA_STMM_CMDID_COMMUNICATE 0
  23
  24/* OP-TEE is using big endian GUIDs while UEFI uses little endian ones */
  25#define PTA_STMM_UUID { 0xed32d533, 0x99e6, 0x4209, {\
  26                        0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7 } }
  27
  28#define EFI_MM_VARIABLE_GUID \
  29        EFI_GUID(0xed32d533, 0x99e6, 0x4209, \
  30                 0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7)
  31
  32/* Defined in EDK2 MdePkg/Include/Protocol/MmCommunication.h */
  33
  34/**
  35 * struct efi_mm_communicate_header - Header used for SMM variable communication
  36
  37 * @header_guid:  header use for disambiguation of content
  38 * @message_len:  length of the message. Does not include the size of the
  39 *                header
  40 * @data:         payload of the message
  41 *
  42 * Defined in EDK2 as EFI_MM_COMMUNICATE_HEADER.
  43 * To avoid confusion in interpreting frames, the communication buffer should
  44 * always begin with efi_mm_communicate_header.
  45 */
  46struct __packed efi_mm_communicate_header {
  47        efi_guid_t header_guid;
  48        size_t     message_len;
  49        u8         data[];
  50};
  51
  52#define MM_COMMUNICATE_HEADER_SIZE \
  53        (sizeof(struct efi_mm_communicate_header))
  54
  55/* Defined in EDK2 ArmPkg/Include/IndustryStandard/ArmMmSvc.h */
  56
  57/* SPM return error codes */
  58#define ARM_SVC_SPM_RET_SUCCESS               0
  59#define ARM_SVC_SPM_RET_NOT_SUPPORTED        -1
  60#define ARM_SVC_SPM_RET_INVALID_PARAMS       -2
  61#define ARM_SVC_SPM_RET_DENIED               -3
  62#define ARM_SVC_SPM_RET_NO_MEMORY            -5
  63
  64/* Defined in EDK2 MdeModulePkg/Include/Guid/SmmVariableCommon.h */
  65
  66#define SMM_VARIABLE_FUNCTION_GET_VARIABLE  1
  67/*
  68 * The payload for this function is
  69 * SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME.
  70 */
  71#define SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME  2
  72/*
  73 * The payload for this function is SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE.
  74 */
  75#define SMM_VARIABLE_FUNCTION_SET_VARIABLE  3
  76/*
  77 * The payload for this function is
  78 * SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO.
  79 */
  80#define SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO  4
  81/*
  82 * It is a notify event, no extra payload for this function.
  83 */
  84#define SMM_VARIABLE_FUNCTION_READY_TO_BOOT  5
  85/*
  86 * It is a notify event, no extra payload for this function.
  87 */
  88#define SMM_VARIABLE_FUNCTION_EXIT_BOOT_SERVICE  6
  89/*
  90 * The payload for this function is VARIABLE_INFO_ENTRY.
  91 * The GUID in EFI_SMM_COMMUNICATE_HEADER is gEfiSmmVariableProtocolGuid.
  92 */
  93#define SMM_VARIABLE_FUNCTION_GET_STATISTICS  7
  94/*
  95 * The payload for this function is SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE
  96 */
  97#define SMM_VARIABLE_FUNCTION_LOCK_VARIABLE   8
  98
  99#define SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_SET  9
 100
 101#define SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET  10
 102
 103#define SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE  11
 104/*
 105 * The payload for this function is
 106 * SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT
 107 */
 108#define SMM_VARIABLE_FUNCTION_INIT_RUNTIME_VARIABLE_CACHE_CONTEXT 12
 109
 110#define SMM_VARIABLE_FUNCTION_SYNC_RUNTIME_CACHE  13
 111/*
 112 * The payload for this function is
 113 * SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO
 114 */
 115#define SMM_VARIABLE_FUNCTION_GET_RUNTIME_CACHE_INFO  14
 116
 117/**
 118 * struct smm_variable_communicate_header - Used for SMM variable communication
 119
 120 * @function:     function to call in Smm.
 121 * @ret_status:   return status
 122 * @data:         payload
 123 *
 124 * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_HEADER.
 125 */
 126struct smm_variable_communicate_header {
 127        efi_uintn_t  function;
 128        efi_status_t ret_status;
 129        u8           data[];
 130};
 131
 132#define MM_VARIABLE_COMMUNICATE_SIZE \
 133        (sizeof(struct smm_variable_communicate_header))
 134
 135/**
 136 * struct smm_variable_access - Used to communicate with StMM by
 137 *                              SetVariable and GetVariable.
 138
 139 * @guid:         vendor GUID
 140 * @data_size:    size of EFI variable data
 141 * @name_size:    size of EFI name
 142 * @attr:         attributes
 143 * @name:         variable name
 144 *
 145 * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE.
 146 *
 147 */
 148struct smm_variable_access {
 149        efi_guid_t  guid;
 150        efi_uintn_t data_size;
 151        efi_uintn_t name_size;
 152        u32         attr;
 153        u16         name[];
 154};
 155
 156#define MM_VARIABLE_ACCESS_HEADER_SIZE \
 157        (sizeof(struct smm_variable_access))
 158/**
 159 * struct smm_variable_payload_size - Used to get the max allowed
 160 *                                    payload used in StMM.
 161 *
 162 * @size:  size to fill in
 163 *
 164 * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE.
 165 *
 166 */
 167struct smm_variable_payload_size {
 168        efi_uintn_t size;
 169};
 170
 171/**
 172 * struct smm_variable_getnext - Used to communicate with StMM for
 173 *                               GetNextVariableName.
 174 *
 175 * @guid:       vendor GUID
 176 * @name_size:  size of the name of the variable
 177 * @name:       variable name
 178 *
 179 * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME.
 180 */
 181struct smm_variable_getnext {
 182        efi_guid_t  guid;
 183        efi_uintn_t name_size;
 184        u16         name[];
 185};
 186
 187#define MM_VARIABLE_GET_NEXT_HEADER_SIZE \
 188        (sizeof(struct smm_variable_getnext))
 189
 190/**
 191 * struct smm_variable_query_info - Used to communicate with StMM for
 192 *                                  QueryVariableInfo.
 193 *
 194 * @max_variable_storage:        max available storage
 195 * @remaining_variable_storage:  remaining available storage
 196 * @max_variable_size:           max variable supported size
 197 * @attr:                        attributes to query storage for
 198 *
 199 * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO.
 200 */
 201struct smm_variable_query_info {
 202        u64 max_variable_storage;
 203        u64 remaining_variable_storage;
 204        u64 max_variable_size;
 205        u32 attr;
 206};
 207
 208#define VAR_CHECK_VARIABLE_PROPERTY_REVISION 0x0001
 209#define VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY BIT(0)
 210/**
 211 * struct var_check_property - Used to store variable properties in StMM
 212 *
 213 * @revision:   magic revision number for variable property checking
 214 * @property:   properties mask for the variable used in StMM.
 215 *              Currently RO flag is supported
 216 * @attributes: variable attributes used in StMM checking when properties
 217 *              for a variable are enabled
 218 * @minsize:    minimum allowed size for variable payload checked against
 219 *              smm_variable_access->datasize in StMM
 220 * @maxsize:    maximum allowed size for variable payload checked against
 221 *              smm_variable_access->datasize in StMM
 222 *
 223 * Defined in EDK2 as VAR_CHECK_VARIABLE_PROPERTY.
 224 */
 225struct var_check_property {
 226        u16         revision;
 227        u16         property;
 228        u32         attributes;
 229        efi_uintn_t minsize;
 230        efi_uintn_t maxsize;
 231};
 232
 233/**
 234 * struct smm_variable_var_check_property - Used to communicate variable
 235 *                                          properties with StMM
 236 *
 237 * @guid:       vendor GUID
 238 * @name_size:  size of EFI name
 239 * @property:   variable properties struct
 240 * @name:       variable name
 241 *
 242 * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY.
 243 */
 244struct smm_variable_var_check_property {
 245        efi_guid_t                guid;
 246        efi_uintn_t               name_size;
 247        struct var_check_property property;
 248        u16                       name[];
 249};
 250
 251#endif /* _MM_COMMUNICATION_H_ */
 252