From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Paulo Zanoni <przanoni@gmail.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 4/8] drm: add generic ioctls to get/set properties on any object
Date: Fri, 30 Mar 2012 16:04:08 +0300 [thread overview]
Message-ID: <20120330130408.GA4917@intel.com> (raw)
In-Reply-To: <1333056446-3383-4-git-send-email-przanoni@gmail.com>
On Thu, Mar 29, 2012 at 06:27:22PM -0300, Paulo Zanoni wrote:
> From: Paulo Zanoni <paulo.r.zanoni@intel.com>
>
> Useless for connector properties (since they already have their own
> ioctls), but useful when we add properties to CRTCs, planes and other
> objects.
>
> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
> ---
> drivers/gpu/drm/drm_crtc.c | 180 ++++++++++++++++++++++++++++++++++++++++++++
> drivers/gpu/drm/drm_drv.c | 4 +-
> include/drm/drm.h | 2 +
> include/drm/drm_crtc.h | 13 +++
> include/drm/drm_mode.h | 15 ++++
> 5 files changed, 213 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 8800830..12f93e4 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -2832,6 +2832,56 @@ int drm_connector_property_get_value(struct drm_connector *connector,
> }
> EXPORT_SYMBOL(drm_connector_property_get_value);
>
> +void drm_object_attach_property(struct drm_mode_object *obj,
> + struct drm_property *property,
> + uint64_t init_val)
> +{
> + int i;
> +
> + for (i = 0; i < DRM_OBJECT_MAX_PROPERTY; i++) {
> + if (obj->properties->ids[i] == 0) {
> + obj->properties->ids[i] = property->base.id;
> + obj->properties->values[i] = init_val;
> + return;
> + }
> + }
> +
> + WARN(1, "Failed to attach object property\n");
> +}
> +EXPORT_SYMBOL(drm_object_attach_property);
> +
> +int drm_object_property_set_value(struct drm_mode_object *obj,
> + struct drm_property *property, uint64_t val)
> +{
> + int i;
> +
> + for (i = 0; i < DRM_OBJECT_MAX_PROPERTY; i++) {
> + if (obj->properties->ids[i] == property->base.id) {
> + obj->properties->values[i] = val;
> + return 0;
> + }
> + }
> +
> + return -EINVAL;
> +}
> +EXPORT_SYMBOL(drm_object_property_set_value);
> +
> +int drm_object_property_get_value(struct drm_mode_object *obj,
> + struct drm_property *property, uint64_t *val)
> +{
> + int i;
> +
> + for (i = 0; i < DRM_OBJECT_MAX_PROPERTY; i++) {
> + if (obj->properties->ids[i] == property->base.id) {
> + *val = obj->properties->values[i];
> + return 0;
> + }
> + }
> +
> + return -EINVAL;
> +}
> +EXPORT_SYMBOL(drm_object_property_get_value);
> +
> int drm_mode_getproperty_ioctl(struct drm_device *dev,
> void *data, struct drm_file *file_priv)
> {
> @@ -3107,6 +3157,136 @@ out:
> return ret;
> }
>
> +static int drm_mode_connector_set_obj_prop(struct drm_mode_object *obj,
> + struct drm_property *property,
> + uint64_t value)
> +{
> + int ret = -EINVAL;
> + struct drm_connector *connector = obj_to_connector(obj);
> +
> + /* Do DPMS ourselves */
> + if (property == connector->dev->mode_config.dpms_property) {
> + if (connector->funcs->dpms)
> + (*connector->funcs->dpms)(connector, (int)value);
> + ret = 0;
> + } else if (connector->funcs->set_property)
> + ret = connector->funcs->set_property(connector, property, value);
> +
> + /* store the property value if successful */
> + if (!ret)
> + drm_connector_property_set_value(connector, property, value);
> + return ret;
> +}
> +
> +int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
> + struct drm_file *file_priv)
> +{
> + struct drm_mode_obj_get_properties *arg = data;
> + struct drm_mode_object *obj;
> + int ret = 0;
> + int i;
> + int copied = 0;
> + int props_count = 0;
> + uint32_t __user *props_ptr;
> + uint64_t __user *prop_values_ptr;
> +
> + if (!drm_core_check_feature(dev, DRIVER_MODESET))
> + return -EINVAL;
> +
> + mutex_lock(&dev->mode_config.mutex);
> +
> + obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type);
> + if (!obj) {
> + ret = -EINVAL;
> + goto out;
> + }
> + if (!obj->properties) {
> + ret = -EINVAL;
> + goto out;
> + }
> +
> + /* Assume [ prop, 0, prop ] won't happen (if we ever delete properties,
> + * we need to remove the gap inside the array). */
> + for (props_count = 0; props_count < DRM_OBJECT_MAX_PROPERTY &&
> + obj->properties->ids[props_count] != 0; props_count++)
> + ;
How about adding obj->properties.count to avoid having to count every
time?
> +
> + /* This ioctl is called twice, once to determine how much space is
> + * needed, and the 2nd time to fill it. */
> + if ((arg->count_props >= props_count) && props_count) {
> + copied = 0;
> + props_ptr = (uint32_t __user *)(unsigned long)(arg->props_ptr);
> + prop_values_ptr = (uint64_t __user *)(unsigned long)
> + (arg->prop_values_ptr);
> + for (i = 0; i < props_count; i++) {
> + if (put_user(obj->properties->ids[i],
> + props_ptr + copied)) {
> + ret = -EFAULT;
> + goto out;
> + }
> + if (put_user(obj->properties->values[i],
> + prop_values_ptr + copied)) {
> + ret = -EFAULT;
> + goto out;
> + }
> + copied++;
> + }
> + }
> + arg->count_props = props_count;
> +out:
> + mutex_unlock(&dev->mode_config.mutex);
> + return ret;
> +}
> +
> +int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
> + struct drm_file *file_priv)
> +{
> + struct drm_mode_obj_set_property *arg = data;
> + struct drm_mode_object *arg_obj;
> + struct drm_mode_object *prop_obj;
> + struct drm_property *property;
> + int ret = -EINVAL;
> + int i;
> +
> + if (!drm_core_check_feature(dev, DRIVER_MODESET))
> + return -EINVAL;
> +
> + mutex_lock(&dev->mode_config.mutex);
> +
> + arg_obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type);
> + if (!arg_obj)
> + goto out;
> + if (!arg_obj->properties)
> + goto out;
> +
> + for (i = 0; i < DRM_OBJECT_MAX_PROPERTY; i++)
> + if (arg_obj->properties->ids[i] == arg->prop_id)
> + break;
> +
> + if (i == DRM_OBJECT_MAX_PROPERTY)
> + goto out;
> +
> + prop_obj = drm_mode_object_find(dev, arg->prop_id,
> + DRM_MODE_OBJECT_PROPERTY);
> + if (!prop_obj)
> + goto out;
> + property = obj_to_property(prop_obj);
> +
> + if (!drm_property_change_is_valid(property, arg->value))
> + goto out;
> +
> + switch (arg_obj->type) {
> + case DRM_MODE_OBJECT_CONNECTOR:
> + ret = drm_mode_connector_set_obj_prop(arg_obj, property,
> + arg->value);
> + break;
> + }
> +
> +out:
> + mutex_unlock(&dev->mode_config.mutex);
> + return ret;
> +}
> +
> int drm_mode_connector_attach_encoder(struct drm_connector *connector,
> struct drm_encoder *encoder)
> {
> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
> index 0b65fbc..18db86e 100644
> --- a/drivers/gpu/drm/drm_drv.c
> +++ b/drivers/gpu/drm/drm_drv.c
> @@ -159,7 +159,9 @@ static struct drm_ioctl_desc drm_ioctls[] = {
> DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
> DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
> DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
> - DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED)
> + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
> + DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
> + DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED)
Just add the trailing comma to the last line as well. Otherwise we keep
on having ugly diffs when new ioctls are added.
> };
>
> #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
--
Ville Syrjälä
Intel OTC
next prev parent reply other threads:[~2012-03-30 13:04 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-29 21:27 [PATCH 1/8] drm: add drm_property_change_is_valid Paulo Zanoni
2012-03-29 21:27 ` [PATCH 2/8] drm: WARN() when drm_connector_attach_property fails Paulo Zanoni
2012-03-29 21:49 ` Chris Wilson
2012-03-29 21:27 ` [PATCH 3/8] drm: create struct drm_object_properties and use it Paulo Zanoni
2012-03-30 2:41 ` Eugeni Dodonov
2012-03-30 12:52 ` Ville Syrjälä
2012-03-29 21:27 ` [PATCH 4/8] drm: add generic ioctls to get/set properties on any object Paulo Zanoni
2012-03-30 2:47 ` Eugeni Dodonov
2012-03-30 13:04 ` Ville Syrjälä [this message]
2012-03-29 21:27 ` [PATCH 5/8] drm: make the connector properties code use the object properties code Paulo Zanoni
2012-03-30 2:49 ` Eugeni Dodonov
2012-03-29 21:27 ` [PATCH 6/8] drm: add CRTC properties Paulo Zanoni
2012-03-29 21:27 ` [PATCH RFC 7/8] drm/i915: add 'rotation' CRTC property Paulo Zanoni
2012-03-29 21:27 ` [PATCH 8/8] drm/i915: add overscan compensation CRTC properties Paulo Zanoni
2012-03-30 2:38 ` [PATCH 1/8] drm: add drm_property_change_is_valid Eugeni Dodonov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120330130408.GA4917@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=paulo.r.zanoni@intel.com \
--cc=przanoni@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.