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

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

Merge "mhi: core: fix fast forward recycling of event rings"

parents 9088c382 e793d2bf
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -341,6 +341,29 @@ static void mhi_recycle_ev_ring_element(struct mhi_controller *mhi_cntrl,
	smp_wmb();
}

static void mhi_recycle_fwd_ev_ring_element(struct mhi_controller *mhi_cntrl,
					struct mhi_ring *ring)
{
	dma_addr_t ctxt_wp;

	/* update the WP */
	ring->wp += ring->el_size;
	if (ring->wp >= (ring->base + ring->len))
		ring->wp = ring->base;

	/* update the context WP based on the RP to support fast forwarding */
	ctxt_wp = ring->iommu_base + (ring->wp - ring->base);
	*ring->ctxt_wp = ctxt_wp;

	/* update the RP */
	ring->rp += ring->el_size;
	if (ring->rp >= (ring->base + ring->len))
		ring->rp = ring->base;

	/* visible to other cores */
	smp_wmb();
}

static bool mhi_is_ring_full(struct mhi_controller *mhi_cntrl,
			     struct mhi_ring *ring)
{
@@ -1530,7 +1553,7 @@ int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
	ev_ring->wp = dev_rp - 1;
	if (ev_ring->wp < ev_ring->base)
		ev_ring->wp = ev_ring->base + ev_ring->len - ev_ring->el_size;
	mhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);
	mhi_recycle_fwd_ev_ring_element(mhi_cntrl, ev_ring);

	read_lock_bh(&mhi_cntrl->pm_lock);
	if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl)))