1c9d75b3cSYann Gautier /* 2*84686ba3SYann Gautier * Copyright (c) 2015-2020, 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*84686ba3SYann Gautier #include <lib/xlat_tables/xlat_tables_v2.h> 16c9d75b3cSYann Gautier #include <plat/common/platform.h> 17c9d75b3cSYann Gautier 18c9d75b3cSYann Gautier uintptr_t plat_get_ns_image_entrypoint(void) 19c9d75b3cSYann Gautier { 20c9d75b3cSYann Gautier return BL33_BASE; 21c9d75b3cSYann Gautier } 22c9d75b3cSYann Gautier 23c9d75b3cSYann Gautier unsigned int plat_get_syscnt_freq2(void) 24c9d75b3cSYann Gautier { 25c9d75b3cSYann Gautier return read_cntfrq_el0(); 26c9d75b3cSYann Gautier } 27c9d75b3cSYann Gautier 28c9d75b3cSYann Gautier static uintptr_t boot_ctx_address; 29c9d75b3cSYann Gautier 303f9c9784SYann Gautier void stm32mp_save_boot_ctx_address(uintptr_t address) 31c9d75b3cSYann Gautier { 32c9d75b3cSYann Gautier boot_ctx_address = address; 33c9d75b3cSYann Gautier } 34c9d75b3cSYann Gautier 353f9c9784SYann Gautier uintptr_t stm32mp_get_boot_ctx_address(void) 36c9d75b3cSYann Gautier { 37c9d75b3cSYann Gautier return boot_ctx_address; 38c9d75b3cSYann Gautier } 39c9d75b3cSYann Gautier 407ae58c6bSYann Gautier uintptr_t stm32mp_ddrctrl_base(void) 417ae58c6bSYann Gautier { 427ae58c6bSYann Gautier static uintptr_t ddrctrl_base; 437ae58c6bSYann Gautier 447ae58c6bSYann Gautier if (ddrctrl_base == 0) { 457ae58c6bSYann Gautier ddrctrl_base = dt_get_ddrctrl_base(); 467ae58c6bSYann Gautier 477ae58c6bSYann Gautier assert(ddrctrl_base == DDRCTRL_BASE); 487ae58c6bSYann Gautier } 497ae58c6bSYann Gautier 507ae58c6bSYann Gautier return ddrctrl_base; 517ae58c6bSYann Gautier } 527ae58c6bSYann Gautier 537ae58c6bSYann Gautier uintptr_t stm32mp_ddrphyc_base(void) 547ae58c6bSYann Gautier { 557ae58c6bSYann Gautier static uintptr_t ddrphyc_base; 567ae58c6bSYann Gautier 577ae58c6bSYann Gautier if (ddrphyc_base == 0) { 587ae58c6bSYann Gautier ddrphyc_base = dt_get_ddrphyc_base(); 597ae58c6bSYann Gautier 607ae58c6bSYann Gautier assert(ddrphyc_base == DDRPHYC_BASE); 617ae58c6bSYann Gautier } 627ae58c6bSYann Gautier 637ae58c6bSYann Gautier return ddrphyc_base; 647ae58c6bSYann Gautier } 657ae58c6bSYann Gautier 667ae58c6bSYann Gautier uintptr_t stm32mp_pwr_base(void) 677ae58c6bSYann Gautier { 687ae58c6bSYann Gautier static uintptr_t pwr_base; 697ae58c6bSYann Gautier 707ae58c6bSYann Gautier if (pwr_base == 0) { 717ae58c6bSYann Gautier pwr_base = dt_get_pwr_base(); 727ae58c6bSYann Gautier 737ae58c6bSYann Gautier assert(pwr_base == PWR_BASE); 747ae58c6bSYann Gautier } 757ae58c6bSYann Gautier 767ae58c6bSYann Gautier return pwr_base; 777ae58c6bSYann Gautier } 787ae58c6bSYann Gautier 797ae58c6bSYann Gautier uintptr_t stm32mp_rcc_base(void) 807ae58c6bSYann Gautier { 817ae58c6bSYann Gautier static uintptr_t rcc_base; 827ae58c6bSYann Gautier 837ae58c6bSYann Gautier if (rcc_base == 0) { 847ae58c6bSYann Gautier rcc_base = fdt_rcc_read_addr(); 857ae58c6bSYann Gautier 867ae58c6bSYann Gautier assert(rcc_base == RCC_BASE); 877ae58c6bSYann Gautier } 887ae58c6bSYann Gautier 897ae58c6bSYann Gautier return rcc_base; 907ae58c6bSYann Gautier } 917ae58c6bSYann Gautier 92e463d3f4SYann Gautier bool stm32mp_lock_available(void) 93e463d3f4SYann Gautier { 94e463d3f4SYann Gautier const uint32_t c_m_bits = SCTLR_M_BIT | SCTLR_C_BIT; 95e463d3f4SYann Gautier 96e463d3f4SYann Gautier /* The spinlocks are used only when MMU and data cache are enabled */ 97e463d3f4SYann Gautier return (read_sctlr() & c_m_bits) == c_m_bits; 98e463d3f4SYann Gautier } 99e463d3f4SYann Gautier 100c9d75b3cSYann Gautier uintptr_t stm32_get_gpio_bank_base(unsigned int bank) 101c9d75b3cSYann Gautier { 102c9d75b3cSYann Gautier if (bank == GPIO_BANK_Z) { 103c9d75b3cSYann Gautier return GPIOZ_BASE; 104c9d75b3cSYann Gautier } 105c9d75b3cSYann Gautier 106c9d75b3cSYann Gautier assert(GPIO_BANK_A == 0 && bank <= GPIO_BANK_K); 107c9d75b3cSYann Gautier 108c9d75b3cSYann Gautier return GPIOA_BASE + (bank * GPIO_BANK_OFFSET); 109c9d75b3cSYann Gautier } 110c9d75b3cSYann Gautier 111c9d75b3cSYann Gautier uint32_t stm32_get_gpio_bank_offset(unsigned int bank) 112c9d75b3cSYann Gautier { 113c9d75b3cSYann Gautier if (bank == GPIO_BANK_Z) { 114c9d75b3cSYann Gautier return 0; 115c9d75b3cSYann Gautier } 116c9d75b3cSYann Gautier 117c9d75b3cSYann Gautier assert(GPIO_BANK_A == 0 && bank <= GPIO_BANK_K); 118c9d75b3cSYann Gautier 119c9d75b3cSYann Gautier return bank * GPIO_BANK_OFFSET; 120c9d75b3cSYann Gautier } 1211e919529SYann Gautier 1221e919529SYann Gautier int stm32mp_check_header(boot_api_image_header_t *header, uintptr_t buffer) 1231e919529SYann Gautier { 1241e919529SYann Gautier uint32_t i; 1251e919529SYann Gautier uint32_t img_checksum = 0U; 1261e919529SYann Gautier 1271e919529SYann Gautier /* 1281e919529SYann Gautier * Check header/payload validity: 1291e919529SYann Gautier * - Header magic 1301e919529SYann Gautier * - Header version 1311e919529SYann Gautier * - Payload checksum 1321e919529SYann Gautier */ 1331e919529SYann Gautier if (header->magic != BOOT_API_IMAGE_HEADER_MAGIC_NB) { 1341e919529SYann Gautier ERROR("Header magic\n"); 1351e919529SYann Gautier return -EINVAL; 1361e919529SYann Gautier } 1371e919529SYann Gautier 1381e919529SYann Gautier if (header->header_version != BOOT_API_HEADER_VERSION) { 1391e919529SYann Gautier ERROR("Header version\n"); 1401e919529SYann Gautier return -EINVAL; 1411e919529SYann Gautier } 1421e919529SYann Gautier 1431e919529SYann Gautier for (i = 0U; i < header->image_length; i++) { 1441e919529SYann Gautier img_checksum += *(uint8_t *)(buffer + i); 1451e919529SYann Gautier } 1461e919529SYann Gautier 1471e919529SYann Gautier if (header->payload_checksum != img_checksum) { 1481e919529SYann Gautier ERROR("Checksum: 0x%x (awaited: 0x%x)\n", img_checksum, 1491e919529SYann Gautier header->payload_checksum); 1501e919529SYann Gautier return -EINVAL; 1511e919529SYann Gautier } 1521e919529SYann Gautier 1531e919529SYann Gautier return 0; 1541e919529SYann Gautier } 155*84686ba3SYann Gautier 156*84686ba3SYann Gautier int stm32mp_map_ddr_non_cacheable(void) 157*84686ba3SYann Gautier { 158*84686ba3SYann Gautier return mmap_add_dynamic_region(STM32MP_DDR_BASE, STM32MP_DDR_BASE, 159*84686ba3SYann Gautier STM32MP_DDR_MAX_SIZE, 160*84686ba3SYann Gautier MT_NON_CACHEABLE | MT_RW | MT_NS); 161*84686ba3SYann Gautier } 162*84686ba3SYann Gautier 163*84686ba3SYann Gautier int stm32mp_unmap_ddr(void) 164*84686ba3SYann Gautier { 165*84686ba3SYann Gautier return mmap_remove_dynamic_region(STM32MP_DDR_BASE, 166*84686ba3SYann Gautier STM32MP_DDR_MAX_SIZE); 167*84686ba3SYann Gautier } 168