From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_MUTT 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 7E06BC43381 for ; Wed, 27 Mar 2019 17:38:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 350DE2147C for ; Wed, 27 Mar 2019 17:38:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727484AbfC0Rij (ORCPT ); Wed, 27 Mar 2019 13:38:39 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:58552 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727632AbfC0Rij (ORCPT ); Wed, 27 Mar 2019 13:38:39 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 996B9A78; Wed, 27 Mar 2019 10:38:35 -0700 (PDT) Received: from red-moon (red-moon.cambridge.arm.com [10.1.197.39]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5D2833F557; Wed, 27 Mar 2019 10:38:32 -0700 (PDT) Date: Wed, 27 Mar 2019 17:39:05 +0000 From: Lorenzo Pieralisi To: "Z.q. Hou" Cc: "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "bhelgaas@google.com" , "robh+dt@kernel.org" , "mark.rutland@arm.com" , "l.subrahmanya@mobiveil.co.in" , "shawnguo@kernel.org" , Leo Li , "catalin.marinas@arm.com" , "will.deacon@arm.com" , Mingkai Hu , "M.h. Lian" , Xiaowei Bao Subject: Re: [PATCHv4 16/28] PCI: mobiveil: refactor Mobiveil PCIe Host Bridge IP driver Message-ID: <20190327173905.GA19093@red-moon> References: <20190311093130.7209-1-Zhiqiang.Hou@nxp.com> <20190311093130.7209-17-Zhiqiang.Hou@nxp.com> <20190326173421.GB10666@e107981-ln.cambridge.arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Wed, Mar 27, 2019 at 02:04:00AM +0000, Z.q. Hou wrote: > Hi Lorenzo, > > Thanks for your comments! > > > -----Original Message----- > > From: Lorenzo Pieralisi > > Sent: 2019年3月27日 1:34 > > To: Z.q. Hou > > Cc: linux-pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; > > devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; > > bhelgaas@google.com; robh+dt@kernel.org; mark.rutland@arm.com; > > l.subrahmanya@mobiveil.co.in; shawnguo@kernel.org; Leo Li > > ; catalin.marinas@arm.com; will.deacon@arm.com; > > Mingkai Hu ; M.h. Lian ; > > Xiaowei Bao > > Subject: Re: [PATCHv4 16/28] PCI: mobiveil: refactor Mobiveil PCIe Host > > Bridge IP driver > > > > On Mon, Mar 11, 2019 at 09:32:04AM +0000, Z.q. Hou wrote: > > > From: Hou Zhiqiang > > > > > > As the Mobiveil PCIe controller support RC&EP DAUL mode, and to make > > > platforms which integrated the Mobiveil PCIe IP more easy to add their > > > drivers, this patch moved the Mobiveil driver to a new directory > > > 'drivers/pci/controller/mobiveil' and refactored it according to the > > > abstraction of RC&EP (EP driver will be added later). > > > > I do not want to create a subdirectory for every controller that can work in > > RC&EP so drop this patch, more so given that it will be required "later", we > > will create a directory when and if we actually have to. > > Please don't drop this patch, Xiaowei Bao has sent v1 of the EP mode > driver, which is depends on this patch. I understand but he will have to rebase that code anyway, I do not want to create a directory for mobiveil before I see other IPs built on it, we did not do it for the cadence and rockchip controllers either. So you will have to drop this patch and rework it. Thanks, Lorenzo > > Thanks, > > Lorenzo > > > > > Signed-off-by: Hou Zhiqiang > > > Reviewed-by: Minghuan Lian > > > Reviewed-by: Subrahmanya Lingappa > > > --- > > > V4: > > > - no change > > > > > > MAINTAINERS | 2 +- > > > drivers/pci/controller/Kconfig | 11 +- > > > drivers/pci/controller/Makefile | 2 +- > > > drivers/pci/controller/mobiveil/Kconfig | 24 + > > > drivers/pci/controller/mobiveil/Makefile | 4 + > > > .../pcie-mobiveil-host.c} | 528 +++--------------- > > > .../controller/mobiveil/pcie-mobiveil-plat.c | 54 ++ > > > .../pci/controller/mobiveil/pcie-mobiveil.c | 228 ++++++++ > > > .../pci/controller/mobiveil/pcie-mobiveil.h | 187 +++++++ > > > 9 files changed, 587 insertions(+), 453 deletions(-) create mode > > > 100644 drivers/pci/controller/mobiveil/Kconfig > > > create mode 100644 drivers/pci/controller/mobiveil/Makefile > > > rename drivers/pci/controller/{pcie-mobiveil.c => > > > mobiveil/pcie-mobiveil-host.c} (55%) create mode 100644 > > > drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c > > > create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.c > > > create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.h > > > > > > diff --git a/MAINTAINERS b/MAINTAINERS index > > > 1e64279f338a..1013e74b14f2 100644 > > > --- a/MAINTAINERS > > > +++ b/MAINTAINERS > > > @@ -11877,7 +11877,7 @@ M: Subrahmanya Lingappa > > > > > L: linux-pci@vger.kernel.org > > > S: Supported > > > F: Documentation/devicetree/bindings/pci/mobiveil-pcie.txt > > > -F: drivers/pci/controller/pcie-mobiveil.c > > > +F: drivers/pci/controller/mobiveil/pcie-mobiveil* > > > > > > PCI DRIVER FOR MVEBU (Marvell Armada 370 and Armada XP SOC > > support) > > > M: Thomas Petazzoni > > > diff --git a/drivers/pci/controller/Kconfig > > > b/drivers/pci/controller/Kconfig index 6671946dbf66..0e981ed00a75 > > > 100644 > > > --- a/drivers/pci/controller/Kconfig > > > +++ b/drivers/pci/controller/Kconfig > > > @@ -241,16 +241,6 @@ config PCIE_MEDIATEK > > > Say Y here if you want to enable PCIe controller support on > > > MediaTek SoCs. > > > > > > -config PCIE_MOBIVEIL > > > - bool "Mobiveil AXI PCIe controller" > > > - depends on ARCH_ZYNQMP || COMPILE_TEST > > > - depends on OF > > > - depends on PCI_MSI_IRQ_DOMAIN > > > - help > > > - Say Y here if you want to enable support for the Mobiveil AXI PCIe > > > - Soft IP. It has up to 8 outbound and inbound windows > > > - for address translation and it is a PCIe Gen4 IP. > > > - > > > config PCIE_TANGO_SMP8759 > > > bool "Tango SMP8759 PCIe controller (DANGEROUS)" > > > depends on ARCH_TANGO && PCI_MSI && OF @@ -281,4 +271,5 @@ > > config > > > VMD > > > module will be called vmd. > > > > > > source "drivers/pci/controller/dwc/Kconfig" > > > +source "drivers/pci/controller/mobiveil/Kconfig" > > > endmenu > > > diff --git a/drivers/pci/controller/Makefile > > > b/drivers/pci/controller/Makefile index d56a507495c5..b79a615041a0 > > > 100644 > > > --- a/drivers/pci/controller/Makefile > > > +++ b/drivers/pci/controller/Makefile > > > @@ -26,11 +26,11 @@ obj-$(CONFIG_PCIE_ROCKCHIP) += pcie-rockchip.o > > > obj-$(CONFIG_PCIE_ROCKCHIP_EP) += pcie-rockchip-ep.o > > > obj-$(CONFIG_PCIE_ROCKCHIP_HOST) += pcie-rockchip-host.o > > > obj-$(CONFIG_PCIE_MEDIATEK) += pcie-mediatek.o > > > -obj-$(CONFIG_PCIE_MOBIVEIL) += pcie-mobiveil.o > > > obj-$(CONFIG_PCIE_TANGO_SMP8759) += pcie-tango.o > > > obj-$(CONFIG_VMD) += vmd.o > > > # pcie-hisi.o quirks are needed even without CONFIG_PCIE_DW > > > obj-y += dwc/ > > > +obj-y += mobiveil/ > > > > > > > > > # The following drivers are for devices that use the generic ACPI > > > diff --git a/drivers/pci/controller/mobiveil/Kconfig > > > b/drivers/pci/controller/mobiveil/Kconfig > > > new file mode 100644 > > > index 000000000000..64343c07bfed > > > --- /dev/null > > > +++ b/drivers/pci/controller/mobiveil/Kconfig > > > @@ -0,0 +1,24 @@ > > > +# SPDX-License-Identifier: GPL-2.0 > > > + > > > +menu "Mobiveil PCIe Core Support" > > > + depends on PCI > > > + > > > +config PCIE_MOBIVEIL > > > + bool > > > + > > > +config PCIE_MOBIVEIL_HOST > > > + bool > > > + depends on PCI_MSI_IRQ_DOMAIN > > > + select PCIE_MOBIVEIL > > > + > > > +config PCIE_MOBIVEIL_PLAT > > > + bool "Mobiveil AXI PCIe controller" > > > + depends on ARCH_ZYNQMP || COMPILE_TEST > > > + depends on OF > > > + select PCIE_MOBIVEIL_HOST > > > + help > > > + Say Y here if you want to enable support for the Mobiveil AXI PCIe > > > + Soft IP. It has up to 8 outbound and inbound windows > > > + for address translation and it is a PCIe Gen4 IP. > > > + > > > +endmenu > > > diff --git a/drivers/pci/controller/mobiveil/Makefile > > > b/drivers/pci/controller/mobiveil/Makefile > > > new file mode 100644 > > > index 000000000000..9fb6d1c6504d > > > --- /dev/null > > > +++ b/drivers/pci/controller/mobiveil/Makefile > > > @@ -0,0 +1,4 @@ > > > +# SPDX-License-Identifier: GPL-2.0 > > > +obj-$(CONFIG_PCIE_MOBIVEIL) += pcie-mobiveil.o > > > +obj-$(CONFIG_PCIE_MOBIVEIL_HOST) += pcie-mobiveil-host.o > > > +obj-$(CONFIG_PCIE_MOBIVEIL_PLAT) += pcie-mobiveil-plat.o > > > diff --git a/drivers/pci/controller/pcie-mobiveil.c > > > b/drivers/pci/controller/mobiveil/pcie-mobiveil-host.c > > > similarity index 55% > > > rename from drivers/pci/controller/pcie-mobiveil.c > > > rename to drivers/pci/controller/mobiveil/pcie-mobiveil-host.c > > > index 9210165fe8c0..dc5324d94466 100644 > > > --- a/drivers/pci/controller/pcie-mobiveil.c > > > +++ b/drivers/pci/controller/mobiveil/pcie-mobiveil-host.c > > > @@ -4,9 +4,9 @@ > > > * > > > * Copyright (c) 2018 Mobiveil Inc. > > > * Author: Subrahmanya Lingappa > > > + * Refactor: Zhiqiang Hou > > > */ > > > > > > -#include > > > #include > > > #include > > > #include > > > @@ -23,275 +23,21 @@ > > > #include > > > #include > > > > > > -#include "../pci.h" > > > - > > > -/* register offsets and bit positions */ > > > - > > > -/* > > > - * translation tables are grouped into windows, each window registers > > > are > > > - * grouped into blocks of 4 or 16 registers each > > > - */ > > > -#define PAB_REG_BLOCK_SIZE 16 > > > -#define PAB_EXT_REG_BLOCK_SIZE 4 > > > - > > > -#define PAB_REG_ADDR(offset, win) \ > > > - (offset + (win * PAB_REG_BLOCK_SIZE)) > > > -#define PAB_EXT_REG_ADDR(offset, win) \ > > > - (offset + (win * PAB_EXT_REG_BLOCK_SIZE)) > > > - > > > -#define LTSSM_STATUS 0x0404 > > > -#define LTSSM_STATUS_L0_MASK 0x3f > > > -#define LTSSM_STATUS_L0 0x2d > > > - > > > -#define PAB_CTRL 0x0808 > > > -#define AMBA_PIO_ENABLE_SHIFT 0 > > > -#define PEX_PIO_ENABLE_SHIFT 1 > > > -#define PAGE_SEL_SHIFT 13 > > > -#define PAGE_SEL_MASK 0x3f > > > -#define PAGE_LO_MASK 0x3ff > > > -#define PAGE_SEL_OFFSET_SHIFT 10 > > > - > > > -#define PAB_AXI_PIO_CTRL 0x0840 > > > -#define APIO_EN_MASK 0xf > > > - > > > -#define PAB_PEX_PIO_CTRL 0x08c0 > > > -#define PIO_ENABLE_SHIFT 0 > > > - > > > -#define PAB_INTP_AMBA_MISC_ENB 0x0b0c > > > -#define PAB_INTP_AMBA_MISC_STAT 0x0b1c > > > -#define PAB_INTP_INTX_MASK 0x01e0 > > > -#define PAB_INTP_MSI_MASK 0x8 > > > - > > > -#define PAB_AXI_AMAP_CTRL(win) PAB_REG_ADDR(0x0ba0, win) > > > -#define WIN_ENABLE_SHIFT 0 > > > -#define WIN_TYPE_SHIFT 1 > > > -#define WIN_TYPE_MASK 0x3 > > > -#define WIN_SIZE_SHIFT 10 > > > -#define WIN_SIZE_MASK 0x3fffff > > > - > > > -#define PAB_EXT_AXI_AMAP_SIZE(win) PAB_EXT_REG_ADDR(0xbaf0, > > win) > > > - > > > -#define PAB_EXT_AXI_AMAP_AXI_WIN(win) > > PAB_EXT_REG_ADDR(0x80a0, win) > > > -#define PAB_AXI_AMAP_AXI_WIN(win) PAB_REG_ADDR(0x0ba4, win) > > > -#define AXI_WINDOW_ALIGN_MASK 3 > > > - > > > -#define PAB_AXI_AMAP_PEX_WIN_L(win) PAB_REG_ADDR(0x0ba8, > > win) > > > -#define PAB_BUS_SHIFT 24 > > > -#define PAB_DEVICE_SHIFT 19 > > > -#define PAB_FUNCTION_SHIFT 16 > > > - > > > -#define PAB_AXI_AMAP_PEX_WIN_H(win) PAB_REG_ADDR(0x0bac, > > win) > > > -#define PAB_INTP_AXI_PIO_CLASS 0x474 > > > - > > > -#define PAB_PEX_AMAP_CTRL(win) PAB_REG_ADDR(0x4ba0, win) > > > -#define AMAP_CTRL_EN_SHIFT 0 > > > -#define AMAP_CTRL_TYPE_SHIFT 1 > > > -#define AMAP_CTRL_TYPE_MASK 3 > > > - > > > -#define PAB_EXT_PEX_AMAP_SIZEN(win) PAB_EXT_REG_ADDR(0xbef0, > > win) > > > -#define PAB_EXT_PEX_AMAP_AXI_WIN(win) > > PAB_EXT_REG_ADDR(0xb4a0, win) > > > -#define PAB_PEX_AMAP_AXI_WIN(win) PAB_REG_ADDR(0x4ba4, win) > > > -#define PAB_PEX_AMAP_PEX_WIN_L(win) PAB_REG_ADDR(0x4ba8, > > win) > > > -#define PAB_PEX_AMAP_PEX_WIN_H(win) PAB_REG_ADDR(0x4bac, > > win) > > > - > > > -/* starting offset of INTX bits in status register */ > > > -#define PAB_INTX_START 5 > > > - > > > -/* supported number of MSI interrupts */ > > > -#define PCI_NUM_MSI 16 > > > - > > > -/* MSI registers */ > > > -#define MSI_BASE_LO_OFFSET 0x04 > > > -#define MSI_BASE_HI_OFFSET 0x08 > > > -#define MSI_SIZE_OFFSET 0x0c > > > -#define MSI_ENABLE_OFFSET 0x14 > > > -#define MSI_STATUS_OFFSET 0x18 > > > -#define MSI_DATA_OFFSET 0x20 > > > -#define MSI_ADDR_L_OFFSET 0x24 > > > -#define MSI_ADDR_H_OFFSET 0x28 > > > - > > > -/* outbound and inbound window definitions */ > > > -#define WIN_NUM_0 0 > > > -#define WIN_NUM_1 1 > > > -#define CFG_WINDOW_TYPE 0 > > > -#define IO_WINDOW_TYPE 1 > > > -#define MEM_WINDOW_TYPE 2 > > > -#define IB_WIN_SIZE ((u64)256 * 1024 * 1024 * 1024) > > > -#define MAX_PIO_WINDOWS 8 > > > - > > > -/* Parameters for the waiting for link up routine */ > > > -#define LINK_WAIT_MAX_RETRIES 10 > > > -#define LINK_WAIT_MIN 90000 > > > -#define LINK_WAIT_MAX 100000 > > > - > > > -#define PAGED_ADDR_BNDRY 0xc00 > > > -#define OFFSET_TO_PAGE_ADDR(off) \ > > > - ((off & PAGE_LO_MASK) | PAGED_ADDR_BNDRY) > > > -#define OFFSET_TO_PAGE_IDX(off) \ > > > - ((off >> PAGE_SEL_OFFSET_SHIFT) & PAGE_SEL_MASK) > > > - > > > -struct mobiveil_msi { /* MSI information */ > > > - struct mutex lock; /* protect bitmap variable */ > > > - struct irq_domain *msi_domain; > > > - struct irq_domain *dev_domain; > > > - phys_addr_t msi_pages_phys; > > > - int num_of_vectors; > > > - DECLARE_BITMAP(msi_irq_in_use, PCI_NUM_MSI); > > > -}; > > > - > > > -struct mobiveil_pcie { > > > - struct platform_device *pdev; > > > - struct list_head resources; > > > - void __iomem *config_axi_slave_base; /* endpoint config base */ > > > - void __iomem *csr_axi_slave_base; /* root port config base */ > > > - void __iomem *apb_csr_base; /* MSI register base */ > > > - phys_addr_t pcie_reg_base; /* Physical PCIe Controller Base */ > > > - struct irq_domain *intx_domain; > > > - raw_spinlock_t intx_mask_lock; > > > - int irq; > > > - int apio_wins; > > > - int ppio_wins; > > > - int ob_wins_configured; /* configured outbound windows */ > > > - int ib_wins_configured; /* configured inbound windows */ > > > - struct resource *ob_io_res; > > > - char root_bus_nr; > > > - struct mobiveil_msi msi; > > > -}; > > > - > > > -/* > > > - * mobiveil_pcie_sel_page - routine to access paged register > > > - * > > > - * Registers whose address greater than PAGED_ADDR_BNDRY (0xc00) are > > > paged, > > > - * for this scheme to work extracted higher 6 bits of the offset will > > > be > > > - * written to pg_sel field of PAB_CTRL register and rest of the lower > > > 10 > > > - * bits enabled with PAGED_ADDR_BNDRY are used as offset of the > > register. > > > - */ > > > -static void mobiveil_pcie_sel_page(struct mobiveil_pcie *pcie, u8 > > > pg_idx) -{ > > > - u32 val; > > > - > > > - val = readl(pcie->csr_axi_slave_base + PAB_CTRL); > > > - val &= ~(PAGE_SEL_MASK << PAGE_SEL_SHIFT); > > > - val |= (pg_idx & PAGE_SEL_MASK) << PAGE_SEL_SHIFT; > > > - > > > - writel(val, pcie->csr_axi_slave_base + PAB_CTRL); > > > -} > > > - > > > -static void *mobiveil_pcie_comp_addr(struct mobiveil_pcie *pcie, u32 > > > off) -{ > > > - if (off < PAGED_ADDR_BNDRY) { > > > - /* For directly accessed registers, clear the pg_sel field */ > > > - mobiveil_pcie_sel_page(pcie, 0); > > > - return pcie->csr_axi_slave_base + off; > > > - } > > > - > > > - mobiveil_pcie_sel_page(pcie, OFFSET_TO_PAGE_IDX(off)); > > > - return pcie->csr_axi_slave_base + OFFSET_TO_PAGE_ADDR(off); > > > -} > > > - > > > -static int mobiveil_pcie_read(void __iomem *addr, int size, u32 *val) > > > -{ > > > - if ((uintptr_t)addr & (size - 1)) { > > > - *val = 0; > > > - return PCIBIOS_BAD_REGISTER_NUMBER; > > > - } > > > - > > > - switch (size) { > > > - case 4: > > > - *val = readl(addr); > > > - break; > > > - case 2: > > > - *val = readw(addr); > > > - break; > > > - case 1: > > > - *val = readb(addr); > > > - break; > > > - default: > > > - *val = 0; > > > - return PCIBIOS_BAD_REGISTER_NUMBER; > > > - } > > > - > > > - return PCIBIOS_SUCCESSFUL; > > > -} > > > - > > > -static int mobiveil_pcie_write(void __iomem *addr, int size, u32 val) > > > -{ > > > - if ((uintptr_t)addr & (size - 1)) > > > - return PCIBIOS_BAD_REGISTER_NUMBER; > > > - > > > - switch (size) { > > > - case 4: > > > - writel(val, addr); > > > - break; > > > - case 2: > > > - writew(val, addr); > > > - break; > > > - case 1: > > > - writeb(val, addr); > > > - break; > > > - default: > > > - return PCIBIOS_BAD_REGISTER_NUMBER; > > > - } > > > - > > > - return PCIBIOS_SUCCESSFUL; > > > -} > > > - > > > -static u32 csr_read(struct mobiveil_pcie *pcie, u32 off, size_t size) > > > -{ > > > - void *addr; > > > - u32 val; > > > - int ret; > > > - > > > - addr = mobiveil_pcie_comp_addr(pcie, off); > > > - > > > - ret = mobiveil_pcie_read(addr, size, &val); > > > - if (ret) > > > - dev_err(&pcie->pdev->dev, "read CSR address failed\n"); > > > - > > > - return val; > > > -} > > > - > > > -static void csr_write(struct mobiveil_pcie *pcie, u32 val, u32 off, > > > size_t size) -{ > > > - void *addr; > > > - int ret; > > > - > > > - addr = mobiveil_pcie_comp_addr(pcie, off); > > > - > > > - ret = mobiveil_pcie_write(addr, size, val); > > > - if (ret) > > > - dev_err(&pcie->pdev->dev, "write CSR address failed\n"); > > > -} > > > - > > > -static u32 csr_readl(struct mobiveil_pcie *pcie, u32 off) -{ > > > - return csr_read(pcie, off, 0x4); > > > -} > > > - > > > -static void csr_writel(struct mobiveil_pcie *pcie, u32 val, u32 off) > > > -{ > > > - csr_write(pcie, val, off, 0x4); > > > -} > > > - > > > -static bool mobiveil_pcie_link_up(struct mobiveil_pcie *pcie) -{ > > > - return (csr_readl(pcie, LTSSM_STATUS) & > > > - LTSSM_STATUS_L0_MASK) == LTSSM_STATUS_L0; > > > -} > > > +#include "pcie-mobiveil.h" > > > > > > static bool mobiveil_pcie_valid_device(struct pci_bus *bus, unsigned > > > int devfn) { > > > struct mobiveil_pcie *pcie = bus->sysdata; > > > > > > /* Only one device down on each root port */ > > > - if ((bus->number == pcie->root_bus_nr) && (devfn > 0)) > > > + if ((bus->number == pcie->rp.root_bus_nr) && (devfn > 0)) > > > return false; > > > > > > /* > > > * Do not read more than one device on the bus directly > > > * attached to RC > > > */ > > > - if ((bus->primary == pcie->root_bus_nr) && (devfn > 0)) > > > + if ((bus->primary == pcie->rp.root_bus_nr) && (devfn > 0)) > > > return false; > > > > > > return true; > > > @@ -311,7 +57,7 @@ static void __iomem *mobiveil_pcie_map_bus(struct > > pci_bus *bus, > > > return NULL; > > > > > > /* RC config access */ > > > - if (bus->number == pcie->root_bus_nr) > > > + if (bus->number == pcie->rp.root_bus_nr) > > > return pcie->csr_axi_slave_base + where; > > > > > > /* > > > @@ -326,7 +72,7 @@ static void __iomem *mobiveil_pcie_map_bus(struct > > > pci_bus *bus, > > > > > > csr_writel(pcie, value, PAB_AXI_AMAP_PEX_WIN_L(WIN_NUM_0)); > > > > > > - return pcie->config_axi_slave_base + where; > > > + return pcie->rp.config_axi_slave_base + where; > > > } > > > > > > static struct pci_ops mobiveil_pcie_ops = { @@ -340,7 +86,7 @@ static > > > void mobiveil_pcie_isr(struct irq_desc *desc) > > > struct irq_chip *chip = irq_desc_get_chip(desc); > > > struct mobiveil_pcie *pcie = irq_desc_get_handler_data(desc); > > > struct device *dev = &pcie->pdev->dev; > > > - struct mobiveil_msi *msi = &pcie->msi; > > > + struct mobiveil_msi *msi = &pcie->rp.msi; > > > u32 msi_data, msi_addr_lo, msi_addr_hi; > > > u32 intr_status, msi_status; > > > unsigned long shifted_status; > > > @@ -365,7 +111,7 @@ static void mobiveil_pcie_isr(struct irq_desc *desc) > > > shifted_status >>= PAB_INTX_START; > > > do { > > > for_each_set_bit(bit, &shifted_status, PCI_NUM_INTX) { > > > - virq = irq_find_mapping(pcie->intx_domain, > > > + virq = irq_find_mapping(pcie->rp.intx_domain, > > > bit + 1); > > > if (virq) > > > generic_handle_irq(virq); > > > @@ -428,10 +174,10 @@ static int mobiveil_pcie_parse_dt(struct > > mobiveil_pcie *pcie) > > > /* map config resource */ > > > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, > > > "config_axi_slave"); > > > - pcie->config_axi_slave_base = devm_pci_remap_cfg_resource(dev, res); > > > - if (IS_ERR(pcie->config_axi_slave_base)) > > > - return PTR_ERR(pcie->config_axi_slave_base); > > > - pcie->ob_io_res = res; > > > + pcie->rp.config_axi_slave_base = devm_pci_remap_cfg_resource(dev, > > res); > > > + if (IS_ERR(pcie->rp.config_axi_slave_base)) > > > + return PTR_ERR(pcie->rp.config_axi_slave_base); > > > + pcie->rp.ob_io_res = res; > > > > > > /* map csr resource */ > > > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, @@ > > -441,12 > > > +187,6 @@ static int mobiveil_pcie_parse_dt(struct mobiveil_pcie *pcie) > > > return PTR_ERR(pcie->csr_axi_slave_base); > > > pcie->pcie_reg_base = res->start; > > > > > > - /* map MSI config resource */ > > > - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, > > "apb_csr"); > > > - pcie->apb_csr_base = devm_pci_remap_cfg_resource(dev, res); > > > - if (IS_ERR(pcie->apb_csr_base)) > > > - return PTR_ERR(pcie->apb_csr_base); > > > - > > > /* read the number of windows requested */ > > > if (of_property_read_u32(node, "apio-wins", &pcie->apio_wins)) > > > pcie->apio_wins = MAX_PIO_WINDOWS; > > > @@ -454,119 +194,15 @@ static int mobiveil_pcie_parse_dt(struct > > mobiveil_pcie *pcie) > > > if (of_property_read_u32(node, "ppio-wins", &pcie->ppio_wins)) > > > pcie->ppio_wins = MAX_PIO_WINDOWS; > > > > > > - pcie->irq = platform_get_irq(pdev, 0); > > > - if (pcie->irq <= 0) { > > > - dev_err(dev, "failed to map IRQ: %d\n", pcie->irq); > > > - return -ENODEV; > > > - } > > > - > > > return 0; > > > } > > > > > > -static void program_ib_windows(struct mobiveil_pcie *pcie, int win_num, > > > - u64 cpu_addr, u64 pci_addr, u32 type, u64 size) > > > -{ > > > - u32 value; > > > - u64 size64 = ~(size - 1); > > > - > > > - if (win_num >= pcie->ppio_wins) { > > > - dev_err(&pcie->pdev->dev, > > > - "ERROR: max inbound windows reached !\n"); > > > - return; > > > - } > > > - > > > - value = csr_readl(pcie, PAB_PEX_AMAP_CTRL(win_num)); > > > - value &= ~(AMAP_CTRL_TYPE_MASK << AMAP_CTRL_TYPE_SHIFT | > > > - WIN_SIZE_MASK << WIN_SIZE_SHIFT); > > > - value |= (type << AMAP_CTRL_TYPE_SHIFT) | (1 << > > AMAP_CTRL_EN_SHIFT) | > > > - (lower_32_bits(size64) & WIN_SIZE_MASK << WIN_SIZE_SHIFT); > > > - csr_writel(pcie, value, PAB_PEX_AMAP_CTRL(win_num)); > > > - > > > - csr_writel(pcie, upper_32_bits(size64), > > > - PAB_EXT_PEX_AMAP_SIZEN(win_num)); > > > - > > > - csr_writel(pcie, lower_32_bits(cpu_addr), > > > - PAB_PEX_AMAP_AXI_WIN(win_num)); > > > - csr_writel(pcie, upper_32_bits(cpu_addr), > > > - PAB_EXT_PEX_AMAP_AXI_WIN(win_num)); > > > - > > > - csr_writel(pcie, lower_32_bits(pci_addr), > > > - PAB_PEX_AMAP_PEX_WIN_L(win_num)); > > > - csr_writel(pcie, upper_32_bits(pci_addr), > > > - PAB_PEX_AMAP_PEX_WIN_H(win_num)); > > > - > > > - pcie->ib_wins_configured++; > > > -} > > > - > > > -/* > > > - * routine to program the outbound windows > > > - */ > > > -static void program_ob_windows(struct mobiveil_pcie *pcie, int win_num, > > > - u64 cpu_addr, u64 pci_addr, u32 type, u64 size) > > > -{ > > > - > > > - u32 value; > > > - u64 size64 = ~(size - 1); > > > - > > > - if (win_num >= pcie->apio_wins) { > > > - dev_err(&pcie->pdev->dev, > > > - "ERROR: max outbound windows reached !\n"); > > > - return; > > > - } > > > - > > > - /* > > > - * program Enable Bit to 1, Type Bit to (00) base 2, AXI Window Size Bit > > > - * to 4 KB in PAB_AXI_AMAP_CTRL register > > > - */ > > > - value = csr_readl(pcie, PAB_AXI_AMAP_CTRL(win_num)); > > > - value &= ~(WIN_TYPE_MASK << WIN_TYPE_SHIFT | > > > - WIN_SIZE_MASK << WIN_SIZE_SHIFT); > > > - value |= 1 << WIN_ENABLE_SHIFT | type << WIN_TYPE_SHIFT | > > > - (lower_32_bits(size64) & WIN_SIZE_MASK << WIN_SIZE_SHIFT); > > > - csr_writel(pcie, value, PAB_AXI_AMAP_CTRL(win_num)); > > > - > > > - csr_writel(pcie, upper_32_bits(size64), > > PAB_EXT_AXI_AMAP_SIZE(win_num)); > > > - > > > - /* > > > - * program AXI window base with appropriate value in > > > - * PAB_AXI_AMAP_AXI_WIN0 register > > > - */ > > > - csr_writel(pcie, lower_32_bits(cpu_addr) & > > (~AXI_WINDOW_ALIGN_MASK), > > > - PAB_AXI_AMAP_AXI_WIN(win_num)); > > > - csr_writel(pcie, upper_32_bits(cpu_addr), > > > - PAB_EXT_AXI_AMAP_AXI_WIN(win_num)); > > > - > > > - csr_writel(pcie, lower_32_bits(pci_addr), > > > - PAB_AXI_AMAP_PEX_WIN_L(win_num)); > > > - csr_writel(pcie, upper_32_bits(pci_addr), > > > - PAB_AXI_AMAP_PEX_WIN_H(win_num)); > > > - > > > - pcie->ob_wins_configured++; > > > -} > > > - > > > -static int mobiveil_bringup_link(struct mobiveil_pcie *pcie) -{ > > > - int retries; > > > - > > > - /* check if the link is up or not */ > > > - for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) { > > > - if (mobiveil_pcie_link_up(pcie)) > > > - return 0; > > > - > > > - usleep_range(LINK_WAIT_MIN, LINK_WAIT_MAX); > > > - } > > > - > > > - dev_err(&pcie->pdev->dev, "link never came up\n"); > > > - > > > - return -ETIMEDOUT; > > > -} > > > - > > > static void mobiveil_pcie_enable_msi(struct mobiveil_pcie *pcie) { > > > phys_addr_t msg_addr = pcie->pcie_reg_base; > > > - struct mobiveil_msi *msi = &pcie->msi; > > > + struct mobiveil_msi *msi = &pcie->rp.msi; > > > > > > - pcie->msi.num_of_vectors = PCI_NUM_MSI; > > > + msi->num_of_vectors = PCI_NUM_MSI; > > > msi->msi_pages_phys = (phys_addr_t)msg_addr; > > > > > > writel_relaxed(lower_32_bits(msg_addr), > > > @@ -604,9 +240,6 @@ static int mobiveil_host_init(struct mobiveil_pcie > > *pcie) > > > pab_ctrl |= (1 << AMBA_PIO_ENABLE_SHIFT) | (1 << > > PEX_PIO_ENABLE_SHIFT); > > > csr_writel(pcie, pab_ctrl, PAB_CTRL); > > > > > > - csr_writel(pcie, (PAB_INTP_INTX_MASK | PAB_INTP_MSI_MASK), > > > - PAB_INTP_AMBA_MISC_ENB); > > > - > > > /* > > > * program PIO Enable Bit to 1 and Config Window Enable Bit to 1 in > > > * PAB_AXI_PIO_CTRL Register > > > @@ -628,20 +261,24 @@ static int mobiveil_host_init(struct mobiveil_pcie > > *pcie) > > > */ > > > > > > /* config outbound translation window */ > > > - program_ob_windows(pcie, WIN_NUM_0, pcie->ob_io_res->start, 0, > > > - CFG_WINDOW_TYPE, resource_size(pcie->ob_io_res)); > > > + program_ob_windows(pcie, WIN_NUM_0, pcie->rp.ob_io_res->start, 0, > > > + CFG_WINDOW_TYPE, resource_size(pcie->rp.ob_io_res)); > > > > > > /* memory inbound translation window */ > > > program_ib_windows(pcie, WIN_NUM_0, 0, 0, MEM_WINDOW_TYPE, > > IB_WIN_SIZE); > > > > > > /* Get the I/O and memory ranges from DT */ > > > resource_list_for_each_entry(win, &pcie->resources) { > > > - if (resource_type(win->res) == IORESOURCE_MEM) > > > + if (resource_type(win->res) == IORESOURCE_MEM) { > > > type = MEM_WINDOW_TYPE; > > > - else if (resource_type(win->res) == IORESOURCE_IO) > > > + } else if (resource_type(win->res) == IORESOURCE_IO) { > > > type = IO_WINDOW_TYPE; > > > - else > > > + } else if (resource_type(win->res) == IORESOURCE_BUS) { > > > + pcie->rp.root_bus_nr = win->res->start; > > > + continue; > > > + } else { > > > continue; > > > + } > > > > > > /* configure outbound translation window */ > > > program_ob_windows(pcie, pcie->ob_wins_configured, > > > @@ -656,9 +293,6 @@ static int mobiveil_host_init(struct mobiveil_pcie > > *pcie) > > > value |= (PCI_CLASS_BRIDGE_PCI << 16); > > > csr_writel(pcie, value, PAB_INTP_AXI_PIO_CLASS); > > > > > > - /* setup MSI hardware registers */ > > > - mobiveil_pcie_enable_msi(pcie); > > > - > > > return 0; > > > } > > > > > > @@ -671,11 +305,11 @@ static void mobiveil_mask_intx_irq(struct > > irq_data *data) > > > > > > pcie = irq_desc_get_chip_data(desc); > > > mask = 1 << ((data->hwirq + PAB_INTX_START) - 1); > > > - raw_spin_lock_irqsave(&pcie->intx_mask_lock, flags); > > > + raw_spin_lock_irqsave(&pcie->rp.intx_mask_lock, flags); > > > shifted_val = csr_readl(pcie, PAB_INTP_AMBA_MISC_ENB); > > > shifted_val &= ~mask; > > > csr_writel(pcie, shifted_val, PAB_INTP_AMBA_MISC_ENB); > > > - raw_spin_unlock_irqrestore(&pcie->intx_mask_lock, flags); > > > + raw_spin_unlock_irqrestore(&pcie->rp.intx_mask_lock, flags); > > > } > > > > > > static void mobiveil_unmask_intx_irq(struct irq_data *data) > > > @@ -687,11 +321,11 @@ static void mobiveil_unmask_intx_irq(struct > > irq_data *data) > > > > > > pcie = irq_desc_get_chip_data(desc); > > > mask = 1 << ((data->hwirq + PAB_INTX_START) - 1); > > > - raw_spin_lock_irqsave(&pcie->intx_mask_lock, flags); > > > + raw_spin_lock_irqsave(&pcie->rp.intx_mask_lock, flags); > > > shifted_val = csr_readl(pcie, PAB_INTP_AMBA_MISC_ENB); > > > shifted_val |= mask; > > > csr_writel(pcie, shifted_val, PAB_INTP_AMBA_MISC_ENB); > > > - raw_spin_unlock_irqrestore(&pcie->intx_mask_lock, flags); > > > + raw_spin_unlock_irqrestore(&pcie->rp.intx_mask_lock, flags); > > > } > > > > > > static struct irq_chip intx_irq_chip = { > > > @@ -759,7 +393,7 @@ static int mobiveil_irq_msi_domain_alloc(struct > > irq_domain *domain, > > > unsigned int nr_irqs, void *args) > > > { > > > struct mobiveil_pcie *pcie = domain->host_data; > > > - struct mobiveil_msi *msi = &pcie->msi; > > > + struct mobiveil_msi *msi = &pcie->rp.msi; > > > unsigned long bit; > > > > > > WARN_ON(nr_irqs != 1); > > > @@ -786,7 +420,7 @@ static void mobiveil_irq_msi_domain_free(struct > > irq_domain *domain, > > > { > > > struct irq_data *d = irq_domain_get_irq_data(domain, virq); > > > struct mobiveil_pcie *pcie = irq_data_get_irq_chip_data(d); > > > - struct mobiveil_msi *msi = &pcie->msi; > > > + struct mobiveil_msi *msi = &pcie->rp.msi; > > > > > > mutex_lock(&msi->lock); > > > > > > @@ -807,9 +441,9 @@ static int mobiveil_allocate_msi_domains(struct > > mobiveil_pcie *pcie) > > > { > > > struct device *dev = &pcie->pdev->dev; > > > struct fwnode_handle *fwnode = of_node_to_fwnode(dev->of_node); > > > - struct mobiveil_msi *msi = &pcie->msi; > > > + struct mobiveil_msi *msi = &pcie->rp.msi; > > > > > > - mutex_init(&pcie->msi.lock); > > > + mutex_init(&msi->lock); > > > msi->dev_domain = irq_domain_add_linear(NULL, > > msi->num_of_vectors, > > > &msi_domain_ops, pcie); > > > if (!msi->dev_domain) { > > > @@ -836,15 +470,15 @@ static int mobiveil_pcie_init_irq_domain(struct > > mobiveil_pcie *pcie) > > > int ret; > > > > > > /* setup INTx */ > > > - pcie->intx_domain = irq_domain_add_linear(node, PCI_NUM_INTX, > > > - &intx_domain_ops, pcie); > > > + pcie->rp.intx_domain = irq_domain_add_linear(node, PCI_NUM_INTX, > > > + &intx_domain_ops, pcie); > > > > > > - if (!pcie->intx_domain) { > > > + if (!pcie->rp.intx_domain) { > > > dev_err(dev, "Failed to get a INTx IRQ domain\n"); > > > return -ENOMEM; > > > } > > > > > > - raw_spin_lock_init(&pcie->intx_mask_lock); > > > + raw_spin_lock_init(&pcie->rp.intx_mask_lock); > > > > > > /* setup MSI */ > > > ret = mobiveil_allocate_msi_domains(pcie); > > > @@ -854,24 +488,58 @@ static int mobiveil_pcie_init_irq_domain(struct > > mobiveil_pcie *pcie) > > > return 0; > > > } > > > > > > -static int mobiveil_pcie_probe(struct platform_device *pdev) > > > +static int mobiveil_pcie_interrupt_init(struct mobiveil_pcie *pcie) > > > +{ > > > + struct device *dev = &pcie->pdev->dev; > > > + struct resource *res; > > > + int ret; > > > + > > > + if (pcie->rp.ops->interrupt_init) > > > + return pcie->rp.ops->interrupt_init(pcie); > > > + > > > + /* map MSI config resource */ > > > + res = platform_get_resource_byname(pcie->pdev, IORESOURCE_MEM, > > > + "apb_csr"); > > > + pcie->apb_csr_base = devm_pci_remap_cfg_resource(dev, res); > > > + if (IS_ERR(pcie->apb_csr_base)) > > > + return PTR_ERR(pcie->apb_csr_base); > > > + > > > + /* setup MSI hardware registers */ > > > + mobiveil_pcie_enable_msi(pcie); > > > + > > > + pcie->rp.irq = platform_get_irq(pcie->pdev, 0); > > > + if (pcie->rp.irq <= 0) { > > > + dev_err(dev, "failed to map IRQ: %d\n", pcie->rp.irq); > > > + return -ENODEV; > > > + } > > > + > > > + /* initialize the IRQ domains */ > > > + ret = mobiveil_pcie_init_irq_domain(pcie); > > > + if (ret) { > > > + dev_err(dev, "Failed creating IRQ Domain\n"); > > > + return ret; > > > + } > > > + > > > + irq_set_chained_handler_and_data(pcie->rp.irq, > > > + mobiveil_pcie_isr, pcie); > > > + > > > + /* Enable interrupts */ > > > + csr_writel(pcie, (PAB_INTP_INTX_MASK | PAB_INTP_MSI_MASK), > > > + PAB_INTP_AMBA_MISC_ENB); > > > + > > > + return 0; > > > +} > > > + > > > +int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie) > > > { > > > - struct mobiveil_pcie *pcie; > > > struct pci_bus *bus; > > > struct pci_bus *child; > > > struct pci_host_bridge *bridge; > > > - struct device *dev = &pdev->dev; > > > + struct device *dev = &pcie->pdev->dev; > > > resource_size_t iobase; > > > int ret; > > > > > > - /* allocate the PCIe port */ > > > - bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie)); > > > - if (!bridge) > > > - return -ENOMEM; > > > - > > > - pcie = pci_host_bridge_priv(bridge); > > > - > > > - pcie->pdev = pdev; > > > + INIT_LIST_HEAD(&pcie->resources); > > > > > > ret = mobiveil_pcie_parse_dt(pcie); > > > if (ret) { > > > @@ -879,7 +547,10 @@ static int mobiveil_pcie_probe(struct > > platform_device *pdev) > > > return ret; > > > } > > > > > > - INIT_LIST_HEAD(&pcie->resources); > > > + /* allocate the PCIe port */ > > > + bridge = devm_pci_alloc_host_bridge(dev, 0); > > > + if (!bridge) > > > + return -ENOMEM; > > > > > > /* parse the host bridge base addresses from the device tree file */ > > > ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, > > > @@ -899,15 +570,12 @@ static int mobiveil_pcie_probe(struct > > platform_device *pdev) > > > goto error; > > > } > > > > > > - /* initialize the IRQ domains */ > > > - ret = mobiveil_pcie_init_irq_domain(pcie); > > > + ret = mobiveil_pcie_interrupt_init(pcie); > > > if (ret) { > > > - dev_err(dev, "Failed creating IRQ Domain\n"); > > > + dev_err(dev, "Interrupt init failed\n"); > > > goto error; > > > } > > > > > > - irq_set_chained_handler_and_data(pcie->irq, mobiveil_pcie_isr, pcie); > > > - > > > ret = devm_request_pci_bus_resources(dev, &pcie->resources); > > > if (ret) > > > goto error; > > > @@ -916,7 +584,7 @@ static int mobiveil_pcie_probe(struct > > platform_device *pdev) > > > list_splice_init(&pcie->resources, &bridge->windows); > > > bridge->dev.parent = dev; > > > bridge->sysdata = pcie; > > > - bridge->busnr = pcie->root_bus_nr; > > > + bridge->busnr = pcie->rp.root_bus_nr; > > > bridge->ops = &mobiveil_pcie_ops; > > > bridge->map_irq = of_irq_parse_and_map_pci; > > > bridge->swizzle_irq = pci_common_swizzle; > > > @@ -944,25 +612,3 @@ static int mobiveil_pcie_probe(struct > > platform_device *pdev) > > > pci_free_resource_list(&pcie->resources); > > > return ret; > > > } > > > - > > > -static const struct of_device_id mobiveil_pcie_of_match[] = { > > > - {.compatible = "mbvl,gpex40-pcie",}, > > > - {}, > > > -}; > > > - > > > -MODULE_DEVICE_TABLE(of, mobiveil_pcie_of_match); > > > - > > > -static struct platform_driver mobiveil_pcie_driver = { > > > - .probe = mobiveil_pcie_probe, > > > - .driver = { > > > - .name = "mobiveil-pcie", > > > - .of_match_table = mobiveil_pcie_of_match, > > > - .suppress_bind_attrs = true, > > > - }, > > > -}; > > > - > > > -builtin_platform_driver(mobiveil_pcie_driver); > > > - > > > -MODULE_LICENSE("GPL v2"); > > > -MODULE_DESCRIPTION("Mobiveil PCIe host controller driver"); > > > -MODULE_AUTHOR("Subrahmanya Lingappa > > "); > > > diff --git a/drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c > > b/drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c > > > new file mode 100644 > > > index 000000000000..216c62f35568 > > > --- /dev/null > > > +++ b/drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c > > > @@ -0,0 +1,54 @@ > > > +// SPDX-License-Identifier: GPL-2.0 > > > +/* > > > + * PCIe host controller driver for Mobiveil PCIe Host controller > > > + * > > > + * Copyright (c) 2018 Mobiveil Inc. > > > + * Author: Subrahmanya Lingappa > > > + * Refactor: Zhiqiang Hou > > > + */ > > > + > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > + > > > +#include "pcie-mobiveil.h" > > > + > > > +static int mobiveil_pcie_probe(struct platform_device *pdev) > > > +{ > > > + struct mobiveil_pcie *pcie; > > > + struct device *dev = &pdev->dev; > > > + > > > + pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); > > > + if (!pcie) > > > + return -ENOMEM; > > > + > > > + pcie->pdev = pdev; > > > + > > > + return mobiveil_pcie_host_probe(pcie); > > > +} > > > + > > > +static const struct of_device_id mobiveil_pcie_of_match[] = { > > > + {.compatible = "mbvl,gpex40-pcie",}, > > > + {}, > > > +}; > > > + > > > +MODULE_DEVICE_TABLE(of, mobiveil_pcie_of_match); > > > + > > > +static struct platform_driver mobiveil_pcie_driver = { > > > + .probe = mobiveil_pcie_probe, > > > + .driver = { > > > + .name = "mobiveil-pcie", > > > + .of_match_table = mobiveil_pcie_of_match, > > > + .suppress_bind_attrs = true, > > > + }, > > > +}; > > > + > > > +builtin_platform_driver(mobiveil_pcie_driver); > > > + > > > +MODULE_LICENSE("GPL v2"); > > > +MODULE_DESCRIPTION("Mobiveil PCIe host controller driver"); > > > +MODULE_AUTHOR("Subrahmanya Lingappa > > "); > > > diff --git a/drivers/pci/controller/mobiveil/pcie-mobiveil.c > > b/drivers/pci/controller/mobiveil/pcie-mobiveil.c > > > new file mode 100644 > > > index 000000000000..ee678a60825d > > > --- /dev/null > > > +++ b/drivers/pci/controller/mobiveil/pcie-mobiveil.c > > > @@ -0,0 +1,228 @@ > > > +// SPDX-License-Identifier: GPL-2.0 > > > +/* > > > + * PCIe host controller driver for Mobiveil PCIe Host controller > > > + * > > > + * Copyright (c) 2018 Mobiveil Inc. > > > + * Author: Subrahmanya Lingappa > > > + * Refactor: Zhiqiang Hou > > > + */ > > > + > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > + > > > +#include "pcie-mobiveil.h" > > > + > > > +/* > > > + * mobiveil_pcie_sel_page - routine to access paged register > > > + * > > > + * Registers whose address greater than PAGED_ADDR_BNDRY (0xc00) are > > paged, > > > + * for this scheme to work extracted higher 6 bits of the offset will be > > > + * written to pg_sel field of PAB_CTRL register and rest of the lower 10 > > > + * bits enabled with PAGED_ADDR_BNDRY are used as offset of the > > register. > > > + */ > > > +static void mobiveil_pcie_sel_page(struct mobiveil_pcie *pcie, u8 pg_idx) > > > +{ > > > + u32 val; > > > + > > > + val = readl(pcie->csr_axi_slave_base + PAB_CTRL); > > > + val &= ~(PAGE_SEL_MASK << PAGE_SEL_SHIFT); > > > + val |= (pg_idx & PAGE_SEL_MASK) << PAGE_SEL_SHIFT; > > > + > > > + writel(val, pcie->csr_axi_slave_base + PAB_CTRL); > > > +} > > > + > > > +static void *mobiveil_pcie_comp_addr(struct mobiveil_pcie *pcie, u32 off) > > > +{ > > > + if (off < PAGED_ADDR_BNDRY) { > > > + /* For directly accessed registers, clear the pg_sel field */ > > > + mobiveil_pcie_sel_page(pcie, 0); > > > + return pcie->csr_axi_slave_base + off; > > > + } > > > + > > > + mobiveil_pcie_sel_page(pcie, OFFSET_TO_PAGE_IDX(off)); > > > + return pcie->csr_axi_slave_base + OFFSET_TO_PAGE_ADDR(off); > > > +} > > > + > > > +static int mobiveil_pcie_read(void __iomem *addr, int size, u32 *val) > > > +{ > > > + if ((uintptr_t)addr & (size - 1)) { > > > + *val = 0; > > > + return PCIBIOS_BAD_REGISTER_NUMBER; > > > + } > > > + > > > + switch (size) { > > > + case 4: > > > + *val = readl(addr); > > > + break; > > > + case 2: > > > + *val = readw(addr); > > > + break; > > > + case 1: > > > + *val = readb(addr); > > > + break; > > > + default: > > > + *val = 0; > > > + return PCIBIOS_BAD_REGISTER_NUMBER; > > > + } > > > + > > > + return PCIBIOS_SUCCESSFUL; > > > +} > > > + > > > +static int mobiveil_pcie_write(void __iomem *addr, int size, u32 val) > > > +{ > > > + if ((uintptr_t)addr & (size - 1)) > > > + return PCIBIOS_BAD_REGISTER_NUMBER; > > > + > > > + switch (size) { > > > + case 4: > > > + writel(val, addr); > > > + break; > > > + case 2: > > > + writew(val, addr); > > > + break; > > > + case 1: > > > + writeb(val, addr); > > > + break; > > > + default: > > > + return PCIBIOS_BAD_REGISTER_NUMBER; > > > + } > > > + > > > + return PCIBIOS_SUCCESSFUL; > > > +} > > > + > > > +u32 csr_read(struct mobiveil_pcie *pcie, u32 off, size_t size) > > > +{ > > > + void *addr; > > > + u32 val; > > > + int ret; > > > + > > > + addr = mobiveil_pcie_comp_addr(pcie, off); > > > + > > > + ret = mobiveil_pcie_read(addr, size, &val); > > > + if (ret) > > > + dev_err(&pcie->pdev->dev, "read CSR address failed\n"); > > > + > > > + return val; > > > +} > > > + > > > +void csr_write(struct mobiveil_pcie *pcie, u32 val, u32 off, size_t size) > > > +{ > > > + void *addr; > > > + int ret; > > > + > > > + addr = mobiveil_pcie_comp_addr(pcie, off); > > > + > > > + ret = mobiveil_pcie_write(addr, size, val); > > > + if (ret) > > > + dev_err(&pcie->pdev->dev, "write CSR address failed\n"); > > > +} > > > + > > > +bool mobiveil_pcie_link_up(struct mobiveil_pcie *pcie) > > > +{ > > > + if (pcie->ops->link_up) > > > + return pcie->ops->link_up(pcie); > > > + > > > + return (csr_readl(pcie, LTSSM_STATUS) & > > > + LTSSM_STATUS_L0_MASK) == LTSSM_STATUS_L0; > > > +} > > > + > > > +void program_ib_windows(struct mobiveil_pcie *pcie, int win_num, u64 > > cpu_addr, > > > + u64 pci_addr, u32 type, u64 size) > > > +{ > > > + u32 value; > > > + u64 size64 = ~(size - 1); > > > + > > > + if (win_num >= pcie->ppio_wins) { > > > + dev_err(&pcie->pdev->dev, > > > + "ERROR: max inbound windows reached !\n"); > > > + return; > > > + } > > > + > > > + value = csr_readl(pcie, PAB_PEX_AMAP_CTRL(win_num)); > > > + value &= ~(AMAP_CTRL_TYPE_MASK << AMAP_CTRL_TYPE_SHIFT | > > > + WIN_SIZE_MASK << WIN_SIZE_SHIFT); > > > + value |= (type << AMAP_CTRL_TYPE_SHIFT) | (1 << > > AMAP_CTRL_EN_SHIFT) | > > > + (lower_32_bits(size64) & WIN_SIZE_MASK << WIN_SIZE_SHIFT); > > > + csr_writel(pcie, value, PAB_PEX_AMAP_CTRL(win_num)); > > > + > > > + csr_writel(pcie, upper_32_bits(size64), > > > + PAB_EXT_PEX_AMAP_SIZEN(win_num)); > > > + > > > + csr_writel(pcie, lower_32_bits(cpu_addr), > > > + PAB_PEX_AMAP_AXI_WIN(win_num)); > > > + csr_writel(pcie, upper_32_bits(cpu_addr), > > > + PAB_EXT_PEX_AMAP_AXI_WIN(win_num)); > > > + > > > + csr_writel(pcie, lower_32_bits(pci_addr), > > > + PAB_PEX_AMAP_PEX_WIN_L(win_num)); > > > + csr_writel(pcie, upper_32_bits(pci_addr), > > > + PAB_PEX_AMAP_PEX_WIN_H(win_num)); > > > + > > > + pcie->ib_wins_configured++; > > > +} > > > + > > > +/* > > > + * routine to program the outbound windows > > > + */ > > > +void program_ob_windows(struct mobiveil_pcie *pcie, int win_num, u64 > > cpu_addr, > > > + u64 pci_addr, u32 type, u64 size) > > > +{ > > > + > > > + u32 value; > > > + u64 size64 = ~(size - 1); > > > + > > > + if (win_num >= pcie->apio_wins) { > > > + dev_err(&pcie->pdev->dev, > > > + "ERROR: max outbound windows reached !\n"); > > > + return; > > > + } > > > + > > > + /* > > > + * program Enable Bit to 1, Type Bit to (00) base 2, AXI Window Size Bit > > > + * to 4 KB in PAB_AXI_AMAP_CTRL register > > > + */ > > > + value = csr_readl(pcie, PAB_AXI_AMAP_CTRL(win_num)); > > > + value &= ~(WIN_TYPE_MASK << WIN_TYPE_SHIFT | > > > + WIN_SIZE_MASK << WIN_SIZE_SHIFT); > > > + value |= 1 << WIN_ENABLE_SHIFT | type << WIN_TYPE_SHIFT | > > > + (lower_32_bits(size64) & WIN_SIZE_MASK << WIN_SIZE_SHIFT); > > > + csr_writel(pcie, value, PAB_AXI_AMAP_CTRL(win_num)); > > > + > > > + csr_writel(pcie, upper_32_bits(size64), > > PAB_EXT_AXI_AMAP_SIZE(win_num)); > > > + > > > + /* > > > + * program AXI window base with appropriate value in > > > + * PAB_AXI_AMAP_AXI_WIN0 register > > > + */ > > > + csr_writel(pcie, lower_32_bits(cpu_addr) & > > (~AXI_WINDOW_ALIGN_MASK), > > > + PAB_AXI_AMAP_AXI_WIN(win_num)); > > > + csr_writel(pcie, upper_32_bits(cpu_addr), > > > + PAB_EXT_AXI_AMAP_AXI_WIN(win_num)); > > > + > > > + csr_writel(pcie, lower_32_bits(pci_addr), > > > + PAB_AXI_AMAP_PEX_WIN_L(win_num)); > > > + csr_writel(pcie, upper_32_bits(pci_addr), > > > + PAB_AXI_AMAP_PEX_WIN_H(win_num)); > > > + > > > + pcie->ob_wins_configured++; > > > +} > > > + > > > +int mobiveil_bringup_link(struct mobiveil_pcie *pcie) > > > +{ > > > + int retries; > > > + > > > + /* check if the link is up or not */ > > > + for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) { > > > + if (mobiveil_pcie_link_up(pcie)) > > > + return 0; > > > + > > > + usleep_range(LINK_WAIT_MIN, LINK_WAIT_MAX); > > > + } > > > + > > > + dev_err(&pcie->pdev->dev, "link never came up\n"); > > > + > > > + return -ETIMEDOUT; > > > +} > > > diff --git a/drivers/pci/controller/mobiveil/pcie-mobiveil.h > > b/drivers/pci/controller/mobiveil/pcie-mobiveil.h > > > new file mode 100644 > > > index 000000000000..eb4cb61291a8 > > > --- /dev/null > > > +++ b/drivers/pci/controller/mobiveil/pcie-mobiveil.h > > > @@ -0,0 +1,187 @@ > > > +/* SPDX-License-Identifier: GPL-2.0 */ > > > +/* > > > + * PCIe host controller driver for Mobiveil PCIe Host controller > > > + * > > > + * Copyright (c) 2018 Mobiveil Inc. > > > + * Author: Subrahmanya Lingappa > > > + * Refactor: Zhiqiang Hou > > > + */ > > > + > > > +#ifndef _PCIE_MOBIVEIL_H > > > +#define _PCIE_MOBIVEIL_H > > > + > > > +#include > > > +#include > > > +#include > > > +#include "../../pci.h" > > > + > > > +/* register offsets and bit positions */ > > > + > > > +/* > > > + * translation tables are grouped into windows, each window registers are > > > + * grouped into blocks of 4 or 16 registers each > > > + */ > > > +#define PAB_REG_BLOCK_SIZE 16 > > > +#define PAB_EXT_REG_BLOCK_SIZE 4 > > > + > > > +#define PAB_REG_ADDR(offset, win) \ > > > + (offset + (win * PAB_REG_BLOCK_SIZE)) > > > +#define PAB_EXT_REG_ADDR(offset, win) \ > > > + (offset + (win * PAB_EXT_REG_BLOCK_SIZE)) > > > + > > > +#define LTSSM_STATUS 0x0404 > > > +#define LTSSM_STATUS_L0_MASK 0x3f > > > +#define LTSSM_STATUS_L0 0x2d > > > + > > > +#define PAB_CTRL 0x0808 > > > +#define AMBA_PIO_ENABLE_SHIFT 0 > > > +#define PEX_PIO_ENABLE_SHIFT 1 > > > +#define PAGE_SEL_SHIFT 13 > > > +#define PAGE_SEL_MASK 0x3f > > > +#define PAGE_LO_MASK 0x3ff > > > +#define PAGE_SEL_OFFSET_SHIFT 10 > > > + > > > +#define PAB_AXI_PIO_CTRL 0x0840 > > > +#define APIO_EN_MASK 0xf > > > + > > > +#define PAB_PEX_PIO_CTRL 0x08c0 > > > +#define PIO_ENABLE_SHIFT 0 > > > + > > > +#define PAB_INTP_AMBA_MISC_ENB 0x0b0c > > > +#define PAB_INTP_AMBA_MISC_STAT 0x0b1c > > > +#define PAB_INTP_INTX_MASK 0x01e0 > > > +#define PAB_INTP_MSI_MASK 0x8 > > > + > > > +#define PAB_AXI_AMAP_CTRL(win) PAB_REG_ADDR(0x0ba0, win) > > > +#define WIN_ENABLE_SHIFT 0 > > > +#define WIN_TYPE_SHIFT 1 > > > +#define WIN_TYPE_MASK 0x3 > > > +#define WIN_SIZE_SHIFT 10 > > > +#define WIN_SIZE_MASK 0x3fffff > > > + > > > +#define PAB_EXT_AXI_AMAP_SIZE(win) PAB_EXT_REG_ADDR(0xbaf0, > > win) > > > + > > > +#define PAB_EXT_AXI_AMAP_AXI_WIN(win) > > PAB_EXT_REG_ADDR(0x80a0, win) > > > +#define PAB_AXI_AMAP_AXI_WIN(win) PAB_REG_ADDR(0x0ba4, win) > > > +#define AXI_WINDOW_ALIGN_MASK 3 > > > + > > > +#define PAB_AXI_AMAP_PEX_WIN_L(win) PAB_REG_ADDR(0x0ba8, > > win) > > > +#define PAB_BUS_SHIFT 24 > > > +#define PAB_DEVICE_SHIFT 19 > > > +#define PAB_FUNCTION_SHIFT 16 > > > + > > > +#define PAB_AXI_AMAP_PEX_WIN_H(win) PAB_REG_ADDR(0x0bac, > > win) > > > +#define PAB_INTP_AXI_PIO_CLASS 0x474 > > > + > > > +#define PAB_PEX_AMAP_CTRL(win) PAB_REG_ADDR(0x4ba0, > > win) > > > +#define AMAP_CTRL_EN_SHIFT 0 > > > +#define AMAP_CTRL_TYPE_SHIFT 1 > > > +#define AMAP_CTRL_TYPE_MASK 3 > > > + > > > +#define PAB_EXT_PEX_AMAP_SIZEN(win) PAB_EXT_REG_ADDR(0xbef0, > > win) > > > +#define PAB_EXT_PEX_AMAP_AXI_WIN(win) > > PAB_EXT_REG_ADDR(0xb4a0, win) > > > +#define PAB_PEX_AMAP_AXI_WIN(win) PAB_REG_ADDR(0x4ba4, win) > > > +#define PAB_PEX_AMAP_PEX_WIN_L(win) PAB_REG_ADDR(0x4ba8, > > win) > > > +#define PAB_PEX_AMAP_PEX_WIN_H(win) PAB_REG_ADDR(0x4bac, > > win) > > > + > > > +/* starting offset of INTX bits in status register */ > > > +#define PAB_INTX_START 5 > > > + > > > +/* supported number of MSI interrupts */ > > > +#define PCI_NUM_MSI 16 > > > + > > > +/* MSI registers */ > > > +#define MSI_BASE_LO_OFFSET 0x04 > > > +#define MSI_BASE_HI_OFFSET 0x08 > > > +#define MSI_SIZE_OFFSET 0x0c > > > +#define MSI_ENABLE_OFFSET 0x14 > > > +#define MSI_STATUS_OFFSET 0x18 > > > +#define MSI_DATA_OFFSET 0x20 > > > +#define MSI_ADDR_L_OFFSET 0x24 > > > +#define MSI_ADDR_H_OFFSET 0x28 > > > + > > > +/* outbound and inbound window definitions */ > > > +#define WIN_NUM_0 0 > > > +#define WIN_NUM_1 1 > > > +#define CFG_WINDOW_TYPE 0 > > > +#define IO_WINDOW_TYPE 1 > > > +#define MEM_WINDOW_TYPE 2 > > > +#define IB_WIN_SIZE ((u64)256 * 1024 * 1024 * 1024) > > > +#define MAX_PIO_WINDOWS 8 > > > + > > > +/* Parameters for the waiting for link up routine */ > > > +#define LINK_WAIT_MAX_RETRIES 10 > > > +#define LINK_WAIT_MIN 90000 > > > +#define LINK_WAIT_MAX 100000 > > > + > > > +#define PAGED_ADDR_BNDRY 0xc00 > > > +#define OFFSET_TO_PAGE_ADDR(off) \ > > > + ((off & PAGE_LO_MASK) | PAGED_ADDR_BNDRY) > > > +#define OFFSET_TO_PAGE_IDX(off) \ > > > + ((off >> PAGE_SEL_OFFSET_SHIFT) & PAGE_SEL_MASK) > > > + > > > +struct mobiveil_pcie; > > > + > > > +struct mobiveil_msi { /* MSI information */ > > > + struct mutex lock; /* protect bitmap variable */ > > > + struct irq_domain *msi_domain; > > > + struct irq_domain *dev_domain; > > > + phys_addr_t msi_pages_phys; > > > + int num_of_vectors; > > > + DECLARE_BITMAP(msi_irq_in_use, PCI_NUM_MSI); > > > +}; > > > + > > > +struct mobiveil_rp_ops { > > > + int (*interrupt_init)(struct mobiveil_pcie *pcie); > > > +}; > > > + > > > +struct root_port { > > > + u8 root_bus_nr; > > > + void __iomem *config_axi_slave_base; /* endpoint config base */ > > > + struct resource *ob_io_res; > > > + struct mobiveil_rp_ops *ops; > > > + int irq; > > > + raw_spinlock_t intx_mask_lock; > > > + struct irq_domain *intx_domain; > > > + struct mobiveil_msi msi; > > > +}; > > > + > > > +struct mobiveil_pab_ops { > > > + int (*link_up)(struct mobiveil_pcie *pcie); > > > +}; > > > + > > > +struct mobiveil_pcie { > > > + struct platform_device *pdev; > > > + struct list_head resources; > > > + void __iomem *csr_axi_slave_base; /* PAB registers base */ > > > + phys_addr_t pcie_reg_base; /* Physical PCIe Controller Base */ > > > + void __iomem *apb_csr_base; /* MSI register base */ > > > + u32 apio_wins; > > > + u32 ppio_wins; > > > + u32 ob_wins_configured; /* configured outbound windows */ > > > + u32 ib_wins_configured; /* configured inbound windows */ > > > + const struct mobiveil_pab_ops *ops; > > > + struct root_port rp; > > > +}; > > > + > > > +int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie); > > > +bool mobiveil_pcie_link_up(struct mobiveil_pcie *pcie); > > > +int mobiveil_bringup_link(struct mobiveil_pcie *pcie); > > > +void program_ob_windows(struct mobiveil_pcie *pcie, int win_num, u64 > > cpu_addr, > > > + u64 pci_addr, u32 type, u64 size); > > > +void program_ib_windows(struct mobiveil_pcie *pcie, int win_num, u64 > > cpu_addr, > > > + u64 pci_addr, u32 type, u64 size); > > > +u32 csr_read(struct mobiveil_pcie *pcie, u32 off, size_t size); > > > +void csr_write(struct mobiveil_pcie *pcie, u32 val, u32 off, size_t size); > > > + > > > +static inline u32 csr_readl(struct mobiveil_pcie *pcie, u32 off) > > > +{ > > > + return csr_read(pcie, off, 0x4); > > > +} > > > + > > > +static inline void csr_writel(struct mobiveil_pcie *pcie, u32 val, u32 off) > > > +{ > > > + csr_write(pcie, val, off, 0x4); > > > +} > > > + > > > +#endif /* _PCIE_MOBIVEIL_H */ > > > -- > > > 2.17.1 > > > > > Thanks, > Zhiqiang From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT 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 70DBDC43381 for ; Wed, 27 Mar 2019 17:38:59 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1B9A920651 for ; Wed, 27 Mar 2019 17:38:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ipchX6du" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1B9A920651 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=sZ95LafaQXRfecAZ9l8KUmNV+N9PGBJxgsBfqwMyH/c=; b=ipchX6duZ2kEXr nUcgN3vXH9nFjIj25ASdQLWK8/qlb9Vx3cfdpYeb2TEM+LeeC/BAVmhnHneeDGSXbNW3aYGIg28bX TOZvEEyNb45HquKrLETPJuX6kWBsUamfB25bwsG0kVGKPPP/oGtPw3T3Vr1sptbJXlBcbbGv+GPgs dMVvSk/szi4sIrcDUp/csWuZij4jCOr1UFZM2D5YSDtXuAouLdsa4VoTygg3c2PJxN/lJUpN8y8OL Suri71r/353JbXCorIxsoxWkDfFg0VdFDKGmtpn9K6NKN+IMHuIEV8lmJeBwQHZcrAWKQ8yHYPRFF uDHebnHFtbiZyPc2ir+w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1h9CVn-000233-ER; Wed, 27 Mar 2019 17:38:51 +0000 Received: from foss.arm.com ([217.140.101.70]) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1h9CVb-00022b-2v for linux-arm-kernel@lists.infradead.org; Wed, 27 Mar 2019 17:38:43 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 996B9A78; Wed, 27 Mar 2019 10:38:35 -0700 (PDT) Received: from red-moon (red-moon.cambridge.arm.com [10.1.197.39]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5D2833F557; Wed, 27 Mar 2019 10:38:32 -0700 (PDT) Date: Wed, 27 Mar 2019 17:39:05 +0000 From: Lorenzo Pieralisi To: "Z.q. Hou" Subject: Re: [PATCHv4 16/28] PCI: mobiveil: refactor Mobiveil PCIe Host Bridge IP driver Message-ID: <20190327173905.GA19093@red-moon> References: <20190311093130.7209-1-Zhiqiang.Hou@nxp.com> <20190311093130.7209-17-Zhiqiang.Hou@nxp.com> <20190326173421.GB10666@e107981-ln.cambridge.arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190327_103839_166200_1C892DA0 X-CRM114-Status: GOOD ( 35.78 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "mark.rutland@arm.com" , "devicetree@vger.kernel.org" , Xiaowei Bao , "linux-pci@vger.kernel.org" , "l.subrahmanya@mobiveil.co.in" , "will.deacon@arm.com" , "linux-kernel@vger.kernel.org" , Leo Li , "M.h. Lian" , "robh+dt@kernel.org" , Mingkai Hu , "catalin.marinas@arm.com" , "bhelgaas@google.com" , "shawnguo@kernel.org" , "linux-arm-kernel@lists.infradead.org" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gV2VkLCBNYXIgMjcsIDIwMTkgYXQgMDI6MDQ6MDBBTSArMDAwMCwgWi5xLiBIb3Ugd3JvdGU6 Cj4gSGkgTG9yZW56bywKPiAKPiBUaGFua3MgZm9yIHlvdXIgY29tbWVudHMhCj4gCj4gPiAtLS0t LU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+ID4gRnJvbTogTG9yZW56byBQaWVyYWxpc2kgPGxvcmVu em8ucGllcmFsaXNpQGFybS5jb20+Cj4gPiBTZW50OiAyMDE55bm0M+aciDI35pelIDE6MzQKPiA+ IFRvOiBaLnEuIEhvdSA8emhpcWlhbmcuaG91QG54cC5jb20+Cj4gPiBDYzogbGludXgtcGNpQHZn ZXIua2VybmVsLm9yZzsgbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOwo+ID4g ZGV2aWNldHJlZUB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7 Cj4gPiBiaGVsZ2Fhc0Bnb29nbGUuY29tOyByb2JoK2R0QGtlcm5lbC5vcmc7IG1hcmsucnV0bGFu ZEBhcm0uY29tOwo+ID4gbC5zdWJyYWhtYW55YUBtb2JpdmVpbC5jby5pbjsgc2hhd25ndW9Aa2Vy bmVsLm9yZzsgTGVvIExpCj4gPiA8bGVveWFuZy5saUBueHAuY29tPjsgY2F0YWxpbi5tYXJpbmFz QGFybS5jb207IHdpbGwuZGVhY29uQGFybS5jb207Cj4gPiBNaW5na2FpIEh1IDxtaW5na2FpLmh1 QG54cC5jb20+OyBNLmguIExpYW4gPG1pbmdodWFuLmxpYW5AbnhwLmNvbT47Cj4gPiBYaWFvd2Vp IEJhbyA8eGlhb3dlaS5iYW9AbnhwLmNvbT4KPiA+IFN1YmplY3Q6IFJlOiBbUEFUQ0h2NCAxNi8y OF0gUENJOiBtb2JpdmVpbDogcmVmYWN0b3IgTW9iaXZlaWwgUENJZSBIb3N0Cj4gPiBCcmlkZ2Ug SVAgZHJpdmVyCj4gPiAKPiA+IE9uIE1vbiwgTWFyIDExLCAyMDE5IGF0IDA5OjMyOjA0QU0gKzAw MDAsIFoucS4gSG91IHdyb3RlOgo+ID4gPiBGcm9tOiBIb3UgWmhpcWlhbmcgPFpoaXFpYW5nLkhv dUBueHAuY29tPgo+ID4gPgo+ID4gPiBBcyB0aGUgTW9iaXZlaWwgUENJZSBjb250cm9sbGVyIHN1 cHBvcnQgUkMmRVAgREFVTCBtb2RlLCBhbmQgdG8gbWFrZQo+ID4gPiBwbGF0Zm9ybXMgd2hpY2gg aW50ZWdyYXRlZCB0aGUgTW9iaXZlaWwgUENJZSBJUCBtb3JlIGVhc3kgdG8gYWRkIHRoZWlyCj4g PiA+IGRyaXZlcnMsIHRoaXMgcGF0Y2ggbW92ZWQgdGhlIE1vYml2ZWlsIGRyaXZlciB0byBhIG5l dyBkaXJlY3RvcnkKPiA+ID4gJ2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvbW9iaXZlaWwnIGFuZCBy ZWZhY3RvcmVkIGl0IGFjY29yZGluZyB0byB0aGUKPiA+ID4gYWJzdHJhY3Rpb24gb2YgUkMmRVAg KEVQIGRyaXZlciB3aWxsIGJlIGFkZGVkIGxhdGVyKS4KPiA+IAo+ID4gSSBkbyBub3Qgd2FudCB0 byBjcmVhdGUgYSBzdWJkaXJlY3RvcnkgZm9yIGV2ZXJ5IGNvbnRyb2xsZXIgdGhhdCBjYW4gd29y ayBpbgo+ID4gUkMmRVAgc28gZHJvcCB0aGlzIHBhdGNoLCBtb3JlIHNvIGdpdmVuIHRoYXQgaXQg d2lsbCBiZSByZXF1aXJlZCAibGF0ZXIiLCB3ZQo+ID4gd2lsbCBjcmVhdGUgYSBkaXJlY3Rvcnkg d2hlbiBhbmQgaWYgd2UgYWN0dWFsbHkgaGF2ZSB0by4KPiAKPiBQbGVhc2UgZG9uJ3QgZHJvcCB0 aGlzIHBhdGNoLCBYaWFvd2VpIEJhbyBoYXMgc2VudCB2MSBvZiB0aGUgRVAgbW9kZQo+IGRyaXZl ciwgd2hpY2ggaXMgZGVwZW5kcyBvbiB0aGlzIHBhdGNoLgoKSSB1bmRlcnN0YW5kIGJ1dCBoZSB3 aWxsIGhhdmUgdG8gcmViYXNlIHRoYXQgY29kZSBhbnl3YXksIEkgZG8Kbm90IHdhbnQgdG8gY3Jl YXRlIGEgZGlyZWN0b3J5IGZvciBtb2JpdmVpbCBiZWZvcmUgSSBzZWUgb3RoZXIKSVBzIGJ1aWx0 IG9uIGl0LCB3ZSBkaWQgbm90IGRvIGl0IGZvciB0aGUgY2FkZW5jZSBhbmQgcm9ja2NoaXAKY29u dHJvbGxlcnMgZWl0aGVyLiBTbyB5b3Ugd2lsbCBoYXZlIHRvIGRyb3AgdGhpcyBwYXRjaCBhbmQK cmV3b3JrIGl0LgoKVGhhbmtzLApMb3JlbnpvCgo+ID4gVGhhbmtzLAo+ID4gTG9yZW56bwo+ID4g Cj4gPiA+IFNpZ25lZC1vZmYtYnk6IEhvdSBaaGlxaWFuZyA8WmhpcWlhbmcuSG91QG54cC5jb20+ Cj4gPiA+IFJldmlld2VkLWJ5OiBNaW5naHVhbiBMaWFuIDxNaW5naHVhbi5MaWFuQG54cC5jb20+ Cj4gPiA+IFJldmlld2VkLWJ5OiBTdWJyYWhtYW55YSBMaW5nYXBwYSA8bC5zdWJyYWhtYW55YUBt b2JpdmVpbC5jby5pbj4KPiA+ID4gLS0tCj4gPiA+IFY0Ogo+ID4gPiAgLSBubyBjaGFuZ2UKPiA+ ID4KPiA+ID4gIE1BSU5UQUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgMiArLQo+ID4gPiAgZHJpdmVycy9wY2kvY29udHJvbGxlci9LY29uZmlnICAgICAgICAgICAg ICAgIHwgIDExICstCj4gPiA+ICBkcml2ZXJzL3BjaS9jb250cm9sbGVyL01ha2VmaWxlICAgICAg ICAgICAgICAgfCAgIDIgKy0KPiA+ID4gIGRyaXZlcnMvcGNpL2NvbnRyb2xsZXIvbW9iaXZlaWwv S2NvbmZpZyAgICAgICB8ICAyNCArCj4gPiA+ICBkcml2ZXJzL3BjaS9jb250cm9sbGVyL21vYml2 ZWlsL01ha2VmaWxlICAgICAgfCAgIDQgKwo+ID4gPiAgLi4uL3BjaWUtbW9iaXZlaWwtaG9zdC5j fSAgICAgICAgICAgICAgICAgICAgIHwgNTI4ICsrKy0tLS0tLS0tLS0tLS0tLQo+ID4gPiAgLi4u L2NvbnRyb2xsZXIvbW9iaXZlaWwvcGNpZS1tb2JpdmVpbC1wbGF0LmMgIHwgIDU0ICsrCj4gPiA+ ICAuLi4vcGNpL2NvbnRyb2xsZXIvbW9iaXZlaWwvcGNpZS1tb2JpdmVpbC5jICAgfCAyMjggKysr KysrKysKPiA+ID4gIC4uLi9wY2kvY29udHJvbGxlci9tb2JpdmVpbC9wY2llLW1vYml2ZWlsLmgg ICB8IDE4NyArKysrKysrCj4gPiA+ICA5IGZpbGVzIGNoYW5nZWQsIDU4NyBpbnNlcnRpb25zKCsp LCA0NTMgZGVsZXRpb25zKC0pICBjcmVhdGUgbW9kZQo+ID4gPiAxMDA2NDQgZHJpdmVycy9wY2kv Y29udHJvbGxlci9tb2JpdmVpbC9LY29uZmlnCj4gPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9wY2kvY29udHJvbGxlci9tb2JpdmVpbC9NYWtlZmlsZQo+ID4gPiAgcmVuYW1lIGRyaXZl cnMvcGNpL2NvbnRyb2xsZXIve3BjaWUtbW9iaXZlaWwuYyA9Pgo+ID4gPiBtb2JpdmVpbC9wY2ll LW1vYml2ZWlsLWhvc3QuY30gKDU1JSkgIGNyZWF0ZSBtb2RlIDEwMDY0NAo+ID4gPiBkcml2ZXJz L3BjaS9jb250cm9sbGVyL21vYml2ZWlsL3BjaWUtbW9iaXZlaWwtcGxhdC5jCj4gPiA+ICBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9wY2kvY29udHJvbGxlci9tb2JpdmVpbC9wY2llLW1vYml2 ZWlsLmMKPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3BjaS9jb250cm9sbGVyL21v Yml2ZWlsL3BjaWUtbW9iaXZlaWwuaAo+ID4gPgo+ID4gPiBkaWZmIC0tZ2l0IGEvTUFJTlRBSU5F UlMgYi9NQUlOVEFJTkVSUyBpbmRleAo+ID4gPiAxZTY0Mjc5ZjMzOGEuLjEwMTNlNzRiMTRmMiAx MDA2NDQKPiA+ID4gLS0tIGEvTUFJTlRBSU5FUlMKPiA+ID4gKysrIGIvTUFJTlRBSU5FUlMKPiA+ ID4gQEAgLTExODc3LDcgKzExODc3LDcgQEAgTToJU3VicmFobWFueWEgTGluZ2FwcGEKPiA+IDxs LnN1YnJhaG1hbnlhQG1vYml2ZWlsLmNvLmluPgo+ID4gPiAgTDoJbGludXgtcGNpQHZnZXIua2Vy bmVsLm9yZwo+ID4gPiAgUzoJU3VwcG9ydGVkCj4gPiA+ICBGOglEb2N1bWVudGF0aW9uL2Rldmlj ZXRyZWUvYmluZGluZ3MvcGNpL21vYml2ZWlsLXBjaWUudHh0Cj4gPiA+IC1GOglkcml2ZXJzL3Bj aS9jb250cm9sbGVyL3BjaWUtbW9iaXZlaWwuYwo+ID4gPiArRjoJZHJpdmVycy9wY2kvY29udHJv bGxlci9tb2JpdmVpbC9wY2llLW1vYml2ZWlsKgo+ID4gPgo+ID4gPiAgUENJIERSSVZFUiBGT1Ig TVZFQlUgKE1hcnZlbGwgQXJtYWRhIDM3MCBhbmQgQXJtYWRhIFhQIFNPQwo+ID4gc3VwcG9ydCkK PiA+ID4gIE06CVRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAYm9vdGxpbi5jb20+ Cj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL0tjb25maWcKPiA+ID4g Yi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL0tjb25maWcgaW5kZXggNjY3MTk0NmRiZjY2Li4wZTk4 MWVkMDBhNzUKPiA+ID4gMTAwNjQ0Cj4gPiA+IC0tLSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIv S2NvbmZpZwo+ID4gPiArKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL0tjb25maWcKPiA+ID4g QEAgLTI0MSwxNiArMjQxLDYgQEAgY29uZmlnIFBDSUVfTUVESUFURUsKPiA+ID4gIAkgIFNheSBZ IGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFBDSWUgY29udHJvbGxlciBzdXBwb3J0IG9uCj4g PiA+ICAJICBNZWRpYVRlayBTb0NzLgo+ID4gPgo+ID4gPiAtY29uZmlnIFBDSUVfTU9CSVZFSUwK PiA+ID4gLQlib29sICJNb2JpdmVpbCBBWEkgUENJZSBjb250cm9sbGVyIgo+ID4gPiAtCWRlcGVu ZHMgb24gQVJDSF9aWU5RTVAgfHwgQ09NUElMRV9URVNUCj4gPiA+IC0JZGVwZW5kcyBvbiBPRgo+ ID4gPiAtCWRlcGVuZHMgb24gUENJX01TSV9JUlFfRE9NQUlOCj4gPiA+IC0JaGVscAo+ID4gPiAt CSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIE1vYml2 ZWlsIEFYSSBQQ0llCj4gPiA+IC0JICBTb2Z0IElQLiBJdCBoYXMgdXAgdG8gOCBvdXRib3VuZCBh bmQgaW5ib3VuZCB3aW5kb3dzCj4gPiA+IC0JICBmb3IgYWRkcmVzcyB0cmFuc2xhdGlvbiBhbmQg aXQgaXMgYSBQQ0llIEdlbjQgSVAuCj4gPiA+IC0KPiA+ID4gIGNvbmZpZyBQQ0lFX1RBTkdPX1NN UDg3NTkKPiA+ID4gIAlib29sICJUYW5nbyBTTVA4NzU5IFBDSWUgY29udHJvbGxlciAoREFOR0VS T1VTKSIKPiA+ID4gIAlkZXBlbmRzIG9uIEFSQ0hfVEFOR08gJiYgUENJX01TSSAmJiBPRiBAQCAt MjgxLDQgKzI3MSw1IEBACj4gPiBjb25maWcKPiA+ID4gVk1ECj4gPiA+ICAJICBtb2R1bGUgd2ls bCBiZSBjYWxsZWQgdm1kLgo+ID4gPgo+ID4gPiAgc291cmNlICJkcml2ZXJzL3BjaS9jb250cm9s bGVyL2R3Yy9LY29uZmlnIgo+ID4gPiArc291cmNlICJkcml2ZXJzL3BjaS9jb250cm9sbGVyL21v Yml2ZWlsL0tjb25maWciCj4gPiA+ICBlbmRtZW51Cj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJz L3BjaS9jb250cm9sbGVyL01ha2VmaWxlCj4gPiA+IGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9N YWtlZmlsZSBpbmRleCBkNTZhNTA3NDk1YzUuLmI3OWE2MTUwNDFhMAo+ID4gPiAxMDA2NDQKPiA+ ID4gLS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9NYWtlZmlsZQo+ID4gPiArKysgYi9kcml2 ZXJzL3BjaS9jb250cm9sbGVyL01ha2VmaWxlCj4gPiA+IEBAIC0yNiwxMSArMjYsMTEgQEAgb2Jq LSQoQ09ORklHX1BDSUVfUk9DS0NISVApICs9IHBjaWUtcm9ja2NoaXAubwo+ID4gPiAgb2JqLSQo Q09ORklHX1BDSUVfUk9DS0NISVBfRVApICs9IHBjaWUtcm9ja2NoaXAtZXAubwo+ID4gPiAgb2Jq LSQoQ09ORklHX1BDSUVfUk9DS0NISVBfSE9TVCkgKz0gcGNpZS1yb2NrY2hpcC1ob3N0Lm8KPiA+ ID4gIG9iai0kKENPTkZJR19QQ0lFX01FRElBVEVLKSArPSBwY2llLW1lZGlhdGVrLm8KPiA+ID4g LW9iai0kKENPTkZJR19QQ0lFX01PQklWRUlMKSArPSBwY2llLW1vYml2ZWlsLm8KPiA+ID4gIG9i ai0kKENPTkZJR19QQ0lFX1RBTkdPX1NNUDg3NTkpICs9IHBjaWUtdGFuZ28ubwo+ID4gPiAgb2Jq LSQoQ09ORklHX1ZNRCkgKz0gdm1kLm8KPiA+ID4gICMgcGNpZS1oaXNpLm8gcXVpcmtzIGFyZSBu ZWVkZWQgZXZlbiB3aXRob3V0IENPTkZJR19QQ0lFX0RXCj4gPiA+ICBvYmoteQkJCQkrPSBkd2Mv Cj4gPiA+ICtvYmoteQkJCQkrPSBtb2JpdmVpbC8KPiA+ID4KPiA+ID4KPiA+ID4gICMgVGhlIGZv bGxvd2luZyBkcml2ZXJzIGFyZSBmb3IgZGV2aWNlcyB0aGF0IHVzZSB0aGUgZ2VuZXJpYyBBQ1BJ Cj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL21vYml2ZWlsL0tjb25m aWcKPiA+ID4gYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL21vYml2ZWlsL0tjb25maWcKPiA+ID4g bmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi42NDM0M2MwN2Jm ZWQKPiA+ID4gLS0tIC9kZXYvbnVsbAo+ID4gPiArKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVy L21vYml2ZWlsL0tjb25maWcKPiA+ID4gQEAgLTAsMCArMSwyNCBAQAo+ID4gPiArIyBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ID4gPiArCj4gPiA+ICttZW51ICJNb2JpdmVpbCBQ Q0llIENvcmUgU3VwcG9ydCIKPiA+ID4gKwlkZXBlbmRzIG9uIFBDSQo+ID4gPiArCj4gPiA+ICtj b25maWcgUENJRV9NT0JJVkVJTAo+ID4gPiArCWJvb2wKPiA+ID4gKwo+ID4gPiArY29uZmlnIFBD SUVfTU9CSVZFSUxfSE9TVAo+ID4gPiArICAgICAgICBib29sCj4gPiA+ICsJZGVwZW5kcyBvbiBQ Q0lfTVNJX0lSUV9ET01BSU4KPiA+ID4gKyAgICAgICAgc2VsZWN0IFBDSUVfTU9CSVZFSUwKPiA+ ID4gKwo+ID4gPiArY29uZmlnIFBDSUVfTU9CSVZFSUxfUExBVAo+ID4gPiArCWJvb2wgIk1vYml2 ZWlsIEFYSSBQQ0llIGNvbnRyb2xsZXIiCj4gPiA+ICsJZGVwZW5kcyBvbiBBUkNIX1pZTlFNUCB8 fCBDT01QSUxFX1RFU1QKPiA+ID4gKwlkZXBlbmRzIG9uIE9GCj4gPiA+ICsJc2VsZWN0IFBDSUVf TU9CSVZFSUxfSE9TVAo+ID4gPiArCWhlbHAKPiA+ID4gKwkgIFNheSBZIGhlcmUgaWYgeW91IHdh bnQgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBNb2JpdmVpbCBBWEkgUENJZQo+ID4gPiArCSAg U29mdCBJUC4gSXQgaGFzIHVwIHRvIDggb3V0Ym91bmQgYW5kIGluYm91bmQgd2luZG93cwo+ID4g PiArCSAgZm9yIGFkZHJlc3MgdHJhbnNsYXRpb24gYW5kIGl0IGlzIGEgUENJZSBHZW40IElQLgo+ ID4gPiArCj4gPiA+ICtlbmRtZW51Cj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250 cm9sbGVyL21vYml2ZWlsL01ha2VmaWxlCj4gPiA+IGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9t b2JpdmVpbC9NYWtlZmlsZQo+ID4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gPiBpbmRleCAw MDAwMDAwMDAwMDAuLjlmYjZkMWM2NTA0ZAo+ID4gPiAtLS0gL2Rldi9udWxsCj4gPiA+ICsrKyBi L2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvbW9iaXZlaWwvTWFrZWZpbGUKPiA+ID4gQEAgLTAsMCAr MSw0IEBACj4gPiA+ICsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gPiA+ICtv YmotJChDT05GSUdfUENJRV9NT0JJVkVJTCkgKz0gcGNpZS1tb2JpdmVpbC5vCj4gPiA+ICtvYmot JChDT05GSUdfUENJRV9NT0JJVkVJTF9IT1NUKSArPSBwY2llLW1vYml2ZWlsLWhvc3Qubwo+ID4g PiArb2JqLSQoQ09ORklHX1BDSUVfTU9CSVZFSUxfUExBVCkgKz0gcGNpZS1tb2JpdmVpbC1wbGF0 Lm8KPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1tb2JpdmVp bC5jCj4gPiA+IGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9tb2JpdmVpbC9wY2llLW1vYml2ZWls LWhvc3QuYwo+ID4gPiBzaW1pbGFyaXR5IGluZGV4IDU1JQo+ID4gPiByZW5hbWUgZnJvbSBkcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtbW9iaXZlaWwuYwo+ID4gPiByZW5hbWUgdG8gZHJpdmVy cy9wY2kvY29udHJvbGxlci9tb2JpdmVpbC9wY2llLW1vYml2ZWlsLWhvc3QuYwo+ID4gPiBpbmRl eCA5MjEwMTY1ZmU4YzAuLmRjNTMyNGQ5NDQ2NiAxMDA2NDQKPiA+ID4gLS0tIGEvZHJpdmVycy9w Y2kvY29udHJvbGxlci9wY2llLW1vYml2ZWlsLmMKPiA+ID4gKysrIGIvZHJpdmVycy9wY2kvY29u dHJvbGxlci9tb2JpdmVpbC9wY2llLW1vYml2ZWlsLWhvc3QuYwo+ID4gPiBAQCAtNCw5ICs0LDkg QEAKPiA+ID4gICAqCj4gPiA+ICAgKiBDb3B5cmlnaHQgKGMpIDIwMTggTW9iaXZlaWwgSW5jLgo+ ID4gPiAgICogQXV0aG9yOiBTdWJyYWhtYW55YSBMaW5nYXBwYSA8bC5zdWJyYWhtYW55YUBtb2Jp dmVpbC5jby5pbj4KPiA+ID4gKyAqIFJlZmFjdG9yOiBaaGlxaWFuZyBIb3UgPFpoaXFpYW5nLkhv dUBueHAuY29tPgo+ID4gPiAgICovCj4gPiA+Cj4gPiA+IC0jaW5jbHVkZSA8bGludXgvZGVsYXku aD4KPiA+ID4gICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4gPiA+ICAjaW5jbHVkZSA8bGludXgv aW50ZXJydXB0Lmg+Cj4gPiA+ICAjaW5jbHVkZSA8bGludXgvaXJxLmg+Cj4gPiA+IEBAIC0yMywy NzUgKzIzLDIxIEBACj4gPiA+ICAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4g PiA+ICAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ID4gPgo+ID4gPiAtI2luY2x1ZGUgIi4uL3Bj aS5oIgo+ID4gPiAtCj4gPiA+IC0vKiByZWdpc3RlciBvZmZzZXRzIGFuZCBiaXQgcG9zaXRpb25z ICovCj4gPiA+IC0KPiA+ID4gLS8qCj4gPiA+IC0gKiB0cmFuc2xhdGlvbiB0YWJsZXMgYXJlIGdy b3VwZWQgaW50byB3aW5kb3dzLCBlYWNoIHdpbmRvdyByZWdpc3RlcnMKPiA+ID4gYXJlCj4gPiA+ IC0gKiBncm91cGVkIGludG8gYmxvY2tzIG9mIDQgb3IgMTYgcmVnaXN0ZXJzIGVhY2gKPiA+ID4g LSAqLwo+ID4gPiAtI2RlZmluZSBQQUJfUkVHX0JMT0NLX1NJWkUJCTE2Cj4gPiA+IC0jZGVmaW5l IFBBQl9FWFRfUkVHX0JMT0NLX1NJWkUJCTQKPiA+ID4gLQo+ID4gPiAtI2RlZmluZSBQQUJfUkVH X0FERFIob2Zmc2V0LCB3aW4pCVwKPiA+ID4gLQkob2Zmc2V0ICsgKHdpbiAqIFBBQl9SRUdfQkxP Q0tfU0laRSkpCj4gPiA+IC0jZGVmaW5lIFBBQl9FWFRfUkVHX0FERFIob2Zmc2V0LCB3aW4pCVwK PiA+ID4gLQkob2Zmc2V0ICsgKHdpbiAqIFBBQl9FWFRfUkVHX0JMT0NLX1NJWkUpKQo+ID4gPiAt Cj4gPiA+IC0jZGVmaW5lIExUU1NNX1NUQVRVUwkJCTB4MDQwNAo+ID4gPiAtI2RlZmluZSAgTFRT U01fU1RBVFVTX0wwX01BU0sJCTB4M2YKPiA+ID4gLSNkZWZpbmUgIExUU1NNX1NUQVRVU19MMAkJ MHgyZAo+ID4gPiAtCj4gPiA+IC0jZGVmaW5lIFBBQl9DVFJMCQkJMHgwODA4Cj4gPiA+IC0jZGVm aW5lICBBTUJBX1BJT19FTkFCTEVfU0hJRlQJCTAKPiA+ID4gLSNkZWZpbmUgIFBFWF9QSU9fRU5B QkxFX1NISUZUCQkxCj4gPiA+IC0jZGVmaW5lICBQQUdFX1NFTF9TSElGVAkJCTEzCj4gPiA+IC0j ZGVmaW5lICBQQUdFX1NFTF9NQVNLCQkJMHgzZgo+ID4gPiAtI2RlZmluZSAgUEFHRV9MT19NQVNL CQkJMHgzZmYKPiA+ID4gLSNkZWZpbmUgIFBBR0VfU0VMX09GRlNFVF9TSElGVAkJMTAKPiA+ID4g LQo+ID4gPiAtI2RlZmluZSBQQUJfQVhJX1BJT19DVFJMCQkweDA4NDAKPiA+ID4gLSNkZWZpbmUg IEFQSU9fRU5fTUFTSwkJCTB4Zgo+ID4gPiAtCj4gPiA+IC0jZGVmaW5lIFBBQl9QRVhfUElPX0NU UkwJCTB4MDhjMAo+ID4gPiAtI2RlZmluZSAgUElPX0VOQUJMRV9TSElGVAkJMAo+ID4gPiAtCj4g PiA+IC0jZGVmaW5lIFBBQl9JTlRQX0FNQkFfTUlTQ19FTkIJCTB4MGIwYwo+ID4gPiAtI2RlZmlu ZSBQQUJfSU5UUF9BTUJBX01JU0NfU1RBVAkJMHgwYjFjCj4gPiA+IC0jZGVmaW5lICBQQUJfSU5U UF9JTlRYX01BU0sJCTB4MDFlMAo+ID4gPiAtI2RlZmluZSAgUEFCX0lOVFBfTVNJX01BU0sJCTB4 OAo+ID4gPiAtCj4gPiA+IC0jZGVmaW5lIFBBQl9BWElfQU1BUF9DVFJMKHdpbikJCVBBQl9SRUdf QUREUigweDBiYTAsIHdpbikKPiA+ID4gLSNkZWZpbmUgIFdJTl9FTkFCTEVfU0hJRlQJCTAKPiA+ ID4gLSNkZWZpbmUgIFdJTl9UWVBFX1NISUZUCQkJMQo+ID4gPiAtI2RlZmluZSAgV0lOX1RZUEVf TUFTSwkJCTB4Mwo+ID4gPiAtI2RlZmluZSAgV0lOX1NJWkVfU0hJRlQJCQkxMAo+ID4gPiAtI2Rl ZmluZSAgV0lOX1NJWkVfTUFTSwkJCTB4M2ZmZmZmCj4gPiA+IC0KPiA+ID4gLSNkZWZpbmUgUEFC X0VYVF9BWElfQU1BUF9TSVpFKHdpbikJUEFCX0VYVF9SRUdfQUREUigweGJhZjAsCj4gPiB3aW4p Cj4gPiA+IC0KPiA+ID4gLSNkZWZpbmUgUEFCX0VYVF9BWElfQU1BUF9BWElfV0lOKHdpbikKPiA+ IAlQQUJfRVhUX1JFR19BRERSKDB4ODBhMCwgd2luKQo+ID4gPiAtI2RlZmluZSBQQUJfQVhJX0FN QVBfQVhJX1dJTih3aW4pCVBBQl9SRUdfQUREUigweDBiYTQsIHdpbikKPiA+ID4gLSNkZWZpbmUg IEFYSV9XSU5ET1dfQUxJR05fTUFTSwkJMwo+ID4gPiAtCj4gPiA+IC0jZGVmaW5lIFBBQl9BWElf QU1BUF9QRVhfV0lOX0wod2luKQlQQUJfUkVHX0FERFIoMHgwYmE4LAo+ID4gd2luKQo+ID4gPiAt I2RlZmluZSAgUEFCX0JVU19TSElGVAkJCTI0Cj4gPiA+IC0jZGVmaW5lICBQQUJfREVWSUNFX1NI SUZUCQkxOQo+ID4gPiAtI2RlZmluZSAgUEFCX0ZVTkNUSU9OX1NISUZUCQkxNgo+ID4gPiAtCj4g PiA+IC0jZGVmaW5lIFBBQl9BWElfQU1BUF9QRVhfV0lOX0god2luKQlQQUJfUkVHX0FERFIoMHgw YmFjLAo+ID4gd2luKQo+ID4gPiAtI2RlZmluZSBQQUJfSU5UUF9BWElfUElPX0NMQVNTCQkweDQ3 NAo+ID4gPiAtCj4gPiA+IC0jZGVmaW5lIFBBQl9QRVhfQU1BUF9DVFJMKHdpbikJCVBBQl9SRUdf QUREUigweDRiYTAsIHdpbikKPiA+ID4gLSNkZWZpbmUgIEFNQVBfQ1RSTF9FTl9TSElGVAkJMAo+ ID4gPiAtI2RlZmluZSAgQU1BUF9DVFJMX1RZUEVfU0hJRlQJCTEKPiA+ID4gLSNkZWZpbmUgIEFN QVBfQ1RSTF9UWVBFX01BU0sJCTMKPiA+ID4gLQo+ID4gPiAtI2RlZmluZSBQQUJfRVhUX1BFWF9B TUFQX1NJWkVOKHdpbikJUEFCX0VYVF9SRUdfQUREUigweGJlZjAsCj4gPiB3aW4pCj4gPiA+IC0j ZGVmaW5lIFBBQl9FWFRfUEVYX0FNQVBfQVhJX1dJTih3aW4pCj4gPiAJUEFCX0VYVF9SRUdfQURE UigweGI0YTAsIHdpbikKPiA+ID4gLSNkZWZpbmUgUEFCX1BFWF9BTUFQX0FYSV9XSU4od2luKQlQ QUJfUkVHX0FERFIoMHg0YmE0LCB3aW4pCj4gPiA+IC0jZGVmaW5lIFBBQl9QRVhfQU1BUF9QRVhf V0lOX0wod2luKQlQQUJfUkVHX0FERFIoMHg0YmE4LAo+ID4gd2luKQo+ID4gPiAtI2RlZmluZSBQ QUJfUEVYX0FNQVBfUEVYX1dJTl9IKHdpbikJUEFCX1JFR19BRERSKDB4NGJhYywKPiA+IHdpbikK PiA+ID4gLQo+ID4gPiAtLyogc3RhcnRpbmcgb2Zmc2V0IG9mIElOVFggYml0cyBpbiBzdGF0dXMg cmVnaXN0ZXIgKi8KPiA+ID4gLSNkZWZpbmUgUEFCX0lOVFhfU1RBUlQJCQk1Cj4gPiA+IC0KPiA+ ID4gLS8qIHN1cHBvcnRlZCBudW1iZXIgb2YgTVNJIGludGVycnVwdHMgKi8KPiA+ID4gLSNkZWZp bmUgUENJX05VTV9NU0kJCQkxNgo+ID4gPiAtCj4gPiA+IC0vKiBNU0kgcmVnaXN0ZXJzICovCj4g PiA+IC0jZGVmaW5lIE1TSV9CQVNFX0xPX09GRlNFVAkJMHgwNAo+ID4gPiAtI2RlZmluZSBNU0lf QkFTRV9ISV9PRkZTRVQJCTB4MDgKPiA+ID4gLSNkZWZpbmUgTVNJX1NJWkVfT0ZGU0VUCQkJMHgw Ywo+ID4gPiAtI2RlZmluZSBNU0lfRU5BQkxFX09GRlNFVAkJMHgxNAo+ID4gPiAtI2RlZmluZSBN U0lfU1RBVFVTX09GRlNFVAkJMHgxOAo+ID4gPiAtI2RlZmluZSBNU0lfREFUQV9PRkZTRVQJCQkw eDIwCj4gPiA+IC0jZGVmaW5lIE1TSV9BRERSX0xfT0ZGU0VUCQkweDI0Cj4gPiA+IC0jZGVmaW5l IE1TSV9BRERSX0hfT0ZGU0VUCQkweDI4Cj4gPiA+IC0KPiA+ID4gLS8qIG91dGJvdW5kIGFuZCBp bmJvdW5kIHdpbmRvdyBkZWZpbml0aW9ucyAqLwo+ID4gPiAtI2RlZmluZSBXSU5fTlVNXzAJCQkw Cj4gPiA+IC0jZGVmaW5lIFdJTl9OVU1fMQkJCTEKPiA+ID4gLSNkZWZpbmUgQ0ZHX1dJTkRPV19U WVBFCQkJMAo+ID4gPiAtI2RlZmluZSBJT19XSU5ET1dfVFlQRQkJCTEKPiA+ID4gLSNkZWZpbmUg TUVNX1dJTkRPV19UWVBFCQkJMgo+ID4gPiAtI2RlZmluZSBJQl9XSU5fU0laRQkJCSgodTY0KTI1 NiAqIDEwMjQgKiAxMDI0ICogMTAyNCkKPiA+ID4gLSNkZWZpbmUgTUFYX1BJT19XSU5ET1dTCQkJ OAo+ID4gPiAtCj4gPiA+IC0vKiBQYXJhbWV0ZXJzIGZvciB0aGUgd2FpdGluZyBmb3IgbGluayB1 cCByb3V0aW5lICovCj4gPiA+IC0jZGVmaW5lIExJTktfV0FJVF9NQVhfUkVUUklFUwkJMTAKPiA+ ID4gLSNkZWZpbmUgTElOS19XQUlUX01JTgkJCTkwMDAwCj4gPiA+IC0jZGVmaW5lIExJTktfV0FJ VF9NQVgJCQkxMDAwMDAKPiA+ID4gLQo+ID4gPiAtI2RlZmluZSBQQUdFRF9BRERSX0JORFJZCQkw eGMwMAo+ID4gPiAtI2RlZmluZSBPRkZTRVRfVE9fUEFHRV9BRERSKG9mZikJXAo+ID4gPiAtCSgo b2ZmICYgUEFHRV9MT19NQVNLKSB8IFBBR0VEX0FERFJfQk5EUlkpCj4gPiA+IC0jZGVmaW5lIE9G RlNFVF9UT19QQUdFX0lEWChvZmYpCQlcCj4gPiA+IC0JKChvZmYgPj4gUEFHRV9TRUxfT0ZGU0VU X1NISUZUKSAmIFBBR0VfU0VMX01BU0spCj4gPiA+IC0KPiA+ID4gLXN0cnVjdCBtb2JpdmVpbF9t c2kgewkJCS8qIE1TSSBpbmZvcm1hdGlvbiAqLwo+ID4gPiAtCXN0cnVjdCBtdXRleCBsb2NrOwkJ LyogcHJvdGVjdCBiaXRtYXAgdmFyaWFibGUgKi8KPiA+ID4gLQlzdHJ1Y3QgaXJxX2RvbWFpbiAq bXNpX2RvbWFpbjsKPiA+ID4gLQlzdHJ1Y3QgaXJxX2RvbWFpbiAqZGV2X2RvbWFpbjsKPiA+ID4g LQlwaHlzX2FkZHJfdCBtc2lfcGFnZXNfcGh5czsKPiA+ID4gLQlpbnQgbnVtX29mX3ZlY3RvcnM7 Cj4gPiA+IC0JREVDTEFSRV9CSVRNQVAobXNpX2lycV9pbl91c2UsIFBDSV9OVU1fTVNJKTsKPiA+ ID4gLX07Cj4gPiA+IC0KPiA+ID4gLXN0cnVjdCBtb2JpdmVpbF9wY2llIHsKPiA+ID4gLQlzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Owo+ID4gPiAtCXN0cnVjdCBsaXN0X2hlYWQgcmVzb3Vy Y2VzOwo+ID4gPiAtCXZvaWQgX19pb21lbSAqY29uZmlnX2F4aV9zbGF2ZV9iYXNlOwkvKiBlbmRw b2ludCBjb25maWcgYmFzZSAqLwo+ID4gPiAtCXZvaWQgX19pb21lbSAqY3NyX2F4aV9zbGF2ZV9i YXNlOwkvKiByb290IHBvcnQgY29uZmlnIGJhc2UgKi8KPiA+ID4gLQl2b2lkIF9faW9tZW0gKmFw Yl9jc3JfYmFzZTsJLyogTVNJIHJlZ2lzdGVyIGJhc2UgKi8KPiA+ID4gLQlwaHlzX2FkZHJfdCBw Y2llX3JlZ19iYXNlOwkvKiBQaHlzaWNhbCBQQ0llIENvbnRyb2xsZXIgQmFzZSAqLwo+ID4gPiAt CXN0cnVjdCBpcnFfZG9tYWluICppbnR4X2RvbWFpbjsKPiA+ID4gLQlyYXdfc3BpbmxvY2tfdCBp bnR4X21hc2tfbG9jazsKPiA+ID4gLQlpbnQgaXJxOwo+ID4gPiAtCWludCBhcGlvX3dpbnM7Cj4g PiA+IC0JaW50IHBwaW9fd2luczsKPiA+ID4gLQlpbnQgb2Jfd2luc19jb25maWd1cmVkOwkJLyog Y29uZmlndXJlZCBvdXRib3VuZCB3aW5kb3dzICovCj4gPiA+IC0JaW50IGliX3dpbnNfY29uZmln dXJlZDsJCS8qIGNvbmZpZ3VyZWQgaW5ib3VuZCB3aW5kb3dzICovCj4gPiA+IC0Jc3RydWN0IHJl c291cmNlICpvYl9pb19yZXM7Cj4gPiA+IC0JY2hhciByb290X2J1c19ucjsKPiA+ID4gLQlzdHJ1 Y3QgbW9iaXZlaWxfbXNpIG1zaTsKPiA+ID4gLX07Cj4gPiA+IC0KPiA+ID4gLS8qCj4gPiA+IC0g KiBtb2JpdmVpbF9wY2llX3NlbF9wYWdlIC0gcm91dGluZSB0byBhY2Nlc3MgcGFnZWQgcmVnaXN0 ZXIKPiA+ID4gLSAqCj4gPiA+IC0gKiBSZWdpc3RlcnMgd2hvc2UgYWRkcmVzcyBncmVhdGVyIHRo YW4gUEFHRURfQUREUl9CTkRSWSAoMHhjMDApIGFyZQo+ID4gPiBwYWdlZCwKPiA+ID4gLSAqIGZv ciB0aGlzIHNjaGVtZSB0byB3b3JrIGV4dHJhY3RlZCBoaWdoZXIgNiBiaXRzIG9mIHRoZSBvZmZz ZXQgd2lsbAo+ID4gPiBiZQo+ID4gPiAtICogd3JpdHRlbiB0byBwZ19zZWwgZmllbGQgb2YgUEFC X0NUUkwgcmVnaXN0ZXIgYW5kIHJlc3Qgb2YgdGhlIGxvd2VyCj4gPiA+IDEwCj4gPiA+IC0gKiBi aXRzIGVuYWJsZWQgd2l0aCBQQUdFRF9BRERSX0JORFJZIGFyZSB1c2VkIGFzIG9mZnNldCBvZiB0 aGUKPiA+IHJlZ2lzdGVyLgo+ID4gPiAtICovCj4gPiA+IC1zdGF0aWMgdm9pZCBtb2JpdmVpbF9w Y2llX3NlbF9wYWdlKHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llLCB1OAo+ID4gPiBwZ19pZHgp IC17Cj4gPiA+IC0JdTMyIHZhbDsKPiA+ID4gLQo+ID4gPiAtCXZhbCA9IHJlYWRsKHBjaWUtPmNz cl9heGlfc2xhdmVfYmFzZSArIFBBQl9DVFJMKTsKPiA+ID4gLQl2YWwgJj0gfihQQUdFX1NFTF9N QVNLIDw8IFBBR0VfU0VMX1NISUZUKTsKPiA+ID4gLQl2YWwgfD0gKHBnX2lkeCAmIFBBR0VfU0VM X01BU0spIDw8IFBBR0VfU0VMX1NISUZUOwo+ID4gPiAtCj4gPiA+IC0Jd3JpdGVsKHZhbCwgcGNp ZS0+Y3NyX2F4aV9zbGF2ZV9iYXNlICsgUEFCX0NUUkwpOwo+ID4gPiAtfQo+ID4gPiAtCj4gPiA+ IC1zdGF0aWMgdm9pZCAqbW9iaXZlaWxfcGNpZV9jb21wX2FkZHIoc3RydWN0IG1vYml2ZWlsX3Bj aWUgKnBjaWUsIHUzMgo+ID4gPiBvZmYpIC17Cj4gPiA+IC0JaWYgKG9mZiA8IFBBR0VEX0FERFJf Qk5EUlkpIHsKPiA+ID4gLQkJLyogRm9yIGRpcmVjdGx5IGFjY2Vzc2VkIHJlZ2lzdGVycywgY2xl YXIgdGhlIHBnX3NlbCBmaWVsZCAqLwo+ID4gPiAtCQltb2JpdmVpbF9wY2llX3NlbF9wYWdlKHBj aWUsIDApOwo+ID4gPiAtCQlyZXR1cm4gcGNpZS0+Y3NyX2F4aV9zbGF2ZV9iYXNlICsgb2ZmOwo+ ID4gPiAtCX0KPiA+ID4gLQo+ID4gPiAtCW1vYml2ZWlsX3BjaWVfc2VsX3BhZ2UocGNpZSwgT0ZG U0VUX1RPX1BBR0VfSURYKG9mZikpOwo+ID4gPiAtCXJldHVybiBwY2llLT5jc3JfYXhpX3NsYXZl X2Jhc2UgKyBPRkZTRVRfVE9fUEFHRV9BRERSKG9mZik7Cj4gPiA+IC19Cj4gPiA+IC0KPiA+ID4g LXN0YXRpYyBpbnQgbW9iaXZlaWxfcGNpZV9yZWFkKHZvaWQgX19pb21lbSAqYWRkciwgaW50IHNp emUsIHUzMiAqdmFsKQo+ID4gPiAtewo+ID4gPiAtCWlmICgodWludHB0cl90KWFkZHIgJiAoc2l6 ZSAtIDEpKSB7Cj4gPiA+IC0JCSp2YWwgPSAwOwo+ID4gPiAtCQlyZXR1cm4gUENJQklPU19CQURf UkVHSVNURVJfTlVNQkVSOwo+ID4gPiAtCX0KPiA+ID4gLQo+ID4gPiAtCXN3aXRjaCAoc2l6ZSkg ewo+ID4gPiAtCWNhc2UgNDoKPiA+ID4gLQkJKnZhbCA9IHJlYWRsKGFkZHIpOwo+ID4gPiAtCQli cmVhazsKPiA+ID4gLQljYXNlIDI6Cj4gPiA+IC0JCSp2YWwgPSByZWFkdyhhZGRyKTsKPiA+ID4g LQkJYnJlYWs7Cj4gPiA+IC0JY2FzZSAxOgo+ID4gPiAtCQkqdmFsID0gcmVhZGIoYWRkcik7Cj4g PiA+IC0JCWJyZWFrOwo+ID4gPiAtCWRlZmF1bHQ6Cj4gPiA+IC0JCSp2YWwgPSAwOwo+ID4gPiAt CQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwo+ID4gPiAtCX0KPiA+ID4gLQo+ ID4gPiAtCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cj4gPiA+IC19Cj4gPiA+IC0KPiA+ID4g LXN0YXRpYyBpbnQgbW9iaXZlaWxfcGNpZV93cml0ZSh2b2lkIF9faW9tZW0gKmFkZHIsIGludCBz aXplLCB1MzIgdmFsKQo+ID4gPiAtewo+ID4gPiAtCWlmICgodWludHB0cl90KWFkZHIgJiAoc2l6 ZSAtIDEpKQo+ID4gPiAtCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwo+ID4g PiAtCj4gPiA+IC0Jc3dpdGNoIChzaXplKSB7Cj4gPiA+IC0JY2FzZSA0Ogo+ID4gPiAtCQl3cml0 ZWwodmFsLCBhZGRyKTsKPiA+ID4gLQkJYnJlYWs7Cj4gPiA+IC0JY2FzZSAyOgo+ID4gPiAtCQl3 cml0ZXcodmFsLCBhZGRyKTsKPiA+ID4gLQkJYnJlYWs7Cj4gPiA+IC0JY2FzZSAxOgo+ID4gPiAt CQl3cml0ZWIodmFsLCBhZGRyKTsKPiA+ID4gLQkJYnJlYWs7Cj4gPiA+IC0JZGVmYXVsdDoKPiA+ ID4gLQkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKPiA+ID4gLQl9Cj4gPiA+ IC0KPiA+ID4gLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwo+ID4gPiAtfQo+ID4gPiAtCj4g PiA+IC1zdGF0aWMgdTMyIGNzcl9yZWFkKHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llLCB1MzIg b2ZmLCBzaXplX3Qgc2l6ZSkKPiA+ID4gLXsKPiA+ID4gLQl2b2lkICphZGRyOwo+ID4gPiAtCXUz MiB2YWw7Cj4gPiA+IC0JaW50IHJldDsKPiA+ID4gLQo+ID4gPiAtCWFkZHIgPSBtb2JpdmVpbF9w Y2llX2NvbXBfYWRkcihwY2llLCBvZmYpOwo+ID4gPiAtCj4gPiA+IC0JcmV0ID0gbW9iaXZlaWxf cGNpZV9yZWFkKGFkZHIsIHNpemUsICZ2YWwpOwo+ID4gPiAtCWlmIChyZXQpCj4gPiA+IC0JCWRl dl9lcnIoJnBjaWUtPnBkZXYtPmRldiwgInJlYWQgQ1NSIGFkZHJlc3MgZmFpbGVkXG4iKTsKPiA+ ID4gLQo+ID4gPiAtCXJldHVybiB2YWw7Cj4gPiA+IC19Cj4gPiA+IC0KPiA+ID4gLXN0YXRpYyB2 b2lkIGNzcl93cml0ZShzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSwgdTMyIHZhbCwgdTMyIG9m ZiwKPiA+ID4gc2l6ZV90IHNpemUpIC17Cj4gPiA+IC0Jdm9pZCAqYWRkcjsKPiA+ID4gLQlpbnQg cmV0Owo+ID4gPiAtCj4gPiA+IC0JYWRkciA9IG1vYml2ZWlsX3BjaWVfY29tcF9hZGRyKHBjaWUs IG9mZik7Cj4gPiA+IC0KPiA+ID4gLQlyZXQgPSBtb2JpdmVpbF9wY2llX3dyaXRlKGFkZHIsIHNp emUsIHZhbCk7Cj4gPiA+IC0JaWYgKHJldCkKPiA+ID4gLQkJZGV2X2VycigmcGNpZS0+cGRldi0+ ZGV2LCAid3JpdGUgQ1NSIGFkZHJlc3MgZmFpbGVkXG4iKTsKPiA+ID4gLX0KPiA+ID4gLQo+ID4g PiAtc3RhdGljIHUzMiBjc3JfcmVhZGwoc3RydWN0IG1vYml2ZWlsX3BjaWUgKnBjaWUsIHUzMiBv ZmYpIC17Cj4gPiA+IC0JcmV0dXJuIGNzcl9yZWFkKHBjaWUsIG9mZiwgMHg0KTsKPiA+ID4gLX0K PiA+ID4gLQo+ID4gPiAtc3RhdGljIHZvaWQgY3NyX3dyaXRlbChzdHJ1Y3QgbW9iaXZlaWxfcGNp ZSAqcGNpZSwgdTMyIHZhbCwgdTMyIG9mZikKPiA+ID4gLXsKPiA+ID4gLQljc3Jfd3JpdGUocGNp ZSwgdmFsLCBvZmYsIDB4NCk7Cj4gPiA+IC19Cj4gPiA+IC0KPiA+ID4gLXN0YXRpYyBib29sIG1v Yml2ZWlsX3BjaWVfbGlua191cChzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSkgLXsKPiA+ID4g LQlyZXR1cm4gKGNzcl9yZWFkbChwY2llLCBMVFNTTV9TVEFUVVMpICYKPiA+ID4gLQkJTFRTU01f U1RBVFVTX0wwX01BU0spID09IExUU1NNX1NUQVRVU19MMDsKPiA+ID4gLX0KPiA+ID4gKyNpbmNs dWRlICJwY2llLW1vYml2ZWlsLmgiCj4gPiA+Cj4gPiA+ICBzdGF0aWMgYm9vbCBtb2JpdmVpbF9w Y2llX3ZhbGlkX2RldmljZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZAo+ID4gPiBpbnQg ZGV2Zm4pICB7Cj4gPiA+ICAJc3RydWN0IG1vYml2ZWlsX3BjaWUgKnBjaWUgPSBidXMtPnN5c2Rh dGE7Cj4gPiA+Cj4gPiA+ICAJLyogT25seSBvbmUgZGV2aWNlIGRvd24gb24gZWFjaCByb290IHBv cnQgKi8KPiA+ID4gLQlpZiAoKGJ1cy0+bnVtYmVyID09IHBjaWUtPnJvb3RfYnVzX25yKSAmJiAo ZGV2Zm4gPiAwKSkKPiA+ID4gKwlpZiAoKGJ1cy0+bnVtYmVyID09IHBjaWUtPnJwLnJvb3RfYnVz X25yKSAmJiAoZGV2Zm4gPiAwKSkKPiA+ID4gIAkJcmV0dXJuIGZhbHNlOwo+ID4gPgo+ID4gPiAg CS8qCj4gPiA+ICAJICogRG8gbm90IHJlYWQgbW9yZSB0aGFuIG9uZSBkZXZpY2Ugb24gdGhlIGJ1 cyBkaXJlY3RseQo+ID4gPiAgCSAqIGF0dGFjaGVkIHRvIFJDCj4gPiA+ICAJICovCj4gPiA+IC0J aWYgKChidXMtPnByaW1hcnkgPT0gcGNpZS0+cm9vdF9idXNfbnIpICYmIChkZXZmbiA+IDApKQo+ ID4gPiArCWlmICgoYnVzLT5wcmltYXJ5ID09IHBjaWUtPnJwLnJvb3RfYnVzX25yKSAmJiAoZGV2 Zm4gPiAwKSkKPiA+ID4gIAkJcmV0dXJuIGZhbHNlOwo+ID4gPgo+ID4gPiAgCXJldHVybiB0cnVl Owo+ID4gPiBAQCAtMzExLDcgKzU3LDcgQEAgc3RhdGljIHZvaWQgX19pb21lbSAqbW9iaXZlaWxf cGNpZV9tYXBfYnVzKHN0cnVjdAo+ID4gcGNpX2J1cyAqYnVzLAo+ID4gPiAgCQlyZXR1cm4gTlVM TDsKPiA+ID4KPiA+ID4gIAkvKiBSQyBjb25maWcgYWNjZXNzICovCj4gPiA+IC0JaWYgKGJ1cy0+ bnVtYmVyID09IHBjaWUtPnJvb3RfYnVzX25yKQo+ID4gPiArCWlmIChidXMtPm51bWJlciA9PSBw Y2llLT5ycC5yb290X2J1c19ucikKPiA+ID4gIAkJcmV0dXJuIHBjaWUtPmNzcl9heGlfc2xhdmVf YmFzZSArIHdoZXJlOwo+ID4gPgo+ID4gPiAgCS8qCj4gPiA+IEBAIC0zMjYsNyArNzIsNyBAQCBz dGF0aWMgdm9pZCBfX2lvbWVtICptb2JpdmVpbF9wY2llX21hcF9idXMoc3RydWN0Cj4gPiA+IHBj aV9idXMgKmJ1cywKPiA+ID4KPiA+ID4gIAljc3Jfd3JpdGVsKHBjaWUsIHZhbHVlLCBQQUJfQVhJ X0FNQVBfUEVYX1dJTl9MKFdJTl9OVU1fMCkpOwo+ID4gPgo+ID4gPiAtCXJldHVybiBwY2llLT5j b25maWdfYXhpX3NsYXZlX2Jhc2UgKyB3aGVyZTsKPiA+ID4gKwlyZXR1cm4gcGNpZS0+cnAuY29u ZmlnX2F4aV9zbGF2ZV9iYXNlICsgd2hlcmU7Cj4gPiA+ICB9Cj4gPiA+Cj4gPiA+ICBzdGF0aWMg c3RydWN0IHBjaV9vcHMgbW9iaXZlaWxfcGNpZV9vcHMgPSB7IEBAIC0zNDAsNyArODYsNyBAQCBz dGF0aWMKPiA+ID4gdm9pZCBtb2JpdmVpbF9wY2llX2lzcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2Mp Cj4gPiA+ICAJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7 Cj4gPiA+ICAJc3RydWN0IG1vYml2ZWlsX3BjaWUgKnBjaWUgPSBpcnFfZGVzY19nZXRfaGFuZGxl cl9kYXRhKGRlc2MpOwo+ID4gPiAgCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwY2llLT5wZGV2LT5k ZXY7Cj4gPiA+IC0Jc3RydWN0IG1vYml2ZWlsX21zaSAqbXNpID0gJnBjaWUtPm1zaTsKPiA+ID4g KwlzdHJ1Y3QgbW9iaXZlaWxfbXNpICptc2kgPSAmcGNpZS0+cnAubXNpOwo+ID4gPiAgCXUzMiBt c2lfZGF0YSwgbXNpX2FkZHJfbG8sIG1zaV9hZGRyX2hpOwo+ID4gPiAgCXUzMiBpbnRyX3N0YXR1 cywgbXNpX3N0YXR1czsKPiA+ID4gIAl1bnNpZ25lZCBsb25nIHNoaWZ0ZWRfc3RhdHVzOwo+ID4g PiBAQCAtMzY1LDcgKzExMSw3IEBAIHN0YXRpYyB2b2lkIG1vYml2ZWlsX3BjaWVfaXNyKHN0cnVj dCBpcnFfZGVzYyAqZGVzYykKPiA+ID4gIAkJc2hpZnRlZF9zdGF0dXMgPj49IFBBQl9JTlRYX1NU QVJUOwo+ID4gPiAgCQlkbyB7Cj4gPiA+ICAJCQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgJnNoaWZ0 ZWRfc3RhdHVzLCBQQ0lfTlVNX0lOVFgpIHsKPiA+ID4gLQkJCQl2aXJxID0gaXJxX2ZpbmRfbWFw cGluZyhwY2llLT5pbnR4X2RvbWFpbiwKPiA+ID4gKwkJCQl2aXJxID0gaXJxX2ZpbmRfbWFwcGlu ZyhwY2llLT5ycC5pbnR4X2RvbWFpbiwKPiA+ID4gIAkJCQkJCQliaXQgKyAxKTsKPiA+ID4gIAkJ CQlpZiAodmlycSkKPiA+ID4gIAkJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOwo+ID4gPiBA QCAtNDI4LDEwICsxNzQsMTAgQEAgc3RhdGljIGludCBtb2JpdmVpbF9wY2llX3BhcnNlX2R0KHN0 cnVjdAo+ID4gbW9iaXZlaWxfcGNpZSAqcGNpZSkKPiA+ID4gIAkvKiBtYXAgY29uZmlnIHJlc291 cmNlICovCj4gPiA+ICAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJ T1JFU09VUkNFX01FTSwKPiA+ID4gIAkJCQkJICAgImNvbmZpZ19heGlfc2xhdmUiKTsKPiA+ID4g LQlwY2llLT5jb25maWdfYXhpX3NsYXZlX2Jhc2UgPSBkZXZtX3BjaV9yZW1hcF9jZmdfcmVzb3Vy Y2UoZGV2LCByZXMpOwo+ID4gPiAtCWlmIChJU19FUlIocGNpZS0+Y29uZmlnX2F4aV9zbGF2ZV9i YXNlKSkKPiA+ID4gLQkJcmV0dXJuIFBUUl9FUlIocGNpZS0+Y29uZmlnX2F4aV9zbGF2ZV9iYXNl KTsKPiA+ID4gLQlwY2llLT5vYl9pb19yZXMgPSByZXM7Cj4gPiA+ICsJcGNpZS0+cnAuY29uZmln X2F4aV9zbGF2ZV9iYXNlID0gZGV2bV9wY2lfcmVtYXBfY2ZnX3Jlc291cmNlKGRldiwKPiA+IHJl cyk7Cj4gPiA+ICsJaWYgKElTX0VSUihwY2llLT5ycC5jb25maWdfYXhpX3NsYXZlX2Jhc2UpKQo+ ID4gPiArCQlyZXR1cm4gUFRSX0VSUihwY2llLT5ycC5jb25maWdfYXhpX3NsYXZlX2Jhc2UpOwo+ ID4gPiArCXBjaWUtPnJwLm9iX2lvX3JlcyA9IHJlczsKPiA+ID4KPiA+ID4gIAkvKiBtYXAgY3Ny IHJlc291cmNlICovCj4gPiA+ICAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShw ZGV2LCBJT1JFU09VUkNFX01FTSwgQEAKPiA+IC00NDEsMTIKPiA+ID4gKzE4Nyw2IEBAIHN0YXRp YyBpbnQgbW9iaXZlaWxfcGNpZV9wYXJzZV9kdChzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSkK PiA+ID4gIAkJcmV0dXJuIFBUUl9FUlIocGNpZS0+Y3NyX2F4aV9zbGF2ZV9iYXNlKTsKPiA+ID4g IAlwY2llLT5wY2llX3JlZ19iYXNlID0gcmVzLT5zdGFydDsKPiA+ID4KPiA+ID4gLQkvKiBtYXAg TVNJIGNvbmZpZyByZXNvdXJjZSAqLwo+ID4gPiAtCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJj ZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCj4gPiAiYXBiX2NzciIpOwo+ID4gPiAtCXBj aWUtPmFwYl9jc3JfYmFzZSA9IGRldm1fcGNpX3JlbWFwX2NmZ19yZXNvdXJjZShkZXYsIHJlcyk7 Cj4gPiA+IC0JaWYgKElTX0VSUihwY2llLT5hcGJfY3NyX2Jhc2UpKQo+ID4gPiAtCQlyZXR1cm4g UFRSX0VSUihwY2llLT5hcGJfY3NyX2Jhc2UpOwo+ID4gPiAtCj4gPiA+ICAJLyogcmVhZCB0aGUg bnVtYmVyIG9mIHdpbmRvd3MgcmVxdWVzdGVkICovCj4gPiA+ICAJaWYgKG9mX3Byb3BlcnR5X3Jl YWRfdTMyKG5vZGUsICJhcGlvLXdpbnMiLCAmcGNpZS0+YXBpb193aW5zKSkKPiA+ID4gIAkJcGNp ZS0+YXBpb193aW5zID0gTUFYX1BJT19XSU5ET1dTOwo+ID4gPiBAQCAtNDU0LDExOSArMTk0LDE1 IEBAIHN0YXRpYyBpbnQgbW9iaXZlaWxfcGNpZV9wYXJzZV9kdChzdHJ1Y3QKPiA+IG1vYml2ZWls X3BjaWUgKnBjaWUpCj4gPiA+ICAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJwcGlv LXdpbnMiLCAmcGNpZS0+cHBpb193aW5zKSkKPiA+ID4gIAkJcGNpZS0+cHBpb193aW5zID0gTUFY X1BJT19XSU5ET1dTOwo+ID4gPgo+ID4gPiAtCXBjaWUtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEo cGRldiwgMCk7Cj4gPiA+IC0JaWYgKHBjaWUtPmlycSA8PSAwKSB7Cj4gPiA+IC0JCWRldl9lcnIo ZGV2LCAiZmFpbGVkIHRvIG1hcCBJUlE6ICVkXG4iLCBwY2llLT5pcnEpOwo+ID4gPiAtCQlyZXR1 cm4gLUVOT0RFVjsKPiA+ID4gLQl9Cj4gPiA+IC0KPiA+ID4gIAlyZXR1cm4gMDsKPiA+ID4gIH0K PiA+ID4KPiA+ID4gLXN0YXRpYyB2b2lkIHByb2dyYW1faWJfd2luZG93cyhzdHJ1Y3QgbW9iaXZl aWxfcGNpZSAqcGNpZSwgaW50IHdpbl9udW0sCj4gPiA+IC0JCQkgICAgICAgdTY0IGNwdV9hZGRy LCB1NjQgcGNpX2FkZHIsIHUzMiB0eXBlLCB1NjQgc2l6ZSkKPiA+ID4gLXsKPiA+ID4gLQl1MzIg dmFsdWU7Cj4gPiA+IC0JdTY0IHNpemU2NCA9IH4oc2l6ZSAtIDEpOwo+ID4gPiAtCj4gPiA+IC0J aWYgKHdpbl9udW0gPj0gcGNpZS0+cHBpb193aW5zKSB7Cj4gPiA+IC0JCWRldl9lcnIoJnBjaWUt PnBkZXYtPmRldiwKPiA+ID4gLQkJCSJFUlJPUjogbWF4IGluYm91bmQgd2luZG93cyByZWFjaGVk ICFcbiIpOwo+ID4gPiAtCQlyZXR1cm47Cj4gPiA+IC0JfQo+ID4gPiAtCj4gPiA+IC0JdmFsdWUg PSBjc3JfcmVhZGwocGNpZSwgUEFCX1BFWF9BTUFQX0NUUkwod2luX251bSkpOwo+ID4gPiAtCXZh bHVlICY9IH4oQU1BUF9DVFJMX1RZUEVfTUFTSyA8PCBBTUFQX0NUUkxfVFlQRV9TSElGVCB8Cj4g PiA+IC0JCSBXSU5fU0laRV9NQVNLIDw8IFdJTl9TSVpFX1NISUZUKTsKPiA+ID4gLQl2YWx1ZSB8 PSAodHlwZSA8PCBBTUFQX0NUUkxfVFlQRV9TSElGVCkgfCAoMSA8PAo+ID4gQU1BUF9DVFJMX0VO X1NISUZUKSB8Cj4gPiA+IC0JCSAobG93ZXJfMzJfYml0cyhzaXplNjQpICYgV0lOX1NJWkVfTUFT SyA8PCBXSU5fU0laRV9TSElGVCk7Cj4gPiA+IC0JY3NyX3dyaXRlbChwY2llLCB2YWx1ZSwgUEFC X1BFWF9BTUFQX0NUUkwod2luX251bSkpOwo+ID4gPiAtCj4gPiA+IC0JY3NyX3dyaXRlbChwY2ll LCB1cHBlcl8zMl9iaXRzKHNpemU2NCksCj4gPiA+IC0JCSAgIFBBQl9FWFRfUEVYX0FNQVBfU0la RU4od2luX251bSkpOwo+ID4gPiAtCj4gPiA+IC0JY3NyX3dyaXRlbChwY2llLCBsb3dlcl8zMl9i aXRzKGNwdV9hZGRyKSwKPiA+ID4gLQkJICAgUEFCX1BFWF9BTUFQX0FYSV9XSU4od2luX251bSkp Owo+ID4gPiAtCWNzcl93cml0ZWwocGNpZSwgdXBwZXJfMzJfYml0cyhjcHVfYWRkciksCj4gPiA+ IC0JCSAgIFBBQl9FWFRfUEVYX0FNQVBfQVhJX1dJTih3aW5fbnVtKSk7Cj4gPiA+IC0KPiA+ID4g LQljc3Jfd3JpdGVsKHBjaWUsIGxvd2VyXzMyX2JpdHMocGNpX2FkZHIpLAo+ID4gPiAtCQkgICBQ QUJfUEVYX0FNQVBfUEVYX1dJTl9MKHdpbl9udW0pKTsKPiA+ID4gLQljc3Jfd3JpdGVsKHBjaWUs IHVwcGVyXzMyX2JpdHMocGNpX2FkZHIpLAo+ID4gPiAtCQkgICBQQUJfUEVYX0FNQVBfUEVYX1dJ Tl9IKHdpbl9udW0pKTsKPiA+ID4gLQo+ID4gPiAtCXBjaWUtPmliX3dpbnNfY29uZmlndXJlZCsr Owo+ID4gPiAtfQo+ID4gPiAtCj4gPiA+IC0vKgo+ID4gPiAtICogcm91dGluZSB0byBwcm9ncmFt IHRoZSBvdXRib3VuZCB3aW5kb3dzCj4gPiA+IC0gKi8KPiA+ID4gLXN0YXRpYyB2b2lkIHByb2dy YW1fb2Jfd2luZG93cyhzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSwgaW50IHdpbl9udW0sCj4g PiA+IC0JCQkgICAgICAgdTY0IGNwdV9hZGRyLCB1NjQgcGNpX2FkZHIsIHUzMiB0eXBlLCB1NjQg c2l6ZSkKPiA+ID4gLXsKPiA+ID4gLQo+ID4gPiAtCXUzMiB2YWx1ZTsKPiA+ID4gLQl1NjQgc2l6 ZTY0ID0gfihzaXplIC0gMSk7Cj4gPiA+IC0KPiA+ID4gLQlpZiAod2luX251bSA+PSBwY2llLT5h cGlvX3dpbnMpIHsKPiA+ID4gLQkJZGV2X2VycigmcGNpZS0+cGRldi0+ZGV2LAo+ID4gPiAtCQkJ IkVSUk9SOiBtYXggb3V0Ym91bmQgd2luZG93cyByZWFjaGVkICFcbiIpOwo+ID4gPiAtCQlyZXR1 cm47Cj4gPiA+IC0JfQo+ID4gPiAtCj4gPiA+IC0JLyoKPiA+ID4gLQkgKiBwcm9ncmFtIEVuYWJs ZSBCaXQgdG8gMSwgVHlwZSBCaXQgdG8gKDAwKSBiYXNlIDIsIEFYSSBXaW5kb3cgU2l6ZSBCaXQK PiA+ID4gLQkgKiB0byA0IEtCIGluIFBBQl9BWElfQU1BUF9DVFJMIHJlZ2lzdGVyCj4gPiA+IC0J ICovCj4gPiA+IC0JdmFsdWUgPSBjc3JfcmVhZGwocGNpZSwgUEFCX0FYSV9BTUFQX0NUUkwod2lu X251bSkpOwo+ID4gPiAtCXZhbHVlICY9IH4oV0lOX1RZUEVfTUFTSyA8PCBXSU5fVFlQRV9TSElG VCB8Cj4gPiA+IC0JCSBXSU5fU0laRV9NQVNLIDw8IFdJTl9TSVpFX1NISUZUKTsKPiA+ID4gLQl2 YWx1ZSB8PSAxIDw8IFdJTl9FTkFCTEVfU0hJRlQgfCB0eXBlIDw8IFdJTl9UWVBFX1NISUZUIHwK PiA+ID4gLQkJIChsb3dlcl8zMl9iaXRzKHNpemU2NCkgJiBXSU5fU0laRV9NQVNLIDw8IFdJTl9T SVpFX1NISUZUKTsKPiA+ID4gLQljc3Jfd3JpdGVsKHBjaWUsIHZhbHVlLCBQQUJfQVhJX0FNQVBf Q1RSTCh3aW5fbnVtKSk7Cj4gPiA+IC0KPiA+ID4gLQljc3Jfd3JpdGVsKHBjaWUsIHVwcGVyXzMy X2JpdHMoc2l6ZTY0KSwKPiA+IFBBQl9FWFRfQVhJX0FNQVBfU0laRSh3aW5fbnVtKSk7Cj4gPiA+ IC0KPiA+ID4gLQkvKgo+ID4gPiAtCSAqIHByb2dyYW0gQVhJIHdpbmRvdyBiYXNlIHdpdGggYXBw cm9wcmlhdGUgdmFsdWUgaW4KPiA+ID4gLQkgKiBQQUJfQVhJX0FNQVBfQVhJX1dJTjAgcmVnaXN0 ZXIKPiA+ID4gLQkgKi8KPiA+ID4gLQljc3Jfd3JpdGVsKHBjaWUsIGxvd2VyXzMyX2JpdHMoY3B1 X2FkZHIpICYKPiA+ICh+QVhJX1dJTkRPV19BTElHTl9NQVNLKSwKPiA+ID4gLQkJICAgUEFCX0FY SV9BTUFQX0FYSV9XSU4od2luX251bSkpOwo+ID4gPiAtCWNzcl93cml0ZWwocGNpZSwgdXBwZXJf MzJfYml0cyhjcHVfYWRkciksCj4gPiA+IC0JCSAgIFBBQl9FWFRfQVhJX0FNQVBfQVhJX1dJTih3 aW5fbnVtKSk7Cj4gPiA+IC0KPiA+ID4gLQljc3Jfd3JpdGVsKHBjaWUsIGxvd2VyXzMyX2JpdHMo cGNpX2FkZHIpLAo+ID4gPiAtCQkgICBQQUJfQVhJX0FNQVBfUEVYX1dJTl9MKHdpbl9udW0pKTsK PiA+ID4gLQljc3Jfd3JpdGVsKHBjaWUsIHVwcGVyXzMyX2JpdHMocGNpX2FkZHIpLAo+ID4gPiAt CQkgICBQQUJfQVhJX0FNQVBfUEVYX1dJTl9IKHdpbl9udW0pKTsKPiA+ID4gLQo+ID4gPiAtCXBj aWUtPm9iX3dpbnNfY29uZmlndXJlZCsrOwo+ID4gPiAtfQo+ID4gPiAtCj4gPiA+IC1zdGF0aWMg aW50IG1vYml2ZWlsX2JyaW5ndXBfbGluayhzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSkgLXsK PiA+ID4gLQlpbnQgcmV0cmllczsKPiA+ID4gLQo+ID4gPiAtCS8qIGNoZWNrIGlmIHRoZSBsaW5r IGlzIHVwIG9yIG5vdCAqLwo+ID4gPiAtCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCBMSU5L X1dBSVRfTUFYX1JFVFJJRVM7IHJldHJpZXMrKykgewo+ID4gPiAtCQlpZiAobW9iaXZlaWxfcGNp ZV9saW5rX3VwKHBjaWUpKQo+ID4gPiAtCQkJcmV0dXJuIDA7Cj4gPiA+IC0KPiA+ID4gLQkJdXNs ZWVwX3JhbmdlKExJTktfV0FJVF9NSU4sIExJTktfV0FJVF9NQVgpOwo+ID4gPiAtCX0KPiA+ID4g LQo+ID4gPiAtCWRldl9lcnIoJnBjaWUtPnBkZXYtPmRldiwgImxpbmsgbmV2ZXIgY2FtZSB1cFxu Iik7Cj4gPiA+IC0KPiA+ID4gLQlyZXR1cm4gLUVUSU1FRE9VVDsKPiA+ID4gLX0KPiA+ID4gLQo+ ID4gPiAgc3RhdGljIHZvaWQgbW9iaXZlaWxfcGNpZV9lbmFibGVfbXNpKHN0cnVjdCBtb2JpdmVp bF9wY2llICpwY2llKSAgewo+ID4gPiAgCXBoeXNfYWRkcl90IG1zZ19hZGRyID0gcGNpZS0+cGNp ZV9yZWdfYmFzZTsKPiA+ID4gLQlzdHJ1Y3QgbW9iaXZlaWxfbXNpICptc2kgPSAmcGNpZS0+bXNp Owo+ID4gPiArCXN0cnVjdCBtb2JpdmVpbF9tc2kgKm1zaSA9ICZwY2llLT5ycC5tc2k7Cj4gPiA+ Cj4gPiA+IC0JcGNpZS0+bXNpLm51bV9vZl92ZWN0b3JzID0gUENJX05VTV9NU0k7Cj4gPiA+ICsJ bXNpLT5udW1fb2ZfdmVjdG9ycyA9IFBDSV9OVU1fTVNJOwo+ID4gPiAgCW1zaS0+bXNpX3BhZ2Vz X3BoeXMgPSAocGh5c19hZGRyX3QpbXNnX2FkZHI7Cj4gPiA+Cj4gPiA+ICAJd3JpdGVsX3JlbGF4 ZWQobG93ZXJfMzJfYml0cyhtc2dfYWRkciksCj4gPiA+IEBAIC02MDQsOSArMjQwLDYgQEAgc3Rh dGljIGludCBtb2JpdmVpbF9ob3N0X2luaXQoc3RydWN0IG1vYml2ZWlsX3BjaWUKPiA+ICpwY2ll KQo+ID4gPiAgCXBhYl9jdHJsIHw9ICgxIDw8IEFNQkFfUElPX0VOQUJMRV9TSElGVCkgfCAoMSA8 PAo+ID4gUEVYX1BJT19FTkFCTEVfU0hJRlQpOwo+ID4gPiAgCWNzcl93cml0ZWwocGNpZSwgcGFi X2N0cmwsIFBBQl9DVFJMKTsKPiA+ID4KPiA+ID4gLQljc3Jfd3JpdGVsKHBjaWUsIChQQUJfSU5U UF9JTlRYX01BU0sgfCBQQUJfSU5UUF9NU0lfTUFTSyksCj4gPiA+IC0JCSAgIFBBQl9JTlRQX0FN QkFfTUlTQ19FTkIpOwo+ID4gPiAtCj4gPiA+ICAJLyoKPiA+ID4gIAkgKiBwcm9ncmFtIFBJTyBF bmFibGUgQml0IHRvIDEgYW5kIENvbmZpZyBXaW5kb3cgRW5hYmxlIEJpdCB0byAxIGluCj4gPiA+ ICAJICogUEFCX0FYSV9QSU9fQ1RSTCBSZWdpc3Rlcgo+ID4gPiBAQCAtNjI4LDIwICsyNjEsMjQg QEAgc3RhdGljIGludCBtb2JpdmVpbF9ob3N0X2luaXQoc3RydWN0IG1vYml2ZWlsX3BjaWUKPiA+ ICpwY2llKQo+ID4gPiAgCSAqLwo+ID4gPgo+ID4gPiAgCS8qIGNvbmZpZyBvdXRib3VuZCB0cmFu c2xhdGlvbiB3aW5kb3cgKi8KPiA+ID4gLQlwcm9ncmFtX29iX3dpbmRvd3MocGNpZSwgV0lOX05V TV8wLCBwY2llLT5vYl9pb19yZXMtPnN0YXJ0LCAwLAo+ID4gPiAtCQkJICAgQ0ZHX1dJTkRPV19U WVBFLCByZXNvdXJjZV9zaXplKHBjaWUtPm9iX2lvX3JlcykpOwo+ID4gPiArCXByb2dyYW1fb2Jf d2luZG93cyhwY2llLCBXSU5fTlVNXzAsIHBjaWUtPnJwLm9iX2lvX3Jlcy0+c3RhcnQsIDAsCj4g PiA+ICsJCQkgICBDRkdfV0lORE9XX1RZUEUsIHJlc291cmNlX3NpemUocGNpZS0+cnAub2JfaW9f cmVzKSk7Cj4gPiA+Cj4gPiA+ICAJLyogbWVtb3J5IGluYm91bmQgdHJhbnNsYXRpb24gd2luZG93 ICovCj4gPiA+ICAJcHJvZ3JhbV9pYl93aW5kb3dzKHBjaWUsIFdJTl9OVU1fMCwgMCwgMCwgTUVN X1dJTkRPV19UWVBFLAo+ID4gSUJfV0lOX1NJWkUpOwo+ID4gPgo+ID4gPiAgCS8qIEdldCB0aGUg SS9PIGFuZCBtZW1vcnkgcmFuZ2VzIGZyb20gRFQgKi8KPiA+ID4gIAlyZXNvdXJjZV9saXN0X2Zv cl9lYWNoX2VudHJ5KHdpbiwgJnBjaWUtPnJlc291cmNlcykgewo+ID4gPiAtCQlpZiAocmVzb3Vy Y2VfdHlwZSh3aW4tPnJlcykgPT0gSU9SRVNPVVJDRV9NRU0pCj4gPiA+ICsJCWlmIChyZXNvdXJj ZV90eXBlKHdpbi0+cmVzKSA9PSBJT1JFU09VUkNFX01FTSkgewo+ID4gPiAgCQkJdHlwZSA9IE1F TV9XSU5ET1dfVFlQRTsKPiA+ID4gLQkJZWxzZSBpZiAocmVzb3VyY2VfdHlwZSh3aW4tPnJlcykg PT0gSU9SRVNPVVJDRV9JTykKPiA+ID4gKwkJfSBlbHNlIGlmIChyZXNvdXJjZV90eXBlKHdpbi0+ cmVzKSA9PSBJT1JFU09VUkNFX0lPKSB7Cj4gPiA+ICAJCQl0eXBlID0gSU9fV0lORE9XX1RZUEU7 Cj4gPiA+IC0JCWVsc2UKPiA+ID4gKwkJfSBlbHNlIGlmIChyZXNvdXJjZV90eXBlKHdpbi0+cmVz KSA9PSBJT1JFU09VUkNFX0JVUykgewo+ID4gPiArCQkJcGNpZS0+cnAucm9vdF9idXNfbnIgPSB3 aW4tPnJlcy0+c3RhcnQ7Cj4gPiA+ICsJCQljb250aW51ZTsKPiA+ID4gKwkJfSBlbHNlIHsKPiA+ ID4gIAkJCWNvbnRpbnVlOwo+ID4gPiArCQl9Cj4gPiA+Cj4gPiA+ICAJCS8qIGNvbmZpZ3VyZSBv dXRib3VuZCB0cmFuc2xhdGlvbiB3aW5kb3cgKi8KPiA+ID4gIAkJcHJvZ3JhbV9vYl93aW5kb3dz KHBjaWUsIHBjaWUtPm9iX3dpbnNfY29uZmlndXJlZCwKPiA+ID4gQEAgLTY1Niw5ICsyOTMsNiBA QCBzdGF0aWMgaW50IG1vYml2ZWlsX2hvc3RfaW5pdChzdHJ1Y3QgbW9iaXZlaWxfcGNpZQo+ID4g KnBjaWUpCj4gPiA+ICAJdmFsdWUgfD0gKFBDSV9DTEFTU19CUklER0VfUENJIDw8IDE2KTsKPiA+ ID4gIAljc3Jfd3JpdGVsKHBjaWUsIHZhbHVlLCBQQUJfSU5UUF9BWElfUElPX0NMQVNTKTsKPiA+ ID4KPiA+ID4gLQkvKiBzZXR1cCBNU0kgaGFyZHdhcmUgcmVnaXN0ZXJzICovCj4gPiA+IC0JbW9i aXZlaWxfcGNpZV9lbmFibGVfbXNpKHBjaWUpOwo+ID4gPiAtCj4gPiA+ICAJcmV0dXJuIDA7Cj4g PiA+ICB9Cj4gPiA+Cj4gPiA+IEBAIC02NzEsMTEgKzMwNSwxMSBAQCBzdGF0aWMgdm9pZCBtb2Jp dmVpbF9tYXNrX2ludHhfaXJxKHN0cnVjdAo+ID4gaXJxX2RhdGEgKmRhdGEpCj4gPiA+Cj4gPiA+ ICAJcGNpZSA9IGlycV9kZXNjX2dldF9jaGlwX2RhdGEoZGVzYyk7Cj4gPiA+ICAJbWFzayA9IDEg PDwgKChkYXRhLT5od2lycSArIFBBQl9JTlRYX1NUQVJUKSAtIDEpOwo+ID4gPiAtCXJhd19zcGlu X2xvY2tfaXJxc2F2ZSgmcGNpZS0+aW50eF9tYXNrX2xvY2ssIGZsYWdzKTsKPiA+ID4gKwlyYXdf c3Bpbl9sb2NrX2lycXNhdmUoJnBjaWUtPnJwLmludHhfbWFza19sb2NrLCBmbGFncyk7Cj4gPiA+ ICAJc2hpZnRlZF92YWwgPSBjc3JfcmVhZGwocGNpZSwgUEFCX0lOVFBfQU1CQV9NSVNDX0VOQik7 Cj4gPiA+ICAJc2hpZnRlZF92YWwgJj0gfm1hc2s7Cj4gPiA+ICAJY3NyX3dyaXRlbChwY2llLCBz aGlmdGVkX3ZhbCwgUEFCX0lOVFBfQU1CQV9NSVNDX0VOQik7Cj4gPiA+IC0JcmF3X3NwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnBjaWUtPmludHhfbWFza19sb2NrLCBmbGFncyk7Cj4gPiA+ICsJcmF3 X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaWUtPnJwLmludHhfbWFza19sb2NrLCBmbGFncyk7 Cj4gPiA+ICB9Cj4gPiA+Cj4gPiA+ICBzdGF0aWMgdm9pZCBtb2JpdmVpbF91bm1hc2tfaW50eF9p cnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQo+ID4gPiBAQCAtNjg3LDExICszMjEsMTEgQEAgc3Rh dGljIHZvaWQgbW9iaXZlaWxfdW5tYXNrX2ludHhfaXJxKHN0cnVjdAo+ID4gaXJxX2RhdGEgKmRh dGEpCj4gPiA+Cj4gPiA+ICAJcGNpZSA9IGlycV9kZXNjX2dldF9jaGlwX2RhdGEoZGVzYyk7Cj4g PiA+ICAJbWFzayA9IDEgPDwgKChkYXRhLT5od2lycSArIFBBQl9JTlRYX1NUQVJUKSAtIDEpOwo+ ID4gPiAtCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcGNpZS0+aW50eF9tYXNrX2xvY2ssIGZsYWdz KTsKPiA+ID4gKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBjaWUtPnJwLmludHhfbWFza19sb2Nr LCBmbGFncyk7Cj4gPiA+ICAJc2hpZnRlZF92YWwgPSBjc3JfcmVhZGwocGNpZSwgUEFCX0lOVFBf QU1CQV9NSVNDX0VOQik7Cj4gPiA+ICAJc2hpZnRlZF92YWwgfD0gbWFzazsKPiA+ID4gIAljc3Jf d3JpdGVsKHBjaWUsIHNoaWZ0ZWRfdmFsLCBQQUJfSU5UUF9BTUJBX01JU0NfRU5CKTsKPiA+ID4g LQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpZS0+aW50eF9tYXNrX2xvY2ssIGZsYWdz KTsKPiA+ID4gKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpZS0+cnAuaW50eF9tYXNr X2xvY2ssIGZsYWdzKTsKPiA+ID4gIH0KPiA+ID4KPiA+ID4gIHN0YXRpYyBzdHJ1Y3QgaXJxX2No aXAgaW50eF9pcnFfY2hpcCA9IHsKPiA+ID4gQEAgLTc1OSw3ICszOTMsNyBAQCBzdGF0aWMgaW50 IG1vYml2ZWlsX2lycV9tc2lfZG9tYWluX2FsbG9jKHN0cnVjdAo+ID4gaXJxX2RvbWFpbiAqZG9t YWluLAo+ID4gPiAgCQkJCQkgdW5zaWduZWQgaW50IG5yX2lycXMsIHZvaWQgKmFyZ3MpCj4gPiA+ ICB7Cj4gPiA+ICAJc3RydWN0IG1vYml2ZWlsX3BjaWUgKnBjaWUgPSBkb21haW4tPmhvc3RfZGF0 YTsKPiA+ID4gLQlzdHJ1Y3QgbW9iaXZlaWxfbXNpICptc2kgPSAmcGNpZS0+bXNpOwo+ID4gPiAr CXN0cnVjdCBtb2JpdmVpbF9tc2kgKm1zaSA9ICZwY2llLT5ycC5tc2k7Cj4gPiA+ICAJdW5zaWdu ZWQgbG9uZyBiaXQ7Cj4gPiA+Cj4gPiA+ICAJV0FSTl9PTihucl9pcnFzICE9IDEpOwo+ID4gPiBA QCAtNzg2LDcgKzQyMCw3IEBAIHN0YXRpYyB2b2lkIG1vYml2ZWlsX2lycV9tc2lfZG9tYWluX2Zy ZWUoc3RydWN0Cj4gPiBpcnFfZG9tYWluICpkb21haW4sCj4gPiA+ICB7Cj4gPiA+ICAJc3RydWN0 IGlycV9kYXRhICpkID0gaXJxX2RvbWFpbl9nZXRfaXJxX2RhdGEoZG9tYWluLCB2aXJxKTsKPiA+ ID4gIAlzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9k YXRhKGQpOwo+ID4gPiAtCXN0cnVjdCBtb2JpdmVpbF9tc2kgKm1zaSA9ICZwY2llLT5tc2k7Cj4g PiA+ICsJc3RydWN0IG1vYml2ZWlsX21zaSAqbXNpID0gJnBjaWUtPnJwLm1zaTsKPiA+ID4KPiA+ ID4gIAltdXRleF9sb2NrKCZtc2ktPmxvY2spOwo+ID4gPgo+ID4gPiBAQCAtODA3LDkgKzQ0MSw5 IEBAIHN0YXRpYyBpbnQgbW9iaXZlaWxfYWxsb2NhdGVfbXNpX2RvbWFpbnMoc3RydWN0Cj4gPiBt b2JpdmVpbF9wY2llICpwY2llKQo+ID4gPiAgewo+ID4gPiAgCXN0cnVjdCBkZXZpY2UgKmRldiA9 ICZwY2llLT5wZGV2LT5kZXY7Cj4gPiA+ICAJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSA9 IG9mX25vZGVfdG9fZndub2RlKGRldi0+b2Zfbm9kZSk7Cj4gPiA+IC0Jc3RydWN0IG1vYml2ZWls X21zaSAqbXNpID0gJnBjaWUtPm1zaTsKPiA+ID4gKwlzdHJ1Y3QgbW9iaXZlaWxfbXNpICptc2kg PSAmcGNpZS0+cnAubXNpOwo+ID4gPgo+ID4gPiAtCW11dGV4X2luaXQoJnBjaWUtPm1zaS5sb2Nr KTsKPiA+ID4gKwltdXRleF9pbml0KCZtc2ktPmxvY2spOwo+ID4gPiAgCW1zaS0+ZGV2X2RvbWFp biA9IGlycV9kb21haW5fYWRkX2xpbmVhcihOVUxMLAo+ID4gbXNpLT5udW1fb2ZfdmVjdG9ycywK PiA+ID4gIAkJCQkJCSZtc2lfZG9tYWluX29wcywgcGNpZSk7Cj4gPiA+ICAJaWYgKCFtc2ktPmRl dl9kb21haW4pIHsKPiA+ID4gQEAgLTgzNiwxNSArNDcwLDE1IEBAIHN0YXRpYyBpbnQgbW9iaXZl aWxfcGNpZV9pbml0X2lycV9kb21haW4oc3RydWN0Cj4gPiBtb2JpdmVpbF9wY2llICpwY2llKQo+ ID4gPiAgCWludCByZXQ7Cj4gPiA+Cj4gPiA+ICAJLyogc2V0dXAgSU5UeCAqLwo+ID4gPiAtCXBj aWUtPmludHhfZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKG5vZGUsIFBDSV9OVU1fSU5U WCwKPiA+ID4gLQkJCQkJCSAgJmludHhfZG9tYWluX29wcywgcGNpZSk7Cj4gPiA+ICsJcGNpZS0+ cnAuaW50eF9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobm9kZSwgUENJX05VTV9JTlRY LAo+ID4gPiArCQkJCQkJICAgICAmaW50eF9kb21haW5fb3BzLCBwY2llKTsKPiA+ID4KPiA+ID4g LQlpZiAoIXBjaWUtPmludHhfZG9tYWluKSB7Cj4gPiA+ICsJaWYgKCFwY2llLT5ycC5pbnR4X2Rv bWFpbikgewo+ID4gPiAgCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgYSBJTlR4IElSUSBk b21haW5cbiIpOwo+ID4gPiAgCQlyZXR1cm4gLUVOT01FTTsKPiA+ID4gIAl9Cj4gPiA+Cj4gPiA+ IC0JcmF3X3NwaW5fbG9ja19pbml0KCZwY2llLT5pbnR4X21hc2tfbG9jayk7Cj4gPiA+ICsJcmF3 X3NwaW5fbG9ja19pbml0KCZwY2llLT5ycC5pbnR4X21hc2tfbG9jayk7Cj4gPiA+Cj4gPiA+ICAJ Lyogc2V0dXAgTVNJICovCj4gPiA+ICAJcmV0ID0gbW9iaXZlaWxfYWxsb2NhdGVfbXNpX2RvbWFp bnMocGNpZSk7Cj4gPiA+IEBAIC04NTQsMjQgKzQ4OCw1OCBAQCBzdGF0aWMgaW50IG1vYml2ZWls X3BjaWVfaW5pdF9pcnFfZG9tYWluKHN0cnVjdAo+ID4gbW9iaXZlaWxfcGNpZSAqcGNpZSkKPiA+ ID4gIAlyZXR1cm4gMDsKPiA+ID4gIH0KPiA+ID4KPiA+ID4gLXN0YXRpYyBpbnQgbW9iaXZlaWxf cGNpZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4gPiArc3RhdGljIGlu dCBtb2JpdmVpbF9wY2llX2ludGVycnVwdF9pbml0KHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2ll KQo+ID4gPiArewo+ID4gPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwY2llLT5wZGV2LT5kZXY7 Cj4gPiA+ICsJc3RydWN0IHJlc291cmNlICpyZXM7Cj4gPiA+ICsJaW50IHJldDsKPiA+ID4gKwo+ ID4gPiArCWlmIChwY2llLT5ycC5vcHMtPmludGVycnVwdF9pbml0KQo+ID4gPiArCQlyZXR1cm4g cGNpZS0+cnAub3BzLT5pbnRlcnJ1cHRfaW5pdChwY2llKTsKPiA+ID4gKwo+ID4gPiArCS8qIG1h cCBNU0kgY29uZmlnIHJlc291cmNlICovCj4gPiA+ICsJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291 cmNlX2J5bmFtZShwY2llLT5wZGV2LCBJT1JFU09VUkNFX01FTSwKPiA+ID4gKwkJCQkJICAgImFw Yl9jc3IiKTsKPiA+ID4gKwlwY2llLT5hcGJfY3NyX2Jhc2UgPSBkZXZtX3BjaV9yZW1hcF9jZmdf cmVzb3VyY2UoZGV2LCByZXMpOwo+ID4gPiArCWlmIChJU19FUlIocGNpZS0+YXBiX2Nzcl9iYXNl KSkKPiA+ID4gKwkJcmV0dXJuIFBUUl9FUlIocGNpZS0+YXBiX2Nzcl9iYXNlKTsKPiA+ID4gKwo+ ID4gPiArCS8qIHNldHVwIE1TSSBoYXJkd2FyZSByZWdpc3RlcnMgKi8KPiA+ID4gKwltb2JpdmVp bF9wY2llX2VuYWJsZV9tc2kocGNpZSk7Cj4gPiA+ICsKPiA+ID4gKwlwY2llLT5ycC5pcnEgPSBw bGF0Zm9ybV9nZXRfaXJxKHBjaWUtPnBkZXYsIDApOwo+ID4gPiArCWlmIChwY2llLT5ycC5pcnEg PD0gMCkgewo+ID4gPiArCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBtYXAgSVJROiAlZFxuIiwg cGNpZS0+cnAuaXJxKTsKPiA+ID4gKwkJcmV0dXJuIC1FTk9ERVY7Cj4gPiA+ICsJfQo+ID4gPiAr Cj4gPiA+ICsJLyogaW5pdGlhbGl6ZSB0aGUgSVJRIGRvbWFpbnMgKi8KPiA+ID4gKwlyZXQgPSBt b2JpdmVpbF9wY2llX2luaXRfaXJxX2RvbWFpbihwY2llKTsKPiA+ID4gKwlpZiAocmV0KSB7Cj4g PiA+ICsJCWRldl9lcnIoZGV2LCAiRmFpbGVkIGNyZWF0aW5nIElSUSBEb21haW5cbiIpOwo+ID4g PiArCQlyZXR1cm4gcmV0Owo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCWlycV9zZXRfY2hhaW5l ZF9oYW5kbGVyX2FuZF9kYXRhKHBjaWUtPnJwLmlycSwKPiA+ID4gKwkJCQkJIG1vYml2ZWlsX3Bj aWVfaXNyLCBwY2llKTsKPiA+ID4gKwo+ID4gPiArCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCj4g PiA+ICsJY3NyX3dyaXRlbChwY2llLCAoUEFCX0lOVFBfSU5UWF9NQVNLIHwgUEFCX0lOVFBfTVNJ X01BU0spLAo+ID4gPiArCQkgICBQQUJfSU5UUF9BTUJBX01JU0NfRU5CKTsKPiA+ID4gKwo+ID4g PiArCXJldHVybiAwOwo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICtpbnQgbW9iaXZlaWxfcGNpZV9o b3N0X3Byb2JlKHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llKQo+ID4gPiAgewo+ID4gPiAtCXN0 cnVjdCBtb2JpdmVpbF9wY2llICpwY2llOwo+ID4gPiAgCXN0cnVjdCBwY2lfYnVzICpidXM7Cj4g PiA+ICAJc3RydWN0IHBjaV9idXMgKmNoaWxkOwo+ID4gPiAgCXN0cnVjdCBwY2lfaG9zdF9icmlk Z2UgKmJyaWRnZTsKPiA+ID4gLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ID4g PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwY2llLT5wZGV2LT5kZXY7Cj4gPiA+ICAJcmVzb3Vy Y2Vfc2l6ZV90IGlvYmFzZTsKPiA+ID4gIAlpbnQgcmV0Owo+ID4gPgo+ID4gPiAtCS8qIGFsbG9j YXRlIHRoZSBQQ0llIHBvcnQgKi8KPiA+ID4gLQlicmlkZ2UgPSBkZXZtX3BjaV9hbGxvY19ob3N0 X2JyaWRnZShkZXYsIHNpemVvZigqcGNpZSkpOwo+ID4gPiAtCWlmICghYnJpZGdlKQo+ID4gPiAt CQlyZXR1cm4gLUVOT01FTTsKPiA+ID4gLQo+ID4gPiAtCXBjaWUgPSBwY2lfaG9zdF9icmlkZ2Vf cHJpdihicmlkZ2UpOwo+ID4gPiAtCj4gPiA+IC0JcGNpZS0+cGRldiA9IHBkZXY7Cj4gPiA+ICsJ SU5JVF9MSVNUX0hFQUQoJnBjaWUtPnJlc291cmNlcyk7Cj4gPiA+Cj4gPiA+ICAJcmV0ID0gbW9i aXZlaWxfcGNpZV9wYXJzZV9kdChwY2llKTsKPiA+ID4gIAlpZiAocmV0KSB7Cj4gPiA+IEBAIC04 NzksNyArNTQ3LDEwIEBAIHN0YXRpYyBpbnQgbW9iaXZlaWxfcGNpZV9wcm9iZShzdHJ1Y3QKPiA+ IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ID4gIAkJcmV0dXJuIHJldDsKPiA+ID4gIAl9Cj4g PiA+Cj4gPiA+IC0JSU5JVF9MSVNUX0hFQUQoJnBjaWUtPnJlc291cmNlcyk7Cj4gPiA+ICsJLyog YWxsb2NhdGUgdGhlIFBDSWUgcG9ydCAqLwo+ID4gPiArCWJyaWRnZSA9IGRldm1fcGNpX2FsbG9j X2hvc3RfYnJpZGdlKGRldiwgMCk7Cj4gPiA+ICsJaWYgKCFicmlkZ2UpCj4gPiA+ICsJCXJldHVy biAtRU5PTUVNOwo+ID4gPgo+ID4gPiAgCS8qIHBhcnNlIHRoZSBob3N0IGJyaWRnZSBiYXNlIGFk ZHJlc3NlcyBmcm9tIHRoZSBkZXZpY2UgdHJlZSBmaWxlICovCj4gPiA+ICAJcmV0ID0gZGV2bV9v Zl9wY2lfZ2V0X2hvc3RfYnJpZGdlX3Jlc291cmNlcyhkZXYsIDAsIDB4ZmYsCj4gPiA+IEBAIC04 OTksMTUgKzU3MCwxMiBAQCBzdGF0aWMgaW50IG1vYml2ZWlsX3BjaWVfcHJvYmUoc3RydWN0Cj4g PiBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiA+ICAJCWdvdG8gZXJyb3I7Cj4gPiA+ICAJfQo+ ID4gPgo+ID4gPiAtCS8qIGluaXRpYWxpemUgdGhlIElSUSBkb21haW5zICovCj4gPiA+IC0JcmV0 ID0gbW9iaXZlaWxfcGNpZV9pbml0X2lycV9kb21haW4ocGNpZSk7Cj4gPiA+ICsJcmV0ID0gbW9i aXZlaWxfcGNpZV9pbnRlcnJ1cHRfaW5pdChwY2llKTsKPiA+ID4gIAlpZiAocmV0KSB7Cj4gPiA+ IC0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIGNyZWF0aW5nIElSUSBEb21haW5cbiIpOwo+ID4gPiAr CQlkZXZfZXJyKGRldiwgIkludGVycnVwdCBpbml0IGZhaWxlZFxuIik7Cj4gPiA+ICAJCWdvdG8g ZXJyb3I7Cj4gPiA+ICAJfQo+ID4gPgo+ID4gPiAtCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyX2Fu ZF9kYXRhKHBjaWUtPmlycSwgbW9iaXZlaWxfcGNpZV9pc3IsIHBjaWUpOwo+ID4gPiAtCj4gPiA+ ICAJcmV0ID0gZGV2bV9yZXF1ZXN0X3BjaV9idXNfcmVzb3VyY2VzKGRldiwgJnBjaWUtPnJlc291 cmNlcyk7Cj4gPiA+ICAJaWYgKHJldCkKPiA+ID4gIAkJZ290byBlcnJvcjsKPiA+ID4gQEAgLTkx Niw3ICs1ODQsNyBAQCBzdGF0aWMgaW50IG1vYml2ZWlsX3BjaWVfcHJvYmUoc3RydWN0Cj4gPiBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiA+ICAJbGlzdF9zcGxpY2VfaW5pdCgmcGNpZS0+cmVz b3VyY2VzLCAmYnJpZGdlLT53aW5kb3dzKTsKPiA+ID4gIAlicmlkZ2UtPmRldi5wYXJlbnQgPSBk ZXY7Cj4gPiA+ICAJYnJpZGdlLT5zeXNkYXRhID0gcGNpZTsKPiA+ID4gLQlicmlkZ2UtPmJ1c25y ID0gcGNpZS0+cm9vdF9idXNfbnI7Cj4gPiA+ICsJYnJpZGdlLT5idXNuciA9IHBjaWUtPnJwLnJv b3RfYnVzX25yOwo+ID4gPiAgCWJyaWRnZS0+b3BzID0gJm1vYml2ZWlsX3BjaWVfb3BzOwo+ID4g PiAgCWJyaWRnZS0+bWFwX2lycSA9IG9mX2lycV9wYXJzZV9hbmRfbWFwX3BjaTsKPiA+ID4gIAli cmlkZ2UtPnN3aXp6bGVfaXJxID0gcGNpX2NvbW1vbl9zd2l6emxlOwo+ID4gPiBAQCAtOTQ0LDI1 ICs2MTIsMyBAQCBzdGF0aWMgaW50IG1vYml2ZWlsX3BjaWVfcHJvYmUoc3RydWN0Cj4gPiBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiA+ICAJcGNpX2ZyZWVfcmVzb3VyY2VfbGlzdCgmcGNpZS0+ cmVzb3VyY2VzKTsKPiA+ID4gIAlyZXR1cm4gcmV0Owo+ID4gPiAgfQo+ID4gPiAtCj4gPiA+IC1z dGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtb2JpdmVpbF9wY2llX29mX21hdGNoW10g PSB7Cj4gPiA+IC0Jey5jb21wYXRpYmxlID0gIm1idmwsZ3BleDQwLXBjaWUiLH0sCj4gPiA+IC0J e30sCj4gPiA+IC19Owo+ID4gPiAtCj4gPiA+IC1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtb2Jp dmVpbF9wY2llX29mX21hdGNoKTsKPiA+ID4gLQo+ID4gPiAtc3RhdGljIHN0cnVjdCBwbGF0Zm9y bV9kcml2ZXIgbW9iaXZlaWxfcGNpZV9kcml2ZXIgPSB7Cj4gPiA+IC0JLnByb2JlID0gbW9iaXZl aWxfcGNpZV9wcm9iZSwKPiA+ID4gLQkuZHJpdmVyID0gewo+ID4gPiAtCQkubmFtZSA9ICJtb2Jp dmVpbC1wY2llIiwKPiA+ID4gLQkJLm9mX21hdGNoX3RhYmxlID0gbW9iaXZlaWxfcGNpZV9vZl9t YXRjaCwKPiA+ID4gLQkJLnN1cHByZXNzX2JpbmRfYXR0cnMgPSB0cnVlLAo+ID4gPiAtCX0sCj4g PiA+IC19Owo+ID4gPiAtCj4gPiA+IC1idWlsdGluX3BsYXRmb3JtX2RyaXZlcihtb2JpdmVpbF9w Y2llX2RyaXZlcik7Cj4gPiA+IC0KPiA+ID4gLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKPiA+ ID4gLU1PRFVMRV9ERVNDUklQVElPTigiTW9iaXZlaWwgUENJZSBob3N0IGNvbnRyb2xsZXIgZHJp dmVyIik7Cj4gPiA+IC1NT0RVTEVfQVVUSE9SKCJTdWJyYWhtYW55YSBMaW5nYXBwYQo+ID4gPGwu c3VicmFobWFueWFAbW9iaXZlaWwuY28uaW4+Iik7Cj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJz L3BjaS9jb250cm9sbGVyL21vYml2ZWlsL3BjaWUtbW9iaXZlaWwtcGxhdC5jCj4gPiBiL2RyaXZl cnMvcGNpL2NvbnRyb2xsZXIvbW9iaXZlaWwvcGNpZS1tb2JpdmVpbC1wbGF0LmMKPiA+ID4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPiA+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi4yMTZjNjJmMzU1NjgK PiA+ID4gLS0tIC9kZXYvbnVsbAo+ID4gPiArKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL21v Yml2ZWlsL3BjaWUtbW9iaXZlaWwtcGxhdC5jCj4gPiA+IEBAIC0wLDAgKzEsNTQgQEAKPiA+ID4g Ky8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gPiA+ICsvKgo+ID4gPiArICog UENJZSBob3N0IGNvbnRyb2xsZXIgZHJpdmVyIGZvciBNb2JpdmVpbCBQQ0llIEhvc3QgY29udHJv bGxlcgo+ID4gPiArICoKPiA+ID4gKyAqIENvcHlyaWdodCAoYykgMjAxOCBNb2JpdmVpbCBJbmMu Cj4gPiA+ICsgKiBBdXRob3I6IFN1YnJhaG1hbnlhIExpbmdhcHBhIDxsLnN1YnJhaG1hbnlhQG1v Yml2ZWlsLmNvLmluPgo+ID4gPiArICogUmVmYWN0b3I6IFpoaXFpYW5nIEhvdSA8WmhpcWlhbmcu SG91QG54cC5jb20+Cj4gPiA+ICsgKi8KPiA+ID4gKwo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L2lu aXQuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiA+ID4gKyNpbmNsdWRlIDxs aW51eC9tb2R1bGUuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KPiA+ID4gKyNp bmNsdWRlIDxsaW51eC9wY2kuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZp Y2UuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gPiA+ICsKPiA+ID4gKyNpbmNs dWRlICJwY2llLW1vYml2ZWlsLmgiCj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBpbnQgbW9iaXZlaWxf cGNpZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4gPiArewo+ID4gPiAr CXN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llOwo+ID4gPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9 ICZwZGV2LT5kZXY7Cj4gPiA+ICsKPiA+ID4gKwlwY2llID0gZGV2bV9remFsbG9jKGRldiwgc2l6 ZW9mKCpwY2llKSwgR0ZQX0tFUk5FTCk7Cj4gPiA+ICsJaWYgKCFwY2llKQo+ID4gPiArCQlyZXR1 cm4gLUVOT01FTTsKPiA+ID4gKwo+ID4gPiArCXBjaWUtPnBkZXYgPSBwZGV2Owo+ID4gPiArCj4g PiA+ICsJcmV0dXJuIG1vYml2ZWlsX3BjaWVfaG9zdF9wcm9iZShwY2llKTsKPiA+ID4gK30KPiA+ ID4gKwo+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbW9iaXZlaWxfcGNp ZV9vZl9tYXRjaFtdID0gewo+ID4gPiArCXsuY29tcGF0aWJsZSA9ICJtYnZsLGdwZXg0MC1wY2ll Iix9LAo+ID4gPiArCXt9LAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiArTU9EVUxFX0RFVklDRV9U QUJMRShvZiwgbW9iaXZlaWxfcGNpZV9vZl9tYXRjaCk7Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBz dHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1vYml2ZWlsX3BjaWVfZHJpdmVyID0gewo+ID4gPiArCS5w cm9iZSA9IG1vYml2ZWlsX3BjaWVfcHJvYmUsCj4gPiA+ICsJLmRyaXZlciA9IHsKPiA+ID4gKwkJ Lm5hbWUgPSAibW9iaXZlaWwtcGNpZSIsCj4gPiA+ICsJCS5vZl9tYXRjaF90YWJsZSA9IG1vYml2 ZWlsX3BjaWVfb2ZfbWF0Y2gsCj4gPiA+ICsJCS5zdXBwcmVzc19iaW5kX2F0dHJzID0gdHJ1ZSwK PiA+ID4gKwl9LAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiArYnVpbHRpbl9wbGF0Zm9ybV9kcml2 ZXIobW9iaXZlaWxfcGNpZV9kcml2ZXIpOwo+ID4gPiArCj4gPiA+ICtNT0RVTEVfTElDRU5TRSgi R1BMIHYyIik7Cj4gPiA+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1vYml2ZWlsIFBDSWUgaG9zdCBj b250cm9sbGVyIGRyaXZlciIpOwo+ID4gPiArTU9EVUxFX0FVVEhPUigiU3VicmFobWFueWEgTGlu Z2FwcGEKPiA+IDxsLnN1YnJhaG1hbnlhQG1vYml2ZWlsLmNvLmluPiIpOwo+ID4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9tb2JpdmVpbC9wY2llLW1vYml2ZWlsLmMKPiA+ IGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9tb2JpdmVpbC9wY2llLW1vYml2ZWlsLmMKPiA+ID4g bmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi5lZTY3OGE2MDgy NWQKPiA+ID4gLS0tIC9kZXYvbnVsbAo+ID4gPiArKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVy L21vYml2ZWlsL3BjaWUtbW9iaXZlaWwuYwo+ID4gPiBAQCAtMCwwICsxLDIyOCBAQAo+ID4gPiAr Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiA+ID4gKy8qCj4gPiA+ICsgKiBQ Q0llIGhvc3QgY29udHJvbGxlciBkcml2ZXIgZm9yIE1vYml2ZWlsIFBDSWUgSG9zdCBjb250cm9s bGVyCj4gPiA+ICsgKgo+ID4gPiArICogQ29weXJpZ2h0IChjKSAyMDE4IE1vYml2ZWlsIEluYy4K PiA+ID4gKyAqIEF1dGhvcjogU3VicmFobWFueWEgTGluZ2FwcGEgPGwuc3VicmFobWFueWFAbW9i aXZlaWwuY28uaW4+Cj4gPiA+ICsgKiBSZWZhY3RvcjogWmhpcWlhbmcgSG91IDxaaGlxaWFuZy5I b3VAbnhwLmNvbT4KPiA+ID4gKyAqLwo+ID4gPiArCj4gPiA+ICsjaW5jbHVkZSA8bGludXgvZGVs YXkuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGlu dXgva2VybmVsLmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGludXgvcGNpLmg+Cj4gPiA+ICsjaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gPiA+ICsKPiA+ID4gKyNpbmNsdWRlICJwY2ll LW1vYml2ZWlsLmgiCj4gPiA+ICsKPiA+ID4gKy8qCj4gPiA+ICsgKiBtb2JpdmVpbF9wY2llX3Nl bF9wYWdlIC0gcm91dGluZSB0byBhY2Nlc3MgcGFnZWQgcmVnaXN0ZXIKPiA+ID4gKyAqCj4gPiA+ ICsgKiBSZWdpc3RlcnMgd2hvc2UgYWRkcmVzcyBncmVhdGVyIHRoYW4gUEFHRURfQUREUl9CTkRS WSAoMHhjMDApIGFyZQo+ID4gcGFnZWQsCj4gPiA+ICsgKiBmb3IgdGhpcyBzY2hlbWUgdG8gd29y ayBleHRyYWN0ZWQgaGlnaGVyIDYgYml0cyBvZiB0aGUgb2Zmc2V0IHdpbGwgYmUKPiA+ID4gKyAq IHdyaXR0ZW4gdG8gcGdfc2VsIGZpZWxkIG9mIFBBQl9DVFJMIHJlZ2lzdGVyIGFuZCByZXN0IG9m IHRoZSBsb3dlciAxMAo+ID4gPiArICogYml0cyBlbmFibGVkIHdpdGggUEFHRURfQUREUl9CTkRS WSBhcmUgdXNlZCBhcyBvZmZzZXQgb2YgdGhlCj4gPiByZWdpc3Rlci4KPiA+ID4gKyAqLwo+ID4g PiArc3RhdGljIHZvaWQgbW9iaXZlaWxfcGNpZV9zZWxfcGFnZShzdHJ1Y3QgbW9iaXZlaWxfcGNp ZSAqcGNpZSwgdTggcGdfaWR4KQo+ID4gPiArewo+ID4gPiArCXUzMiB2YWw7Cj4gPiA+ICsKPiA+ ID4gKwl2YWwgPSByZWFkbChwY2llLT5jc3JfYXhpX3NsYXZlX2Jhc2UgKyBQQUJfQ1RSTCk7Cj4g PiA+ICsJdmFsICY9IH4oUEFHRV9TRUxfTUFTSyA8PCBQQUdFX1NFTF9TSElGVCk7Cj4gPiA+ICsJ dmFsIHw9IChwZ19pZHggJiBQQUdFX1NFTF9NQVNLKSA8PCBQQUdFX1NFTF9TSElGVDsKPiA+ID4g Kwo+ID4gPiArCXdyaXRlbCh2YWwsIHBjaWUtPmNzcl9heGlfc2xhdmVfYmFzZSArIFBBQl9DVFJM KTsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIHZvaWQgKm1vYml2ZWlsX3BjaWVfY29t cF9hZGRyKHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llLCB1MzIgb2ZmKQo+ID4gPiArewo+ID4g PiArCWlmIChvZmYgPCBQQUdFRF9BRERSX0JORFJZKSB7Cj4gPiA+ICsJCS8qIEZvciBkaXJlY3Rs eSBhY2Nlc3NlZCByZWdpc3RlcnMsIGNsZWFyIHRoZSBwZ19zZWwgZmllbGQgKi8KPiA+ID4gKwkJ bW9iaXZlaWxfcGNpZV9zZWxfcGFnZShwY2llLCAwKTsKPiA+ID4gKwkJcmV0dXJuIHBjaWUtPmNz cl9heGlfc2xhdmVfYmFzZSArIG9mZjsKPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwltb2JpdmVp bF9wY2llX3NlbF9wYWdlKHBjaWUsIE9GRlNFVF9UT19QQUdFX0lEWChvZmYpKTsKPiA+ID4gKwly ZXR1cm4gcGNpZS0+Y3NyX2F4aV9zbGF2ZV9iYXNlICsgT0ZGU0VUX1RPX1BBR0VfQUREUihvZmYp Owo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaW50IG1vYml2ZWlsX3BjaWVfcmVhZCh2 b2lkIF9faW9tZW0gKmFkZHIsIGludCBzaXplLCB1MzIgKnZhbCkKPiA+ID4gK3sKPiA+ID4gKwlp ZiAoKHVpbnRwdHJfdClhZGRyICYgKHNpemUgLSAxKSkgewo+ID4gPiArCQkqdmFsID0gMDsKPiA+ ID4gKwkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKPiA+ID4gKwl9Cj4gPiA+ ICsKPiA+ID4gKwlzd2l0Y2ggKHNpemUpIHsKPiA+ID4gKwljYXNlIDQ6Cj4gPiA+ICsJCSp2YWwg PSByZWFkbChhZGRyKTsKPiA+ID4gKwkJYnJlYWs7Cj4gPiA+ICsJY2FzZSAyOgo+ID4gPiArCQkq dmFsID0gcmVhZHcoYWRkcik7Cj4gPiA+ICsJCWJyZWFrOwo+ID4gPiArCWNhc2UgMToKPiA+ID4g KwkJKnZhbCA9IHJlYWRiKGFkZHIpOwo+ID4gPiArCQlicmVhazsKPiA+ID4gKwlkZWZhdWx0Ogo+ ID4gPiArCQkqdmFsID0gMDsKPiA+ID4gKwkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05V TUJFUjsKPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVM Owo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaW50IG1vYml2ZWlsX3BjaWVfd3JpdGUo dm9pZCBfX2lvbWVtICphZGRyLCBpbnQgc2l6ZSwgdTMyIHZhbCkKPiA+ID4gK3sKPiA+ID4gKwlp ZiAoKHVpbnRwdHJfdClhZGRyICYgKHNpemUgLSAxKSkKPiA+ID4gKwkJcmV0dXJuIFBDSUJJT1Nf QkFEX1JFR0lTVEVSX05VTUJFUjsKPiA+ID4gKwo+ID4gPiArCXN3aXRjaCAoc2l6ZSkgewo+ID4g PiArCWNhc2UgNDoKPiA+ID4gKwkJd3JpdGVsKHZhbCwgYWRkcik7Cj4gPiA+ICsJCWJyZWFrOwo+ ID4gPiArCWNhc2UgMjoKPiA+ID4gKwkJd3JpdGV3KHZhbCwgYWRkcik7Cj4gPiA+ICsJCWJyZWFr Owo+ID4gPiArCWNhc2UgMToKPiA+ID4gKwkJd3JpdGViKHZhbCwgYWRkcik7Cj4gPiA+ICsJCWJy ZWFrOwo+ID4gPiArCWRlZmF1bHQ6Cj4gPiA+ICsJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RF Ul9OVU1CRVI7Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJcmV0dXJuIFBDSUJJT1NfU1VDQ0VT U0ZVTDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArdTMyIGNzcl9yZWFkKHN0cnVjdCBtb2JpdmVp bF9wY2llICpwY2llLCB1MzIgb2ZmLCBzaXplX3Qgc2l6ZSkKPiA+ID4gK3sKPiA+ID4gKwl2b2lk ICphZGRyOwo+ID4gPiArCXUzMiB2YWw7Cj4gPiA+ICsJaW50IHJldDsKPiA+ID4gKwo+ID4gPiAr CWFkZHIgPSBtb2JpdmVpbF9wY2llX2NvbXBfYWRkcihwY2llLCBvZmYpOwo+ID4gPiArCj4gPiA+ ICsJcmV0ID0gbW9iaXZlaWxfcGNpZV9yZWFkKGFkZHIsIHNpemUsICZ2YWwpOwo+ID4gPiArCWlm IChyZXQpCj4gPiA+ICsJCWRldl9lcnIoJnBjaWUtPnBkZXYtPmRldiwgInJlYWQgQ1NSIGFkZHJl c3MgZmFpbGVkXG4iKTsKPiA+ID4gKwo+ID4gPiArCXJldHVybiB2YWw7Cj4gPiA+ICt9Cj4gPiA+ ICsKPiA+ID4gK3ZvaWQgY3NyX3dyaXRlKHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llLCB1MzIg dmFsLCB1MzIgb2ZmLCBzaXplX3Qgc2l6ZSkKPiA+ID4gK3sKPiA+ID4gKwl2b2lkICphZGRyOwo+ ID4gPiArCWludCByZXQ7Cj4gPiA+ICsKPiA+ID4gKwlhZGRyID0gbW9iaXZlaWxfcGNpZV9jb21w X2FkZHIocGNpZSwgb2ZmKTsKPiA+ID4gKwo+ID4gPiArCXJldCA9IG1vYml2ZWlsX3BjaWVfd3Jp dGUoYWRkciwgc2l6ZSwgdmFsKTsKPiA+ID4gKwlpZiAocmV0KQo+ID4gPiArCQlkZXZfZXJyKCZw Y2llLT5wZGV2LT5kZXYsICJ3cml0ZSBDU1IgYWRkcmVzcyBmYWlsZWRcbiIpOwo+ID4gPiArfQo+ ID4gPiArCj4gPiA+ICtib29sIG1vYml2ZWlsX3BjaWVfbGlua191cChzdHJ1Y3QgbW9iaXZlaWxf cGNpZSAqcGNpZSkKPiA+ID4gK3sKPiA+ID4gKwlpZiAocGNpZS0+b3BzLT5saW5rX3VwKQo+ID4g PiArCQlyZXR1cm4gcGNpZS0+b3BzLT5saW5rX3VwKHBjaWUpOwo+ID4gPiArCj4gPiA+ICsJcmV0 dXJuIChjc3JfcmVhZGwocGNpZSwgTFRTU01fU1RBVFVTKSAmCj4gPiA+ICsJCUxUU1NNX1NUQVRV U19MMF9NQVNLKSA9PSBMVFNTTV9TVEFUVVNfTDA7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3Zv aWQgcHJvZ3JhbV9pYl93aW5kb3dzKHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llLCBpbnQgd2lu X251bSwgdTY0Cj4gPiBjcHVfYWRkciwKPiA+ID4gKwkJCXU2NCBwY2lfYWRkciwgdTMyIHR5cGUs IHU2NCBzaXplKQo+ID4gPiArewo+ID4gPiArCXUzMiB2YWx1ZTsKPiA+ID4gKwl1NjQgc2l6ZTY0 ID0gfihzaXplIC0gMSk7Cj4gPiA+ICsKPiA+ID4gKwlpZiAod2luX251bSA+PSBwY2llLT5wcGlv X3dpbnMpIHsKPiA+ID4gKwkJZGV2X2VycigmcGNpZS0+cGRldi0+ZGV2LAo+ID4gPiArCQkJIkVS Uk9SOiBtYXggaW5ib3VuZCB3aW5kb3dzIHJlYWNoZWQgIVxuIik7Cj4gPiA+ICsJCXJldHVybjsK PiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwl2YWx1ZSA9IGNzcl9yZWFkbChwY2llLCBQQUJfUEVY X0FNQVBfQ1RSTCh3aW5fbnVtKSk7Cj4gPiA+ICsJdmFsdWUgJj0gfihBTUFQX0NUUkxfVFlQRV9N QVNLIDw8IEFNQVBfQ1RSTF9UWVBFX1NISUZUIHwKPiA+ID4gKwkJIFdJTl9TSVpFX01BU0sgPDwg V0lOX1NJWkVfU0hJRlQpOwo+ID4gPiArCXZhbHVlIHw9ICh0eXBlIDw8IEFNQVBfQ1RSTF9UWVBF X1NISUZUKSB8ICgxIDw8Cj4gPiBBTUFQX0NUUkxfRU5fU0hJRlQpIHwKPiA+ID4gKwkJIChsb3dl cl8zMl9iaXRzKHNpemU2NCkgJiBXSU5fU0laRV9NQVNLIDw8IFdJTl9TSVpFX1NISUZUKTsKPiA+ ID4gKwljc3Jfd3JpdGVsKHBjaWUsIHZhbHVlLCBQQUJfUEVYX0FNQVBfQ1RSTCh3aW5fbnVtKSk7 Cj4gPiA+ICsKPiA+ID4gKwljc3Jfd3JpdGVsKHBjaWUsIHVwcGVyXzMyX2JpdHMoc2l6ZTY0KSwK PiA+ID4gKwkJICAgUEFCX0VYVF9QRVhfQU1BUF9TSVpFTih3aW5fbnVtKSk7Cj4gPiA+ICsKPiA+ ID4gKwljc3Jfd3JpdGVsKHBjaWUsIGxvd2VyXzMyX2JpdHMoY3B1X2FkZHIpLAo+ID4gPiArCQkg ICBQQUJfUEVYX0FNQVBfQVhJX1dJTih3aW5fbnVtKSk7Cj4gPiA+ICsJY3NyX3dyaXRlbChwY2ll LCB1cHBlcl8zMl9iaXRzKGNwdV9hZGRyKSwKPiA+ID4gKwkJICAgUEFCX0VYVF9QRVhfQU1BUF9B WElfV0lOKHdpbl9udW0pKTsKPiA+ID4gKwo+ID4gPiArCWNzcl93cml0ZWwocGNpZSwgbG93ZXJf MzJfYml0cyhwY2lfYWRkciksCj4gPiA+ICsJCSAgIFBBQl9QRVhfQU1BUF9QRVhfV0lOX0wod2lu X251bSkpOwo+ID4gPiArCWNzcl93cml0ZWwocGNpZSwgdXBwZXJfMzJfYml0cyhwY2lfYWRkciks Cj4gPiA+ICsJCSAgIFBBQl9QRVhfQU1BUF9QRVhfV0lOX0god2luX251bSkpOwo+ID4gPiArCj4g PiA+ICsJcGNpZS0+aWJfd2luc19jb25maWd1cmVkKys7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4g Ky8qCj4gPiA+ICsgKiByb3V0aW5lIHRvIHByb2dyYW0gdGhlIG91dGJvdW5kIHdpbmRvd3MKPiA+ ID4gKyAqLwo+ID4gPiArdm9pZCBwcm9ncmFtX29iX3dpbmRvd3Moc3RydWN0IG1vYml2ZWlsX3Bj aWUgKnBjaWUsIGludCB3aW5fbnVtLCB1NjQKPiA+IGNwdV9hZGRyLAo+ID4gPiArCQkJdTY0IHBj aV9hZGRyLCB1MzIgdHlwZSwgdTY0IHNpemUpCj4gPiA+ICt7Cj4gPiA+ICsKPiA+ID4gKwl1MzIg dmFsdWU7Cj4gPiA+ICsJdTY0IHNpemU2NCA9IH4oc2l6ZSAtIDEpOwo+ID4gPiArCj4gPiA+ICsJ aWYgKHdpbl9udW0gPj0gcGNpZS0+YXBpb193aW5zKSB7Cj4gPiA+ICsJCWRldl9lcnIoJnBjaWUt PnBkZXYtPmRldiwKPiA+ID4gKwkJCSJFUlJPUjogbWF4IG91dGJvdW5kIHdpbmRvd3MgcmVhY2hl ZCAhXG4iKTsKPiA+ID4gKwkJcmV0dXJuOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCS8qCj4g PiA+ICsJICogcHJvZ3JhbSBFbmFibGUgQml0IHRvIDEsIFR5cGUgQml0IHRvICgwMCkgYmFzZSAy LCBBWEkgV2luZG93IFNpemUgQml0Cj4gPiA+ICsJICogdG8gNCBLQiBpbiBQQUJfQVhJX0FNQVBf Q1RSTCByZWdpc3Rlcgo+ID4gPiArCSAqLwo+ID4gPiArCXZhbHVlID0gY3NyX3JlYWRsKHBjaWUs IFBBQl9BWElfQU1BUF9DVFJMKHdpbl9udW0pKTsKPiA+ID4gKwl2YWx1ZSAmPSB+KFdJTl9UWVBF X01BU0sgPDwgV0lOX1RZUEVfU0hJRlQgfAo+ID4gPiArCQkgV0lOX1NJWkVfTUFTSyA8PCBXSU5f U0laRV9TSElGVCk7Cj4gPiA+ICsJdmFsdWUgfD0gMSA8PCBXSU5fRU5BQkxFX1NISUZUIHwgdHlw ZSA8PCBXSU5fVFlQRV9TSElGVCB8Cj4gPiA+ICsJCSAobG93ZXJfMzJfYml0cyhzaXplNjQpICYg V0lOX1NJWkVfTUFTSyA8PCBXSU5fU0laRV9TSElGVCk7Cj4gPiA+ICsJY3NyX3dyaXRlbChwY2ll LCB2YWx1ZSwgUEFCX0FYSV9BTUFQX0NUUkwod2luX251bSkpOwo+ID4gPiArCj4gPiA+ICsJY3Ny X3dyaXRlbChwY2llLCB1cHBlcl8zMl9iaXRzKHNpemU2NCksCj4gPiBQQUJfRVhUX0FYSV9BTUFQ X1NJWkUod2luX251bSkpOwo+ID4gPiArCj4gPiA+ICsJLyoKPiA+ID4gKwkgKiBwcm9ncmFtIEFY SSB3aW5kb3cgYmFzZSB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlIGluCj4gPiA+ICsJICogUEFCX0FY SV9BTUFQX0FYSV9XSU4wIHJlZ2lzdGVyCj4gPiA+ICsJICovCj4gPiA+ICsJY3NyX3dyaXRlbChw Y2llLCBsb3dlcl8zMl9iaXRzKGNwdV9hZGRyKSAmCj4gPiAofkFYSV9XSU5ET1dfQUxJR05fTUFT SyksCj4gPiA+ICsJCSAgIFBBQl9BWElfQU1BUF9BWElfV0lOKHdpbl9udW0pKTsKPiA+ID4gKwlj c3Jfd3JpdGVsKHBjaWUsIHVwcGVyXzMyX2JpdHMoY3B1X2FkZHIpLAo+ID4gPiArCQkgICBQQUJf RVhUX0FYSV9BTUFQX0FYSV9XSU4od2luX251bSkpOwo+ID4gPiArCj4gPiA+ICsJY3NyX3dyaXRl bChwY2llLCBsb3dlcl8zMl9iaXRzKHBjaV9hZGRyKSwKPiA+ID4gKwkJICAgUEFCX0FYSV9BTUFQ X1BFWF9XSU5fTCh3aW5fbnVtKSk7Cj4gPiA+ICsJY3NyX3dyaXRlbChwY2llLCB1cHBlcl8zMl9i aXRzKHBjaV9hZGRyKSwKPiA+ID4gKwkJICAgUEFCX0FYSV9BTUFQX1BFWF9XSU5fSCh3aW5fbnVt KSk7Cj4gPiA+ICsKPiA+ID4gKwlwY2llLT5vYl93aW5zX2NvbmZpZ3VyZWQrKzsKPiA+ID4gK30K PiA+ID4gKwo+ID4gPiAraW50IG1vYml2ZWlsX2JyaW5ndXBfbGluayhzdHJ1Y3QgbW9iaXZlaWxf cGNpZSAqcGNpZSkKPiA+ID4gK3sKPiA+ID4gKwlpbnQgcmV0cmllczsKPiA+ID4gKwo+ID4gPiAr CS8qIGNoZWNrIGlmIHRoZSBsaW5rIGlzIHVwIG9yIG5vdCAqLwo+ID4gPiArCWZvciAocmV0cmll cyA9IDA7IHJldHJpZXMgPCBMSU5LX1dBSVRfTUFYX1JFVFJJRVM7IHJldHJpZXMrKykgewo+ID4g PiArCQlpZiAobW9iaXZlaWxfcGNpZV9saW5rX3VwKHBjaWUpKQo+ID4gPiArCQkJcmV0dXJuIDA7 Cj4gPiA+ICsKPiA+ID4gKwkJdXNsZWVwX3JhbmdlKExJTktfV0FJVF9NSU4sIExJTktfV0FJVF9N QVgpOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCWRldl9lcnIoJnBjaWUtPnBkZXYtPmRldiwg ImxpbmsgbmV2ZXIgY2FtZSB1cFxuIik7Cj4gPiA+ICsKPiA+ID4gKwlyZXR1cm4gLUVUSU1FRE9V VDsKPiA+ID4gK30KPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvbW9i aXZlaWwvcGNpZS1tb2JpdmVpbC5oCj4gPiBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvbW9iaXZl aWwvcGNpZS1tb2JpdmVpbC5oCj4gPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiA+IGluZGV4 IDAwMDAwMDAwMDAwMC4uZWI0Y2I2MTI5MWE4Cj4gPiA+IC0tLSAvZGV2L251bGwKPiA+ID4gKysr IGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9tb2JpdmVpbC9wY2llLW1vYml2ZWlsLmgKPiA+ID4g QEAgLTAsMCArMSwxODcgQEAKPiA+ID4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wICovCj4gPiA+ICsvKgo+ID4gPiArICogUENJZSBob3N0IGNvbnRyb2xsZXIgZHJpdmVyIGZv ciBNb2JpdmVpbCBQQ0llIEhvc3QgY29udHJvbGxlcgo+ID4gPiArICoKPiA+ID4gKyAqIENvcHly aWdodCAoYykgMjAxOCBNb2JpdmVpbCBJbmMuCj4gPiA+ICsgKiBBdXRob3I6IFN1YnJhaG1hbnlh IExpbmdhcHBhIDxsLnN1YnJhaG1hbnlhQG1vYml2ZWlsLmNvLmluPgo+ID4gPiArICogUmVmYWN0 b3I6IFpoaXFpYW5nIEhvdSA8WmhpcWlhbmcuSG91QG54cC5jb20+Cj4gPiA+ICsgKi8KPiA+ID4g Kwo+ID4gPiArI2lmbmRlZiBfUENJRV9NT0JJVkVJTF9ICj4gPiA+ICsjZGVmaW5lIF9QQ0lFX01P QklWRUlMX0gKPiA+ID4gKwo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgo+ID4gPiArI2lu Y2x1ZGUgPGxpbnV4L2lycS5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L21zaS5oPgo+ID4gPiAr I2luY2x1ZGUgIi4uLy4uL3BjaS5oIgo+ID4gPiArCj4gPiA+ICsvKiByZWdpc3RlciBvZmZzZXRz IGFuZCBiaXQgcG9zaXRpb25zICovCj4gPiA+ICsKPiA+ID4gKy8qCj4gPiA+ICsgKiB0cmFuc2xh dGlvbiB0YWJsZXMgYXJlIGdyb3VwZWQgaW50byB3aW5kb3dzLCBlYWNoIHdpbmRvdyByZWdpc3Rl cnMgYXJlCj4gPiA+ICsgKiBncm91cGVkIGludG8gYmxvY2tzIG9mIDQgb3IgMTYgcmVnaXN0ZXJz IGVhY2gKPiA+ID4gKyAqLwo+ID4gPiArI2RlZmluZSBQQUJfUkVHX0JMT0NLX1NJWkUJCTE2Cj4g PiA+ICsjZGVmaW5lIFBBQl9FWFRfUkVHX0JMT0NLX1NJWkUJCTQKPiA+ID4gKwo+ID4gPiArI2Rl ZmluZSBQQUJfUkVHX0FERFIob2Zmc2V0LCB3aW4pCVwKPiA+ID4gKwkob2Zmc2V0ICsgKHdpbiAq IFBBQl9SRUdfQkxPQ0tfU0laRSkpCj4gPiA+ICsjZGVmaW5lIFBBQl9FWFRfUkVHX0FERFIob2Zm c2V0LCB3aW4pCVwKPiA+ID4gKwkob2Zmc2V0ICsgKHdpbiAqIFBBQl9FWFRfUkVHX0JMT0NLX1NJ WkUpKQo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIExUU1NNX1NUQVRVUwkJCTB4MDQwNAo+ID4gPiAr I2RlZmluZSAgTFRTU01fU1RBVFVTX0wwX01BU0sJCTB4M2YKPiA+ID4gKyNkZWZpbmUgIExUU1NN X1NUQVRVU19MMAkJMHgyZAo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIFBBQl9DVFJMCQkJMHgwODA4 Cj4gPiA+ICsjZGVmaW5lICBBTUJBX1BJT19FTkFCTEVfU0hJRlQJCTAKPiA+ID4gKyNkZWZpbmUg IFBFWF9QSU9fRU5BQkxFX1NISUZUCQkxCj4gPiA+ICsjZGVmaW5lICBQQUdFX1NFTF9TSElGVAkJ CTEzCj4gPiA+ICsjZGVmaW5lICBQQUdFX1NFTF9NQVNLCQkJMHgzZgo+ID4gPiArI2RlZmluZSAg UEFHRV9MT19NQVNLCQkJMHgzZmYKPiA+ID4gKyNkZWZpbmUgIFBBR0VfU0VMX09GRlNFVF9TSElG VAkJMTAKPiA+ID4gKwo+ID4gPiArI2RlZmluZSBQQUJfQVhJX1BJT19DVFJMCQkweDA4NDAKPiA+ ID4gKyNkZWZpbmUgIEFQSU9fRU5fTUFTSwkJCTB4Zgo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIFBB Ql9QRVhfUElPX0NUUkwJCTB4MDhjMAo+ID4gPiArI2RlZmluZSAgUElPX0VOQUJMRV9TSElGVAkJ MAo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIFBBQl9JTlRQX0FNQkFfTUlTQ19FTkIJCTB4MGIwYwo+ ID4gPiArI2RlZmluZSBQQUJfSU5UUF9BTUJBX01JU0NfU1RBVAkJMHgwYjFjCj4gPiA+ICsjZGVm aW5lICBQQUJfSU5UUF9JTlRYX01BU0sJCTB4MDFlMAo+ID4gPiArI2RlZmluZSAgUEFCX0lOVFBf TVNJX01BU0sJCTB4OAo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIFBBQl9BWElfQU1BUF9DVFJMKHdp bikJCVBBQl9SRUdfQUREUigweDBiYTAsIHdpbikKPiA+ID4gKyNkZWZpbmUgIFdJTl9FTkFCTEVf U0hJRlQJCTAKPiA+ID4gKyNkZWZpbmUgIFdJTl9UWVBFX1NISUZUCQkJMQo+ID4gPiArI2RlZmlu ZSAgV0lOX1RZUEVfTUFTSwkJCTB4Mwo+ID4gPiArI2RlZmluZSAgV0lOX1NJWkVfU0hJRlQJCQkx MAo+ID4gPiArI2RlZmluZSAgV0lOX1NJWkVfTUFTSwkJCTB4M2ZmZmZmCj4gPiA+ICsKPiA+ID4g KyNkZWZpbmUgUEFCX0VYVF9BWElfQU1BUF9TSVpFKHdpbikJUEFCX0VYVF9SRUdfQUREUigweGJh ZjAsCj4gPiB3aW4pCj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgUEFCX0VYVF9BWElfQU1BUF9BWElf V0lOKHdpbikKPiA+IAlQQUJfRVhUX1JFR19BRERSKDB4ODBhMCwgd2luKQo+ID4gPiArI2RlZmlu ZSBQQUJfQVhJX0FNQVBfQVhJX1dJTih3aW4pCVBBQl9SRUdfQUREUigweDBiYTQsIHdpbikKPiA+ ID4gKyNkZWZpbmUgIEFYSV9XSU5ET1dfQUxJR05fTUFTSwkJMwo+ID4gPiArCj4gPiA+ICsjZGVm aW5lIFBBQl9BWElfQU1BUF9QRVhfV0lOX0wod2luKQlQQUJfUkVHX0FERFIoMHgwYmE4LAo+ID4g d2luKQo+ID4gPiArI2RlZmluZSAgUEFCX0JVU19TSElGVAkJCTI0Cj4gPiA+ICsjZGVmaW5lICBQ QUJfREVWSUNFX1NISUZUCQkxOQo+ID4gPiArI2RlZmluZSAgUEFCX0ZVTkNUSU9OX1NISUZUCQkx Ngo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIFBBQl9BWElfQU1BUF9QRVhfV0lOX0god2luKQlQQUJf UkVHX0FERFIoMHgwYmFjLAo+ID4gd2luKQo+ID4gPiArI2RlZmluZSBQQUJfSU5UUF9BWElfUElP X0NMQVNTCQkweDQ3NAo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIFBBQl9QRVhfQU1BUF9DVFJMKHdp bikJCVBBQl9SRUdfQUREUigweDRiYTAsCj4gPiB3aW4pCj4gPiA+ICsjZGVmaW5lICBBTUFQX0NU UkxfRU5fU0hJRlQJCTAKPiA+ID4gKyNkZWZpbmUgIEFNQVBfQ1RSTF9UWVBFX1NISUZUCQkxCj4g PiA+ICsjZGVmaW5lICBBTUFQX0NUUkxfVFlQRV9NQVNLCQkzCj4gPiA+ICsKPiA+ID4gKyNkZWZp bmUgUEFCX0VYVF9QRVhfQU1BUF9TSVpFTih3aW4pCVBBQl9FWFRfUkVHX0FERFIoMHhiZWYwLAo+ ID4gd2luKQo+ID4gPiArI2RlZmluZSBQQUJfRVhUX1BFWF9BTUFQX0FYSV9XSU4od2luKQo+ID4g CVBBQl9FWFRfUkVHX0FERFIoMHhiNGEwLCB3aW4pCj4gPiA+ICsjZGVmaW5lIFBBQl9QRVhfQU1B UF9BWElfV0lOKHdpbikJUEFCX1JFR19BRERSKDB4NGJhNCwgd2luKQo+ID4gPiArI2RlZmluZSBQ QUJfUEVYX0FNQVBfUEVYX1dJTl9MKHdpbikJUEFCX1JFR19BRERSKDB4NGJhOCwKPiA+IHdpbikK PiA+ID4gKyNkZWZpbmUgUEFCX1BFWF9BTUFQX1BFWF9XSU5fSCh3aW4pCVBBQl9SRUdfQUREUigw eDRiYWMsCj4gPiB3aW4pCj4gPiA+ICsKPiA+ID4gKy8qIHN0YXJ0aW5nIG9mZnNldCBvZiBJTlRY IGJpdHMgaW4gc3RhdHVzIHJlZ2lzdGVyICovCj4gPiA+ICsjZGVmaW5lIFBBQl9JTlRYX1NUQVJU CQkJNQo+ID4gPiArCj4gPiA+ICsvKiBzdXBwb3J0ZWQgbnVtYmVyIG9mIE1TSSBpbnRlcnJ1cHRz ICovCj4gPiA+ICsjZGVmaW5lIFBDSV9OVU1fTVNJCQkJMTYKPiA+ID4gKwo+ID4gPiArLyogTVNJ IHJlZ2lzdGVycyAqLwo+ID4gPiArI2RlZmluZSBNU0lfQkFTRV9MT19PRkZTRVQJCTB4MDQKPiA+ ID4gKyNkZWZpbmUgTVNJX0JBU0VfSElfT0ZGU0VUCQkweDA4Cj4gPiA+ICsjZGVmaW5lIE1TSV9T SVpFX09GRlNFVAkJCTB4MGMKPiA+ID4gKyNkZWZpbmUgTVNJX0VOQUJMRV9PRkZTRVQJCTB4MTQK PiA+ID4gKyNkZWZpbmUgTVNJX1NUQVRVU19PRkZTRVQJCTB4MTgKPiA+ID4gKyNkZWZpbmUgTVNJ X0RBVEFfT0ZGU0VUCQkJMHgyMAo+ID4gPiArI2RlZmluZSBNU0lfQUREUl9MX09GRlNFVAkJMHgy NAo+ID4gPiArI2RlZmluZSBNU0lfQUREUl9IX09GRlNFVAkJMHgyOAo+ID4gPiArCj4gPiA+ICsv KiBvdXRib3VuZCBhbmQgaW5ib3VuZCB3aW5kb3cgZGVmaW5pdGlvbnMgKi8KPiA+ID4gKyNkZWZp bmUgV0lOX05VTV8wCQkJMAo+ID4gPiArI2RlZmluZSBXSU5fTlVNXzEJCQkxCj4gPiA+ICsjZGVm aW5lIENGR19XSU5ET1dfVFlQRQkJCTAKPiA+ID4gKyNkZWZpbmUgSU9fV0lORE9XX1RZUEUJCQkx Cj4gPiA+ICsjZGVmaW5lIE1FTV9XSU5ET1dfVFlQRQkJCTIKPiA+ID4gKyNkZWZpbmUgSUJfV0lO X1NJWkUJCQkoKHU2NCkyNTYgKiAxMDI0ICogMTAyNCAqIDEwMjQpCj4gPiA+ICsjZGVmaW5lIE1B WF9QSU9fV0lORE9XUwkJCTgKPiA+ID4gKwo+ID4gPiArLyogUGFyYW1ldGVycyBmb3IgdGhlIHdh aXRpbmcgZm9yIGxpbmsgdXAgcm91dGluZSAqLwo+ID4gPiArI2RlZmluZSBMSU5LX1dBSVRfTUFY X1JFVFJJRVMJCTEwCj4gPiA+ICsjZGVmaW5lIExJTktfV0FJVF9NSU4JCQk5MDAwMAo+ID4gPiAr I2RlZmluZSBMSU5LX1dBSVRfTUFYCQkJMTAwMDAwCj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgUEFH RURfQUREUl9CTkRSWQkJMHhjMDAKPiA+ID4gKyNkZWZpbmUgT0ZGU0VUX1RPX1BBR0VfQUREUihv ZmYpCVwKPiA+ID4gKwkoKG9mZiAmIFBBR0VfTE9fTUFTSykgfCBQQUdFRF9BRERSX0JORFJZKQo+ ID4gPiArI2RlZmluZSBPRkZTRVRfVE9fUEFHRV9JRFgob2ZmKQkJXAo+ID4gPiArCSgob2ZmID4+ IFBBR0VfU0VMX09GRlNFVF9TSElGVCkgJiBQQUdFX1NFTF9NQVNLKQo+ID4gPiArCj4gPiA+ICtz dHJ1Y3QgbW9iaXZlaWxfcGNpZTsKPiA+ID4gKwo+ID4gPiArc3RydWN0IG1vYml2ZWlsX21zaSB7 CQkJLyogTVNJIGluZm9ybWF0aW9uICovCj4gPiA+ICsJc3RydWN0IG11dGV4IGxvY2s7CQkvKiBw cm90ZWN0IGJpdG1hcCB2YXJpYWJsZSAqLwo+ID4gPiArCXN0cnVjdCBpcnFfZG9tYWluICptc2lf ZG9tYWluOwo+ID4gPiArCXN0cnVjdCBpcnFfZG9tYWluICpkZXZfZG9tYWluOwo+ID4gPiArCXBo eXNfYWRkcl90IG1zaV9wYWdlc19waHlzOwo+ID4gPiArCWludCBudW1fb2ZfdmVjdG9yczsKPiA+ ID4gKwlERUNMQVJFX0JJVE1BUChtc2lfaXJxX2luX3VzZSwgUENJX05VTV9NU0kpOwo+ID4gPiAr fTsKPiA+ID4gKwo+ID4gPiArc3RydWN0IG1vYml2ZWlsX3JwX29wcyB7Cj4gPiA+ICsJaW50ICgq aW50ZXJydXB0X2luaXQpKHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llKTsKPiA+ID4gK307Cj4g PiA+ICsKPiA+ID4gK3N0cnVjdCByb290X3BvcnQgewo+ID4gPiArCXU4IHJvb3RfYnVzX25yOwo+ ID4gPiArCXZvaWQgX19pb21lbSAqY29uZmlnX2F4aV9zbGF2ZV9iYXNlOwkvKiBlbmRwb2ludCBj b25maWcgYmFzZSAqLwo+ID4gPiArCXN0cnVjdCByZXNvdXJjZSAqb2JfaW9fcmVzOwo+ID4gPiAr CXN0cnVjdCBtb2JpdmVpbF9ycF9vcHMgKm9wczsKPiA+ID4gKwlpbnQgaXJxOwo+ID4gPiArCXJh d19zcGlubG9ja190IGludHhfbWFza19sb2NrOwo+ID4gPiArCXN0cnVjdCBpcnFfZG9tYWluICpp bnR4X2RvbWFpbjsKPiA+ID4gKwlzdHJ1Y3QgbW9iaXZlaWxfbXNpIG1zaTsKPiA+ID4gK307Cj4g PiA+ICsKPiA+ID4gK3N0cnVjdCBtb2JpdmVpbF9wYWJfb3BzIHsKPiA+ID4gKwlpbnQgKCpsaW5r X3VwKShzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSk7Cj4gPiA+ICt9Owo+ID4gPiArCj4gPiA+ ICtzdHJ1Y3QgbW9iaXZlaWxfcGNpZSB7Cj4gPiA+ICsJc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldjsKPiA+ID4gKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlc291cmNlczsKPiA+ID4gKwl2b2lkIF9f aW9tZW0gKmNzcl9heGlfc2xhdmVfYmFzZTsJLyogUEFCIHJlZ2lzdGVycyBiYXNlICovCj4gPiA+ ICsJcGh5c19hZGRyX3QgcGNpZV9yZWdfYmFzZTsJLyogUGh5c2ljYWwgUENJZSBDb250cm9sbGVy IEJhc2UgKi8KPiA+ID4gKwl2b2lkIF9faW9tZW0gKmFwYl9jc3JfYmFzZTsJLyogTVNJIHJlZ2lz dGVyIGJhc2UgKi8KPiA+ID4gKwl1MzIgYXBpb193aW5zOwo+ID4gPiArCXUzMiBwcGlvX3dpbnM7 Cj4gPiA+ICsJdTMyIG9iX3dpbnNfY29uZmlndXJlZDsJCS8qIGNvbmZpZ3VyZWQgb3V0Ym91bmQg d2luZG93cyAqLwo+ID4gPiArCXUzMiBpYl93aW5zX2NvbmZpZ3VyZWQ7CQkvKiBjb25maWd1cmVk IGluYm91bmQgd2luZG93cyAqLwo+ID4gPiArCWNvbnN0IHN0cnVjdCBtb2JpdmVpbF9wYWJfb3Bz ICpvcHM7Cj4gPiA+ICsJc3RydWN0IHJvb3RfcG9ydCBycDsKPiA+ID4gK307Cj4gPiA+ICsKPiA+ ID4gK2ludCBtb2JpdmVpbF9wY2llX2hvc3RfcHJvYmUoc3RydWN0IG1vYml2ZWlsX3BjaWUgKnBj aWUpOwo+ID4gPiArYm9vbCBtb2JpdmVpbF9wY2llX2xpbmtfdXAoc3RydWN0IG1vYml2ZWlsX3Bj aWUgKnBjaWUpOwo+ID4gPiAraW50IG1vYml2ZWlsX2JyaW5ndXBfbGluayhzdHJ1Y3QgbW9iaXZl aWxfcGNpZSAqcGNpZSk7Cj4gPiA+ICt2b2lkIHByb2dyYW1fb2Jfd2luZG93cyhzdHJ1Y3QgbW9i aXZlaWxfcGNpZSAqcGNpZSwgaW50IHdpbl9udW0sIHU2NAo+ID4gY3B1X2FkZHIsCj4gPiA+ICsJ CQl1NjQgcGNpX2FkZHIsIHUzMiB0eXBlLCB1NjQgc2l6ZSk7Cj4gPiA+ICt2b2lkIHByb2dyYW1f aWJfd2luZG93cyhzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSwgaW50IHdpbl9udW0sIHU2NAo+ ID4gY3B1X2FkZHIsCj4gPiA+ICsJCQl1NjQgcGNpX2FkZHIsIHUzMiB0eXBlLCB1NjQgc2l6ZSk7 Cj4gPiA+ICt1MzIgY3NyX3JlYWQoc3RydWN0IG1vYml2ZWlsX3BjaWUgKnBjaWUsIHUzMiBvZmYs IHNpemVfdCBzaXplKTsKPiA+ID4gK3ZvaWQgY3NyX3dyaXRlKHN0cnVjdCBtb2JpdmVpbF9wY2ll ICpwY2llLCB1MzIgdmFsLCB1MzIgb2ZmLCBzaXplX3Qgc2l6ZSk7Cj4gPiA+ICsKPiA+ID4gK3N0 YXRpYyBpbmxpbmUgdTMyIGNzcl9yZWFkbChzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSwgdTMy IG9mZikKPiA+ID4gK3sKPiA+ID4gKwlyZXR1cm4gY3NyX3JlYWQocGNpZSwgb2ZmLCAweDQpOwo+ ID4gPiArfQo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgY3NyX3dyaXRlbChzdHJ1 Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSwgdTMyIHZhbCwgdTMyIG9mZikKPiA+ID4gK3sKPiA+ID4g Kwljc3Jfd3JpdGUocGNpZSwgdmFsLCBvZmYsIDB4NCk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4g KyNlbmRpZiAvKiBfUENJRV9NT0JJVkVJTF9IICovCj4gPiA+IC0tCj4gPiA+IDIuMTcuMQo+ID4g Pgo+IAo+IFRoYW5rcywKPiBaaGlxaWFuZwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJt LWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=