3 * DMA management routines for first generation cache-coherent machines.
4 * "Real Mode" operation refers to U2/Uturn chip operation. The chip
5 * can perform coherency checks w/o using the I/O MMU. That's all we
6 * need until support for more than 4GB phys mem is needed.
8 * This is the trivial case - basically what x86 does.
10 * Drawbacks of using Real Mode are:
11 * o outbound DMA is slower since one isn't using the prefetching
12 * U2 can do for outbound DMA.
13 * o Ability to do scatter/gather in HW is also lost.
14 * o only known to work with PCX-W processor. (eg C360)
15 * (PCX-U/U+ are not coherent with U2 in real mode.)
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 2 of the License, or
21 * (at your option) any later version.
24 * Original version/author:
25 * CVSROOT=:pserver:anonymous@198.186.203.37:/cvsroot/linux-parisc
26 * cvs -z3 co linux/arch/parisc/kernel/dma-rm.c
28 * (C) Copyright 2000 Philipp Rumpf <prumpf@tux.org>
31 * Adopted for The Puffin Group's parisc-linux port by Grant Grundler.
32 * (C) Copyright 2000 Grant Grundler <grundler@puffin.external.hp.com>
36 #include <linux/types.h>
37 #include <linux/init.h>
39 #include <linux/string.h>
40 #include <linux/pci.h>
41 #include <linux/gfp.h>
43 #include <asm/uaccess.h>
46 #include <asm/hardware.h>
49 /* Only chose "ccio" since that's what HP-UX calls it....
50 ** Make it easier for folks to migrate from one to the other :^)
52 #define MODULE_NAME "ccio"
54 #define U2_IOA_RUNWAY 0x580
55 #define U2_BC_GSC 0x501
56 #define UTURN_IOA_RUNWAY 0x581
57 #define UTURN_BC_GSC 0x502
60 (((id)->hw_type == HPHW_IOA) && ((id)->hversion == U2_IOA_RUNWAY)) || \
61 (((id)->hw_type == HPHW_BCPORT) && ((id)->hversion == U2_BC_GSC)) \
64 #define IS_UTURN(id) ( \
65 (((id)->hw_type == HPHW_IOA) && ((id)->hversion == UTURN_IOA_RUNWAY)) || \
66 (((id)->hw_type == HPHW_BCPORT) && ((id)->hversion == UTURN_BC_GSC)) \
69 static int ccio_dma_supported( struct pci_dev
*dev
, u64 mask
)
72 printk(KERN_ERR MODULE_NAME
": EISA/ISA/et al not supported\n");
77 /* only support 32-bit devices (ie PCI/GSC) */
78 return((int) (mask
>= 0xffffffffUL
));
82 static void *ccio_alloc_consistent(struct pci_dev
*dev
, size_t size
,
87 ret
= (void *)__get_free_pages(GFP_ATOMIC
, get_order(size
));
91 *handle
= virt_to_phys(ret
);
96 static void ccio_free_consistent(struct pci_dev
*dev
, size_t size
,
97 void *vaddr
, dma_addr_t handle
)
99 free_pages((unsigned long)vaddr
, get_order(size
));
102 static dma_addr_t
ccio_map_single(struct pci_dev
*dev
, void *ptr
, size_t size
,
105 return virt_to_phys(ptr
);
108 static void ccio_unmap_single(struct pci_dev
*dev
, dma_addr_t dma_addr
,
109 size_t size
, int direction
)
115 static int ccio_map_sg(struct pci_dev
*dev
, struct scatterlist
*sglist
, int nents
, int direction
)
119 /* KISS: map each buffer separately. */
121 sg_dma_address(sglist
) = ccio_map_single(dev
, sglist
->address
, sglist
->length
, direction
);
122 sg_dma_len(sglist
) = sglist
->length
;
131 static void ccio_unmap_sg(struct pci_dev
*dev
, struct scatterlist
*sglist
, int nents
, int direction
)
133 /* Do nothing (copied from current ccio_unmap_single() :^) */
137 static struct pci_dma_ops ccio_ops
= {
139 ccio_alloc_consistent
,
140 ccio_free_consistent
,
145 NULL
, /* dma_sync_single_for_cpu : NOP for U2 */
146 NULL
, /* dma_sync_single_for_device : NOP for U2 */
147 NULL
, /* dma_sync_sg_for_cpu : ditto */
148 NULL
, /* dma_sync_sg_for_device : ditto */
153 ** Determine if u2 should claim this chip (return 0) or not (return 1).
154 ** If so, initialize the chip and tell other partners in crime they
158 ccio_probe(struct parisc_device
*dev
)
160 printk(KERN_INFO
"%s found %s at 0x%lx\n", MODULE_NAME
,
161 dev
->id
.hversion
== U2_BC_GSC
? "U2" : "UTurn",
165 hppa_dma_ops
= &ccio_ops
;
169 static struct parisc_device_id ccio_tbl
[] = {
170 { HPHW_BCPORT
, HVERSION_REV_ANY_ID
, U2_BC_GSC
, 0xc },
171 { HPHW_BCPORT
, HVERSION_REV_ANY_ID
, UTURN_BC_GSC
, 0xc },
175 static struct parisc_driver ccio_driver
= {
177 .id_table
= ccio_tbl
,
181 void __init
ccio_init(void)
183 register_parisc_driver(&ccio_driver
);