162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * omap iommu: pagetable definitions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2008-2010 Nokia Corporation 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef _OMAP_IOPGTABLE_H 1162306a36Sopenharmony_ci#define _OMAP_IOPGTABLE_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/bitops.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* 1662306a36Sopenharmony_ci * "L2 table" address mask and size definitions. 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ci#define IOPGD_SHIFT 20 1962306a36Sopenharmony_ci#define IOPGD_SIZE BIT(IOPGD_SHIFT) 2062306a36Sopenharmony_ci#define IOPGD_MASK (~(IOPGD_SIZE - 1)) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci * "section" address mask and size definitions. 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci#define IOSECTION_SHIFT 20 2662306a36Sopenharmony_ci#define IOSECTION_SIZE BIT(IOSECTION_SHIFT) 2762306a36Sopenharmony_ci#define IOSECTION_MASK (~(IOSECTION_SIZE - 1)) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* 3062306a36Sopenharmony_ci * "supersection" address mask and size definitions. 3162306a36Sopenharmony_ci */ 3262306a36Sopenharmony_ci#define IOSUPER_SHIFT 24 3362306a36Sopenharmony_ci#define IOSUPER_SIZE BIT(IOSUPER_SHIFT) 3462306a36Sopenharmony_ci#define IOSUPER_MASK (~(IOSUPER_SIZE - 1)) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define PTRS_PER_IOPGD (1UL << (32 - IOPGD_SHIFT)) 3762306a36Sopenharmony_ci#define IOPGD_TABLE_SIZE (PTRS_PER_IOPGD * sizeof(u32)) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* 4062306a36Sopenharmony_ci * "small page" address mask and size definitions. 4162306a36Sopenharmony_ci */ 4262306a36Sopenharmony_ci#define IOPTE_SHIFT 12 4362306a36Sopenharmony_ci#define IOPTE_SIZE BIT(IOPTE_SHIFT) 4462306a36Sopenharmony_ci#define IOPTE_MASK (~(IOPTE_SIZE - 1)) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* 4762306a36Sopenharmony_ci * "large page" address mask and size definitions. 4862306a36Sopenharmony_ci */ 4962306a36Sopenharmony_ci#define IOLARGE_SHIFT 16 5062306a36Sopenharmony_ci#define IOLARGE_SIZE BIT(IOLARGE_SHIFT) 5162306a36Sopenharmony_ci#define IOLARGE_MASK (~(IOLARGE_SIZE - 1)) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define PTRS_PER_IOPTE (1UL << (IOPGD_SHIFT - IOPTE_SHIFT)) 5462306a36Sopenharmony_ci#define IOPTE_TABLE_SIZE (PTRS_PER_IOPTE * sizeof(u32)) 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define IOPAGE_MASK IOPTE_MASK 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/** 5962306a36Sopenharmony_ci * omap_iommu_translate() - va to pa translation 6062306a36Sopenharmony_ci * @d: omap iommu descriptor 6162306a36Sopenharmony_ci * @va: virtual address 6262306a36Sopenharmony_ci * @mask: omap iommu descriptor mask 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci * va to pa translation 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_cistatic inline phys_addr_t omap_iommu_translate(unsigned long d, dma_addr_t va, 6762306a36Sopenharmony_ci dma_addr_t mask) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci return (d & mask) | (va & (~mask)); 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* 7362306a36Sopenharmony_ci * some descriptor attributes. 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_ci#define IOPGD_TABLE (1) 7662306a36Sopenharmony_ci#define IOPGD_SECTION (2) 7762306a36Sopenharmony_ci#define IOPGD_SUPER (BIT(18) | IOPGD_SECTION) 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define iopgd_is_table(x) (((x) & 3) == IOPGD_TABLE) 8062306a36Sopenharmony_ci#define iopgd_is_section(x) (((x) & (1 << 18 | 3)) == IOPGD_SECTION) 8162306a36Sopenharmony_ci#define iopgd_is_super(x) (((x) & (1 << 18 | 3)) == IOPGD_SUPER) 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define IOPTE_SMALL (2) 8462306a36Sopenharmony_ci#define IOPTE_LARGE (1) 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci#define iopte_is_small(x) (((x) & 2) == IOPTE_SMALL) 8762306a36Sopenharmony_ci#define iopte_is_large(x) (((x) & 3) == IOPTE_LARGE) 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/* to find an entry in a page-table-directory */ 9062306a36Sopenharmony_ci#define iopgd_index(da) (((da) >> IOPGD_SHIFT) & (PTRS_PER_IOPGD - 1)) 9162306a36Sopenharmony_ci#define iopgd_offset(obj, da) ((obj)->iopgd + iopgd_index(da)) 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#define iopgd_page_paddr(iopgd) (*iopgd & ~((1 << 10) - 1)) 9462306a36Sopenharmony_ci#define iopgd_page_vaddr(iopgd) ((u32 *)phys_to_virt(iopgd_page_paddr(iopgd))) 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* to find an entry in the second-level page table. */ 9762306a36Sopenharmony_ci#define iopte_index(da) (((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1)) 9862306a36Sopenharmony_ci#define iopte_offset(iopgd, da) (iopgd_page_vaddr(iopgd) + iopte_index(da)) 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#endif /* _OMAP_IOPGTABLE_H */ 101