Example #1
0
static int omap_dmm_ioctl(struct inode *inode, struct file *filp,
				unsigned int cmd, unsigned long args)
{
	struct iodmm_struct *obj;
	int ret = 0;
	obj = (struct iodmm_struct *)filp->private_data;

	if (!obj)
		return -EINVAL;

	if (_IOC_TYPE(cmd) != DMM_IOC_MAGIC)
		return -ENOTTY;

	switch (cmd) {
	case DMM_IOCSETTLBENT:
		/* FIXME: re-visit this check to perform
		   proper permission checks */
		/* if (!capable(CAP_SYS_ADMIN))
		   return -EPERM; */
		ret = program_tlb_entry(obj, (const void __user *)args);
		break;
	case DMM_IOCCREATEPOOL:
		/* FIXME: re-visit this check to perform
		   proper permission checks */
		/* if (!capable(CAP_SYS_ADMIN))
		   return -EPERM; */
		ret = omap_create_dmm_pool(obj, (const void __user *)args);
		break;
	case DMM_IOCMEMMAP:
		ret = dmm_user(obj, (void __user *)args);
		break;
	case DMM_IOCMEMUNMAP:
		ret = user_un_map(obj, (const void __user *)args);
		break;
	case IOMMU_IOCEVENTREG:
		ret = register_mmufault(obj, (const void __user *)args);
		break;
	case IOMMU_IOCEVENTUNREG:
		ret = register_mmufault(obj, (const void __user *)args);
		break;
	case DMM_IOCMEMFLUSH:
		ret = proc_begin_dma(obj, (void __user *)args);
		break;
	case DMM_IOCMEMINV:
		ret = proc_end_dma(obj, (void __user *)args);
		break;
	/* This ioctl can be deprecated */
	case DMM_IOCDELETEPOOL:
		break;
	case DMM_IOCDATOPA:
	default:
		return -ENOTTY;
	}

	return ret;
}
u32 procwrap_end_dma(union trapped_args *args, void *pr_ctxt)
{
    int status;

    if (args->args_proc_dma.dir >= DMA_NONE)
        return -EINVAL;

    status = proc_end_dma(pr_ctxt,
                          args->args_proc_dma.mpu_addr,
                          args->args_proc_dma.size,
                          args->args_proc_dma.dir);
    return status;
}