From e5e6d2662d325bcf8f2b59f10c5ec9b86af151dc Mon Sep 17 00:00:00 2001 From: Rahul Pathak Date: Fri, 6 Sep 2024 22:24:50 +0530 Subject: [PATCH 1/7] Define RPMI context and details Signed-off-by: Rahul Pathak --- src/intro.adoc | 37 ++++++++++++++++++++++++------------- src/message-protocol.adoc | 2 +- src/srvgrp-base.adoc | 4 ++-- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/intro.adoc b/src/intro.adoc index 87ec42d..0a1cff9 100644 --- a/src/intro.adoc +++ b/src/intro.adoc @@ -26,12 +26,12 @@ tasks. RPMI enables the communication between the application processors and the platform microcontrollers. It abstracts the system complexity and provides a message-based interface for system management and control. -RPMI is not limited to a single application processor and platform +RPMI is not limited to a single application processor and platform microcontroller. It can support multiple application processors and multiple platform microcontrollers. The platform microcontroller or in short PuC abstracts low-level platform -control and management from the application processor. +control and management from the application processor. In addition, RPMI provides a OS-agnostic scalable and extensible interface that can support the addition of new capabilities and services over time. This @@ -40,14 +40,14 @@ existing systems, making it easier for system designers to keep up with changing requirements and adapt to evolving industry standards. === Abstractions provided by RPMI -*Transport*: Describes the mechanism by which the messages are exchanged -between the application processor and the platform microcontroller. +*Transport*: Describes the mechanism by which the messages are exchanged +between the application processor and the platform microcontroller. *Messaging Protocol*: Provides the messaging interface between the application -processors and the platform microcontrollers to communicate with each other via -messages to make requests for various services supported by the hardware -platform. This is accomplished by grouping each management interface into -service groups. With each service group implementing several individual +processors and the platform microcontrollers to communicate with each other via +messages to make requests for various services supported by the hardware +platform. This is accomplished by grouping each management interface into +service groups. With each service group implementing several individual services within. In addition to the standard services, RPMI can also be extended to allow vendors @@ -56,13 +56,24 @@ to add their own services. .High Level Architecture image::highlevel-arch.png[width=800,height=800, align="center"] -An RPMI instance is an implementation of the RPMI messaging protocol and the -transport which handles the packing and unpacking of RPMI messages, as well as -the delivery of messages via the RPMI transport to the other side. +RPMI is designed to work with a single or multi-tenant topology as shown +below. [#img-transport-topologies] .Transport for M-Mode and S-Mode image::transport-topologies.png[width=800,height=800, align="center"] -RPMI is designed to work with a single or multi-tenant topology as shown -above. +==== RPMI Client +An RPMI client is a software or a driver which is capable of sending and +receiving RPMI messages. + +==== RPMI Context +An RPMI context consists of an RPMI transport instance with RPMI message protocol +layer. Each RPMI context has a mandatory BASE service group enabled along with +one or more optional service groups. + +An RPMI context is specific to a RISC-V privilege level in an application +processor. An RPMI context must only be accessible at a given privilege level. +Each service group in RPMI defines the privilege level at which it can be accessed. +An RPMI context must only enable service group which are allowed as per the +service group privilege level requirement. diff --git a/src/message-protocol.adoc b/src/message-protocol.adoc index 07e95b7..24013d2 100644 --- a/src/message-protocol.adoc +++ b/src/message-protocol.adoc @@ -108,7 +108,7 @@ and indexed starting from `0`. ==== Message Header The `8-byte` message header has a fixed layout consisting of several fields. -Each message is given a unique identity in an RPMI instance by its header. +Each message is given a unique identity in an RPMI context by its header. [#table_message_header] .Message Header diff --git a/src/srvgrp-base.adoc b/src/srvgrp-base.adoc index e7f9293..23d2d67 100644 --- a/src/srvgrp-base.adoc +++ b/src/srvgrp-base.adoc @@ -21,7 +21,7 @@ microcontroller. * Discovering platform specific information. -The below table lists the services in this group: +The following table lists the services in the BASE service group: [#table_base_services] .BASE Services @@ -81,7 +81,7 @@ The below table lists the services in this group: 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 table below. +listed in the below table. [#table_base_srvgroup_events] .BASE Service Group Events From a28c537238f07d758e61c1956290ecda5e0ea8b0 Mon Sep 17 00:00:00 2001 From: Rahul Pathak Date: Fri, 6 Sep 2024 22:54:14 +0530 Subject: [PATCH 2/7] Add ServiceGroup versioning and RPMI context M-mode level flag Signed-off-by: Rahul Pathak --- src/service-groups.adoc | 87 ++++++++++++++++++++++++++++++++--------- src/srvgrp-base.adoc | 80 +++++++++++++++++++++++++------------ 2 files changed, 123 insertions(+), 44 deletions(-) diff --git a/src/service-groups.adoc b/src/service-groups.adoc index e8117ed..ab17a27 100644 --- a/src/service-groups.adoc +++ b/src/service-groups.adoc @@ -21,33 +21,82 @@ 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. +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`). +service (`SERVICE_ID: 0x00`). Each service group has another dedicated +service with (`SERVICE_ID = 0x01`) to subscribe to events for notification. + +If the `BASE_PROBE_SERVICE_GROUP` service indicates that a service group is +implemented and returns the implemented version, then the service group +version must conform to the version returned by the `BASE_GET_SPEC_VERSION`. + The following table lists the service groups. [#table_service_groups] .RPMI Service Groups -[cols="2, 4", width=100%, align="center", options="header"] +[cols="2, 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_ +| Service Group ID +| Version (Major:Minor) +| 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 diff --git a/src/srvgrp-base.adoc b/src/srvgrp-base.adoc index 23d2d67..31042bd 100644 --- a/src/srvgrp-base.adoc +++ b/src/srvgrp-base.adoc @@ -160,7 +160,10 @@ 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 @@ -211,7 +214,11 @@ 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 @@ -250,7 +257,10 @@ version returned is a 32-bit composite number containing the `MAJOR` and [#table_base_getspecversion_request_data] .Request Data -- NA +[cols="1", width=100%, align="center", options="header"] +|=== +| NA +|=== [#table_base_getspecversion_response_data] .Response Data @@ -299,7 +309,10 @@ This service is used to get addition platform information if available. [#table_base_getplatinfo_request_data] .Request Data -- NA +[cols="1", width=100%, align="center", options="header"] +|=== +| NA +|=== [#table_base_getplatinfo_response_data] .Response Data @@ -341,10 +354,13 @@ model, revision, or configuration of the hardware. |=== ==== 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. If the `SERVICEGROUP_ID` is -not implemented or invalid then this service returns `0` in the -`SERVICE_GROUP_STATUS` field instead of the error code in `STATUS`. +This service is used to probe the implementation of a service group and to +obtain the implemented service group version. The service group version is a +32-bit composite number containing the `MAJOR` and `MINOR` numbers. + +If the service group is successfully probed then the implemented service group +version is returned in the `SERVICE_GROUP_VERSION` field. Otherwise it returns +`0`. [#table_base_probesrvgrp_request_data] .Request Data @@ -358,9 +374,7 @@ not implemented or invalid then this service returns `0` in the | 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`. +| Service group ID |=== [#table_base_probesrvgrp_response_data] @@ -388,12 +402,20 @@ The first 16-bit of the `uint32` field will store the `SERVICEGROUP_ID`. - Other errors <> | 1 -| SERVICE_GROUP_STATUS +| SERVICE_GROUP_VERSION | uint32 -| Service group implementation status. +| Service group version. +[cols="2,5a", options="header"] +!=== +! Bits +! Description + +! [31:16] +! `MAJOR` number - 1: Implemented - 0: Not implemented +! [15:0] +! `MINOR` number +!=== |=== ==== Service: BASE_GET_ATTRIBUTES (SERVICE_ID: 0x07) @@ -402,7 +424,10 @@ 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 @@ -437,8 +462,14 @@ service group. ! Bits ! Description -! [31:2] -! _Reserved_ and must be `0`. +! [31:3] +! _Reserved_, must be initialized to `0`. + +! [2] +! RPMI instance privilege level. + + 0b1: M-mode + 0b0: Non M-mode ! [1] ! EVENT_NOTIFICATION + @@ -456,17 +487,17 @@ service group. | 2 | FLAGS1 | uint32 -| _Reserved_ and must be `0`. +| _Reserved_, must be initialized to `0`. | 3 | FLAGS2 | uint32 -| _Reserved_ and must be `0`. +| _Reserved_, must be initialized to `0`. | 4 | FLAGS3 | uint32 -| _Reserved_ and must be `0`. +| _Reserved_, must be initialized to `0`. |=== ==== Service: BASE_SET_MSI (SERVICE_ID: 0x08) @@ -512,7 +543,7 @@ processor will take the wired interrupt. | 2 | MSI_DATA | uint32 -| 32-bit of MSI data. +| 32-bit MSI data |=== [#table_base_setmsi_response_data] @@ -529,7 +560,7 @@ processor will take the wired interrupt. | int32 | Return error code -[cols="5,5a", options="header"] +[cols="7,5a", options="header"] !=== ! Error Code ! Description @@ -538,8 +569,7 @@ processor will take the wired interrupt. ! MSI address and data are configured successfully. ! RPMI_ERR_NOT_SUPPORTED -! MSI is not supported. The implementation must use `BASE_GET_ATTRIBUTES` -service to discover this capability and then use this service. +! MSI is not supported. ! RPMI_ERR_INVALID_ADDR ! MSI address is not `4-byte` aligned. From c15e8f4a5dee57026ddcd5ec1292bae20016cf2a Mon Sep 17 00:00:00 2001 From: Rahul Pathak Date: Fri, 6 Sep 2024 23:24:47 +0530 Subject: [PATCH 3/7] Add RPMI MPXY integration chapter Signed-off-by: Rahul Pathak --- images/mpxy-rpmi.png | Bin 0 -> 67447 bytes riscv-rpmi.adoc | 2 ++ src/rpmi-mpxy.adoc | 41 ++++++++++++++++++++++++++++++++++++++++ src/service-groups.adoc | 16 +++++++++++++++- 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 images/mpxy-rpmi.png create mode 100644 src/rpmi-mpxy.adoc diff --git a/images/mpxy-rpmi.png b/images/mpxy-rpmi.png new file mode 100644 index 0000000000000000000000000000000000000000..687d318ddb51cad93aea446af35d47da09ac03c8 GIT binary patch literal 67447 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⪙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 Date: Fri, 6 Sep 2024 23:29:32 +0530 Subject: [PATCH 4/7] Formatting changes in CPPC, SysReset, SysSuspend Signed-off-by: Rahul Pathak --- src/srvgrp-cppc.adoc | 5 +++-- src/srvgrp-system-reset.adoc | 3 ++- src/srvgrp-system-suspend.adoc | 10 ++++++---- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/srvgrp-cppc.adoc b/src/srvgrp-cppc.adoc index 8ac18b8..a3e2e46 100644 --- a/src/srvgrp-cppc.adoc +++ b/src/srvgrp-cppc.adoc @@ -86,7 +86,8 @@ made through a fast-channel. If the fast-channels are implemented, the application processor will either write the desired performance level in case of normal mode or the minimum and maximum level in case of Autonomous (CPPC2) mode in the fast-channel. -Otherwise the application processor can call the service `CPPC_WRITE_REG` for the `DesiredPerformanceRegister` or `MinimumPerformanceRegister` and +Otherwise the application processor can call the service `CPPC_WRITE_REG` for the +`DesiredPerformanceRegister` or `MinimumPerformanceRegister` and `MaximumPerformanceRegister`. [#table_cppc_fastchan] @@ -680,4 +681,4 @@ may need to call this service again with the appropriate `START_INDEX` until the | HART_ID[N-1] | uint32 | Hart ID -|=== \ No newline at end of file +|=== diff --git a/src/srvgrp-system-reset.adoc b/src/srvgrp-system-reset.adoc index 91b7900..c9bf650 100644 --- a/src/srvgrp-system-reset.adoc +++ b/src/srvgrp-system-reset.adoc @@ -27,7 +27,8 @@ 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: +The following table lists the services in the SYSTEM_RESET service group: + [#table_sysreset_services] .SYSTEM_RESET Services [cols="1, 3, 2", width=100%, align="center", options="header"] diff --git a/src/srvgrp-system-suspend.adoc b/src/srvgrp-system-suspend.adoc index 3c51651..67245a5 100644 --- a/src/srvgrp-system-suspend.adoc +++ b/src/srvgrp-system-suspend.adoc @@ -18,7 +18,8 @@ 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: +The following table lists the services in the SYSTEM_SUSPEND service group: + [#table_syssuspend_services] .SYSTEM_SUSPEND Services [cols="1, 3, 2", width=100%, align="center", options="header"] @@ -149,7 +150,6 @@ if a `SUSPEND_TYPE` supports resume address. ! RPMI_ERR_INVALID_PARAM ! `SUSPEND_TYPE` is invalid. - !=== - Other errors <> @@ -166,13 +166,15 @@ if a `SUSPEND_TYPE` supports resume address. ! [31:2] ! _Reserved_ and must be `0`. -! [1] ! Resume Address Support + +! [1] +! Resume Address Support + If a `SUSPEND_TYPE` supports custom resume address which platform must configure for the resuming application processor. 0b1: Supported. 0b0: Not supported. -! [0] ! `SUSPEND_TYPE` Support +! [0] +! `SUSPEND_TYPE` Support 0b1: Supported 0b0: Not supported From 81c915f3b1338d80a259e39f1808b0898c36dd7c Mon Sep 17 00:00:00 2001 From: Rahul Pathak Date: Sat, 7 Sep 2024 08:37:33 +0530 Subject: [PATCH 5/7] Change transport association with set of application processors Signed-off-by: Rahul Pathak --- src/transport.adoc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/transport.adoc b/src/transport.adoc index 8b73f8a..3d19486 100644 --- a/src/transport.adoc +++ b/src/transport.adoc @@ -18,8 +18,8 @@ receive messages between the application processor and the platform microcontroller. An RPMI transport instance provides bi-directional communication channels between -a RISC-V privilege level of a set of application processors and a platform -microcontroller. A set of application processors can have multiple RPMI transport +a RISC-V privilege level a application processors and a platform +microcontroller. A application processors can have multiple RPMI transport instances with a platform microcontroller. Similarly, a system can have multiple platform microcontrollers each with its own RPMI transport instance to a set of application processors. The <> shows different RPMI @@ -32,10 +32,10 @@ An RPMI transport instance consists of two logical bi-directional channels for message delivery. Each channel is capable to transfer messages in request-response pairs. A channel which transfers a request message from the application processor to the platform microcontroller and its -response/acknowledgement back to the application processor is called an A2P channel. -Similarly, the channel for request messages from the platform microcontroller to -the application processor is called a P2A channel. The P2A channel also transfers -notification messages to the application processor. +response/acknowledgement back to the application processor is called an A2P +channel. Similarly, the channel for request messages from the platform +microcontroller to the application processor is called a P2A channel. The P2A +channel also transfers notification messages to the application processor. An RPMI transport instance must implement the A2P channel. The P2A channel is optional if the system does not support requests and notification messages from @@ -70,9 +70,9 @@ hardware description mechanisms. image::highlevel-arch-queues.png[align="center"] ==== Shared Memory Queues -The RPMI shared memory based transport consists of four queues where each queue is -unidirectional. The type of message and the direction of message delivery is fixed -for each queue. +The RPMI shared memory based transport consists of four queues where each queue +is unidirectional. The type of message and the direction of message delivery is +fixed for each queue. .Shared Memory Transport Queues [cols="2,6,8a", width=100%, align="center", options="header"] From aca7bbbe4d681baeef25924756f15e02bf1d1bb4 Mon Sep 17 00:00:00 2001 From: Rahul Pathak Date: Sat, 7 Sep 2024 12:19:09 +0530 Subject: [PATCH 6/7] Add changelog and terms adoc Signed-off-by: Rahul Pathak --- riscv-rpmi.adoc | 6 ++++++ src/changelog.adoc | 4 ++++ src/terms.adoc | 11 +++++++++++ 3 files changed, 21 insertions(+) create mode 100644 src/changelog.adoc create mode 100644 src/terms.adoc diff --git a/riscv-rpmi.adoc b/riscv-rpmi.adoc index b74b2b4..5ef8b02 100644 --- a/riscv-rpmi.adoc +++ b/riscv-rpmi.adoc @@ -58,6 +58,12 @@ Copyright 2023 by RISC-V International. [preface] include::src/contributors.adoc[] +[preface] +include::src/changelog.adoc[] + +[preface] +include::src/terms.adoc[] + include::src/intro.adoc[] include::src/transport.adoc[] diff --git a/src/changelog.adoc b/src/changelog.adoc new file mode 100644 index 0000000..89d9368 --- /dev/null +++ b/src/changelog.adoc @@ -0,0 +1,4 @@ +== Changelog + + +[%hardbreaks] \ No newline at end of file diff --git a/src/terms.adoc b/src/terms.adoc new file mode 100644 index 0000000..763c0a6 --- /dev/null +++ b/src/terms.adoc @@ -0,0 +1,11 @@ +== Terms and Abbreviations + +[cols="1,4", width=95%, options="header"] +|=== +| Term | Meaning + +| AP | Application Processor +| ACPI | Advanced Configuration and Power Interface Specification +| CPPC | Collaborative Processor Performance Control +| PuC | Platform Microcontroller +|=== \ No newline at end of file From e89a2bc8cae486d65f293477acc1f0b4355f50ad Mon Sep 17 00:00:00 2001 From: Rahul Pathak Date: Sat, 7 Sep 2024 12:21:53 +0530 Subject: [PATCH 7/7] Add Service group version as mpxy channel attribute Signed-off-by: Rahul Pathak --- src/rpmi-mpxy.adoc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/rpmi-mpxy.adoc b/src/rpmi-mpxy.adoc index 696f78e..d367dd6 100644 --- a/src/rpmi-mpxy.adoc +++ b/src/rpmi-mpxy.adoc @@ -25,7 +25,7 @@ a MPXY channel. [#table_rpmi_mpxy_attributes] .RPMI Attributes for MPXY Channel -[cols="2, 2, 1, 3", width=100%, align="center", options="header"] +[cols="3, 2, 1, 3", width=100%, align="center", options="header"] |=== | Attribute Name | Attribute ID @@ -36,6 +36,11 @@ a MPXY channel. | 0x80000000 | RO | RPMI service group ID + +| SERVICEGROUP_VERSION +| 0x80000001 +| RO +| RPMI service group version |=== TODO: Link to the MPXY Extension chapter in SBI spec (does not exist in SBI spec)