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