drm/msm/sde: explicitly enumerate supported plane formats

Explicitly list supported formats rather than attempting to
infer what is supported based on h/w features. This makes
the determination of supported formats more reliable, and
also opens the way to account for different h/w blocks
supporting different sets of formats.

Change-Id: I39b223638c2c126d57eee5551a57c7b8fd7cb1f5
Signed-off-by: Clarence Ip <cip@codeaurora.org>
diff --git a/drivers/gpu/drm/msm/sde/sde_formats.c b/drivers/gpu/drm/msm/sde/sde_formats.c
index 25dac8c..ac14bad 100644
--- a/drivers/gpu/drm/msm/sde/sde_formats.c
+++ b/drivers/gpu/drm/msm/sde/sde_formats.c
@@ -814,21 +814,34 @@
 	return NULL;
 }
 
-uint32_t sde_populate_formats(uint32_t *pixel_formats,
-		uint32_t pixel_formats_max, bool rgb_only)
+uint32_t sde_populate_formats(
+		const struct sde_format_extended *format_list,
+		uint32_t *pixel_formats,
+		uint64_t *pixel_modifiers,
+		uint32_t pixel_formats_max)
 {
-	uint32_t i;
+	uint32_t i, fourcc_format;
 
-	for (i = 0; i < ARRAY_SIZE(sde_format_map); i++) {
-		const struct sde_format *fmt = &sde_format_map[i];
+	if (!format_list || !pixel_formats)
+		return 0;
 
-		if (i == pixel_formats_max)
-			break;
+	for (i = 0, fourcc_format = 0;
+			format_list->fourcc_format && i < pixel_formats_max;
+			++format_list) {
+		/* verify if listed format is in sde_format_map? */
 
-		if (rgb_only && SDE_FORMAT_IS_YUV(fmt))
-			continue;
-
-		pixel_formats[i] = fmt->base.pixel_format;
+		/* optionally return modified formats */
+		if (pixel_modifiers) {
+			/* assume same modifier for all fb planes */
+			pixel_formats[i] = format_list->fourcc_format;
+			pixel_modifiers[i++] = format_list->modifier;
+		} else {
+			/* assume base formats grouped together */
+			if (fourcc_format != format_list->fourcc_format) {
+				fourcc_format = format_list->fourcc_format;
+				pixel_formats[i++] = fourcc_format;
+			}
+		}
 	}
 
 	return i;