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=-7.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS 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 CFE51C43381 for ; Mon, 11 Mar 2019 11:53:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7F130206BA for ; Mon, 11 Mar 2019 11:53:31 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="mYfcEw4P" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726997AbfCKLxa (ORCPT ); Mon, 11 Mar 2019 07:53:30 -0400 Received: from lelv0143.ext.ti.com ([198.47.23.248]:49854 "EHLO lelv0143.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725943AbfCKLx3 (ORCPT ); Mon, 11 Mar 2019 07:53:29 -0400 Received: from fllv0034.itg.ti.com ([10.64.40.246]) by lelv0143.ext.ti.com (8.15.2/8.15.2) with ESMTP id x2BBr6vc012471; Mon, 11 Mar 2019 06:53:06 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1552305186; bh=4AD7q6VH0JlLum+YxSd5OIv9aNKjKdGWUDPeC6XVuzU=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=mYfcEw4PzJdh/sBtgmb9oGeD+kGghRxFPK0rTdsjKizkdz2tVefvqzewbVykzRn8o p9VECWoMZUnIR8gZlIe97LhAT7a16u0I3qniE3M9yQmQuvnA4aU4X17FvUJHwo3IvM 1kfa2lfkX5s1KtlzNNzdJi8e5cXebY/I4Og61FmQ= Received: from DFLE104.ent.ti.com (dfle104.ent.ti.com [10.64.6.25]) by fllv0034.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x2BBr6RK107224 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 11 Mar 2019 06:53:06 -0500 Received: from DFLE101.ent.ti.com (10.64.6.22) by DFLE104.ent.ti.com (10.64.6.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1591.10; Mon, 11 Mar 2019 06:53:06 -0500 Received: from dlep32.itg.ti.com (157.170.170.100) by DFLE101.ent.ti.com (10.64.6.22) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1591.10 via Frontend Transport; Mon, 11 Mar 2019 06:53:06 -0500 Received: from [192.168.2.6] (ileax41-snat.itg.ti.com [10.172.224.153]) by dlep32.itg.ti.com (8.14.3/8.13.8) with ESMTP id x2BBr1T5031580; Mon, 11 Mar 2019 06:53:02 -0500 Subject: Re: [PATCH v4 5/6] usb:cdns3 Add Cadence USB3 DRD Driver To: Pawel Laszczak , "devicetree@vger.kernel.org" CC: "gregkh@linuxfoundation.org" , "felipe.balbi@linux.intel.com" , "mark.rutland@arm.com" , "linux-usb@vger.kernel.org" , "hdegoede@redhat.com" , "heikki.krogerus@linux.intel.com" , "andy.shevchenko@gmail.com" , "robh+dt@kernel.org" , "linux-kernel@vger.kernel.org" , "jbergsagel@ti.com" , "nsekhar@ti.com" , "nm@ti.com" , Suresh Punnoose , "peter.chen@nxp.com" , Rahul Kumar References: <1550173514-23573-1-git-send-email-pawell@cadence.com> <1550173514-23573-6-git-send-email-pawell@cadence.com> <3af305e0-40bf-28cc-48d5-4afa241e7899@ti.com> From: Roger Quadros Message-ID: Date: Mon, 11 Mar 2019 13:53:01 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Language: en-GB Content-Transfer-Encoding: 7bit X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07/03/2019 07:37, Pawel Laszczak wrote: > Hi, > >> Pawel, >> >> On 14/02/2019 21:45, Pawel Laszczak wrote: >>> This patch introduce new Cadence USBSS DRD driver to linux kernel. >>> >>> The Cadence USBSS DRD Driver is a highly configurable IP Core whichi >>> can be instantiated as Dual-Role Device (DRD), Peripheral Only and >>> Host Only (XHCI)configurations. >>> >>> The current driver has been validated with FPGA burned. We have support >>> for PCIe bus, which is used on FPGA prototyping. >>> >>> The host side of USBSS-DRD controller is compliance with XHCI >>> specification, so it works with standard XHCI linux driver. >>> >>> Signed-off-by: Pawel Laszczak >>> --- >>> drivers/usb/Kconfig | 2 + >>> drivers/usb/Makefile | 2 + >>> drivers/usb/cdns3/Kconfig | 44 + >>> drivers/usb/cdns3/Makefile | 14 + >>> drivers/usb/cdns3/cdns3-pci-wrap.c | 155 +++ >>> drivers/usb/cdns3/core.c | 403 ++++++ >>> drivers/usb/cdns3/core.h | 116 ++ >>> drivers/usb/cdns3/debug.h | 168 +++ >>> drivers/usb/cdns3/debugfs.c | 164 +++ >>> drivers/usb/cdns3/drd.c | 365 +++++ >>> drivers/usb/cdns3/drd.h | 162 +++ >>> drivers/usb/cdns3/ep0.c | 907 +++++++++++++ >>> drivers/usb/cdns3/gadget-export.h | 28 + >>> drivers/usb/cdns3/gadget.c | 2003 ++++++++++++++++++++++++++++ >>> drivers/usb/cdns3/gadget.h | 1207 +++++++++++++++++ >>> drivers/usb/cdns3/host-export.h | 28 + >>> drivers/usb/cdns3/host.c | 72 + >>> drivers/usb/cdns3/trace.c | 23 + >>> drivers/usb/cdns3/trace.h | 404 ++++++ >>> 19 files changed, 6267 insertions(+) >>> create mode 100644 drivers/usb/cdns3/Kconfig >>> create mode 100644 drivers/usb/cdns3/Makefile >>> create mode 100644 drivers/usb/cdns3/cdns3-pci-wrap.c >>> create mode 100644 drivers/usb/cdns3/core.c >>> create mode 100644 drivers/usb/cdns3/core.h >>> create mode 100644 drivers/usb/cdns3/debug.h >>> create mode 100644 drivers/usb/cdns3/debugfs.c >>> create mode 100644 drivers/usb/cdns3/drd.c >>> create mode 100644 drivers/usb/cdns3/drd.h >>> create mode 100644 drivers/usb/cdns3/ep0.c >>> create mode 100644 drivers/usb/cdns3/gadget-export.h >>> create mode 100644 drivers/usb/cdns3/gadget.c >>> create mode 100644 drivers/usb/cdns3/gadget.h >>> create mode 100644 drivers/usb/cdns3/host-export.h >>> create mode 100644 drivers/usb/cdns3/host.c >>> create mode 100644 drivers/usb/cdns3/trace.c >>> create mode 100644 drivers/usb/cdns3/trace.h >>> >>> diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig >>> index 987fc5ba6321..5f9334019d04 100644 >>> --- a/drivers/usb/Kconfig >>> +++ b/drivers/usb/Kconfig >>> @@ -112,6 +112,8 @@ source "drivers/usb/usbip/Kconfig" >>> >>> endif >>> >>> +source "drivers/usb/cdns3/Kconfig" >>> + >>> source "drivers/usb/mtu3/Kconfig" >>> >>> source "drivers/usb/musb/Kconfig" >>> diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile >>> index 7d1b8c82b208..ab125b966cac 100644 >>> --- a/drivers/usb/Makefile >>> +++ b/drivers/usb/Makefile >>> @@ -12,6 +12,8 @@ obj-$(CONFIG_USB_DWC3) += dwc3/ >>> obj-$(CONFIG_USB_DWC2) += dwc2/ >>> obj-$(CONFIG_USB_ISP1760) += isp1760/ >>> >>> +obj-$(CONFIG_USB_CDNS3) += cdns3/ >>> + >>> obj-$(CONFIG_USB_MON) += mon/ >>> obj-$(CONFIG_USB_MTU3) += mtu3/ >>> >>> diff --git a/drivers/usb/cdns3/Kconfig b/drivers/usb/cdns3/Kconfig >>> new file mode 100644 >>> index 000000000000..27cb3d8dbe3d >>> --- /dev/null >>> +++ b/drivers/usb/cdns3/Kconfig >>> @@ -0,0 +1,44 @@ >>> +config USB_CDNS3 >>> + tristate "Cadence USB3 Dual-Role Controller" >>> + depends on USB_SUPPORT && (USB || USB_GADGET) && HAS_DMA >>> + help >>> + Say Y here if your system has a cadence USB3 dual-role controller. >>> + It supports: dual-role switch, Host-only, and Peripheral-only. >>> + >>> + If you choose to build this driver is a dynamically linked >>> + as module, the module will be called cdns3.ko. >>> + >>> +if USB_CDNS3 >>> + >>> +config USB_CDNS3_GADGET >>> + bool "Cadence USB3 device controller" >>> + depends on USB_GADGET >>> + help >>> + Say Y here to enable device controller functionality of the >>> + cadence USBSS-DEV driver. >> >> "Cadence" ? >> >>> + >>> + This controller supports FF, HS and SS mode. It doesn't support >>> + LS and SSP mode. >>> + >>> +config USB_CDNS3_HOST >>> + bool "Cadence USB3 host controller" >>> + depends on USB_XHCI_HCD >>> + help >>> + Say Y here to enable host controller functionality of the >>> + cadence driver. >>> + >>> + Host controller is compliant with XHCI so it will use >>> + standard XHCI driver. >>> + >>> +config USB_CDNS3_PCI_WRAP >>> + tristate "Cadence USB3 support on PCIe-based platforms" >>> + depends on USB_PCI && ACPI >>> + default USB_CDNS3 >>> + help >>> + If you're using the USBSS Core IP with a PCIe, please say >>> + 'Y' or 'M' here. >>> + >>> + If you choose to build this driver as module it will >>> + be dynamically linked and module will be called cdns3-pci.ko >>> + >>> +endif >>> diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile >>> new file mode 100644 >>> index 000000000000..8f9438593375 >>> --- /dev/null >>> +++ b/drivers/usb/cdns3/Makefile >>> @@ -0,0 +1,14 @@ >>> +# SPDX-License-Identifier: GPL-2.0 >>> +# define_trace.h needs to know how to find our header >>> +CFLAGS_trace.o := -I$(src) >>> + >>> +cdns3-y := core.o drd.o trace.o >>> + >>> +obj-$(CONFIG_USB_CDNS3) += cdns3.o >>> +ifneq ($(CONFIG_DEBUG_FS),) >>> + cdns3-y += debugfs.o >>> +endif >>> + >>> +cdns3-$(CONFIG_USB_CDNS3_GADGET) += gadget.o ep0.o >>> +cdns3-$(CONFIG_USB_CDNS3_HOST) += host.o >>> +obj-$(CONFIG_USB_CDNS3_PCI_WRAP) += cdns3-pci-wrap.o >>> diff --git a/drivers/usb/cdns3/cdns3-pci-wrap.c b/drivers/usb/cdns3/cdns3-pci-wrap.c >>> new file mode 100644 >>> index 000000000000..d0b2d3d9b983 >>> --- /dev/null >>> +++ b/drivers/usb/cdns3/cdns3-pci-wrap.c >>> @@ -0,0 +1,155 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * Cadence USBSS PCI Glue driver >>> + * >>> + * Copyright (C) 2018 Cadence. >> >> 2018-2019? >> >>> + * >>> + * Author: Pawel Laszczak >>> + */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +struct cdns3_wrap { >>> + struct platform_device *plat_dev; >>> + struct pci_dev *hg_dev; >>> + struct resource dev_res[4]; >>> +}; >>> + >>> +struct cdns3_wrap wrap; >>> + >>> +#define RES_IRQ_ID 0 >>> +#define RES_HOST_ID 1 >>> +#define RES_DEV_ID 2 >>> +#define RES_DRD_ID 3 >>> + >>> +#define PCI_BAR_HOST 0 >>> +#define PCI_BAR_DEV 2 >>> +#define PCI_BAR_OTG 4 >>> + >>> +#define PCI_DEV_FN_HOST_DEVICE 0 >>> +#define PCI_DEV_FN_OTG 1 >>> + >>> +#define PCI_DRIVER_NAME "cdns3-pci-usbss" >>> +#define PLAT_DRIVER_NAME "cdns-usb3" >>> + >>> +#define CDNS_VENDOR_ID 0x17cd >>> +#define CDNS_DEVICE_ID 0x0100 >>> + >>> +/** >>> + * cdns3_pci_probe - Probe function for Cadence USB wrapper driver >>> + * @pdev: platform device object >>> + * @id: pci device id >>> + * >>> + * Returns 0 on success otherwise negative errno >>> + */ >>> +static int cdns3_pci_probe(struct pci_dev *pdev, >>> + const struct pci_device_id *id) >>> +{ >>> + struct platform_device_info plat_info; >>> + struct cdns3_wrap *wrap; >>> + struct resource *res; >>> + int err; >>> + >>> + /* >>> + * for GADGET/HOST PCI (devfn) function number is 0, >>> + * for OTG PCI (devfn) function number is 1 >>> + */ >>> + if (!id || pdev->devfn != PCI_DEV_FN_HOST_DEVICE) >>> + return -EINVAL; >>> + >>> + err = pcim_enable_device(pdev); >>> + if (err) { >>> + dev_err(&pdev->dev, "Enabling PCI device has failed %d\n", err); >>> + return err; >>> + } >>> + >>> + pci_set_master(pdev); >>> + wrap = devm_kzalloc(&pdev->dev, sizeof(*wrap), GFP_KERNEL); >>> + if (!wrap) { >>> + dev_err(&pdev->dev, "Failed to allocate memory\n"); >>> + return -ENOMEM; >>> + } >>> + >>> + /* function 0: host(BAR_0) + device(BAR_1) + otg(BAR_2)). */ >>> + memset(wrap->dev_res, 0x00, >>> + sizeof(struct resource) * ARRAY_SIZE(wrap->dev_res)); >>> + dev_dbg(&pdev->dev, "Initialize Device resources\n"); >>> + res = wrap->dev_res; >>> + >>> + res[RES_DEV_ID].start = pci_resource_start(pdev, PCI_BAR_DEV); >>> + res[RES_DEV_ID].end = pci_resource_end(pdev, PCI_BAR_DEV); >>> + res[RES_DEV_ID].name = "dev"; >>> + res[RES_DEV_ID].flags = IORESOURCE_MEM; >>> + dev_dbg(&pdev->dev, "USBSS-DEV physical base addr: %pa\n", >>> + &res[RES_DEV_ID].start); >>> + >>> + res[RES_HOST_ID].start = pci_resource_start(pdev, PCI_BAR_HOST); >>> + res[RES_HOST_ID].end = pci_resource_end(pdev, PCI_BAR_HOST); >>> + res[RES_HOST_ID].name = "xhci"; >>> + res[RES_HOST_ID].flags = IORESOURCE_MEM; >>> + dev_dbg(&pdev->dev, "USBSS-XHCI physical base addr: %pa\n", >>> + &res[RES_HOST_ID].start); >>> + >>> + res[RES_DRD_ID].start = pci_resource_start(pdev, PCI_BAR_OTG); >>> + res[RES_DRD_ID].end = pci_resource_end(pdev, PCI_BAR_OTG); >>> + res[RES_DRD_ID].name = "otg"; >>> + res[RES_DRD_ID].flags = IORESOURCE_MEM; >>> + dev_dbg(&pdev->dev, "USBSS-DRD physical base addr: %pa\n", >>> + &res[RES_DRD_ID].start); >>> + >>> + /* Interrupt common for both device and XHCI */ >>> + wrap->dev_res[RES_IRQ_ID].start = pdev->irq; >>> + wrap->dev_res[RES_IRQ_ID].name = "cdns3-irq"; >>> + wrap->dev_res[RES_IRQ_ID].flags = IORESOURCE_IRQ; >>> + >>> + /* set up platform device info */ >>> + memset(&plat_info, 0, sizeof(plat_info)); >>> + plat_info.parent = &pdev->dev; >>> + plat_info.fwnode = pdev->dev.fwnode; >>> + plat_info.name = PLAT_DRIVER_NAME; >>> + plat_info.id = pdev->devfn; >>> + plat_info.res = wrap->dev_res; >>> + plat_info.num_res = ARRAY_SIZE(wrap->dev_res); >>> + plat_info.dma_mask = pdev->dma_mask; >>> + >>> + /* register platform device */ >>> + wrap->plat_dev = platform_device_register_full(&plat_info); >>> + if (IS_ERR(wrap->plat_dev)) >>> + return PTR_ERR(wrap->plat_dev); >>> + >>> + pci_set_drvdata(pdev, wrap); >>> + >>> + return err; >>> +} >>> + >>> +void cdns3_pci_remove(struct pci_dev *pdev) >>> +{ >>> + struct cdns3_wrap *wrap = (struct cdns3_wrap *)pci_get_drvdata(pdev); >>> + >>> + platform_device_unregister(wrap->plat_dev); >>> +} >>> + >>> +static const struct pci_device_id cdns3_pci_ids[] = { >>> + { PCI_DEVICE(CDNS_VENDOR_ID, CDNS_DEVICE_ID), }, >>> + { 0, } >>> +}; >>> + >>> +static struct pci_driver cdns3_pci_driver = { >>> + .name = PCI_DRIVER_NAME, >>> + .id_table = cdns3_pci_ids, >>> + .probe = cdns3_pci_probe, >>> + .remove = cdns3_pci_remove, >>> +}; >>> + >>> +module_pci_driver(cdns3_pci_driver); >>> +MODULE_DEVICE_TABLE(pci, cdns3_pci_ids); >>> + >>> +MODULE_AUTHOR("Pawel Laszczak "); >>> +MODULE_LICENSE("GPL v2"); >>> +MODULE_DESCRIPTION("Cadence USBSS PCI wrapperr"); >>> + >>> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c >>> new file mode 100644 >>> index 000000000000..aa2f63241dab >>> --- /dev/null >>> +++ b/drivers/usb/cdns3/core.c >>> @@ -0,0 +1,403 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * Cadence USBSS DRD Driver. >>> + * >>> + * Copyright (C) 2018 Cadence. >>> + * Copyright (C) 2017-2018 NXP >>> + * >>> + * Author: Peter Chen >>> + * Pawel Laszczak >>> + */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include "gadget.h" >>> +#include "core.h" >>> +#include "host-export.h" >>> +#include "gadget-export.h" >>> +#include "drd.h" >>> +#include "debug.h" >>> + >>> +static inline >>> +struct cdns3_role_driver *cdns3_get_current_role_driver(struct cdns3 *cdns) >>> +{ >>> + WARN_ON(cdns->role >= CDNS3_ROLE_END || !cdns->roles[cdns->role]); >>> + return cdns->roles[cdns->role]; >>> +} >>> + >>> +static int cdns3_role_start(struct cdns3 *cdns, enum cdns3_roles role) >>> +{ >>> + int ret; >>> + >>> + if (WARN_ON(role >= CDNS3_ROLE_END)) >>> + return 0; >>> + >>> + if (!cdns->roles[role]) >>> + return -ENXIO; >>> + >>> + if (cdns->roles[role]->state == CDNS3_ROLE_STATE_ACTIVE) >>> + return 0; >>> + >>> + mutex_lock(&cdns->mutex); >>> + cdns->role = role; >>> + ret = cdns->roles[role]->start(cdns); >>> + if (!ret) >>> + cdns->roles[role]->state = CDNS3_ROLE_STATE_ACTIVE; >>> + mutex_unlock(&cdns->mutex); >>> + return ret; >>> +} >>> + >>> +void cdns3_role_stop(struct cdns3 *cdns) >>> +{ >>> + enum cdns3_roles role = cdns->role; >>> + >>> + if (role >= CDNS3_ROLE_END) { >>> + WARN_ON(role > CDNS3_ROLE_END); >>> + return; >>> + } >>> + >>> + if (cdns->roles[role]->state == CDNS3_ROLE_STATE_INACTIVE) >>> + return; >>> + >>> + mutex_lock(&cdns->mutex); >>> + cdns->roles[role]->stop(cdns); >>> + cdns->roles[role]->state = CDNS3_ROLE_STATE_INACTIVE; >>> + mutex_unlock(&cdns->mutex); >>> +} >>> + >>> +/* >>> + * cdns->role gets from cdns3_get_initial_role, and this API tells role at the >>> + * runtime. >>> + * If both roles are supported, the role is selected based on vbus/id. >>> + * It could be read from OTG register or external connector. >>> + * If only single role is supported, only one role structure >>> + * is allocated, cdns->roles[CDNS3_ROLE_HOST] or cdns->roles[CDNS3_ROLE_GADGET]. >>> + */ >>> +static enum cdns3_roles cdns3_get_initial_role(struct cdns3 *cdns) >>> +{ >>> + if (cdns->roles[CDNS3_ROLE_HOST] && cdns->roles[CDNS3_ROLE_GADGET]) { >>> + if (cdns3_is_host(cdns)) >>> + return CDNS3_ROLE_HOST; >>> + if (cdns3_is_device(cdns)) >>> + return CDNS3_ROLE_GADGET; >>> + } >>> + return cdns->roles[CDNS3_ROLE_HOST] >>> + ? CDNS3_ROLE_HOST >>> + : CDNS3_ROLE_GADGET; >>> +} >>> + >>> +static void cdns3_exit_roles(struct cdns3 *cdns) >>> +{ >>> + cdns3_role_stop(cdns); >>> + cdns3_drd_exit(cdns); >>> +} >>> + >>> +/** >>> + * cdns3_core_init_role - initialize role of operation >>> + * @cdns: Pointer to cdns3 structure >>> + * >>> + * Returns 0 on success otherwise negative errno >>> + */ >>> +static int cdns3_core_init_role(struct cdns3 *cdns) >>> +{ >>> + struct device *dev = cdns->dev; >>> + enum usb_dr_mode best_dr_mode; >>> + enum usb_dr_mode dr_mode; >>> + int ret = 0; >>> + >>> + dr_mode = usb_get_dr_mode(dev); >>> + cdns->role = CDNS3_ROLE_END; >>> + >>> + /* >>> + * If driver can't read mode by means of usb_get_dr_mdoe function then >> >> s/mdoe/mode >> >>> + * chooses mode according with Kernel configuration. This setting >>> + * can be restricted later depending on strap pin configuration. >>> + */ >>> + if (dr_mode == USB_DR_MODE_UNKNOWN) { >>> + if (IS_ENABLED(CONFIG_USB_CDNS3_HOST) && >>> + IS_ENABLED(CONFIG_USB_CDNS3_GADGET)) >>> + dr_mode = USB_DR_MODE_OTG; >>> + else if (IS_ENABLED(CONFIG_USB_CDNS3_HOST)) >>> + dr_mode = USB_DR_MODE_HOST; >>> + else if (IS_ENABLED(CONFIG_USB_CDNS3_GADGET)) >>> + dr_mode = USB_DR_MODE_PERIPHERAL; >>> + } >>> + >>> + best_dr_mode = USB_DR_MODE_OTG; >> >> Might be worth mentioning that cdns->dr_mode is strap configuration >> at this point. > I added such information. It could help in understanding code. >> >> What exactly are we trying to do here? >> My guess is that choosen dr_mode can be equal to or subset of strap configuration? >> > We have three possibility regarding dr_mode: > 1. It can be read from strap bits > 2. we have kernel configuration > 3. we can read it from dts. > > I assume that driver should select dr_mode considering these three settings. > >> Does this work? > >> >> if (cdns->dr_mode != USB_DR_MODE_OTG) { >> if (cdns->dr_mode != dr_mode) { >> dev_err(dev, "Incorrect dr_mode configuration: strap %d: requested %d\n", >> cdns->dr_mode, dr_mode); >> } >> } >> >> At this point, dr_mode contains the mode we need to use. > > I don't understand. Do you want to replace below block with above condition ? Yes. > If yes, what with case cdns->dr_mode = USB_DR_MODE_OTG (strap configuration) > and dr_mode = USB_DR_MODE_HOST (Kernel configuration). > I think that in this case driver should limit cdns->dr_mode to USB_DR_MODE_HOST > because gadget driver is disabled. You are right. It won't work there. > Of course we can also consider such case as incorrect kernel configuration. No. It is correct. I was thinking if we can get rid of best_dr_mode variable entirely, but nevermind. > >> >>> + >>> + if (dr_mode == USB_DR_MODE_OTG) { >>> + best_dr_mode = cdns->dr_mode; I think this is wrong. Why do you want to limit to strap configuration when user wants it to be in OTG? >>> + } else if (cdns->dr_mode == USB_DR_MODE_OTG) { >>> + best_dr_mode = dr_mode; >>> + } else if (cdns->dr_mode != dr_mode) { >>> + dev_err(dev, "Incorrect DRD configuration\n"); >>> + return -EINVAL; >>> + } >>> + >>> + dr_mode = best_dr_mode; >>> + >>> + if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_HOST) { >>> + ret = cdns3_host_init(cdns); >>> + if (ret) { >>> + dev_err(dev, "Host initialization failed with %d\n", >>> + ret); >>> + goto err; >>> + } >>> + } >>> + >>> + if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_PERIPHERAL) { >>> + ret = cdns3_gadget_init(cdns); >>> + if (ret) { >>> + dev_err(dev, "Device initialization failed with %d\n", >>> + ret); >>> + goto err; >>> + } >>> + }> + >>> + cdns->desired_dr_mode = dr_mode; >>> + cdns->dr_mode = dr_mode; >>> + /* >>> + * dr_mode could be change so DRD must update controller >> >> "desired_dr_mode might have changed so we need to update the controller configuration"? > > Sounds better. > -- cheers, -roger Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v4,5/6] usb:cdns3 Add Cadence USB3 DRD Driver From: Roger Quadros Message-Id: Date: Mon, 11 Mar 2019 13:53:01 +0200 To: Pawel Laszczak , "devicetree@vger.kernel.org" Cc: "gregkh@linuxfoundation.org" , "felipe.balbi@linux.intel.com" , "mark.rutland@arm.com" , "linux-usb@vger.kernel.org" , "hdegoede@redhat.com" , "heikki.krogerus@linux.intel.com" , "andy.shevchenko@gmail.com" , "robh+dt@kernel.org" , "linux-kernel@vger.kernel.org" , "jbergsagel@ti.com" , "nsekhar@ti.com" , "nm@ti.com" , Suresh Punnoose , "peter.chen@nxp.com" , Rahul Kumar List-ID: T24gMDcvMDMvMjAxOSAwNzozNywgUGF3ZWwgTGFzemN6YWsgd3JvdGU6Cj4gSGksCj4gCj4+IFBh d2VsLAo+Pgo+PiBPbiAxNC8wMi8yMDE5IDIxOjQ1LCBQYXdlbCBMYXN6Y3phayB3cm90ZToKPj4+ IFRoaXMgcGF0Y2ggaW50cm9kdWNlIG5ldyBDYWRlbmNlIFVTQlNTIERSRCBkcml2ZXIgdG8gbGlu dXgga2VybmVsLgo+Pj4KPj4+IFRoZSBDYWRlbmNlIFVTQlNTIERSRCBEcml2ZXIgaXMgYSBoaWdo bHkgY29uZmlndXJhYmxlIElQIENvcmUgd2hpY2hpCj4+PiBjYW4gYmUgaW5zdGFudGlhdGVkIGFz IER1YWwtUm9sZSBEZXZpY2UgKERSRCksIFBlcmlwaGVyYWwgT25seSBhbmQKPj4+IEhvc3QgT25s eSAoWEhDSSljb25maWd1cmF0aW9ucy4KPj4+Cj4+PiBUaGUgY3VycmVudCBkcml2ZXIgaGFzIGJl ZW4gdmFsaWRhdGVkIHdpdGggRlBHQSBidXJuZWQuIFdlIGhhdmUgc3VwcG9ydAo+Pj4gZm9yIFBD SWUgYnVzLCB3aGljaCBpcyB1c2VkIG9uIEZQR0EgcHJvdG90eXBpbmcuCj4+Pgo+Pj4gVGhlIGhv c3Qgc2lkZSBvZiBVU0JTUy1EUkQgY29udHJvbGxlciBpcyBjb21wbGlhbmNlIHdpdGggWEhDSQo+ Pj4gc3BlY2lmaWNhdGlvbiwgc28gaXQgd29ya3Mgd2l0aCBzdGFuZGFyZCBYSENJIGxpbnV4IGRy aXZlci4KPj4+Cj4+PiBTaWduZWQtb2ZmLWJ5OiBQYXdlbCBMYXN6Y3phayA8cGF3ZWxsQGNhZGVu Y2UuY29tPgo+Pj4gLS0tCj4+PiAgZHJpdmVycy91c2IvS2NvbmZpZyAgICAgICAgICAgICAgICB8 ICAgIDIgKwo+Pj4gIGRyaXZlcnMvdXNiL01ha2VmaWxlICAgICAgICAgICAgICAgfCAgICAyICsK Pj4+ICBkcml2ZXJzL3VzYi9jZG5zMy9LY29uZmlnICAgICAgICAgIHwgICA0NCArCj4+PiAgZHJp dmVycy91c2IvY2RuczMvTWFrZWZpbGUgICAgICAgICB8ICAgMTQgKwo+Pj4gIGRyaXZlcnMvdXNi L2NkbnMzL2NkbnMzLXBjaS13cmFwLmMgfCAgMTU1ICsrKwo+Pj4gIGRyaXZlcnMvdXNiL2NkbnMz L2NvcmUuYyAgICAgICAgICAgfCAgNDAzICsrKysrKwo+Pj4gIGRyaXZlcnMvdXNiL2NkbnMzL2Nv cmUuaCAgICAgICAgICAgfCAgMTE2ICsrCj4+PiAgZHJpdmVycy91c2IvY2RuczMvZGVidWcuaCAg ICAgICAgICB8ICAxNjggKysrCj4+PiAgZHJpdmVycy91c2IvY2RuczMvZGVidWdmcy5jICAgICAg ICB8ICAxNjQgKysrCj4+PiAgZHJpdmVycy91c2IvY2RuczMvZHJkLmMgICAgICAgICAgICB8ICAz NjUgKysrKysKPj4+ICBkcml2ZXJzL3VzYi9jZG5zMy9kcmQuaCAgICAgICAgICAgIHwgIDE2MiAr KysKPj4+ICBkcml2ZXJzL3VzYi9jZG5zMy9lcDAuYyAgICAgICAgICAgIHwgIDkwNyArKysrKysr KysrKysrCj4+PiAgZHJpdmVycy91c2IvY2RuczMvZ2FkZ2V0LWV4cG9ydC5oICB8ICAgMjggKwo+ Pj4gIGRyaXZlcnMvdXNiL2NkbnMzL2dhZGdldC5jICAgICAgICAgfCAyMDAzICsrKysrKysrKysr KysrKysrKysrKysrKysrKysKPj4+ICBkcml2ZXJzL3VzYi9jZG5zMy9nYWRnZXQuaCAgICAgICAg IHwgMTIwNyArKysrKysrKysrKysrKysrKwo+Pj4gIGRyaXZlcnMvdXNiL2NkbnMzL2hvc3QtZXhw b3J0LmggICAgfCAgIDI4ICsKPj4+ICBkcml2ZXJzL3VzYi9jZG5zMy9ob3N0LmMgICAgICAgICAg IHwgICA3MiArCj4+PiAgZHJpdmVycy91c2IvY2RuczMvdHJhY2UuYyAgICAgICAgICB8ICAgMjMg Kwo+Pj4gIGRyaXZlcnMvdXNiL2NkbnMzL3RyYWNlLmggICAgICAgICAgfCAgNDA0ICsrKysrKwo+ Pj4gIDE5IGZpbGVzIGNoYW5nZWQsIDYyNjcgaW5zZXJ0aW9ucygrKQo+Pj4gIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL3VzYi9jZG5zMy9LY29uZmlnCj4+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvdXNiL2NkbnMzL01ha2VmaWxlCj4+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvdXNiL2NkbnMzL2NkbnMzLXBjaS13cmFwLmMKPj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy91c2IvY2RuczMvY29yZS5jCj4+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNi L2NkbnMzL2NvcmUuaAo+Pj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9jZG5zMy9k ZWJ1Zy5oCj4+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2NkbnMzL2RlYnVnZnMu Ywo+Pj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9jZG5zMy9kcmQuYwo+Pj4gIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9jZG5zMy9kcmQuaAo+Pj4gIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL3VzYi9jZG5zMy9lcDAuYwo+Pj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL3VzYi9jZG5zMy9nYWRnZXQtZXhwb3J0LmgKPj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy91c2IvY2RuczMvZ2FkZ2V0LmMKPj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy91c2IvY2RuczMvZ2FkZ2V0LmgKPj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2Iv Y2RuczMvaG9zdC1leHBvcnQuaAo+Pj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9j ZG5zMy9ob3N0LmMKPj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvY2RuczMvdHJh Y2UuYwo+Pj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9jZG5zMy90cmFjZS5oCj4+ Pgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9LY29u ZmlnCj4+PiBpbmRleCA5ODdmYzViYTYzMjEuLjVmOTMzNDAxOWQwNCAxMDA2NDQKPj4+IC0tLSBh L2RyaXZlcnMvdXNiL0tjb25maWcKPj4+ICsrKyBiL2RyaXZlcnMvdXNiL0tjb25maWcKPj4+IEBA IC0xMTIsNiArMTEyLDggQEAgc291cmNlICJkcml2ZXJzL3VzYi91c2JpcC9LY29uZmlnIgo+Pj4K Pj4+ICBlbmRpZgo+Pj4KPj4+ICtzb3VyY2UgImRyaXZlcnMvdXNiL2NkbnMzL0tjb25maWciCj4+ PiArCj4+PiAgc291cmNlICJkcml2ZXJzL3VzYi9tdHUzL0tjb25maWciCj4+Pgo+Pj4gIHNvdXJj ZSAiZHJpdmVycy91c2IvbXVzYi9LY29uZmlnIgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNi L01ha2VmaWxlIGIvZHJpdmVycy91c2IvTWFrZWZpbGUKPj4+IGluZGV4IDdkMWI4YzgyYjIwOC4u YWIxMjViOTY2Y2FjIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy91c2IvTWFrZWZpbGUKPj4+ICsr KyBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCj4+PiBAQCAtMTIsNiArMTIsOCBAQCBvYmotJChDT05G SUdfVVNCX0RXQzMpCQkrPSBkd2MzLwo+Pj4gIG9iai0kKENPTkZJR19VU0JfRFdDMikJCSs9IGR3 YzIvCj4+PiAgb2JqLSQoQ09ORklHX1VTQl9JU1AxNzYwKQkrPSBpc3AxNzYwLwo+Pj4KPj4+ICtv YmotJChDT05GSUdfVVNCX0NETlMzKQkJKz0gY2RuczMvCj4+PiArCj4+PiAgb2JqLSQoQ09ORklH X1VTQl9NT04pCQkrPSBtb24vCj4+PiAgb2JqLSQoQ09ORklHX1VTQl9NVFUzKQkJKz0gbXR1My8K Pj4+Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2RuczMvS2NvbmZpZyBiL2RyaXZlcnMv dXNiL2NkbnMzL0tjb25maWcKPj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+PiBpbmRleCAwMDAw MDAwMDAwMDAuLjI3Y2IzZDhkYmUzZAo+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvZHJpdmVy cy91c2IvY2RuczMvS2NvbmZpZwo+Pj4gQEAgLTAsMCArMSw0NCBAQAo+Pj4gK2NvbmZpZyBVU0Jf Q0ROUzMKPj4+ICsJdHJpc3RhdGUgIkNhZGVuY2UgVVNCMyBEdWFsLVJvbGUgQ29udHJvbGxlciIK Pj4+ICsJZGVwZW5kcyBvbiBVU0JfU1VQUE9SVCAmJiAoVVNCIHx8IFVTQl9HQURHRVQpICYmIEhB U19ETUEKPj4+ICsJaGVscAo+Pj4gKwkgIFNheSBZIGhlcmUgaWYgeW91ciBzeXN0ZW0gaGFzIGEg Y2FkZW5jZSBVU0IzIGR1YWwtcm9sZSBjb250cm9sbGVyLgo+Pj4gKwkgIEl0IHN1cHBvcnRzOiBk dWFsLXJvbGUgc3dpdGNoLCBIb3N0LW9ubHksIGFuZCBQZXJpcGhlcmFsLW9ubHkuCj4+PiArCj4+ PiArCSAgSWYgeW91IGNob29zZSB0byBidWlsZCB0aGlzIGRyaXZlciBpcyBhIGR5bmFtaWNhbGx5 IGxpbmtlZAo+Pj4gKwkgIGFzIG1vZHVsZSwgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjZG5z My5rby4KPj4+ICsKPj4+ICtpZiBVU0JfQ0ROUzMKPj4+ICsKPj4+ICtjb25maWcgVVNCX0NETlMz X0dBREdFVAo+Pj4gKyAgICAgICAgYm9vbCAiQ2FkZW5jZSBVU0IzIGRldmljZSBjb250cm9sbGVy Igo+Pj4gKyAgICAgICAgZGVwZW5kcyBvbiBVU0JfR0FER0VUCj4+PiArICAgICAgICBoZWxwCj4+ PiArICAgICAgICAgIFNheSBZIGhlcmUgdG8gZW5hYmxlIGRldmljZSBjb250cm9sbGVyIGZ1bmN0 aW9uYWxpdHkgb2YgdGhlCj4+PiArICAgICAgICAgIGNhZGVuY2UgVVNCU1MtREVWIGRyaXZlci4K Pj4KPj4gIkNhZGVuY2UiID8KPj4KPj4+ICsKPj4+ICsgICAgICAgICAgVGhpcyBjb250cm9sbGVy IHN1cHBvcnRzIEZGLCBIUyBhbmQgU1MgbW9kZS4gSXQgZG9lc24ndCBzdXBwb3J0Cj4+PiArICAg ICAgICAgIExTIGFuZCBTU1AgbW9kZS4KPj4+ICsKPj4+ICtjb25maWcgVVNCX0NETlMzX0hPU1QK Pj4+ICsgICAgICAgIGJvb2wgIkNhZGVuY2UgVVNCMyBob3N0IGNvbnRyb2xsZXIiCj4+PiArICAg ICAgICBkZXBlbmRzIG9uIFVTQl9YSENJX0hDRAo+Pj4gKyAgICAgICAgaGVscAo+Pj4gKyAgICAg ICAgICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBob3N0IGNvbnRyb2xsZXIgZnVuY3Rpb25hbGl0eSBv ZiB0aGUKPj4+ICsgICAgICAgICAgY2FkZW5jZSBkcml2ZXIuCj4+PiArCj4+PiArICAgICAgICAg IEhvc3QgY29udHJvbGxlciBpcyBjb21wbGlhbnQgd2l0aCBYSENJIHNvIGl0IHdpbGwgdXNlCj4+ PiArICAgICAgICAgIHN0YW5kYXJkIFhIQ0kgZHJpdmVyLgo+Pj4gKwo+Pj4gK2NvbmZpZyBVU0Jf Q0ROUzNfUENJX1dSQVAKPj4+ICsJdHJpc3RhdGUgIkNhZGVuY2UgVVNCMyBzdXBwb3J0IG9uIFBD SWUtYmFzZWQgcGxhdGZvcm1zIgo+Pj4gKwlkZXBlbmRzIG9uIFVTQl9QQ0kgJiYgQUNQSQo+Pj4g KwlkZWZhdWx0IFVTQl9DRE5TMwo+Pj4gKwloZWxwCj4+PiArCSAgSWYgeW91J3JlIHVzaW5nIHRo ZSBVU0JTUyBDb3JlIElQIHdpdGggYSBQQ0llLCBwbGVhc2Ugc2F5Cj4+PiArCSAgJ1knIG9yICdN JyBoZXJlLgo+Pj4gKwo+Pj4gKwkgIElmIHlvdSBjaG9vc2UgdG8gYnVpbGQgdGhpcyBkcml2ZXIg YXMgbW9kdWxlIGl0IHdpbGwKPj4+ICsJICBiZSBkeW5hbWljYWxseSBsaW5rZWQgYW5kIG1vZHVs ZSB3aWxsIGJlIGNhbGxlZCBjZG5zMy1wY2kua28KPj4+ICsKPj4+ICtlbmRpZgo+Pj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvdXNiL2NkbnMzL01ha2VmaWxlIGIvZHJpdmVycy91c2IvY2RuczMvTWFr ZWZpbGUKPj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+PiBpbmRleCAwMDAwMDAwMDAwMDAuLjhm OTQzODU5MzM3NQo+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvZHJpdmVycy91c2IvY2RuczMv TWFrZWZpbGUKPj4+IEBAIC0wLDAgKzEsMTQgQEAKPj4+ICsjIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wCj4+PiArIyBkZWZpbmVfdHJhY2UuaCBuZWVkcyB0byBrbm93IGhvdyB0byBm aW5kIG91ciBoZWFkZXIKPj4+ICtDRkxBR1NfdHJhY2UubwkJCQk6PSAtSSQoc3JjKQo+Pj4gKwo+ Pj4gK2NkbnMzLXkJCQkJCTo9IGNvcmUubyBkcmQubyB0cmFjZS5vCj4+PiArCj4+PiArb2JqLSQo Q09ORklHX1VTQl9DRE5TMykJCQkrPSBjZG5zMy5vCj4+PiAraWZuZXEgKCQoQ09ORklHX0RFQlVH X0ZTKSwpCj4+PiArCWNkbnMzLXkJCQkJKz0gZGVidWdmcy5vCj4+PiArZW5kaWYKPj4+ICsKPj4+ ICtjZG5zMy0kKENPTkZJR19VU0JfQ0ROUzNfR0FER0VUKQkrPSBnYWRnZXQubyBlcDAubwo+Pj4g K2NkbnMzLSQoQ09ORklHX1VTQl9DRE5TM19IT1NUKQkJKz0gaG9zdC5vCj4+PiArb2JqLSQoQ09O RklHX1VTQl9DRE5TM19QQ0lfV1JBUCkJKz0gY2RuczMtcGNpLXdyYXAubwo+Pj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvdXNiL2NkbnMzL2NkbnMzLXBjaS13cmFwLmMgYi9kcml2ZXJzL3VzYi9jZG5z My9jZG5zMy1wY2ktd3JhcC5jCj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAw MDAwMDAwMDAwLi5kMGIyZDNkOWI5ODMKPj4+IC0tLSAvZGV2L251bGwKPj4+ICsrKyBiL2RyaXZl cnMvdXNiL2NkbnMzL2NkbnMzLXBjaS13cmFwLmMKPj4+IEBAIC0wLDAgKzEsMTU1IEBACj4+PiAr Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPj4+ICsvKgo+Pj4gKyAqIENhZGVu Y2UgVVNCU1MgUENJIEdsdWUgZHJpdmVyCj4+PiArICoKPj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIw MTggQ2FkZW5jZS4KPj4KPj4gMjAxOC0yMDE5Pwo+Pgo+Pj4gKyAqCj4+PiArICogQXV0aG9yOiBQ YXdlbCBMYXN6Y3phayA8cGF3ZWxsQGNhZGVuY2UuY29tPgo+Pj4gKyAqLwo+Pj4gKwo+Pj4gKyNp bmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4+ PiArI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9k ZXZpY2UuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KPj4+ICsjaW5jbHVk ZSA8bGludXgvc2xhYi5oPgo+Pj4gKwo+Pj4gK3N0cnVjdCBjZG5zM193cmFwIHsKPj4+ICsJc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9kZXY7Cj4+PiArCXN0cnVjdCBwY2lfZGV2ICpoZ19k ZXY7Cj4+PiArCXN0cnVjdCByZXNvdXJjZSBkZXZfcmVzWzRdOwo+Pj4gK307Cj4+PiArCj4+PiAr c3RydWN0IGNkbnMzX3dyYXAgd3JhcDsKPj4+ICsKPj4+ICsjZGVmaW5lIFJFU19JUlFfSUQJCTAK Pj4+ICsjZGVmaW5lIFJFU19IT1NUX0lECQkxCj4+PiArI2RlZmluZSBSRVNfREVWX0lECQkyCj4+ PiArI2RlZmluZSBSRVNfRFJEX0lECQkzCj4+PiArCj4+PiArI2RlZmluZSBQQ0lfQkFSX0hPU1QJ CTAKPj4+ICsjZGVmaW5lIFBDSV9CQVJfREVWCQkyCj4+PiArI2RlZmluZSBQQ0lfQkFSX09URwkJ NAo+Pj4gKwo+Pj4gKyNkZWZpbmUgUENJX0RFVl9GTl9IT1NUX0RFVklDRQkwCj4+PiArI2RlZmlu ZSBQQ0lfREVWX0ZOX09URwkJMQo+Pj4gKwo+Pj4gKyNkZWZpbmUgUENJX0RSSVZFUl9OQU1FCQki Y2RuczMtcGNpLXVzYnNzIgo+Pj4gKyNkZWZpbmUgUExBVF9EUklWRVJfTkFNRQkiY2Rucy11c2Iz Igo+Pj4gKwo+Pj4gKyNkZWZpbmUgQ0ROU19WRU5ET1JfSUQgMHgxN2NkCj4+PiArI2RlZmluZSBD RE5TX0RFVklDRV9JRCAweDAxMDAKPj4+ICsKPj4+ICsvKioKPj4+ICsgKiBjZG5zM19wY2lfcHJv YmUgLSBQcm9iZSBmdW5jdGlvbiBmb3IgQ2FkZW5jZSBVU0Igd3JhcHBlciBkcml2ZXIKPj4+ICsg KiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIG9iamVjdAo+Pj4gKyAqIEBpZDogcGNpIGRldmljZSBp ZAo+Pj4gKyAqCj4+PiArICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIG5lZ2F0aXZl IGVycm5vCj4+PiArICovCj4+PiArc3RhdGljIGludCBjZG5zM19wY2lfcHJvYmUoc3RydWN0IHBj aV9kZXYgKnBkZXYsCj4+PiArCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQo+ Pj4gK3sKPj4+ICsJc3RydWN0IHBsYXRmb3JtX2RldmljZV9pbmZvIHBsYXRfaW5mbzsKPj4+ICsJ c3RydWN0IGNkbnMzX3dyYXAgKndyYXA7Cj4+PiArCXN0cnVjdCByZXNvdXJjZSAqcmVzOwo+Pj4g KwlpbnQgZXJyOwo+Pj4gKwo+Pj4gKwkvKgo+Pj4gKwkgKiBmb3IgR0FER0VUL0hPU1QgUENJIChk ZXZmbikgZnVuY3Rpb24gbnVtYmVyIGlzIDAsCj4+PiArCSAqIGZvciBPVEcgUENJIChkZXZmbikg ZnVuY3Rpb24gbnVtYmVyIGlzIDEKPj4+ICsJICovCj4+PiArCWlmICghaWQgfHwgcGRldi0+ZGV2 Zm4gIT0gUENJX0RFVl9GTl9IT1NUX0RFVklDRSkKPj4+ICsJCXJldHVybiAtRUlOVkFMOwo+Pj4g Kwo+Pj4gKwllcnIgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7Cj4+PiArCWlmIChlcnIpIHsK Pj4+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVuYWJsaW5nIFBDSSBkZXZpY2UgaGFzIGZhaWxl ZCAlZFxuIiwgZXJyKTsKPj4+ICsJCXJldHVybiBlcnI7Cj4+PiArCX0KPj4+ICsKPj4+ICsJcGNp X3NldF9tYXN0ZXIocGRldik7Cj4+PiArCXdyYXAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwg c2l6ZW9mKCp3cmFwKSwgR0ZQX0tFUk5FTCk7Cj4+PiArCWlmICghd3JhcCkgewo+Pj4gKwkJZGV2 X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7Cj4+PiArCQly ZXR1cm4gLUVOT01FTTsKPj4+ICsJfQo+Pj4gKwo+Pj4gKwkvKiBmdW5jdGlvbiAwOiBob3N0KEJB Ul8wKSArIGRldmljZShCQVJfMSkgKyBvdGcoQkFSXzIpKS4gKi8KPj4+ICsJbWVtc2V0KHdyYXAt PmRldl9yZXMsIDB4MDAsCj4+PiArCSAgICAgICBzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIEFS UkFZX1NJWkUod3JhcC0+ZGV2X3JlcykpOwo+Pj4gKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJJbml0 aWFsaXplIERldmljZSByZXNvdXJjZXNcbiIpOwo+Pj4gKwlyZXMgPSB3cmFwLT5kZXZfcmVzOwo+ Pj4gKwo+Pj4gKwlyZXNbUkVTX0RFVl9JRF0uc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRl diwgUENJX0JBUl9ERVYpOwo+Pj4gKwlyZXNbUkVTX0RFVl9JRF0uZW5kID0gICBwY2lfcmVzb3Vy Y2VfZW5kKHBkZXYsIFBDSV9CQVJfREVWKTsKPj4+ICsJcmVzW1JFU19ERVZfSURdLm5hbWUgPSAi ZGV2IjsKPj4+ICsJcmVzW1JFU19ERVZfSURdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Cj4+PiAr CWRldl9kYmcoJnBkZXYtPmRldiwgIlVTQlNTLURFViBwaHlzaWNhbCBiYXNlIGFkZHI6ICVwYVxu IiwKPj4+ICsJCSZyZXNbUkVTX0RFVl9JRF0uc3RhcnQpOwo+Pj4gKwo+Pj4gKwlyZXNbUkVTX0hP U1RfSURdLnN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFBDSV9CQVJfSE9TVCk7Cj4+ PiArCXJlc1tSRVNfSE9TVF9JRF0uZW5kID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCBQQ0lfQkFS X0hPU1QpOwo+Pj4gKwlyZXNbUkVTX0hPU1RfSURdLm5hbWUgPSAieGhjaSI7Cj4+PiArCXJlc1tS RVNfSE9TVF9JRF0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKPj4+ICsJZGV2X2RiZygmcGRldi0+ ZGV2LCAiVVNCU1MtWEhDSSBwaHlzaWNhbCBiYXNlIGFkZHI6ICVwYVxuIiwKPj4+ICsJCSZyZXNb UkVTX0hPU1RfSURdLnN0YXJ0KTsKPj4+ICsKPj4+ICsJcmVzW1JFU19EUkRfSURdLnN0YXJ0ID0g cGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFBDSV9CQVJfT1RHKTsKPj4+ICsJcmVzW1JFU19EUkRf SURdLmVuZCA9ICAgcGNpX3Jlc291cmNlX2VuZChwZGV2LCBQQ0lfQkFSX09URyk7Cj4+PiArCXJl c1tSRVNfRFJEX0lEXS5uYW1lID0gIm90ZyI7Cj4+PiArCXJlc1tSRVNfRFJEX0lEXS5mbGFncyA9 IElPUkVTT1VSQ0VfTUVNOwo+Pj4gKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJVU0JTUy1EUkQgcGh5 c2ljYWwgYmFzZSBhZGRyOiAlcGFcbiIsCj4+PiArCQkmcmVzW1JFU19EUkRfSURdLnN0YXJ0KTsK Pj4+ICsKPj4+ICsJLyogSW50ZXJydXB0IGNvbW1vbiBmb3IgYm90aCBkZXZpY2UgYW5kIFhIQ0kg Ki8KPj4+ICsJd3JhcC0+ZGV2X3Jlc1tSRVNfSVJRX0lEXS5zdGFydCA9IHBkZXYtPmlycTsKPj4+ ICsJd3JhcC0+ZGV2X3Jlc1tSRVNfSVJRX0lEXS5uYW1lID0gImNkbnMzLWlycSI7Cj4+PiArCXdy YXAtPmRldl9yZXNbUkVTX0lSUV9JRF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKPj4+ICsKPj4+ ICsJLyogc2V0IHVwIHBsYXRmb3JtIGRldmljZSBpbmZvICovCj4+PiArCW1lbXNldCgmcGxhdF9p bmZvLCAwLCBzaXplb2YocGxhdF9pbmZvKSk7Cj4+PiArCXBsYXRfaW5mby5wYXJlbnQgPSAmcGRl di0+ZGV2Owo+Pj4gKwlwbGF0X2luZm8uZndub2RlID0gcGRldi0+ZGV2LmZ3bm9kZTsKPj4+ICsJ cGxhdF9pbmZvLm5hbWUgPSBQTEFUX0RSSVZFUl9OQU1FOwo+Pj4gKwlwbGF0X2luZm8uaWQgPSBw ZGV2LT5kZXZmbjsKPj4+ICsJcGxhdF9pbmZvLnJlcyA9IHdyYXAtPmRldl9yZXM7Cj4+PiArCXBs YXRfaW5mby5udW1fcmVzID0gQVJSQVlfU0laRSh3cmFwLT5kZXZfcmVzKTsKPj4+ICsJcGxhdF9p bmZvLmRtYV9tYXNrID0gcGRldi0+ZG1hX21hc2s7Cj4+PiArCj4+PiArCS8qIHJlZ2lzdGVyIHBs YXRmb3JtIGRldmljZSAqLwo+Pj4gKwl3cmFwLT5wbGF0X2RldiA9IHBsYXRmb3JtX2RldmljZV9y ZWdpc3Rlcl9mdWxsKCZwbGF0X2luZm8pOwo+Pj4gKwlpZiAoSVNfRVJSKHdyYXAtPnBsYXRfZGV2 KSkKPj4+ICsJCXJldHVybiBQVFJfRVJSKHdyYXAtPnBsYXRfZGV2KTsKPj4+ICsKPj4+ICsJcGNp X3NldF9kcnZkYXRhKHBkZXYsIHdyYXApOwo+Pj4gKwo+Pj4gKwlyZXR1cm4gZXJyOwo+Pj4gK30K Pj4+ICsKPj4+ICt2b2lkIGNkbnMzX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCj4+ PiArewo+Pj4gKwlzdHJ1Y3QgY2RuczNfd3JhcCAqd3JhcCA9IChzdHJ1Y3QgY2RuczNfd3JhcCAq KXBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKPj4+ICsKPj4+ICsJcGxhdGZvcm1fZGV2aWNlX3VucmVn aXN0ZXIod3JhcC0+cGxhdF9kZXYpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHBjaV9kZXZpY2VfaWQgY2RuczNfcGNpX2lkc1tdID0gewo+Pj4gKwl7IFBDSV9ERVZJQ0Uo Q0ROU19WRU5ET1JfSUQsIENETlNfREVWSUNFX0lEKSwgfSwKPj4+ICsJeyAwLCB9Cj4+PiArfTsK Pj4+ICsKPj4+ICtzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY2RuczNfcGNpX2RyaXZlciA9IHsK Pj4+ICsJLm5hbWUgPSBQQ0lfRFJJVkVSX05BTUUsCj4+PiArCS5pZF90YWJsZSA9IGNkbnMzX3Bj aV9pZHMsCj4+PiArCS5wcm9iZSA9IGNkbnMzX3BjaV9wcm9iZSwKPj4+ICsJLnJlbW92ZSA9IGNk bnMzX3BjaV9yZW1vdmUsCj4+PiArfTsKPj4+ICsKPj4+ICttb2R1bGVfcGNpX2RyaXZlcihjZG5z M19wY2lfZHJpdmVyKTsKPj4+ICtNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2RuczNfcGNpX2lk cyk7Cj4+PiArCj4+PiArTU9EVUxFX0FVVEhPUigiUGF3ZWwgTGFzemN6YWsgPHBhd2VsbEBjYWRl bmNlLmNvbT4iKTsKPj4+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4+PiArTU9EVUxFX0RF U0NSSVBUSU9OKCJDYWRlbmNlIFVTQlNTIFBDSSB3cmFwcGVyciIpOwo+Pj4gKwo+Pj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvdXNiL2NkbnMzL2NvcmUuYyBiL2RyaXZlcnMvdXNiL2NkbnMzL2NvcmUu Ywo+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uYWEyZjYz MjQxZGFiCj4+PiAtLS0gL2Rldi9udWxsCj4+PiArKysgYi9kcml2ZXJzL3VzYi9jZG5zMy9jb3Jl LmMKPj4+IEBAIC0wLDAgKzEsNDAzIEBACj4+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEdQTC0yLjAKPj4+ICsvKgo+Pj4gKyAqIENhZGVuY2UgVVNCU1MgRFJEIERyaXZlci4KPj4+ICsg Kgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAxOCBDYWRlbmNlLgo+Pj4gKyAqIENvcHlyaWdodCAo QykgMjAxNy0yMDE4IE5YUAo+Pj4gKyAqCj4+PiArICogQXV0aG9yOiBQZXRlciBDaGVuIDxwZXRl ci5jaGVuQG54cC5jb20+Cj4+PiArICogICAgICAgICBQYXdlbCBMYXN6Y3phayA8cGF3ZWxsQGNh ZGVuY2UuY29tPgo+Pj4gKyAqLwo+Pj4gKwo+Pj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4K Pj4+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRm b3JtX2RldmljZS5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KPj4+ICsjaW5j bHVkZSA8bGludXgvaW8uaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgo+Pj4g Kwo+Pj4gKyNpbmNsdWRlICJnYWRnZXQuaCIKPj4+ICsjaW5jbHVkZSAiY29yZS5oIgo+Pj4gKyNp bmNsdWRlICJob3N0LWV4cG9ydC5oIgo+Pj4gKyNpbmNsdWRlICJnYWRnZXQtZXhwb3J0LmgiCj4+ PiArI2luY2x1ZGUgImRyZC5oIgo+Pj4gKyNpbmNsdWRlICJkZWJ1Zy5oIgo+Pj4gKwo+Pj4gK3N0 YXRpYyBpbmxpbmUKPj4+ICtzdHJ1Y3QgY2RuczNfcm9sZV9kcml2ZXIgKmNkbnMzX2dldF9jdXJy ZW50X3JvbGVfZHJpdmVyKHN0cnVjdCBjZG5zMyAqY2RucykKPj4+ICt7Cj4+PiArCVdBUk5fT04o Y2Rucy0+cm9sZSA+PSBDRE5TM19ST0xFX0VORCB8fCAhY2Rucy0+cm9sZXNbY2Rucy0+cm9sZV0p Owo+Pj4gKwlyZXR1cm4gY2Rucy0+cm9sZXNbY2Rucy0+cm9sZV07Cj4+PiArfQo+Pj4gKwo+Pj4g K3N0YXRpYyBpbnQgY2RuczNfcm9sZV9zdGFydChzdHJ1Y3QgY2RuczMgKmNkbnMsIGVudW0gY2Ru czNfcm9sZXMgcm9sZSkKPj4+ICt7Cj4+PiArCWludCByZXQ7Cj4+PiArCj4+PiArCWlmIChXQVJO X09OKHJvbGUgPj0gQ0ROUzNfUk9MRV9FTkQpKQo+Pj4gKwkJcmV0dXJuIDA7Cj4+PiArCj4+PiAr CWlmICghY2Rucy0+cm9sZXNbcm9sZV0pCj4+PiArCQlyZXR1cm4gLUVOWElPOwo+Pj4gKwo+Pj4g KwlpZiAoY2Rucy0+cm9sZXNbcm9sZV0tPnN0YXRlID09IENETlMzX1JPTEVfU1RBVEVfQUNUSVZF KQo+Pj4gKwkJcmV0dXJuIDA7Cj4+PiArCj4+PiArCW11dGV4X2xvY2soJmNkbnMtPm11dGV4KTsK Pj4+ICsJY2Rucy0+cm9sZSA9IHJvbGU7Cj4+PiArCXJldCA9IGNkbnMtPnJvbGVzW3JvbGVdLT5z dGFydChjZG5zKTsKPj4+ICsJaWYgKCFyZXQpCj4+PiArCQljZG5zLT5yb2xlc1tyb2xlXS0+c3Rh dGUgPSBDRE5TM19ST0xFX1NUQVRFX0FDVElWRTsKPj4+ICsJbXV0ZXhfdW5sb2NrKCZjZG5zLT5t dXRleCk7Cj4+PiArCXJldHVybiByZXQ7Cj4+PiArfQo+Pj4gKwo+Pj4gK3ZvaWQgY2RuczNfcm9s ZV9zdG9wKHN0cnVjdCBjZG5zMyAqY2RucykKPj4+ICt7Cj4+PiArCWVudW0gY2RuczNfcm9sZXMg cm9sZSA9IGNkbnMtPnJvbGU7Cj4+PiArCj4+PiArCWlmIChyb2xlID49IENETlMzX1JPTEVfRU5E KSB7Cj4+PiArCQlXQVJOX09OKHJvbGUgPiBDRE5TM19ST0xFX0VORCk7Cj4+PiArCQlyZXR1cm47 Cj4+PiArCX0KPj4+ICsKPj4+ICsJaWYgKGNkbnMtPnJvbGVzW3JvbGVdLT5zdGF0ZSA9PSBDRE5T M19ST0xFX1NUQVRFX0lOQUNUSVZFKQo+Pj4gKwkJcmV0dXJuOwo+Pj4gKwo+Pj4gKwltdXRleF9s b2NrKCZjZG5zLT5tdXRleCk7Cj4+PiArCWNkbnMtPnJvbGVzW3JvbGVdLT5zdG9wKGNkbnMpOwo+ Pj4gKwljZG5zLT5yb2xlc1tyb2xlXS0+c3RhdGUgPSBDRE5TM19ST0xFX1NUQVRFX0lOQUNUSVZF Owo+Pj4gKwltdXRleF91bmxvY2soJmNkbnMtPm11dGV4KTsKPj4+ICt9Cj4+PiArCj4+PiArLyoK Pj4+ICsgKiBjZG5zLT5yb2xlIGdldHMgZnJvbSBjZG5zM19nZXRfaW5pdGlhbF9yb2xlLCBhbmQg dGhpcyBBUEkgdGVsbHMgcm9sZSBhdCB0aGUKPj4+ICsgKiBydW50aW1lLgo+Pj4gKyAqIElmIGJv dGggcm9sZXMgYXJlIHN1cHBvcnRlZCwgdGhlIHJvbGUgaXMgc2VsZWN0ZWQgYmFzZWQgb24gdmJ1 cy9pZC4KPj4+ICsgKiBJdCBjb3VsZCBiZSByZWFkIGZyb20gT1RHIHJlZ2lzdGVyIG9yIGV4dGVy bmFsIGNvbm5lY3Rvci4KPj4+ICsgKiBJZiBvbmx5IHNpbmdsZSByb2xlIGlzIHN1cHBvcnRlZCwg b25seSBvbmUgcm9sZSBzdHJ1Y3R1cmUKPj4+ICsgKiBpcyBhbGxvY2F0ZWQsIGNkbnMtPnJvbGVz W0NETlMzX1JPTEVfSE9TVF0gb3IgY2Rucy0+cm9sZXNbQ0ROUzNfUk9MRV9HQURHRVRdLgo+Pj4g KyAqLwo+Pj4gK3N0YXRpYyBlbnVtIGNkbnMzX3JvbGVzIGNkbnMzX2dldF9pbml0aWFsX3JvbGUo c3RydWN0IGNkbnMzICpjZG5zKQo+Pj4gK3sKPj4+ICsJaWYgKGNkbnMtPnJvbGVzW0NETlMzX1JP TEVfSE9TVF0gJiYgY2Rucy0+cm9sZXNbQ0ROUzNfUk9MRV9HQURHRVRdKSB7Cj4+PiArCQlpZiAo Y2RuczNfaXNfaG9zdChjZG5zKSkKPj4+ICsJCQlyZXR1cm4gQ0ROUzNfUk9MRV9IT1NUOwo+Pj4g KwkJaWYgKGNkbnMzX2lzX2RldmljZShjZG5zKSkKPj4+ICsJCQlyZXR1cm4gQ0ROUzNfUk9MRV9H QURHRVQ7Cj4+PiArCX0KPj4+ICsJcmV0dXJuIGNkbnMtPnJvbGVzW0NETlMzX1JPTEVfSE9TVF0K Pj4+ICsJCT8gQ0ROUzNfUk9MRV9IT1NUCj4+PiArCQk6IENETlMzX1JPTEVfR0FER0VUOwo+Pj4g K30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCBjZG5zM19leGl0X3JvbGVzKHN0cnVjdCBjZG5zMyAq Y2RucykKPj4+ICt7Cj4+PiArCWNkbnMzX3JvbGVfc3RvcChjZG5zKTsKPj4+ICsJY2RuczNfZHJk X2V4aXQoY2Rucyk7Cj4+PiArfQo+Pj4gKwo+Pj4gKy8qKgo+Pj4gKyAqIGNkbnMzX2NvcmVfaW5p dF9yb2xlIC0gaW5pdGlhbGl6ZSByb2xlIG9mIG9wZXJhdGlvbgo+Pj4gKyAqIEBjZG5zOiBQb2lu dGVyIHRvIGNkbnMzIHN0cnVjdHVyZQo+Pj4gKyAqCj4+PiArICogUmV0dXJucyAwIG9uIHN1Y2Nl c3Mgb3RoZXJ3aXNlIG5lZ2F0aXZlIGVycm5vCj4+PiArICovCj4+PiArc3RhdGljIGludCBjZG5z M19jb3JlX2luaXRfcm9sZShzdHJ1Y3QgY2RuczMgKmNkbnMpCj4+PiArewo+Pj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSBjZG5zLT5kZXY7Cj4+PiArCWVudW0gdXNiX2RyX21vZGUgYmVzdF9kcl9t b2RlOwo+Pj4gKwllbnVtIHVzYl9kcl9tb2RlIGRyX21vZGU7Cj4+PiArCWludCByZXQgPSAwOwo+ Pj4gKwo+Pj4gKwlkcl9tb2RlID0gdXNiX2dldF9kcl9tb2RlKGRldik7Cj4+PiArCWNkbnMtPnJv bGUgPSBDRE5TM19ST0xFX0VORDsKPj4+ICsKPj4+ICsJLyoKPj4+ICsJICogSWYgZHJpdmVyIGNh bid0IHJlYWQgbW9kZSBieSBtZWFucyBvZiB1c2JfZ2V0X2RyX21kb2UgZnVuY3Rpb24gdGhlbgo+ Pgo+PiBzL21kb2UvbW9kZQo+Pgo+Pj4gKwkgKiBjaG9vc2VzIG1vZGUgYWNjb3JkaW5nIHdpdGgg S2VybmVsIGNvbmZpZ3VyYXRpb24uIFRoaXMgc2V0dGluZwo+Pj4gKwkgKiBjYW4gYmUgcmVzdHJp Y3RlZCBsYXRlciBkZXBlbmRpbmcgb24gc3RyYXAgcGluIGNvbmZpZ3VyYXRpb24uCj4+PiArCSAq Lwo+Pj4gKwlpZiAoZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9VTktOT1dOKSB7Cj4+PiArCQlpZiAo SVNfRU5BQkxFRChDT05GSUdfVVNCX0NETlMzX0hPU1QpICYmCj4+PiArCQkgICAgSVNfRU5BQkxF RChDT05GSUdfVVNCX0NETlMzX0dBREdFVCkpCj4+PiArCQkJZHJfbW9kZSA9IFVTQl9EUl9NT0RF X09URzsKPj4+ICsJCWVsc2UgaWYgKElTX0VOQUJMRUQoQ09ORklHX1VTQl9DRE5TM19IT1NUKSkK Pj4+ICsJCQlkcl9tb2RlID0gVVNCX0RSX01PREVfSE9TVDsKPj4+ICsJCWVsc2UgaWYgKElTX0VO QUJMRUQoQ09ORklHX1VTQl9DRE5TM19HQURHRVQpKQo+Pj4gKwkJCWRyX21vZGUgPSBVU0JfRFJf TU9ERV9QRVJJUEhFUkFMOwo+Pj4gKwl9Cj4+PiArCj4+PiArCWJlc3RfZHJfbW9kZSA9IFVTQl9E Ul9NT0RFX09URzsKPj4KPj4gTWlnaHQgYmUgd29ydGggbWVudGlvbmluZyB0aGF0IGNkbnMtPmRy X21vZGUgaXMgc3RyYXAgY29uZmlndXJhdGlvbgo+PiBhdCB0aGlzIHBvaW50Lgo+IEkgYWRkZWQg c3VjaCBpbmZvcm1hdGlvbi4gSXQgY291bGQgaGVscCBpbiB1bmRlcnN0YW5kaW5nIGNvZGUuCj4+ Cj4+IFdoYXQgZXhhY3RseSBhcmUgd2UgdHJ5aW5nIHRvIGRvIGhlcmU/Cj4+IE15IGd1ZXNzIGlz IHRoYXQgY2hvb3NlbiBkcl9tb2RlIGNhbiBiZSBlcXVhbCB0byBvciBzdWJzZXQgb2Ygc3RyYXAg Y29uZmlndXJhdGlvbj8KPj4KPiBXZSBoYXZlIHRocmVlIHBvc3NpYmlsaXR5IHJlZ2FyZGluZyBk cl9tb2RlOgo+IDEuIEl0IGNhbiBiZSByZWFkIGZyb20gc3RyYXAgYml0cwo+IDIuIHdlIGhhdmUg a2VybmVsIGNvbmZpZ3VyYXRpb24gCj4gMy4gd2UgY2FuIHJlYWQgaXQgZnJvbSBkdHMuIAo+IAo+ IEkgYXNzdW1lIHRoYXQgZHJpdmVyIHNob3VsZCBzZWxlY3QgZHJfbW9kZSBjb25zaWRlcmluZyB0 aGVzZSB0aHJlZSBzZXR0aW5ncy4gCj4gCj4+IERvZXMgdGhpcyB3b3JrPwo+IAo+Pgo+PiAJaWYg KGNkbnMtPmRyX21vZGUgIT0gVVNCX0RSX01PREVfT1RHKSB7Cj4+IAkJaWYgKGNkbnMtPmRyX21v ZGUgIT0gZHJfbW9kZSkgewo+PiAJCQlkZXZfZXJyKGRldiwgIkluY29ycmVjdCBkcl9tb2RlIGNv bmZpZ3VyYXRpb246IHN0cmFwICVkOiByZXF1ZXN0ZWQgJWRcbiIsCj4+IAkJCQljZG5zLT5kcl9t b2RlLCBkcl9tb2RlKTsKPj4gCQl9Cj4+IAl9Cj4+Cj4+IEF0IHRoaXMgcG9pbnQsIGRyX21vZGUg Y29udGFpbnMgdGhlIG1vZGUgd2UgbmVlZCB0byB1c2UuCj4gCj4gSSBkb24ndCB1bmRlcnN0YW5k LiBEbyB5b3Ugd2FudCB0byByZXBsYWNlIGJlbG93IGJsb2NrIHdpdGggYWJvdmUgY29uZGl0aW9u ID8KClllcy4KCj4gSWYgeWVzLCB3aGF0IHdpdGggY2FzZSBjZG5zLT5kcl9tb2RlID0gIFVTQl9E Ul9NT0RFX09URyAoc3RyYXAgY29uZmlndXJhdGlvbikKPiBhbmQgZHJfbW9kZSA9IFVTQl9EUl9N T0RFX0hPU1QgKEtlcm5lbCBjb25maWd1cmF0aW9uKS4gCj4gSSB0aGluayB0aGF0IGluIHRoaXMg Y2FzZSBkcml2ZXIgc2hvdWxkIGxpbWl0IGNkbnMtPmRyX21vZGUgdG8gVVNCX0RSX01PREVfSE9T VCAKPiBiZWNhdXNlIGdhZGdldCBkcml2ZXIgaXMgZGlzYWJsZWQuICAKCllvdSBhcmUgcmlnaHQu IEl0IHdvbid0IHdvcmsgdGhlcmUuCgo+IE9mIGNvdXJzZSB3ZSBjYW4gYWxzbyBjb25zaWRlciBz dWNoIGNhc2UgYXMgaW5jb3JyZWN0IGtlcm5lbCBjb25maWd1cmF0aW9uLgoKTm8uIEl0IGlzIGNv cnJlY3QuCkkgd2FzIHRoaW5raW5nIGlmIHdlIGNhbiBnZXQgcmlkIG9mIGJlc3RfZHJfbW9kZSB2 YXJpYWJsZSBlbnRpcmVseSwgYnV0IG5ldmVybWluZC4KCj4gCj4+Cj4+PiArCj4+PiArCWlmIChk cl9tb2RlID09IFVTQl9EUl9NT0RFX09URykgewo+Pj4gKwkJYmVzdF9kcl9tb2RlID0gY2Rucy0+ ZHJfbW9kZTsKCkkgdGhpbmsgdGhpcyBpcyB3cm9uZy4gV2h5IGRvIHlvdSB3YW50IHRvIGxpbWl0 IHRvIHN0cmFwIGNvbmZpZ3VyYXRpb24gd2hlbgp1c2VyIHdhbnRzIGl0IHRvIGJlIGluIE9URz8K Cj4+PiArCX0gZWxzZSBpZiAoY2Rucy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9PVEcpIHsKPj4+ ICsJCWJlc3RfZHJfbW9kZSA9IGRyX21vZGU7Cj4+PiArCX0gZWxzZSBpZiAoY2Rucy0+ZHJfbW9k ZSAhPSBkcl9tb2RlKSB7Cj4+PiArCQlkZXZfZXJyKGRldiwgIkluY29ycmVjdCBEUkQgY29uZmln dXJhdGlvblxuIik7Cj4+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4+ICsJfQo+Pj4gKwo+Pj4gKwlk cl9tb2RlID0gYmVzdF9kcl9tb2RlOwo+Pj4gKwo+Pj4gKwlpZiAoZHJfbW9kZSA9PSBVU0JfRFJf TU9ERV9PVEcgfHwgZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9IT1NUKSB7Cj4+PiArCQlyZXQgPSBj ZG5zM19ob3N0X2luaXQoY2Rucyk7Cj4+PiArCQlpZiAocmV0KSB7Cj4+PiArCQkJZGV2X2Vycihk ZXYsICJIb3N0IGluaXRpYWxpemF0aW9uIGZhaWxlZCB3aXRoICVkXG4iLAo+Pj4gKwkJCQlyZXQp Owo+Pj4gKwkJCWdvdG8gZXJyOwo+Pj4gKwkJfQo+Pj4gKwl9Cj4+PiArCj4+PiArCWlmIChkcl9t b2RlID09IFVTQl9EUl9NT0RFX09URyB8fCBkcl9tb2RlID09IFVTQl9EUl9NT0RFX1BFUklQSEVS QUwpIHsKPj4+ICsJCXJldCA9IGNkbnMzX2dhZGdldF9pbml0KGNkbnMpOwo+Pj4gKwkJaWYgKHJl dCkgewo+Pj4gKwkJCWRldl9lcnIoZGV2LCAiRGV2aWNlIGluaXRpYWxpemF0aW9uIGZhaWxlZCB3 aXRoICVkXG4iLAo+Pj4gKwkJCQlyZXQpOwo+Pj4gKwkJCWdvdG8gZXJyOwo+Pj4gKwkJfQo+Pj4g Kwl9PiArCj4+PiArCWNkbnMtPmRlc2lyZWRfZHJfbW9kZSA9IGRyX21vZGU7Cj4+PiArCWNkbnMt PmRyX21vZGUgPSBkcl9tb2RlOwo+Pj4gKwkvKgo+Pj4gKwkgKiBkcl9tb2RlIGNvdWxkIGJlIGNo YW5nZSBzbyBEUkQgbXVzdCB1cGRhdGUgY29udHJvbGxlcgo+Pgo+PiAiZGVzaXJlZF9kcl9tb2Rl IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgY29udHJvbGxlciBj b25maWd1cmF0aW9uIj8KPiAKPiBTb3VuZHMgYmV0dGVyLiAKPiAKCjxzbmlwPgo=