diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 41 |
3 files changed, 13 insertions, 36 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index 0545740b3724..641294aef165 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
@@ -697,7 +697,6 @@ vmw_du_plane_duplicate_state(struct drm_plane *plane) | |||
697 | vps->pinned = 0; | 697 | vps->pinned = 0; |
698 | 698 | ||
699 | /* Mapping is managed by prepare_fb/cleanup_fb */ | 699 | /* Mapping is managed by prepare_fb/cleanup_fb */ |
700 | memset(&vps->guest_map, 0, sizeof(vps->guest_map)); | ||
701 | memset(&vps->host_map, 0, sizeof(vps->host_map)); | 700 | memset(&vps->host_map, 0, sizeof(vps->host_map)); |
702 | vps->cpp = 0; | 701 | vps->cpp = 0; |
703 | 702 | ||
@@ -760,11 +759,6 @@ vmw_du_plane_destroy_state(struct drm_plane *plane, | |||
760 | 759 | ||
761 | 760 | ||
762 | /* Should have been freed by cleanup_fb */ | 761 | /* Should have been freed by cleanup_fb */ |
763 | if (vps->guest_map.virtual) { | ||
764 | DRM_ERROR("Guest mapping not freed\n"); | ||
765 | ttm_bo_kunmap(&vps->guest_map); | ||
766 | } | ||
767 | |||
768 | if (vps->host_map.virtual) { | 762 | if (vps->host_map.virtual) { |
769 | DRM_ERROR("Host mapping not freed\n"); | 763 | DRM_ERROR("Host mapping not freed\n"); |
770 | ttm_bo_kunmap(&vps->host_map); | 764 | ttm_bo_kunmap(&vps->host_map); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h index ff9c8389ff21..cd9da2dd79af 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | |||
@@ -175,7 +175,7 @@ struct vmw_plane_state { | |||
175 | int pinned; | 175 | int pinned; |
176 | 176 | ||
177 | /* For CPU Blit */ | 177 | /* For CPU Blit */ |
178 | struct ttm_bo_kmap_obj host_map, guest_map; | 178 | struct ttm_bo_kmap_obj host_map; |
179 | unsigned int cpp; | 179 | unsigned int cpp; |
180 | }; | 180 | }; |
181 | 181 | ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c index 90b5437fd787..b68d74888ab1 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | |||
@@ -114,7 +114,7 @@ struct vmw_screen_target_display_unit { | |||
114 | bool defined; | 114 | bool defined; |
115 | 115 | ||
116 | /* For CPU Blit */ | 116 | /* For CPU Blit */ |
117 | struct ttm_bo_kmap_obj host_map, guest_map; | 117 | struct ttm_bo_kmap_obj host_map; |
118 | unsigned int cpp; | 118 | unsigned int cpp; |
119 | }; | 119 | }; |
120 | 120 | ||
@@ -695,7 +695,8 @@ static void vmw_stdu_dmabuf_cpu_commit(struct vmw_kms_dirty *dirty) | |||
695 | s32 src_pitch, dst_pitch; | 695 | s32 src_pitch, dst_pitch; |
696 | u8 *src, *dst; | 696 | u8 *src, *dst; |
697 | bool not_used; | 697 | bool not_used; |
698 | 698 | struct ttm_bo_kmap_obj guest_map; | |
699 | int ret; | ||
699 | 700 | ||
700 | if (!dirty->num_hits) | 701 | if (!dirty->num_hits) |
701 | return; | 702 | return; |
@@ -706,6 +707,13 @@ static void vmw_stdu_dmabuf_cpu_commit(struct vmw_kms_dirty *dirty) | |||
706 | if (width == 0 || height == 0) | 707 | if (width == 0 || height == 0) |
707 | return; | 708 | return; |
708 | 709 | ||
710 | ret = ttm_bo_kmap(&ddirty->buf->base, 0, ddirty->buf->base.num_pages, | ||
711 | &guest_map); | ||
712 | if (ret) { | ||
713 | DRM_ERROR("Failed mapping framebuffer for blit: %d\n", | ||
714 | ret); | ||
715 | goto out_cleanup; | ||
716 | } | ||
709 | 717 | ||
710 | /* Assume we are blitting from Host (display_srf) to Guest (dmabuf) */ | 718 | /* Assume we are blitting from Host (display_srf) to Guest (dmabuf) */ |
711 | src_pitch = stdu->display_srf->base_size.width * stdu->cpp; | 719 | src_pitch = stdu->display_srf->base_size.width * stdu->cpp; |
@@ -713,7 +721,7 @@ static void vmw_stdu_dmabuf_cpu_commit(struct vmw_kms_dirty *dirty) | |||
713 | src += ddirty->top * src_pitch + ddirty->left * stdu->cpp; | 721 | src += ddirty->top * src_pitch + ddirty->left * stdu->cpp; |
714 | 722 | ||
715 | dst_pitch = ddirty->pitch; | 723 | dst_pitch = ddirty->pitch; |
716 | dst = ttm_kmap_obj_virtual(&stdu->guest_map, ¬_used); | 724 | dst = ttm_kmap_obj_virtual(&guest_map, ¬_used); |
717 | dst += ddirty->fb_top * dst_pitch + ddirty->fb_left * stdu->cpp; | 725 | dst += ddirty->fb_top * dst_pitch + ddirty->fb_left * stdu->cpp; |
718 | 726 | ||
719 | 727 | ||
@@ -772,6 +780,7 @@ static void vmw_stdu_dmabuf_cpu_commit(struct vmw_kms_dirty *dirty) | |||
772 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); | 780 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); |
773 | } | 781 | } |
774 | 782 | ||
783 | ttm_bo_kunmap(&guest_map); | ||
775 | out_cleanup: | 784 | out_cleanup: |
776 | ddirty->left = ddirty->top = ddirty->fb_left = ddirty->fb_top = S32_MAX; | 785 | ddirty->left = ddirty->top = ddirty->fb_left = ddirty->fb_top = S32_MAX; |
777 | ddirty->right = ddirty->bottom = S32_MIN; | 786 | ddirty->right = ddirty->bottom = S32_MIN; |
@@ -1109,9 +1118,6 @@ vmw_stdu_primary_plane_cleanup_fb(struct drm_plane *plane, | |||
1109 | { | 1118 | { |
1110 | struct vmw_plane_state *vps = vmw_plane_state_to_vps(old_state); | 1119 | struct vmw_plane_state *vps = vmw_plane_state_to_vps(old_state); |
1111 | 1120 | ||
1112 | if (vps->guest_map.virtual) | ||
1113 | ttm_bo_kunmap(&vps->guest_map); | ||
1114 | |||
1115 | if (vps->host_map.virtual) | 1121 | if (vps->host_map.virtual) |
1116 | ttm_bo_kunmap(&vps->host_map); | 1122 | ttm_bo_kunmap(&vps->host_map); |
1117 | 1123 | ||
@@ -1277,33 +1283,11 @@ vmw_stdu_primary_plane_prepare_fb(struct drm_plane *plane, | |||
1277 | */ | 1283 | */ |
1278 | if (vps->content_fb_type == SEPARATE_DMA && | 1284 | if (vps->content_fb_type == SEPARATE_DMA && |
1279 | !(dev_priv->capabilities & SVGA_CAP_3D)) { | 1285 | !(dev_priv->capabilities & SVGA_CAP_3D)) { |
1280 | |||
1281 | struct vmw_framebuffer_dmabuf *new_vfbd; | ||
1282 | |||
1283 | new_vfbd = vmw_framebuffer_to_vfbd(new_fb); | ||
1284 | |||
1285 | ret = ttm_bo_reserve(&new_vfbd->buffer->base, false, false, | ||
1286 | NULL); | ||
1287 | if (ret) | ||
1288 | goto out_srf_unpin; | ||
1289 | |||
1290 | ret = ttm_bo_kmap(&new_vfbd->buffer->base, 0, | ||
1291 | new_vfbd->buffer->base.num_pages, | ||
1292 | &vps->guest_map); | ||
1293 | |||
1294 | ttm_bo_unreserve(&new_vfbd->buffer->base); | ||
1295 | |||
1296 | if (ret) { | ||
1297 | DRM_ERROR("Failed to map content buffer to CPU\n"); | ||
1298 | goto out_srf_unpin; | ||
1299 | } | ||
1300 | |||
1301 | ret = ttm_bo_kmap(&vps->surf->res.backup->base, 0, | 1286 | ret = ttm_bo_kmap(&vps->surf->res.backup->base, 0, |
1302 | vps->surf->res.backup->base.num_pages, | 1287 | vps->surf->res.backup->base.num_pages, |
1303 | &vps->host_map); | 1288 | &vps->host_map); |
1304 | if (ret) { | 1289 | if (ret) { |
1305 | DRM_ERROR("Failed to map display buffer to CPU\n"); | 1290 | DRM_ERROR("Failed to map display buffer to CPU\n"); |
1306 | ttm_bo_kunmap(&vps->guest_map); | ||
1307 | goto out_srf_unpin; | 1291 | goto out_srf_unpin; |
1308 | } | 1292 | } |
1309 | 1293 | ||
@@ -1350,7 +1334,6 @@ vmw_stdu_primary_plane_atomic_update(struct drm_plane *plane, | |||
1350 | stdu->display_srf = vps->surf; | 1334 | stdu->display_srf = vps->surf; |
1351 | stdu->content_fb_type = vps->content_fb_type; | 1335 | stdu->content_fb_type = vps->content_fb_type; |
1352 | stdu->cpp = vps->cpp; | 1336 | stdu->cpp = vps->cpp; |
1353 | memcpy(&stdu->guest_map, &vps->guest_map, sizeof(vps->guest_map)); | ||
1354 | memcpy(&stdu->host_map, &vps->host_map, sizeof(vps->host_map)); | 1337 | memcpy(&stdu->host_map, &vps->host_map, sizeof(vps->host_map)); |
1355 | 1338 | ||
1356 | if (!stdu->defined) | 1339 | if (!stdu->defined) |