static u32 omap2_cr_to_virt(struct cr_regs *cr) { u32 page_size = cr->cam & MMU_CAM_PGSZ_MASK; u32 mask = get_cam_va_mask(cr->cam & page_size); return cr->cam & mask; }
static inline unsigned long omap2_mmu_cam_va(struct cam_ram_regset *cr) { unsigned int page_size = cr->cam & OMAP_MMU_CAM_PAGESIZE_MASK; unsigned int mask = get_cam_va_mask(cr->cam & page_size); return cr->cam & mask; }
static struct cr_regs *omap2_alloc_cr(struct iommu *obj, struct iotlb_entry *e) { struct cr_regs *cr; if (e->da & ~(get_cam_va_mask(e->pgsz))) { dev_err(obj->dev, "%s:\twrong alignment: %08x\n", __func__, e->da); return ERR_PTR(-EINVAL); } cr = kmalloc(sizeof(*cr), GFP_KERNEL); if (!cr) return ERR_PTR(-ENOMEM); cr->cam = (e->da & MMU_CAM_VATAG_MASK) | e->prsvd | e->pgsz | e->valid; cr->ram = e->pa | e->endian | e->elsz | e->mixed; return cr; }
static struct cam_ram_regset * omap2_mmu_cam_ram_alloc(struct omap_mmu *mmu, struct omap_mmu_tlb_entry *entry) { struct cam_ram_regset *cr; if (entry->va & ~(get_cam_va_mask(entry->pgsz))) { dev_err(mmu->dev, "MMU %s: mapping vadr (0x%06lx) is not on" " an aligned boundary\n", mmu->name, entry->va); return ERR_PTR(-EINVAL); } cr = kmalloc(sizeof(struct cam_ram_regset), GFP_KERNEL); cr->cam = (entry->va & OMAP_MMU_CAM_VATAG_MASK) | entry->prsvd | entry->pgsz; cr->ram = entry->pa | entry->endian | entry->elsz; return cr; }