blob: dc6a9205be0e7584251bdd5d72fd4d18589724b1 [file] [log] [blame]
Michal Simekec48b6c2018-08-22 14:55:27 +02001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * (C) Copyright 2016 - 2018 Xilinx, Inc.
4 * Michal Simek <michal.simek@xilinx.com>
5 */
6
7#include <common.h>
8#include <asm/armv8/mmu.h>
9#include <asm/io.h>
Siva Durga Prasad Paladugu4244f2b2019-01-08 21:47:26 +053010#include <asm/arch/hardware.h>
11#include <asm/arch/sys_proto.h>
12
13DECLARE_GLOBAL_DATA_PTR;
Michal Simekec48b6c2018-08-22 14:55:27 +020014
Michal Simekaef149e2019-04-29 09:39:09 -070015#define VERSAL_MEM_MAP_USED 6
16
17#define DRAM_BANKS CONFIG_NR_DRAM_BANKS
18
19/* +1 is end of list which needs to be empty */
20#define VERSAL_MEM_MAP_MAX (VERSAL_MEM_MAP_USED + DRAM_BANKS + 1)
21
22static struct mm_region versal_mem_map[VERSAL_MEM_MAP_MAX] = {
Michal Simekec48b6c2018-08-22 14:55:27 +020023 {
Michal Simekec48b6c2018-08-22 14:55:27 +020024 .virt = 0x80000000UL,
25 .phys = 0x80000000UL,
26 .size = 0x70000000UL,
27 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
28 PTE_BLOCK_NON_SHARE |
29 PTE_BLOCK_PXN | PTE_BLOCK_UXN
30 }, {
31 .virt = 0xf0000000UL,
32 .phys = 0xf0000000UL,
33 .size = 0x0fe00000UL,
34 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
35 PTE_BLOCK_NON_SHARE |
36 PTE_BLOCK_PXN | PTE_BLOCK_UXN
37 }, {
38 .virt = 0xffe00000UL,
39 .phys = 0xffe00000UL,
40 .size = 0x00200000UL,
41 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
42 PTE_BLOCK_INNER_SHARE
43 }, {
44 .virt = 0x400000000UL,
45 .phys = 0x400000000UL,
46 .size = 0x200000000UL,
47 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
48 PTE_BLOCK_NON_SHARE |
49 PTE_BLOCK_PXN | PTE_BLOCK_UXN
50 }, {
51 .virt = 0x600000000UL,
52 .phys = 0x600000000UL,
53 .size = 0x800000000UL,
54 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
55 PTE_BLOCK_INNER_SHARE
56 }, {
57 .virt = 0xe00000000UL,
58 .phys = 0xe00000000UL,
59 .size = 0xf200000000UL,
60 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
61 PTE_BLOCK_NON_SHARE |
62 PTE_BLOCK_PXN | PTE_BLOCK_UXN
Michal Simekec48b6c2018-08-22 14:55:27 +020063 }
64};
65
Michal Simekaef149e2019-04-29 09:39:09 -070066void mem_map_fill(void)
67{
68 int banks = VERSAL_MEM_MAP_USED;
69
70 for (int i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
71 /* Zero size means no more DDR that's this is end */
72 if (!gd->bd->bi_dram[i].size)
73 break;
74
75 versal_mem_map[banks].virt = gd->bd->bi_dram[i].start;
76 versal_mem_map[banks].phys = gd->bd->bi_dram[i].start;
77 versal_mem_map[banks].size = gd->bd->bi_dram[i].size;
78 versal_mem_map[banks].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
79 PTE_BLOCK_INNER_SHARE;
80 banks = banks + 1;
81 }
82}
83
Michal Simekec48b6c2018-08-22 14:55:27 +020084struct mm_region *mem_map = versal_mem_map;
85
86u64 get_page_table_size(void)
87{
88 return 0x14000;
89}
Michal Simekddccf5e2018-09-18 14:58:16 +020090
Siva Durga Prasad Paladugu4244f2b2019-01-08 21:47:26 +053091#if defined(CONFIG_SYS_MEM_RSVD_FOR_MMU)
92int reserve_mmu(void)
93{
94 tcm_init(TCM_LOCK);
95 gd->arch.tlb_size = PGTABLE_SIZE;
96 gd->arch.tlb_addr = VERSAL_TCM_BASE_ADDR;
97
98 return 0;
99}
100#endif
101
Michal Simekddccf5e2018-09-18 14:58:16 +0200102#if defined(CONFIG_OF_BOARD)
103void *board_fdt_blob_setup(void)
104{
105 static void *fw_dtb = (void *)CONFIG_VERSAL_OF_BOARD_DTB_ADDR;
106
107 if (fdt_magic(fw_dtb) != FDT_MAGIC) {
108 printf("DTB is not passed via %llx\n", (u64)fw_dtb);
109 return NULL;
110 }
111
112 return fw_dtb;
113}
114#endif