bug fix inactive encoder when weston restart
Wang, Quanxian
quanxian.wang at intel.com
Mon Jul 30 18:46:50 PDT 2012
Thanks for your review and your changes.
> -----Original Message-----
> From: Kristian Høgsberg [mailto:hoegsberg at gmail.com]
> Sent: Tuesday, July 31, 2012 6:15 AM
> To: Wang, Quanxian
> Cc: wayland-devel at lists.freedesktop.org
> Subject: Re: bug fix inactive encoder when weston restart
>
> On Thu, Jul 26, 2012 at 08:03:26PM +0000, Wang, Quanxian wrote:
> > Hi, All
> >
> > Please help review the patch.
> >
> > Thanks
> >
> > Background:
> > If we use 'pkill -9 weston', when restart weston, weston could not get the
> active encoder attached on connector and exit abnormally.
> > This is because when weston is pkilled, drm cleanups the encoders attached
> to active connector in KMS.
> > This patch will ignore the active encode checking, weston has the ability to
> re-initialize encoder and reattached it into connector.
>
> Good catch. We don't handle connectors that aren't attached to a crtc, which
> happens in your case above, but also just when hotplugging a monitor. I
> applied your patch with a few changes, mostly to deal with how we don't have
> the built-in mode. We now just exit if we don't find any modes to the output.
>
> Kristian
>
> > commit 7f991195c20d9dd57e14faf88cd36db0c77df424
> > Author: Wang Quanxian <quanxian.wang at intel.com>
> > Date: Thu Jul 19 19:11:04 2012 +0800
> > User sends SIGKILL to weston, KMS will clean up encoder
> > attached with connector. When weston restarts again, it causes
> > exit of weston because no active encoder is attached to connector.
> > This patch will ignore the checking and weston will initialize
> > encoder again and re-attach it to connector in the following process.
> >
> > Sign-Off-By Quanxian Wang <quanxian.wang at intel.com>
> >
> > diff --git a/src/compositor-drm.c b/src/compositor-drm.c index
> > 47cd512..bb1b138 100644
> > --- a/src/compositor-drm.c
> > +++ b/src/compositor-drm.c
> > @@ -1348,26 +1348,28 @@ create_output_for_connector(struct
> drm_compositor *ec,
> > /* Get the current mode on the crtc that's currently driving
> > * this connector. */
> > encoder = drmModeGetEncoder(ec->drm.fd,
> connector->encoder_id);
> > - if (encoder == NULL)
> > - goto err_free;
> > - crtc = drmModeGetCrtc(ec->drm.fd, encoder->crtc_id);
> > - drmModeFreeEncoder(encoder);
> > - if (crtc == NULL)
> > - goto err_free;
> > -
> > - /* if don't get mode from drm driver, use default 800x480 */
> > - if (crtc->mode.clock != 0)
> > - {
> > + if (encoder != NULL)
> > + {
> > + crtc = drmModeGetCrtc(ec->drm.fd, encoder->crtc_id);
> > + drmModeFreeEncoder(encoder);
> > + if (crtc == NULL)
> > + goto err_free;
> > crtc_mode = crtc->mode;
> > - } else {
> > + drmModeFreeCrtc(crtc);
> > + }
> > + /*
> > + * No actiave encoder is connected with the connector
> > + * If connector has no mode available, takes detault mode
> > + * Or takes the first mode from connector
> > + */
> > + if (encoder == NULL || crtc_mode.clock == 0)
> > + {
> > if (connector->count_modes == 0)
> > crtc_mode = builtin_800x480;
> > else
> > crtc_mode = connector->modes[0];
> > }
> >
> > - drmModeFreeCrtc(crtc);
> > -
> > if (connector->count_modes == 0) {
> > ret = drm_output_add_mode(output, &crtc_mode);
> > if (ret)
> >
> >
> > Thanks
> >
> > Quanxian Wang
> >
> >
>
>
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list