diff options
Diffstat (limited to 'meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-compositor-drm-fix-hotplug-weston-termination-proble.patch')
-rw-r--r-- | meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-compositor-drm-fix-hotplug-weston-termination-proble.patch | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-compositor-drm-fix-hotplug-weston-termination-proble.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-compositor-drm-fix-hotplug-weston-termination-proble.patch new file mode 100644 index 000000000..fde38d52b --- /dev/null +++ b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-compositor-drm-fix-hotplug-weston-termination-proble.patch @@ -0,0 +1,112 @@ +From 8497d95cc77af9bbdbbce03878e9fd273d94ba7f Mon Sep 17 00:00:00 2001 +From: Eric Ruei <e-ruei1@ti.com> +Date: Wed, 7 Dec 2016 15:25:25 -0500 +Subject: [PATCH] compositor-drm: fix hotplug weston termination problem + +The weston_compositor_exit() is always invoked at function update_outputs() +if all connector ids are greater than 31 because the 32-bit b->connector_allocator +will be zero. Need to increase the size of both crtc_allocator and +connector_allocator from 32-bit to 64-bit until a better solution is implemented. + +Upstream-Status: Submitted [wayland-devel@lists.freedesktop.org] + +Signed-off-by: Eric Ruei <e-ruei1@ti.com> +--- + src/compositor-drm.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +diff --git a/src/compositor-drm.c b/src/compositor-drm.c +index 6485b39..e4d889f 100644 +--- a/src/compositor-drm.c ++++ b/src/compositor-drm.c +@@ -103,8 +103,8 @@ struct drm_backend { + struct gbm_device *gbm; + uint32_t *crtcs; + int num_crtcs; +- uint32_t crtc_allocator; +- uint32_t connector_allocator; ++ uint64_t crtc_allocator; ++ uint64_t connector_allocator; + struct wl_listener session_listener; + uint32_t format; + +@@ -1360,8 +1360,8 @@ drm_output_destroy(struct weston_output *output_base) + &output->connector_id, 1, &origcrtc->mode); + drmModeFreeCrtc(origcrtc); + +- b->crtc_allocator &= ~(1 << output->crtc_id); +- b->connector_allocator &= ~(1 << output->connector_id); ++ b->crtc_allocator &= ~(1ULL << output->crtc_id); ++ b->connector_allocator &= ~(1ULL << output->connector_id); + + if (b->use_pixman) { + drm_output_fini_pixman(output); +@@ -1842,8 +1842,8 @@ find_crtc_for_connector(struct drm_backend *b, + drmModeFreeEncoder(encoder); + + for (i = 0; i < resources->count_crtcs; i++) { +- if (possible_crtcs & (1 << i) && +- !(b->crtc_allocator & (1 << resources->crtcs[i]))) ++ if (possible_crtcs & (1ULL << i) && ++ !(b->crtc_allocator & (1ULL << resources->crtcs[i]))) + return i; + } + } +@@ -2404,9 +2404,9 @@ create_output_for_connector(struct drm_backend *b, + + output->crtc_id = resources->crtcs[i]; + output->pipe = i; +- b->crtc_allocator |= (1 << output->crtc_id); ++ b->crtc_allocator |= (1ULL << output->crtc_id); + output->connector_id = connector->connector_id; +- b->connector_allocator |= (1 << output->connector_id); ++ b->connector_allocator |= (1ULL << output->connector_id); + + output->original_crtc = drmModeGetCrtc(b->drm.fd, output->crtc_id); + output->dpms_prop = drm_get_prop(b->drm.fd, connector, "DPMS"); +@@ -2511,8 +2511,8 @@ err_free: + } + + drmModeFreeCrtc(output->original_crtc); +- b->crtc_allocator &= ~(1 << output->crtc_id); +- b->connector_allocator &= ~(1 << output->connector_id); ++ b->crtc_allocator &= ~(1ULL << output->crtc_id); ++ b->connector_allocator &= ~(1ULL << output->connector_id); + free(output); + + return -1; +@@ -2658,7 +2658,7 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device) + drmModeRes *resources; + struct drm_output *output, *next; + int x = 0, y = 0; +- uint32_t connected = 0, disconnects = 0; ++ uint64_t connected = 0, disconnects = 0; + int i; + + resources = drmModeGetResources(b->drm.fd); +@@ -2680,9 +2680,9 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device) + continue; + } + +- connected |= (1 << connector_id); ++ connected |= (1ULL << connector_id); + +- if (!(b->connector_allocator & (1 << connector_id))) { ++ if (!(b->connector_allocator & (1ULL << connector_id))) { + struct weston_output *last = + container_of(b->compositor->output_list.prev, + struct weston_output, link); +@@ -2707,8 +2707,8 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device) + if (disconnects) { + wl_list_for_each_safe(output, next, &b->compositor->output_list, + base.link) { +- if (disconnects & (1 << output->connector_id)) { +- disconnects &= ~(1 << output->connector_id); ++ if (disconnects & (1ULL << output->connector_id)) { ++ disconnects &= ~(1ULL << output->connector_id); + weston_log("connector %d disconnected\n", + output->connector_id); + drm_output_destroy(&output->base); +-- +1.9.1 + |