xref: /rk3399_ARM-atf/plat/amlogic/gxbb/gxbb_common.c (revision 9158854a58bbff71dbf926814e7addfdae94f4b1)
14a079c75SCarlo Caione /*
24a079c75SCarlo Caione  * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved.
34a079c75SCarlo Caione  *
44a079c75SCarlo Caione  * SPDX-License-Identifier: BSD-3-Clause
54a079c75SCarlo Caione  */
64a079c75SCarlo Caione 
74a079c75SCarlo Caione #include <assert.h>
84a079c75SCarlo Caione #include <stdint.h>
94a079c75SCarlo Caione 
104a079c75SCarlo Caione #include <platform_def.h>
114a079c75SCarlo Caione 
124a079c75SCarlo Caione #include <bl31/interrupt_mgmt.h>
134a079c75SCarlo Caione #include <common/bl_common.h>
144a079c75SCarlo Caione #include <common/debug.h>
154a079c75SCarlo Caione #include <common/ep_info.h>
164a079c75SCarlo Caione #include <drivers/amlogic/meson_console.h>
174a079c75SCarlo Caione #include <lib/mmio.h>
184a079c75SCarlo Caione #include <lib/xlat_tables/xlat_tables_v2.h>
194a079c75SCarlo Caione 
204a079c75SCarlo Caione /*******************************************************************************
214a079c75SCarlo Caione  * Platform memory map regions
224a079c75SCarlo Caione  ******************************************************************************/
23*9158854aSCarlo Caione #define MAP_NSDRAM0	MAP_REGION_FLAT(AML_NSDRAM0_BASE,		\
24*9158854aSCarlo Caione 					AML_NSDRAM0_SIZE,		\
254a079c75SCarlo Caione 					MT_MEMORY | MT_RW | MT_NS)
264a079c75SCarlo Caione 
27*9158854aSCarlo Caione #define MAP_NSDRAM1	MAP_REGION_FLAT(AML_NSDRAM1_BASE,		\
28*9158854aSCarlo Caione 					AML_NSDRAM1_SIZE,		\
294a079c75SCarlo Caione 					MT_MEMORY | MT_RW | MT_NS)
304a079c75SCarlo Caione 
31*9158854aSCarlo Caione #define MAP_SEC_DEVICE0	MAP_REGION_FLAT(AML_SEC_DEVICE0_BASE,		\
32*9158854aSCarlo Caione 					AML_SEC_DEVICE0_SIZE,		\
334a079c75SCarlo Caione 					MT_DEVICE | MT_RW | MT_SECURE)
344a079c75SCarlo Caione 
35*9158854aSCarlo Caione #define MAP_SEC_DEVICE1	MAP_REGION_FLAT(AML_SEC_DEVICE1_BASE,		\
36*9158854aSCarlo Caione 					AML_SEC_DEVICE1_SIZE,		\
374a079c75SCarlo Caione 					MT_DEVICE | MT_RW | MT_SECURE)
384a079c75SCarlo Caione 
39*9158854aSCarlo Caione #define MAP_TZRAM	MAP_REGION_FLAT(AML_TZRAM_BASE,		\
40*9158854aSCarlo Caione 					AML_TZRAM_SIZE,		\
414a079c75SCarlo Caione 					MT_DEVICE | MT_RW | MT_SECURE)
424a079c75SCarlo Caione 
43*9158854aSCarlo Caione #define MAP_SEC_DEVICE2	MAP_REGION_FLAT(AML_SEC_DEVICE2_BASE,		\
44*9158854aSCarlo Caione 					AML_SEC_DEVICE2_SIZE,		\
454a079c75SCarlo Caione 					MT_DEVICE | MT_RW | MT_SECURE)
464a079c75SCarlo Caione 
47*9158854aSCarlo Caione #define MAP_SEC_DEVICE3	MAP_REGION_FLAT(AML_SEC_DEVICE3_BASE,		\
48*9158854aSCarlo Caione 					AML_SEC_DEVICE3_SIZE,		\
494a079c75SCarlo Caione 					MT_DEVICE | MT_RW | MT_SECURE)
504a079c75SCarlo Caione 
514a079c75SCarlo Caione static const mmap_region_t gxbb_mmap[] = {
524a079c75SCarlo Caione 	MAP_NSDRAM0,
534a079c75SCarlo Caione 	MAP_NSDRAM1,
544a079c75SCarlo Caione 	MAP_SEC_DEVICE0,
554a079c75SCarlo Caione 	MAP_SEC_DEVICE1,
564a079c75SCarlo Caione 	MAP_TZRAM,
574a079c75SCarlo Caione 	MAP_SEC_DEVICE2,
584a079c75SCarlo Caione 	MAP_SEC_DEVICE3,
594a079c75SCarlo Caione 	{0}
604a079c75SCarlo Caione };
614a079c75SCarlo Caione 
624a079c75SCarlo Caione /*******************************************************************************
634a079c75SCarlo Caione  * Per-image regions
644a079c75SCarlo Caione  ******************************************************************************/
654a079c75SCarlo Caione #define MAP_BL31	MAP_REGION_FLAT(BL31_BASE,			\
664a079c75SCarlo Caione 				BL31_END - BL31_BASE,			\
674a079c75SCarlo Caione 				MT_MEMORY | MT_RW | MT_SECURE)
684a079c75SCarlo Caione 
694a079c75SCarlo Caione #define MAP_BL_CODE	MAP_REGION_FLAT(BL_CODE_BASE,			\
704a079c75SCarlo Caione 				BL_CODE_END - BL_CODE_BASE,		\
714a079c75SCarlo Caione 				MT_CODE | MT_SECURE)
724a079c75SCarlo Caione 
734a079c75SCarlo Caione #define MAP_BL_RO_DATA	MAP_REGION_FLAT(BL_RO_DATA_BASE,		\
744a079c75SCarlo Caione 				BL_RO_DATA_END - BL_RO_DATA_BASE,	\
754a079c75SCarlo Caione 				MT_RO_DATA | MT_SECURE)
764a079c75SCarlo Caione 
774a079c75SCarlo Caione #define MAP_BL_COHERENT	MAP_REGION_FLAT(BL_COHERENT_RAM_BASE,		\
784a079c75SCarlo Caione 				BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE, \
794a079c75SCarlo Caione 				MT_DEVICE | MT_RW | MT_SECURE)
804a079c75SCarlo Caione 
814a079c75SCarlo Caione /*******************************************************************************
824a079c75SCarlo Caione  * Function that sets up the translation tables.
834a079c75SCarlo Caione  ******************************************************************************/
84010fdc1bSCarlo Caione void aml_setup_page_tables(void)
854a079c75SCarlo Caione {
864a079c75SCarlo Caione #if IMAGE_BL31
874a079c75SCarlo Caione 	const mmap_region_t gxbb_bl_mmap[] = {
884a079c75SCarlo Caione 		MAP_BL31,
894a079c75SCarlo Caione 		MAP_BL_CODE,
904a079c75SCarlo Caione 		MAP_BL_RO_DATA,
914a079c75SCarlo Caione #if USE_COHERENT_MEM
924a079c75SCarlo Caione 		MAP_BL_COHERENT,
934a079c75SCarlo Caione #endif
944a079c75SCarlo Caione 		{0}
954a079c75SCarlo Caione 	};
964a079c75SCarlo Caione #endif
974a079c75SCarlo Caione 
984a079c75SCarlo Caione 	mmap_add(gxbb_bl_mmap);
994a079c75SCarlo Caione 
1004a079c75SCarlo Caione 	mmap_add(gxbb_mmap);
1014a079c75SCarlo Caione 
1024a079c75SCarlo Caione 	init_xlat_tables();
1034a079c75SCarlo Caione }
1044a079c75SCarlo Caione 
1054a079c75SCarlo Caione /*******************************************************************************
1064a079c75SCarlo Caione  * Function that sets up the console
1074a079c75SCarlo Caione  ******************************************************************************/
1084a079c75SCarlo Caione static console_meson_t gxbb_console;
1094a079c75SCarlo Caione 
110010fdc1bSCarlo Caione void aml_console_init(void)
1114a079c75SCarlo Caione {
112f681c676SCarlo Caione 	int rc = console_meson_register(AML_UART0_AO_BASE,
113f681c676SCarlo Caione 					AML_UART0_AO_CLK_IN_HZ,
114f681c676SCarlo Caione 					AML_UART_BAUDRATE,
1154a079c75SCarlo Caione 					&gxbb_console);
1164a079c75SCarlo Caione 	if (rc == 0) {
1174a079c75SCarlo Caione 		/*
1184a079c75SCarlo Caione 		 * The crash console doesn't use the multi console API, it uses
1194a079c75SCarlo Caione 		 * the core console functions directly. It is safe to call panic
1204a079c75SCarlo Caione 		 * and let it print debug information.
1214a079c75SCarlo Caione 		 */
1224a079c75SCarlo Caione 		panic();
1234a079c75SCarlo Caione 	}
1244a079c75SCarlo Caione 
1254a079c75SCarlo Caione 	console_set_scope(&gxbb_console.console,
1264a079c75SCarlo Caione 			  CONSOLE_FLAG_BOOT | CONSOLE_FLAG_RUNTIME);
1274a079c75SCarlo Caione }
1284a079c75SCarlo Caione 
1294a079c75SCarlo Caione /*******************************************************************************
1304a079c75SCarlo Caione  * Function that returns the system counter frequency
1314a079c75SCarlo Caione  ******************************************************************************/
1324a079c75SCarlo Caione unsigned int plat_get_syscnt_freq2(void)
1334a079c75SCarlo Caione {
1344a079c75SCarlo Caione 	uint32_t val;
1354a079c75SCarlo Caione 
136*9158854aSCarlo Caione 	val = mmio_read_32(AML_SYS_CPU_CFG7);
1374a079c75SCarlo Caione 	val &= 0xFDFFFFFF;
138*9158854aSCarlo Caione 	mmio_write_32(AML_SYS_CPU_CFG7, val);
1394a079c75SCarlo Caione 
140*9158854aSCarlo Caione 	val = mmio_read_32(AML_AO_TIMESTAMP_CNTL);
1414a079c75SCarlo Caione 	val &= 0xFFFFFE00;
142*9158854aSCarlo Caione 	mmio_write_32(AML_AO_TIMESTAMP_CNTL, val);
1434a079c75SCarlo Caione 
144*9158854aSCarlo Caione 	return AML_OSC24M_CLK_IN_HZ;
1454a079c75SCarlo Caione }
146