xref: /rk3399_ARM-atf/plat/st/common/stm32mp_common.c (revision 3d201787e8246022b1f193283c12e7cb4bfc83ff)
1c9d75b3cSYann Gautier /*
2*3d201787SYann Gautier  * Copyright (c) 2015-2021, ARM Limited and Contributors. All rights reserved.
3c9d75b3cSYann Gautier  *
4c9d75b3cSYann Gautier  * SPDX-License-Identifier: BSD-3-Clause
5c9d75b3cSYann Gautier  */
6c9d75b3cSYann Gautier 
7c9d75b3cSYann Gautier #include <assert.h>
81e919529SYann Gautier #include <errno.h>
9c9d75b3cSYann Gautier 
10c9d75b3cSYann Gautier #include <platform_def.h>
11c9d75b3cSYann Gautier 
12c9d75b3cSYann Gautier #include <arch_helpers.h>
13c9d75b3cSYann Gautier #include <common/debug.h>
147ae58c6bSYann Gautier #include <drivers/st/stm32mp_clkfunc.h>
15*3d201787SYann Gautier #include <lib/smccc.h>
1684686ba3SYann Gautier #include <lib/xlat_tables/xlat_tables_v2.h>
17c9d75b3cSYann Gautier #include <plat/common/platform.h>
18*3d201787SYann Gautier #include <services/arm_arch_svc.h>
19c9d75b3cSYann Gautier 
20c9d75b3cSYann Gautier uintptr_t plat_get_ns_image_entrypoint(void)
21c9d75b3cSYann Gautier {
22c9d75b3cSYann Gautier 	return BL33_BASE;
23c9d75b3cSYann Gautier }
24c9d75b3cSYann Gautier 
25c9d75b3cSYann Gautier unsigned int plat_get_syscnt_freq2(void)
26c9d75b3cSYann Gautier {
27c9d75b3cSYann Gautier 	return read_cntfrq_el0();
28c9d75b3cSYann Gautier }
29c9d75b3cSYann Gautier 
30c9d75b3cSYann Gautier static uintptr_t boot_ctx_address;
31c9d75b3cSYann Gautier 
323f9c9784SYann Gautier void stm32mp_save_boot_ctx_address(uintptr_t address)
33c9d75b3cSYann Gautier {
34c9d75b3cSYann Gautier 	boot_ctx_address = address;
35c9d75b3cSYann Gautier }
36c9d75b3cSYann Gautier 
373f9c9784SYann Gautier uintptr_t stm32mp_get_boot_ctx_address(void)
38c9d75b3cSYann Gautier {
39c9d75b3cSYann Gautier 	return boot_ctx_address;
40c9d75b3cSYann Gautier }
41c9d75b3cSYann Gautier 
427ae58c6bSYann Gautier uintptr_t stm32mp_ddrctrl_base(void)
437ae58c6bSYann Gautier {
44ade9ce03SYann Gautier 	return DDRCTRL_BASE;
457ae58c6bSYann Gautier }
467ae58c6bSYann Gautier 
477ae58c6bSYann Gautier uintptr_t stm32mp_ddrphyc_base(void)
487ae58c6bSYann Gautier {
49ade9ce03SYann Gautier 	return DDRPHYC_BASE;
507ae58c6bSYann Gautier }
517ae58c6bSYann Gautier 
527ae58c6bSYann Gautier uintptr_t stm32mp_pwr_base(void)
537ae58c6bSYann Gautier {
54ade9ce03SYann Gautier 	return PWR_BASE;
557ae58c6bSYann Gautier }
567ae58c6bSYann Gautier 
577ae58c6bSYann Gautier uintptr_t stm32mp_rcc_base(void)
587ae58c6bSYann Gautier {
59ade9ce03SYann Gautier 	return RCC_BASE;
607ae58c6bSYann Gautier }
617ae58c6bSYann Gautier 
62e463d3f4SYann Gautier bool stm32mp_lock_available(void)
63e463d3f4SYann Gautier {
64e463d3f4SYann Gautier 	const uint32_t c_m_bits = SCTLR_M_BIT | SCTLR_C_BIT;
65e463d3f4SYann Gautier 
66e463d3f4SYann Gautier 	/* The spinlocks are used only when MMU and data cache are enabled */
67e463d3f4SYann Gautier 	return (read_sctlr() & c_m_bits) == c_m_bits;
68e463d3f4SYann Gautier }
69e463d3f4SYann Gautier 
701e919529SYann Gautier int stm32mp_check_header(boot_api_image_header_t *header, uintptr_t buffer)
711e919529SYann Gautier {
721e919529SYann Gautier 	uint32_t i;
731e919529SYann Gautier 	uint32_t img_checksum = 0U;
741e919529SYann Gautier 
751e919529SYann Gautier 	/*
761e919529SYann Gautier 	 * Check header/payload validity:
771e919529SYann Gautier 	 *	- Header magic
781e919529SYann Gautier 	 *	- Header version
791e919529SYann Gautier 	 *	- Payload checksum
801e919529SYann Gautier 	 */
811e919529SYann Gautier 	if (header->magic != BOOT_API_IMAGE_HEADER_MAGIC_NB) {
821e919529SYann Gautier 		ERROR("Header magic\n");
831e919529SYann Gautier 		return -EINVAL;
841e919529SYann Gautier 	}
851e919529SYann Gautier 
861e919529SYann Gautier 	if (header->header_version != BOOT_API_HEADER_VERSION) {
871e919529SYann Gautier 		ERROR("Header version\n");
881e919529SYann Gautier 		return -EINVAL;
891e919529SYann Gautier 	}
901e919529SYann Gautier 
911e919529SYann Gautier 	for (i = 0U; i < header->image_length; i++) {
921e919529SYann Gautier 		img_checksum += *(uint8_t *)(buffer + i);
931e919529SYann Gautier 	}
941e919529SYann Gautier 
951e919529SYann Gautier 	if (header->payload_checksum != img_checksum) {
961e919529SYann Gautier 		ERROR("Checksum: 0x%x (awaited: 0x%x)\n", img_checksum,
971e919529SYann Gautier 		      header->payload_checksum);
981e919529SYann Gautier 		return -EINVAL;
991e919529SYann Gautier 	}
1001e919529SYann Gautier 
1011e919529SYann Gautier 	return 0;
1021e919529SYann Gautier }
10384686ba3SYann Gautier 
10484686ba3SYann Gautier int stm32mp_map_ddr_non_cacheable(void)
10584686ba3SYann Gautier {
10684686ba3SYann Gautier 	return  mmap_add_dynamic_region(STM32MP_DDR_BASE, STM32MP_DDR_BASE,
10784686ba3SYann Gautier 					STM32MP_DDR_MAX_SIZE,
10884686ba3SYann Gautier 					MT_NON_CACHEABLE | MT_RW | MT_NS);
10984686ba3SYann Gautier }
11084686ba3SYann Gautier 
11184686ba3SYann Gautier int stm32mp_unmap_ddr(void)
11284686ba3SYann Gautier {
11384686ba3SYann Gautier 	return  mmap_remove_dynamic_region(STM32MP_DDR_BASE,
11484686ba3SYann Gautier 					   STM32MP_DDR_MAX_SIZE);
11584686ba3SYann Gautier }
116*3d201787SYann Gautier 
117*3d201787SYann Gautier /*****************************************************************************
118*3d201787SYann Gautier  * plat_is_smccc_feature_available() - This function checks whether SMCCC
119*3d201787SYann Gautier  *                                     feature is availabile for platform.
120*3d201787SYann Gautier  * @fid: SMCCC function id
121*3d201787SYann Gautier  *
122*3d201787SYann Gautier  * Return SMC_ARCH_CALL_SUCCESS if SMCCC feature is available and
123*3d201787SYann Gautier  * SMC_ARCH_CALL_NOT_SUPPORTED otherwise.
124*3d201787SYann Gautier  *****************************************************************************/
125*3d201787SYann Gautier int32_t plat_is_smccc_feature_available(u_register_t fid)
126*3d201787SYann Gautier {
127*3d201787SYann Gautier 	switch (fid) {
128*3d201787SYann Gautier 	case SMCCC_ARCH_SOC_ID:
129*3d201787SYann Gautier 		return SMC_ARCH_CALL_SUCCESS;
130*3d201787SYann Gautier 	default:
131*3d201787SYann Gautier 		return SMC_ARCH_CALL_NOT_SUPPORTED;
132*3d201787SYann Gautier 	}
133*3d201787SYann Gautier }
134*3d201787SYann Gautier 
135*3d201787SYann Gautier /* Get SOC version */
136*3d201787SYann Gautier int32_t plat_get_soc_version(void)
137*3d201787SYann Gautier {
138*3d201787SYann Gautier 	uint32_t chip_id = stm32mp_get_chip_dev_id();
139*3d201787SYann Gautier 	uint32_t manfid = SOC_ID_SET_JEP_106(JEDEC_ST_BKID, JEDEC_ST_MFID);
140*3d201787SYann Gautier 
141*3d201787SYann Gautier 	return (int32_t)(manfid | (chip_id & SOC_ID_IMPL_DEF_MASK));
142*3d201787SYann Gautier }
143*3d201787SYann Gautier 
144*3d201787SYann Gautier /* Get SOC revision */
145*3d201787SYann Gautier int32_t plat_get_soc_revision(void)
146*3d201787SYann Gautier {
147*3d201787SYann Gautier 	return (int32_t)(stm32mp_get_chip_version() & SOC_ID_REV_MASK);
148*3d201787SYann Gautier }
149