1*92b64e4fSClement Faure // SPDX-License-Identifier: BSD-2-Clause 2*92b64e4fSClement Faure /* 3*92b64e4fSClement Faure * Copyright 2017-2019 NXP 4*92b64e4fSClement Faure * 5*92b64e4fSClement Faure */ 6*92b64e4fSClement Faure 7*92b64e4fSClement Faure #include <config.h> 8*92b64e4fSClement Faure #include <imx.h> 9*92b64e4fSClement Faure #include <initcall.h> 10*92b64e4fSClement Faure #include <io.h> 11*92b64e4fSClement Faure #include <kernel/panic.h> 12*92b64e4fSClement Faure #include <mm/core_memprot.h> 13*92b64e4fSClement Faure 14*92b64e4fSClement Faure struct csu_setting { 15*92b64e4fSClement Faure int csu_index; 16*92b64e4fSClement Faure uint32_t value; 17*92b64e4fSClement Faure }; 18*92b64e4fSClement Faure 19*92b64e4fSClement Faure const struct csu_setting csu_setting_imx6[] = { 20*92b64e4fSClement Faure {13, 0xFF0033}, /* Protect ROMCP */ 21*92b64e4fSClement Faure {16, 0x330033}, /* Protect TZASC */ 22*92b64e4fSClement Faure {26, 0xFF0033}, /* Protect OCRAM */ 23*92b64e4fSClement Faure {(-1), 0}, 24*92b64e4fSClement Faure }; 25*92b64e4fSClement Faure 26*92b64e4fSClement Faure struct csu_sa_setting { 27*92b64e4fSClement Faure uint32_t access_value; 28*92b64e4fSClement Faure uint32_t lock_value; 29*92b64e4fSClement Faure }; 30*92b64e4fSClement Faure 31*92b64e4fSClement Faure struct csu_config { 32*92b64e4fSClement Faure const struct csu_sa_setting * const sa; 33*92b64e4fSClement Faure const struct csu_setting * const csl; 34*92b64e4fSClement Faure }; 35*92b64e4fSClement Faure 36*92b64e4fSClement Faure const struct csu_setting csu_setting_imx6ul[] = { 37*92b64e4fSClement Faure {13, 0xFF0033}, /* Protect ROMCP */ 38*92b64e4fSClement Faure {16, 0x3300FF}, /* Protect TZASC */ 39*92b64e4fSClement Faure {39, 0x3300FF}, /* Protect OCRAM */ 40*92b64e4fSClement Faure {(-1), 0}, 41*92b64e4fSClement Faure }; 42*92b64e4fSClement Faure 43*92b64e4fSClement Faure const struct csu_setting csu_setting_imx6ull[] = { 44*92b64e4fSClement Faure { 13, 0xFF0033 }, /* Protect ROMCP */ 45*92b64e4fSClement Faure { 16, 0x3300FF }, /* Protect TZASC */ 46*92b64e4fSClement Faure { 34, 0xFF0033 }, /* Protect DCP */ 47*92b64e4fSClement Faure { 39, 0x3300FF }, /* Protect OCRAM */ 48*92b64e4fSClement Faure { (-1), 0 }, 49*92b64e4fSClement Faure }; 50*92b64e4fSClement Faure 51*92b64e4fSClement Faure const struct csu_setting csu_setting_imx6sl[] = { 52*92b64e4fSClement Faure { 13, 0x3F0033 }, /* Protect DCP/ROMCP */ 53*92b64e4fSClement Faure { 16, 0xFF0033 }, /* Protect TZASC */ 54*92b64e4fSClement Faure { 26, 0xFF0033 }, /* Protect OCRAM */ 55*92b64e4fSClement Faure { (-1), 0 }, 56*92b64e4fSClement Faure }; 57*92b64e4fSClement Faure 58*92b64e4fSClement Faure const struct csu_setting csu_setting_imx6sx[] = { 59*92b64e4fSClement Faure {13, 0xFF0033}, /* Protect ROMCP */ 60*92b64e4fSClement Faure {15, 0xFF0033}, /* Protect RDC */ 61*92b64e4fSClement Faure {16, 0x3300FF}, /* Protect TZASC */ 62*92b64e4fSClement Faure {34, 0x3300FF}, /* Protect OCRAM */ 63*92b64e4fSClement Faure {(-1), 0}, 64*92b64e4fSClement Faure }; 65*92b64e4fSClement Faure 66*92b64e4fSClement Faure const struct csu_setting csu_setting_imx7ds[] = { 67*92b64e4fSClement Faure {14, 0x3300FF}, /* Protect RDC */ 68*92b64e4fSClement Faure {15, 0xFF0033}, /* Protect CSU */ 69*92b64e4fSClement Faure {28, 0xFF0033}, /* Protect TZASC */ 70*92b64e4fSClement Faure {59, 0x3300FF}, /* Protect OCRAM_S */ 71*92b64e4fSClement Faure {(-1), 0}, 72*92b64e4fSClement Faure }; 73*92b64e4fSClement Faure 74*92b64e4fSClement Faure /* Set all masters to non-secure except the Cortex-A7 */ 75*92b64e4fSClement Faure const struct csu_sa_setting csu_sa_imx6ul = { 0x10554550, 0x20aa8aa2 }; 76*92b64e4fSClement Faure const struct csu_sa_setting csu_sa_imx7ds = { 0x15554554, 0x2aaa8aaa }; 77*92b64e4fSClement Faure 78*92b64e4fSClement Faure const struct csu_config csu_imx6 = { NULL, csu_setting_imx6 }; 79*92b64e4fSClement Faure const struct csu_config csu_imx6ul = { &csu_sa_imx6ul, csu_setting_imx6ul }; 80*92b64e4fSClement Faure const struct csu_config csu_imx6ull = { NULL, csu_setting_imx6ull }; 81*92b64e4fSClement Faure const struct csu_config csu_imx6sl = { NULL, csu_setting_imx6sl }; 82*92b64e4fSClement Faure const struct csu_config csu_imx6sx = { NULL, csu_setting_imx6sx }; 83*92b64e4fSClement Faure const struct csu_config csu_imx7ds = { &csu_sa_imx7ds, csu_setting_imx7ds }; 84*92b64e4fSClement Faure 85*92b64e4fSClement Faure static void rngb_configure(vaddr_t csu_base) 86*92b64e4fSClement Faure { 87*92b64e4fSClement Faure int csu_index = 0; 88*92b64e4fSClement Faure 89*92b64e4fSClement Faure if (soc_is_imx6sl() || soc_is_imx6sll()) 90*92b64e4fSClement Faure csu_index = 16; 91*92b64e4fSClement Faure else if (soc_is_imx6ull()) 92*92b64e4fSClement Faure csu_index = 34; 93*92b64e4fSClement Faure else 94*92b64e4fSClement Faure return; 95*92b64e4fSClement Faure 96*92b64e4fSClement Faure /* Protect RNGB */ 97*92b64e4fSClement Faure io_mask32(csu_base + csu_index * 4, 0x330000, 0xFF0000); 98*92b64e4fSClement Faure } 99*92b64e4fSClement Faure 100*92b64e4fSClement Faure static TEE_Result csu_init(void) 101*92b64e4fSClement Faure { 102*92b64e4fSClement Faure vaddr_t csu_base; 103*92b64e4fSClement Faure vaddr_t offset; 104*92b64e4fSClement Faure const struct csu_config *csu_config = NULL; 105*92b64e4fSClement Faure const struct csu_setting *csu_setting = NULL; 106*92b64e4fSClement Faure 107*92b64e4fSClement Faure csu_base = core_mmu_get_va(CSU_BASE, MEM_AREA_IO_SEC, 1); 108*92b64e4fSClement Faure if (!csu_base) 109*92b64e4fSClement Faure panic(); 110*92b64e4fSClement Faure 111*92b64e4fSClement Faure if (soc_is_imx6sx()) 112*92b64e4fSClement Faure csu_config = &csu_imx6sx; 113*92b64e4fSClement Faure else if (soc_is_imx6ul()) 114*92b64e4fSClement Faure csu_config = &csu_imx6ul; 115*92b64e4fSClement Faure else if (soc_is_imx6ull()) 116*92b64e4fSClement Faure csu_config = &csu_imx6ull; 117*92b64e4fSClement Faure else if (soc_is_imx6sll() || soc_is_imx6sl()) 118*92b64e4fSClement Faure csu_config = &csu_imx6sl; 119*92b64e4fSClement Faure else if (soc_is_imx6()) 120*92b64e4fSClement Faure csu_config = &csu_imx6; 121*92b64e4fSClement Faure else if (soc_is_imx7ds()) 122*92b64e4fSClement Faure csu_config = &csu_imx7ds; 123*92b64e4fSClement Faure else 124*92b64e4fSClement Faure return TEE_SUCCESS; 125*92b64e4fSClement Faure 126*92b64e4fSClement Faure /* first grant all peripherals */ 127*92b64e4fSClement Faure for (offset = CSU_CSL_START; offset < CSU_CSL_END; offset += 4) 128*92b64e4fSClement Faure io_write32(csu_base + offset, CSU_ACCESS_ALL); 129*92b64e4fSClement Faure 130*92b64e4fSClement Faure csu_setting = csu_config->csl; 131*92b64e4fSClement Faure 132*92b64e4fSClement Faure while (csu_setting->csu_index >= 0) { 133*92b64e4fSClement Faure io_write32(csu_base + (csu_setting->csu_index * 4), 134*92b64e4fSClement Faure csu_setting->value); 135*92b64e4fSClement Faure 136*92b64e4fSClement Faure csu_setting++; 137*92b64e4fSClement Faure } 138*92b64e4fSClement Faure 139*92b64e4fSClement Faure if (IS_ENABLED(CFG_IMX_RNGB)) 140*92b64e4fSClement Faure rngb_configure(csu_base); 141*92b64e4fSClement Faure 142*92b64e4fSClement Faure /* lock the settings */ 143*92b64e4fSClement Faure for (offset = CSU_CSL_START; offset < CSU_CSL_END; offset += 4) { 144*92b64e4fSClement Faure io_write32(csu_base + offset, 145*92b64e4fSClement Faure io_read32(csu_base + offset) | CSU_SETTING_LOCK); 146*92b64e4fSClement Faure } 147*92b64e4fSClement Faure 148*92b64e4fSClement Faure if (csu_config->sa) { 149*92b64e4fSClement Faure io_write32(csu_base + CSU_SA, csu_config->sa->access_value); 150*92b64e4fSClement Faure io_setbits32(csu_base + CSU_SA, csu_config->sa->lock_value); 151*92b64e4fSClement Faure } 152*92b64e4fSClement Faure 153*92b64e4fSClement Faure return TEE_SUCCESS; 154*92b64e4fSClement Faure } 155*92b64e4fSClement Faure 156*92b64e4fSClement Faure driver_init(csu_init); 157