xref: /rk3399_rockchip-uboot/arch/arm/mach-meson/board.c (revision 0e00a84cdedf7a1949486746225b35984b351eca)
1bfcef28aSBeniamino Galvani /*
2bfcef28aSBeniamino Galvani  * (C) Copyright 2016 Beniamino Galvani <b.galvani@gmail.com>
3bfcef28aSBeniamino Galvani  *
4bfcef28aSBeniamino Galvani  * SPDX-License-Identifier:	GPL-2.0+
5bfcef28aSBeniamino Galvani  */
6bfcef28aSBeniamino Galvani 
7bfcef28aSBeniamino Galvani #include <common.h>
8*0e00a84cSMasahiro Yamada #include <linux/libfdt.h>
9bfcef28aSBeniamino Galvani #include <linux/err.h>
10bfcef28aSBeniamino Galvani #include <asm/arch/gxbb.h>
11c7757d46SBeniamino Galvani #include <asm/arch/sm.h>
12bfcef28aSBeniamino Galvani #include <asm/armv8/mmu.h>
13bfcef28aSBeniamino Galvani #include <asm/unaligned.h>
14bfcef28aSBeniamino Galvani 
15bfcef28aSBeniamino Galvani DECLARE_GLOBAL_DATA_PTR;
16bfcef28aSBeniamino Galvani 
dram_init(void)17bfcef28aSBeniamino Galvani int dram_init(void)
18bfcef28aSBeniamino Galvani {
19bfcef28aSBeniamino Galvani 	const fdt64_t *val;
20bfcef28aSBeniamino Galvani 	int offset;
21bfcef28aSBeniamino Galvani 	int len;
22bfcef28aSBeniamino Galvani 
23bfcef28aSBeniamino Galvani 	offset = fdt_path_offset(gd->fdt_blob, "/memory");
24bfcef28aSBeniamino Galvani 	if (offset < 0)
25bfcef28aSBeniamino Galvani 		return -EINVAL;
26bfcef28aSBeniamino Galvani 
27bfcef28aSBeniamino Galvani 	val = fdt_getprop(gd->fdt_blob, offset, "reg", &len);
28bfcef28aSBeniamino Galvani 	if (len < sizeof(*val) * 2)
29bfcef28aSBeniamino Galvani 		return -EINVAL;
30bfcef28aSBeniamino Galvani 
31bfcef28aSBeniamino Galvani 	/* Use unaligned access since cache is still disabled */
32bfcef28aSBeniamino Galvani 	gd->ram_size = get_unaligned_be64(&val[1]);
33bfcef28aSBeniamino Galvani 
34bfcef28aSBeniamino Galvani 	return 0;
35bfcef28aSBeniamino Galvani }
36bfcef28aSBeniamino Galvani 
dram_init_banksize(void)3776b00acaSSimon Glass int dram_init_banksize(void)
38bfcef28aSBeniamino Galvani {
39bfcef28aSBeniamino Galvani 	/* Reserve first 16 MiB of RAM for firmware */
40e42f096fSxypron.glpk@gmx.de 	gd->bd->bi_dram[0].start = 0x1000000;
41e42f096fSxypron.glpk@gmx.de 	gd->bd->bi_dram[0].size  = 0xf000000;
42e42f096fSxypron.glpk@gmx.de 	/* Reserve 2 MiB for ARM Trusted Firmware (BL31) */
43e42f096fSxypron.glpk@gmx.de 	gd->bd->bi_dram[1].start = 0x10000000;
44e42f096fSxypron.glpk@gmx.de 	gd->bd->bi_dram[1].size  = gd->ram_size - 0x10200000;
4576b00acaSSimon Glass 	return 0;
46bfcef28aSBeniamino Galvani }
47bfcef28aSBeniamino Galvani 
reset_cpu(ulong addr)48bfcef28aSBeniamino Galvani void reset_cpu(ulong addr)
49bfcef28aSBeniamino Galvani {
5051bfb5b6SAlexander Graf 	psci_system_reset();
51bfcef28aSBeniamino Galvani }
52bfcef28aSBeniamino Galvani 
53bfcef28aSBeniamino Galvani static struct mm_region gxbb_mem_map[] = {
54bfcef28aSBeniamino Galvani 	{
55cd4b0c5fSYork Sun 		.virt = 0x0UL,
56cd4b0c5fSYork Sun 		.phys = 0x0UL,
57bfcef28aSBeniamino Galvani 		.size = 0x80000000UL,
58bfcef28aSBeniamino Galvani 		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
59bfcef28aSBeniamino Galvani 			 PTE_BLOCK_INNER_SHARE
60bfcef28aSBeniamino Galvani 	}, {
61cd4b0c5fSYork Sun 		.virt = 0x80000000UL,
62cd4b0c5fSYork Sun 		.phys = 0x80000000UL,
63bfcef28aSBeniamino Galvani 		.size = 0x80000000UL,
64bfcef28aSBeniamino Galvani 		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
65bfcef28aSBeniamino Galvani 			 PTE_BLOCK_NON_SHARE |
66bfcef28aSBeniamino Galvani 			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
67bfcef28aSBeniamino Galvani 	}, {
68bfcef28aSBeniamino Galvani 		/* List terminator */
69bfcef28aSBeniamino Galvani 		0,
70bfcef28aSBeniamino Galvani 	}
71bfcef28aSBeniamino Galvani };
72bfcef28aSBeniamino Galvani 
73bfcef28aSBeniamino Galvani struct mm_region *mem_map = gxbb_mem_map;
74