xref: /rk3399_ARM-atf/plat/rockchip/rk3588/drivers/secure/secure.c (revision 44418fce30938ee483fbfc79cc32fde33753d1aa)
1*e3ec6ff4SXiaoDong Huang /*
2*e3ec6ff4SXiaoDong Huang  * Copyright (c) 2024, Rockchip, Inc. All rights reserved.
3*e3ec6ff4SXiaoDong Huang  *
4*e3ec6ff4SXiaoDong Huang  * SPDX-License-Identifier: BSD-3-Clause
5*e3ec6ff4SXiaoDong Huang  */
6*e3ec6ff4SXiaoDong Huang 
7*e3ec6ff4SXiaoDong Huang #include <assert.h>
8*e3ec6ff4SXiaoDong Huang #include <lib/mmio.h>
9*e3ec6ff4SXiaoDong Huang 
10*e3ec6ff4SXiaoDong Huang #include <platform_def.h>
11*e3ec6ff4SXiaoDong Huang 
12*e3ec6ff4SXiaoDong Huang #include <secure.h>
13*e3ec6ff4SXiaoDong Huang #include <soc.h>
14*e3ec6ff4SXiaoDong Huang 
secure_fw_master_init(void)15*e3ec6ff4SXiaoDong Huang static void secure_fw_master_init(void)
16*e3ec6ff4SXiaoDong Huang {
17*e3ec6ff4SXiaoDong Huang 	uint32_t i;
18*e3ec6ff4SXiaoDong Huang 
19*e3ec6ff4SXiaoDong Huang 	/* ddr_mcu can access all ddr-regions */
20*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(1), 0x0000ffff);
21*e3ec6ff4SXiaoDong Huang 	/* dcf/crypto_s can access all ddr-regions */
22*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(14), 0x00000000);
23*e3ec6ff4SXiaoDong Huang 	/* dsu_mp_sec can access all ddr-regions.
24*e3ec6ff4SXiaoDong Huang 	 * DSU access memory [f000_0000~ff00_0000] through MP in firewall_ddr.
25*e3ec6ff4SXiaoDong Huang 	 */
26*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(36), 0xffff0000);
27*e3ec6ff4SXiaoDong Huang 
28*e3ec6ff4SXiaoDong Huang 	/* all other ns-master can't access all ddr-regions */
29*e3ec6ff4SXiaoDong Huang 	for (i = 0; i < FIREWALL_DDR_MST_CNT; i++) {
30*e3ec6ff4SXiaoDong Huang 		if (i == 1 || i == 14 || i == 36)
31*e3ec6ff4SXiaoDong Huang 			continue;
32*e3ec6ff4SXiaoDong Huang 
33*e3ec6ff4SXiaoDong Huang 		mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(i), 0xffffffff);
34*e3ec6ff4SXiaoDong Huang 	}
35*e3ec6ff4SXiaoDong Huang 
36*e3ec6ff4SXiaoDong Huang 	/* mcu_pmu can access all sram-regions */
37*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(19), 0x000000ff);
38*e3ec6ff4SXiaoDong Huang 	/* dsu mp-sec can access all sram-regions */
39*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(38), 0x000000ff);
40*e3ec6ff4SXiaoDong Huang 	/* nsp_dsu2main_sec can access all sram-regions */
41*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(41), 0x00000000);
42*e3ec6ff4SXiaoDong Huang 
43*e3ec6ff4SXiaoDong Huang 	/* all ns-master can't access all sram-regions */
44*e3ec6ff4SXiaoDong Huang 	for (i = 0; i < FIREWALL_SYSMEM_MST_CNT; i++) {
45*e3ec6ff4SXiaoDong Huang 		if (i == 19 || i == 38 || i == 41)
46*e3ec6ff4SXiaoDong Huang 			continue;
47*e3ec6ff4SXiaoDong Huang 
48*e3ec6ff4SXiaoDong Huang 		mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(i),
49*e3ec6ff4SXiaoDong Huang 			      0x00ff00ff);
50*e3ec6ff4SXiaoDong Huang 	}
51*e3ec6ff4SXiaoDong Huang 
52*e3ec6ff4SXiaoDong Huang 	/* dsu-ns can't access all ddr-regions, dsu-s can access all ddr-regions */
53*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_DSU_BASE + FIREWALL_DSU_MST(0), 0xffffffff);
54*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_DSU_BASE + FIREWALL_DSU_MST(1), 0x00000000);
55*e3ec6ff4SXiaoDong Huang 	dsb();
56*e3ec6ff4SXiaoDong Huang 	isb();
57*e3ec6ff4SXiaoDong Huang }
58*e3ec6ff4SXiaoDong Huang 
59*e3ec6ff4SXiaoDong Huang /* unit: Mb */
dsu_fw_rgn_config(uint64_t base_mb,uint64_t top_mb,int rgn_id)60*e3ec6ff4SXiaoDong Huang static void dsu_fw_rgn_config(uint64_t base_mb, uint64_t top_mb, int rgn_id)
61*e3ec6ff4SXiaoDong Huang {
62*e3ec6ff4SXiaoDong Huang 	int i;
63*e3ec6ff4SXiaoDong Huang 
64*e3ec6ff4SXiaoDong Huang 	if (rgn_id >= FIREWALL_DSU_RGN_CNT || rgn_id < 0) {
65*e3ec6ff4SXiaoDong Huang 		ERROR("%s regions-id:%d is invalid!\n", __func__, rgn_id);
66*e3ec6ff4SXiaoDong Huang 		panic();
67*e3ec6ff4SXiaoDong Huang 	}
68*e3ec6ff4SXiaoDong Huang 
69*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_DSU_BASE + FIREWALL_DSU_RGN(rgn_id),
70*e3ec6ff4SXiaoDong Huang 		      RG_MAP_SECURE(top_mb, base_mb));
71*e3ec6ff4SXiaoDong Huang 
72*e3ec6ff4SXiaoDong Huang 	for (i = 0; i < DDR_CHN_CNT; i++)
73*e3ec6ff4SXiaoDong Huang 		mmio_setbits_32(FIREWALL_DSU_BASE + FIREWALL_DSU_CON(i),
74*e3ec6ff4SXiaoDong Huang 				BIT(rgn_id));
75*e3ec6ff4SXiaoDong Huang }
76*e3ec6ff4SXiaoDong Huang 
77*e3ec6ff4SXiaoDong Huang /* unit: Mb */
ddr_fw_rgn_config(uint64_t base_mb,uint64_t top_mb,int rgn_id)78*e3ec6ff4SXiaoDong Huang static void ddr_fw_rgn_config(uint64_t base_mb, uint64_t top_mb, int rgn_id)
79*e3ec6ff4SXiaoDong Huang {
80*e3ec6ff4SXiaoDong Huang 	if (rgn_id >= FIREWALL_DDR_RGN_CNT || rgn_id < 0) {
81*e3ec6ff4SXiaoDong Huang 		ERROR("%s regions-id:%d is invalid!\n", __func__, rgn_id);
82*e3ec6ff4SXiaoDong Huang 		panic();
83*e3ec6ff4SXiaoDong Huang 	}
84*e3ec6ff4SXiaoDong Huang 
85*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_RGN(rgn_id),
86*e3ec6ff4SXiaoDong Huang 		      RG_MAP_SECURE(top_mb, base_mb));
87*e3ec6ff4SXiaoDong Huang 
88*e3ec6ff4SXiaoDong Huang 	/* enable region */
89*e3ec6ff4SXiaoDong Huang 	mmio_setbits_32(FIREWALL_DDR_BASE + FIREWALL_DDR_CON,
90*e3ec6ff4SXiaoDong Huang 			BIT(rgn_id));
91*e3ec6ff4SXiaoDong Huang }
92*e3ec6ff4SXiaoDong Huang 
93*e3ec6ff4SXiaoDong Huang /* Unit: Kb */
sram_fw_rgn_config(uint64_t base_kb,uint64_t top_kb,int rgn_id)94*e3ec6ff4SXiaoDong Huang static void sram_fw_rgn_config(uint64_t base_kb, uint64_t top_kb, int rgn_id)
95*e3ec6ff4SXiaoDong Huang {
96*e3ec6ff4SXiaoDong Huang 	if (rgn_id >= FIREWALL_SYSMEM_RGN_CNT || rgn_id < 0) {
97*e3ec6ff4SXiaoDong Huang 		ERROR("%s regions-id:%d is invalid!\n", __func__, rgn_id);
98*e3ec6ff4SXiaoDong Huang 		panic();
99*e3ec6ff4SXiaoDong Huang 	}
100*e3ec6ff4SXiaoDong Huang 
101*e3ec6ff4SXiaoDong Huang 	mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_RGN(rgn_id),
102*e3ec6ff4SXiaoDong Huang 		      RG_MAP_SRAM_SECURE(top_kb, base_kb));
103*e3ec6ff4SXiaoDong Huang 
104*e3ec6ff4SXiaoDong Huang 	/* enable region */
105*e3ec6ff4SXiaoDong Huang 	mmio_setbits_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_CON, BIT(rgn_id));
106*e3ec6ff4SXiaoDong Huang }
107*e3ec6ff4SXiaoDong Huang 
secure_region_init(void)108*e3ec6ff4SXiaoDong Huang static void secure_region_init(void)
109*e3ec6ff4SXiaoDong Huang {
110*e3ec6ff4SXiaoDong Huang 	uint32_t i;
111*e3ec6ff4SXiaoDong Huang 
112*e3ec6ff4SXiaoDong Huang 	/* disable all region first except region0 */
113*e3ec6ff4SXiaoDong Huang 	mmio_clrbits_32(FIREWALL_DDR_BASE + FIREWALL_DDR_CON, 0xfffe);
114*e3ec6ff4SXiaoDong Huang 	for (i = 0; i < FIREWALL_DSU_CON_CNT; i++)
115*e3ec6ff4SXiaoDong Huang 		mmio_clrbits_32(FIREWALL_DSU_BASE + FIREWALL_DSU_CON(i), 0xfffe);
116*e3ec6ff4SXiaoDong Huang 	mmio_clrbits_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_CON, 0xfe);
117*e3ec6ff4SXiaoDong Huang 
118*e3ec6ff4SXiaoDong Huang 	secure_fw_master_init();
119*e3ec6ff4SXiaoDong Huang 
120*e3ec6ff4SXiaoDong Huang 	/* Use FW_DDR_RGN0_REG to config 0~1M space to secure */
121*e3ec6ff4SXiaoDong Huang 	dsu_fw_rgn_config(0, 1, 0);
122*e3ec6ff4SXiaoDong Huang 	ddr_fw_rgn_config(0, 1, 0);
123*e3ec6ff4SXiaoDong Huang 
124*e3ec6ff4SXiaoDong Huang 	/* Use FIREWALL_SYSMEM_RGN0 to config SRAM_ENTRY code(0~4k of sram) to secure */
125*e3ec6ff4SXiaoDong Huang 	sram_fw_rgn_config(0, 4, 0);
126*e3ec6ff4SXiaoDong Huang 	/* For 0xffff0000~0xffffffff, use FIREWALL_SYSMEM_RGN7 to config
127*e3ec6ff4SXiaoDong Huang 	 * 960~1024k of sram to secure.
128*e3ec6ff4SXiaoDong Huang 	 */
129*e3ec6ff4SXiaoDong Huang 	sram_fw_rgn_config(960, 1024, 7);
130*e3ec6ff4SXiaoDong Huang }
131*e3ec6ff4SXiaoDong Huang 
secure_timer_init(void)132*e3ec6ff4SXiaoDong Huang void secure_timer_init(void)
133*e3ec6ff4SXiaoDong Huang {
134*e3ec6ff4SXiaoDong Huang 	/* gpu's cntvalue comes from stimer1 channel_5 */
135*e3ec6ff4SXiaoDong Huang 	mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_CONTROL_REG,
136*e3ec6ff4SXiaoDong Huang 		      TIMER_DIS);
137*e3ec6ff4SXiaoDong Huang 
138*e3ec6ff4SXiaoDong Huang 	mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_LOAD_COUNT0, 0xffffffff);
139*e3ec6ff4SXiaoDong Huang 	mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_LOAD_COUNT1, 0xffffffff);
140*e3ec6ff4SXiaoDong Huang 
141*e3ec6ff4SXiaoDong Huang 	/* auto reload & enable the timer */
142*e3ec6ff4SXiaoDong Huang 	mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_CONTROL_REG,
143*e3ec6ff4SXiaoDong Huang 		      TIMER_EN | TIMER_FMODE);
144*e3ec6ff4SXiaoDong Huang }
145*e3ec6ff4SXiaoDong Huang 
sgrf_init(void)146*e3ec6ff4SXiaoDong Huang void sgrf_init(void)
147*e3ec6ff4SXiaoDong Huang {
148*e3ec6ff4SXiaoDong Huang 	uint32_t i;
149*e3ec6ff4SXiaoDong Huang 
150*e3ec6ff4SXiaoDong Huang 	secure_region_init();
151*e3ec6ff4SXiaoDong Huang 
152*e3ec6ff4SXiaoDong Huang 	/* config master ddr_mcu_prot|dcf_wr|dcf_rd as secure */
153*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(14), 0x001f0011);
154*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(15), 0xffffffff);
155*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(16), 0x03ff03ff);
156*e3ec6ff4SXiaoDong Huang 
157*e3ec6ff4SXiaoDong Huang 	/* config slave mailbox_mcu_ddr as secure */
158*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(4), 0xffff2000);
159*e3ec6ff4SXiaoDong Huang 	/* config slave int256mux4_mcu_ddr|int256mux4_mcu_pmu as secure */
160*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(5), 0xffff0060);
161*e3ec6ff4SXiaoDong Huang 	/* config slave ddrgrf*|dma2ddr|ddrphy*_cru|umctl* as secure */
162*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(24), 0xffff0fbf);
163*e3ec6ff4SXiaoDong Huang 	/* config slave ddrphy*|ddr_stanby*|ddr_mcu_timer|ddr_mcu_wdt as secure */
164*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(25), 0xffff03ff);
165*e3ec6ff4SXiaoDong Huang 
166*e3ec6ff4SXiaoDong Huang 	/* config all other slave as ns */
167*e3ec6ff4SXiaoDong Huang 	for (i = 0; i < SGRF_FIREWALL_CON_CNT; i++) {
168*e3ec6ff4SXiaoDong Huang 		if (i == 4 || i == 5 || i == 24 || i == 25)
169*e3ec6ff4SXiaoDong Huang 			continue;
170*e3ec6ff4SXiaoDong Huang 
171*e3ec6ff4SXiaoDong Huang 		mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(i), 0xffff0000);
172*e3ec6ff4SXiaoDong Huang 	}
173*e3ec6ff4SXiaoDong Huang 
174*e3ec6ff4SXiaoDong Huang 	/* config vad_hprot non-secure, pmu_mcu_hprot as secure */
175*e3ec6ff4SXiaoDong Huang 	mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(0), 0x00180010);
176*e3ec6ff4SXiaoDong Huang 	/* config pmu1, pmu0, pmu_sram as secure */
177*e3ec6ff4SXiaoDong Huang 	mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(1), 0xefbe6020);
178*e3ec6ff4SXiaoDong Huang 	/* config remap_pmu_mem, h_pmu_mem as secure */
179*e3ec6ff4SXiaoDong Huang 	mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(2), 0x01f900c0);
180*e3ec6ff4SXiaoDong Huang 
181*e3ec6ff4SXiaoDong Huang 	/* disable dp encryption */
182*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(13), 0x00180018);
183*e3ec6ff4SXiaoDong Huang 
184*e3ec6ff4SXiaoDong Huang 	/* select grf config for pcie ats */
185*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(17), 0x11111111);
186*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(18), 0x11111111);
187*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(19), 0x00110011);
188*e3ec6ff4SXiaoDong Huang }
189