xref: /rk3399_ARM-atf/plat/brcm/board/stingray/src/tz_sec.c (revision 9a40c0fba66ccc706ed90ce9b40de6b0045bd660)
1*9a40c0fbSSheetal Tigadoli /*
2*9a40c0fbSSheetal Tigadoli  * Copyright (c) 2016 - 2020, Broadcom
3*9a40c0fbSSheetal Tigadoli  *
4*9a40c0fbSSheetal Tigadoli  * SPDX-License-Identifier: BSD-3-Clause
5*9a40c0fbSSheetal Tigadoli  */
6*9a40c0fbSSheetal Tigadoli 
7*9a40c0fbSSheetal Tigadoli #include <common/debug.h>
8*9a40c0fbSSheetal Tigadoli #include <drivers/arm/tzc400.h>
9*9a40c0fbSSheetal Tigadoli #include <lib/mmio.h>
10*9a40c0fbSSheetal Tigadoli 
11*9a40c0fbSSheetal Tigadoli #include <cmn_sec.h>
12*9a40c0fbSSheetal Tigadoli #include <platform_def.h>
13*9a40c0fbSSheetal Tigadoli 
14*9a40c0fbSSheetal Tigadoli /*
15*9a40c0fbSSheetal Tigadoli  * Trust Zone controllers
16*9a40c0fbSSheetal Tigadoli  */
17*9a40c0fbSSheetal Tigadoli #define TZC400_FS_SRAM_ROOT	0x66d84000
18*9a40c0fbSSheetal Tigadoli 
19*9a40c0fbSSheetal Tigadoli /*
20*9a40c0fbSSheetal Tigadoli  * TZPC Master configure registers
21*9a40c0fbSSheetal Tigadoli  */
22*9a40c0fbSSheetal Tigadoli 
23*9a40c0fbSSheetal Tigadoli /* TZPC_TZPCDECPROT0set */
24*9a40c0fbSSheetal Tigadoli #define TZPC0_MASTER_NS_BASE		0x68b40804
25*9a40c0fbSSheetal Tigadoli #define TZPC0_SATA3_BIT			5
26*9a40c0fbSSheetal Tigadoli #define TZPC0_SATA2_BIT			4
27*9a40c0fbSSheetal Tigadoli #define TZPC0_SATA1_BIT			3
28*9a40c0fbSSheetal Tigadoli #define TZPC0_SATA0_BIT			2
29*9a40c0fbSSheetal Tigadoli #define TZPC0_USB3H1_BIT		1
30*9a40c0fbSSheetal Tigadoli #define TZPC0_USB3H0_BIT		0
31*9a40c0fbSSheetal Tigadoli #define TZPC0_MASTER_SEC_DEFAULT	0
32*9a40c0fbSSheetal Tigadoli 
33*9a40c0fbSSheetal Tigadoli /* TZPC_TZPCDECPROT1set */
34*9a40c0fbSSheetal Tigadoli #define TZPC1_MASTER_NS_BASE		0x68b40810
35*9a40c0fbSSheetal Tigadoli #define TZPC1_SDIO1_BIT			6
36*9a40c0fbSSheetal Tigadoli #define TZPC1_SDIO0_BIT			5
37*9a40c0fbSSheetal Tigadoli #define TZPC1_AUDIO0_BIT		4
38*9a40c0fbSSheetal Tigadoli #define TZPC1_USB2D_BIT			3
39*9a40c0fbSSheetal Tigadoli #define TZPC1_USB2H1_BIT		2
40*9a40c0fbSSheetal Tigadoli #define TZPC1_USB2H0_BIT		1
41*9a40c0fbSSheetal Tigadoli #define TZPC1_AMAC0_BIT			0
42*9a40c0fbSSheetal Tigadoli #define TZPC1_MASTER_SEC_DEFAULT	0
43*9a40c0fbSSheetal Tigadoli 
44*9a40c0fbSSheetal Tigadoli 
45*9a40c0fbSSheetal Tigadoli struct tz_sec_desc {
46*9a40c0fbSSheetal Tigadoli 	uintptr_t addr;
47*9a40c0fbSSheetal Tigadoli 	uint32_t val;
48*9a40c0fbSSheetal Tigadoli };
49*9a40c0fbSSheetal Tigadoli 
50*9a40c0fbSSheetal Tigadoli static const struct tz_sec_desc tz_master_defaults[] = {
51*9a40c0fbSSheetal Tigadoli { TZPC0_MASTER_NS_BASE, TZPC0_MASTER_SEC_DEFAULT },
52*9a40c0fbSSheetal Tigadoli { TZPC1_MASTER_NS_BASE, TZPC1_MASTER_SEC_DEFAULT }
53*9a40c0fbSSheetal Tigadoli };
54*9a40c0fbSSheetal Tigadoli 
55*9a40c0fbSSheetal Tigadoli /*
56*9a40c0fbSSheetal Tigadoli  * Initialize the TrustZone Controller for SRAM partitioning.
57*9a40c0fbSSheetal Tigadoli  */
58*9a40c0fbSSheetal Tigadoli static void bcm_tzc_setup(void)
59*9a40c0fbSSheetal Tigadoli {
60*9a40c0fbSSheetal Tigadoli 	VERBOSE("Configuring SRAM TrustZone Controller\n");
61*9a40c0fbSSheetal Tigadoli 
62*9a40c0fbSSheetal Tigadoli 	/* Init the TZASC controller */
63*9a40c0fbSSheetal Tigadoli 	tzc400_init(TZC400_FS_SRAM_ROOT);
64*9a40c0fbSSheetal Tigadoli 
65*9a40c0fbSSheetal Tigadoli 	/*
66*9a40c0fbSSheetal Tigadoli 	 * Close the entire SRAM space
67*9a40c0fbSSheetal Tigadoli 	 * Region 0 covers the entire SRAM space
68*9a40c0fbSSheetal Tigadoli 	 * None of the NS device can access it.
69*9a40c0fbSSheetal Tigadoli 	 */
70*9a40c0fbSSheetal Tigadoli 	tzc400_configure_region0(TZC_REGION_S_RDWR, 0);
71*9a40c0fbSSheetal Tigadoli 
72*9a40c0fbSSheetal Tigadoli 	/* Do raise an exception if a NS device tries to access secure memory */
73*9a40c0fbSSheetal Tigadoli 	tzc400_set_action(TZC_ACTION_ERR);
74*9a40c0fbSSheetal Tigadoli }
75*9a40c0fbSSheetal Tigadoli 
76*9a40c0fbSSheetal Tigadoli /*
77*9a40c0fbSSheetal Tigadoli  * Configure TZ Master as NS_MASTER or SECURE_MASTER
78*9a40c0fbSSheetal Tigadoli  * To set a Master to non-secure, use *_SET registers
79*9a40c0fbSSheetal Tigadoli  * To set a Master to secure, use *_CLR registers (set + 0x4 address)
80*9a40c0fbSSheetal Tigadoli  */
81*9a40c0fbSSheetal Tigadoli static void tz_master_set(uint32_t base, uint32_t value, uint32_t ns)
82*9a40c0fbSSheetal Tigadoli {
83*9a40c0fbSSheetal Tigadoli 	if (ns == SECURE_MASTER) {
84*9a40c0fbSSheetal Tigadoli 		mmio_write_32(base + 4, value);
85*9a40c0fbSSheetal Tigadoli 	} else {
86*9a40c0fbSSheetal Tigadoli 		mmio_write_32(base, value);
87*9a40c0fbSSheetal Tigadoli 	}
88*9a40c0fbSSheetal Tigadoli }
89*9a40c0fbSSheetal Tigadoli 
90*9a40c0fbSSheetal Tigadoli /*
91*9a40c0fbSSheetal Tigadoli  * Initialize the secure environment for sdio.
92*9a40c0fbSSheetal Tigadoli  */
93*9a40c0fbSSheetal Tigadoli void plat_tz_sdio_ns_master_set(uint32_t ns)
94*9a40c0fbSSheetal Tigadoli {
95*9a40c0fbSSheetal Tigadoli 	tz_master_set(TZPC1_MASTER_NS_BASE,
96*9a40c0fbSSheetal Tigadoli 			1 << TZPC1_SDIO0_BIT,
97*9a40c0fbSSheetal Tigadoli 			ns);
98*9a40c0fbSSheetal Tigadoli }
99*9a40c0fbSSheetal Tigadoli 
100*9a40c0fbSSheetal Tigadoli /*
101*9a40c0fbSSheetal Tigadoli  * Initialize the secure environment for usb.
102*9a40c0fbSSheetal Tigadoli  */
103*9a40c0fbSSheetal Tigadoli void plat_tz_usb_ns_master_set(uint32_t ns)
104*9a40c0fbSSheetal Tigadoli {
105*9a40c0fbSSheetal Tigadoli 	tz_master_set(TZPC1_MASTER_NS_BASE,
106*9a40c0fbSSheetal Tigadoli 			1 << TZPC1_USB2H0_BIT,
107*9a40c0fbSSheetal Tigadoli 			ns);
108*9a40c0fbSSheetal Tigadoli }
109*9a40c0fbSSheetal Tigadoli 
110*9a40c0fbSSheetal Tigadoli /*
111*9a40c0fbSSheetal Tigadoli  * Set masters to default configuration.
112*9a40c0fbSSheetal Tigadoli  *
113*9a40c0fbSSheetal Tigadoli  * DMA security settings are programmed into the PL-330 controller and
114*9a40c0fbSSheetal Tigadoli  * are not set by iProc TZPC registers.
115*9a40c0fbSSheetal Tigadoli  * DMA always comes up as secure master (*NS bit is 0).
116*9a40c0fbSSheetal Tigadoli  *
117*9a40c0fbSSheetal Tigadoli  * Because the default reset values of TZPC are 0 (== Secure),
118*9a40c0fbSSheetal Tigadoli  * ARM Verilog code makes all masters, including PCIe, come up as
119*9a40c0fbSSheetal Tigadoli  * secure.
120*9a40c0fbSSheetal Tigadoli  * However, SOTP has a bit called SOTP_ALLMASTER_NS that overrides
121*9a40c0fbSSheetal Tigadoli  * TZPC and makes all masters non-secure for AB devices.
122*9a40c0fbSSheetal Tigadoli  *
123*9a40c0fbSSheetal Tigadoli  * Hence we first set all the TZPC bits to program all masters,
124*9a40c0fbSSheetal Tigadoli  * including PCIe, as non-secure, then set the CLEAR_ALLMASTER_NS bit
125*9a40c0fbSSheetal Tigadoli  * so that the SOTP_ALLMASTER_NS cannot override TZPC.
126*9a40c0fbSSheetal Tigadoli  * now security settings for each masters come from TZPC
127*9a40c0fbSSheetal Tigadoli  * (which makes all masters other than DMA as non-secure).
128*9a40c0fbSSheetal Tigadoli  *
129*9a40c0fbSSheetal Tigadoli  * During the boot, all masters other than DMA Ctrlr + list
130*9a40c0fbSSheetal Tigadoli  * are non-secure in an AB Prod/AB Dev/AB Pending device.
131*9a40c0fbSSheetal Tigadoli  *
132*9a40c0fbSSheetal Tigadoli  */
133*9a40c0fbSSheetal Tigadoli void plat_tz_master_default_cfg(void)
134*9a40c0fbSSheetal Tigadoli {
135*9a40c0fbSSheetal Tigadoli 	int i;
136*9a40c0fbSSheetal Tigadoli 
137*9a40c0fbSSheetal Tigadoli 	/* Configure default secure and non-secure TZ Masters */
138*9a40c0fbSSheetal Tigadoli 	for (i = 0; i < ARRAY_SIZE(tz_master_defaults); i++) {
139*9a40c0fbSSheetal Tigadoli 		tz_master_set(tz_master_defaults[i].addr,
140*9a40c0fbSSheetal Tigadoli 			      tz_master_defaults[i].val,
141*9a40c0fbSSheetal Tigadoli 			      SECURE_MASTER);
142*9a40c0fbSSheetal Tigadoli 		tz_master_set(tz_master_defaults[i].addr,
143*9a40c0fbSSheetal Tigadoli 			      ~tz_master_defaults[i].val,
144*9a40c0fbSSheetal Tigadoli 			      NS_MASTER);
145*9a40c0fbSSheetal Tigadoli 	}
146*9a40c0fbSSheetal Tigadoli 
147*9a40c0fbSSheetal Tigadoli 	/* Clear all master NS */
148*9a40c0fbSSheetal Tigadoli 	mmio_setbits_32(SOTP_CHIP_CTRL,
149*9a40c0fbSSheetal Tigadoli 			1 << SOTP_CLEAR_SYSCTRL_ALL_MASTER_NS);
150*9a40c0fbSSheetal Tigadoli 
151*9a40c0fbSSheetal Tigadoli 	/* Initialize TZ controller and Set SRAM to secure */
152*9a40c0fbSSheetal Tigadoli 	bcm_tzc_setup();
153*9a40c0fbSSheetal Tigadoli }
154