[PATCH] drm: Use modifier blob to validate modifier
Dhinakaran Pandiyan
dhinakaran.pandiyan at intel.com
Thu Dec 6 07:07:56 UTC 2018
Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan at intel.com>
---
drivers/gpu/drm/drm_plane.c | 41 ++++++++++++++++++++++++++-----------
1 file changed, 29 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
index 5f650d8fc66b..70d6c985d31b 100644
--- a/drivers/gpu/drm/drm_plane.c
+++ b/drivers/gpu/drm/drm_plane.c
@@ -90,6 +90,7 @@ static int create_in_format_blob(struct drm_device *dev, struct drm_plane *plane
struct drm_format_modifier *mod;
size_t blob_size, formats_size, modifiers_size;
struct drm_format_modifier_blob *blob_data;
+ const struct drm_plane_funcs *funcs = plane->funcs;
unsigned int i, j;
formats_size = sizeof(__u32) * plane->format_count;
@@ -124,17 +125,14 @@ static int create_in_format_blob(struct drm_device *dev, struct drm_plane *plane
memcpy(formats_ptr(blob_data), plane->format_types, formats_size);
- /* If we can't determine support, just bail */
- if (!plane->funcs->format_mod_supported)
- goto done;
-
mod = modifiers_ptr(blob_data);
for (i = 0; i < plane->modifier_count; i++) {
for (j = 0; j < plane->format_count; j++) {
- if (plane->funcs->format_mod_supported(plane,
- plane->format_types[j],
- plane->modifiers[i])) {
+ if (!funcs->format_mod_supported ||
+ funcs->format_mod_supported(plane,
+ plane->format_types[j],
+ plane->modifiers[i])) {
mod->formats |= 1ULL << j;
}
}
@@ -145,7 +143,6 @@ static int create_in_format_blob(struct drm_device *dev, struct drm_plane *plane
mod++;
}
-done:
drm_object_attach_property(&plane->base, config->modifiers_property,
blob->base.id);
@@ -564,6 +561,11 @@ int drm_plane_check_pixel_format(struct drm_plane *plane,
u32 format, u64 modifier)
{
unsigned int i;
+ struct drm_device *dev = plane->dev;
+ struct drm_property_blob *blob;
+ struct drm_format_modifier_blob *blob_data;
+ uint64_t val;
+ struct drm_format_modifier *mod;
for (i = 0; i < plane->format_count; i++) {
if (format == plane->format_types[i])
@@ -576,15 +578,30 @@ int drm_plane_check_pixel_format(struct drm_plane *plane,
if (!plane->funcs->format_mod_supported(plane, format, modifier))
return -EINVAL;
} else {
- if (!plane->modifier_count)
+ if (drm_object_property_get_value(&plane->base,
+ dev->mode_config.modifiers_property,
+ &val))
return 0;
- for (i = 0; i < plane->modifier_count; i++) {
- if (modifier == plane->modifiers[i])
+ blob = drm_property_lookup_blob(dev, val);
+ blob_data = (struct drm_format_modifier_blob *)blob->data;
+ mod = modifiers_ptr(blob_data);
+
+ if (!blob_data->count_modifiers) {
+ drm_property_blob_put(blob);
+ return 0;
+ }
+
+ for (i = 0; i < blob_data->count_modifiers; i++) {
+ if (modifier == mod->modifier)
break;
+ mod++;
}
- if (i == plane->modifier_count)
+
+ if (i == blob_data->count_modifiers) {
+ drm_property_blob_put(blob);
return -EINVAL;
+ }
}
return 0;
--
2.17.1
More information about the Intel-gfx-trybot
mailing list