From: Ville Syrjälä <ville.syrjala at linux.intel.com>
Make drm_property_create_bitmask() a bit more generic by allowing the
caller to specify which bits are in fact supported. This allows multiple
callers to use the same enum list, but still create different versions
of the same property with different list of supported bits.
v5: Fixed the caller of this function in omapdrm to comply with supported
bitmask definition.
Cc: David Airlie <[email protected]>
Cc: Tomi Valkeinen <[email protected]>
Cc: Rob Clark <[email protected]>
Cc: Sagar Kamble <[email protected]>
Cc: "Ville Syrjälä" <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: [email protected]
Cc: [email protected]
Signed-off-by: Ville Syrjälä <[email protected]>
Signed-off-by: Sagar Kamble <[email protected]>
Reviewed-by: Rob Clark <[email protected]>
---
drivers/gpu/drm/drm_crtc.c | 6 +++++-
drivers/gpu/drm/omapdrm/omap_plane.c | 8 +++++++-
include/drm/drm_crtc.h | 3 ++-
3 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 3b7d32d..628d3d3 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -2906,7 +2906,8 @@ EXPORT_SYMBOL(drm_property_create_enum);
struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
int flags, const char *name,
const struct drm_prop_enum_list *props,
- int num_values)
+ int num_values,
+ unsigned int supported_bits)
{
struct drm_property *property;
int i, ret;
@@ -2918,6 +2919,9 @@ struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
return NULL;
for (i = 0; i < num_values; i++) {
+ if (!(supported_bits & (1 << i)))
+ continue;
+
ret = drm_property_add_enum(property, i,
props[i].type,
props[i].name);
diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c
index 046d5e6..b288f38 100644
--- a/drivers/gpu/drm/omapdrm/omap_plane.c
+++ b/drivers/gpu/drm/omapdrm/omap_plane.c
@@ -309,7 +309,13 @@ void omap_plane_install_properties(struct drm_plane *plane,
{ DRM_REFLECT_Y, "reflect-y" },
};
prop = drm_property_create_bitmask(dev, 0, "rotation",
- props, ARRAY_SIZE(props));
+ props, ARRAY_SIZE(props),
+ BIT(DRM_ROTATE_0) |
+ BIT(DRM_ROTATE_90) |
+ BIT(DRM_ROTATE_180) |
+ BIT(DRM_ROTATE_270) |
+ BIT(DRM_REFLECT_X) |
+ BIT(DRM_REFLECT_Y));
if (prop == NULL)
return;
priv->rotation_prop = prop;
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index d5c46c1..41b86d2 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1070,7 +1070,8 @@ extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int
struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
int flags, const char *name,
const struct drm_prop_enum_list *props,
- int num_values);
+ int num_values,
+ unsigned int supported_bits);
struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
const char *name,
uint64_t min, uint64_t max);
--
1.8.5
On Mon, Feb 10, 2014 at 01:01:09PM +0530, [email protected] wrote:
> From: Ville Syrj?l? <ville.syrjala at linux.intel.com>
>
> Make drm_property_create_bitmask() a bit more generic by allowing the
> caller to specify which bits are in fact supported. This allows multiple
> callers to use the same enum list, but still create different versions
> of the same property with different list of supported bits.
>
> v5: Fixed the caller of this function in omapdrm to comply with supported
> bitmask definition.
How can it be v5 w/o any v2,v3,v4?
In any case I think this is still broken. I'll reply with a new patch...
>
> Cc: David Airlie <[email protected]>
> Cc: Tomi Valkeinen <[email protected]>
> Cc: Rob Clark <[email protected]>
> Cc: Sagar Kamble <[email protected]>
> Cc: "Ville Syrj?l?" <[email protected]>
> Cc: Greg Kroah-Hartman <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Signed-off-by: Ville Syrj?l? <[email protected]>
> Signed-off-by: Sagar Kamble <[email protected]>
> Reviewed-by: Rob Clark <[email protected]>
> ---
> drivers/gpu/drm/drm_crtc.c | 6 +++++-
> drivers/gpu/drm/omapdrm/omap_plane.c | 8 +++++++-
> include/drm/drm_crtc.h | 3 ++-
> 3 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 3b7d32d..628d3d3 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -2906,7 +2906,8 @@ EXPORT_SYMBOL(drm_property_create_enum);
> struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
> int flags, const char *name,
> const struct drm_prop_enum_list *props,
> - int num_values)
> + int num_values,
> + unsigned int supported_bits)
> {
> struct drm_property *property;
> int i, ret;
> @@ -2918,6 +2919,9 @@ struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
> return NULL;
>
> for (i = 0; i < num_values; i++) {
> + if (!(supported_bits & (1 << i)))
> + continue;
> +
> ret = drm_property_add_enum(property, i,
> props[i].type,
> props[i].name);
> diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c
> index 046d5e6..b288f38 100644
> --- a/drivers/gpu/drm/omapdrm/omap_plane.c
> +++ b/drivers/gpu/drm/omapdrm/omap_plane.c
> @@ -309,7 +309,13 @@ void omap_plane_install_properties(struct drm_plane *plane,
> { DRM_REFLECT_Y, "reflect-y" },
> };
> prop = drm_property_create_bitmask(dev, 0, "rotation",
> - props, ARRAY_SIZE(props));
> + props, ARRAY_SIZE(props),
> + BIT(DRM_ROTATE_0) |
> + BIT(DRM_ROTATE_90) |
> + BIT(DRM_ROTATE_180) |
> + BIT(DRM_ROTATE_270) |
> + BIT(DRM_REFLECT_X) |
> + BIT(DRM_REFLECT_Y));
> if (prop == NULL)
> return;
> priv->rotation_prop = prop;
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index d5c46c1..41b86d2 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -1070,7 +1070,8 @@ extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int
> struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
> int flags, const char *name,
> const struct drm_prop_enum_list *props,
> - int num_values);
> + int num_values,
> + unsigned int supported_bits);
> struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
> const char *name,
> uint64_t min, uint64_t max);
> --
> 1.8.5
--
Ville Syrj?l?
Intel OTC
From: Ville Syrjälä <ville.syrjala at linux.intel.com>
Make drm_property_create_bitmask() a bit more generic by allowing the
caller to specify which bits are in fact supported. This allows multiple
callers to use the same enum list, but still create different versions
of the same property with different list of supported bits.
v2: Populate values[] array as non-sparse
Make supported_bits 64bit
Fix up omapdrm call site (Rob)
Cc: Tomi Valkeinen <[email protected]>
Cc: Rob Clark <[email protected]>
Cc: Sagar Kamble <[email protected]>
Cc: [email protected]
Signed-off-by: Ville Syrjälä <[email protected]>
---
This should also make my original "drm: Add drm_mode_create_rotation_property()"
patch do the right thing. So patch 03/11 of the series needs to be replaced with the
original.
drivers/gpu/drm/drm_crtc.c | 18 ++++++++++++++----
drivers/gpu/drm/omapdrm/omap_plane.c | 5 ++++-
include/drm/drm_crtc.h | 3 ++-
3 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 3b7d32d..6e099069 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -2906,10 +2906,12 @@ EXPORT_SYMBOL(drm_property_create_enum);
struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
int flags, const char *name,
const struct drm_prop_enum_list *props,
- int num_values)
+ int num_props,
+ uint64_t supported_bits)
{
struct drm_property *property;
- int i, ret;
+ int i, ret, index = 0;
+ int num_values = hweight64(supported_bits);
flags |= DRM_MODE_PROP_BITMASK;
@@ -2917,8 +2919,16 @@ struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
if (!property)
return NULL;
- for (i = 0; i < num_values; i++) {
- ret = drm_property_add_enum(property, i,
+ for (i = 0; i < num_props; i++) {
+ if (!(supported_bits & (1ULL << props[i].type)))
+ continue;
+
+ if (WARN_ON(index >= num_values)) {
+ drm_property_destroy(dev, property);
+ return NULL;
+ }
+
+ ret = drm_property_add_enum(property, index++,
props[i].type,
props[i].name);
if (ret) {
diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c
index 046d5e6..0d97650 100644
--- a/drivers/gpu/drm/omapdrm/omap_plane.c
+++ b/drivers/gpu/drm/omapdrm/omap_plane.c
@@ -309,7 +309,10 @@ void omap_plane_install_properties(struct drm_plane *plane,
{ DRM_REFLECT_Y, "reflect-y" },
};
prop = drm_property_create_bitmask(dev, 0, "rotation",
- props, ARRAY_SIZE(props));
+ props, ARRAY_SIZE(props),
+ BIT(DRM_ROTATE_0) | BIT(DRM_ROTATE_90) |
+ BIT(DRM_ROTATE_180) | BIT(DRM_ROTATE_270) |
+ BIT(DRM_REFLECT_X) | BIT(DRM_REFLECT_Y));
if (prop == NULL)
return;
priv->rotation_prop = prop;
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index d5c46c1..4e6d2aa 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1070,7 +1070,8 @@ extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int
struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
int flags, const char *name,
const struct drm_prop_enum_list *props,
- int num_values);
+ int num_props,
+ uint64_t supported_bits);
struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
const char *name,
uint64_t min, uint64_t max);
--
1.8.3.2
Reviewed-by: Sagar Kamble <[email protected]>
Tested-by: Sagar Kamble <[email protected]>
On Mon, 2014-02-10 at 16:05 +0200, [email protected] wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Make drm_property_create_bitmask() a bit more generic by allowing the
> caller to specify which bits are in fact supported. This allows multiple
> callers to use the same enum list, but still create different versions
> of the same property with different list of supported bits.
>
> v2: Populate values[] array as non-sparse
> Make supported_bits 64bit
> Fix up omapdrm call site (Rob)
>
> Cc: Tomi Valkeinen <[email protected]>
> Cc: Rob Clark <[email protected]>
> Cc: Sagar Kamble <[email protected]>
> Cc: [email protected]
> Signed-off-by: Ville Syrjälä <[email protected]>
> ---
> This should also make my original "drm: Add drm_mode_create_rotation_property()"
> patch do the right thing. So patch 03/11 of the series needs to be replaced with the
> original.
>
> drivers/gpu/drm/drm_crtc.c | 18 ++++++++++++++----
> drivers/gpu/drm/omapdrm/omap_plane.c | 5 ++++-
> include/drm/drm_crtc.h | 3 ++-
> 3 files changed, 20 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 3b7d32d..6e099069 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -2906,10 +2906,12 @@ EXPORT_SYMBOL(drm_property_create_enum);
> struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
> int flags, const char *name,
> const struct drm_prop_enum_list *props,
> - int num_values)
> + int num_props,
> + uint64_t supported_bits)
> {
> struct drm_property *property;
> - int i, ret;
> + int i, ret, index = 0;
> + int num_values = hweight64(supported_bits);
>
> flags |= DRM_MODE_PROP_BITMASK;
>
> @@ -2917,8 +2919,16 @@ struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
> if (!property)
> return NULL;
>
> - for (i = 0; i < num_values; i++) {
> - ret = drm_property_add_enum(property, i,
> + for (i = 0; i < num_props; i++) {
> + if (!(supported_bits & (1ULL << props[i].type)))
> + continue;
> +
> + if (WARN_ON(index >= num_values)) {
> + drm_property_destroy(dev, property);
> + return NULL;
> + }
> +
> + ret = drm_property_add_enum(property, index++,
> props[i].type,
> props[i].name);
> if (ret) {
> diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c
> index 046d5e6..0d97650 100644
> --- a/drivers/gpu/drm/omapdrm/omap_plane.c
> +++ b/drivers/gpu/drm/omapdrm/omap_plane.c
> @@ -309,7 +309,10 @@ void omap_plane_install_properties(struct drm_plane *plane,
> { DRM_REFLECT_Y, "reflect-y" },
> };
> prop = drm_property_create_bitmask(dev, 0, "rotation",
> - props, ARRAY_SIZE(props));
> + props, ARRAY_SIZE(props),
> + BIT(DRM_ROTATE_0) | BIT(DRM_ROTATE_90) |
> + BIT(DRM_ROTATE_180) | BIT(DRM_ROTATE_270) |
> + BIT(DRM_REFLECT_X) | BIT(DRM_REFLECT_Y));
> if (prop == NULL)
> return;
> priv->rotation_prop = prop;
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index d5c46c1..4e6d2aa 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -1070,7 +1070,8 @@ extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int
> struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
> int flags, const char *name,
> const struct drm_prop_enum_list *props,
> - int num_values);
> + int num_props,
> + uint64_t supported_bits);
> struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
> const char *name,
> uint64_t min, uint64_t max);