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