xref: /rk3399_ARM-atf/plat/imx/imx8qm/imx8qm_bl31_setup.c (revision d7873bcd541b99a816c4ea6f1cce66858641f6fc)
1baa7650bSAnson Huang /*
2ca661a00SMadhukar Pappireddy  * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved.
3baa7650bSAnson Huang  *
4baa7650bSAnson Huang  * SPDX-License-Identifier: BSD-3-Clause
5baa7650bSAnson Huang  */
6baa7650bSAnson Huang 
7baa7650bSAnson Huang #include <assert.h>
809d40e0eSAntonio Nino Diaz #include <stdbool.h>
909d40e0eSAntonio Nino Diaz 
1009d40e0eSAntonio Nino Diaz #include <platform_def.h>
1109d40e0eSAntonio Nino Diaz 
1209d40e0eSAntonio Nino Diaz #include <arch_helpers.h>
13baa7650bSAnson Huang #include <context.h>
1409d40e0eSAntonio Nino Diaz #include <common/bl_common.h>
1509d40e0eSAntonio Nino Diaz #include <common/debug.h>
1609d40e0eSAntonio Nino Diaz #include <drivers/arm/cci.h>
1709d40e0eSAntonio Nino Diaz #include <drivers/console.h>
1809d40e0eSAntonio Nino Diaz #include <lib/el3_runtime/context_mgmt.h>
1909d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
2009d40e0eSAntonio Nino Diaz #include <lib/xlat_tables/xlat_tables.h>
2109d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
2209d40e0eSAntonio Nino Diaz 
23baa7650bSAnson Huang #include <imx8qm_pads.h>
24baa7650bSAnson Huang #include <imx8_iomux.h>
25baa7650bSAnson Huang #include <imx8_lpuart.h>
26baa7650bSAnson Huang #include <plat_imx8.h>
27baa7650bSAnson Huang #include <sci/sci.h>
28baa7650bSAnson Huang #include <sec_rsrc.h>
29baa7650bSAnson Huang 
30ca661a00SMadhukar Pappireddy static const unsigned long BL31_COHERENT_RAM_START	= BL_COHERENT_RAM_BASE;
31ca661a00SMadhukar Pappireddy static const unsigned long BL31_COHERENT_RAM_END	= BL_COHERENT_RAM_END;
32ca661a00SMadhukar Pappireddy static const unsigned long BL31_RO_START		= BL_CODE_BASE;
33ca661a00SMadhukar Pappireddy static const unsigned long BL31_RO_END			= BL_CODE_END;
34ca661a00SMadhukar Pappireddy static const unsigned long BL31_RW_END			= BL_END;
35ca661a00SMadhukar Pappireddy 
36baa7650bSAnson Huang IMPORT_SYM(unsigned long, __RW_START__, BL31_RW_START);
37baa7650bSAnson Huang 
38baa7650bSAnson Huang static entry_point_info_t bl32_image_ep_info;
39baa7650bSAnson Huang static entry_point_info_t bl33_image_ep_info;
40baa7650bSAnson Huang 
41baa7650bSAnson Huang #define UART_PAD_CTRL	(PADRING_IFMUX_EN_MASK | PADRING_GP_EN_MASK | \
42baa7650bSAnson Huang 			(SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \
43baa7650bSAnson Huang 			(SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
44baa7650bSAnson Huang 			(SC_PAD_28FDSOI_DSE_DV_LOW << PADRING_DSE_SHIFT) | \
45baa7650bSAnson Huang 			(SC_PAD_28FDSOI_PS_PD << PADRING_PULL_SHIFT))
46baa7650bSAnson Huang 
47baa7650bSAnson Huang const static int imx8qm_cci_map[] = {
48baa7650bSAnson Huang 	CLUSTER0_CCI_SLVAE_IFACE,
49baa7650bSAnson Huang 	CLUSTER1_CCI_SLVAE_IFACE
50baa7650bSAnson Huang };
51baa7650bSAnson Huang 
52baa7650bSAnson Huang static const mmap_region_t imx_mmap[] = {
533a2b5199SAnson Huang 	MAP_REGION_FLAT(IMX_REG_BASE, IMX_REG_SIZE, MT_DEVICE | MT_RW),
54baa7650bSAnson Huang 	{0}
55baa7650bSAnson Huang };
56baa7650bSAnson Huang 
57baa7650bSAnson Huang static uint32_t get_spsr_for_bl33_entry(void)
58baa7650bSAnson Huang {
59baa7650bSAnson Huang 	unsigned long el_status;
60baa7650bSAnson Huang 	unsigned long mode;
61baa7650bSAnson Huang 	uint32_t spsr;
62baa7650bSAnson Huang 
63baa7650bSAnson Huang 	/* figure out what mode we enter the non-secure world */
64baa7650bSAnson Huang 	el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT;
65baa7650bSAnson Huang 	el_status &= ID_AA64PFR0_ELX_MASK;
66baa7650bSAnson Huang 
67baa7650bSAnson Huang 	mode = (el_status) ? MODE_EL2 : MODE_EL1;
68baa7650bSAnson Huang 	spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS);
69baa7650bSAnson Huang 
70baa7650bSAnson Huang 	return spsr;
71baa7650bSAnson Huang }
72baa7650bSAnson Huang 
73baa7650bSAnson Huang #if DEBUG_CONSOLE_A53
74baa7650bSAnson Huang static void lpuart32_serial_setbrg(unsigned int base, int baudrate)
75baa7650bSAnson Huang {
76baa7650bSAnson Huang 	unsigned int sbr, osr, baud_diff, tmp_osr, tmp_sbr;
77baa7650bSAnson Huang 	unsigned int diff1, diff2, tmp, rate;
78baa7650bSAnson Huang 
79baa7650bSAnson Huang 	if (baudrate == 0)
80baa7650bSAnson Huang 		panic();
81baa7650bSAnson Huang 
82baa7650bSAnson Huang 	sc_pm_get_clock_rate(ipc_handle, SC_R_UART_0, 2, &rate);
83baa7650bSAnson Huang 
84baa7650bSAnson Huang 	baud_diff = baudrate;
85baa7650bSAnson Huang 	osr = 0;
86baa7650bSAnson Huang 	sbr = 0;
87baa7650bSAnson Huang 	for (tmp_osr = 4; tmp_osr <= 32; tmp_osr++) {
88baa7650bSAnson Huang 		tmp_sbr = (rate / (baudrate * tmp_osr));
89baa7650bSAnson Huang 		if (tmp_sbr == 0)
90baa7650bSAnson Huang 			tmp_sbr = 1;
91baa7650bSAnson Huang 
92baa7650bSAnson Huang 		/* calculate difference in actual baud w/ current values */
93baa7650bSAnson Huang 		diff1 = rate / (tmp_osr * tmp_sbr) - baudrate;
94baa7650bSAnson Huang 		diff2 = rate / (tmp_osr * (tmp_sbr + 1));
95baa7650bSAnson Huang 
96baa7650bSAnson Huang 		/* select best values between sbr and sbr+1 */
97baa7650bSAnson Huang 		if (diff1 > (baudrate - diff2)) {
98baa7650bSAnson Huang 			diff1 = baudrate - diff2;
99baa7650bSAnson Huang 			tmp_sbr++;
100baa7650bSAnson Huang 		}
101baa7650bSAnson Huang 
102baa7650bSAnson Huang 		if (diff1 <= baud_diff) {
103baa7650bSAnson Huang 			baud_diff = diff1;
104baa7650bSAnson Huang 			osr = tmp_osr;
105baa7650bSAnson Huang 			sbr = tmp_sbr;
106baa7650bSAnson Huang 		}
107baa7650bSAnson Huang 	}
108baa7650bSAnson Huang 
109baa7650bSAnson Huang 	tmp = mmio_read_32(IMX_BOOT_UART_BASE + BAUD);
110baa7650bSAnson Huang 
111baa7650bSAnson Huang 	if ((osr > 3) && (osr < 8))
112baa7650bSAnson Huang 		tmp |= LPUART_BAUD_BOTHEDGE_MASK;
113baa7650bSAnson Huang 
114baa7650bSAnson Huang 	tmp &= ~LPUART_BAUD_OSR_MASK;
115baa7650bSAnson Huang 	tmp |= LPUART_BAUD_OSR(osr - 1);
116baa7650bSAnson Huang 	tmp &= ~LPUART_BAUD_SBR_MASK;
117baa7650bSAnson Huang 	tmp |= LPUART_BAUD_SBR(sbr);
118baa7650bSAnson Huang 
119baa7650bSAnson Huang 	/* explicitly disable 10 bit mode & set 1 stop bit */
120baa7650bSAnson Huang 	tmp &= ~(LPUART_BAUD_M10_MASK | LPUART_BAUD_SBNS_MASK);
121baa7650bSAnson Huang 
122baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + BAUD, tmp);
123baa7650bSAnson Huang }
124baa7650bSAnson Huang 
125baa7650bSAnson Huang static int lpuart32_serial_init(unsigned int base)
126baa7650bSAnson Huang {
127baa7650bSAnson Huang 	unsigned int tmp;
128baa7650bSAnson Huang 
129baa7650bSAnson Huang 	/* disable TX & RX before enabling clocks */
130baa7650bSAnson Huang 	tmp = mmio_read_32(IMX_BOOT_UART_BASE + CTRL);
131baa7650bSAnson Huang 	tmp &= ~(CTRL_TE | CTRL_RE);
132baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + CTRL, tmp);
133baa7650bSAnson Huang 
134baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + MODIR, 0);
135baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + FIFO, ~(FIFO_TXFE | FIFO_RXFE));
136baa7650bSAnson Huang 
137baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + MATCH, 0);
138baa7650bSAnson Huang 
139baa7650bSAnson Huang 	/* provide data bits, parity, stop bit, etc */
140baa7650bSAnson Huang 	lpuart32_serial_setbrg(base, IMX_BOOT_UART_BAUDRATE);
141baa7650bSAnson Huang 
142baa7650bSAnson Huang 	/* eight data bits no parity bit */
143baa7650bSAnson Huang 	tmp = mmio_read_32(IMX_BOOT_UART_BASE + CTRL);
144baa7650bSAnson Huang 	tmp &= ~(LPUART_CTRL_PE_MASK | LPUART_CTRL_PT_MASK | LPUART_CTRL_M_MASK);
145baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + CTRL, tmp);
146baa7650bSAnson Huang 
147baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + CTRL, CTRL_RE | CTRL_TE);
148baa7650bSAnson Huang 
149baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x55);
150baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x55);
151baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x0A);
152baa7650bSAnson Huang 
153baa7650bSAnson Huang 	return 0;
154baa7650bSAnson Huang }
155baa7650bSAnson Huang #endif
156baa7650bSAnson Huang 
157baa7650bSAnson Huang void mx8_partition_resources(void)
158baa7650bSAnson Huang {
159baa7650bSAnson Huang 	sc_rm_pt_t secure_part, os_part;
160baa7650bSAnson Huang 	sc_rm_mr_t mr, mr_record = 64;
161baa7650bSAnson Huang 	sc_faddr_t start, end;
162baa7650bSAnson Huang 	bool owned, owned2;
163baa7650bSAnson Huang 	sc_err_t err;
164baa7650bSAnson Huang 	int i;
165baa7650bSAnson Huang 
166baa7650bSAnson Huang 	err = sc_rm_get_partition(ipc_handle, &secure_part);
167baa7650bSAnson Huang 
168baa7650bSAnson Huang 	err = sc_rm_partition_alloc(ipc_handle, &os_part, false, false,
169baa7650bSAnson Huang 		false, false, false);
170baa7650bSAnson Huang 
171baa7650bSAnson Huang 	err = sc_rm_set_parent(ipc_handle, os_part, secure_part);
172baa7650bSAnson Huang 
173baa7650bSAnson Huang 	/* set secure resources to NOT-movable */
174baa7650bSAnson Huang 	for (i = 0; i < ARRAY_SIZE(secure_rsrcs); i++) {
175baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, secure_rsrcs[i],
176baa7650bSAnson Huang 			secure_rsrcs[i], false);
177baa7650bSAnson Huang 		if (err)
178baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
179baa7650bSAnson Huang 				secure_rsrcs[i], err);
180baa7650bSAnson Huang 	}
181baa7650bSAnson Huang 
182baa7650bSAnson Huang 	owned = sc_rm_is_resource_owned(ipc_handle, SC_R_M4_0_PID0);
183baa7650bSAnson Huang 	if (owned) {
184baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_0_PID0,
185baa7650bSAnson Huang 				SC_R_M4_0_PID0, false);
186baa7650bSAnson Huang 		if (err)
187baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
188baa7650bSAnson Huang 				SC_R_M4_0_PID0, err);
189baa7650bSAnson Huang 	}
190baa7650bSAnson Huang 
191baa7650bSAnson Huang 	owned2 = sc_rm_is_resource_owned(ipc_handle, SC_R_M4_1_PID0);
192baa7650bSAnson Huang 	if (owned2) {
193baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_1_PID0,
194baa7650bSAnson Huang 				SC_R_M4_1_PID0, false);
195baa7650bSAnson Huang 		if (err)
196baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
197baa7650bSAnson Huang 				SC_R_M4_1_PID0, err);
198baa7650bSAnson Huang 	}
199baa7650bSAnson Huang 	/* move all movable resources and pins to non-secure partition */
200baa7650bSAnson Huang 	err = sc_rm_move_all(ipc_handle, secure_part, os_part, true, true);
201baa7650bSAnson Huang 	if (err)
202baa7650bSAnson Huang 		ERROR("sc_rm_move_all: %u\n", err);
203baa7650bSAnson Huang 
204baa7650bSAnson Huang 	/* iterate through peripherals to give NS OS part access */
205baa7650bSAnson Huang 	for (i = 0; i < ARRAY_SIZE(ns_access_allowed); i++) {
206baa7650bSAnson Huang 		err = sc_rm_set_peripheral_permissions(ipc_handle, ns_access_allowed[i],
207baa7650bSAnson Huang 			os_part, SC_RM_PERM_FULL);
208baa7650bSAnson Huang 		if (err)
209baa7650bSAnson Huang 			ERROR("sc_rm_set_peripheral_permissions: rsrc %u, \
210baa7650bSAnson Huang 				ret %u\n", ns_access_allowed[i], err);
211baa7650bSAnson Huang 	}
212baa7650bSAnson Huang 
213baa7650bSAnson Huang 	if (owned) {
214baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_0_PID0,
215baa7650bSAnson Huang 				SC_R_M4_0_PID0, true);
216baa7650bSAnson Huang 		if (err)
217baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
218baa7650bSAnson Huang 				SC_R_M4_0_PID0, err);
219baa7650bSAnson Huang 		err = sc_rm_assign_resource(ipc_handle, os_part, SC_R_M4_0_PID0);
220baa7650bSAnson Huang 		if (err)
221baa7650bSAnson Huang 			ERROR("sc_rm_assign_resource: rsrc %u, ret %u\n",
222baa7650bSAnson Huang 				SC_R_M4_0_PID0, err);
223baa7650bSAnson Huang 	}
224baa7650bSAnson Huang 	if (owned2) {
225baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_1_PID0,
226baa7650bSAnson Huang 				SC_R_M4_1_PID0, true);
227baa7650bSAnson Huang 		if (err)
228baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
229baa7650bSAnson Huang 				SC_R_M4_1_PID0, err);
230baa7650bSAnson Huang 		err = sc_rm_assign_resource(ipc_handle, os_part, SC_R_M4_1_PID0);
231baa7650bSAnson Huang 		if (err)
232baa7650bSAnson Huang 			ERROR("sc_rm_assign_resource: rsrc %u, ret %u\n",
233baa7650bSAnson Huang 				SC_R_M4_1_PID0, err);
234baa7650bSAnson Huang 	}
235baa7650bSAnson Huang 
236baa7650bSAnson Huang 	/*
237baa7650bSAnson Huang 	 * sc_rm_set_peripheral_permissions
238baa7650bSAnson Huang 	 * sc_rm_set_memreg_permissions
239baa7650bSAnson Huang 	 * sc_rm_set_pin_movable
240baa7650bSAnson Huang 	 */
241baa7650bSAnson Huang 
242baa7650bSAnson Huang 	for (mr = 0; mr < 64; mr++) {
243baa7650bSAnson Huang 		owned = sc_rm_is_memreg_owned(ipc_handle, mr);
244baa7650bSAnson Huang 		if (owned) {
245baa7650bSAnson Huang 			err = sc_rm_get_memreg_info(ipc_handle, mr, &start, &end);
246baa7650bSAnson Huang 			if (err)
247baa7650bSAnson Huang 				ERROR("Memreg get info failed, %u\n", mr);
248baa7650bSAnson Huang 			NOTICE("Memreg %u 0x%llx -- 0x%llx\n", mr, start, end);
249baa7650bSAnson Huang 			if (BL31_BASE >= start && (BL31_LIMIT - 1) <= end) {
250baa7650bSAnson Huang 				mr_record = mr; /* Record the mr for ATF running */
251baa7650bSAnson Huang 			} else {
252baa7650bSAnson Huang 				err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
253baa7650bSAnson Huang 				if (err)
254baa7650bSAnson Huang 					ERROR("Memreg assign failed, 0x%llx -- 0x%llx, \
255baa7650bSAnson Huang 						err %d\n", start, end, err);
256baa7650bSAnson Huang 			}
257baa7650bSAnson Huang 		}
258baa7650bSAnson Huang 	}
259baa7650bSAnson Huang 
260baa7650bSAnson Huang 	if (mr_record != 64) {
261baa7650bSAnson Huang 		err = sc_rm_get_memreg_info(ipc_handle, mr_record, &start, &end);
262baa7650bSAnson Huang 		if (err)
263baa7650bSAnson Huang 			ERROR("Memreg get info failed, %u\n", mr_record);
264baa7650bSAnson Huang 		if ((BL31_LIMIT - 1) < end) {
265baa7650bSAnson Huang 			err = sc_rm_memreg_alloc(ipc_handle, &mr, BL31_LIMIT, end);
266baa7650bSAnson Huang 			if (err)
267baa7650bSAnson Huang 				ERROR("sc_rm_memreg_alloc failed, 0x%llx -- 0x%llx\n",
268baa7650bSAnson Huang 					(sc_faddr_t)BL31_LIMIT, end);
269baa7650bSAnson Huang 			err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
270baa7650bSAnson Huang 			if (err)
271baa7650bSAnson Huang 				ERROR("Memreg assign failed, 0x%llx -- 0x%llx\n",
272baa7650bSAnson Huang 					(sc_faddr_t)BL31_LIMIT, end);
273baa7650bSAnson Huang 		}
274baa7650bSAnson Huang 
275baa7650bSAnson Huang 		if (start < (BL31_BASE - 1)) {
276baa7650bSAnson Huang 			err = sc_rm_memreg_alloc(ipc_handle, &mr, start, BL31_BASE - 1);
277baa7650bSAnson Huang 			if (err)
278baa7650bSAnson Huang 				ERROR("sc_rm_memreg_alloc failed, 0x%llx -- 0x%llx\n",
279baa7650bSAnson Huang 					start, (sc_faddr_t)BL31_BASE - 1);
280baa7650bSAnson Huang 			err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
281baa7650bSAnson Huang 				if (err)
282baa7650bSAnson Huang 					ERROR("Memreg assign failed, 0x%llx -- 0x%llx\n",
283baa7650bSAnson Huang 						start, (sc_faddr_t)BL31_BASE - 1);
284baa7650bSAnson Huang 		}
285baa7650bSAnson Huang 	}
286baa7650bSAnson Huang 
287baa7650bSAnson Huang 	if (err)
288baa7650bSAnson Huang 		NOTICE("Partitioning Failed\n");
289baa7650bSAnson Huang 	else
290baa7650bSAnson Huang 		NOTICE("Non-secure Partitioning Succeeded\n");
291baa7650bSAnson Huang 
292baa7650bSAnson Huang }
293baa7650bSAnson Huang 
294601d2f3cSAntonio Nino Diaz void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
295601d2f3cSAntonio Nino Diaz 				u_register_t arg2, u_register_t arg3)
296baa7650bSAnson Huang {
297baa7650bSAnson Huang #if DEBUG_CONSOLE
298*d7873bcdSAndre Przywara 	static console_t console;
299baa7650bSAnson Huang #endif
300baa7650bSAnson Huang 	if (sc_ipc_open(&ipc_handle, SC_IPC_BASE) != SC_ERR_NONE)
301baa7650bSAnson Huang 		panic();
302baa7650bSAnson Huang 
303baa7650bSAnson Huang #if DEBUG_CONSOLE_A53
304baa7650bSAnson Huang 	sc_pm_set_resource_power_mode(ipc_handle, SC_R_UART_0, SC_PM_PW_MODE_ON);
305baa7650bSAnson Huang 	sc_pm_clock_rate_t rate = 80000000;
306baa7650bSAnson Huang 	sc_pm_set_clock_rate(ipc_handle, SC_R_UART_0, 2, &rate);
307baa7650bSAnson Huang 	sc_pm_clock_enable(ipc_handle, SC_R_UART_0, 2, true, false);
308baa7650bSAnson Huang 
309baa7650bSAnson Huang 	/* configure UART pads */
310baa7650bSAnson Huang 	sc_pad_set(ipc_handle, SC_P_UART0_RX, UART_PAD_CTRL);
311baa7650bSAnson Huang 	sc_pad_set(ipc_handle, SC_P_UART0_TX, UART_PAD_CTRL);
312baa7650bSAnson Huang 	sc_pad_set(ipc_handle, SC_P_UART0_RTS_B, UART_PAD_CTRL);
313baa7650bSAnson Huang 	sc_pad_set(ipc_handle, SC_P_UART0_CTS_B, UART_PAD_CTRL);
314baa7650bSAnson Huang 	lpuart32_serial_init(IMX_BOOT_UART_BASE);
315baa7650bSAnson Huang #endif
316baa7650bSAnson Huang 
317baa7650bSAnson Huang #if DEBUG_CONSOLE
318baa7650bSAnson Huang 	console_lpuart_register(IMX_BOOT_UART_BASE, IMX_BOOT_UART_CLK_IN_HZ,
319baa7650bSAnson Huang 		     IMX_CONSOLE_BAUDRATE, &console);
320baa7650bSAnson Huang #endif
321baa7650bSAnson Huang 
322baa7650bSAnson Huang 	/* turn on MU1 for non-secure OS/Hypervisor */
323baa7650bSAnson Huang 	sc_pm_set_resource_power_mode(ipc_handle, SC_R_MU_1A, SC_PM_PW_MODE_ON);
3243a2b5199SAnson Huang 	/* Turn on GPT_0's power & clock for non-secure OS/Hypervisor */
3253a2b5199SAnson Huang 	sc_pm_set_resource_power_mode(ipc_handle, SC_R_GPT_0, SC_PM_PW_MODE_ON);
3263a2b5199SAnson Huang 	sc_pm_clock_enable(ipc_handle, SC_R_GPT_0, SC_PM_CLK_PER, true, 0);
3273a2b5199SAnson Huang 	mmio_write_32(IMX_GPT_LPCG_BASE, mmio_read_32(IMX_GPT_LPCG_BASE) | (1 << 25));
328baa7650bSAnson Huang 
329baa7650bSAnson Huang 	/*
330baa7650bSAnson Huang 	 * create new partition for non-secure OS/Hypervisor
331baa7650bSAnson Huang 	 * uses global structs defined in sec_rsrc.h
332baa7650bSAnson Huang 	 */
333baa7650bSAnson Huang 	mx8_partition_resources();
334baa7650bSAnson Huang 
335baa7650bSAnson Huang 	bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET;
336baa7650bSAnson Huang 	bl33_image_ep_info.spsr = get_spsr_for_bl33_entry();
337baa7650bSAnson Huang 	SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);
338baa7650bSAnson Huang 
339baa7650bSAnson Huang 	/* init the first cluster's cci slave interface */
340baa7650bSAnson Huang 	cci_init(PLAT_CCI_BASE, imx8qm_cci_map, PLATFORM_CLUSTER_COUNT);
341baa7650bSAnson Huang 	cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr_el1()));
342baa7650bSAnson Huang }
343baa7650bSAnson Huang 
344baa7650bSAnson Huang void bl31_plat_arch_setup(void)
345baa7650bSAnson Huang {
346baa7650bSAnson Huang 	unsigned long ro_start = BL31_RO_START;
347baa7650bSAnson Huang 	unsigned long ro_size = BL31_RO_END - BL31_RO_START;
348baa7650bSAnson Huang 	unsigned long rw_start = BL31_RW_START;
349baa7650bSAnson Huang 	unsigned long rw_size = BL31_RW_END - BL31_RW_START;
350baa7650bSAnson Huang #if USE_COHERENT_MEM
351baa7650bSAnson Huang 	unsigned long coh_start = BL31_COHERENT_RAM_START;
352baa7650bSAnson Huang 	unsigned long coh_size = BL31_COHERENT_RAM_END - BL31_COHERENT_RAM_START;
353baa7650bSAnson Huang #endif
354baa7650bSAnson Huang 
355baa7650bSAnson Huang 	mmap_add_region(ro_start, ro_start, ro_size,
356baa7650bSAnson Huang 		MT_RO | MT_MEMORY | MT_SECURE);
357baa7650bSAnson Huang 	mmap_add_region(rw_start, rw_start, rw_size,
358baa7650bSAnson Huang 		MT_RW | MT_MEMORY | MT_SECURE);
359baa7650bSAnson Huang 	mmap_add(imx_mmap);
360baa7650bSAnson Huang 
361baa7650bSAnson Huang #if USE_COHERENT_MEM
362baa7650bSAnson Huang 	mmap_add_region(coh_start, coh_start, coh_size,
363baa7650bSAnson Huang 			MT_DEVICE | MT_RW | MT_SECURE);
364baa7650bSAnson Huang #endif
365baa7650bSAnson Huang 
366baa7650bSAnson Huang 	/* setup xlat table */
367baa7650bSAnson Huang 	init_xlat_tables();
368baa7650bSAnson Huang 	/* enable the MMU */
369baa7650bSAnson Huang 	enable_mmu_el3(0);
370baa7650bSAnson Huang }
371baa7650bSAnson Huang 
372baa7650bSAnson Huang void bl31_platform_setup(void)
373baa7650bSAnson Huang {
374baa7650bSAnson Huang 	plat_gic_driver_init();
375baa7650bSAnson Huang 	plat_gic_init();
376baa7650bSAnson Huang }
377baa7650bSAnson Huang 
378baa7650bSAnson Huang entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type)
379baa7650bSAnson Huang {
380baa7650bSAnson Huang 	if (type == NON_SECURE)
381baa7650bSAnson Huang 		return &bl33_image_ep_info;
382baa7650bSAnson Huang 	if (type == SECURE)
383baa7650bSAnson Huang 		return &bl32_image_ep_info;
384baa7650bSAnson Huang 
385baa7650bSAnson Huang 	return NULL;
386baa7650bSAnson Huang }
387baa7650bSAnson Huang 
388baa7650bSAnson Huang unsigned int plat_get_syscnt_freq2(void)
389baa7650bSAnson Huang {
390baa7650bSAnson Huang 	return COUNTER_FREQUENCY;
391baa7650bSAnson Huang }
392baa7650bSAnson Huang 
393baa7650bSAnson Huang void bl31_plat_runtime_setup(void)
394baa7650bSAnson Huang {
395baa7650bSAnson Huang 	return;
396baa7650bSAnson Huang }
397