coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mmu.h File Reference
#include <types.h>
Include dependency graph for mmu.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  mmu_context
 

Macros

#define MA_MEM   (1 << 0)
 
#define MA_DEV   (0 << 0)
 
#define MA_NS   (1 << 1)
 
#define MA_S   (0 << 1)
 
#define MA_RO   (1 << 2)
 
#define MA_RW   (0 << 2)
 
#define MA_MEM_NC   (1 << 3)
 
#define INVALID_DESC   0x0
 
#define BLOCK_DESC   0x1
 
#define TABLE_DESC   0x3
 
#define PAGE_DESC   0x3
 
#define DESC_MASK   0x3
 
#define BLOCK_NS   (1 << 5)
 
#define BLOCK_AP_RW   (0 << 7)
 
#define BLOCK_AP_RO   (1 << 7)
 
#define BLOCK_ACCESS   (1 << 10)
 
#define BLOCK_XN   (1UL << 54)
 
#define BLOCK_SH_SHIFT   (8)
 
#define BLOCK_SH_NON_SHAREABLE   (0 << BLOCK_SH_SHIFT)
 
#define BLOCK_SH_UNPREDICTABLE   (1 << BLOCK_SH_SHIFT)
 
#define BLOCK_SH_OUTER_SHAREABLE   (2 << BLOCK_SH_SHIFT)
 
#define BLOCK_SH_INNER_SHAREABLE   (3 << BLOCK_SH_SHIFT)
 
#define UNUSED_DESC   0x6EbAAD0BBADbA6E0
 
#define VA_START   0x0
 
#define BITS_PER_VA   48
 
#define GRANULE_SIZE_SHIFT   12
 
#define GRANULE_SIZE   (1 << GRANULE_SIZE_SHIFT)
 
#define XLAT_ADDR_MASK   ((1UL << BITS_PER_VA) - GRANULE_SIZE)
 
#define GRANULE_SIZE_MASK   ((1 << GRANULE_SIZE_SHIFT) - 1)
 
#define BITS_RESOLVED_PER_LVL   (GRANULE_SIZE_SHIFT - 3)
 
#define L0_ADDR_SHIFT   (GRANULE_SIZE_SHIFT + BITS_RESOLVED_PER_LVL * 3)
 
#define L1_ADDR_SHIFT   (GRANULE_SIZE_SHIFT + BITS_RESOLVED_PER_LVL * 2)
 
#define L2_ADDR_SHIFT   (GRANULE_SIZE_SHIFT + BITS_RESOLVED_PER_LVL * 1)
 
#define L3_ADDR_SHIFT   (GRANULE_SIZE_SHIFT + BITS_RESOLVED_PER_LVL * 0)
 
#define L0_ADDR_MASK   (((1UL << BITS_RESOLVED_PER_LVL) - 1) << L0_ADDR_SHIFT)
 
#define L1_ADDR_MASK   (((1UL << BITS_RESOLVED_PER_LVL) - 1) << L1_ADDR_SHIFT)
 
#define L2_ADDR_MASK   (((1UL << BITS_RESOLVED_PER_LVL) - 1) << L2_ADDR_SHIFT)
 
#define L3_ADDR_MASK   (((1UL << BITS_RESOLVED_PER_LVL) - 1) << L3_ADDR_SHIFT)
 
#define L3_XLAT_SIZE   (1UL << L3_ADDR_SHIFT)
 
#define L2_XLAT_SIZE   (1UL << L2_ADDR_SHIFT)
 
#define L1_XLAT_SIZE   (1UL << L1_ADDR_SHIFT)
 
#define L0_XLAT_SIZE   (1UL << L0_ADDR_SHIFT)
 
#define BLOCK_INDEX_MEM_DEV_NGNRNE   0
 
#define BLOCK_INDEX_MEM_DEV_NGNRE   1
 
#define BLOCK_INDEX_MEM_DEV_GRE   2
 
#define BLOCK_INDEX_MEM_NORMAL_NC   3
 
#define BLOCK_INDEX_MEM_NORMAL   4
 
#define BLOCK_INDEX_MASK   0x7
 
#define BLOCK_INDEX_SHIFT   2
 
#define MAIR_ATTRIBUTES
 
#define TCR_TOSZ   (64 - BITS_PER_VA)
 
#define TCR_IRGN0_SHIFT   8
 
#define TCR_IRGN0_NM_NC   (0x00 << TCR_IRGN0_SHIFT)
 
#define TCR_IRGN0_NM_WBWAC   (0x01 << TCR_IRGN0_SHIFT)
 
#define TCR_IRGN0_NM_WTC   (0x02 << TCR_IRGN0_SHIFT)
 
#define TCR_IRGN0_NM_WBNWAC   (0x03 << TCR_IRGN0_SHIFT)
 
#define TCR_ORGN0_SHIFT   10
 
#define TCR_ORGN0_NM_NC   (0x00 << TCR_ORGN0_SHIFT)
 
#define TCR_ORGN0_NM_WBWAC   (0x01 << TCR_ORGN0_SHIFT)
 
#define TCR_ORGN0_NM_WTC   (0x02 << TCR_ORGN0_SHIFT)
 
#define TCR_ORGN0_NM_WBNWAC   (0x03 << TCR_ORGN0_SHIFT)
 
#define TCR_SH0_SHIFT   12
 
#define TCR_SH0_NC   (0x0 << TCR_SH0_SHIFT)
 
#define TCR_SH0_OS   (0x2 << TCR_SH0_SHIFT)
 
#define TCR_SH0_IS   (0x3 << TCR_SH0_SHIFT)
 
#define TCR_TG0_SHIFT   14
 
#define TCR_TG0_4KB   (0x0 << TCR_TG0_SHIFT)
 
#define TCR_TG0_64KB   (0x1 << TCR_TG0_SHIFT)
 
#define TCR_TG0_16KB   (0x2 << TCR_TG0_SHIFT)
 
#define TCR_PS_SHIFT   16
 
#define TCR_PS_4GB   (0x0 << TCR_PS_SHIFT)
 
#define TCR_PS_64GB   (0x1 << TCR_PS_SHIFT)
 
#define TCR_PS_1TB   (0x2 << TCR_PS_SHIFT)
 
#define TCR_PS_4TB   (0x3 << TCR_PS_SHIFT)
 
#define TCR_PS_16TB   (0x4 << TCR_PS_SHIFT)
 
#define TCR_PS_256TB   (0x5 << TCR_PS_SHIFT)
 
#define TCR_TBI_SHIFT   20
 
#define TCR_TBI_USED   (0x0 << TCR_TBI_SHIFT)
 
#define TCR_TBI_IGNORED   (0x1 << TCR_TBI_SHIFT)
 

Functions

void mmu_init (void)
 
void mmu_save_context (struct mmu_context *mmu_context)
 
void mmu_restore_context (const struct mmu_context *mmu_context)
 
void mmu_config_range (void *start, size_t size, uint64_t tag)
 
void mmu_enable (void)
 
void mmu_disable (void)
 

Macro Definition Documentation

◆ BITS_PER_VA

#define BITS_PER_VA   48

Definition at line 59 of file mmu.h.

◆ BITS_RESOLVED_PER_LVL

#define BITS_RESOLVED_PER_LVL   (GRANULE_SIZE_SHIFT - 3)

Definition at line 66 of file mmu.h.

◆ BLOCK_ACCESS

#define BLOCK_ACCESS   (1 << 10)

Definition at line 41 of file mmu.h.

◆ BLOCK_AP_RO

#define BLOCK_AP_RO   (1 << 7)

Definition at line 39 of file mmu.h.

◆ BLOCK_AP_RW

#define BLOCK_AP_RW   (0 << 7)

Definition at line 38 of file mmu.h.

◆ BLOCK_DESC

#define BLOCK_DESC   0x1

Definition at line 30 of file mmu.h.

◆ BLOCK_INDEX_MASK

#define BLOCK_INDEX_MASK   0x7

Definition at line 91 of file mmu.h.

◆ BLOCK_INDEX_MEM_DEV_GRE

#define BLOCK_INDEX_MEM_DEV_GRE   2

Definition at line 87 of file mmu.h.

◆ BLOCK_INDEX_MEM_DEV_NGNRE

#define BLOCK_INDEX_MEM_DEV_NGNRE   1

Definition at line 86 of file mmu.h.

◆ BLOCK_INDEX_MEM_DEV_NGNRNE

#define BLOCK_INDEX_MEM_DEV_NGNRNE   0

Definition at line 85 of file mmu.h.

◆ BLOCK_INDEX_MEM_NORMAL

#define BLOCK_INDEX_MEM_NORMAL   4

Definition at line 89 of file mmu.h.

◆ BLOCK_INDEX_MEM_NORMAL_NC

#define BLOCK_INDEX_MEM_NORMAL_NC   3

Definition at line 88 of file mmu.h.

◆ BLOCK_INDEX_SHIFT

#define BLOCK_INDEX_SHIFT   2

Definition at line 92 of file mmu.h.

◆ BLOCK_NS

#define BLOCK_NS   (1 << 5)

Definition at line 36 of file mmu.h.

◆ BLOCK_SH_INNER_SHAREABLE

#define BLOCK_SH_INNER_SHAREABLE   (3 << BLOCK_SH_SHIFT)

Definition at line 49 of file mmu.h.

◆ BLOCK_SH_NON_SHAREABLE

#define BLOCK_SH_NON_SHAREABLE   (0 << BLOCK_SH_SHIFT)

Definition at line 46 of file mmu.h.

◆ BLOCK_SH_OUTER_SHAREABLE

#define BLOCK_SH_OUTER_SHAREABLE   (2 << BLOCK_SH_SHIFT)

Definition at line 48 of file mmu.h.

◆ BLOCK_SH_SHIFT

#define BLOCK_SH_SHIFT   (8)

Definition at line 45 of file mmu.h.

◆ BLOCK_SH_UNPREDICTABLE

#define BLOCK_SH_UNPREDICTABLE   (1 << BLOCK_SH_SHIFT)

Definition at line 47 of file mmu.h.

◆ BLOCK_XN

#define BLOCK_XN   (1UL << 54)

Definition at line 43 of file mmu.h.

◆ DESC_MASK

#define DESC_MASK   0x3

Definition at line 33 of file mmu.h.

◆ GRANULE_SIZE

#define GRANULE_SIZE   (1 << GRANULE_SIZE_SHIFT)

Definition at line 62 of file mmu.h.

◆ GRANULE_SIZE_MASK

#define GRANULE_SIZE_MASK   ((1 << GRANULE_SIZE_SHIFT) - 1)

Definition at line 64 of file mmu.h.

◆ GRANULE_SIZE_SHIFT

#define GRANULE_SIZE_SHIFT   12

Definition at line 61 of file mmu.h.

◆ INVALID_DESC

#define INVALID_DESC   0x0

Definition at line 29 of file mmu.h.

◆ L0_ADDR_MASK

#define L0_ADDR_MASK   (((1UL << BITS_RESOLVED_PER_LVL) - 1) << L0_ADDR_SHIFT)

Definition at line 72 of file mmu.h.

◆ L0_ADDR_SHIFT

#define L0_ADDR_SHIFT   (GRANULE_SIZE_SHIFT + BITS_RESOLVED_PER_LVL * 3)

Definition at line 67 of file mmu.h.

◆ L0_XLAT_SIZE

#define L0_XLAT_SIZE   (1UL << L0_ADDR_SHIFT)

Definition at line 82 of file mmu.h.

◆ L1_ADDR_MASK

#define L1_ADDR_MASK   (((1UL << BITS_RESOLVED_PER_LVL) - 1) << L1_ADDR_SHIFT)

Definition at line 73 of file mmu.h.

◆ L1_ADDR_SHIFT

#define L1_ADDR_SHIFT   (GRANULE_SIZE_SHIFT + BITS_RESOLVED_PER_LVL * 2)

Definition at line 68 of file mmu.h.

◆ L1_XLAT_SIZE

#define L1_XLAT_SIZE   (1UL << L1_ADDR_SHIFT)

Definition at line 81 of file mmu.h.

◆ L2_ADDR_MASK

#define L2_ADDR_MASK   (((1UL << BITS_RESOLVED_PER_LVL) - 1) << L2_ADDR_SHIFT)

Definition at line 74 of file mmu.h.

◆ L2_ADDR_SHIFT

#define L2_ADDR_SHIFT   (GRANULE_SIZE_SHIFT + BITS_RESOLVED_PER_LVL * 1)

Definition at line 69 of file mmu.h.

◆ L2_XLAT_SIZE

#define L2_XLAT_SIZE   (1UL << L2_ADDR_SHIFT)

Definition at line 80 of file mmu.h.

◆ L3_ADDR_MASK

#define L3_ADDR_MASK   (((1UL << BITS_RESOLVED_PER_LVL) - 1) << L3_ADDR_SHIFT)

Definition at line 75 of file mmu.h.

◆ L3_ADDR_SHIFT

#define L3_ADDR_SHIFT   (GRANULE_SIZE_SHIFT + BITS_RESOLVED_PER_LVL * 0)

Definition at line 70 of file mmu.h.

◆ L3_XLAT_SIZE

#define L3_XLAT_SIZE   (1UL << L3_ADDR_SHIFT)

Definition at line 79 of file mmu.h.

◆ MA_DEV

#define MA_DEV   (0 << 0)

Definition at line 14 of file mmu.h.

◆ MA_MEM

#define MA_MEM   (1 << 0)

Definition at line 13 of file mmu.h.

◆ MA_MEM_NC

#define MA_MEM_NC   (1 << 3)

Definition at line 25 of file mmu.h.

◆ MA_NS

#define MA_NS   (1 << 1)

Definition at line 17 of file mmu.h.

◆ MA_RO

#define MA_RO   (1 << 2)

Definition at line 21 of file mmu.h.

◆ MA_RW

#define MA_RW   (0 << 2)

Definition at line 22 of file mmu.h.

◆ MA_S

#define MA_S   (0 << 1)

Definition at line 18 of file mmu.h.

◆ MAIR_ATTRIBUTES

#define MAIR_ATTRIBUTES
Value:
((0x00 << (BLOCK_INDEX_MEM_DEV_NGNRNE*8)) | \
(0x04 << (BLOCK_INDEX_MEM_DEV_NGNRE*8)) | \
(0x0c << (BLOCK_INDEX_MEM_DEV_GRE*8)) | \
(0x44 << (BLOCK_INDEX_MEM_NORMAL_NC*8)) | \
(0xffUL << (BLOCK_INDEX_MEM_NORMAL*8)))
#define BLOCK_INDEX_MEM_NORMAL
Definition: mmu.h:89
#define BLOCK_INDEX_MEM_DEV_NGNRNE
Definition: mmu.h:85
#define BLOCK_INDEX_MEM_NORMAL_NC
Definition: mmu.h:88
#define BLOCK_INDEX_MEM_DEV_GRE
Definition: mmu.h:87
#define BLOCK_INDEX_MEM_DEV_NGNRE
Definition: mmu.h:86

Definition at line 95 of file mmu.h.

◆ PAGE_DESC

#define PAGE_DESC   0x3

Definition at line 32 of file mmu.h.

◆ TABLE_DESC

#define TABLE_DESC   0x3

Definition at line 31 of file mmu.h.

◆ TCR_IRGN0_NM_NC

#define TCR_IRGN0_NM_NC   (0x00 << TCR_IRGN0_SHIFT)

Definition at line 105 of file mmu.h.

◆ TCR_IRGN0_NM_WBNWAC

#define TCR_IRGN0_NM_WBNWAC   (0x03 << TCR_IRGN0_SHIFT)

Definition at line 108 of file mmu.h.

◆ TCR_IRGN0_NM_WBWAC

#define TCR_IRGN0_NM_WBWAC   (0x01 << TCR_IRGN0_SHIFT)

Definition at line 106 of file mmu.h.

◆ TCR_IRGN0_NM_WTC

#define TCR_IRGN0_NM_WTC   (0x02 << TCR_IRGN0_SHIFT)

Definition at line 107 of file mmu.h.

◆ TCR_IRGN0_SHIFT

#define TCR_IRGN0_SHIFT   8

Definition at line 104 of file mmu.h.

◆ TCR_ORGN0_NM_NC

#define TCR_ORGN0_NM_NC   (0x00 << TCR_ORGN0_SHIFT)

Definition at line 111 of file mmu.h.

◆ TCR_ORGN0_NM_WBNWAC

#define TCR_ORGN0_NM_WBNWAC   (0x03 << TCR_ORGN0_SHIFT)

Definition at line 114 of file mmu.h.

◆ TCR_ORGN0_NM_WBWAC

#define TCR_ORGN0_NM_WBWAC   (0x01 << TCR_ORGN0_SHIFT)

Definition at line 112 of file mmu.h.

◆ TCR_ORGN0_NM_WTC

#define TCR_ORGN0_NM_WTC   (0x02 << TCR_ORGN0_SHIFT)

Definition at line 113 of file mmu.h.

◆ TCR_ORGN0_SHIFT

#define TCR_ORGN0_SHIFT   10

Definition at line 110 of file mmu.h.

◆ TCR_PS_16TB

#define TCR_PS_16TB   (0x4 << TCR_PS_SHIFT)

Definition at line 131 of file mmu.h.

◆ TCR_PS_1TB

#define TCR_PS_1TB   (0x2 << TCR_PS_SHIFT)

Definition at line 129 of file mmu.h.

◆ TCR_PS_256TB

#define TCR_PS_256TB   (0x5 << TCR_PS_SHIFT)

Definition at line 132 of file mmu.h.

◆ TCR_PS_4GB

#define TCR_PS_4GB   (0x0 << TCR_PS_SHIFT)

Definition at line 127 of file mmu.h.

◆ TCR_PS_4TB

#define TCR_PS_4TB   (0x3 << TCR_PS_SHIFT)

Definition at line 130 of file mmu.h.

◆ TCR_PS_64GB

#define TCR_PS_64GB   (0x1 << TCR_PS_SHIFT)

Definition at line 128 of file mmu.h.

◆ TCR_PS_SHIFT

#define TCR_PS_SHIFT   16

Definition at line 126 of file mmu.h.

◆ TCR_SH0_IS

#define TCR_SH0_IS   (0x3 << TCR_SH0_SHIFT)

Definition at line 119 of file mmu.h.

◆ TCR_SH0_NC

#define TCR_SH0_NC   (0x0 << TCR_SH0_SHIFT)

Definition at line 117 of file mmu.h.

◆ TCR_SH0_OS

#define TCR_SH0_OS   (0x2 << TCR_SH0_SHIFT)

Definition at line 118 of file mmu.h.

◆ TCR_SH0_SHIFT

#define TCR_SH0_SHIFT   12

Definition at line 116 of file mmu.h.

◆ TCR_TBI_IGNORED

#define TCR_TBI_IGNORED   (0x1 << TCR_TBI_SHIFT)

Definition at line 136 of file mmu.h.

◆ TCR_TBI_SHIFT

#define TCR_TBI_SHIFT   20

Definition at line 134 of file mmu.h.

◆ TCR_TBI_USED

#define TCR_TBI_USED   (0x0 << TCR_TBI_SHIFT)

Definition at line 135 of file mmu.h.

◆ TCR_TG0_16KB

#define TCR_TG0_16KB   (0x2 << TCR_TG0_SHIFT)

Definition at line 124 of file mmu.h.

◆ TCR_TG0_4KB

#define TCR_TG0_4KB   (0x0 << TCR_TG0_SHIFT)

Definition at line 122 of file mmu.h.

◆ TCR_TG0_64KB

#define TCR_TG0_64KB   (0x1 << TCR_TG0_SHIFT)

Definition at line 123 of file mmu.h.

◆ TCR_TG0_SHIFT

#define TCR_TG0_SHIFT   14

Definition at line 121 of file mmu.h.

◆ TCR_TOSZ

#define TCR_TOSZ   (64 - BITS_PER_VA)

Definition at line 102 of file mmu.h.

◆ UNUSED_DESC

#define UNUSED_DESC   0x6EbAAD0BBADbA6E0

Definition at line 54 of file mmu.h.

◆ VA_START

#define VA_START   0x0

Definition at line 58 of file mmu.h.

◆ XLAT_ADDR_MASK

#define XLAT_ADDR_MASK   ((1UL << BITS_PER_VA) - GRANULE_SIZE)

Definition at line 63 of file mmu.h.

Function Documentation

◆ mmu_config_range()

void mmu_config_range ( void start,
size_t  size,
uint64_t  tag 
)

Definition at line 210 of file mmu.c.

References BIOS_INFO, dsb, init_xlat_table(), isb, print_tag(), printk, sanity_check(), and tlbiall_el3().

Here is the call graph for this function:

◆ mmu_disable()

void mmu_disable ( void  )

Referenced by mtk_mmu_disable_l2c_sram(), qclib_load_and_run(), run_bl31(), and transition_to_el2().

Here is the caller graph for this function:

◆ mmu_enable()

void mmu_enable ( void  )

Definition at line 293 of file mmu.c.

References assert_correct_ttb_mapping(), isb, SCTLR_C, SCTLR_I, and SCTLR_M.

Referenced by bootblock_mainboard_init(), decompressor_soc_init(), mtk_mmu_disable_l2c_sram(), mtk_mmu_init(), qclib_load_and_run(), qcs405_mmu_init(), sc7180_mmu_init(), sc7280_mmu_init(), soc_mmu_init(), and tegra210_mmu_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ mmu_init()

◆ mmu_restore_context()

void mmu_restore_context ( const struct mmu_context mmu_context)

Definition at line 276 of file mmu.c.

References assert, mmu_context::mair, mmu_context::tcr, and tlb_invalidate_all().

Referenced by qclib_load_and_run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ mmu_save_context()

void mmu_save_context ( struct mmu_context mmu_context)

Definition at line 262 of file mmu.c.

References assert, mmu_context::mair, and mmu_context::tcr.

Referenced by qclib_load_and_run().

Here is the caller graph for this function: