Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * omap iommu: pagetable definitions
0004  *
0005  * Copyright (C) 2008-2010 Nokia Corporation
0006  *
0007  * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
0008  */
0009 
0010 #ifndef _OMAP_IOPGTABLE_H
0011 #define _OMAP_IOPGTABLE_H
0012 
0013 #include <linux/bitops.h>
0014 
0015 /*
0016  * "L2 table" address mask and size definitions.
0017  */
0018 #define IOPGD_SHIFT     20
0019 #define IOPGD_SIZE      BIT(IOPGD_SHIFT)
0020 #define IOPGD_MASK      (~(IOPGD_SIZE - 1))
0021 
0022 /*
0023  * "section" address mask and size definitions.
0024  */
0025 #define IOSECTION_SHIFT     20
0026 #define IOSECTION_SIZE      BIT(IOSECTION_SHIFT)
0027 #define IOSECTION_MASK      (~(IOSECTION_SIZE - 1))
0028 
0029 /*
0030  * "supersection" address mask and size definitions.
0031  */
0032 #define IOSUPER_SHIFT       24
0033 #define IOSUPER_SIZE        BIT(IOSUPER_SHIFT)
0034 #define IOSUPER_MASK        (~(IOSUPER_SIZE - 1))
0035 
0036 #define PTRS_PER_IOPGD      (1UL << (32 - IOPGD_SHIFT))
0037 #define IOPGD_TABLE_SIZE    (PTRS_PER_IOPGD * sizeof(u32))
0038 
0039 /*
0040  * "small page" address mask and size definitions.
0041  */
0042 #define IOPTE_SHIFT     12
0043 #define IOPTE_SIZE      BIT(IOPTE_SHIFT)
0044 #define IOPTE_MASK      (~(IOPTE_SIZE - 1))
0045 
0046 /*
0047  * "large page" address mask and size definitions.
0048  */
0049 #define IOLARGE_SHIFT       16
0050 #define IOLARGE_SIZE        BIT(IOLARGE_SHIFT)
0051 #define IOLARGE_MASK        (~(IOLARGE_SIZE - 1))
0052 
0053 #define PTRS_PER_IOPTE      (1UL << (IOPGD_SHIFT - IOPTE_SHIFT))
0054 #define IOPTE_TABLE_SIZE    (PTRS_PER_IOPTE * sizeof(u32))
0055 
0056 #define IOPAGE_MASK     IOPTE_MASK
0057 
0058 /**
0059  * omap_iommu_translate() - va to pa translation
0060  * @d:      omap iommu descriptor
0061  * @va:     virtual address
0062  * @mask:   omap iommu descriptor mask
0063  *
0064  * va to pa translation
0065  */
0066 static inline phys_addr_t omap_iommu_translate(unsigned long d, dma_addr_t va,
0067                            dma_addr_t mask)
0068 {
0069     return (d & mask) | (va & (~mask));
0070 }
0071 
0072 /*
0073  * some descriptor attributes.
0074  */
0075 #define IOPGD_TABLE     (1)
0076 #define IOPGD_SECTION       (2)
0077 #define IOPGD_SUPER     (BIT(18) | IOPGD_SECTION)
0078 
0079 #define iopgd_is_table(x)   (((x) & 3) == IOPGD_TABLE)
0080 #define iopgd_is_section(x) (((x) & (1 << 18 | 3)) == IOPGD_SECTION)
0081 #define iopgd_is_super(x)   (((x) & (1 << 18 | 3)) == IOPGD_SUPER)
0082 
0083 #define IOPTE_SMALL     (2)
0084 #define IOPTE_LARGE     (1)
0085 
0086 #define iopte_is_small(x)   (((x) & 2) == IOPTE_SMALL)
0087 #define iopte_is_large(x)   (((x) & 3) == IOPTE_LARGE)
0088 
0089 /* to find an entry in a page-table-directory */
0090 #define iopgd_index(da)     (((da) >> IOPGD_SHIFT) & (PTRS_PER_IOPGD - 1))
0091 #define iopgd_offset(obj, da)   ((obj)->iopgd + iopgd_index(da))
0092 
0093 #define iopgd_page_paddr(iopgd) (*iopgd & ~((1 << 10) - 1))
0094 #define iopgd_page_vaddr(iopgd) ((u32 *)phys_to_virt(iopgd_page_paddr(iopgd)))
0095 
0096 /* to find an entry in the second-level page table. */
0097 #define iopte_index(da)     (((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1))
0098 #define iopte_offset(iopgd, da) (iopgd_page_vaddr(iopgd) + iopte_index(da))
0099 
0100 #endif /* _OMAP_IOPGTABLE_H */