/*
 * Copyright (c) 2022-2024, Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef PLAT_DRTM_H
#define PLAT_DRTM_H

#include <stdint.h>
#include <lib/xlat_tables/xlat_tables_compat.h>

typedef struct {
	uint8_t max_num_mem_prot_regions;
	uint8_t dma_protection_support;
} plat_drtm_dma_prot_features_t;

typedef struct {
	bool tpm_based_hash_support;
	uint16_t firmware_hash_algorithm;
} plat_drtm_tpm_features_t;

typedef struct {
	uint64_t region_address;
	uint64_t region_size_type;
} __attribute__((packed)) drtm_mem_region_t;

/*
 * Memory region descriptor table structure as per DRTM 1.0 section 3.13
 * Table 11 MEMORY_REGION_DESCRIPTOR_TABLE
 */
typedef struct {
	uint16_t revision;
	uint16_t reserved;
	uint32_t num_regions;
	drtm_mem_region_t region[];
} __attribute__((packed)) drtm_memory_region_descriptor_table_t;

/* platform specific address map functions */
const mmap_region_t *plat_get_addr_mmap(void);

/* platform-specific DMA protection functions */
bool plat_has_non_host_platforms(void);
bool plat_has_unmanaged_dma_peripherals(void);
unsigned int plat_get_total_smmus(void);
void plat_enumerate_smmus(const uintptr_t **smmus_out,
			  size_t *smmu_count_out);
const plat_drtm_dma_prot_features_t *plat_drtm_get_dma_prot_features(void);
uint64_t plat_drtm_dma_prot_get_max_table_bytes(void);

/* platform-specific TPM functions */
const plat_drtm_tpm_features_t *plat_drtm_get_tpm_features(void);

/*
 * TODO: Implement these functions as per the platform use case,
 * as of now none of the platform uses these functions
 */
uint64_t plat_drtm_get_min_size_normal_world_dce(void);
uint64_t plat_drtm_get_tcb_hash_table_size(void);
uint64_t plat_drtm_get_imp_def_dlme_region_size(void);
uint64_t plat_drtm_get_tcb_hash_features(void);

/* DRTM error handling functions */
int plat_set_drtm_error(uint64_t error_code);
int plat_get_drtm_error(uint64_t *error_code);

/*
 * Platform-specific function to ensure passed region lies within
 * Non-Secure region of DRAM
 */
int plat_drtm_validate_ns_region(uintptr_t region_start,
				 size_t region_size);

#endif /* PLAT_DRTM_H */
