5 #ifndef OPENTITAN_SW_DEVICE_LIB_RUNTIME_PMP_H_
6 #define OPENTITAN_SW_DEVICE_LIB_RUNTIME_PMP_H_
37 #define PMP_REGIONS_NUM 16
45 #define PMP_GRANULARITY_IBEX 0
57 #define PMP_ADDRESS_MIN_ALIGNMENT 4
58 #define PMP_ADDRESS_MIN_ALIGNMENT_NAPOT 8
59 #define PMP_ADDRESS_ALIGNMENT (4u << PMP_GRANULARITY_IBEX)
60 #define PMP_ADDRESS_ALIGNMENT_MASK (PMP_ADDRESS_ALIGNMENT - 1)
61 #define PMP_ADDRESS_ALIGNMENT_INVERTED_MASK (~PMP_ADDRESS_ALIGNMENT_MASK)
62 #define PMP_ADDRESS_SHIFT 2
63 #define PMP_ADDRESS_SHIFT_NAPOT 3
78 typedef enum pmp_region_permissions {
79 kPmpRegionPermissionsNone = 0,
80 kPmpRegionPermissionsReadOnly,
81 kPmpRegionPermissionsExecuteOnly,
82 kPmpRegionPermissionsReadExecute,
83 kPmpRegionPermissionsReadWrite,
84 kPmpRegionPermissionsReadWriteExecute,
85 } pmp_region_permissions_t;
100 typedef enum pmp_region_lock {
101 kPmpRegionLockUnlocked = 0,
102 kPmpRegionLockLocked,
108 typedef uint32_t pmp_region_index_t;
125 typedef enum pmp_result {
134 typedef enum pmp_region_configure_result {
135 kPmpRegionConfigureOk = kPmpOk,
136 kPmpRegionConfigureError = kPmpError,
137 kPmpRegionConfigureBadArg = kPmpBadArg,
141 kPmpRegionConfigureBadRegion,
145 kPmpRegionConfigureBadAddress,
155 kPmpRegionConfigureWarlError,
156 } pmp_region_configure_result_t;
176 pmp_region_configure_result_t pmp_region_configure_off(
177 pmp_region_index_t region, uintptr_t address);
182 typedef enum pmp_region_configure_na4_result {
183 kPmpRegionConfigureNa4Ok = kPmpRegionConfigureOk,
184 kPmpRegionConfigureNa4Error = kPmpRegionConfigureError,
185 kPmpRegionConfigureNa4BadArg = kPmpRegionConfigureBadArg,
186 kPmpRegionConfigureNa4BadRegion = kPmpRegionConfigureBadRegion,
187 kPmpRegionConfigureNa4BadAddress = kPmpRegionConfigureBadAddress,
188 kPmpRegionConfigureNa4WarlError = kPmpRegionConfigureWarlError,
195 kPmpRegionConfigureNa4Unavailable,
196 } pmp_region_configure_na4_result_t;
213 pmp_region_configure_na4_result_t pmp_region_configure_na4(
220 typedef enum pmp_region_configure_napot_result {
221 kPmpRegionConfigureNapotOk = kPmpRegionConfigureOk,
222 kPmpRegionConfigureNapotError = kPmpRegionConfigureError,
223 kPmpRegionConfigureNapotBadArg = kPmpRegionConfigureBadArg,
224 kPmpRegionConfigureNapotBadRegion = kPmpRegionConfigureBadRegion,
225 kPmpRegionConfigureNapotBadAddress = kPmpRegionConfigureBadAddress,
226 kPmpRegionConfigureNapotWarlError = kPmpRegionConfigureWarlError,
234 kPmpRegionConfigureNapotBadSize,
235 } pmp_region_configure_napot_result_t;
260 pmp_region_configure_napot_result_t pmp_region_configure_napot(
262 uintptr_t address, uint32_t size);
284 pmp_region_configure_result_t pmp_region_configure_tor(
286 uintptr_t address_start, uintptr_t address_end);
296 pmp_region_configure_result_t pmp_region_is_configured(
297 pmp_region_index_t region,
bool *configured);
307 pmp_region_configure_result_t pmp_region_lock_status_get(
308 pmp_region_index_t region, pmp_region_lock_t *lock);