xref: /optee_os/core/arch/riscv/include/sbi_mpxy.h (revision 30feb38ac712e49dfe9a7bc1d2db3b3458534e69)
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