in ti-msgmgr.c [581:643]
static int ti_msgmgr_queue_setup(int idx, struct device *dev,
struct device_node *np,
struct ti_msgmgr_inst *inst,
const struct ti_msgmgr_desc *d,
const struct ti_msgmgr_valid_queue_desc *qd,
struct ti_queue_inst *qinst,
struct mbox_chan *chan)
{
char *dir;
qinst->proxy_id = qd->proxy_id;
qinst->queue_id = qd->queue_id;
if (qinst->queue_id > d->queue_count) {
dev_err(dev, "Queue Data [idx=%d] queuid %d > %d\n",
idx, qinst->queue_id, d->queue_count);
return -ERANGE;
}
if (d->is_sproxy) {
qinst->queue_buff_start = inst->queue_proxy_region +
SPROXY_THREAD_DATA_OFFSET(qinst->proxy_id,
d->data_first_reg);
qinst->queue_buff_end = inst->queue_proxy_region +
SPROXY_THREAD_DATA_OFFSET(qinst->proxy_id,
d->data_last_reg);
qinst->queue_state = inst->queue_state_debug_region +
SPROXY_THREAD_STATUS_OFFSET(qinst->proxy_id);
qinst->queue_ctrl = inst->queue_ctrl_region +
SPROXY_THREAD_CTRL_OFFSET(qinst->proxy_id);
/* XXX: DONOT read registers here!.. Some may be unusable */
dir = "thr";
snprintf(qinst->name, sizeof(qinst->name), "%s %s_%03d",
dev_name(dev), dir, qinst->proxy_id);
} else {
qinst->queue_buff_start = inst->queue_proxy_region +
Q_DATA_OFFSET(qinst->proxy_id, qinst->queue_id,
d->data_first_reg);
qinst->queue_buff_end = inst->queue_proxy_region +
Q_DATA_OFFSET(qinst->proxy_id, qinst->queue_id,
d->data_last_reg);
qinst->queue_state =
inst->queue_state_debug_region +
Q_STATE_OFFSET(qinst->queue_id);
qinst->is_tx = qd->is_tx;
dir = qinst->is_tx ? "tx" : "rx";
snprintf(qinst->name, sizeof(qinst->name), "%s %s_%03d_%03d",
dev_name(dev), dir, qinst->queue_id, qinst->proxy_id);
}
qinst->chan = chan;
/* Setup an error value for IRQ - Lazy allocation */
qinst->irq = -EINVAL;
chan->con_priv = qinst;
dev_dbg(dev, "[%d] qidx=%d pidx=%d irq=%d q_s=%p q_e = %p\n",
idx, qinst->queue_id, qinst->proxy_id, qinst->irq,
qinst->queue_buff_start, qinst->queue_buff_end);
return 0;
}