1*30feb38aSMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */ 2*30feb38aSMarouene Boubakri /* 3*30feb38aSMarouene Boubakri * Copyright 2025 NXP 4*30feb38aSMarouene Boubakri */ 5*30feb38aSMarouene Boubakri 6*30feb38aSMarouene Boubakri #ifndef __SBI_MPXY_H 7*30feb38aSMarouene Boubakri #define __SBI_MPXY_H 8*30feb38aSMarouene Boubakri 9*30feb38aSMarouene Boubakri #if defined(CFG_RISCV_SBI_MPXY) 10*30feb38aSMarouene Boubakri 11*30feb38aSMarouene Boubakri /* SBI function IDs for MPXY extension */ 12*30feb38aSMarouene Boubakri #define SBI_EXT_MPXY_GET_SHMEM_SIZE 0x0 13*30feb38aSMarouene Boubakri #define SBI_EXT_MPXY_SET_SHMEM 0x1 14*30feb38aSMarouene Boubakri #define SBI_EXT_MPXY_GET_CHANNEL_IDS 0x2 15*30feb38aSMarouene Boubakri #define SBI_EXT_MPXY_READ_ATTRS 0x3 16*30feb38aSMarouene Boubakri #define SBI_EXT_MPXY_WRITE_ATTRS 0x4 17*30feb38aSMarouene Boubakri #define SBI_EXT_MPXY_SEND_MSG_WITH_RESP 0x5 18*30feb38aSMarouene Boubakri #define SBI_EXT_MPXY_SEND_MSG_WITHOUT_RESP 0x6 19*30feb38aSMarouene Boubakri #define SBI_EXT_MPXY_GET_NOTIFICATION_EVENTS 0x7 20*30feb38aSMarouene Boubakri 21*30feb38aSMarouene Boubakri /* Capabilities available through CHANNEL_CAPABILITY attribute */ 22*30feb38aSMarouene Boubakri #define SBI_MPXY_CHAN_CAP_MSI BIT(0) 23*30feb38aSMarouene Boubakri #define SBI_MPXY_CHAN_CAP_SSE BIT(1) 24*30feb38aSMarouene Boubakri #define SBI_MPXY_CHAN_CAP_EVENTS_STATE BIT(2) 25*30feb38aSMarouene Boubakri #define SBI_MPXY_CHAN_CAP_SEND_WITH_RESP BIT(3) 26*30feb38aSMarouene Boubakri #define SBI_MPXY_CHAN_CAP_SEND_WITHOUT_RESP BIT(4) 27*30feb38aSMarouene Boubakri #define SBI_MPXY_CHAN_CAP_GET_NOTIFICATIONS BIT(5) 28*30feb38aSMarouene Boubakri 29*30feb38aSMarouene Boubakri #ifndef __ASSEMBLER__ 30*30feb38aSMarouene Boubakri 31*30feb38aSMarouene Boubakri #include <compiler.h> 32*30feb38aSMarouene Boubakri #include <encoding.h> 33*30feb38aSMarouene Boubakri #include <stdint.h> 34*30feb38aSMarouene Boubakri #include <sys/cdefs.h> 35*30feb38aSMarouene Boubakri #include <types_ext.h> 36*30feb38aSMarouene Boubakri #include <util.h> 37*30feb38aSMarouene Boubakri 38*30feb38aSMarouene Boubakri enum sbi_mpxy_attr_id { 39*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSG_PROT_ID = 0x00000000, 40*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSG_PROT_VER = 0x00000001, 41*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSG_MAX_LEN = 0x00000002, 42*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSG_SEND_TIMEOUT = 0x00000003, 43*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSG_COMPLETION_TIMEOUT = 0x00000004, 44*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_CHANNEL_CAPABILITY = 0x00000005, 45*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_SSE_EVENT_ID = 0x00000006, 46*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSI_CONTROL = 0x00000007, 47*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSI_ADDR_LO = 0x00000008, 48*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSI_ADDR_HI = 0x00000009, 49*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSI_DATA = 0x0000000A, 50*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_EVENTS_STATE_CONTROL = 0x0000000B, 51*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_STD_ATTR_MAX_IDX, 52*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSGPROTO_ATTR_START = 0x80000000, 53*30feb38aSMarouene Boubakri SBI_MPXY_ATTR_MSGPROTO_ATTR_END = 0xffffffff 54*30feb38aSMarouene Boubakri }; 55*30feb38aSMarouene Boubakri 56*30feb38aSMarouene Boubakri enum sbi_mpxy_msgproto_id { 57*30feb38aSMarouene Boubakri SBI_MPXY_MSGPROTO_RPMI_ID = 0x00000000, 58*30feb38aSMarouene Boubakri SBI_MPXY_MSGPROTO_MAX_IDX, 59*30feb38aSMarouene Boubakri SBI_MPXY_MSGPROTO_VENDOR_START = 0x80000000, 60*30feb38aSMarouene Boubakri SBI_MPXY_MSGPROTO_VENDOR_END = 0xffffffff 61*30feb38aSMarouene Boubakri }; 62*30feb38aSMarouene Boubakri 63*30feb38aSMarouene Boubakri /* 64*30feb38aSMarouene Boubakri * struct sbi_mpxy_msi_info - MSI-related attributes for an MPXY channel 65*30feb38aSMarouene Boubakri * @msi_addr_lo: Lower 32 bits of the MSI address 66*30feb38aSMarouene Boubakri * @msi_addr_hi: Upper 32 bits of the MSI address 67*30feb38aSMarouene Boubakri * @msi_data: MSI data payload to be written 68*30feb38aSMarouene Boubakri * 69*30feb38aSMarouene Boubakri * Describes the MSI configuration used for sending interrupts from 70*30feb38aSMarouene Boubakri * the SBI implementation to the supervisor software via MPXY channels. 71*30feb38aSMarouene Boubakri */ 72*30feb38aSMarouene Boubakri struct sbi_mpxy_msi_info { 73*30feb38aSMarouene Boubakri uint32_t msi_addr_lo; 74*30feb38aSMarouene Boubakri uint32_t msi_addr_hi; 75*30feb38aSMarouene Boubakri uint32_t msi_data; 76*30feb38aSMarouene Boubakri }; 77*30feb38aSMarouene Boubakri 78*30feb38aSMarouene Boubakri /* 79*30feb38aSMarouene Boubakri * struct sbi_mpxy_channel_attrs - Attributes describing an MPXY channel 80*30feb38aSMarouene Boubakri * @msg_proto_id: Protocol identifier used on this channel (e.g., RPMI) 81*30feb38aSMarouene Boubakri * @msg_proto_version: Version of the protocol supported on this channel 82*30feb38aSMarouene Boubakri * @msg_max_len: Maximum length (in bytes) of the message payload 83*30feb38aSMarouene Boubakri * @msg_send_timeout: Timeout (in microseconds) for sending a message 84*30feb38aSMarouene Boubakri * @msg_completion_timeout: Timeout (in microseconds) to wait for a response 85*30feb38aSMarouene Boubakri * @capability: Bitfield indicating supported channel capabilities 86*30feb38aSMarouene Boubakri * @sse_event_id: SSE event ID used for signaling events (if supported) 87*30feb38aSMarouene Boubakri * @msi_control: Bitmask for controlling MSI behavior (e.g., enable) 88*30feb38aSMarouene Boubakri * @msi_info: MSI configuration (address/data) for the channel 89*30feb38aSMarouene Boubakri * @events_state_ctrl: Control register for event state handling 90*30feb38aSMarouene Boubakri * 91*30feb38aSMarouene Boubakri * These attributes are retrieved from the SBI implementation via 92*30feb38aSMarouene Boubakri * SBI_MPXY_ATTR_* queries and describe the static properties of 93*30feb38aSMarouene Boubakri * an MPXY channel. 94*30feb38aSMarouene Boubakri */ 95*30feb38aSMarouene Boubakri struct sbi_mpxy_channel_attrs { 96*30feb38aSMarouene Boubakri uint32_t msg_proto_id; 97*30feb38aSMarouene Boubakri uint32_t msg_proto_version; 98*30feb38aSMarouene Boubakri uint32_t msg_max_len; 99*30feb38aSMarouene Boubakri uint32_t msg_send_timeout; 100*30feb38aSMarouene Boubakri uint32_t msg_completion_timeout; 101*30feb38aSMarouene Boubakri uint32_t capability; 102*30feb38aSMarouene Boubakri uint32_t sse_event_id; 103*30feb38aSMarouene Boubakri uint32_t msi_control; 104*30feb38aSMarouene Boubakri struct sbi_mpxy_msi_info msi_info; 105*30feb38aSMarouene Boubakri uint32_t events_state_ctrl; 106*30feb38aSMarouene Boubakri }; 107*30feb38aSMarouene Boubakri 108*30feb38aSMarouene Boubakri /* 109*30feb38aSMarouene Boubakri * struct sbi_mpxy_channel_ids_data - MPXY channel ID list structure 110*30feb38aSMarouene Boubakri * @remaining: Number of channel IDs remaining after this call 111*30feb38aSMarouene Boubakri * @returned: Number of channel IDs returned in this call 112*30feb38aSMarouene Boubakri * @channel_array: Array of channel IDs returned by the SBI call 113*30feb38aSMarouene Boubakri * 114*30feb38aSMarouene Boubakri * This structure is used for retrieving channel IDs from the SBI 115*30feb38aSMarouene Boubakri * implementation via shared memory. It supports partial retrieval 116*30feb38aSMarouene Boubakri * when the number of available IDs exceeds the buffer capacity. 117*30feb38aSMarouene Boubakri */ 118*30feb38aSMarouene Boubakri struct sbi_mpxy_channel_ids_data { 119*30feb38aSMarouene Boubakri uint32_t remaining; 120*30feb38aSMarouene Boubakri uint32_t returned; 121*30feb38aSMarouene Boubakri uint32_t channel_array[]; 122*30feb38aSMarouene Boubakri }; 123*30feb38aSMarouene Boubakri 124*30feb38aSMarouene Boubakri /* 125*30feb38aSMarouene Boubakri * struct sbi_mpxy_notification_data - MPXY notification event structure 126*30feb38aSMarouene Boubakri * @remaining: Number of notification events remaining after this call 127*30feb38aSMarouene Boubakri * @returned: Number of notification events returned in this call 128*30feb38aSMarouene Boubakri * @lost: Number of notification events lost due to buffer overflow 129*30feb38aSMarouene Boubakri * @reserved: Reserved for future use (must be zero) 130*30feb38aSMarouene Boubakri * @events_data: Raw event data blob, format defined by the message protocol 131*30feb38aSMarouene Boubakri * 132*30feb38aSMarouene Boubakri * This structure is populated in shared memory by the SBI implementation 133*30feb38aSMarouene Boubakri * to deliver asynchronous notification events to the supervisor software. 134*30feb38aSMarouene Boubakri */ 135*30feb38aSMarouene Boubakri struct sbi_mpxy_notification_data { 136*30feb38aSMarouene Boubakri uint32_t remaining; 137*30feb38aSMarouene Boubakri uint32_t returned; 138*30feb38aSMarouene Boubakri uint32_t lost; 139*30feb38aSMarouene Boubakri uint32_t reserved; 140*30feb38aSMarouene Boubakri uint8_t events_data[]; 141*30feb38aSMarouene Boubakri }; 142*30feb38aSMarouene Boubakri 143*30feb38aSMarouene Boubakri /* SBI MPXY */ 144*30feb38aSMarouene Boubakri int sbi_mpxy_get_shmem_size(unsigned long *shmem_size); 145*30feb38aSMarouene Boubakri int sbi_mpxy_set_shmem(void); 146*30feb38aSMarouene Boubakri int sbi_mpxy_get_channel_ids(uint32_t channel_count, uint32_t *channel_ids); 147*30feb38aSMarouene Boubakri int sbi_mpxy_read_attributes(uint32_t channel_id, uint32_t base_attribute_id, 148*30feb38aSMarouene Boubakri uint32_t attribute_count, void *attribute_buf); 149*30feb38aSMarouene Boubakri int sbi_mpxy_write_attributes(uint32_t channel_id, uint32_t base_attribute_id, 150*30feb38aSMarouene Boubakri uint32_t attribute_count, 151*30feb38aSMarouene Boubakri uint32_t *attributes_buf); 152*30feb38aSMarouene Boubakri int sbi_mpxy_send_message_with_response(uint32_t channel_id, 153*30feb38aSMarouene Boubakri uint32_t message_id, void *message, 154*30feb38aSMarouene Boubakri unsigned long message_len, 155*30feb38aSMarouene Boubakri void *response, 156*30feb38aSMarouene Boubakri unsigned long max_response_len, 157*30feb38aSMarouene Boubakri unsigned long *response_len); 158*30feb38aSMarouene Boubakri int sbi_mpxy_send_message_without_response(uint32_t channel_id, 159*30feb38aSMarouene Boubakri uint32_t message_id, void *message, 160*30feb38aSMarouene Boubakri unsigned long message_len); 161*30feb38aSMarouene Boubakri int sbi_mpxy_get_channel_count(uint32_t *channel_count); 162*30feb38aSMarouene Boubakri int 163*30feb38aSMarouene Boubakri sbi_mpxy_get_notification_events(uint32_t channel_id, 164*30feb38aSMarouene Boubakri struct sbi_mpxy_notification_data *notif_data, 165*30feb38aSMarouene Boubakri unsigned long *events_data_len); 166*30feb38aSMarouene Boubakri 167*30feb38aSMarouene Boubakri #endif /*__ASSEMBLER__*/ 168*30feb38aSMarouene Boubakri #endif /*defined(CFG_RISCV_SBI_MPXY)*/ 169*30feb38aSMarouene Boubakri #endif /*__SBI_MPXY_H*/ 170