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
ia64
hp
common
hwsw_iommu.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
3
* Contributed by David Mosberger-Tang <
[email protected]
>
4
*
5
* This is a pseudo I/O MMU which dispatches to the hardware I/O MMU
6
* whenever possible. We assume that the hardware I/O MMU requires
7
* full 32-bit addressability, as is the case, e.g., for HP zx1-based
8
* systems (there, the I/O MMU window is mapped at 3-4GB). If a
9
* device doesn't provide full 32-bit addressability, we fall back on
10
* the sw I/O TLB. This is good enough to let us support broken
11
* hardware such as soundcards which have a DMA engine that can
12
* address only 28 bits.
13
*/
14
15
#include <linux/device.h>
16
#include <
linux/dma-mapping.h
>
17
#include <
linux/swiotlb.h
>
18
#include <linux/export.h>
19
#include <asm/machvec.h>
20
21
extern
struct
dma_map_ops
sba_dma_ops
,
swiotlb_dma_ops
;
22
23
/* swiotlb declarations & definitions: */
24
extern
int
swiotlb_late_init_with_default_size
(
size_t
size
);
25
26
/*
27
* Note: we need to make the determination of whether or not to use
28
* the sw I/O TLB based purely on the device structure. Anything else
29
* would be unreliable or would be too intrusive.
30
*/
31
static
inline
int
use_swiotlb(
struct
device
*
dev
)
32
{
33
return
dev && dev->
dma_mask
&&
34
!
sba_dma_ops
.dma_supported(dev, *dev->
dma_mask
);
35
}
36
37
struct
dma_map_ops
*
hwsw_dma_get_ops
(
struct
device
*dev)
38
{
39
if
(use_swiotlb(dev))
40
return
&
swiotlb_dma_ops
;
41
return
&
sba_dma_ops
;
42
}
43
EXPORT_SYMBOL
(hwsw_dma_get_ops);
44
45
void
__init
46
hwsw_init
(
void
)
47
{
48
/* default to a smallish 2MB sw I/O TLB */
49
if
(
swiotlb_late_init_with_default_size
(2 * (1<<20)) != 0) {
50
#ifdef CONFIG_IA64_GENERIC
51
/* Better to have normal DMA than panic */
52
printk
(
KERN_WARNING
"%s: Failed to initialize software I/O TLB,"
53
" reverting to hpzx1 platform vector\n"
, __func__);
54
machvec_init
(
"hpzx1"
);
55
#else
56
panic
(
"Unable to initialize software I/O TLB services"
);
57
#endif
58
}
59
}
Generated on Thu Jan 10 2013 13:06:01 for Linux Kernel by
1.8.2