xref: /optee_os/core/arch/arm/plat-stm32mp1/stm32_util.h (revision faaa17350a63b639d82b80b08c5512e87a80f33c)
1eb07694aSEtienne Carriere /* SPDX-License-Identifier: BSD-3-Clause */
2eb07694aSEtienne Carriere /*
31e1e5a4dSGatien Chevallier  * Copyright (c) 2018-2022, STMicroelectronics
4eb07694aSEtienne Carriere  */
5eb07694aSEtienne Carriere 
6eb07694aSEtienne Carriere #ifndef __STM32_UTIL_H__
7eb07694aSEtienne Carriere #define __STM32_UTIL_H__
8eb07694aSEtienne Carriere 
9d64485e4SEtienne Carriere #include <assert.h>
105709a67cSEtienne Carriere #include <drivers/clk.h>
11d64485e4SEtienne Carriere #include <kernel/panic.h>
1261491a0cSPascal Paillet #include <stdbool.h>
13eb07694aSEtienne Carriere #include <stdint.h>
147b59789fSEtienne Carriere #include <tee_api_types.h>
15d62792a0SEtienne Carriere #include <types_ext.h>
16eb07694aSEtienne Carriere 
17d8aa45ccSPascal Paillet /* SoC versioning and device ID */
18d8aa45ccSPascal Paillet TEE_Result stm32mp1_dbgmcu_get_chip_dev_id(uint32_t *chip_dev_id);
19d8aa45ccSPascal Paillet 
2061491a0cSPascal Paillet /* Crypto HW support */
2161491a0cSPascal Paillet bool stm32mp_supports_hw_cryp(void);
2261491a0cSPascal Paillet 
2361491a0cSPascal Paillet /*  Second core support */
2461491a0cSPascal Paillet bool stm32mp_supports_second_core(void);
2561491a0cSPascal Paillet 
2661491a0cSPascal Paillet /* Get device ID from SYSCFG registers */
2761491a0cSPascal Paillet uint32_t stm32mp_syscfg_get_chip_dev_id(void);
2861491a0cSPascal Paillet 
2961491a0cSPascal Paillet /*
3061491a0cSPascal Paillet  * OPP service support per hardware constraints
3161491a0cSPascal Paillet  * @opp_id: OPP support identifier read from DT property opp-hw-support
3261491a0cSPascal Paillet  * Return true if hardware supports the OPP, return false otherwise
3361491a0cSPascal Paillet  */
3461491a0cSPascal Paillet bool stm32mp_supports_cpu_opp(uint32_t opp_id);
3561491a0cSPascal Paillet 
36b9c19263SEtienne Carriere /* Backup registers and RAM utils */
379b39d0faSEtienne Carriere vaddr_t stm32mp_bkpreg(unsigned int idx);
38b9c19263SEtienne Carriere 
39569d17b0SEtienne Carriere /* Platform util for the RCC drivers */
40569d17b0SEtienne Carriere vaddr_t stm32_rcc_base(void);
41569d17b0SEtienne Carriere 
42*faaa1735SNicolas Toromanoff /* Erase ESRAM3 */
43*faaa1735SNicolas Toromanoff TEE_Result stm32mp_syscfg_erase_sram3(void);
44*faaa1735SNicolas Toromanoff 
45eb07694aSEtienne Carriere /* Platform util for the GIC */
469b39d0faSEtienne Carriere vaddr_t get_gicd_base(void);
47eb07694aSEtienne Carriere 
48944c2c63SEtienne Carriere /* Platform util for PMIC support */
49944c2c63SEtienne Carriere bool stm32mp_with_pmic(void);
50944c2c63SEtienne Carriere 
5100707cccSEtienne Carriere /* Power management service */
5200707cccSEtienne Carriere #ifdef CFG_PSCI_ARM32
5300707cccSEtienne Carriere void stm32mp_register_online_cpu(void);
5400707cccSEtienne Carriere #else
stm32mp_register_online_cpu(void)5500707cccSEtienne Carriere static inline void stm32mp_register_online_cpu(void)
5600707cccSEtienne Carriere {
5700707cccSEtienne Carriere }
5800707cccSEtienne Carriere #endif
5900707cccSEtienne Carriere 
6000707cccSEtienne Carriere /*
6100707cccSEtienne Carriere  * Generic spinlock function that bypass spinlock if MMU is disabled or
6200707cccSEtienne Carriere  * lock is NULL.
6300707cccSEtienne Carriere  */
6400707cccSEtienne Carriere uint32_t may_spin_lock(unsigned int *lock);
6500707cccSEtienne Carriere void may_spin_unlock(unsigned int *lock, uint32_t exceptions);
6600707cccSEtienne Carriere 
67d4535b58SEtienne Carriere /* Helper from platform RCC clock driver */
68d4535b58SEtienne Carriere struct clk *stm32mp_rcc_clock_id_to_clk(unsigned long clock_id);
69d4535b58SEtienne Carriere 
705709a67cSEtienne Carriere extern const struct clk_ops stm32mp1_clk_ops;
715709a67cSEtienne Carriere 
722f35a7bcSEtienne Carriere /* Return rstctrl instance related to RCC reset controller DT binding ID */
732f35a7bcSEtienne Carriere struct rstctrl *stm32mp_rcc_reset_id_to_rstctrl(unsigned int binding_id);
742f35a7bcSEtienne Carriere 
75d64485e4SEtienne Carriere /*
76d64485e4SEtienne Carriere  * Structure and API function for BSEC driver to get some platform data.
77d64485e4SEtienne Carriere  *
78d64485e4SEtienne Carriere  * @base: BSEC interface registers physical base address
79d64485e4SEtienne Carriere  * @upper_start: Base ID for the BSEC upper words in the platform
80d64485e4SEtienne Carriere  * @max_id: Max value for BSEC word ID for the platform
81d64485e4SEtienne Carriere  */
82d64485e4SEtienne Carriere struct stm32_bsec_static_cfg {
83d64485e4SEtienne Carriere 	paddr_t base;
84d64485e4SEtienne Carriere 	unsigned int upper_start;
85d64485e4SEtienne Carriere 	unsigned int max_id;
86d64485e4SEtienne Carriere };
87d64485e4SEtienne Carriere 
88d64485e4SEtienne Carriere void stm32mp_get_bsec_static_cfg(struct stm32_bsec_static_cfg *cfg);
89d64485e4SEtienne Carriere 
90f2e5b5e0SGatien Chevallier bool stm32mp_allow_probe_shared_device(const void *fdt, int node);
91f2e5b5e0SGatien Chevallier 
922714147bSEtienne Carriere #if defined(CFG_STM32MP15) && defined(CFG_WITH_PAGER)
932714147bSEtienne Carriere /*
942714147bSEtienne Carriere  * Return the SRAM alias physical address related to @pa when applicable or
952714147bSEtienne Carriere  * @pa if it does not relate to an SRAMx non-aliased memory address.
962714147bSEtienne Carriere  */
972714147bSEtienne Carriere paddr_t stm32mp1_pa_or_sram_alias_pa(paddr_t pa);
98a0cac862SEtienne Carriere 
99a0cac862SEtienne Carriere /* Return whether or not the physical address range intersec pager secure RAM */
100a0cac862SEtienne Carriere bool stm32mp1_ram_intersect_pager_ram(paddr_t base, size_t size);
1012714147bSEtienne Carriere #else
stm32mp1_pa_or_sram_alias_pa(paddr_t pa)1022714147bSEtienne Carriere static inline paddr_t stm32mp1_pa_or_sram_alias_pa(paddr_t pa)
1032714147bSEtienne Carriere {
1042714147bSEtienne Carriere 	return pa;
1052714147bSEtienne Carriere }
106a0cac862SEtienne Carriere 
stm32mp1_ram_intersect_pager_ram(paddr_t base __unused,size_t size __unused)107a0cac862SEtienne Carriere static inline bool stm32mp1_ram_intersect_pager_ram(paddr_t base __unused,
108a0cac862SEtienne Carriere 						    size_t size __unused)
109a0cac862SEtienne Carriere {
110a0cac862SEtienne Carriere 	return false;
111a0cac862SEtienne Carriere }
1122714147bSEtienne Carriere #endif /*CFG_STM32MP15 && CFG_WITH_PAGER*/
113e29eb9ddSGatien Chevallier 
114e29eb9ddSGatien Chevallier /* Print a message and reset the system */
115e29eb9ddSGatien Chevallier void __noreturn do_reset(const char *str);
116e29eb9ddSGatien Chevallier 
117eb07694aSEtienne Carriere #endif /*__STM32_UTIL_H__*/
118