1 /*
2 * Copyright (c) 2023 Institute of Parallel And Distributed Systems (IPADS), Shanghai Jiao Tong University (SJTU)
3 * Licensed under the Mulan PSL v2.
4 * You can use this software according to the terms and conditions of the Mulan PSL v2.
5 * You may obtain a copy of Mulan PSL v2 at:
6 * http://license.coscl.org.cn/MulanPSL2
7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9 * PURPOSE.
10 * See the Mulan PSL v2 for more details.
11 */
12 #include <arch/boot.h>
13 #include <machine.h>
14 #include <mm/mm.h>
15 #include <common/macro.h>
16 #include <arch/tools.h>
17
18 #define SGRF_BASE 0xff330000
19 #define GENMASK_32(h, l) (((~0U) << (l)) & (~0U >> (32 - 1 - (h))))
20 #define SGRF_DDRRGN_CON0_16(n) ((n)*4)
21 #define SGRF_DDR_RGN_0_16_WMSK GENMASK_32(11, 0)
22 #define REG_MSK_SHIFT 16
23 #define WMSK_BIT(nr) BIT((nr) + REG_MSK_SHIFT)
24 #define BIT_WITH_WMSK(nr) (BIT(nr) | WMSK_BIT(nr))
25 #define SHIFT_U32(v, shift) ((u32)(v) << (shift))
26 #define BITS_WMSK(msk, shift) SHIFT_U32(msk, (shift) + REG_MSK_SHIFT)
27 #define BITS_WITH_WMASK(bits, msk, shift) \
28 (SHIFT_U32(bits, shift) | BITS_WMSK(msk, shift))
secure_ddr_region(int rgn,paddr_t st,paddr_t ed)29 static int secure_ddr_region(int rgn, paddr_t st, paddr_t ed)
30 {
31 vaddr_t sgrf_base = phys_to_virt(SGRF_BASE);
32 u32 st_mb = st / 0x100000;
33 u32 ed_mb = ed / 0x100000;
34
35 kinfo("protecting region %d: 0x%lx-0x%lx\n", rgn, st, ed);
36
37 /* Set ddr region addr start */
38 put32(sgrf_base + SGRF_DDRRGN_CON0_16(rgn),
39 BITS_WITH_WMASK(st_mb, SGRF_DDR_RGN_0_16_WMSK, 0));
40
41 /* Set ddr region addr end */
42 put32(sgrf_base + SGRF_DDRRGN_CON0_16(rgn + 8),
43 BITS_WITH_WMASK((ed_mb - 1), SGRF_DDR_RGN_0_16_WMSK, 0));
44
45 put32(sgrf_base + SGRF_DDRRGN_CON0_16(16), BIT_WITH_WMSK(rgn));
46
47 return 0;
48 }
49
parse_mem_map(void * info)50 void parse_mem_map(void *info)
51 {
52 secure_ddr_region(1, get_tzdram_start(), get_tzdram_end());
53
54 physmem_map_num = 1;
55 physmem_map[0][0] = ROUND_UP((paddr_t)&img_end, PAGE_SIZE);
56 physmem_map[0][1] = ROUND_DOWN(get_tzdram_end(), PAGE_SIZE);
57 kinfo("[ChCore] physmem_map: [0x%lx, 0x%lx)\n",
58 physmem_map[0][0],
59 physmem_map[0][1]);
60 }
61