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

Commit 87093e20 authored by Tony Truong's avatar Tony Truong Committed by Gerrit - the friendly Code Review server
Browse files

mhi: core: Enable dynamic event ring allocation



Enable dynamic allocation of event rings from the coherent pool
to ensure appropriate page alignment with device.

Change-Id: Id57ccd889cf96aad73f4ada01405e2d734351c8c
Signed-off-by: default avatarAndrei Danaila <adanaila@codeaurora.org>
Signed-off-by: default avatarTony Truong <truong@codeaurora.org>
parent 2cd885b1
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -71,11 +71,16 @@ int mhi_populate_event_cfg(struct mhi_device_ctxt *mhi_dev_ctxt)
		if (MHI_HW_RING == GET_EV_PROPS(EV_TYPE,
			mhi_dev_ctxt->ev_ring_props[i].flags)) {
			mhi_dev_ctxt->ev_ring_props[i].class = MHI_HW_RING;
			mhi_dev_ctxt->mmio_info.nr_sw_event_rings++;
			mhi_dev_ctxt->mmio_info.nr_hw_event_rings++;
		} else {
			mhi_dev_ctxt->ev_ring_props[i].class = MHI_SW_RING;
			mhi_dev_ctxt->mmio_info.nr_hw_event_rings++;
			mhi_dev_ctxt->mmio_info.nr_sw_event_rings++;
		}
		mhi_log(MHI_MSG_INFO,
		 "Detected %d SW EV rings and %d HW EV rings out of %d EV rings\n",
		  mhi_dev_ctxt->mmio_info.nr_sw_event_rings,
		  mhi_dev_ctxt->mmio_info.nr_hw_event_rings,
		  mhi_dev_ctxt->mmio_info.nr_event_rings);
	}
dt_error:
	return r;
+24 −14
Original line number Diff line number Diff line
@@ -71,7 +71,6 @@ ev_mutex_free:

size_t calculate_mhi_space(struct mhi_device_ctxt *mhi_dev_ctxt)
{
	int i = 0;
	size_t mhi_dev_mem = 0;

	/* Calculate size needed for contexts */
@@ -83,12 +82,6 @@ size_t calculate_mhi_space(struct mhi_device_ctxt *mhi_dev_ctxt)
				mhi_dev_mem);
	/*Calculate size needed for cmd TREs */
	mhi_dev_mem += (CMD_EL_PER_RING * sizeof(union mhi_cmd_pkt));

	/* Calculate size needed for event TREs */
	for (i = 0; i < mhi_dev_ctxt->mmio_info.nr_event_rings; ++i)
		mhi_dev_mem += (sizeof(union mhi_event_pkt) *
				mhi_dev_ctxt->ev_ring_props[i].nr_desc);

	mhi_log(MHI_MSG_INFO, "Final bytes for MHI device space %zd\n",
				mhi_dev_mem);
	return mhi_dev_mem;
@@ -346,22 +339,39 @@ int init_mhi_dev_mem(struct mhi_device_ctxt *mhi_dev_ctxt)

	/* Initialize both the local and device event contexts */
	for (i = 0; i < mhi_dev_ctxt->mmio_info.nr_event_rings; ++i) {
		dma_addr_t ring_dma_addr = 0;
		void *ring_addr = NULL;

		ring_len = sizeof(union mhi_event_pkt) *
					mhi_dev_ctxt->ev_ring_props[i].nr_desc;
		ring_addr = dma_alloc_coherent(
				&mhi_dev_ctxt->dev_info->pcie_device->dev,
				ring_len, &ring_dma_addr, GFP_KERNEL);
		if (!ring_addr)
			goto err_ev_alloc;
		init_dev_ev_ctxt(&mhi_dev_ctxt->dev_space.ring_ctxt.ec_list[i],
				dma_dev_mem_start + mhi_mem_index,
				ring_len);
				ring_dma_addr, ring_len);
		init_local_ev_ctxt(&mhi_dev_ctxt->mhi_local_event_ctxt[i],
				dev_mem_start + mhi_mem_index,
				ring_len);
				ring_addr, ring_len);
		mhi_log(MHI_MSG_INFO,
			"Initializing EV_%d TRE list at virt 0x%p dma 0x%llx\n",
				i, dev_mem_start + mhi_mem_index,
				(u64)dma_dev_mem_start + mhi_mem_index);
		mhi_mem_index += ring_len;
				i, ring_addr, (u64)ring_dma_addr);
	}
	return 0;

err_ev_alloc:
	for (; i >= 0; --i) {
		struct mhi_event_ctxt *dev_ev_ctxt = NULL;
		struct mhi_ring *ev_ctxt = NULL;

		dev_ev_ctxt = &mhi_dev_ctxt->dev_space.ring_ctxt.ec_list[i];
		ev_ctxt = &mhi_dev_ctxt->mhi_local_event_ctxt[i];

		dma_free_coherent(&mhi_dev_ctxt->dev_info->pcie_device->dev,
				  ev_ctxt->len,
				  ev_ctxt->base,
				  dev_ev_ctxt->mhi_event_ring_base_addr);
	}
	dma_free_coherent(&mhi_dev_ctxt->dev_info->pcie_device->dev,
			   mhi_dev_ctxt->dev_space.dev_mem_len,
			   mhi_dev_ctxt->dev_space.dev_mem_start,