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