[Intel-gfx] [PATCH v6 02/12] drm/atomic: Add support for custom scaling mode properties, v2
Daniel Vetter
daniel at ffwll.ch
Tue May 2 09:44:02 UTC 2017
On Mon, May 01, 2017 at 03:37:54PM +0200, Maarten Lankhorst wrote:
> Some connectors may not allow all scaling mode properties, this function will allow
> creating the scaling mode property with only the supported subset. It also wires up
> this state for atomic.
>
> This will make it possible to convert i915 connectors to atomic.
>
> Changes since v1:
> - Add DRM_MODE_PROP_ENUM flag to drm_property_create
> - Use the correct index in drm_property_add_enum.
> - Add DocBook for function (Sean Paul).
> - Warn if less than 2 valid scaling modes are passed.
> - Remove level of indent. (Sean Paul)
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> ---
> drivers/gpu/drm/drm_atomic.c | 4 +++
> drivers/gpu/drm/drm_connector.c | 58 +++++++++++++++++++++++++++++++++++++++++
> include/drm/drm_connector.h | 10 +++++++
> 3 files changed, 72 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> index 77bb36e956db..c7f91dcebbe9 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -1125,6 +1125,8 @@ int drm_atomic_connector_set_property(struct drm_connector *connector,
> state->link_status = val;
> } else if (property == config->aspect_ratio_property) {
> state->picture_aspect_ratio = val;
> + } else if (property == connector->scaling_mode_property) {
> + state->scaling_mode = val;
Can't we still handle mode_config->scaling_mode_property as fallback?
Seems a lot more consistent to me ...
> } else if (connector->funcs->atomic_set_property) {
> return connector->funcs->atomic_set_property(connector,
> state, property, val);
> @@ -1203,6 +1205,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
> *val = state->link_status;
> } else if (property == config->aspect_ratio_property) {
> *val = state->picture_aspect_ratio;
> + } else if (property == connector->scaling_mode_property) {
> + *val = state->scaling_mode;
> } else if (connector->funcs->atomic_get_property) {
> return connector->funcs->atomic_get_property(connector,
> state, property, val);
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 9f847615ac74..b3912f2e48c6 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -961,6 +961,64 @@ int drm_mode_create_scaling_mode_property(struct drm_device *dev)
> EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
>
> /**
> + * drm_mode_connector_attach_scaling_mode_property - attach atomic scaling mode property
> + * @connector: connector to attach scaling mode property on.
> + * @scaling_mode_mask: or'ed mask of BIT(DRM_MODE_SCALE_\*).
> + *
> + * This is used to add support for scaling mode to atomic drivers.
> + * The scaling mode will be set to &struct drm_connector_state->picture_aspect_ratio
s/->/./ to get a real link
> + * and can be used from &struct drm_connector_helper_funcs->atomic_check for validation.
Same here, plus needs &.
Please check the html output when typing docs ...
Also please link to drm_mode_create_scaling_mode_property() and from the
kerneldoc of that to this one here.
> + *
> + * Returns:
> + * Zero on success, negative errno on failure.
> + */
> +int drm_mode_connector_attach_scaling_mode_property(struct drm_connector *connector,
> + u32 scaling_mode_mask)
Usual prefix is just drm_connector_ (yes I know we're not consistent here,
yet).
With those nits: Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> +{
> + struct drm_device *dev = connector->dev;
> + struct drm_property *scaling_mode_property;
> + int i, j = 0;
> + const unsigned valid_scaling_mode_mask =
> + (1U << ARRAY_SIZE(drm_scaling_mode_enum_list)) - 1;
> +
> + if (WARN_ON(hweight32(scaling_mode_mask) < 2 ||
> + scaling_mode_mask & ~valid_scaling_mode_mask))
> + return -EINVAL;
> +
> + scaling_mode_property =
> + drm_property_create(dev, DRM_MODE_PROP_ENUM, "scaling mode",
> + hweight32(scaling_mode_mask));
> +
> + if (!scaling_mode_property)
> + return -ENOMEM;
> +
> + for (i = 0; i < ARRAY_SIZE(drm_scaling_mode_enum_list); i++) {
> + int ret;
> +
> + if (!(BIT(i) & scaling_mode_mask))
> + continue;
> +
> + ret = drm_property_add_enum(scaling_mode_property, j++,
> + drm_scaling_mode_enum_list[i].type,
> + drm_scaling_mode_enum_list[i].name);
> +
> + if (ret) {
> + drm_property_destroy(dev, scaling_mode_property);
> +
> + return ret;
> + }
> + }
> +
> + drm_object_attach_property(&connector->base,
> + scaling_mode_property, 0);
> +
> + connector->scaling_mode_property = scaling_mode_property;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(drm_mode_connector_attach_scaling_mode_property);
> +
> +/**
> * drm_mode_create_aspect_ratio_property - create aspect ratio property
> * @dev: DRM device
> *
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index 1ecf5f2619c0..e71b8959c15f 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -336,6 +336,12 @@ struct drm_connector_state {
> * values for &enum hdmi_picture_aspect
> */
> enum hdmi_picture_aspect picture_aspect_ratio;
> +
> + /**
> + * @scaling_mode: Connector property to control the
> + * upscaling, mostly used for built-in panels.
> + */
> + unsigned int scaling_mode;
> };
>
> /**
> @@ -764,6 +770,8 @@ struct drm_connector {
> struct drm_property_blob *edid_blob_ptr;
> struct drm_object_properties properties;
>
> + struct drm_property *scaling_mode_property;
> +
> /**
> * @path_blob_ptr:
> *
> @@ -963,6 +971,8 @@ int drm_mode_create_tv_properties(struct drm_device *dev,
> unsigned int num_modes,
> const char * const modes[]);
> int drm_mode_create_scaling_mode_property(struct drm_device *dev);
> +int drm_mode_connector_attach_scaling_mode_property(struct drm_connector *connector,
> + u32 scaling_mode_mask);
> int drm_mode_create_aspect_ratio_property(struct drm_device *dev);
> int drm_mode_create_suggested_offset_properties(struct drm_device *dev);
>
> --
> 2.9.3
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the Intel-gfx
mailing list