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=-19.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, 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 5272BC11F66 for ; Fri, 9 Jul 2021 18:45:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3BD9D613BE for ; Fri, 9 Jul 2021 18:45:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230180AbhGISsQ (ORCPT ); Fri, 9 Jul 2021 14:48:16 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:38835 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230146AbhGISsP (ORCPT ); Fri, 9 Jul 2021 14:48:15 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1625856331; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZE+8I+fCwfENmMykXhY87Q7jxn2ECw/J1dlCjcQ+Uls=; b=XSNF4NzvQdr7K4a68iCT+LGL37KFCUgqb7bD5LBNVbvTmHzSC72WTeD/ek+7tG2rnO9qN/ cgvrRpA7t70IC5XoGqxCpV4+kjPw68XBhFjCu0vOSa3+b6I1DGLE6oveVkZuvxhjqnYL08 sRwOHZz3burGuQXRABqFP1ttYnLB4KI= Received: from mail-oo1-f70.google.com (mail-oo1-f70.google.com [209.85.161.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-273-zAglNpCAMoiwZqYrpnijZw-1; Fri, 09 Jul 2021 14:45:30 -0400 X-MC-Unique: zAglNpCAMoiwZqYrpnijZw-1 Received: by mail-oo1-f70.google.com with SMTP id z6-20020a4ab6060000b029024c2413e5c6so6070173oon.1 for ; Fri, 09 Jul 2021 11:45:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZE+8I+fCwfENmMykXhY87Q7jxn2ECw/J1dlCjcQ+Uls=; b=F5R0QyaUT+N1pDqyjoUBg4ygjcAxBTeWSCMcWFfElRuiONFsZCdMv2x4w1/C8+tZEr S62Y6Ooi9M5cgDNIa1zCe5Jy2B1BXLo2UmJAEGQ7kBJ2DHLL8R5u3B7k96HPBb7FXjLh XNSDIFosp4vKgbWY+3UsYFTmZwcJMfueEUNJ7SkJ1YglLXUsqdXaeTc3qJWS5ba4laGa vnLw2181vlTQxP6ZLMjTRbj1ELvekLbMIjKZTDqz1dzplY+nrUMsztT8T4KL0wC1F4tC RTF/OwEE+npfbfLQOn2zm1ivkckVDw/ntK2PnLZ8bgwqUWn4cVLbHPc+WvZReR6LLVcl yF+w== X-Gm-Message-State: AOAM530iFP/S6bQGohe3la4/u33+RBDG11RWjWucZ9ehHqM0pfFojInA gsJTF2EizG7+vC+Z0IP5IqLV0PoTiEvuGHWX0NwGSQIucdhhRhm6UdszuxB5I2WnC2r04S4RiId /9aYBcBoQtCi3UQF3WyZa3+hy X-Received: by 2002:a05:6830:24a6:: with SMTP id v6mr27364623ots.116.1625856327905; Fri, 09 Jul 2021 11:45:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwdRIyXJ2DESf9uOweCiMLi6c6iJom9u6aaW6CW/mSaNlMzgsZYVjyiKhROcO4KzpqR3nXyEw== X-Received: by 2002:a05:6830:24a6:: with SMTP id v6mr27364558ots.116.1625856326800; Fri, 09 Jul 2021 11:45:26 -0700 (PDT) Received: from localhost.localdomain.com (075-142-250-213.res.spectrum.com. [75.142.250.213]) by smtp.gmail.com with ESMTPSA id a44sm1145482ooj.12.2021.07.09.11.45.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Jul 2021 11:45:26 -0700 (PDT) From: trix@redhat.com To: mdf@kernel.org, corbet@lwn.net, hao.wu@intel.com, michal.simek@xilinx.com Cc: linux-fpga@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Russ Weight , Tom Rix , Xu Yilun Subject: [RFC PATCH v10 1/3] fpga: mgr: Use standard dev_release for class driver Date: Fri, 9 Jul 2021 11:45:09 -0700 Message-Id: <20210709184511.2521508-3-trix@redhat.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: <20210709184511.2521508-1-trix@redhat.com> References: <20210709184511.2521508-1-trix@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Russ Weight The FPGA manager class driver data structure is being treated as a managed resource instead of using the standard dev_release call-back function to release the class data structure. This change removes the managed resource code for the freeing of the class data structure and combines the create() and register() functions into a single register() function. The devm_fpga_mgr_register() function is retained Signed-off-by: Russ Weight Signed-off-by: Tom Rix Reviewed-by: Xu Yilun --- Documentation/driver-api/fpga/fpga-mgr.rst | 23 +-- drivers/fpga/altera-cvp.c | 12 +- drivers/fpga/altera-pr-ip-core.c | 7 +- drivers/fpga/altera-ps-spi.c | 9 +- drivers/fpga/dfl-fme-mgr.c | 10 +- drivers/fpga/fpga-mgr.c | 166 ++++++--------------- drivers/fpga/ice40-spi.c | 9 +- drivers/fpga/machxo2-spi.c | 9 +- drivers/fpga/socfpga-a10.c | 16 +- drivers/fpga/socfpga.c | 9 +- drivers/fpga/stratix10-soc.c | 16 +- drivers/fpga/ts73xx-fpga.c | 9 +- drivers/fpga/xilinx-spi.c | 11 +- drivers/fpga/zynq-fpga.c | 16 +- drivers/fpga/zynqmp-fpga.c | 9 +- include/linux/fpga/fpga-mgr.h | 16 +- 16 files changed, 111 insertions(+), 236 deletions(-) diff --git a/Documentation/driver-api/fpga/fpga-mgr.rst b/Documentation/driver-api/fpga/fpga-mgr.rst index 917ee22db429d..86488aa9391a5 100644 --- a/Documentation/driver-api/fpga/fpga-mgr.rst +++ b/Documentation/driver-api/fpga/fpga-mgr.rst @@ -49,14 +49,14 @@ probe function calls fpga_mgr_register(), such as:: * them in priv */ - mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", - &socfpga_fpga_ops, priv); - if (!mgr) - return -ENOMEM; + mgr = fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager", + &socfpga_fpga_ops, priv); + if (IS_ERR(mgr)) + return PTR_ERR(mgr); platform_set_drvdata(pdev, mgr); - return fpga_mgr_register(mgr); + return 0; } static int socfpga_fpga_remove(struct platform_device *pdev) @@ -68,6 +68,11 @@ probe function calls fpga_mgr_register(), such as:: return 0; } +Alternatively, the probe function could call the resource managed register +functions devm_fpga_mgr_register(). When these functions are used, the +parameter syntax is the same, but the call to fpga_mgr_unregister() should +be removed. In the above example, the socfpga_fpga_remove() function would +not be required. The ops will implement whatever device specific register writes are needed to do the programming sequence for this particular FPGA. These ops return 0 for @@ -104,8 +109,8 @@ API for implementing a new FPGA Manager driver * ``fpga_mgr_states`` — Values for :c:expr:`fpga_manager->state`. * struct fpga_manager — the FPGA manager struct * struct fpga_manager_ops — Low level FPGA manager driver ops -* devm_fpga_mgr_create() — Allocate and init a manager struct -* fpga_mgr_register() — Register an FPGA manager +* fpga_mgr_register() — Create and register an FPGA manager +* devm_fpga_mgr_register() — Resource managed version of fpga_mgr_register() * fpga_mgr_unregister() — Unregister an FPGA manager .. kernel-doc:: include/linux/fpga/fpga-mgr.h @@ -118,10 +123,10 @@ API for implementing a new FPGA Manager driver :functions: fpga_manager_ops .. kernel-doc:: drivers/fpga/fpga-mgr.c - :functions: devm_fpga_mgr_create + :functions: fpga_mgr_register .. kernel-doc:: drivers/fpga/fpga-mgr.c - :functions: fpga_mgr_register + :functions: devm_fpga_mgr_register .. kernel-doc:: drivers/fpga/fpga-mgr.c :functions: fpga_mgr_unregister diff --git a/drivers/fpga/altera-cvp.c b/drivers/fpga/altera-cvp.c index 4e0edb60bfba6..b61020ceb0a1e 100644 --- a/drivers/fpga/altera-cvp.c +++ b/drivers/fpga/altera-cvp.c @@ -652,19 +652,15 @@ static int altera_cvp_probe(struct pci_dev *pdev, snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s @%s", ALTERA_CVP_MGR_NAME, pci_name(pdev)); - mgr = devm_fpga_mgr_create(&pdev->dev, conf->mgr_name, - &altera_cvp_ops, conf); - if (!mgr) { - ret = -ENOMEM; + mgr = fpga_mgr_register(&pdev->dev, conf->mgr_name, + &altera_cvp_ops, conf); + if (IS_ERR(mgr)) { + ret = PTR_ERR(mgr); goto err_unmap; } pci_set_drvdata(pdev, mgr); - ret = fpga_mgr_register(mgr); - if (ret) - goto err_unmap; - return 0; err_unmap: diff --git a/drivers/fpga/altera-pr-ip-core.c b/drivers/fpga/altera-pr-ip-core.c index dfdf21ed34c4e..be0667968d33b 100644 --- a/drivers/fpga/altera-pr-ip-core.c +++ b/drivers/fpga/altera-pr-ip-core.c @@ -191,11 +191,8 @@ int alt_pr_register(struct device *dev, void __iomem *reg_base) (val & ALT_PR_CSR_STATUS_MSK) >> ALT_PR_CSR_STATUS_SFT, (int)(val & ALT_PR_CSR_PR_START)); - mgr = devm_fpga_mgr_create(dev, dev_name(dev), &alt_pr_ops, priv); - if (!mgr) - return -ENOMEM; - - return devm_fpga_mgr_register(dev, mgr); + mgr = devm_fpga_mgr_register(dev, dev_name(dev), &alt_pr_ops, priv); + return PTR_ERR_OR_ZERO(mgr); } EXPORT_SYMBOL_GPL(alt_pr_register); diff --git a/drivers/fpga/altera-ps-spi.c b/drivers/fpga/altera-ps-spi.c index 23bfd4d1ad0f7..5e1e009dba896 100644 --- a/drivers/fpga/altera-ps-spi.c +++ b/drivers/fpga/altera-ps-spi.c @@ -302,12 +302,9 @@ static int altera_ps_probe(struct spi_device *spi) snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s %s", dev_driver_string(&spi->dev), dev_name(&spi->dev)); - mgr = devm_fpga_mgr_create(&spi->dev, conf->mgr_name, - &altera_ps_ops, conf); - if (!mgr) - return -ENOMEM; - - return devm_fpga_mgr_register(&spi->dev, mgr); + mgr = devm_fpga_mgr_register(&spi->dev, conf->mgr_name, + &altera_ps_ops, conf); + return PTR_ERR_OR_ZERO(mgr); } static const struct spi_device_id altera_ps_spi_ids[] = { diff --git a/drivers/fpga/dfl-fme-mgr.c b/drivers/fpga/dfl-fme-mgr.c index 8c5423eeffe75..da509c4c029f6 100644 --- a/drivers/fpga/dfl-fme-mgr.c +++ b/drivers/fpga/dfl-fme-mgr.c @@ -313,12 +313,12 @@ static int fme_mgr_probe(struct platform_device *pdev) _fme_mgr_get_compat_id(priv->ioaddr, &priv->compat_id); - mgr = devm_fpga_mgr_create(dev, "DFL FME FPGA Manager", - &fme_mgr_ops, priv); - if (!mgr) - return -ENOMEM; + mgr = devm_fpga_mgr_register(dev, "DFL FME FPGA Manager", + &fme_mgr_ops, priv); + if (IS_ERR(mgr)) + return PTR_ERR(mgr); - return devm_fpga_mgr_register(dev, mgr); + return 0; } static struct platform_driver fme_mgr_driver = { diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c index ecb4c3c795fa5..e240a23df79ff 100644 --- a/drivers/fpga/fpga-mgr.c +++ b/drivers/fpga/fpga-mgr.c @@ -550,20 +550,20 @@ void fpga_mgr_unlock(struct fpga_manager *mgr) EXPORT_SYMBOL_GPL(fpga_mgr_unlock); /** - * fpga_mgr_create - create and initialize an FPGA manager struct + * fpga_mgr_register - create and register an FPGA Manager device * @parent: fpga manager device from pdev * @name: fpga manager name * @mops: pointer to structure of fpga manager ops * @priv: fpga manager private data * - * The caller of this function is responsible for freeing the struct with - * fpga_mgr_free(). Using devm_fpga_mgr_create() instead is recommended. + * The caller of this function is responsible for calling fpga_mgr_unregister(). + * Using devm_fpga_mgr_register() instead is recommended. * - * Return: pointer to struct fpga_manager or NULL + * Return: pointer to struct fpga_manager pointer or ERR_PTR() */ -struct fpga_manager *fpga_mgr_create(struct device *parent, const char *name, - const struct fpga_manager_ops *mops, - void *priv) +struct fpga_manager * +fpga_mgr_register(struct device *parent, const char *name, + const struct fpga_manager_ops *mops, void *priv) { struct fpga_manager *mgr; int id, ret; @@ -572,21 +572,23 @@ struct fpga_manager *fpga_mgr_create(struct device *parent, const char *name, !mops->write_init || (!mops->write && !mops->write_sg) || (mops->write && mops->write_sg)) { dev_err(parent, "Attempt to register without fpga_manager_ops\n"); - return NULL; + return ERR_PTR(-EINVAL); } if (!name || !strlen(name)) { dev_err(parent, "Attempt to register with no name!\n"); - return NULL; + return ERR_PTR(-EINVAL); } mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); if (!mgr) - return NULL; + return ERR_PTR(-ENOMEM); id = ida_simple_get(&fpga_mgr_ida, 0, 0, GFP_KERNEL); - if (id < 0) + if (id < 0) { + ret = id; goto error_kfree; + } mutex_init(&mgr->ref_mutex); @@ -594,7 +596,6 @@ struct fpga_manager *fpga_mgr_create(struct device *parent, const char *name, mgr->mops = mops; mgr->priv = priv; - device_initialize(&mgr->dev); mgr->dev.class = fpga_mgr_class; mgr->dev.groups = mops->groups; mgr->dev.parent = parent; @@ -605,84 +606,6 @@ struct fpga_manager *fpga_mgr_create(struct device *parent, const char *name, if (ret) goto error_device; - return mgr; - -error_device: - ida_simple_remove(&fpga_mgr_ida, id); -error_kfree: - kfree(mgr); - - return NULL; -} -EXPORT_SYMBOL_GPL(fpga_mgr_create); - -/** - * fpga_mgr_free - free an FPGA manager created with fpga_mgr_create() - * @mgr: fpga manager struct - */ -void fpga_mgr_free(struct fpga_manager *mgr) -{ - ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); - kfree(mgr); -} -EXPORT_SYMBOL_GPL(fpga_mgr_free); - -static void devm_fpga_mgr_release(struct device *dev, void *res) -{ - struct fpga_mgr_devres *dr = res; - - fpga_mgr_free(dr->mgr); -} - -/** - * devm_fpga_mgr_create - create and initialize a managed FPGA manager struct - * @parent: fpga manager device from pdev - * @name: fpga manager name - * @mops: pointer to structure of fpga manager ops - * @priv: fpga manager private data - * - * This function is intended for use in an FPGA manager driver's probe function. - * After the manager driver creates the manager struct with - * devm_fpga_mgr_create(), it should register it with fpga_mgr_register(). The - * manager driver's remove function should call fpga_mgr_unregister(). The - * manager struct allocated with this function will be freed automatically on - * driver detach. This includes the case of a probe function returning error - * before calling fpga_mgr_register(), the struct will still get cleaned up. - * - * Return: pointer to struct fpga_manager or NULL - */ -struct fpga_manager *devm_fpga_mgr_create(struct device *parent, const char *name, - const struct fpga_manager_ops *mops, - void *priv) -{ - struct fpga_mgr_devres *dr; - - dr = devres_alloc(devm_fpga_mgr_release, sizeof(*dr), GFP_KERNEL); - if (!dr) - return NULL; - - dr->mgr = fpga_mgr_create(parent, name, mops, priv); - if (!dr->mgr) { - devres_free(dr); - return NULL; - } - - devres_add(parent, dr); - - return dr->mgr; -} -EXPORT_SYMBOL_GPL(devm_fpga_mgr_create); - -/** - * fpga_mgr_register - register an FPGA manager - * @mgr: fpga manager struct - * - * Return: 0 on success, negative error code otherwise. - */ -int fpga_mgr_register(struct fpga_manager *mgr) -{ - int ret; - /* * Initialize framework state by requesting low level driver read state * from device. FPGA may be in reset mode or may have been programmed @@ -690,18 +613,20 @@ int fpga_mgr_register(struct fpga_manager *mgr) */ mgr->state = mgr->mops->state(mgr); - ret = device_add(&mgr->dev); - if (ret) - goto error_device; - - dev_info(&mgr->dev, "%s registered\n", mgr->name); + ret = device_register(&mgr->dev); + if (ret) { + put_device(&mgr->dev); + return ERR_PTR(ret); + } - return 0; + return mgr; error_device: - ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); + ida_simple_remove(&fpga_mgr_ida, id); +error_kfree: + kfree(mgr); - return ret; + return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(fpga_mgr_register); @@ -726,14 +651,6 @@ void fpga_mgr_unregister(struct fpga_manager *mgr) } EXPORT_SYMBOL_GPL(fpga_mgr_unregister); -static int fpga_mgr_devres_match(struct device *dev, void *res, - void *match_data) -{ - struct fpga_mgr_devres *dr = res; - - return match_data == dr->mgr; -} - static void devm_fpga_mgr_unregister(struct device *dev, void *res) { struct fpga_mgr_devres *dr = res; @@ -743,44 +660,45 @@ static void devm_fpga_mgr_unregister(struct device *dev, void *res) /** * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register() - * @dev: managing device for this FPGA manager - * @mgr: fpga manager struct + * @parent: fpga manager device from pdev + * @info: parameters for fpga manager + * @name: fpga manager name + * @mops: pointer to structure of fpga manager ops + * @priv: fpga manager private data * * This is the devres variant of fpga_mgr_register() for which the unregister * function will be called automatically when the managing device is detached. */ -int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr) +struct fpga_manager * +devm_fpga_mgr_register(struct device *parent, const char *name, + const struct fpga_manager_ops *mops, void *priv) { struct fpga_mgr_devres *dr; - int ret; - - /* - * Make sure that the struct fpga_manager * that is passed in is - * managed itself. - */ - if (WARN_ON(!devres_find(dev, devm_fpga_mgr_release, - fpga_mgr_devres_match, mgr))) - return -EINVAL; + struct fpga_manager *mgr; dr = devres_alloc(devm_fpga_mgr_unregister, sizeof(*dr), GFP_KERNEL); if (!dr) - return -ENOMEM; + return ERR_PTR(-ENOMEM); - ret = fpga_mgr_register(mgr); - if (ret) { + mgr = fpga_mgr_register(parent, name, mops, priv); + if (IS_ERR(mgr)) { devres_free(dr); - return ret; + return mgr; } dr->mgr = mgr; - devres_add(dev, dr); + devres_add(parent, dr); - return 0; + return mgr; } EXPORT_SYMBOL_GPL(devm_fpga_mgr_register); static void fpga_mgr_dev_release(struct device *dev) { + struct fpga_manager *mgr = to_fpga_manager(dev); + + ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); + kfree(mgr); } static int __init fpga_mgr_class_init(void) diff --git a/drivers/fpga/ice40-spi.c b/drivers/fpga/ice40-spi.c index 69dec5af23c36..b7591912248fc 100644 --- a/drivers/fpga/ice40-spi.c +++ b/drivers/fpga/ice40-spi.c @@ -178,12 +178,9 @@ static int ice40_fpga_probe(struct spi_device *spi) return ret; } - mgr = devm_fpga_mgr_create(dev, "Lattice iCE40 FPGA Manager", - &ice40_fpga_ops, priv); - if (!mgr) - return -ENOMEM; - - return devm_fpga_mgr_register(dev, mgr); + mgr = devm_fpga_mgr_register(dev, "Lattice iCE40 FPGA Manager", + &ice40_fpga_ops, priv); + return PTR_ERR_OR_ZERO(mgr); } static const struct of_device_id ice40_fpga_of_match[] = { diff --git a/drivers/fpga/machxo2-spi.c b/drivers/fpga/machxo2-spi.c index 1afb41aa20d71..8469dfb5dd219 100644 --- a/drivers/fpga/machxo2-spi.c +++ b/drivers/fpga/machxo2-spi.c @@ -366,12 +366,9 @@ static int machxo2_spi_probe(struct spi_device *spi) return -EINVAL; } - mgr = devm_fpga_mgr_create(dev, "Lattice MachXO2 SPI FPGA Manager", - &machxo2_ops, spi); - if (!mgr) - return -ENOMEM; - - return devm_fpga_mgr_register(dev, mgr); + mgr = devm_fpga_mgr_register(dev, "Lattice MachXO2 SPI FPGA Manager", + &machxo2_ops, spi); + return PTR_ERR_OR_ZERO(mgr); } #ifdef CONFIG_OF diff --git a/drivers/fpga/socfpga-a10.c b/drivers/fpga/socfpga-a10.c index 573d88bdf7307..ac8e89b8a5cc9 100644 --- a/drivers/fpga/socfpga-a10.c +++ b/drivers/fpga/socfpga-a10.c @@ -508,19 +508,15 @@ static int socfpga_a10_fpga_probe(struct platform_device *pdev) return -EBUSY; } - mgr = devm_fpga_mgr_create(dev, "SoCFPGA Arria10 FPGA Manager", - &socfpga_a10_fpga_mgr_ops, priv); - if (!mgr) - return -ENOMEM; - - platform_set_drvdata(pdev, mgr); - - ret = fpga_mgr_register(mgr); - if (ret) { + mgr = fpga_mgr_register(dev, "SoCFPGA Arria10 FPGA Manager", + &socfpga_a10_fpga_mgr_ops, priv); + if (IS_ERR(mgr)) { clk_disable_unprepare(priv->clk); - return ret; + return PTR_ERR(mgr); } + platform_set_drvdata(pdev, mgr); + return 0; } diff --git a/drivers/fpga/socfpga.c b/drivers/fpga/socfpga.c index 1f467173fc1f3..7e0741f996968 100644 --- a/drivers/fpga/socfpga.c +++ b/drivers/fpga/socfpga.c @@ -571,12 +571,9 @@ static int socfpga_fpga_probe(struct platform_device *pdev) if (ret) return ret; - mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", - &socfpga_fpga_ops, priv); - if (!mgr) - return -ENOMEM; - - return devm_fpga_mgr_register(dev, mgr); + mgr = devm_fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager", + &socfpga_fpga_ops, priv); + return PTR_ERR_OR_ZERO(mgr); } #ifdef CONFIG_OF diff --git a/drivers/fpga/stratix10-soc.c b/drivers/fpga/stratix10-soc.c index a2cea500f7cc6..9155e888a133e 100644 --- a/drivers/fpga/stratix10-soc.c +++ b/drivers/fpga/stratix10-soc.c @@ -425,18 +425,11 @@ static int s10_probe(struct platform_device *pdev) init_completion(&priv->status_return_completion); - mgr = fpga_mgr_create(dev, "Stratix10 SOC FPGA Manager", - &s10_ops, priv); - if (!mgr) { - dev_err(dev, "unable to create FPGA manager\n"); - ret = -ENOMEM; - goto probe_err; - } - - ret = fpga_mgr_register(mgr); - if (ret) { + mgr = fpga_mgr_register(dev, "Stratix10 SOC FPGA Manager", + &s10_ops, priv); + if (IS_ERR(mgr)) { dev_err(dev, "unable to register FPGA manager\n"); - fpga_mgr_free(mgr); + ret = PTR_ERR(mgr); goto probe_err; } @@ -454,7 +447,6 @@ static int s10_remove(struct platform_device *pdev) struct s10_priv *priv = mgr->priv; fpga_mgr_unregister(mgr); - fpga_mgr_free(mgr); stratix10_svc_free_channel(priv->chan); return 0; diff --git a/drivers/fpga/ts73xx-fpga.c b/drivers/fpga/ts73xx-fpga.c index 101f016c6ed8c..fd52de20ddb2b 100644 --- a/drivers/fpga/ts73xx-fpga.c +++ b/drivers/fpga/ts73xx-fpga.c @@ -122,12 +122,9 @@ static int ts73xx_fpga_probe(struct platform_device *pdev) if (IS_ERR(priv->io_base)) return PTR_ERR(priv->io_base); - mgr = devm_fpga_mgr_create(kdev, "TS-73xx FPGA Manager", - &ts73xx_fpga_ops, priv); - if (!mgr) - return -ENOMEM; - - return devm_fpga_mgr_register(kdev, mgr); + mgr = devm_fpga_mgr_register(kdev, "TS-73xx FPGA Manager", + &ts73xx_fpga_ops, priv); + return PTR_ERR_OR_ZERO(mgr); } static struct platform_driver ts73xx_fpga_driver = { diff --git a/drivers/fpga/xilinx-spi.c b/drivers/fpga/xilinx-spi.c index fee4d0abf6bfe..db23626f9ab27 100644 --- a/drivers/fpga/xilinx-spi.c +++ b/drivers/fpga/xilinx-spi.c @@ -247,13 +247,10 @@ static int xilinx_spi_probe(struct spi_device *spi) return dev_err_probe(&spi->dev, PTR_ERR(conf->done), "Failed to get DONE gpio\n"); - mgr = devm_fpga_mgr_create(&spi->dev, - "Xilinx Slave Serial FPGA Manager", - &xilinx_spi_ops, conf); - if (!mgr) - return -ENOMEM; - - return devm_fpga_mgr_register(&spi->dev, mgr); + mgr = devm_fpga_mgr_register(&spi->dev, + "Xilinx Slave Serial FPGA Manager", + &xilinx_spi_ops, conf); + return PTR_ERR_OR_ZERO(mgr); } static const struct of_device_id xlnx_spi_of_match[] = { diff --git a/drivers/fpga/zynq-fpga.c b/drivers/fpga/zynq-fpga.c index 07fa8d9ec6750..74bbb9710f4ee 100644 --- a/drivers/fpga/zynq-fpga.c +++ b/drivers/fpga/zynq-fpga.c @@ -609,20 +609,16 @@ static int zynq_fpga_probe(struct platform_device *pdev) clk_disable(priv->clk); - mgr = devm_fpga_mgr_create(dev, "Xilinx Zynq FPGA Manager", - &zynq_fpga_ops, priv); - if (!mgr) - return -ENOMEM; - - platform_set_drvdata(pdev, mgr); - - err = fpga_mgr_register(mgr); - if (err) { + mgr = fpga_mgr_register(dev, "Xilinx Zynq FPGA Manager", + &zynq_fpga_ops, priv); + if (IS_ERR(mgr)) { dev_err(dev, "unable to register FPGA manager\n"); clk_unprepare(priv->clk); - return err; + return PTR_ERR(mgr); } + platform_set_drvdata(pdev, mgr); + return 0; } diff --git a/drivers/fpga/zynqmp-fpga.c b/drivers/fpga/zynqmp-fpga.c index 125743c9797ff..975bdc4d0a65e 100644 --- a/drivers/fpga/zynqmp-fpga.c +++ b/drivers/fpga/zynqmp-fpga.c @@ -102,12 +102,9 @@ static int zynqmp_fpga_probe(struct platform_device *pdev) priv->dev = dev; - mgr = devm_fpga_mgr_create(dev, "Xilinx ZynqMP FPGA Manager", - &zynqmp_fpga_ops, priv); - if (!mgr) - return -ENOMEM; - - return devm_fpga_mgr_register(dev, mgr); + mgr = devm_fpga_mgr_register(dev, "Xilinx ZynqMP FPGA Manager", + &zynqmp_fpga_ops, priv); + return PTR_ERR_OR_ZERO(mgr); } static const struct of_device_id zynqmp_fpga_of_match[] = { diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h index ebdea215a8643..cd852d4e17839 100644 --- a/include/linux/fpga/fpga-mgr.h +++ b/include/linux/fpga/fpga-mgr.h @@ -178,17 +178,13 @@ struct fpga_manager *fpga_mgr_get(struct device *dev); void fpga_mgr_put(struct fpga_manager *mgr); -struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name, - const struct fpga_manager_ops *mops, - void *priv); -void fpga_mgr_free(struct fpga_manager *mgr); -int fpga_mgr_register(struct fpga_manager *mgr); +struct fpga_manager * +fpga_mgr_register(struct device *parent, const char *name, + const struct fpga_manager_ops *mops, void *priv); void fpga_mgr_unregister(struct fpga_manager *mgr); -int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr); - -struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name, - const struct fpga_manager_ops *mops, - void *priv); +struct fpga_manager * +devm_fpga_mgr_register(struct device *parent, const char *name, + const struct fpga_manager_ops *mops, void *priv); #endif /*_LINUX_FPGA_MGR_H */ -- 2.26.3 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=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,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 585B8C07E99 for ; Fri, 9 Jul 2021 18:47:25 +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 29906613B7 for ; Fri, 9 Jul 2021 18:47:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 29906613B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+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.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=nF+avZHIWDVZaJYLVftYWgCEUz8Mw0y+RfeXCmXpmhU=; b=Pk6HX/RdYG8UiG 01Nbje1hWY5WFPoOyzGAbsMpAQFalksisZPzUBUPft6dRkZyV0fZWLyC0VvRQqMsetW639Pbou1Qg MqDvtpzJzMxokGdUL6Hj8OeAxi3eMufz4JG05RlHqcVj11tT3Luuk5NUbRiQmQ7UFiAgazBxSBaxM I8Q5hUlgTqNPt7IHcBrG2szr7ACTO98PPIp398mwDBsK9/6eoe8w77E9D0rSuWA1rzqY7FKOC/qQ6 TlLLA3RY3s1TRUyFqL2Q22RUkNE5abkt9psWxdrJW5gADC/S5jEiZ3WRkQlI3xfZASA8has1N9fvy rWNywXX7aP6cGKYSbehA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m1vVP-002K6A-Eh; Fri, 09 Jul 2021 18:45:43 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m1vVG-002K4y-HH for linux-arm-kernel@lists.infradead.org; Fri, 09 Jul 2021 18:45:38 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1625856333; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZE+8I+fCwfENmMykXhY87Q7jxn2ECw/J1dlCjcQ+Uls=; b=I4IK5fzC8XG/7raG350Jp6f56ildEMhEsWkWsX7SpMYwSb5uS5eZrGEbUM1K34R9C8LOn4 /6jMMh1paddeeyzEVBPw58SAQhHh4TDKvBQ9yoz8mKaycEdP7F9fpVBxlAaYEoaOngcYQB zYRcOaT+Moz7gozB7IqcoPsDYlw1zBw= Received: from mail-oi1-f197.google.com (mail-oi1-f197.google.com [209.85.167.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-332-6wnKRR_FMwuNXW_4K9F1GQ-1; Fri, 09 Jul 2021 14:45:30 -0400 X-MC-Unique: 6wnKRR_FMwuNXW_4K9F1GQ-1 Received: by mail-oi1-f197.google.com with SMTP id o15-20020a0568080f8fb029023dd6814af4so7228138oiw.9 for ; Fri, 09 Jul 2021 11:45:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZE+8I+fCwfENmMykXhY87Q7jxn2ECw/J1dlCjcQ+Uls=; b=NWohxUXdzGiEn8XrOd4+lip4nSoSzqlCcKPmVyPk1gk9TQUBry/5tA4lZqcMHNSkXM YKHkEgBdF+Y5RFG0qKmaKU9/Bb5R52CLocnnYV+8xqEHdbTgXW1I7KBNi5gqD0ubSNuI xx77iuRP+WOcHRxYaiqdrCEYOH+wct14I3QV/S14vsn7YyoyuNcLI6gh+XVyrRf9Z2A5 vXmpZvn7jhIcS4N433cWMLiu4bv2NR5bGBDc5SnBiskBAzL+GvgrukU7YIlEGJrByqE+ eHlF2hKnI2LkoI+ISalpE21I9WaX788zwYXCPtOfrMBWPnGF/bbmXvrDX7YPo0KtQsPu 2dBA== X-Gm-Message-State: AOAM531K0mGR8i3ZrMvRFJ2Tb74mNw51NuYKYZCVmGBY6xZFV2BbRGrX PI4XeHsxKCsPptprGyKAZpT3a5n1mn+bysWT6ykvbvK9m1ZLbjp3FcIl9niHOYPborvD2m7v2qO +DOmZWbo+DWXYOnonrQO+xvza9AWzJq1Jnhw= X-Received: by 2002:a05:6830:24a6:: with SMTP id v6mr27364620ots.116.1625856327905; Fri, 09 Jul 2021 11:45:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwdRIyXJ2DESf9uOweCiMLi6c6iJom9u6aaW6CW/mSaNlMzgsZYVjyiKhROcO4KzpqR3nXyEw== X-Received: by 2002:a05:6830:24a6:: with SMTP id v6mr27364558ots.116.1625856326800; Fri, 09 Jul 2021 11:45:26 -0700 (PDT) Received: from localhost.localdomain.com (075-142-250-213.res.spectrum.com. [75.142.250.213]) by smtp.gmail.com with ESMTPSA id a44sm1145482ooj.12.2021.07.09.11.45.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Jul 2021 11:45:26 -0700 (PDT) From: trix@redhat.com To: mdf@kernel.org, corbet@lwn.net, hao.wu@intel.com, michal.simek@xilinx.com Cc: linux-fpga@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Russ Weight , Tom Rix , Xu Yilun Subject: [RFC PATCH v10 1/3] fpga: mgr: Use standard dev_release for class driver Date: Fri, 9 Jul 2021 11:45:09 -0700 Message-Id: <20210709184511.2521508-3-trix@redhat.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: <20210709184511.2521508-1-trix@redhat.com> References: <20210709184511.2521508-1-trix@redhat.com> MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=trix@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210709_114535_400558_4065FA5F X-CRM114-Status: GOOD ( 27.20 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RnJvbTogUnVzcyBXZWlnaHQgPHJ1c3NlbGwuaC53ZWlnaHRAaW50ZWwuY29tPgoKVGhlIEZQR0Eg bWFuYWdlciBjbGFzcyBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmUgaXMgYmVpbmcgdHJlYXRlZCBhcyBh Cm1hbmFnZWQgcmVzb3VyY2UgaW5zdGVhZCBvZiB1c2luZyB0aGUgc3RhbmRhcmQgZGV2X3JlbGVh c2UgY2FsbC1iYWNrCmZ1bmN0aW9uIHRvIHJlbGVhc2UgdGhlIGNsYXNzIGRhdGEgc3RydWN0dXJl LiBUaGlzIGNoYW5nZSByZW1vdmVzCnRoZSBtYW5hZ2VkIHJlc291cmNlIGNvZGUgZm9yIHRoZSBm cmVlaW5nIG9mIHRoZSBjbGFzcyBkYXRhIHN0cnVjdHVyZQphbmQgY29tYmluZXMgdGhlIGNyZWF0 ZSgpIGFuZCByZWdpc3RlcigpIGZ1bmN0aW9ucyBpbnRvIGEgc2luZ2xlCnJlZ2lzdGVyKCkgZnVu Y3Rpb24uCgpUaGUgZGV2bV9mcGdhX21ncl9yZWdpc3RlcigpIGZ1bmN0aW9uIGlzIHJldGFpbmVk CgpTaWduZWQtb2ZmLWJ5OiBSdXNzIFdlaWdodCA8cnVzc2VsbC5oLndlaWdodEBpbnRlbC5jb20+ ClNpZ25lZC1vZmYtYnk6IFRvbSBSaXggPHRyaXhAcmVkaGF0LmNvbT4KUmV2aWV3ZWQtYnk6IFh1 IFlpbHVuIDx5aWx1bi54dUBpbnRlbC5jb20+Ci0tLQogRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBp L2ZwZ2EvZnBnYS1tZ3IucnN0IHwgIDIzICstLQogZHJpdmVycy9mcGdhL2FsdGVyYS1jdnAuYyAg ICAgICAgICAgICAgICAgIHwgIDEyICstCiBkcml2ZXJzL2ZwZ2EvYWx0ZXJhLXByLWlwLWNvcmUu YyAgICAgICAgICAgfCAgIDcgKy0KIGRyaXZlcnMvZnBnYS9hbHRlcmEtcHMtc3BpLmMgICAgICAg ICAgICAgICB8ICAgOSArLQogZHJpdmVycy9mcGdhL2RmbC1mbWUtbWdyLmMgICAgICAgICAgICAg ICAgIHwgIDEwICstCiBkcml2ZXJzL2ZwZ2EvZnBnYS1tZ3IuYyAgICAgICAgICAgICAgICAgICAg fCAxNjYgKysrKysrLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2ZwZ2EvaWNlNDAtc3BpLmMgICAg ICAgICAgICAgICAgICAgfCAgIDkgKy0KIGRyaXZlcnMvZnBnYS9tYWNoeG8yLXNwaS5jICAgICAg ICAgICAgICAgICB8ICAgOSArLQogZHJpdmVycy9mcGdhL3NvY2ZwZ2EtYTEwLmMgICAgICAgICAg ICAgICAgIHwgIDE2ICstCiBkcml2ZXJzL2ZwZ2Evc29jZnBnYS5jICAgICAgICAgICAgICAgICAg ICAgfCAgIDkgKy0KIGRyaXZlcnMvZnBnYS9zdHJhdGl4MTAtc29jLmMgICAgICAgICAgICAgICB8 ICAxNiArLQogZHJpdmVycy9mcGdhL3RzNzN4eC1mcGdhLmMgICAgICAgICAgICAgICAgIHwgICA5 ICstCiBkcml2ZXJzL2ZwZ2EveGlsaW54LXNwaS5jICAgICAgICAgICAgICAgICAgfCAgMTEgKy0K IGRyaXZlcnMvZnBnYS96eW5xLWZwZ2EuYyAgICAgICAgICAgICAgICAgICB8ICAxNiArLQogZHJp dmVycy9mcGdhL3p5bnFtcC1mcGdhLmMgICAgICAgICAgICAgICAgIHwgICA5ICstCiBpbmNsdWRl L2xpbnV4L2ZwZ2EvZnBnYS1tZ3IuaCAgICAgICAgICAgICAgfCAgMTYgKy0KIDE2IGZpbGVzIGNo YW5nZWQsIDExMSBpbnNlcnRpb25zKCspLCAyMzYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv RG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2ZwZ2EvZnBnYS1tZ3IucnN0IGIvRG9jdW1lbnRhdGlv bi9kcml2ZXItYXBpL2ZwZ2EvZnBnYS1tZ3IucnN0CmluZGV4IDkxN2VlMjJkYjQyOWQuLjg2NDg4 YWE5MzkxYTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9mcGdhL2ZwZ2Et bWdyLnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZnBnYS9mcGdhLW1nci5yc3QK QEAgLTQ5LDE0ICs0OSwxNCBAQCBwcm9iZSBmdW5jdGlvbiBjYWxscyBmcGdhX21ncl9yZWdpc3Rl cigpLCBzdWNoIGFzOjoKIAkJICogdGhlbSBpbiBwcml2CiAJCSAqLwogCi0JCW1nciA9IGRldm1f ZnBnYV9tZ3JfY3JlYXRlKGRldiwgIkFsdGVyYSBTT0NGUEdBIEZQR0EgTWFuYWdlciIsCi0JCQkJ CSAgICZzb2NmcGdhX2ZwZ2Ffb3BzLCBwcml2KTsKLQkJaWYgKCFtZ3IpCi0JCQlyZXR1cm4gLUVO T01FTTsKKwkJbWdyID0gZnBnYV9tZ3JfcmVnaXN0ZXIoZGV2LCAiQWx0ZXJhIFNPQ0ZQR0EgRlBH QSBNYW5hZ2VyIiwKKwkJCQkJJnNvY2ZwZ2FfZnBnYV9vcHMsIHByaXYpOworCQlpZiAoSVNfRVJS KG1ncikpCisJCQlyZXR1cm4gUFRSX0VSUihtZ3IpOwogCiAJCXBsYXRmb3JtX3NldF9kcnZkYXRh KHBkZXYsIG1ncik7CiAKLQkJcmV0dXJuIGZwZ2FfbWdyX3JlZ2lzdGVyKG1ncik7CisJCXJldHVy biAwOwogCX0KIAogCXN0YXRpYyBpbnQgc29jZnBnYV9mcGdhX3JlbW92ZShzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2KQpAQCAtNjgsNiArNjgsMTEgQEAgcHJvYmUgZnVuY3Rpb24gY2FsbHMg ZnBnYV9tZ3JfcmVnaXN0ZXIoKSwgc3VjaCBhczo6CiAJCXJldHVybiAwOwogCX0KIAorQWx0ZXJu YXRpdmVseSwgdGhlIHByb2JlIGZ1bmN0aW9uIGNvdWxkIGNhbGwgdGhlIHJlc291cmNlIG1hbmFn ZWQgcmVnaXN0ZXIKK2Z1bmN0aW9ucyBkZXZtX2ZwZ2FfbWdyX3JlZ2lzdGVyKCkuIFdoZW4gdGhl c2UgZnVuY3Rpb25zIGFyZSB1c2VkLCB0aGUKK3BhcmFtZXRlciBzeW50YXggaXMgdGhlIHNhbWUs IGJ1dCB0aGUgY2FsbCB0byBmcGdhX21ncl91bnJlZ2lzdGVyKCkgc2hvdWxkCitiZSByZW1vdmVk LiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIHNvY2ZwZ2FfZnBnYV9yZW1vdmUoKSBmdW5jdGlv biB3b3VsZAorbm90IGJlIHJlcXVpcmVkLgogCiBUaGUgb3BzIHdpbGwgaW1wbGVtZW50IHdoYXRl dmVyIGRldmljZSBzcGVjaWZpYyByZWdpc3RlciB3cml0ZXMgYXJlIG5lZWRlZCB0bwogZG8gdGhl IHByb2dyYW1taW5nIHNlcXVlbmNlIGZvciB0aGlzIHBhcnRpY3VsYXIgRlBHQS4gIFRoZXNlIG9w cyByZXR1cm4gMCBmb3IKQEAgLTEwNCw4ICsxMDksOCBAQCBBUEkgZm9yIGltcGxlbWVudGluZyBh IG5ldyBGUEdBIE1hbmFnZXIgZHJpdmVyCiAqIGBgZnBnYV9tZ3Jfc3RhdGVzYGAg4oCUICBWYWx1 ZXMgZm9yIDpjOmV4cHI6YGZwZ2FfbWFuYWdlci0+c3RhdGVgLgogKiBzdHJ1Y3QgZnBnYV9tYW5h Z2VyIOKAlCAgdGhlIEZQR0EgbWFuYWdlciBzdHJ1Y3QKICogc3RydWN0IGZwZ2FfbWFuYWdlcl9v cHMg4oCUICBMb3cgbGV2ZWwgRlBHQSBtYW5hZ2VyIGRyaXZlciBvcHMKLSogZGV2bV9mcGdhX21n cl9jcmVhdGUoKSDigJQgIEFsbG9jYXRlIGFuZCBpbml0IGEgbWFuYWdlciBzdHJ1Y3QKLSogZnBn YV9tZ3JfcmVnaXN0ZXIoKSDigJQgIFJlZ2lzdGVyIGFuIEZQR0EgbWFuYWdlcgorKiBmcGdhX21n cl9yZWdpc3RlcigpIOKAlCAgQ3JlYXRlIGFuZCByZWdpc3RlciBhbiBGUEdBIG1hbmFnZXIKKyog ZGV2bV9mcGdhX21ncl9yZWdpc3RlcigpIOKAlCAgUmVzb3VyY2UgbWFuYWdlZCB2ZXJzaW9uIG9m IGZwZ2FfbWdyX3JlZ2lzdGVyKCkKICogZnBnYV9tZ3JfdW5yZWdpc3RlcigpIOKAlCAgVW5yZWdp c3RlciBhbiBGUEdBIG1hbmFnZXIKIAogLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvZnBn YS9mcGdhLW1nci5oCkBAIC0xMTgsMTAgKzEyMywxMCBAQCBBUEkgZm9yIGltcGxlbWVudGluZyBh IG5ldyBGUEdBIE1hbmFnZXIgZHJpdmVyCiAgICA6ZnVuY3Rpb25zOiBmcGdhX21hbmFnZXJfb3Bz CiAKIC4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2ZwZ2EvZnBnYS1tZ3IuYwotICAgOmZ1bmN0aW9u czogZGV2bV9mcGdhX21ncl9jcmVhdGUKKyAgIDpmdW5jdGlvbnM6IGZwZ2FfbWdyX3JlZ2lzdGVy CiAKIC4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2ZwZ2EvZnBnYS1tZ3IuYwotICAgOmZ1bmN0aW9u czogZnBnYV9tZ3JfcmVnaXN0ZXIKKyAgIDpmdW5jdGlvbnM6IGRldm1fZnBnYV9tZ3JfcmVnaXN0 ZXIKIAogLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZnBnYS9mcGdhLW1nci5jCiAgICA6ZnVuY3Rp b25zOiBmcGdhX21ncl91bnJlZ2lzdGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZwZ2EvYWx0ZXJh LWN2cC5jIGIvZHJpdmVycy9mcGdhL2FsdGVyYS1jdnAuYwppbmRleCA0ZTBlZGI2MGJmYmE2Li5i NjEwMjBjZWIwYTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZwZ2EvYWx0ZXJhLWN2cC5jCisrKyBi L2RyaXZlcnMvZnBnYS9hbHRlcmEtY3ZwLmMKQEAgLTY1MiwxOSArNjUyLDE1IEBAIHN0YXRpYyBp bnQgYWx0ZXJhX2N2cF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAlzbnByaW50Zihjb25m LT5tZ3JfbmFtZSwgc2l6ZW9mKGNvbmYtPm1ncl9uYW1lKSwgIiVzIEAlcyIsCiAJCSBBTFRFUkFf Q1ZQX01HUl9OQU1FLCBwY2lfbmFtZShwZGV2KSk7CiAKLQltZ3IgPSBkZXZtX2ZwZ2FfbWdyX2Ny ZWF0ZSgmcGRldi0+ZGV2LCBjb25mLT5tZ3JfbmFtZSwKLQkJCQkgICAmYWx0ZXJhX2N2cF9vcHMs IGNvbmYpOwotCWlmICghbWdyKSB7Ci0JCXJldCA9IC1FTk9NRU07CisJbWdyID0gZnBnYV9tZ3Jf cmVnaXN0ZXIoJnBkZXYtPmRldiwgY29uZi0+bWdyX25hbWUsCisJCQkJJmFsdGVyYV9jdnBfb3Bz LCBjb25mKTsKKwlpZiAoSVNfRVJSKG1ncikpIHsKKwkJcmV0ID0gUFRSX0VSUihtZ3IpOwogCQln b3RvIGVycl91bm1hcDsKIAl9CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgbWdyKTsKIAotCXJl dCA9IGZwZ2FfbWdyX3JlZ2lzdGVyKG1ncik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfdW5tYXA7 Ci0KIAlyZXR1cm4gMDsKIAogZXJyX3VubWFwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcGdhL2Fs dGVyYS1wci1pcC1jb3JlLmMgYi9kcml2ZXJzL2ZwZ2EvYWx0ZXJhLXByLWlwLWNvcmUuYwppbmRl eCBkZmRmMjFlZDM0YzRlLi5iZTA2Njc5NjhkMzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZwZ2Ev YWx0ZXJhLXByLWlwLWNvcmUuYworKysgYi9kcml2ZXJzL2ZwZ2EvYWx0ZXJhLXByLWlwLWNvcmUu YwpAQCAtMTkxLDExICsxOTEsOCBAQCBpbnQgYWx0X3ByX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2Ug KmRldiwgdm9pZCBfX2lvbWVtICpyZWdfYmFzZSkKIAkJKHZhbCAmIEFMVF9QUl9DU1JfU1RBVFVT X01TSykgPj4gQUxUX1BSX0NTUl9TVEFUVVNfU0ZULAogCQkoaW50KSh2YWwgJiBBTFRfUFJfQ1NS X1BSX1NUQVJUKSk7CiAKLQltZ3IgPSBkZXZtX2ZwZ2FfbWdyX2NyZWF0ZShkZXYsIGRldl9uYW1l KGRldiksICZhbHRfcHJfb3BzLCBwcml2KTsKLQlpZiAoIW1ncikKLQkJcmV0dXJuIC1FTk9NRU07 Ci0KLQlyZXR1cm4gZGV2bV9mcGdhX21ncl9yZWdpc3RlcihkZXYsIG1ncik7CisJbWdyID0gZGV2 bV9mcGdhX21ncl9yZWdpc3RlcihkZXYsIGRldl9uYW1lKGRldiksICZhbHRfcHJfb3BzLCBwcml2 KTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKG1ncik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChh bHRfcHJfcmVnaXN0ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZwZ2EvYWx0ZXJhLXBzLXNw aS5jIGIvZHJpdmVycy9mcGdhL2FsdGVyYS1wcy1zcGkuYwppbmRleCAyM2JmZDRkMWFkMGY3Li41 ZTFlMDA5ZGJhODk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZwZ2EvYWx0ZXJhLXBzLXNwaS5jCisr KyBiL2RyaXZlcnMvZnBnYS9hbHRlcmEtcHMtc3BpLmMKQEAgLTMwMiwxMiArMzAyLDkgQEAgc3Rh dGljIGludCBhbHRlcmFfcHNfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIAlzbnByaW50 Zihjb25mLT5tZ3JfbmFtZSwgc2l6ZW9mKGNvbmYtPm1ncl9uYW1lKSwgIiVzICVzIiwKIAkJIGRl dl9kcml2ZXJfc3RyaW5nKCZzcGktPmRldiksIGRldl9uYW1lKCZzcGktPmRldikpOwogCi0JbWdy ID0gZGV2bV9mcGdhX21ncl9jcmVhdGUoJnNwaS0+ZGV2LCBjb25mLT5tZ3JfbmFtZSwKLQkJCQkg ICAmYWx0ZXJhX3BzX29wcywgY29uZik7Ci0JaWYgKCFtZ3IpCi0JCXJldHVybiAtRU5PTUVNOwot Ci0JcmV0dXJuIGRldm1fZnBnYV9tZ3JfcmVnaXN0ZXIoJnNwaS0+ZGV2LCBtZ3IpOworCW1nciA9 IGRldm1fZnBnYV9tZ3JfcmVnaXN0ZXIoJnNwaS0+ZGV2LCBjb25mLT5tZ3JfbmFtZSwKKwkJCQkg ICAgICZhbHRlcmFfcHNfb3BzLCBjb25mKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKG1ncik7 CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhbHRlcmFfcHNfc3BpX2lk c1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcGdhL2RmbC1mbWUtbWdyLmMgYi9kcml2ZXJz L2ZwZ2EvZGZsLWZtZS1tZ3IuYwppbmRleCA4YzU0MjNlZWZmZTc1Li5kYTUwOWM0YzAyOWY2IDEw MDY0NAotLS0gYS9kcml2ZXJzL2ZwZ2EvZGZsLWZtZS1tZ3IuYworKysgYi9kcml2ZXJzL2ZwZ2Ev ZGZsLWZtZS1tZ3IuYwpAQCAtMzEzLDEyICszMTMsMTIgQEAgc3RhdGljIGludCBmbWVfbWdyX3By b2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAKIAlfZm1lX21ncl9nZXRfY29tcGF0 X2lkKHByaXYtPmlvYWRkciwgJnByaXYtPmNvbXBhdF9pZCk7CiAKLQltZ3IgPSBkZXZtX2ZwZ2Ff bWdyX2NyZWF0ZShkZXYsICJERkwgRk1FIEZQR0EgTWFuYWdlciIsCi0JCQkJICAgJmZtZV9tZ3Jf b3BzLCBwcml2KTsKLQlpZiAoIW1ncikKLQkJcmV0dXJuIC1FTk9NRU07CisJbWdyID0gZGV2bV9m cGdhX21ncl9yZWdpc3RlcihkZXYsICJERkwgRk1FIEZQR0EgTWFuYWdlciIsCisJCQkJICAgICAm Zm1lX21ncl9vcHMsIHByaXYpOworCWlmIChJU19FUlIobWdyKSkKKwkJcmV0dXJuIFBUUl9FUlIo bWdyKTsKIAotCXJldHVybiBkZXZtX2ZwZ2FfbWdyX3JlZ2lzdGVyKGRldiwgbWdyKTsKKwlyZXR1 cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZm1lX21ncl9kcml2ZXIg PSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZwZ2EvZnBnYS1tZ3IuYyBiL2RyaXZlcnMvZnBnYS9m cGdhLW1nci5jCmluZGV4IGVjYjRjM2M3OTVmYTUuLmUyNDBhMjNkZjc5ZmYgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZnBnYS9mcGdhLW1nci5jCisrKyBiL2RyaXZlcnMvZnBnYS9mcGdhLW1nci5jCkBA IC01NTAsMjAgKzU1MCwyMCBAQCB2b2lkIGZwZ2FfbWdyX3VubG9jayhzdHJ1Y3QgZnBnYV9tYW5h Z2VyICptZ3IpCiBFWFBPUlRfU1lNQk9MX0dQTChmcGdhX21ncl91bmxvY2spOwogCiAvKioKLSAq IGZwZ2FfbWdyX2NyZWF0ZSAtIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBGUEdBIG1hbmFnZXIg c3RydWN0CisgKiBmcGdhX21ncl9yZWdpc3RlciAtIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgYW4gRlBH QSBNYW5hZ2VyIGRldmljZQogICogQHBhcmVudDoJZnBnYSBtYW5hZ2VyIGRldmljZSBmcm9tIHBk ZXYKICAqIEBuYW1lOglmcGdhIG1hbmFnZXIgbmFtZQogICogQG1vcHM6CXBvaW50ZXIgdG8gc3Ry dWN0dXJlIG9mIGZwZ2EgbWFuYWdlciBvcHMKICAqIEBwcml2OglmcGdhIG1hbmFnZXIgcHJpdmF0 ZSBkYXRhCiAgKgotICogVGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxl IGZvciBmcmVlaW5nIHRoZSBzdHJ1Y3Qgd2l0aAotICogZnBnYV9tZ3JfZnJlZSgpLiAgVXNpbmcg ZGV2bV9mcGdhX21ncl9jcmVhdGUoKSBpbnN0ZWFkIGlzIHJlY29tbWVuZGVkLgorICogVGhlIGNh bGxlciBvZiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGZwZ2FfbWdy X3VucmVnaXN0ZXIoKS4KKyAqIFVzaW5nIGRldm1fZnBnYV9tZ3JfcmVnaXN0ZXIoKSBpbnN0ZWFk IGlzIHJlY29tbWVuZGVkLgogICoKLSAqIFJldHVybjogcG9pbnRlciB0byBzdHJ1Y3QgZnBnYV9t YW5hZ2VyIG9yIE5VTEwKKyAqIFJldHVybjogcG9pbnRlciB0byBzdHJ1Y3QgZnBnYV9tYW5hZ2Vy IHBvaW50ZXIgb3IgRVJSX1BUUigpCiAgKi8KLXN0cnVjdCBmcGdhX21hbmFnZXIgKmZwZ2FfbWdy X2NyZWF0ZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAg ICBjb25zdCBzdHJ1Y3QgZnBnYV9tYW5hZ2VyX29wcyAqbW9wcywKLQkJCQkgICAgIHZvaWQgKnBy aXYpCitzdHJ1Y3QgZnBnYV9tYW5hZ2VyICoKK2ZwZ2FfbWdyX3JlZ2lzdGVyKHN0cnVjdCBkZXZp Y2UgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICBjb25zdCBzdHJ1Y3QgZnBnYV9tYW5h Z2VyX29wcyAqbW9wcywgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgZnBnYV9tYW5hZ2VyICptZ3I7 CiAJaW50IGlkLCByZXQ7CkBAIC01NzIsMjEgKzU3MiwyMyBAQCBzdHJ1Y3QgZnBnYV9tYW5hZ2Vy ICpmcGdhX21ncl9jcmVhdGUoc3RydWN0IGRldmljZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1l LAogCSAgICAhbW9wcy0+d3JpdGVfaW5pdCB8fCAoIW1vcHMtPndyaXRlICYmICFtb3BzLT53cml0 ZV9zZykgfHwKIAkgICAgKG1vcHMtPndyaXRlICYmIG1vcHMtPndyaXRlX3NnKSkgewogCQlkZXZf ZXJyKHBhcmVudCwgIkF0dGVtcHQgdG8gcmVnaXN0ZXIgd2l0aG91dCBmcGdhX21hbmFnZXJfb3Bz XG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAog CWlmICghbmFtZSB8fCAhc3RybGVuKG5hbWUpKSB7CiAJCWRldl9lcnIocGFyZW50LCAiQXR0ZW1w dCB0byByZWdpc3RlciB3aXRoIG5vIG5hbWUhXG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVy biBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAogCW1nciA9IGt6YWxsb2Moc2l6ZW9mKCptZ3IpLCBH RlBfS0VSTkVMKTsKIAlpZiAoIW1ncikKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRS KC1FTk9NRU0pOwogCiAJaWQgPSBpZGFfc2ltcGxlX2dldCgmZnBnYV9tZ3JfaWRhLCAwLCAwLCBH RlBfS0VSTkVMKTsKLQlpZiAoaWQgPCAwKQorCWlmIChpZCA8IDApIHsKKwkJcmV0ID0gaWQ7CiAJ CWdvdG8gZXJyb3Jfa2ZyZWU7CisJfQogCiAJbXV0ZXhfaW5pdCgmbWdyLT5yZWZfbXV0ZXgpOwog CkBAIC01OTQsNyArNTk2LDYgQEAgc3RydWN0IGZwZ2FfbWFuYWdlciAqZnBnYV9tZ3JfY3JlYXRl KHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKIAltZ3ItPm1vcHMgPSBt b3BzOwogCW1nci0+cHJpdiA9IHByaXY7CiAKLQlkZXZpY2VfaW5pdGlhbGl6ZSgmbWdyLT5kZXYp OwogCW1nci0+ZGV2LmNsYXNzID0gZnBnYV9tZ3JfY2xhc3M7CiAJbWdyLT5kZXYuZ3JvdXBzID0g bW9wcy0+Z3JvdXBzOwogCW1nci0+ZGV2LnBhcmVudCA9IHBhcmVudDsKQEAgLTYwNSw4NCArNjA2 LDYgQEAgc3RydWN0IGZwZ2FfbWFuYWdlciAqZnBnYV9tZ3JfY3JlYXRlKHN0cnVjdCBkZXZpY2Ug KnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2Rldmlj ZTsKIAotCXJldHVybiBtZ3I7Ci0KLWVycm9yX2RldmljZToKLQlpZGFfc2ltcGxlX3JlbW92ZSgm ZnBnYV9tZ3JfaWRhLCBpZCk7Ci1lcnJvcl9rZnJlZToKLQlrZnJlZShtZ3IpOwotCi0JcmV0dXJu IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmcGdhX21ncl9jcmVhdGUpOwotCi0vKioKLSAq IGZwZ2FfbWdyX2ZyZWUgLSBmcmVlIGFuIEZQR0EgbWFuYWdlciBjcmVhdGVkIHdpdGggZnBnYV9t Z3JfY3JlYXRlKCkKLSAqIEBtZ3I6CWZwZ2EgbWFuYWdlciBzdHJ1Y3QKLSAqLwotdm9pZCBmcGdh X21ncl9mcmVlKHN0cnVjdCBmcGdhX21hbmFnZXIgKm1ncikKLXsKLQlpZGFfc2ltcGxlX3JlbW92 ZSgmZnBnYV9tZ3JfaWRhLCBtZ3ItPmRldi5pZCk7Ci0Ja2ZyZWUobWdyKTsKLX0KLUVYUE9SVF9T WU1CT0xfR1BMKGZwZ2FfbWdyX2ZyZWUpOwotCi1zdGF0aWMgdm9pZCBkZXZtX2ZwZ2FfbWdyX3Jl bGVhc2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCi17Ci0Jc3RydWN0IGZwZ2FfbWdy X2RldnJlcyAqZHIgPSByZXM7Ci0KLQlmcGdhX21ncl9mcmVlKGRyLT5tZ3IpOwotfQotCi0vKioK LSAqIGRldm1fZnBnYV9tZ3JfY3JlYXRlIC0gY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbWFuYWdl ZCBGUEdBIG1hbmFnZXIgc3RydWN0Ci0gKiBAcGFyZW50OglmcGdhIG1hbmFnZXIgZGV2aWNlIGZy b20gcGRldgotICogQG5hbWU6CWZwZ2EgbWFuYWdlciBuYW1lCi0gKiBAbW9wczoJcG9pbnRlciB0 byBzdHJ1Y3R1cmUgb2YgZnBnYSBtYW5hZ2VyIG9wcwotICogQHByaXY6CWZwZ2EgbWFuYWdlciBw cml2YXRlIGRhdGEKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB1c2UgaW4g YW4gRlBHQSBtYW5hZ2VyIGRyaXZlcidzIHByb2JlIGZ1bmN0aW9uLgotICogQWZ0ZXIgdGhlIG1h bmFnZXIgZHJpdmVyIGNyZWF0ZXMgdGhlIG1hbmFnZXIgc3RydWN0IHdpdGgKLSAqIGRldm1fZnBn YV9tZ3JfY3JlYXRlKCksIGl0IHNob3VsZCByZWdpc3RlciBpdCB3aXRoIGZwZ2FfbWdyX3JlZ2lz dGVyKCkuICBUaGUKLSAqIG1hbmFnZXIgZHJpdmVyJ3MgcmVtb3ZlIGZ1bmN0aW9uIHNob3VsZCBj YWxsIGZwZ2FfbWdyX3VucmVnaXN0ZXIoKS4gIFRoZQotICogbWFuYWdlciBzdHJ1Y3QgYWxsb2Nh dGVkIHdpdGggdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGZyZWVkIGF1dG9tYXRpY2FsbHkgb24KLSAq IGRyaXZlciBkZXRhY2guICBUaGlzIGluY2x1ZGVzIHRoZSBjYXNlIG9mIGEgcHJvYmUgZnVuY3Rp b24gcmV0dXJuaW5nIGVycm9yCi0gKiBiZWZvcmUgY2FsbGluZyBmcGdhX21ncl9yZWdpc3Rlcigp LCB0aGUgc3RydWN0IHdpbGwgc3RpbGwgZ2V0IGNsZWFuZWQgdXAuCi0gKgotICogUmV0dXJuOiBw b2ludGVyIHRvIHN0cnVjdCBmcGdhX21hbmFnZXIgb3IgTlVMTAotICovCi1zdHJ1Y3QgZnBnYV9t YW5hZ2VyICpkZXZtX2ZwZ2FfbWdyX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGNvbnN0 IGNoYXIgKm5hbWUsCi0JCQkJCSAgY29uc3Qgc3RydWN0IGZwZ2FfbWFuYWdlcl9vcHMgKm1vcHMs Ci0JCQkJCSAgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgZnBnYV9tZ3JfZGV2cmVzICpkcjsKLQot CWRyID0gZGV2cmVzX2FsbG9jKGRldm1fZnBnYV9tZ3JfcmVsZWFzZSwgc2l6ZW9mKCpkciksIEdG UF9LRVJORUwpOwotCWlmICghZHIpCi0JCXJldHVybiBOVUxMOwotCi0JZHItPm1nciA9IGZwZ2Ff bWdyX2NyZWF0ZShwYXJlbnQsIG5hbWUsIG1vcHMsIHByaXYpOwotCWlmICghZHItPm1ncikgewot CQlkZXZyZXNfZnJlZShkcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWRldnJlc19hZGQocGFy ZW50LCBkcik7Ci0KLQlyZXR1cm4gZHItPm1ncjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGRldm1f ZnBnYV9tZ3JfY3JlYXRlKTsKLQotLyoqCi0gKiBmcGdhX21ncl9yZWdpc3RlciAtIHJlZ2lzdGVy IGFuIEZQR0EgbWFuYWdlcgotICogQG1ncjogZnBnYSBtYW5hZ2VyIHN0cnVjdAotICoKLSAqIFJl dHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAqLwot aW50IGZwZ2FfbWdyX3JlZ2lzdGVyKHN0cnVjdCBmcGdhX21hbmFnZXIgKm1ncikKLXsKLQlpbnQg cmV0OwotCiAJLyoKIAkgKiBJbml0aWFsaXplIGZyYW1ld29yayBzdGF0ZSBieSByZXF1ZXN0aW5n IGxvdyBsZXZlbCBkcml2ZXIgcmVhZCBzdGF0ZQogCSAqIGZyb20gZGV2aWNlLiAgRlBHQSBtYXkg YmUgaW4gcmVzZXQgbW9kZSBvciBtYXkgaGF2ZSBiZWVuIHByb2dyYW1tZWQKQEAgLTY5MCwxOCAr NjEzLDIwIEBAIGludCBmcGdhX21ncl9yZWdpc3RlcihzdHJ1Y3QgZnBnYV9tYW5hZ2VyICptZ3Ip CiAJICovCiAJbWdyLT5zdGF0ZSA9IG1nci0+bW9wcy0+c3RhdGUobWdyKTsKIAotCXJldCA9IGRl dmljZV9hZGQoJm1nci0+ZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2RldmljZTsKLQot CWRldl9pbmZvKCZtZ3ItPmRldiwgIiVzIHJlZ2lzdGVyZWRcbiIsIG1nci0+bmFtZSk7CisJcmV0 ID0gZGV2aWNlX3JlZ2lzdGVyKCZtZ3ItPmRldik7CisJaWYgKHJldCkgeworCQlwdXRfZGV2aWNl KCZtZ3ItPmRldik7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIDA7CisJ cmV0dXJuIG1ncjsKIAogZXJyb3JfZGV2aWNlOgotCWlkYV9zaW1wbGVfcmVtb3ZlKCZmcGdhX21n cl9pZGEsIG1nci0+ZGV2LmlkKTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmZnBnYV9tZ3JfaWRhLCBp ZCk7CitlcnJvcl9rZnJlZToKKwlrZnJlZShtZ3IpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4g RVJSX1BUUihyZXQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZnBnYV9tZ3JfcmVnaXN0ZXIpOwog CkBAIC03MjYsMTQgKzY1MSw2IEBAIHZvaWQgZnBnYV9tZ3JfdW5yZWdpc3RlcihzdHJ1Y3QgZnBn YV9tYW5hZ2VyICptZ3IpCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmcGdhX21ncl91bnJlZ2lzdGVy KTsKIAotc3RhdGljIGludCBmcGdhX21ncl9kZXZyZXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2 LCB2b2lkICpyZXMsCi0JCQkJIHZvaWQgKm1hdGNoX2RhdGEpCi17Ci0Jc3RydWN0IGZwZ2FfbWdy X2RldnJlcyAqZHIgPSByZXM7Ci0KLQlyZXR1cm4gbWF0Y2hfZGF0YSA9PSBkci0+bWdyOwotfQot CiBzdGF0aWMgdm9pZCBkZXZtX2ZwZ2FfbWdyX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2 LCB2b2lkICpyZXMpCiB7CiAJc3RydWN0IGZwZ2FfbWdyX2RldnJlcyAqZHIgPSByZXM7CkBAIC03 NDMsNDQgKzY2MCw0NSBAQCBzdGF0aWMgdm9pZCBkZXZtX2ZwZ2FfbWdyX3VucmVnaXN0ZXIoc3Ry dWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCiAKIC8qKgogICogZGV2bV9mcGdhX21ncl9yZWdp c3RlciAtIHJlc291cmNlIG1hbmFnZWQgdmFyaWFudCBvZiBmcGdhX21ncl9yZWdpc3RlcigpCi0g KiBAZGV2OiBtYW5hZ2luZyBkZXZpY2UgZm9yIHRoaXMgRlBHQSBtYW5hZ2VyCi0gKiBAbWdyOiBm cGdhIG1hbmFnZXIgc3RydWN0CisgKiBAcGFyZW50OiBmcGdhIG1hbmFnZXIgZGV2aWNlIGZyb20g cGRldgorICogQGluZm86IHBhcmFtZXRlcnMgZm9yIGZwZ2EgbWFuYWdlcgorICogQG5hbWU6IGZw Z2EgbWFuYWdlciBuYW1lCisgKiBAbW9wczogcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgZnBnYSBt YW5hZ2VyIG9wcworICogQHByaXY6IGZwZ2EgbWFuYWdlciBwcml2YXRlIGRhdGEKICAqCiAgKiBU aGlzIGlzIHRoZSBkZXZyZXMgdmFyaWFudCBvZiBmcGdhX21ncl9yZWdpc3RlcigpIGZvciB3aGlj aCB0aGUgdW5yZWdpc3RlcgogICogZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxs eSB3aGVuIHRoZSBtYW5hZ2luZyBkZXZpY2UgaXMgZGV0YWNoZWQuCiAgKi8KLWludCBkZXZtX2Zw Z2FfbWdyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGZwZ2FfbWFuYWdlciAq bWdyKQorc3RydWN0IGZwZ2FfbWFuYWdlciAqCitkZXZtX2ZwZ2FfbWdyX3JlZ2lzdGVyKHN0cnVj dCBkZXZpY2UgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIGNvbnN0IHN0cnVj dCBmcGdhX21hbmFnZXJfb3BzICptb3BzLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBmcGdhX21n cl9kZXZyZXMgKmRyOwotCWludCByZXQ7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBz dHJ1Y3QgZnBnYV9tYW5hZ2VyICogdGhhdCBpcyBwYXNzZWQgaW4gaXMKLQkgKiBtYW5hZ2VkIGl0 c2VsZi4KLQkgKi8KLQlpZiAoV0FSTl9PTighZGV2cmVzX2ZpbmQoZGV2LCBkZXZtX2ZwZ2FfbWdy X3JlbGVhc2UsCi0JCQkJIGZwZ2FfbWdyX2RldnJlc19tYXRjaCwgbWdyKSkpCi0JCXJldHVybiAt RUlOVkFMOworCXN0cnVjdCBmcGdhX21hbmFnZXIgKm1ncjsKIAogCWRyID0gZGV2cmVzX2FsbG9j KGRldm1fZnBnYV9tZ3JfdW5yZWdpc3Rlciwgc2l6ZW9mKCpkciksIEdGUF9LRVJORUwpOwogCWlm ICghZHIpCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAot CXJldCA9IGZwZ2FfbWdyX3JlZ2lzdGVyKG1ncik7Ci0JaWYgKHJldCkgeworCW1nciA9IGZwZ2Ff bWdyX3JlZ2lzdGVyKHBhcmVudCwgbmFtZSwgbW9wcywgcHJpdik7CisJaWYgKElTX0VSUihtZ3Ip KSB7CiAJCWRldnJlc19mcmVlKGRyKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIG1ncjsKIAl9 CiAKIAlkci0+bWdyID0gbWdyOwotCWRldnJlc19hZGQoZGV2LCBkcik7CisJZGV2cmVzX2FkZChw YXJlbnQsIGRyKTsKIAotCXJldHVybiAwOworCXJldHVybiBtZ3I7CiB9CiBFWFBPUlRfU1lNQk9M X0dQTChkZXZtX2ZwZ2FfbWdyX3JlZ2lzdGVyKTsKIAogc3RhdGljIHZvaWQgZnBnYV9tZ3JfZGV2 X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBmcGdhX21hbmFnZXIgKm1n ciA9IHRvX2ZwZ2FfbWFuYWdlcihkZXYpOworCisJaWRhX3NpbXBsZV9yZW1vdmUoJmZwZ2FfbWdy X2lkYSwgbWdyLT5kZXYuaWQpOworCWtmcmVlKG1ncik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0 IGZwZ2FfbWdyX2NsYXNzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnBnYS9pY2U0 MC1zcGkuYyBiL2RyaXZlcnMvZnBnYS9pY2U0MC1zcGkuYwppbmRleCA2OWRlYzVhZjIzYzM2Li5i NzU5MTkxMjI0OGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZwZ2EvaWNlNDAtc3BpLmMKKysrIGIv ZHJpdmVycy9mcGdhL2ljZTQwLXNwaS5jCkBAIC0xNzgsMTIgKzE3OCw5IEBAIHN0YXRpYyBpbnQg aWNlNDBfZnBnYV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogCQlyZXR1cm4gcmV0Owog CX0KIAotCW1nciA9IGRldm1fZnBnYV9tZ3JfY3JlYXRlKGRldiwgIkxhdHRpY2UgaUNFNDAgRlBH QSBNYW5hZ2VyIiwKLQkJCQkgICAmaWNlNDBfZnBnYV9vcHMsIHByaXYpOwotCWlmICghbWdyKQot CQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiBkZXZtX2ZwZ2FfbWdyX3JlZ2lzdGVyKGRldiwg bWdyKTsKKwltZ3IgPSBkZXZtX2ZwZ2FfbWdyX3JlZ2lzdGVyKGRldiwgIkxhdHRpY2UgaUNFNDAg RlBHQSBNYW5hZ2VyIiwKKwkJCQkgICAgICZpY2U0MF9mcGdhX29wcywgcHJpdik7CisJcmV0dXJu IFBUUl9FUlJfT1JfWkVSTyhtZ3IpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2Rldmlj ZV9pZCBpY2U0MF9mcGdhX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZwZ2Ev bWFjaHhvMi1zcGkuYyBiL2RyaXZlcnMvZnBnYS9tYWNoeG8yLXNwaS5jCmluZGV4IDFhZmI0MWFh MjBkNzEuLjg0NjlkZmI1ZGQyMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZnBnYS9tYWNoeG8yLXNw aS5jCisrKyBiL2RyaXZlcnMvZnBnYS9tYWNoeG8yLXNwaS5jCkBAIC0zNjYsMTIgKzM2Niw5IEBA IHN0YXRpYyBpbnQgbWFjaHhvMl9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIAkJ cmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWdyID0gZGV2bV9mcGdhX21ncl9jcmVhdGUoZGV2LCAi TGF0dGljZSBNYWNoWE8yIFNQSSBGUEdBIE1hbmFnZXIiLAotCQkJCSAgICZtYWNoeG8yX29wcywg c3BpKTsKLQlpZiAoIW1ncikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gZGV2bV9mcGdh X21ncl9yZWdpc3RlcihkZXYsIG1ncik7CisJbWdyID0gZGV2bV9mcGdhX21ncl9yZWdpc3Rlcihk ZXYsICJMYXR0aWNlIE1hY2hYTzIgU1BJIEZQR0EgTWFuYWdlciIsCisJCQkJICAgICAmbWFjaHhv Ml9vcHMsIHNwaSk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhtZ3IpOwogfQogCiAjaWZkZWYg Q09ORklHX09GCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZwZ2Evc29jZnBnYS1hMTAuYyBiL2RyaXZl cnMvZnBnYS9zb2NmcGdhLWExMC5jCmluZGV4IDU3M2Q4OGJkZjczMDcuLmFjOGU4OWI4YTVjYzkg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZnBnYS9zb2NmcGdhLWExMC5jCisrKyBiL2RyaXZlcnMvZnBn YS9zb2NmcGdhLWExMC5jCkBAIC01MDgsMTkgKzUwOCwxNSBAQCBzdGF0aWMgaW50IHNvY2ZwZ2Ff YTEwX2ZwZ2FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAkJcmV0dXJuIC1F QlVTWTsKIAl9CiAKLQltZ3IgPSBkZXZtX2ZwZ2FfbWdyX2NyZWF0ZShkZXYsICJTb0NGUEdBIEFy cmlhMTAgRlBHQSBNYW5hZ2VyIiwKLQkJCQkgICAmc29jZnBnYV9hMTBfZnBnYV9tZ3Jfb3BzLCBw cml2KTsKLQlpZiAoIW1ncikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBtZ3IpOwotCi0JcmV0ID0gZnBnYV9tZ3JfcmVnaXN0ZXIobWdyKTsKLQlpZiAo cmV0KSB7CisJbWdyID0gZnBnYV9tZ3JfcmVnaXN0ZXIoZGV2LCAiU29DRlBHQSBBcnJpYTEwIEZQ R0EgTWFuYWdlciIsCisJCQkJJnNvY2ZwZ2FfYTEwX2ZwZ2FfbWdyX29wcywgcHJpdik7CisJaWYg KElTX0VSUihtZ3IpKSB7CiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGspOwotCQly ZXR1cm4gcmV0OworCQlyZXR1cm4gUFRSX0VSUihtZ3IpOwogCX0KIAorCXBsYXRmb3JtX3NldF9k cnZkYXRhKHBkZXYsIG1ncik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVy cy9mcGdhL3NvY2ZwZ2EuYyBiL2RyaXZlcnMvZnBnYS9zb2NmcGdhLmMKaW5kZXggMWY0NjcxNzNm YzFmMy4uN2UwNzQxZjk5Njk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9mcGdhL3NvY2ZwZ2EuYwor KysgYi9kcml2ZXJzL2ZwZ2Evc29jZnBnYS5jCkBAIC01NzEsMTIgKzU3MSw5IEBAIHN0YXRpYyBp bnQgc29jZnBnYV9mcGdhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJaWYg KHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW1nciA9IGRldm1fZnBnYV9tZ3JfY3JlYXRlKGRldiwg IkFsdGVyYSBTT0NGUEdBIEZQR0EgTWFuYWdlciIsCi0JCQkJICAgJnNvY2ZwZ2FfZnBnYV9vcHMs IHByaXYpOwotCWlmICghbWdyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiBkZXZtX2Zw Z2FfbWdyX3JlZ2lzdGVyKGRldiwgbWdyKTsKKwltZ3IgPSBkZXZtX2ZwZ2FfbWdyX3JlZ2lzdGVy KGRldiwgIkFsdGVyYSBTT0NGUEdBIEZQR0EgTWFuYWdlciIsCisJCQkJICAgICAmc29jZnBnYV9m cGdhX29wcywgcHJpdik7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhtZ3IpOwogfQogCiAjaWZk ZWYgQ09ORklHX09GCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZwZ2Evc3RyYXRpeDEwLXNvYy5jIGIv ZHJpdmVycy9mcGdhL3N0cmF0aXgxMC1zb2MuYwppbmRleCBhMmNlYTUwMGY3Y2M2Li45MTU1ZTg4 OGExMzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZwZ2Evc3RyYXRpeDEwLXNvYy5jCisrKyBiL2Ry aXZlcnMvZnBnYS9zdHJhdGl4MTAtc29jLmMKQEAgLTQyNSwxOCArNDI1LDExIEBAIHN0YXRpYyBp bnQgczEwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAKIAlpbml0X2NvbXBs ZXRpb24oJnByaXYtPnN0YXR1c19yZXR1cm5fY29tcGxldGlvbik7CiAKLQltZ3IgPSBmcGdhX21n cl9jcmVhdGUoZGV2LCAiU3RyYXRpeDEwIFNPQyBGUEdBIE1hbmFnZXIiLAotCQkJICAgICAgJnMx MF9vcHMsIHByaXYpOwotCWlmICghbWdyKSB7Ci0JCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGNy ZWF0ZSBGUEdBIG1hbmFnZXJcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2Vy cjsKLQl9Ci0KLQlyZXQgPSBmcGdhX21ncl9yZWdpc3RlcihtZ3IpOwotCWlmIChyZXQpIHsKKwlt Z3IgPSBmcGdhX21ncl9yZWdpc3RlcihkZXYsICJTdHJhdGl4MTAgU09DIEZQR0EgTWFuYWdlciIs CisJCQkJJnMxMF9vcHMsIHByaXYpOworCWlmIChJU19FUlIobWdyKSkgewogCQlkZXZfZXJyKGRl diwgInVuYWJsZSB0byByZWdpc3RlciBGUEdBIG1hbmFnZXJcbiIpOwotCQlmcGdhX21ncl9mcmVl KG1ncik7CisJCXJldCA9IFBUUl9FUlIobWdyKTsKIAkJZ290byBwcm9iZV9lcnI7CiAJfQogCkBA IC00NTQsNyArNDQ3LDYgQEAgc3RhdGljIGludCBzMTBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCiAJc3RydWN0IHMxMF9wcml2ICpwcml2ID0gbWdyLT5wcml2OwogCiAJZnBn YV9tZ3JfdW5yZWdpc3RlcihtZ3IpOwotCWZwZ2FfbWdyX2ZyZWUobWdyKTsKIAlzdHJhdGl4MTBf c3ZjX2ZyZWVfY2hhbm5lbChwcml2LT5jaGFuKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9mcGdhL3RzNzN4eC1mcGdhLmMgYi9kcml2ZXJzL2ZwZ2EvdHM3M3h4LWZwZ2EuYwpp bmRleCAxMDFmMDE2YzZlZDhjLi5mZDUyZGUyMGRkYjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zw Z2EvdHM3M3h4LWZwZ2EuYworKysgYi9kcml2ZXJzL2ZwZ2EvdHM3M3h4LWZwZ2EuYwpAQCAtMTIy LDEyICsxMjIsOSBAQCBzdGF0aWMgaW50IHRzNzN4eF9mcGdhX3Byb2JlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpCiAJaWYgKElTX0VSUihwcml2LT5pb19iYXNlKSkKIAkJcmV0dXJuIFBU Ul9FUlIocHJpdi0+aW9fYmFzZSk7CiAKLQltZ3IgPSBkZXZtX2ZwZ2FfbWdyX2NyZWF0ZShrZGV2 LCAiVFMtNzN4eCBGUEdBIE1hbmFnZXIiLAotCQkJCSAgICZ0czczeHhfZnBnYV9vcHMsIHByaXYp OwotCWlmICghbWdyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiBkZXZtX2ZwZ2FfbWdy X3JlZ2lzdGVyKGtkZXYsIG1ncik7CisJbWdyID0gZGV2bV9mcGdhX21ncl9yZWdpc3RlcihrZGV2 LCAiVFMtNzN4eCBGUEdBIE1hbmFnZXIiLAorCQkJCSAgICAgJnRzNzN4eF9mcGdhX29wcywgcHJp dik7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhtZ3IpOwogfQogCiBzdGF0aWMgc3RydWN0IHBs YXRmb3JtX2RyaXZlciB0czczeHhfZnBnYV9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJz L2ZwZ2EveGlsaW54LXNwaS5jIGIvZHJpdmVycy9mcGdhL3hpbGlueC1zcGkuYwppbmRleCBmZWU0 ZDBhYmY2YmZlLi5kYjIzNjI2ZjlhYjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZwZ2EveGlsaW54 LXNwaS5jCisrKyBiL2RyaXZlcnMvZnBnYS94aWxpbngtc3BpLmMKQEAgLTI0NywxMyArMjQ3LDEw IEBAIHN0YXRpYyBpbnQgeGlsaW54X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQog CQlyZXR1cm4gZGV2X2Vycl9wcm9iZSgmc3BpLT5kZXYsIFBUUl9FUlIoY29uZi0+ZG9uZSksCiAJ CQkJICAgICAiRmFpbGVkIHRvIGdldCBET05FIGdwaW9cbiIpOwogCi0JbWdyID0gZGV2bV9mcGdh X21ncl9jcmVhdGUoJnNwaS0+ZGV2LAotCQkJCSAgICJYaWxpbnggU2xhdmUgU2VyaWFsIEZQR0Eg TWFuYWdlciIsCi0JCQkJICAgJnhpbGlueF9zcGlfb3BzLCBjb25mKTsKLQlpZiAoIW1ncikKLQkJ cmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gZGV2bV9mcGdhX21ncl9yZWdpc3Rlcigmc3BpLT5k ZXYsIG1ncik7CisJbWdyID0gZGV2bV9mcGdhX21ncl9yZWdpc3Rlcigmc3BpLT5kZXYsCisJCQkJ ICAgICAiWGlsaW54IFNsYXZlIFNlcmlhbCBGUEdBIE1hbmFnZXIiLAorCQkJCSAgICAgJnhpbGlu eF9zcGlfb3BzLCBjb25mKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKG1ncik7CiB9CiAKIHN0 YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhsbnhfc3BpX29mX21hdGNoW10gPSB7CmRp ZmYgLS1naXQgYS9kcml2ZXJzL2ZwZ2EvenlucS1mcGdhLmMgYi9kcml2ZXJzL2ZwZ2EvenlucS1m cGdhLmMKaW5kZXggMDdmYThkOWVjNjc1MC4uNzRiYmI5NzEwZjRlZSAxMDA2NDQKLS0tIGEvZHJp dmVycy9mcGdhL3p5bnEtZnBnYS5jCisrKyBiL2RyaXZlcnMvZnBnYS96eW5xLWZwZ2EuYwpAQCAt NjA5LDIwICs2MDksMTYgQEAgc3RhdGljIGludCB6eW5xX2ZwZ2FfcHJvYmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKIAogCWNsa19kaXNhYmxlKHByaXYtPmNsayk7CiAKLQltZ3IgPSBk ZXZtX2ZwZ2FfbWdyX2NyZWF0ZShkZXYsICJYaWxpbnggWnlucSBGUEdBIE1hbmFnZXIiLAotCQkJ CSAgICZ6eW5xX2ZwZ2Ffb3BzLCBwcml2KTsKLQlpZiAoIW1ncikKLQkJcmV0dXJuIC1FTk9NRU07 Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtZ3IpOwotCi0JZXJyID0gZnBnYV9tZ3Jf cmVnaXN0ZXIobWdyKTsKLQlpZiAoZXJyKSB7CisJbWdyID0gZnBnYV9tZ3JfcmVnaXN0ZXIoZGV2 LCAiWGlsaW54IFp5bnEgRlBHQSBNYW5hZ2VyIiwKKwkJCQkmenlucV9mcGdhX29wcywgcHJpdik7 CisJaWYgKElTX0VSUihtZ3IpKSB7CiAJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVy IEZQR0EgbWFuYWdlclxuIik7CiAJCWNsa191bnByZXBhcmUocHJpdi0+Y2xrKTsKLQkJcmV0dXJu IGVycjsKKwkJcmV0dXJuIFBUUl9FUlIobWdyKTsKIAl9CiAKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0 YShwZGV2LCBtZ3IpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnBn YS96eW5xbXAtZnBnYS5jIGIvZHJpdmVycy9mcGdhL3p5bnFtcC1mcGdhLmMKaW5kZXggMTI1NzQz Yzk3OTdmZi4uOTc1YmRjNGQwYTY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9mcGdhL3p5bnFtcC1m cGdhLmMKKysrIGIvZHJpdmVycy9mcGdhL3p5bnFtcC1mcGdhLmMKQEAgLTEwMiwxMiArMTAyLDkg QEAgc3RhdGljIGludCB6eW5xbXBfZnBnYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQogCiAJcHJpdi0+ZGV2ID0gZGV2OwogCi0JbWdyID0gZGV2bV9mcGdhX21ncl9jcmVhdGUo ZGV2LCAiWGlsaW54IFp5bnFNUCBGUEdBIE1hbmFnZXIiLAotCQkJCSAgICZ6eW5xbXBfZnBnYV9v cHMsIHByaXYpOwotCWlmICghbWdyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiBkZXZt X2ZwZ2FfbWdyX3JlZ2lzdGVyKGRldiwgbWdyKTsKKwltZ3IgPSBkZXZtX2ZwZ2FfbWdyX3JlZ2lz dGVyKGRldiwgIlhpbGlueCBaeW5xTVAgRlBHQSBNYW5hZ2VyIiwKKwkJCQkgICAgICZ6eW5xbXBf ZnBnYV9vcHMsIHByaXYpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8obWdyKTsKIH0KIAogc3Rh dGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgenlucW1wX2ZwZ2Ffb2ZfbWF0Y2hbXSA9IHsK ZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnBnYS9mcGdhLW1nci5oIGIvaW5jbHVkZS9saW51 eC9mcGdhL2ZwZ2EtbWdyLmgKaW5kZXggZWJkZWEyMTVhODY0My4uY2Q4NTJkNGUxNzgzOSAxMDA2 NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcGdhL2ZwZ2EtbWdyLmgKKysrIGIvaW5jbHVkZS9saW51 eC9mcGdhL2ZwZ2EtbWdyLmgKQEAgLTE3OCwxNyArMTc4LDEzIEBAIHN0cnVjdCBmcGdhX21hbmFn ZXIgKmZwZ2FfbWdyX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiB2b2lkIGZwZ2FfbWdyX3B1 dChzdHJ1Y3QgZnBnYV9tYW5hZ2VyICptZ3IpOwogCi1zdHJ1Y3QgZnBnYV9tYW5hZ2VyICpmcGdh X21ncl9jcmVhdGUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAg ICAgY29uc3Qgc3RydWN0IGZwZ2FfbWFuYWdlcl9vcHMgKm1vcHMsCi0JCQkJICAgICB2b2lkICpw cml2KTsKLXZvaWQgZnBnYV9tZ3JfZnJlZShzdHJ1Y3QgZnBnYV9tYW5hZ2VyICptZ3IpOwotaW50 IGZwZ2FfbWdyX3JlZ2lzdGVyKHN0cnVjdCBmcGdhX21hbmFnZXIgKm1ncik7CitzdHJ1Y3QgZnBn YV9tYW5hZ2VyICoKK2ZwZ2FfbWdyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgY29u c3QgY2hhciAqbmFtZSwKKwkJICBjb25zdCBzdHJ1Y3QgZnBnYV9tYW5hZ2VyX29wcyAqbW9wcywg dm9pZCAqcHJpdik7CiB2b2lkIGZwZ2FfbWdyX3VucmVnaXN0ZXIoc3RydWN0IGZwZ2FfbWFuYWdl ciAqbWdyKTsKIAotaW50IGRldm1fZnBnYV9tZ3JfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2 LCBzdHJ1Y3QgZnBnYV9tYW5hZ2VyICptZ3IpOwotCi1zdHJ1Y3QgZnBnYV9tYW5hZ2VyICpkZXZt X2ZwZ2FfbWdyX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCi0J CQkJCSAgY29uc3Qgc3RydWN0IGZwZ2FfbWFuYWdlcl9vcHMgKm1vcHMsCi0JCQkJCSAgdm9pZCAq cHJpdik7CitzdHJ1Y3QgZnBnYV9tYW5hZ2VyICoKK2Rldm1fZnBnYV9tZ3JfcmVnaXN0ZXIoc3Ry dWN0IGRldmljZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgY29uc3Qgc3Ry dWN0IGZwZ2FfbWFuYWdlcl9vcHMgKm1vcHMsIHZvaWQgKnByaXYpOwogCiAjZW5kaWYgLypfTElO VVhfRlBHQV9NR1JfSCAqLwotLSAKMi4yNi4zCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgt YXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=