1 // SPDX-License-Identifier: GPL-2.0+
3 * (C) Copyright 2016 - 2018 Xilinx, Inc.
8 #include <asm/armv8/mmu.h>
10 #include <asm/arch/hardware.h>
11 #include <asm/arch/sys_proto.h>
13 DECLARE_GLOBAL_DATA_PTR;
15 #define VERSAL_MEM_MAP_USED 5
17 #define DRAM_BANKS CONFIG_NR_DRAM_BANKS
19 #if defined(CONFIG_DEFINE_TCM_OCM_MMAP)
25 /* +1 is end of list which needs to be empty */
26 #define VERSAL_MEM_MAP_MAX (VERSAL_MEM_MAP_USED + DRAM_BANKS + TCM_MAP + 1)
28 static struct mm_region versal_mem_map[VERSAL_MEM_MAP_MAX] = {
33 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
35 PTE_BLOCK_PXN | PTE_BLOCK_UXN
40 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
42 PTE_BLOCK_PXN | PTE_BLOCK_UXN
44 .virt = 0x400000000UL,
45 .phys = 0x400000000UL,
46 .size = 0x200000000UL,
47 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
49 PTE_BLOCK_PXN | PTE_BLOCK_UXN
51 .virt = 0x600000000UL,
52 .phys = 0x600000000UL,
53 .size = 0x800000000UL,
54 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
57 .virt = 0xe00000000UL,
58 .phys = 0xe00000000UL,
59 .size = 0xf200000000UL,
60 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
62 PTE_BLOCK_PXN | PTE_BLOCK_UXN
66 void mem_map_fill(void)
68 int banks = VERSAL_MEM_MAP_USED;
70 #if defined(CONFIG_DEFINE_TCM_OCM_MMAP)
71 versal_mem_map[banks].virt = 0xffe00000UL;
72 versal_mem_map[banks].phys = 0xffe00000UL;
73 versal_mem_map[banks].size = 0x00200000UL;
74 versal_mem_map[banks].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
75 PTE_BLOCK_INNER_SHARE;
79 for (int i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
80 /* Zero size means no more DDR that's this is end */
81 if (!gd->bd->bi_dram[i].size)
84 versal_mem_map[banks].virt = gd->bd->bi_dram[i].start;
85 versal_mem_map[banks].phys = gd->bd->bi_dram[i].start;
86 versal_mem_map[banks].size = gd->bd->bi_dram[i].size;
87 versal_mem_map[banks].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
88 PTE_BLOCK_INNER_SHARE;
93 struct mm_region *mem_map = versal_mem_map;
95 u64 get_page_table_size(void)
100 #if defined(CONFIG_SYS_MEM_RSVD_FOR_MMU)
101 int reserve_mmu(void)
104 gd->arch.tlb_size = PGTABLE_SIZE;
105 gd->arch.tlb_addr = VERSAL_TCM_BASE_ADDR;
111 #if defined(CONFIG_OF_BOARD)
112 void *board_fdt_blob_setup(void)
114 static void *fw_dtb = (void *)CONFIG_VERSAL_OF_BOARD_DTB_ADDR;
116 if (fdt_magic(fw_dtb) != FDT_MAGIC) {
117 printf("DTB is not passed via %llx\n", (u64)fw_dtb);