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