sdk-hwV1.3/lichee/melis-v3.0/source/include/openamp/rpmsg_rpc_client_server.h

208 lines
5.0 KiB
C
Executable File

/*
* Copyright (c) 2021, L&T Technology Services Ltd.
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef RPMSG_RPC_CLIENT_SERVER_H
#define RPMSG_RPC_CLIENT_SERVER_H
#include <openamp/open_amp.h>
#include <metal/compiler.h>
#if defined __cplusplus
extern "C" {
#endif
#define RPMSG_RPC_OK 0
#define RPMSG_RPC_INVALID_ID (-1L)
#define RPMSG_RPC_SERVICE_NAME "rpmsg-rpc"
/* RPMSG_BUFFER_SIZE = 512
* sizeof(struct rpmsg_hdr) = 16
* RPMSG_BUFFER_SIZE - sizeof(struct rpmsg_hdr) - 1 = 495
* Aligning to 64 bits -> 488UL
*/
#define MAX_BUF_LEN 488UL
#define MAX_FUNC_ID_LEN sizeof(unsigned long int)
struct rpmsg_rpc_clt;
struct rpmsg_rpc_svr;
typedef void (*rpmsg_rpc_shutdown_cb)(struct rpmsg_rpc_clt *rpc);
typedef void (*app_cb)(struct rpmsg_rpc_clt *rpc, int statust, void *data,
size_t len);
typedef int (*rpmsg_rpc_syscall_cb)(void *data, struct rpmsg_rpc_svr *rpcs);
/**
* struct rpmsg_rpc_request - rpc request message
*
* @id: service id
* @params: request params
*
*/
struct rpmsg_rpc_request {
uint32_t id;
unsigned char params[MAX_BUF_LEN];
};
/**
* struct rpmsg_rpc_answer - rpc request message
*
* @id: service id
* @status: status of rpc
* @params: answer params
*
*/
METAL_PACKED_BEGIN
struct rpmsg_rpc_answer {
uint32_t id;
int32_t status;
unsigned char params[MAX_BUF_LEN];
} METAL_PACKED_END;
/**
* struct rpmsg_rpc_services - table for services
*
* @id: service id
* @cb_function: id callback
*
*/
struct rpmsg_rpc_services {
uint32_t id;
rpmsg_rpc_syscall_cb cb_function;
};
/**
* struct rpmsg_rpc_client_services - table for client services
*
* @id: service id
* @app_cb: id callback
*
*/
struct rpmsg_rpc_client_services {
uint32_t id;
app_cb cb;
};
/**
* struct rpmsg_rpc_svr - server remote procedure call data
*
* RPMsg RPC will send request to endpoint
*
* @ept: rpmsg_endpoint structure
* @services: service table
* @n_services: number of services
*
*/
struct rpmsg_rpc_svr {
struct rpmsg_endpoint ept;
const struct rpmsg_rpc_services *services;
unsigned int n_services;
};
/**
* struct rpmsg_rpc_clt - client remote procedure call data
*
* RPMsg RPC will send request to remote and
* wait for callback.
*
* @ept: rpmsg_endpoint structure
* @shutdown_cb: shutdown callback function
* @services: service table
* @n_services: number of services
*
*/
struct rpmsg_rpc_clt {
struct rpmsg_endpoint ept;
rpmsg_rpc_shutdown_cb shutdown_cb;
const struct rpmsg_rpc_client_services *services;
unsigned int n_services;
};
/**
* rpmsg_rpc_client_release - release RPMsg remote procedure call
*
* This function is to release remoteproc procedure call service
*
* @rpc: pointer to the client remote procedure call data
*
*/
void rpmsg_rpc_client_release(struct rpmsg_rpc_clt *rpc);
/**
* rpmsg_rpc_client_init - initialize RPMsg remote procedure call
*
* This function is to initialize the remote procedure call
* client data. RPMsg RPC will send request to remote and
* wait for callback and load services to table
*
* @rpc: pointer to the client remote procedure call data
* @rdev: pointer to the rpmsg device
* @shutdown_cb: shutdown callback function
* @services: pointer to service table
* @len: length of table
*
* return 0 for success, and negative value for failure
*/
int rpmsg_rpc_client_init(struct rpmsg_rpc_clt *rpc,
struct rpmsg_device *rdev,
rpmsg_rpc_shutdown_cb shutdown_cb,
const struct rpmsg_rpc_client_services *services,
int len);
/**
* rpmsg_rpc_server_init - initialize RPMsg rpc for server
*
* This function create endpoint and loads services into table
*
* @rpcs: pointer to the server rpc
* @rdev: pointer to the rpmsg device
* @services: pointer to service table
* @len: length of table
* @rpmsg_service_server_unbind: unbind function callback
*
* return 0 for success, and negative value for failure
*/
int rpmsg_rpc_server_init(struct rpmsg_rpc_svr *rpcs, struct rpmsg_device *rdev,
const struct rpmsg_rpc_services *services, int len,
rpmsg_ns_unbind_cb rpmsg_service_server_unbind);
/**
* rpmsg_rpc_client_send - Request RPMsg RPC call
*
* @rpc: pointer to client remoteproc procedure call data
* @rpc_id: function id
* @request_param: pointer to request buffer
* @req_param_size: length of the request data
*
* return length of the received response, negative value for failure.
*/
int rpmsg_rpc_client_send(struct rpmsg_rpc_clt *rpc,
unsigned int rpc_id, void *request_param,
size_t req_param_size);
/**
* rpmsg_rpc_server_send - Request RPMsg RPC call
*
* This function sends RPC request
*
* @rpcs: pointer to server rpc data
* @rpc_id: function id
* @status: status of rpc
* @request_param: pointer to request buffer
* @param_size: length of the request data
*
* return length of the received response, negative value for failure.
*/
int rpmsg_rpc_server_send(struct rpmsg_rpc_svr *rpcs, uint32_t rpc_id,
int status, void *request_param,
size_t param_size);
#if defined __cplusplus
}
#endif
#endif /* RPMSG_RPC_CLIENT_SERVER_H */