Commit d392ad19 authored by Arun Gopalakrishnan's avatar Arun Gopalakrishnan Committed by Hari Kanigeri

ARM OMAP4 Syslink IPC MessageQ, MessageQ Transport Changes

This patch can be used to sync with the syslink drop 2.0.0.6
for above modules
The major changes are
   1. The atomic function usage came in the above modules
   2. Some logical changes came in some of the functions
      in above modules (messageq get, messageq put etc.)
   3. Some of the data structures were changed
   4. Few new functions introduced in place of macros
Signed-off-by: default avatarArun M G <arunmg@ti.com>
parent e1e90d73
......@@ -183,6 +183,12 @@
*/
#define MESSAGEQ_E_ALREADYEXISTS MESSAGEQ_MAKE_FAILURE(20)
/*!
* @def MESSAGEQ_E_TIMEOUT
* @brief Timeout while attempting to get a message
*/
#define MESSAGEQ_E_TIMEOUT MESSAGEQ_MAKE_FAILURE(21)
/*!
* @def MESSAGEQ_SUCCESS
* @brief Operation successful.
......@@ -201,9 +207,19 @@
* =============================================================================
*/
/*!
* Mask to extract priority setting
* @brief Mask to extract version setting
*/
#define MESSAGEQ_HEADERVERSION 0x2000u
/*!
* @brief Mask to extract priority setting
*/
#define MESSAGEQ_PRIORITYMASK 0x3u
/*!
* @brief Mask to extract priority setting
*/
#define MESSAGEQ_PRIORITYMASK 0x3
#define MESSAGEQ_TRANSPORTPRIORITYMASK 0x01u
/*!
* Mask to extract version setting
......@@ -243,10 +259,10 @@ enum messageq_priority {
/*!< Normal priority message */
MESSAGEQ_HIGHPRI = 1,
/*!< High priority message */
MESSAGEQ_URGENTPRI = 2,
/*!< Urgent priority message */
MESSAGEQ_RESERVEDPRI = 3
MESSAGEQ_RESERVEDPRI = 2,
/*!< Reserved value for message priority */
MESSAGEQ_URGENTPRI = 3
/*!< Urgent priority message */
};
/*! Structure which defines the first field in every message */
......@@ -273,6 +289,8 @@ struct msgheader {
/*!< Maximum length for Message queue names */
u16 heap_id;
/*!< Maximum length for Message queue names */
u32 reserved;
/*!< Reserved field */
};
/*! Structure which defines the first field in every message */
#define messageq_msg struct msgheader *
......@@ -317,6 +335,8 @@ struct messageq_config {
struct messageq_params {
u32 reserved;
/*!< No parameters required currently. Reserved field. */
u32 max_name_len;
/*!< Maximum length for Message queue names */
};
/* =============================================================================
......@@ -363,7 +383,8 @@ void messageq_static_msg_init(messageq_msg msg, u32 size);
int messageq_put(u32 queueId, messageq_msg msg);
/* Gets a message for a message queue and blocks if the queue is empty */
messageq_msg messageq_get(void *messageq_handle, u32 timeout);
int messageq_get(void *messageq_handle, messageq_msg *msg,
u32 timeout);
/* Register a heap with MessageQ */
int messageq_register_heap(void *heap_handle, u16 heap_id);
......
......@@ -144,9 +144,8 @@
* @brief Module configuration structure.
*/
struct messageq_transportshm_config {
void *gate_handle;
/*!< Handle of gate to be used for local thread safety. If provided as
NULL, gate handle is created internally. */
u32 reserved;
/*!< Reserved value */
};
/*!
......
......@@ -119,6 +119,9 @@ struct messageq_transportshm_cmd_args {
void *messageq_transportshm_handle;
u16 proc_id;
struct messageq_transportshm_params *params;
u32 shared_addr_srptr;
void *knl_lock_handle;
void *knl_notify_driver;
} create;
struct {
......
......@@ -107,6 +107,7 @@
/* Syslink Trace header */
#include <gt.h>
#include <syslink/atomic_linux.h>
/* Module level headers */
#include <nameserver.h>
#include <multiproc.h>
......@@ -116,6 +117,9 @@
/* #include <OsalSemaphore.h>*/
/*! @brief Macro to make a correct module magic number with refCount */
#define MESSAGEQ_MAKE_MAGICSTAMP(x) ((MESSAGEQ_MODULEID << 12u) | (x))
/* =============================================================================
* Globals
* =============================================================================
......@@ -137,6 +141,8 @@
*/
/* structure for MessageQ module state */
struct messageq_module_object {
atomic_t ref_count;
/*!< Reference count */
void *ns_handle;
/*!< Handle to the local NameServer used for storing GP objects */
struct mutex *gate_handle;
......@@ -257,7 +263,9 @@ void messageq_get_config(struct messageq_config *cfg)
goto exit;
}
if (messageq_state.ns_handle == NULL) {
if (atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true) {
/* (If setup has not yet been called) */
memcpy(cfg, &messageq_state.default_cfg,
sizeof(struct messageq_config));
......@@ -295,6 +303,18 @@ int messageq_setup(const struct messageq_config *cfg)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_setup", cfg);
/* This sets the ref_count variable is not initialized, upper 16 bits is
* written with module Id to ensure correctness of refCount variable.
*/
atomic_cmpmask_and_set(&messageq_state.ref_count,
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(0));
if (atomic_inc_return(&messageq_state.ref_count)
!= MESSAGEQ_MAKE_MAGICSTAMP(1)) {
status = -EEXIST;
goto exit;
}
if (cfg == NULL) {
messageq_get_config(&tmpcfg);
cfg = &tmpcfg;
......@@ -397,6 +417,9 @@ nameserver_create_fail:
messageq_state.can_free_queues = true;
exit:
if (status < 0)
atomic_set(&messageq_state.ref_count,
MESSAGEQ_MAKE_MAGICSTAMP(0));
gt_1trace(messageq_dbgmask, GT_LEAVE, "messageq_setup", status);
return status;
}
......@@ -414,6 +437,19 @@ int messageq_destroy(void)
gt_0trace(messageq_dbgmask, GT_ENTER, "messageq_destroy");
if (atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true) {
status = -ENODEV;
goto exit;
}
if (!(atomic_dec_return(&messageq_state.ref_count)
== MESSAGEQ_MAKE_MAGICSTAMP(0))) {
status = -EBUSY;
goto exit;
}
if (WARN_ON(messageq_state.ns_handle == NULL)) {
status = -ENODEV;
goto exit;
......@@ -451,6 +487,8 @@ int messageq_destroy(void)
messageq_state.num_queues = 0;
messageq_state.num_heaps = 1;
messageq_state.can_free_queues = true;
atomic_set(&messageq_state.ref_count,
MESSAGEQ_MAKE_MAGICSTAMP(0));
exit:
gt_1trace(messageq_dbgmask, GT_LEAVE, "messageq_destroy", status);
......@@ -472,7 +510,11 @@ void messageq_params_init(void *messageq_handle,
gt_2trace(messageq_dbgmask, GT_ENTER, "messageq_params_init",
messageq_handle, params);
BUG_ON(params == NULL);
if (atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true)
goto exit;
if (WARN_ON(params == NULL)) {
/*! @retval None */
gt_2trace(messageq_dbgmask, GT_4CLASS, "messageq_params_init",
......@@ -517,7 +559,9 @@ void *messageq_create(char *name, const struct messageq_params *params)
BUG_ON(name == NULL);
BUG_ON(params == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
if (atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true) {
status = -ENODEV;
goto exit;
}
......@@ -648,7 +692,9 @@ int messageq_delete(void **msg_handleptr)
*msg_handleptr);
BUG_ON(msg_handleptr == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
if (atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true) {
status = -ENODEV;
goto exit;
}
......@@ -710,7 +756,9 @@ int messageq_open(char *name, u32 *queue_id)
gt_2trace(messageq_dbgmask, GT_ENTER, "messageq_open", name, queue_id);
BUG_ON(queue_id == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
if (atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true) {
status = -ENODEV;
goto exit;
}
......@@ -719,11 +767,17 @@ int messageq_open(char *name, u32 *queue_id)
goto exit;
}
/* Initialize return queue ID to invalid. */
*queue_id = MESSAGEQ_INVALIDMESSAGEQ;
len = nameserver_get(messageq_state.ns_handle, name, queue_id,
sizeof(u32), NULL);
if (len < 0) {
/* Name not found */
status = MESSAGEQ_E_FAIL;
if (len == -ENOENT)
/* Name not found */
status = MESSAGEQ_E_NOTFOUND;
else
/* Any other error from nameserver */
status = len;
}
exit:
......@@ -742,13 +796,11 @@ void messageq_close(u32 *queue_id)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_close", queue_id);
BUG_ON(queue_id == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS, "messageq_close",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(queue_id == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDARG queue_id passed is null */
gt_2trace(messageq_dbgmask,
......@@ -769,22 +821,27 @@ EXPORT_SYMBOL(messageq_close);
/*
* ======== messageq_get ========
*/
messageq_msg messageq_get(void *messageq_handle, u32 timeout)
int messageq_get(void *messageq_handle, messageq_msg *msg,
u32 timeout)
{
int status = 0;
messageq_msg msg = NULL;
struct messageq_object *obj = (struct messageq_object *)messageq_handle;
int key;
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_get", obj);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval NULL Module was not initialized */
gt_2trace(messageq_dbgmask, GT_4CLASS, "messageq_count",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
if (WARN_ON(msg == NULL)) {
status = -EINVAL;
goto exit;
}
if (WARN_ON(obj == NULL)) {
/*! @retval NULL Invalid NULL obj pointer specified */
gt_2trace(messageq_dbgmask, GT_4CLASS, "messageq_count",
......@@ -797,20 +854,20 @@ messageq_msg messageq_get(void *messageq_handle, u32 timeout)
/* Take the local lock */
key = mutex_lock_interruptible(messageq_state.gate_handle);
if (!list_empty(&obj->high_list)) {
msg = (messageq_msg) (obj->high_list.next);
*msg = (messageq_msg) (obj->high_list.next);
list_del_init(obj->high_list.next);
}
/* Leave the local lock */
mutex_unlock(messageq_state.gate_handle);
while (msg == NULL) {
while (*msg == NULL) {
key = mutex_lock_interruptible(messageq_state.gate_handle);
if (!list_empty(&obj->normal_list)) {
msg = (messageq_msg) (obj->normal_list.next);
*msg = (messageq_msg) (obj->normal_list.next);
list_del_init(obj->normal_list.next);
}
mutex_unlock(messageq_state.gate_handle);
if (msg == NULL) {
if (*msg == NULL) {
/*
* Block until notified. If pend times-out, no message
* should be returned to the caller
......@@ -823,14 +880,14 @@ messageq_msg messageq_get(void *messageq_handle, u32 timeout)
status = down_timeout(obj->synchronizer,
msecs_to_jiffies(timeout));
if (status < 0) {
msg = NULL;
*msg = NULL;
break;
}
}
key = mutex_lock_interruptible(
messageq_state.gate_handle);
if (!list_empty(&obj->high_list)) {
msg = (messageq_msg) (obj->high_list.next);
*msg = (messageq_msg) (obj->high_list.next);
list_del_init(obj->high_list.next);
}
mutex_unlock(messageq_state.gate_handle);
......@@ -839,7 +896,7 @@ messageq_msg messageq_get(void *messageq_handle, u32 timeout)
exit:
gt_1trace(messageq_dbgmask, GT_LEAVE, "messageq_get", msg);
return msg;
return status;
}
EXPORT_SYMBOL(messageq_get);
......@@ -857,13 +914,11 @@ int messageq_count(void *messageq_handle)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_count", obj);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS, "messageq_count",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(obj == NULL)) {
/*! @retval MESSAGEQ_E_INVALIMSG obj passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS, "messageq_count",
......@@ -896,13 +951,11 @@ void messageq_static_msg_init(messageq_msg msg, u32 size)
gt_2trace(messageq_dbgmask, GT_ENTER, "messageq_static_msg_init",
msg, size);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_static_msg_init",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(msg == NULL)) {
/*! @retval None */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -918,7 +971,7 @@ void messageq_static_msg_init(messageq_msg msg, u32 size)
msg->reply_id = (u16)MESSAGEQ_INVALIDMESSAGEQ;
msg->msg_id = MESSAGEQ_INVALIDMSGID;
msg->dst_id = (u16)MESSAGEQ_INVALIDMESSAGEQ;
msg->flags = 0x0;
msg->flags = MESSAGEQ_HEADERVERSION | MESSAGEQ_NORMALPRI;
exit:
gt_0trace(messageq_dbgmask, GT_LEAVE, "messageq_static_msg_init");
......@@ -939,13 +992,11 @@ messageq_msg messageq_alloc(u16 heap_id, u32 size)
gt_2trace(messageq_dbgmask, GT_ENTER, "messageq_alloc", heap_id, size);
BUG_ON(heap_id >= messageq_state.num_heaps);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval NULL Module was not initialized */
gt_2trace(messageq_dbgmask, GT_4CLASS, "messageq_alloc",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(heap_id >= messageq_state.num_heaps)) {
/*! @retval NULL Heap id is invalid */
gt_2trace(messageq_dbgmask, GT_4CLASS, "messageq_alloc",
......@@ -971,7 +1022,7 @@ messageq_msg messageq_alloc(u16 heap_id, u32 size)
msg->reply_id = (u16)MESSAGEQ_INVALIDMESSAGEQ;
msg->dst_id = (u16)MESSAGEQ_INVALIDMESSAGEQ;
msg->msg_id = MESSAGEQ_INVALIDMSGID;
msg->flags = 0x0;
msg->flags = MESSAGEQ_HEADERVERSION | MESSAGEQ_NORMALPRI;
} else {
/*! @retval NULL Heap was not registered */
gt_2trace(messageq_dbgmask,
......@@ -1000,10 +1051,13 @@ int messageq_free(messageq_msg msg)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_free", msg);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
if (WARN_ON(msg == NULL)) {
status = -EINVAL;
goto exit;
......@@ -1053,7 +1107,9 @@ int messageq_put(u32 queue_id, messageq_msg msg)
gt_2trace(messageq_dbgmask, GT_ENTER, "messageq_put", queue_id, msg);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
......@@ -1076,9 +1132,16 @@ int messageq_put(u32 queue_id, messageq_msg msg)
goto exit;
}
priority = (u32)((msg->flags) & MESSAGEQ_PRIORITYMASK);
priority = (u32)((msg->flags) & MESSAGEQ_TRANSPORTPRIORITYMASK);
/* Call the transport associated with this message queue */
transport = messageq_state.transports[dst_proc_id][priority];
if (transport == NULL) {
/* Try the other transport */
priority = !priority;
transport =
messageq_state.transports[dst_proc_id][priority];
}
if (transport != NULL)
status = messageq_transportshm_put(transport, msg);
else {
......@@ -1133,7 +1196,9 @@ int messageq_register_heap(void *heap_handle, u16 heap_id)
/* Make sure the heap_id is valid */
BUG_ON((heap_id >= messageq_state.num_heaps));
if (WARN_ON(messageq_state.ns_handle == NULL)) {
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
......@@ -1179,10 +1244,13 @@ int messageq_unregister_heap(u16 heap_id)
/* Make sure the heap_id is valid */
BUG_ON((heap_id >= messageq_state.num_heaps));
if (WARN_ON(messageq_state.ns_handle == NULL)) {
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
if (heap_id > messageq_state.num_heaps) {
/*! @retval MESSAGEQ_E_HEAPIDINVALID Invalid heap_id */
status = MESSAGEQ_E_HEAPIDINVALID;
......@@ -1221,10 +1289,13 @@ int messageq_register_transport(void *messageq_transportshm_handle,
BUG_ON(messageq_transportshm_handle == NULL);
/* Make sure the proc_id is valid */
BUG_ON((proc_id >= multiproc_get_max_processors()));
if (WARN_ON(messageq_state.ns_handle == NULL)) {
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
if (proc_id > multiproc_get_max_processors()) {
/*! @retval MESSAGEQ_E_PROCIDINVALID Invalid proc_id */
status = MESSAGEQ_E_PROCIDINVALID;
......@@ -1270,10 +1341,13 @@ int messageq_unregister_transport(u16 proc_id, u32 priority)
/* Make sure the proc_id is valid */
BUG_ON((proc_id >= multiproc_get_max_processors()));
if (WARN_ON(messageq_state.ns_handle == NULL)) {
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
if (proc_id > multiproc_get_max_processors()) {
/*! @retval MESSAGEQ_E_PROCIDINVALID Invalid proc_id */
status = MESSAGEQ_E_PROCIDINVALID;
......@@ -1310,16 +1384,13 @@ void messageq_set_reply_queue(void *messageq_handle, messageq_msg msg)
gt_2trace(messageq_dbgmask, GT_ENTER, "messageq_set_reply_queue",
obj, msg);
BUG_ON(obj == NULL);
BUG_ON(messageq_handle == NULL);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_set_reply_queue",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(msg == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDARG hpHandle passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1351,14 +1422,11 @@ u32 messageq_get_queue_id(void *messageq_handle)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_get_queue_id", obj);
BUG_ON(obj == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_get_queue_id",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(obj == NULL)) {
/*! @retval MESSAGEQ_E_INVALIMSG obj passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1391,14 +1459,11 @@ u16 messageq_get_proc_id(void *messageq_handle)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_get_proc_id", obj);
BUG_ON(obj == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_get_proc_id",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(obj == NULL)) {
/*! @retval MESSAGEQ_E_INVALIMSG obj passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1428,14 +1493,11 @@ u32 messageq_get_dst_queue(messageq_msg msg)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_get_dst_queue", msg);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_get_dst_queue",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(msg == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDMSG msg passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1468,14 +1530,11 @@ u16 messageq_get_msg_id(messageq_msg msg)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_get_msg_id", msg);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_get_msg_id",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(msg == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDMSG msg passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1505,14 +1564,11 @@ u32 messageq_get_msg_size(messageq_msg msg)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_get_msg_size", msg);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_get_msg_size",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(msg == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDMSG msg passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1542,14 +1598,11 @@ u32 messageq_get_msg_pri(messageq_msg msg)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_get_msg_pri", msg);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_get_msg_pri",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(msg == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDMSG msg passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1579,14 +1632,11 @@ u32 messageq_get_reply_queue(messageq_msg msg)
gt_1trace(messageq_dbgmask, GT_ENTER, "messageq_get_reply_queue", msg);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_get_reply_queue",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(msg == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDMSG msg passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1617,14 +1667,11 @@ void messageq_set_msg_id(messageq_msg msg, u16 msg_id)
msg, msg_id);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_set_msg_id",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(msg == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDMSG msg passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1653,14 +1700,11 @@ void messageq_set_msg_pri(messageq_msg msg, u32 priority)
msg, priority);
BUG_ON(msg == NULL);
if (WARN_ON(messageq_state.ns_handle == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDSTATE Module was not initialized*/
gt_2trace(messageq_dbgmask, GT_4CLASS,
"messageq_set_msg_pri",
MESSAGEQ_E_INVALIDSTATE,
"Module was not initialized!");
if (WARN_ON(atomic_cmpmask_and_lt(&(messageq_state.ref_count),
MESSAGEQ_MAKE_MAGICSTAMP(0),
MESSAGEQ_MAKE_MAGICSTAMP(1)) == true))
goto exit;
}
if (WARN_ON(msg == NULL)) {
/*! @retval MESSAGEQ_E_INVALIDMSG msg passed is null */
gt_2trace(messageq_dbgmask, GT_4CLASS,
......@@ -1712,7 +1756,7 @@ u16 _messageq_grow(struct messageq_object *obj)
/*! @retval Queue-index-greater-than-valid Growing the
MessageQ failed */
gt_2trace(messageq_dbgmask, GT_4CLASS, "_messageq_grow",
MESSAGEQ_E_FAIL,
MESSAGEQ_INVALIDMESSAGEQ,
"Growing the MessageQ failed!");
goto exit;
}
......
......@@ -60,22 +60,24 @@ exit:
*/
static inline int messageq_ioctl_get(struct messageq_cmd_args *cargs)
{
messageq_msg msg;
messageq_msg msg = NULL;
u32 *msg_srptr = SHAREDREGION_INVALIDSRPTR;
int index;
msg = messageq_get(cargs->args.get.messageq_handle,
cargs->args.get.timeout);
if (unlikely(msg == NULL))
cargs->api_status = messageq_get(cargs->args.get.messageq_handle,
&msg,
cargs->args.get.timeout);
if (unlikely(cargs->api_status < 0))
goto exit;
index = sharedregion_get_index(msg);
if (unlikely(index < 0))
if (unlikely(index < 0)) {
cargs->api_status = index;
goto exit;
}
msg_srptr = sharedregion_get_srptr(msg, index);
cargs->api_status = 0;
exit:
cargs->args.get.msg_srptr = msg_srptr;
return 0;
......
......@@ -24,7 +24,7 @@
/* Syslink headers */
#include <gt.h>
#include <syslink/atomic_linux.h>
/* Module level headers */
#include <multiproc.h>
#include <nameserver.h>
......@@ -48,6 +48,12 @@
/* messageq_transportshm Version. */
#define MESSAGEQ_TRANSPORTSHM_VERSION 1
/*!
* @brief Macro to make a correct module magic number with refCount
*/
#define MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(x) \
((MESSAGEQ_TRANSPORTSHM_MODULEID << 12u) | (x))
/* =============================================================================
* Structures & Enums
* =============================================================================
......@@ -57,14 +63,13 @@
* module specific information.
*/
struct messageq_transportshm_moduleobject {
atomic_t ref_count;
struct messageq_transportshm_config cfg;
/*< messageq_transportshm configuration structure */
struct messageq_transportshm_config def_cfg;
/*< Default module configuration */
struct messageq_transportshm_params def_inst_params;
/*< Default instance parameters */
bool is_setup;
/*< Indicates whether the messageq_transportshm module is setup. */
void *gate_handle;
/*< Handle to the gate for local thread safety */
};
......@@ -73,8 +78,8 @@ struct messageq_transportshm_moduleobject {
* Structure of attributes in shared memory
*/
struct messageq_transportshm_attrs {
u32 version;
u32 flag;
volatile u32 version;
volatile u32 flag;
};
/*
......@@ -82,13 +87,13 @@ struct messageq_transportshm_attrs {
* instances.
*/
struct messageq_transportshm_object {
struct messageq_transportshm_attrs *attrs[2];
volatile struct messageq_transportshm_attrs *attrs[2];
/* Attributes for both processors */
void *my_listmp_handle;
/* List for this processor */
void *remote_listmp_handle;
/* List for remote processor */
int status;
volatile int status;
/* Current status */
int my_index;
/* 0 | 1 */
......@@ -104,6 +109,8 @@ struct messageq_transportshm_object {
/* Gate for critical regions */
struct messageq_transportshm_params params;
/* Instance specific parameters */
u32 priority;
/*!< Priority of messages supported by this transport */
};
/* =============================================================================
......@@ -116,9 +123,8 @@ struct messageq_transportshm_object {
* messageq_transportshm state object variable
*/
static struct messageq_transportshm_moduleobject messageq_transportshm_state = {
.is_setup = false,
.gate_handle = NULL,
.def_cfg.gate_handle = NULL,
.def_cfg.reserved = 0,
.def_inst_params.gate = NULL,
.def_inst_params.shared_addr = 0x0,
.def_inst_params.shared_addr_size = 0x0,
......@@ -166,7 +172,9 @@ void messageq_transportshm_get_config(
if (WARN_ON(cfg == NULL))
goto exit;
if (messageq_transportshm_state.is_setup == false) {
if (atomic_cmpmask_and_lt(&(messageq_transportshm_state.ref_count),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(1)) == true) {
memcpy(cfg, &(messageq_transportshm_state.def_cfg),
sizeof(struct messageq_transportshm_config));
} else {
......@@ -206,20 +214,27 @@ int messageq_transportshm_setup(struct messageq_transportshm_config *cfg)
gt_1trace(mqtshm_debugmask, GT_ENTER,
"messageq_transportshm_setup", cfg);
/* This sets the refCount variable is not initialized, upper 16 bits is
* written with module Id to ensure correctness of refCount variable.
*/
atomic_cmpmask_and_set(&messageq_transportshm_state.ref_count,
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0));
if (atomic_inc_return(&messageq_transportshm_state.ref_count)
!= MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(1u)) {
status = -EEXIST;;
goto exit;
}
if (cfg == NULL) {
messageq_transportshm_get_config(&tmpCfg);
cfg = &tmpCfg;
}
if (cfg->gate_handle != NULL) {
messageq_transportshm_state.gate_handle = cfg->gate_handle;
} else {
/* User has not provided any gate handle, so create a
default handle. */
messageq_transportshm_state.gate_handle = \
kmalloc(sizeof(struct mutex), GFP_KERNEL);
mutex_init(messageq_transportshm_state.gate_handle);
}
messageq_transportshm_state.gate_handle = \
kmalloc(sizeof(struct mutex), GFP_KERNEL);
mutex_init(messageq_transportshm_state.gate_handle);
if (messageq_transportshm_state.gate_handle == NULL) {
/* @retval MESSAGEQTRANSPORTSHM_E_FAIL Failed to create
......@@ -230,13 +245,14 @@ int messageq_transportshm_setup(struct messageq_transportshm_config *cfg)
"messageq_transportshm_setup",
status,
"Failed to create GateMutex!");
atomic_set(&messageq_transportshm_state.ref_count,
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0));
goto exit;
}
/* Copy the user provided values into the state object. */
memcpy(&messageq_transportshm_state.cfg, cfg,
sizeof(struct messageq_transportshm_config));
messageq_transportshm_state.is_setup = true;
exit:
gt_1trace(mqtshm_debugmask, GT_LEAVE,
......@@ -261,18 +277,26 @@ int messageq_transportshm_destroy(void)
gt_0trace(mqtshm_debugmask, GT_ENTER, "messageq_transportshm_destroy");
/* Check if the gate_handle was created internally. */
if (messageq_transportshm_state.cfg.gate_handle == NULL) {
if (WARN_ON(atomic_cmpmask_and_lt(
&(messageq_transportshm_state.ref_count),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
if (atomic_dec_return(&messageq_transportshm_state.ref_count)
== MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0)) {
if (messageq_transportshm_state.gate_handle != NULL) {
kfree(messageq_transportshm_state.gate_handle);
messageq_transportshm_state.gate_handle = NULL;
}
/* Decrease the ref_count */
atomic_set(&messageq_transportshm_state.ref_count,
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0));
}
messageq_transportshm_state.is_setup = false;
gt_1trace(mqtshm_debugmask, GT_LEAVE,
"messageq_transportshm_destroy", status);
exit:
return status;
}
......@@ -291,6 +315,12 @@ void messageq_transportshm_params_init(void *mqtshm_handle,
"messageq_transportshm_params_init", mqtshm_handle,
params);
if (WARN_ON(atomic_cmpmask_and_lt(
&(messageq_transportshm_state.ref_count),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(1)) == true))
goto exit;
BUG_ON(params == NULL);
if (WARN_ON(params == NULL)) {
/* @retval None */
......@@ -337,11 +367,17 @@ void *messageq_transportshm_create(u16 proc_id,
int my_index;
int remote_index;
listmp_sharedmemory_params listmp_params[2];
u32 *volatile otherflag;
volatile u32 *otherflag;
gt_2trace(mqtshm_debugmask, GT_ENTER, "messageq_transportshm_create",
proc_id, params);
if (WARN_ON(atomic_cmpmask_and_lt(
&(messageq_transportshm_state.ref_count),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(1)) == true))
goto exit;
BUG_ON(params == NULL);
if (WARN_ON(params == NULL)) {
status = -EINVAL;
......@@ -398,6 +434,7 @@ void *messageq_transportshm_create(u16 proc_id,
handle->notify_driver = params->notify_driver;
handle->notify_event_no = params->notify_event_no;
handle->priority = params->priority;
handle->proc_id = proc_id;
handle->my_index = my_index;
handle->remote_index = remote_index;
......@@ -424,8 +461,8 @@ void *messageq_transportshm_create(u16 proc_id,
handle->my_listmp_handle = listmp_sharedmemory_create
(&(listmp_params[my_index]));
handle->attrs[my_index]->flag = MESSAGEQ_TRANSPORTSHM_UP;
handle->attrs[my_index]->version = MESSAGEQ_TRANSPORTSHM_VERSION;
handle->attrs[my_index]->flag = MESSAGEQ_TRANSPORTSHM_UP;
/* Store in volatile to make sure it is not compiled out... */
otherflag = &(handle->attrs[remote_index]->flag);
......@@ -442,7 +479,7 @@ void *messageq_transportshm_create(u16 proc_id,
gt_2trace(mqtshm_debugmask, GT_4CLASS,
"messageq_transportshm_create",
MESSAGEQ_TRANSPORTSHM_E_BADVERSION,
"Notify register failed!");
"Incorrect version of remote transport!");
goto exit;
}
......@@ -496,6 +533,14 @@ int messageq_transportshm_delete(void **mqtshm_handleptr)
gt_1trace(mqtshm_debugmask, GT_ENTER, "messageq_transportshm_delete",
mqtshm_handleptr);
if (WARN_ON(atomic_cmpmask_and_lt(
&(messageq_transportshm_state.ref_count),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
BUG_ON(mqtshm_handleptr == NULL);
if (WARN_ON(mqtshm_handleptr == NULL)) {
status = -EINVAL;
......@@ -575,9 +620,17 @@ int messageq_transportshm_put(void *mqtshm_handle,
gt_2trace(mqtshm_debugmask, GT_ENTER, "messageq_transportshm_put",
obj, msg);
if (WARN_ON(atomic_cmpmask_and_lt(
&(messageq_transportshm_state.ref_count),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(0),
MESSAGEQTRANSPORTSHM_MAKE_MAGICSTAMP(1)) == true)) {
status = -ENODEV;
goto exit;
}
BUG_ON(mqtshm_handle == NULL);
BUG_ON(msg == NULL);
BUG_ON(obj == NULL);
if (WARN_ON(msg == NULL)) {
status = -EINVAL;
goto exit;
......
......@@ -141,10 +141,13 @@ static inline int messageq_transportshm_ioctl_create(
goto exit;
}
params.shared_addr = sharedregion_get_ptr((u32 *)params.shared_addr);
params.shared_addr = sharedregion_get_ptr(
(u32 *)cargs->args.create.shared_addr_srptr);
if (unlikely(params.shared_addr == NULL))
goto exit;
params.gate = cargs->args.create.knl_lock_handle;
params.notify_driver = cargs->args.create.knl_notify_driver;
cargs->args.create.messageq_transportshm_handle = \
messageq_transportshm_create(cargs->args.create.proc_id,
&params);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment