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