950-0354-drm-vc4-Advertise-supported-modifiers-for-planes.patch 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. From cc6f4a74861a987e8d95aa36f2d141c777e30425 Mon Sep 17 00:00:00 2001
  2. From: Daniel Stone <[email protected]>
  3. Date: Tue, 8 Aug 2017 17:44:48 +0100
  4. Subject: [PATCH 354/454] drm/vc4: Advertise supported modifiers for planes
  5. The IN_FORMATS blob allows the kernel to advertise to userspace which
  6. format/modifier combinations are supported, per plane. Use this to
  7. advertise that we support both T_TILED and linear.
  8. v2:
  9. - Only advertise T_TILED for RGB (Eric)
  10. - Actually turn on allow_fb_modifiers (Eric)
  11. Signed-off-by: Daniel Stone <[email protected]>
  12. Signed-off-by: Eric Anholt <[email protected]>
  13. Reviewed-by: Eric Anholt <[email protected]>
  14. Link: https://patchwork.freedesktop.org/patch/170828/
  15. (cherry picked from commit 423ad7b3cbd1158d080e20119a7a5f93a085a486)
  16. ---
  17. drivers/gpu/drm/vc4/vc4_kms.c | 1 +
  18. drivers/gpu/drm/vc4/vc4_plane.c | 34 ++++++++++++++++++++++++++++++++-
  19. 2 files changed, 34 insertions(+), 1 deletion(-)
  20. --- a/drivers/gpu/drm/vc4/vc4_kms.c
  21. +++ b/drivers/gpu/drm/vc4/vc4_kms.c
  22. @@ -222,6 +222,7 @@ int vc4_kms_load(struct drm_device *dev)
  23. dev->mode_config.funcs = &vc4_mode_funcs;
  24. dev->mode_config.preferred_depth = 24;
  25. dev->mode_config.async_page_flip = true;
  26. + dev->mode_config.allow_fb_modifiers = true;
  27. drm_mode_config_reset(dev);
  28. --- a/drivers/gpu/drm/vc4/vc4_plane.c
  29. +++ b/drivers/gpu/drm/vc4/vc4_plane.c
  30. @@ -870,6 +870,32 @@ out:
  31. ctx);
  32. }
  33. +static bool vc4_format_mod_supported(struct drm_plane *plane,
  34. + uint32_t format,
  35. + uint64_t modifier)
  36. +{
  37. + /* Support T_TILING for RGB formats only. */
  38. + switch (format) {
  39. + case DRM_FORMAT_XRGB8888:
  40. + case DRM_FORMAT_ARGB8888:
  41. + case DRM_FORMAT_ABGR8888:
  42. + case DRM_FORMAT_XBGR8888:
  43. + case DRM_FORMAT_RGB565:
  44. + case DRM_FORMAT_BGR565:
  45. + case DRM_FORMAT_ARGB1555:
  46. + case DRM_FORMAT_XRGB1555:
  47. + return true;
  48. + case DRM_FORMAT_YUV422:
  49. + case DRM_FORMAT_YVU422:
  50. + case DRM_FORMAT_YUV420:
  51. + case DRM_FORMAT_YVU420:
  52. + case DRM_FORMAT_NV12:
  53. + case DRM_FORMAT_NV16:
  54. + default:
  55. + return (modifier == DRM_FORMAT_MOD_LINEAR);
  56. + }
  57. +}
  58. +
  59. static const struct drm_plane_funcs vc4_plane_funcs = {
  60. .update_plane = vc4_update_plane,
  61. .disable_plane = drm_atomic_helper_disable_plane,
  62. @@ -878,6 +904,7 @@ static const struct drm_plane_funcs vc4_
  63. .reset = vc4_plane_reset,
  64. .atomic_duplicate_state = vc4_plane_duplicate_state,
  65. .atomic_destroy_state = vc4_plane_destroy_state,
  66. + .format_mod_supported = vc4_format_mod_supported,
  67. };
  68. struct drm_plane *vc4_plane_init(struct drm_device *dev,
  69. @@ -889,6 +916,11 @@ struct drm_plane *vc4_plane_init(struct
  70. u32 num_formats = 0;
  71. int ret = 0;
  72. unsigned i;
  73. + static const uint64_t modifiers[] = {
  74. + DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED,
  75. + DRM_FORMAT_MOD_LINEAR,
  76. + DRM_FORMAT_MOD_INVALID
  77. + };
  78. vc4_plane = devm_kzalloc(dev->dev, sizeof(*vc4_plane),
  79. GFP_KERNEL);
  80. @@ -909,7 +941,7 @@ struct drm_plane *vc4_plane_init(struct
  81. ret = drm_universal_plane_init(dev, plane, 0,
  82. &vc4_plane_funcs,
  83. formats, num_formats,
  84. - NULL, type, NULL);
  85. + modifiers, type, NULL);
  86. drm_plane_helper_add(plane, &vc4_plane_helper_funcs);