LCOV - code coverage report
Current view: top level - zephyr/sip_svc - sip_svc.h Hit Total Coverage
Test: new.info Lines: 9 13 69.2 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           1 : /*
       2             :  * Copyright (c) 2022-2023, Intel Corporation.
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef ZEPHYR_INCLUDE_SIP_SVC_H_
       8             : #define ZEPHYR_INCLUDE_SIP_SVC_H_
       9             : 
      10             : /**
      11             :  * @file
      12             :  * @brief Public API for ARM SiP services
      13             :  *
      14             :  * ARM SiP service provides the capability to send the
      15             :  * SMC/HVC call from kernel running at EL1 to hypervisor/secure
      16             :  * monitor firmware running at EL2/EL3.
      17             :  *
      18             :  * Only allow one SMC and one HVC per system.
      19             :  *
      20             :  * The service support multiple clients.
      21             :  *
      22             :  * The client must open a channel before sending any request and
      23             :  * close the channel immediately after complete. The service only
      24             :  * allow one channel at one time.
      25             :  *
      26             :  * The service will return the SMC/HVC return value to the client
      27             :  * via callback function.
      28             :  *
      29             :  * The client state machine
      30             :  * - INVALID: Invalid state before registration.
      31             :  * - IDLE   : Initial state.
      32             :  * - OPEN   : The client will switch from IDLE to OPEN once it
      33             :  *            successfully open the channel. On the other hand, it
      34             :  *            will switch from OPEN to IDLE state once it successfully
      35             :  *            close the channel.
      36             :  * - ABORT  : The client has closed the channel, however, there are
      37             :  *            incomplete transactions being left over. The service
      38             :  *            will only move the client back to IDLE state once all
      39             :  *            transactions completed. The client is not allowed to
      40             :  *            re-open the channel when in ABORT state/
      41             :  */
      42             : 
      43             : #include <zephyr/kernel.h>
      44             : #include <zephyr/arch/arm64/arm-smccc.h>
      45             : #include <zephyr/drivers/sip_svc/sip_svc_proto.h>
      46             : 
      47           0 : #define SIP_SVC_CLIENT_ST_INVALID 0
      48           0 : #define SIP_SVC_CLIENT_ST_IDLE    1
      49           0 : #define SIP_SVC_CLIENT_ST_OPEN    2
      50           0 : #define SIP_SVC_CLIENT_ST_ABORT   3
      51             : 
      52             : /** @brief ARM sip service callback function prototype for response after completion
      53             :  *
      54             :  * On success , response is returned via a callback to the user.
      55             :  *
      56             :  * @param c_token Client's token
      57             :  * @param res pointer to struct sip_svc_response
      58             :  */
      59           1 : typedef void (*sip_svc_cb_fn)(uint32_t c_token, struct sip_svc_response *res);
      60             : 
      61             : /**
      62             :  * @brief Register a client on ARM SiP service
      63             :  *
      64             :  * On success, the client will be at IDLE state in the service and
      65             :  * the service will return a token to the client. The client can then
      66             :  * use the token to open the channel on the service and communicate
      67             :  * with hypervisor/secure monitor firmware running at EL2/EL3.
      68             :  *
      69             :  * @param ctrl Pointer to controller instance whose service provides ARM SMC/HVC
      70             :  *            SiP services.
      71             :  * @param priv_data Pointer to client private data.
      72             :  *
      73             :  * @retval token_id on success.
      74             :  * @retval SIP_SVC_ID_INVALID invalid arguments, failure to allocate a client id and failure to get
      75             :  * a lock.
      76             :  */
      77           1 : uint32_t sip_svc_register(void *ctrl, void *priv_data);
      78             : 
      79             : /**
      80             :  * @brief Unregister a client on ARM SiP service
      81             :  *
      82             :  * On success, detach the client from the service. Unregistration
      83             :  * is only allowed when all transactions belong to the client are closed.
      84             :  *
      85             :  * @param ctrl Pointer to controller instance which provides ARM SiP services.
      86             :  * @param c_token Client's token
      87             :  *
      88             :  * @retval 0 on success.
      89             :  * @retval -EINVALinvalid arguments.
      90             :  * @retval -ENODATA if client is not registered correctly.
      91             :  * @retval -EBUSY if client has pending transactions.
      92             :  * @retval -ECANCELED if client is not in IDLE state.
      93             :  * @retval -ENOLCK if failure in acquiring mutex.
      94             :  */
      95           1 : int sip_svc_unregister(void *ctrl, uint32_t c_token);
      96             : 
      97             : /**
      98             :  * @brief Client requests to open a channel on ARM SiP service.
      99             :  *
     100             :  * Client must open a channel before sending any request via
     101             :  * SMC/HVC to hypervisor/secure monitor firmware running at EL2/EL3.
     102             :  *
     103             :  * The service only allows one opened channel at one time and it is protected
     104             :  * by mutex.
     105             :  *
     106             :  * @param ctrl Pointer to controller instance which provides ARM SiP services.
     107             :  * @param c_token Client's token
     108             :  * @param k_timeout Waiting time if the mutex have been locked.
     109             :  *                   When the mutex have been locked:
     110             :  *                   - returns non-zero error code immediately if value is K_NO_WAIT
     111             :  *                   - wait forever if the value is K_FOREVER
     112             :  *                   - otherwise, for the given time
     113             :  *
     114             :  * @retval 0 on success.
     115             :  * @retval -EINVAL invalid arguments.
     116             :  * @retval -ETIMEDOUT timeout expiry.
     117             :  * @retval -EALREADY client state is already open.
     118             :  */
     119           1 : int sip_svc_open(void *ctrl, uint32_t c_token, k_timeout_t k_timeout);
     120             : 
     121             : /**
     122             :  * @brief Client requests to close the channel on ARM SiP services.
     123             :  *
     124             :  * Client must close the channel immediately once complete.
     125             :  *
     126             :  * @param ctrl Pointer to controller instance which provides ARM SiP services.
     127             :  * @param c_token Client's token
     128             :  * @param pre_close_req pre close request sent to lower layer on channel close.
     129             :  *
     130             :  * @retval 0 on success, negative errno on failure.
     131             :  * @retval -EINVAL invalid arguments.
     132             :  * @retval -ENOTSUP error on sending pre_close_request.
     133             :  * @retval -EPROTO client is not in OPEN state.
     134             :  */
     135           1 : int sip_svc_close(void *ctrl, uint32_t c_token, struct sip_svc_request *pre_close_req);
     136             : 
     137             : /**
     138             :  * @brief Client requests to send a SMC/HVC call to EL3/EL2
     139             :  *
     140             :  * Client must open a channel on the device before using this function.
     141             :  * This function is non-blocking and can be called from any context. The
     142             :  * service will return a Transaction ID to the client if the request
     143             :  * is being accepted. Client callback is called when the transaction is
     144             :  * completed.
     145             :  *
     146             :  * @param ctrl Pointer to controller instance which provides ARM SiP services.
     147             :  * @param c_token Client's token
     148             :  * @param req Address to the user input in struct sip_svc_request format.
     149             :  * @param cb Callback. SMC/SVC return value will be passed to client via
     150             :  *           context in struct sip_svc_response format in callback.
     151             :  *
     152             :  * @retval transaction id on success.
     153             :  * @retval -EINVAL invalid arguments.
     154             :  * @retval -EOPNOTSUPP invalid command id or function id.
     155             :  * @retval -ESRCH invalid client state.
     156             :  * @retval -ENOMEM failure to allocate memory.
     157             :  * @retval -ENOMSG failure to insert into database.
     158             :  * @retval -ENOBUF failure to insert into msgq.
     159             :  * @retval -ENOLCK failure to get lock.
     160             :  * @retval -EHOSTDOWN sip_svc thread not present.
     161             :  * @retval -ENOTSUP check for unsupported condition.
     162             :  */
     163           1 : int sip_svc_send(void *ctrl, uint32_t c_token, struct sip_svc_request *req, sip_svc_cb_fn cb);
     164             : 
     165             : /**
     166             :  * @brief Get the address pointer to the client private data.
     167             :  *
     168             :  * The pointer is provided by client during registration.
     169             :  *
     170             :  * @param ctrl Pointer to controller instance which provides ARM SiP service.
     171             :  * @param c_token Client's token
     172             :  *
     173             :  * @retval Address pointer to the client private data.
     174             :  * @retval NULL invalid arguments and failure to get lock.
     175             :  */
     176           1 : void *sip_svc_get_priv_data(void *ctrl, uint32_t c_token);
     177             : 
     178             : /**
     179             :  * @brief get the ARM SiP service handle
     180             :  *
     181             :  * @param method Pointer to controller instance which provides ARM SiP service.
     182             :  *
     183             :  * @retval Valid pointer.
     184             :  * @retval NULL invalid arguments and on providing unsupported method name.
     185             :  */
     186           1 : void *sip_svc_get_controller(char *method);
     187             : 
     188             : #endif /* ZEPHYR_INCLUDE_SIP_SVC_H_ */

Generated by: LCOV version 1.14