diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_state.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_state.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index 92100a9678ba..75c5c465e08e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
@@ -639,6 +639,43 @@ static void nouveau_OF_copy_vbios_to_ramin(struct drm_device *dev) | |||
639 | #endif | 639 | #endif |
640 | } | 640 | } |
641 | 641 | ||
642 | static struct apertures_struct *nouveau_get_apertures(struct drm_device *dev) | ||
643 | { | ||
644 | struct pci_dev *pdev = dev->pdev; | ||
645 | struct apertures_struct *aper = alloc_apertures(3); | ||
646 | if (!aper) | ||
647 | return NULL; | ||
648 | |||
649 | aper->ranges[0].base = pci_resource_start(pdev, 1); | ||
650 | aper->ranges[0].size = pci_resource_len(pdev, 1); | ||
651 | aper->count = 1; | ||
652 | |||
653 | if (pci_resource_len(pdev, 2)) { | ||
654 | aper->ranges[aper->count].base = pci_resource_start(pdev, 2); | ||
655 | aper->ranges[aper->count].size = pci_resource_len(pdev, 2); | ||
656 | aper->count++; | ||
657 | } | ||
658 | |||
659 | if (pci_resource_len(pdev, 3)) { | ||
660 | aper->ranges[aper->count].base = pci_resource_start(pdev, 3); | ||
661 | aper->ranges[aper->count].size = pci_resource_len(pdev, 3); | ||
662 | aper->count++; | ||
663 | } | ||
664 | |||
665 | return aper; | ||
666 | } | ||
667 | |||
668 | static int nouveau_remove_conflicting_drivers(struct drm_device *dev) | ||
669 | { | ||
670 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
671 | dev_priv->apertures = nouveau_get_apertures(dev); | ||
672 | if (!dev_priv->apertures) | ||
673 | return -ENOMEM; | ||
674 | |||
675 | remove_conflicting_framebuffers(dev_priv->apertures, "nouveaufb"); | ||
676 | return 0; | ||
677 | } | ||
678 | |||
642 | int nouveau_load(struct drm_device *dev, unsigned long flags) | 679 | int nouveau_load(struct drm_device *dev, unsigned long flags) |
643 | { | 680 | { |
644 | struct drm_nouveau_private *dev_priv; | 681 | struct drm_nouveau_private *dev_priv; |
@@ -726,6 +763,12 @@ int nouveau_load(struct drm_device *dev, unsigned long flags) | |||
726 | NV_INFO(dev, "Detected an NV%2x generation card (0x%08x)\n", | 763 | NV_INFO(dev, "Detected an NV%2x generation card (0x%08x)\n", |
727 | dev_priv->card_type, reg0); | 764 | dev_priv->card_type, reg0); |
728 | 765 | ||
766 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | ||
767 | int ret = nouveau_remove_conflicting_drivers(dev); | ||
768 | if (ret) | ||
769 | return ret; | ||
770 | } | ||
771 | |||
729 | /* map larger RAMIN aperture on NV40 cards */ | 772 | /* map larger RAMIN aperture on NV40 cards */ |
730 | dev_priv->ramin = NULL; | 773 | dev_priv->ramin = NULL; |
731 | if (dev_priv->card_type >= NV_40) { | 774 | if (dev_priv->card_type >= NV_40) { |