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.3 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_2 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 88082C43331 for ; Mon, 11 Nov 2019 11:19:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4563D214DB for ; Mon, 11 Nov 2019 11:19:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726887AbfKKLTl convert rfc822-to-8bit (ORCPT ); Mon, 11 Nov 2019 06:19:41 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:6184 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726823AbfKKLTl (ORCPT ); Mon, 11 Nov 2019 06:19:41 -0500 Received: from DGGEMS401-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 8B43BD684B8985D76D4F; Mon, 11 Nov 2019 19:19:37 +0800 (CST) Received: from localhost (10.202.226.61) by DGGEMS401-HUB.china.huawei.com (10.3.19.201) with Microsoft SMTP Server id 14.3.439.0; Mon, 11 Nov 2019 19:19:28 +0800 Date: Mon, 11 Nov 2019 11:19:18 +0000 From: Jonathan Cameron To: zhangfei CC: Greg Kroah-Hartman , Arnd Bergmann , Herbert Xu , , jean-philippe , "Jerome Glisse" , , , , Wangzhou , "haojian . zhuang" , , , , , , Kenneth Lee , Zaibo Xu Subject: Re: [PATCH v7 2/3] uacce: add uacce driver Message-ID: <20191111111918.0000157e@huawei.com> In-Reply-To: <6e427d92-e0c3-e77d-51f4-f7c1ae4d7da7@linaro.org> References: <1572331216-9503-1-git-send-email-zhangfei.gao@linaro.org> <1572331216-9503-3-git-send-email-zhangfei.gao@linaro.org> <20191031171357.000067c7@huawei.com> <6e427d92-e0c3-e77d-51f4-f7c1ae4d7da7@linaro.org> Organization: Huawei X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; i686-w64-mingw32) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8BIT X-Originating-IP: [10.202.226.61] X-CFilter-Loop: Reflected Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org On Tue, 5 Nov 2019 15:43:31 +0800 zhangfei wrote: > Hi, Jonathan > > Thanks for the suggestions > > On 2019/11/1 上午1:13, Jonathan Cameron wrote: > > On Tue, 29 Oct 2019 14:40:15 +0800 > > Zhangfei Gao wrote: > > > >> From: Kenneth Lee > >> > >> Uacce (Unified/User-space-access-intended Accelerator Framework) targets to > >> provide Shared Virtual Addressing (SVA) between accelerators and processes. > >> So accelerator can access any data structure of the main cpu. > >> This differs from the data sharing between cpu and io device, which share > >> data content rather than address. > >> Since unified address, hardware and user space of process can share the > >> same virtual address in the communication. > >> > >> Uacce create a chrdev for every registration, the queue is allocated to > >> the process when the chrdev is opened. Then the process can access the > >> hardware resource by interact with the queue file. By mmap the queue > >> file space to user space, the process can directly put requests to the > >> hardware without syscall to the kernel space. > >> > >> Signed-off-by: Kenneth Lee > >> Signed-off-by: Zaibo Xu > >> Signed-off-by: Zhou Wang > >> Signed-off-by: Zhangfei Gao > > Great, much more compact. > > > > I've not gone through this in detail yet but a few initial comments inline. > > > > Thanks, > > > > Jonathan > > > >> --- > >> Documentation/ABI/testing/sysfs-driver-uacce | 53 +++ > >> drivers/misc/Kconfig | 1 + > >> drivers/misc/Makefile | 1 + > >> drivers/misc/uacce/Kconfig | 13 + > >> drivers/misc/uacce/Makefile | 2 + > >> drivers/misc/uacce/uacce.c | 574 +++++++++++++++++++++++++++ > >> include/linux/uacce.h | 163 ++++++++ > >> include/uapi/misc/uacce/uacce.h | 38 ++ > >> 8 files changed, 845 insertions(+) > >> create mode 100644 Documentation/ABI/testing/sysfs-driver-uacce > >> create mode 100644 drivers/misc/uacce/Kconfig > >> create mode 100644 drivers/misc/uacce/Makefile > >> create mode 100644 drivers/misc/uacce/uacce.c > >> create mode 100644 include/linux/uacce.h > >> create mode 100644 include/uapi/misc/uacce/uacce.h > >> > >> diff --git a/Documentation/ABI/testing/sysfs-driver-uacce b/Documentation/ABI/testing/sysfs-driver-uacce > >> new file mode 100644 > >> index 0000000..35699dc > >> --- /dev/null > >> +++ b/Documentation/ABI/testing/sysfs-driver-uacce > >> @@ -0,0 +1,53 @@ > >> +What: /sys/class/uacce//id > >> +Date: Oct 2019 > >> +KernelVersion: 5.5 > >> +Contact: linux-accelerators@lists.ozlabs.org > >> +Description: Id of the device. > >> + > >> +What: /sys/class/uacce//api > >> +Date: Oct 2019 > >> +KernelVersion: 5.5 > >> +Contact: linux-accelerators@lists.ozlabs.org > >> +Description: Api of the device, used by application to match the correct driver > >> + > >> +What: /sys/class/uacce//flags > >> +Date: Oct 2019 > >> +KernelVersion: 5.5 > >> +Contact: linux-accelerators@lists.ozlabs.org > >> +Description: Attributes of the device, see UACCE_DEV_xxx flag defined in uacce.h > >> + > >> +What: /sys/class/uacce//available_instances > >> +Date: Oct 2019 > >> +KernelVersion: 5.5 > >> +Contact: linux-accelerators@lists.ozlabs.org > >> +Description: Available instances left of the device > >> + > >> +What: /sys/class/uacce//algorithms > >> +Date: Oct 2019 > >> +KernelVersion: 5.5 > >> +Contact: linux-accelerators@lists.ozlabs.org > >> +Description: Algorithms supported by this accelerator > > How are they separated? Userspace code needs to know that. > > (comma, tab, newline?) > Yes, will add "separated by new line" > > > >> + > >> +What: /sys/class/uacce//qfrt_mmio_size > > qfrt is not the most obvious naming ever. Do we care beyond its > > a region for this interface? region_mmio_size maybe? > OK, > > > >> +Date: Oct 2019 > >> +KernelVersion: 5.5 > >> +Contact: linux-accelerators@lists.ozlabs.org > >> +Description: Page size of mmio region queue file > > Size of page in this region, or number of pages in the region? > Change to "Page numbers of mmio region queue file" Number of pages used by queue in mmio region? > > > >> + > >> +What: /sys/class/uacce//qfrt_dus_size > >> +Date: Oct 2019 > >> +KernelVersion: 5.5 > >> +Contact: linux-accelerators@lists.ozlabs.org > >> +Description: Page size of dus region queue file > >> + > >> +What: /sys/class/uacce//numa_distance > >> +Date: Oct 2019 > >> +KernelVersion: 5.5 > >> +Contact: linux-accelerators@lists.ozlabs.org > >> +Description: Distance of device node to cpu node > > I wonder if we should be doing this in here. There are other standard > > ways of obtaining this for the device. Follow parent and check node_id > > there then use the /sys/bus/node path to find out the distances. > Could you clarify more about this method. > The purpose here is cpu searching the nearest device(zip) doing work. > Does user application know which node it is running and compare distance? Exactly. The parent device will typically be a pci device. The parent link will point somewhere like /sys/bus/pci/devices/000:00:10.0/ Under that directory is a numa_node file which will give you which node the device is assigned to. Using that number (N) read /sys/bus/node/devices/nodeN/distance Which should be the same as what you have from this interface. It also provides access to info on latency and bandwidth etc if HMAT is provided - so more info to make a decision than your new interface here provides. > >> + > >> +What: /sys/class/uacce//node_id > >> +Date: Oct 2019 > >> +KernelVersion: 5.5 > >> +Contact: linux-accelerators@lists.ozlabs.org > >> +Description: Id of the numa node > >> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig > >> index c55b637..929feb0 100644 > >> --- a/drivers/misc/Kconfig > >> +++ b/drivers/misc/Kconfig > >> @@ -481,4 +481,5 @@ source "drivers/misc/cxl/Kconfig" > >> source "drivers/misc/ocxl/Kconfig" > >> source "drivers/misc/cardreader/Kconfig" > >> source "drivers/misc/habanalabs/Kconfig" > >> +source "drivers/misc/uacce/Kconfig" > >> endmenu > >> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile > >> index c1860d3..9abf292 100644 > >> --- a/drivers/misc/Makefile > >> +++ b/drivers/misc/Makefile > >> @@ -56,4 +56,5 @@ obj-$(CONFIG_OCXL) += ocxl/ > >> obj-y += cardreader/ > >> obj-$(CONFIG_PVPANIC) += pvpanic.o > >> obj-$(CONFIG_HABANA_AI) += habanalabs/ > >> +obj-$(CONFIG_UACCE) += uacce/ > >> obj-$(CONFIG_XILINX_SDFEC) += xilinx_sdfec.o > >> diff --git a/drivers/misc/uacce/Kconfig b/drivers/misc/uacce/Kconfig > >> new file mode 100644 > >> index 0000000..5e39b60 > >> --- /dev/null > >> +++ b/drivers/misc/uacce/Kconfig > >> @@ -0,0 +1,13 @@ > >> +config UACCE > >> + tristate "Accelerator Framework for User Land" > >> + depends on IOMMU_API > >> + help > >> + UACCE provides interface for the user process to access the hardware > >> + without interaction with the kernel space in data path. > >> + > >> + The user-space interface is described in > >> + include/uapi/misc/uacce/uacce.h > >> + > >> + See Documentation/misc-devices/uacce.rst for more details. > >> + > >> + If you don't know what to do here, say N. > > Pessimist :) Everyone should want uacce so don't put them off. Having said > > that perhaps for now it should be hidden and enabled on a driver by driver > > basis? > > > >> diff --git a/drivers/misc/uacce/Makefile b/drivers/misc/uacce/Makefile > >> new file mode 100644 > >> index 0000000..5b4374e > >> --- /dev/null > >> +++ b/drivers/misc/uacce/Makefile > >> @@ -0,0 +1,2 @@ > >> +# SPDX-License-Identifier: GPL-2.0-or-later > >> +obj-$(CONFIG_UACCE) += uacce.o > >> diff --git a/drivers/misc/uacce/uacce.c b/drivers/misc/uacce/uacce.c > >> new file mode 100644 > >> index 0000000..2b6b038 > >> --- /dev/null > >> +++ b/drivers/misc/uacce/uacce.c > >> @@ -0,0 +1,574 @@ > >> +// SPDX-License-Identifier: GPL-2.0-or-later > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> + > >> +static struct class *uacce_class; > >> +static dev_t uacce_devt; > >> +static DEFINE_MUTEX(uacce_mutex); > >> +static DEFINE_XARRAY_ALLOC(uacce_xa); > >> + > >> +static int uacce_start_queue(struct uacce_queue *q) > >> +{ > >> + int ret = -EINVAL; > >> + > >> + mutex_lock(&uacce_mutex); > >> + > >> + if (q->state != UACCE_Q_INIT) > >> + goto out_with_lock; > >> + > >> + if (q->uacce->ops->start_queue) { > >> + ret = q->uacce->ops->start_queue(q); > >> + if (ret < 0) > >> + goto out_with_lock; > >> + } > >> + > >> + q->state = UACCE_Q_STARTED; > > out_with_lock: > >> + mutex_unlock(&uacce_mutex); > >> + > > return ret; > > Though need to handle ret a bit differently above... > OK > > > > +static int uacce_fops_mmap(struct file *filep, struct vm_area_struct *vma) > > +{ > > + struct uacce_queue *q = filep->private_data; > > + struct uacce_device *uacce = q->uacce; > > + struct uacce_qfile_region *qfr; > > + enum uacce_qfrt type = 0; > > + unsigned int flags = 0; > > + int ret; > > + > > + if (vma->vm_pgoff < UACCE_QFRT_MAX) > > + type = vma->vm_pgoff; > > + > > + vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_WIPEONFORK; > > + vma->vm_ops = &uacce_vm_ops; > > + vma->vm_private_data = q; > > + > > + mutex_lock(&uacce_mutex); > > + > > + if (q->qfrs[type]) { > > + ret = -EEXIST; > > + goto out_with_lock; > > + } > > + > > + switch (type) { > > + case UACCE_QFRT_MMIO: > > + flags = UACCE_QFRF_SELFMT; > > + break; > > + > > + case UACCE_QFRT_DUS: > > + if (uacce->flags & UACCE_DEV_SVA) { > > + flags = UACCE_QFRF_SELFMT; > > + break; > > + } > > + break; > > + > > + default: > > + WARN_ON(&uacce->dev); > > + break; > > + } > > + > > + qfr = uacce_create_region(q, vma, type, flags); > > + if (IS_ERR(qfr)) { > > + ret = PTR_ERR(qfr); > > + goto out_with_lock; > > + } > > + q->qfrs[type] = qfr; > > + > > Could put > > out_with_lock: > > here and return ret instead of 0. > > You'll need to set ret to default to 0 in that > > case though. > OK > > > > +static ssize_t algorithms_show(struct device *dev, > > + struct device_attribute *attr, char *buf) > > +{ > > + struct uacce_device *uacce = to_uacce_device(dev); > > + > > + return sprintf(buf, "%s", uacce->algs); > > Any risk algs won't have the \n? > > I'd kind of expect it to be a null termated arrays to allow the core > > to format it however it wants to. > Yes, adding \n is better. This may then add a bonus new line if you have multiple lines already in the string. Probably doesn't do much harm, but it's not ideal. > > > >> +} > >> + > >> +static ssize_t qfrt_mmio_size_show(struct device *dev, > >> + struct device_attribute *attr, char *buf) > >> +{ > >> + struct uacce_device *uacce = to_uacce_device(dev); > >> + > >> + return sprintf(buf, "%lu\n", > >> + uacce->qf_pg_size[UACCE_QFRT_MMIO] << PAGE_SHIFT); > >> +} > >> + > >> +static ssize_t qfrt_dus_size_show(struct device *dev, > >> + struct device_attribute *attr, char *buf) > >> +{ > >> + struct uacce_device *uacce = to_uacce_device(dev); > >> + > >> + return sprintf(buf, "%lu\n", > >> + uacce->qf_pg_size[UACCE_QFRT_DUS] << PAGE_SHIFT); > >> +} > >> + > >> +static DEVICE_ATTR_RO(id); > >> +static DEVICE_ATTR_RO(api); > >> +static DEVICE_ATTR_RO(numa_distance); > >> +static DEVICE_ATTR_RO(node_id); > >> +static DEVICE_ATTR_RO(flags); > >> +static DEVICE_ATTR_RO(available_instances); > >> +static DEVICE_ATTR_RO(algorithms); > >> +static DEVICE_ATTR_RO(qfrt_mmio_size); > >> +static DEVICE_ATTR_RO(qfrt_dus_size); > >> + > >> +static struct attribute *uacce_dev_attrs[] = { > >> + &dev_attr_id.attr, > >> + &dev_attr_api.attr, > >> + &dev_attr_node_id.attr, > >> + &dev_attr_numa_distance.attr, > >> + &dev_attr_flags.attr, > >> + &dev_attr_available_instances.attr, > >> + &dev_attr_algorithms.attr, > >> + &dev_attr_qfrt_mmio_size.attr, > >> + &dev_attr_qfrt_dus_size.attr, > >> + NULL, > >> +}; > >> +ATTRIBUTE_GROUPS(uacce_dev); > >> + > >> +static void uacce_release(struct device *dev) > >> +{ > >> + struct uacce_device *uacce = to_uacce_device(dev); > >> + > >> + kfree(uacce); > >> +} > >> + > >> +/** > >> + * uacce_register - register an accelerator > > This isn't quite correct kernel-doc. Please run the > > generation script over it and fix any warnings. > > > > uacce_register() - register an accelerator > Sure, will add (), though no warning reported from ./scripts/kernel-doc I checked that one for another review yesterday. Seems the kernel suggested kernel-doc style isn't actually enforced and the brackets are optional for functions. It assumes anything it hasn't identified as something else must be a function hence this is the one case where careful matching doesn't apply (unlike struct, enum etc). > > > >> + * @parent: pointer of uacce parent device > >> + * @interface: pointer of uacce_interface for register > >> + */ > >> +struct uacce_device *uacce_register(struct device *parent, > >> + struct uacce_interface *interface) > >> +{ > >> + unsigned int flags = interface->flags; > >> + struct uacce_device *uacce; > >> + int ret; > >> + > >> + uacce = kzalloc(sizeof(struct uacce_device), GFP_KERNEL); > >> + if (!uacce) > >> + return ERR_PTR(-ENOMEM); > >> + > >> + if (flags & UACCE_DEV_SVA) { > >> + ret = iommu_dev_enable_feature(parent, IOMMU_DEV_FEAT_SVA); > >> + if (ret) > >> + flags &= ~UACCE_DEV_SVA; > >> + } > >> + > >> + uacce->pdev = parent; > >> + uacce->flags = flags; > >> + uacce->ops = interface->ops; > >> + > >> + ret = xa_alloc(&uacce_xa, &uacce->dev_id, uacce, xa_limit_32b, > >> + GFP_KERNEL); > >> + if (ret < 0) > >> + goto err_with_uacce; > >> + > >> + uacce->cdev = cdev_alloc(); > > If we can embed this (see below) then use cdev_init instead. > > > >> + if (!uacce->cdev) { > >> + ret = -ENOMEM; > >> + goto err_with_xa; > >> + } > >> + > >> + INIT_LIST_HEAD(&uacce->qs); > >> + mutex_init(&uacce->q_lock); > >> + uacce->cdev->ops = &uacce_fops; > >> + uacce->cdev->owner = THIS_MODULE; > >> + device_initialize(&uacce->dev); > >> + uacce->dev.devt = MKDEV(MAJOR(uacce_devt), uacce->dev_id); > >> + uacce->dev.class = uacce_class; > >> + uacce->dev.groups = uacce_dev_groups; > >> + uacce->dev.parent = uacce->pdev; > >> + uacce->dev.release = uacce_release; > >> + dev_set_name(&uacce->dev, "%s-%d", interface->name, uacce->dev_id); > >> + ret = cdev_device_add(uacce->cdev, &uacce->dev); > >> + if (ret) > >> + goto err_with_xa; > >> + > >> + return uacce; > >> + > >> +err_with_xa: > >> + if (uacce->cdev) > >> + cdev_del(uacce->cdev); > > Why not use a separate label to handle the above rather than checking if > > it's set? > ok, > > > >> + xa_erase(&uacce_xa, uacce->dev_id); > >> +err_with_uacce: > >> + if (flags & UACCE_DEV_SVA) > >> + iommu_dev_disable_feature(uacce->pdev, IOMMU_DEV_FEAT_SVA); > >> + kfree(uacce); > >> + return ERR_PTR(ret); > >> +} > >> +EXPORT_SYMBOL_GPL(uacce_register); > >> + > >> +/** > >> + * uacce_unregister - unregisters an accelerator > >> + * @uacce: the accelerator to unregister > >> + */ > >> +void uacce_unregister(struct uacce_device *uacce) > >> +{ > >> + if (!uacce) > >> + return; > >> + > > I'd like to see a comment here on why we are doing things not unwinding > > actions from uacce_register. > OK will add comments. > Here is "ensure no open queue remains" > >> + mutex_lock(&uacce->q_lock); > >> + if (!list_empty(&uacce->qs)) { > >> + struct uacce_queue *q; > >> + > >> + list_for_each_entry(q, &uacce->qs, list) { > >> + uacce_put_queue(q); > >> + if (uacce->flags & UACCE_DEV_SVA) > >> + iommu_sva_unbind_device(q->handle); > >> + } > >> + } > >> + mutex_unlock(&uacce->q_lock); > >> + > > For these next parts which are the unwind of uacce_register, why are they not > > in the reverse order of what is happening in there (where possible given > > device lifespan). That is why do we not disable the iommu feature much later? > First close all queues, then disable sva feature. > > > >> + if (uacce->flags & UACCE_DEV_SVA) > >> + iommu_dev_disable_feature(uacce->pdev, IOMMU_DEV_FEAT_SVA); > >> + > >> + cdev_device_del(uacce->cdev, &uacce->dev); > >> + xa_erase(&uacce_xa, uacce->dev_id); > >> + put_device(&uacce->dev); > >> +} > >> +EXPORT_SYMBOL_GPL(uacce_unregister); > >> + > >> +static int __init uacce_init(void) > >> +{ > >> + int ret; > >> + > >> + uacce_class = class_create(THIS_MODULE, UACCE_NAME); > >> + if (IS_ERR(uacce_class)) > >> + return PTR_ERR(uacce_class); > >> + > >> + ret = alloc_chrdev_region(&uacce_devt, 0, MINORMASK, UACCE_NAME); > >> + if (ret) { > >> + class_destroy(uacce_class); > >> + return ret; > > drop the return ret out of these brackets. i.e. > > > > if (ret) > > class_destroy(uacce_class) > > > > return ret; > sure, thanks > > > >> + } > >> + > >> + return 0; > >> +} > >> + > >> +static __exit void uacce_exit(void) > >> +{ > >> + unregister_chrdev_region(uacce_devt, MINORMASK); > >> + class_destroy(uacce_class); > >> +} > >> + > >> +subsys_initcall(uacce_init); > >> +module_exit(uacce_exit); > >> + > >> +MODULE_LICENSE("GPL"); > >> +MODULE_AUTHOR("Hisilicon Tech. Co., Ltd."); > >> +MODULE_DESCRIPTION("Accelerator interface for Userland applications"); > >> diff --git a/include/linux/uacce.h b/include/linux/uacce.h > >> new file mode 100644 > >> index 0000000..04c8643 > >> --- /dev/null > >> +++ b/include/linux/uacce.h > >> @@ -0,0 +1,163 @@ > >> +/* SPDX-License-Identifier: GPL-2.0-or-later */ > >> +#ifndef _LINUX_UACCE_H > >> +#define _LINUX_UACCE_H > >> + > >> +#include > >> +#include > >> + > >> +#define UACCE_NAME "uacce" > >> +#define UACCE_QFRT_MAX 16 > > What does QFRT stand for? > change to UACCE_MAX_REGION Much better > >> +#define UACCE_MAX_NAME_SIZE 64 > >> + > >> +struct uacce_queue; > >> +struct uacce_device; > >> + > >> +/** > >> + * enum uacce_qfr_flag: queue file flag: > >> + * @UACCE_QFRF_SELFMT: self maintained qfr > >> + */ > >> +enum uacce_qfr_flag { > >> + UACCE_QFRF_SELFMT = BIT(0), > >> +}; > > Same issue with enums for flags. Doesn't make much sense to me. > > Only one value can be taken which doesn't make it a flag. > > > >> + > >> +/** > >> + * struct uacce_qfile_region - structure of queue file region > >> + * @type: type of the qfr > >> + * @flags: flags of qfr > >> + * @prot: qfr protection flag > >> + */ > >> +struct uacce_qfile_region { > >> + enum uacce_qfrt type; > >> + enum uacce_qfr_flag flags; > >> + u32 prot; > >> +}; > >> + > >> +/** > >> + * struct uacce_ops - uacce device operations > >> + * @get_available_instances: get available instances left of the device > >> + * @get_queue: get a queue from the device > >> + * @put_queue: free a queue to the device > >> + * @start_queue: make the queue start work after get_queue > >> + * @stop_queue: make the queue stop work before put_queue > >> + * @is_q_updated: check whether the task is finished > >> + * @mask_notify: mask the task irq of queue > >> + * @mmap: mmap addresses of queue to user space > >> + * @reset: reset the uacce device > >> + * @reset_queue: reset the queue > >> + * @ioctl: ioctl for user space users of the queue > >> + */ > >> +struct uacce_ops { > >> + int (*get_available_instances)(struct uacce_device *uacce); > >> + int (*get_queue)(struct uacce_device *uacce, unsigned long arg, > >> + struct uacce_queue *q); > >> + void (*put_queue)(struct uacce_queue *q); > >> + int (*start_queue)(struct uacce_queue *q); > >> + void (*stop_queue)(struct uacce_queue *q); > >> + int (*is_q_updated)(struct uacce_queue *q); > >> + void (*mask_notify)(struct uacce_queue *q, int event_mask); > >> + int (*mmap)(struct uacce_queue *q, struct vm_area_struct *vma, > >> + struct uacce_qfile_region *qfr); > >> + int (*reset)(struct uacce_device *uacce); > >> + int (*reset_queue)(struct uacce_queue *q); > > Some of these aren't used on only existing driver. Introduce them only > > in the series that uses them. > OK > > > >> + long (*ioctl)(struct uacce_queue *q, unsigned int cmd, > >> + unsigned long arg); > >> +}; > >> + > >> +/** > >> + * struct uacce_interface > > I think this needs a description for kernel doc (even if it's obvious!) > > Could be wrong though. > OK > > > >> + * @name: the uacce device name. Will show up in sysfs > >> + * @flags: uacce device attributes > >> + * @ops: pointer to the struct uacce_ops > >> + * > >> + * This structure is used for the uacce_register() > >> + */ > >> +struct uacce_interface { > >> + char name[UACCE_MAX_NAME_SIZE]; > >> + enum uacce_dev_flag flags; > >> + struct uacce_ops *ops; > >> +}; > >> + > >> +enum uacce_q_state { > >> + UACCE_Q_INIT, > >> + UACCE_Q_STARTED, > >> + UACCE_Q_ZOMBIE, > >> +}; > >> + > >> +/** > >> + * struct uacce_queue > >> + * @uacce: pointer to uacce > >> + * @priv: private pointer > >> + * @wait: wait queue head > >> + * @pasid: pasid of the queue > >> + * @pid: pid of the process using the queue > >> + * @handle: iommu_sva handle return from iommu_sva_bind_device > >> + * @list: queue list > >> + * @qfrs: pointer of qfr regions > >> + * @state: queue state machine > >> + */ > >> +struct uacce_queue { > >> + struct uacce_device *uacce; > >> + void *priv; > >> + wait_queue_head_t wait; > >> + int pasid; > >> + pid_t pid; > >> + struct iommu_sva *handle; > >> + struct list_head list; > >> + struct uacce_qfile_region *qfrs[UACCE_QFRT_MAX]; > >> + enum uacce_q_state state; > >> +}; > >> + > >> +/** > >> + * struct uacce_device > >> + * @algs: supported algorithms > >> + * @api_ver: api version > >> + * @qf_pg_size: page size of the queue file regions > >> + * @ops: pointer to the struct uacce_ops > >> + * @pdev: pointer to the parent device > >> + * @is_vf: whether virtual function > >> + * @flags: uacce attributes > >> + * @dev_id: id of the uacce device > >> + * @prot: uacce protection flag > >> + * @cdev: cdev of the uacce > >> + * @dev: dev of the uacce > >> + * @priv: private pointer of the uacce > >> + * @qs: list head of queue->list > >> + * @q_lock: lock for qs > >> + */ > >> +struct uacce_device { > >> + const char *algs; > >> + const char *api_ver; > >> + unsigned long qf_pg_size[UACCE_QFRT_MAX]; > >> + struct uacce_ops *ops; > > Can we make this ops structure a point to a constant struct? > > I'm guessing it'll be fixed for a given driver. > OK > > > >> + struct device *pdev; > > Perhaps just call it parent. pdev will be confusing with > > pci devices. > OK > > > >> + bool is_vf; > >> + u32 flags; > >> + u32 dev_id; > >> + u32 prot; > >> + struct cdev *cdev; > > Can we embed the cdev structure rather than use a pointer > > and separate allocation? > NO, we can't. > We originally embed the cdev structure, and Greg reminded us these two > structure have different lifetime. > https://lkml.org/lkml/2019/8/28/771 Ok. Fair enough. > >> + struct device dev; > >> + void *priv; > >> + struct list_head qs; > >> + struct mutex q_lock; > >> +}; > >> + > >> +#if IS_ENABLED(CONFIG_UACCE) > >> + > >> +struct uacce_device *uacce_register(struct device *parent, > >> + struct uacce_interface *interface); > >> +void uacce_unregister(struct uacce_device *uacce); > >> + > >> +#else /* CONFIG_UACCE */ > >> + > >> +static inline > >> +struct uacce_device *uacce_register(struct device *parent, > >> + struct uacce_interface *interface) > >> +{ > >> + return ERR_PTR(-ENODEV); > >> +} > >> + > >> +static inline void uacce_unregister(struct uacce_device *uacce) {} > >> + > >> +#endif /* CONFIG_UACCE */ > >> + > >> +#endif /* _LINUX_UACCE_H */ > >> diff --git a/include/uapi/misc/uacce/uacce.h b/include/uapi/misc/uacce/uacce.h > >> new file mode 100644 > >> index 0000000..a4f9378 > >> --- /dev/null > >> +++ b/include/uapi/misc/uacce/uacce.h > >> @@ -0,0 +1,38 @@ > >> +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ > >> +#ifndef _UAPIUUACCE_H > >> +#define _UAPIUUACCE_H > >> + > >> +#include > >> +#include > >> + > >> +/* UACCE_CMD_START_Q: Start the queue */ > >> +#define UACCE_CMD_START_Q _IO('W', 0) > >> + > >> +/** > >> + * UACCE_CMD_PUT_Q: > >> + * User actively stop queue and free queue resource immediately > >> + * Optimization method since close fd may delay > >> + */ > >> +#define UACCE_CMD_PUT_Q _IO('W', 1) > >> + > >> +/** > >> + * enum uacce_dev_flag: Device flags: > >> + * @UACCE_DEV_SVA: Shared Virtual Addresses > >> + * Support PASID > >> + * Support device page faults (PCI PRI or SMMU Stall) > >> + */ > >> +enum uacce_dev_flag { > >> + UACCE_DEV_SVA = BIT(0), > > As mentioned in docs review, this doesn't look like an enum to me. > > Just use #define for the bit and a suitable sized integer for any > > calls using it. > OK, but there are still more features in the future patch. That's not the issue. An enum should (more or less) use concurrent values. A = 0, B = 1, C = 2, etc and an instance of it should only take one of them. Once you are using it as values for a bitmap, the typing becomes irrelevant as you can't really use it to enforce anything, so you should just use. #define UACCE_DEV_SVA BIT(0) #define UACCE_DEV_SOMETHING BIT(1) etc > > Thanks > 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.3 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_2 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 93A62C43331 for ; Mon, 11 Nov 2019 11:19:45 +0000 (UTC) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (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 6337F214DB for ; Mon, 11 Nov 2019 11:19:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6337F214DB Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 1678EC96; Mon, 11 Nov 2019 11:19:45 +0000 (UTC) Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id AD98EB62 for ; Mon, 11 Nov 2019 11:19:43 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from huawei.com (szxga04-in.huawei.com [45.249.212.190]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 552718AD for ; Mon, 11 Nov 2019 11:19:41 +0000 (UTC) Received: from DGGEMS401-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 8B43BD684B8985D76D4F; Mon, 11 Nov 2019 19:19:37 +0800 (CST) Received: from localhost (10.202.226.61) by DGGEMS401-HUB.china.huawei.com (10.3.19.201) with Microsoft SMTP Server id 14.3.439.0; Mon, 11 Nov 2019 19:19:28 +0800 Date: Mon, 11 Nov 2019 11:19:18 +0000 From: Jonathan Cameron To: zhangfei Subject: Re: [PATCH v7 2/3] uacce: add uacce driver Message-ID: <20191111111918.0000157e@huawei.com> In-Reply-To: <6e427d92-e0c3-e77d-51f4-f7c1ae4d7da7@linaro.org> References: <1572331216-9503-1-git-send-email-zhangfei.gao@linaro.org> <1572331216-9503-3-git-send-email-zhangfei.gao@linaro.org> <20191031171357.000067c7@huawei.com> <6e427d92-e0c3-e77d-51f4-f7c1ae4d7da7@linaro.org> Organization: Huawei X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; i686-w64-mingw32) MIME-Version: 1.0 X-Originating-IP: [10.202.226.61] X-CFilter-Loop: Reflected Cc: jean-philippe , Herbert Xu , Arnd Bergmann , francois.ozog@linaro.org, Greg Kroah-Hartman , ilias.apalodimas@linaro.org, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Jerome Glisse , grant.likely@arm.com, "haojian . zhuang" , linux-accelerators@lists.ozlabs.org, linux-crypto@vger.kernel.org, Kenneth Lee , guodong.xu@linaro.org, kenneth-lee-2012@foxmail.com X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: iommu-bounces@lists.linux-foundation.org Errors-To: iommu-bounces@lists.linux-foundation.org T24gVHVlLCA1IE5vdiAyMDE5IDE1OjQzOjMxICswODAwCnpoYW5nZmVpIDx6aGFuZ2ZlaS5nYW9A bGluYXJvLm9yZz4gd3JvdGU6Cgo+IEhpLCBKb25hdGhhbgo+IAo+IFRoYW5rcyBmb3IgdGhlIHN1 Z2dlc3Rpb25zCj4gCj4gT24gMjAxOS8xMS8xIOS4iuWNiDE6MTMsIEpvbmF0aGFuIENhbWVyb24g d3JvdGU6Cj4gPiBPbiBUdWUsIDI5IE9jdCAyMDE5IDE0OjQwOjE1ICswODAwCj4gPiBaaGFuZ2Zl aSBHYW8gPHpoYW5nZmVpLmdhb0BsaW5hcm8ub3JnPiB3cm90ZToKPiA+ICAKPiA+PiBGcm9tOiBL ZW5uZXRoIExlZSA8bGlndW96aHVAaGlzaWxpY29uLmNvbT4KPiA+Pgo+ID4+IFVhY2NlIChVbmlm aWVkL1VzZXItc3BhY2UtYWNjZXNzLWludGVuZGVkIEFjY2VsZXJhdG9yIEZyYW1ld29yaykgdGFy Z2V0cyB0bwo+ID4+IHByb3ZpZGUgU2hhcmVkIFZpcnR1YWwgQWRkcmVzc2luZyAoU1ZBKSBiZXR3 ZWVuIGFjY2VsZXJhdG9ycyBhbmQgcHJvY2Vzc2VzLgo+ID4+IFNvIGFjY2VsZXJhdG9yIGNhbiBh Y2Nlc3MgYW55IGRhdGEgc3RydWN0dXJlIG9mIHRoZSBtYWluIGNwdS4KPiA+PiBUaGlzIGRpZmZl cnMgZnJvbSB0aGUgZGF0YSBzaGFyaW5nIGJldHdlZW4gY3B1IGFuZCBpbyBkZXZpY2UsIHdoaWNo IHNoYXJlCj4gPj4gZGF0YSBjb250ZW50IHJhdGhlciB0aGFuIGFkZHJlc3MuCj4gPj4gU2luY2Ug dW5pZmllZCBhZGRyZXNzLCBoYXJkd2FyZSBhbmQgdXNlciBzcGFjZSBvZiBwcm9jZXNzIGNhbiBz aGFyZSB0aGUKPiA+PiBzYW1lIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgY29tbXVuaWNhdGlvbi4K PiA+Pgo+ID4+IFVhY2NlIGNyZWF0ZSBhIGNocmRldiBmb3IgZXZlcnkgcmVnaXN0cmF0aW9uLCB0 aGUgcXVldWUgaXMgYWxsb2NhdGVkIHRvCj4gPj4gdGhlIHByb2Nlc3Mgd2hlbiB0aGUgY2hyZGV2 IGlzIG9wZW5lZC4gVGhlbiB0aGUgcHJvY2VzcyBjYW4gYWNjZXNzIHRoZQo+ID4+IGhhcmR3YXJl IHJlc291cmNlIGJ5IGludGVyYWN0IHdpdGggdGhlIHF1ZXVlIGZpbGUuIEJ5IG1tYXAgdGhlIHF1 ZXVlCj4gPj4gZmlsZSBzcGFjZSB0byB1c2VyIHNwYWNlLCB0aGUgcHJvY2VzcyBjYW4gZGlyZWN0 bHkgcHV0IHJlcXVlc3RzIHRvIHRoZQo+ID4+IGhhcmR3YXJlIHdpdGhvdXQgc3lzY2FsbCB0byB0 aGUga2VybmVsIHNwYWNlLgo+ID4+Cj4gPj4gU2lnbmVkLW9mZi1ieTogS2VubmV0aCBMZWUgPGxp Z3Vvemh1QGhpc2lsaWNvbi5jb20+Cj4gPj4gU2lnbmVkLW9mZi1ieTogWmFpYm8gWHUgPHh1emFp Ym9AaHVhd2VpLmNvbT4KPiA+PiBTaWduZWQtb2ZmLWJ5OiBaaG91IFdhbmcgPHdhbmd6aG91MUBo aXNpbGljb24uY29tPgo+ID4+IFNpZ25lZC1vZmYtYnk6IFpoYW5nZmVpIEdhbyA8emhhbmdmZWku Z2FvQGxpbmFyby5vcmc+ICAKPiA+IEdyZWF0LCBtdWNoIG1vcmUgY29tcGFjdC4KPiA+Cj4gPiBJ J3ZlIG5vdCBnb25lIHRocm91Z2ggdGhpcyBpbiBkZXRhaWwgeWV0IGJ1dCBhIGZldyBpbml0aWFs IGNvbW1lbnRzIGlubGluZS4KPiA+Cj4gPiBUaGFua3MsCj4gPgo+ID4gSm9uYXRoYW4KPiA+ICAK PiA+PiAtLS0KPiA+PiAgIERvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLXVh Y2NlIHwgIDUzICsrKwo+ID4+ICAgZHJpdmVycy9taXNjL0tjb25maWcgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDEgKwo+ID4+ICAgZHJpdmVycy9taXNjL01ha2VmaWxlICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDEgKwo+ID4+ICAgZHJpdmVycy9taXNjL3VhY2NlL0tjb25maWcgICAg ICAgICAgICAgICAgICAgfCAgMTMgKwo+ID4+ICAgZHJpdmVycy9taXNjL3VhY2NlL01ha2VmaWxl ICAgICAgICAgICAgICAgICAgfCAgIDIgKwo+ID4+ICAgZHJpdmVycy9taXNjL3VhY2NlL3VhY2Nl LmMgICAgICAgICAgICAgICAgICAgfCA1NzQgKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4g Pj4gICBpbmNsdWRlL2xpbnV4L3VhY2NlLmggICAgICAgICAgICAgICAgICAgICAgICB8IDE2MyAr KysrKysrKwo+ID4+ICAgaW5jbHVkZS91YXBpL21pc2MvdWFjY2UvdWFjY2UuaCAgICAgICAgICAg ICAgfCAgMzggKysKPiA+PiAgIDggZmlsZXMgY2hhbmdlZCwgODQ1IGluc2VydGlvbnMoKykKPiA+ PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRy aXZlci11YWNjZQo+ID4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWlzYy91YWNjZS9L Y29uZmlnCj4gPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9taXNjL3VhY2NlL01ha2Vm aWxlCj4gPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9taXNjL3VhY2NlL3VhY2NlLmMK PiA+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2xpbnV4L3VhY2NlLmgKPiA+PiAgIGNy ZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL3VhcGkvbWlzYy91YWNjZS91YWNjZS5oCj4gPj4KPiA+ PiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItdWFj Y2UgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci11YWNjZQo+ID4+IG5l dyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPj4gaW5kZXggMDAwMDAwMC4uMzU2OTlkYwo+ID4+IC0tLSAv ZGV2L251bGwKPiA+PiArKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZl ci11YWNjZQo+ID4+IEBAIC0wLDAgKzEsNTMgQEAKPiA+PiArV2hhdDogICAgICAgICAgIC9zeXMv Y2xhc3MvdWFjY2UvPGRldl9uYW1lPi9pZAo+ID4+ICtEYXRlOiAgICAgICAgICAgT2N0IDIwMTkK PiA+PiArS2VybmVsVmVyc2lvbjogIDUuNQo+ID4+ICtDb250YWN0OiAgICAgICAgbGludXgtYWNj ZWxlcmF0b3JzQGxpc3RzLm96bGFicy5vcmcKPiA+PiArRGVzY3JpcHRpb246ICAgIElkIG9mIHRo ZSBkZXZpY2UuCj4gPj4gKwo+ID4+ICtXaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy91YWNjZS88 ZGV2X25hbWU+L2FwaQo+ID4+ICtEYXRlOiAgICAgICAgICAgT2N0IDIwMTkKPiA+PiArS2VybmVs VmVyc2lvbjogIDUuNQo+ID4+ICtDb250YWN0OiAgICAgICAgbGludXgtYWNjZWxlcmF0b3JzQGxp c3RzLm96bGFicy5vcmcKPiA+PiArRGVzY3JpcHRpb246ICAgIEFwaSBvZiB0aGUgZGV2aWNlLCB1 c2VkIGJ5IGFwcGxpY2F0aW9uIHRvIG1hdGNoIHRoZSBjb3JyZWN0IGRyaXZlcgo+ID4+ICsKPiA+ PiArV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvdWFjY2UvPGRldl9uYW1lPi9mbGFncwo+ID4+ ICtEYXRlOiAgICAgICAgICAgT2N0IDIwMTkKPiA+PiArS2VybmVsVmVyc2lvbjogIDUuNQo+ID4+ ICtDb250YWN0OiAgICAgICAgbGludXgtYWNjZWxlcmF0b3JzQGxpc3RzLm96bGFicy5vcmcKPiA+ PiArRGVzY3JpcHRpb246ICAgIEF0dHJpYnV0ZXMgb2YgdGhlIGRldmljZSwgc2VlIFVBQ0NFX0RF Vl94eHggZmxhZyBkZWZpbmVkIGluIHVhY2NlLmgKPiA+PiArCj4gPj4gK1doYXQ6ICAgICAgICAg ICAvc3lzL2NsYXNzL3VhY2NlLzxkZXZfbmFtZT4vYXZhaWxhYmxlX2luc3RhbmNlcwo+ID4+ICtE YXRlOiAgICAgICAgICAgT2N0IDIwMTkKPiA+PiArS2VybmVsVmVyc2lvbjogIDUuNQo+ID4+ICtD b250YWN0OiAgICAgICAgbGludXgtYWNjZWxlcmF0b3JzQGxpc3RzLm96bGFicy5vcmcKPiA+PiAr RGVzY3JpcHRpb246ICAgIEF2YWlsYWJsZSBpbnN0YW5jZXMgbGVmdCBvZiB0aGUgZGV2aWNlCj4g Pj4gKwo+ID4+ICtXaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy91YWNjZS88ZGV2X25hbWU+L2Fs Z29yaXRobXMKPiA+PiArRGF0ZTogICAgICAgICAgIE9jdCAyMDE5Cj4gPj4gK0tlcm5lbFZlcnNp b246ICA1LjUKPiA+PiArQ29udGFjdDogICAgICAgIGxpbnV4LWFjY2VsZXJhdG9yc0BsaXN0cy5v emxhYnMub3JnCj4gPj4gK0Rlc2NyaXB0aW9uOiAgICBBbGdvcml0aG1zIHN1cHBvcnRlZCBieSB0 aGlzIGFjY2VsZXJhdG9yICAKPiA+IEhvdyBhcmUgdGhleSBzZXBhcmF0ZWQ/ICBVc2Vyc3BhY2Ug Y29kZSBuZWVkcyB0byBrbm93IHRoYXQuCj4gPiAoY29tbWEsIHRhYiwgbmV3bGluZT8pICAKPiBZ ZXMsIHdpbGwgYWRkICJzZXBhcmF0ZWQgYnkgbmV3IGxpbmUiCj4gPiAgCj4gPj4gKwo+ID4+ICtX aGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy91YWNjZS88ZGV2X25hbWU+L3FmcnRfbW1pb19zaXpl ICAKPiA+IHFmcnQgaXMgbm90IHRoZSBtb3N0IG9idmlvdXMgbmFtaW5nIGV2ZXIuICBEbyB3ZSBj YXJlIGJleW9uZCBpdHMKPiA+IGEgcmVnaW9uIGZvciB0aGlzIGludGVyZmFjZT8gIHJlZ2lvbl9t bWlvX3NpemUgbWF5YmU/ICAKPiBPSywKPiA+ICAKPiA+PiArRGF0ZTogICAgICAgICAgIE9jdCAy MDE5Cj4gPj4gK0tlcm5lbFZlcnNpb246ICA1LjUKPiA+PiArQ29udGFjdDogICAgICAgIGxpbnV4 LWFjY2VsZXJhdG9yc0BsaXN0cy5vemxhYnMub3JnCj4gPj4gK0Rlc2NyaXB0aW9uOiAgICBQYWdl IHNpemUgb2YgbW1pbyByZWdpb24gcXVldWUgZmlsZSAgCj4gPiBTaXplIG9mIHBhZ2UgaW4gdGhp cyByZWdpb24sIG9yIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgcmVnaW9uPyAgCj4gQ2hhbmdlIHRv ICJQYWdlIG51bWJlcnMgb2YgbW1pbyByZWdpb24gcXVldWUgZmlsZSIKCk51bWJlciBvZiBwYWdl cyB1c2VkIGJ5IHF1ZXVlIGluIG1taW8gcmVnaW9uPwoKPiA+ICAKPiA+PiArCj4gPj4gK1doYXQ6 ICAgICAgICAgICAvc3lzL2NsYXNzL3VhY2NlLzxkZXZfbmFtZT4vcWZydF9kdXNfc2l6ZQo+ID4+ ICtEYXRlOiAgICAgICAgICAgT2N0IDIwMTkKPiA+PiArS2VybmVsVmVyc2lvbjogIDUuNQo+ID4+ ICtDb250YWN0OiAgICAgICAgbGludXgtYWNjZWxlcmF0b3JzQGxpc3RzLm96bGFicy5vcmcKPiA+ PiArRGVzY3JpcHRpb246ICAgIFBhZ2Ugc2l6ZSBvZiBkdXMgcmVnaW9uIHF1ZXVlIGZpbGUKPiA+ PiArCj4gPj4gK1doYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL3VhY2NlLzxkZXZfbmFtZT4vbnVt YV9kaXN0YW5jZQo+ID4+ICtEYXRlOiAgICAgICAgICAgT2N0IDIwMTkKPiA+PiArS2VybmVsVmVy c2lvbjogIDUuNQo+ID4+ICtDb250YWN0OiAgICAgICAgbGludXgtYWNjZWxlcmF0b3JzQGxpc3Rz Lm96bGFicy5vcmcKPiA+PiArRGVzY3JpcHRpb246ICAgIERpc3RhbmNlIG9mIGRldmljZSBub2Rl IHRvIGNwdSBub2RlICAKPiA+IEkgd29uZGVyIGlmIHdlIHNob3VsZCBiZSBkb2luZyB0aGlzIGlu IGhlcmUuIFRoZXJlIGFyZSBvdGhlciBzdGFuZGFyZAo+ID4gd2F5cyBvZiBvYnRhaW5pbmcgdGhp cyBmb3IgdGhlIGRldmljZS4gIEZvbGxvdyBwYXJlbnQgYW5kIGNoZWNrIG5vZGVfaWQKPiA+IHRo ZXJlIHRoZW4gdXNlIHRoZSAvc3lzL2J1cy9ub2RlIHBhdGggdG8gZmluZCBvdXQgdGhlIGRpc3Rh bmNlcy4gIAo+IENvdWxkIHlvdSBjbGFyaWZ5IG1vcmUgYWJvdXQgdGhpcyBtZXRob2QuCj4gVGhl IHB1cnBvc2UgaGVyZSBpcyBjcHUgc2VhcmNoaW5nIHRoZSBuZWFyZXN0IGRldmljZSh6aXApIGRv aW5nIHdvcmsuCj4gRG9lcyB1c2VyIGFwcGxpY2F0aW9uIGtub3cgd2hpY2ggbm9kZSBpdCBpcyBy dW5uaW5nIGFuZCBjb21wYXJlIGRpc3RhbmNlPwoKRXhhY3RseS4gIFRoZSBwYXJlbnQgZGV2aWNl IHdpbGwgdHlwaWNhbGx5IGJlIGEgcGNpIGRldmljZS4gVGhlIHBhcmVudApsaW5rIHdpbGwgcG9p bnQgc29tZXdoZXJlIGxpa2UKCi9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDowMDoxMC4wLwoKVW5k ZXIgdGhhdCBkaXJlY3RvcnkgaXMgYSBudW1hX25vZGUgZmlsZSB3aGljaCB3aWxsIGdpdmUgeW91 IHdoaWNoIG5vZGUKdGhlIGRldmljZSBpcyBhc3NpZ25lZCB0by4gIAoKVXNpbmcgdGhhdCBudW1i ZXIgKE4pIHJlYWQKCi9zeXMvYnVzL25vZGUvZGV2aWNlcy9ub2RlTi9kaXN0YW5jZQoKV2hpY2gg c2hvdWxkIGJlIHRoZSBzYW1lIGFzIHdoYXQgeW91IGhhdmUgZnJvbSB0aGlzIGludGVyZmFjZS4K SXQgYWxzbyBwcm92aWRlcyBhY2Nlc3MgdG8gaW5mbyBvbiBsYXRlbmN5IGFuZCBiYW5kd2lkdGgg ZXRjCmlmIEhNQVQgaXMgcHJvdmlkZWQgLSBzbyBtb3JlIGluZm8gdG8gbWFrZSBhIGRlY2lzaW9u IHRoYW4geW91cgpuZXcgaW50ZXJmYWNlIGhlcmUgcHJvdmlkZXMuCgoKPiA+PiArCj4gPj4gK1do YXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL3VhY2NlLzxkZXZfbmFtZT4vbm9kZV9pZAo+ID4+ICtE YXRlOiAgICAgICAgICAgT2N0IDIwMTkKPiA+PiArS2VybmVsVmVyc2lvbjogIDUuNQo+ID4+ICtD b250YWN0OiAgICAgICAgbGludXgtYWNjZWxlcmF0b3JzQGxpc3RzLm96bGFicy5vcmcKPiA+PiAr RGVzY3JpcHRpb246ICAgIElkIG9mIHRoZSBudW1hIG5vZGUKPiA+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9taXNjL0tjb25maWcgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwo+ID4+IGluZGV4IGM1NWI2 MzcuLjkyOWZlYjAgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKPiA+PiAr KysgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwo+ID4+IEBAIC00ODEsNCArNDgxLDUgQEAgc291cmNl ICJkcml2ZXJzL21pc2MvY3hsL0tjb25maWciCj4gPj4gICBzb3VyY2UgImRyaXZlcnMvbWlzYy9v Y3hsL0tjb25maWciCj4gPj4gICBzb3VyY2UgImRyaXZlcnMvbWlzYy9jYXJkcmVhZGVyL0tjb25m aWciCj4gPj4gICBzb3VyY2UgImRyaXZlcnMvbWlzYy9oYWJhbmFsYWJzL0tjb25maWciCj4gPj4g K3NvdXJjZSAiZHJpdmVycy9taXNjL3VhY2NlL0tjb25maWciCj4gPj4gICBlbmRtZW51Cj4gPj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmls ZQo+ID4+IGluZGV4IGMxODYwZDMuLjlhYmYyOTIgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9t aXNjL01ha2VmaWxlCj4gPj4gKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCj4gPj4gQEAgLTU2 LDQgKzU2LDUgQEAgb2JqLSQoQ09ORklHX09DWEwpCQkrPSBvY3hsLwo+ID4+ICAgb2JqLXkJCQkJ Kz0gY2FyZHJlYWRlci8KPiA+PiAgIG9iai0kKENPTkZJR19QVlBBTklDKSAgIAkrPSBwdnBhbmlj Lm8KPiA+PiAgIG9iai0kKENPTkZJR19IQUJBTkFfQUkpCQkrPSBoYWJhbmFsYWJzLwo+ID4+ICtv YmotJChDT05GSUdfVUFDQ0UpCQkrPSB1YWNjZS8KPiA+PiAgIG9iai0kKENPTkZJR19YSUxJTlhf U0RGRUMpCSs9IHhpbGlueF9zZGZlYy5vCj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy91 YWNjZS9LY29uZmlnIGIvZHJpdmVycy9taXNjL3VhY2NlL0tjb25maWcKPiA+PiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+ID4+IGluZGV4IDAwMDAwMDAuLjVlMzliNjAKPiA+PiAtLS0gL2Rldi9udWxs Cj4gPj4gKysrIGIvZHJpdmVycy9taXNjL3VhY2NlL0tjb25maWcKPiA+PiBAQCAtMCwwICsxLDEz IEBACj4gPj4gK2NvbmZpZyBVQUNDRQo+ID4+ICsJdHJpc3RhdGUgIkFjY2VsZXJhdG9yIEZyYW1l d29yayBmb3IgVXNlciBMYW5kIgo+ID4+ICsJZGVwZW5kcyBvbiBJT01NVV9BUEkKPiA+PiArCWhl bHAKPiA+PiArCSAgVUFDQ0UgcHJvdmlkZXMgaW50ZXJmYWNlIGZvciB0aGUgdXNlciBwcm9jZXNz IHRvIGFjY2VzcyB0aGUgaGFyZHdhcmUKPiA+PiArCSAgd2l0aG91dCBpbnRlcmFjdGlvbiB3aXRo IHRoZSBrZXJuZWwgc3BhY2UgaW4gZGF0YSBwYXRoLgo+ID4+ICsKPiA+PiArCSAgVGhlIHVzZXIt c3BhY2UgaW50ZXJmYWNlIGlzIGRlc2NyaWJlZCBpbgo+ID4+ICsJICBpbmNsdWRlL3VhcGkvbWlz Yy91YWNjZS91YWNjZS5oCj4gPj4gKwo+ID4+ICsJICBTZWUgRG9jdW1lbnRhdGlvbi9taXNjLWRl dmljZXMvdWFjY2UucnN0IGZvciBtb3JlIGRldGFpbHMuCj4gPj4gKwo+ID4+ICsJICBJZiB5b3Ug ZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLiAgCj4gPiBQZXNzaW1pc3QgOikgRXZl cnlvbmUgc2hvdWxkIHdhbnQgdWFjY2Ugc28gZG9uJ3QgcHV0IHRoZW0gb2ZmLiAgSGF2aW5nIHNh aWQKPiA+IHRoYXQgcGVyaGFwcyBmb3Igbm93IGl0IHNob3VsZCBiZSBoaWRkZW4gYW5kIGVuYWJs ZWQgb24gYSBkcml2ZXIgYnkgZHJpdmVyCj4gPiBiYXNpcz8KPiA+ICAKPiA+PiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9taXNjL3VhY2NlL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL3VhY2NlL01ha2Vm aWxlCj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+PiBpbmRleCAwMDAwMDAwLi41YjQzNzRl Cj4gPj4gLS0tIC9kZXYvbnVsbAo+ID4+ICsrKyBiL2RyaXZlcnMvbWlzYy91YWNjZS9NYWtlZmls ZQo+ID4+IEBAIC0wLDAgKzEsMiBAQAo+ID4+ICsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wLW9yLWxhdGVyCj4gPj4gK29iai0kKENPTkZJR19VQUNDRSkgKz0gdWFjY2Uubwo+ID4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdWFjY2UvdWFjY2UuYyBiL2RyaXZlcnMvbWlzYy91 YWNjZS91YWNjZS5jCj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+PiBpbmRleCAwMDAwMDAw Li4yYjZiMDM4Cj4gPj4gLS0tIC9kZXYvbnVsbAo+ID4+ICsrKyBiL2RyaXZlcnMvbWlzYy91YWNj ZS91YWNjZS5jCj4gPj4gQEAgLTAsMCArMSw1NzQgQEAKPiA+PiArLy8gU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKPiA+PiArI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5o Pgo+ID4+ICsjaW5jbHVkZSA8bGludXgvZG1hLWlvbW11Lmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51 eC9tb2R1bGUuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KPiA+PiArI2luY2x1ZGUg PGxpbnV4L3VhY2NlLmg+Cj4gPj4gKwo+ID4+ICtzdGF0aWMgc3RydWN0IGNsYXNzICp1YWNjZV9j bGFzczsKPiA+PiArc3RhdGljIGRldl90IHVhY2NlX2RldnQ7Cj4gPj4gK3N0YXRpYyBERUZJTkVf TVVURVgodWFjY2VfbXV0ZXgpOwo+ID4+ICtzdGF0aWMgREVGSU5FX1hBUlJBWV9BTExPQyh1YWNj ZV94YSk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHVhY2NlX3N0YXJ0X3F1ZXVlKHN0cnVjdCB1 YWNjZV9xdWV1ZSAqcSkKPiA+PiArewo+ID4+ICsJaW50IHJldCA9IC1FSU5WQUw7Cj4gPj4gKwo+ ID4+ICsJbXV0ZXhfbG9jaygmdWFjY2VfbXV0ZXgpOwo+ID4+ICsKPiA+PiArCWlmIChxLT5zdGF0 ZSAhPSBVQUNDRV9RX0lOSVQpCj4gPj4gKwkJZ290byBvdXRfd2l0aF9sb2NrOwo+ID4+ICsKPiA+ PiArCWlmIChxLT51YWNjZS0+b3BzLT5zdGFydF9xdWV1ZSkgewo+ID4+ICsJCXJldCA9IHEtPnVh Y2NlLT5vcHMtPnN0YXJ0X3F1ZXVlKHEpOwo+ID4+ICsJCWlmIChyZXQgPCAwKQo+ID4+ICsJCQln b3RvIG91dF93aXRoX2xvY2s7Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJcS0+c3RhdGUgPSBVQUND RV9RX1NUQVJURUQ7ICAKPiA+IG91dF93aXRoX2xvY2s6ICAKPiA+PiArCW11dGV4X3VubG9jaygm dWFjY2VfbXV0ZXgpOwo+ID4+ICsgIAo+ID4gcmV0dXJuIHJldDsKPiA+IFRob3VnaCBuZWVkIHRv IGhhbmRsZSByZXQgYSBiaXQgZGlmZmVyZW50bHkgYWJvdmUuLi4gIAo+IE9LCj4gPgo+ID4gK3N0 YXRpYyBpbnQgdWFjY2VfZm9wc19tbWFwKHN0cnVjdCBmaWxlICpmaWxlcCwgc3RydWN0IHZtX2Fy ZWFfc3RydWN0ICp2bWEpCj4gPiArewo+ID4gKwlzdHJ1Y3QgdWFjY2VfcXVldWUgKnEgPSBmaWxl cC0+cHJpdmF0ZV9kYXRhOwo+ID4gKwlzdHJ1Y3QgdWFjY2VfZGV2aWNlICp1YWNjZSA9IHEtPnVh Y2NlOwo+ID4gKwlzdHJ1Y3QgdWFjY2VfcWZpbGVfcmVnaW9uICpxZnI7Cj4gPiArCWVudW0gdWFj Y2VfcWZydCB0eXBlID0gMDsKPiA+ICsJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKPiA+ICsJaW50 IHJldDsKPiA+ICsKPiA+ICsJaWYgKHZtYS0+dm1fcGdvZmYgPCBVQUNDRV9RRlJUX01BWCkKPiA+ ICsJCXR5cGUgPSB2bWEtPnZtX3Bnb2ZmOwo+ID4gKwo+ID4gKwl2bWEtPnZtX2ZsYWdzIHw9IFZN X0RPTlRDT1BZIHwgVk1fRE9OVEVYUEFORCB8IFZNX1dJUEVPTkZPUks7Cj4gPiArCXZtYS0+dm1f b3BzID0gJnVhY2NlX3ZtX29wczsKPiA+ICsJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBxOwo+ID4g Kwo+ID4gKwltdXRleF9sb2NrKCZ1YWNjZV9tdXRleCk7Cj4gPiArCj4gPiArCWlmIChxLT5xZnJz W3R5cGVdKSB7Cj4gPiArCQlyZXQgPSAtRUVYSVNUOwo+ID4gKwkJZ290byBvdXRfd2l0aF9sb2Nr Owo+ID4gKwl9Cj4gPiArCj4gPiArCXN3aXRjaCAodHlwZSkgewo+ID4gKwljYXNlIFVBQ0NFX1FG UlRfTU1JTzoKPiA+ICsJCWZsYWdzID0gVUFDQ0VfUUZSRl9TRUxGTVQ7Cj4gPiArCQlicmVhazsK PiA+ICsKPiA+ICsJY2FzZSBVQUNDRV9RRlJUX0RVUzoKPiA+ICsJCWlmICh1YWNjZS0+ZmxhZ3Mg JiBVQUNDRV9ERVZfU1ZBKSB7Cj4gPiArCQkJZmxhZ3MgPSBVQUNDRV9RRlJGX1NFTEZNVDsKPiA+ ICsJCQlicmVhazsKPiA+ICsJCX0KPiA+ICsJCWJyZWFrOwo+ID4gKwo+ID4gKwlkZWZhdWx0Ogo+ ID4gKwkJV0FSTl9PTigmdWFjY2UtPmRldik7Cj4gPiArCQlicmVhazsKPiA+ICsJfQo+ID4gKwo+ ID4gKwlxZnIgPSB1YWNjZV9jcmVhdGVfcmVnaW9uKHEsIHZtYSwgdHlwZSwgZmxhZ3MpOwo+ID4g KwlpZiAoSVNfRVJSKHFmcikpIHsKPiA+ICsJCXJldCA9IFBUUl9FUlIocWZyKTsKPiA+ICsJCWdv dG8gb3V0X3dpdGhfbG9jazsKPiA+ICsJfQo+ID4gKwlxLT5xZnJzW3R5cGVdID0gcWZyOwo+ID4g Kwo+ID4gQ291bGQgcHV0Cj4gPiBvdXRfd2l0aF9sb2NrOgo+ID4gaGVyZSBhbmQgcmV0dXJuIHJl dCBpbnN0ZWFkIG9mIDAuCj4gPiBZb3UnbGwgbmVlZCB0byBzZXQgcmV0IHRvIGRlZmF1bHQgdG8g MCBpbiB0aGF0Cj4gPiBjYXNlIHRob3VnaC4gIAo+IE9LCj4gPgo+ID4gK3N0YXRpYyBzc2l6ZV90 IGFsZ29yaXRobXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiArCQkJICAgICAgIHN0cnVj dCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCj4gPiArewo+ID4gKwlzdHJ1Y3Qg dWFjY2VfZGV2aWNlICp1YWNjZSA9IHRvX3VhY2NlX2RldmljZShkZXYpOwo+ID4gKwo+ID4gKwly ZXR1cm4gc3ByaW50ZihidWYsICIlcyIsIHVhY2NlLT5hbGdzKTsKPiA+IEFueSByaXNrIGFsZ3Mg d29uJ3QgaGF2ZSB0aGUgXG4/Cj4gPiBJJ2Qga2luZCBvZiBleHBlY3QgaXQgdG8gYmUgYSBudWxs IHRlcm1hdGVkIGFycmF5cyB0byBhbGxvdyB0aGUgY29yZQo+ID4gdG8gZm9ybWF0IGl0IGhvd2V2 ZXIgaXQgd2FudHMgdG8uICAKPiBZZXMsIGFkZGluZyBcbiBpcyBiZXR0ZXIuCgpUaGlzIG1heSB0 aGVuIGFkZCBhIGJvbnVzIG5ldyBsaW5lIGlmIHlvdSBoYXZlIG11bHRpcGxlIGxpbmVzIGFscmVh ZHkgaW4KdGhlIHN0cmluZy4gIFByb2JhYmx5IGRvZXNuJ3QgZG8gbXVjaCBoYXJtLCBidXQgaXQn cyBub3QgaWRlYWwuCgo+ID4gIAo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgc3NpemVfdCBx ZnJ0X21taW9fc2l6ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+PiArCQkJCSAgIHN0cnVj dCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCj4gPj4gK3sKPiA+PiArCXN0cnVj dCB1YWNjZV9kZXZpY2UgKnVhY2NlID0gdG9fdWFjY2VfZGV2aWNlKGRldik7Cj4gPj4gKwo+ID4+ ICsJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLAo+ID4+ICsJCSAgICAgICB1YWNjZS0+cWZf cGdfc2l6ZVtVQUNDRV9RRlJUX01NSU9dIDw8IFBBR0VfU0hJRlQpOwo+ID4+ICt9Cj4gPj4gKwo+ ID4+ICtzdGF0aWMgc3NpemVfdCBxZnJ0X2R1c19zaXplX3Nob3coc3RydWN0IGRldmljZSAqZGV2 LAo+ID4+ICsJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQo+ ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgdWFjY2VfZGV2aWNlICp1YWNjZSA9IHRvX3VhY2NlX2Rldmlj ZShkZXYpOwo+ID4+ICsKPiA+PiArCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwKPiA+PiAr CQkgICAgICAgdWFjY2UtPnFmX3BnX3NpemVbVUFDQ0VfUUZSVF9EVVNdIDw8IFBBR0VfU0hJRlQp Owo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgREVWSUNFX0FUVFJfUk8oaWQpOwo+ID4+ICtz dGF0aWMgREVWSUNFX0FUVFJfUk8oYXBpKTsKPiA+PiArc3RhdGljIERFVklDRV9BVFRSX1JPKG51 bWFfZGlzdGFuY2UpOwo+ID4+ICtzdGF0aWMgREVWSUNFX0FUVFJfUk8obm9kZV9pZCk7Cj4gPj4g K3N0YXRpYyBERVZJQ0VfQVRUUl9STyhmbGFncyk7Cj4gPj4gK3N0YXRpYyBERVZJQ0VfQVRUUl9S TyhhdmFpbGFibGVfaW5zdGFuY2VzKTsKPiA+PiArc3RhdGljIERFVklDRV9BVFRSX1JPKGFsZ29y aXRobXMpOwo+ID4+ICtzdGF0aWMgREVWSUNFX0FUVFJfUk8ocWZydF9tbWlvX3NpemUpOwo+ID4+ ICtzdGF0aWMgREVWSUNFX0FUVFJfUk8ocWZydF9kdXNfc2l6ZSk7Cj4gPj4gKwo+ID4+ICtzdGF0 aWMgc3RydWN0IGF0dHJpYnV0ZSAqdWFjY2VfZGV2X2F0dHJzW10gPSB7Cj4gPj4gKwkmZGV2X2F0 dHJfaWQuYXR0ciwKPiA+PiArCSZkZXZfYXR0cl9hcGkuYXR0ciwKPiA+PiArCSZkZXZfYXR0cl9u b2RlX2lkLmF0dHIsCj4gPj4gKwkmZGV2X2F0dHJfbnVtYV9kaXN0YW5jZS5hdHRyLAo+ID4+ICsJ JmRldl9hdHRyX2ZsYWdzLmF0dHIsCj4gPj4gKwkmZGV2X2F0dHJfYXZhaWxhYmxlX2luc3RhbmNl cy5hdHRyLAo+ID4+ICsJJmRldl9hdHRyX2FsZ29yaXRobXMuYXR0ciwKPiA+PiArCSZkZXZfYXR0 cl9xZnJ0X21taW9fc2l6ZS5hdHRyLAo+ID4+ICsJJmRldl9hdHRyX3FmcnRfZHVzX3NpemUuYXR0 ciwKPiA+PiArCU5VTEwsCj4gPj4gK307Cj4gPj4gK0FUVFJJQlVURV9HUk9VUFModWFjY2VfZGV2 KTsKPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHVhY2NlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAq ZGV2KQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgdWFjY2VfZGV2aWNlICp1YWNjZSA9IHRvX3VhY2Nl X2RldmljZShkZXYpOwo+ID4+ICsKPiA+PiArCWtmcmVlKHVhY2NlKTsKPiA+PiArfQo+ID4+ICsK PiA+PiArLyoqCj4gPj4gKyAqIHVhY2NlX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYW4gYWNjZWxlcmF0 b3IgIAo+ID4gVGhpcyBpc24ndCBxdWl0ZSBjb3JyZWN0IGtlcm5lbC1kb2MuICBQbGVhc2UgcnVu IHRoZQo+ID4gZ2VuZXJhdGlvbiBzY3JpcHQgb3ZlciBpdCBhbmQgZml4IGFueSB3YXJuaW5ncy4K PiA+Cj4gPiAJdWFjY2VfcmVnaXN0ZXIoKSAtIHJlZ2lzdGVyIGFuIGFjY2VsZXJhdG9yICAKPiBT dXJlLCB3aWxsIGFkZCAoKSwgdGhvdWdoIG5vIHdhcm5pbmcgcmVwb3J0ZWQgZnJvbSAuL3Njcmlw dHMva2VybmVsLWRvYwoKSSBjaGVja2VkIHRoYXQgb25lIGZvciBhbm90aGVyIHJldmlldyB5ZXN0 ZXJkYXkuICBTZWVtcyB0aGUga2VybmVsCnN1Z2dlc3RlZCBrZXJuZWwtZG9jIHN0eWxlIGlzbid0 IGFjdHVhbGx5IGVuZm9yY2VkIGFuZCB0aGUgYnJhY2tldHMKYXJlIG9wdGlvbmFsIGZvciBmdW5j dGlvbnMuICAgSXQgYXNzdW1lcyBhbnl0aGluZyBpdCBoYXNuJ3QgaWRlbnRpZmllZAphcyBzb21l dGhpbmcgZWxzZSBtdXN0IGJlIGEgZnVuY3Rpb24gaGVuY2UgdGhpcyBpcyB0aGUgb25lIGNhc2Ug d2hlcmUKY2FyZWZ1bCBtYXRjaGluZyBkb2Vzbid0IGFwcGx5ICh1bmxpa2Ugc3RydWN0LCBlbnVt IGV0YykuCgoKPiA+ICAKPiA+PiArICogQHBhcmVudDogcG9pbnRlciBvZiB1YWNjZSBwYXJlbnQg ZGV2aWNlCj4gPj4gKyAqIEBpbnRlcmZhY2U6IHBvaW50ZXIgb2YgdWFjY2VfaW50ZXJmYWNlIGZv ciByZWdpc3Rlcgo+ID4+ICsgKi8KPiA+PiArc3RydWN0IHVhY2NlX2RldmljZSAqdWFjY2VfcmVn aXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAo+ID4+ICsJCQkJICAgIHN0cnVjdCB1YWNjZV9p bnRlcmZhY2UgKmludGVyZmFjZSkKPiA+PiArewo+ID4+ICsJdW5zaWduZWQgaW50IGZsYWdzID0g aW50ZXJmYWNlLT5mbGFnczsKPiA+PiArCXN0cnVjdCB1YWNjZV9kZXZpY2UgKnVhY2NlOwo+ID4+ ICsJaW50IHJldDsKPiA+PiArCj4gPj4gKwl1YWNjZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1 YWNjZV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKPiA+PiArCWlmICghdWFjY2UpCj4gPj4gKwkJcmV0 dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gPj4gKwo+ID4+ICsJaWYgKGZsYWdzICYgVUFDQ0VfREVW X1NWQSkgewo+ID4+ICsJCXJldCA9IGlvbW11X2Rldl9lbmFibGVfZmVhdHVyZShwYXJlbnQsIElP TU1VX0RFVl9GRUFUX1NWQSk7Cj4gPj4gKwkJaWYgKHJldCkKPiA+PiArCQkJZmxhZ3MgJj0gflVB Q0NFX0RFVl9TVkE7Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJdWFjY2UtPnBkZXYgPSBwYXJlbnQ7 Cj4gPj4gKwl1YWNjZS0+ZmxhZ3MgPSBmbGFnczsKPiA+PiArCXVhY2NlLT5vcHMgPSBpbnRlcmZh Y2UtPm9wczsKPiA+PiArCj4gPj4gKwlyZXQgPSB4YV9hbGxvYygmdWFjY2VfeGEsICZ1YWNjZS0+ ZGV2X2lkLCB1YWNjZSwgeGFfbGltaXRfMzJiLAo+ID4+ICsJCSAgICAgICBHRlBfS0VSTkVMKTsK PiA+PiArCWlmIChyZXQgPCAwKQo+ID4+ICsJCWdvdG8gZXJyX3dpdGhfdWFjY2U7Cj4gPj4gKwo+ ID4+ICsJdWFjY2UtPmNkZXYgPSBjZGV2X2FsbG9jKCk7ICAKPiA+IElmIHdlIGNhbiBlbWJlZCB0 aGlzIChzZWUgYmVsb3cpIHRoZW4gdXNlIGNkZXZfaW5pdCBpbnN0ZWFkLgo+ID4gIAo+ID4+ICsJ aWYgKCF1YWNjZS0+Y2Rldikgewo+ID4+ICsJCXJldCA9IC1FTk9NRU07Cj4gPj4gKwkJZ290byBl cnJfd2l0aF94YTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlJTklUX0xJU1RfSEVBRCgmdWFjY2Ut PnFzKTsKPiA+PiArCW11dGV4X2luaXQoJnVhY2NlLT5xX2xvY2spOwo+ID4+ICsJdWFjY2UtPmNk ZXYtPm9wcyA9ICZ1YWNjZV9mb3BzOwo+ID4+ICsJdWFjY2UtPmNkZXYtPm93bmVyID0gVEhJU19N T0RVTEU7Cj4gPj4gKwlkZXZpY2VfaW5pdGlhbGl6ZSgmdWFjY2UtPmRldik7Cj4gPj4gKwl1YWNj ZS0+ZGV2LmRldnQgPSBNS0RFVihNQUpPUih1YWNjZV9kZXZ0KSwgdWFjY2UtPmRldl9pZCk7Cj4g Pj4gKwl1YWNjZS0+ZGV2LmNsYXNzID0gdWFjY2VfY2xhc3M7Cj4gPj4gKwl1YWNjZS0+ZGV2Lmdy b3VwcyA9IHVhY2NlX2Rldl9ncm91cHM7Cj4gPj4gKwl1YWNjZS0+ZGV2LnBhcmVudCA9IHVhY2Nl LT5wZGV2Owo+ID4+ICsJdWFjY2UtPmRldi5yZWxlYXNlID0gdWFjY2VfcmVsZWFzZTsKPiA+PiAr CWRldl9zZXRfbmFtZSgmdWFjY2UtPmRldiwgIiVzLSVkIiwgaW50ZXJmYWNlLT5uYW1lLCB1YWNj ZS0+ZGV2X2lkKTsKPiA+PiArCXJldCA9IGNkZXZfZGV2aWNlX2FkZCh1YWNjZS0+Y2RldiwgJnVh Y2NlLT5kZXYpOwo+ID4+ICsJaWYgKHJldCkKPiA+PiArCQlnb3RvIGVycl93aXRoX3hhOwo+ID4+ ICsKPiA+PiArCXJldHVybiB1YWNjZTsKPiA+PiArCj4gPj4gK2Vycl93aXRoX3hhOgo+ID4+ICsJ aWYgKHVhY2NlLT5jZGV2KQo+ID4+ICsJCWNkZXZfZGVsKHVhY2NlLT5jZGV2KTsgIAo+ID4gV2h5 IG5vdCB1c2UgYSBzZXBhcmF0ZSBsYWJlbCB0byBoYW5kbGUgdGhlIGFib3ZlIHJhdGhlciB0aGFu IGNoZWNraW5nIGlmCj4gPiBpdCdzIHNldD8gIAo+IG9rLAo+ID4gIAo+ID4+ICsJeGFfZXJhc2Uo JnVhY2NlX3hhLCB1YWNjZS0+ZGV2X2lkKTsKPiA+PiArZXJyX3dpdGhfdWFjY2U6Cj4gPj4gKwlp ZiAoZmxhZ3MgJiBVQUNDRV9ERVZfU1ZBKQo+ID4+ICsJCWlvbW11X2Rldl9kaXNhYmxlX2ZlYXR1 cmUodWFjY2UtPnBkZXYsIElPTU1VX0RFVl9GRUFUX1NWQSk7Cj4gPj4gKwlrZnJlZSh1YWNjZSk7 Cj4gPj4gKwlyZXR1cm4gRVJSX1BUUihyZXQpOwo+ID4+ICt9Cj4gPj4gK0VYUE9SVF9TWU1CT0xf R1BMKHVhY2NlX3JlZ2lzdGVyKTsKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiB1YWNjZV91bnJl Z2lzdGVyIC0gdW5yZWdpc3RlcnMgYW4gYWNjZWxlcmF0b3IKPiA+PiArICogQHVhY2NlOiB0aGUg YWNjZWxlcmF0b3IgdG8gdW5yZWdpc3Rlcgo+ID4+ICsgKi8KPiA+PiArdm9pZCB1YWNjZV91bnJl Z2lzdGVyKHN0cnVjdCB1YWNjZV9kZXZpY2UgKnVhY2NlKQo+ID4+ICt7Cj4gPj4gKwlpZiAoIXVh Y2NlKQo+ID4+ICsJCXJldHVybjsKPiA+PiArICAKPiA+IEknZCBsaWtlIHRvIHNlZSBhIGNvbW1l bnQgaGVyZSBvbiB3aHkgd2UgYXJlIGRvaW5nIHRoaW5ncyBub3QgdW53aW5kaW5nCj4gPiBhY3Rp b25zIGZyb20gdWFjY2VfcmVnaXN0ZXIuICAKPiBPSyB3aWxsIGFkZCBjb21tZW50cy4KPiBIZXJl IGlzICJlbnN1cmUgbm8gb3BlbiBxdWV1ZSByZW1haW5zIgo+ID4+ICsJbXV0ZXhfbG9jaygmdWFj Y2UtPnFfbG9jayk7Cj4gPj4gKwlpZiAoIWxpc3RfZW1wdHkoJnVhY2NlLT5xcykpIHsKPiA+PiAr CQlzdHJ1Y3QgdWFjY2VfcXVldWUgKnE7Cj4gPj4gKwo+ID4+ICsJCWxpc3RfZm9yX2VhY2hfZW50 cnkocSwgJnVhY2NlLT5xcywgbGlzdCkgewo+ID4+ICsJCQl1YWNjZV9wdXRfcXVldWUocSk7Cj4g Pj4gKwkJCWlmICh1YWNjZS0+ZmxhZ3MgJiBVQUNDRV9ERVZfU1ZBKQo+ID4+ICsJCQkJaW9tbXVf c3ZhX3VuYmluZF9kZXZpY2UocS0+aGFuZGxlKTsKPiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwlt dXRleF91bmxvY2soJnVhY2NlLT5xX2xvY2spOwo+ID4+ICsgIAo+ID4gRm9yIHRoZXNlIG5leHQg cGFydHMgd2hpY2ggYXJlIHRoZSB1bndpbmQgb2YgdWFjY2VfcmVnaXN0ZXIsIHdoeSBhcmUgdGhl eSBub3QKPiA+IGluIHRoZSByZXZlcnNlIG9yZGVyIG9mIHdoYXQgaXMgaGFwcGVuaW5nIGluIHRo ZXJlICh3aGVyZSBwb3NzaWJsZSBnaXZlbgo+ID4gZGV2aWNlIGxpZmVzcGFuKS4gVGhhdCBpcyB3 aHkgZG8gd2Ugbm90IGRpc2FibGUgdGhlIGlvbW11IGZlYXR1cmUgbXVjaCBsYXRlcj8gIAo+IEZp cnN0IGNsb3NlIGFsbCBxdWV1ZXMsIHRoZW4gZGlzYWJsZSBzdmEgZmVhdHVyZS4KPiA+ICAKPiA+ PiArCWlmICh1YWNjZS0+ZmxhZ3MgJiBVQUNDRV9ERVZfU1ZBKQo+ID4+ICsJCWlvbW11X2Rldl9k aXNhYmxlX2ZlYXR1cmUodWFjY2UtPnBkZXYsIElPTU1VX0RFVl9GRUFUX1NWQSk7Cj4gPj4gKwo+ ID4+ICsJY2Rldl9kZXZpY2VfZGVsKHVhY2NlLT5jZGV2LCAmdWFjY2UtPmRldik7Cj4gPj4gKwl4 YV9lcmFzZSgmdWFjY2VfeGEsIHVhY2NlLT5kZXZfaWQpOwo+ID4+ICsJcHV0X2RldmljZSgmdWFj Y2UtPmRldik7Cj4gPj4gK30KPiA+PiArRVhQT1JUX1NZTUJPTF9HUEwodWFjY2VfdW5yZWdpc3Rl cik7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IF9faW5pdCB1YWNjZV9pbml0KHZvaWQpCj4gPj4g K3sKPiA+PiArCWludCByZXQ7Cj4gPj4gKwo+ID4+ICsJdWFjY2VfY2xhc3MgPSBjbGFzc19jcmVh dGUoVEhJU19NT0RVTEUsIFVBQ0NFX05BTUUpOwo+ID4+ICsJaWYgKElTX0VSUih1YWNjZV9jbGFz cykpCj4gPj4gKwkJcmV0dXJuIFBUUl9FUlIodWFjY2VfY2xhc3MpOwo+ID4+ICsKPiA+PiArCXJl dCA9IGFsbG9jX2NocmRldl9yZWdpb24oJnVhY2NlX2RldnQsIDAsIE1JTk9STUFTSywgVUFDQ0Vf TkFNRSk7Cj4gPj4gKwlpZiAocmV0KSB7Cj4gPj4gKwkJY2xhc3NfZGVzdHJveSh1YWNjZV9jbGFz cyk7Cj4gPj4gKwkJcmV0dXJuIHJldDsgIAo+ID4gZHJvcCB0aGUgcmV0dXJuIHJldCBvdXQgb2Yg dGhlc2UgYnJhY2tldHMuIGkuZS4KPiA+Cj4gPiBpZiAocmV0KQo+ID4gCWNsYXNzX2Rlc3Ryb3ko dWFjY2VfY2xhc3MpCj4gPgo+ID4gcmV0dXJuIHJldDsgIAo+IHN1cmUsIHRoYW5rcwo+ID4gIAo+ ID4+ICsJfQo+ID4+ICsKPiA+PiArCXJldHVybiAwOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0 aWMgX19leGl0IHZvaWQgdWFjY2VfZXhpdCh2b2lkKQo+ID4+ICt7Cj4gPj4gKwl1bnJlZ2lzdGVy X2NocmRldl9yZWdpb24odWFjY2VfZGV2dCwgTUlOT1JNQVNLKTsKPiA+PiArCWNsYXNzX2Rlc3Ry b3kodWFjY2VfY2xhc3MpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdWJzeXNfaW5pdGNhbGwodWFj Y2VfaW5pdCk7Cj4gPj4gK21vZHVsZV9leGl0KHVhY2NlX2V4aXQpOwo+ID4+ICsKPiA+PiArTU9E VUxFX0xJQ0VOU0UoIkdQTCIpOwo+ID4+ICtNT0RVTEVfQVVUSE9SKCJIaXNpbGljb24gVGVjaC4g Q28uLCBMdGQuIik7Cj4gPj4gK01PRFVMRV9ERVNDUklQVElPTigiQWNjZWxlcmF0b3IgaW50ZXJm YWNlIGZvciBVc2VybGFuZCBhcHBsaWNhdGlvbnMiKTsKPiA+PiBkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9saW51eC91YWNjZS5oIGIvaW5jbHVkZS9saW51eC91YWNjZS5oCj4gPj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQKPiA+PiBpbmRleCAwMDAwMDAwLi4wNGM4NjQzCj4gPj4gLS0tIC9kZXYvbnVsbAo+ ID4+ICsrKyBiL2luY2x1ZGUvbGludXgvdWFjY2UuaAo+ID4+IEBAIC0wLDAgKzEsMTYzIEBACj4g Pj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyICovCj4gPj4g KyNpZm5kZWYgX0xJTlVYX1VBQ0NFX0gKPiA+PiArI2RlZmluZSBfTElOVVhfVUFDQ0VfSAo+ID4+ ICsKPiA+PiArI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KPiA+PiArI2luY2x1ZGUgPHVhcGkvbWlz Yy91YWNjZS91YWNjZS5oPgo+ID4+ICsKPiA+PiArI2RlZmluZSBVQUNDRV9OQU1FCQkidWFjY2Ui Cj4gPj4gKyNkZWZpbmUgVUFDQ0VfUUZSVF9NQVgJCTE2ICAKPiA+IFdoYXQgZG9lcyBRRlJUIHN0 YW5kIGZvcj8gIAo+IGNoYW5nZSB0byBVQUNDRV9NQVhfUkVHSU9OCgpNdWNoIGJldHRlcgoKPiA+ PiArI2RlZmluZSBVQUNDRV9NQVhfTkFNRV9TSVpFCTY0Cj4gPj4gKwo+ID4+ICtzdHJ1Y3QgdWFj Y2VfcXVldWU7Cj4gPj4gK3N0cnVjdCB1YWNjZV9kZXZpY2U7Cj4gPj4gKwo+ID4+ICsvKioKPiA+ PiArICogZW51bSB1YWNjZV9xZnJfZmxhZzogcXVldWUgZmlsZSBmbGFnOgo+ID4+ICsgKiBAVUFD Q0VfUUZSRl9TRUxGTVQ6IHNlbGYgbWFpbnRhaW5lZCBxZnIKPiA+PiArICovCj4gPj4gK2VudW0g dWFjY2VfcWZyX2ZsYWcgewo+ID4+ICsJVUFDQ0VfUUZSRl9TRUxGTVQgPSBCSVQoMCksCj4gPj4g K307ICAKPiA+IFNhbWUgaXNzdWUgd2l0aCBlbnVtcyBmb3IgZmxhZ3MuICBEb2Vzbid0IG1ha2Ug bXVjaCBzZW5zZSB0byBtZS4KPiA+IE9ubHkgb25lIHZhbHVlIGNhbiBiZSB0YWtlbiB3aGljaCBk b2Vzbid0IG1ha2UgaXQgYSBmbGFnLgo+ID4gIAo+ID4+ICsKPiA+PiArLyoqCj4gPj4gKyAqIHN0 cnVjdCB1YWNjZV9xZmlsZV9yZWdpb24gLSBzdHJ1Y3R1cmUgb2YgcXVldWUgZmlsZSByZWdpb24K PiA+PiArICogQHR5cGU6IHR5cGUgb2YgdGhlIHFmcgo+ID4+ICsgKiBAZmxhZ3M6IGZsYWdzIG9m IHFmcgo+ID4+ICsgKiBAcHJvdDogcWZyIHByb3RlY3Rpb24gZmxhZwo+ID4+ICsgKi8KPiA+PiAr c3RydWN0IHVhY2NlX3FmaWxlX3JlZ2lvbiB7Cj4gPj4gKwllbnVtIHVhY2NlX3FmcnQgdHlwZTsK PiA+PiArCWVudW0gdWFjY2VfcWZyX2ZsYWcgZmxhZ3M7Cj4gPj4gKwl1MzIgcHJvdDsKPiA+PiAr fTsKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiBzdHJ1Y3QgdWFjY2Vfb3BzIC0gdWFjY2UgZGV2 aWNlIG9wZXJhdGlvbnMKPiA+PiArICogQGdldF9hdmFpbGFibGVfaW5zdGFuY2VzOiAgZ2V0IGF2 YWlsYWJsZSBpbnN0YW5jZXMgbGVmdCBvZiB0aGUgZGV2aWNlCj4gPj4gKyAqIEBnZXRfcXVldWU6 IGdldCBhIHF1ZXVlIGZyb20gdGhlIGRldmljZQo+ID4+ICsgKiBAcHV0X3F1ZXVlOiBmcmVlIGEg cXVldWUgdG8gdGhlIGRldmljZQo+ID4+ICsgKiBAc3RhcnRfcXVldWU6IG1ha2UgdGhlIHF1ZXVl IHN0YXJ0IHdvcmsgYWZ0ZXIgZ2V0X3F1ZXVlCj4gPj4gKyAqIEBzdG9wX3F1ZXVlOiBtYWtlIHRo ZSBxdWV1ZSBzdG9wIHdvcmsgYmVmb3JlIHB1dF9xdWV1ZQo+ID4+ICsgKiBAaXNfcV91cGRhdGVk OiBjaGVjayB3aGV0aGVyIHRoZSB0YXNrIGlzIGZpbmlzaGVkCj4gPj4gKyAqIEBtYXNrX25vdGlm eTogbWFzayB0aGUgdGFzayBpcnEgb2YgcXVldWUKPiA+PiArICogQG1tYXA6IG1tYXAgYWRkcmVz c2VzIG9mIHF1ZXVlIHRvIHVzZXIgc3BhY2UKPiA+PiArICogQHJlc2V0OiByZXNldCB0aGUgdWFj Y2UgZGV2aWNlCj4gPj4gKyAqIEByZXNldF9xdWV1ZTogcmVzZXQgdGhlIHF1ZXVlCj4gPj4gKyAq IEBpb2N0bDogaW9jdGwgZm9yIHVzZXIgc3BhY2UgdXNlcnMgb2YgdGhlIHF1ZXVlCj4gPj4gKyAq Lwo+ID4+ICtzdHJ1Y3QgdWFjY2Vfb3BzIHsKPiA+PiArCWludCAoKmdldF9hdmFpbGFibGVfaW5z dGFuY2VzKShzdHJ1Y3QgdWFjY2VfZGV2aWNlICp1YWNjZSk7Cj4gPj4gKwlpbnQgKCpnZXRfcXVl dWUpKHN0cnVjdCB1YWNjZV9kZXZpY2UgKnVhY2NlLCB1bnNpZ25lZCBsb25nIGFyZywKPiA+PiAr CQkJIHN0cnVjdCB1YWNjZV9xdWV1ZSAqcSk7Cj4gPj4gKwl2b2lkICgqcHV0X3F1ZXVlKShzdHJ1 Y3QgdWFjY2VfcXVldWUgKnEpOwo+ID4+ICsJaW50ICgqc3RhcnRfcXVldWUpKHN0cnVjdCB1YWNj ZV9xdWV1ZSAqcSk7Cj4gPj4gKwl2b2lkICgqc3RvcF9xdWV1ZSkoc3RydWN0IHVhY2NlX3F1ZXVl ICpxKTsKPiA+PiArCWludCAoKmlzX3FfdXBkYXRlZCkoc3RydWN0IHVhY2NlX3F1ZXVlICpxKTsK PiA+PiArCXZvaWQgKCptYXNrX25vdGlmeSkoc3RydWN0IHVhY2NlX3F1ZXVlICpxLCBpbnQgZXZl bnRfbWFzayk7Cj4gPj4gKwlpbnQgKCptbWFwKShzdHJ1Y3QgdWFjY2VfcXVldWUgKnEsIHN0cnVj dCB2bV9hcmVhX3N0cnVjdCAqdm1hLAo+ID4+ICsJCSAgICBzdHJ1Y3QgdWFjY2VfcWZpbGVfcmVn aW9uICpxZnIpOwo+ID4+ICsJaW50ICgqcmVzZXQpKHN0cnVjdCB1YWNjZV9kZXZpY2UgKnVhY2Nl KTsKPiA+PiArCWludCAoKnJlc2V0X3F1ZXVlKShzdHJ1Y3QgdWFjY2VfcXVldWUgKnEpOyAgCj4g PiBTb21lIG9mIHRoZXNlIGFyZW4ndCB1c2VkIG9uIG9ubHkgZXhpc3RpbmcgZHJpdmVyLiAgSW50 cm9kdWNlIHRoZW0gb25seQo+ID4gaW4gdGhlIHNlcmllcyB0aGF0IHVzZXMgdGhlbS4gIAo+IE9L Cj4gPiAgCj4gPj4gKwlsb25nICgqaW9jdGwpKHN0cnVjdCB1YWNjZV9xdWV1ZSAqcSwgdW5zaWdu ZWQgaW50IGNtZCwKPiA+PiArCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7Cj4gPj4gK307Cj4g Pj4gKwo+ID4+ICsvKioKPiA+PiArICogc3RydWN0IHVhY2NlX2ludGVyZmFjZSAgCj4gPiBJIHRo aW5rIHRoaXMgbmVlZHMgYSBkZXNjcmlwdGlvbiBmb3Iga2VybmVsIGRvYyAoZXZlbiBpZiBpdCdz IG9idmlvdXMhKQo+ID4gQ291bGQgYmUgd3JvbmcgdGhvdWdoLiAgCj4gT0sKPiA+ICAKPiA+PiAr ICogQG5hbWU6IHRoZSB1YWNjZSBkZXZpY2UgbmFtZS4gIFdpbGwgc2hvdyB1cCBpbiBzeXNmcwo+ ID4+ICsgKiBAZmxhZ3M6IHVhY2NlIGRldmljZSBhdHRyaWJ1dGVzCj4gPj4gKyAqIEBvcHM6IHBv aW50ZXIgdG8gdGhlIHN0cnVjdCB1YWNjZV9vcHMKPiA+PiArICoKPiA+PiArICogVGhpcyBzdHJ1 Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIHVhY2NlX3JlZ2lzdGVyKCkKPiA+PiArICovCj4gPj4gK3N0 cnVjdCB1YWNjZV9pbnRlcmZhY2Ugewo+ID4+ICsJY2hhciBuYW1lW1VBQ0NFX01BWF9OQU1FX1NJ WkVdOwo+ID4+ICsJZW51bSB1YWNjZV9kZXZfZmxhZyBmbGFnczsKPiA+PiArCXN0cnVjdCB1YWNj ZV9vcHMgKm9wczsKPiA+PiArfTsKPiA+PiArCj4gPj4gK2VudW0gdWFjY2VfcV9zdGF0ZSB7Cj4g Pj4gKwlVQUNDRV9RX0lOSVQsCj4gPj4gKwlVQUNDRV9RX1NUQVJURUQsCj4gPj4gKwlVQUNDRV9R X1pPTUJJRSwKPiA+PiArfTsKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiBzdHJ1Y3QgdWFjY2Vf cXVldWUKPiA+PiArICogQHVhY2NlOiBwb2ludGVyIHRvIHVhY2NlCj4gPj4gKyAqIEBwcml2OiBw cml2YXRlIHBvaW50ZXIKPiA+PiArICogQHdhaXQ6IHdhaXQgcXVldWUgaGVhZAo+ID4+ICsgKiBA cGFzaWQ6IHBhc2lkIG9mIHRoZSBxdWV1ZQo+ID4+ICsgKiBAcGlkOiBwaWQgb2YgdGhlIHByb2Nl c3MgdXNpbmcgdGhlIHF1ZXVlCj4gPj4gKyAqIEBoYW5kbGU6IGlvbW11X3N2YSBoYW5kbGUgcmV0 dXJuIGZyb20gaW9tbXVfc3ZhX2JpbmRfZGV2aWNlCj4gPj4gKyAqIEBsaXN0OiBxdWV1ZSBsaXN0 Cj4gPj4gKyAqIEBxZnJzOiBwb2ludGVyIG9mIHFmciByZWdpb25zCj4gPj4gKyAqIEBzdGF0ZTog cXVldWUgc3RhdGUgbWFjaGluZQo+ID4+ICsgKi8KPiA+PiArc3RydWN0IHVhY2NlX3F1ZXVlIHsK PiA+PiArCXN0cnVjdCB1YWNjZV9kZXZpY2UgKnVhY2NlOwo+ID4+ICsJdm9pZCAqcHJpdjsKPiA+ PiArCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Cj4gPj4gKwlpbnQgcGFzaWQ7Cj4gPj4gKwlwaWRf dCBwaWQ7Cj4gPj4gKwlzdHJ1Y3QgaW9tbXVfc3ZhICpoYW5kbGU7Cj4gPj4gKwlzdHJ1Y3QgbGlz dF9oZWFkIGxpc3Q7Cj4gPj4gKwlzdHJ1Y3QgdWFjY2VfcWZpbGVfcmVnaW9uICpxZnJzW1VBQ0NF X1FGUlRfTUFYXTsKPiA+PiArCWVudW0gdWFjY2VfcV9zdGF0ZSBzdGF0ZTsKPiA+PiArfTsKPiA+ PiArCj4gPj4gKy8qKgo+ID4+ICsgKiBzdHJ1Y3QgdWFjY2VfZGV2aWNlCj4gPj4gKyAqIEBhbGdz OiBzdXBwb3J0ZWQgYWxnb3JpdGhtcwo+ID4+ICsgKiBAYXBpX3ZlcjogYXBpIHZlcnNpb24KPiA+ PiArICogQHFmX3BnX3NpemU6IHBhZ2Ugc2l6ZSBvZiB0aGUgcXVldWUgZmlsZSByZWdpb25zCj4g Pj4gKyAqIEBvcHM6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdCB1YWNjZV9vcHMKPiA+PiArICogQHBk ZXY6IHBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZXZpY2UKPiA+PiArICogQGlzX3ZmOiB3aGV0aGVy IHZpcnR1YWwgZnVuY3Rpb24KPiA+PiArICogQGZsYWdzOiB1YWNjZSBhdHRyaWJ1dGVzCj4gPj4g KyAqIEBkZXZfaWQ6IGlkIG9mIHRoZSB1YWNjZSBkZXZpY2UKPiA+PiArICogQHByb3Q6IHVhY2Nl IHByb3RlY3Rpb24gZmxhZwo+ID4+ICsgKiBAY2RldjogY2RldiBvZiB0aGUgdWFjY2UKPiA+PiAr ICogQGRldjogZGV2IG9mIHRoZSB1YWNjZQo+ID4+ICsgKiBAcHJpdjogcHJpdmF0ZSBwb2ludGVy IG9mIHRoZSB1YWNjZQo+ID4+ICsgKiBAcXM6IGxpc3QgaGVhZCBvZiBxdWV1ZS0+bGlzdAo+ID4+ ICsgKiBAcV9sb2NrOiBsb2NrIGZvciBxcwo+ID4+ICsgKi8KPiA+PiArc3RydWN0IHVhY2NlX2Rl dmljZSB7Cj4gPj4gKwljb25zdCBjaGFyICphbGdzOwo+ID4+ICsJY29uc3QgY2hhciAqYXBpX3Zl cjsKPiA+PiArCXVuc2lnbmVkIGxvbmcgcWZfcGdfc2l6ZVtVQUNDRV9RRlJUX01BWF07Cj4gPj4g KwlzdHJ1Y3QgdWFjY2Vfb3BzICpvcHM7ICAKPiA+IENhbiB3ZSBtYWtlIHRoaXMgb3BzIHN0cnVj dHVyZSBhIHBvaW50IHRvIGEgY29uc3RhbnQgc3RydWN0Pwo+ID4gSSdtIGd1ZXNzaW5nIGl0J2xs IGJlIGZpeGVkIGZvciBhIGdpdmVuIGRyaXZlci4gIAo+IE9LCj4gPiAgCj4gPj4gKwlzdHJ1Y3Qg ZGV2aWNlICpwZGV2OyAgCj4gPiBQZXJoYXBzIGp1c3QgY2FsbCBpdCBwYXJlbnQuIHBkZXYgd2ls bCBiZSBjb25mdXNpbmcgd2l0aAo+ID4gcGNpIGRldmljZXMuICAKPiBPSwo+ID4gIAo+ID4+ICsJ Ym9vbCBpc192ZjsKPiA+PiArCXUzMiBmbGFnczsKPiA+PiArCXUzMiBkZXZfaWQ7Cj4gPj4gKwl1 MzIgcHJvdDsKPiA+PiArCXN0cnVjdCBjZGV2ICpjZGV2OyAgCj4gPiBDYW4gd2UgZW1iZWQgdGhl IGNkZXYgc3RydWN0dXJlIHJhdGhlciB0aGFuIHVzZSBhIHBvaW50ZXIKPiA+IGFuZCBzZXBhcmF0 ZSBhbGxvY2F0aW9uPyAgCj4gTk8sIHdlIGNhbid0Lgo+IFdlIG9yaWdpbmFsbHkgZW1iZWQgdGhl IGNkZXYgc3RydWN0dXJlLCBhbmQgR3JlZyByZW1pbmRlZCB1cyB0aGVzZSB0d28gCj4gc3RydWN0 dXJlIGhhdmUgZGlmZmVyZW50IGxpZmV0aW1lLgo+IGh0dHBzOi8vbGttbC5vcmcvbGttbC8yMDE5 LzgvMjgvNzcxCgpPay4gRmFpciBlbm91Z2guCgoKPiA+PiArCXN0cnVjdCBkZXZpY2UgZGV2Owo+ ID4+ICsJdm9pZCAqcHJpdjsKPiA+PiArCXN0cnVjdCBsaXN0X2hlYWQgcXM7Cj4gPj4gKwlzdHJ1 Y3QgbXV0ZXggcV9sb2NrOwo+ID4+ICt9Owo+ID4+ICsKPiA+PiArI2lmIElTX0VOQUJMRUQoQ09O RklHX1VBQ0NFKQo+ID4+ICsKPiA+PiArc3RydWN0IHVhY2NlX2RldmljZSAqdWFjY2VfcmVnaXN0 ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAo+ID4+ICsJCQkJICAgIHN0cnVjdCB1YWNjZV9pbnRl cmZhY2UgKmludGVyZmFjZSk7Cj4gPj4gK3ZvaWQgdWFjY2VfdW5yZWdpc3RlcihzdHJ1Y3QgdWFj Y2VfZGV2aWNlICp1YWNjZSk7Cj4gPj4gKwo+ID4+ICsjZWxzZSAvKiBDT05GSUdfVUFDQ0UgKi8K PiA+PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUKPiA+PiArc3RydWN0IHVhY2NlX2RldmljZSAqdWFj Y2VfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAo+ID4+ICsJCQkJICAgIHN0cnVjdCB1 YWNjZV9pbnRlcmZhY2UgKmludGVyZmFjZSkKPiA+PiArewo+ID4+ICsJcmV0dXJuIEVSUl9QVFIo LUVOT0RFVik7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgdm9pZCB1YWNjZV91 bnJlZ2lzdGVyKHN0cnVjdCB1YWNjZV9kZXZpY2UgKnVhY2NlKSB7fQo+ID4+ICsKPiA+PiArI2Vu ZGlmIC8qIENPTkZJR19VQUNDRSAqLwo+ID4+ICsKPiA+PiArI2VuZGlmIC8qIF9MSU5VWF9VQUND RV9IICovCj4gPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9taXNjL3VhY2NlL3VhY2NlLmgg Yi9pbmNsdWRlL3VhcGkvbWlzYy91YWNjZS91YWNjZS5oCj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPiA+PiBpbmRleCAwMDAwMDAwLi5hNGY5Mzc4Cj4gPj4gLS0tIC9kZXYvbnVsbAo+ID4+ICsr KyBiL2luY2x1ZGUvdWFwaS9taXNjL3VhY2NlL3VhY2NlLmgKPiA+PiBAQCAtMCwwICsxLDM4IEBA Cj4gPj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKyBXSVRIIExpbnV4LXN5 c2NhbGwtbm90ZSAqLwo+ID4+ICsjaWZuZGVmIF9VQVBJVVVBQ0NFX0gKPiA+PiArI2RlZmluZSBf VUFQSVVVQUNDRV9ICj4gPj4gKwo+ID4+ICsjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KPiA+PiAr I2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Cj4gPj4gKwo+ID4+ICsvKiBVQUNDRV9DTURfU1RBUlRf UTogU3RhcnQgdGhlIHF1ZXVlICovCj4gPj4gKyNkZWZpbmUgVUFDQ0VfQ01EX1NUQVJUX1EJX0lP KCdXJywgMCkKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiBVQUNDRV9DTURfUFVUX1E6Cj4gPj4g KyAqIFVzZXIgYWN0aXZlbHkgc3RvcCBxdWV1ZSBhbmQgZnJlZSBxdWV1ZSByZXNvdXJjZSBpbW1l ZGlhdGVseQo+ID4+ICsgKiBPcHRpbWl6YXRpb24gbWV0aG9kIHNpbmNlIGNsb3NlIGZkIG1heSBk ZWxheQo+ID4+ICsgKi8KPiA+PiArI2RlZmluZSBVQUNDRV9DTURfUFVUX1EJCV9JTygnVycsIDEp Cj4gPj4gKwo+ID4+ICsvKioKPiA+PiArICogZW51bSB1YWNjZV9kZXZfZmxhZzogRGV2aWNlIGZs YWdzOgo+ID4+ICsgKiBAVUFDQ0VfREVWX1NWQTogU2hhcmVkIFZpcnR1YWwgQWRkcmVzc2VzCj4g Pj4gKyAqCQkgICBTdXBwb3J0IFBBU0lECj4gPj4gKyAqCQkgICBTdXBwb3J0IGRldmljZSBwYWdl IGZhdWx0cyAoUENJIFBSSSBvciBTTU1VIFN0YWxsKQo+ID4+ICsgKi8KPiA+PiArZW51bSB1YWNj ZV9kZXZfZmxhZyB7Cj4gPj4gKwlVQUNDRV9ERVZfU1ZBID0gQklUKDApLCAgCj4gPiBBcyBtZW50 aW9uZWQgaW4gZG9jcyByZXZpZXcsIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYW4gZW51bSB0byBt ZS4KPiA+IEp1c3QgdXNlICNkZWZpbmUgZm9yIHRoZSBiaXQgYW5kIGEgc3VpdGFibGUgc2l6ZWQg aW50ZWdlciBmb3IgYW55Cj4gPiBjYWxscyB1c2luZyBpdC4gIAo+IE9LLCBidXQgdGhlcmUgYXJl IHN0aWxsIG1vcmUgZmVhdHVyZXMgaW4gdGhlIGZ1dHVyZSBwYXRjaC4KVGhhdCdzIG5vdCB0aGUg aXNzdWUuICBBbiBlbnVtIHNob3VsZCAobW9yZSBvciBsZXNzKSB1c2UgY29uY3VycmVudCB2YWx1 ZXMuCgpBID0gMCwKQiA9IDEsCkMgPSAyLCBldGMKYW5kIGFuIGluc3RhbmNlIG9mIGl0IHNob3Vs ZCBvbmx5IHRha2Ugb25lIG9mIHRoZW0uCgpPbmNlIHlvdSBhcmUgdXNpbmcgaXQgYXMgdmFsdWVz IGZvciBhIGJpdG1hcCwgdGhlIHR5cGluZyBiZWNvbWVzIGlycmVsZXZhbnQKYXMgeW91IGNhbid0 IHJlYWxseSB1c2UgaXQgdG8gZW5mb3JjZSBhbnl0aGluZywgc28geW91IHNob3VsZCBqdXN0IHVz ZS4KCiNkZWZpbmUgVUFDQ0VfREVWX1NWQSBCSVQoMCkKI2RlZmluZSBVQUNDRV9ERVZfU09NRVRI SU5HIEJJVCgxKSBldGMKCj4gCj4gVGhhbmtzCj4gCgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KaW9tbXUgbWFpbGluZyBsaXN0CmlvbW11QGxpc3RzLmxp bnV4LWZvdW5kYXRpb24ub3JnCmh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0aW9uLm9yZy9tYWls bWFuL2xpc3RpbmZvL2lvbW11