]> git.kernelconcepts.de Git - mv-sheeva.git/blobdiff - drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
Merge remote branch 'nouveau/for-airlied' of ../drm-nouveau-next into drm-core-next
[mv-sheeva.git] / drivers / gpu / drm / vmwgfx / vmwgfx_fb.c
index 870967a97c15d52eb3f380323e6038d32ed6e76f..e7304188a784da8d8b1e850c1e4b3a06978c0995 100644 (file)
@@ -144,6 +144,13 @@ static int vmw_fb_check_var(struct fb_var_screeninfo *var,
                return -EINVAL;
        }
 
+       if (!vmw_kms_validate_mode_vram(vmw_priv,
+                                       info->fix.line_length,
+                                       var->yoffset + var->yres)) {
+               DRM_ERROR("Requested geom can not fit in framebuffer\n");
+               return -EINVAL;
+       }
+
        return 0;
 }
 
@@ -205,6 +212,9 @@ static void vmw_fb_dirty_flush(struct vmw_fb_par *par)
                SVGAFifoCmdUpdate body;
        } *cmd;
 
+       if (vmw_priv->suspended)
+               return;
+
        spin_lock_irqsave(&par->dirty.lock, flags);
        if (!par->dirty.active) {
                spin_unlock_irqrestore(&par->dirty.lock, flags);
@@ -602,6 +612,7 @@ int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv,
 {
        struct ttm_buffer_object *bo = &vmw_bo->base;
        struct ttm_placement ne_placement = vmw_vram_ne_placement;
+       struct drm_mm_node *mm_node;
        int ret = 0;
 
        ne_placement.lpfn = bo->num_pages;
@@ -615,6 +626,12 @@ int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv,
        if (unlikely(ret != 0))
                goto err_unlock;
 
+       mm_node = bo->mem.mm_node;
+       if (bo->mem.mem_type == TTM_PL_VRAM &&
+           mm_node->start < bo->num_pages)
+               (void) ttm_bo_validate(bo, &vmw_sys_placement, false,
+                                      false, false);
+
        ret = ttm_bo_validate(bo, &ne_placement, false, false, false);
 
        /* Could probably bug on */