|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | #ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_ROM_ROM_EPMP_H_ | 
|  | #define OPENTITAN_SW_DEVICE_SILICON_CREATOR_ROM_ROM_EPMP_H_ | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "sw/device/silicon_creator/lib/drivers/lifecycle.h" | 
|  | #include "sw/device/silicon_creator/lib/epmp_state.h" | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif  // __cplusplus | 
|  |  | 
|  | /** | 
|  | * ROM enhanced Physical Memory Protection (ePMP) library. | 
|  | * | 
|  | * The ePMP configuration is managed in two parts: | 
|  | * | 
|  | *   1. The actual hardware configuration held in CSRs | 
|  | *   2. The in-memory copy of register values in `epmp_state_t` that is used | 
|  | *      to verify the CSRs | 
|  | * | 
|  | * Every time the hardware configuration is updated the in-memory copy | 
|  | * must also be updated. The hardware configuration is usually interacted | 
|  | * with directly using the CSR library or assembly whereas the in-memory | 
|  | * copy of the state should normally be modified using configuration functions | 
|  | * from the silicon creator ePMP library. | 
|  | * | 
|  | * This separation of concerns allows the hardware configuration to be | 
|  | * updated efficiently as needed (including before the C runtime is | 
|  | * initialized) with the in-memory copy of the state used to double check the | 
|  | * configuration as required. | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * Initialise the ePMP in-memory copy of the register state to reflect the | 
|  | * hardware configuration expected at entry to the ROM C code. | 
|  | * | 
|  | * The actual hardware configuration is performed separately, either by reset | 
|  | * logic or in assembly. This code must be kept in sync with any changes | 
|  | * to the hardware configuration. | 
|  | * | 
|  | * @param lc_state The current lifecycle state to check for debug enable. | 
|  | */ | 
|  | void rom_epmp_state_init(lifecycle_state_t lc_state); | 
|  |  | 
|  | /** | 
|  | * Unlocks the provided ROM_EXT image region with read-execute permissions. | 
|  | * | 
|  | * The provided ePMP state is also updated to reflect the changes made to the | 
|  | * hardware configuration. | 
|  | * | 
|  | * @param region Region for executable sections in ROM_EXT image. | 
|  | */ | 
|  | void rom_epmp_unlock_rom_ext_rx(epmp_region_t region); | 
|  |  | 
|  | /** | 
|  | * Unlocks the provided ROM_EXT image region with read-only permissions. | 
|  | * | 
|  | * The provided ePMP state is also updated to reflect the changes made to the | 
|  | * hardware configuration. | 
|  | * The image size must be power of 2 as this function uses NAPOT | 
|  | * (Naturally-Aligned-Power-Of-Two) addressing mode. | 
|  | * | 
|  | * @param region Region in the ROM_EXT image to receive read-only permission. | 
|  | */ | 
|  | void rom_epmp_unlock_rom_ext_r(epmp_region_t region); | 
|  | /** | 
|  | * Configure the ePMP entry to manage access to Debug ROM based on life cycle | 
|  | * state. | 
|  | * | 
|  | * @param lc_state The current lifecycle state to check for debug enable. | 
|  | */ | 
|  | void rom_epmp_config_debug_rom(lifecycle_state_t lc_state); | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | }  // extern "C" | 
|  | #endif  // __cplusplus | 
|  |  | 
|  | #endif  // OPENTITAN_SW_DEVICE_SILICON_CREATOR_ROM_ROM_EPMP_H_ |