• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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