arm-trusted-firmware/include/lib/gpt/gpt.h
Zelalem Aweke 1839012d5b feat(rme): add GPT Library
This patch introduces the Granule Protection Table (GPT)
library code. This implementation will be updated later to
be more flexible, as the current implementation is very rigid.

Signed-off-by: Zelalem Aweke <zelalem.aweke@arm.com>
Change-Id: I3af824a28c6e9a5d36459c0c51d2d9bebfba1505
2021-10-05 11:56:00 -05:00

86 lines
2.4 KiB
C

/*
* Copyright (c) 2021, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef GPT_H
#define GPT_H
#include <stdint.h>
#include <arch.h>
#include "gpt_defs.h"
#define GPT_DESC_ATTRS(_type, _gpi) \
((((_type) & PAS_REG_DESC_TYPE_MASK) \
<< PAS_REG_DESC_TYPE_SHIFT) | \
(((_gpi) & PAS_REG_GPI_MASK) \
<< PAS_REG_GPI_SHIFT))
/*
* Macro to create a GPT entry for this PAS range either as a L0 block
* descriptor or L1 table descriptor depending upon the size of the range.
*/
#define MAP_GPT_REGION(_pa, _sz, _gpi) \
{ \
.base_pa = (_pa), \
.size = (_sz), \
.attrs = GPT_DESC_ATTRS(PAS_REG_DESC_TYPE_ANY, (_gpi)), \
}
/*
* Special macro to create a L1 table descriptor at L0 for a 1GB region as
* opposed to creating a block mapping by default.
*/
#define MAP_GPT_REGION_TBL(_pa, _sz, _gpi) \
{ \
.base_pa = (_pa), \
.size = (_sz), \
.attrs = GPT_DESC_ATTRS(PAS_REG_DESC_TYPE_TBL, (_gpi)), \
}
/*
* Structure for specifying a Granule range and its properties
*/
typedef struct pas_region {
unsigned long long base_pa; /**< Base address for PAS. */
size_t size; /**< Size of the PAS. */
unsigned int attrs; /**< PAS GPI and entry type. */
} pas_region_t;
/*
* Structure to initialise the Granule Protection Tables.
*/
typedef struct gpt_init_params {
unsigned int pgs; /**< Address Width of Phisical Granule Size. */
unsigned int pps; /**< Protected Physical Address Size. */
unsigned int l0gptsz; /**< Granule size on L0 table entry. */
pas_region_t *pas_regions; /**< PAS regions to protect. */
unsigned int pas_count; /**< Number of PAS regions to initialise. */
uintptr_t l0_mem_base; /**< L0 Table base address. */
size_t l0_mem_size; /**< Size of memory reserved for L0 tables. */
uintptr_t l1_mem_base; /**< L1 Table base address. */
size_t l1_mem_size; /**< Size of memory reserved for L1 tables. */
} gpt_init_params_t;
/** @brief Initialise the Granule Protection tables.
*/
int gpt_init(gpt_init_params_t *params);
/** @brief Enable the Granule Protection Checks.
*/
void gpt_enable(void);
/** @brief Disable the Granule Protection Checks.
*/
void gpt_disable(void);
/** @brief Transition a granule between security states.
*/
int gpt_transition_pas(uint64_t pa,
unsigned int src_sec_state,
unsigned int target_pas);
#endif /* GPT_H */