aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShannon Nelson <shannon.nelson@intel.com>2007-10-16 04:27:39 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-16 12:43:09 -0400
commit8ab89567da0cea9bae2c1b5dad47b51c424479e4 (patch)
tree95ac8bc77b2e8d9f1dec97f6fd7128760e27561f
parent43d6e369d43ff175e1e0e80caaedb1e53829247c (diff)
I/OAT: Split PCI startup from DMA handling code
Split the general PCI startup from the DMA handling code in order to prepare for adding support for DCA services and future versions of the ioatdma device. [Rusty Russell] Removal of __unsafe() usage. Signed-off-by: Shannon Nelson <shannon.nelson@intel.com> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/dma/Makefile2
-rw-r--r--drivers/dma/ioat.c196
-rw-r--r--drivers/dma/ioat_dma.c180
-rw-r--r--drivers/dma/ioatdma.h20
-rw-r--r--drivers/dma/ioatdma_hw.h2
5 files changed, 254 insertions, 146 deletions
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index 77bee99df02a..cec0c9c5df65 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -1,5 +1,5 @@
1obj-$(CONFIG_DMA_ENGINE) += dmaengine.o 1obj-$(CONFIG_DMA_ENGINE) += dmaengine.o
2obj-$(CONFIG_NET_DMA) += iovlock.o 2obj-$(CONFIG_NET_DMA) += iovlock.o
3obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o 3obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o
4ioatdma-objs := ioat_dma.o 4ioatdma-objs := ioat.o ioat_dma.o
5obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o 5obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o
diff --git a/drivers/dma/ioat.c b/drivers/dma/ioat.c
new file mode 100644
index 000000000000..ae5817bfc015
--- /dev/null
+++ b/drivers/dma/ioat.c
@@ -0,0 +1,196 @@
1/*
2 * Intel I/OAT DMA Linux driver
3 * Copyright(c) 2004 - 2007 Intel Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * The full GNU General Public License is included in this distribution in
19 * the file called "COPYING".
20 *
21 */
22
23/*
24 * This driver supports an Intel I/OAT DMA engine, which does asynchronous
25 * copy operations.
26 */
27
28#include <linux/init.h>
29#include <linux/module.h>
30#include <linux/pci.h>
31#include <linux/interrupt.h>
32#include "ioatdma.h"
33#include "ioatdma_registers.h"
34#include "ioatdma_hw.h"
35
36MODULE_VERSION("1.24");
37MODULE_LICENSE("GPL");
38MODULE_AUTHOR("Intel Corporation");
39
40static struct pci_device_id ioat_pci_tbl[] = {
41 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT) },
42 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB) },
43 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SCNB) },
44 { PCI_DEVICE(PCI_VENDOR_ID_UNISYS, PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR) },
45 { 0, }
46};
47
48struct ioat_device {
49 struct pci_dev *pdev;
50 void __iomem *iobase;
51 struct ioatdma_device *dma;
52};
53
54static int __devinit ioat_probe(struct pci_dev *pdev,
55 const struct pci_device_id *id);
56#ifdef IOAT_DMA_REMOVE
57static void __devexit ioat_remove(struct pci_dev *pdev);
58#endif
59
60static int ioat_setup_functionality(struct pci_dev *pdev, void __iomem *iobase)
61{
62 struct ioat_device *device = pci_get_drvdata(pdev);
63 u8 version;
64 int err = 0;
65
66 version = readb(iobase + IOAT_VER_OFFSET);
67 switch (version) {
68 case IOAT_VER_1_2:
69 device->dma = ioat_dma_probe(pdev, iobase);
70 break;
71 default:
72 err = -ENODEV;
73 break;
74 }
75 return err;
76}
77
78static void ioat_shutdown_functionality(struct pci_dev *pdev)
79{
80 struct ioat_device *device = pci_get_drvdata(pdev);
81
82 if (device->dma) {
83 ioat_dma_remove(device->dma);
84 device->dma = NULL;
85 }
86}
87
88static struct pci_driver ioat_pci_drv = {
89 .name = "ioatdma",
90 .id_table = ioat_pci_tbl,
91 .probe = ioat_probe,
92 .shutdown = ioat_shutdown_functionality,
93#ifdef IOAT_DMA_REMOVE
94 .remove = __devexit_p(ioat_remove),
95#endif
96};
97
98static int __devinit ioat_probe(struct pci_dev *pdev,
99 const struct pci_device_id *id)
100{
101 void __iomem *iobase;
102 struct ioat_device *device;
103 unsigned long mmio_start, mmio_len;
104 int err;
105
106 err = pci_enable_device(pdev);
107 if (err)
108 goto err_enable_device;
109
110 err = pci_request_regions(pdev, ioat_pci_drv.name);
111 if (err)
112 goto err_request_regions;
113
114 err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
115 if (err)
116 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
117 if (err)
118 goto err_set_dma_mask;
119
120 err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
121 if (err)
122 err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
123 if (err)
124 goto err_set_dma_mask;
125
126 mmio_start = pci_resource_start(pdev, 0);
127 mmio_len = pci_resource_len(pdev, 0);
128 iobase = ioremap(mmio_start, mmio_len);
129 if (!iobase) {
130 err = -ENOMEM;
131 goto err_ioremap;
132 }
133
134 device = kzalloc(sizeof(*device), GFP_KERNEL);
135 if (!device) {
136 err = -ENOMEM;
137 goto err_kzalloc;
138 }
139 device->pdev = pdev;
140 pci_set_drvdata(pdev, device);
141 device->iobase = iobase;
142
143 pci_set_master(pdev);
144
145 err = ioat_setup_functionality(pdev, iobase);
146 if (err)
147 goto err_version;
148
149 return 0;
150
151err_version:
152 kfree(device);
153err_kzalloc:
154 iounmap(iobase);
155err_ioremap:
156err_set_dma_mask:
157 pci_release_regions(pdev);
158 pci_disable_device(pdev);
159err_request_regions:
160err_enable_device:
161 return err;
162}
163
164#ifdef IOAT_DMA_REMOVE
165/*
166 * It is unsafe to remove this module: if removed while a requested
167 * dma is outstanding, esp. from tcp, it is possible to hang while
168 * waiting for something that will never finish, thus hanging at
169 * least one cpu. However, if you're feeling lucky and need to do
170 * some testing, this usually works just fine.
171 */
172static void __devexit ioat_remove(struct pci_dev *pdev)
173{
174 struct ioat_device *device = pci_get_drvdata(pdev);
175
176 ioat_shutdown_functionality(pdev);
177
178 kfree(device);
179
180 iounmap(device->iobase);
181 pci_release_regions(pdev);
182 pci_disable_device(pdev);
183}
184#endif
185
186static int __init ioat_init_module(void)
187{
188 return pci_register_driver(&ioat_pci_drv);
189}
190module_init(ioat_init_module);
191
192static void __exit ioat_exit_module(void)
193{
194 pci_unregister_driver(&ioat_pci_drv);
195}
196module_exit(ioat_exit_module);
diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c
index 2db05f614843..eef83ea291a3 100644
--- a/drivers/dma/ioat_dma.c
+++ b/drivers/dma/ioat_dma.c
@@ -39,19 +39,15 @@
39#define INITIAL_IOAT_DESC_COUNT 128 39#define INITIAL_IOAT_DESC_COUNT 128
40 40
41#define to_ioat_chan(chan) container_of(chan, struct ioat_dma_chan, common) 41#define to_ioat_chan(chan) container_of(chan, struct ioat_dma_chan, common)
42#define to_ioat_device(dev) container_of(dev, struct ioat_device, common) 42#define to_ioatdma_device(dev) container_of(dev, struct ioatdma_device, common)
43#define to_ioat_desc(lh) container_of(lh, struct ioat_desc_sw, node) 43#define to_ioat_desc(lh) container_of(lh, struct ioat_desc_sw, node)
44#define tx_to_ioat_desc(tx) container_of(tx, struct ioat_desc_sw, async_tx) 44#define tx_to_ioat_desc(tx) container_of(tx, struct ioat_desc_sw, async_tx)
45 45
46/* internal functions */ 46/* internal functions */
47static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan); 47static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan);
48static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan); 48static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan);
49static int __devinit ioat_probe(struct pci_dev *pdev,
50 const struct pci_device_id *ent);
51static void ioat_shutdown(struct pci_dev *pdev);
52static void __devexit ioat_remove(struct pci_dev *pdev);
53 49
54static int ioat_dma_enumerate_channels(struct ioat_device *device) 50static int ioat_dma_enumerate_channels(struct ioatdma_device *device)
55{ 51{
56 u8 xfercap_scale; 52 u8 xfercap_scale;
57 u32 xfercap; 53 u32 xfercap;
@@ -158,17 +154,17 @@ static struct ioat_desc_sw *ioat_dma_alloc_descriptor(
158{ 154{
159 struct ioat_dma_descriptor *desc; 155 struct ioat_dma_descriptor *desc;
160 struct ioat_desc_sw *desc_sw; 156 struct ioat_desc_sw *desc_sw;
161 struct ioat_device *ioat_device; 157 struct ioatdma_device *ioatdma_device;
162 dma_addr_t phys; 158 dma_addr_t phys;
163 159
164 ioat_device = to_ioat_device(ioat_chan->common.device); 160 ioatdma_device = to_ioatdma_device(ioat_chan->common.device);
165 desc = pci_pool_alloc(ioat_device->dma_pool, flags, &phys); 161 desc = pci_pool_alloc(ioatdma_device->dma_pool, flags, &phys);
166 if (unlikely(!desc)) 162 if (unlikely(!desc))
167 return NULL; 163 return NULL;
168 164
169 desc_sw = kzalloc(sizeof(*desc_sw), flags); 165 desc_sw = kzalloc(sizeof(*desc_sw), flags);
170 if (unlikely(!desc_sw)) { 166 if (unlikely(!desc_sw)) {
171 pci_pool_free(ioat_device->dma_pool, desc, phys); 167 pci_pool_free(ioatdma_device->dma_pool, desc, phys);
172 return NULL; 168 return NULL;
173 } 169 }
174 170
@@ -245,9 +241,8 @@ static int ioat_dma_alloc_chan_resources(struct dma_chan *chan)
245static void ioat_dma_free_chan_resources(struct dma_chan *chan) 241static void ioat_dma_free_chan_resources(struct dma_chan *chan)
246{ 242{
247 struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 243 struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
248 struct ioat_device *ioat_device = to_ioat_device(chan->device); 244 struct ioatdma_device *ioatdma_device = to_ioatdma_device(chan->device);
249 struct ioat_desc_sw *desc, *_desc; 245 struct ioat_desc_sw *desc, *_desc;
250 u16 chanctrl;
251 int in_use_descs = 0; 246 int in_use_descs = 0;
252 247
253 ioat_dma_memcpy_cleanup(ioat_chan); 248 ioat_dma_memcpy_cleanup(ioat_chan);
@@ -258,19 +253,19 @@ static void ioat_dma_free_chan_resources(struct dma_chan *chan)
258 list_for_each_entry_safe(desc, _desc, &ioat_chan->used_desc, node) { 253 list_for_each_entry_safe(desc, _desc, &ioat_chan->used_desc, node) {
259 in_use_descs++; 254 in_use_descs++;
260 list_del(&desc->node); 255 list_del(&desc->node);
261 pci_pool_free(ioat_device->dma_pool, desc->hw, 256 pci_pool_free(ioatdma_device->dma_pool, desc->hw,
262 desc->async_tx.phys); 257 desc->async_tx.phys);
263 kfree(desc); 258 kfree(desc);
264 } 259 }
265 list_for_each_entry_safe(desc, _desc, &ioat_chan->free_desc, node) { 260 list_for_each_entry_safe(desc, _desc, &ioat_chan->free_desc, node) {
266 list_del(&desc->node); 261 list_del(&desc->node);
267 pci_pool_free(ioat_device->dma_pool, desc->hw, 262 pci_pool_free(ioatdma_device->dma_pool, desc->hw,
268 desc->async_tx.phys); 263 desc->async_tx.phys);
269 kfree(desc); 264 kfree(desc);
270 } 265 }
271 spin_unlock_bh(&ioat_chan->desc_lock); 266 spin_unlock_bh(&ioat_chan->desc_lock);
272 267
273 pci_pool_free(ioat_device->completion_pool, 268 pci_pool_free(ioatdma_device->completion_pool,
274 ioat_chan->completion_virt, 269 ioat_chan->completion_virt,
275 ioat_chan->completion_addr); 270 ioat_chan->completion_addr);
276 271
@@ -514,25 +509,9 @@ static enum dma_status ioat_dma_is_complete(struct dma_chan *chan,
514 509
515/* PCI API */ 510/* PCI API */
516 511
517static struct pci_device_id ioat_pci_tbl[] = {
518 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT) },
519 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB) },
520 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SCNB) },
521 { PCI_DEVICE(PCI_VENDOR_ID_UNISYS, PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR) },
522 { 0, }
523};
524
525static struct pci_driver ioat_pci_driver = {
526 .name = "ioatdma",
527 .id_table = ioat_pci_tbl,
528 .probe = ioat_probe,
529 .shutdown = ioat_shutdown,
530 .remove = __devexit_p(ioat_remove),
531};
532
533static irqreturn_t ioat_do_interrupt(int irq, void *data) 512static irqreturn_t ioat_do_interrupt(int irq, void *data)
534{ 513{
535 struct ioat_device *instance = data; 514 struct ioatdma_device *instance = data;
536 unsigned long attnstatus; 515 unsigned long attnstatus;
537 u8 intrctrl; 516 u8 intrctrl;
538 517
@@ -592,7 +571,7 @@ static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan)
592 */ 571 */
593#define IOAT_TEST_SIZE 2000 572#define IOAT_TEST_SIZE 2000
594 573
595static int ioat_self_test(struct ioat_device *device) 574static int ioat_self_test(struct ioatdma_device *device)
596{ 575{
597 int i; 576 int i;
598 u8 *src; 577 u8 *src;
@@ -660,46 +639,25 @@ out:
660 return err; 639 return err;
661} 640}
662 641
663static int __devinit ioat_probe(struct pci_dev *pdev, 642struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev,
664 const struct pci_device_id *ent) 643 void __iomem *iobase)
665{ 644{
666 int err; 645 int err;
667 unsigned long mmio_start, mmio_len; 646 struct ioatdma_device *device;
668 void __iomem *reg_base;
669 struct ioat_device *device;
670
671 err = pci_enable_device(pdev);
672 if (err)
673 goto err_enable_device;
674
675 err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
676 if (err)
677 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
678 if (err)
679 goto err_set_dma_mask;
680
681 err = pci_request_regions(pdev, ioat_pci_driver.name);
682 if (err)
683 goto err_request_regions;
684
685 mmio_start = pci_resource_start(pdev, 0);
686 mmio_len = pci_resource_len(pdev, 0);
687
688 reg_base = ioremap(mmio_start, mmio_len);
689 if (!reg_base) {
690 err = -ENOMEM;
691 goto err_ioremap;
692 }
693 647
694 device = kzalloc(sizeof(*device), GFP_KERNEL); 648 device = kzalloc(sizeof(*device), GFP_KERNEL);
695 if (!device) { 649 if (!device) {
696 err = -ENOMEM; 650 err = -ENOMEM;
697 goto err_kzalloc; 651 goto err_kzalloc;
698 } 652 }
653 device->pdev = pdev;
654 device->reg_base = iobase;
655 device->version = readb(device->reg_base + IOAT_VER_OFFSET);
699 656
700 /* DMA coherent memory pool for DMA descriptor allocations */ 657 /* DMA coherent memory pool for DMA descriptor allocations */
701 device->dma_pool = pci_pool_create("dma_desc_pool", pdev, 658 device->dma_pool = pci_pool_create("dma_desc_pool", pdev,
702 sizeof(struct ioat_dma_descriptor), 64, 0); 659 sizeof(struct ioat_dma_descriptor),
660 64, 0);
703 if (!device->dma_pool) { 661 if (!device->dma_pool) {
704 err = -ENOMEM; 662 err = -ENOMEM;
705 goto err_dma_pool; 663 goto err_dma_pool;
@@ -713,26 +671,6 @@ static int __devinit ioat_probe(struct pci_dev *pdev,
713 goto err_completion_pool; 671 goto err_completion_pool;
714 } 672 }
715 673
716 device->pdev = pdev;
717 pci_set_drvdata(pdev, device);
718#ifdef CONFIG_PCI_MSI
719 if (pci_enable_msi(pdev) == 0) {
720 device->msi = 1;
721 } else {
722 device->msi = 0;
723 }
724#endif
725 err = request_irq(pdev->irq, &ioat_do_interrupt, IRQF_SHARED, "ioat",
726 device);
727 if (err)
728 goto err_irq;
729
730 device->reg_base = reg_base;
731
732 writeb(IOAT_INTRCTRL_MASTER_INT_EN,
733 device->reg_base + IOAT_INTRCTRL_OFFSET);
734 pci_set_master(pdev);
735
736 INIT_LIST_HEAD(&device->common.channels); 674 INIT_LIST_HEAD(&device->common.channels);
737 ioat_dma_enumerate_channels(device); 675 ioat_dma_enumerate_channels(device);
738 676
@@ -746,9 +684,19 @@ static int __devinit ioat_probe(struct pci_dev *pdev,
746 device->common.device_issue_pending = ioat_dma_memcpy_issue_pending; 684 device->common.device_issue_pending = ioat_dma_memcpy_issue_pending;
747 device->common.device_dependency_added = ioat_dma_dependency_added; 685 device->common.device_dependency_added = ioat_dma_dependency_added;
748 device->common.dev = &pdev->dev; 686 device->common.dev = &pdev->dev;
749 printk(KERN_INFO 687 printk(KERN_INFO "ioatdma: Intel(R) I/OAT DMA Engine found,"
750 "ioatdma: Intel(R) I/OAT DMA Engine found, %d channels\n", 688 " %d channels, device version 0x%02x\n",
751 device->common.chancnt); 689 device->common.chancnt, device->version);
690
691 pci_set_drvdata(pdev, device);
692 err = request_irq(pdev->irq, &ioat_do_interrupt, IRQF_SHARED, "ioat",
693 device);
694 if (err)
695 goto err_irq;
696
697 writeb(IOAT_INTRCTRL_MASTER_INT_EN,
698 device->reg_base + IOAT_INTRCTRL_OFFSET);
699 pci_set_master(pdev);
752 700
753 err = ioat_self_test(device); 701 err = ioat_self_test(device);
754 if (err) 702 if (err)
@@ -756,9 +704,10 @@ static int __devinit ioat_probe(struct pci_dev *pdev,
756 704
757 dma_async_device_register(&device->common); 705 dma_async_device_register(&device->common);
758 706
759 return 0; 707 return device;
760 708
761err_self_test: 709err_self_test:
710 free_irq(device->pdev->irq, device);
762err_irq: 711err_irq:
763 pci_pool_destroy(device->completion_pool); 712 pci_pool_destroy(device->completion_pool);
764err_completion_pool: 713err_completion_pool:
@@ -766,47 +715,24 @@ err_completion_pool:
766err_dma_pool: 715err_dma_pool:
767 kfree(device); 716 kfree(device);
768err_kzalloc: 717err_kzalloc:
769 iounmap(reg_base); 718 iounmap(iobase);
770err_ioremap: 719 printk(KERN_ERR
771 pci_release_regions(pdev); 720 "ioatdma: Intel(R) I/OAT DMA Engine initialization failed\n");
772err_request_regions: 721 return NULL;
773err_set_dma_mask:
774 pci_disable_device(pdev);
775err_enable_device:
776
777 printk(KERN_INFO
778 "ioatdma: Intel(R) I/OAT DMA Engine initialization failed\n");
779
780 return err;
781}
782
783static void ioat_shutdown(struct pci_dev *pdev)
784{
785 struct ioat_device *device;
786 device = pci_get_drvdata(pdev);
787
788 dma_async_device_unregister(&device->common);
789} 722}
790 723
791static void __devexit ioat_remove(struct pci_dev *pdev) 724void ioat_dma_remove(struct ioatdma_device *device)
792{ 725{
793 struct ioat_device *device;
794 struct dma_chan *chan, *_chan; 726 struct dma_chan *chan, *_chan;
795 struct ioat_dma_chan *ioat_chan; 727 struct ioat_dma_chan *ioat_chan;
796 728
797 device = pci_get_drvdata(pdev);
798 dma_async_device_unregister(&device->common); 729 dma_async_device_unregister(&device->common);
799 730
800 free_irq(device->pdev->irq, device); 731 free_irq(device->pdev->irq, device);
801#ifdef CONFIG_PCI_MSI 732
802 if (device->msi)
803 pci_disable_msi(device->pdev);
804#endif
805 pci_pool_destroy(device->dma_pool); 733 pci_pool_destroy(device->dma_pool);
806 pci_pool_destroy(device->completion_pool); 734 pci_pool_destroy(device->completion_pool);
807 iounmap(device->reg_base); 735
808 pci_release_regions(pdev);
809 pci_disable_device(pdev);
810 list_for_each_entry_safe(chan, _chan, 736 list_for_each_entry_safe(chan, _chan,
811 &device->common.channels, device_node) { 737 &device->common.channels, device_node) {
812 ioat_chan = to_ioat_chan(chan); 738 ioat_chan = to_ioat_chan(chan);
@@ -816,25 +742,3 @@ static void __devexit ioat_remove(struct pci_dev *pdev)
816 kfree(device); 742 kfree(device);
817} 743}
818 744
819/* MODULE API */
820MODULE_VERSION("1.9");
821MODULE_LICENSE("GPL");
822MODULE_AUTHOR("Intel Corporation");
823
824static int __init ioat_init_module(void)
825{
826 /* it's currently unsafe to unload this module */
827 /* if forced, worst case is that rmmod hangs */
828 __unsafe(THIS_MODULE);
829
830 return pci_register_driver(&ioat_pci_driver);
831}
832
833module_init(ioat_init_module);
834
835static void __exit ioat_exit_module(void)
836{
837 pci_unregister_driver(&ioat_pci_driver);
838}
839
840module_exit(ioat_exit_module);
diff --git a/drivers/dma/ioatdma.h b/drivers/dma/ioatdma.h
index bf4dad70e0f5..0b8ffbde1e61 100644
--- a/drivers/dma/ioatdma.h
+++ b/drivers/dma/ioatdma.h
@@ -31,22 +31,21 @@
31#define IOAT_LOW_COMPLETION_MASK 0xffffffc0 31#define IOAT_LOW_COMPLETION_MASK 0xffffffc0
32 32
33/** 33/**
34 * struct ioat_device - internal representation of a IOAT device 34 * struct ioatdma_device - internal representation of a IOAT device
35 * @pdev: PCI-Express device 35 * @pdev: PCI-Express device
36 * @reg_base: MMIO register space base address 36 * @reg_base: MMIO register space base address
37 * @dma_pool: for allocating DMA descriptors 37 * @dma_pool: for allocating DMA descriptors
38 * @common: embedded struct dma_device 38 * @common: embedded struct dma_device
39 * @msi: Message Signaled Interrupt number 39 * @version: version of ioatdma device
40 */ 40 */
41 41
42struct ioat_device { 42struct ioatdma_device {
43 struct pci_dev *pdev; 43 struct pci_dev *pdev;
44 void __iomem *reg_base; 44 void __iomem *reg_base;
45 struct pci_pool *dma_pool; 45 struct pci_pool *dma_pool;
46 struct pci_pool *completion_pool; 46 struct pci_pool *completion_pool;
47
48 struct dma_device common; 47 struct dma_device common;
49 u8 msi; 48 u8 version;
50}; 49};
51 50
52/** 51/**
@@ -84,7 +83,7 @@ struct ioat_dma_chan {
84 83
85 int pending; 84 int pending;
86 85
87 struct ioat_device *device; 86 struct ioatdma_device *device;
88 struct dma_chan common; 87 struct dma_chan common;
89 88
90 dma_addr_t completion_addr; 89 dma_addr_t completion_addr;
@@ -117,4 +116,13 @@ struct ioat_desc_sw {
117 struct dma_async_tx_descriptor async_tx; 116 struct dma_async_tx_descriptor async_tx;
118}; 117};
119 118
119#if defined(CONFIG_INTEL_IOATDMA) || defined(CONFIG_INTEL_IOATDMA_MODULE)
120struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev,
121 void __iomem *iobase);
122void ioat_dma_remove(struct ioatdma_device *device);
123#else
124#define ioat_dma_probe(pdev, iobase) NULL
125#define ioat_dma_remove(device) do { } while (0)
126#endif
127
120#endif /* IOATDMA_H */ 128#endif /* IOATDMA_H */
diff --git a/drivers/dma/ioatdma_hw.h b/drivers/dma/ioatdma_hw.h
index 4d7a12880be3..9e7434e1551f 100644
--- a/drivers/dma/ioatdma_hw.h
+++ b/drivers/dma/ioatdma_hw.h
@@ -27,7 +27,7 @@
27#define IOAT_PCI_RID 0x00 27#define IOAT_PCI_RID 0x00
28#define IOAT_PCI_SVID 0x8086 28#define IOAT_PCI_SVID 0x8086
29#define IOAT_PCI_SID 0x8086 29#define IOAT_PCI_SID 0x8086
30#define IOAT_VER 0x12 /* Version 1.2 */ 30#define IOAT_VER_1_2 0x12 /* Version 1.2 */
31 31
32struct ioat_dma_descriptor { 32struct ioat_dma_descriptor {
33 uint32_t size; 33 uint32_t size;