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.0 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, 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 32977C43381 for ; Mon, 4 Mar 2019 14:54:46 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 EBEEC20823 for ; Mon, 4 Mar 2019 14:54:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="isusHASG" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EBEEC20823 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ScIJWsw/nGdft5/ESRoJku8mDTkTNBB+ltEBXLm5MB4=; b=isusHASGqLEbka w0jXljwJV3MNnxQ4pIYW0NGK+aDNQznZyIV87y+u3Dl9Hm+6zCOHeCPIl3sMLJFLk+g1yf0gR+dVp 8sSiyBrb/3tQdhm2XJaH+ctdqFervxpRCOQw88TirtQExMb1T9KbCOHab9FnOrsj1d7klSo9xn+kV 1kNtnvDc5d2UNRoRUZ4BgC9vGoEL9+PSJ5R5o2OXSUgvaUfZgyRRf1YeIv2pzPAkpCvjRkMKMNDZM nsBoVsUxVDVJW9KARvEOnESDv4lLxdbamq1gDJ+b1iFcMywm8GmfLGfxRUEaKhKp3L+gq8FyJ/Ok8 57kgjx/AYHSl2cL6VK/w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1h0ozK-0007vP-NN; Mon, 04 Mar 2019 14:54:42 +0000 Received: from relay6-d.mail.gandi.net ([217.70.183.198]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1h0oxq-0006Xx-5x for linux-arm-kernel@lists.infradead.org; Mon, 04 Mar 2019 14:53:18 +0000 X-Originating-IP: 185.94.189.188 Received: from localhost (unknown [185.94.189.188]) (Authenticated sender: maxime.ripard@bootlin.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 7F47EC0016; Mon, 4 Mar 2019 14:53:02 +0000 (UTC) From: Maxime Ripard To: Maarten Lankhorst , Sean Paul , Maxime Ripard , Daniel Vetter , David Airlie Subject: [PATCH 6/7] drm/modes: Allow to specify rotation and reflection on the commandline Date: Mon, 4 Mar 2019 15:52:39 +0100 Message-Id: <0f91f0680815c8af1f91f35bb70c5ec2d687833f.1551711042.git-series.maxime.ripard@bootlin.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190304_065311_532685_75808A83 X-CRM114-Status: GOOD ( 20.58 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eben@raspberrypi.org, dri-devel@lists.freedesktop.org, Paul Kocialkowski , Eric Anholt , Thomas Petazzoni , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Rotations and reflections setup are needed in some scenarios to initialise properly the initial framebuffer. Some drivers already had a bunch of quirks to deal with this, such as either a private kernel command line parameter (omapdss) or on the device tree (various panels). In order to accomodate this, let's create a video mode parameter to deal with the rotation and reflexion. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_fb_helper.c | 4 +- drivers/gpu/drm/drm_modes.c | 110 +++++++++++++++++++++++++++------ include/drm/drm_connector.h | 1 +- 3 files changed, 95 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index cacc4b56344e..1457a1d1a423 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -2523,6 +2523,7 @@ static void drm_setup_crtc_rotation(struct drm_fb_helper *fb_helper, struct drm_connector *connector) { struct drm_plane *plane = fb_crtc->mode_set.crtc->primary; + struct drm_cmdline_mode *mode = &connector->cmdline_mode; uint64_t valid_mask = 0; int i, rotation; @@ -2542,6 +2543,9 @@ static void drm_setup_crtc_rotation(struct drm_fb_helper *fb_helper, rotation = DRM_MODE_ROTATE_0; } + if (mode->rotation != DRM_MODE_ROTATE_0) + fb_crtc->rotation = mode->rotation; + /* * TODO: support 90 / 270 degree hardware rotation, * depending on the hardware this may require the framebuffer diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 3d843d17370a..10c7e9322f76 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -1531,6 +1531,71 @@ static int drm_mode_parse_cmdline_res_mode(const char *str, unsigned int length, return 0; } +static int drm_mode_parse_cmdline_options(char *str, size_t len, + struct drm_connector *connector, + struct drm_cmdline_mode *mode) +{ + unsigned int rotation = 0; + char *sep = str; + + while ((sep = strchr(sep, ','))) { + char *delim, *option; + + option = sep + 1; + delim = strchr(option, '='); + if (!delim) { + delim = strchr(option, ','); + + if (!delim) + delim = str + len; + } + + if (!strncmp(option, "rotate", delim - option)) { + const char *value = delim + 1; + unsigned int deg; + + deg = simple_strtol(value, &sep, 10); + + /* Make sure we have parsed something */ + if (sep == value) + return -EINVAL; + + switch (deg) { + case 0: + rotation |= DRM_MODE_ROTATE_0; + break; + + case 90: + rotation |= DRM_MODE_ROTATE_90; + break; + + case 180: + rotation |= DRM_MODE_ROTATE_180; + break; + + case 270: + rotation |= DRM_MODE_ROTATE_270; + break; + + default: + return -EINVAL; + } + } else if (!strncmp(option, "reflect_x", delim - option)) { + rotation |= DRM_MODE_REFLECT_X; + sep = delim; + } else if (!strncmp(option, "reflect_y", delim - option)) { + rotation |= DRM_MODE_REFLECT_Y; + sep = delim; + } else { + return -EINVAL; + } + } + + mode->rotation = rotation; + + return 0; +} + /** * drm_mode_parse_command_line_for_connector - parse command line modeline for connector * @mode_option: optional per connector mode option @@ -1558,9 +1623,10 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option, { const char *name; bool named_mode = false, parse_extras = false; - unsigned int bpp_off = 0, refresh_off = 0; + unsigned int bpp_off = 0, refresh_off = 0, options_off = 0; unsigned int mode_end = 0; char *bpp_ptr = NULL, *refresh_ptr = NULL, *extra_ptr = NULL; + char *options_ptr = NULL; char *bpp_end_ptr = NULL, *refresh_end_ptr = NULL; int ret; @@ -1601,13 +1667,18 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option, mode->refresh_specified = true; } + /* Locate the start of named options */ + options_ptr = strchr(name, ','); + if (options_ptr) + options_off = options_ptr - name; + /* Locate the end of the name / resolution, and parse it */ - if (bpp_ptr && refresh_ptr) { - mode_end = min(bpp_off, refresh_off); - } else if (bpp_ptr) { + if (bpp_ptr) { mode_end = bpp_off; } else if (refresh_ptr) { mode_end = refresh_off; + } else if (options_ptr) { + mode_end = options_off; } else { mode_end = strlen(name); parse_extras = true; @@ -1649,24 +1720,23 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option, else if (refresh_ptr) extra_ptr = refresh_end_ptr; - if (extra_ptr) { - if (!named_mode) { - int len = strlen(name) - (extra_ptr - name); + if (extra_ptr && + extra_ptr != options_ptr) { + int len = strlen(name) - (extra_ptr - name); - ret = drm_mode_parse_cmdline_extra(extra_ptr, len, - connector, mode); - if (ret) - return false; - } else { - int remaining = strlen(name) - (extra_ptr - name); + ret = drm_mode_parse_cmdline_extra(extra_ptr, len, + connector, mode); + if (ret) + return false; + } - /* - * We still have characters to process, while - * we shouldn't have any - */ - if (remaining > 0) - return false; - } + if (options_ptr) { + int len = strlen(name) - (options_ptr - name); + + ret = drm_mode_parse_cmdline_options(options_ptr, len, + connector, mode); + if (ret) + return false; } return true; diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 215761153245..cff18360f52a 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -834,6 +834,7 @@ struct drm_cmdline_mode { bool interlace; bool cvt; bool margins; + unsigned int rotation; enum drm_connector_force force; }; -- git-series 0.9.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maxime Ripard Subject: [PATCH 6/7] drm/modes: Allow to specify rotation and reflection on the commandline Date: Mon, 4 Mar 2019 15:52:39 +0100 Message-ID: <0f91f0680815c8af1f91f35bb70c5ec2d687833f.1551711042.git-series.maxime.ripard@bootlin.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9D00A89CF5 for ; Mon, 4 Mar 2019 14:53:05 +0000 (UTC) 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: Maarten Lankhorst , Sean Paul , Maxime Ripard , Daniel Vetter , David Airlie Cc: eben@raspberrypi.org, dri-devel@lists.freedesktop.org, Paul Kocialkowski , Thomas Petazzoni , linux-arm-kernel@lists.infradead.org List-Id: dri-devel@lists.freedesktop.org Um90YXRpb25zIGFuZCByZWZsZWN0aW9ucyBzZXR1cCBhcmUgbmVlZGVkIGluIHNvbWUgc2NlbmFy aW9zIHRvIGluaXRpYWxpc2UKcHJvcGVybHkgdGhlIGluaXRpYWwgZnJhbWVidWZmZXIuIFNvbWUg ZHJpdmVycyBhbHJlYWR5IGhhZCBhIGJ1bmNoIG9mCnF1aXJrcyB0byBkZWFsIHdpdGggdGhpcywg c3VjaCBhcyBlaXRoZXIgYSBwcml2YXRlIGtlcm5lbCBjb21tYW5kIGxpbmUKcGFyYW1ldGVyIChv bWFwZHNzKSBvciBvbiB0aGUgZGV2aWNlIHRyZWUgKHZhcmlvdXMgcGFuZWxzKS4KCkluIG9yZGVy IHRvIGFjY29tb2RhdGUgdGhpcywgbGV0J3MgY3JlYXRlIGEgdmlkZW8gbW9kZSBwYXJhbWV0ZXIg dG8gZGVhbAp3aXRoIHRoZSByb3RhdGlvbiBhbmQgcmVmbGV4aW9uLgoKU2lnbmVkLW9mZi1ieTog TWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBib290bGluLmNvbT4KLS0tCiBkcml2ZXJzL2dw dS9kcm0vZHJtX2ZiX2hlbHBlci5jIHwgICA0ICstCiBkcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVz LmMgICAgIHwgMTEwICsrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLQogaW5jbHVkZS9k cm0vZHJtX2Nvbm5lY3Rvci5oICAgICB8ICAgMSArLQogMyBmaWxlcyBjaGFuZ2VkLCA5NSBpbnNl cnRpb25zKCspLCAyMCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v ZHJtX2ZiX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwppbmRleCBj YWNjNGI1NjM0NGUuLjE0NTdhMWQxYTQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2Ry bV9mYl9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCkBAIC0y NTIzLDYgKzI1MjMsNyBAQCBzdGF0aWMgdm9pZCBkcm1fc2V0dXBfY3J0Y19yb3RhdGlvbihzdHJ1 Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyLAogCQkJCSAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rv ciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lID0gZmJfY3J0Yy0+bW9k ZV9zZXQuY3J0Yy0+cHJpbWFyeTsKKwlzdHJ1Y3QgZHJtX2NtZGxpbmVfbW9kZSAqbW9kZSA9ICZj b25uZWN0b3ItPmNtZGxpbmVfbW9kZTsKIAl1aW50NjRfdCB2YWxpZF9tYXNrID0gMDsKIAlpbnQg aSwgcm90YXRpb247CiAKQEAgLTI1NDIsNiArMjU0Myw5IEBAIHN0YXRpYyB2b2lkIGRybV9zZXR1 cF9jcnRjX3JvdGF0aW9uKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIsCiAJCXJvdGF0 aW9uID0gRFJNX01PREVfUk9UQVRFXzA7CiAJfQogCisJaWYgKG1vZGUtPnJvdGF0aW9uICE9IERS TV9NT0RFX1JPVEFURV8wKQorCQlmYl9jcnRjLT5yb3RhdGlvbiA9IG1vZGUtPnJvdGF0aW9uOwor CiAJLyoKIAkgKiBUT0RPOiBzdXBwb3J0IDkwIC8gMjcwIGRlZ3JlZSBoYXJkd2FyZSByb3RhdGlv biwKIAkgKiBkZXBlbmRpbmcgb24gdGhlIGhhcmR3YXJlIHRoaXMgbWF5IHJlcXVpcmUgdGhlIGZy YW1lYnVmZmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMgYi9kcml2 ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMKaW5kZXggM2Q4NDNkMTczNzBhLi4xMGM3ZTkzMjJmNzYg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYworKysgYi9kcml2ZXJzL2dw dS9kcm0vZHJtX21vZGVzLmMKQEAgLTE1MzEsNiArMTUzMSw3MSBAQCBzdGF0aWMgaW50IGRybV9t b2RlX3BhcnNlX2NtZGxpbmVfcmVzX21vZGUoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBpbnQg bGVuZ3RoLAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRybV9tb2RlX3BhcnNlX2NtZGxp bmVfb3B0aW9ucyhjaGFyICpzdHIsIHNpemVfdCBsZW4sCisJCQkJCSAgc3RydWN0IGRybV9jb25u ZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJICBzdHJ1Y3QgZHJtX2NtZGxpbmVfbW9kZSAqbW9kZSkK K3sKKwl1bnNpZ25lZCBpbnQgcm90YXRpb24gPSAwOworCWNoYXIgKnNlcCA9IHN0cjsKKworCXdo aWxlICgoc2VwID0gc3RyY2hyKHNlcCwgJywnKSkpIHsKKwkJY2hhciAqZGVsaW0sICpvcHRpb247 CisKKwkJb3B0aW9uID0gc2VwICsgMTsKKwkJZGVsaW0gPSBzdHJjaHIob3B0aW9uLCAnPScpOwor CQlpZiAoIWRlbGltKSB7CisJCQlkZWxpbSA9IHN0cmNocihvcHRpb24sICcsJyk7CisKKwkJCWlm ICghZGVsaW0pCisJCQkJZGVsaW0gPSBzdHIgKyBsZW47CisJCX0KKworCQlpZiAoIXN0cm5jbXAo b3B0aW9uLCAicm90YXRlIiwgZGVsaW0gLSBvcHRpb24pKSB7CisJCQljb25zdCBjaGFyICp2YWx1 ZSA9IGRlbGltICsgMTsKKwkJCXVuc2lnbmVkIGludCBkZWc7CisKKwkJCWRlZyA9IHNpbXBsZV9z dHJ0b2wodmFsdWUsICZzZXAsIDEwKTsKKworCQkJLyogTWFrZSBzdXJlIHdlIGhhdmUgcGFyc2Vk IHNvbWV0aGluZyAqLworCQkJaWYgKHNlcCA9PSB2YWx1ZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsK KworCQkJc3dpdGNoIChkZWcpIHsKKwkJCWNhc2UgMDoKKwkJCQlyb3RhdGlvbiB8PSBEUk1fTU9E RV9ST1RBVEVfMDsKKwkJCQlicmVhazsKKworCQkJY2FzZSA5MDoKKwkJCQlyb3RhdGlvbiB8PSBE Uk1fTU9ERV9ST1RBVEVfOTA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMTgwOgorCQkJCXJvdGF0 aW9uIHw9IERSTV9NT0RFX1JPVEFURV8xODA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjcwOgor CQkJCXJvdGF0aW9uIHw9IERSTV9NT0RFX1JPVEFURV8yNzA7CisJCQkJYnJlYWs7CisKKwkJCWRl ZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAo b3B0aW9uLCAicmVmbGVjdF94IiwgZGVsaW0gLSBvcHRpb24pKSB7CisJCQlyb3RhdGlvbiB8PSBE Uk1fTU9ERV9SRUZMRUNUX1g7CisJCQlzZXAgPSBkZWxpbTsKKwkJfSBlbHNlIGlmICghc3RybmNt cChvcHRpb24sICJyZWZsZWN0X3kiLCBkZWxpbSAtIG9wdGlvbikpIHsKKwkJCXJvdGF0aW9uIHw9 IERSTV9NT0RFX1JFRkxFQ1RfWTsKKwkJCXNlcCA9IGRlbGltOworCQl9IGVsc2UgeworCQkJcmV0 dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwltb2RlLT5yb3RhdGlvbiA9IHJvdGF0aW9uOworCisJ cmV0dXJuIDA7Cit9CisKIC8qKgogICogZHJtX21vZGVfcGFyc2VfY29tbWFuZF9saW5lX2Zvcl9j b25uZWN0b3IgLSBwYXJzZSBjb21tYW5kIGxpbmUgbW9kZWxpbmUgZm9yIGNvbm5lY3RvcgogICog QG1vZGVfb3B0aW9uOiBvcHRpb25hbCBwZXIgY29ubmVjdG9yIG1vZGUgb3B0aW9uCkBAIC0xNTU4 LDkgKzE2MjMsMTAgQEAgYm9vbCBkcm1fbW9kZV9wYXJzZV9jb21tYW5kX2xpbmVfZm9yX2Nvbm5l Y3Rvcihjb25zdCBjaGFyICptb2RlX29wdGlvbiwKIHsKIAljb25zdCBjaGFyICpuYW1lOwogCWJv b2wgbmFtZWRfbW9kZSA9IGZhbHNlLCBwYXJzZV9leHRyYXMgPSBmYWxzZTsKLQl1bnNpZ25lZCBp bnQgYnBwX29mZiA9IDAsIHJlZnJlc2hfb2ZmID0gMDsKKwl1bnNpZ25lZCBpbnQgYnBwX29mZiA9 IDAsIHJlZnJlc2hfb2ZmID0gMCwgb3B0aW9uc19vZmYgPSAwOwogCXVuc2lnbmVkIGludCBtb2Rl X2VuZCA9IDA7CiAJY2hhciAqYnBwX3B0ciA9IE5VTEwsICpyZWZyZXNoX3B0ciA9IE5VTEwsICpl eHRyYV9wdHIgPSBOVUxMOworCWNoYXIgKm9wdGlvbnNfcHRyID0gTlVMTDsKIAljaGFyICpicHBf ZW5kX3B0ciA9IE5VTEwsICpyZWZyZXNoX2VuZF9wdHIgPSBOVUxMOwogCWludCByZXQ7CiAKQEAg LTE2MDEsMTMgKzE2NjcsMTggQEAgYm9vbCBkcm1fbW9kZV9wYXJzZV9jb21tYW5kX2xpbmVfZm9y X2Nvbm5lY3Rvcihjb25zdCBjaGFyICptb2RlX29wdGlvbiwKIAkJbW9kZS0+cmVmcmVzaF9zcGVj aWZpZWQgPSB0cnVlOwogCX0KIAorCS8qIExvY2F0ZSB0aGUgc3RhcnQgb2YgbmFtZWQgb3B0aW9u cyAqLworCW9wdGlvbnNfcHRyID0gc3RyY2hyKG5hbWUsICcsJyk7CisJaWYgKG9wdGlvbnNfcHRy KQorCQlvcHRpb25zX29mZiA9IG9wdGlvbnNfcHRyIC0gbmFtZTsKKwogCS8qIExvY2F0ZSB0aGUg ZW5kIG9mIHRoZSBuYW1lIC8gcmVzb2x1dGlvbiwgYW5kIHBhcnNlIGl0ICovCi0JaWYgKGJwcF9w dHIgJiYgcmVmcmVzaF9wdHIpIHsKLQkJbW9kZV9lbmQgPSBtaW4oYnBwX29mZiwgcmVmcmVzaF9v ZmYpOwotCX0gZWxzZSBpZiAoYnBwX3B0cikgeworCWlmIChicHBfcHRyKSB7CiAJCW1vZGVfZW5k ID0gYnBwX29mZjsKIAl9IGVsc2UgaWYgKHJlZnJlc2hfcHRyKSB7CiAJCW1vZGVfZW5kID0gcmVm cmVzaF9vZmY7CisJfSBlbHNlIGlmIChvcHRpb25zX3B0cikgeworCQltb2RlX2VuZCA9IG9wdGlv bnNfb2ZmOwogCX0gZWxzZSB7CiAJCW1vZGVfZW5kID0gc3RybGVuKG5hbWUpOwogCQlwYXJzZV9l eHRyYXMgPSB0cnVlOwpAQCAtMTY0OSwyNCArMTcyMCwyMyBAQCBib29sIGRybV9tb2RlX3BhcnNl X2NvbW1hbmRfbGluZV9mb3JfY29ubmVjdG9yKGNvbnN0IGNoYXIgKm1vZGVfb3B0aW9uLAogCWVs c2UgaWYgKHJlZnJlc2hfcHRyKQogCQlleHRyYV9wdHIgPSByZWZyZXNoX2VuZF9wdHI7CiAKLQlp ZiAoZXh0cmFfcHRyKSB7Ci0JCWlmICghbmFtZWRfbW9kZSkgewotCQkJaW50IGxlbiA9IHN0cmxl bihuYW1lKSAtIChleHRyYV9wdHIgLSBuYW1lKTsKKwlpZiAoZXh0cmFfcHRyICYmCisJICAgIGV4 dHJhX3B0ciAhPSBvcHRpb25zX3B0cikgeworCQlpbnQgbGVuID0gc3RybGVuKG5hbWUpIC0gKGV4 dHJhX3B0ciAtIG5hbWUpOwogCi0JCQlyZXQgPSBkcm1fbW9kZV9wYXJzZV9jbWRsaW5lX2V4dHJh KGV4dHJhX3B0ciwgbGVuLAotCQkJCQkJCSAgIGNvbm5lY3RvciwgbW9kZSk7Ci0JCQlpZiAocmV0 KQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWludCByZW1haW5pbmcgPSBzdHJs ZW4obmFtZSkgLSAoZXh0cmFfcHRyIC0gbmFtZSk7CisJCXJldCA9IGRybV9tb2RlX3BhcnNlX2Nt ZGxpbmVfZXh0cmEoZXh0cmFfcHRyLCBsZW4sCisJCQkJCQkgICBjb25uZWN0b3IsIG1vZGUpOwor CQlpZiAocmV0KQorCQkJcmV0dXJuIGZhbHNlOworCX0KIAotCQkJLyoKLQkJCSAqIFdlIHN0aWxs IGhhdmUgY2hhcmFjdGVycyB0byBwcm9jZXNzLCB3aGlsZQotCQkJICogd2Ugc2hvdWxkbid0IGhh dmUgYW55Ci0JCQkgKi8KLQkJCWlmIChyZW1haW5pbmcgPiAwKQotCQkJCXJldHVybiBmYWxzZTsK LQkJfQorCWlmIChvcHRpb25zX3B0cikgeworCQlpbnQgbGVuID0gc3RybGVuKG5hbWUpIC0gKG9w dGlvbnNfcHRyIC0gbmFtZSk7CisKKwkJcmV0ID0gZHJtX21vZGVfcGFyc2VfY21kbGluZV9vcHRp b25zKG9wdGlvbnNfcHRyLCBsZW4sCisJCQkJCQkgICAgIGNvbm5lY3RvciwgbW9kZSk7CisJCWlm IChyZXQpCisJCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcmV0dXJuIHRydWU7CmRpZmYgLS1naXQg YS9pbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmggYi9pbmNsdWRlL2RybS9kcm1fY29ubmVjdG9y LmgKaW5kZXggMjE1NzYxMTUzMjQ1Li5jZmYxODM2MGY1MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUv ZHJtL2RybV9jb25uZWN0b3IuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmgKQEAg LTgzNCw2ICs4MzQsNyBAQCBzdHJ1Y3QgZHJtX2NtZGxpbmVfbW9kZSB7CiAJYm9vbCBpbnRlcmxh Y2U7CiAJYm9vbCBjdnQ7CiAJYm9vbCBtYXJnaW5zOworCXVuc2lnbmVkIGludCByb3RhdGlvbjsK IAllbnVtIGRybV9jb25uZWN0b3JfZm9yY2UgZm9yY2U7CiB9OwogCi0tIApnaXQtc2VyaWVzIDAu OS4xCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1k ZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA==