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; 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, 108*c1ad41fbSYann Gautier MT_NON_CACHEABLE | MT_RW | MT_SECURE); 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 } 1163d201787SYann Gautier 1173d201787SYann Gautier /***************************************************************************** 1183d201787SYann Gautier * plat_is_smccc_feature_available() - This function checks whether SMCCC 1193d201787SYann Gautier * feature is availabile for platform. 1203d201787SYann Gautier * @fid: SMCCC function id 1213d201787SYann Gautier * 1223d201787SYann Gautier * Return SMC_ARCH_CALL_SUCCESS if SMCCC feature is available and 1233d201787SYann Gautier * SMC_ARCH_CALL_NOT_SUPPORTED otherwise. 1243d201787SYann Gautier *****************************************************************************/ 1253d201787SYann Gautier int32_t plat_is_smccc_feature_available(u_register_t fid) 1263d201787SYann Gautier { 1273d201787SYann Gautier switch (fid) { 1283d201787SYann Gautier case SMCCC_ARCH_SOC_ID: 1293d201787SYann Gautier return SMC_ARCH_CALL_SUCCESS; 1303d201787SYann Gautier default: 1313d201787SYann Gautier return SMC_ARCH_CALL_NOT_SUPPORTED; 1323d201787SYann Gautier } 1333d201787SYann Gautier } 1343d201787SYann Gautier 1353d201787SYann Gautier /* Get SOC version */ 1363d201787SYann Gautier int32_t plat_get_soc_version(void) 1373d201787SYann Gautier { 1383d201787SYann Gautier uint32_t chip_id = stm32mp_get_chip_dev_id(); 1393d201787SYann Gautier uint32_t manfid = SOC_ID_SET_JEP_106(JEDEC_ST_BKID, JEDEC_ST_MFID); 1403d201787SYann Gautier 1413d201787SYann Gautier return (int32_t)(manfid | (chip_id & SOC_ID_IMPL_DEF_MASK)); 1423d201787SYann Gautier } 1433d201787SYann Gautier 1443d201787SYann Gautier /* Get SOC revision */ 1453d201787SYann Gautier int32_t plat_get_soc_revision(void) 1463d201787SYann Gautier { 1473d201787SYann Gautier return (int32_t)(stm32mp_get_chip_version() & SOC_ID_REV_MASK); 1483d201787SYann Gautier } 149