Seperate function for async flips is to be called in order to check the
provided format/modifier support.
At present the flag for async flip is stored in crtc_state as async flip
is supported on only one plane for a given crtc. The same is being
used over here to decide the async function pointer.

Signed-off-by: Arun R Murthy <arun.r.mur...@intel.com>
---
 drivers/gpu/drm/drm_plane.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
index 
4f35eec2b7770fcc90c3e07a9068b31c0563a4c0..9e08ba4318cf0c07fa0701023659986855e0e98a
 100644
--- a/drivers/gpu/drm/drm_plane.c
+++ b/drivers/gpu/drm/drm_plane.c
@@ -238,12 +238,21 @@ int drm_plane_create_format_blob(struct drm_device *dev,
        mod = modifiers_ptr(blob_data);
        for (i = 0; i < modifier_count; i++) {
                for (j = 0; j < format_count; j++) {
-                       if (is_async ||
-                           !plane->funcs->format_mod_supported ||
-                           plane->funcs->format_mod_supported(plane,
-                                                              formats[j],
-                                                              modifiers[i])) {
-                               mod->formats |= 1ULL << j;
+                       if (is_async) {
+                               if (!plane->funcs->format_mod_supported_async ||
+                                   
plane->funcs->format_mod_supported_async(plane,
+                                                                            
formats[j],
+                                                                            
modifiers[i])) {
+                                       mod->formats |= 1ULL << j;
+                               }
+
+                       } else {
+                               if (!plane->funcs->format_mod_supported ||
+                                   plane->funcs->format_mod_supported(plane,
+                                                                      
formats[j],
+                                                                      
modifiers[i])) {
+                                       mod->formats |= 1ULL << j;
+                               }
                        }
                }
 
@@ -910,6 +919,7 @@ bool drm_plane_has_format(struct drm_plane *plane,
                          u32 format, u64 modifier)
 {
        unsigned int i;
+       bool is_async = plane->crtc->state->async_flip;
 
        for (i = 0; i < plane->format_count; i++) {
                if (format == plane->format_types[i])
@@ -918,8 +928,12 @@ bool drm_plane_has_format(struct drm_plane *plane,
        if (i == plane->format_count)
                return false;
 
-       if (plane->funcs->format_mod_supported) {
-               if (!plane->funcs->format_mod_supported(plane, format, 
modifier))
+       if (is_async ? plane->funcs->format_mod_supported_async :
+                       plane->funcs->format_mod_supported) {
+               if (!(is_async ? plane->funcs->format_mod_supported_async(
+                                               plane, format, modifier) :
+                                       plane->funcs->format_mod_supported(
+                                               plane, format, modifier)))
                        return false;
        } else {
                if (!plane->modifier_count)

-- 
2.25.1

Reply via email to