From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mian Yousaf Kaukab Subject: [PATCH 1/4] misc: sram: add support for remapping reserved regions only Date: Tue, 12 May 2020 16:48:00 +0200 Message-ID: <20200512144803.24344-1-ykaukab@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return-path: Sender: linux-tegra-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org, robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, robin.murphy-5wv7dgnIgG8@public.gmane.org Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, talho-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org, thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, afaerber-l3A5Bk7waGM@public.gmane.org, arnd-r2nGTMty4D4@public.gmane.org, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org, Mian Yousaf Kaukab List-Id: linux-tegra@vger.kernel.org Some SRAM kernel users may be interested in SRAM’s reserved regions only, though a bigger SRAM is available on the platform. Add an optional flag 'reserved-only' which allows to ioremap reserved regions only. Rest of SRAM is not remapped. ioremap type is selected depending upon no-memory-wc as usual. Signed-off-by: Mian Yousaf Kaukab --- *Tested only on Jetson TX2. Jetson AGX Xavier is untested.* drivers/misc/sram.c | 73 ++++++++++++++++++++++++++++++++++----------- drivers/misc/sram.h | 3 ++ 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/drivers/misc/sram.c b/drivers/misc/sram.c index 6c1a23cb3e8c..44e459f39e22 100644 --- a/drivers/misc/sram.c +++ b/drivers/misc/sram.c @@ -97,7 +97,7 @@ static int sram_add_partition(struct sram_dev *sram, struct sram_reserve *block, struct sram_partition *part = &sram->partition[sram->partitions]; mutex_init(&part->lock); - part->base = sram->virt_base + block->start; + part->base = block->virt_start; if (block->pool) { ret = sram_add_pool(sram, block, start, part); @@ -153,6 +153,25 @@ static int sram_reserve_cmp(void *priv, struct list_head *a, return ra->start - rb->start; } +static int sram_remap_resource(struct sram_dev *sram, + struct resource *res, void __iomem **virt) +{ + void __iomem *addr; + + if (sram->no_memory_wc) + addr = devm_ioremap_resource(sram->dev, res); + else + addr = devm_ioremap_resource_wc(sram->dev, res); + + if (IS_ERR(addr)) { + dev_err(sram->dev, "could not map SRAM region\n"); + return PTR_ERR(addr); + } + + *virt = addr; + return 0; +} + static int sram_reserve_regions(struct sram_dev *sram, struct resource *res) { struct device_node *np = sram->dev->of_node, *child; @@ -239,6 +258,16 @@ static int sram_reserve_regions(struct sram_dev *sram, struct resource *res) block->start, block->start + block->size); } + /* ioremap reserved block as whole sram is not remapped */ + if (sram->reserved_only) { + ret = sram_remap_resource(sram, &child_res, + &block->virt_start); + if (ret) + goto err_chunks; + } else { + block->virt_start = sram->virt_base + block->start; + } + block++; } child = NULL; @@ -282,8 +311,11 @@ static int sram_reserve_regions(struct sram_dev *sram, struct resource *res) } } - /* current start is in a reserved block, so continue after it */ - if (block->start == cur_start) { + /* + * Current start is in a reserved block, so continue after it. + * Or if only using reserved blocks + */ + if (block->start == cur_start || sram->reserved_only) { cur_start = block->start + block->size; continue; } @@ -342,6 +374,7 @@ static int sram_probe(struct platform_device *pdev) struct sram_dev *sram; int ret; int (*init_func)(void); + struct resource *res; sram = devm_kzalloc(&pdev->dev, sizeof(*sram), GFP_KERNEL); if (!sram) @@ -349,19 +382,22 @@ static int sram_probe(struct platform_device *pdev) sram->dev = &pdev->dev; - if (of_property_read_bool(pdev->dev.of_node, "no-memory-wc")) - sram->virt_base = devm_platform_ioremap_resource(pdev, 0); - else - sram->virt_base = devm_platform_ioremap_resource_wc(pdev, 0); - if (IS_ERR(sram->virt_base)) { - dev_err(&pdev->dev, "could not map SRAM registers\n"); - return PTR_ERR(sram->virt_base); - } + sram->no_memory_wc = + of_property_read_bool(pdev->dev.of_node, "no-memory-wc"); + sram->reserved_only = + of_property_read_bool(pdev->dev.of_node, "reserved-only"); - sram->pool = devm_gen_pool_create(sram->dev, ilog2(SRAM_GRANULARITY), - NUMA_NO_NODE, NULL); - if (IS_ERR(sram->pool)) - return PTR_ERR(sram->pool); + if (!sram->reserved_only) { + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + ret = sram_remap_resource(sram, res, &sram->virt_base); + if (ret) + return ret; + + sram->pool = devm_gen_pool_create(sram->dev, + ilog2(SRAM_GRANULARITY), NUMA_NO_NODE, NULL); + if (IS_ERR(sram->pool)) + return PTR_ERR(sram->pool); + } sram->clk = devm_clk_get(sram->dev, NULL); if (IS_ERR(sram->clk)) @@ -383,8 +419,9 @@ static int sram_probe(struct platform_device *pdev) goto err_free_partitions; } - dev_dbg(sram->dev, "SRAM pool: %zu KiB @ 0x%p\n", - gen_pool_size(sram->pool) / 1024, sram->virt_base); + if (sram->pool) + dev_dbg(sram->dev, "SRAM pool: %zu KiB @ 0x%p\n", + gen_pool_size(sram->pool) / 1024, sram->virt_base); return 0; @@ -403,7 +440,7 @@ static int sram_remove(struct platform_device *pdev) sram_free_partitions(sram); - if (gen_pool_avail(sram->pool) < gen_pool_size(sram->pool)) + if (sram->pool && gen_pool_avail(sram->pool) < gen_pool_size(sram->pool)) dev_err(sram->dev, "removed while SRAM allocated\n"); if (sram->clk) diff --git a/drivers/misc/sram.h b/drivers/misc/sram.h index 9c1d21ff7347..a485fa29458b 100644 --- a/drivers/misc/sram.h +++ b/drivers/misc/sram.h @@ -23,6 +23,8 @@ struct sram_dev { struct sram_partition *partition; u32 partitions; + bool no_memory_wc; + bool reserved_only; }; struct sram_reserve { @@ -33,6 +35,7 @@ struct sram_reserve { bool pool; bool protect_exec; const char *label; + void __iomem *virt_start; }; #ifdef CONFIG_SRAM_EXEC -- 2.25.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.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,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 32524C54E8D for ; Tue, 12 May 2020 14:48:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 11297206A5 for ; Tue, 12 May 2020 14:48:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727109AbgELOsn (ORCPT ); Tue, 12 May 2020 10:48:43 -0400 Received: from mx2.suse.de ([195.135.220.15]:35628 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725929AbgELOsm (ORCPT ); Tue, 12 May 2020 10:48:42 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 24BEEAC58; Tue, 12 May 2020 14:48:43 +0000 (UTC) From: Mian Yousaf Kaukab To: swarren@wwwdotorg.org, robh+dt@kernel.org, robin.murphy@arm.com Cc: devicetree@vger.kernel.org, talho@nvidia.com, thierry.reding@gmail.com, jonathanh@nvidia.com, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, afaerber@suse.de, arnd@arndb.de, gregkh@linuxfoundation.org, Mian Yousaf Kaukab Subject: [PATCH 1/4] misc: sram: add support for remapping reserved regions only Date: Tue, 12 May 2020 16:48:00 +0200 Message-Id: <20200512144803.24344-1-ykaukab@suse.de> X-Mailer: git-send-email 2.25.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some SRAM kernel users may be interested in SRAM’s reserved regions only, though a bigger SRAM is available on the platform. Add an optional flag 'reserved-only' which allows to ioremap reserved regions only. Rest of SRAM is not remapped. ioremap type is selected depending upon no-memory-wc as usual. Signed-off-by: Mian Yousaf Kaukab --- *Tested only on Jetson TX2. Jetson AGX Xavier is untested.* drivers/misc/sram.c | 73 ++++++++++++++++++++++++++++++++++----------- drivers/misc/sram.h | 3 ++ 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/drivers/misc/sram.c b/drivers/misc/sram.c index 6c1a23cb3e8c..44e459f39e22 100644 --- a/drivers/misc/sram.c +++ b/drivers/misc/sram.c @@ -97,7 +97,7 @@ static int sram_add_partition(struct sram_dev *sram, struct sram_reserve *block, struct sram_partition *part = &sram->partition[sram->partitions]; mutex_init(&part->lock); - part->base = sram->virt_base + block->start; + part->base = block->virt_start; if (block->pool) { ret = sram_add_pool(sram, block, start, part); @@ -153,6 +153,25 @@ static int sram_reserve_cmp(void *priv, struct list_head *a, return ra->start - rb->start; } +static int sram_remap_resource(struct sram_dev *sram, + struct resource *res, void __iomem **virt) +{ + void __iomem *addr; + + if (sram->no_memory_wc) + addr = devm_ioremap_resource(sram->dev, res); + else + addr = devm_ioremap_resource_wc(sram->dev, res); + + if (IS_ERR(addr)) { + dev_err(sram->dev, "could not map SRAM region\n"); + return PTR_ERR(addr); + } + + *virt = addr; + return 0; +} + static int sram_reserve_regions(struct sram_dev *sram, struct resource *res) { struct device_node *np = sram->dev->of_node, *child; @@ -239,6 +258,16 @@ static int sram_reserve_regions(struct sram_dev *sram, struct resource *res) block->start, block->start + block->size); } + /* ioremap reserved block as whole sram is not remapped */ + if (sram->reserved_only) { + ret = sram_remap_resource(sram, &child_res, + &block->virt_start); + if (ret) + goto err_chunks; + } else { + block->virt_start = sram->virt_base + block->start; + } + block++; } child = NULL; @@ -282,8 +311,11 @@ static int sram_reserve_regions(struct sram_dev *sram, struct resource *res) } } - /* current start is in a reserved block, so continue after it */ - if (block->start == cur_start) { + /* + * Current start is in a reserved block, so continue after it. + * Or if only using reserved blocks + */ + if (block->start == cur_start || sram->reserved_only) { cur_start = block->start + block->size; continue; } @@ -342,6 +374,7 @@ static int sram_probe(struct platform_device *pdev) struct sram_dev *sram; int ret; int (*init_func)(void); + struct resource *res; sram = devm_kzalloc(&pdev->dev, sizeof(*sram), GFP_KERNEL); if (!sram) @@ -349,19 +382,22 @@ static int sram_probe(struct platform_device *pdev) sram->dev = &pdev->dev; - if (of_property_read_bool(pdev->dev.of_node, "no-memory-wc")) - sram->virt_base = devm_platform_ioremap_resource(pdev, 0); - else - sram->virt_base = devm_platform_ioremap_resource_wc(pdev, 0); - if (IS_ERR(sram->virt_base)) { - dev_err(&pdev->dev, "could not map SRAM registers\n"); - return PTR_ERR(sram->virt_base); - } + sram->no_memory_wc = + of_property_read_bool(pdev->dev.of_node, "no-memory-wc"); + sram->reserved_only = + of_property_read_bool(pdev->dev.of_node, "reserved-only"); - sram->pool = devm_gen_pool_create(sram->dev, ilog2(SRAM_GRANULARITY), - NUMA_NO_NODE, NULL); - if (IS_ERR(sram->pool)) - return PTR_ERR(sram->pool); + if (!sram->reserved_only) { + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + ret = sram_remap_resource(sram, res, &sram->virt_base); + if (ret) + return ret; + + sram->pool = devm_gen_pool_create(sram->dev, + ilog2(SRAM_GRANULARITY), NUMA_NO_NODE, NULL); + if (IS_ERR(sram->pool)) + return PTR_ERR(sram->pool); + } sram->clk = devm_clk_get(sram->dev, NULL); if (IS_ERR(sram->clk)) @@ -383,8 +419,9 @@ static int sram_probe(struct platform_device *pdev) goto err_free_partitions; } - dev_dbg(sram->dev, "SRAM pool: %zu KiB @ 0x%p\n", - gen_pool_size(sram->pool) / 1024, sram->virt_base); + if (sram->pool) + dev_dbg(sram->dev, "SRAM pool: %zu KiB @ 0x%p\n", + gen_pool_size(sram->pool) / 1024, sram->virt_base); return 0; @@ -403,7 +440,7 @@ static int sram_remove(struct platform_device *pdev) sram_free_partitions(sram); - if (gen_pool_avail(sram->pool) < gen_pool_size(sram->pool)) + if (sram->pool && gen_pool_avail(sram->pool) < gen_pool_size(sram->pool)) dev_err(sram->dev, "removed while SRAM allocated\n"); if (sram->clk) diff --git a/drivers/misc/sram.h b/drivers/misc/sram.h index 9c1d21ff7347..a485fa29458b 100644 --- a/drivers/misc/sram.h +++ b/drivers/misc/sram.h @@ -23,6 +23,8 @@ struct sram_dev { struct sram_partition *partition; u32 partitions; + bool no_memory_wc; + bool reserved_only; }; struct sram_reserve { @@ -33,6 +35,7 @@ struct sram_reserve { bool pool; bool protect_exec; const char *label; + void __iomem *virt_start; }; #ifdef CONFIG_SRAM_EXEC -- 2.25.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.9 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,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 B440CC54E4A for ; Tue, 12 May 2020 14:49:13 +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 7D477206D3 for ; Tue, 12 May 2020 14:49:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="YVvU5cm8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7D477206D3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de 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: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:In-Reply-To:References: List-Owner; bh=UEILzvaWGryHQ+SZ+GvBPlVxjdyNZtQUKT67//1oGd4=; b=YVvU5cm8n70kKS jcQfOqNhUWGOzp4zaTCanSgtGVQ7nxszpL/P2g5lqeNVE/TX5OblRCdoUH1Sez/X/3cf8l4u1Rgta QGCfMly+uPeKYBps8QnS60hK/2ZeeXdVGeQDA8toV6MvfuT+jrj1ZYG47hX9iMRoIcc/iPwObUu8Y vwQHK7iLeFb45AFrtDaQFWaI/feYjW8bPwQt2pRMuZMBwDj57GWehcsK1ivnZyQWC1oGYxJsfAK4L 8HrxDLunx76RqJXIEvOCA7R3ZGTSGQ46RV21V/hInv2gZa/5Y8dFHmpNJ258SiIwB3dd4gWaYwZh4 Gn0+lMhIp6EK8Y0o5RMA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jYWDY-0006XO-M3; Tue, 12 May 2020 14:49:12 +0000 Received: from mx2.suse.de ([195.135.220.15]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jYWD6-00067y-Pp for linux-arm-kernel@lists.infradead.org; Tue, 12 May 2020 14:48:47 +0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 24BEEAC58; Tue, 12 May 2020 14:48:43 +0000 (UTC) From: Mian Yousaf Kaukab To: swarren@wwwdotorg.org, robh+dt@kernel.org, robin.murphy@arm.com Subject: [PATCH 1/4] misc: sram: add support for remapping reserved regions only Date: Tue, 12 May 2020 16:48:00 +0200 Message-Id: <20200512144803.24344-1-ykaukab@suse.de> X-Mailer: git-send-email 2.25.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200512_074845_145826_96001C89 X-CRM114-Status: GOOD ( 18.17 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, Mian Yousaf Kaukab , linux-kernel@vger.kernel.org, jonathanh@nvidia.com, talho@nvidia.com, thierry.reding@gmail.com, linux-tegra@vger.kernel.org, afaerber@suse.de, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org U29tZSBTUkFNIGtlcm5lbCB1c2VycyBtYXkgYmUgaW50ZXJlc3RlZCBpbiBTUkFN4oCZcyByZXNl cnZlZCByZWdpb25zCm9ubHksIHRob3VnaCBhIGJpZ2dlciBTUkFNIGlzIGF2YWlsYWJsZSBvbiB0 aGUgcGxhdGZvcm0uIEFkZCBhbgpvcHRpb25hbCBmbGFnICdyZXNlcnZlZC1vbmx5JyB3aGljaCBh bGxvd3MgdG8gaW9yZW1hcCByZXNlcnZlZCByZWdpb25zCm9ubHkuIFJlc3Qgb2YgU1JBTSBpcyBu b3QgcmVtYXBwZWQuIGlvcmVtYXAgdHlwZSBpcyBzZWxlY3RlZCBkZXBlbmRpbmcKdXBvbiBuby1t ZW1vcnktd2MgYXMgdXN1YWwuCgpTaWduZWQtb2ZmLWJ5OiBNaWFuIFlvdXNhZiBLYXVrYWIgPHlr YXVrYWJAc3VzZS5kZT4KLS0tCipUZXN0ZWQgb25seSBvbiBKZXRzb24gVFgyLiBKZXRzb24gQUdY IFhhdmllciBpcyB1bnRlc3RlZC4qCgogZHJpdmVycy9taXNjL3NyYW0uYyB8IDczICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLQogZHJpdmVycy9taXNjL3NyYW0u aCB8ICAzICsrCiAyIGZpbGVzIGNoYW5nZWQsIDU4IGluc2VydGlvbnMoKyksIDE4IGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zcmFtLmMgYi9kcml2ZXJzL21pc2Mvc3Jh bS5jCmluZGV4IDZjMWEyM2NiM2U4Yy4uNDRlNDU5ZjM5ZTIyIDEwMDY0NAotLS0gYS9kcml2ZXJz L21pc2Mvc3JhbS5jCisrKyBiL2RyaXZlcnMvbWlzYy9zcmFtLmMKQEAgLTk3LDcgKzk3LDcgQEAg c3RhdGljIGludCBzcmFtX2FkZF9wYXJ0aXRpb24oc3RydWN0IHNyYW1fZGV2ICpzcmFtLCBzdHJ1 Y3Qgc3JhbV9yZXNlcnZlICpibG9jaywKIAlzdHJ1Y3Qgc3JhbV9wYXJ0aXRpb24gKnBhcnQgPSAm c3JhbS0+cGFydGl0aW9uW3NyYW0tPnBhcnRpdGlvbnNdOwogCiAJbXV0ZXhfaW5pdCgmcGFydC0+ bG9jayk7Ci0JcGFydC0+YmFzZSA9IHNyYW0tPnZpcnRfYmFzZSArIGJsb2NrLT5zdGFydDsKKwlw YXJ0LT5iYXNlID0gYmxvY2stPnZpcnRfc3RhcnQ7CiAKIAlpZiAoYmxvY2stPnBvb2wpIHsKIAkJ cmV0ID0gc3JhbV9hZGRfcG9vbChzcmFtLCBibG9jaywgc3RhcnQsIHBhcnQpOwpAQCAtMTUzLDYg KzE1MywyNSBAQCBzdGF0aWMgaW50IHNyYW1fcmVzZXJ2ZV9jbXAodm9pZCAqcHJpdiwgc3RydWN0 IGxpc3RfaGVhZCAqYSwKIAlyZXR1cm4gcmEtPnN0YXJ0IC0gcmItPnN0YXJ0OwogfQogCitzdGF0 aWMgaW50IHNyYW1fcmVtYXBfcmVzb3VyY2Uoc3RydWN0IHNyYW1fZGV2ICpzcmFtLAorCQlzdHJ1 Y3QgcmVzb3VyY2UgKnJlcywgdm9pZCBfX2lvbWVtICoqdmlydCkKK3sKKwl2b2lkIF9faW9tZW0g KmFkZHI7CisKKwlpZiAoc3JhbS0+bm9fbWVtb3J5X3djKQorCQlhZGRyID0gZGV2bV9pb3JlbWFw X3Jlc291cmNlKHNyYW0tPmRldiwgcmVzKTsKKwllbHNlCisJCWFkZHIgPSBkZXZtX2lvcmVtYXBf cmVzb3VyY2Vfd2Moc3JhbS0+ZGV2LCByZXMpOworCisJaWYgKElTX0VSUihhZGRyKSkgeworCQlk ZXZfZXJyKHNyYW0tPmRldiwgImNvdWxkIG5vdCBtYXAgU1JBTSByZWdpb25cbiIpOworCQlyZXR1 cm4gUFRSX0VSUihhZGRyKTsKKwl9CisKKwkqdmlydCA9IGFkZHI7CisJcmV0dXJuIDA7Cit9CisK IHN0YXRpYyBpbnQgc3JhbV9yZXNlcnZlX3JlZ2lvbnMoc3RydWN0IHNyYW1fZGV2ICpzcmFtLCBz dHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gc3JhbS0+ ZGV2LT5vZl9ub2RlLCAqY2hpbGQ7CkBAIC0yMzksNiArMjU4LDE2IEBAIHN0YXRpYyBpbnQgc3Jh bV9yZXNlcnZlX3JlZ2lvbnMoc3RydWN0IHNyYW1fZGV2ICpzcmFtLCBzdHJ1Y3QgcmVzb3VyY2Ug KnJlcykKIAkJCQlibG9jay0+c3RhcnQsIGJsb2NrLT5zdGFydCArIGJsb2NrLT5zaXplKTsKIAkJ fQogCisJCS8qIGlvcmVtYXAgcmVzZXJ2ZWQgYmxvY2sgYXMgd2hvbGUgc3JhbSBpcyBub3QgcmVt YXBwZWQgKi8KKwkJaWYgKHNyYW0tPnJlc2VydmVkX29ubHkpIHsKKwkJCXJldCA9IHNyYW1fcmVt YXBfcmVzb3VyY2Uoc3JhbSwgJmNoaWxkX3JlcywKKwkJCQkJJmJsb2NrLT52aXJ0X3N0YXJ0KTsK KwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJfY2h1bmtzOworCQl9IGVsc2UgeworCQkJYmxvY2st PnZpcnRfc3RhcnQgPSBzcmFtLT52aXJ0X2Jhc2UgKyBibG9jay0+c3RhcnQ7CisJCX0KKwogCQli bG9jaysrOwogCX0KIAljaGlsZCA9IE5VTEw7CkBAIC0yODIsOCArMzExLDExIEBAIHN0YXRpYyBp bnQgc3JhbV9yZXNlcnZlX3JlZ2lvbnMoc3RydWN0IHNyYW1fZGV2ICpzcmFtLCBzdHJ1Y3QgcmVz b3VyY2UgKnJlcykKIAkJCX0KIAkJfQogCi0JCS8qIGN1cnJlbnQgc3RhcnQgaXMgaW4gYSByZXNl cnZlZCBibG9jaywgc28gY29udGludWUgYWZ0ZXIgaXQgKi8KLQkJaWYgKGJsb2NrLT5zdGFydCA9 PSBjdXJfc3RhcnQpIHsKKwkJLyoKKwkJICogQ3VycmVudCBzdGFydCBpcyBpbiBhIHJlc2VydmVk IGJsb2NrLCBzbyBjb250aW51ZSBhZnRlciBpdC4KKwkJICogT3IgaWYgb25seSB1c2luZyByZXNl cnZlZCBibG9ja3MKKwkJICovCisJCWlmIChibG9jay0+c3RhcnQgPT0gY3VyX3N0YXJ0IHx8IHNy YW0tPnJlc2VydmVkX29ubHkpIHsKIAkJCWN1cl9zdGFydCA9IGJsb2NrLT5zdGFydCArIGJsb2Nr LT5zaXplOwogCQkJY29udGludWU7CiAJCX0KQEAgLTM0Miw2ICszNzQsNyBAQCBzdGF0aWMgaW50 IHNyYW1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAlzdHJ1Y3Qgc3JhbV9k ZXYgKnNyYW07CiAJaW50IHJldDsKIAlpbnQgKCppbml0X2Z1bmMpKHZvaWQpOworCXN0cnVjdCBy ZXNvdXJjZSAqcmVzOwogCiAJc3JhbSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yo KnNyYW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNyYW0pCkBAIC0zNDksMTkgKzM4MiwyMiBAQCBz dGF0aWMgaW50IHNyYW1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAogCXNy YW0tPmRldiA9ICZwZGV2LT5kZXY7CiAKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYt PmRldi5vZl9ub2RlLCAibm8tbWVtb3J5LXdjIikpCi0JCXNyYW0tPnZpcnRfYmFzZSA9IGRldm1f cGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwKTsKLQllbHNlCi0JCXNyYW0tPnZpcnRf YmFzZSA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZV93YyhwZGV2LCAwKTsKLQlpZiAo SVNfRVJSKHNyYW0tPnZpcnRfYmFzZSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQg bm90IG1hcCBTUkFNIHJlZ2lzdGVyc1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKHNyYW0tPnZpcnRf YmFzZSk7Ci0JfQorCXNyYW0tPm5vX21lbW9yeV93YyA9CisJCW9mX3Byb3BlcnR5X3JlYWRfYm9v bChwZGV2LT5kZXYub2Zfbm9kZSwgIm5vLW1lbW9yeS13YyIpOworCXNyYW0tPnJlc2VydmVkX29u bHkgPQorCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsICJyZXNlcnZl ZC1vbmx5Iik7CiAKLQlzcmFtLT5wb29sID0gZGV2bV9nZW5fcG9vbF9jcmVhdGUoc3JhbS0+ZGV2 LCBpbG9nMihTUkFNX0dSQU5VTEFSSVRZKSwKLQkJCQkJICBOVU1BX05PX05PREUsIE5VTEwpOwot CWlmIChJU19FUlIoc3JhbS0+cG9vbCkpCi0JCXJldHVybiBQVFJfRVJSKHNyYW0tPnBvb2wpOwor CWlmICghc3JhbS0+cmVzZXJ2ZWRfb25seSkgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3Vy Y2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCQlyZXQgPSBzcmFtX3JlbWFwX3Jlc291cmNl KHNyYW0sIHJlcywgJnNyYW0tPnZpcnRfYmFzZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0 OworCisJCXNyYW0tPnBvb2wgPSBkZXZtX2dlbl9wb29sX2NyZWF0ZShzcmFtLT5kZXYsCisJCQkJ aWxvZzIoU1JBTV9HUkFOVUxBUklUWSksIE5VTUFfTk9fTk9ERSwgTlVMTCk7CisJCWlmIChJU19F UlIoc3JhbS0+cG9vbCkpCisJCQlyZXR1cm4gUFRSX0VSUihzcmFtLT5wb29sKTsKKwl9CiAKIAlz cmFtLT5jbGsgPSBkZXZtX2Nsa19nZXQoc3JhbS0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHNy YW0tPmNsaykpCkBAIC0zODMsOCArNDE5LDkgQEAgc3RhdGljIGludCBzcmFtX3Byb2JlKHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJCQlnb3RvIGVycl9mcmVlX3BhcnRpdGlvbnM7CiAJ fQogCi0JZGV2X2RiZyhzcmFtLT5kZXYsICJTUkFNIHBvb2w6ICV6dSBLaUIgQCAweCVwXG4iLAot CQlnZW5fcG9vbF9zaXplKHNyYW0tPnBvb2wpIC8gMTAyNCwgc3JhbS0+dmlydF9iYXNlKTsKKwlp ZiAoc3JhbS0+cG9vbCkKKwkJZGV2X2RiZyhzcmFtLT5kZXYsICJTUkFNIHBvb2w6ICV6dSBLaUIg QCAweCVwXG4iLAorCQkJZ2VuX3Bvb2xfc2l6ZShzcmFtLT5wb29sKSAvIDEwMjQsIHNyYW0tPnZp cnRfYmFzZSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtNDAzLDcgKzQ0MCw3IEBAIHN0YXRpYyBpbnQg c3JhbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAogCXNyYW1fZnJlZV9w YXJ0aXRpb25zKHNyYW0pOwogCi0JaWYgKGdlbl9wb29sX2F2YWlsKHNyYW0tPnBvb2wpIDwgZ2Vu X3Bvb2xfc2l6ZShzcmFtLT5wb29sKSkKKwlpZiAoc3JhbS0+cG9vbCAmJiBnZW5fcG9vbF9hdmFp bChzcmFtLT5wb29sKSA8IGdlbl9wb29sX3NpemUoc3JhbS0+cG9vbCkpCiAJCWRldl9lcnIoc3Jh bS0+ZGV2LCAicmVtb3ZlZCB3aGlsZSBTUkFNIGFsbG9jYXRlZFxuIik7CiAKIAlpZiAoc3JhbS0+ Y2xrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NyYW0uaCBiL2RyaXZlcnMvbWlzYy9zcmFt LmgKaW5kZXggOWMxZDIxZmY3MzQ3Li5hNDg1ZmEyOTQ1OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv bWlzYy9zcmFtLmgKKysrIGIvZHJpdmVycy9taXNjL3NyYW0uaApAQCAtMjMsNiArMjMsOCBAQCBz dHJ1Y3Qgc3JhbV9kZXYgewogCiAJc3RydWN0IHNyYW1fcGFydGl0aW9uICpwYXJ0aXRpb247CiAJ dTMyIHBhcnRpdGlvbnM7CisJYm9vbCBub19tZW1vcnlfd2M7CisJYm9vbCByZXNlcnZlZF9vbmx5 OwogfTsKIAogc3RydWN0IHNyYW1fcmVzZXJ2ZSB7CkBAIC0zMyw2ICszNSw3IEBAIHN0cnVjdCBz cmFtX3Jlc2VydmUgewogCWJvb2wgcG9vbDsKIAlib29sIHByb3RlY3RfZXhlYzsKIAljb25zdCBj aGFyICpsYWJlbDsKKwl2b2lkIF9faW9tZW0gKnZpcnRfc3RhcnQ7CiB9OwogCiAjaWZkZWYgQ09O RklHX1NSQU1fRVhFQwotLSAKMi4yNS4wCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJt LWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=