Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
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;
}
Esempio n. 4
0
dma_addr_t ispmmu_vmalloc(size_t bytes)
{
	return (dma_addr_t)iommu_vmalloc(isp_iommu, 0, bytes, IOMMU_FLAG);
}