static ssize_t debug_write_pagetable(struct file *file, const char __user *userbuf, size_t count, loff_t *ppos) { struct iotlb_entry e; struct cr_regs cr; int err; struct device *dev = file->private_data; struct omap_iommu *obj = dev_to_omap_iommu(dev); char buf[MAXCOLUMN], *p = buf; count = min(count, sizeof(buf)); mutex_lock(&iommu_debug_lock); if (copy_from_user(p, userbuf, count)) { mutex_unlock(&iommu_debug_lock); return -EFAULT; } sscanf(p, "%x %x", &cr.cam, &cr.ram); if (!cr.cam || !cr.ram) { mutex_unlock(&iommu_debug_lock); return -EINVAL; } omap_iotlb_cr_to_e(&cr, &e); err = omap_iopgtable_store_entry(obj, &e); if (err) dev_err(obj->dev, "%s: fail to store cr\n", __func__); mutex_unlock(&iommu_debug_lock); return count; }
static ssize_t debug_read_tlb(struct file *file, char __user *userbuf, size_t count, loff_t *ppos) { struct device *dev = file->private_data; struct omap_iommu *obj = dev_to_omap_iommu(dev); char *p, *buf; ssize_t bytes, rest; buf = kmalloc(count, GFP_KERNEL); if (!buf) return -ENOMEM; p = buf; mutex_lock(&iommu_debug_lock); p += sprintf(p, "%8s %8s\n", "cam:", "ram:"); p += sprintf(p, "-----------------------------------------\n"); rest = count - (p - buf); p += omap_dump_tlb_entries(obj, p, rest); bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf); mutex_unlock(&iommu_debug_lock); kfree(buf); return bytes; }
static ssize_t debug_read_pagetable(struct file *file, char __user *userbuf, size_t count, loff_t *ppos) { struct device *dev = file->private_data; struct omap_iommu *obj = dev_to_omap_iommu(dev); char *p, *buf; size_t bytes; buf = (char *)__get_free_page(GFP_KERNEL); if (!buf) return -ENOMEM; p = buf; p += sprintf(p, "L: %8s %8s\n", "da:", "pa:"); p += sprintf(p, "-----------------------------------------\n"); mutex_lock(&iommu_debug_lock); bytes = PAGE_SIZE - (p - buf); p += dump_ioptable(obj, p, bytes); bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf); mutex_unlock(&iommu_debug_lock); free_page((unsigned long)buf); return bytes; }
/** * omap_iommu_restore_ctx - Restore registers for pm off-mode support * @dev: client device **/ void omap_iommu_restore_ctx(struct device *dev) { struct omap_iommu *obj = dev_to_omap_iommu(dev); u32 *p = obj->ctx; int i; for (i = 0; i < (MMU_REG_SIZE / sizeof(u32)); i++) { iommu_write_reg(obj, p[i], i * sizeof(u32)); dev_dbg(obj->dev, "%s\t[%02d] %08x\n", __func__, i, p[i]); } }
static ssize_t debug_read_regs(struct file *file, char __user *userbuf, size_t count, loff_t *ppos) { struct device *dev = file->private_data; struct omap_iommu *obj = dev_to_omap_iommu(dev); char *p, *buf; ssize_t bytes; buf = kmalloc(count, GFP_KERNEL); if (!buf) return -ENOMEM; p = buf; mutex_lock(&iommu_debug_lock); bytes = omap_iommu_dump_ctx(obj, p, count); bytes = simple_read_from_buffer(userbuf, count, ppos, buf, bytes); mutex_unlock(&iommu_debug_lock); kfree(buf); return bytes; }
/** * omap_iommu_restore_ctx - Restore registers for pm off-mode support * @dev: client device **/ void omap_iommu_restore_ctx(struct device *dev) { struct omap_iommu *obj = dev_to_omap_iommu(dev); arch_iommu->restore_ctx(obj); }