stm32mp1: register shared resource per GPIO bank/pin

Introduce helper functions stm32mp_register_secure_gpio() and
stm32mp_register_non_secure_gpio() for drivers to register a
GPIO pin as secure or non-secure.

These functions are stubbed when shared resource driver is not
embedded in the BL image so that drivers do not bother whether they
shall register or not their resources.

Change-Id: I1fe98576c072ae31f75427c9ac5c9f6c4f1b6ed1
Signed-off-by: Etienne Carriere <etienne.carriere@st.com>
This commit is contained in:
Etienne Carriere 2020-05-13 10:19:50 +02:00
parent 0651b5b77a
commit ec8f4212ac
2 changed files with 37 additions and 0 deletions

View File

@ -29,6 +29,10 @@ void stm32mp_register_non_secure_periph(enum stm32mp_shres id);
void stm32mp_register_secure_periph_iomem(uintptr_t base);
void stm32mp_register_non_secure_periph_iomem(uintptr_t base);
/* Register a GPIO as secure or non-secure based on its bank and pin numbers */
void stm32mp_register_secure_gpio(unsigned int bank, unsigned int pin);
void stm32mp_register_non_secure_gpio(unsigned int bank, unsigned int pin);
/* Consolidate peripheral states and lock against new peripheral registering */
void stm32mp_lock_periph_registering(void);
#else
@ -40,5 +44,15 @@ static inline
void stm32mp_register_non_secure_periph_iomem(uintptr_t base __unused)
{
}
static inline void stm32mp_register_secure_gpio(unsigned int bank __unused,
unsigned int pin __unused)
{
}
static inline void stm32mp_register_non_secure_gpio(unsigned int bank __unused,
unsigned int pin __unused)
{
}
#endif /* STM32MP_SHARED_RESOURCES */
#endif /* STM32MP_SHARED_RESOURCES_H */

View File

@ -311,6 +311,29 @@ void stm32mp_register_non_secure_periph_iomem(uintptr_t base)
register_periph_iomem(base, SHRES_NON_SECURE);
}
void stm32mp_register_secure_gpio(unsigned int bank, unsigned int pin)
{
switch (bank) {
case GPIO_BANK_Z:
register_periph(STM32MP1_SHRES_GPIOZ(pin), SHRES_SECURE);
break;
default:
ERROR("GPIO bank %u cannot be secured\n", bank);
panic();
}
}
void stm32mp_register_non_secure_gpio(unsigned int bank, unsigned int pin)
{
switch (bank) {
case GPIO_BANK_Z:
register_periph(STM32MP1_SHRES_GPIOZ(pin), SHRES_NON_SECURE);
break;
default:
break;
}
}
static bool stm32mp_gpio_bank_is_non_secure(unsigned int bank)
{
unsigned int non_secure = 0U;