} debugfs;
 
        struct nouveau_fbdev *nfbdev;
+       struct apertures_struct *apertures;
 };
 
 static inline struct drm_nouveau_private *
 
        struct drm_mode_fb_cmd mode_cmd;
        struct pci_dev *pdev = dev->pdev;
        struct device *device = &pdev->dev;
-       struct apertures_struct *aper;
        int size, ret;
 
        mode_cmd.width = sizes->surface_width;
        info->fix.mmio_len = pci_resource_len(pdev, 1);
 
        /* Set aperture base/size for vesafb takeover */
-       aper = info->apertures = alloc_apertures(3);
+       info->apertures = dev_priv->apertures;
        if (!info->apertures) {
                ret = -ENOMEM;
                goto out_unref;
        }
 
-       aper->ranges[0].base = pci_resource_start(pdev, 1);
-       aper->ranges[0].size = pci_resource_len(pdev, 1);
-       aper->count = 1;
-
-       if (pci_resource_len(pdev, 2)) {
-               aper->ranges[aper->count].base = pci_resource_start(pdev, 2);
-               aper->ranges[aper->count].size = pci_resource_len(pdev, 2);
-               aper->count++;
-       }
-
-       if (pci_resource_len(pdev, 3)) {
-               aper->ranges[aper->count].base = pci_resource_start(pdev, 3);
-               aper->ranges[aper->count].size = pci_resource_len(pdev, 3);
-               aper->count++;
-       }
-
        info->pixmap.size = 64*1024;
        info->pixmap.buf_align = 8;
        info->pixmap.access_align = 32;
 
 #endif
 }
 
+static struct apertures_struct *nouveau_get_apertures(struct drm_device *dev)
+{
+       struct pci_dev *pdev = dev->pdev;
+       struct apertures_struct *aper = alloc_apertures(3);
+       if (!aper)
+               return NULL;
+
+       aper->ranges[0].base = pci_resource_start(pdev, 1);
+       aper->ranges[0].size = pci_resource_len(pdev, 1);
+       aper->count = 1;
+
+       if (pci_resource_len(pdev, 2)) {
+               aper->ranges[aper->count].base = pci_resource_start(pdev, 2);
+               aper->ranges[aper->count].size = pci_resource_len(pdev, 2);
+               aper->count++;
+       }
+
+       if (pci_resource_len(pdev, 3)) {
+               aper->ranges[aper->count].base = pci_resource_start(pdev, 3);
+               aper->ranges[aper->count].size = pci_resource_len(pdev, 3);
+               aper->count++;
+       }
+
+       return aper;
+}
+
+static int nouveau_remove_conflicting_drivers(struct drm_device *dev)
+{
+       struct drm_nouveau_private *dev_priv = dev->dev_private;
+       dev_priv->apertures = nouveau_get_apertures(dev);
+       if (!dev_priv->apertures)
+               return -ENOMEM;
+
+       remove_conflicting_framebuffers(dev_priv->apertures, "nouveaufb");
+       return 0;
+}
+
 int nouveau_load(struct drm_device *dev, unsigned long flags)
 {
        struct drm_nouveau_private *dev_priv;
        NV_INFO(dev, "Detected an NV%2x generation card (0x%08x)\n",
                dev_priv->card_type, reg0);
 
+       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
+               int ret = nouveau_remove_conflicting_drivers(dev);
+               if (ret)
+                       return ret;
+       }
+
        /* map larger RAMIN aperture on NV40 cards */
        dev_priv->ramin  = NULL;
        if (dev_priv->card_type >= NV_40) {
 
        return false;
 }
 
-static bool fb_do_apertures_overlap(struct fb_info *gen, struct fb_info *hw)
+static bool fb_do_apertures_overlap(struct apertures_struct *gena,
+                                   struct apertures_struct *hwa)
 {
        int i, j;
-       struct apertures_struct *hwa = hw->apertures;
-       struct apertures_struct *gena = gen->apertures;
        if (!hwa || !gena)
                return false;
 
        return false;
 }
 
+void remove_conflicting_framebuffers(struct apertures_struct *a, const char *name)
+{
+       int i;
+
+       /* check all firmware fbs and kick off if the base addr overlaps */
+       for (i = 0 ; i < FB_MAX; i++) {
+               if (!registered_fb[i])
+                       continue;
+
+               if (!(registered_fb[i]->flags & FBINFO_MISC_FIRMWARE))
+                       continue;
+
+               if (fb_do_apertures_overlap(registered_fb[i]->apertures, a)) {
+                       printk(KERN_ERR "fb: conflicting fb hw usage "
+                              "%s vs %s - removing generic driver\n",
+                              name, registered_fb[i]->fix.id);
+                       unregister_framebuffer(registered_fb[i]);
+               }
+       }
+}
+EXPORT_SYMBOL(remove_conflicting_framebuffers);
+
 /**
  *     register_framebuffer - registers a frame buffer device
  *     @fb_info: frame buffer info structure
        if (fb_check_foreignness(fb_info))
                return -ENOSYS;
 
-       /* check all firmware fbs and kick off if the base addr overlaps */
-       for (i = 0 ; i < FB_MAX; i++) {
-               if (!registered_fb[i])
-                       continue;
-
-               if (registered_fb[i]->flags & FBINFO_MISC_FIRMWARE) {
-                       if (fb_do_apertures_overlap(registered_fb[i], fb_info)) {
-                               printk(KERN_ERR "fb: conflicting fb hw usage "
-                                      "%s vs %s - removing generic driver\n",
-                                      fb_info->fix.id,
-                                      registered_fb[i]->fix.id);
-                               unregister_framebuffer(registered_fb[i]);
-                       }
-               }
-       }
+       remove_conflicting_framebuffers(fb_info->apertures, fb_info->fix.id);
 
        num_registered_fb++;
        for (i = 0 ; i < FB_MAX; i++)
 
 /* drivers/video/fbmem.c */
 extern int register_framebuffer(struct fb_info *fb_info);
 extern int unregister_framebuffer(struct fb_info *fb_info);
+extern void remove_conflicting_framebuffers(struct apertures_struct *a, const char *name);
 extern int fb_prepare_logo(struct fb_info *fb_info, int rotate);
 extern int fb_show_logo(struct fb_info *fb_info, int rotate);
 extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size);