xref: /rk3399_ARM-atf/plat/rpi/rpi3/rpi3_bl1_setup.c (revision dcf6d4f8edfe76b3a01cbb80549499444ff3c7bd)
1ab13adddSAndre Przywara /*
24f2b9848SAndre Przywara  * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
3ab13adddSAndre Przywara  *
4ab13adddSAndre Przywara  * SPDX-License-Identifier: BSD-3-Clause
5ab13adddSAndre Przywara  */
6ab13adddSAndre Przywara 
7ab13adddSAndre Przywara #include <platform_def.h>
8ab13adddSAndre Przywara 
9ab13adddSAndre Przywara #include <arch.h>
10ab13adddSAndre Przywara #include <arch_helpers.h>
11ab13adddSAndre Przywara #include <common/bl_common.h>
12ab13adddSAndre Przywara #include <common/debug.h>
13*dcf6d4f8SAndre Przywara #include <lib/mmio.h>
14ab13adddSAndre Przywara #include <lib/xlat_tables/xlat_mmu_helpers.h>
15ab13adddSAndre Przywara #include <lib/xlat_tables/xlat_tables_defs.h>
16ab13adddSAndre Przywara 
174f2b9848SAndre Przywara #include <rpi_shared.h>
18ab13adddSAndre Przywara 
19ab13adddSAndre Przywara /* Data structure which holds the extents of the trusted SRAM for BL1 */
20ab13adddSAndre Przywara static meminfo_t bl1_tzram_layout;
21ab13adddSAndre Przywara 
22ab13adddSAndre Przywara meminfo_t *bl1_plat_sec_mem_layout(void)
23ab13adddSAndre Przywara {
24ab13adddSAndre Przywara 	return &bl1_tzram_layout;
25ab13adddSAndre Przywara }
26ab13adddSAndre Przywara 
27ab13adddSAndre Przywara /*******************************************************************************
28ab13adddSAndre Przywara  * Perform any BL1 specific platform actions.
29ab13adddSAndre Przywara  ******************************************************************************/
30ab13adddSAndre Przywara void bl1_early_platform_setup(void)
31ab13adddSAndre Przywara {
32*dcf6d4f8SAndre Przywara 	/* use the 19.2 MHz clock for the architected timer */
33*dcf6d4f8SAndre Przywara 	mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_CONTROL_OFFSET, 0);
34*dcf6d4f8SAndre Przywara 	mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_PRESCALER_OFFSET,
35*dcf6d4f8SAndre Przywara 		      0x80000000);
36*dcf6d4f8SAndre Przywara 
37ab13adddSAndre Przywara 	/* Initialize the console to provide early debug support */
38ab13adddSAndre Przywara 	rpi3_console_init();
39ab13adddSAndre Przywara 
40ab13adddSAndre Przywara 	/* Allow BL1 to see the whole Trusted RAM */
41ab13adddSAndre Przywara 	bl1_tzram_layout.total_base = BL_RAM_BASE;
42ab13adddSAndre Przywara 	bl1_tzram_layout.total_size = BL_RAM_SIZE;
43ab13adddSAndre Przywara }
44ab13adddSAndre Przywara 
45ab13adddSAndre Przywara /******************************************************************************
46ab13adddSAndre Przywara  * Perform the very early platform specific architecture setup.  This only
47ab13adddSAndre Przywara  * does basic initialization. Later architectural setup (bl1_arch_setup())
48ab13adddSAndre Przywara  * does not do anything platform specific.
49ab13adddSAndre Przywara  *****************************************************************************/
50ab13adddSAndre Przywara void bl1_plat_arch_setup(void)
51ab13adddSAndre Przywara {
52ab13adddSAndre Przywara 	rpi3_setup_page_tables(bl1_tzram_layout.total_base,
53ab13adddSAndre Przywara 			       bl1_tzram_layout.total_size,
54ab13adddSAndre Przywara 			       BL_CODE_BASE, BL1_CODE_END,
55ab13adddSAndre Przywara 			       BL1_RO_DATA_BASE, BL1_RO_DATA_END
56ab13adddSAndre Przywara #if USE_COHERENT_MEM
57ab13adddSAndre Przywara 			       , BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END
58ab13adddSAndre Przywara #endif
59ab13adddSAndre Przywara 			      );
60ab13adddSAndre Przywara 
61ab13adddSAndre Przywara 	enable_mmu_el3(0);
62ab13adddSAndre Przywara }
63ab13adddSAndre Przywara 
64ab13adddSAndre Przywara void bl1_platform_setup(void)
65ab13adddSAndre Przywara {
66ab13adddSAndre Przywara 	uint32_t __unused rev;
67ab13adddSAndre Przywara 	int __unused rc;
68ab13adddSAndre Przywara 
69ab13adddSAndre Przywara 	rc = rpi3_vc_hardware_get_board_revision(&rev);
70ab13adddSAndre Przywara 
71ab13adddSAndre Przywara 	if (rc == 0) {
72ab13adddSAndre Przywara 		const char __unused *model, __unused *info;
73ab13adddSAndre Przywara 
74ab13adddSAndre Przywara 		switch (rev) {
75ab13adddSAndre Przywara 		case 0xA02082:
76ab13adddSAndre Przywara 			model = "Raspberry Pi 3 Model B";
77ab13adddSAndre Przywara 			info = "(1GB, Sony, UK)";
78ab13adddSAndre Przywara 			break;
79ab13adddSAndre Przywara 		case 0xA22082:
80ab13adddSAndre Przywara 			model = "Raspberry Pi 3 Model B";
81ab13adddSAndre Przywara 			info = "(1GB, Embest, China)";
82ab13adddSAndre Przywara 			break;
83ab13adddSAndre Przywara 		case 0xA020D3:
84ab13adddSAndre Przywara 			model = "Raspberry Pi 3 Model B+";
85ab13adddSAndre Przywara 			info = "(1GB, Sony, UK)";
86ab13adddSAndre Przywara 			break;
87ab13adddSAndre Przywara 		default:
88ab13adddSAndre Przywara 			model = "Unknown";
89ab13adddSAndre Przywara 			info = "(Unknown)";
90ab13adddSAndre Przywara 			ERROR("rpi3: Unknown board revision 0x%08x\n", rev);
91ab13adddSAndre Przywara 			break;
92ab13adddSAndre Przywara 		}
93ab13adddSAndre Przywara 
94ab13adddSAndre Przywara 		NOTICE("rpi3: Detected: %s %s [0x%08x]\n", model, info, rev);
95ab13adddSAndre Przywara 	} else {
96ab13adddSAndre Przywara 		ERROR("rpi3: Unable to detect board revision\n");
97ab13adddSAndre Przywara 	}
98ab13adddSAndre Przywara 
99ab13adddSAndre Przywara 	/* Initialise the IO layer and register platform IO devices */
100ab13adddSAndre Przywara 	plat_rpi3_io_setup();
101ab13adddSAndre Przywara }
102