1c9d75b3cSYann Gautier /* 23d201787SYann 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> 153d201787SYann Gautier #include <lib/smccc.h> 1684686ba3SYann Gautier #include <lib/xlat_tables/xlat_tables_v2.h> 17c9d75b3cSYann Gautier #include <plat/common/platform.h> 183d201787SYann 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; 317e87ba25SYann Gautier static uint16_t boot_itf_selected; 32c9d75b3cSYann Gautier 333f9c9784SYann Gautier void stm32mp_save_boot_ctx_address(uintptr_t address) 34c9d75b3cSYann Gautier { 357e87ba25SYann Gautier boot_api_context_t *boot_context = (boot_api_context_t *)address; 367e87ba25SYann Gautier 37c9d75b3cSYann Gautier boot_ctx_address = address; 387e87ba25SYann Gautier boot_itf_selected = boot_context->boot_interface_selected; 39c9d75b3cSYann Gautier } 40c9d75b3cSYann Gautier 413f9c9784SYann Gautier uintptr_t stm32mp_get_boot_ctx_address(void) 42c9d75b3cSYann Gautier { 43c9d75b3cSYann Gautier return boot_ctx_address; 44c9d75b3cSYann Gautier } 45c9d75b3cSYann Gautier 467e87ba25SYann Gautier uint16_t stm32mp_get_boot_itf_selected(void) 477e87ba25SYann Gautier { 487e87ba25SYann Gautier return boot_itf_selected; 497e87ba25SYann Gautier } 507e87ba25SYann Gautier 517ae58c6bSYann Gautier uintptr_t stm32mp_ddrctrl_base(void) 527ae58c6bSYann Gautier { 53ade9ce03SYann Gautier return DDRCTRL_BASE; 547ae58c6bSYann Gautier } 557ae58c6bSYann Gautier 567ae58c6bSYann Gautier uintptr_t stm32mp_ddrphyc_base(void) 577ae58c6bSYann Gautier { 58ade9ce03SYann Gautier return DDRPHYC_BASE; 597ae58c6bSYann Gautier } 607ae58c6bSYann Gautier 617ae58c6bSYann Gautier uintptr_t stm32mp_pwr_base(void) 627ae58c6bSYann Gautier { 63ade9ce03SYann Gautier return PWR_BASE; 647ae58c6bSYann Gautier } 657ae58c6bSYann Gautier 667ae58c6bSYann Gautier uintptr_t stm32mp_rcc_base(void) 677ae58c6bSYann Gautier { 68ade9ce03SYann Gautier return RCC_BASE; 697ae58c6bSYann Gautier } 707ae58c6bSYann Gautier 71e463d3f4SYann Gautier bool stm32mp_lock_available(void) 72e463d3f4SYann Gautier { 73e463d3f4SYann Gautier const uint32_t c_m_bits = SCTLR_M_BIT | SCTLR_C_BIT; 74e463d3f4SYann Gautier 75e463d3f4SYann Gautier /* The spinlocks are used only when MMU and data cache are enabled */ 76e463d3f4SYann Gautier return (read_sctlr() & c_m_bits) == c_m_bits; 77e463d3f4SYann Gautier } 78e463d3f4SYann Gautier 79*1d204ee4SYann Gautier #if STM32MP_USE_STM32IMAGE 801e919529SYann Gautier int stm32mp_check_header(boot_api_image_header_t *header, uintptr_t buffer) 811e919529SYann Gautier { 821e919529SYann Gautier uint32_t i; 831e919529SYann Gautier uint32_t img_checksum = 0U; 841e919529SYann Gautier 851e919529SYann Gautier /* 861e919529SYann Gautier * Check header/payload validity: 871e919529SYann Gautier * - Header magic 881e919529SYann Gautier * - Header version 891e919529SYann Gautier * - Payload checksum 901e919529SYann Gautier */ 911e919529SYann Gautier if (header->magic != BOOT_API_IMAGE_HEADER_MAGIC_NB) { 921e919529SYann Gautier ERROR("Header magic\n"); 931e919529SYann Gautier return -EINVAL; 941e919529SYann Gautier } 951e919529SYann Gautier 961e919529SYann Gautier if (header->header_version != BOOT_API_HEADER_VERSION) { 971e919529SYann Gautier ERROR("Header version\n"); 981e919529SYann Gautier return -EINVAL; 991e919529SYann Gautier } 1001e919529SYann Gautier 1011e919529SYann Gautier for (i = 0U; i < header->image_length; i++) { 1021e919529SYann Gautier img_checksum += *(uint8_t *)(buffer + i); 1031e919529SYann Gautier } 1041e919529SYann Gautier 1051e919529SYann Gautier if (header->payload_checksum != img_checksum) { 1061e919529SYann Gautier ERROR("Checksum: 0x%x (awaited: 0x%x)\n", img_checksum, 1071e919529SYann Gautier header->payload_checksum); 1081e919529SYann Gautier return -EINVAL; 1091e919529SYann Gautier } 1101e919529SYann Gautier 1111e919529SYann Gautier return 0; 1121e919529SYann Gautier } 113*1d204ee4SYann Gautier #endif /* STM32MP_USE_STM32IMAGE */ 11484686ba3SYann Gautier 11584686ba3SYann Gautier int stm32mp_map_ddr_non_cacheable(void) 11684686ba3SYann Gautier { 11784686ba3SYann Gautier return mmap_add_dynamic_region(STM32MP_DDR_BASE, STM32MP_DDR_BASE, 11884686ba3SYann Gautier STM32MP_DDR_MAX_SIZE, 119c1ad41fbSYann Gautier MT_NON_CACHEABLE | MT_RW | MT_SECURE); 12084686ba3SYann Gautier } 12184686ba3SYann Gautier 12284686ba3SYann Gautier int stm32mp_unmap_ddr(void) 12384686ba3SYann Gautier { 12484686ba3SYann Gautier return mmap_remove_dynamic_region(STM32MP_DDR_BASE, 12584686ba3SYann Gautier STM32MP_DDR_MAX_SIZE); 12684686ba3SYann Gautier } 1273d201787SYann Gautier 1283d201787SYann Gautier /***************************************************************************** 1293d201787SYann Gautier * plat_is_smccc_feature_available() - This function checks whether SMCCC 1303d201787SYann Gautier * feature is availabile for platform. 1313d201787SYann Gautier * @fid: SMCCC function id 1323d201787SYann Gautier * 1333d201787SYann Gautier * Return SMC_ARCH_CALL_SUCCESS if SMCCC feature is available and 1343d201787SYann Gautier * SMC_ARCH_CALL_NOT_SUPPORTED otherwise. 1353d201787SYann Gautier *****************************************************************************/ 1363d201787SYann Gautier int32_t plat_is_smccc_feature_available(u_register_t fid) 1373d201787SYann Gautier { 1383d201787SYann Gautier switch (fid) { 1393d201787SYann Gautier case SMCCC_ARCH_SOC_ID: 1403d201787SYann Gautier return SMC_ARCH_CALL_SUCCESS; 1413d201787SYann Gautier default: 1423d201787SYann Gautier return SMC_ARCH_CALL_NOT_SUPPORTED; 1433d201787SYann Gautier } 1443d201787SYann Gautier } 1453d201787SYann Gautier 1463d201787SYann Gautier /* Get SOC version */ 1473d201787SYann Gautier int32_t plat_get_soc_version(void) 1483d201787SYann Gautier { 1493d201787SYann Gautier uint32_t chip_id = stm32mp_get_chip_dev_id(); 1503d201787SYann Gautier uint32_t manfid = SOC_ID_SET_JEP_106(JEDEC_ST_BKID, JEDEC_ST_MFID); 1513d201787SYann Gautier 1523d201787SYann Gautier return (int32_t)(manfid | (chip_id & SOC_ID_IMPL_DEF_MASK)); 1533d201787SYann Gautier } 1543d201787SYann Gautier 1553d201787SYann Gautier /* Get SOC revision */ 1563d201787SYann Gautier int32_t plat_get_soc_revision(void) 1573d201787SYann Gautier { 1583d201787SYann Gautier return (int32_t)(stm32mp_get_chip_version() & SOC_ID_REV_MASK); 1593d201787SYann Gautier } 160