From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephan Gerhold Subject: [PATCH 6/7] drm/mcde: dsi: Enable clocks in pre_enable() instead of mode_set() Date: Wed, 6 Nov 2019 17:58:34 +0100 Message-ID: <20191106165835.2863-7-stephan@gerhold.net> References: <20191106165835.2863-1-stephan@gerhold.net> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20191106165835.2863-1-stephan@gerhold.net> Sender: linux-kernel-owner@vger.kernel.org To: Linus Walleij Cc: David Airlie , Daniel Vetter , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Stephan Gerhold List-Id: dri-devel@lists.freedesktop.org The DSI initialization sequence incorrectly assumes that the mode_set() function of the DRM bridge is always called when (re-)enabling the display. This is not necessarily the case. Keeping the device idle in the framebuffer console for a while results in the display being turned off using the disable() function. However, as soon as any key is pressed only (pre_)enable() are called. mode_set() is skipped because the mode has not been changed. In this case, the DSI HS/LP clocks are never turned back on, preventing the display from working. Fix this by moving a part of the initialization sequence from mode_set() to pre_enable(). Keep most of the video mode setup in mode_set() since most of the registers are only dependent on the mode that is set for the panel - there is no need to write them again each time we re-enable the display. Signed-off-by: Stephan Gerhold --- drivers/gpu/drm/mcde/mcde_dsi.c | 67 ++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_dsi.c index df963e078c35..03896a1f339a 100644 --- a/drivers/gpu/drm/mcde/mcde_dsi.c +++ b/drivers/gpu/drm/mcde/mcde_dsi.c @@ -562,21 +562,6 @@ static void mcde_dsi_setup_video_mode(struct mcde_dsi *d, DSI_VID_VCA_SETTING2_EXACT_BURST_LIMIT_SHIFT; writel(val, d->regs + DSI_VID_VCA_SETTING2); - /* Put IF1 into video mode */ - val = readl(d->regs + DSI_MCTL_MAIN_DATA_CTL); - val |= DSI_MCTL_MAIN_DATA_CTL_IF1_MODE; - writel(val, d->regs + DSI_MCTL_MAIN_DATA_CTL); - - /* Disable command mode on IF1 */ - val = readl(d->regs + DSI_CMD_MODE_CTL); - val &= ~DSI_CMD_MODE_CTL_IF1_LP_EN; - writel(val, d->regs + DSI_CMD_MODE_CTL); - - /* Enable some error interrupts */ - val = readl(d->regs + DSI_VID_MODE_STS_CTL); - val |= DSI_VID_MODE_STS_CTL_ERR_MISSING_VSYNC; - val |= DSI_VID_MODE_STS_CTL_ERR_MISSING_DATA; - writel(val, d->regs + DSI_VID_MODE_STS_CTL); } static void mcde_dsi_start(struct mcde_dsi *d) @@ -700,26 +685,13 @@ static void mcde_dsi_bridge_enable(struct drm_bridge *bridge) dev_info(d->dev, "enable DSI master\n"); }; -static void mcde_dsi_bridge_mode_set(struct drm_bridge *bridge, - const struct drm_display_mode *mode, - const struct drm_display_mode *adj) +static void mcde_dsi_bridge_pre_enable(struct drm_bridge *bridge) { struct mcde_dsi *d = bridge_to_mcde_dsi(bridge); - unsigned long pixel_clock_hz = mode->clock * 1000; unsigned long hs_freq, lp_freq; u32 val; int ret; - if (!d->mdsi) { - dev_err(d->dev, "no DSI device attached to encoder!\n"); - return; - } - - dev_info(d->dev, "set DSI master to %dx%d %lu Hz %s mode\n", - mode->hdisplay, mode->vdisplay, pixel_clock_hz, - (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) ? "VIDEO" : "CMD" - ); - /* Copy maximum clock frequencies */ if (d->mdsi->lp_rate) lp_freq = d->mdsi->lp_rate; @@ -758,7 +730,21 @@ static void mcde_dsi_bridge_mode_set(struct drm_bridge *bridge, d->hs_freq); if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) { - mcde_dsi_setup_video_mode(d, mode); + /* Put IF1 into video mode */ + val = readl(d->regs + DSI_MCTL_MAIN_DATA_CTL); + val |= DSI_MCTL_MAIN_DATA_CTL_IF1_MODE; + writel(val, d->regs + DSI_MCTL_MAIN_DATA_CTL); + + /* Disable command mode on IF1 */ + val = readl(d->regs + DSI_CMD_MODE_CTL); + val &= ~DSI_CMD_MODE_CTL_IF1_LP_EN; + writel(val, d->regs + DSI_CMD_MODE_CTL); + + /* Enable some error interrupts */ + val = readl(d->regs + DSI_VID_MODE_STS_CTL); + val |= DSI_VID_MODE_STS_CTL_ERR_MISSING_VSYNC; + val |= DSI_VID_MODE_STS_CTL_ERR_MISSING_DATA; + writel(val, d->regs + DSI_VID_MODE_STS_CTL); } else { /* Command mode, clear IF1 ID */ val = readl(d->regs + DSI_CMD_MODE_CTL); @@ -772,6 +758,26 @@ static void mcde_dsi_bridge_mode_set(struct drm_bridge *bridge, } } +static void mcde_dsi_bridge_mode_set(struct drm_bridge *bridge, + const struct drm_display_mode *mode, + const struct drm_display_mode *adj) +{ + struct mcde_dsi *d = bridge_to_mcde_dsi(bridge); + + if (!d->mdsi) { + dev_err(d->dev, "no DSI device attached to encoder!\n"); + return; + } + + dev_info(d->dev, "set DSI master to %dx%d %u Hz %s mode\n", + mode->hdisplay, mode->vdisplay, mode->clock * 1000, + (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) ? "VIDEO" : "CMD" + ); + + if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) + mcde_dsi_setup_video_mode(d, mode); +} + static void mcde_dsi_wait_for_command_mode_stop(struct mcde_dsi *d) { u32 val; @@ -863,6 +869,7 @@ static const struct drm_bridge_funcs mcde_dsi_bridge_funcs = { .mode_set = mcde_dsi_bridge_mode_set, .disable = mcde_dsi_bridge_disable, .enable = mcde_dsi_bridge_enable, + .pre_enable = mcde_dsi_bridge_pre_enable, }; static int mcde_dsi_bind(struct device *dev, struct device *master, -- 2.23.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E43EEC5DF63 for ; Wed, 6 Nov 2019 17:01:24 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C3C4F21882 for ; Wed, 6 Nov 2019 17:01:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C3C4F21882 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gerhold.net Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 710706EDF3; Wed, 6 Nov 2019 17:01:14 +0000 (UTC) Received: from mo6-p02-ob.smtp.rzone.de (mo6-p02-ob.smtp.rzone.de [IPv6:2a01:238:20a:202:5302::1]) by gabe.freedesktop.org (Postfix) with ESMTPS id D5D2C6E277 for ; Wed, 6 Nov 2019 17:01:11 +0000 (UTC) X-RZG-AUTH: ":P3gBZUipdd93FF5ZZvYFPugejmSTVR2nRPhVORvLd4SsytBXQrEOHTIXs8PvtBNfIQ==" X-RZG-CLASS-ID: mo00 Received: from localhost.localdomain by smtp.strato.de (RZmta 44.29.0 AUTH) with ESMTPSA id e07688vA6H15hLw (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate); Wed, 6 Nov 2019 18:01:05 +0100 (CET) From: Stephan Gerhold To: Linus Walleij Subject: [PATCH 6/7] drm/mcde: dsi: Enable clocks in pre_enable() instead of mode_set() Date: Wed, 6 Nov 2019 17:58:34 +0100 Message-Id: <20191106165835.2863-7-stephan@gerhold.net> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191106165835.2863-1-stephan@gerhold.net> References: <20191106165835.2863-1-stephan@gerhold.net> MIME-Version: 1.0 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1573059670; s=strato-dkim-0002; d=gerhold.net; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: X-RZG-CLASS-ID:X-RZG-AUTH:From:Subject:Sender; bh=sZdoB36F5UBdckaG8aj1GzQtE3+0zrTPGHer5Xs7ohg=; b=K2wR+BJqUik78z4mrqeIkEmFrRGUpyFgC7E1DbeIc11+E0jSZS+yeYReCUcjDVUATV ybTB5Ifd2wKfuc0j34eiMJKa4pT3NZ/NbY3aU/diWWllbrOzHA4CUy90bO5mU+w1B4ZP gEH7L7qxgiyvUdeNs9zRrV+Sfa/9/29a7Fqdr5XzYMMoBUf9FsOFkzI3GrV8qGHSUrwk F/VNMmiv97hpUN8zoCW6E26FeC0uUauOkQGIvP7yClVv0O5/dvgXQSz/mvHaRcai+AxV CKZIzT/f6kR6Gs33Z6T51Sknrxxr9NzvDkIThzaGH6RIWXXqQYWYEO3TPEtzHPAaqjwa wg4g== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Airlie , Stephan Gerhold , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191106165834.N9rVTaNE5nfnnjAlpHv5s9P51vv1ZuEfncpGz5xIvsg@z> VGhlIERTSSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBpbmNvcnJlY3RseSBhc3N1bWVzIHRoYXQg dGhlIG1vZGVfc2V0KCkKZnVuY3Rpb24gb2YgdGhlIERSTSBicmlkZ2UgaXMgYWx3YXlzIGNhbGxl ZCB3aGVuIChyZS0pZW5hYmxpbmcgdGhlIGRpc3BsYXkuClRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5 IHRoZSBjYXNlLgoKS2VlcGluZyB0aGUgZGV2aWNlIGlkbGUgaW4gdGhlIGZyYW1lYnVmZmVyIGNv bnNvbGUgZm9yIGEgd2hpbGUgcmVzdWx0cwppbiB0aGUgZGlzcGxheSBiZWluZyB0dXJuZWQgb2Zm IHVzaW5nIHRoZSBkaXNhYmxlKCkgZnVuY3Rpb24uIEhvd2V2ZXIsCmFzIHNvb24gYXMgYW55IGtl eSBpcyBwcmVzc2VkIG9ubHkgKHByZV8pZW5hYmxlKCkgYXJlIGNhbGxlZC4KbW9kZV9zZXQoKSBp cyBza2lwcGVkIGJlY2F1c2UgdGhlIG1vZGUgaGFzIG5vdCBiZWVuIGNoYW5nZWQuCgpJbiB0aGlz IGNhc2UsIHRoZSBEU0kgSFMvTFAgY2xvY2tzIGFyZSBuZXZlciB0dXJuZWQgYmFjayBvbiwKcHJl dmVudGluZyB0aGUgZGlzcGxheSBmcm9tIHdvcmtpbmcuCgpGaXggdGhpcyBieSBtb3ZpbmcgYSBw YXJ0IG9mIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBmcm9tCm1vZGVfc2V0KCkgdG8gcHJl X2VuYWJsZSgpLiBLZWVwIG1vc3Qgb2YgdGhlIHZpZGVvIG1vZGUgc2V0dXAgaW4KbW9kZV9zZXQo KSBzaW5jZSBtb3N0IG9mIHRoZSByZWdpc3RlcnMgYXJlIG9ubHkgZGVwZW5kZW50IG9uIHRoZSBt b2RlCnRoYXQgaXMgc2V0IGZvciB0aGUgcGFuZWwgLSB0aGVyZSBpcyBubyBuZWVkIHRvIHdyaXRl IHRoZW0gYWdhaW4gZWFjaAp0aW1lIHdlIHJlLWVuYWJsZSB0aGUgZGlzcGxheS4KClNpZ25lZC1v ZmYtYnk6IFN0ZXBoYW4gR2VyaG9sZCA8c3RlcGhhbkBnZXJob2xkLm5ldD4KLS0tCiBkcml2ZXJz L2dwdS9kcm0vbWNkZS9tY2RlX2RzaS5jIHwgNjcgKysrKysrKysrKysrKysrKysrLS0tLS0tLS0t LS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMzcgaW5zZXJ0aW9ucygrKSwgMzAgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21jZGUvbWNkZV9kc2kuYyBiL2RyaXZlcnMv Z3B1L2RybS9tY2RlL21jZGVfZHNpLmMKaW5kZXggZGY5NjNlMDc4YzM1Li4wMzg5NmExZjMzOWEg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tY2RlL21jZGVfZHNpLmMKKysrIGIvZHJpdmVy cy9ncHUvZHJtL21jZGUvbWNkZV9kc2kuYwpAQCAtNTYyLDIxICs1NjIsNiBAQCBzdGF0aWMgdm9p ZCBtY2RlX2RzaV9zZXR1cF92aWRlb19tb2RlKHN0cnVjdCBtY2RlX2RzaSAqZCwKIAkJRFNJX1ZJ RF9WQ0FfU0VUVElORzJfRVhBQ1RfQlVSU1RfTElNSVRfU0hJRlQ7CiAJd3JpdGVsKHZhbCwgZC0+ cmVncyArIERTSV9WSURfVkNBX1NFVFRJTkcyKTsKIAotCS8qIFB1dCBJRjEgaW50byB2aWRlbyBt b2RlICovCi0JdmFsID0gcmVhZGwoZC0+cmVncyArIERTSV9NQ1RMX01BSU5fREFUQV9DVEwpOwot CXZhbCB8PSBEU0lfTUNUTF9NQUlOX0RBVEFfQ1RMX0lGMV9NT0RFOwotCXdyaXRlbCh2YWwsIGQt PnJlZ3MgKyBEU0lfTUNUTF9NQUlOX0RBVEFfQ1RMKTsKLQotCS8qIERpc2FibGUgY29tbWFuZCBt b2RlIG9uIElGMSAqLwotCXZhbCA9IHJlYWRsKGQtPnJlZ3MgKyBEU0lfQ01EX01PREVfQ1RMKTsK LQl2YWwgJj0gfkRTSV9DTURfTU9ERV9DVExfSUYxX0xQX0VOOwotCXdyaXRlbCh2YWwsIGQtPnJl Z3MgKyBEU0lfQ01EX01PREVfQ1RMKTsKLQotCS8qIEVuYWJsZSBzb21lIGVycm9yIGludGVycnVw dHMgKi8KLQl2YWwgPSByZWFkbChkLT5yZWdzICsgRFNJX1ZJRF9NT0RFX1NUU19DVEwpOwotCXZh bCB8PSBEU0lfVklEX01PREVfU1RTX0NUTF9FUlJfTUlTU0lOR19WU1lOQzsKLQl2YWwgfD0gRFNJ X1ZJRF9NT0RFX1NUU19DVExfRVJSX01JU1NJTkdfREFUQTsKLQl3cml0ZWwodmFsLCBkLT5yZWdz ICsgRFNJX1ZJRF9NT0RFX1NUU19DVEwpOwogfQogCiBzdGF0aWMgdm9pZCBtY2RlX2RzaV9zdGFy dChzdHJ1Y3QgbWNkZV9kc2kgKmQpCkBAIC03MDAsMjYgKzY4NSwxMyBAQCBzdGF0aWMgdm9pZCBt Y2RlX2RzaV9icmlkZ2VfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCiAJZGV2X2lu Zm8oZC0+ZGV2LCAiZW5hYmxlIERTSSBtYXN0ZXJcbiIpOwogfTsKIAotc3RhdGljIHZvaWQgbWNk ZV9kc2lfYnJpZGdlX21vZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCi0JCQkJICAg ICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKLQkJCQkgICAgIGNvbnN0IHN0 cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGopCitzdGF0aWMgdm9pZCBtY2RlX2RzaV9icmlkZ2Vf cHJlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQogewogCXN0cnVjdCBtY2RlX2Rz aSAqZCA9IGJyaWRnZV90b19tY2RlX2RzaShicmlkZ2UpOwotCXVuc2lnbmVkIGxvbmcgcGl4ZWxf Y2xvY2tfaHogPSBtb2RlLT5jbG9jayAqIDEwMDA7CiAJdW5zaWduZWQgbG9uZyBoc19mcmVxLCBs cF9mcmVxOwogCXUzMiB2YWw7CiAJaW50IHJldDsKIAotCWlmICghZC0+bWRzaSkgewotCQlkZXZf ZXJyKGQtPmRldiwgIm5vIERTSSBkZXZpY2UgYXR0YWNoZWQgdG8gZW5jb2RlciFcbiIpOwotCQly ZXR1cm47Ci0JfQotCi0JZGV2X2luZm8oZC0+ZGV2LCAic2V0IERTSSBtYXN0ZXIgdG8gJWR4JWQg JWx1IEh6ICVzIG1vZGVcbiIsCi0JCSBtb2RlLT5oZGlzcGxheSwgbW9kZS0+dmRpc3BsYXksIHBp eGVsX2Nsb2NrX2h6LAotCQkgKGQtPm1kc2ktPm1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJ REVPKSA/ICJWSURFTyIgOiAiQ01EIgotCQkpOwotCiAJLyogQ29weSBtYXhpbXVtIGNsb2NrIGZy ZXF1ZW5jaWVzICovCiAJaWYgKGQtPm1kc2ktPmxwX3JhdGUpCiAJCWxwX2ZyZXEgPSBkLT5tZHNp LT5scF9yYXRlOwpAQCAtNzU4LDcgKzczMCwyMSBAQCBzdGF0aWMgdm9pZCBtY2RlX2RzaV9icmlk Z2VfbW9kZV9zZXQoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKIAkJCSBkLT5oc19mcmVxKTsK IAogCWlmIChkLT5tZHNpLT5tb2RlX2ZsYWdzICYgTUlQSV9EU0lfTU9ERV9WSURFTykgewotCQlt Y2RlX2RzaV9zZXR1cF92aWRlb19tb2RlKGQsIG1vZGUpOworCQkvKiBQdXQgSUYxIGludG8gdmlk ZW8gbW9kZSAqLworCQl2YWwgPSByZWFkbChkLT5yZWdzICsgRFNJX01DVExfTUFJTl9EQVRBX0NU TCk7CisJCXZhbCB8PSBEU0lfTUNUTF9NQUlOX0RBVEFfQ1RMX0lGMV9NT0RFOworCQl3cml0ZWwo dmFsLCBkLT5yZWdzICsgRFNJX01DVExfTUFJTl9EQVRBX0NUTCk7CisKKwkJLyogRGlzYWJsZSBj b21tYW5kIG1vZGUgb24gSUYxICovCisJCXZhbCA9IHJlYWRsKGQtPnJlZ3MgKyBEU0lfQ01EX01P REVfQ1RMKTsKKwkJdmFsICY9IH5EU0lfQ01EX01PREVfQ1RMX0lGMV9MUF9FTjsKKwkJd3JpdGVs KHZhbCwgZC0+cmVncyArIERTSV9DTURfTU9ERV9DVEwpOworCisJCS8qIEVuYWJsZSBzb21lIGVy cm9yIGludGVycnVwdHMgKi8KKwkJdmFsID0gcmVhZGwoZC0+cmVncyArIERTSV9WSURfTU9ERV9T VFNfQ1RMKTsKKwkJdmFsIHw9IERTSV9WSURfTU9ERV9TVFNfQ1RMX0VSUl9NSVNTSU5HX1ZTWU5D OworCQl2YWwgfD0gRFNJX1ZJRF9NT0RFX1NUU19DVExfRVJSX01JU1NJTkdfREFUQTsKKwkJd3Jp dGVsKHZhbCwgZC0+cmVncyArIERTSV9WSURfTU9ERV9TVFNfQ1RMKTsKIAl9IGVsc2UgewogCQkv KiBDb21tYW5kIG1vZGUsIGNsZWFyIElGMSBJRCAqLwogCQl2YWwgPSByZWFkbChkLT5yZWdzICsg RFNJX0NNRF9NT0RFX0NUTCk7CkBAIC03NzIsNiArNzU4LDI2IEBAIHN0YXRpYyB2b2lkIG1jZGVf ZHNpX2JyaWRnZV9tb2RlX3NldChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAogCX0KIH0KIAor c3RhdGljIHZvaWQgbWNkZV9kc2lfYnJpZGdlX21vZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpi cmlkZ2UsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJ CQkgICAgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGopCit7CisJc3RydWN0IG1j ZGVfZHNpICpkID0gYnJpZGdlX3RvX21jZGVfZHNpKGJyaWRnZSk7CisKKwlpZiAoIWQtPm1kc2kp IHsKKwkJZGV2X2VycihkLT5kZXYsICJubyBEU0kgZGV2aWNlIGF0dGFjaGVkIHRvIGVuY29kZXIh XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRldl9pbmZvKGQtPmRldiwgInNldCBEU0kgbWFzdGVy IHRvICVkeCVkICV1IEh6ICVzIG1vZGVcbiIsCisJCSBtb2RlLT5oZGlzcGxheSwgbW9kZS0+dmRp c3BsYXksIG1vZGUtPmNsb2NrICogMTAwMCwKKwkJIChkLT5tZHNpLT5tb2RlX2ZsYWdzICYgTUlQ SV9EU0lfTU9ERV9WSURFTykgPyAiVklERU8iIDogIkNNRCIKKwkJKTsKKworCWlmIChkLT5tZHNp LT5tb2RlX2ZsYWdzICYgTUlQSV9EU0lfTU9ERV9WSURFTykKKwkJbWNkZV9kc2lfc2V0dXBfdmlk ZW9fbW9kZShkLCBtb2RlKTsKK30KKwogc3RhdGljIHZvaWQgbWNkZV9kc2lfd2FpdF9mb3JfY29t bWFuZF9tb2RlX3N0b3Aoc3RydWN0IG1jZGVfZHNpICpkKQogewogCXUzMiB2YWw7CkBAIC04NjMs NiArODY5LDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIG1jZGVfZHNp X2JyaWRnZV9mdW5jcyA9IHsKIAkubW9kZV9zZXQgPSBtY2RlX2RzaV9icmlkZ2VfbW9kZV9zZXQs CiAJLmRpc2FibGUgPSBtY2RlX2RzaV9icmlkZ2VfZGlzYWJsZSwKIAkuZW5hYmxlID0gbWNkZV9k c2lfYnJpZGdlX2VuYWJsZSwKKwkucHJlX2VuYWJsZSA9IG1jZGVfZHNpX2JyaWRnZV9wcmVfZW5h YmxlLAogfTsKIAogc3RhdGljIGludCBtY2RlX2RzaV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwg c3RydWN0IGRldmljZSAqbWFzdGVyLAotLSAKMi4yMy4wCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZl bEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWw=