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