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_ */
|