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