return 0;
 }
 
+resource_size_t mgag200_probe_vram(void __iomem *mem, resource_size_t size)
+{
+       int offset;
+       int orig;
+       int test1, test2;
+       int orig1, orig2;
+       size_t vram_size;
+
+       /* Probe */
+       orig = ioread16(mem);
+       iowrite16(0, mem);
+
+       vram_size = size;
+
+       for (offset = 0x100000; offset < vram_size; offset += 0x4000) {
+               orig1 = ioread8(mem + offset);
+               orig2 = ioread8(mem + offset + 0x100);
+
+               iowrite16(0xaa55, mem + offset);
+               iowrite16(0xaa55, mem + offset + 0x100);
+
+               test1 = ioread16(mem + offset);
+               test2 = ioread16(mem);
+
+               iowrite16(orig1, mem + offset);
+               iowrite16(orig2, mem + offset + 0x100);
+
+               if (test1 != 0xaa55)
+                       break;
+
+               if (test2)
+                       break;
+       }
+
+       iowrite16(orig, mem);
+
+       return offset - 65536;
+}
+
 /*
  * DRM driver
  */
 
        struct mga_mc                   mc;
 
        void __iomem                    *vram;
-       size_t                          vram_fb_available;
+       resource_size_t                 vram_available;
 
        enum mga_type                   type;
 
 
                                /* mgag200_drv.c */
 int mgag200_init_pci_options(struct pci_dev *pdev, u32 option, u32 option2);
+resource_size_t mgag200_probe_vram(void __iomem *mem, resource_size_t size);
 int mgag200_regs_init(struct mga_device *mdev);
 
                                /* mgag200_<device type>.c */
                                                 enum mga_type type, unsigned long flags);
 
                                /* mgag200_mode.c */
-int mgag200_modeset_init(struct mga_device *mdev);
+resource_size_t mgag200_device_probe_vram(struct mga_device *mdev);
+int mgag200_modeset_init(struct mga_device *mdev, resource_size_t vram_fb_available);
 
                                /* mgag200_i2c.c */
 int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c);
 
        struct mgag200_g200_device *g200;
        struct mga_device *mdev;
        struct drm_device *dev;
+       resource_size_t vram_available;
        int ret;
 
        g200 = devm_drm_dev_alloc(&pdev->dev, drv, struct mgag200_g200_device, base.base);
        if (ret)
                return ERR_PTR(ret);
 
-       ret = mgag200_modeset_init(mdev);
+       vram_available = mgag200_device_probe_vram(mdev);
+
+       ret = mgag200_modeset_init(mdev, vram_available);
        if (ret)
                return ERR_PTR(ret);
 
 
 {
        struct mga_device *mdev;
        struct drm_device *dev;
+       resource_size_t vram_available;
        int ret;
 
        mdev = devm_drm_dev_alloc(&pdev->dev, drv, struct mga_device, base);
        if (ret)
                return ERR_PTR(ret);
 
-       ret = mgag200_modeset_init(mdev);
+       vram_available = mgag200_device_probe_vram(mdev);
+
+       ret = mgag200_modeset_init(mdev, vram_available);
        if (ret)
                return ERR_PTR(ret);
 
 
 {
        struct mga_device *mdev;
        struct drm_device *dev;
+       resource_size_t vram_available;
        int ret;
 
        mdev = devm_drm_dev_alloc(&pdev->dev, drv, struct mga_device, base);
        if (ret)
                return ERR_PTR(ret);
 
-       ret = mgag200_modeset_init(mdev);
+       vram_available = mgag200_device_probe_vram(mdev);
+
+       ret = mgag200_modeset_init(mdev, vram_available);
        if (ret)
                return ERR_PTR(ret);
 
 
 {
        struct mga_device *mdev;
        struct drm_device *dev;
+       resource_size_t vram_available;
        int ret;
 
        mdev = devm_drm_dev_alloc(&pdev->dev, drv, struct mga_device, base);
        if (ret)
                return ERR_PTR(ret);
 
-       ret = mgag200_modeset_init(mdev);
+       vram_available = mgag200_device_probe_vram(mdev);
+
+       ret = mgag200_modeset_init(mdev, vram_available);
        if (ret)
                return ERR_PTR(ret);
 
 
 {
        struct mga_device *mdev;
        struct drm_device *dev;
+       resource_size_t vram_available;
        int ret;
 
        mdev = devm_drm_dev_alloc(&pdev->dev, drv, struct mga_device, base);
        if (ret)
                return ERR_PTR(ret);
 
-       ret = mgag200_modeset_init(mdev);
+       vram_available = mgag200_device_probe_vram(mdev);
+
+       ret = mgag200_modeset_init(mdev, vram_available);
        if (ret)
                return ERR_PTR(ret);
 
 
  * DRM device
  */
 
+static resource_size_t mgag200_g200ew3_device_probe_vram(struct mga_device *mdev)
+{
+       resource_size_t vram_size = mdev->mc.vram_size;
+
+       if (vram_size >= 0x1000000)
+               vram_size = vram_size - 0x400000;
+       return mgag200_probe_vram(mdev->vram, vram_size);
+}
+
 struct mga_device *mgag200_g200ew3_device_create(struct pci_dev *pdev,
                                                 const struct drm_driver *drv,
                                                 enum mga_type type, unsigned long flags)
 {
        struct mga_device *mdev;
        struct drm_device *dev;
+       resource_size_t vram_available;
        int ret;
 
        mdev = devm_drm_dev_alloc(&pdev->dev, drv, struct mga_device, base);
        if (ret)
                return ERR_PTR(ret);
 
-       ret = mgag200_modeset_init(mdev);
+       vram_available = mgag200_g200ew3_device_probe_vram(mdev);
+
+       ret = mgag200_modeset_init(mdev, vram_available);
        if (ret)
                return ERR_PTR(ret);
 
 
        struct mgag200_g200se_device *g200se;
        struct mga_device *mdev;
        struct drm_device *dev;
+       resource_size_t vram_available;
        int ret;
 
        g200se = devm_drm_dev_alloc(&pdev->dev, drv, struct mgag200_g200se_device, base.base);
        if (ret)
                return ERR_PTR(ret);
 
-       ret = mgag200_modeset_init(mdev);
+       vram_available = mgag200_device_probe_vram(mdev);
+
+       ret = mgag200_modeset_init(mdev, vram_available);
        if (ret)
                return ERR_PTR(ret);
 
 
 {
        struct mga_device *mdev;
        struct drm_device *dev;
+       resource_size_t vram_available;
        int ret;
 
        mdev = devm_drm_dev_alloc(&pdev->dev, drv, struct mga_device, base);
        if (ret)
                return ERR_PTR(ret);
 
-       ret = mgag200_modeset_init(mdev);
+       vram_available = mgag200_device_probe_vram(mdev);
+
+       ret = mgag200_modeset_init(mdev, vram_available);
        if (ret)
                return ERR_PTR(ret);
 
 
 
 #include "mgag200_drv.h"
 
-static size_t mgag200_probe_vram(struct mga_device *mdev, void __iomem *mem,
-                                size_t size)
-{
-       int offset;
-       int orig;
-       int test1, test2;
-       int orig1, orig2;
-       size_t vram_size;
-
-       /* Probe */
-       orig = ioread16(mem);
-       iowrite16(0, mem);
-
-       vram_size = size;
-
-       if ((mdev->type == G200_EW3) && (vram_size >= 0x1000000))
-               vram_size = vram_size - 0x400000;
-
-       for (offset = 0x100000; offset < vram_size; offset += 0x4000) {
-               orig1 = ioread8(mem + offset);
-               orig2 = ioread8(mem + offset + 0x100);
-
-               iowrite16(0xaa55, mem + offset);
-               iowrite16(0xaa55, mem + offset + 0x100);
-
-               test1 = ioread16(mem + offset);
-               test2 = ioread16(mem);
-
-               iowrite16(orig1, mem + offset);
-               iowrite16(orig2, mem + offset + 0x100);
-
-               if (test1 != 0xaa55)
-                       break;
-
-               if (test2)
-                       break;
-       }
-
-       iowrite16(orig, mem);
-
-       return offset - 65536;
-}
-
 int mgag200_mm_init(struct mga_device *mdev)
 {
        struct drm_device *dev = &mdev->base;
        if (!mdev->vram)
                return -ENOMEM;
 
-       mdev->mc.vram_size = mgag200_probe_vram(mdev, mdev->vram, len);
+       mdev->mc.vram_size = len;
        mdev->mc.vram_base = start;
        mdev->mc.vram_window = len;
 
-       mdev->vram_fb_available = mdev->mc.vram_size;
-
        return 0;
 }
 
  * This file contains setup code for the CRTC.
  */
 
+resource_size_t mgag200_device_probe_vram(struct mga_device *mdev)
+{
+       return mgag200_probe_vram(mdev->vram, mdev->mc.vram_size);
+}
+
 static void mgag200_crtc_set_gamma_linear(struct mga_device *mdev,
                                          const struct drm_format_info *format)
 {
        unsigned long fbsize, fbpages, max_fbpages;
        struct mgag200_g200se_device *g200se;
 
-       max_fbpages = mdev->vram_fb_available >> PAGE_SHIFT;
+       max_fbpages = mdev->vram_available >> PAGE_SHIFT;
 
        fbsize = mode->hdisplay * mode->vdisplay * max_bpp;
        fbpages = DIV_ROUND_UP(fbsize, PAGE_SIZE);
        .atomic_commit = drm_atomic_helper_commit,
 };
 
-int mgag200_modeset_init(struct mga_device *mdev)
+int mgag200_modeset_init(struct mga_device *mdev, resource_size_t vram_available)
 {
        struct drm_device *dev = &mdev->base;
        struct mga_i2c_chan *i2c = &mdev->i2c;
 
        mgag200_init_regs(mdev);
 
+       mdev->vram_available = vram_available;
+
        ret = drmm_mode_config_init(dev);
        if (ret) {
                drm_err(dev, "drmm_mode_config_init() failed, error %d\n",