diff options
Diffstat (limited to 'drivers/dma/ioat/dca.c')
| -rw-r--r-- | drivers/dma/ioat/dca.c | 32 |
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 | ||
| 245 | struct dca_provider * __devinit | 245 | struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase) |
| 246 | ioat_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 | ||
| 411 | struct dca_provider * __devinit | 410 | struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase) |
| 412 | ioat2_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 | ||
| 607 | struct dca_provider * __devinit | 605 | static inline int dca3_tag_map_invalid(u8 *tag_map) |
| 608 | ioat3_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 | |||
| 622 | struct 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); |
