From mboxrd@z Thu Jan 1 00:00:00 1970 From: architt@codeaurora.org (Archit Taneja) Date: Mon, 12 Sep 2016 14:01:01 +0530 Subject: [PATCH v3 1/4] drm/bridge: Add RGB to VGA bridge support In-Reply-To: <20160908121751.16911-2-maxime.ripard@free-electrons.com> References: <20160908121751.16911-1-maxime.ripard@free-electrons.com> <20160908121751.16911-2-maxime.ripard@free-electrons.com> Message-ID: <57D667C5.2080800@codeaurora.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi, On 09/08/2016 05:47 PM, Maxime Ripard wrote: > Some boards have an entirely passive RGB to VGA bridge, based on either > DACs or resistor ladders. > > Those might or might not have an i2c bus routed to the VGA connector in > order to access the screen EDIDs. > > Add a bridge that doesn't do anything but expose the modes available on the > screen, either based on the EDIDs if available, or based on the XGA > standards. Some minor comments below, besides the ones by ChenYu. > > Acked-by: Rob Herring > Signed-off-by: Maxime Ripard > --- > .../bindings/display/bridge/rgb-to-vga-bridge.txt | 52 +++++ > drivers/gpu/drm/bridge/Kconfig | 6 + > drivers/gpu/drm/bridge/Makefile | 1 + > drivers/gpu/drm/bridge/rgb-to-vga.c | 232 +++++++++++++++++++++ > 4 files changed, 291 insertions(+) > create mode 100644 Documentation/devicetree/bindings/display/bridge/rgb-to-vga-bridge.txt > create mode 100644 drivers/gpu/drm/bridge/rgb-to-vga.c > > diff --git a/Documentation/devicetree/bindings/display/bridge/rgb-to-vga-bridge.txt b/Documentation/devicetree/bindings/display/bridge/rgb-to-vga-bridge.txt > new file mode 100644 > index 000000000000..83a053fb51a0 > --- /dev/null > +++ b/Documentation/devicetree/bindings/display/bridge/rgb-to-vga-bridge.txt > @@ -0,0 +1,52 @@ > +Passive RGB to VGA bridge > +------------------------- > + > +This binding is aimed for entirely passive RGB to VGA bridges that do not > +require any configuration. > + > +Required properties: > + > +- compatible: Must be "rgb-to-vga-bridge" > + > +Required nodes: > + > +This device has two video ports. Their connections are modeled using the OF > +graph bindings specified in Documentation/devicetree/bindings/graph.txt. > + > +- Video port 0 for RGB input > +- Video port 1 for VGA output > + > + > +Example > +------- > + > +bridge { > + compatible = "rgb-to-vga-bridge"; > + #address-cells = <1>; > + #size-cells = <0>; > + > + ports { > + #address-cells = <1>; > + #size-cells = <0>; > + > + port at 0 { > + #address-cells = <1>; > + #size-cells = <0>; The above 2 properties required for the individual port nodes, right? > + reg = <0>; > + > + vga_bridge_in: endpoint { > + remote-endpoint = <&tcon0_out_vga>; > + }; > + }; > + > + port at 1 { > + #address-cells = <1>; > + #size-cells = <0>; > + reg = <1>; > + > + vga_bridge_out: endpoint { > + remote-endpoint = <&vga_con_in>; > + }; > + }; > + }; > +}; > diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig > index b590e678052d..42b95adf5091 100644 > --- a/drivers/gpu/drm/bridge/Kconfig > +++ b/drivers/gpu/drm/bridge/Kconfig > @@ -17,6 +17,12 @@ config DRM_ANALOGIX_ANX78XX > the HDMI output of an application processor to MyDP > or DisplayPort. > > +config DRM_RGB_TO_VGA > + tristate "Dumb RGB to VGA Bridge support" > + select DRM_KMS_HELPER In the current state of the driver, we need to rely on OF support for it to function properly. I guess we need to depend on CONFIG_OF here. > + help > + Support for passive RGB to VGA bridges > + > config DRM_DW_HDMI > tristate > select DRM_KMS_HELPER > diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile > index efdb07e878f5..3bb8cbe09fe9 100644 > --- a/drivers/gpu/drm/bridge/Makefile > +++ b/drivers/gpu/drm/bridge/Makefile > @@ -1,6 +1,7 @@ > ccflags-y := -Iinclude/drm > > obj-$(CONFIG_DRM_ANALOGIX_ANX78XX) += analogix-anx78xx.o > +obj-$(CONFIG_DRM_RGB_TO_VGA) += rgb-to-vga.o > obj-$(CONFIG_DRM_DW_HDMI) += dw-hdmi.o > obj-$(CONFIG_DRM_DW_HDMI_AHB_AUDIO) += dw-hdmi-ahb-audio.o > obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o > diff --git a/drivers/gpu/drm/bridge/rgb-to-vga.c b/drivers/gpu/drm/bridge/rgb-to-vga.c > new file mode 100644 > index 000000000000..84b1b10198a4 > --- /dev/null > +++ b/drivers/gpu/drm/bridge/rgb-to-vga.c > @@ -0,0 +1,232 @@ > + > +#include > +#include > + > +#include > +#include > +#include > +#include > + > +struct dumb_vga { > + struct drm_bridge bridge; > + struct drm_connector connector; > + > + struct i2c_adapter *ddc; > +}; > + > +static inline struct dumb_vga * > +drm_bridge_to_dumb_vga(struct drm_bridge *bridge) > +{ > + return container_of(bridge, struct dumb_vga, bridge); > +} > + > +static inline struct dumb_vga * > +drm_connector_to_dumb_vga(struct drm_connector *connector) > +{ > + return container_of(connector, struct dumb_vga, connector); > +} > + > +static int dumb_vga_get_modes(struct drm_connector *connector) > +{ > + struct dumb_vga *vga = drm_connector_to_dumb_vga(connector); > + struct edid *edid; > + int ret; > + > + if (IS_ERR(vga->ddc)) > + goto fallback; > + > + edid = drm_get_edid(connector, vga->ddc); > + if (!edid) { > + DRM_INFO("EDID readout failed, falling back to standard modes\n"); > + goto fallback; > + } > + > + drm_mode_connector_update_edid_property(connector, edid); > + return drm_add_edid_modes(connector, edid); > + > +fallback: > + /* > + * In case we cannot retrieve the EDIDs (broken or missing i2c > + * bus), fallback on the XGA standards > + */ > + ret = drm_add_modes_noedid(connector, 1920, 1200); > + > + /* And prefer a mode pretty much anyone can handle */ > + drm_set_preferred_mode(connector, 1024, 768); > + > + return ret; > +} > + > +static struct drm_encoder * > +dumb_vga_best_encoder(struct drm_connector *connector) > +{ > + struct dumb_vga *vga = drm_connector_to_dumb_vga(connector); > + > + return vga->bridge.encoder; > +} > + > +static struct drm_connector_helper_funcs dumb_vga_con_helper_funcs = { > + .get_modes = dumb_vga_get_modes, > + .best_encoder = dumb_vga_best_encoder, > +}; > + > +static enum drm_connector_status > +dumb_vga_connector_detect(struct drm_connector *connector, bool force) > +{ > + struct dumb_vga *vga = drm_connector_to_dumb_vga(connector); > + > + /* > + * Even if we have an I2C bus, we can't assume that the cable > + * is disconnected if drm_probe_ddc. Some cables don't wire s/if/in ? > + * the DDC pins, or the I2C bus might be disfunctional. s/disfunctional/not functional Looks good otherwise. Archit -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project From mboxrd@z Thu Jan 1 00:00:00 1970 From: Archit Taneja Subject: Re: [PATCH v3 1/4] drm/bridge: Add RGB to VGA bridge support Date: Mon, 12 Sep 2016 14:01:01 +0530 Message-ID: <57D667C5.2080800@codeaurora.org> References: <20160908121751.16911-1-maxime.ripard@free-electrons.com> <20160908121751.16911-2-maxime.ripard@free-electrons.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20160908121751.16911-2-maxime.ripard@free-electrons.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Maxime Ripard , Rob Herring , Daniel Vetter , David Airlie Cc: devicetree@vger.kernel.org, Chen-Yu Tsai , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org List-Id: devicetree@vger.kernel.org SGksCgpPbiAwOS8wOC8yMDE2IDA1OjQ3IFBNLCBNYXhpbWUgUmlwYXJkIHdyb3RlOgo+IFNvbWUg Ym9hcmRzIGhhdmUgYW4gZW50aXJlbHkgcGFzc2l2ZSBSR0IgdG8gVkdBIGJyaWRnZSwgYmFzZWQg b24gZWl0aGVyCj4gREFDcyBvciByZXNpc3RvciBsYWRkZXJzLgo+Cj4gVGhvc2UgbWlnaHQgb3Ig bWlnaHQgbm90IGhhdmUgYW4gaTJjIGJ1cyByb3V0ZWQgdG8gdGhlIFZHQSBjb25uZWN0b3IgaW4K PiBvcmRlciB0byBhY2Nlc3MgdGhlIHNjcmVlbiBFRElEcy4KPgo+IEFkZCBhIGJyaWRnZSB0aGF0 IGRvZXNuJ3QgZG8gYW55dGhpbmcgYnV0IGV4cG9zZSB0aGUgbW9kZXMgYXZhaWxhYmxlIG9uIHRo ZQo+IHNjcmVlbiwgZWl0aGVyIGJhc2VkIG9uIHRoZSBFRElEcyBpZiBhdmFpbGFibGUsIG9yIGJh c2VkIG9uIHRoZSBYR0EKPiBzdGFuZGFyZHMuCgpTb21lIG1pbm9yIGNvbW1lbnRzIGJlbG93LCBi ZXNpZGVzIHRoZSBvbmVzIGJ5IENoZW5ZdS4KCj4KPiBBY2tlZC1ieTogUm9iIEhlcnJpbmcgPHJv YmhAa2VybmVsLm9yZz4KPiBTaWduZWQtb2ZmLWJ5OiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlw YXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KPiAtLS0KPiAgIC4uLi9iaW5kaW5ncy9kaXNwbGF5L2Jy aWRnZS9yZ2ItdG8tdmdhLWJyaWRnZS50eHQgIHwgIDUyICsrKysrCj4gICBkcml2ZXJzL2dwdS9k cm0vYnJpZGdlL0tjb25maWcgICAgICAgICAgICAgICAgICAgICB8ICAgNiArCj4gICBkcml2ZXJz L2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICB8ICAgMSArCj4gICBk cml2ZXJzL2dwdS9kcm0vYnJpZGdlL3JnYi10by12Z2EuYyAgICAgICAgICAgICAgICB8IDIzMiAr KysrKysrKysrKysrKysrKysrKysKPiAgIDQgZmlsZXMgY2hhbmdlZCwgMjkxIGluc2VydGlvbnMo KykKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGlu Z3MvZGlzcGxheS9icmlkZ2UvcmdiLXRvLXZnYS1icmlkZ2UudHh0Cj4gICBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9yZ2ItdG8tdmdhLmMKPgo+IGRpZmYgLS1naXQg YS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGlzcGxheS9icmlkZ2UvcmdiLXRv LXZnYS1icmlkZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3Bs YXkvYnJpZGdlL3JnYi10by12Z2EtYnJpZGdlLnR4dAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMDAwMDAwLi44M2EwNTNmYjUxYTAKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv RG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvYnJpZGdlL3JnYi10by12 Z2EtYnJpZGdlLnR4dAo+IEBAIC0wLDAgKzEsNTIgQEAKPiArUGFzc2l2ZSBSR0IgdG8gVkdBIGJy aWRnZQo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICtUaGlzIGJpbmRpbmcgaXMg YWltZWQgZm9yIGVudGlyZWx5IHBhc3NpdmUgUkdCIHRvIFZHQSBicmlkZ2VzIHRoYXQgZG8gbm90 Cj4gK3JlcXVpcmUgYW55IGNvbmZpZ3VyYXRpb24uCj4gKwo+ICtSZXF1aXJlZCBwcm9wZXJ0aWVz Ogo+ICsKPiArLSBjb21wYXRpYmxlOiBNdXN0IGJlICJyZ2ItdG8tdmdhLWJyaWRnZSIKPiArCj4g K1JlcXVpcmVkIG5vZGVzOgo+ICsKPiArVGhpcyBkZXZpY2UgaGFzIHR3byB2aWRlbyBwb3J0cy4g VGhlaXIgY29ubmVjdGlvbnMgYXJlIG1vZGVsZWQgdXNpbmcgdGhlIE9GCj4gK2dyYXBoIGJpbmRp bmdzIHNwZWNpZmllZCBpbiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3JhcGgu dHh0Lgo+ICsKPiArLSBWaWRlbyBwb3J0IDAgZm9yIFJHQiBpbnB1dAo+ICstIFZpZGVvIHBvcnQg MSBmb3IgVkdBIG91dHB1dAo+ICsKPiArCj4gK0V4YW1wbGUKPiArLS0tLS0tLQo+ICsKPiArYnJp ZGdlIHsKPiArCWNvbXBhdGlibGUgPSAicmdiLXRvLXZnYS1icmlkZ2UiOwo+ICsJI2FkZHJlc3Mt Y2VsbHMgPSA8MT47Cj4gKwkjc2l6ZS1jZWxscyA9IDwwPjsKPiArCj4gKwlwb3J0cyB7Cj4gKwkJ I2FkZHJlc3MtY2VsbHMgPSA8MT47Cj4gKwkJI3NpemUtY2VsbHMgPSA8MD47Cj4gKwo+ICsJCXBv cnRAMCB7Cj4gKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+Owo+ICsJCQkjc2l6ZS1jZWxscyA9IDww PjsKClRoZSBhYm92ZSAyIHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIHRoZSBpbmRpdmlkdWFsIHBv cnQgbm9kZXMsIHJpZ2h0PwoKPiArCQkJcmVnID0gPDA+Owo+ICsKPiArCQkJdmdhX2JyaWRnZV9p bjogZW5kcG9pbnQgewo+ICsJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZ0Y29uMF9vdXRfdmdhPjsK PiArCQkJfTsKPiArCQl9Owo+ICsKPiArCQlwb3J0QDEgewo+ICsJCQkjYWRkcmVzcy1jZWxscyA9 IDwxPjsKPiArCQkJI3NpemUtY2VsbHMgPSA8MD47Cj4gKwkJCXJlZyA9IDwxPjsKPiArCj4gKwkJ CXZnYV9icmlkZ2Vfb3V0OiBlbmRwb2ludCB7Cj4gKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JnZn YV9jb25faW4+Owo+ICsJCQl9Owo+ICsJCX07Cj4gKwl9Owo+ICt9Owo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tj b25maWcKPiBpbmRleCBiNTkwZTY3ODA1MmQuLjQyYjk1YWRmNTA5MSAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJp ZGdlL0tjb25maWcKPiBAQCAtMTcsNiArMTcsMTIgQEAgY29uZmlnIERSTV9BTkFMT0dJWF9BTlg3 OFhYCj4gICAJICB0aGUgSERNSSBvdXRwdXQgb2YgYW4gYXBwbGljYXRpb24gcHJvY2Vzc29yIHRv IE15RFAKPiAgIAkgIG9yIERpc3BsYXlQb3J0Lgo+Cj4gK2NvbmZpZyBEUk1fUkdCX1RPX1ZHQQo+ ICsJdHJpc3RhdGUgIkR1bWIgUkdCIHRvIFZHQSBCcmlkZ2Ugc3VwcG9ydCIKPiArCXNlbGVjdCBE Uk1fS01TX0hFTFBFUgoKSW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRyaXZlciwgd2UgbmVl ZCB0byByZWx5IG9uIE9GIHN1cHBvcnQgZm9yCml0IHRvIGZ1bmN0aW9uIHByb3Blcmx5LiBJIGd1 ZXNzIHdlIG5lZWQgdG8gZGVwZW5kIG9uIENPTkZJR19PRiBoZXJlLgoKPiArCWhlbHAKPiArCSAg U3VwcG9ydCBmb3IgcGFzc2l2ZSBSR0IgdG8gVkdBIGJyaWRnZXMKPiArCj4gICBjb25maWcgRFJN X0RXX0hETUkKPiAgIAl0cmlzdGF0ZQo+ICAgCXNlbGVjdCBEUk1fS01TX0hFTFBFUgo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJt L2JyaWRnZS9NYWtlZmlsZQo+IGluZGV4IGVmZGIwN2U4NzhmNS4uM2JiOGNiZTA5ZmU5IDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJz L2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlCj4gQEAgLTEsNiArMSw3IEBACj4gICBjY2ZsYWdzLXkg Oj0gLUlpbmNsdWRlL2RybQo+Cj4gICBvYmotJChDT05GSUdfRFJNX0FOQUxPR0lYX0FOWDc4WFgp ICs9IGFuYWxvZ2l4LWFueDc4eHgubwo+ICtvYmotJChDT05GSUdfRFJNX1JHQl9UT19WR0EpICs9 IHJnYi10by12Z2Eubwo+ICAgb2JqLSQoQ09ORklHX0RSTV9EV19IRE1JKSArPSBkdy1oZG1pLm8K PiAgIG9iai0kKENPTkZJR19EUk1fRFdfSERNSV9BSEJfQVVESU8pICs9IGR3LWhkbWktYWhiLWF1 ZGlvLm8KPiAgIG9iai0kKENPTkZJR19EUk1fTlhQX1BUTjM0NjApICs9IG54cC1wdG4zNDYwLm8K PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9yZ2ItdG8tdmdhLmMgYi9kcml2 ZXJzL2dwdS9kcm0vYnJpZGdlL3JnYi10by12Z2EuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMDAwMDAwLi44NGIxYjEwMTk4YTQKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9yZ2ItdG8tdmdhLmMKPiBAQCAtMCwwICsxLDIzMiBAQAo+ ICsKPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2ZfZ3Jh cGguaD4KPiArCj4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9h dG9taWNfaGVscGVyLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4KPiArI2luY2x1ZGUg PGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KPiArCj4gK3N0cnVjdCBkdW1iX3ZnYSB7Cj4gKwlzdHJ1 Y3QgZHJtX2JyaWRnZQlicmlkZ2U7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcgljb25uZWN0b3I7 Cj4gKwo+ICsJc3RydWN0IGkyY19hZGFwdGVyCSpkZGM7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW5s aW5lIHN0cnVjdCBkdW1iX3ZnYSAqCj4gK2RybV9icmlkZ2VfdG9fZHVtYl92Z2Eoc3RydWN0IGRy bV9icmlkZ2UgKmJyaWRnZSkKPiArewo+ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihicmlkZ2UsIHN0 cnVjdCBkdW1iX3ZnYSwgYnJpZGdlKTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBzdHJ1Y3Qg ZHVtYl92Z2EgKgo+ICtkcm1fY29ubmVjdG9yX3RvX2R1bWJfdmdhKHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IpCj4gK3sKPiArCXJldHVybiBjb250YWluZXJfb2YoY29ubmVjdG9yLCBz dHJ1Y3QgZHVtYl92Z2EsIGNvbm5lY3Rvcik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHVtYl92 Z2FfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCj4gK3sKPiArCXN0 cnVjdCBkdW1iX3ZnYSAqdmdhID0gZHJtX2Nvbm5lY3Rvcl90b19kdW1iX3ZnYShjb25uZWN0b3Ip Owo+ICsJc3RydWN0IGVkaWQgKmVkaWQ7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWlmIChJU19FUlIo dmdhLT5kZGMpKQo+ICsJCWdvdG8gZmFsbGJhY2s7Cj4gKwo+ICsJZWRpZCA9IGRybV9nZXRfZWRp ZChjb25uZWN0b3IsIHZnYS0+ZGRjKTsKPiArCWlmICghZWRpZCkgewo+ICsJCURSTV9JTkZPKCJF RElEIHJlYWRvdXQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gc3RhbmRhcmQgbW9kZXNcbiIpOwo+ ICsJCWdvdG8gZmFsbGJhY2s7Cj4gKwl9Cj4gKwo+ICsJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0 ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3RvciwgZWRpZCk7Cj4gKwlyZXR1cm4gZHJtX2FkZF9lZGlk X21vZGVzKGNvbm5lY3RvciwgZWRpZCk7Cj4gKwo+ICtmYWxsYmFjazoKPiArCS8qCj4gKwkgKiBJ biBjYXNlIHdlIGNhbm5vdCByZXRyaWV2ZSB0aGUgRURJRHMgKGJyb2tlbiBvciBtaXNzaW5nIGky Ywo+ICsJICogYnVzKSwgZmFsbGJhY2sgb24gdGhlIFhHQSBzdGFuZGFyZHMKPiArCSAqLwo+ICsJ cmV0ID0gZHJtX2FkZF9tb2Rlc19ub2VkaWQoY29ubmVjdG9yLCAxOTIwLCAxMjAwKTsKPiArCj4g KwkvKiBBbmQgcHJlZmVyIGEgbW9kZSBwcmV0dHkgbXVjaCBhbnlvbmUgY2FuIGhhbmRsZSAqLwo+ ICsJZHJtX3NldF9wcmVmZXJyZWRfbW9kZShjb25uZWN0b3IsIDEwMjQsIDc2OCk7Cj4gKwo+ICsJ cmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCBkcm1fZW5jb2RlciAqCj4gK2R1 bWJfdmdhX2Jlc3RfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7 Cj4gKwlzdHJ1Y3QgZHVtYl92Z2EgKnZnYSA9IGRybV9jb25uZWN0b3JfdG9fZHVtYl92Z2EoY29u bmVjdG9yKTsKPiArCj4gKwlyZXR1cm4gdmdhLT5icmlkZ2UuZW5jb2RlcjsKPiArfQo+ICsKPiAr c3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBkdW1iX3ZnYV9jb25faGVs cGVyX2Z1bmNzID0gewo+ICsJLmdldF9tb2Rlcwk9IGR1bWJfdmdhX2dldF9tb2RlcywKPiArCS5i ZXN0X2VuY29kZXIJPSBkdW1iX3ZnYV9iZXN0X2VuY29kZXIsCj4gK307Cj4gKwo+ICtzdGF0aWMg ZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwo+ICtkdW1iX3ZnYV9jb25uZWN0b3JfZGV0ZWN0KHN0 cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGJvb2wgZm9yY2UpCj4gK3sKPiArCXN0cnVj dCBkdW1iX3ZnYSAqdmdhID0gZHJtX2Nvbm5lY3Rvcl90b19kdW1iX3ZnYShjb25uZWN0b3IpOwo+ ICsKPiArCS8qCj4gKwkgKiBFdmVuIGlmIHdlIGhhdmUgYW4gSTJDIGJ1cywgd2UgY2FuJ3QgYXNz dW1lIHRoYXQgdGhlIGNhYmxlCj4gKwkgKiBpcyBkaXNjb25uZWN0ZWQgaWYgZHJtX3Byb2JlX2Rk Yy4gU29tZSBjYWJsZXMgZG9uJ3Qgd2lyZQoKcy9pZi9pbiA/Cgo+ICsJICogdGhlIEREQyBwaW5z LCBvciB0aGUgSTJDIGJ1cyBtaWdodCBiZSBkaXNmdW5jdGlvbmFsLgoKcy9kaXNmdW5jdGlvbmFs L25vdCBmdW5jdGlvbmFsCgpMb29rcyBnb29kIG90aGVyd2lzZS4KCkFyY2hpdAoKLS0gClF1YWxj b21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuIGlzIGEgbWVtYmVyIG9mIENvZGUgQXVyb3JhIEZv cnVtLAphIExpbnV4IEZvdW5kYXRpb24gQ29sbGFib3JhdGl2ZSBQcm9qZWN0Cl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxp c3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=