From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from galahad.ideasonboard.com ([185.26.127.97]:57832 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750733AbeBTJPP (ORCPT ); Tue, 20 Feb 2018 04:15:15 -0500 From: Laurent Pinchart To: Rob Herring Cc: Laurent Pinchart , dri-devel , "open list:MEDIA DRIVERS FOR RENESAS - FCP" , Sergei Shtylyov , devicetree@vger.kernel.org, Frank Rowand Subject: Re: [PATCH v3 03/12] drm: rcar-du: Fix legacy DT to create LVDS encoder nodes Date: Tue, 20 Feb 2018 11:15:53 +0200 Message-ID: <3866023.VvEQmjTL1d@avalon> In-Reply-To: References: <20180215000415.19077-1-laurent.pinchart+renesas@ideasonboard.com> <20180215000415.19077-4-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: Hi Rob, On Tuesday, 20 February 2018 02:54:00 EET Rob Herring wrote: > On Wed, Feb 14, 2018 at 6:04 PM, Laurent Pinchart wrote: > > The internal LVDS encoders now have their own DT bindings. Before > > switching the driver infrastructure to those new bindings, implement > > backward-compatibility through live DT patching. > > > > Patching is disabled and will be enabled along with support for the new > > DT bindings in the DU driver. > > > > Signed-off-by: Laurent Pinchart > > > > --- > > Changes since v2: > > > > - Update the SPDX headers to use C-style comments in header files > > - Removed the manually created __local_fixups__ node > > - Perform manual fixups on live DT instead of overlay > > Generally looks fine to me. A few things below. > > > Changes since v1: > > > > - Select OF_FLATTREE > > - Compile LVDS DT bindings patch code when DRM_RCAR_LVDS is selected > > - Update the SPDX headers to use GPL-2.0 instead of GPL-2.0-only > > - Turn __dtb_rcar_du_of_lvds_(begin|end) from u8 to char > > - Pass void begin and end pointers to rcar_du_of_get_overlay() > > - Use of_get_parent() instead of accessing the parent pointer directly > > - Find the LVDS endpoints nodes based on the LVDS node instead of the > > > > root of the overlay > > > > - Update to the -lvds compatible string format > > --- > > > > drivers/gpu/drm/rcar-du/Kconfig | 2 + > > drivers/gpu/drm/rcar-du/Makefile | 7 +- > > drivers/gpu/drm/rcar-du/rcar_du_of.c | 374 > > +++++++++++++++++++++ drivers/gpu/drm/rcar-du/rcar_du_of.h > > | 20 ++ > > .../gpu/drm/rcar-du/rcar_du_of_lvds_r8a7790.dts | 81 +++++ > > .../gpu/drm/rcar-du/rcar_du_of_lvds_r8a7791.dts | 55 +++ > > .../gpu/drm/rcar-du/rcar_du_of_lvds_r8a7793.dts | 55 +++ > > .../gpu/drm/rcar-du/rcar_du_of_lvds_r8a7795.dts | 55 +++ > > .../gpu/drm/rcar-du/rcar_du_of_lvds_r8a7796.dts | 55 +++ > > 9 files changed, 703 insertions(+), 1 deletion(-) > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_du_of.c > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_du_of.h > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7790.dts > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7791.dts > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7793.dts > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7795.dts > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7796.dts > > > > diff --git a/drivers/gpu/drm/rcar-du/Kconfig > > b/drivers/gpu/drm/rcar-du/Kconfig index 5d0b4b7119af..3f83352a7313 100644 > > --- a/drivers/gpu/drm/rcar-du/Kconfig > > +++ b/drivers/gpu/drm/rcar-du/Kconfig > > @@ -22,6 +22,8 @@ config DRM_RCAR_LVDS > > > > bool "R-Car DU LVDS Encoder Support" > > depends on DRM_RCAR_DU > > select DRM_PANEL > > > > + select OF_FLATTREE > > + select OF_OVERLAY > > > > help > > > > Enable support for the R-Car Display Unit embedded LVDS > > encoders. > > > > diff --git a/drivers/gpu/drm/rcar-du/Makefile > > b/drivers/gpu/drm/rcar-du/Makefile index 0cf5c11030e8..86b337b4be5d > > 100644 > > --- a/drivers/gpu/drm/rcar-du/Makefile > > +++ b/drivers/gpu/drm/rcar-du/Makefile > > @@ -8,7 +8,12 @@ rcar-du-drm-y := rcar_du_crtc.o \ > > > > rcar_du_plane.o > > > > rcar-du-drm-$(CONFIG_DRM_RCAR_LVDS) += rcar_du_lvdsenc.o > > > > - > > +rcar-du-drm-$(CONFIG_DRM_RCAR_LVDS) += rcar_du_of.o \ > > + rcar_du_of_lvds_r8a7790.dtb.o \ > > + rcar_du_of_lvds_r8a7791.dtb.o \ > > + rcar_du_of_lvds_r8a7793.dtb.o \ > > + rcar_du_of_lvds_r8a7795.dtb.o \ > > + rcar_du_of_lvds_r8a7796.dtb.o > > > > rcar-du-drm-$(CONFIG_DRM_RCAR_VSP) += rcar_du_vsp.o > > > > obj-$(CONFIG_DRM_RCAR_DU) += rcar-du-drm.o > > > > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_of.c > > b/drivers/gpu/drm/rcar-du/rcar_du_of.c new file mode 100644 > > index 000000000000..141f6eda6e98 > > --- /dev/null > > +++ b/drivers/gpu/drm/rcar-du/rcar_du_of.c [snip] > > +static struct device_node __init * > > +rcar_du_of_find_node_by_path(struct device_node *parent, const char > > *path) > > +{ > > I guess I never followed up on the last version. I think a wrapper > around __of_find_node_by_path would work for you here. It can start at > any level. Though maybe it is not needed. See below. You're right, I won't need this function anymore, so I'll drop it. I think looking up a node by path starting at a given parent would still be useful, but there's no need to add a function without a user. > > + parent = of_node_get(parent); > > + if (!parent) > > + return NULL; > > + > > + while (parent && *path == '/') { > > + struct device_node *child = NULL; > > + struct device_node *node; > > + const char *next; > > + size_t len; > > + > > + /* Skip the initial '/' delimiter and find the next one. > > */ > > + path++; > > + next = strchrnul(path, '/'); > > + len = next - path; > > + if (!len) > > + goto error; > > + > > + for_each_child_of_node(parent, node) { > > + const char *name = kbasename(node->full_name); > > + > > + if (strncmp(path, name, len) == 0 && > > + strlen(name) == len) { > > + child = node; > > + break; > > + } > > + } > > + > > + if (!child) > > + goto error; > > + > > + of_node_put(parent); > > + parent = child; > > + path = next; > > + } > > + > > + return parent; > > + > > +error: > > + of_node_put(parent); > > + return NULL; > > +} > > + > > +static int __init rcar_du_of_add_property(struct device_node *np, > > + const char *name, const void > > *value, > > + size_t length) > > So, were you going to revive Pantelis' patch or move this to the core? Do you have a pointer to that patch ? > > +{ > > + struct property *prop; > > + > > + prop = kzalloc(sizeof(*prop), GFP_KERNEL); > > + if (!prop) > > + return -ENOMEM; > > + > > + prop->name = kstrdup(name, GFP_KERNEL); > > + prop->value = kmemdup(value, length, GFP_KERNEL); > > + prop->length = length; > > + > > + if (!prop->name || !prop->value) { > > + kfree(prop->name); > > + kfree(prop->value); > > + kfree(prop); > > + return -ENOMEM; > > + } > > + > > + of_property_set_flag(prop, OF_DYNAMIC); > > + > > + prop->next = np->properties; > > + np->properties = prop; > > + > > + return 0; > > +} [snip] > > +static void __init rcar_du_of_lvds_patch_one(struct device_node *lvds, > > + const struct of_phandle_args > > *clk, > > + struct device_node *local, > > + struct device_node *remote) > > +{ > > + struct device_node *endpoints[2]; > > + unsigned int psize; > > + unsigned int i; > > + __be32 value[4]; > > + int ret; > > + > > + /* > > + * Set the LVDS clocks property. This can't be performed by the > > overlay > > + * as the structure of the clock specifier has changed over time, > > and we > > + * don't know at compile time which binding version the system we > > will > > + * run on uses. > > + */ > > + if (clk->args_count >= ARRAY_SIZE(value) - 1) > > + return; > > + > > + value[0] = cpu_to_be32(clk->np->phandle); > > + for (i = 0; i < clk->args_count; ++i) > > + value[i + 1] = cpu_to_be32(clk->args[i]); > > + > > + psize = (clk->args_count + 1) * 4; > > + ret = rcar_du_of_add_property(lvds, "clocks", value, psize); > > + if (ret < 0) > > + return; > > + > > + /* > > + * Insert the node in the OF graph: patch the LVDS ports > > remote-endpoint > > + * properties to point to the endpoints of the sibling nodes in > > the > > + * graph. This can't be performed by the overlay: on the input > > side the > > + * overlay would contain a phandle for the DU LVDS output port > > that > > + * would clash with the system DT, and on the output side the > > connection > > + * is board-specific. > > + */ > > + endpoints[0] = rcar_du_of_find_node_by_path(lvds, > > + > > "/ports/port@0/endpoint"); > > of_graph_get_endpoint_by_regs() should work here instead or am I > missing something? Good point. The patch series started with a need for a node lookup by path function to patch the overlay before applying it, and I failed to see that the function wasn't needed anymore in this new version. I've successfully tested of_graph_get_endpoint_by_regs(), I'll use that in v4. > > + endpoints[1] = rcar_du_of_find_node_by_path(lvds, > > + > > "/ports/port@1/endpoint"); + if (!endpoints[0] || !endpoints[1]) > > + return; > > + > > + value[0] = cpu_to_be32(local->phandle); > > + ret = rcar_du_of_add_property(endpoints[0], "remote-endpoint", > > + value, 4); > > s/4/sizeof(__be32)/ Will fix in v4. > > + if (ret < 0) > > + goto done; > > + > > + value[0] = cpu_to_be32(remote->phandle); > > + ret = rcar_du_of_add_property(endpoints[1], "remote-endpoint", > > + value, 4); > > + if (ret < 0) > > + goto done; > > + > > +done: > > + of_node_put(endpoints[0]); > > + of_node_put(endpoints[1]); > > +} [snip] -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v3 03/12] drm: rcar-du: Fix legacy DT to create LVDS encoder nodes Date: Tue, 20 Feb 2018 11:15:53 +0200 Message-ID: <3866023.VvEQmjTL1d@avalon> References: <20180215000415.19077-1-laurent.pinchart+renesas@ideasonboard.com> <20180215000415.19077-4-laurent.pinchart+renesas@ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Rob Herring Cc: devicetree@vger.kernel.org, Laurent Pinchart , Sergei Shtylyov , dri-devel , "open list:MEDIA DRIVERS FOR RENESAS - FCP" , Frank Rowand List-Id: devicetree@vger.kernel.org SGkgUm9iLAoKT24gVHVlc2RheSwgMjAgRmVicnVhcnkgMjAxOCAwMjo1NDowMCBFRVQgUm9iIEhl cnJpbmcgd3JvdGU6Cj4gT24gV2VkLCBGZWIgMTQsIDIwMTggYXQgNjowNCBQTSwgTGF1cmVudCBQ aW5jaGFydCB3cm90ZToKPiA+IFRoZSBpbnRlcm5hbCBMVkRTIGVuY29kZXJzIG5vdyBoYXZlIHRo ZWlyIG93biBEVCBiaW5kaW5ncy4gQmVmb3JlCj4gPiBzd2l0Y2hpbmcgdGhlIGRyaXZlciBpbmZy YXN0cnVjdHVyZSB0byB0aG9zZSBuZXcgYmluZGluZ3MsIGltcGxlbWVudAo+ID4gYmFja3dhcmQt Y29tcGF0aWJpbGl0eSB0aHJvdWdoIGxpdmUgRFQgcGF0Y2hpbmcuCj4gPiAKPiA+IFBhdGNoaW5n IGlzIGRpc2FibGVkIGFuZCB3aWxsIGJlIGVuYWJsZWQgYWxvbmcgd2l0aCBzdXBwb3J0IGZvciB0 aGUgbmV3Cj4gPiBEVCBiaW5kaW5ncyBpbiB0aGUgRFUgZHJpdmVyLgo+ID4gCj4gPiBTaWduZWQt b2ZmLWJ5OiBMYXVyZW50IFBpbmNoYXJ0Cj4gPiA8bGF1cmVudC5waW5jaGFydCtyZW5lc2FzQGlk ZWFzb25ib2FyZC5jb20+Cj4gPiAtLS0KPiA+IENoYW5nZXMgc2luY2UgdjI6Cj4gPiAKPiA+IC0g VXBkYXRlIHRoZSBTUERYIGhlYWRlcnMgdG8gdXNlIEMtc3R5bGUgY29tbWVudHMgaW4gaGVhZGVy IGZpbGVzCj4gPiAtIFJlbW92ZWQgdGhlIG1hbnVhbGx5IGNyZWF0ZWQgX19sb2NhbF9maXh1cHNf XyBub2RlCj4gPiAtIFBlcmZvcm0gbWFudWFsIGZpeHVwcyBvbiBsaXZlIERUIGluc3RlYWQgb2Yg b3ZlcmxheQo+IAo+IEdlbmVyYWxseSBsb29rcyBmaW5lIHRvIG1lLiBBIGZldyB0aGluZ3MgYmVs b3cuCj4gCj4gPiBDaGFuZ2VzIHNpbmNlIHYxOgo+ID4gCj4gPiAtIFNlbGVjdCBPRl9GTEFUVFJF RQo+ID4gLSBDb21waWxlIExWRFMgRFQgYmluZGluZ3MgcGF0Y2ggY29kZSB3aGVuIERSTV9SQ0FS X0xWRFMgaXMgc2VsZWN0ZWQKPiA+IC0gVXBkYXRlIHRoZSBTUERYIGhlYWRlcnMgdG8gdXNlIEdQ TC0yLjAgaW5zdGVhZCBvZiBHUEwtMi4wLW9ubHkKPiA+IC0gVHVybiBfX2R0Yl9yY2FyX2R1X29m X2x2ZHNfKGJlZ2lufGVuZCkgZnJvbSB1OCB0byBjaGFyCj4gPiAtIFBhc3Mgdm9pZCBiZWdpbiBh bmQgZW5kIHBvaW50ZXJzIHRvIHJjYXJfZHVfb2ZfZ2V0X292ZXJsYXkoKQo+ID4gLSBVc2Ugb2Zf Z2V0X3BhcmVudCgpIGluc3RlYWQgb2YgYWNjZXNzaW5nIHRoZSBwYXJlbnQgcG9pbnRlciBkaXJl Y3RseQo+ID4gLSBGaW5kIHRoZSBMVkRTIGVuZHBvaW50cyBub2RlcyBiYXNlZCBvbiB0aGUgTFZE UyBub2RlIGluc3RlYWQgb2YgdGhlCj4gPiAKPiA+ICAgcm9vdCBvZiB0aGUgb3ZlcmxheQo+ID4g Cj4gPiAtIFVwZGF0ZSB0byB0aGUgPHNvYz4tbHZkcyBjb21wYXRpYmxlIHN0cmluZyBmb3JtYXQK PiA+IC0tLQo+ID4gCj4gPiAgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvS2NvbmZpZyAgICAgICAg ICAgICAgICAgICAgfCAgIDIgKwo+ID4gIGRyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L01ha2VmaWxl ICAgICAgICAgICAgICAgICAgIHwgICA3ICstCj4gPiAgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUv cmNhcl9kdV9vZi5jICAgICAgICAgICAgICAgfCAzNzQKPiA+ICArKysrKysrKysrKysrKysrKysr KysgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9vZi5oICAgICAgICAgICAgICAKPiA+ ICB8ICAyMCArKwo+ID4gIC4uLi9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9vZl9sdmRzX3I4YTc3 OTAuZHRzICAgIHwgIDgxICsrKysrCj4gPiAgLi4uL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X29m X2x2ZHNfcjhhNzc5MS5kdHMgICAgfCAgNTUgKysrCj4gPiAgLi4uL2dwdS9kcm0vcmNhci1kdS9y Y2FyX2R1X29mX2x2ZHNfcjhhNzc5My5kdHMgICAgfCAgNTUgKysrCj4gPiAgLi4uL2dwdS9kcm0v cmNhci1kdS9yY2FyX2R1X29mX2x2ZHNfcjhhNzc5NS5kdHMgICAgfCAgNTUgKysrCj4gPiAgLi4u L2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X29mX2x2ZHNfcjhhNzc5Ni5kdHMgICAgfCAgNTUgKysr Cj4gPiAgOSBmaWxlcyBjaGFuZ2VkLCA3MDMgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+ ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X29m LmMKPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9k dV9vZi5oCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3Jj YXJfZHVfb2ZfbHZkc19yOGE3NzkwLmR0cwo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X29mX2x2ZHNfcjhhNzc5MS5kdHMKPiA+ICBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9vZl9sdmRzX3I4YTc3 OTMuZHRzCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3Jj YXJfZHVfb2ZfbHZkc19yOGE3Nzk1LmR0cwo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X29mX2x2ZHNfcjhhNzc5Ni5kdHMKPiA+IAo+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L0tjb25maWcKPiA+IGIvZHJpdmVycy9n cHUvZHJtL3JjYXItZHUvS2NvbmZpZyBpbmRleCA1ZDBiNGI3MTE5YWYuLjNmODMzNTJhNzMxMyAx MDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L0tjb25maWcKPiA+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L0tjb25maWcKPiA+IEBAIC0yMiw2ICsyMiw4IEBAIGNv bmZpZyBEUk1fUkNBUl9MVkRTCj4gPiAKPiA+ICAgICAgICAgYm9vbCAiUi1DYXIgRFUgTFZEUyBF bmNvZGVyIFN1cHBvcnQiCj4gPiAgICAgICAgIGRlcGVuZHMgb24gRFJNX1JDQVJfRFUKPiA+ICAg ICAgICAgc2VsZWN0IERSTV9QQU5FTAo+ID4gCj4gPiArICAgICAgIHNlbGVjdCBPRl9GTEFUVFJF RQo+ID4gKyAgICAgICBzZWxlY3QgT0ZfT1ZFUkxBWQo+ID4gCj4gPiAgICAgICAgIGhlbHAKPiA+ ICAgICAgICAgCj4gPiAgICAgICAgICAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBSLUNhciBEaXNw bGF5IFVuaXQgZW1iZWRkZWQgTFZEUwo+ID4gICAgICAgICAgIGVuY29kZXJzLgo+ID4gCj4gPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvTWFrZWZpbGUKPiA+IGIvZHJpdmVy cy9ncHUvZHJtL3JjYXItZHUvTWFrZWZpbGUgaW5kZXggMGNmNWMxMTAzMGU4Li44NmIzMzdiNGJl NWQKPiA+IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvTWFrZWZpbGUK PiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L01ha2VmaWxlCj4gPiBAQCAtOCw3ICs4 LDEyIEBAIHJjYXItZHUtZHJtLXkgOj0gcmNhcl9kdV9jcnRjLm8gXAo+ID4gCj4gPiAgICAgICAg ICAgICAgICAgIHJjYXJfZHVfcGxhbmUubwo+ID4gIAo+ID4gIHJjYXItZHUtZHJtLSQoQ09ORklH X0RSTV9SQ0FSX0xWRFMpICAgICs9IHJjYXJfZHVfbHZkc2VuYy5vCj4gPiAKPiA+IC0KPiA+ICty Y2FyLWR1LWRybS0kKENPTkZJR19EUk1fUkNBUl9MVkRTKSAgICArPSByY2FyX2R1X29mLm8gXAo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjYXJfZHVfb2Zf bHZkc19yOGE3NzkwLmR0Yi5vIFwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICByY2FyX2R1X29mX2x2ZHNfcjhhNzc5MS5kdGIubyBcCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNhcl9kdV9vZl9sdmRzX3I4YTc3OTMu ZHRiLm8gXAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJj YXJfZHVfb2ZfbHZkc19yOGE3Nzk1LmR0Yi5vIFwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICByY2FyX2R1X29mX2x2ZHNfcjhhNzc5Ni5kdGIubwo+ID4gCj4g PiAgcmNhci1kdS1kcm0tJChDT05GSUdfRFJNX1JDQVJfVlNQKSAgICAgKz0gcmNhcl9kdV92c3Au bwo+ID4gIAo+ID4gIG9iai0kKENPTkZJR19EUk1fUkNBUl9EVSkgICAgICAgICAgICAgICs9IHJj YXItZHUtZHJtLm8KPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1 L3JjYXJfZHVfb2YuYwo+ID4gYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X29mLmMg bmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uMTQxZjZlZGE2ZTk4 Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2Fy X2R1X29mLmMKCltzbmlwXQoKPiA+ICtzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlIF9faW5pdCAq Cj4gPiArcmNhcl9kdV9vZl9maW5kX25vZGVfYnlfcGF0aChzdHJ1Y3QgZGV2aWNlX25vZGUgKnBh cmVudCwgY29uc3QgY2hhcgo+ID4gKnBhdGgpCj4gPiArewo+IAo+IEkgZ3Vlc3MgSSBuZXZlciBm b2xsb3dlZCB1cCBvbiB0aGUgbGFzdCB2ZXJzaW9uLiBJIHRoaW5rIGEgd3JhcHBlcgo+IGFyb3Vu ZCBfX29mX2ZpbmRfbm9kZV9ieV9wYXRoIHdvdWxkIHdvcmsgZm9yIHlvdSBoZXJlLiBJdCBjYW4g c3RhcnQgYXQKPiBhbnkgbGV2ZWwuIFRob3VnaCBtYXliZSBpdCBpcyBub3QgbmVlZGVkLiBTZWUg YmVsb3cuCgpZb3UncmUgcmlnaHQsIEkgd29uJ3QgbmVlZCB0aGlzIGZ1bmN0aW9uIGFueW1vcmUs IHNvIEknbGwgZHJvcCBpdC4gSSB0aGluayAKbG9va2luZyB1cCBhIG5vZGUgYnkgcGF0aCBzdGFy dGluZyBhdCBhIGdpdmVuIHBhcmVudCB3b3VsZCBzdGlsbCBiZSB1c2VmdWwsIApidXQgdGhlcmUn cyBubyBuZWVkIHRvIGFkZCBhIGZ1bmN0aW9uIHdpdGhvdXQgYSB1c2VyLgoKPiA+ICsgICAgICAg cGFyZW50ID0gb2Zfbm9kZV9nZXQocGFyZW50KTsKPiA+ICsgICAgICAgaWYgKCFwYXJlbnQpCj4g PiArICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cj4gPiArCj4gPiArICAgICAgIHdoaWxlIChw YXJlbnQgJiYgKnBhdGggPT0gJy8nKSB7Cj4gPiArICAgICAgICAgICAgICAgc3RydWN0IGRldmlj ZV9ub2RlICpjaGlsZCA9IE5VTEw7Cj4gPiArICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9u b2RlICpub2RlOwo+ID4gKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5leHQ7Cj4gPiArICAg ICAgICAgICAgICAgc2l6ZV90IGxlbjsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICAvKiBTa2lw IHRoZSBpbml0aWFsICcvJyBkZWxpbWl0ZXIgYW5kIGZpbmQgdGhlIG5leHQgb25lLgo+ID4gKi8K PiA+ICsgICAgICAgICAgICAgICBwYXRoKys7Cj4gPiArICAgICAgICAgICAgICAgbmV4dCA9IHN0 cmNocm51bChwYXRoLCAnLycpOwo+ID4gKyAgICAgICAgICAgICAgIGxlbiA9IG5leHQgLSBwYXRo Owo+ID4gKyAgICAgICAgICAgICAgIGlmICghbGVuKQo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgZ290byBlcnJvcjsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICBmb3JfZWFjaF9jaGlsZF9v Zl9ub2RlKHBhcmVudCwgbm9kZSkgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg Y2hhciAqbmFtZSA9IGtiYXNlbmFtZShub2RlLT5mdWxsX25hbWUpOwo+ID4gKwo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAocGF0aCwgbmFtZSwgbGVuKSA9PSAwICYmCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKG5hbWUpID09IGxlbikgewo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IG5vZGU7Cj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgfQo+ID4gKyAgICAgICAgICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgICAgICAgICBpZiAo IWNoaWxkKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKPiA+ICsKPiA+ ICsgICAgICAgICAgICAgICBvZl9ub2RlX3B1dChwYXJlbnQpOwo+ID4gKyAgICAgICAgICAgICAg IHBhcmVudCA9IGNoaWxkOwo+ID4gKyAgICAgICAgICAgICAgIHBhdGggPSBuZXh0Owo+ID4gKyAg ICAgICB9Cj4gPiArCj4gPiArICAgICAgIHJldHVybiBwYXJlbnQ7Cj4gPiArCj4gPiArZXJyb3I6 Cj4gPiArICAgICAgIG9mX25vZGVfcHV0KHBhcmVudCk7Cj4gPiArICAgICAgIHJldHVybiBOVUxM Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IF9faW5pdCByY2FyX2R1X29mX2FkZF9wcm9w ZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZAo+ID4gKnZhbHVl LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxl bmd0aCkKPiAKPiBTbywgd2VyZSB5b3UgZ29pbmcgdG8gcmV2aXZlIFBhbnRlbGlzJyBwYXRjaCBv ciBtb3ZlIHRoaXMgdG8gdGhlIGNvcmU/CgpEbyB5b3UgaGF2ZSBhIHBvaW50ZXIgdG8gdGhhdCBw YXRjaCA/Cgo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IHByb3BlcnR5ICpwcm9wOwo+ID4gKwo+ ID4gKyAgICAgICBwcm9wID0ga3phbGxvYyhzaXplb2YoKnByb3ApLCBHRlBfS0VSTkVMKTsKPiA+ ICsgICAgICAgaWYgKCFwcm9wKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ ID4gKwo+ID4gKyAgICAgICBwcm9wLT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsK PiA+ICsgICAgICAgcHJvcC0+dmFsdWUgPSBrbWVtZHVwKHZhbHVlLCBsZW5ndGgsIEdGUF9LRVJO RUwpOwo+ID4gKyAgICAgICBwcm9wLT5sZW5ndGggPSBsZW5ndGg7Cj4gPiArCj4gPiArICAgICAg IGlmICghcHJvcC0+bmFtZSB8fCAhcHJvcC0+dmFsdWUpIHsKPiA+ICsgICAgICAgICAgICAgICBr ZnJlZShwcm9wLT5uYW1lKTsKPiA+ICsgICAgICAgICAgICAgICBrZnJlZShwcm9wLT52YWx1ZSk7 Cj4gPiArICAgICAgICAgICAgICAga2ZyZWUocHJvcCk7Cj4gPiArICAgICAgICAgICAgICAgcmV0 dXJuIC1FTk9NRU07Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgb2ZfcHJvcGVydHlf c2V0X2ZsYWcocHJvcCwgT0ZfRFlOQU1JQyk7Cj4gPiArCj4gPiArICAgICAgIHByb3AtPm5leHQg PSBucC0+cHJvcGVydGllczsKPiA+ICsgICAgICAgbnAtPnByb3BlcnRpZXMgPSBwcm9wOwo+ID4g Kwo+ID4gKyAgICAgICByZXR1cm4gMDsKPiA+ICt9Cgpbc25pcF0KCj4gPiArc3RhdGljIHZvaWQg X19pbml0IHJjYXJfZHVfb2ZfbHZkc19wYXRjaF9vbmUoc3RydWN0IGRldmljZV9ub2RlICpsdmRz LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg c3RydWN0IG9mX3BoYW5kbGVfYXJncwo+ID4gKmNsaywKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbG9jYWwsCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNl X25vZGUgKnJlbW90ZSkKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZW5k cG9pbnRzWzJdOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgcHNpemU7Cj4gPiArICAgICAgIHVu c2lnbmVkIGludCBpOwo+ID4gKyAgICAgICBfX2JlMzIgdmFsdWVbNF07Cj4gPiArICAgICAgIGlu dCByZXQ7Cj4gPiArCj4gPiArICAgICAgIC8qCj4gPiArICAgICAgICAqIFNldCB0aGUgTFZEUyBj bG9ja3MgcHJvcGVydHkuIFRoaXMgY2FuJ3QgYmUgcGVyZm9ybWVkIGJ5IHRoZQo+ID4gb3Zlcmxh eQo+ID4gKyAgICAgICAgKiBhcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjbG9jayBzcGVjaWZpZXIg aGFzIGNoYW5nZWQgb3ZlciB0aW1lLAo+ID4gYW5kIHdlCj4gPiArICAgICAgICAqIGRvbid0IGtu b3cgYXQgY29tcGlsZSB0aW1lIHdoaWNoIGJpbmRpbmcgdmVyc2lvbiB0aGUgc3lzdGVtIHdlCj4g PiB3aWxsCj4gPiArICAgICAgICAqIHJ1biBvbiB1c2VzLgo+ID4gKyAgICAgICAgKi8KPiA+ICsg ICAgICAgaWYgKGNsay0+YXJnc19jb3VudCA+PSBBUlJBWV9TSVpFKHZhbHVlKSAtIDEpCj4gPiAr ICAgICAgICAgICAgICAgcmV0dXJuOwo+ID4gKwo+ID4gKyAgICAgICB2YWx1ZVswXSA9IGNwdV90 b19iZTMyKGNsay0+bnAtPnBoYW5kbGUpOwo+ID4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2xr LT5hcmdzX2NvdW50OyArK2kpCj4gPiArICAgICAgICAgICAgICAgdmFsdWVbaSArIDFdID0gY3B1 X3RvX2JlMzIoY2xrLT5hcmdzW2ldKTsKPiA+ICsKPiA+ICsgICAgICAgcHNpemUgPSAoY2xrLT5h cmdzX2NvdW50ICsgMSkgKiA0Owo+ID4gKyAgICAgICByZXQgPSByY2FyX2R1X29mX2FkZF9wcm9w ZXJ0eShsdmRzLCAiY2xvY2tzIiwgdmFsdWUsIHBzaXplKTsKPiA+ICsgICAgICAgaWYgKHJldCA8 IDApCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ID4gKwo+ID4gKyAgICAgICAvKgo+ID4g KyAgICAgICAgKiBJbnNlcnQgdGhlIG5vZGUgaW4gdGhlIE9GIGdyYXBoOiBwYXRjaCB0aGUgTFZE UyBwb3J0cwo+ID4gcmVtb3RlLWVuZHBvaW50Cj4gPiArICAgICAgICAqIHByb3BlcnRpZXMgdG8g cG9pbnQgdG8gdGhlIGVuZHBvaW50cyBvZiB0aGUgc2libGluZyBub2RlcyBpbgo+ID4gdGhlCj4g PiArICAgICAgICAqIGdyYXBoLiBUaGlzIGNhbid0IGJlIHBlcmZvcm1lZCBieSB0aGUgb3Zlcmxh eTogb24gdGhlIGlucHV0Cj4gPiBzaWRlIHRoZQo+ID4gKyAgICAgICAgKiBvdmVybGF5IHdvdWxk IGNvbnRhaW4gYSBwaGFuZGxlIGZvciB0aGUgRFUgTFZEUyBvdXRwdXQgcG9ydAo+ID4gdGhhdAo+ ID4gKyAgICAgICAgKiB3b3VsZCBjbGFzaCB3aXRoIHRoZSBzeXN0ZW0gRFQsIGFuZCBvbiB0aGUg b3V0cHV0IHNpZGUgdGhlCj4gPiBjb25uZWN0aW9uCj4gPiArICAgICAgICAqIGlzIGJvYXJkLXNw ZWNpZmljLgo+ID4gKyAgICAgICAgKi8KPiA+ICsgICAgICAgZW5kcG9pbnRzWzBdID0gcmNhcl9k dV9vZl9maW5kX25vZGVfYnlfcGF0aChsdmRzLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCj4gPiAiL3BvcnRzL3BvcnRAMC9lbmRwb2ludCIp Owo+IAo+IG9mX2dyYXBoX2dldF9lbmRwb2ludF9ieV9yZWdzKCkgc2hvdWxkIHdvcmsgaGVyZSBp bnN0ZWFkIG9yIGFtIEkKPiBtaXNzaW5nIHNvbWV0aGluZz8KCkdvb2QgcG9pbnQuIFRoZSBwYXRj aCBzZXJpZXMgc3RhcnRlZCB3aXRoIGEgbmVlZCBmb3IgYSBub2RlIGxvb2t1cCBieSBwYXRoIApm dW5jdGlvbiB0byBwYXRjaCB0aGUgb3ZlcmxheSBiZWZvcmUgYXBwbHlpbmcgaXQsIGFuZCBJIGZh aWxlZCB0byBzZWUgdGhhdCB0aGUgCmZ1bmN0aW9uIHdhc24ndCBuZWVkZWQgYW55bW9yZSBpbiB0 aGlzIG5ldyB2ZXJzaW9uLiBJJ3ZlIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQgCm9mX2dyYXBoX2dldF9l bmRwb2ludF9ieV9yZWdzKCksIEknbGwgdXNlIHRoYXQgaW4gdjQuCgo+ID4gKyAgICAgICBlbmRw b2ludHNbMV0gPSByY2FyX2R1X29mX2ZpbmRfbm9kZV9ieV9wYXRoKGx2ZHMsCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPiA+ICIvcG9ydHMv cG9ydEAxL2VuZHBvaW50Iik7ICsgICAgICAgaWYgKCFlbmRwb2ludHNbMF0gfHwgIWVuZHBvaW50 c1sxXSkKPiA+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gPiArCj4gPiArICAgICAgIHZhbHVl WzBdID0gY3B1X3RvX2JlMzIobG9jYWwtPnBoYW5kbGUpOwo+ID4gKyAgICAgICByZXQgPSByY2Fy X2R1X29mX2FkZF9wcm9wZXJ0eShlbmRwb2ludHNbMF0sICJyZW1vdGUtZW5kcG9pbnQiLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgNCk7Cj4gCj4gcy80 L3NpemVvZihfX2JlMzIpLwoKV2lsbCBmaXggaW4gdjQuCgo+ID4gKyAgICAgICBpZiAocmV0IDwg MCkKPiA+ICsgICAgICAgICAgICAgICBnb3RvIGRvbmU7Cj4gPiArCj4gPiArICAgICAgIHZhbHVl WzBdID0gY3B1X3RvX2JlMzIocmVtb3RlLT5waGFuZGxlKTsKPiA+ICsgICAgICAgcmV0ID0gcmNh cl9kdV9vZl9hZGRfcHJvcGVydHkoZW5kcG9pbnRzWzFdLCAicmVtb3RlLWVuZHBvaW50IiwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIDQpOwo+ID4gKyAg ICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgICBnb3RvIGRvbmU7Cj4gPiArCj4g PiArZG9uZToKPiA+ICsgICAgICAgb2Zfbm9kZV9wdXQoZW5kcG9pbnRzWzBdKTsKPiA+ICsgICAg ICAgb2Zfbm9kZV9wdXQoZW5kcG9pbnRzWzFdKTsKPiA+ICt9Cgpbc25pcF0KCi0tIApSZWdhcmRz LAoKTGF1cmVudCBQaW5jaGFydAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v ZHJpLWRldmVsCg==