aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/dma/ioat.c3
-rw-r--r--drivers/dma/ioat_dca.c12
-rw-r--r--drivers/dma/ioat_dma.c32
-rw-r--r--drivers/dma/ioatdma.h2
4 files changed, 31 insertions, 18 deletions
diff --git a/drivers/dma/ioat.c b/drivers/dma/ioat.c
index a45872f32d50..f204c39fb412 100644
--- a/drivers/dma/ioat.c
+++ b/drivers/dma/ioat.c
@@ -34,7 +34,7 @@
34#include "ioatdma_registers.h" 34#include "ioatdma_registers.h"
35#include "ioatdma_hw.h" 35#include "ioatdma_hw.h"
36 36
37MODULE_VERSION("1.24"); 37MODULE_VERSION(IOAT_DMA_VERSION);
38MODULE_LICENSE("GPL"); 38MODULE_LICENSE("GPL");
39MODULE_AUTHOR("Intel Corporation"); 39MODULE_AUTHOR("Intel Corporation");
40 40
@@ -85,6 +85,7 @@ static void ioat_shutdown_functionality(struct pci_dev *pdev)
85{ 85{
86 struct ioat_device *device = pci_get_drvdata(pdev); 86 struct ioat_device *device = pci_get_drvdata(pdev);
87 87
88 dev_err(&pdev->dev, "Removing dma and dca services\n");
88 if (device->dca) { 89 if (device->dca) {
89 unregister_dca_provider(device->dca); 90 unregister_dca_provider(device->dca);
90 free_dca_provider(device->dca); 91 free_dca_provider(device->dca);
diff --git a/drivers/dma/ioat_dca.c b/drivers/dma/ioat_dca.c
index 2ae04c30edeb..ba985715b803 100644
--- a/drivers/dma/ioat_dca.c
+++ b/drivers/dma/ioat_dca.c
@@ -65,7 +65,7 @@ static inline u16 dcaid_from_pcidev(struct pci_dev *pci)
65 return (pci->bus->number << 8) | pci->devfn; 65 return (pci->bus->number << 8) | pci->devfn;
66} 66}
67 67
68static int dca_enabled_in_bios(void) 68static int dca_enabled_in_bios(struct pci_dev *pdev)
69{ 69{
70 /* CPUID level 9 returns DCA configuration */ 70 /* CPUID level 9 returns DCA configuration */
71 /* Bit 0 indicates DCA enabled by the BIOS */ 71 /* Bit 0 indicates DCA enabled by the BIOS */
@@ -75,17 +75,17 @@ static int dca_enabled_in_bios(void)
75 cpuid_level_9 = cpuid_eax(9); 75 cpuid_level_9 = cpuid_eax(9);
76 res = test_bit(0, &cpuid_level_9); 76 res = test_bit(0, &cpuid_level_9);
77 if (!res) 77 if (!res)
78 printk(KERN_ERR "ioat dma: DCA is disabled in BIOS\n"); 78 dev_err(&pdev->dev, "DCA is disabled in BIOS\n");
79 79
80 return res; 80 return res;
81} 81}
82 82
83static int system_has_dca_enabled(void) 83static int system_has_dca_enabled(struct pci_dev *pdev)
84{ 84{
85 if (boot_cpu_has(X86_FEATURE_DCA)) 85 if (boot_cpu_has(X86_FEATURE_DCA))
86 return dca_enabled_in_bios(); 86 return dca_enabled_in_bios(pdev);
87 87
88 printk(KERN_ERR "ioat dma: boot cpu doesn't have X86_FEATURE_DCA\n"); 88 dev_err(&pdev->dev, "boot cpu doesn't have X86_FEATURE_DCA\n");
89 return 0; 89 return 0;
90} 90}
91 91
@@ -208,7 +208,7 @@ struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase)
208 int i; 208 int i;
209 int err; 209 int err;
210 210
211 if (!system_has_dca_enabled()) 211 if (!system_has_dca_enabled(pdev))
212 return NULL; 212 return NULL;
213 213
214 /* I/OAT v1 systems must have a known tag_map to support DCA */ 214 /* I/OAT v1 systems must have a known tag_map to support DCA */
diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c
index 725f83f3eeb3..c44f5517edbd 100644
--- a/drivers/dma/ioat_dma.c
+++ b/drivers/dma/ioat_dma.c
@@ -267,7 +267,7 @@ static int ioat_dma_alloc_chan_resources(struct dma_chan *chan)
267 chanerr = readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET); 267 chanerr = readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET);
268 if (chanerr) { 268 if (chanerr) {
269 dev_err(&ioat_chan->device->pdev->dev, 269 dev_err(&ioat_chan->device->pdev->dev,
270 "ioatdma: CHANERR = %x, clearing\n", chanerr); 270 "CHANERR = %x, clearing\n", chanerr);
271 writel(chanerr, ioat_chan->reg_base + IOAT_CHANERR_OFFSET); 271 writel(chanerr, ioat_chan->reg_base + IOAT_CHANERR_OFFSET);
272 } 272 }
273 273
@@ -276,7 +276,7 @@ static int ioat_dma_alloc_chan_resources(struct dma_chan *chan)
276 desc = ioat_dma_alloc_descriptor(ioat_chan, GFP_KERNEL); 276 desc = ioat_dma_alloc_descriptor(ioat_chan, GFP_KERNEL);
277 if (!desc) { 277 if (!desc) {
278 dev_err(&ioat_chan->device->pdev->dev, 278 dev_err(&ioat_chan->device->pdev->dev,
279 "ioatdma: Only %d initial descriptors\n", i); 279 "Only %d initial descriptors\n", i);
280 break; 280 break;
281 } 281 }
282 list_add_tail(&desc->node, &tmp_list); 282 list_add_tail(&desc->node, &tmp_list);
@@ -342,7 +342,7 @@ static void ioat_dma_free_chan_resources(struct dma_chan *chan)
342 /* one is ok since we left it on there on purpose */ 342 /* one is ok since we left it on there on purpose */
343 if (in_use_descs > 1) 343 if (in_use_descs > 1)
344 dev_err(&ioat_chan->device->pdev->dev, 344 dev_err(&ioat_chan->device->pdev->dev,
345 "ioatdma: Freeing %d in use descriptors!\n", 345 "Freeing %d in use descriptors!\n",
346 in_use_descs - 1); 346 in_use_descs - 1);
347 347
348 ioat_chan->last_completion = ioat_chan->completion_addr = 0; 348 ioat_chan->last_completion = ioat_chan->completion_addr = 0;
@@ -482,7 +482,7 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
482 if ((ioat_chan->completion_virt->full & IOAT_CHANSTS_DMA_TRANSFER_STATUS) == 482 if ((ioat_chan->completion_virt->full & IOAT_CHANSTS_DMA_TRANSFER_STATUS) ==
483 IOAT_CHANSTS_DMA_TRANSFER_STATUS_HALTED) { 483 IOAT_CHANSTS_DMA_TRANSFER_STATUS_HALTED) {
484 dev_err(&ioat_chan->device->pdev->dev, 484 dev_err(&ioat_chan->device->pdev->dev,
485 "ioatdma: Channel halted, chanerr = %x\n", 485 "Channel halted, chanerr = %x\n",
486 readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET)); 486 readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET));
487 487
488 /* TODO do something to salvage the situation */ 488 /* TODO do something to salvage the situation */
@@ -643,7 +643,7 @@ static int ioat_dma_self_test(struct ioatdma_device *device)
643 u8 *src; 643 u8 *src;
644 u8 *dest; 644 u8 *dest;
645 struct dma_chan *dma_chan; 645 struct dma_chan *dma_chan;
646 struct dma_async_tx_descriptor *tx; 646 struct dma_async_tx_descriptor *tx = NULL;
647 dma_addr_t addr; 647 dma_addr_t addr;
648 dma_cookie_t cookie; 648 dma_cookie_t cookie;
649 int err = 0; 649 int err = 0;
@@ -673,6 +673,13 @@ static int ioat_dma_self_test(struct ioatdma_device *device)
673 } 673 }
674 674
675 tx = ioat_dma_prep_memcpy(dma_chan, IOAT_TEST_SIZE, 0); 675 tx = ioat_dma_prep_memcpy(dma_chan, IOAT_TEST_SIZE, 0);
676 if (!tx) {
677 dev_err(&device->pdev->dev,
678 "Self-test prep failed, disabling\n");
679 err = -ENODEV;
680 goto free_resources;
681 }
682
676 async_tx_ack(tx); 683 async_tx_ack(tx);
677 addr = dma_map_single(dma_chan->device->dev, src, IOAT_TEST_SIZE, 684 addr = dma_map_single(dma_chan->device->dev, src, IOAT_TEST_SIZE,
678 DMA_TO_DEVICE); 685 DMA_TO_DEVICE);
@@ -686,13 +693,13 @@ static int ioat_dma_self_test(struct ioatdma_device *device)
686 693
687 if (ioat_dma_is_complete(dma_chan, cookie, NULL, NULL) != DMA_SUCCESS) { 694 if (ioat_dma_is_complete(dma_chan, cookie, NULL, NULL) != DMA_SUCCESS) {
688 dev_err(&device->pdev->dev, 695 dev_err(&device->pdev->dev,
689 "ioatdma: Self-test copy timed out, disabling\n"); 696 "Self-test copy timed out, disabling\n");
690 err = -ENODEV; 697 err = -ENODEV;
691 goto free_resources; 698 goto free_resources;
692 } 699 }
693 if (memcmp(src, dest, IOAT_TEST_SIZE)) { 700 if (memcmp(src, dest, IOAT_TEST_SIZE)) {
694 dev_err(&device->pdev->dev, 701 dev_err(&device->pdev->dev,
695 "ioatdma: Self-test copy failed compare, disabling\n"); 702 "Self-test copy failed compare, disabling\n");
696 err = -ENODEV; 703 err = -ENODEV;
697 goto free_resources; 704 goto free_resources;
698 } 705 }
@@ -730,6 +737,9 @@ static int ioat_dma_setup_interrupts(struct ioatdma_device *device)
730 goto msi; 737 goto msi;
731 if (!strcmp(ioat_interrupt_style, "intx")) 738 if (!strcmp(ioat_interrupt_style, "intx"))
732 goto intx; 739 goto intx;
740 dev_err(&device->pdev->dev, "invalid ioat_interrupt_style %s\n",
741 ioat_interrupt_style);
742 goto err_no_irq;
733 743
734msix: 744msix:
735 /* The number of MSI-X vectors should equal the number of channels */ 745 /* The number of MSI-X vectors should equal the number of channels */
@@ -906,9 +916,9 @@ struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev,
906 device->common.device_dependency_added = ioat_dma_dependency_added; 916 device->common.device_dependency_added = ioat_dma_dependency_added;
907 device->common.dev = &pdev->dev; 917 device->common.dev = &pdev->dev;
908 dev_err(&device->pdev->dev, 918 dev_err(&device->pdev->dev,
909 "ioatdma: Intel(R) I/OAT DMA Engine found," 919 "Intel(R) I/OAT DMA Engine found,"
910 " %d channels, device version 0x%02x\n", 920 " %d channels, device version 0x%02x, driver version %s\n",
911 device->common.chancnt, device->version); 921 device->common.chancnt, device->version, IOAT_DMA_VERSION);
912 922
913 err = ioat_dma_setup_interrupts(device); 923 err = ioat_dma_setup_interrupts(device);
914 if (err) 924 if (err)
@@ -932,7 +942,7 @@ err_dma_pool:
932 kfree(device); 942 kfree(device);
933err_kzalloc: 943err_kzalloc:
934 dev_err(&device->pdev->dev, 944 dev_err(&device->pdev->dev,
935 "ioatdma: Intel(R) I/OAT DMA Engine initialization failed\n"); 945 "Intel(R) I/OAT DMA Engine initialization failed\n");
936 return NULL; 946 return NULL;
937} 947}
938 948
diff --git a/drivers/dma/ioatdma.h b/drivers/dma/ioatdma.h
index 2a319e124ece..d3643f264507 100644
--- a/drivers/dma/ioatdma.h
+++ b/drivers/dma/ioatdma.h
@@ -28,6 +28,8 @@
28#include <linux/cache.h> 28#include <linux/cache.h>
29#include <linux/pci_ids.h> 29#include <linux/pci_ids.h>
30 30
31#define IOAT_DMA_VERSION "1.26"
32
31enum ioat_interrupt { 33enum ioat_interrupt {
32 none = 0, 34 none = 0,
33 msix_multi_vector = 1, 35 msix_multi_vector = 1,