xref: /optee_os/core/arch/riscv/include/rpmi.h (revision 693e29406beab5b0b3fce7eb837fdd25c377407e)
1*693e2940SMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */
2*693e2940SMarouene Boubakri /*
3*693e2940SMarouene Boubakri  * Copyright 2025 NXP
4*693e2940SMarouene Boubakri  */
5*693e2940SMarouene Boubakri 
6*693e2940SMarouene Boubakri #ifndef __RPMI_H
7*693e2940SMarouene Boubakri #define __RPMI_H
8*693e2940SMarouene Boubakri 
9*693e2940SMarouene Boubakri #ifndef __ASSEMBLER__
10*693e2940SMarouene Boubakri 
11*693e2940SMarouene Boubakri #include <compiler.h>
12*693e2940SMarouene Boubakri #include <stdint.h>
13*693e2940SMarouene Boubakri 
14*693e2940SMarouene Boubakri /* RPMI error codes */
15*693e2940SMarouene Boubakri enum rpmi_error_codes {
16*693e2940SMarouene Boubakri 	RPMI_SUCCESS			= 0,
17*693e2940SMarouene Boubakri 	RPMI_ERR_FAILED			= -1,
18*693e2940SMarouene Boubakri 	RPMI_ERR_NOTSUPP		= -2,
19*693e2940SMarouene Boubakri 	RPMI_ERR_INVALID_PARAM		= -3,
20*693e2940SMarouene Boubakri 	RPMI_ERR_DENIED			= -4,
21*693e2940SMarouene Boubakri 	RPMI_ERR_INVALID_ADDR		= -5,
22*693e2940SMarouene Boubakri 	RPMI_ERR_ALREADY		= -6,
23*693e2940SMarouene Boubakri 	RPMI_ERR_EXTENSION		= -7,
24*693e2940SMarouene Boubakri 	RPMI_ERR_HW_FAULT		= -8,
25*693e2940SMarouene Boubakri 	RPMI_ERR_BUSY			= -9,
26*693e2940SMarouene Boubakri 	RPMI_ERR_INVALID_STATE		= -10,
27*693e2940SMarouene Boubakri 	RPMI_ERR_BAD_RANGE		= -11,
28*693e2940SMarouene Boubakri 	RPMI_ERR_TIMEOUT		= -12,
29*693e2940SMarouene Boubakri 	RPMI_ERR_IO			= -13,
30*693e2940SMarouene Boubakri 	RPMI_ERR_NO_DATA		= -14,
31*693e2940SMarouene Boubakri 	RPMI_ERR_RESERVED_START		= -15,
32*693e2940SMarouene Boubakri 	RPMI_ERR_RESERVED_END		= -127,
33*693e2940SMarouene Boubakri 	RPMI_ERR_VENDOR_START		= -128,
34*693e2940SMarouene Boubakri };
35*693e2940SMarouene Boubakri 
36*693e2940SMarouene Boubakri /*
37*693e2940SMarouene Boubakri  * struct rpmi_message_header - Header of an RPMI message
38*693e2940SMarouene Boubakri  * @servicegroup_id:  Identifier for the service group
39*693e2940SMarouene Boubakri  * @service_id:       Identifier for the service within the group
40*693e2940SMarouene Boubakri  * @flags:            Message flags (e.g., request/response indicators)
41*693e2940SMarouene Boubakri  * @datalen:          Length of the message data in bytes
42*693e2940SMarouene Boubakri  * @token:            Message token used for matching responses
43*693e2940SMarouene Boubakri  */
44*693e2940SMarouene Boubakri struct rpmi_message_header {
45*693e2940SMarouene Boubakri 	uint16_t servicegroup_id;
46*693e2940SMarouene Boubakri 	uint8_t service_id;
47*693e2940SMarouene Boubakri 	uint8_t flags;
48*693e2940SMarouene Boubakri 	uint16_t datalen;
49*693e2940SMarouene Boubakri 	uint16_t token;
50*693e2940SMarouene Boubakri } __packed;
51*693e2940SMarouene Boubakri 
52*693e2940SMarouene Boubakri /*
53*693e2940SMarouene Boubakri  * struct rpmi_message - RPMI message including header and payload
54*693e2940SMarouene Boubakri  * @header:           RPMI message header
55*693e2940SMarouene Boubakri  * @data:             Payload of the message (variable length)
56*693e2940SMarouene Boubakri  *
57*693e2940SMarouene Boubakri  * This structure represents a full RPMI message. The @data buffer
58*693e2940SMarouene Boubakri  * follows immediately after the header and its size is defined by
59*693e2940SMarouene Boubakri  * @header.datalen.
60*693e2940SMarouene Boubakri  */
61*693e2940SMarouene Boubakri struct rpmi_message {
62*693e2940SMarouene Boubakri 	struct rpmi_message_header header;
63*693e2940SMarouene Boubakri 	uint8_t data[];
64*693e2940SMarouene Boubakri } __packed;
65*693e2940SMarouene Boubakri 
66*693e2940SMarouene Boubakri /*
67*693e2940SMarouene Boubakri  * struct rpmi_notification_event - Notification message for events
68*693e2940SMarouene Boubakri  * @event_datalen:    Size of the event data payload in bytes
69*693e2940SMarouene Boubakri  * @event_id:         Identifier for the event type within the service group
70*693e2940SMarouene Boubakri  * @reserved:         Reserved byte (must be zero)
71*693e2940SMarouene Boubakri  * @event_data:       Event-specific payload (variable length)
72*693e2940SMarouene Boubakri  *
73*693e2940SMarouene Boubakri  * This structure defines the format of a notification event sent
74*693e2940SMarouene Boubakri  * by RPMI-enabled services through MPXY.
75*693e2940SMarouene Boubakri  */
76*693e2940SMarouene Boubakri struct rpmi_notification_event {
77*693e2940SMarouene Boubakri 	uint16_t event_datalen;
78*693e2940SMarouene Boubakri 	uint8_t event_id;
79*693e2940SMarouene Boubakri 	uint8_t reserved;
80*693e2940SMarouene Boubakri 	uint8_t event_data[];
81*693e2940SMarouene Boubakri };
82*693e2940SMarouene Boubakri 
83*693e2940SMarouene Boubakri /* RPMI Messages Types */
84*693e2940SMarouene Boubakri enum rpmi_message_type {
85*693e2940SMarouene Boubakri 	/* Normal request backed with ack */
86*693e2940SMarouene Boubakri 	RPMI_MSG_NORMAL_REQUEST = 0x0,
87*693e2940SMarouene Boubakri 	/* Request without any ack */
88*693e2940SMarouene Boubakri 	RPMI_MSG_POSTED_REQUEST = 0x1,
89*693e2940SMarouene Boubakri 	/* Acknowledgment for normal request message */
90*693e2940SMarouene Boubakri 	RPMI_MSG_ACKNOWLEDGEMENT = 0x2,
91*693e2940SMarouene Boubakri 	/* Notification message */
92*693e2940SMarouene Boubakri 	RPMI_MSG_NOTIFICATION = 0x3,
93*693e2940SMarouene Boubakri };
94*693e2940SMarouene Boubakri 
95*693e2940SMarouene Boubakri /* RPMI ServiceGroups IDs */
96*693e2940SMarouene Boubakri enum rpmi_servicegroup_id {
97*693e2940SMarouene Boubakri 	RPMI_SRVGRP_ID_MIN = 0,
98*693e2940SMarouene Boubakri 	RPMI_SRVGRP_BASE = 0x0001,
99*693e2940SMarouene Boubakri 	RPMI_SRVGRP_SYSTEM_MSI = 0x0002,
100*693e2940SMarouene Boubakri 	RPMI_SRVGRP_SYSTEM_RESET = 0x0003,
101*693e2940SMarouene Boubakri 	RPMI_SRVGRP_SYSTEM_SUSPEND = 0x0004,
102*693e2940SMarouene Boubakri 	RPMI_SRVGRP_HSM = 0x0005,
103*693e2940SMarouene Boubakri 	RPMI_SRVGRP_CPPC = 0x0006,
104*693e2940SMarouene Boubakri 	RPMI_SRVGRP_VOLTAGE = 0x0007,
105*693e2940SMarouene Boubakri 	RPMI_SRVGRP_CLOCK = 0x0008,
106*693e2940SMarouene Boubakri 	RPMI_SRVGRP_DEVICE_POWER = 0x0009,
107*693e2940SMarouene Boubakri 	RPMI_SRVGRP_PERFORMANCE = 0x000A,
108*693e2940SMarouene Boubakri 	RPMI_SRVGRP_MANAGEMENT_MODE = 0x000B,
109*693e2940SMarouene Boubakri 	RPMI_SRVGRP_RAS_AGENT = 0x000C,
110*693e2940SMarouene Boubakri 	RPMI_SRVGRP_REQUEST_FORWARD = 0x000D,
111*693e2940SMarouene Boubakri 	RPMI_SRVGRP_ID_MAX_COUNT,
112*693e2940SMarouene Boubakri 
113*693e2940SMarouene Boubakri 	/* Reserved range for service groups */
114*693e2940SMarouene Boubakri 	RPMI_SRVGRP_RESERVED_START = RPMI_SRVGRP_ID_MAX_COUNT,
115*693e2940SMarouene Boubakri 	RPMI_SRVGRP_RESERVED_END = 0x7BFF,
116*693e2940SMarouene Boubakri 
117*693e2940SMarouene Boubakri 	/* Experimental service groups range */
118*693e2940SMarouene Boubakri 	RPMI_SRVGRP_EXPERIMENTAL_START = 0x7C00,
119*693e2940SMarouene Boubakri 	RPMI_SRVGRP_EXPERIMENTAL_END = 0x7FFF,
120*693e2940SMarouene Boubakri 
121*693e2940SMarouene Boubakri 	/* Vendor/Implementation-specific service groups range */
122*693e2940SMarouene Boubakri 	RPMI_SRVGRP_VENDOR_START = 0x8000,
123*693e2940SMarouene Boubakri 	RPMI_SRVGRP_VENDOR_END = 0xFFFF,
124*693e2940SMarouene Boubakri };
125*693e2940SMarouene Boubakri 
126*693e2940SMarouene Boubakri #endif /*__ASSEMBLER__*/
127*693e2940SMarouene Boubakri #endif /*__RPMI_H*/
128