1 // SPDX-License-Identifier: GPL-2.0
4 * David Feng <fenghua@phytium.com.cn>
5 * Sharma Bhupesh <bhupesh.sharma@freescale.com>
7 * (C) 2020 EPAM Systems Inc
16 #include <asm/global_data.h>
19 #include <asm/armv8/mmu.h>
21 #include <asm/xen/hypercall.h>
22 #include <asm/xen/system.h>
24 #include <linux/compiler.h>
26 #include <xen/gnttab.h>
29 DECLARE_GLOBAL_DATA_PTR;
37 * Use fdt provided by Xen: according to
38 * https://www.kernel.org/doc/Documentation/arm64/booting.txt
39 * x0 is the physical address of the device tree blob (dtb) in system RAM.
40 * This is stored in rom_pointer during low level init.
42 void *board_fdt_blob_setup(void)
44 if (fdt_magic(rom_pointer[0]) != FDT_MAGIC)
46 return (void *)rom_pointer[0];
49 #define MAX_MEM_MAP_REGIONS 5
50 static struct mm_region xen_mem_map[MAX_MEM_MAP_REGIONS];
51 struct mm_region *mem_map = xen_mem_map;
53 static int get_next_memory_node(const void *blob, int mem)
56 mem = fdt_node_offset_by_prop_value(blob, mem,
57 "device_type", "memory", 7);
58 } while (!fdtdec_get_is_enabled(blob, mem));
63 static int setup_mem_map(void)
65 int i = 0, ret, mem, reg = 0;
66 struct fdt_resource res;
67 const void *blob = gd->fdt_blob;
69 phys_addr_t gnttab_base;
70 phys_size_t gnttab_sz;
73 * Add "magic" region which is used by Xen to provide some essentials
74 * for the guest: we need console and xenstore.
76 ret = hvm_get_parameter_maintain_dcache(HVM_PARAM_CONSOLE_PFN, &gfn);
78 printf("%s: Can't get HVM_PARAM_CONSOLE_PFN, ret %d\n",
83 xen_mem_map[i].virt = PFN_PHYS(gfn);
84 xen_mem_map[i].phys = PFN_PHYS(gfn);
85 xen_mem_map[i].size = PAGE_SIZE;
86 xen_mem_map[i].attrs = (PTE_BLOCK_MEMTYPE(MT_NORMAL) |
87 PTE_BLOCK_INNER_SHARE);
90 ret = hvm_get_parameter_maintain_dcache(HVM_PARAM_STORE_PFN, &gfn);
92 printf("%s: Can't get HVM_PARAM_STORE_PFN, ret %d\n",
97 xen_mem_map[i].virt = PFN_PHYS(gfn);
98 xen_mem_map[i].phys = PFN_PHYS(gfn);
99 xen_mem_map[i].size = PAGE_SIZE;
100 xen_mem_map[i].attrs = (PTE_BLOCK_MEMTYPE(MT_NORMAL) |
101 PTE_BLOCK_INNER_SHARE);
104 /* Get Xen's suggested physical page assignments for the grant table. */
105 get_gnttab_base(&gnttab_base, &gnttab_sz);
107 xen_mem_map[i].virt = gnttab_base;
108 xen_mem_map[i].phys = gnttab_base;
109 xen_mem_map[i].size = gnttab_sz;
110 xen_mem_map[i].attrs = (PTE_BLOCK_MEMTYPE(MT_NORMAL) |
111 PTE_BLOCK_INNER_SHARE);
114 mem = get_next_memory_node(blob, -1);
116 printf("%s: Missing /memory node\n", __func__);
120 for (; i < MAX_MEM_MAP_REGIONS; i++) {
121 ret = fdt_get_resource(blob, mem, "reg", reg++, &res);
122 if (ret == -FDT_ERR_NOTFOUND) {
124 mem = get_next_memory_node(blob, mem);
125 if (mem == -FDT_ERR_NOTFOUND)
128 ret = fdt_get_resource(blob, mem, "reg", reg++, &res);
129 if (ret == -FDT_ERR_NOTFOUND)
133 printf("No reg property for memory node\n");
137 xen_mem_map[i].virt = (phys_addr_t)res.start;
138 xen_mem_map[i].phys = (phys_addr_t)res.start;
139 xen_mem_map[i].size = (phys_size_t)(res.end - res.start + 1);
140 xen_mem_map[i].attrs = (PTE_BLOCK_MEMTYPE(MT_NORMAL) |
141 PTE_BLOCK_INNER_SHARE);
146 void enable_caches(void)
148 /* Re-setup the memory map as BSS gets cleared after relocation. */
154 /* Read memory settings from the Xen provided device tree. */
159 ret = fdtdec_setup_mem_size_base();
162 /* Setup memory map, so MMU page table size can be estimated. */
163 return setup_mem_map();
166 int dram_init_banksize(void)
168 return fdtdec_setup_memory_banksize();
172 * Board specific reset that is system reset.
174 void reset_cpu(ulong addr)
178 int ft_system_setup(void *blob, struct bd_info *bd)
183 int ft_board_setup(void *blob, struct bd_info *bd)
188 int print_cpuinfo(void)
190 printf("Xen virtual CPU\n");
194 void board_cleanup_before_linux(void)