From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 99272212AAB70 for ; Wed, 26 Jun 2019 05:27:39 -0700 (PDT) From: Christoph Hellwig Subject: [PATCH 02/25] mm: remove the struct hmm_device infrastructure Date: Wed, 26 Jun 2019 14:27:01 +0200 Message-Id: <20190626122724.13313-3-hch@lst.de> In-Reply-To: <20190626122724.13313-1-hch@lst.de> References: <20190626122724.13313-1-hch@lst.de> MIME-Version: 1.0 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: John Hubbard , linux-nvdimm@lists.01.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-mm@kvack.org, nouveau@lists.freedesktop.org List-ID: This code is a trivial wrapper around device model helpers, which should have been integrated into the driver device model usage from the start. Assuming it actually had users, which it never had since the code was added more than 1 1/2 years ago. Signed-off-by: Christoph Hellwig Reviewed-by: Jason Gunthorpe Reviewed-by: John Hubbard --- include/linux/hmm.h | 20 ------------ mm/hmm.c | 80 --------------------------------------------- 2 files changed, 100 deletions(-) diff --git a/include/linux/hmm.h b/include/linux/hmm.h index 044a36d7c3f8..99765be3284d 100644 --- a/include/linux/hmm.h +++ b/include/linux/hmm.h @@ -751,26 +751,6 @@ static inline unsigned long hmm_devmem_page_get_drvdata(const struct page *page) { return page->hmm_data; } - - -/* - * struct hmm_device - fake device to hang device memory onto - * - * @device: device struct - * @minor: device minor number - */ -struct hmm_device { - struct device device; - unsigned int minor; -}; - -/* - * A device driver that wants to handle multiple devices memory through a - * single fake device can use hmm_device to do so. This is purely a helper and - * it is not strictly needed, in order to make use of any HMM functionality. - */ -struct hmm_device *hmm_device_new(void *drvdata); -void hmm_device_put(struct hmm_device *hmm_device); #endif /* CONFIG_DEVICE_PRIVATE || CONFIG_DEVICE_PUBLIC */ #else /* IS_ENABLED(CONFIG_HMM) */ static inline void hmm_mm_destroy(struct mm_struct *mm) {} diff --git a/mm/hmm.c b/mm/hmm.c index f702a3895d05..00cc642b3d7e 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -1528,84 +1528,4 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops, return devmem; } EXPORT_SYMBOL_GPL(hmm_devmem_add_resource); - -/* - * A device driver that wants to handle multiple devices memory through a - * single fake device can use hmm_device to do so. This is purely a helper - * and it is not needed to make use of any HMM functionality. - */ -#define HMM_DEVICE_MAX 256 - -static DECLARE_BITMAP(hmm_device_mask, HMM_DEVICE_MAX); -static DEFINE_SPINLOCK(hmm_device_lock); -static struct class *hmm_device_class; -static dev_t hmm_device_devt; - -static void hmm_device_release(struct device *device) -{ - struct hmm_device *hmm_device; - - hmm_device = container_of(device, struct hmm_device, device); - spin_lock(&hmm_device_lock); - clear_bit(hmm_device->minor, hmm_device_mask); - spin_unlock(&hmm_device_lock); - - kfree(hmm_device); -} - -struct hmm_device *hmm_device_new(void *drvdata) -{ - struct hmm_device *hmm_device; - - hmm_device = kzalloc(sizeof(*hmm_device), GFP_KERNEL); - if (!hmm_device) - return ERR_PTR(-ENOMEM); - - spin_lock(&hmm_device_lock); - hmm_device->minor = find_first_zero_bit(hmm_device_mask, HMM_DEVICE_MAX); - if (hmm_device->minor >= HMM_DEVICE_MAX) { - spin_unlock(&hmm_device_lock); - kfree(hmm_device); - return ERR_PTR(-EBUSY); - } - set_bit(hmm_device->minor, hmm_device_mask); - spin_unlock(&hmm_device_lock); - - dev_set_name(&hmm_device->device, "hmm_device%d", hmm_device->minor); - hmm_device->device.devt = MKDEV(MAJOR(hmm_device_devt), - hmm_device->minor); - hmm_device->device.release = hmm_device_release; - dev_set_drvdata(&hmm_device->device, drvdata); - hmm_device->device.class = hmm_device_class; - device_initialize(&hmm_device->device); - - return hmm_device; -} -EXPORT_SYMBOL(hmm_device_new); - -void hmm_device_put(struct hmm_device *hmm_device) -{ - put_device(&hmm_device->device); -} -EXPORT_SYMBOL(hmm_device_put); - -static int __init hmm_init(void) -{ - int ret; - - ret = alloc_chrdev_region(&hmm_device_devt, 0, - HMM_DEVICE_MAX, - "hmm_device"); - if (ret) - return ret; - - hmm_device_class = class_create(THIS_MODULE, "hmm_device"); - if (IS_ERR(hmm_device_class)) { - unregister_chrdev_region(hmm_device_devt, HMM_DEVICE_MAX); - return PTR_ERR(hmm_device_class); - } - return 0; -} - -device_initcall(hmm_init); #endif /* CONFIG_DEVICE_PRIVATE || CONFIG_DEVICE_PUBLIC */ -- 2.20.1 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm 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=-8.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable 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 EE52FC48BD8 for ; Wed, 26 Jun 2019 12:27:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BBD18204FD for ; Wed, 26 Jun 2019 12:27:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="TYyr8+iI" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727432AbfFZM1n (ORCPT ); Wed, 26 Jun 2019 08:27:43 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:42616 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726104AbfFZM1n (ORCPT ); Wed, 26 Jun 2019 08:27:43 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From :Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=rGvR8Y3VXb8jN+vdsmRnpGP1SMJpLPi/itvVIHyAWXU=; b=TYyr8+iIscH+GbFojbkVfsiLy/ 6V8UUXvizUy8y3RPIBP8D9fnAAWP1Qp3sQ0sR+7bkQT1JQTmAlVGgzV+v5fI+1/jsOTIaD9g9Nlt5 eCg4w7LDJEp3UasjTwmhklZTb1RKuStpx3O6WBj284yuzSZ465ORbD41rf5TlpnjWseyj/9ZGWUX0 jqEcyt7u3QkIFSnlYttTQKFW4z74J/M3DrSAahyhlWyJz59xYJo/uIeeQJH4OkHQ1zhCjJF4xHu8+ OrPQl82tMjsj6r5fhLBWxDUhgn578TysCuob8uYDDrRMv8kZyxSJieY3eDm5K6J4NdLz48vrSb/oq +rsECRcw==; Received: from clnet-p19-102.ikbnet.co.at ([83.175.77.102] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92 #3 (Red Hat Linux)) id 1hg71Q-0001L5-OE; Wed, 26 Jun 2019 12:27:33 +0000 From: Christoph Hellwig To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: linux-mm@kvack.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-nvdimm@lists.01.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, John Hubbard Subject: [PATCH 02/25] mm: remove the struct hmm_device infrastructure Date: Wed, 26 Jun 2019 14:27:01 +0200 Message-Id: <20190626122724.13313-3-hch@lst.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190626122724.13313-1-hch@lst.de> References: <20190626122724.13313-1-hch@lst.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This code is a trivial wrapper around device model helpers, which should have been integrated into the driver device model usage from the start. Assuming it actually had users, which it never had since the code was added more than 1 1/2 years ago. Signed-off-by: Christoph Hellwig Reviewed-by: Jason Gunthorpe Reviewed-by: John Hubbard --- include/linux/hmm.h | 20 ------------ mm/hmm.c | 80 --------------------------------------------- 2 files changed, 100 deletions(-) diff --git a/include/linux/hmm.h b/include/linux/hmm.h index 044a36d7c3f8..99765be3284d 100644 --- a/include/linux/hmm.h +++ b/include/linux/hmm.h @@ -751,26 +751,6 @@ static inline unsigned long hmm_devmem_page_get_drvdata(const struct page *page) { return page->hmm_data; } - - -/* - * struct hmm_device - fake device to hang device memory onto - * - * @device: device struct - * @minor: device minor number - */ -struct hmm_device { - struct device device; - unsigned int minor; -}; - -/* - * A device driver that wants to handle multiple devices memory through a - * single fake device can use hmm_device to do so. This is purely a helper and - * it is not strictly needed, in order to make use of any HMM functionality. - */ -struct hmm_device *hmm_device_new(void *drvdata); -void hmm_device_put(struct hmm_device *hmm_device); #endif /* CONFIG_DEVICE_PRIVATE || CONFIG_DEVICE_PUBLIC */ #else /* IS_ENABLED(CONFIG_HMM) */ static inline void hmm_mm_destroy(struct mm_struct *mm) {} diff --git a/mm/hmm.c b/mm/hmm.c index f702a3895d05..00cc642b3d7e 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -1528,84 +1528,4 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops, return devmem; } EXPORT_SYMBOL_GPL(hmm_devmem_add_resource); - -/* - * A device driver that wants to handle multiple devices memory through a - * single fake device can use hmm_device to do so. This is purely a helper - * and it is not needed to make use of any HMM functionality. - */ -#define HMM_DEVICE_MAX 256 - -static DECLARE_BITMAP(hmm_device_mask, HMM_DEVICE_MAX); -static DEFINE_SPINLOCK(hmm_device_lock); -static struct class *hmm_device_class; -static dev_t hmm_device_devt; - -static void hmm_device_release(struct device *device) -{ - struct hmm_device *hmm_device; - - hmm_device = container_of(device, struct hmm_device, device); - spin_lock(&hmm_device_lock); - clear_bit(hmm_device->minor, hmm_device_mask); - spin_unlock(&hmm_device_lock); - - kfree(hmm_device); -} - -struct hmm_device *hmm_device_new(void *drvdata) -{ - struct hmm_device *hmm_device; - - hmm_device = kzalloc(sizeof(*hmm_device), GFP_KERNEL); - if (!hmm_device) - return ERR_PTR(-ENOMEM); - - spin_lock(&hmm_device_lock); - hmm_device->minor = find_first_zero_bit(hmm_device_mask, HMM_DEVICE_MAX); - if (hmm_device->minor >= HMM_DEVICE_MAX) { - spin_unlock(&hmm_device_lock); - kfree(hmm_device); - return ERR_PTR(-EBUSY); - } - set_bit(hmm_device->minor, hmm_device_mask); - spin_unlock(&hmm_device_lock); - - dev_set_name(&hmm_device->device, "hmm_device%d", hmm_device->minor); - hmm_device->device.devt = MKDEV(MAJOR(hmm_device_devt), - hmm_device->minor); - hmm_device->device.release = hmm_device_release; - dev_set_drvdata(&hmm_device->device, drvdata); - hmm_device->device.class = hmm_device_class; - device_initialize(&hmm_device->device); - - return hmm_device; -} -EXPORT_SYMBOL(hmm_device_new); - -void hmm_device_put(struct hmm_device *hmm_device) -{ - put_device(&hmm_device->device); -} -EXPORT_SYMBOL(hmm_device_put); - -static int __init hmm_init(void) -{ - int ret; - - ret = alloc_chrdev_region(&hmm_device_devt, 0, - HMM_DEVICE_MAX, - "hmm_device"); - if (ret) - return ret; - - hmm_device_class = class_create(THIS_MODULE, "hmm_device"); - if (IS_ERR(hmm_device_class)) { - unregister_chrdev_region(hmm_device_devt, HMM_DEVICE_MAX); - return PTR_ERR(hmm_device_class); - } - return 0; -} - -device_initcall(hmm_init); #endif /* CONFIG_DEVICE_PRIVATE || CONFIG_DEVICE_PUBLIC */ -- 2.20.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: [PATCH 02/25] mm: remove the struct hmm_device infrastructure Date: Wed, 26 Jun 2019 14:27:01 +0200 Message-ID: <20190626122724.13313-3-hch@lst.de> References: <20190626122724.13313-1-hch@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190626122724.13313-1-hch-jcswGhMUV9g@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org, linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: nouveau.vger.kernel.org VGhpcyBjb2RlIGlzIGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCBkZXZpY2UgbW9kZWwgaGVscGVy cywgd2hpY2gKc2hvdWxkIGhhdmUgYmVlbiBpbnRlZ3JhdGVkIGludG8gdGhlIGRyaXZlciBkZXZp Y2UgbW9kZWwgdXNhZ2UgZnJvbQp0aGUgc3RhcnQuICBBc3N1bWluZyBpdCBhY3R1YWxseSBoYWQg dXNlcnMsIHdoaWNoIGl0IG5ldmVyIGhhZCBzaW5jZQp0aGUgY29kZSB3YXMgYWRkZWQgbW9yZSB0 aGFuIDEgMS8yIHllYXJzIGFnby4KClNpZ25lZC1vZmYtYnk6IENocmlzdG9waCBIZWxsd2lnIDxo Y2hAbHN0LmRlPgpSZXZpZXdlZC1ieTogSmFzb24gR3VudGhvcnBlIDxqZ2dAbWVsbGFub3guY29t PgpSZXZpZXdlZC1ieTogSm9obiBIdWJiYXJkIDxqaHViYmFyZEBudmlkaWEuY29tPgotLS0KIGlu Y2x1ZGUvbGludXgvaG1tLmggfCAyMCAtLS0tLS0tLS0tLS0KIG1tL2htbS5jICAgICAgICAgICAg fCA4MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDIgZmls ZXMgY2hhbmdlZCwgMTAwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgv aG1tLmggYi9pbmNsdWRlL2xpbnV4L2htbS5oCmluZGV4IDA0NGEzNmQ3YzNmOC4uOTk3NjViZTMy ODRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2htbS5oCisrKyBiL2luY2x1ZGUvbGludXgv aG1tLmgKQEAgLTc1MSwyNiArNzUxLDYgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGht bV9kZXZtZW1fcGFnZV9nZXRfZHJ2ZGF0YShjb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAly ZXR1cm4gcGFnZS0+aG1tX2RhdGE7CiB9Ci0KLQotLyoKLSAqIHN0cnVjdCBobW1fZGV2aWNlIC0g ZmFrZSBkZXZpY2UgdG8gaGFuZyBkZXZpY2UgbWVtb3J5IG9udG8KLSAqCi0gKiBAZGV2aWNlOiBk ZXZpY2Ugc3RydWN0Ci0gKiBAbWlub3I6IGRldmljZSBtaW5vciBudW1iZXIKLSAqLwotc3RydWN0 IGhtbV9kZXZpY2UgewotCXN0cnVjdCBkZXZpY2UJCWRldmljZTsKLQl1bnNpZ25lZCBpbnQJCW1p bm9yOwotfTsKLQotLyoKLSAqIEEgZGV2aWNlIGRyaXZlciB0aGF0IHdhbnRzIHRvIGhhbmRsZSBt dWx0aXBsZSBkZXZpY2VzIG1lbW9yeSB0aHJvdWdoIGEKLSAqIHNpbmdsZSBmYWtlIGRldmljZSBj YW4gdXNlIGhtbV9kZXZpY2UgdG8gZG8gc28uIFRoaXMgaXMgcHVyZWx5IGEgaGVscGVyIGFuZAot ICogaXQgaXMgbm90IHN0cmljdGx5IG5lZWRlZCwgaW4gb3JkZXIgdG8gbWFrZSB1c2Ugb2YgYW55 IEhNTSBmdW5jdGlvbmFsaXR5LgotICovCi1zdHJ1Y3QgaG1tX2RldmljZSAqaG1tX2RldmljZV9u ZXcodm9pZCAqZHJ2ZGF0YSk7Ci12b2lkIGhtbV9kZXZpY2VfcHV0KHN0cnVjdCBobW1fZGV2aWNl ICpobW1fZGV2aWNlKTsKICNlbmRpZiAvKiBDT05GSUdfREVWSUNFX1BSSVZBVEUgfHwgQ09ORklH X0RFVklDRV9QVUJMSUMgKi8KICNlbHNlIC8qIElTX0VOQUJMRUQoQ09ORklHX0hNTSkgKi8KIHN0 YXRpYyBpbmxpbmUgdm9pZCBobW1fbW1fZGVzdHJveShzdHJ1Y3QgbW1fc3RydWN0ICptbSkge30K ZGlmZiAtLWdpdCBhL21tL2htbS5jIGIvbW0vaG1tLmMKaW5kZXggZjcwMmEzODk1ZDA1Li4wMGNj NjQyYjNkN2UgMTAwNjQ0Ci0tLSBhL21tL2htbS5jCisrKyBiL21tL2htbS5jCkBAIC0xNTI4LDg0 ICsxNTI4LDQgQEAgc3RydWN0IGhtbV9kZXZtZW0gKmhtbV9kZXZtZW1fYWRkX3Jlc291cmNlKGNv bnN0IHN0cnVjdCBobW1fZGV2bWVtX29wcyAqb3BzLAogCXJldHVybiBkZXZtZW07CiB9CiBFWFBP UlRfU1lNQk9MX0dQTChobW1fZGV2bWVtX2FkZF9yZXNvdXJjZSk7Ci0KLS8qCi0gKiBBIGRldmlj ZSBkcml2ZXIgdGhhdCB3YW50cyB0byBoYW5kbGUgbXVsdGlwbGUgZGV2aWNlcyBtZW1vcnkgdGhy b3VnaCBhCi0gKiBzaW5nbGUgZmFrZSBkZXZpY2UgY2FuIHVzZSBobW1fZGV2aWNlIHRvIGRvIHNv LiBUaGlzIGlzIHB1cmVseSBhIGhlbHBlcgotICogYW5kIGl0IGlzIG5vdCBuZWVkZWQgdG8gbWFr ZSB1c2Ugb2YgYW55IEhNTSBmdW5jdGlvbmFsaXR5LgotICovCi0jZGVmaW5lIEhNTV9ERVZJQ0Vf TUFYIDI1NgotCi1zdGF0aWMgREVDTEFSRV9CSVRNQVAoaG1tX2RldmljZV9tYXNrLCBITU1fREVW SUNFX01BWCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGhtbV9kZXZpY2VfbG9jayk7Ci1zdGF0 aWMgc3RydWN0IGNsYXNzICpobW1fZGV2aWNlX2NsYXNzOwotc3RhdGljIGRldl90IGhtbV9kZXZp Y2VfZGV2dDsKLQotc3RhdGljIHZvaWQgaG1tX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2Ug KmRldmljZSkKLXsKLQlzdHJ1Y3QgaG1tX2RldmljZSAqaG1tX2RldmljZTsKLQotCWhtbV9kZXZp Y2UgPSBjb250YWluZXJfb2YoZGV2aWNlLCBzdHJ1Y3QgaG1tX2RldmljZSwgZGV2aWNlKTsKLQlz cGluX2xvY2soJmhtbV9kZXZpY2VfbG9jayk7Ci0JY2xlYXJfYml0KGhtbV9kZXZpY2UtPm1pbm9y LCBobW1fZGV2aWNlX21hc2spOwotCXNwaW5fdW5sb2NrKCZobW1fZGV2aWNlX2xvY2spOwotCi0J a2ZyZWUoaG1tX2RldmljZSk7Ci19Ci0KLXN0cnVjdCBobW1fZGV2aWNlICpobW1fZGV2aWNlX25l dyh2b2lkICpkcnZkYXRhKQotewotCXN0cnVjdCBobW1fZGV2aWNlICpobW1fZGV2aWNlOwotCi0J aG1tX2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKCpobW1fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0J aWYgKCFobW1fZGV2aWNlKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCXNwaW5fbG9j aygmaG1tX2RldmljZV9sb2NrKTsKLQlobW1fZGV2aWNlLT5taW5vciA9IGZpbmRfZmlyc3RfemVy b19iaXQoaG1tX2RldmljZV9tYXNrLCBITU1fREVWSUNFX01BWCk7Ci0JaWYgKGhtbV9kZXZpY2Ut Pm1pbm9yID49IEhNTV9ERVZJQ0VfTUFYKSB7Ci0JCXNwaW5fdW5sb2NrKCZobW1fZGV2aWNlX2xv Y2spOwotCQlrZnJlZShobW1fZGV2aWNlKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKLQl9 Ci0Jc2V0X2JpdChobW1fZGV2aWNlLT5taW5vciwgaG1tX2RldmljZV9tYXNrKTsKLQlzcGluX3Vu bG9jaygmaG1tX2RldmljZV9sb2NrKTsKLQotCWRldl9zZXRfbmFtZSgmaG1tX2RldmljZS0+ZGV2 aWNlLCAiaG1tX2RldmljZSVkIiwgaG1tX2RldmljZS0+bWlub3IpOwotCWhtbV9kZXZpY2UtPmRl dmljZS5kZXZ0ID0gTUtERVYoTUFKT1IoaG1tX2RldmljZV9kZXZ0KSwKLQkJCQkJaG1tX2Rldmlj ZS0+bWlub3IpOwotCWhtbV9kZXZpY2UtPmRldmljZS5yZWxlYXNlID0gaG1tX2RldmljZV9yZWxl YXNlOwotCWRldl9zZXRfZHJ2ZGF0YSgmaG1tX2RldmljZS0+ZGV2aWNlLCBkcnZkYXRhKTsKLQlo bW1fZGV2aWNlLT5kZXZpY2UuY2xhc3MgPSBobW1fZGV2aWNlX2NsYXNzOwotCWRldmljZV9pbml0 aWFsaXplKCZobW1fZGV2aWNlLT5kZXZpY2UpOwotCi0JcmV0dXJuIGhtbV9kZXZpY2U7Ci19Ci1F WFBPUlRfU1lNQk9MKGhtbV9kZXZpY2VfbmV3KTsKLQotdm9pZCBobW1fZGV2aWNlX3B1dChzdHJ1 Y3QgaG1tX2RldmljZSAqaG1tX2RldmljZSkKLXsKLQlwdXRfZGV2aWNlKCZobW1fZGV2aWNlLT5k ZXZpY2UpOwotfQotRVhQT1JUX1NZTUJPTChobW1fZGV2aWNlX3B1dCk7Ci0KLXN0YXRpYyBpbnQg X19pbml0IGhtbV9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGFsbG9jX2NocmRl dl9yZWdpb24oJmhtbV9kZXZpY2VfZGV2dCwgMCwKLQkJCQkgIEhNTV9ERVZJQ0VfTUFYLAotCQkJ CSAgImhtbV9kZXZpY2UiKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaG1tX2Rldmlj ZV9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImhtbV9kZXZpY2UiKTsKLQlpZiAo SVNfRVJSKGhtbV9kZXZpY2VfY2xhc3MpKSB7Ci0JCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbiho bW1fZGV2aWNlX2RldnQsIEhNTV9ERVZJQ0VfTUFYKTsKLQkJcmV0dXJuIFBUUl9FUlIoaG1tX2Rl dmljZV9jbGFzcyk7Ci0JfQotCXJldHVybiAwOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoaG1tX2lu aXQpOwogI2VuZGlmIC8qIENPTkZJR19ERVZJQ0VfUFJJVkFURSB8fCBDT05GSUdfREVWSUNFX1BV QkxJQyAqLwotLSAKMi4yMC4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpOb3V2ZWF1IG1haWxpbmcgbGlzdApOb3V2ZWF1QGxpc3RzLmZyZWVkZXNrdG9w Lm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL25vdXZl YXU=