| '------------------------------------------------------------------------------- |
| ' Copyright (c) 2023, Arm Limited and Contributors. All rights reserved. |
| ' |
| ' SPDX-License-Identifier: BSD-3-Clause |
| ' |
| '------------------------------------------------------------------------------- |
| |
| @startuml TS RPC call sequence |
| |
| autoactivate on |
| |
| participant "Service caller" as service_caller |
| participant "RPC caller session" as rpc_session |
| participant "TS RPC caller" as rpc_caller |
| participant "SPMC" as spmc |
| participant "TS RPC endpoint" as endpoint |
| participant "Service" as service |
| |
| service_caller -> rpc_session: open(service_uuid) |
| |
| ' Sesssion open |
| rpc_session -> rpc_caller: find_and_open_session(service_uuid) |
| |
| rpc_caller -> spmc: FFA_PARTITION_INFO_GET(ts_rpc_uuid) |
| spmc --> rpc_caller: FF-A endpoint_id |
| |
| rpc_caller -> endpoint: TS_RPC_VERSION_GET |
| endpoint --> rpc_caller: TS RPC protocol version |
| |
| rpc_caller -> endpoint: TS_RPC_SERVICE_INFO_GET(service_uuid) |
| endpoint --> rpc_caller: Service interface_id |
| |
| rpc_caller --> rpc_session: TS RPC status |
| |
| rpc_session --> service_caller: TS RPC status |
| |
| ' Begin |
| service_caller -> rpc_session: begin(request_length, response_max_length) |
| |
| rpc_session -> rpc_session: allocate_buffer(MAX(request_length, response_max_length)) |
| rpc_session --> rpc_session: buffer |
| |
| rpc_session -> rpc_caller: create_shared_memory(endpoint_id, buffer) |
| |
| rpc_caller -> spmc: FFA_MEM_SHARE(endpoint_id, buffer) |
| spmc --> rpc_caller: memory_handle, memory_tag |
| |
| rpc_caller -> endpoint: TS_RPC_MEM_RETRIEVE(memory_handle, memory_tag) |
| |
| endpoint -> spmc: FFA_MEM_RETRIEVE(memory_handle, memory_tag) |
| spmc --> endpoint: buffer |
| |
| endpoint --> rpc_caller: TS RPC status |
| |
| rpc_caller --> rpc_session: TS RPC status, shared_memory |
| |
| rpc_session --> service_caller: Request buffer |
| |
| ' Serialize |
| service_caller -> service_caller: Serialize parameters to request buffer |
| service_caller --> service_caller |
| |
| ' Invoke |
| service_caller -> rpc_session: invoke(opcode) |
| |
| rpc_session -> rpc_caller: call(opcode, shared_memory, request_length) |
| |
| rpc_caller -> endpoint: service_call(interface_id, opcode, memory_handle, request_length) |
| |
| endpoint -> service: service_call(opcode, request) |
| service --> endpoint: service status, response |
| |
| endpoint --> rpc_caller: TS RPC status, service status, response length |
| |
| rpc_caller --> rpc_session: TS RPC status, service status, response length |
| |
| rpc_session --> service_caller: TS RPC status, service status, response |
| |
| ' Deserialize |
| service_caller -> service_caller: Deserialize return values from the response buffer |
| service_caller --> service_caller |
| |
| ' End |
| service_caller -> rpc_session: end() |
| |
| rpc_session -> rpc_caller: release_shared_memory(shared_memory) |
| |
| rpc_caller -> endpoint: TS_RPC_MEM_RELINQUISH(memory_handle) |
| |
| endpoint -> spmc: FFA_MEMORY_RELINQUISH(memory_handle) |
| spmc --> endpoint: FFA_SUCCESS |
| |
| endpoint --> rpc_caller: TS RPC status |
| |
| rpc_caller -> spmc: FFA_MEM_RECLAIM(memory_handle) |
| spmc --> rpc_caller: FFA_SUCCESS |
| |
| rpc_caller -> rpc_caller: free(buffer) |
| rpc_caller --> rpc_caller |
| |
| rpc_caller --> rpc_session: TS RPC status |
| |
| rpc_session --> service_caller: TS RPC status |
| |
| service_caller -> rpc_session: close() |
| rpc_session --> service_caller: TS RPC status |
| @enduml |