Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
arm
plat-omap
include
plat
iopgtable.h
Go to the documentation of this file.
1
/*
2
* omap iommu: pagetable definitions
3
*
4
* Copyright (C) 2008-2010 Nokia Corporation
5
*
6
* Written by Hiroshi DOYU <
[email protected]
>
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License version 2 as
10
* published by the Free Software Foundation.
11
*/
12
13
#ifndef __PLAT_OMAP_IOMMU_H
14
#define __PLAT_OMAP_IOMMU_H
15
16
/*
17
* "L2 table" address mask and size definitions.
18
*/
19
#define IOPGD_SHIFT 20
20
#define IOPGD_SIZE (1UL << IOPGD_SHIFT)
21
#define IOPGD_MASK (~(IOPGD_SIZE - 1))
22
23
/*
24
* "section" address mask and size definitions.
25
*/
26
#define IOSECTION_SHIFT 20
27
#define IOSECTION_SIZE (1UL << IOSECTION_SHIFT)
28
#define IOSECTION_MASK (~(IOSECTION_SIZE - 1))
29
30
/*
31
* "supersection" address mask and size definitions.
32
*/
33
#define IOSUPER_SHIFT 24
34
#define IOSUPER_SIZE (1UL << IOSUPER_SHIFT)
35
#define IOSUPER_MASK (~(IOSUPER_SIZE - 1))
36
37
#define PTRS_PER_IOPGD (1UL << (32 - IOPGD_SHIFT))
38
#define IOPGD_TABLE_SIZE (PTRS_PER_IOPGD * sizeof(u32))
39
40
/*
41
* "small page" address mask and size definitions.
42
*/
43
#define IOPTE_SHIFT 12
44
#define IOPTE_SIZE (1UL << IOPTE_SHIFT)
45
#define IOPTE_MASK (~(IOPTE_SIZE - 1))
46
47
/*
48
* "large page" address mask and size definitions.
49
*/
50
#define IOLARGE_SHIFT 16
51
#define IOLARGE_SIZE (1UL << IOLARGE_SHIFT)
52
#define IOLARGE_MASK (~(IOLARGE_SIZE - 1))
53
54
#define PTRS_PER_IOPTE (1UL << (IOPGD_SHIFT - IOPTE_SHIFT))
55
#define IOPTE_TABLE_SIZE (PTRS_PER_IOPTE * sizeof(u32))
56
57
#define IOPAGE_MASK IOPTE_MASK
58
67
static
inline
phys_addr_t
omap_iommu_translate(
u32
d
,
u32
va
,
u32
mask
)
68
{
69
return
(d & mask) | (va & (~mask));
70
}
71
72
/*
73
* some descriptor attributes.
74
*/
75
#define IOPGD_TABLE (1 << 0)
76
#define IOPGD_SECTION (2 << 0)
77
#define IOPGD_SUPER (1 << 18 | 2 << 0)
78
79
#define iopgd_is_table(x) (((x) & 3) == IOPGD_TABLE)
80
#define iopgd_is_section(x) (((x) & (1 << 18 | 3)) == IOPGD_SECTION)
81
#define iopgd_is_super(x) (((x) & (1 << 18 | 3)) == IOPGD_SUPER)
82
83
#define IOPTE_SMALL (2 << 0)
84
#define IOPTE_LARGE (1 << 0)
85
86
#define iopte_is_small(x) (((x) & 2) == IOPTE_SMALL)
87
#define iopte_is_large(x) (((x) & 3) == IOPTE_LARGE)
88
89
/* to find an entry in a page-table-directory */
90
#define iopgd_index(da) (((da) >> IOPGD_SHIFT) & (PTRS_PER_IOPGD - 1))
91
#define iopgd_offset(obj, da) ((obj)->iopgd + iopgd_index(da))
92
93
#define iopgd_page_paddr(iopgd) (*iopgd & ~((1 << 10) - 1))
94
#define iopgd_page_vaddr(iopgd) ((u32 *)phys_to_virt(iopgd_page_paddr(iopgd)))
95
96
/* to find an entry in the second-level page table. */
97
#define iopte_index(da) (((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1))
98
#define iopte_offset(iopgd, da) (iopgd_page_vaddr(iopgd) + iopte_index(da))
99
100
static
inline
u32
iotlb_init_entry(
struct
iotlb_entry
*
e
,
u32
da
,
u32
pa,
101
u32
flags
)
102
{
103
memset
(e, 0,
sizeof
(*e));
104
105
e->
da
=
da
;
106
e->
pa
= pa;
107
e->
valid
= 1;
108
/* FIXME: add OMAP1 support */
109
e->
pgsz
= flags &
MMU_CAM_PGSZ_MASK
;
110
e->
endian
= flags &
MMU_RAM_ENDIAN_MASK
;
111
e->
elsz
= flags &
MMU_RAM_ELSZ_MASK
;
112
e->
mixed
= flags &
MMU_RAM_MIXED_MASK
;
113
114
return
iopgsz_to_bytes
(e->
pgsz
);
115
}
116
117
#define to_iommu(dev) \
118
(struct omap_iommu *)platform_get_drvdata(to_platform_device(dev))
119
120
#endif
/* __PLAT_OMAP_IOMMU_H */
Generated on Thu Jan 10 2013 13:03:17 for Linux Kernel by
1.8.2