1ab13adddSAndre Przywara /*
2*11dff599SAbhi.Singh * Copyright (c) 2015-2024, 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>
13dcf6d4f8SAndre 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>
16*11dff599SAbhi.Singh #include <drivers/generic_delay_timer.h>
17*11dff599SAbhi.Singh #include <plat/common/platform.h>
18ab13adddSAndre Przywara
194f2b9848SAndre Przywara #include <rpi_shared.h>
20ab13adddSAndre Przywara
21ab13adddSAndre Przywara /* Data structure which holds the extents of the trusted SRAM for BL1 */
22ab13adddSAndre Przywara static meminfo_t bl1_tzram_layout;
23ab13adddSAndre Przywara
bl1_plat_sec_mem_layout(void)24ab13adddSAndre Przywara meminfo_t *bl1_plat_sec_mem_layout(void)
25ab13adddSAndre Przywara {
26ab13adddSAndre Przywara return &bl1_tzram_layout;
27ab13adddSAndre Przywara }
28ab13adddSAndre Przywara
29ab13adddSAndre Przywara /*******************************************************************************
30ab13adddSAndre Przywara * Perform any BL1 specific platform actions.
31ab13adddSAndre Przywara ******************************************************************************/
bl1_early_platform_setup(void)32ab13adddSAndre Przywara void bl1_early_platform_setup(void)
33ab13adddSAndre Przywara {
34dcf6d4f8SAndre Przywara /* use the 19.2 MHz clock for the architected timer */
35dcf6d4f8SAndre Przywara mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_CONTROL_OFFSET, 0);
36dcf6d4f8SAndre Przywara mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_PRESCALER_OFFSET,
37dcf6d4f8SAndre Przywara 0x80000000);
38dcf6d4f8SAndre Przywara
39ab13adddSAndre Przywara /* Initialize the console to provide early debug support */
40795aefe5SAndre Przywara rpi3_console_init();
41ab13adddSAndre Przywara
42*11dff599SAbhi.Singh /*
43*11dff599SAbhi.Singh * Write the System Timer Frequency to CNTFRQ manually, this
44*11dff599SAbhi.Singh * is required to use the delay_timer functionality.
45*11dff599SAbhi.Singh */
46*11dff599SAbhi.Singh write_cntfrq_el0(plat_get_syscnt_freq2());
47*11dff599SAbhi.Singh
48*11dff599SAbhi.Singh /* Enable arch timer */
49*11dff599SAbhi.Singh generic_delay_timer_init();
50*11dff599SAbhi.Singh
51ab13adddSAndre Przywara /* Allow BL1 to see the whole Trusted RAM */
52ab13adddSAndre Przywara bl1_tzram_layout.total_base = BL_RAM_BASE;
53ab13adddSAndre Przywara bl1_tzram_layout.total_size = BL_RAM_SIZE;
54ab13adddSAndre Przywara }
55ab13adddSAndre Przywara
56ab13adddSAndre Przywara /******************************************************************************
57ab13adddSAndre Przywara * Perform the very early platform specific architecture setup. This only
58ab13adddSAndre Przywara * does basic initialization. Later architectural setup (bl1_arch_setup())
59ab13adddSAndre Przywara * does not do anything platform specific.
60ab13adddSAndre Przywara *****************************************************************************/
bl1_plat_arch_setup(void)61ab13adddSAndre Przywara void bl1_plat_arch_setup(void)
62ab13adddSAndre Przywara {
63ab13adddSAndre Przywara rpi3_setup_page_tables(bl1_tzram_layout.total_base,
64ab13adddSAndre Przywara bl1_tzram_layout.total_size,
65ab13adddSAndre Przywara BL_CODE_BASE, BL1_CODE_END,
66ab13adddSAndre Przywara BL1_RO_DATA_BASE, BL1_RO_DATA_END
67ab13adddSAndre Przywara #if USE_COHERENT_MEM
68ab13adddSAndre Przywara , BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END
69ab13adddSAndre Przywara #endif
70ab13adddSAndre Przywara );
71ab13adddSAndre Przywara
72ab13adddSAndre Przywara enable_mmu_el3(0);
73ab13adddSAndre Przywara }
74ab13adddSAndre Przywara
bl1_platform_setup(void)75ab13adddSAndre Przywara void bl1_platform_setup(void)
76ab13adddSAndre Przywara {
77ab13adddSAndre Przywara uint32_t __unused rev;
78ab13adddSAndre Przywara int __unused rc;
79ab13adddSAndre Przywara
80ab13adddSAndre Przywara rc = rpi3_vc_hardware_get_board_revision(&rev);
81ab13adddSAndre Przywara
82ab13adddSAndre Przywara if (rc == 0) {
83ab13adddSAndre Przywara const char __unused *model, __unused *info;
84ab13adddSAndre Przywara
85ab13adddSAndre Przywara switch (rev) {
86ab13adddSAndre Przywara case 0xA02082:
87ab13adddSAndre Przywara model = "Raspberry Pi 3 Model B";
88ab13adddSAndre Przywara info = "(1GB, Sony, UK)";
89ab13adddSAndre Przywara break;
90ab13adddSAndre Przywara case 0xA22082:
91ab13adddSAndre Przywara model = "Raspberry Pi 3 Model B";
92ab13adddSAndre Przywara info = "(1GB, Embest, China)";
93ab13adddSAndre Przywara break;
94ab13adddSAndre Przywara case 0xA020D3:
95ab13adddSAndre Przywara model = "Raspberry Pi 3 Model B+";
96ab13adddSAndre Przywara info = "(1GB, Sony, UK)";
97ab13adddSAndre Przywara break;
98ab13adddSAndre Przywara default:
99ab13adddSAndre Przywara model = "Unknown";
100ab13adddSAndre Przywara info = "(Unknown)";
101ab13adddSAndre Przywara ERROR("rpi3: Unknown board revision 0x%08x\n", rev);
102ab13adddSAndre Przywara break;
103ab13adddSAndre Przywara }
104ab13adddSAndre Przywara
105ab13adddSAndre Przywara NOTICE("rpi3: Detected: %s %s [0x%08x]\n", model, info, rev);
106ab13adddSAndre Przywara } else {
107ab13adddSAndre Przywara ERROR("rpi3: Unable to detect board revision\n");
108ab13adddSAndre Przywara }
109ab13adddSAndre Przywara
110ab13adddSAndre Przywara /* Initialise the IO layer and register platform IO devices */
111ab13adddSAndre Przywara plat_rpi3_io_setup();
112ab13adddSAndre Przywara }
113