mailbox: ti-msgmgr: Change message count mask to be descriptor based

Change mask used to extract the message count to be descriptor based.

This is to support changes for count location for various SoC
solutions.

Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
This commit is contained in:
Nishanth Menon 2018-07-16 13:06:04 -05:00 committed by Jassi Brar
parent 5ab935e194
commit 8e56086292
1 changed files with 18 additions and 7 deletions

View File

@ -44,6 +44,7 @@ struct ti_msgmgr_valid_queue_desc {
* @max_messages: Number of messages
* @data_first_reg: First data register for proxy data region
* @data_last_reg: Last data register for proxy data region
* @status_cnt_mask: Mask for getting the status value
* @tx_polled: Do I need to use polled mechanism for tx
* @tx_poll_timeout_ms: Timeout in ms if polled
* @valid_queues: List of Valid queues that the processor can access
@ -58,6 +59,7 @@ struct ti_msgmgr_desc {
u8 max_messages;
u8 data_first_reg;
u8 data_last_reg;
u32 status_cnt_mask;
bool tx_polled;
int tx_poll_timeout_ms;
const struct ti_msgmgr_valid_queue_desc *valid_queues;
@ -116,20 +118,24 @@ struct ti_msgmgr_inst {
/**
* ti_msgmgr_queue_get_num_messages() - Get the number of pending messages
* @d: Description of message manager
* @qinst: Queue instance for which we check the number of pending messages
*
* Return: number of messages pending in the queue (0 == no pending messages)
*/
static inline int ti_msgmgr_queue_get_num_messages(struct ti_queue_inst *qinst)
static inline int
ti_msgmgr_queue_get_num_messages(const struct ti_msgmgr_desc *d,
struct ti_queue_inst *qinst)
{
u32 val;
u32 status_cnt_mask = d->status_cnt_mask;
/*
* We cannot use relaxed operation here - update may happen
* real-time.
*/
val = readl(qinst->queue_state) & Q_STATE_ENTRY_COUNT_MASK;
val >>= __ffs(Q_STATE_ENTRY_COUNT_MASK);
val = readl(qinst->queue_state) & status_cnt_mask;
val >>= __ffs(status_cnt_mask);
return val;
}
@ -167,8 +173,9 @@ static irqreturn_t ti_msgmgr_queue_rx_interrupt(int irq, void *p)
return IRQ_NONE;
}
desc = inst->desc;
/* Do I actually have messages to read? */
msg_count = ti_msgmgr_queue_get_num_messages(qinst);
msg_count = ti_msgmgr_queue_get_num_messages(desc, qinst);
if (!msg_count) {
/* Shared IRQ? */
dev_dbg(dev, "Spurious event - 0 pending data!\n");
@ -181,7 +188,6 @@ static irqreturn_t ti_msgmgr_queue_rx_interrupt(int irq, void *p)
* of how many bytes I should be reading. Let the client figure this
* out.. I just read the full message and pass it on..
*/
desc = inst->desc;
message.len = desc->max_message_size;
message.buf = (u8 *)qinst->rx_buff;
@ -224,12 +230,14 @@ static irqreturn_t ti_msgmgr_queue_rx_interrupt(int irq, void *p)
static bool ti_msgmgr_queue_peek_data(struct mbox_chan *chan)
{
struct ti_queue_inst *qinst = chan->con_priv;
struct device *dev = chan->mbox->dev;
struct ti_msgmgr_inst *inst = dev_get_drvdata(dev);
int msg_count;
if (qinst->is_tx)
return false;
msg_count = ti_msgmgr_queue_get_num_messages(qinst);
msg_count = ti_msgmgr_queue_get_num_messages(inst->desc, qinst);
return msg_count ? true : false;
}
@ -243,12 +251,14 @@ static bool ti_msgmgr_queue_peek_data(struct mbox_chan *chan)
static bool ti_msgmgr_last_tx_done(struct mbox_chan *chan)
{
struct ti_queue_inst *qinst = chan->con_priv;
struct device *dev = chan->mbox->dev;
struct ti_msgmgr_inst *inst = dev_get_drvdata(dev);
int msg_count;
if (!qinst->is_tx)
return false;
msg_count = ti_msgmgr_queue_get_num_messages(qinst);
msg_count = ti_msgmgr_queue_get_num_messages(inst->desc, qinst);
/* if we have any messages pending.. */
return msg_count ? false : true;
@ -523,6 +533,7 @@ static const struct ti_msgmgr_desc k2g_desc = {
.max_messages = 128,
.data_first_reg = 16,
.data_last_reg = 31,
.status_cnt_mask = Q_STATE_ENTRY_COUNT_MASK,
.tx_polled = false,
.valid_queues = k2g_valid_queues,
.num_valid_queues = ARRAY_SIZE(k2g_valid_queues),