From 51e56e85dc0f2fd7ed73f68c1223d81aa2b7b21b Mon Sep 17 00:00:00 2001 From: Rahul Pathak Date: Wed, 21 Aug 2024 19:43:45 +0530 Subject: [PATCH] Update CPPC service group Signed-off-by: Rahul Pathak --- src/srvgrp-cppc.adoc | 716 +++++++++++++++++++++++++++++++++---------- 1 file changed, 550 insertions(+), 166 deletions(-) diff --git a/src/srvgrp-cppc.adoc b/src/srvgrp-cppc.adoc index 1359abf..c5e6467 100644 --- a/src/srvgrp-cppc.adoc +++ b/src/srvgrp-cppc.adoc @@ -9,291 +9,675 @@ ifndef::rootpath[] :rootpath: ./../ endif::rootpath[] -=== Service Group - *CPPC* (servicegroup_id: 0x00005) -This service group defines the services to control CPU performance by managing a set of registers and a dedicated physical memory block, which will define Fast-channel access to each hart in the system. Hart writes a specific 32 bits desired performance number in Fast-channel memory. PuC decodes the request and performs the corresponding CPPC operations. +=== Service Group - CPPC (SERVICEGROUP_ID: 0x00005) +This service group defines the services to control application processor +performance by managing a set of registers per application processor +that are used for performance management and control. The ACPI CPPC + (Collaborative Processor Performance Control) is an abstract and flexible +mechanism that allows application processor to collaborate with the platform +microcontroller to control the performance. + +The CPPC extension defined in the RISC-V SBI specification cite:[SBI] defines +the register IDs for the standard CPPC registers, along with additional +registers also required by the application processor. + +The ACPI CPPC specification cite:[ACPI] provides the details of the CPPC registers +and also provides details on the performance control mechanism through CPPC. + +This service group works with the abstract performance scale defined by the ACPI +CPPC and is managed by the platform which is responsible for the conversion +between the abstract performance level and the internal performance operating +point. + +The platform may have multiple application processors that share the actual +performance controls like clock, voltage regulator and others depending on the +platform. In such cases a performance level change for one application processor +will affect the entire the group sharing the controls. Its the responsibility of +the power/performance management software running on the application processor +and the platform to coordinate and manage the group level performance changes. + +The following table lists the services in the CPPC service group: -CPPC physical memory will have enough space to accommodate all available harts. Hart can send an RPMI message GET_CPPC_PERF_CHAN_ADDR to query the physical address of that particular hart. +[#table_cppc_services] +.CPPC Services +[cols="1, 3, 2", width=100%, align="center", options="header"] +|=== +| Service ID +| Service Name +| Request Type -Once Hart receives the physical address of the REQ-ACK registers, Hart clears the acknowledgement register and writes a performance counter value in the request register and a sequence number in the sequence number register. On observing this request, PuC changes the performance state and writes the sequence number value of the original request in the Acknowledgement register. That completes the request. +| 0x01 +| CPPC_ENABLE_NOTIFICATION +| NORMAL_REQUEST -PROBE_CPPC_REG service can be used to check if a particular CPPC register is implemented. The service READ_CPPC_REG can be used to read all implemented CPPC register values and WRITE_CPPC_REG can be used to write the registers. +| 0x02 +| CPPC_PROBE_REG +| NORMAL_REQUEST -For extra debugging, Hart can send a GET_CPPC_PERF_POKE message to exclusively request PuC to process the pending CPPC requests, if any. +| 0x03 +| CPPC_READ_REG +| NORMAL_REQUEST -For more information on CPPC, please refer to the ACPI Specification cite:[ACPI] and the CPPC Extension in the RISC-V SBI Specification cite:[SBI]. +| 0x04 +| CPPC_WRITE_REG +| NORMAL_REQUEST -CPPC Fast-channel REQ-ACK Memory Entry per Hart: -[#table_cppc_fastchan_mem] -.CPPC Fast-Channel Memory Entry -[cols="1, 3, 2", width=100%, align="center", options="header"] -|=== -| Word | Description | Entity which writes the word -| 0 | Request Sequence Number Register | AP -| 1 | Request Register | AP -| 2 | Acknowledgement Register | PuC -| 3 | Reserved | None +| 0x05 +| CPPC_GET_FAST_CHANNEL_REGION +| NORMAL_REQUEST + +| 0x06 +| CPPC_GET_FAST_CHANNEL_OFFSET +| NORMAL_REQUEST + +| 0x07 +| CPPC_GET_HART_LIST +| NORMAL_REQUEST |=== -Below table lists the services in this group: -[#table_cppc_services] -.CPPC Services -[cols="1, 3, 2", width=100%, align="center", options="header"] +==== CPPC Fast-channel +The CPPC service group defines the fast-channels to be used by the application +processor for requesting performance level change. A fast-channel is a shared memory +with a layout specific to the CPPC service group and the data written in a +fast-channel do not follow the conventional RPMI message format. The simple data +format supported by the fast-channel allows faster processing of the requests +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 +`MaximumPerformanceRegister`. + +[#table_cppc_fastchan] +.CPPC Fast-channel Layout +[cols="2, 3a", width=100%, align="center", options="header"] |=== -| Service ID | Service Name | Request Type -| 0x01 | CPPC_ENABLE_NOTIFICATION | NORMAL_REQUEST -| 0x02 | CPPC_PROBE_REG | NORMAL_REQUEST -| 0x03 | CPPC_READ_REG | NORMAL_REQUEST -| 0x04 | CPPC_WRITE_REG | NORMAL_REQUEST -| 0x05 | CPPC_GET_FAST_CHANNEL_ATTRIBUTES | NORMAL_REQUEST -| 0x06 | CPPC_POKE_FAST_CHANNEL | NORMAL_REQUEST -| 0x07 | CPPC_GET_HART_LIST | NORMAL_REQUEST +| CPPC Mode +| Layout + +| Normal Mode +| +[cols="1,2a", options="header"] +!=== +! Offset +! Value (32-bit) + +! 0x0 +! Desired performance level +! 0x4 +! _Reserved_ +!=== + +| Autonomous (CPPC2) mode +| +[cols="1,2a", options="header"] +!=== +! Offset +! Value (32-bit) + +! 0x0 +! Minimum Performance Level +! 0x4 +! Maximum Performance Level +!=== + |=== +Each application processor must be assigned a fast-channel, which is managed by +the CPPC service group for performance control. + +The size of the shared memory region for fast-channels for all the managed +application processors must be a `power-of-2` and a multiple of the size of each +fast-channel. The `base-address` and `size` (bytes) of the fast-channels shared +memory region can be discovered using the service `CPPC_GET_FAST_CHANNEL_REGION`. +The layout of each fast-channel which depends on the CPPC mode, either normal or +autonomous mode can also be discovered through the same service. + +A fast-channel size for a application processor is of `8-byte` with two fields +of `4-byte` each. A fast-channel must be naturally aligned to the size of the +fast-channel. + +The offset of a fast-channel entry belonging to a application processor in that +shared memory region can be discovered through service `CPPC_GET_FAST_CHANNEL_OFFSET`. +The offset can be added into the `base-address` of the shared memory region to +form the address of a application processor fast-channel. + +===== Fast-channel Doorbell +A doorbell can also be supported with fast-channels which is shared between +all the application processors. If a doorbell is available then it must be +supported through a read-modify-write sequence to a memory-mapped register. +The doorbell details and attributes can be discovered by the application processor +through the defined service in this service group. [#cppc-notifications] -==== CPPC +==== Notifications This service group does not support any event for notification. - - -==== Service: *CPPC_ENABLE_NOTIFICATION* -This service allows AP to subscribe to CPPC service group notifications. -Platform can optionally support notifications of events which might occur in -the platform. PuC can send these notification messages to AP if they are -implemented and AP has subscribed to these. Events supported are described -in <>. +==== Service: CPPC_ENABLE_NOTIFICATION (SERVICE_ID: 0x01) +This service allows the application processor to subscribe to `CPPC` +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_cppc_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_cppc_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 error code +[cols="5,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_ERR_INVALID_PARAM +! `EVENT_ID` is invalid. + +! RPMI_ERR_NOT_SUPPORTED +! Notification is not supported. !=== - Other errors <> |=== - - -==== Service: *CPPC_PROBE_REG* -Probe for CPPC register and get its length in bytes. If the register is not -implemented, REG_LENGTH returned will be zero. +==== Service: CPPC_PROBE_REG (SERVICE_ID: 0x02) +This service is used to probe a CPPC register implementation status for a +application processor. If the CPPC register `reg_id` is implemented then +the length in bits is returned in `REG_LENGTH` field. If the register is not +supported or invalid then the `REG_LENGTH` will be `0`. [#table_cppc_probereg_request_data] .Request Data [cols="1, 2, 1, 7", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | HART_ID | uint32 | Hart ID -| 1 | REG_ID | uint32 | Register ID (refer register ids in -https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-cppc.adoc[SBI Spec]) +| Word +| Name +| Type +| Description + +| 0 +| REG_ID +| uint32 +| CPPC register ID + +| 1 +| HART_ID +| uint32 +| Hart ID |=== [#table_cppc_probereg_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 error code +[cols="5,5a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Service completed successfully and probing details returned. -! RPMI_ERROR_NOT_FOUND ! HART_ID not found +! Error Code +! Description + +! RPMI_SUCCESS +! CPPC register probed successfully. + +! RPMI_ERR_INVALID_PARAM +! `HART_ID` or `REG_ID` is invalid. + +! RPMI_ERR_NOT_SUPPORTED +! `REG_ID` is not supported. !=== - Other errors <> -| 1 | REG_LENGTH | uint32 | Register Length -|=== - +| 1 +| REG_LENGTH +| uint32 +| Register length (bits) +|=== -==== Service: *CPPC_READ_REG* -Read CPPC register value +==== Service: CPPC_READ_REG (SERVICE_ID: 0x03) +This service is used to read a CPPC register. If the fast-channels are +supported, a read of the `DesiredPerformanceRegister` or +`MinimumPerformanceRegister` and `MaximumPerformanceRegister` through this +service will return the current desired performance level or +minimum and maximum performance level limit depending on the CPPC mode from the +fast-channel of a application processor. [#table_cppc_readreg_request_data] .Request Data [cols="1, 2, 1, 7", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | HART_ID | uint32 | Hart ID -| 1 | REG_ID | uint32 | Register ID (refer register ids in -https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-cppc.adoc[SBI Spec]) +| Word +| Name +| Type +| Description + +| 0 +| REG_ID +| uint32 +| CPPC register ID + +| 1 +| HART_ID +| uint32 +| Hart ID |=== [#table_cppc_readreg_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="6,5"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return error code +[cols="6,5", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Service completed successfully. -! RPMI_ERROR_NOT_FOUND ! HART_ID not found -! RPMI_ERROR_INVALID_PARAMETER ! REG_ID is invalid or not implemented. AP must -probe the REG_ID before reading. +! Error Code +! Description + +! RPMI_SUCCESS +! Service completed successfully. + +! RPMI_ERR_INVALID_PARAM +! `HART_ID` or `REG_ID` is invalid. + +! RPMI_ERR_NOT_SUPPORTED +! `REG_ID` is not supported. !=== - Other errors <> -| 1 | DATA_LOW | uint32 | Lower `32 bits` of data -| 2 | DATA_HIGH | uint32 | Upper `32 bits` of data -|=== +| 1 +| DATA_LOW +| uint32 +| Lower `32-bit` of the data. +| 2 +| DATA_HIGH +| uint32 +| Upper `32-bit` of data. This will be `0` if the register is of `32-bit` +length. +|=== -==== Service: *CPPC_WRITE_REG* -Write a CPPC register +==== Service: CPPC_WRITE_REG (SERVICE_ID: 0x04) +This service is used to write a CPPC register. + +If the fast-channels are supported the application processor must only write +desired performance level in the fast-channel instead of writing into the +`DesiredPerformanceRegister` through this service. Similarly, in case of the +autonomous mode the application processor must write minimum and maximum limit +levels into the fast-channel instead of calling this service for +`MinimumPerformanceRegister` and `MaximumPerformanceRegister`. Otherwise the +writes to these registers may be ignored. [#table_cppc_writereg_request_data] .Request Data [cols="1, 2, 1, 7", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | HART_ID | uint32 | Hart ID -| 1 | REG_ID | uint32 | Register ID (refer register ids in -https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-cppc.adoc[SBI Spec]) -| 2 | DATA_LOW | uint32 | Lower `32 bits` of data -| 3 | DATA_HIGH | uint32 | Upper `32 bits` of data +| Word +| Name +| Type +| Description + +| 0 +| REG_ID +| uint32 +| CPPC register ID + +| 1 +| HART_ID +| uint32 +| Hart ID + +| 2 +| DATA_LOW +| uint32 +| Lower `32-bit` of data. + +| 3 +| DATA_HIGH +| uint32 +| Upper `32-bit` of data. This is ignored if the register is of `32-bit` length. |=== [#table_cppc_writereg_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="6,5"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return error code +[cols="6,5", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Service completed successfully. -! RPMI_ERROR_NOT_FOUND ! HART_ID not found -! RPMI_ERROR_INVALID_PARAMETER ! REG_ID is invalid or not implemented. AP must -probe the REG_ID before reading. +! Error Code +! Description + +! RPMI_SUCCESS +! Service completed successfully. + +! RPMI_ERR_INVALID_PARAM +! `HART_ID` or `REG_ID` is invalid. + +! RPMI_ERR_NOT_SUPPORTED +! `REG_ID` is not supported. + +! RPMI_ERR_DENIED +! `REG_ID` is read only. !=== - Other errors <> |=== +==== Service: CPPC_GET_FAST_CHANNEL_REGION (SERVICE_ID: 0x05) +This service is used to get the details of the shared memory region containing +all the fast-channels, attributes of the fast-channel and the details of the +doorbell. - -==== Service: *CPPC_GET_FAST_CHANNEL_ATTRIBUTES* -This request retrieves attributes of the Fast-channel for a specified hart ID. -The physical address from this request shall be used to write the value of the https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/08_Processor_Configuration_and_Control/declaring-processors.html?highlight=desired-performance-register#desired-performance-register[CPPC Desired -Performance Register]. - -[#table_cppc_getfastchanaddr_request_data] +[#table_cppc_getfastchanregion_request_data] .Request Data [cols="1, 2, 1, 7", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | HART_ID | uint32 | Hart ID +| Word +| Name +| Type +| Description + +| 0 +| HART_ID +| uint32 +| Hart ID |=== -[#table_cppc_getfastchanaddr_response_data] +[#table_cppc_getfastchanregion_response_data] .Response Data -[cols="1, 2, 1, 7a", width=100%, align="center", options="header"] +[cols="1, 4, 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 error code +[cols="2,1", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Service completed successfully. -! RPMI_ERROR_NOT_FOUND ! HART_ID not found -! RPMI_ERROR_NOT_SUPPORTED ! Fast-channel not implemented +! Error Code +! Description + +! RPMI_SUCCESS +! Service completed successfully. + +! RPMI_ERR_INVALID_PARAM +! `HART_ID` is invalid. + +! RPMI_ERR_NOT_SUPPORTED +! Fast-channels not supported. !=== - Other errors <> -| 1 | FLAGS | uint32 | -[cols="2,5a"] +| 1 +| FLAGS +| uint32 +| [cols="1,5a", options="header"] !=== -! *Bits* ! *Description* -! [31:3] ! _Reserved_ -! [2:1] ! Doorbell Register Width - - 0b00: 8 bits - 0b01: 16 bits - 0b10: 32 bits - 0b11: 64 bits -! [0] ! - - 0b0: Doorbell not supported - 0b1: Doorbell supported -!=== -| 2 |PHYS_ADDR_LOW | uint32 | Lower `32 bits` of physical address -| 3 |PHYS_ADDR_HIGH | uint32 | Upper `32 bits` of physical address -| 4 |DB_ADDR_LOW | uint32 | Lower `32 bits` of doorbell address -| 5 |DB_ADDR_HIGH | uint32 | Upper `32 bits` of doorbell address -| 6 |DB_ID_LOW | uint32 | Lower `32 bits` of doorbell ID -| 7 |DB_ID_HIGH | uint32 | Upper `32 bits` of doorbell ID -|=== +! Bits +! Description + +! [31:5] +! _Reserved, must be initialized to_ `0`. + +! [4:3] +! CPPC mode + 0b00: Normal mode. + Desired performance level for performance change. + + 0b01: Autonomous mode. + Performance limit change. Platform can choose the level in the requested limit. + 0b10 - 0b11: Reserved. -==== Service: *CPPC_POKE_FAST_CHANNEL* -Debug request message to poke the PuC FW to process the pending CPPC messages if -any. +! [2:1] +! Doorbell register width -[#table_cppc_pokefastchan_request_data] + 0b00: `8-bit` + 0b01: `16 bit` + 0b10: `32 bit` + 0b11: `64 bit` +! [0] +! Doorbell support. + + 0b1: Supported + 0b0: Not supported +!=== + +| 2 +| REGION_ADDR_LOW +| uint32 +| Lower `32-bit` of the fast-channels shared memory region physical address. + +| 3 +| REGION_ADDR_HIGH +| uint32 +| Upper `32-bit` of the fast-channels shared memory region physical address. + +| 4 +| REGION_SIZE_LOW +| uint32 +| Lower `32-bit` of the fast-channels shared memory region size. + +| 5 +| REGION_SIZE_HIGH +| uint32 +| Upper `32-bit` of the fast-channels shared memory region size. + +| 6 +| DB_ADDR_LOW +| uint32 +| Lower `32-bit` of doorbell address. + +| 7 +| DB_ADDR_HIGH +| uint32 +| Upper `32-bit` of doorbell address. + +| 8 +| DB_SETMASK_LOW +| uint32 +| Lower `32-bit` of doorbell set mask. + +| 9 +| DB_SETMASK_HIGH +| uint32 +| Upper `32-bit` of doorbell set mask. + +| 10 +| DB_PRESERVEMASK_LOW +| uint32 +| Lower `32-bit` doorbell preserve mask. + +| 11 +| DB_PRESERVEMASK_HIGH +| uint32 +| Upper `32-bit` doorbell preserve mask. +|=== + +==== Service: CPPC_GET_FAST_CHANNEL_OFFSET (SERVICE_ID: 0x06) +This service is used to get the offset of a fast-channel of an application +processor in the shared memory region containing all the fast-channels. + +[#table_cppc_getfastchanoffset_request_data] .Request Data [cols="1, 2, 1, 7", width=100%, align="center", options="header"] -- NA +|=== +| Word +| Name +| Type +| Description + +| 0 +| HART_ID +| uint32 +| Hart ID +|=== -[#table_cppc_pokefastchan_response_data] +[#table_cppc_getfastchanoffset_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,5"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return error code +[cols="1,1a", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Fast-channel poked and service completed successfully. +! Error Code +! Description + +! RPMI_SUCCESS +! Service completed successfully. + +! RPMI_ERR_INVALID_PARAM +! `HART_ID` is invalid. + +! RPMI_ERR_NOT_SUPPORTED +! Fast-channels not supported. !=== - Other errors <> -|=== +| 1 +| OFFSET_LOW +| uint32 +| Lower `32-bit` of a fast-channel offset. + +| 2 +| OFFSET_HIGH +| uint32 +| Upper `32-bit` of a fast-channel offset. +|=== +==== Service: CPPC_GET_HART_LIST (SERVICE_ID: 0x07) +This service retrieves the list of Hart IDs managed by this service group +for performance control. -==== Service: *CPPC_GET_HART_LIST* -This service gets the list of a hart with a specified hart ID start index. +If the number of words required for all available Hart IDs exceeds the number of +words that can be returned in one acknowledgement message then the platform +microcontroller will set the `REMAINING` and `RETURNED` fields accordingly and +only return the hart IDs which can be accommodated. The application processor +may need to call this service again with the appropriate `START_INDEX` until the +`REMAINING` field returns `0`. [#table_cppc_gethartlist_request_data] .Request Data [cols="1, 2, 1, 7", width=100%, align="center", options="header"] |=== -| Word | Name | Type | Description -| 0 | START_INDEX | uint32 | Starting index of Hart ID +| Word +| Name +| Type +| Description + +| 0 +| START_INDEX +| uint32 +| Starting index of Hart ID. |=== [#table_cppc_gethartlist_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="6,5"] +| Word +| Name +| Type +| Description + +| 0 +| STATUS +| int32 +| Return error code +[cols="6,5", options="header"] !=== -! *Error Code* ! *Description* -! RPMI_SUCCESS ! Service completed successfully. -! RPMI_ERROR_INVALID_PARAMETER ! Invalid START_INDEX +! Error Code +! Description + +! RPMI_SUCCESS +! Service completed successfully. + +! RPMI_ERR_BAD_RANGE +! `START_INDEX` is not in valid range. !=== - Other errors <> -| 1 | REMAINING | uint32 | Remaining number of items to be returned -| 2 | RETURNED | uint32 | Total number of items returned in this request. -| 3 | HART_ID[0] | uint32 | Hart ID -| 4 | HART_ID[1] | uint32 | Hart ID -| N+2 | HART_ID[N-1] | uint32 | Hart ID + +| 1 +| REMAINING +| uint32 +| Remaining number of Hart IDs to be returned. + +| 2 +| RETURNED +| uint32 +| Number of Hart IDs returned in this request. + +| 3 +| HART_ID[0] +| uint32 +| Hart ID + +| 4 +| HART_ID[1] +| uint32 +| Hart ID + +| N+2 +| HART_ID[N-1] +| uint32 +| Hart ID |=== \ No newline at end of file