blob: 59dc9cc39a029eeede87268fe65fceba36e87cd9 [file] [log] [blame]
Angel Ponsa2ee7612020-04-04 18:51:15 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Patrick Georgi40a3e322015-06-22 19:41:29 +02002
3#include <arch/mmu.h>
Furquan Shaikh8b385192015-08-05 17:03:34 -07004#include <assert.h>
Patrick Georgi40a3e322015-06-22 19:41:29 +02005#include <soc/addressmap.h>
6#include <soc/mmu_operations.h>
Julius Wernerfe4cbf12015-10-07 18:38:24 -07007#include <symbols.h>
Elyes HAOUAS30818552019-06-23 07:03:59 +02008#include <types.h>
Patrick Georgi40a3e322015-06-22 19:41:29 +02009
Julius Wernerfe4cbf12015-10-07 18:38:24 -070010static void tegra210_mmu_config(void)
Patrick Georgi40a3e322015-06-22 19:41:29 +020011{
Jacob Garber0c4ed4b2019-07-04 12:55:35 -060012 uintptr_t start, end;
Patrick Georgi40a3e322015-06-22 19:41:29 +020013 const unsigned long devmem = MA_DEV | MA_S | MA_RW;
14 const unsigned long cachedmem = MA_MEM | MA_NS | MA_RW;
15 const unsigned long secure_mem = MA_MEM | MA_S | MA_RW;
16 uintptr_t tz_base_mib;
17 size_t tz_size_mib;
18
19 print_carveouts();
20
Patrick Georgi40a3e322015-06-22 19:41:29 +020021 memory_in_range_below_4gb(&start,&end);
22
23 /* Device memory below DRAM */
Julius Wernerfe4cbf12015-10-07 18:38:24 -070024 mmu_config_range((void *)TEGRA_ARM_LOWEST_PERIPH, start * MiB, devmem);
Patrick Georgi40a3e322015-06-22 19:41:29 +020025
26 /* DRAM */
Julius Wernerfe4cbf12015-10-07 18:38:24 -070027 mmu_config_range((void *)(start * MiB), (end-start) * MiB, cachedmem);
Patrick Georgi40a3e322015-06-22 19:41:29 +020028
29 memory_in_range_above_4gb(&start,&end);
30
Julius Wernerfe4cbf12015-10-07 18:38:24 -070031 mmu_config_range((void *)(start * MiB), (end-start) * MiB, cachedmem);
Patrick Georgi40a3e322015-06-22 19:41:29 +020032
33 /* SRAM */
Julius Werner7e0dea62019-02-20 18:39:22 -080034 mmu_config_range(_sram, REGION_SIZE(sram), cachedmem);
Patrick Georgi40a3e322015-06-22 19:41:29 +020035
36 /* Add TZ carveout. */
37 carveout_range(CARVEOUT_TZ, &tz_base_mib, &tz_size_mib);
Patrick Georgi40a3e322015-06-22 19:41:29 +020038
Julius Wernerfe4cbf12015-10-07 18:38:24 -070039 mmu_config_range((void *)(tz_base_mib * MiB),
40 tz_size_mib * MiB, secure_mem);
Patrick Georgi40a3e322015-06-22 19:41:29 +020041}
42
43void tegra210_mmu_init(void)
44{
45 uintptr_t tz_base_mib;
46 size_t tz_size_mib;
Patrick Georgi40a3e322015-06-22 19:41:29 +020047
Julius Wernerfe4cbf12015-10-07 18:38:24 -070048 mmu_init();
49 tegra210_mmu_config();
Furquan Shaikh8b385192015-08-05 17:03:34 -070050 /*
Julius Wernerfe4cbf12015-10-07 18:38:24 -070051 * Page tables are at the end of the trust zone region, but we should
52 * double-check that memlayout and addressmap.c are in sync.
53 *
Furquan Shaikh8b385192015-08-05 17:03:34 -070054 * TZDRAM layout is as follows:
55 *
56 * +--------------------------+ <----+DRAM_END
57 * | |
58 * | |
59 * | |
60 * +--------------------------+ <----+0x100000000
61 * | |
62 * | coreboot page tables |
63 * +--------------------------+
64 * | |
65 * | BL32 |
66 * +--------------------------+
67 * | |
68 * | BL31 |
69 * +--------------------------+ <----+TZDRAM_BASE
70 * | |
71 * | |
72 * | |
73 * | |
74 * +--------------------------+ <----+DRAM_BASE
75 *
76 */
Patrick Georgi40a3e322015-06-22 19:41:29 +020077 carveout_range(CARVEOUT_TZ, &tz_base_mib, &tz_size_mib);
Julius Werner7e0dea62019-02-20 18:39:22 -080078 assert((uintptr_t)_ttb + REGION_SIZE(ttb) == (tz_base_mib + tz_size_mib)
79 * MiB && REGION_SIZE(ttb) <= tz_size_mib * MiB);
Furquan Shaikh8b385192015-08-05 17:03:34 -070080
Patrick Georgi40a3e322015-06-22 19:41:29 +020081 mmu_enable();
82}