mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-18 02:24:18 +00:00

Added DRTM parameters structure version check that as per the current released DRTM specification [1]. Mainly to cater below mentioned in the specification [1] section 3.12 - For a given DRTM major version number this structure will always be extended in a backwards compatible manner. [1]: https://developer.arm.com/documentation/den0113/a Change-Id: I9f312c7f9f20152c5d7e40a22b462c7fe8db70bc Signed-off-by: Manish V Badarkhe <Manish.Badarkhe@arm.com>
106 lines
2.6 KiB
C
106 lines
2.6 KiB
C
/*
|
|
* Copyright (c) 2022 Arm Limited. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*
|
|
*/
|
|
#ifndef DRTM_MAIN_H
|
|
#define DRTM_MAIN_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <assert.h>
|
|
#include <lib/smccc.h>
|
|
|
|
#include "drtm_dma_prot.h"
|
|
|
|
#define ALIGNED_UP(x, a) __extension__ ({ \
|
|
__typeof__(a) _a = (a); \
|
|
__typeof__(a) _one = 1; \
|
|
assert(IS_POWER_OF_TWO(_a)); \
|
|
((x) + (_a - _one)) & ~(_a - _one); \
|
|
})
|
|
|
|
#define ALIGNED_DOWN(x, a) __extension__ ({ \
|
|
__typeof__(a) _a = (a); \
|
|
__typeof__(a) _one = 1; \
|
|
assert(IS_POWER_OF_TWO(_a)); \
|
|
(x) & ~(_a - _one); \
|
|
})
|
|
|
|
#define DRTM_PAGE_SIZE (4 * (1 << 10))
|
|
#define DRTM_PAGE_SIZE_STR "4-KiB"
|
|
|
|
#define DL_ARGS_GET_DMA_PROT_TYPE(a) (((a)->features >> 3) & 0x7U)
|
|
#define DL_ARGS_GET_PCR_SCHEMA(a) (((a)->features >> 1) & 0x3U)
|
|
#define DL_ARGS_GET_DLME_ENTRY_POINT(a) \
|
|
(((a)->dlme_paddr + (a)->dlme_img_off + (a)->dlme_img_ep_off))
|
|
|
|
/*
|
|
* Range(Min/Max) of DRTM parameter structure versions supported
|
|
*/
|
|
#define ARM_DRTM_PARAMS_MIN_VERSION U(1)
|
|
#define ARM_DRTM_PARAMS_MAX_VERSION U(1)
|
|
|
|
enum drtm_dlme_el {
|
|
DLME_AT_EL1 = MODE_EL1,
|
|
DLME_AT_EL2 = MODE_EL2
|
|
};
|
|
|
|
enum drtm_retc {
|
|
SUCCESS = SMC_OK,
|
|
NOT_SUPPORTED = SMC_UNK,
|
|
INVALID_PARAMETERS = -2,
|
|
DENIED = -3,
|
|
NOT_FOUND = -4,
|
|
INTERNAL_ERROR = -5,
|
|
MEM_PROTECT_INVALID = -6,
|
|
};
|
|
|
|
typedef struct {
|
|
uint64_t tpm_features;
|
|
uint64_t minimum_memory_requirement;
|
|
uint64_t dma_prot_features;
|
|
uint64_t boot_pe_id;
|
|
uint64_t tcb_hash_features;
|
|
} drtm_features_t;
|
|
|
|
struct __packed drtm_dl_args_v1 {
|
|
uint16_t version; /* Must be 1. */
|
|
uint8_t __res[2];
|
|
uint32_t features;
|
|
uint64_t dlme_paddr;
|
|
uint64_t dlme_size;
|
|
uint64_t dlme_img_off;
|
|
uint64_t dlme_img_ep_off;
|
|
uint64_t dlme_img_size;
|
|
uint64_t dlme_data_off;
|
|
uint64_t dce_nwd_paddr;
|
|
uint64_t dce_nwd_size;
|
|
drtm_dl_dma_prot_args_v1_t dma_prot_args;
|
|
} __aligned(__alignof(uint16_t /* First member's type, `uint16_t version' */));
|
|
|
|
struct __packed dlme_data_header_v1 {
|
|
uint16_t version; /* Must be 1. */
|
|
uint16_t this_hdr_size;
|
|
uint8_t __res[4];
|
|
uint64_t dlme_data_size;
|
|
uint64_t dlme_prot_regions_size;
|
|
uint64_t dlme_addr_map_size;
|
|
uint64_t dlme_tpm_log_size;
|
|
uint64_t dlme_tcb_hashes_table_size;
|
|
uint64_t dlme_impdef_region_size;
|
|
} __aligned(__alignof(uint16_t /* First member's type, `uint16_t version'. */));
|
|
|
|
typedef struct dlme_data_header_v1 struct_dlme_data_header;
|
|
|
|
drtm_memory_region_descriptor_table_t *drtm_build_address_map(void);
|
|
uint64_t drtm_get_address_map_size(void);
|
|
|
|
/*
|
|
* Version-independent type. May be used to avoid excessive line of code
|
|
* changes when migrating to new struct versions.
|
|
*/
|
|
typedef struct drtm_dl_args_v1 struct_drtm_dl_args;
|
|
|
|
#endif /* DRTM_MAIN_H */
|