diff --git a/docs/change_summary/source/drivers/ipc_rpmsg.txt b/docs/change_summary/source/drivers/ipc_rpmsg.txt index b9e301abbc6..b43c569ed7f 100644 --- a/docs/change_summary/source/drivers/ipc_rpmsg.txt +++ b/docs/change_summary/source/drivers/ipc_rpmsg.txt @@ -9,7 +9,7 @@ index 95212bce53..dc254758a8 100755 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions -@@ -97,7 +97,7 @@ int32_t RPMessage_getEndPtMsg(RPMessage_Struct *obj, RPMessage_LocalMsg **pMsg, +@@ -97,7 +97,7 @@ int32_t RPMessage_getEndPtMsg(RPMessage_Object *obj, RPMessage_QueueElem **pMsg, { done = 1; } @@ -18,7 +18,7 @@ index 95212bce53..dc254758a8 100755 { status = SystemP_TIMEOUT; done = 1; -@@ -108,7 +108,7 @@ int32_t RPMessage_getEndPtMsg(RPMessage_Struct *obj, RPMessage_LocalMsg **pMsg, +@@ -108,7 +108,7 @@ int32_t RPMessage_getEndPtMsg(RPMessage_Object *obj, RPMessage_QueueElem **pMsg, status = SystemP_SUCCESS; done = 1; } @@ -91,7 +91,7 @@ index 95212bce53..dc254758a8 100755 { @@ -280,14 +281,14 @@ int32_t RPMessage_recv(RPMessage_Object *handle, void* data, uint16_t *dataLen, int32_t status = SystemP_FAILURE; - RPMessage_Struct *obj = (RPMessage_Struct *)handle; + RPMessage_Object *obj = (RPMessage_Object *)handle; - if( data != NULL && dataLen != NULL && remoteCoreId != NULL && remoteEndPt != NULL - && obj->recvCallback == NULL /* i.e non-callback mode */ @@ -99,14 +99,14 @@ index 95212bce53..dc254758a8 100755 + && (obj->recvCallback == NULL) /* i.e non-callback mode */ ) { - RPMessage_LocalMsg *pMsg; - - status = RPMessage_getEndPtMsg(obj, &pMsg, timeout); + RPMessage_QueueElem *elem; + + status = RPMessage_getEndPtMsg(obj, &elem, timeout); - if(status == SystemP_SUCCESS && pMsg != NULL) + if((status == SystemP_SUCCESS) && (pMsg != NULL)) { uint32_t isAllocPending = 0; - uint16_t vringBufId = pMsg->vringBufId; + uint16_t vringBufId = elem->vringBufId; @@ -308,11 +309,11 @@ int32_t RPMessage_recv(RPMessage_Object *handle, void* data, uint16_t *dataLen, *dataLen = header->dataLen; } @@ -115,7 +115,7 @@ index 95212bce53..dc254758a8 100755 + memcpy((void *) data,(const void *) &vringBufAddr[sizeof(RPMessage_Header)],(size_t) *dataLen); RPMessage_vringPutEmptyRxBuf(*remoteCoreId, vringBufId); - isAllocPending = RPMessage_freeEndPtMsg(*remoteCoreId, pMsg); + isAllocPending = RPMessage_freeEndPtMsg(*remoteCoreId, elem); - if(isAllocPending) + if(isAllocPending!=0U) { /* if any messages are pending message pointer due to free Q being empty, @@ -139,12 +139,12 @@ index 95212bce53..dc254758a8 100755 void RPMessage_unblock(RPMessage_Object *handle) { -- RPMessage_Struct *obj = (RPMessage_Struct *)handle; -+ RPMessage_Struct *obj; +- RPMessage_Object *obj = (RPMessage_Object *)handle; ++ RPMessage_Object *obj; + if(handle != NULL) + { -+ obj = (RPMessage_Struct *)handle; ++ obj = (RPMessage_Object *)handle; obj->doRecvUnblock = 1; SemaphoreP_post(&obj->newEndPtMsgSem); + } @@ -152,29 +152,29 @@ index 95212bce53..dc254758a8 100755 uint16_t RPMessage_getLocalEndPt(const RPMessage_Object *handle) { -- RPMessage_Struct *obj = (RPMessage_Struct *)handle; -+ RPMessage_Struct *obj; +- RPMessage_Object *obj = (RPMessage_Object *)handle; ++ RPMessage_Object *obj; + DebugP_assert(handle != NULL); + -+ obj = (RPMessage_Struct *)handle; ++ obj = (RPMessage_Object *)handle; return obj->localEndPt; + } int32_t RPMessage_construct(RPMessage_Object *handle, const RPMessage_CreateParams *createParams) { -- RPMessage_Struct *obj = (RPMessage_Struct *)handle; -+ RPMessage_Struct *obj; +- RPMessage_Object *obj = (RPMessage_Object *)handle; ++ RPMessage_Object *obj; int32_t status = SystemP_FAILURE; - DebugP_assert(sizeof(RPMessage_Object) >= sizeof(RPMessage_Struct)); + DebugP_assert(sizeof(RPMessage_Object) >= sizeof(RPMessage_Object)); - if(createParams->localEndPt < RPMESSAGE_MAX_LOCAL_ENDPT - && gIpcRpmsgCtrl.localEndPtObj[createParams->localEndPt] == NULL) + if((handle != NULL) && (createParams != NULL)) + { -+ obj = (RPMessage_Struct *)handle; ++ obj = (RPMessage_Object *)handle; + if((createParams->localEndPt < RPMESSAGE_MAX_LOCAL_ENDPT) + && (gIpcRpmsgCtrl.localEndPtObj[createParams->localEndPt] == NULL)) { @@ -190,14 +190,14 @@ index 95212bce53..dc254758a8 100755 void RPMessage_destruct(RPMessage_Object *handle) { -- RPMessage_Struct *obj = (RPMessage_Struct *)handle; -+ RPMessage_Struct *obj; +- RPMessage_Object *obj = (RPMessage_Object *)handle; ++ RPMessage_Object *obj; - if(obj->localEndPt < RPMESSAGE_MAX_LOCAL_ENDPT && - gIpcRpmsgCtrl.localEndPtObj[obj->localEndPt] != NULL) + if(handle != NULL) + { -+ obj = (RPMessage_Struct *)handle; ++ obj = (RPMessage_Object *)handle; + if((obj->localEndPt < RPMESSAGE_MAX_LOCAL_ENDPT) && + (gIpcRpmsgCtrl.localEndPtObj[obj->localEndPt] != NULL)) { @@ -233,7 +233,7 @@ index 95212bce53..dc254758a8 100755 int32_t RPMessage_coreInit(uint16_t remoteCoreId, const RPMessage_Params *params) @@ -442,7 +459,7 @@ int32_t RPMessage_coreInit(uint16_t remoteCoreId, const RPMessage_Params *param - RPMessage_queuePut(&coreObj->freeQ, &coreObj->localMsgObj[elemId].elem); + RPMessage_queuePut(&coreObj->freeQ, &coreObj->localMsgObj[elemId]); } /* Linux VRINGs we will init later inside RPMessage_waitForLinuxReady() */ - if(gIpcRpmsgCtrl.isCoreEnable[remoteCoreId] && !RPMessage_isLinuxCore(remoteCoreId)) @@ -405,10 +405,10 @@ index 27334eea6c..7072652951 100755 +void RPMessage_vringResetInternal(RPMessage_Vring *vringObj, uint16_t numBuf, uint16_t msgSize, uintptr_t vringBaseAddr, uint32_t offset_desc, uint32_t offset_avail, uint32_t offset_used, uint32_t offset_buf, uint32_t isTx); + -+RPMessage_LocalMsg *RPMessage_allocEndPtMsg(uint32_t remoteCoreId); -+uint32_t RPMessage_freeEndPtMsg(uint16_t remoteCoreId, RPMessage_LocalMsg *pMsg); -+void RPMessage_putEndPtMsg(RPMessage_Struct *obj, RPMessage_LocalMsg *pMsg); -+int32_t RPMessage_getEndPtMsg(RPMessage_Struct *obj, RPMessage_LocalMsg **pMsg, uint32_t timeout); ++RPMessage_QueueElem *RPMessage_allocEndPtMsg(uint32_t remoteCoreId); ++uint32_t RPMessage_freeEndPtMsg(uint16_t remoteCoreId, RPMessage_QueueElem *elem); ++void RPMessage_putEndPtMsg(RPMessage_Object *obj, RPMessage_QueueElem *elem); ++int32_t RPMessage_getEndPtMsg(RPMessage_Object *obj, RPMessage_QueueElem **elem, uint32_t timeout); +void RPMessage_recvHandler(uint32_t remoteCoreId); +void RPMessage_notifyCallback(uint32_t remoteCoreId, uint16_t localClientId, uint32_t msgValue, void *args); +int32_t RPMessage_coreInit(uint16_t remoteCoreId, const RPMessage_Params *params); diff --git a/source/drivers/ipc_rpmsg.h b/source/drivers/ipc_rpmsg.h index f2ca75b8276..de3d9e66112 100755 --- a/source/drivers/ipc_rpmsg.h +++ b/source/drivers/ipc_rpmsg.h @@ -39,7 +39,9 @@ extern "C" { #include #include +#include #include +#include #include /** @@ -94,11 +96,9 @@ extern "C" { #define RPMESSAGE_CRC_SIZE (2U) /** - * \brief Opaque RPMessage object used with the RPMessage APIs + * \brief RPMessage object used with the RPMessage APIs */ -typedef struct RPMessage_Object_s { - uintptr_t rsv[RPMESSAGE_OBJECT_SIZE_MAX/sizeof(uint32_t)]; /**< reserved, should NOT be modified by end users */ -} RPMessage_Object; +struct RPMessage_Object_s; /** * \brief Callback that is invoked when a message is received from any CPU at the specified local end point @@ -119,7 +119,7 @@ typedef struct RPMessage_Object_s { * \param remoteCoreId [in] Core ID of sender * \param remoteEndPt [in] End point of sender */ -typedef void (*RPMessage_RecvCallback)(RPMessage_Object *obj, void *arg, +typedef void (*RPMessage_RecvCallback)(struct RPMessage_Object_s *obj, void *arg, void *data, uint16_t dataLen, int32_t crcStatus, uint16_t remoteCoreId, uint16_t remoteEndPt); @@ -136,7 +136,7 @@ typedef void (*RPMessage_RecvCallback)(RPMessage_Object *obj, void *arg, * \param obj [in] RPMessage end point object created with \ref RPMessage_construct * \param arg [in] Arguments specified by user during \ref RPMessage_construct */ -typedef void (*RPMessage_RecvNotifyCallback)(RPMessage_Object *obj, void *arg); +typedef void (*RPMessage_RecvNotifyCallback)(struct RPMessage_Object_s *obj, void *arg); /** @@ -167,6 +167,19 @@ typedef void (*RPMessage_ControlEndPtCallback)(void *arg, */ typedef int32_t (*RPMessage_CrcHookFxn)(uint8_t *data, uint16_t dataLen, uint8_t crcSize, void *crc); +/* structure to hold state of RPMessage end point */ +typedef struct RPMessage_Object_s +{ + uint16_t localEndPt; /* local end point number, MUST be < RPMESSAGE_MAX_LOCAL_ENDPT */ + RPMessage_RecvCallback recvCallback; /* when not NULL, received messages are handled in callback that via RPMessage_recv */ + void *recvCallbackArgs; /* arguments passed to the recvCallback callback */ + uint32_t doRecvUnblock; /* flag to unblock RPMessage_recv, if its blocked for every waiting for messages and user wants to shutdown or exit */ + RPMessage_Queue endPtQ; /* end point specific queue to hold received messages pending for processing at this end point */ + SemaphoreP_Object newEndPtMsgSem; /* semaphore to indicate that there messages pending endPtQ */ + RPMessage_RecvNotifyCallback recvNotifyCallback; /* when not NULL, this callback is whenever a message is received */ + void *recvNotifyCallbackArgs; /* arguments passed to the recvNotifyCallback callback */ +} RPMessage_Object; + /** * \brief Parameters passed to \ref RPMessage_construct * diff --git a/source/drivers/ipc_rpmsg/ipc_rpmsg.c b/source/drivers/ipc_rpmsg/ipc_rpmsg.c index 45e7aca51e6..46bb94cc91e 100755 --- a/source/drivers/ipc_rpmsg/ipc_rpmsg.c +++ b/source/drivers/ipc_rpmsg/ipc_rpmsg.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2023 Texas Instruments Incorporated + * Copyright (C) 2018-2025 Texas Instruments Incorporated * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -34,14 +34,14 @@ IpcRpmsg_Ctrl gIpcRpmsgCtrl; -RPMessage_LocalMsg *RPMessage_allocEndPtMsg(uint32_t remoteCoreId) +RPMessage_QueueElem *RPMessage_allocEndPtMsg(uint32_t remoteCoreId) { RPMessage_Core *coreObj = &gIpcRpmsgCtrl.coreObj[remoteCoreId]; - RPMessage_LocalMsg *pMsg; + RPMessage_QueueElem *pMsg; uint32_t oldIntState; oldIntState = HwiP_disable(); - pMsg = (RPMessage_LocalMsg*)RPMessage_queueGet(&coreObj->freeQ); + pMsg = RPMessage_queueGet(&coreObj->freeQ); if(pMsg == NULL) { coreObj->freeQAllocPending = 1; @@ -55,31 +55,31 @@ RPMessage_LocalMsg *RPMessage_allocEndPtMsg(uint32_t remoteCoreId) return pMsg; } -uint32_t RPMessage_freeEndPtMsg(uint16_t remoteCoreId, RPMessage_LocalMsg *pMsg) +uint32_t RPMessage_freeEndPtMsg(uint16_t remoteCoreId, RPMessage_QueueElem *elem) { RPMessage_Core *coreObj = &gIpcRpmsgCtrl.coreObj[remoteCoreId]; uint32_t oldIntState, isAllocPending; oldIntState = HwiP_disable(); isAllocPending = coreObj->freeQAllocPending; - RPMessage_queuePut(&coreObj->freeQ, &pMsg->elem); + RPMessage_queuePut(&coreObj->freeQ, elem); HwiP_restore(oldIntState); return isAllocPending; } -void RPMessage_putEndPtMsg(RPMessage_Struct *obj, RPMessage_LocalMsg *pMsg) +void RPMessage_putEndPtMsg(RPMessage_Object *obj, RPMessage_QueueElem *elem) { uint32_t oldIntState; oldIntState = HwiP_disable(); - RPMessage_queuePut(&obj->endPtQ, &pMsg->elem); + RPMessage_queuePut(&obj->endPtQ, elem); HwiP_restore(oldIntState); SemaphoreP_post(&obj->newEndPtMsgSem); } -int32_t RPMessage_getEndPtMsg(RPMessage_Struct *obj, RPMessage_LocalMsg **pMsg, uint32_t timeout) +int32_t RPMessage_getEndPtMsg(RPMessage_Object *obj, RPMessage_QueueElem **elem, uint32_t timeout) { uint32_t oldIntState, done; int32_t status = SystemP_TIMEOUT; @@ -87,10 +87,10 @@ int32_t RPMessage_getEndPtMsg(RPMessage_Struct *obj, RPMessage_LocalMsg **pMsg, done = 0; do { oldIntState = HwiP_disable(); - *pMsg = (RPMessage_LocalMsg*)RPMessage_queueGet(&obj->endPtQ); + *elem = RPMessage_queueGet(&obj->endPtQ); HwiP_restore(oldIntState); - if(*pMsg==NULL) + if(*elem==NULL) { status = SemaphoreP_pend(&obj->newEndPtMsgSem, timeout); if(status == SystemP_TIMEOUT) @@ -118,13 +118,10 @@ void RPMessage_recvHandler(uint32_t remoteCoreId) { uint16_t vringBufId; int32_t status; - RPMessage_LocalMsg *pMsg; + RPMessage_QueueElem *elem; - /* get a free message pointer to hold vring buf info - * if no free message pointer then dont remove from vring - */ - pMsg = RPMessage_allocEndPtMsg(remoteCoreId); - if(pMsg!=NULL) + elem = RPMessage_allocEndPtMsg(remoteCoreId); + if(elem!=NULL) { status = RPMessage_vringGetFullRxBuf(remoteCoreId, &vringBufId); if(status == SystemP_SUCCESS) @@ -137,7 +134,7 @@ void RPMessage_recvHandler(uint32_t remoteCoreId) status = SystemP_FAILURE; if(localEndPt < RPMESSAGE_MAX_LOCAL_ENDPT) { - RPMessage_Struct *obj = gIpcRpmsgCtrl.localEndPtObj[localEndPt]; + RPMessage_Object *obj = gIpcRpmsgCtrl.localEndPtObj[localEndPt]; if(obj!=NULL) { if(obj->recvCallback != NULL) @@ -166,16 +163,16 @@ void RPMessage_recvHandler(uint32_t remoteCoreId) status = SystemP_SUCCESS; /* pMsg is not used, free it */ - (void)RPMessage_freeEndPtMsg(remoteCoreId, pMsg); + (void)RPMessage_freeEndPtMsg(remoteCoreId, elem); /* done using vring buf, free it */ RPMessage_vringPutEmptyRxBuf(remoteCoreId, vringBufId); } else { /* recv messages handled in non-callback mode */ - pMsg->remoteCoreId = remoteCoreId; - pMsg->vringBufId = vringBufId; - RPMessage_putEndPtMsg(obj, pMsg); + elem->remoteCoreId = remoteCoreId; + elem->vringBufId = vringBufId; + RPMessage_putEndPtMsg(obj, elem); status = SystemP_SUCCESS; if(obj->recvNotifyCallback!=NULL) @@ -200,7 +197,7 @@ void RPMessage_recvHandler(uint32_t remoteCoreId) * or no object registered for local end pt, so no need handle the message pointer, * free it */ - (void)RPMessage_freeEndPtMsg(remoteCoreId, pMsg); + (void)RPMessage_freeEndPtMsg(remoteCoreId, elem); } } } @@ -307,24 +304,24 @@ int32_t RPMessage_recv(RPMessage_Object *handle, void* data, uint16_t *dataLen, uint16_t *remoteCoreId, uint16_t *remoteEndPt, uint32_t timeout) { int32_t status = SystemP_FAILURE; - RPMessage_Struct *obj = (RPMessage_Struct *)handle; + RPMessage_Object *obj = (RPMessage_Object *)handle; if( (data != NULL) && (dataLen != NULL) && (remoteCoreId != NULL) && (remoteEndPt != NULL) && (obj->recvCallback == NULL) /* i.e non-callback mode */ ) { - RPMessage_LocalMsg *pMsg; + RPMessage_QueueElem *elem; - status = RPMessage_getEndPtMsg(obj, &pMsg, timeout); - if((status == SystemP_SUCCESS) && (pMsg != NULL)) + status = RPMessage_getEndPtMsg(obj, &elem, timeout); + if((status == SystemP_SUCCESS) && (elem != NULL)) { uint16_t crc; uint32_t isAllocPending = 0; - uint16_t vringBufId = pMsg->vringBufId; - uint8_t *vringBufAddr = RPMessage_vringGetRxBufAddr(pMsg->remoteCoreId, vringBufId); + uint16_t vringBufId = elem->vringBufId; + uint8_t *vringBufAddr = RPMessage_vringGetRxBufAddr(elem->remoteCoreId, vringBufId); RPMessage_Header *header = (RPMessage_Header *)vringBufAddr; - *remoteCoreId = pMsg->remoteCoreId; + *remoteCoreId = elem->remoteCoreId; *remoteEndPt = header->srcEndPt; if( *dataLen < header->dataLen ) @@ -351,7 +348,7 @@ int32_t RPMessage_recv(RPMessage_Object *handle, void* data, uint16_t *dataLen, } RPMessage_vringPutEmptyRxBuf(*remoteCoreId, vringBufId); - isAllocPending = RPMessage_freeEndPtMsg(*remoteCoreId, pMsg); + isAllocPending = RPMessage_freeEndPtMsg(*remoteCoreId, elem); if(isAllocPending!=0U) { /* if any messages are pending message pointer due to free Q being empty, * now there will be atleast one element to handle any pending vring requests. @@ -380,39 +377,29 @@ int32_t RPMessage_recv(RPMessage_Object *handle, void* data, uint16_t *dataLen, return status; } -void RPMessage_unblock(RPMessage_Object *handle) +void RPMessage_unblock(RPMessage_Object *obj) { - RPMessage_Struct *obj; - - if(handle != NULL) + if(obj != NULL) { - obj = (RPMessage_Struct *)handle; obj->doRecvUnblock = 1; SemaphoreP_post(&obj->newEndPtMsgSem); } } -uint16_t RPMessage_getLocalEndPt(const RPMessage_Object *handle) +uint16_t RPMessage_getLocalEndPt(const RPMessage_Object *obj) { - RPMessage_Struct *obj; - - DebugP_assert(handle != NULL); - - obj = (RPMessage_Struct *)handle; + DebugP_assert(obj != NULL); return obj->localEndPt; - } -int32_t RPMessage_construct(RPMessage_Object *handle, const RPMessage_CreateParams *createParams) +int32_t RPMessage_construct(RPMessage_Object *obj, const RPMessage_CreateParams *createParams) { - RPMessage_Struct *obj; int32_t status = SystemP_FAILURE; - DebugP_assert(sizeof(RPMessage_Object) >= sizeof(RPMessage_Struct)); + DebugP_assert(sizeof(RPMessage_Object) >= sizeof(RPMessage_Object)); - if((handle != NULL) && (createParams != NULL)) + if((obj != NULL) && (createParams != NULL)) { - obj = (RPMessage_Struct *)handle; if((createParams->localEndPt < RPMESSAGE_MAX_LOCAL_ENDPT) && (gIpcRpmsgCtrl.localEndPtObj[createParams->localEndPt] == NULL)) { @@ -433,13 +420,10 @@ int32_t RPMessage_construct(RPMessage_Object *handle, const RPMessage_CreatePara return status; } -void RPMessage_destruct(RPMessage_Object *handle) +void RPMessage_destruct(RPMessage_Object *obj) { - RPMessage_Struct *obj; - - if(handle != NULL) + if(obj != NULL) { - obj = (RPMessage_Struct *)handle; if((obj->localEndPt < RPMESSAGE_MAX_LOCAL_ENDPT) && (gIpcRpmsgCtrl.localEndPtObj[obj->localEndPt] != NULL)) { @@ -498,7 +482,7 @@ int32_t RPMessage_coreInit(uint16_t remoteCoreId, const RPMessage_Params *param RPMessage_queueReset(&coreObj->freeQ); for(elemId=0; elemIdfreeQ, &coreObj->localMsgObj[elemId].elem); + RPMessage_queuePut(&coreObj->freeQ, &coreObj->localMsgObj[elemId]); } /* Linux VRINGs we will init later inside RPMessage_waitForLinuxReady() */ if((gIpcRpmsgCtrl.isCoreEnable[remoteCoreId] != 0U) && (RPMessage_isLinuxCore(remoteCoreId) == 0U)) diff --git a/source/drivers/ipc_rpmsg/ipc_rpmsg_priv.h b/source/drivers/ipc_rpmsg/ipc_rpmsg_priv.h index 6e08ea86e5e..c20951d2a13 100755 --- a/source/drivers/ipc_rpmsg/ipc_rpmsg_priv.h +++ b/source/drivers/ipc_rpmsg/ipc_rpmsg_priv.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2023 Texas Instruments Incorporated + * Copyright (C) 2018-2025 Texas Instruments Incorporated * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -198,21 +198,6 @@ typedef struct uint8_t *bufBaseAddr; /* pointer to message buffer 0 in VRING shared memory */ } RPMessage_Vring; -/* structure to hold received buffer ID and sender core ID - * - * An instance of this structure is put into the end point specific queue. - * On calling rpmsg recv, an element from end point queue is extracted, - * the vring buffer processed and the vring buffer is freed. - * - * This prevents a copy from vring to local end point queue - * and also reduces the memory needed for local queing - */ -typedef struct { - struct RPMessage_QueueElem_s elem; /* queue element header */ - uint16_t remoteCoreId; /* remote core that sent a message */ - uint16_t vringBufId; /* buffer ID within VRING which holds the message */ -} RPMessage_LocalMsg; - /* structure to hold state of IPC rpmsg with a remote core */ typedef struct @@ -234,7 +219,7 @@ typedef struct * * ONLY used during receive. */ - RPMessage_LocalMsg localMsgObj[RPMESSAGE_MAX_LOCAL_MSG_OBJ]; /* RPMessage_LocalMsg messages are put + RPMessage_QueueElem localMsgObj[RPMESSAGE_MAX_LOCAL_MSG_OBJ]; /* RPMessage_LocalMsg messages are put * in the freeQ initially * * ONLY used during receive. @@ -243,19 +228,6 @@ typedef struct RPMessage_Vring vringRxObj; /* VRING used to receive messages from this remote core */ } RPMessage_Core; -/* structure to hold state of RPMessage end point */ -typedef struct -{ - uint16_t localEndPt; /* local end point number, MUST be < RPMESSAGE_MAX_LOCAL_ENDPT */ - RPMessage_RecvCallback recvCallback; /* when not NULL, received messages are handled in callback that via RPMessage_recv */ - void *recvCallbackArgs; /* arguments passed to the recvCallback callback */ - uint32_t doRecvUnblock; /* flag to unblock RPMessage_recv, if its blocked for every waiting for messages and user wants to shutdown or exit */ - RPMessage_Queue endPtQ; /* end point specific queue to hold received messages pending for processing at this end point */ - SemaphoreP_Object newEndPtMsgSem; /* semaphore to indicate that there messages pending endPtQ */ - RPMessage_RecvNotifyCallback recvNotifyCallback; /* when not NULL, this callback is whenever a message is received */ - void *recvNotifyCallbackArgs; /* arguments passed to the recvNotifyCallback callback */ -} RPMessage_Struct; - /* message that is sent during annouce and received by a control end point */ #define RPMESSAGE_ANNOUNCE_SERVICENAME_LEN (32u) typedef struct @@ -272,7 +244,7 @@ typedef struct uint8_t isCoreEnable[CSL_CORE_ID_MAX]; /* 1: core is enabled for IPC RPMessage, else disabled */ uint8_t isCoreInitialized[CSL_CORE_ID_MAX]; /* 1: core is initialized for IPC RPMessage, else not yet initialized */ RPMessage_Core coreObj[CSL_CORE_ID_MAX]; /* remote core objects, indexed by remote core ID */ - RPMessage_Struct *localEndPtObj[RPMESSAGE_MAX_LOCAL_ENDPT]; /* end point objects, indexed by endpoint ID */ + RPMessage_Object *localEndPtObj[RPMESSAGE_MAX_LOCAL_ENDPT]; /* end point objects, indexed by endpoint ID */ RPMessage_Object controlEndPtObj; /* object/handle of end point that receives accouncement messages */ RPMessage_ControlEndPtCallback controlEndPtCallback; /* user callback to invoke when a control message is received */ void *controlEndPtCallbackArgs; /* user callback args for control message */ @@ -320,10 +292,10 @@ void RPMessage_vringResetLinux(uint16_t remoteCoreId, uint16_t isTx, const R void RPMessage_vringResetInternal(RPMessage_Vring *vringObj, uint16_t numBuf, uint16_t msgSize, uintptr_t vringBaseAddr, uint32_t offset_desc, uint32_t offset_avail, uint32_t offset_used, uint32_t offset_buf, uint32_t isTx); -RPMessage_LocalMsg *RPMessage_allocEndPtMsg(uint32_t remoteCoreId); -uint32_t RPMessage_freeEndPtMsg(uint16_t remoteCoreId, RPMessage_LocalMsg *pMsg); -void RPMessage_putEndPtMsg(RPMessage_Struct *obj, RPMessage_LocalMsg *pMsg); -int32_t RPMessage_getEndPtMsg(RPMessage_Struct *obj, RPMessage_LocalMsg **pMsg, uint32_t timeout); +RPMessage_QueueElem *RPMessage_allocEndPtMsg(uint32_t remoteCoreId); +uint32_t RPMessage_freeEndPtMsg(uint16_t remoteCoreId, RPMessage_QueueElem *elem); +void RPMessage_putEndPtMsg(RPMessage_Object *obj, RPMessage_QueueElem *elem); +int32_t RPMessage_getEndPtMsg(RPMessage_Object *obj, RPMessage_QueueElem **elem, uint32_t timeout); void RPMessage_recvHandler(uint32_t remoteCoreId); void RPMessage_notifyCallback(uint32_t remoteCoreId, uint16_t localClientId, uint32_t msgValue, int32_t crcStatus, void *args); int32_t RPMessage_coreInit(uint16_t remoteCoreId, const RPMessage_Params *params); diff --git a/source/drivers/ipc_rpmsg/ipc_rpmsg_queue.h b/source/drivers/ipc_rpmsg/ipc_rpmsg_queue.h index 7d717beff9a..888d39f060c 100755 --- a/source/drivers/ipc_rpmsg/ipc_rpmsg_queue.h +++ b/source/drivers/ipc_rpmsg/ipc_rpmsg_queue.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2021 Texas Instruments Incorporated + * Copyright (C) 2018-2025 Texas Instruments Incorporated * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -48,10 +48,20 @@ struct RPMessage_QueueElem_s; /* Q element structure, this MUST be the first field of a larger application * specific structure + * It is also used to hold received buffer ID and sender core ID + * + * An instance of this structure is put into the end point specific queue. + * On calling rpmsg recv, an element from end point queue is extracted, + * the vring buffer processed and the vring buffer is freed. + * + * This prevents a copy from vring to local end point queue + * and also reduces the memory needed for local queing */ typedef struct RPMessage_QueueElem_s { struct RPMessage_QueueElem_s *next; /* pointer to next element in list */ + uint16_t remoteCoreId; /* remote core that sent a message */ + uint16_t vringBufId; /* buffer ID within VRING which holds the message */ } RPMessage_QueueElem; diff --git a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am243x/ipc_rpmsg_neg.c b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am243x/ipc_rpmsg_neg.c index 4c2fc2dca2d..887d22848a0 100644 --- a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am243x/ipc_rpmsg_neg.c +++ b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am243x/ipc_rpmsg_neg.c @@ -378,7 +378,7 @@ void negTest_RPMessage_forceRecvMsgHandlers(void *args) void negTest_RPMessage_destruct(void *args) { int32_t testStatus = SystemP_SUCCESS; - gIpcRpmsgCtrl.localEndPtObj[0U] = (RPMessage_Struct *)64U; + gIpcRpmsgCtrl.localEndPtObj[0U] = (RPMessage_Object *)64U; if (testStatus == SystemP_SUCCESS) { RPMessage_destruct(&gIpcRpmsgCtrl.controlEndPtObj); diff --git a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am243x/ipc_rpmsg_pos.c b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am243x/ipc_rpmsg_pos.c index 44da96b5647..67bf2333933 100644 --- a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am243x/ipc_rpmsg_pos.c +++ b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am243x/ipc_rpmsg_pos.c @@ -73,7 +73,6 @@ typedef struct{ RPMessage_Core *Core; IpcRpmsg_Ctrl *msg_ctrl; -RPMessage_Struct *structT; RPMessage_Object handle; RPMessage_CreateParams *createParams; @@ -82,7 +81,7 @@ RPMessage_CreateParams *createParams; void posTest_RPMessage_destruct(void *args) { int32_t testStatus = SystemP_SUCCESS; - structT->localEndPt = 65U; + handle.localEndPt = 65U; if (testStatus == SystemP_SUCCESS) { diff --git a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263px/ipc_rpmsg_neg.c b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263px/ipc_rpmsg_neg.c index 566612f0484..925014edce9 100644 --- a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263px/ipc_rpmsg_neg.c +++ b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263px/ipc_rpmsg_neg.c @@ -378,7 +378,7 @@ void negTest_RPMessage_forceRecvMsgHandlers(void *args) void negTest_RPMessage_destruct(void *args) { int32_t testStatus = SystemP_SUCCESS; - gIpcRpmsgCtrl.localEndPtObj[0U] = (RPMessage_Struct *)64U; + gIpcRpmsgCtrl.localEndPtObj[0U] = (RPMessage_Object *)64U; if (testStatus == SystemP_SUCCESS) { RPMessage_destruct(&gIpcRpmsgCtrl.controlEndPtObj); diff --git a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263px/ipc_rpmsg_pos.c b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263px/ipc_rpmsg_pos.c index a5ad726c3c6..858b0a39601 100644 --- a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263px/ipc_rpmsg_pos.c +++ b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263px/ipc_rpmsg_pos.c @@ -73,15 +73,13 @@ typedef struct{ RPMessage_Core *Core; IpcRpmsg_Ctrl *msg_ctrl; -RPMessage_Struct *structT; RPMessage_Object handle; /*Test for dynamic coverage of RPMessage_destruct API */ void posTest_RPMessage_destruct(void *args) { int32_t testStatus = SystemP_SUCCESS; - structT->localEndPt = 65U; - + handle.localEndPt = 65U; if (testStatus == SystemP_SUCCESS) { RPMessage_destruct(&handle); diff --git a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263x/ipc_rpmsg_neg.c b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263x/ipc_rpmsg_neg.c index d94c5878fae..f4bffa02891 100644 --- a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263x/ipc_rpmsg_neg.c +++ b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263x/ipc_rpmsg_neg.c @@ -378,7 +378,7 @@ void negTest_RPMessage_forceRecvMsgHandlers(void *args) void negTest_RPMessage_destruct(void *args) { int32_t testStatus = SystemP_SUCCESS; - gIpcRpmsgCtrl.localEndPtObj[0U] = (RPMessage_Struct *)64U; + gIpcRpmsgCtrl.localEndPtObj[0U] = (RPMessage_Object *)64U; if (testStatus == SystemP_SUCCESS) { RPMessage_destruct(&gIpcRpmsgCtrl.controlEndPtObj); diff --git a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263x/ipc_rpmsg_pos.c b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263x/ipc_rpmsg_pos.c index f9e98d5be5b..c0a8ad26faf 100644 --- a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263x/ipc_rpmsg_pos.c +++ b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am263x/ipc_rpmsg_pos.c @@ -73,15 +73,13 @@ typedef struct{ RPMessage_Core *Core; IpcRpmsg_Ctrl *msg_ctrl; -RPMessage_Struct *structT; RPMessage_Object handle; /*Test for dynamic coverage of RPMessage_destruct API */ void posTest_RPMessage_destruct(void *args) { int32_t testStatus = SystemP_SUCCESS; - structT->localEndPt = 65U; - + handle.localEndPt = 65U; if (testStatus == SystemP_SUCCESS) { RPMessage_destruct(&handle); diff --git a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am273x/ipc_rpmsg_neg.c b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am273x/ipc_rpmsg_neg.c index 4efd2833217..49680317203 100644 --- a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am273x/ipc_rpmsg_neg.c +++ b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am273x/ipc_rpmsg_neg.c @@ -378,7 +378,7 @@ void negTest_RPMessage_forceRecvMsgHandlers(void *args) void negTest_RPMessage_destruct(void *args) { int32_t testStatus = SystemP_SUCCESS; - gIpcRpmsgCtrl.localEndPtObj[0U] = (RPMessage_Struct *)64U; + gIpcRpmsgCtrl.localEndPtObj[0U] = (RPMessage_Object *)64U; if (testStatus == SystemP_SUCCESS) { RPMessage_destruct(&gIpcRpmsgCtrl.controlEndPtObj); diff --git a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am273x/ipc_rpmsg_pos.c b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am273x/ipc_rpmsg_pos.c index f030c83cb3b..10eb7786b86 100644 --- a/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am273x/ipc_rpmsg_pos.c +++ b/test/drivers/ipc_rpmsg/ipc_rpmsg_test_am273x/ipc_rpmsg_pos.c @@ -73,7 +73,6 @@ typedef struct{ RPMessage_Core *Core; IpcRpmsg_Ctrl *msg_ctrl; -RPMessage_Struct *structT; RPMessage_Object handle; RPMessage_CreateParams *createParams; @@ -82,8 +81,7 @@ RPMessage_CreateParams *createParams; void posTest_RPMessage_destruct(void *args) { int32_t testStatus = SystemP_SUCCESS; - structT->localEndPt = 65U; - + handle.localEndPt = 65U; if (testStatus == SystemP_SUCCESS) { RPMessage_destruct(&handle);