[PATCH 06/13] drm: add atomic hook to read property plus helper

Rob Clark robdclark at gmail.com
Wed Dec 17 06:12:31 PST 2014


On Wed, Dec 17, 2014 at 9:02 AM, Daniel Vetter <daniel at ffwll.ch> wrote:
> On Tue, Dec 16, 2014 at 06:05:34PM -0500, Rob Clark wrote:
>> Once a driver is using atomic helpers for modeset, the next step is to
>> switch over to atomic properties.  To do this, plug in the helper
>> function to your modeconfig funcs and be sure to implement the plane/
>> crtc/connector atomic_{get,set}_property vfuncs for any of your mode-
>> objects which have driver custom properties.
>>
>> Signed-off-by: Rob Clark <robdclark at gmail.com>
>> ---
>>  drivers/gpu/drm/drm_atomic_helper.c | 46 +++++++++++++++++++++++++++++++++++++
>>  drivers/gpu/drm/drm_crtc.c          |  9 ++++++++
>>  include/drm/drm_atomic_helper.h     |  2 ++
>>  include/drm/drm_crtc.h              |  3 +++
>>  4 files changed, 60 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
>> index d42fdb1..1a1ab34 100644
>> --- a/drivers/gpu/drm/drm_atomic_helper.c
>> +++ b/drivers/gpu/drm/drm_atomic_helper.c
>> @@ -1703,6 +1703,52 @@ backoff:
>>  EXPORT_SYMBOL(drm_atomic_helper_connector_set_property);
>>
>>  /**
>> + * drm_atomic_helper_get_property - helper to read atomic property
>> + * @obj: drm mode object whose property to read
>> + * @property: the property to read
>> + * @val: the read value, returned by reference
>> + *
>> + * RETURNS:
>> + * Zero on success, error code on failure
>> + */
>> +int drm_atomic_helper_get_property(struct drm_mode_object *obj,
>> +             struct drm_property *property, uint64_t *val)
>> +{
>> +     struct drm_device *dev = property->dev;
>> +     int ret;
>> +
>> +     switch (obj->type) {
>> +     case DRM_MODE_OBJECT_CONNECTOR: {
>> +             struct drm_connector *connector = obj_to_connector(obj);
>> +             WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
>> +             ret = connector->funcs->atomic_get_property(connector,
>> +                             connector->state, property, val);
>
> Shouldn't we use the get helpers introduced in previous patches here? For
> legacy support we definitely want old core stuff like dpms to keep
> working. Of course that means all the new atomic properties won't get
> magically filtered out. But I think we need to hide them explicitly
> anyway, e.g. with a new DRM_MODE_PROP_ATOMIC and checking for that in
> legacy paths.

bleh, you are right.. and they did at one point use the helpers.. but
somehow in my squash/rebase/juggle act I lost that :-(

But I am still not a huge fan of hiding props for atomic drivers via
legacy getprop/setprop interfaces.. if nothing else it will prevent
them from showing up in modetest.  And it seems kind of inconsistent
and unnecessary.

BR,
-R

> -Daniel
>
>> +             break;
>> +     }
>> +     case DRM_MODE_OBJECT_CRTC: {
>> +             struct drm_crtc *crtc = obj_to_crtc(obj);
>> +             WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
>> +             ret = crtc->funcs->atomic_get_property(crtc,
>> +                             crtc->state, property, val);
>> +             break;
>> +     }
>> +     case DRM_MODE_OBJECT_PLANE: {
>> +             struct drm_plane *plane = obj_to_plane(obj);
>> +             WARN_ON(!drm_modeset_is_locked(&plane->mutex));
>> +             ret = plane->funcs->atomic_get_property(plane,
>> +                             plane->state, property, val);
>> +             break;
>> +     }
>> +     default:
>> +             ret = -EINVAL;
>> +             break;
>> +     }
>> +
>> +     return ret;
>> +}
>> +EXPORT_SYMBOL(drm_atomic_helper_get_property);
>> +
>> +/**
>>   * drm_atomic_helper_page_flip - execute a legacy page flip
>>   * @crtc: DRM crtc
>>   * @fb: DRM framebuffer
>> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
>> index 481bb25..57cd950 100644
>> --- a/drivers/gpu/drm/drm_crtc.c
>> +++ b/drivers/gpu/drm/drm_crtc.c
>> @@ -3878,8 +3878,17 @@ 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)
>>  {
>> +     struct drm_mode_config *config = &property->dev->mode_config;
>>       int i;
>>
>> +     /* read-only properties bypass atomic mechanism and still store
>> +      * their value in obj->properties->values[].. mostly to avoid
>> +      * having to deal w/ EDID and similar props in atomic paths:
>> +      */
>> +     if (config->funcs->atomic_get_property &&
>> +                     !(property->flags & DRM_MODE_PROP_IMMUTABLE))
>> +             return config->funcs->atomic_get_property(obj, property, val);
>> +
>>       for (i = 0; i < obj->properties->count; i++) {
>>               if (obj->properties->properties[i] == property) {
>>                       *val = obj->properties->values[i];
>> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
>> index f956b41..5e72b82 100644
>> --- a/include/drm/drm_atomic_helper.h
>> +++ b/include/drm/drm_atomic_helper.h
>> @@ -74,6 +74,8 @@ int drm_atomic_helper_plane_set_property(struct drm_plane *plane,
>>  int drm_atomic_helper_connector_set_property(struct drm_connector *connector,
>>                                       struct drm_property *property,
>>                                       uint64_t val);
>> +int drm_atomic_helper_get_property(struct drm_mode_object *obj,
>> +                        struct drm_property *property, uint64_t *val);
>>  int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
>>                               struct drm_framebuffer *fb,
>>                               struct drm_pending_vblank_event *event,
>> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
>> index e6cfdaf..ca8ba72 100644
>> --- a/include/drm/drm_crtc.h
>> +++ b/include/drm/drm_crtc.h
>> @@ -941,6 +941,7 @@ struct drm_mode_set {
>>   * struct drm_mode_config_funcs - basic driver provided mode setting functions
>>   * @fb_create: create a new framebuffer object
>>   * @output_poll_changed: function to handle output configuration changes
>> + * @atomic_get_property: atomic way to read property value
>>   * @atomic_check: check whether a give atomic state update is possible
>>   * @atomic_commit: commit an atomic state update previously verified with
>>   *   atomic_check()
>> @@ -954,6 +955,8 @@ struct drm_mode_config_funcs {
>>                                            struct drm_mode_fb_cmd2 *mode_cmd);
>>       void (*output_poll_changed)(struct drm_device *dev);
>>
>> +     int (*atomic_get_property)(struct drm_mode_object *obj,
>> +                             struct drm_property *property, uint64_t *val);
>>       int (*atomic_check)(struct drm_device *dev,
>>                           struct drm_atomic_state *a);
>>       int (*atomic_commit)(struct drm_device *dev,
>> --
>> 2.1.0
>>
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the dri-devel mailing list