102 lines
2.7 KiB
Diff
102 lines
2.7 KiB
Diff
|
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.c b/drivers/gpu/drm/cirrus/cirrus_drv.c
|
||
|
index d703823..7053140 100644
|
||
|
--- a/drivers/gpu/drm/cirrus/cirrus_drv.c
|
||
|
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.c
|
||
|
@@ -35,9 +35,28 @@ static DEFINE_PCI_DEVICE_TABLE(pciidlist) = {
|
||
|
{0,}
|
||
|
};
|
||
|
|
||
|
+
|
||
|
+static void cirrus_kick_out_firmware_fb(struct pci_dev *pdev)
|
||
|
+{
|
||
|
+ struct apertures_struct *ap;
|
||
|
+ bool primary = false;
|
||
|
+
|
||
|
+ ap = alloc_apertures(1);
|
||
|
+ ap->ranges[0].base = pci_resource_start(pdev, 0);
|
||
|
+ ap->ranges[0].size = pci_resource_len(pdev, 0);
|
||
|
+
|
||
|
+#ifdef CONFIG_X86
|
||
|
+ primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
|
||
|
+#endif
|
||
|
+ remove_conflicting_framebuffers(ap, "cirrusdrmfb", primary);
|
||
|
+ kfree(ap);
|
||
|
+}
|
||
|
+
|
||
|
static int __devinit
|
||
|
cirrus_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||
|
{
|
||
|
+ cirrus_kick_out_firmware_fb(pdev);
|
||
|
+
|
||
|
return drm_get_pci_dev(pdev, ent, &driver);
|
||
|
}
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
|
||
|
index 21bdfa8..64ea597 100644
|
||
|
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
|
||
|
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
|
||
|
@@ -145,7 +145,7 @@ struct cirrus_device {
|
||
|
struct ttm_bo_device bdev;
|
||
|
atomic_t validate_sequence;
|
||
|
} ttm;
|
||
|
-
|
||
|
+ bool mm_inited;
|
||
|
};
|
||
|
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
|
||
|
index 2ebcd11..50e170f 100644
|
||
|
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
|
||
|
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
|
||
|
@@ -275,12 +275,17 @@ int cirrus_mm_init(struct cirrus_device *cirrus)
|
||
|
pci_resource_len(dev->pdev, 0),
|
||
|
DRM_MTRR_WC);
|
||
|
|
||
|
+ cirrus->mm_inited = true;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void cirrus_mm_fini(struct cirrus_device *cirrus)
|
||
|
{
|
||
|
struct drm_device *dev = cirrus->dev;
|
||
|
+
|
||
|
+ if (!cirrus->mm_inited)
|
||
|
+ return;
|
||
|
+
|
||
|
ttm_bo_device_release(&cirrus->ttm.bdev);
|
||
|
|
||
|
cirrus_ttm_global_release(cirrus);
|
||
|
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c
|
||
|
index 3c8e04f..93e832d 100644
|
||
|
--- a/drivers/gpu/drm/mgag200/mgag200_drv.c
|
||
|
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.c
|
||
|
@@ -41,9 +41,28 @@ static DEFINE_PCI_DEVICE_TABLE(pciidlist) = {
|
||
|
|
||
|
MODULE_DEVICE_TABLE(pci, pciidlist);
|
||
|
|
||
|
+static void mgag200_kick_out_firmware_fb(struct pci_dev *pdev)
|
||
|
+{
|
||
|
+ struct apertures_struct *ap;
|
||
|
+ bool primary = false;
|
||
|
+
|
||
|
+ ap = alloc_apertures(1);
|
||
|
+ ap->ranges[0].base = pci_resource_start(pdev, 0);
|
||
|
+ ap->ranges[0].size = pci_resource_len(pdev, 0);
|
||
|
+
|
||
|
+#ifdef CONFIG_X86
|
||
|
+ primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
|
||
|
+#endif
|
||
|
+ remove_conflicting_framebuffers(ap, "mgag200drmfb", primary);
|
||
|
+ kfree(ap);
|
||
|
+}
|
||
|
+
|
||
|
+
|
||
|
static int __devinit
|
||
|
mga_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||
|
{
|
||
|
+ mgag200_kick_out_firmware_fb(pdev);
|
||
|
+
|
||
|
return drm_get_pci_dev(pdev, ent, &driver);
|
||
|
}
|
||
|
|