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;