static int nouveau_remove_conflicting_drivers(struct drm_device *dev)
 {
        struct drm_nouveau_private *dev_priv = dev->dev_private;
+       bool primary = false;
        dev_priv->apertures = nouveau_get_apertures(dev);
        if (!dev_priv->apertures)
                return -ENOMEM;
 
-       remove_conflicting_framebuffers(dev_priv->apertures, "nouveaufb");
+#ifdef CONFIG_X86
+       primary = dev->pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
+#endif
+       
+       remove_conflicting_framebuffers(dev_priv->apertures, "nouveaufb", primary);
        return 0;
 }
 
 
        return false;
 }
 
-void remove_conflicting_framebuffers(struct apertures_struct *a, const char *name)
+#define VGA_FB_PHYS 0xA0000
+void remove_conflicting_framebuffers(struct apertures_struct *a,
+                                    const char *name, bool primary)
 {
        int i;
 
        /* check all firmware fbs and kick off if the base addr overlaps */
        for (i = 0 ; i < FB_MAX; i++) {
+               struct apertures_struct *gen_aper;
                if (!registered_fb[i])
                        continue;
 
                if (!(registered_fb[i]->flags & FBINFO_MISC_FIRMWARE))
                        continue;
 
-               if (fb_do_apertures_overlap(registered_fb[i]->apertures, a)) {
+               gen_aper = registered_fb[i]->apertures;
+               if (fb_do_apertures_overlap(gen_aper, a) ||
+                       (primary && gen_aper && gen_aper->count &&
+                        gen_aper->ranges[0].base == VGA_FB_PHYS)) {
+
                        printk(KERN_ERR "fb: conflicting fb hw usage "
                               "%s vs %s - removing generic driver\n",
                               name, registered_fb[i]->fix.id);
        if (fb_check_foreignness(fb_info))
                return -ENOSYS;
 
-       remove_conflicting_framebuffers(fb_info->apertures, fb_info->fix.id);
+       remove_conflicting_framebuffers(fb_info->apertures, fb_info->fix.id,
+                                        fb_is_primary_device(fb_info));
 
        num_registered_fb++;
        for (i = 0 ; i < FB_MAX; i++)
 
                vga_imageblit_color(info, image);
 }
 
+static void vga16fb_destroy(struct fb_info *info)
+{
+       iounmap(info->screen_base);
+       fb_dealloc_cmap(&info->cmap);
+       /* XXX unshare VGA regions */
+       framebuffer_release(info);
+}
+
 static struct fb_ops vga16fb_ops = {
        .owner          = THIS_MODULE,
        .fb_open        = vga16fb_open,
        .fb_release     = vga16fb_release,
+       .fb_destroy     = vga16fb_destroy,
        .fb_check_var   = vga16fb_check_var,
        .fb_set_par     = vga16fb_set_par,
        .fb_setcolreg   = vga16fb_setcolreg,
                ret = -ENOMEM;
                goto err_fb_alloc;
        }
+       info->apertures = alloc_apertures(1);
+       if (!info->apertures) {
+               ret = -ENOMEM;
+               goto err_ioremap;
+       }
 
        /* XXX share VGA_FB_PHYS and I/O region with vgacon and others */
        info->screen_base = (void __iomem *)VGA_MAP_MEM(VGA_FB_PHYS, 0);
        info->fix = vga16fb_fix;
        /* supports rectangles with widths of multiples of 8 */
        info->pixmap.blit_x = 1 << 7 | 1 << 15 | 1 << 23 | 1 << 31;
-       info->flags = FBINFO_FLAG_DEFAULT |
+       info->flags = FBINFO_FLAG_DEFAULT | FBINFO_MISC_FIRMWARE |
                FBINFO_HWACCEL_YPAN;
 
        i = (info->var.bits_per_pixel == 8) ? 256 : 16;
 
        vga16fb_update_fix(info);
 
+       info->apertures->ranges[0].base = VGA_FB_PHYS;
+       info->apertures->ranges[0].size = VGA_FB_PHYS_LEN;
+
        if (register_framebuffer(info) < 0) {
                printk(KERN_ERR "vga16fb: unable to register framebuffer\n");
                ret = -EINVAL;
 {
        struct fb_info *info = platform_get_drvdata(dev);
 
-       if (info) {
+       if (info)
                unregister_framebuffer(info);
-               iounmap(info->screen_base);
-               fb_dealloc_cmap(&info->cmap);
-       /* XXX unshare VGA regions */
-               framebuffer_release(info);
-       }
 
        return 0;
 }
 
 /* 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 void remove_conflicting_framebuffers(struct apertures_struct *a,
+                               const char *name, bool primary);
 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);