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 */
bcm_tzc_setup(void)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 */
tz_master_set(uint32_t base,uint32_t value,uint32_t ns)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 */
plat_tz_sdio_ns_master_set(uint32_t ns)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 */
plat_tz_usb_ns_master_set(uint32_t ns)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 */
plat_tz_master_default_cfg(void)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