Merge "soc: qcom: smp2p: Add memory barrier for irq_pending"

This commit is contained in:
qctecmdr 2020-11-14 01:35:46 -08:00 • committed by Gerrit - the friendly Code Review server
commit 761f457a49
2 changed files with 20 additions and 2 deletions

View file

@ -215,6 +215,8 @@ struct qmp_device {
*/
static void send_irq(struct qmp_device *mdev)
{
int ret;
/*
* Any data associated with this event must be visable to the remote
* before the interrupt is triggered
@ -222,8 +224,11 @@ static void send_irq(struct qmp_device *mdev)
wmb();
if (mdev->mbox_chan) {
mbox_send_message(mdev->mbox_chan, NULL);
ret = mbox_send_message(mdev->mbox_chan, NULL);
mbox_client_txdone(mdev->mbox_chan, 0);
if (ret < 0)
QMP_ERR(mdev->ilc, "failed to trigger ipcc irq %d\n", ret);
} else {
writel_relaxed(mdev->irq_mask, mdev->tx_irq_reg);
}
@ -527,6 +532,7 @@ static irqreturn_t qmp_irq_handler(int irq, void *priv)
kthread_queue_work(&mdev->kworker, &mdev->kwork);
mdev->rx_irq_count++;
QMP_INFO(mdev->ilc, "Queued rx worker count:%d\n", mdev->rx_irq_count);
return IRQ_HANDLED;
}
@ -542,9 +548,12 @@ static void __qmp_rx_worker(struct qmp_mbox *mbox)
struct qmp_device *mdev = mbox->mdev;
unsigned long flags;
QMP_INFO(mdev->ilc, "Enter rx worker state:%d\n", mbox->local_state);
memcpy_fromio(&desc, mbox->desc, sizeof(desc));
if (desc.magic != QMP_MAGIC)
if (desc.magic != QMP_MAGIC) {
QMP_ERR(mdev->ilc, "wrong magic 0x:%x\n", desc.magic);
return;
}
mutex_lock(&mbox->state_lock);
switch (mbox->local_state) {
@ -660,6 +669,7 @@ static void __qmp_rx_worker(struct qmp_mbox *mbox)
default:
QMP_ERR(mdev->ilc, "Local Channel State corrupted\n");
}
QMP_INFO(mdev->ilc, "Exit rx worker state:%d\n", mbox->local_state);
mutex_unlock(&mbox->state_lock);
}

View file

@ -270,6 +270,9 @@ static void qcom_smp2p_notify_in(struct qcom_smp2p *smp2p)
status = val ^ entry->last_value;
entry->last_value = val;
/* Ensure irq_pending is read correctly */
mb();
status |= *entry->irq_pending;
SMP2P_INFO("%d:\t%s: status:%0lx val:%0x\n",
@ -391,6 +394,11 @@ static int smp2p_retrigger_irq(struct irq_data *irqd)
SMP2P_INFO("%d: %s: %lu\n", entry->smp2p->remote_pid, entry->name, irq);
set_bit(irq, entry->irq_pending);
/* Ensure irq_pending is visible to all cpus that retried interrupt
* can run on
*/
mb();
return 0;
}