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; }