|
@@ -698,6 +698,104 @@ static void ce_ring_test_initial_indexes(int ce_id, struct CE_ring_state *ring,
|
|
|
QDF_BUG(0);
|
|
|
}
|
|
|
|
|
|
+#ifdef IPA_OFFLOAD
|
|
|
+/**
|
|
|
+ * ce_alloc_desc_ring() - Allocate copyengine descriptor ring
|
|
|
+ * @scn: softc instance
|
|
|
+ * @ce_id: ce in question
|
|
|
+ * @base_addr: pointer to copyengine ring base address
|
|
|
+ * @ce_ring: copyengine instance
|
|
|
+ * @nentries: number of entries should be allocated
|
|
|
+ * @desc_size: ce desc size
|
|
|
+ *
|
|
|
+ * Return: QDF_STATUS_SUCCESS - for success
|
|
|
+ */
|
|
|
+static QDF_STATUS ce_alloc_desc_ring(struct hif_softc *scn, unsigned int CE_id,
|
|
|
+ qdf_dma_addr_t *base_addr,
|
|
|
+ struct CE_ring_state *ce_ring,
|
|
|
+ unsigned int nentries, uint32_t desc_size)
|
|
|
+{
|
|
|
+ if (CE_id == HIF_PCI_IPA_UC_ASSIGNED_CE) {
|
|
|
+ scn->ipa_ce_ring = qdf_mem_shared_mem_alloc(scn->qdf_dev,
|
|
|
+ nentries * desc_size + CE_DESC_RING_ALIGN);
|
|
|
+ if (!scn->ipa_ce_ring) {
|
|
|
+ HIF_ERROR("%s: Failed to allocate memory for IPA ce ring",
|
|
|
+ __func__);
|
|
|
+ return QDF_STATUS_E_NOMEM;
|
|
|
+ }
|
|
|
+ *base_addr = qdf_mem_get_dma_addr(scn->qdf_dev,
|
|
|
+ &scn->ipa_ce_ring->mem_info);
|
|
|
+ ce_ring->base_addr_owner_space_unaligned =
|
|
|
+ scn->ipa_ce_ring->vaddr;
|
|
|
+ } else {
|
|
|
+ ce_ring->base_addr_owner_space_unaligned =
|
|
|
+ qdf_mem_alloc_consistent(scn->qdf_dev,
|
|
|
+ scn->qdf_dev->dev,
|
|
|
+ (nentries * desc_size +
|
|
|
+ CE_DESC_RING_ALIGN),
|
|
|
+ base_addr);
|
|
|
+ if (!ce_ring->base_addr_owner_space_unaligned) {
|
|
|
+ HIF_ERROR("%s: Failed to allocate DMA memory for ce ring id : %u",
|
|
|
+ __func__, CE_id);
|
|
|
+ return QDF_STATUS_E_NOMEM;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * ce_free_desc_ring() - Frees copyengine descriptor ring
|
|
|
+ * @scn: softc instance
|
|
|
+ * @ce_id: ce in question
|
|
|
+ * @ce_ring: copyengine instance
|
|
|
+ * @desc_size: ce desc size
|
|
|
+ *
|
|
|
+ * Return: None
|
|
|
+ */
|
|
|
+static void ce_free_desc_ring(struct hif_softc *scn, unsigned int CE_id,
|
|
|
+ struct CE_ring_state *ce_ring, uint32_t desc_size)
|
|
|
+{
|
|
|
+ if (CE_id == HIF_PCI_IPA_UC_ASSIGNED_CE) {
|
|
|
+ qdf_mem_shared_mem_free(scn->qdf_dev,
|
|
|
+ scn->ipa_ce_ring);
|
|
|
+ ce_ring->base_addr_owner_space_unaligned = NULL;
|
|
|
+ } else {
|
|
|
+ qdf_mem_free_consistent(scn->qdf_dev, scn->qdf_dev->dev,
|
|
|
+ ce_ring->nentries * desc_size + CE_DESC_RING_ALIGN,
|
|
|
+ ce_ring->base_addr_owner_space_unaligned,
|
|
|
+ ce_ring->base_addr_CE_space, 0);
|
|
|
+ ce_ring->base_addr_owner_space_unaligned = NULL;
|
|
|
+ }
|
|
|
+}
|
|
|
+#else
|
|
|
+static QDF_STATUS ce_alloc_desc_ring(struct hif_softc *scn, unsigned int CE_id,
|
|
|
+ qdf_dma_addr_t *base_addr,
|
|
|
+ struct CE_ring_state *ce_ring,
|
|
|
+ unsigned int nentries, uint32_t desc_size)
|
|
|
+{
|
|
|
+ ce_ring->base_addr_owner_space_unaligned =
|
|
|
+ qdf_mem_alloc_consistent(scn->qdf_dev, scn->qdf_dev->dev,
|
|
|
+ (nentries * desc_size +
|
|
|
+ CE_DESC_RING_ALIGN), base_addr);
|
|
|
+ if (!ce_ring->base_addr_owner_space_unaligned) {
|
|
|
+ HIF_ERROR("%s: Failed to allocate DMA memory for ce ring id : %u",
|
|
|
+ __func__, CE_id);
|
|
|
+ return QDF_STATUS_E_NOMEM;
|
|
|
+ }
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+static void ce_free_desc_ring(struct hif_softc *scn, unsigned int CE_id,
|
|
|
+ struct CE_ring_state *ce_ring, uint32_t desc_size)
|
|
|
+{
|
|
|
+ qdf_mem_free_consistent(scn->qdf_dev, scn->qdf_dev->dev,
|
|
|
+ ce_ring->nentries * desc_size + CE_DESC_RING_ALIGN,
|
|
|
+ ce_ring->base_addr_owner_space_unaligned,
|
|
|
+ ce_ring->base_addr_CE_space, 0);
|
|
|
+ ce_ring->base_addr_owner_space_unaligned = NULL;
|
|
|
+}
|
|
|
+#endif /* IPA_OFFLOAD */
|
|
|
+
|
|
|
/**
|
|
|
* ce_srng_based() - Does this target use srng
|
|
|
* @ce_state : pointer to the state context of the CE
|
|
@@ -790,15 +888,10 @@ static struct CE_ring_state *ce_alloc_ring_state(struct CE_state *CE_state,
|
|
|
/* Legacy platforms that do not support cache
|
|
|
* coherent DMA are unsupported
|
|
|
*/
|
|
|
- ce_ring->base_addr_owner_space_unaligned =
|
|
|
- qdf_mem_alloc_consistent(scn->qdf_dev,
|
|
|
- scn->qdf_dev->dev,
|
|
|
- (nentries *
|
|
|
- desc_size +
|
|
|
- CE_DESC_RING_ALIGN),
|
|
|
- &base_addr);
|
|
|
- if (ce_ring->base_addr_owner_space_unaligned
|
|
|
- == NULL) {
|
|
|
+ if (ce_alloc_desc_ring(scn, CE_state->id, &base_addr,
|
|
|
+ ce_ring, nentries,
|
|
|
+ desc_size) !=
|
|
|
+ QDF_STATUS_SUCCESS) {
|
|
|
HIF_ERROR("%s: ring has no DMA mem",
|
|
|
__func__);
|
|
|
qdf_mem_free(ptr);
|
|
@@ -1520,15 +1613,9 @@ void ce_fini(struct CE_handle *copyeng)
|
|
|
if (CE_state->src_ring->shadow_base_unaligned)
|
|
|
qdf_mem_free(CE_state->src_ring->shadow_base_unaligned);
|
|
|
if (CE_state->src_ring->base_addr_owner_space_unaligned)
|
|
|
- qdf_mem_free_consistent(scn->qdf_dev,
|
|
|
- scn->qdf_dev->dev,
|
|
|
- (CE_state->src_ring->nentries *
|
|
|
- desc_size +
|
|
|
- CE_DESC_RING_ALIGN),
|
|
|
- CE_state->src_ring->
|
|
|
- base_addr_owner_space_unaligned,
|
|
|
- CE_state->src_ring->
|
|
|
- base_addr_CE_space, 0);
|
|
|
+ ce_free_desc_ring(scn, CE_state->id,
|
|
|
+ CE_state->src_ring,
|
|
|
+ desc_size);
|
|
|
qdf_mem_free(CE_state->src_ring);
|
|
|
}
|
|
|
if (CE_state->dest_ring) {
|
|
@@ -1537,15 +1624,9 @@ void ce_fini(struct CE_handle *copyeng)
|
|
|
|
|
|
desc_size = ce_get_desc_size(scn, CE_RING_DEST);
|
|
|
if (CE_state->dest_ring->base_addr_owner_space_unaligned)
|
|
|
- qdf_mem_free_consistent(scn->qdf_dev,
|
|
|
- scn->qdf_dev->dev,
|
|
|
- (CE_state->dest_ring->nentries *
|
|
|
- desc_size +
|
|
|
- CE_DESC_RING_ALIGN),
|
|
|
- CE_state->dest_ring->
|
|
|
- base_addr_owner_space_unaligned,
|
|
|
- CE_state->dest_ring->
|
|
|
- base_addr_CE_space, 0);
|
|
|
+ ce_free_desc_ring(scn, CE_state->id,
|
|
|
+ CE_state->dest_ring,
|
|
|
+ desc_size);
|
|
|
qdf_mem_free(CE_state->dest_ring);
|
|
|
|
|
|
/* epping */
|
|
@@ -1563,15 +1644,9 @@ void ce_fini(struct CE_handle *copyeng)
|
|
|
|
|
|
desc_size = ce_get_desc_size(scn, CE_RING_STATUS);
|
|
|
if (CE_state->status_ring->base_addr_owner_space_unaligned)
|
|
|
- qdf_mem_free_consistent(scn->qdf_dev,
|
|
|
- scn->qdf_dev->dev,
|
|
|
- (CE_state->status_ring->nentries *
|
|
|
- desc_size +
|
|
|
- CE_DESC_RING_ALIGN),
|
|
|
- CE_state->status_ring->
|
|
|
- base_addr_owner_space_unaligned,
|
|
|
- CE_state->status_ring->
|
|
|
- base_addr_CE_space, 0);
|
|
|
+ ce_free_desc_ring(scn, CE_state->id,
|
|
|
+ CE_state->status_ring,
|
|
|
+ desc_size);
|
|
|
qdf_mem_free(CE_state->status_ring);
|
|
|
}
|
|
|
|
|
@@ -2840,7 +2915,7 @@ qdf_export_symbol(hif_ce_fastpath_cb_register);
|
|
|
* Return: None
|
|
|
*/
|
|
|
void hif_ce_ipa_get_ce_resource(struct hif_softc *scn,
|
|
|
- qdf_dma_addr_t *ce_sr_base_paddr,
|
|
|
+ qdf_shared_mem_t **ce_sr,
|
|
|
uint32_t *ce_sr_ring_size,
|
|
|
qdf_dma_addr_t *ce_reg_paddr)
|
|
|
{
|
|
@@ -2849,7 +2924,7 @@ void hif_ce_ipa_get_ce_resource(struct hif_softc *scn,
|
|
|
&(hif_state->pipe_info[HIF_PCI_IPA_UC_ASSIGNED_CE]);
|
|
|
struct CE_handle *ce_hdl = pipe_info->ce_hdl;
|
|
|
|
|
|
- ce_ipa_get_resource(ce_hdl, ce_sr_base_paddr, ce_sr_ring_size,
|
|
|
+ ce_ipa_get_resource(ce_hdl, ce_sr, ce_sr_ring_size,
|
|
|
ce_reg_paddr);
|
|
|
}
|
|
|
#endif /* IPA_OFFLOAD */
|