Line data Source code
1 0 : /* 2 : * Copyright (c) 2023, Intel Corporation. 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef ZEPHYR_SIP_SVC_CONTROLLER_H_ 8 : #define ZEPHYR_SIP_SVC_CONTROLLER_H_ 9 : 10 : /** 11 : * @note This file should only be included by sip_svc driver. 12 : */ 13 : 14 : #ifdef CONFIG_ARM_SIP_SVC_SUBSYS 15 : 16 : #include <zephyr/sys/atomic.h> 17 : 18 : /** 19 : * @brief Length of SVC conduit name in sip svc subsystem. 20 : * 21 : */ 22 : #define SIP_SVC_SUBSYS_CONDUIT_NAME_LENGTH (4U) 23 : 24 : /** 25 : * @brief Open lock states in sip_svc atomic variable 26 : */ 27 : enum open_state { 28 : SIP_SVC_OPEN_UNLOCKED = 0, 29 : SIP_SVC_OPEN_LOCKED 30 : }; 31 : 32 : /** 33 : * @brief Arm SiP Service client data. 34 : * 35 : */ 36 : struct sip_svc_client { 37 : 38 : /* Client id internal to sip_svc*/ 39 : uint32_t id; 40 : /* Client's token id provided back to client during sip_svc_register() */ 41 : uint32_t token; 42 : /* Client's state */ 43 : uint32_t state; 44 : /* Total Number of on-going transaction of the client */ 45 : uint32_t active_trans_cnt; 46 : /* Private data of each client , Provided during sip_svc_register() */ 47 : void *priv_data; 48 : /* Transaction id pool for each client */ 49 : struct sip_svc_id_pool *trans_idx_pool; 50 : }; 51 : 52 : /** 53 : * @brief Arm SiP Services controller data. 54 : * 55 : */ 56 : struct sip_svc_controller { 57 : 58 : /* Initialization status*/ 59 : bool init; 60 : /* Total number of clients*/ 61 : const uint32_t num_clients; 62 : /* Maximum allowable transactions in the system per controller*/ 63 : const uint32_t max_transactions; 64 : /* Response size of buffer used for ASYNC transaction*/ 65 : const uint32_t resp_size; 66 : /* Total Number of active transactions */ 67 : uint32_t active_job_cnt; 68 : /* Active ASYNC transactions */ 69 : uint32_t active_async_job_cnt; 70 : /* Supervisory call name , got from dts entry */ 71 : char method[SIP_SVC_SUBSYS_CONDUIT_NAME_LENGTH]; 72 : /* Pointer to driver instance */ 73 : const struct device *dev; 74 : /* Pointer to client id pool */ 75 : struct sip_svc_id_pool *client_id_pool; 76 : /* Pointer to database for storing arguments from sip_svc_send() */ 77 : struct sip_svc_id_map *trans_id_map; 78 : /* Pointer to client array */ 79 : struct sip_svc_client *clients; 80 : /* Pointer to Buffer used for storing response from lower layers */ 81 : uint8_t *async_resp_data; 82 : /* Thread id of sip_svc thread */ 83 : k_tid_t tid; 84 : 85 : #if CONFIG_ARM_SIP_SVC_SUBSYS_SINGLY_OPEN 86 : /* Atomic variable to restrict one client access */ 87 : atomic_t open_lock; 88 : #endif 89 : /* Mutex for protecting database access */ 90 : struct k_mutex data_mutex; 91 : /* msgq for sending sip_svc_request to sip_svc thread */ 92 : struct k_msgq req_msgq; 93 : /* sip_svc thread object */ 94 : struct k_thread thread; 95 : /* Stack object of sip_svc thread */ 96 : K_KERNEL_STACK_MEMBER(stack, CONFIG_ARM_SIP_SVC_SUBSYS_THREAD_STACK_SIZE); 97 : }; 98 : 99 : /** 100 : * @brief Controller define used by sip_svc driver to instantiate each controller. 101 : * Each sip_svc driver will use this API to instantiate a controller for sip_svc 102 : * subsystem to consume, for more details check @ref ITERABLE_SECTION_RAM() 103 : */ 104 : #define SIP_SVC_CONTROLLER_DEFINE(inst, conduit_name, sip_dev, sip_num_clients, \ 105 : sip_max_transactions, sip_resp_size) \ 106 : BUILD_ASSERT( \ 107 : ((sip_num_clients <= CONFIG_ARM_SIP_SVC_SUBSYS_MAX_CLIENT_COUNT) && \ 108 : (sip_num_clients > 0)), \ 109 : "Number of client should be within 1 and ARM_SIP_SVC_SUBSYS_MAX_CLIENT_COUNT"); \ 110 : static STRUCT_SECTION_ITERABLE(sip_svc_controller, sip_svc_##inst) = { \ 111 : .method = conduit_name, \ 112 : .dev = sip_dev, \ 113 : .num_clients = sip_num_clients, \ 114 : .max_transactions = sip_max_transactions, \ 115 : .resp_size = sip_resp_size, \ 116 : } 117 : 118 : #else 119 : #define SIP_SVC_CONTROLLER_DEFINE(inst, conduit_name, sip_dev, sip_num_clients, \ 120 1 : sip_max_transactions, sip_resp_size) 121 : #endif 122 : 123 : #endif /* ZEPHYR_SIP_SVC_CONTROLLER_H_ */