/*
 * 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))

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 */
