1'------------------------------------------------------------------------------- 2' Copyright (c) 2023, Arm Limited and Contributors. All rights reserved. 3' 4' SPDX-License-Identifier: BSD-3-Clause 5' 6'------------------------------------------------------------------------------- 7 8@startuml TS RPC call sequence 9 10autoactivate on 11 12participant "Service caller" as service_caller 13participant "RPC caller session" as rpc_session 14participant "TS RPC caller" as rpc_caller 15participant "SPMC" as spmc 16participant "TS RPC endpoint" as endpoint 17participant "Service" as service 18 19service_caller -> rpc_session: open(service_uuid) 20 21' Sesssion open 22rpc_session -> rpc_caller: find_and_open_session(service_uuid) 23 24rpc_caller -> spmc: FFA_PARTITION_INFO_GET(ts_rpc_uuid) 25spmc --> rpc_caller: FF-A endpoint_id 26 27rpc_caller -> endpoint: TS_RPC_VERSION_GET 28endpoint --> rpc_caller: TS RPC protocol version 29 30rpc_caller -> endpoint: TS_RPC_SERVICE_INFO_GET(service_uuid) 31endpoint --> rpc_caller: Service interface_id 32 33rpc_caller --> rpc_session: TS RPC status 34 35rpc_session --> service_caller: TS RPC status 36 37' Begin 38service_caller -> rpc_session: begin(request_length, response_max_length) 39 40rpc_session -> rpc_session: allocate_buffer(MAX(request_length, response_max_length)) 41rpc_session --> rpc_session: buffer 42 43rpc_session -> rpc_caller: create_shared_memory(endpoint_id, buffer) 44 45rpc_caller -> spmc: FFA_MEM_SHARE(endpoint_id, buffer) 46spmc --> rpc_caller: memory_handle, memory_tag 47 48rpc_caller -> endpoint: TS_RPC_MEM_RETRIEVE(memory_handle, memory_tag) 49 50endpoint -> spmc: FFA_MEM_RETRIEVE(memory_handle, memory_tag) 51spmc --> endpoint: buffer 52 53endpoint --> rpc_caller: TS RPC status 54 55rpc_caller --> rpc_session: TS RPC status, shared_memory 56 57rpc_session --> service_caller: Request buffer 58 59' Serialize 60service_caller -> service_caller: Serialize parameters to request buffer 61service_caller --> service_caller 62 63' Invoke 64service_caller -> rpc_session: invoke(opcode) 65 66rpc_session -> rpc_caller: call(opcode, shared_memory, request_length) 67 68rpc_caller -> endpoint: service_call(interface_id, opcode, memory_handle, request_length) 69 70endpoint -> service: service_call(opcode, request) 71service --> endpoint: service status, response 72 73endpoint --> rpc_caller: TS RPC status, service status, response length 74 75rpc_caller --> rpc_session: TS RPC status, service status, response length 76 77rpc_session --> service_caller: TS RPC status, service status, response 78 79' Deserialize 80service_caller -> service_caller: Deserialize return values from the response buffer 81service_caller --> service_caller 82 83' End 84service_caller -> rpc_session: end() 85 86rpc_session -> rpc_caller: release_shared_memory(shared_memory) 87 88rpc_caller -> endpoint: TS_RPC_MEM_RELINQUISH(memory_handle) 89 90endpoint -> spmc: FFA_MEMORY_RELINQUISH(memory_handle) 91spmc --> endpoint: FFA_SUCCESS 92 93endpoint --> rpc_caller: TS RPC status 94 95rpc_caller -> spmc: FFA_MEM_RECLAIM(memory_handle) 96spmc --> rpc_caller: FFA_SUCCESS 97 98rpc_caller -> rpc_caller: free(buffer) 99rpc_caller --> rpc_caller 100 101rpc_caller --> rpc_session: TS RPC status 102 103rpc_session --> service_caller: TS RPC status 104 105service_caller -> rpc_session: close() 106rpc_session --> service_caller: TS RPC status 107@enduml 108