xref: /rk3399_ARM-atf/plat/rpi/rpi3/rpi3_bl2_setup.c (revision 7e848540159ba8fbb0577c76e4dc0c5bbc542489)
1ab13adddSAndre Przywara /*
2*c4c9e2bcSAbhi Singh  * Copyright (c) 2015-2025, ARM Limited and Contributors. All rights reserved.
3ab13adddSAndre Przywara  *
4ab13adddSAndre Przywara  * SPDX-License-Identifier: BSD-3-Clause
5ab13adddSAndre Przywara  */
6ab13adddSAndre Przywara 
7ab13adddSAndre Przywara #include <assert.h>
8ab13adddSAndre Przywara 
9*c4c9e2bcSAbhi Singh #include "./include/rpi3_measured_boot.h"
10ab13adddSAndre Przywara 
11ab13adddSAndre Przywara #include <arch_helpers.h>
12ab13adddSAndre Przywara #include <common/bl_common.h>
13ab13adddSAndre Przywara #include <common/debug.h>
14ab13adddSAndre Przywara #include <common/desc_image_load.h>
15ab13adddSAndre Przywara #include <lib/optee_utils.h>
16ab13adddSAndre Przywara #include <lib/xlat_tables/xlat_mmu_helpers.h>
17ab13adddSAndre Przywara #include <lib/xlat_tables/xlat_tables_defs.h>
18ab13adddSAndre Przywara #include <drivers/generic_delay_timer.h>
19ab13adddSAndre Przywara #include <drivers/rpi3/gpio/rpi3_gpio.h>
20ab13adddSAndre Przywara #include <drivers/rpi3/sdhost/rpi3_sdhost.h>
21*c4c9e2bcSAbhi Singh #include <platform_def.h>
22ab13adddSAndre Przywara 
234f2b9848SAndre Przywara #include <rpi_shared.h>
24ab13adddSAndre Przywara 
25ab13adddSAndre Przywara /* Data structure which holds the extents of the trusted SRAM for BL2 */
26ab13adddSAndre Przywara static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
27ab13adddSAndre Przywara 
28ab13adddSAndre Przywara /* Data structure which holds the MMC info */
29ab13adddSAndre Przywara static struct mmc_device_info mmc_info;
30ab13adddSAndre Przywara 
31*c4c9e2bcSAbhi Singh /* Variables that hold the eventlog addr and size for use in BL2 Measured Boot */
32*c4c9e2bcSAbhi Singh static uint8_t *event_log_start;
33*c4c9e2bcSAbhi Singh static size_t event_log_size;
34*c4c9e2bcSAbhi Singh 
rpi3_sdhost_setup(void)35ab13adddSAndre Przywara static void rpi3_sdhost_setup(void)
36ab13adddSAndre Przywara {
37ab13adddSAndre Przywara 	struct rpi3_sdhost_params params;
38ab13adddSAndre Przywara 
39ab13adddSAndre Przywara 	memset(&params, 0, sizeof(struct rpi3_sdhost_params));
40ab13adddSAndre Przywara 	params.reg_base = RPI3_SDHOST_BASE;
41ab13adddSAndre Przywara 	params.bus_width = MMC_BUS_WIDTH_1;
42ab13adddSAndre Przywara 	params.clk_rate = 50000000;
43bd96d533SRob Newberry 	params.clk_rate_initial = (RPI3_SDHOST_MAX_CLOCK / HC_CLOCKDIVISOR_MAXVAL);
44ab13adddSAndre Przywara 	mmc_info.mmc_dev_type = MMC_IS_SD_HC;
45bd96d533SRob Newberry 	mmc_info.ocr_voltage = OCR_3_2_3_3 | OCR_3_3_3_4;
46ab13adddSAndre Przywara 	rpi3_sdhost_init(&params, &mmc_info);
47ab13adddSAndre Przywara }
48ab13adddSAndre Przywara 
rpi3_mboot_fetch_eventlog_info(uint8_t ** eventlog_addr,size_t * eventlog_size)49*c4c9e2bcSAbhi Singh void rpi3_mboot_fetch_eventlog_info(uint8_t **eventlog_addr, size_t *eventlog_size)
50*c4c9e2bcSAbhi Singh {
51*c4c9e2bcSAbhi Singh 	*eventlog_addr = event_log_start;
52*c4c9e2bcSAbhi Singh 	*eventlog_size = event_log_size;
53*c4c9e2bcSAbhi Singh }
54*c4c9e2bcSAbhi Singh 
55ab13adddSAndre Przywara /*******************************************************************************
56ab13adddSAndre Przywara  * BL1 has passed the extents of the trusted SRAM that should be visible to BL2
57ab13adddSAndre Przywara  * in x0. This memory layout is sitting at the base of the free trusted SRAM.
58ab13adddSAndre Przywara  * Copy it to a safe location before its reclaimed by later BL2 functionality.
59ab13adddSAndre Przywara  ******************************************************************************/
60ab13adddSAndre Przywara 
bl2_early_platform_setup2(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)61ab13adddSAndre Przywara void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1,
62ab13adddSAndre Przywara 			       u_register_t arg2, u_register_t arg3)
63ab13adddSAndre Przywara {
64ab13adddSAndre Przywara 	meminfo_t *mem_layout = (meminfo_t *) arg1;
65ab13adddSAndre Przywara 
66ab13adddSAndre Przywara 	/* Initialize the console to provide early debug support */
67795aefe5SAndre Przywara 	rpi3_console_init();
68ab13adddSAndre Przywara 
69ab13adddSAndre Przywara 	/* Enable arch timer */
70ab13adddSAndre Przywara 	generic_delay_timer_init();
71ab13adddSAndre Przywara 
72ab13adddSAndre Przywara 	/* Setup GPIO driver */
730d92745eSAndre Przywara 	rpi3_gpio_init();
74ab13adddSAndre Przywara 
75ab13adddSAndre Przywara 	/* Setup the BL2 memory layout */
76ab13adddSAndre Przywara 	bl2_tzram_layout = *mem_layout;
77ab13adddSAndre Przywara 
78ab13adddSAndre Przywara 	/* Setup SDHost driver */
79ab13adddSAndre Przywara 	rpi3_sdhost_setup();
80ab13adddSAndre Przywara 
81*c4c9e2bcSAbhi Singh 	/* populate eventlog addr and size for use in bl2 mboot */
82*c4c9e2bcSAbhi Singh 	event_log_start = (uint8_t *)(uintptr_t)arg2;
83*c4c9e2bcSAbhi Singh 	event_log_size = arg3;
84*c4c9e2bcSAbhi Singh 
85ab13adddSAndre Przywara 	plat_rpi3_io_setup();
86ab13adddSAndre Przywara }
87ab13adddSAndre Przywara 
bl2_platform_setup(void)88ab13adddSAndre Przywara void bl2_platform_setup(void)
89ab13adddSAndre Przywara {
90ab13adddSAndre Przywara 	/*
91ab13adddSAndre Przywara 	 * This is where a TrustZone address space controller and other
92ab13adddSAndre Przywara 	 * security related peripherals would be configured.
93ab13adddSAndre Przywara 	 */
94ab13adddSAndre Przywara }
95ab13adddSAndre Przywara 
96ab13adddSAndre Przywara /*******************************************************************************
97ab13adddSAndre Przywara  * Perform the very early platform specific architectural setup here.
98ab13adddSAndre Przywara  ******************************************************************************/
bl2_plat_arch_setup(void)99ab13adddSAndre Przywara void bl2_plat_arch_setup(void)
100ab13adddSAndre Przywara {
101ab13adddSAndre Przywara 	rpi3_setup_page_tables(bl2_tzram_layout.total_base,
102ab13adddSAndre Przywara 			       bl2_tzram_layout.total_size,
103ab13adddSAndre Przywara 			       BL_CODE_BASE, BL_CODE_END,
104ab13adddSAndre Przywara 			       BL_RO_DATA_BASE, BL_RO_DATA_END
105ab13adddSAndre Przywara #if USE_COHERENT_MEM
106ab13adddSAndre Przywara 			       , BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END
107ab13adddSAndre Przywara #endif
108ab13adddSAndre Przywara 			      );
109ab13adddSAndre Przywara 
110ab13adddSAndre Przywara 	enable_mmu_el1(0);
111ab13adddSAndre Przywara }
112ab13adddSAndre Przywara 
113ab13adddSAndre Przywara /*******************************************************************************
114ab13adddSAndre Przywara  * This function can be used by the platforms to update/use image
115ab13adddSAndre Przywara  * information for given `image_id`.
116ab13adddSAndre Przywara  ******************************************************************************/
bl2_plat_handle_post_image_load(unsigned int image_id)117ab13adddSAndre Przywara int bl2_plat_handle_post_image_load(unsigned int image_id)
118ab13adddSAndre Przywara {
119ab13adddSAndre Przywara 	int err = 0;
120ab13adddSAndre Przywara 	bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
121ab13adddSAndre Przywara #ifdef SPD_opteed
122ab13adddSAndre Przywara 	bl_mem_params_node_t *pager_mem_params = NULL;
123ab13adddSAndre Przywara 	bl_mem_params_node_t *paged_mem_params = NULL;
124ab13adddSAndre Przywara #endif
125ab13adddSAndre Przywara 
126ab13adddSAndre Przywara 	assert(bl_mem_params != NULL);
127ab13adddSAndre Przywara 
128ab13adddSAndre Przywara 	switch (image_id) {
129ab13adddSAndre Przywara 	case BL32_IMAGE_ID:
130ab13adddSAndre Przywara #ifdef SPD_opteed
131ab13adddSAndre Przywara 		pager_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID);
132ab13adddSAndre Przywara 		assert(pager_mem_params);
133ab13adddSAndre Przywara 
134ab13adddSAndre Przywara 		paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID);
135ab13adddSAndre Przywara 		assert(paged_mem_params);
136ab13adddSAndre Przywara 
137ab13adddSAndre Przywara 		err = parse_optee_header(&bl_mem_params->ep_info,
138ab13adddSAndre Przywara 				&pager_mem_params->image_info,
139ab13adddSAndre Przywara 				&paged_mem_params->image_info);
140ab13adddSAndre Przywara 		if (err != 0)
141ab13adddSAndre Przywara 			WARN("OPTEE header parse error.\n");
142ab13adddSAndre Przywara #endif
143ab13adddSAndre Przywara 		bl_mem_params->ep_info.spsr = rpi3_get_spsr_for_bl32_entry();
144ab13adddSAndre Przywara 		break;
145ab13adddSAndre Przywara 
146ab13adddSAndre Przywara 	case BL33_IMAGE_ID:
147ab13adddSAndre Przywara 		/* BL33 expects to receive the primary CPU MPID (through r0) */
148ab13adddSAndre Przywara 		bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr();
149ab13adddSAndre Przywara 		bl_mem_params->ep_info.spsr = rpi3_get_spsr_for_bl33_entry();
150ab13adddSAndre Przywara 
151ab13adddSAndre Przywara 		/* Shutting down the SDHost driver to let BL33 drives SDHost.*/
152ab13adddSAndre Przywara 		rpi3_sdhost_stop();
153ab13adddSAndre Przywara 		break;
154ab13adddSAndre Przywara 
155ab13adddSAndre Przywara 	default:
156ab13adddSAndre Przywara 		/* Do nothing in default case */
157ab13adddSAndre Przywara 		break;
158ab13adddSAndre Przywara 	}
159ab13adddSAndre Przywara 
160ab13adddSAndre Przywara 	return err;
161ab13adddSAndre Przywara }
162