Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 761f457a authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

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

parents a5b3c596 f2197a20
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -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);
}

+8 −0
Original line number Diff line number Diff line
@@ -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;
}