xref: /optee_os/core/drivers/imx_csu.c (revision 92b64e4fbe1f2afdb0231d8839eeb69b41f19e87)
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