diff options
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 82 |
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 | ||
| 850 | static 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 | ||
| 943 | static const struct drm_framebuffer_funcs vmw_framebuffer_surface_funcs = { | 891 | static 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 | ||
| 948 | static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv, | 896 | static 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 | ||
| 1054 | static 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 | |||
| 1116 | static const struct drm_framebuffer_funcs vmw_framebuffer_bo_funcs = { | 1070 | static 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 | /** |
