static int cdv_intel_crt_mode_valid(struct drm_connector *connector,
                                struct drm_display_mode *mode)
 {
+       struct drm_psb_private *dev_priv = connector->dev->dev_private;
        int max_clock = 0;
        if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
                return MODE_NO_DBLESCAN;
        if (mode->hdisplay > 1680 || mode->vdisplay > 1050)
                return MODE_PANEL;
 
+       /* We assume worst case scenario of 32 bpp here, since we don't know */
+       if ((ALIGN(mode->hdisplay * 4, 64) * mode->vdisplay) >
+           dev_priv->vram_stolen_size)
+               return MODE_MEM;
+
        return MODE_OK;
 }
 
 
 static int cdv_hdmi_mode_valid(struct drm_connector *connector,
                                 struct drm_display_mode *mode)
 {
+       struct drm_psb_private *dev_priv = connector->dev->dev_private;
 
        if (mode->clock > 165000)
                return MODE_CLOCK_HIGH;
        if (mode->flags & DRM_MODE_FLAG_INTERLACE)
                return MODE_NO_INTERLACE;
 
-       /*
-        * FIXME: for now we limit the size to 1680x1050 on CDV, otherwise it
-        * will go beyond the stolen memory size allocated to the framebuffer
-        */
-       if (mode->hdisplay > 1680)
-               return MODE_PANEL;
-       if (mode->vdisplay > 1050)
-               return MODE_PANEL;
+       /* We assume worst case scenario of 32 bpp here, since we don't know */
+       if ((ALIGN(mode->hdisplay * 4, 64) * mode->vdisplay) >
+           dev_priv->vram_stolen_size)
+               return MODE_MEM;
+
        return MODE_OK;
 }
 
 
 static int oaktrail_hdmi_mode_valid(struct drm_connector *connector,
                                struct drm_display_mode *mode)
 {
+       struct drm_psb_private *dev_priv = connector->dev->dev_private;
        if (mode->clock > 165000)
                return MODE_CLOCK_HIGH;
        if (mode->clock < 20000)
        if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
                return MODE_NO_DBLESCAN;
 
+       /* We assume worst case scenario of 32 bpp here, since we don't know */
+       if ((ALIGN(mode->hdisplay * 4, 64) * mode->vdisplay) >
+           dev_priv->vram_stolen_size)
+               return MODE_MEM;
+
        return MODE_OK;
 }
 
 
 static int psb_intel_sdvo_mode_valid(struct drm_connector *connector,
                                 struct drm_display_mode *mode)
 {
+       struct drm_psb_private *dev_priv = connector->dev->dev_private;
        struct psb_intel_sdvo *psb_intel_sdvo = intel_attached_sdvo(connector);
 
        if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
                        return MODE_PANEL;
        }
 
+       /* We assume worst case scenario of 32 bpp here, since we don't know */
+       if ((ALIGN(mode->hdisplay * 4, 64) * mode->vdisplay) >
+           dev_priv->vram_stolen_size)
+               return MODE_MEM;
+
        return MODE_OK;
 }