blob: e74033670ff57d0a4840cfac0508f799687ea67e [file] [log] [blame]
/*
* Copyright (c) 2023, Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_SIP_SVC_CONTROLLER_H_
#define ZEPHYR_SIP_SVC_CONTROLLER_H_
/**
* @note This file should only be included by sip_svc driver.
*/
#ifdef CONFIG_ARM_SIP_SVC_SUBSYS
/**
* @brief Length of SVC conduit name in sip svc subsystem.
*
*/
#define SIP_SVC_SUBSYS_CONDUIT_NAME_LENGTH (4)
/**
* @brief Arm SiP Service client data.
*
*/
struct sip_svc_client {
/* Client id internal to sip_svc*/
uint32_t id;
/* Client's token id provided back to client during sip_svc_register() */
uint32_t token;
/* Client's state */
uint32_t state;
/* Total Number of on-going transaction of the client */
uint32_t active_trans_cnt;
/* Private data of each client , Provided during sip_svc_register() */
void *priv_data;
/* Transaction id pool for each client */
struct sip_svc_id_pool *trans_idx_pool;
};
/**
* @brief Arm SiP Services controller data.
*
*/
struct sip_svc_controller {
/* Initialization status*/
bool init;
/* Total number of clients*/
const uint32_t num_clients;
/* Maximum allowable transactions in the system per controller*/
const uint32_t max_transactions;
/* Response size of buffer used for ASYNC transaction*/
const uint32_t resp_size;
/* Total Number of active transactions */
uint32_t active_job_cnt;
/* Active ASYNC transactions */
uint32_t active_async_job_cnt;
/* Supervisory call name , got from dts entry */
char method[SIP_SVC_SUBSYS_CONDUIT_NAME_LENGTH];
/* Pointer to driver instance */
const struct device *dev;
/* Pointer to client id pool */
struct sip_svc_id_pool *client_id_pool;
/* Pointer to database for storing arguments from sip_svc_send() */
struct sip_svc_id_map *trans_id_map;
/* Pointer to client array */
struct sip_svc_client *clients;
/* Pointer to Buffer used for storing response from lower layers */
uint8_t *async_resp_data;
/* Thread id of sip_svc thread */
k_tid_t tid;
#if CONFIG_ARM_SIP_SVC_SUBSYS_SINGLY_OPEN
/* Mutex to restrict one client access */
struct k_mutex open_mutex;
#endif
/* Mutex for protecting database access */
struct k_mutex data_mutex;
/* msgq for sending sip_svc_request to sip_svc thread */
struct k_msgq req_msgq;
/* sip_svc thread object */
struct k_thread thread;
/* Stack object of sip_svc thread */
K_KERNEL_STACK_MEMBER(stack, CONFIG_ARM_SIP_SVC_SUBSYS_THREAD_STACK_SIZE);
};
/**
* @brief Controller define used by sip_svc driver to instantiate each controller.
* Each sip_svc driver will use this API to instantiate a controller for sip_svc
* subsystem to consume, for more details check @ref ITERABLE_SECTION_RAM()
*/
#define SIP_SVC_CONTROLLER_DEFINE(inst, conduit_name, sip_dev, sip_num_clients, \
sip_max_transactions, sip_resp_size) \
static STRUCT_SECTION_ITERABLE(sip_svc_controller, sip_svc_##inst) = { \
.method = conduit_name, \
.dev = sip_dev, \
.num_clients = sip_num_clients, \
.max_transactions = sip_max_transactions, \
.resp_size = sip_resp_size, \
}
#else
#define SIP_SVC_CONTROLLER_DEFINE(inst, conduit_name, sip_dev, sip_num_clients, \
sip_max_transactions, sip_resp_size)
#endif
#endif /* ZEPHYR_SIP_SVC_CONTROLLER_H_ */