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
powerpc
include
asm
iommu.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
3
* Rewrite, cleanup:
4
* Copyright (C) 2004 Olof Johansson <
[email protected]
>, IBM Corporation
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
*/
20
21
#ifndef _ASM_IOMMU_H
22
#define _ASM_IOMMU_H
23
#ifdef __KERNEL__
24
25
#include <linux/compiler.h>
26
#include <
linux/spinlock.h
>
27
#include <linux/device.h>
28
#include <
linux/dma-mapping.h
>
29
#include <linux/bitops.h>
30
#include <asm/machdep.h>
31
#include <asm/types.h>
32
33
#define IOMMU_PAGE_SHIFT 12
34
#define IOMMU_PAGE_SIZE (ASM_CONST(1) << IOMMU_PAGE_SHIFT)
35
#define IOMMU_PAGE_MASK (~((1 << IOMMU_PAGE_SHIFT) - 1))
36
#define IOMMU_PAGE_ALIGN(addr) _ALIGN_UP(addr, IOMMU_PAGE_SIZE)
37
38
/* Boot time flags */
39
extern
int
iommu_is_off;
40
extern
int
iommu_force_on;
41
42
/* Pure 2^n version of get_order */
43
static
__inline__
__attribute_const__
int
get_iommu_order(
unsigned
long
size
)
44
{
45
return
__ilog2((size - 1) >>
IOMMU_PAGE_SHIFT
) + 1;
46
}
47
48
49
/*
50
* IOMAP_MAX_ORDER defines the largest contiguous block
51
* of dma space we can get. IOMAP_MAX_ORDER = 13
52
* allows up to 2**12 pages (4096 * 4096) = 16 MB
53
*/
54
#define IOMAP_MAX_ORDER 13
55
56
#define IOMMU_POOL_HASHBITS 2
57
#define IOMMU_NR_POOLS (1 << IOMMU_POOL_HASHBITS)
58
59
struct
iommu_pool {
60
unsigned
long
start
;
61
unsigned
long
end
;
62
unsigned
long
hint;
63
spinlock_t
lock
;
64
}
____cacheline_aligned_in_smp
;
65
66
struct
iommu_table
{
67
unsigned
long
it_busno
;
/* Bus number this table belongs to */
68
unsigned
long
it_size
;
/* Size of iommu table in entries */
69
unsigned
long
it_offset;
/* Offset into global table */
70
unsigned
long
it_base
;
/* mapped address of tce table */
71
unsigned
long
it_index;
/* which iommu table this is */
72
unsigned
long
it_type;
/* type: PCI or Virtual Bus */
73
unsigned
long
it_blocksize;
/* Entries in each block (cacheline) */
74
unsigned
long
poolsize;
75
unsigned
long
nr_pools;
76
struct
iommu_pool large_pool;
77
struct
iommu_pool pools[IOMMU_NR_POOLS];
78
unsigned
long
*
it_map
;
/* A simple allocation bitmap for now */
79
};
80
81
struct
scatterlist
;
82
83
static
inline
void
set_iommu_table_base(
struct
device
*
dev
,
void
*base)
84
{
85
dev->
archdata
.dma_data.iommu_table_base = base;
86
}
87
88
static
inline
void
*get_iommu_table_base(
struct
device
*
dev
)
89
{
90
return
dev->
archdata
.dma_data.iommu_table_base;
91
}
92
93
/* Frees table for an individual device node */
94
extern
void
iommu_free_table
(
struct
iommu_table
*tbl,
const
char
*
node_name
);
95
96
/* Initializes an iommu_table based in values set in the passed-in
97
* structure
98
*/
99
extern
struct
iommu_table
*
iommu_init_table
(
struct
iommu_table
* tbl,
100
int
nid);
101
102
extern
int
iommu_map_sg
(
struct
device
*
dev
,
struct
iommu_table
*tbl,
103
struct
scatterlist
*sglist,
int
nelems,
104
unsigned
long
mask
,
enum
dma_data_direction
direction
,
105
struct
dma_attrs
*attrs);
106
extern
void
iommu_unmap_sg
(
struct
iommu_table
*tbl,
struct
scatterlist
*sglist,
107
int
nelems,
enum
dma_data_direction
direction
,
108
struct
dma_attrs
*attrs);
109
110
extern
void
*
iommu_alloc_coherent
(
struct
device
*
dev
,
struct
iommu_table
*tbl,
111
size_t
size,
dma_addr_t
*
dma_handle
,
112
unsigned
long
mask
,
gfp_t
flag
,
int
node
);
113
extern
void
iommu_free_coherent
(
struct
iommu_table
*tbl,
size_t
size,
114
void
*
vaddr
,
dma_addr_t
dma_handle
);
115
extern
dma_addr_t
iommu_map_page
(
struct
device
*
dev
,
struct
iommu_table
*tbl,
116
struct
page
*
page
,
unsigned
long
offset
,
117
size_t
size,
unsigned
long
mask
,
118
enum
dma_data_direction
direction
,
119
struct
dma_attrs
*attrs);
120
extern
void
iommu_unmap_page
(
struct
iommu_table
*tbl,
dma_addr_t
dma_handle
,
121
size_t
size,
enum
dma_data_direction
direction
,
122
struct
dma_attrs
*attrs);
123
124
extern
void
iommu_init_early_pSeries
(
void
);
125
extern
void
iommu_init_early_dart
(
void
);
126
extern
void
iommu_init_early_pasemi
(
void
);
127
128
#ifdef CONFIG_PCI
129
extern
void
pci_iommu_init(
void
);
130
extern
void
pci_direct_iommu_init(
void
);
131
#else
132
static
inline
void
pci_iommu_init(
void
) { }
133
#endif
134
135
extern
void
alloc_dart_table
(
void
);
136
#if defined(CONFIG_PPC64) && defined(CONFIG_PM)
137
static
inline
void
iommu_save(
void
)
138
{
139
if
(
ppc_md
.iommu_save)
140
ppc_md
.iommu_save();
141
}
142
143
static
inline
void
iommu_restore(
void
)
144
{
145
if
(
ppc_md
.iommu_restore)
146
ppc_md
.iommu_restore();
147
}
148
#endif
149
150
#endif
/* __KERNEL__ */
151
#endif
/* _ASM_IOMMU_H */
Generated on Thu Jan 10 2013 12:59:51 for Linux Kernel by
1.8.2