From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Mon, 23 Oct 2017 06:57:15 +0000 Subject: Re: [PATCH v2 3/4] drm/i915: Add "panel orientation" property to the panel connector Message-Id: List-Id: References: <20171001153317.2343-1-hdegoede@redhat.com> <20171001153317.2343-4-hdegoede@redhat.com> <20171002080624.us2l6cix3bi36lne@phenom.ffwll.local> In-Reply-To: <20171002080624.us2l6cix3bi36lne@phenom.ffwll.local> MIME-Version: 1.0 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: quoted-printable To: Daniel Vetter , Hans de Goede Cc: linux-fbdev@vger.kernel.org, Bartlomiej Zolnierkiewicz , dri-devel@lists.freedesktop.org, Bastien Nocera , Daniel Vetter Hi, On 02-10-17 10:06, Daniel Vetter wrote: > On Sun, Oct 01, 2017 at 05:33:16PM +0200, Hans de Goede wrote: >> Ideally we could use the VBT for this, that would be simple, in >> intel_dsi_init() check dev_priv->vbt.dsi.config->rotation, set >> connector->display_info.panel_orientation accordingly and call >> drm_connector_init_panel_orientation_property(), done. >> >> Unfortunately vbt.dsi.config->rotation is always 0 even on tablets >> with an upside down LCD and where the GOP is properly rotating the >> EFI fb in hardware. >> >> So instead we end up reading the rotation from the primary plane, >> which is a bit more complicated. >> >> The code to read back the rotation from the hardware is based on an >> earlier attempt to fix fdo#94894 by Ville Syrjala. >> >> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=94894 >> Cc: Ville Syrjala >> Suggested-by: Ville Syrjala >> Signed-off-by: Hans de Goede >=20 > This patch looks a bit like it tries to maximize layering violations: >=20 > - store panel state in plane_state > - digg a hole from global code to set up panel information >=20 > Can't we do this in a better way? I'm thinking of something mimicking the > fixed mode readout, which is also not driven in a backwards way like this. > I.e. a small helper in intel_panel.c which reads out the rotation of the > primary panel and hopes for the best. Ok, I've reworked this in a way which will hopefully be much more to your liking. This is now pretty much all isolated to intel_dsi.c > Plus ofc taking the quirk list into account. >=20 > Also, how exactly does the GOP figure out we need to rotate? I wish I knew, the logical answer would be the rotation field of struct mipi_config (which is part of the VBT) but at least no the tablet with upside-down LCD panel I've using that field is not the answer, hence the code to read it back from the hw at boot. Regards, Hans >> --- >> Changes in v2: >> -Rebased on 4.14-rc1 >> -Readback primary plane rotation from the hardware and use that to >> set the panel orientation >> -This (readback) fixes fdo#94894, add Fixes: tag >> --- >> drivers/gpu/drm/i915/i915_drv.h | 3 +++ >> drivers/gpu/drm/i915/intel_display.c | 39 ++++++++++++++++++++++++++++= +++++++- >> drivers/gpu/drm/i915/intel_drv.h | 5 +++++ >> drivers/gpu/drm/i915/intel_panel.c | 33 ++++++++++++++++++++++++++++= ++ >> 4 files changed, 79 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915= _drv.h >> index 18d9da53282b..c4c8590972b4 100644 >> --- a/drivers/gpu/drm/i915/i915_drv.h >> +++ b/drivers/gpu/drm/i915/i915_drv.h >> @@ -2151,6 +2151,8 @@ struct intel_cdclk_state { >> unsigned int cdclk, vco, ref; >> }; >> =20 >> +struct intel_panel; >> + >> struct drm_i915_private { >> struct drm_device drm; >> =20 >> @@ -2200,6 +2202,7 @@ struct drm_i915_private { >> struct i915_gem_context *kernel_context; >> struct intel_engine_cs *engine[I915_NUM_ENGINES]; >> struct i915_vma *semaphore; >> + struct intel_panel *panel; >> =20 >> struct drm_dma_handle *status_page_dmah; >> struct resource mch_res; >> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915= /intel_display.c >> index 00cd17c76fdc..fbd61f92b60d 100644 >> --- a/drivers/gpu/drm/i915/intel_display.c >> +++ b/drivers/gpu/drm/i915/intel_display.c >> @@ -2891,6 +2891,9 @@ intel_find_initial_plane_obj(struct intel_crtc *in= tel_crtc, >> return; >> } >> =20 >> + intel_panel_set_orientation_from_crtc(dev_priv->panel, intel_crtc, >> + plane_config->panel_orientation); >> + >> plane_state->src_x =3D 0; >> plane_state->src_y =3D 0; >> plane_state->src_w =3D fb->width << 16; >> @@ -7523,6 +7526,10 @@ i9xx_get_initial_plane_config(struct intel_crtc *= crtc, >> plane_config->tiling =3D I915_TILING_X; >> fb->modifier =3D I915_FORMAT_MOD_X_TILED; >> } >> + >> + if (val & DISPPLANE_ROTATE_180) >> + plane_config->panel_orientation >> + DRM_MODE_PANEL_ORIENTATION_B= OTTOM_UP; >> } >> =20 >> pixel_format =3D val & DISPPLANE_PIXFORMAT_MASK; >> @@ -8576,6 +8583,24 @@ skylake_get_initial_plane_config(struct intel_crt= c *crtc, >> goto error; >> } >> =20 >> + /* The rotation is used to *correct* for the panel orientation */ >> + switch (val & PLANE_CTL_ROTATE_MASK) { >> + case PLANE_CTL_ROTATE_0: >> + break; >> + case PLANE_CTL_ROTATE_90: >> + plane_config->panel_orientation >> + DRM_MODE_PANEL_ORIENTATION_RIG= HT_UP; >> + break; >> + case PLANE_CTL_ROTATE_180: >> + plane_config->panel_orientation >> + DRM_MODE_PANEL_ORIENTATION_BOT= TOM_UP; >> + break; >> + case PLANE_CTL_ROTATE_270: >> + plane_config->panel_orientation >> + DRM_MODE_PANEL_ORIENTATION_LEF= T_UP; >> + break; >> + } >> + >> base =3D I915_READ(PLANE_SURF(pipe, 0)) & 0xfffff000; >> plane_config->base =3D base; >> =20 >> @@ -8661,6 +8686,10 @@ ironlake_get_initial_plane_config(struct intel_cr= tc *crtc, >> plane_config->tiling =3D I915_TILING_X; >> fb->modifier =3D I915_FORMAT_MOD_X_TILED; >> } >> + >> + if (val & DISPPLANE_ROTATE_180) >> + plane_config->panel_orientation >> + DRM_MODE_PANEL_ORIENTATION_B= OTTOM_UP; >> } >> =20 >> pixel_format =3D val & DISPPLANE_PIXFORMAT_MASK; >> @@ -14578,7 +14607,9 @@ int intel_modeset_init(struct drm_device *dev) >> drm_modeset_unlock_all(dev); >> =20 >> for_each_intel_crtc(dev, crtc) { >> - struct intel_initial_plane_config plane_config =3D {}; >> + struct intel_initial_plane_config plane_config =3D { >> + .panel_orientation =3D DRM_MODE_PANEL_ORIENTATION_NORMAL, >> + }; >> =20 >> if (!crtc->active) >> continue; >> @@ -14600,6 +14631,12 @@ int intel_modeset_init(struct drm_device *dev) >> intel_find_initial_plane_obj(crtc, &plane_config); >> } >> =20 >> + /* >> + * Init panel orientation prop now that intel_find_initial_plane_obj() >> + * has had a chance to set panel orientation. >> + */ >> + intel_panel_init_orientation_prop(dev_priv->panel); >> + >> /* >> * Make sure hardware watermarks really match the state we read out. >> * Note that we need to do this after reconstructing the BIOS fb's >> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/int= el_drv.h >> index fa47285918f4..50fa0eeca655 100644 >> --- a/drivers/gpu/drm/i915/intel_drv.h >> +++ b/drivers/gpu/drm/i915/intel_drv.h >> @@ -447,6 +447,7 @@ struct intel_initial_plane_config { >> unsigned int tiling; >> int size; >> u32 base; >> + int panel_orientation; /* DRM_MODE_PANEL_ORIENTATION_* */ >> }; >> =20 >> #define SKL_MIN_SRC_W 8 >> @@ -1703,6 +1704,10 @@ extern struct drm_display_mode *intel_find_panel_= downclock( >> struct drm_i915_private *dev_priv, >> struct drm_display_mode *fixed_mode, >> struct drm_connector *connector); >> +void intel_panel_set_orientation_from_crtc(struct intel_panel *panel, >> + struct intel_crtc *intel_crtc, >> + int orientation); >> +void intel_panel_init_orientation_prop(struct intel_panel *panel); >> =20 >> #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) >> int intel_backlight_device_register(struct intel_connector *connector); >> diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/i= ntel_panel.c >> index 0f7942a5dccf..fa7dfb9ac5f0 100644 >> --- a/drivers/gpu/drm/i915/intel_panel.c >> +++ b/drivers/gpu/drm/i915/intel_panel.c >> @@ -1925,11 +1925,44 @@ intel_panel_init_backlight_funcs(struct intel_pa= nel *panel) >> } >> } >> =20 >> +void intel_panel_set_orientation_from_crtc(struct intel_panel *panel, >> + struct intel_crtc *intel_crtc, >> + int orientation) >> +{ >> + struct intel_connector *panel_conn; >> + >> + if (!panel) >> + return; >> + >> + panel_conn =3D container_of(panel, struct intel_connector, panel); >> + if (panel_conn->base.state->crtc =3D &intel_crtc->base) >> + panel_conn->base.display_info.panel_orientation =3D orientation; >> +} >> + >> +void intel_panel_init_orientation_prop(struct intel_panel *panel) >> +{ >> + struct intel_connector *panel_conn; >> + >> + if (!panel || !panel->fixed_mode) >> + return; >> + >> + panel_conn =3D container_of(panel, struct intel_connector, panel); >> + drm_connector_init_panel_orientation_property(&panel_conn->base, >> + panel->fixed_mode->hdisplay, panel->fixed_mode->vdisplay); >> +} >> + >> int intel_panel_init(struct intel_panel *panel, >> struct drm_display_mode *fixed_mode, >> struct drm_display_mode *alt_fixed_mode, >> struct drm_display_mode *downclock_mode) >> { >> + struct intel_connector *intel_connector >> + container_of(panel, stru= ct intel_connector, panel); >> + struct drm_i915_private *dev_priv =3D to_i915(intel_connector->base.de= v); >> + >> + if (!dev_priv->panel) >> + dev_priv->panel =3D panel; >> + >> intel_panel_init_backlight_funcs(panel); >> =20 >> panel->fixed_mode =3D fixed_mode; >> --=20 >> 2.14.2 >> >> _______________________________________________ >> dri-devel mailing list >> dri-devel@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/dri-devel >=20 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Subject: Re: [PATCH v2 3/4] drm/i915: Add "panel orientation" property to the panel connector Date: Mon, 23 Oct 2017 08:57:15 +0200 Message-ID: References: <20171001153317.2343-1-hdegoede@redhat.com> <20171001153317.2343-4-hdegoede@redhat.com> <20171002080624.us2l6cix3bi36lne@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by gabe.freedesktop.org (Postfix) with ESMTPS id AB45A6E243 for ; Mon, 23 Oct 2017 06:57:20 +0000 (UTC) In-Reply-To: <20171002080624.us2l6cix3bi36lne@phenom.ffwll.local> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter , Hans de Goede Cc: linux-fbdev@vger.kernel.org, Bartlomiej Zolnierkiewicz , dri-devel@lists.freedesktop.org, Bastien Nocera , Daniel Vetter List-Id: dri-devel@lists.freedesktop.org SGksCgpPbiAwMi0xMC0xNyAxMDowNiwgRGFuaWVsIFZldHRlciB3cm90ZToKPiBPbiBTdW4sIE9j dCAwMSwgMjAxNyBhdCAwNTozMzoxNlBNICswMjAwLCBIYW5zIGRlIEdvZWRlIHdyb3RlOgo+PiBJ ZGVhbGx5IHdlIGNvdWxkIHVzZSB0aGUgVkJUIGZvciB0aGlzLCB0aGF0IHdvdWxkIGJlIHNpbXBs ZSwgaW4KPj4gaW50ZWxfZHNpX2luaXQoKSBjaGVjayBkZXZfcHJpdi0+dmJ0LmRzaS5jb25maWct PnJvdGF0aW9uLCBzZXQKPj4gY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ucGFuZWxfb3JpZW50YXRp b24gYWNjb3JkaW5nbHkgYW5kIGNhbGwKPj4gZHJtX2Nvbm5lY3Rvcl9pbml0X3BhbmVsX29yaWVu dGF0aW9uX3Byb3BlcnR5KCksIGRvbmUuCj4+Cj4+IFVuZm9ydHVuYXRlbHkgdmJ0LmRzaS5jb25m aWctPnJvdGF0aW9uIGlzIGFsd2F5cyAwIGV2ZW4gb24gdGFibGV0cwo+PiB3aXRoIGFuIHVwc2lk ZSBkb3duIExDRCBhbmQgd2hlcmUgdGhlIEdPUCBpcyBwcm9wZXJseSByb3RhdGluZyB0aGUKPj4g RUZJIGZiIGluIGhhcmR3YXJlLgo+Pgo+PiBTbyBpbnN0ZWFkIHdlIGVuZCB1cCByZWFkaW5nIHRo ZSByb3RhdGlvbiBmcm9tIHRoZSBwcmltYXJ5IHBsYW5lLAo+PiB3aGljaCBpcyBhIGJpdCBtb3Jl IGNvbXBsaWNhdGVkLgo+Pgo+PiBUaGUgY29kZSB0byByZWFkIGJhY2sgdGhlIHJvdGF0aW9uIGZy b20gdGhlIGhhcmR3YXJlIGlzIGJhc2VkIG9uIGFuCj4+IGVhcmxpZXIgYXR0ZW1wdCB0byBmaXgg ZmRvIzk0ODk0IGJ5IFZpbGxlIFN5cmphbGEuCj4+Cj4+IEZpeGVzOiBodHRwczovL2J1Z3MuZnJl ZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD05NDg5NAo+PiBDYzogVmlsbGUgU3lyamFsYSA8 dmlsbGUuc3lyamFsYUBsaW51eC5pbnRlbC5jb20+Cj4+IFN1Z2dlc3RlZC1ieTogVmlsbGUgU3ly amFsYSA8dmlsbGUuc3lyamFsYUBsaW51eC5pbnRlbC5jb20+Cj4+IFNpZ25lZC1vZmYtYnk6IEhh bnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+Cj4gCj4gVGhpcyBwYXRjaCBsb29rcyBh IGJpdCBsaWtlIGl0IHRyaWVzIHRvIG1heGltaXplIGxheWVyaW5nIHZpb2xhdGlvbnM6Cj4gCj4g LSBzdG9yZSBwYW5lbCBzdGF0ZSBpbiBwbGFuZV9zdGF0ZQo+IC0gZGlnZyBhIGhvbGUgZnJvbSBn bG9iYWwgY29kZSB0byBzZXQgdXAgcGFuZWwgaW5mb3JtYXRpb24KPiAKPiBDYW4ndCB3ZSBkbyB0 aGlzIGluIGEgYmV0dGVyIHdheT8gSSdtIHRoaW5raW5nIG9mIHNvbWV0aGluZyBtaW1pY2tpbmcg dGhlCj4gZml4ZWQgbW9kZSByZWFkb3V0LCB3aGljaCBpcyBhbHNvIG5vdCBkcml2ZW4gaW4gYSBi YWNrd2FyZHMgd2F5IGxpa2UgdGhpcy4KPiBJLmUuIGEgc21hbGwgaGVscGVyIGluIGludGVsX3Bh bmVsLmMgd2hpY2ggcmVhZHMgb3V0IHRoZSByb3RhdGlvbiBvZiB0aGUKPiBwcmltYXJ5IHBhbmVs IGFuZCBob3BlcyBmb3IgdGhlIGJlc3QuCgpPaywgSSd2ZSByZXdvcmtlZCB0aGlzIGluIGEgd2F5 IHdoaWNoIHdpbGwgaG9wZWZ1bGx5IGJlIG11Y2ggbW9yZSB0bwp5b3VyIGxpa2luZy4gVGhpcyBp cyBub3cgcHJldHR5IG11Y2ggYWxsIGlzb2xhdGVkIHRvIGludGVsX2RzaS5jCgo+IFBsdXMgb2Zj IHRha2luZyB0aGUgcXVpcmsgbGlzdCBpbnRvIGFjY291bnQuCj4gCj4gQWxzbywgaG93IGV4YWN0 bHkgZG9lcyB0aGUgR09QIGZpZ3VyZSBvdXQgd2UgbmVlZCB0byByb3RhdGU/CgpJIHdpc2ggSSBr bmV3LCB0aGUgbG9naWNhbCBhbnN3ZXIgd291bGQgYmUgdGhlIHJvdGF0aW9uIGZpZWxkIG9mCnN0 cnVjdCBtaXBpX2NvbmZpZyAod2hpY2ggaXMgcGFydCBvZiB0aGUgVkJUKSBidXQgYXQgbGVhc3Qg bm8gdGhlCnRhYmxldCB3aXRoIHVwc2lkZS1kb3duIExDRCBwYW5lbCBJJ3ZlIHVzaW5nIHRoYXQg ZmllbGQgaXMgbm90IHRoZQphbnN3ZXIsIGhlbmNlIHRoZSBjb2RlIHRvIHJlYWQgaXQgYmFjayBm cm9tIHRoZSBodyBhdCBib290LgoKUmVnYXJkcywKCkhhbnMKCj4+IC0tLQo+PiBDaGFuZ2VzIGlu IHYyOgo+PiAtUmViYXNlZCBvbiA0LjE0LXJjMQo+PiAtUmVhZGJhY2sgcHJpbWFyeSBwbGFuZSBy b3RhdGlvbiBmcm9tIHRoZSBoYXJkd2FyZSBhbmQgdXNlIHRoYXQgdG8KPj4gICBzZXQgdGhlIHBh bmVsIG9yaWVudGF0aW9uCj4+IC1UaGlzIChyZWFkYmFjaykgZml4ZXMgZmRvIzk0ODk0LCBhZGQg Rml4ZXM6IHRhZwo+PiAtLS0KPj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oICAg ICAgfCAgMyArKysKPj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMgfCAz OSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KPj4gICBkcml2ZXJzL2dwdS9k cm0vaTkxNS9pbnRlbF9kcnYuaCAgICAgfCAgNSArKysrKwo+PiAgIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX3BhbmVsLmMgICB8IDMzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ PiAgIDQgZmlsZXMgY2hhbmdlZCwgNzkgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+Pgo+ PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKPj4gaW5kZXggMThkOWRhNTMyODJiLi5jNGM4NTkwOTcy YjQgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKPj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+PiBAQCAtMjE1MSw2ICsyMTUxLDgg QEAgc3RydWN0IGludGVsX2NkY2xrX3N0YXRlIHsKPj4gICAJdW5zaWduZWQgaW50IGNkY2xrLCB2 Y28sIHJlZjsKPj4gICB9Owo+PiAgIAo+PiArc3RydWN0IGludGVsX3BhbmVsOwo+PiArCj4+ICAg c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgewo+PiAgIAlzdHJ1Y3QgZHJtX2RldmljZSBkcm07Cj4+ ICAgCj4+IEBAIC0yMjAwLDYgKzIyMDIsNyBAQCBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSB7Cj4+ ICAgCXN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICprZXJuZWxfY29udGV4dDsKPj4gICAJc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqZW5naW5lW0k5MTVfTlVNX0VOR0lORVNdOwo+PiAgIAlzdHJ1Y3Qg aTkxNV92bWEgKnNlbWFwaG9yZTsKPj4gKwlzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsOwo+PiAg IAo+PiAgIAlzdHJ1Y3QgZHJtX2RtYV9oYW5kbGUgKnN0YXR1c19wYWdlX2RtYWg7Cj4+ICAgCXN0 cnVjdCByZXNvdXJjZSBtY2hfcmVzOwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5j Cj4+IGluZGV4IDAwY2QxN2M3NmZkYy4uZmJkNjFmOTJiNjBkIDEwMDY0NAo+PiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaW50ZWxfZGlzcGxheS5jCj4+IEBAIC0yODkxLDYgKzI4OTEsOSBAQCBpbnRlbF9maW5k X2luaXRpYWxfcGxhbmVfb2JqKHN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjLAo+PiAgIAkJ cmV0dXJuOwo+PiAgIAl9Cj4+ICAgCj4+ICsJaW50ZWxfcGFuZWxfc2V0X29yaWVudGF0aW9uX2Zy b21fY3J0YyhkZXZfcHJpdi0+cGFuZWwsIGludGVsX2NydGMsCj4+ICsJCQkJCSAgICAgIHBsYW5l X2NvbmZpZy0+cGFuZWxfb3JpZW50YXRpb24pOwo+PiArCj4+ICAgCXBsYW5lX3N0YXRlLT5zcmNf eCA9IDA7Cj4+ICAgCXBsYW5lX3N0YXRlLT5zcmNfeSA9IDA7Cj4+ICAgCXBsYW5lX3N0YXRlLT5z cmNfdyA9IGZiLT53aWR0aCA8PCAxNjsKPj4gQEAgLTc1MjMsNiArNzUyNiwxMCBAQCBpOXh4X2dl dF9pbml0aWFsX3BsYW5lX2NvbmZpZyhzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YywKPj4gICAJCQlw bGFuZV9jb25maWctPnRpbGluZyA9IEk5MTVfVElMSU5HX1g7Cj4+ICAgCQkJZmItPm1vZGlmaWVy ID0gSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQ7Cj4+ICAgCQl9Cj4+ICsKPj4gKwkJaWYgKHZhbCAm IERJU1BQTEFORV9ST1RBVEVfMTgwKQo+PiArCQkJcGxhbmVfY29uZmlnLT5wYW5lbF9vcmllbnRh dGlvbiA9Cj4+ICsJCQkJRFJNX01PREVfUEFORUxfT1JJRU5UQVRJT05fQk9UVE9NX1VQOwo+PiAg IAl9Cj4+ICAgCj4+ICAgCXBpeGVsX2Zvcm1hdCA9IHZhbCAmIERJU1BQTEFORV9QSVhGT1JNQVRf TUFTSzsKPj4gQEAgLTg1NzYsNiArODU4MywyNCBAQCBza3lsYWtlX2dldF9pbml0aWFsX3BsYW5l X2NvbmZpZyhzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YywKPj4gICAJCWdvdG8gZXJyb3I7Cj4+ICAg CX0KPj4gICAKPj4gKwkvKiBUaGUgcm90YXRpb24gaXMgdXNlZCB0byAqY29ycmVjdCogZm9yIHRo ZSBwYW5lbCBvcmllbnRhdGlvbiAqLwo+PiArCXN3aXRjaCAodmFsICYgUExBTkVfQ1RMX1JPVEFU RV9NQVNLKSB7Cj4+ICsJY2FzZSBQTEFORV9DVExfUk9UQVRFXzA6Cj4+ICsJCWJyZWFrOwo+PiAr CWNhc2UgUExBTkVfQ1RMX1JPVEFURV85MDoKPj4gKwkJcGxhbmVfY29uZmlnLT5wYW5lbF9vcmll bnRhdGlvbiA9Cj4+ICsJCQlEUk1fTU9ERV9QQU5FTF9PUklFTlRBVElPTl9SSUdIVF9VUDsKPj4g KwkJYnJlYWs7Cj4+ICsJY2FzZSBQTEFORV9DVExfUk9UQVRFXzE4MDoKPj4gKwkJcGxhbmVfY29u ZmlnLT5wYW5lbF9vcmllbnRhdGlvbiA9Cj4+ICsJCQlEUk1fTU9ERV9QQU5FTF9PUklFTlRBVElP Tl9CT1RUT01fVVA7Cj4+ICsJCWJyZWFrOwo+PiArCWNhc2UgUExBTkVfQ1RMX1JPVEFURV8yNzA6 Cj4+ICsJCXBsYW5lX2NvbmZpZy0+cGFuZWxfb3JpZW50YXRpb24gPQo+PiArCQkJRFJNX01PREVf UEFORUxfT1JJRU5UQVRJT05fTEVGVF9VUDsKPj4gKwkJYnJlYWs7Cj4+ICsJfQo+PiArCj4+ICAg CWJhc2UgPSBJOTE1X1JFQUQoUExBTkVfU1VSRihwaXBlLCAwKSkgJiAweGZmZmZmMDAwOwo+PiAg IAlwbGFuZV9jb25maWctPmJhc2UgPSBiYXNlOwo+PiAgIAo+PiBAQCAtODY2MSw2ICs4Njg2LDEw IEBAIGlyb25sYWtlX2dldF9pbml0aWFsX3BsYW5lX2NvbmZpZyhzdHJ1Y3QgaW50ZWxfY3J0YyAq Y3J0YywKPj4gICAJCQlwbGFuZV9jb25maWctPnRpbGluZyA9IEk5MTVfVElMSU5HX1g7Cj4+ICAg CQkJZmItPm1vZGlmaWVyID0gSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQ7Cj4+ICAgCQl9Cj4+ICsK Pj4gKwkJaWYgKHZhbCAmIERJU1BQTEFORV9ST1RBVEVfMTgwKQo+PiArCQkJcGxhbmVfY29uZmln LT5wYW5lbF9vcmllbnRhdGlvbiA9Cj4+ICsJCQkJRFJNX01PREVfUEFORUxfT1JJRU5UQVRJT05f Qk9UVE9NX1VQOwo+PiAgIAl9Cj4+ICAgCj4+ICAgCXBpeGVsX2Zvcm1hdCA9IHZhbCAmIERJU1BQ TEFORV9QSVhGT1JNQVRfTUFTSzsKPj4gQEAgLTE0NTc4LDcgKzE0NjA3LDkgQEAgaW50IGludGVs X21vZGVzZXRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+PiAgIAlkcm1fbW9kZXNldF91 bmxvY2tfYWxsKGRldik7Cj4+ICAgCj4+ICAgCWZvcl9lYWNoX2ludGVsX2NydGMoZGV2LCBjcnRj KSB7Cj4+IC0JCXN0cnVjdCBpbnRlbF9pbml0aWFsX3BsYW5lX2NvbmZpZyBwbGFuZV9jb25maWcg PSB7fTsKPj4gKwkJc3RydWN0IGludGVsX2luaXRpYWxfcGxhbmVfY29uZmlnIHBsYW5lX2NvbmZp ZyA9IHsKPj4gKwkJCS5wYW5lbF9vcmllbnRhdGlvbiA9IERSTV9NT0RFX1BBTkVMX09SSUVOVEFU SU9OX05PUk1BTCwKPj4gKwkJfTsKPj4gICAKPj4gICAJCWlmICghY3J0Yy0+YWN0aXZlKQo+PiAg IAkJCWNvbnRpbnVlOwo+PiBAQCAtMTQ2MDAsNiArMTQ2MzEsMTIgQEAgaW50IGludGVsX21vZGVz ZXRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+PiAgIAkJaW50ZWxfZmluZF9pbml0aWFs X3BsYW5lX29iaihjcnRjLCAmcGxhbmVfY29uZmlnKTsKPj4gICAJfQo+PiAgIAo+PiArCS8qCj4+ ICsJICogSW5pdCBwYW5lbCBvcmllbnRhdGlvbiBwcm9wIG5vdyB0aGF0IGludGVsX2ZpbmRfaW5p dGlhbF9wbGFuZV9vYmooKQo+PiArCSAqIGhhcyBoYWQgYSBjaGFuY2UgdG8gc2V0IHBhbmVsIG9y aWVudGF0aW9uLgo+PiArCSAqLwo+PiArCWludGVsX3BhbmVsX2luaXRfb3JpZW50YXRpb25fcHJv cChkZXZfcHJpdi0+cGFuZWwpOwo+PiArCj4+ICAgCS8qCj4+ICAgCSAqIE1ha2Ugc3VyZSBoYXJk d2FyZSB3YXRlcm1hcmtzIHJlYWxseSBtYXRjaCB0aGUgc3RhdGUgd2UgcmVhZCBvdXQuCj4+ICAg CSAqIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgcmVjb25zdHJ1Y3RpbmcgdGhl IEJJT1MgZmIncwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2 LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAo+PiBpbmRleCBmYTQ3Mjg1OTE4 ZjQuLjUwZmEwZWVjYTY1NSAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZHJ2LmgKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKPj4gQEAg LTQ0Nyw2ICs0NDcsNyBAQCBzdHJ1Y3QgaW50ZWxfaW5pdGlhbF9wbGFuZV9jb25maWcgewo+PiAg IAl1bnNpZ25lZCBpbnQgdGlsaW5nOwo+PiAgIAlpbnQgc2l6ZTsKPj4gICAJdTMyIGJhc2U7Cj4+ ICsJaW50IHBhbmVsX29yaWVudGF0aW9uOyAvKiBEUk1fTU9ERV9QQU5FTF9PUklFTlRBVElPTl8q ICovCj4+ICAgfTsKPj4gICAKPj4gICAjZGVmaW5lIFNLTF9NSU5fU1JDX1cgOAo+PiBAQCAtMTcw Myw2ICsxNzA0LDEwIEBAIGV4dGVybiBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqaW50ZWxfZmlu ZF9wYW5lbF9kb3duY2xvY2soCj4+ICAgCQkJCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiwKPj4gICAJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmZpeGVkX21vZGUsCj4+ICAg CQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwo+PiArdm9pZCBpbnRlbF9wYW5l bF9zZXRfb3JpZW50YXRpb25fZnJvbV9jcnRjKHN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwsCj4+ ICsJCQkJCSAgIHN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjLAo+PiArCQkJCQkgICBpbnQg b3JpZW50YXRpb24pOwo+PiArdm9pZCBpbnRlbF9wYW5lbF9pbml0X29yaWVudGF0aW9uX3Byb3Ao c3RydWN0IGludGVsX3BhbmVsICpwYW5lbCk7Cj4+ICAgCj4+ICAgI2lmIElTX0VOQUJMRUQoQ09O RklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0UpCj4+ICAgaW50IGludGVsX2JhY2tsaWdodF9kZXZp Y2VfcmVnaXN0ZXIoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKPj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pbnRlbF9wYW5lbC5jCj4+IGluZGV4IDBmNzk0MmE1ZGNjZi4uZmE3ZGZiOWFjNWYw IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jCj4+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMKPj4gQEAgLTE5MjUsMTEgKzE5 MjUsNDQgQEAgaW50ZWxfcGFuZWxfaW5pdF9iYWNrbGlnaHRfZnVuY3Moc3RydWN0IGludGVsX3Bh bmVsICpwYW5lbCkKPj4gICAJfQo+PiAgIH0KPj4gICAKPj4gK3ZvaWQgaW50ZWxfcGFuZWxfc2V0 X29yaWVudGF0aW9uX2Zyb21fY3J0YyhzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsLAo+PiArCQkJ CQkgICBzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YywKPj4gKwkJCQkJICAgaW50IG9yaWVu dGF0aW9uKQo+PiArewo+PiArCXN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKnBhbmVsX2Nvbm47Cj4+ ICsKPj4gKwlpZiAoIXBhbmVsKQo+PiArCQlyZXR1cm47Cj4+ICsKPj4gKwlwYW5lbF9jb25uID0g Y29udGFpbmVyX29mKHBhbmVsLCBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yLCBwYW5lbCk7Cj4+ICsJ aWYgKHBhbmVsX2Nvbm4tPmJhc2Uuc3RhdGUtPmNydGMgPT0gJmludGVsX2NydGMtPmJhc2UpCj4+ ICsJCXBhbmVsX2Nvbm4tPmJhc2UuZGlzcGxheV9pbmZvLnBhbmVsX29yaWVudGF0aW9uID0gb3Jp ZW50YXRpb247Cj4+ICt9Cj4+ICsKPj4gK3ZvaWQgaW50ZWxfcGFuZWxfaW5pdF9vcmllbnRhdGlv bl9wcm9wKHN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwpCj4+ICt7Cj4+ICsJc3RydWN0IGludGVs X2Nvbm5lY3RvciAqcGFuZWxfY29ubjsKPj4gKwo+PiArCWlmICghcGFuZWwgfHwgIXBhbmVsLT5m aXhlZF9tb2RlKQo+PiArCQlyZXR1cm47Cj4+ICsKPj4gKwlwYW5lbF9jb25uID0gY29udGFpbmVy X29mKHBhbmVsLCBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yLCBwYW5lbCk7Cj4+ICsJZHJtX2Nvbm5l Y3Rvcl9pbml0X3BhbmVsX29yaWVudGF0aW9uX3Byb3BlcnR5KCZwYW5lbF9jb25uLT5iYXNlLAo+ PiArCQlwYW5lbC0+Zml4ZWRfbW9kZS0+aGRpc3BsYXksIHBhbmVsLT5maXhlZF9tb2RlLT52ZGlz cGxheSk7Cj4+ICt9Cj4+ICsKPj4gICBpbnQgaW50ZWxfcGFuZWxfaW5pdChzdHJ1Y3QgaW50ZWxf cGFuZWwgKnBhbmVsLAo+PiAgIAkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRf bW9kZSwKPj4gICAJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFsdF9maXhlZF9tb2Rl LAo+PiAgIAkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZG93bmNsb2NrX21vZGUpCj4+ ICAgewo+PiArCXN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmludGVsX2Nvbm5lY3RvciA9Cj4+ICsJ CWNvbnRhaW5lcl9vZihwYW5lbCwgc3RydWN0IGludGVsX2Nvbm5lY3RvciwgcGFuZWwpOwo+PiAr CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoaW50ZWxfY29ubmVj dG9yLT5iYXNlLmRldik7Cj4+ICsKPj4gKwlpZiAoIWRldl9wcml2LT5wYW5lbCkKPj4gKwkJZGV2 X3ByaXYtPnBhbmVsID0gcGFuZWw7Cj4+ICsKPj4gICAJaW50ZWxfcGFuZWxfaW5pdF9iYWNrbGln aHRfZnVuY3MocGFuZWwpOwo+PiAgIAo+PiAgIAlwYW5lbC0+Zml4ZWRfbW9kZSA9IGZpeGVkX21v ZGU7Cj4+IC0tIAo+PiAyLjE0LjIKPj4KPj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KPj4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+PiBkcmktZGV2ZWxA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCj4gCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2RyaS1kZXZlbAo=