Merge "Merge: migrate appfw from meta-agl-extra"
[AGL/meta-agl.git] / meta-agl-bsp / meta-ti / recipes-arago / weston / weston / 0001-compositor-drm-fix-hotplug-weston-termination-proble.patch
1 From 8497d95cc77af9bbdbbce03878e9fd273d94ba7f Mon Sep 17 00:00:00 2001
2 From: Eric Ruei <e-ruei1@ti.com>
3 Date: Wed, 7 Dec 2016 15:25:25 -0500
4 Subject: [PATCH] compositor-drm: fix hotplug weston termination problem
5
6 The weston_compositor_exit() is always invoked at function update_outputs()
7 if all connector ids are greater than 31 because the 32-bit b->connector_allocator
8 will be zero. Need to increase the size of both crtc_allocator and
9 connector_allocator from 32-bit to 64-bit until a better solution is implemented.
10
11 Upstream-Status: Submitted [wayland-devel@lists.freedesktop.org]
12
13 Signed-off-by: Eric Ruei <e-ruei1@ti.com>
14 ---
15  src/compositor-drm.c | 30 +++++++++++++++---------------
16  1 file changed, 15 insertions(+), 15 deletions(-)
17
18 diff --git a/src/compositor-drm.c b/src/compositor-drm.c
19 index 6485b39..e4d889f 100644
20 --- a/src/compositor-drm.c
21 +++ b/src/compositor-drm.c
22 @@ -103,8 +103,8 @@ struct drm_backend {
23         struct gbm_device *gbm;
24         uint32_t *crtcs;
25         int num_crtcs;
26 -       uint32_t crtc_allocator;
27 -       uint32_t connector_allocator;
28 +       uint64_t crtc_allocator;
29 +       uint64_t connector_allocator;
30         struct wl_listener session_listener;
31         uint32_t format;
32  
33 @@ -1360,8 +1360,8 @@ drm_output_destroy(struct weston_output *output_base)
34                        &output->connector_id, 1, &origcrtc->mode);
35         drmModeFreeCrtc(origcrtc);
36  
37 -       b->crtc_allocator &= ~(1 << output->crtc_id);
38 -       b->connector_allocator &= ~(1 << output->connector_id);
39 +       b->crtc_allocator &= ~(1ULL << output->crtc_id);
40 +       b->connector_allocator &= ~(1ULL << output->connector_id);
41  
42         if (b->use_pixman) {
43                 drm_output_fini_pixman(output);
44 @@ -1842,8 +1842,8 @@ find_crtc_for_connector(struct drm_backend *b,
45                 drmModeFreeEncoder(encoder);
46  
47                 for (i = 0; i < resources->count_crtcs; i++) {
48 -                       if (possible_crtcs & (1 << i) &&
49 -                           !(b->crtc_allocator & (1 << resources->crtcs[i])))
50 +                       if (possible_crtcs & (1ULL << i) &&
51 +                           !(b->crtc_allocator & (1ULL << resources->crtcs[i])))
52                                 return i;
53                 }
54         }
55 @@ -2404,9 +2404,9 @@ create_output_for_connector(struct drm_backend *b,
56  
57         output->crtc_id = resources->crtcs[i];
58         output->pipe = i;
59 -       b->crtc_allocator |= (1 << output->crtc_id);
60 +       b->crtc_allocator |= (1ULL << output->crtc_id);
61         output->connector_id = connector->connector_id;
62 -       b->connector_allocator |= (1 << output->connector_id);
63 +       b->connector_allocator |= (1ULL << output->connector_id);
64  
65         output->original_crtc = drmModeGetCrtc(b->drm.fd, output->crtc_id);
66         output->dpms_prop = drm_get_prop(b->drm.fd, connector, "DPMS");
67 @@ -2511,8 +2511,8 @@ err_free:
68         }
69  
70         drmModeFreeCrtc(output->original_crtc);
71 -       b->crtc_allocator &= ~(1 << output->crtc_id);
72 -       b->connector_allocator &= ~(1 << output->connector_id);
73 +       b->crtc_allocator &= ~(1ULL << output->crtc_id);
74 +       b->connector_allocator &= ~(1ULL << output->connector_id);
75         free(output);
76  
77         return -1;
78 @@ -2658,7 +2658,7 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device)
79         drmModeRes *resources;
80         struct drm_output *output, *next;
81         int x = 0, y = 0;
82 -       uint32_t connected = 0, disconnects = 0;
83 +       uint64_t connected = 0, disconnects = 0;
84         int i;
85  
86         resources = drmModeGetResources(b->drm.fd);
87 @@ -2680,9 +2680,9 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device)
88                         continue;
89                 }
90  
91 -               connected |= (1 << connector_id);
92 +               connected |= (1ULL << connector_id);
93  
94 -               if (!(b->connector_allocator & (1 << connector_id))) {
95 +               if (!(b->connector_allocator & (1ULL << connector_id))) {
96                         struct weston_output *last =
97                                 container_of(b->compositor->output_list.prev,
98                                              struct weston_output, link);
99 @@ -2707,8 +2707,8 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device)
100         if (disconnects) {
101                 wl_list_for_each_safe(output, next, &b->compositor->output_list,
102                                       base.link) {
103 -                       if (disconnects & (1 << output->connector_id)) {
104 -                               disconnects &= ~(1 << output->connector_id);
105 +                       if (disconnects & (1ULL << output->connector_id)) {
106 +                               disconnects &= ~(1ULL << output->connector_id);
107                                 weston_log("connector %d disconnected\n",
108                                        output->connector_id);
109                                 drm_output_destroy(&output->base);
110 -- 
111 1.9.1
112