xref: /rk3399_ARM-atf/plat/imx/imx8qm/imx8qm_bl31_setup.c (revision 3a2b51993d0c9666a6e1bdc4fd45a987ef6f1266)
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>
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 
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[] = {
52*3a2b5199SAnson Huang 	MAP_REGION_FLAT(IMX_REG_BASE, IMX_REG_SIZE, MT_DEVICE | MT_RW),
53baa7650bSAnson Huang 	{0}
54baa7650bSAnson Huang };
55baa7650bSAnson Huang 
56baa7650bSAnson Huang static uint32_t get_spsr_for_bl33_entry(void)
57baa7650bSAnson Huang {
58baa7650bSAnson Huang 	unsigned long el_status;
59baa7650bSAnson Huang 	unsigned long mode;
60baa7650bSAnson Huang 	uint32_t spsr;
61baa7650bSAnson Huang 
62baa7650bSAnson Huang 	/* figure out what mode we enter the non-secure world */
63baa7650bSAnson Huang 	el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT;
64baa7650bSAnson Huang 	el_status &= ID_AA64PFR0_ELX_MASK;
65baa7650bSAnson Huang 
66baa7650bSAnson Huang 	mode = (el_status) ? MODE_EL2 : MODE_EL1;
67baa7650bSAnson Huang 	spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS);
68baa7650bSAnson Huang 
69baa7650bSAnson Huang 	return spsr;
70baa7650bSAnson Huang }
71baa7650bSAnson Huang 
72baa7650bSAnson Huang #if DEBUG_CONSOLE_A53
73baa7650bSAnson Huang static void lpuart32_serial_setbrg(unsigned int base, int baudrate)
74baa7650bSAnson Huang {
75baa7650bSAnson Huang 	unsigned int sbr, osr, baud_diff, tmp_osr, tmp_sbr;
76baa7650bSAnson Huang 	unsigned int diff1, diff2, tmp, rate;
77baa7650bSAnson Huang 
78baa7650bSAnson Huang 	if (baudrate == 0)
79baa7650bSAnson Huang 		panic();
80baa7650bSAnson Huang 
81baa7650bSAnson Huang 	sc_pm_get_clock_rate(ipc_handle, SC_R_UART_0, 2, &rate);
82baa7650bSAnson Huang 
83baa7650bSAnson Huang 	baud_diff = baudrate;
84baa7650bSAnson Huang 	osr = 0;
85baa7650bSAnson Huang 	sbr = 0;
86baa7650bSAnson Huang 	for (tmp_osr = 4; tmp_osr <= 32; tmp_osr++) {
87baa7650bSAnson Huang 		tmp_sbr = (rate / (baudrate * tmp_osr));
88baa7650bSAnson Huang 		if (tmp_sbr == 0)
89baa7650bSAnson Huang 			tmp_sbr = 1;
90baa7650bSAnson Huang 
91baa7650bSAnson Huang 		/* calculate difference in actual baud w/ current values */
92baa7650bSAnson Huang 		diff1 = rate / (tmp_osr * tmp_sbr) - baudrate;
93baa7650bSAnson Huang 		diff2 = rate / (tmp_osr * (tmp_sbr + 1));
94baa7650bSAnson Huang 
95baa7650bSAnson Huang 		/* select best values between sbr and sbr+1 */
96baa7650bSAnson Huang 		if (diff1 > (baudrate - diff2)) {
97baa7650bSAnson Huang 			diff1 = baudrate - diff2;
98baa7650bSAnson Huang 			tmp_sbr++;
99baa7650bSAnson Huang 		}
100baa7650bSAnson Huang 
101baa7650bSAnson Huang 		if (diff1 <= baud_diff) {
102baa7650bSAnson Huang 			baud_diff = diff1;
103baa7650bSAnson Huang 			osr = tmp_osr;
104baa7650bSAnson Huang 			sbr = tmp_sbr;
105baa7650bSAnson Huang 		}
106baa7650bSAnson Huang 	}
107baa7650bSAnson Huang 
108baa7650bSAnson Huang 	tmp = mmio_read_32(IMX_BOOT_UART_BASE + BAUD);
109baa7650bSAnson Huang 
110baa7650bSAnson Huang 	if ((osr > 3) && (osr < 8))
111baa7650bSAnson Huang 		tmp |= LPUART_BAUD_BOTHEDGE_MASK;
112baa7650bSAnson Huang 
113baa7650bSAnson Huang 	tmp &= ~LPUART_BAUD_OSR_MASK;
114baa7650bSAnson Huang 	tmp |= LPUART_BAUD_OSR(osr - 1);
115baa7650bSAnson Huang 	tmp &= ~LPUART_BAUD_SBR_MASK;
116baa7650bSAnson Huang 	tmp |= LPUART_BAUD_SBR(sbr);
117baa7650bSAnson Huang 
118baa7650bSAnson Huang 	/* explicitly disable 10 bit mode & set 1 stop bit */
119baa7650bSAnson Huang 	tmp &= ~(LPUART_BAUD_M10_MASK | LPUART_BAUD_SBNS_MASK);
120baa7650bSAnson Huang 
121baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + BAUD, tmp);
122baa7650bSAnson Huang }
123baa7650bSAnson Huang 
124baa7650bSAnson Huang static int lpuart32_serial_init(unsigned int base)
125baa7650bSAnson Huang {
126baa7650bSAnson Huang 	unsigned int tmp;
127baa7650bSAnson Huang 
128baa7650bSAnson Huang 	/* disable TX & RX before enabling clocks */
129baa7650bSAnson Huang 	tmp = mmio_read_32(IMX_BOOT_UART_BASE + CTRL);
130baa7650bSAnson Huang 	tmp &= ~(CTRL_TE | CTRL_RE);
131baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + CTRL, tmp);
132baa7650bSAnson Huang 
133baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + MODIR, 0);
134baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + FIFO, ~(FIFO_TXFE | FIFO_RXFE));
135baa7650bSAnson Huang 
136baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + MATCH, 0);
137baa7650bSAnson Huang 
138baa7650bSAnson Huang 	/* provide data bits, parity, stop bit, etc */
139baa7650bSAnson Huang 	lpuart32_serial_setbrg(base, IMX_BOOT_UART_BAUDRATE);
140baa7650bSAnson Huang 
141baa7650bSAnson Huang 	/* eight data bits no parity bit */
142baa7650bSAnson Huang 	tmp = mmio_read_32(IMX_BOOT_UART_BASE + CTRL);
143baa7650bSAnson Huang 	tmp &= ~(LPUART_CTRL_PE_MASK | LPUART_CTRL_PT_MASK | LPUART_CTRL_M_MASK);
144baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + CTRL, tmp);
145baa7650bSAnson Huang 
146baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + CTRL, CTRL_RE | CTRL_TE);
147baa7650bSAnson Huang 
148baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x55);
149baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x55);
150baa7650bSAnson Huang 	mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x0A);
151baa7650bSAnson Huang 
152baa7650bSAnson Huang 	return 0;
153baa7650bSAnson Huang }
154baa7650bSAnson Huang #endif
155baa7650bSAnson Huang 
156baa7650bSAnson Huang void mx8_partition_resources(void)
157baa7650bSAnson Huang {
158baa7650bSAnson Huang 	sc_rm_pt_t secure_part, os_part;
159baa7650bSAnson Huang 	sc_rm_mr_t mr, mr_record = 64;
160baa7650bSAnson Huang 	sc_faddr_t start, end;
161baa7650bSAnson Huang 	bool owned, owned2;
162baa7650bSAnson Huang 	sc_err_t err;
163baa7650bSAnson Huang 	int i;
164baa7650bSAnson Huang 
165baa7650bSAnson Huang 	err = sc_rm_get_partition(ipc_handle, &secure_part);
166baa7650bSAnson Huang 
167baa7650bSAnson Huang 	err = sc_rm_partition_alloc(ipc_handle, &os_part, false, false,
168baa7650bSAnson Huang 		false, false, false);
169baa7650bSAnson Huang 
170baa7650bSAnson Huang 	err = sc_rm_set_parent(ipc_handle, os_part, secure_part);
171baa7650bSAnson Huang 
172baa7650bSAnson Huang 	/* set secure resources to NOT-movable */
173baa7650bSAnson Huang 	for (i = 0; i < ARRAY_SIZE(secure_rsrcs); i++) {
174baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, secure_rsrcs[i],
175baa7650bSAnson Huang 			secure_rsrcs[i], false);
176baa7650bSAnson Huang 		if (err)
177baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
178baa7650bSAnson Huang 				secure_rsrcs[i], err);
179baa7650bSAnson Huang 	}
180baa7650bSAnson Huang 
181baa7650bSAnson Huang 	owned = sc_rm_is_resource_owned(ipc_handle, SC_R_M4_0_PID0);
182baa7650bSAnson Huang 	if (owned) {
183baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_0_PID0,
184baa7650bSAnson Huang 				SC_R_M4_0_PID0, false);
185baa7650bSAnson Huang 		if (err)
186baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
187baa7650bSAnson Huang 				SC_R_M4_0_PID0, err);
188baa7650bSAnson Huang 	}
189baa7650bSAnson Huang 
190baa7650bSAnson Huang 	owned2 = sc_rm_is_resource_owned(ipc_handle, SC_R_M4_1_PID0);
191baa7650bSAnson Huang 	if (owned2) {
192baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_1_PID0,
193baa7650bSAnson Huang 				SC_R_M4_1_PID0, false);
194baa7650bSAnson Huang 		if (err)
195baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
196baa7650bSAnson Huang 				SC_R_M4_1_PID0, err);
197baa7650bSAnson Huang 	}
198baa7650bSAnson Huang 	/* move all movable resources and pins to non-secure partition */
199baa7650bSAnson Huang 	err = sc_rm_move_all(ipc_handle, secure_part, os_part, true, true);
200baa7650bSAnson Huang 	if (err)
201baa7650bSAnson Huang 		ERROR("sc_rm_move_all: %u\n", err);
202baa7650bSAnson Huang 
203baa7650bSAnson Huang 	/* iterate through peripherals to give NS OS part access */
204baa7650bSAnson Huang 	for (i = 0; i < ARRAY_SIZE(ns_access_allowed); i++) {
205baa7650bSAnson Huang 		err = sc_rm_set_peripheral_permissions(ipc_handle, ns_access_allowed[i],
206baa7650bSAnson Huang 			os_part, SC_RM_PERM_FULL);
207baa7650bSAnson Huang 		if (err)
208baa7650bSAnson Huang 			ERROR("sc_rm_set_peripheral_permissions: rsrc %u, \
209baa7650bSAnson Huang 				ret %u\n", ns_access_allowed[i], err);
210baa7650bSAnson Huang 	}
211baa7650bSAnson Huang 
212baa7650bSAnson Huang 	if (owned) {
213baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_0_PID0,
214baa7650bSAnson Huang 				SC_R_M4_0_PID0, true);
215baa7650bSAnson Huang 		if (err)
216baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
217baa7650bSAnson Huang 				SC_R_M4_0_PID0, err);
218baa7650bSAnson Huang 		err = sc_rm_assign_resource(ipc_handle, os_part, SC_R_M4_0_PID0);
219baa7650bSAnson Huang 		if (err)
220baa7650bSAnson Huang 			ERROR("sc_rm_assign_resource: rsrc %u, ret %u\n",
221baa7650bSAnson Huang 				SC_R_M4_0_PID0, err);
222baa7650bSAnson Huang 	}
223baa7650bSAnson Huang 	if (owned2) {
224baa7650bSAnson Huang 		err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_1_PID0,
225baa7650bSAnson Huang 				SC_R_M4_1_PID0, true);
226baa7650bSAnson Huang 		if (err)
227baa7650bSAnson Huang 			ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n",
228baa7650bSAnson Huang 				SC_R_M4_1_PID0, err);
229baa7650bSAnson Huang 		err = sc_rm_assign_resource(ipc_handle, os_part, SC_R_M4_1_PID0);
230baa7650bSAnson Huang 		if (err)
231baa7650bSAnson Huang 			ERROR("sc_rm_assign_resource: rsrc %u, ret %u\n",
232baa7650bSAnson Huang 				SC_R_M4_1_PID0, err);
233baa7650bSAnson Huang 	}
234baa7650bSAnson Huang 
235baa7650bSAnson Huang 	/*
236baa7650bSAnson Huang 	 * sc_rm_set_peripheral_permissions
237baa7650bSAnson Huang 	 * sc_rm_set_memreg_permissions
238baa7650bSAnson Huang 	 * sc_rm_set_pin_movable
239baa7650bSAnson Huang 	 */
240baa7650bSAnson Huang 
241baa7650bSAnson Huang 	for (mr = 0; mr < 64; mr++) {
242baa7650bSAnson Huang 		owned = sc_rm_is_memreg_owned(ipc_handle, mr);
243baa7650bSAnson Huang 		if (owned) {
244baa7650bSAnson Huang 			err = sc_rm_get_memreg_info(ipc_handle, mr, &start, &end);
245baa7650bSAnson Huang 			if (err)
246baa7650bSAnson Huang 				ERROR("Memreg get info failed, %u\n", mr);
247baa7650bSAnson Huang 			NOTICE("Memreg %u 0x%llx -- 0x%llx\n", mr, start, end);
248baa7650bSAnson Huang 			if (BL31_BASE >= start && (BL31_LIMIT - 1) <= end) {
249baa7650bSAnson Huang 				mr_record = mr; /* Record the mr for ATF running */
250baa7650bSAnson Huang 			} else {
251baa7650bSAnson Huang 				err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
252baa7650bSAnson Huang 				if (err)
253baa7650bSAnson Huang 					ERROR("Memreg assign failed, 0x%llx -- 0x%llx, \
254baa7650bSAnson Huang 						err %d\n", start, end, err);
255baa7650bSAnson Huang 			}
256baa7650bSAnson Huang 		}
257baa7650bSAnson Huang 	}
258baa7650bSAnson Huang 
259baa7650bSAnson Huang 	if (mr_record != 64) {
260baa7650bSAnson Huang 		err = sc_rm_get_memreg_info(ipc_handle, mr_record, &start, &end);
261baa7650bSAnson Huang 		if (err)
262baa7650bSAnson Huang 			ERROR("Memreg get info failed, %u\n", mr_record);
263baa7650bSAnson Huang 		if ((BL31_LIMIT - 1) < end) {
264baa7650bSAnson Huang 			err = sc_rm_memreg_alloc(ipc_handle, &mr, BL31_LIMIT, end);
265baa7650bSAnson Huang 			if (err)
266baa7650bSAnson Huang 				ERROR("sc_rm_memreg_alloc failed, 0x%llx -- 0x%llx\n",
267baa7650bSAnson Huang 					(sc_faddr_t)BL31_LIMIT, end);
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\n",
271baa7650bSAnson Huang 					(sc_faddr_t)BL31_LIMIT, end);
272baa7650bSAnson Huang 		}
273baa7650bSAnson Huang 
274baa7650bSAnson Huang 		if (start < (BL31_BASE - 1)) {
275baa7650bSAnson Huang 			err = sc_rm_memreg_alloc(ipc_handle, &mr, start, BL31_BASE - 1);
276baa7650bSAnson Huang 			if (err)
277baa7650bSAnson Huang 				ERROR("sc_rm_memreg_alloc failed, 0x%llx -- 0x%llx\n",
278baa7650bSAnson Huang 					start, (sc_faddr_t)BL31_BASE - 1);
279baa7650bSAnson Huang 			err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
280baa7650bSAnson Huang 				if (err)
281baa7650bSAnson Huang 					ERROR("Memreg assign failed, 0x%llx -- 0x%llx\n",
282baa7650bSAnson Huang 						start, (sc_faddr_t)BL31_BASE - 1);
283baa7650bSAnson Huang 		}
284baa7650bSAnson Huang 	}
285baa7650bSAnson Huang 
286baa7650bSAnson Huang 	if (err)
287baa7650bSAnson Huang 		NOTICE("Partitioning Failed\n");
288baa7650bSAnson Huang 	else
289baa7650bSAnson Huang 		NOTICE("Non-secure Partitioning Succeeded\n");
290baa7650bSAnson Huang 
291baa7650bSAnson Huang }
292baa7650bSAnson Huang 
293601d2f3cSAntonio Nino Diaz void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
294601d2f3cSAntonio Nino Diaz 				u_register_t arg2, u_register_t arg3)
295baa7650bSAnson Huang {
296baa7650bSAnson Huang #if DEBUG_CONSOLE
297baa7650bSAnson Huang 	static console_lpuart_t console;
298baa7650bSAnson Huang #endif
299baa7650bSAnson Huang 	if (sc_ipc_open(&ipc_handle, SC_IPC_BASE) != SC_ERR_NONE)
300baa7650bSAnson Huang 		panic();
301baa7650bSAnson Huang 
302baa7650bSAnson Huang #if DEBUG_CONSOLE_A53
303baa7650bSAnson Huang 	sc_pm_set_resource_power_mode(ipc_handle, SC_R_UART_0, SC_PM_PW_MODE_ON);
304baa7650bSAnson Huang 	sc_pm_clock_rate_t rate = 80000000;
305baa7650bSAnson Huang 	sc_pm_set_clock_rate(ipc_handle, SC_R_UART_0, 2, &rate);
306baa7650bSAnson Huang 	sc_pm_clock_enable(ipc_handle, SC_R_UART_0, 2, true, false);
307baa7650bSAnson Huang 
308baa7650bSAnson Huang 	/* configure UART pads */
309baa7650bSAnson Huang 	sc_pad_set(ipc_handle, SC_P_UART0_RX, UART_PAD_CTRL);
310baa7650bSAnson Huang 	sc_pad_set(ipc_handle, SC_P_UART0_TX, UART_PAD_CTRL);
311baa7650bSAnson Huang 	sc_pad_set(ipc_handle, SC_P_UART0_RTS_B, UART_PAD_CTRL);
312baa7650bSAnson Huang 	sc_pad_set(ipc_handle, SC_P_UART0_CTS_B, UART_PAD_CTRL);
313baa7650bSAnson Huang 	lpuart32_serial_init(IMX_BOOT_UART_BASE);
314baa7650bSAnson Huang #endif
315baa7650bSAnson Huang 
316baa7650bSAnson Huang #if DEBUG_CONSOLE
317baa7650bSAnson Huang 	console_lpuart_register(IMX_BOOT_UART_BASE, IMX_BOOT_UART_CLK_IN_HZ,
318baa7650bSAnson Huang 		     IMX_CONSOLE_BAUDRATE, &console);
319baa7650bSAnson Huang #endif
320baa7650bSAnson Huang 
321baa7650bSAnson Huang 	/* turn on MU1 for non-secure OS/Hypervisor */
322baa7650bSAnson Huang 	sc_pm_set_resource_power_mode(ipc_handle, SC_R_MU_1A, SC_PM_PW_MODE_ON);
323*3a2b5199SAnson Huang 	/* Turn on GPT_0's power & clock for non-secure OS/Hypervisor */
324*3a2b5199SAnson Huang 	sc_pm_set_resource_power_mode(ipc_handle, SC_R_GPT_0, SC_PM_PW_MODE_ON);
325*3a2b5199SAnson Huang 	sc_pm_clock_enable(ipc_handle, SC_R_GPT_0, SC_PM_CLK_PER, true, 0);
326*3a2b5199SAnson Huang 	mmio_write_32(IMX_GPT_LPCG_BASE, mmio_read_32(IMX_GPT_LPCG_BASE) | (1 << 25));
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