meta-agl-bsp: Update i.MX8MQ EVK support for kirkstone
[AGL/meta-agl.git] / meta-agl-bsp / meta-ti / recipes-arago / weston / weston / 0005-weston-drm-fix-dual-display-issue.patch
1 From db6f5ce008d9b8a4cc7db71659ce1d21d3d7f97f Mon Sep 17 00:00:00 2001
2 From: Eric Ruei <e-ruei1@ti.com>
3 Date: Tue, 26 Mar 2019 13:32:31 -0400
4 Subject: [PATCH 3/3] weston: drm: fix dual display issue
5
6 This patch fixes the dual display issue by enhancing the primary plane
7 search algorithm to keep the plane which is connected to the crtc of
8 the output because the direct switching of active planes is not allowed.
9
10 Upstream status: Pending
11
12 Signed-off-by: Eric Ruei <e-ruei1@ti.com>
13 ---
14  libweston/compositor-drm.c | 17 ++++++++++++++++-
15  1 file changed, 16 insertions(+), 1 deletion(-)
16
17 diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
18 index 3891176..fa694c3 100644
19 --- a/libweston/compositor-drm.c
20 +++ b/libweston/compositor-drm.c
21 @@ -428,6 +428,7 @@ struct drm_plane {
22  
23         uint32_t possible_crtcs;
24         uint32_t plane_id;
25 +       uint32_t crtc_id;
26         uint32_t count_formats;
27  
28         struct drm_property_info props[WDRM_PLANE__COUNT];
29 @@ -4073,6 +4074,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane,
30         if (kplane) {
31                 plane->possible_crtcs = kplane->possible_crtcs;
32                 plane->plane_id = kplane->plane_id;
33 +               plane->crtc_id = kplane->crtc_id;
34  
35                 props = drmModeObjectGetProperties(b->drm.fd, kplane->plane_id,
36                                                    DRM_MODE_OBJECT_PLANE);
37 @@ -4097,6 +4099,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane,
38         else {
39                 plane->possible_crtcs = (1 << output->pipe);
40                 plane->plane_id = 0;
41 +               plane->crtc_id = 0;
42                 plane->count_formats = 1;
43                 plane->formats[0].format = format;
44                 plane->type = type;
45 @@ -4157,6 +4160,7 @@ drm_output_find_special_plane(struct drm_backend *b, struct drm_output *output,
46                               enum wdrm_plane_type type)
47  {
48         struct drm_plane *plane;
49 +       struct drm_plane *plane2 = NULL; /* secondary plane */
50  
51         if (!b->universal_planes) {
52                 uint32_t format;
53 @@ -4204,11 +4208,22 @@ drm_output_find_special_plane(struct drm_backend *b, struct drm_output *output,
54                 if (found_elsewhere)
55                         continue;
56  
57 +               /* The output should keep the primary plane connected to its
58 +                * crtc since the direct switching of active plane is not
59 +                * allowed. */
60 +               if ((type == WDRM_PLANE_TYPE_PRIMARY) &&
61 +                   (plane->crtc_id != output->crtc_id)) {
62 +                       if (plane->crtc_id == 0) {
63 +                               plane->possible_crtcs = (1 << output->pipe);
64 +                               plane2 = plane;
65 +                       }
66 +                       continue;
67 +               }
68                 plane->possible_crtcs = (1 << output->pipe);
69                 return plane;
70         }
71  
72 -       return NULL;
73 +       return plane2;
74  }
75  
76  /**
77 -- 
78 1.9.1
79