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