[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