Files
gk-sdk/source/bootloader/u-boot-2020.01/include/linux/lotus/atf.h
T

313 lines
9.5 KiB
C

/*
* Copyright (c) LOTUS. All rights reserved.
*/
#ifndef __LOTUS_ATF_H__
#define __LOTUS_ATF_H__
/**************************************************************/
#define ARM_BOOT_SMC_CALL 0x8400ff02
#define SECURE 0x0
#define NON_SECURE 0x1
#define EP_EE_MASK 0x2
#define EP_EE_LITTLE 0x0
#define EP_EE_BIG 0x2
#define ep_get_ee(x) ((x) & EP_EE_MASK)
#define ep_set_ee(x, ee) ((x) = ((x) & ~EP_EE_MASK) | (ee))
/* CPSR/SPSR definitions */
#define DAIF_FIQ_BIT (1 << 0)
#define DAIF_IRQ_BIT (1 << 1)
#define DAIF_ABT_BIT (1 << 2)
#define DAIF_DBG_BIT (1 << 3)
#define SPSR_DAIF_SHIFT 6
#define SPSR_DAIF_MASK 0xf
#define SPSR_AIF_SHIFT 6
#define SPSR_AIF_MASK 0x7
#define SPSR_E_SHIFT 9
#define SPSR_E_MASK 0x1
#define SPSR_E_LITTLE 0x0
#define SPSR_E_BIG 0x1
#define SPSR_T_SHIFT 5
#define SPSR_T_MASK 0x1
#define SPSR_T_ARM 0x0
#define SPSR_T_THUMB 0x1
#define MODE_SP_SHIFT 0x0
#define MODE_SP_MASK 0x1
#define MODE_SP_EL0 0x0
#define MODE_SP_ELX 0x1
#define MODE_RW_SHIFT 0x4
#define MODE_RW_MASK 0x1
#define MODE_RW_64 0x0
#define MODE_RW_32 0x1
#define MODE_EL_SHIFT 0x2
#define MODE_EL_MASK 0x3
#define MODE_EL3 0x3
#define MODE_EL2 0x2
#define MODE_EL1 0x1
#define MODE_EL0 0x0
#define MODE32_SHIFT 0
#define MODE32_MASK 0xf
#define MODE32_USR 0x0
#define MODE32_FIQ 0x1
#define MODE32_IRQ 0x2
#define MODE32_SVC 0x3
#define MODE32_MON 0x6
#define MODE32_ABT 0x7
#define MODE32_HYP 0xa
#define MODE32_UND 0xb
#define MODE32_SYS 0xf
/* Param header types */
#define PARAM_EP 0x01UL
#define PARAM_IMAGE_BINARY 0x02UL
#define PARAM_BL31 0x03UL
#define PARAM_BL_LOAD_INFO 0x04UL
#define PARAM_BL_PARAMS 0x05UL
#define PARAM_PSCI_LIB_ARGS 0x06UL
#define PARAM_SP_IMAGE_BOOT_INFO 0x07UL
/* Param header version */
#define VERSION_1 0x01UL
#define VERSION_2 0x02UL
/* Firmware Image Package */
#define FIP_IMAGE_ID 0UL
/* Trusted Boot Firmware BL2 */
#define BL2_IMAGE_ID 1UL
/* SCP Firmware SCP_BL2 */
#define SCP_BL2_IMAGE_ID 2UL
/* EL3 Runtime Firmware BL31 */
#define BL31_IMAGE_ID 3UL
/* Secure Payload BL32 (Trusted OS) */
#define BL32_IMAGE_ID 4UL
/* Non-Trusted Firmware BL33 */
#define BL33_IMAGE_ID 5UL
#define DISABLE_ALL_EXCEPTIONS \
(DAIF_FIQ_BIT | DAIF_IRQ_BIT | DAIF_ABT_BIT | DAIF_DBG_BIT)
#define PARAM_EP_SECURITY_MASK 0x1
#define get_security_state(x) ((x) & PARAM_EP_SECURITY_MASK)
#define set_security_state(x, security) \
((x) = ((x) & ~PARAM_EP_SECURITY_MASK) | (security))
#define spsr_64(el, sp, daif) \
(MODE_RW_64 << MODE_RW_SHIFT | ((el) & MODE_EL_MASK) << MODE_EL_SHIFT | \
((sp) & MODE_SP_MASK) << MODE_SP_SHIFT | ((daif) & SPSR_DAIF_MASK) << SPSR_DAIF_SHIFT)
#define spsr_mode32(mode, isa, endian, aif) (MODE_RW_32 << MODE_RW_SHIFT | \
((mode) & MODE32_MASK) << MODE32_SHIFT | ((isa) & SPSR_T_MASK) << SPSR_T_SHIFT | \
((endian) & SPSR_E_MASK) << SPSR_E_SHIFT | ((aif) & SPSR_AIF_MASK) << SPSR_AIF_SHIFT)
/* Length of a node address (an IEEE 802 address). */
#define _UUID_NODE_LEN 6
#define FIP_MAX_FILES 3
/* TODO: Update this number as required */
#define TOC_HEADER_SERIAL_NUMBER 0x12345678
#define FLAG_FILENAME (1 << 0)
/* This is used as a signature to validate the blob header */
#define TOC_HEADER_NAME 0xAA640001
/* ToC Entry UUIDs */
#define UUID_TRUSTED_BOOT_FIRMWARE_BL2 \
{0x0becf95f, 0x224d, 0x4d3e, 0xa5, 0x44, {0xc3, 0x9d, 0x81, 0xc7, 0x3f, 0x0a} }
#define UUID_SCP_FIRMWARE_BL30 \
{0x3dfd6697, 0xbe89, 0x49e8, 0xae, 0x5d, {0x78, 0xa1, 0x40, 0x60, 0x82, 0x13} }
#define UUID_EL3_RUNTIME_FIRMWARE_BL31 \
{0x6d08d447, 0xfe4c, 0x4698, 0x9b, 0x95, {0x29, 0x50, 0xcb, 0xbd, 0x5a, 0x00} }
#define UUID_SECURE_PAYLOAD_BL32 \
{0x89e1d005, 0xdc53, 0x4713, 0x8d, 0x2b, {0x50, 0x0a, 0x4b, 0x7a, 0x3e, 0x38} }
#define UUID_NON_TRUSTED_FIRMWARE_BL33 \
{0xa7eed0d6, 0xeafc, 0x4bd5, 0x97, 0x82, {0x99, 0x34, 0xf2, 0x34, 0xb6, 0xe4} }
/**************************************************************/
/* XXX namespace pollution? */
typedef struct uuuid uuid_t;
/**************************************************************/
/*
* See also:
* http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt
* http://www.opengroup.org/onlinepubs/009629399/apdxa.htm
*
* A DCE 1.1 compatible source representation of UUIDs.
*/
struct uuuid {
uint32_t time_low;
uint16_t time_mid;
uint16_t time_hi_and_version;
uint8_t clock_seq_hi_and_reserved;
uint8_t clock_seq_low;
uint8_t node[_UUID_NODE_LEN];
};
typedef struct entry_lookup_list {
const char *name;
uuid_t name_uuid;
const char *command_line_name;
struct file_info *info;
unsigned int flags;
} entry_lookup_list_t;
typedef struct file_info {
uuid_t name_uuid;
const char *filename;
unsigned int size;
void *image_buffer;
entry_lookup_list_t *entry;
} file_info_t;
typedef struct fip_toc_header {
uint32_t name;
uint32_t serial_number;
uint64_t flags;
} fip_toc_header_t;
typedef struct fip_toc_entry {
uuid_t uuid;
uint64_t offset_address;
uint64_t size;
uint64_t flags;
} fip_toc_entry_t;
typedef struct aapcs64_params {
uint64_t arg0;
uint64_t arg1;
uint64_t arg2;
uint64_t arg3;
uint64_t arg4;
uint64_t arg5;
uint64_t arg6;
uint64_t arg7;
} aapcs64_params_t;
typedef struct aapcs32_params {
uint64_t arg0;
uint64_t arg1;
uint64_t arg2;
uint64_t arg3;
} aapcs32_params_t;
/***************************************************************************
* This structure provides version information and the size of the
* structure, attributes for the structure it represents
***************************************************************************/
typedef struct param_header {
uint8_t type; /* type of the structure */
uint8_t version; /* version of this structure */
uint16_t size; /* size of this structure in bytes */
uint32_t attr; /* attributes: unused bits SBZ */
} param_header_t;
/*****************************************************************************
* This structure represents the superset of information needed while
* switching exception levels. The only two mechanisms to do so are
* ERET & SMC. Security state is indicated using bit zero of header
* attribute
* NOTE: BL1 expects entrypoint followed by spsr at an offset from the start
* of this structure defined by the macro `ENTRY_POINT_INFO_PC_OFFSET` while
* processing SMC to jump to BL31.
*****************************************************************************/
typedef struct entry_point_info {
param_header_t h;
uint64_t pc;
uint32_t spsr;
aapcs64_params_t args;
} entry_point_info_t;
/*****************************************************************************
* Image info binary provides information from the image loader that
* can be used by the firmware to manage available trusted RAM.
* More advanced firmware image formats can provide additional
* information that enables optimization or greater flexibility in the
* common firmware code
*****************************************************************************/
typedef struct bl_image_info {
param_header_t h;
uint64_t image_base; /* physical address of base of image */
uint32_t image_size; /* bytes read from image file */
uint32_t image_max_size;
} bl_image_info_t;
/*****************************************************************************
* The image descriptor struct definition.
*****************************************************************************/
/* BL image node in the BL image execution sequence */
typedef struct bl_params_node {
unsigned int image_id;
bl_image_info_t *image_info __attribute((aligned (8)));
entry_point_info_t *ep_info __attribute((aligned (8)));
struct bl_params_node *next_params_info __attribute((aligned (8)));
} bl_params_node_t;
/*
* BL image head node in the BL image execution sequence
* It is also used to pass information to next BL image.
*/
typedef struct bl_params {
param_header_t h;
bl_params_node_t *head __attribute((aligned (8)));
} bl_params_t;
/*******************************************************************************
* This structure represents the superset of information that can be passed to
* BL31 e.g. while passing control to it from BL2. The BL32 parameters will be
* populated only if BL2 detects its presence. A pointer to a structure of this
* type should be passed in X0 to BL31's cold boot entrypoint.
*
* Use of this structure and the X0 parameter is not mandatory: the BL31
* platform code can use other mechanisms to provide the necessary information
* about BL32 and BL33 to the common and SPD code.
*
* BL31 image information is mandatory if this structure is used. If either of
* the optional BL32 and BL33 image information is not provided, this is
* indicated by the respective image_info pointers being zero.
******************************************************************************/
typedef struct bl31_params {
param_header_t h;
uint64_t bl31_image_info;
uint64_t bl32_ep_info;
uint64_t bl32_image_info;
uint64_t bl33_ep_info;
uint64_t bl33_image_info;
} bl31_params_t;
typedef struct smc_cmd_args {
uint32_t arg1;
uint32_t arg2;
uint32_t arg3;
uint32_t arg4;
uint32_t arg5;
}smc_cmd_args_t;
#define BL33_IMG_ARM32 32
#define BL33_IMG_ARM64 64
#include <image.h>
void run_bl31(bootm_headers_t *images, uint32_t machid);
#endif /* __LOTUS_ATF_H__ */