xref: /arm-trusted-firmware/plat/xilinx/common/include/ipi.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2018, Xilinx, Inc. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu /* Xilinx IPI management configuration data and macros */
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #ifndef IPI_H
10*91f16700Schasinglulu #define IPI_H
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <stdint.h>
13*91f16700Schasinglulu 
14*91f16700Schasinglulu /*********************************************************************
15*91f16700Schasinglulu  * IPI mailbox status macros
16*91f16700Schasinglulu  ********************************************************************/
17*91f16700Schasinglulu #define IPI_MB_STATUS_IDLE		(0U)
18*91f16700Schasinglulu #define IPI_MB_STATUS_SEND_PENDING	(1U)
19*91f16700Schasinglulu #define IPI_MB_STATUS_RECV_PENDING	(2U)
20*91f16700Schasinglulu 
21*91f16700Schasinglulu /*********************************************************************
22*91f16700Schasinglulu  * IPI mailbox call is secure or not macros
23*91f16700Schasinglulu  ********************************************************************/
24*91f16700Schasinglulu #define IPI_MB_CALL_NOTSECURE	(0U)
25*91f16700Schasinglulu #define IPI_MB_CALL_SECURE	(1U)
26*91f16700Schasinglulu 
27*91f16700Schasinglulu /*********************************************************************
28*91f16700Schasinglulu  * IPI secure check
29*91f16700Schasinglulu  ********************************************************************/
30*91f16700Schasinglulu #define IPI_SECURE_MASK  (0x1U)
31*91f16700Schasinglulu #define IPI_IS_SECURE(I) ((ipi_table[(I)].secure_only & \
32*91f16700Schasinglulu 			   IPI_SECURE_MASK) ? 1 : 0)
33*91f16700Schasinglulu 
34*91f16700Schasinglulu /*********************************************************************
35*91f16700Schasinglulu  * Struct definitions
36*91f16700Schasinglulu  ********************************************************************/
37*91f16700Schasinglulu 
38*91f16700Schasinglulu /* structure to maintain IPI configuration information */
39*91f16700Schasinglulu struct ipi_config {
40*91f16700Schasinglulu 	unsigned int ipi_bit_mask;
41*91f16700Schasinglulu 	unsigned int ipi_reg_base;
42*91f16700Schasinglulu 	unsigned char secure_only;
43*91f16700Schasinglulu };
44*91f16700Schasinglulu 
45*91f16700Schasinglulu /*********************************************************************
46*91f16700Schasinglulu  * IPI APIs declarations
47*91f16700Schasinglulu  ********************************************************************/
48*91f16700Schasinglulu 
49*91f16700Schasinglulu /* Initialize IPI configuration table */
50*91f16700Schasinglulu void ipi_config_table_init(const struct ipi_config *ipi_config_table,
51*91f16700Schasinglulu 			   uint32_t total_ipi);
52*91f16700Schasinglulu 
53*91f16700Schasinglulu /* Validate IPI mailbox access */
54*91f16700Schasinglulu int ipi_mb_validate(uint32_t local, uint32_t remote, unsigned int is_secure);
55*91f16700Schasinglulu 
56*91f16700Schasinglulu /* Open the IPI mailbox */
57*91f16700Schasinglulu void ipi_mb_open(uint32_t local, uint32_t remote);
58*91f16700Schasinglulu 
59*91f16700Schasinglulu /* Release the IPI mailbox */
60*91f16700Schasinglulu void ipi_mb_release(uint32_t local, uint32_t remote);
61*91f16700Schasinglulu 
62*91f16700Schasinglulu /* Enquire IPI mailbox status */
63*91f16700Schasinglulu int ipi_mb_enquire_status(uint32_t local, uint32_t remote);
64*91f16700Schasinglulu 
65*91f16700Schasinglulu /* Trigger notification on the IPI mailbox */
66*91f16700Schasinglulu void ipi_mb_notify(uint32_t local, uint32_t remote, uint32_t is_blocking);
67*91f16700Schasinglulu 
68*91f16700Schasinglulu /* Ack IPI mailbox notification */
69*91f16700Schasinglulu void ipi_mb_ack(uint32_t local, uint32_t remote);
70*91f16700Schasinglulu 
71*91f16700Schasinglulu /* Disable IPI mailbox notification interrupt */
72*91f16700Schasinglulu void ipi_mb_disable_irq(uint32_t local, uint32_t remote);
73*91f16700Schasinglulu 
74*91f16700Schasinglulu /* Enable IPI mailbox notification interrupt */
75*91f16700Schasinglulu void ipi_mb_enable_irq(uint32_t local, uint32_t remote);
76*91f16700Schasinglulu 
77*91f16700Schasinglulu #endif /* IPI_H */
78