~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/ia64/hp/common/hwsw_iommu.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
 
3
 *   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
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
}