提交 d67b6a20 编写于 作者: L Liviu Dudau

drm: writeback: Add client capability for exposing writeback connectors

Due to the fact that writeback connectors behave in a special way
in DRM (they always report being disconnected) we might confuse some
userspace. Add a client capability for writeback connectors that will
filter them out for clients that don't understand the capability.

Changelog:
 - only accept the capability if the client has already set the
DRM_CLIENT_CAP_ATOMIC one.

Cc: Sean Paul <seanpaul@chromium.org>
Cc: Brian Starkey <brian.starkey@arm.com>
Signed-off-by: NLiviu Dudau <liviu.dudau@arm.com>
Reviewed-by: NEric Anholt <eric@anholt.net>
Reviewed-by: NBrian Starkey <brian.starkey@arm.com>
Link: https://patchwork.freedesktop.org/patch/229038/
上级 b13cc8dd
...@@ -334,6 +334,13 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv) ...@@ -334,6 +334,13 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
return -EINVAL; return -EINVAL;
file_priv->aspect_ratio_allowed = req->value; file_priv->aspect_ratio_allowed = req->value;
break; break;
case DRM_CLIENT_CAP_WRITEBACK_CONNECTORS:
if (!file_priv->atomic)
return -EINVAL;
if (req->value > 1)
return -EINVAL;
file_priv->writeback_connectors = req->value;
break;
default: default:
return -EINVAL; return -EINVAL;
} }
......
...@@ -145,6 +145,11 @@ int drm_mode_getresources(struct drm_device *dev, void *data, ...@@ -145,6 +145,11 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
count = 0; count = 0;
connector_id = u64_to_user_ptr(card_res->connector_id_ptr); connector_id = u64_to_user_ptr(card_res->connector_id_ptr);
drm_for_each_connector_iter(connector, &conn_iter) { drm_for_each_connector_iter(connector, &conn_iter) {
/* only expose writeback connectors if userspace understands them */
if (!file_priv->writeback_connectors &&
(connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK))
continue;
if (drm_lease_held(file_priv, connector->base.id)) { if (drm_lease_held(file_priv, connector->base.id)) {
if (count < card_res->count_connectors && if (count < card_res->count_connectors &&
put_user(connector->base.id, connector_id + count)) { put_user(connector->base.id, connector_id + count)) {
......
...@@ -192,6 +192,13 @@ struct drm_file { ...@@ -192,6 +192,13 @@ struct drm_file {
*/ */
unsigned aspect_ratio_allowed:1; unsigned aspect_ratio_allowed:1;
/**
* @writeback_connectors:
*
* True if client understands writeback connectors
*/
unsigned writeback_connectors:1;
/** /**
* @is_master: * @is_master:
* *
......
...@@ -687,6 +687,15 @@ struct drm_get_cap { ...@@ -687,6 +687,15 @@ struct drm_get_cap {
*/ */
#define DRM_CLIENT_CAP_ASPECT_RATIO 4 #define DRM_CLIENT_CAP_ASPECT_RATIO 4
/**
* DRM_CLIENT_CAP_WRITEBACK_CONNECTORS
*
* If set to 1, the DRM core will expose special connectors to be used for
* writing back to memory the scene setup in the commit. Depends on client
* also supporting DRM_CLIENT_CAP_ATOMIC
*/
#define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5
/** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ /** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
struct drm_set_client_cap { struct drm_set_client_cap {
__u64 capability; __u64 capability;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册