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