|
@@ -49,6 +49,7 @@ int vmw_dmabuf_pin_in_placement(struct vmw_private *dev_priv,
|
|
|
{
|
|
|
struct ttm_buffer_object *bo = &buf->base;
|
|
|
int ret;
|
|
|
+ uint32_t new_flags;
|
|
|
|
|
|
ret = ttm_write_lock(&dev_priv->reservation_sem, interruptible);
|
|
|
if (unlikely(ret != 0))
|
|
@@ -60,7 +61,12 @@ int vmw_dmabuf_pin_in_placement(struct vmw_private *dev_priv,
|
|
|
if (unlikely(ret != 0))
|
|
|
goto err;
|
|
|
|
|
|
- ret = ttm_bo_validate(bo, placement, interruptible, false);
|
|
|
+ if (buf->pin_count > 0)
|
|
|
+ ret = ttm_bo_mem_compat(placement, &bo->mem,
|
|
|
+ &new_flags) == true ? 0 : -EINVAL;
|
|
|
+ else
|
|
|
+ ret = ttm_bo_validate(bo, placement, interruptible, false);
|
|
|
+
|
|
|
if (!ret)
|
|
|
vmw_bo_pin_reserved(buf, true);
|
|
|
|
|
@@ -91,6 +97,7 @@ int vmw_dmabuf_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
|
|
|
{
|
|
|
struct ttm_buffer_object *bo = &buf->base;
|
|
|
int ret;
|
|
|
+ uint32_t new_flags;
|
|
|
|
|
|
ret = ttm_write_lock(&dev_priv->reservation_sem, interruptible);
|
|
|
if (unlikely(ret != 0))
|
|
@@ -102,6 +109,12 @@ int vmw_dmabuf_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
|
|
|
if (unlikely(ret != 0))
|
|
|
goto err;
|
|
|
|
|
|
+ if (buf->pin_count > 0) {
|
|
|
+ ret = ttm_bo_mem_compat(&vmw_vram_gmr_placement, &bo->mem,
|
|
|
+ &new_flags) == true ? 0 : -EINVAL;
|
|
|
+ goto out_unreserve;
|
|
|
+ }
|
|
|
+
|
|
|
ret = ttm_bo_validate(bo, &vmw_vram_gmr_placement, interruptible,
|
|
|
false);
|
|
|
if (likely(ret == 0) || ret == -ERESTARTSYS)
|
|
@@ -161,6 +174,7 @@ int vmw_dmabuf_pin_in_start_of_vram(struct vmw_private *dev_priv,
|
|
|
struct ttm_placement placement;
|
|
|
struct ttm_place place;
|
|
|
int ret = 0;
|
|
|
+ uint32_t new_flags;
|
|
|
|
|
|
place = vmw_vram_placement.placement[0];
|
|
|
place.lpfn = bo->num_pages;
|
|
@@ -185,10 +199,15 @@ int vmw_dmabuf_pin_in_start_of_vram(struct vmw_private *dev_priv,
|
|
|
*/
|
|
|
if (bo->mem.mem_type == TTM_PL_VRAM &&
|
|
|
bo->mem.start < bo->num_pages &&
|
|
|
- bo->mem.start > 0)
|
|
|
+ bo->mem.start > 0 &&
|
|
|
+ buf->pin_count == 0)
|
|
|
(void) ttm_bo_validate(bo, &vmw_sys_placement, false, false);
|
|
|
|
|
|
- ret = ttm_bo_validate(bo, &placement, interruptible, false);
|
|
|
+ if (buf->pin_count > 0)
|
|
|
+ ret = ttm_bo_mem_compat(&placement, &bo->mem,
|
|
|
+ &new_flags) == true ? 0 : -EINVAL;
|
|
|
+ else
|
|
|
+ ret = ttm_bo_validate(bo, &placement, interruptible, false);
|
|
|
|
|
|
/* For some reason we didn't end up at the start of vram */
|
|
|
WARN_ON(ret == 0 && bo->offset != 0);
|