aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_kms.c82
1 files changed, 18 insertions, 64 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index a2c0a95798f2..21228b3b1ed7 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -847,58 +847,6 @@ static void vmw_framebuffer_surface_destroy(struct drm_framebuffer *framebuffer)
847 kfree(vfbs); 847 kfree(vfbs);
848} 848}
849 849
850static int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
851 struct drm_file *file_priv,
852 unsigned flags, unsigned color,
853 struct drm_clip_rect *clips,
854 unsigned num_clips)
855{
856 struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
857 struct vmw_framebuffer_surface *vfbs =
858 vmw_framebuffer_to_vfbs(framebuffer);
859 struct drm_clip_rect norect;
860 int ret, inc = 1;
861
862 /* Legacy Display Unit does not support 3D */
863 if (dev_priv->active_display_unit == vmw_du_legacy)
864 return -EINVAL;
865
866 drm_modeset_lock_all(dev_priv->dev);
867
868 ret = ttm_read_lock(&dev_priv->reservation_sem, true);
869 if (unlikely(ret != 0)) {
870 drm_modeset_unlock_all(dev_priv->dev);
871 return ret;
872 }
873
874 if (!num_clips) {
875 num_clips = 1;
876 clips = &norect;
877 norect.x1 = norect.y1 = 0;
878 norect.x2 = framebuffer->width;
879 norect.y2 = framebuffer->height;
880 } else if (flags & DRM_MODE_FB_DIRTY_ANNOTATE_COPY) {
881 num_clips /= 2;
882 inc = 2; /* skip source rects */
883 }
884
885 if (dev_priv->active_display_unit == vmw_du_screen_object)
886 ret = vmw_kms_sou_do_surface_dirty(dev_priv, &vfbs->base,
887 clips, NULL, NULL, 0, 0,
888 num_clips, inc, NULL, NULL);
889 else
890 ret = vmw_kms_stdu_surface_dirty(dev_priv, &vfbs->base,
891 clips, NULL, NULL, 0, 0,
892 num_clips, inc, NULL, NULL);
893
894 vmw_fifo_flush(dev_priv, false);
895 ttm_read_unlock(&dev_priv->reservation_sem);
896
897 drm_modeset_unlock_all(dev_priv->dev);
898
899 return 0;
900}
901
902/** 850/**
903 * vmw_kms_readback - Perform a readback from the screen system to 851 * vmw_kms_readback - Perform a readback from the screen system to
904 * a buffer-object backed framebuffer. 852 * a buffer-object backed framebuffer.
@@ -942,7 +890,7 @@ int vmw_kms_readback(struct vmw_private *dev_priv,
942 890
943static const struct drm_framebuffer_funcs vmw_framebuffer_surface_funcs = { 891static const struct drm_framebuffer_funcs vmw_framebuffer_surface_funcs = {
944 .destroy = vmw_framebuffer_surface_destroy, 892 .destroy = vmw_framebuffer_surface_destroy,
945 .dirty = vmw_framebuffer_surface_dirty, 893 .dirty = drm_atomic_helper_dirtyfb,
946}; 894};
947 895
948static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv, 896static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
@@ -1085,16 +1033,6 @@ static int vmw_framebuffer_bo_dirty(struct drm_framebuffer *framebuffer,
1085 } 1033 }
1086 1034
1087 switch (dev_priv->active_display_unit) { 1035 switch (dev_priv->active_display_unit) {
1088 case vmw_du_screen_target:
1089 ret = vmw_kms_stdu_dma(dev_priv, NULL, &vfbd->base, NULL,
1090 clips, NULL, num_clips, increment,
1091 true, true, NULL);
1092 break;
1093 case vmw_du_screen_object:
1094 ret = vmw_kms_sou_do_bo_dirty(dev_priv, &vfbd->base,
1095 clips, NULL, num_clips,
1096 increment, true, NULL, NULL);
1097 break;
1098 case vmw_du_legacy: 1036 case vmw_du_legacy:
1099 ret = vmw_kms_ldu_do_bo_dirty(dev_priv, &vfbd->base, 0, 0, 1037 ret = vmw_kms_ldu_do_bo_dirty(dev_priv, &vfbd->base, 0, 0,
1100 clips, num_clips, increment); 1038 clips, num_clips, increment);
@@ -1113,9 +1051,25 @@ static int vmw_framebuffer_bo_dirty(struct drm_framebuffer *framebuffer,
1113 return ret; 1051 return ret;
1114} 1052}
1115 1053
1054static int vmw_framebuffer_bo_dirty_ext(struct drm_framebuffer *framebuffer,
1055 struct drm_file *file_priv,
1056 unsigned int flags, unsigned int color,
1057 struct drm_clip_rect *clips,
1058 unsigned int num_clips)
1059{
1060 struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
1061
1062 if (dev_priv->active_display_unit == vmw_du_legacy)
1063 return vmw_framebuffer_bo_dirty(framebuffer, file_priv, flags,
1064 color, clips, num_clips);
1065
1066 return drm_atomic_helper_dirtyfb(framebuffer, file_priv, flags, color,
1067 clips, num_clips);
1068}
1069
1116static const struct drm_framebuffer_funcs vmw_framebuffer_bo_funcs = { 1070static const struct drm_framebuffer_funcs vmw_framebuffer_bo_funcs = {
1117 .destroy = vmw_framebuffer_bo_destroy, 1071 .destroy = vmw_framebuffer_bo_destroy,
1118 .dirty = vmw_framebuffer_bo_dirty, 1072 .dirty = vmw_framebuffer_bo_dirty_ext,
1119}; 1073};
1120 1074
1121/** 1075/**