static int ispstat_bufs_alloc_iommu(struct ispstat *stat, unsigned int size) { struct isp_device *isp = dev_get_drvdata(stat->dev); int i; stat->buf_alloc_size = size; for (i = 0; i < stat->nbufs; i++) { struct ispstat_buffer *buf = &stat->buf[i]; WARN_ON(buf->dma_addr); buf->iommu_addr = iommu_vmalloc(isp->iommu, 0, size, IOMMU_FLAG); if (buf->iommu_addr == 0) { dev_err(stat->dev, "%s stat: Can't acquire memory for " "buffer %d\n", stat->tag, i); ispstat_bufs_free(stat); return -ENOMEM; } buf->virt_addr = da_to_va(isp->iommu, (u32)buf->iommu_addr); buf->frame_number = stat->max_frame; } stat->dma_buf = 0; return 0; }
static u32 ispdss_tmp_buf_alloc(size_t size) { struct isp_device *isp_res = dev_get_drvdata(dev_ctx.isp); ispdss_tmp_buf_free(); dev_ctx.tmp_buf = iommu_vmalloc(isp_res->iommu, 0, size, IOMMU_FLAG); if (IS_ERR((void *)dev_ctx.tmp_buf)) { printk(KERN_ERR "ispmmu_vmap mapping failed "); return -ENOMEM; } dev_ctx.tmp_buf_size = size; return 0; }
static int ispstat_bufs_alloc_iommu(struct ispstat *stat, unsigned int size) { struct isp_device *isp = dev_get_drvdata(stat->isp->dev); int i; stat->buf_alloc_size = size; for (i = 0; i < STAT_MAX_BUFS; i++) { struct ispstat_buffer *buf = &stat->buf[i]; struct iovm_struct *iovm; WARN_ON(buf->dma_addr); buf->iommu_addr = iommu_vmalloc(isp->iommu, 0, size, IOMMU_FLAG); if (IS_ERR((void *)buf->iommu_addr)) { dev_err(stat->isp->dev, "%s: Can't acquire memory for " "buffer %d\n", stat->subdev.name, i); ispstat_bufs_free(stat); return -ENOMEM; } iovm = find_iovm_area(isp->iommu, buf->iommu_addr); if (!iovm || !dma_map_sg(isp->dev, iovm->sgt->sgl, iovm->sgt->nents, DMA_FROM_DEVICE)) { ispstat_bufs_free(stat); return -ENOMEM; } buf->iovm = iovm; buf->virt_addr = da_to_va(stat->isp->iommu, (u32)buf->iommu_addr); buf->empty = 1; dev_dbg(stat->isp->dev, "%s: buffer[%d] allocated." "iommu_addr=0x%08lx virt_addr=0x%08lx", stat->subdev.name, i, buf->iommu_addr, (unsigned long)buf->virt_addr); } return 0; }
dma_addr_t ispmmu_vmalloc(size_t bytes) { return (dma_addr_t)iommu_vmalloc(isp_iommu, 0, bytes, IOMMU_FLAG); }