228 typedef struct ALT_MMU_TTBCR_s
243 typedef enum ALT_MMU_TCR_PS_e
245 ALT_MMU_TCR_PS_4GiB = 0,
246 ALT_MMU_TCR_PS_64GiB = 1,
247 ALT_MMU_TCR_PS_1TiB = 2,
248 ALT_MMU_TCR_PS_4TiB = 3,
249 ALT_MMU_TCR_PS_16TiB = 4,
250 ALT_MMU_TCR_PS_256TiB = 5
258 typedef enum ALT_MMU_TCR_TG0_e
260 ALT_MMU_TCR_TG0_4KiB = 0,
261 ALT_MMU_TCR_TG0_16KiB = 2,
262 ALT_MMU_TCR_TG0_64KiB = 1
270 typedef struct ALT_MMU_TCR_s
274 ALT_MMU_TCR_TG0_t tg0;
289 #define ALT_MMU_VMSAV8_32_LONG_TTB_TYPE_E_FAULT (0x0)
290 #define ALT_MMU_VMSAV8_32_LONG_TTB_TYPE_E_BLOCK (0x1)
291 #define ALT_MMU_VMSAV8_32_LONG_TTB_TYPE_E_TABLE (0x3)
292 #define ALT_MMU_VMSAV8_32_LONG_TTB_TYPE_E_PAGE (0x3)
293 #define ALT_MMU_VMSAV8_32_LONG_TTB_TYPE_SET(value) (((uint64_t)(value) & 0x3) << 0)
296 #define ALT_MMU_VMSAV8_32_LONG_TABLE_PXNTABLE_SET(value) (((uint64_t)(value) & 0x1) << 59)
297 #define ALT_MMU_VMSAV8_32_LONG_TABLE_XNTABLE_SET(value) (((uint64_t)(value) & 0x1) << 60)
298 #define ALT_MMU_VMSAV8_32_LONG_TABLE_APTABLE_SET(value) (((uint64_t)(value) & 0x3) << 61)
299 #define ALT_MMU_VMSAV8_32_LONG_TABLE_NSTABLE_SET(value) (((uint64_t)(value) & 0x1) << 63)
302 #define ALT_MMU_VMSAV8_32_LONG_BLOCK_XN_SET(value) (((uint64_t)(value) & 0x1) << 54)
303 #define ALT_MMU_VMSAV8_32_LONG_BLOCK_PXN_SET(value) (((uint64_t)(value) & 0x1) << 53)
304 #define ALT_MMU_VMSAV8_32_LONG_BLOCK_CONT_SET(value) (((uint64_t)(value) & 0x1) << 52)
307 #define ALT_MMU_VMSAV8_32_LONG_BLOCK_NG_SET(value) (((uint64_t)(value) & 0x3) << 9)
308 #define ALT_MMU_VMSAV8_32_LONG_BLOCK_AF_SET(value) (((uint64_t)(value) & 0x3) << 9)
309 #define ALT_MMU_VMSAV8_32_LONG_BLOCK_SH_SET(value) (((uint64_t)(value) & 0x3) << 9)
310 #define ALT_MMU_VMSAV8_32_LONG_BLOCK_AP_SET(value) (((uint64_t)(value) & 0x6) << 5)
311 #define ALT_MMU_VMSAV8_32_LONG_BLOCK_NS_SET(value) (((uint64_t)(value) & 0x1) << 5)
312 #define ALT_MMU_VMSAV8_32_LONG_BLOCK_ATTR_INDEX_SET(value) (((uint64_t)(value) & 0x7) << 2)
316 #define ALT_MMU_VMSAV8_64_TTB_TYPE_E_FAULT (0x0)
317 #define ALT_MMU_VMSAV8_64_TTB_TYPE_E_BLOCK (0x1)
318 #define ALT_MMU_VMSAV8_64_TTB_TYPE_E_TABLE (0x3)
319 #define ALT_MMU_VMSAV8_64_TTB_TYPE_E_PAGE (0x3)
320 #define ALT_MMU_VMSAV8_64_TTB_TYPE_SET(value) (((uint64_t)(value) & 0x3) << 0)
323 #define ALT_MMU_VMSAV8_64_TABLE_PXNTABLE_SET(value) (((uint64_t)(value) & 0x1) << 59)
324 #define ALT_MMU_VMSAV8_64_TABLE_XNTABLE_SET(value) (((uint64_t)(value) & 0x1) << 60)
325 #define ALT_MMU_VMSAV8_64_TABLE_APTABLE_SET(value) (((uint64_t)(value) & 0x3) << 61)
326 #define ALT_MMU_VMSAV8_64_TABLE_NSTABLE_SET(value) (((uint64_t)(value) & 0x1) << 63)
329 #define ALT_MMU_VMSAV8_64_BLOCK_XN_SET(value) (((uint64_t)(value) & 0x1) << 54)
330 #define ALT_MMU_VMSAV8_64_BLOCK_PXN_SET(value) (((uint64_t)(value) & 0x1) << 53)
331 #define ALT_MMU_VMSAV8_64_BLOCK_CONT_SET(value) (((uint64_t)(value) & 0x1) << 52)
334 #define ALT_MMU_VMSAV8_64_BLOCK_NG_SET(value) (((uint64_t)(value) & 0x1) << 11)
335 #define ALT_MMU_VMSAV8_64_BLOCK_AF_SET(value) (((uint64_t)(value) & 0x1) << 10)
336 #define ALT_MMU_VMSAV8_64_BLOCK_SH_SET(value) (((uint64_t)(value) & 0x3) << 8)
337 #define ALT_MMU_VMSAV8_64_BLOCK_AP_SET(value) (((uint64_t)(value) & 0x3) << 6)
338 #define ALT_MMU_VMSAV8_64_BLOCK_NS_SET(value) (((uint64_t)(value) & 0x1) << 5)
339 #define ALT_MMU_VMSAV8_64_BLOCK_ATTR_INDEX_SET(value) (((uint64_t)(value) & 0x7) << 2)
341 #define GEN_MAIR_INDEX(index, value) (((value) & 0xff) << (8 * index))
345 #define MAIR_ATTR_DEVICE_nGnRnE (0x00)
349 #define MAIR_ATTR_DEVICE_nGnRE (0x04)
353 #define OUTER_WB (1 << 6)
354 #define OUTER_NONTRANS (1 << 7)
355 #define OUTER_WALLOC (1 << 4)
356 #define OUTER_RALLOC (1 << 5)
357 #define INNER_WB (1 << 2)
358 #define INNER_NONTRANS (1 << 3)
359 #define INNER_WALLOC (1 << 0)
360 #define INNER_RALLOC (1 << 1)
362 #define MAIR_ATTR_MEMORY_IO_WBRWA (OUTER_WB | OUTER_NONTRANS | OUTER_WALLOC | OUTER_RALLOC | INNER_WB | INNER_NONTRANS | INNER_WALLOC | INNER_RALLOC)
365 #define MAIR_ATTR_DEFAULT MAIR_ATTR_DEVICE_nGnRnE
367 #define ALT_MMU_VMSAV8_64_TTB_ADDR_4KB(value) ( ((uint64_t)(value) & 0x00007FFFFFFFFF000) )
368 #define ALT_MMU_VMSAV8_64_TTB_ADDR_16KB(value) ( ((uint64_t)(value) & 0x00007FFFFFFFFC000) )
369 #define ALT_MMU_VMSAV8_64_TTB_ADDR_64KB(value) ( ((uint64_t)(value) & 0x00007FFFFFFFF0000) )
464 unsigned descriptor_count;
465 uintptr_t block_size[4];
466 uintptr_t table_span[4];
469 } ALT_MMU_GRANULE_INFO_t;
471 extern ALT_MMU_GRANULE_INFO_t granule_4KiB;
472 extern ALT_MMU_GRANULE_INFO_t granule_16KiB;
473 extern ALT_MMU_GRANULE_INFO_t granule_64KiB;
506 typedef void* (*alt_mmu_ttb_alloc_t)(
size_t size,
size_t align,
void * context);
513 typedef ALT_MMU_TTBCR_t ALT_MMU_TCR_INFO_t;
515 typedef ALT_MMU_TCR_t ALT_MMU_TCR_INFO_t;
551 size_t regions_count,
552 const ALT_MMU_GRANULE_INFO_t * granule_info,
553 const ALT_MMU_TCR_INFO_t * ttbconfig);
605 size_t regions_count,
606 const ALT_MMU_GRANULE_INFO_t * granule_info,
607 const ALT_MMU_TCR_INFO_t * ttbconfig,
643 ALT_STATUS_CODE alt_mmu_va_space_enable(
const uint64_t* translation_table_base,
644 const ALT_MMU_TCR_INFO_t *tcrconfig,
678 uint64_t
alt_mmu_va_to_pa(
const void * va, ALT_MMU_ATTR_t * attr, uint32_t * dfsc);