To enable aspect-ratio support in DRM, blindly exposing the aspect ratio information along with mode, can break things in existing non-atomic user-spaces which have no intention or support to use this aspect ratio information. To avoid this, a new drm client cap is required to enable a non-atomic user-space to advertise if it supports modes with aspect-ratio. Based on this cap value, the kernel will take a call on exposing the aspect ratio info in modes or not. This patch adds the client cap for aspect-ratio. Since no atomic-userspaces blow up on receiving aspect-ratio information, the client cap for aspect-ratio is always enabled for atomic clients. Cc: Ville Syrjala <ville.syrjala@linux.intel.com> Cc: Shashank Sharma <shashank.sharma@intel.com> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> V3: rebase V4: As suggested by Marteen Lankhorst modified the commit message explaining the need to use the DRM cap for aspect-ratio. Also, tweaked the comment lines in the code for better understanding and clarity, as recommended by Shashank Sharma. V5: rebase V6: rebase V7: rebase V8: rebase V9: rebase V10: rebase V11: rebase V12: As suggested by Daniel Vetter and Ville Syrjala, always enable aspect-ratio client cap for atomic userspaces, if no atomic userspace breaks on aspect-ratio bits. V13: rebase V14: rebase
Unified · Split
| @@ -324,6 +324,15 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv) · 323 unmodified lines | |||
| 324 | return -EINVAL; | 324 | return -EINVAL; |
| 325 | file_priv->atomic = req->value; | 325 | file_priv->atomic = req->value; |
| 326 | file_priv->universal_planes = req->value; | 326 | file_priv->universal_planes = req->value; |
| 327 | /* | ||
| 328 | * No atomic user-space blows up on aspect ratio mode bits. | ||
| 329 | */ | ||
| 330 | file_priv->aspect_ratio_allowed = req->value; | ||
| 331 | break; | ||
| 332 | case DRM_CLIENT_CAP_ASPECT_RATIO: | ||
| 333 | if (req->value > 1) | ||
| 334 | return -EINVAL; | ||
| 335 | file_priv->aspect_ratio_allowed = req->value; | ||
| 327 | break; | 336 | break; |
| 328 | default: | 337 | default: |
| 329 | return -EINVAL; | 338 | return -EINVAL; |
| @@ -180,6 +180,14 @@ struct drm_file { · 179 unmodified lines | |||
| 180 | /** @atomic: True if client understands atomic properties. */ | 180 | /** @atomic: True if client understands atomic properties. */ |
| 181 | unsigned atomic:1; | 181 | unsigned atomic:1; |
| 182 | 182 | ||
| 183 | /** | ||
| 184 | * @aspect_ratio_allowed: | ||
| 185 | * | ||
| 186 | * True, if client can handle picture aspect ratios, and has requested | ||
| 187 | * to pass this information along with the mode. | ||
| 188 | */ | ||
| 189 | unsigned aspect_ratio_allowed:1; | ||
| 190 | |||
| 183 | /** | 191 | /** |
| 184 | * @is_master: | 192 | * @is_master: |
| 185 | * | 193 | * |
| @@ -680,6 +680,13 @@ struct drm_get_cap { · 679 unmodified lines | |||
| 680 | */ | 680 | */ |
| 681 | #define DRM_CLIENT_CAP_ATOMIC 3 | 681 | #define DRM_CLIENT_CAP_ATOMIC 3 |
| 682 | 682 | ||
| 683 | /** | ||
| 684 | * DRM_CLIENT_CAP_ASPECT_RATIO | ||
| 685 | * | ||
| 686 | * If set to 1, the DRM core will provide aspect ratio information in modes. | ||
| 687 | */ | ||
| 688 | #define DRM_CLIENT_CAP_ASPECT_RATIO 4 | ||
| 689 | |||
| 683 | /** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ | 690 | /** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ |
| 684 | struct drm_set_client_cap { | 691 | struct drm_set_client_cap { |
| 685 | __u64 capability; | 692 | __u64 capability; |