diff --git a/riscv-rpmi.adoc b/riscv-rpmi.adoc index 13f5c48..37c1a44 100644 --- a/riscv-rpmi.adoc +++ b/riscv-rpmi.adoc @@ -64,6 +64,8 @@ include::src/transport.adoc[] include::src/message-protocol.adoc[] +include::src/service-groups.adoc[] + include::src/srvgrp-base.adoc[] include::src/srvgrp-system-reset.adoc[] diff --git a/src/message-protocol.adoc b/src/message-protocol.adoc index 6b5ef80..e32286b 100644 --- a/src/message-protocol.adoc +++ b/src/message-protocol.adoc @@ -112,7 +112,7 @@ header. ! [31:24] ! FLAGS - FLAGS[7:4]: RESERVED. + FLAGS[7:4]: Reserved, must be initialized to 0. FLAGS[3]: DOORBELL 0b0: Doorbell interrupt is enabled. @@ -123,7 +123,7 @@ header. 0b001: POSTED_REQUEST 0b010: ACKNOWLEDGEMENT 0b011: NOTIFICATION - 0b100 - 0b111: RESERVED, must be 0. + 0b100 - 0b111: Reserved, must be initialized to 0. ! [23:16] ! SERVICE_ID + @@ -178,10 +178,12 @@ data exceeds the size that a single message can accommodate, multipart messages can be used. Some request messages may not have associated data and in that case their `DATALEN` field in the message must be `0`. -Acknowledgement message data contains `a 32-bit` `STATUS` code which represents -the error code. -Acknowledgement message may contain more data apart from the `STATUS` code -depending on the corresponding request message. +The acknowledgement message data must contain a `32-bit` `STATUS` code which +represents the error code generated during the servicing of the request message. +The acknowledgement message may contain more data apart from the `STATUS` code +depending on the corresponding request message. The minimum `DATALEN` value for +the acknowledgement message is `4-byte` for `STATUS` code. The acknowledgement +message must not return partial data apart from `STATUS` code if supported. === Notifications Notification messages are asynchronous messages that notify about the events @@ -193,8 +195,9 @@ them. Any action required on behalf of any event notification is dependent on the application processor. <> shows the notification message format. -Each service group has a service with a fixed `SERVICE_ID=0x00` to subscribe -to events. By default the event notification is disabled for each service +Each service group has a service of type notification with a fixed +`SERVICE_ID=0x00` used to send the events in the notification message. +By default the event notification is disabled for each service group and the application processor must subscribe to the supported events in each service group to receive notification messages. Notification messages are only sent for events to which the application processor has subscribed to. If @@ -229,19 +232,27 @@ image::event-header.png[800,800] .Notification Message Format [cols="3,2,7a", width=100%, align="center", options="header"] |=== -| Word | Name | Description -| 0 | *EVENT_HDR* | `32-bit` field represents a single event. -[cols="1,7a"] +| Word +| Name +| Description + +| 0 +| EVENT_HDR +| `32-bit` field represents a single event. + +[cols="1,7a", options="header"] !=== -! *Bits* ! *Description* -! [31:24] ! Reserved and must be initialized to `0`. -! [23:16] ! *EVENT_ID* + +! Bits +! Description + +! [31:24] ! _Reserved and must be initialized to_ `0`. +! [23:16] ! EVENT_ID + Unique identifier for an event in a service group. -! [15:0] ! *EVENT_DATALEN* + +! [15:0] ! EVENT_DATALEN + `16-bit` field to store event data size in bytes. !=== -| 1:(*EVENT_DATALEN/4*) | *EVENT_DATA* | Event Data +| 1:(EVENT_DATALEN/4) | EVENT_DATA | Event Data |=== The table above shows the format for an event and its data. Subsequent events @@ -256,27 +267,73 @@ in the in the `STATUS` word of the acknowledgement message. .Return Status Codes [cols="4, 2, 6", width=100%, align="center", options="header"] |=== -| Name | Status Code | Description -| RPMI_SUCCESS | 0 | Service has been completed successfully -| RPMI_ERROR_FAILED | -1 | Failed due to general error -| RPMI_ERROR_NOT_SUPPORTED | -2 | Service or feature not supported -| RPMI_ERROR_INVALID_PARAMETER | -3 | One or more parameters passed are -invalid -| RPMI_ERROR_DENIED | -4 | Requested operation denied due to -insufficient permissions -| RPMI_ERROR_NOT_FOUND | -5 | Requested resource not found -| RPMI_ERROR_OUT_OF_RANGE | -6 | Index out of range -| RPMI_ERROR_OUT_OF_RESOURCE | -7 | Resource limit reached -| RPMI_ERROR_HW_FAULT | -8 | Operation failed due to hardware fault. -| RPMI_ERROR_BUSY | -9 | System is currently busy and cannot -respond to requests -| RPMI_ERROR_TIMEOUT | -10 | Operation timed out -| RPMI_ERROR_COMMS | -11 | Error in communication -| RPMI_ERROR_ALREADY | -12 | Operation already in progress or state -changed already for which the operation was performed. -| RPMI_ERROR_EXTENSION | -13 | Error in extension implementation that -violates the extension specification or the extension version mismatch -| | -14 to -127 | Reserved -| | > -127 | Vendor specific +| Name +| Status Code +| Description + +| RPMI_SUCCESS +| 0 +| Service has been completed successfully. + +| RPMI_ERROR_FAILED +| -1 +| Failed due to general error. + +| RPMI_ERROR_NOT_SUPPORTED +| -2 +| Service or feature not supported. + +| RPMI_ERROR_INVALID_PARAMETER +| -3 +| One or more parameters passed are invalid. + +| RPMI_ERROR_DENIED +| -4 +| Requested operation denied due to insufficient permissions. + +| RPMI_ERROR_NOT_FOUND +| -5 +| Requested resource not found. + +| RPMI_ERROR_OUT_OF_RANGE +| -6 +| Index out of range. + +| RPMI_ERROR_OUT_OF_RESOURCE +| -7 +| Resource limit reached. + +| RPMI_ERROR_HW_FAULT +| -8 +| Operation failed due to hardware fault. + +| RPMI_ERROR_BUSY +| -9 +| System is currently busy and cannot respond to requests. + +| RPMI_ERROR_TIMEOUT +| -10 +| Operation timed out. + +| RPMI_ERROR_COMMS +| -11 +| Error in communication. + +| RPMI_ERROR_ALREADY +| -12 +| Operation already in progress or state changed already for which the +operation was performed. + +| RPMI_ERROR_EXTENSION +| -13 +| Error in extension implementation that violates the extension specification +or the extension version mismatch. + +| +| -14 to -127 +| _Reserved_ +| +| > -127 +| _Vendor specific_ |=== diff --git a/src/service-groups.adoc b/src/service-groups.adoc new file mode 100644 index 0000000..b0341f7 --- /dev/null +++ b/src/service-groups.adoc @@ -0,0 +1,55 @@ +:path: src/ +:imagesdir: ../images + +ifdef::rootpath[] +:imagesdir: {rootpath}{path}{imagesdir} +endif::rootpath[] + +ifndef::rootpath[] +:rootpath: ./../ +endif::rootpath[] + +== Service Groups +A service group is a collection of services that are logically grouped +according to the functionality they provide. For example, all the voltage +related services are collectively called the Voltage service group. + +This specification defines standard service groups and services with the +provision to add more service groups as required in the future. The +service group ID namespace also provides a means to platform vendors to add +their implementation-specific service groups. + +All service groups except the `BASE` service group are optional. If a service +group is implemented, it must implement all its services except a dedicated +notification service (service_id: 0x00) meant to deliver events. +A service group must not implement defined services partially unless it also +defines a mechanism to discover its implemented services. +If a service group defines events then it must also implement notification +service (service_id: 0x00). + +The following table lists the service group + +[#table_service_groups] +.RPMI Service Groups +[cols="2, 4", width=100%, align="center", options="header"] +|=== +| Service Group ID | Service Group Name +| 0x0001 | BASE +| 0x0002 | SYSTEM_RESET +| 0x0003 | SYSTEM_SUSPEND +| 0x0004 | HART_STATE_MANAGEMENT +| 0x0005 | CPPC +| 0x0006 | VOLTAGE +| 0x0007 | CLOCK +| 0x0008 | DEVICE_POWER +| 0x0009 | PERFORMANCE +| 0x000A | MANAGEMENT_MODE +| 0x000B | RAS_AGENT +| 0x000C - 0x7FFF | _Reserved for Future Use_ +| 0x8000 - 0xFFFF | _Implementation Specific Service Groups_ +|=== +NOTE: The services listed within each service group do not have a specific order. +Additionally, the sequence in which services are defined in the specification +does not necessarily reflect the order in which they should be called in the +implementation. + diff --git a/src/srvgrp-base.adoc b/src/srvgrp-base.adoc index abda6c1..f8f1e66 100644 --- a/src/srvgrp-base.adoc +++ b/src/srvgrp-base.adoc @@ -9,359 +9,554 @@ ifndef::rootpath[] :rootpath: ./../ endif::rootpath[] -== Service Groups -A service group is a collection of services which are logically grouped -according to the functionality they provide. For example, all voltage related - services/messages are collectively referred to as the Voltage Service Group. - -This specification defines standard service groups and services with the -provision to add more service groups as per requirement in the future. - -Following table lists the service group - -[#table_service_groups] -.Service Groups -[cols="2, 4", width=100%, align="center", options="header"] -|=== -| Service Group ID | Service Group Name -| 0x00001 | BASE -| 0x00002 | SYSTEM_RESET -| 0x00003 | SYSTEM_SUSPEND -| 0x00004 | HART_STATE_MANAGEMENT -| 0x00005 | CPPC -| 0x00006 | VOLTAGE -| 0x00007 | CLOCK -| 0x00008 | DEVICE_POWER -| 0x00009 | PERFORMANCE -| 0x0000A | MANAGEMENT_MODE -| 0x0000B | RAS_AGENT -| 0x0000C - 0x7FFFF | _Reserved for Future Use_ -| 0x80000 - 0xFFFFF | _Implementation Specific Service Groups_ -|=== -NOTE: The services listed within each service group do not have a specific order. -Additionally, the sequence in which services are defined in the specification -does not necessarily reflect the order in which they should be called in the -implementation. - -=== Service Group - *BASE* (servicegroup_id: 0x00001) +=== Service Group: BASE (SERVICEGROUP_ID: 0x0001) The BASE service group is mandatory and provides the following services: -* Initial handshaking between the Application Processor and the Platform -Microcontroller. +* Initial handshaking between the application processor and the platform +microcontroller. -* Querying the message framework implementation version information. +* Discovering the RPMI implementation version information. -* Discovering the implementation and version of a specific service group or any - specific service within any service group. +* Discovering the implementation of a service group. -* Gathering allowed system information from the firmware. +* Discovering platform specific information. -* Status of the transport and if the Platform Microcontroller is ready for -receive messages. - -Below table lists the services in this group: +The below table lists the services in this group: [#table_base_services] .BASE Services [cols="1, 3, 2", width=100%, align="center", options="header"] |=== -| Service ID | Service Name | Request Type -| 0x01 | BASE_ENABLE_NOTIFICATION | NORMAL_REQUEST -| 0x02 | BASE_GET_IMPLEMENTATION_VERSION | NORMAL_REQUEST -| 0x03 | BASE_GET_IMPLEMENTATION_ID | NORMAL_REQUEST -| 0x04 | BASE_GET_SPEC_VERSION | NORMAL_REQUEST -| 0x05 | BASE_GET_HW_INFO | NORMAL_REQUEST -| 0x06 | BASE_PROBE_SERVICE_GROUP | NORMAL_REQUEST -| 0x07 | BASE_GET_ATTRIBUTES | NORMAL_REQUEST -| 0x08 | BASE_SET_MSI | NORMAL_REQUEST +| Service ID +| Service Name +| Request Type + +| 0x01 +| BASE_ENABLE_NOTIFICATION +| NORMAL_REQUEST + +| 0x02 +| BASE_GET_IMPLEMENTATION_VERSION +| NORMAL_REQUEST + +| 0x03 +| BASE_GET_IMPLEMENTATION_ID +| NORMAL_REQUEST + +| 0x04 +| BASE_GET_SPEC_VERSION +| NORMAL_REQUEST + +| 0x05 +| BASE_GET_HW_INFO +| NORMAL_REQUEST + +| 0x06 +| BASE_PROBE_SERVICE_GROUP +| NORMAL_REQUEST + +| 0x07 +| BASE_GET_ATTRIBUTES +| NORMAL_REQUEST + +| 0x08 +| BASE_SET_MSI +| NORMAL_REQUEST |=== [#base-notifications] ==== Notifications -The Platform Microcontroller can send asynchronous notifications to the AP via this -service. There can be multiple types of events classified in the BASE service -group which can be combined into a single message as depicted in <>. -If the Platform Microcontroller has multiple events for the same type, it can -send the single instance of that event that was received last. +This service is used by the platform microcontroller to send the asynchronous +message of type notification to the application processor. The message +transfers the events defined by this service group. The events defined are +listed in the below table. [#table_base_srvgroup_events] .BASE Service Group Events -[cols="1, 2, 1, 4", width=100%, align="center", options="header"] +[cols="1, 4, 2, 4", width=100%, align="center", options="header"] |=== -| Event ID | Event Name | Event Data | Description -| 0x001 | REQUEST_HANDLE_ERROR | NA | This event indicates that the -Platform Microcontroller is unable to serve the message requests anymore and -this event may send the list of messages which the Platform Microcontroller -was processing when the error occured. No event data is necessary for this -notification. +| Event ID +| Event Name +| Event Data +| Description + +| 0x001 +| REQUEST_HANDLE_ERROR +| NA +| This event indicates that the the platform microcontroller is unable to +serve the message requests. |=== -==== Service: *BASE_ENABLE_NOTIFICATION* -This service allows the AP to subscribe to BASE service group notifications. -Platform can optionally support notifications of errors which might occur in -the platform. The PuC can send these notification messages to the AP if they -are implemented and the AP has subscribed to them. The supported events are -described in <>. +==== Service: BASE_ENABLE_NOTIFICATION (SERVICE_ID: 0x01) +This service allows the application processor to subscribe to BASE service +group notifications. The platform can optionally support notifications of +events that might occur in the platform. The platform microcontroller can send +the supported events through notification message if the application processor +has subscribed to them. The supported events are described +in table <>. [#table_base_ennotification_request_data] .Request Data -[cols="1, 2, 1, 7", width=100%, align="center", options="header"] +[cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | EVENT_ID | uint32 | Event to be subscribed for -notification. +| Word +| Name +| Type +| Description + +| 0 +| EVENT_ID +| uint32 +| The event to be subscribed for notification. |=== [#table_base_ennotification_response_data] .Response Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="5,5"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="6,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Notifications are subscribed successfully. -! RPMI_ERROR_NOT_FOUND ! EVENT_ID is not supported or invalid. -! RPMI_ERROR_NOT_SUPPORTED ! Notifications not supported. +! Error Code +! Description + +! RPMI_SUCCESS +! Notifications are subscribed successfully. + +! RPMI_ERROR_NOT_FOUND +! `EVENT_ID` is not supported or invalid. + +! RPMI_ERROR_NOT_SUPPORTED +! Notifications not supported. !=== - Other errors <> |=== -==== Service: *BASE_GET_IMPLEMENTATION_VERSION* -Get the implementation version of the message framework from the Platform -Microcontroller. Versioning is also done for the specification but it's -possible that for a single version of the specifiction to have multiple -implementation versions and based on that any lowest supported implementation -version can be mandated to ensure the stability and support. The version -returned by this service is a 32-bits composite number containing both Major -and Minor numbers. +==== Service: BASE_GET_IMPLEMENTATION_VERSION (SERVICE_ID: 0x02) +This service is used to get the RPMI implementation version of the platform +microcontroller. The version returned is a `32-bit` composite number containing +the `MAJOR` and `MINOR` numbers. [#table_base_getimplversion_request_data] .Request Data -- NA +[cols="1", width=100%, align="center", options="header"] +|=== +| NA +|=== [#table_base_getimplversion_response_data] .Response Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="2,5a"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="2,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Implementation version returned successfully. +! Error Code +! Description + +! RPMI_SUCCESS +! RPMI implementation version returned successfully. !=== - Other errors <> -| 1 | VERSION | uint32 | Implementation Version -[cols="2,5a"] + +| 1 +| IMPL_VERSION +| uint32 +| Implementation Version + +[cols="2,5a", options="header"] !=== -! *Bits* ! *Description* -! [31:16] ! Major Number -! [15:0] ! Minor Number +! Bits +! Description + +! [31:16] +! `MAJOR` Number + +! [15:0] +! `MINOR` Number !=== |=== -==== Service: *BASE_GET_IMPLEMENTATION_ID* -Get the RPMI Implementation ID assigned to the Operating system or Firmware or -any other software host which implements the RPMI Specification. +==== Service: BASE_GET_IMPLEMENTATION_ID (SERVICE_ID: 0x03) +This service is used to get a `32-bit` RPMI implementation ID assigned to the +software which implements the RPMI specification. Every implementation ID is +unique and listed in the table <> [#table_base_getimplid_request_data] .Request Data -- NA +[cols="1", width=100%, align="center", options="header"] +|=== +| NA +|=== + [#table_base_getimplid_response_data] .Response Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="2,5a"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="2,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Implementation ID returned successfully. +! Error Code +! Description + +! RPMI_SUCCESS +! RPMI implementation ID returned successfully. !=== - Other errors <> -| 1 | IMPL_ID | uint32 | Implementation ID + +| 1 +| IMPL_ID +| uint32 +| Implementation ID |=== -==== Service: *BASE_GET_SPEC_VERSION* -Get version of the implemented RPMI Specification. +==== Service: BASE_GET_SPEC_VERSION (SERVICE_ID: 0x04) +This service is used to get the implemented RPMI specification version. The +version returned is a `32-bit` composite number containing the `MAJOR` and +`MINOR` numbers. + [#table_base_getspecversion_request_data] .Request Data -- NA +[cols="1", width=100%, align="center", options="header"] +|=== +| NA +|=== [#table_base_getspecversion_response_data] .Response Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="2,5a"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="2,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! RPMI Specification version returned successfully. +! Error Code +! Description + +! RPMI_SUCCESS +! RPMI specification version returned successfully. !=== - Other errors <> -| 1 | VERSION | uint32 | RPMI Specification Version -[cols="2,5a"] + +| 1 +| SPEC_VERSION +| uint32 +| RPMI Specification Version + +[cols="2,5a", options="header"] !=== -! *Bits* ! *Description* -! [31:16] ! Major Number -! [15:0] ! Minor Number +! Bits +! Description + +! [31:16] +! `MAJOR` Number + +! [15:0] +! `MINOR` Number !=== |=== -==== Service: *BASE_GET_HW_INFO* -This service is used to retrieve the vendor ID and name of the vendor with an -RPMI implementation on the PuC. Each vendor will be assigned a unique Vendor ID. +==== Service: BASE_GET_PLATFORM_INFO (SERVICE_ID: 0x05) +This service is used to get addition platform information if available. -[#table_base_gethwinfo_request_data] +[#table_base_getplatinfo_request_data] .Request Data -- NA +[cols="1", width=100%, align="center", options="header"] +|=== +| NA +|=== -[#table_base_gethwinfo_response_data] +[#table_base_getplatinfo_response_data] .Response Data -[cols="1, 2, 3, 7a", width=100%, align="center", options="header"] +[cols="1, 3, 4, 6a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="2,5a"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="5,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Vendor info returned successfully. +! Error Code +! Description + +! RPMI_SUCCESS +! Platform information returned successfully. !=== - Other errors <> -| 1 | VENDOR_ID | uint32 | Vendor Identifier -[cols="2,9a"] -!=== -! *Bits* ! *Description* -! [31:16] ! *SUB_VENDOR_ID* _(optional)_ + - It is an additional numeric value used to further differentiate - between different sub-vendors or product lines within the same - hardware vendor. - 0x0: Not Supported - -! [15:0] ! *VENDOR_ID* + - Hardware Vendor ID is a numeric value that uniquely identifies the - manufacturer or vendor of the hardware platform or device. -!=== -| 2 | HW_ID_LEN | uint32 | HW_ID field length in bytes. -| 3 | HW_ID | uint8[HW_ID_LEN] | Hardware Identifier String + - Up to HW_ID_LEN bytes NULL terminated ASCII string. - It can be used to convey details such as the specific product model, revision, or configuration of the - hardware. +| 1 +| PLATFORM_ID_LEN +| uint32 +| Platform Identifier field length in bytes. + +| 2 +| PLATFORM_ID +| uint8[`PLATFORM_ID_LEN`] +| Platform Identifier + +Up to `PLATFORM_ID_LEN` bytes NULL terminated ASCII string. +The use and interpretation of this field is implementation-defined. It can be +used to convey details such as the vendor ID, vendor name, specific product +model, revision, or configuration of the hardware. |=== -==== Service: *BASE_PROBE_SERVICE_GROUP* -This service probes the implementation of any service group by its `SERVICEGROUP_ID`. -All service groups except BASE are optional. However, if a service group is -implemented, it must be fully implemented all services in that service group. -Notifications within the service group remain optional and may be implemented -by the PuC. +==== Service: BASE_PROBE_SERVICE_GROUP (SERVICE_ID: 0x06) +This service is used to probe the implementation of a service group. All +service groups except `BASE` are optional. [#table_base_probesrvgrp_request_data] .Request Data -[cols="1, 3, 1, 7", width=100%, align="center", options="header"] +[cols="1, 3, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | SERVICEGROUP_ID | uint32 | `24 bits` ID assigned to each service - group. +| Word +| Name +| Type +| Description + +| 0 +| SERVICEGROUP_ID +| uint32 +| A `16-bit` ID assigned to each service group. + +Refer to table <> for defined service groups. + +The first `16-bit` of the `uint32` field will store the `SERVICEGROUP_ID`. |=== [#table_base_probesrvgrp_response_data] .Response Data -[cols="1, 3, 1, 7a", width=100%, align="center", options="header"] +[cols="1, 4, 1, 6a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="2,5a"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="3,4a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Service completed successfully. Status of Service group - represented by *SERVICEGROUP_ID* is identified by field - *SERVICE_GROUP_STATUS*. +! Error Code +! Description + +! RPMI_SUCCESS +! Service probed successfully. !=== - Other errors <> -| 1 | SERVICE_GROUP_STATUS | uint32 | Service group implementation - status. - 0: Service group not implemented by platform. - 1: Service group implemented by platform. +| 1 +| SERVICE_GROUP_STATUS +| uint32 +| Service group implementation status. + + 1: Implemented + 0: Not implemented. |=== -==== Service: *BASE_GET_ATTRIBUTES* -This service is used to discover additional features supported by the BASE service group. +==== Service: BASE_GET_ATTRIBUTES (SERVICE_ID: 0x07) +This service is used to discover additional features supported by the BASE +service group. + [#table_base_getbaseattrs_request_data] .Request Data -- NA +[cols="1", width=100%, align="center", options="header"] +|=== +| NA +|=== [#table_base_getbaseattrs_response_data] .Response Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="2,5a"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="2,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Attributes returned successfully. +! Error Code +! Description + +! RPMI_SUCCESS +! Attributes returned successfully. !=== - Other errors <> -| 1 | FLAGS0 | uint32 | Vendor Identifier -[cols="2,9a"] + +| 1 +| FLAGS0 +| uint32 +| +[cols="2,9a", options="header"] !=== -! *Bits* ! *Description* -! [31] ! *EVENT_NOTIFICATION* + +! Bits +! Description + +! [31:2] +! _Reserved, must be initialized to_ `0`. + +! [1] +! EVENT_NOTIFICATION + - 0b0: Notifications are not supported - 0b1: Notifications are supported + 0b1: Supported + 0b0: Not supported -! [30] ! *MSI* + +! [0] +! MSI + - 0b0: Not Supported 0b1: Supported -! [29:0] ! _Reserved_ + 0b0: Not supported !=== -| 2 | FLAGS1 | uint32 | _Reserved, initialized to_ `0` -| 3 | FLAGS2 | uint32 | _Reserved, initialized to_ `0` -| 4 | FLAGS3 | uint32 | _Reserved, initialized to_ `0` + +| 2 +| FLAGS1 +| uint32 +| _Reserved, must be initialized to_ `0`. + +| 3 +| FLAGS2 +| uint32 +| _Reserved, must be initialized to_ `0`. + +| 4 +| FLAGS3 +| uint32 +| _Reserved, must be initialized to_ `0`. |=== -==== Service: *BASE_SET_MSI* -This service is used to configure the MSI address and data which the Platform -Microcontroller can use as a doorbell to the AP. +==== Service: BASE_SET_MSI (SERVICE_ID: 0x08) +This service is used to configure the MSI address and data which the platform +microcontroller can use as a doorbell to the application processor. The +application processor must first discover the MSI support via +`BASE_GET_ATTRIBUTES` service. + +If the MSI support is not present then this this service will be ignored with +appropriate `STATUS` returned. -The PuC to AP MSI can be used for both sending MSI or injecting wired -interrupts. If the MSI target address is IMSIC, then the AP will take MSI -whereas if the MSI target address is "setipnum" of the APLIC then the AP -will take the wired interrupt. +The platform microcontroller will enable MSI only if support is present and +this service configures MSI address and data successfully. -In the case of platforms with PLIC, the platform need to provide a MMIO +NOTE: If the platform supports PLIC, the platform need to provide a MMIO register to inject an edge-triggered interrupt. +NOTE: The platform microcontroller can use MSI for both sending the MSI +directly or injecting wired interrupt in the application processor. If the MSI +target address is IMSIC, then the application processor will take MSI whereas +if the MSI target address is `setipnum` of the APLIC then the application +processor will take the wired interrupt. + [#table_base_setmsi_request_data] .Request Data [cols="1, 3, 1, 7", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | MSI_ADDRESS_LOW | uint32 | Lower `32 bits` of the MSI address -| 1 | MSI_ADDRESS_HIGH | uint32 | Upper `32 bits` of the MSI address -| 2 | MSI_DATA | uint32 | `32 bits` MSI data +| Word +| Name +| Type +| Description + +| 0 +| MSI_ADDRESS_LOW +| uint32 +| Lower `32 bits` of the MSI address + +| 1 +| MSI_ADDRESS_HIGH +| uint32 +| Upper `32 bits` of the MSI address + +| 2 +| MSI_DATA +| uint32 +| `32 bits` MSI data |=== [#table_base_setmsi_response_data] .Response Data -[cols="1, 3, 1, 7a", width=100%, align="center", options="header"] +[cols="1, 1, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="6,5"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="7,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! MSI address and data are configured successfully. -! RPMI_ERROR_NOT_SUPPORTED ! MSI is not supported. The implementation must use `BASE_GET_ATTRIBUTES` service to discover this capability and then use this service. +! Error Code +! Description + +! RPMI_SUCCESS +! MSI address and data are configured successfully. + +! RPMI_ERROR_NOT_SUPPORTED +! MSI is not supported. The implementation must use `BASE_GET_ATTRIBUTES` +service to discover this capability and then use this service. + +! RPMI_ERROR_INVALID_PARAMETER +! MSI address is not `4-byte` aligned. !=== - Other errors <> |=== + +==== RPMI Implementation IDs +[#table_base_rpmi_impl_id] +.RPMI Implementation IDs +[cols="2, 3a", width=100%, align="center", options="header"] +|=== +| Implementation ID +| Name + +| +| +|=== \ No newline at end of file diff --git a/src/srvgrp-system-reset.adoc b/src/srvgrp-system-reset.adoc index b08f782..17e37a6 100644 --- a/src/srvgrp-system-reset.adoc +++ b/src/srvgrp-system-reset.adoc @@ -9,130 +9,201 @@ ifndef::rootpath[] :rootpath: ./../ endif::rootpath[] -=== Service Group - *SYSTEM_RESET* (servicegroup_id: 0x00002) -This service group offers services for resetting or shutting down the system, -including System Shutdown and System Cold Reset, both of which are -architectural system reset types. +=== Service Group - SYSTEM_RESET (SERVICEGROUP_ID: 0x0002) +This service group defines services for system-level reset or shutdown. -System Shutdown results in all components/devices in the system losing power. -Currently, the AP is the only entity that can request the system shutdown, -which means for Platform Microcontroller it is not important to categorize it -as a graceful or forceful shutdown. In the case of a shutdown request, it is -implicit for the Platform Microcontroller that the AP has prepared itself for -a successful shutdown. +The architectural reset types that are supported by default are System Cold +Reset and System Shutdown. -System Cold Reset, also known as Power-On-Reset, involves power cycling the +System Cold Reset, also known as power-on-reset, involves power cycling the entire system. Upon a successful system cold reset, all devices undergo power cycling in an implementation-defined sequence similar to the initial power-on sequence of the system. +System Shutdown results in all components/devices in the system losing power. +Currently, the application processor is the only entity that can request the +system shutdown, which means that for the platform microcontroller, it is not +necessary to categorize it as a graceful or forceful shutdown. In the case of +a shutdown request, it is implicit for the platform microcontroller that the +application processor has prepared itself for a successful shutdown. + Below table lists the services in this group: [#table_sysreset_services] .SYSTEM_RESET Services [cols="1, 3, 2", width=100%, align="center", options="header"] |=== -| Service ID | Service Name | Request Type -| 0x01 | SYSRST_ENABLE_NOTIFICATION | NORMAL_REQUEST -| 0x02 | SYSRST_GET_ATTRIBUTES | NORMAL_REQUEST -| 0x03 | SYSRST_RESET | POSTED_REQUEST +| Service ID +| Service Name +| Request Type + +| 0x01 +| SYSRST_ENABLE_NOTIFICATION +| NORMAL_REQUEST + +| 0x02 +| SYSRST_GET_ATTRIBUTES +| NORMAL_REQUEST + +| 0x03 +| SYSRST_RESET +| POSTED_REQUEST |=== +==== Reset Types +RPMI supports reset types and their values as defined by SBI specification. +Refer to https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-sys-reset.adoc#table_srst_system_reset_types[*SRST System Reset Types*^] +in the RISC-V SBI Specification cite:[SBI] for the `RESET_TYPE`. + [#system-reset-notifications] ==== Notifications This service group does not support any event for notifications. -==== Service: *SYSRST_ENABLE_NOTIFICATION* -This service allows the AP to subscribe to SYSTEM_RESET service group -notifications. The platform can optionally support notifications of events -that may occur in the platform. PuC can send these notification messages to -the AP if they are implemented and the AP has subscribed to them. Supported -events are described in <>. +==== Service: SYSRST_ENABLE_NOTIFICATION (SERVICE_ID: 0x01) +This service allows the application processor to subscribe to `SYSTEM_RESET` +service group defined events for notifications. The platform can optionally +support notifications of events that may occur in the platform. The platform +microcontroller can send these notification messages to the application +processor if they are implemented and the application processor has subscribed +to them. Supported events are described in <>. [#table_sysreset_ennotification_request_data] .Request Data [cols="1, 2, 1, 7", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | EVENT_ID | uint32 | Event to be subscribed for -notification. +| Word +| Name +| Type +| Description + +| 0 +| EVENT_ID +| uint32 +| Event to be subscribed for notification. |=== [#table_sysreset_ennotification_response_data] .Response Data -[cols="1, 2, 1, 7a", width=100%, align="center", options="header"] +[cols="1, 1, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="5,5"] +| Word +| Name +| Type +| Description +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="6,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Notifications are subscribed successfully. -! RPMI_ERROR_NOT_FOUND ! EVENT_ID is not supported or invalid. -! RPMI_ERROR_NOT_SUPPORTED ! Notifications not supported. +! Error Code +! Description + +! RPMI_SUCCESS +! Event is subscribed successfully. + +! RPMI_ERROR_NOT_FOUND +! `EVENT_ID` is not supported or invalid. + +! RPMI_ERROR_NOT_SUPPORTED +! Notifications are not supported. !=== - Other errors <> |=== -==== Service: *SYSRST_GET_ATTRIBUTES* +==== Service: SYSRST_GET_ATTRIBUTES (SERVICE_ID: 0x02) This service is used to discover system reset types supported by the platform. -*System Shutdown* and *System Cold Reset* are mandatory and are assumed to be -supported. *System Warm Reset* is a qualified reset type which can be discovered -with this service. +*System Shutdown* and *System Cold Reset* are mandatory and supported by +default. *System Warm Reset* is defined by the RPMI specification and its +support can be discovered with this service. [#table_sysreset_getsysresetattrs_request_data] .Request Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | RESET_TYPE | uint32 | Reset type value. + -Refer to https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-sys-reset.adoc#table_srst_system_reset_types[*SRST System Reset Types*^] -in the RISC-V SBI Specification cite:[SBI] for the RESET_TYPE definition. +| Word +| Name +| Type +| Description + +| 0 +| RESET_TYPE +| uint32 +| Reset type |=== [#table_sysreset_getsysresetattrs_response_data] .Response Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="2,5a"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="2,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Attributes returned successfully. +! Error Code +! Description + +! RPMI_SUCCESS +! Attributes returned successfully. + !=== - Other errors <> -| 1 | FLAGS | uint32 | Attributes of the RESET_TYPE -[cols="2,5a"] + +| 1 +| FLAGS +| uint32 +| `RESET_TYPE` Attributes + +[cols="2,5a", options="header"] !=== -! *Bits* ! *Description* -! [31] ! Reset type support. +! Bits +! Description + +! [31:1] +! _Reserved, must be initialized to_ `0`. + +! [0] +! `RESET_TYPE` support. - 0b0: RESET_TYPE not supported. - 0b1: RESET_TYPE supported. -! [30:0] ! _Reserved, must be initialized to_ `0`. + 0b1: Supported. + 0b0: Not supported. !=== |=== -==== Service: *SYSRST_RESET* -This service is used to initiate the system shutdown or reset the system -according to the specified type. *System Shutdown* and *System Cold Reset* -are supported implicitly but *System Warm Reset* and other implementation -specific reset types are optional and discoverable. - -The AP should only request supported reset types, which are discovered using -the attributes service. Requesting an unsupported or invalid state may result -in the system entering a non-functional state. +==== Service: SYSRST_RESET (SERVICE_ID: 0x03) +This service is used to initiate the system reset or system shutdown. +The application processor must only request supported reset types, discovered +using the `SYSRST_GET_ATTRIBUTES` service except for System Shutdown and System +Cold Reset which are supported by default. Requesting an unsupported or +invalid state may result in the system entering a non-functional state. [#table_sysreset_sysreset_request_data] .Request Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | RESET_TYPE | uint32 | Reset type value. + -Refer to https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-sys-reset.adoc#table_srst_system_reset_types[*SRST System Reset Types*^] -in the RISC-V SBI Specification cite:[SBI] for the RESET_TYPE definition. +| Word +| Name +| Type +| Description + +| 0 +| RESET_TYPE +| uint32 +| Reset type + |=== [#table_sysreset_sysreset_response_data] .Response Data -- NA +[cols="1", width=100%, align="center", options="header"] +|=== +| NA +|=== diff --git a/src/srvgrp-system-suspend.adoc b/src/srvgrp-system-suspend.adoc index 780797a..a8c3798 100644 --- a/src/srvgrp-system-suspend.adoc +++ b/src/srvgrp-system-suspend.adoc @@ -9,132 +9,244 @@ ifndef::rootpath[] :rootpath: ./../ endif::rootpath[] -=== Service Group - *SYSTEM_SUSPEND* (servicegroup_id: 0x00003) -This service group provides services to put the entire system in a low power -suspend state. All harts except the hart doing system suspend need to be in -the STOPPED state. +=== Service Group - *SYSTEM_SUSPEND* (SERVICEGROUP_ID: 0x0003) +This service group defines services used to request platform microcontroller +to transition the system into a suspend state, also called a sleep state. +The suspend state `SUSPEND_TO_RAM` is supported by default by the platform and +if the application processor requests for `SUSPEND_TO_RAM`, it's implicit for the +platform microcontroller that all the application processors except the one +requesting are in `STOPPED` state and necessary state saving in the RAM has +been complete. Below if the list of services in this group: [#table_syssuspend_services] .SYSTEM_SUSPEND Services [cols="1, 3, 2", width=100%, align="center", options="header"] |=== -| Service ID | Service Name | Request Type -| 0x01 | SYSSUSP_ENABLE_NOTIFICATION | NORMAL_REQUEST -| 0x02 | SYSSUSP_GET_ATTRIBUTES | NORMAL_REQUEST -| 0x03 | SYSSUSP_SUSPEND | NORMAL_REQUEST +| Service ID +| Service Name +| Request Type + +| 0x01 +| SYSSUSP_ENABLE_NOTIFICATION +| NORMAL_REQUEST + +| 0x02 +| SYSSUSP_GET_ATTRIBUTES +| NORMAL_REQUEST + +| 0x03 +| SYSSUSP_SUSPEND +| NORMAL_REQUEST |=== +==== Suspend Types +RPMI supports suspend types and their values as defined by SBI +specification. +Refer to https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-sys-suspend.adoc#table_susp_sleep_types[*SBI System Sleep Types*^] +in the RISC-V SBI Specification cite:[SBI] for the `SUSPEND_TYPE` definition. + [#system-suspend-notifications] ==== Notifications This service group does not support any event for notification. -==== Service: *SYSSUSP_ENABLE_NOTIFICATION* -This service allows the AP to subscribe to SYSTEM_SUSPEND service group -notification. The platform can optionally support notifications of events -that may occur in the platform. PuC can send these notification messages to -the AP if they are implemented and the AP has subscribed to them. Supported -events are described in <>. +==== Service: SYSSUSP_ENABLE_NOTIFICATION (SERVICE_ID: 0x01) +This service allows the application processor to subscribe to `SYSTEM_SUSPEND` +service group defined events for notification. The platform can optionally +support notifications of events that may occur in the platform. The platform +microcontroller can send these notification messages to the application +processor if they are implemented and the application processor has subscribed +to them. Supported events are described in <>. [#table_syssuspend_ennotification_request_data] .Request Data [cols="1, 2, 1, 7", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | EVENT_ID | uint32 | Event to be subscribed for -notification. +| Word +| Name +| Type +| Description + +| 0 +| EVENT_ID +| uint32 +| Event to be subscribed for notification. |=== [#table_syssuspend_ennotification_response_data] .Response Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="5,5"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="6,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Notifications are subscribed successfully. -! RPMI_ERROR_NOT_FOUND ! EVENT_ID is not supported or invalid. -! RPMI_ERROR_NOT_SUPPORTED ! Notifications not supported. +! Error Code +! Description + +! RPMI_SUCCESS +! Notifications are subscribed successfully. + +! RPMI_ERROR_NOT_FOUND +! `EVENT_ID` is not supported or invalid. + +! RPMI_ERROR_NOT_SUPPORTED +! Notifications not supported. !=== - Other errors <> |=== -==== Service: *SYSSUSP_GET_ATTRIBUTES* -This service is used to discover the SYSTEM_SUSPEND attributes with a specific -SUSPEND_TYPE. +==== Service: SYSSUSP_GET_ATTRIBUTES (SERVICE_ID: 0x02) +This service is used to discover the attributes of a `SUSPEND_TYPE`. [#table_syssuspend_getsyssuspendattrs_request_data] .Request Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | SUSPEND_TYPE | uint32 | Suspend type value. + -Refer to https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-sys-suspend.adoc#table_susp_sleep_types[*SUSP System Sleep Types*^] -in the RISC-V SBI Specification cite:[SBI] for the SUSPEND_TYPE definition. +| Word +| Name +| Type +| Description + +| 0 +| SUSPEND_TYPE +| uint32 +| Suspend type + +Refer <> section for supported suspend types. |=== [#table_syssuspend_getsysuspendattrs_response_data] .Response Data [cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="5,5a"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="5,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Attributes returned successfully. +! Error Code +! Description + +! RPMI_SUCCESS +! Attributes returned successfully. !=== - Other errors <> -| 1 | FLAGS | uint32 | Attributes of the SUSPEND_TYPE -[cols="2,5a"] + +| 1 +| FLAGS +| uint32 +| Attributes of the `SUSPEND_TYPE` + +[cols="2,5a", options="header"] !=== -! *Bits* ! *Description* -! [31] ! +! Bits +! Description + +! [31:2] +! _Reserved, must be initialized to_ `0`. - 0b0: Custom resume address not supported. - 0b1: Custom resume address supported. -! [30] ! +! [1] ! Resume Address Support + +If a `SUSPEND_TYPE` supports custom resume address +which platform must configure for the resuming application processor. - 0b0: Suspend not supported - 0b1: Suspend supported -! [29:0] ! _Reserved, must be initialized to_ `0`. + 0b1: Supported. + 0b0: Not supported. +! [0] ! `SUSPEND_TYPE` Support + + 0b1: Supported + 0b0: Not supported + !=== |=== -==== Service: *SYSSUSP_SUSPEND* -This service puts the system into low power state based on the specified suspend -type. It requires that all harts except the calling hart to be in the STOPPED -state as defined by the Hart State Management service group. The system -transitions into the low power state only after the requesting hart executes -the WFI instruction. +==== Service: SYSSUSP_SUSPEND (SERVICE_ID: 0x03) +This service is used to request the platform microcontroller to transition the +system in a suspend state. This service returns successfully if the platform +microcontroller accepts the system suspend request. The application processor +which called this service must enter into the WFI state by executing the `WFI` +instruction. The platform microcontroller will transition the system to the +requested `SUSPEND_STATE` upon the successful WFI state transition of the +application processor. + +The application processor must only request supported suspend types, discovered +using the `SYSSUSP_GET_ATTRIBUTES` service. + +If a suspend type does not support the custom resume address which the +application processor can discover by the `SYSSUSP_GET_ATTRIBUTES` service +then the `RESUME_ADDR_LOW` and `RESUME_ADDR_HIGH` will be ignored and the +application processor in WFI state will resume from the `pc` (program counter) +after the `WFI` instruction. [#table_syssuspend_syssuspend_request_data] .Request Data [cols="1, 3, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | HART_ID | uint32 | Hart ID of the calling hart. -| 1 | SUSPEND_TYPE | uint32 | Suspend type value. + -Refer to https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-sys-suspend.adoc#table_susp_sleep_types[*SUSP System Sleep Types*^] -in the RISC-V SBI Specification cite:[SBI] for the SUSPEND_TYPE definition. -| 2 | RESUME_ADDR_LOW | uint32 | Lower `32 bits` address -| 3 | RESUME_ADDR_HIGH | uint32 | Upper `32 bits` address +| Word +| Name +| Type +| Description + +| 0 +| HART_ID +| uint32 +| Hart ID of the calling hart. + +| 1 +| SUSPEND_TYPE +| uint32 +| Suspend type. + +Refer <> section for supported suspend types. + +| 2 +| RESUME_ADDR_LOW +| uint32 +| Lower `32 bits` address + +| 3 +| RESUME_ADDR_HIGH +| uint32 +| Upper `32 bits` address |=== [#table_syssuspend_syssuspend_response_data] .Response Data -[cols="1, 3, 1, 7a", width=100%, align="center", options="header"] +[cols="1, 2, 1, 7a", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | STATUS | int32 | Return Status Code -[cols="6,5"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return Status Code + +[cols="6,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_ERROR_NOT_SUPPORTED ! SUSPEND_TYPE is not supported. The AP must use the -SYSSUSP_GET_ATTRIBUTES service to determine if SUSPEND_TYPE is supported -or not. Only supported SUSPEND_TYPE must be used with this service. +! Error Code +! Description + +! RPMI_SUCCESS +! Service completed successfully. Suspend request has been accepted. + +! RPMI_ERROR_NOT_SUPPORTED +! `SUSPEND_TYPE` is not supported. !=== - Other errors <> |===