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