int mgag200_cursor_init(struct mga_device *mdev)
 {
        struct drm_device *dev = mdev->dev;
+       size_t size;
+
+       size = roundup(64 * 48, PAGE_SIZE);
+       if (size * 2 > mdev->vram_fb_available)
+               return -ENOMEM;
 
        /*
         * Make small buffers to store a hardware cursor (double
         * buffered icon updates)
         */
        mdev->cursor.pixels_1 = drm_gem_vram_create(dev, &dev->vram_mm->bdev,
-                                                   roundup(48*64, PAGE_SIZE),
-                                                   0, 0);
+                                                   size, 0, 0);
        mdev->cursor.pixels_2 = drm_gem_vram_create(dev, &dev->vram_mm->bdev,
-                                                   roundup(48*64, PAGE_SIZE),
-                                                   0, 0);
+                                                   size, 0, 0);
        if (IS_ERR(mdev->cursor.pixels_2) || IS_ERR(mdev->cursor.pixels_1)) {
                mdev->cursor.pixels_1 = NULL;
                mdev->cursor.pixels_2 = NULL;
        }
        mdev->cursor.pixels_current = NULL;
 
+       /*
+        * At the high end of video memory, we reserve space for
+        * buffer objects. The cursor plane uses this memory to store
+        * a double-buffered image of the current cursor. Hence, it's
+        * not available for framebuffers.
+        */
+       mdev->vram_fb_available -= 2 * size;
+
        return 0;
 }
 
 
 
        drm_mode_config_init(dev);
        dev->mode_config.funcs = (void *)&mga_mode_funcs;
-       if (IS_G200_SE(mdev) && mdev->mc.vram_size < (2048*1024))
+       if (IS_G200_SE(mdev) && mdev->vram_fb_available < (2048*1024))
                dev->mode_config.preferred_depth = 16;
        else
                dev->mode_config.preferred_depth = 32;
 
                        bpp = connector->cmdline_mode.bpp;
        }
 
-       if ((mode->hdisplay * mode->vdisplay * (bpp/8)) > mdev->mc.vram_size) {
+       if ((mode->hdisplay * mode->vdisplay * (bpp/8)) > mdev->vram_fb_available) {
                if (connector->cmdline_mode.specified)
                        connector->cmdline_mode.specified = false;
                return MODE_BAD;
 
        mdev->fb_mtrr = arch_phys_wc_add(pci_resource_start(dev->pdev, 0),
                                         pci_resource_len(dev->pdev, 0));
 
+       mdev->vram_fb_available = mdev->mc.vram_size;
+
        return 0;
 }
 
 {
        struct drm_device *dev = mdev->dev;
 
+       mdev->vram_fb_available = 0;
+
        drm_vram_helper_release_mm(dev);
 
        arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),