xref: /arm-trusted-firmware/plat/intel/soc/agilex5/bl2_plat_setup.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2019-2021, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  * Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
4*91f16700Schasinglulu  *
5*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #include <assert.h>
9*91f16700Schasinglulu #include <arch.h>
10*91f16700Schasinglulu #include <arch_helpers.h>
11*91f16700Schasinglulu #include <common/bl_common.h>
12*91f16700Schasinglulu #include <common/debug.h>
13*91f16700Schasinglulu #include <common/desc_image_load.h>
14*91f16700Schasinglulu #include <drivers/cadence/cdns_sdmmc.h>
15*91f16700Schasinglulu #include <drivers/generic_delay_timer.h>
16*91f16700Schasinglulu #include <drivers/synopsys/dw_mmc.h>
17*91f16700Schasinglulu #include <drivers/ti/uart/uart_16550.h>
18*91f16700Schasinglulu #include <lib/mmio.h>
19*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_v2.h>
20*91f16700Schasinglulu 
21*91f16700Schasinglulu #include "agilex5_clock_manager.h"
22*91f16700Schasinglulu #include "agilex5_memory_controller.h"
23*91f16700Schasinglulu #include "agilex5_mmc.h"
24*91f16700Schasinglulu #include "agilex5_pinmux.h"
25*91f16700Schasinglulu #include "agilex5_system_manager.h"
26*91f16700Schasinglulu #include "ccu/ncore_ccu.h"
27*91f16700Schasinglulu #include "combophy/combophy.h"
28*91f16700Schasinglulu #include "nand/nand.h"
29*91f16700Schasinglulu #include "qspi/cadence_qspi.h"
30*91f16700Schasinglulu #include "sdmmc/sdmmc.h"
31*91f16700Schasinglulu #include "socfpga_emac.h"
32*91f16700Schasinglulu #include "socfpga_f2sdram_manager.h"
33*91f16700Schasinglulu #include "socfpga_handoff.h"
34*91f16700Schasinglulu #include "socfpga_mailbox.h"
35*91f16700Schasinglulu #include "socfpga_private.h"
36*91f16700Schasinglulu #include "socfpga_reset_manager.h"
37*91f16700Schasinglulu #include "wdt/watchdog.h"
38*91f16700Schasinglulu 
39*91f16700Schasinglulu 
40*91f16700Schasinglulu /* Declare mmc_info */
41*91f16700Schasinglulu static struct mmc_device_info mmc_info;
42*91f16700Schasinglulu 
43*91f16700Schasinglulu /* Declare cadence idmac descriptor */
44*91f16700Schasinglulu extern struct cdns_idmac_desc cdns_desc[8] __aligned(32);
45*91f16700Schasinglulu 
46*91f16700Schasinglulu const mmap_region_t agilex_plat_mmap[] = {
47*91f16700Schasinglulu 	MAP_REGION_FLAT(DRAM_BASE, DRAM_SIZE,
48*91f16700Schasinglulu 		MT_MEMORY | MT_RW | MT_NS),
49*91f16700Schasinglulu 	MAP_REGION_FLAT(PSS_BASE, PSS_SIZE,
50*91f16700Schasinglulu 		MT_DEVICE | MT_RW | MT_NS),
51*91f16700Schasinglulu 	MAP_REGION_FLAT(MPFE_BASE, MPFE_SIZE,
52*91f16700Schasinglulu 		MT_DEVICE | MT_RW | MT_SECURE),
53*91f16700Schasinglulu 	MAP_REGION_FLAT(OCRAM_BASE, OCRAM_SIZE,
54*91f16700Schasinglulu 		MT_NON_CACHEABLE | MT_RW | MT_SECURE),
55*91f16700Schasinglulu 	MAP_REGION_FLAT(CCU_BASE, CCU_SIZE,
56*91f16700Schasinglulu 		MT_DEVICE | MT_RW | MT_SECURE),
57*91f16700Schasinglulu 	MAP_REGION_FLAT(MEM64_BASE, MEM64_SIZE,
58*91f16700Schasinglulu 		MT_DEVICE | MT_RW | MT_NS),
59*91f16700Schasinglulu 	MAP_REGION_FLAT(GIC_BASE, GIC_SIZE,
60*91f16700Schasinglulu 		MT_DEVICE | MT_RW | MT_SECURE),
61*91f16700Schasinglulu 	{0},
62*91f16700Schasinglulu };
63*91f16700Schasinglulu 
64*91f16700Schasinglulu boot_source_type boot_source = BOOT_SOURCE;
65*91f16700Schasinglulu 
66*91f16700Schasinglulu void bl2_el3_early_platform_setup(u_register_t x0, u_register_t x1,
67*91f16700Schasinglulu 				u_register_t x2, u_register_t x4)
68*91f16700Schasinglulu {
69*91f16700Schasinglulu 	static console_t console;
70*91f16700Schasinglulu 
71*91f16700Schasinglulu 	handoff reverse_handoff_ptr = { 0 };
72*91f16700Schasinglulu 
73*91f16700Schasinglulu 	generic_delay_timer_init();
74*91f16700Schasinglulu 	config_clkmgr_handoff(&reverse_handoff_ptr);
75*91f16700Schasinglulu 	mailbox_init();
76*91f16700Schasinglulu 	enable_nonsecure_access();
77*91f16700Schasinglulu 
78*91f16700Schasinglulu 	deassert_peripheral_reset();
79*91f16700Schasinglulu 	if (combo_phy_init(&reverse_handoff_ptr) != 0) {
80*91f16700Schasinglulu 		ERROR("Combo Phy initialization failed\n");
81*91f16700Schasinglulu 	}
82*91f16700Schasinglulu 
83*91f16700Schasinglulu 	console_16550_register(PLAT_INTEL_UART_BASE, PLAT_UART_CLOCK,
84*91f16700Schasinglulu 	PLAT_BAUDRATE, &console);
85*91f16700Schasinglulu 
86*91f16700Schasinglulu 	/* Store magic number */
87*91f16700Schasinglulu 	mmio_write_32(L2_RESET_DONE_REG, PLAT_L2_RESET_REQ);
88*91f16700Schasinglulu }
89*91f16700Schasinglulu 
90*91f16700Schasinglulu void bl2_el3_plat_arch_setup(void)
91*91f16700Schasinglulu {
92*91f16700Schasinglulu 	handoff reverse_handoff_ptr;
93*91f16700Schasinglulu 
94*91f16700Schasinglulu 	struct cdns_sdmmc_params params = EMMC_INIT_PARAMS((uintptr_t) &cdns_desc, get_mmc_clk());
95*91f16700Schasinglulu 
96*91f16700Schasinglulu 	mmc_info.mmc_dev_type = MMC_DEVICE_TYPE;
97*91f16700Schasinglulu 	mmc_info.ocr_voltage = OCR_3_3_3_4 | OCR_3_2_3_3;
98*91f16700Schasinglulu 
99*91f16700Schasinglulu 	/* Request ownership and direct access to QSPI */
100*91f16700Schasinglulu 	mailbox_hps_qspi_enable();
101*91f16700Schasinglulu 
102*91f16700Schasinglulu 	switch (boot_source) {
103*91f16700Schasinglulu 	case BOOT_SOURCE_SDMMC:
104*91f16700Schasinglulu 		NOTICE("SDMMC boot\n");
105*91f16700Schasinglulu 		sdmmc_init(&reverse_handoff_ptr, &params, &mmc_info);
106*91f16700Schasinglulu 		socfpga_io_setup(boot_source);
107*91f16700Schasinglulu 		break;
108*91f16700Schasinglulu 
109*91f16700Schasinglulu 	case BOOT_SOURCE_QSPI:
110*91f16700Schasinglulu 		NOTICE("QSPI boot\n");
111*91f16700Schasinglulu 		cad_qspi_init(0, QSPI_CONFIG_CPHA, QSPI_CONFIG_CPOL,
112*91f16700Schasinglulu 			QSPI_CONFIG_CSDA, QSPI_CONFIG_CSDADS,
113*91f16700Schasinglulu 			QSPI_CONFIG_CSEOT, QSPI_CONFIG_CSSOT, 0);
114*91f16700Schasinglulu 		socfpga_io_setup(boot_source);
115*91f16700Schasinglulu 		break;
116*91f16700Schasinglulu 
117*91f16700Schasinglulu 	case BOOT_SOURCE_NAND:
118*91f16700Schasinglulu 		NOTICE("NAND boot\n");
119*91f16700Schasinglulu 		nand_init(&reverse_handoff_ptr);
120*91f16700Schasinglulu 		socfpga_io_setup(boot_source);
121*91f16700Schasinglulu 		break;
122*91f16700Schasinglulu 
123*91f16700Schasinglulu 	default:
124*91f16700Schasinglulu 		ERROR("Unsupported boot source\n");
125*91f16700Schasinglulu 		panic();
126*91f16700Schasinglulu 		break;
127*91f16700Schasinglulu 	}
128*91f16700Schasinglulu }
129*91f16700Schasinglulu 
130*91f16700Schasinglulu uint32_t get_spsr_for_bl33_entry(void)
131*91f16700Schasinglulu {
132*91f16700Schasinglulu 	unsigned long el_status;
133*91f16700Schasinglulu 	unsigned int mode;
134*91f16700Schasinglulu 	uint32_t spsr;
135*91f16700Schasinglulu 
136*91f16700Schasinglulu 	/* Figure out what mode we enter the non-secure world in */
137*91f16700Schasinglulu 	el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT;
138*91f16700Schasinglulu 	el_status &= ID_AA64PFR0_ELX_MASK;
139*91f16700Schasinglulu 
140*91f16700Schasinglulu 	mode = (el_status) ? MODE_EL2 : MODE_EL1;
141*91f16700Schasinglulu 
142*91f16700Schasinglulu 	/*
143*91f16700Schasinglulu 	 * TODO: Consider the possibility of specifying the SPSR in
144*91f16700Schasinglulu 	 * the FIP ToC and allowing the platform to have a say as
145*91f16700Schasinglulu 	 * well.
146*91f16700Schasinglulu 	 */
147*91f16700Schasinglulu 	spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS);
148*91f16700Schasinglulu 	return spsr;
149*91f16700Schasinglulu }
150*91f16700Schasinglulu 
151*91f16700Schasinglulu int bl2_plat_handle_post_image_load(unsigned int image_id)
152*91f16700Schasinglulu {
153*91f16700Schasinglulu 	bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
154*91f16700Schasinglulu 
155*91f16700Schasinglulu 	assert(bl_mem_params);
156*91f16700Schasinglulu 
157*91f16700Schasinglulu 	switch (image_id) {
158*91f16700Schasinglulu 	case BL33_IMAGE_ID:
159*91f16700Schasinglulu 		bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr();
160*91f16700Schasinglulu 		bl_mem_params->ep_info.spsr = get_spsr_for_bl33_entry();
161*91f16700Schasinglulu 		break;
162*91f16700Schasinglulu 	default:
163*91f16700Schasinglulu 		break;
164*91f16700Schasinglulu 	}
165*91f16700Schasinglulu 
166*91f16700Schasinglulu 	return 0;
167*91f16700Schasinglulu }
168*91f16700Schasinglulu 
169*91f16700Schasinglulu /*******************************************************************************
170*91f16700Schasinglulu  * Perform any BL3-1 platform setup code
171*91f16700Schasinglulu  ******************************************************************************/
172*91f16700Schasinglulu void bl2_platform_setup(void)
173*91f16700Schasinglulu {
174*91f16700Schasinglulu }
175