xref: /rk3399_ARM-atf/plat/imx/common/imx9_sm_sema.c (revision b67e984664a8644d6cfd1812cabaa02cf24f09c9)
1 /*
2  * Copyright 2023-2025 NXP
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <assert.h>
8 #include <stdint.h>
9 
10 #include <platform_def.h>
11 
12 typedef struct {
13 	uint8_t flag_sm;
14 	uint8_t flag_ap;
15 	uint8_t flag_unused1;
16 	uint8_t flag_unused2;
17 	uint32_t turn;
18 } sm_ap_semaphore_t;
19 
20 /* Used for GIC_WAKER sync between AP and SM. */
21 void request_sm_ap_sema(void)
22 {
23 	volatile sm_ap_semaphore_t *sm_ap_sema = (sm_ap_semaphore_t *)SM_AP_SEMA_ADDR;
24 
25 	sm_ap_sema->flag_ap = 1U;
26 	sm_ap_sema->turn = 0U;
27 
28 	while (sm_ap_sema->flag_sm && sm_ap_sema->turn == 0U) {
29 		/* Wait for SM to be done in the critical section. */
30 		;
31 	}
32 }
33 
34 /* Used for GIC_WAKER sync between AP and SM. */
35 void release_sm_ap_sema(void)
36 {
37 	sm_ap_semaphore_t *sm_ap_sema = (sm_ap_semaphore_t *)SM_AP_SEMA_ADDR;
38 
39 	sm_ap_sema->flag_ap = 0U;
40 }
41 
42