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