aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/ioat/dca.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dma/ioat/dca.c')
-rw-r--r--drivers/dma/ioat/dca.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/drivers/dma/ioat/dca.c b/drivers/dma/ioat/dca.c
index abd9038e06b1..9b041858d10d 100644
--- a/drivers/dma/ioat/dca.c
+++ b/drivers/dma/ioat/dca.c
@@ -242,8 +242,7 @@ static struct dca_ops ioat_dca_ops = {
242}; 242};
243 243
244 244
245struct dca_provider * __devinit 245struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase)
246ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase)
247{ 246{
248 struct dca_provider *dca; 247 struct dca_provider *dca;
249 struct ioat_dca_priv *ioatdca; 248 struct ioat_dca_priv *ioatdca;
@@ -408,8 +407,7 @@ static int ioat2_dca_count_dca_slots(void __iomem *iobase, u16 dca_offset)
408 return slots; 407 return slots;
409} 408}
410 409
411struct dca_provider * __devinit 410struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase)
412ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase)
413{ 411{
414 struct dca_provider *dca; 412 struct dca_provider *dca;
415 struct ioat_dca_priv *ioatdca; 413 struct ioat_dca_priv *ioatdca;
@@ -604,8 +602,24 @@ static int ioat3_dca_count_dca_slots(void *iobase, u16 dca_offset)
604 return slots; 602 return slots;
605} 603}
606 604
607struct dca_provider * __devinit 605static inline int dca3_tag_map_invalid(u8 *tag_map)
608ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase) 606{
607 /*
608 * If the tag map is not programmed by the BIOS the default is:
609 * 0x80 0x80 0x80 0x80 0x80 0x00 0x00 0x00
610 *
611 * This an invalid map and will result in only 2 possible tags
612 * 0x1F and 0x00. 0x00 is an invalid DCA tag so we know that
613 * this entire definition is invalid.
614 */
615 return ((tag_map[0] == DCA_TAG_MAP_VALID) &&
616 (tag_map[1] == DCA_TAG_MAP_VALID) &&
617 (tag_map[2] == DCA_TAG_MAP_VALID) &&
618 (tag_map[3] == DCA_TAG_MAP_VALID) &&
619 (tag_map[4] == DCA_TAG_MAP_VALID));
620}
621
622struct dca_provider *ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase)
609{ 623{
610 struct dca_provider *dca; 624 struct dca_provider *dca;
611 struct ioat_dca_priv *ioatdca; 625 struct ioat_dca_priv *ioatdca;
@@ -674,6 +688,12 @@ ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase)
674 ioatdca->tag_map[i] = bit & DCA_TAG_MAP_MASK; 688 ioatdca->tag_map[i] = bit & DCA_TAG_MAP_MASK;
675 } 689 }
676 690
691 if (dca3_tag_map_invalid(ioatdca->tag_map)) {
692 dev_err(&pdev->dev, "APICID_TAG_MAP set incorrectly by BIOS, disabling DCA\n");
693 free_dca_provider(dca);
694 return NULL;
695 }
696
677 err = register_dca_provider(dca, &pdev->dev); 697 err = register_dca_provider(dca, &pdev->dev);
678 if (err) { 698 if (err) {
679 free_dca_provider(dca); 699 free_dca_provider(dca);