static int ipa_connect_allocate_fifo(const struct ipa_connect_params *in, struct sps_mem_buffer *mem_buff_ptr, bool *fifo_in_pipe_mem_ptr, u32 *fifo_pipe_mem_ofst_ptr, u32 fifo_size, int ipa_ep_idx) { dma_addr_t dma_addr; u32 ofst; int result = -EFAULT; mem_buff_ptr->size = fifo_size; if (in->pipe_mem_preferred) { if (ipa_pipe_mem_alloc(&ofst, fifo_size)) { IPAERR("FIFO pipe mem alloc fail ep %u\n", ipa_ep_idx); mem_buff_ptr->base = dma_alloc_coherent(NULL, mem_buff_ptr->size, &dma_addr, GFP_KERNEL); } else { memset(mem_buff_ptr, 0, sizeof(struct sps_mem_buffer)); result = sps_setup_bam2bam_fifo(mem_buff_ptr, ofst, fifo_size, 1); WARN_ON(result); *fifo_in_pipe_mem_ptr = 1; dma_addr = mem_buff_ptr->phys_base; *fifo_pipe_mem_ofst_ptr = ofst; } } else { mem_buff_ptr->base = dma_alloc_coherent(NULL, mem_buff_ptr->size, &dma_addr, GFP_KERNEL); } mem_buff_ptr->phys_base = dma_addr; if (mem_buff_ptr->base == NULL) { IPAERR("fail to get DMA memory.\n"); return -EFAULT; } return 0; }
int ipa_setup_a2_dma_fifos(enum ipa_bridge_dir dir, enum ipa_bridge_type type, struct sps_mem_buffer *desc, struct sps_mem_buffer *data) { int ret; if (type == IPA_BRIDGE_TYPE_EMBEDDED) { if (dir == IPA_BRIDGE_DIR_UL) { desc->base = ipa_ctx->smem_pipe_mem + IPA_SMEM_UL_DESC_FIFO_OFST; desc->phys_base = smem_virt_to_phys(desc->base); desc->size = ipa_get_desc_fifo_sz(dir, type); data->base = ipa_ctx->smem_pipe_mem + IPA_SMEM_UL_DATA_FIFO_OFST; data->phys_base = smem_virt_to_phys(data->base); data->size = ipa_get_data_fifo_sz(dir, type); } else { desc->base = ipa_ctx->smem_pipe_mem + IPA_SMEM_DL_DESC_FIFO_OFST; desc->phys_base = smem_virt_to_phys(desc->base); desc->size = ipa_get_desc_fifo_sz(dir, type); data->base = ipa_ctx->smem_pipe_mem + IPA_SMEM_DL_DATA_FIFO_OFST; data->phys_base = smem_virt_to_phys(data->base); data->size = ipa_get_data_fifo_sz(dir, type); } } else { if (dir == IPA_BRIDGE_DIR_UL) { ret = sps_setup_bam2bam_fifo(data, IPA_OCIMEM_UL_DATA_FIFO_OFST, ipa_get_data_fifo_sz(dir, type), 1); if (ret) { IPAERR("DAFIFO setup fail %d dir %d type %d\n", ret, dir, type); return ret; } ret = sps_setup_bam2bam_fifo(desc, IPA_OCIMEM_UL_DESC_FIFO_OFST, ipa_get_desc_fifo_sz(dir, type), 1); if (ret) { IPAERR("DEFIFO setup fail %d dir %d type %d\n", ret, dir, type); return ret; } } else { ret = sps_setup_bam2bam_fifo(data, IPA_OCIMEM_DL_DATA_FIFO_OFST, ipa_get_data_fifo_sz(dir, type), 1); if (ret) { IPAERR("DAFIFO setup fail %d dir %d type %d\n", ret, dir, type); return ret; } ret = sps_setup_bam2bam_fifo(desc, IPA_OCIMEM_DL_DESC_FIFO_OFST, ipa_get_desc_fifo_sz(dir, type), 1); if (ret) { IPAERR("DEFIFO setup fail %d dir %d type %d\n", ret, dir, type); return ret; } } } IPADBG("dir=%d type=%d Dpa=%x Dsz=%u Dva=%p dpa=%x dsz=%u dva=%p\n", dir, type, data->phys_base, data->size, data->base, desc->phys_base, desc->size, desc->base); return 0; }