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=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DA828C63777 for ; Fri, 27 Nov 2020 10:47:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 63D60204EA for ; Fri, 27 Nov 2020 10:47:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725989AbgK0Kqq (ORCPT ); Fri, 27 Nov 2020 05:46:46 -0500 Received: from mail-pl1-f194.google.com ([209.85.214.194]:45359 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728294AbgK0Kqq (ORCPT ); Fri, 27 Nov 2020 05:46:46 -0500 Received: by mail-pl1-f194.google.com with SMTP id v21so2490304plo.12 for ; Fri, 27 Nov 2020 02:46:44 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=/ofhNQSHG3WAD/AojJeiQwmlt67hb9Caduex5mipx9k=; b=qmCBND641y3RAxkwOTdZgXjJVeBj73eWI+8R+CC+OoLR3FhKMG9X7WRvBciUZlGrqH ma1Q4sex0c/B55bf0KVQw7YbWna0n1IfrNjshkxDckRsMu3CIcOQ3Ue0qQxSVqbuqMQd 4P4Hqm/DhUfBOH/KDSHMA0bdrc1Lf+aXga3TlAR9ia3iQyPd8oKMzi5roO8y3Q13SEel ew1tekiX5xQ/oat7Dcp5uz61WYjlLvUw9YwbytrSxnV8QhYdINGnKS5o4nGWBBwam40w c3hmp4eSRqXulyDt5kLspmXCn0Z8ISgy6WO/I+WT+U80wNPd9jC2z73xnZoKrpY8Nl0l 1c5Q== X-Gm-Message-State: AOAM533hwoM14O3JOO5R/D0TjujchM2/0HVV4ehJWlbGrMOpYjTFDfH5 UjhCOhods2JThT3WEYXo1mc= X-Google-Smtp-Source: ABdhPJxHqGQQEytKXoVDsUeGv6IYcQ2xpnElpAMxdcC+3X4fRm/f7wqyqiJBwbLDhUDt3fZBfILO6w== X-Received: by 2002:a17:902:820e:b029:d6:e802:75aa with SMTP id x14-20020a170902820eb02900d6e80275aamr6214785pln.51.1606474004147; Fri, 27 Nov 2020 02:46:44 -0800 (PST) Received: from workstation.lan ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id v22sm7161494pff.48.2020.11.27.02.46.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Nov 2020 02:46:43 -0800 (PST) From: =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= To: Bjorn Helgaas Cc: Rob Herring , Jonathan Cameron , Jonathan Chocron , Shawn Lin , Heiko Stuebner , Zhou Wang , Lorenzo Pieralisi , Will Deacon , Robert Richter , Michal Simek , Toan Le , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Thomas Petazzoni , Nicolas Saenz Julienne , Florian Fainelli , Ray Jui , Scott Branden , Jonathan Derrick , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, linux-rockchip@lists.infradead.org, linux-rpi-kernel@lists.infradead.org, bcm-kernel-feedback-list@broadcom.com Subject: [PATCH v5] PCI: Unify ECAM constants in native PCI Express drivers Date: Fri, 27 Nov 2020 10:46:26 +0000 Message-Id: <20201127104626.3979165-1-kw@linux.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Unify ECAM-related constants into a single set of standard constants defining memory address shift values for the byte-level address that can be used when accessing the PCI Express Configuration Space, and then move native PCI Express controller drivers to use newly introduced definitions retiring any driver-specific ones. The ECAM ("Enhanced Configuration Access Mechanism") is defined by the PCI Express specification (see PCI Express Base Specification, Revision 5.0, Version 1.0, Section 7.2.2, p. 676), thus most hardware should implement it the same way. Most of the native PCI Express controller drivers define their ECAM-related constants, many of these could be shared, or use open-coded values when setting the .bus_shift field of the struct pci_ecam_ops. All of the newly added constants should remove ambiguity and reduce the number of open-coded values, and also correlate more strongly with the descriptions in the aforementioned specification (see Table 7-1 "Enhanced Configuration Address Mapping", p. 677). There is no change to functionality. Suggested-by: Bjorn Helgaas Signed-off-by: Krzysztof WilczyƄski --- Changed in v5: Removed unused constant "PCIE_ECAM_DEV_SHIFT". Refactored ppc4xx_pciex_get_config_base() so that the "offset" parameter can be passed to so that the PCIE_ECAM_OFFSET() macro can be used. Used the ALIGN_DOWN() macro where 32 bit alignment is required instead using the 0xffc mask. Added CFG_ADDR_CFG_TYPE_1 macro to pci/controller/pcie-iproc.c to denote that this is a configuration type 1 address and access type. Refactored boundary check in pci/controller/vmd.c as used by the vmd_cfg_addr() function following addition of the PCIE_ECAM_OFFSET() macro. Changed the "bus->number" to simply pass the "bus" argument in the PCIE_ECAM_OFFSET() macro. Changed in v4: Removed constants related to "CAM". Added more platforms and devices that can use new ECAM macros and constants. Removed unused ".bus_shift" initialisers from pci-xgene.c as xgene_pcie_map_bus() did not use these. Changes in v3: Updated commit message wording. Updated regarding custom ECAM bus shift values and concerning PCI base configuration space access for Type 1 access. Refactored rockchip_pcie_rd_other_conf() and rockchip_pcie_wr_other_conf() and removed the "busdev" variable. Removed surplus "relbus" variable from nwl_pcie_map_bus() and xilinx_pcie_map_bus(). Renamed the PCIE_ECAM_ADDR() macro to PCIE_ECAM_OFFSET(). Changes in v2: Use PCIE_ECAM_ADDR macro when computing ECAM address offset, but drop PCI_SLOT and PCI_FUNC macros from the PCIE_ECAM_ADDR macro in favour of using a single value for the device/function. arch/powerpc/platforms/4xx/pci.c | 30 ++++++++++---------- drivers/pci/controller/dwc/pcie-al.c | 13 ++------- drivers/pci/controller/dwc/pcie-hisi.c | 4 +-- drivers/pci/controller/pci-aardvark.c | 13 ++------- drivers/pci/controller/pci-host-generic.c | 2 +- drivers/pci/controller/pci-thunder-ecam.c | 2 +- drivers/pci/controller/pci-thunder-pem.c | 13 +++++++-- drivers/pci/controller/pci-xgene.c | 2 -- drivers/pci/controller/pcie-brcmstb.c | 16 ++--------- drivers/pci/controller/pcie-iproc.c | 31 ++++++--------------- drivers/pci/controller/pcie-rockchip-host.c | 27 +++++++++--------- drivers/pci/controller/pcie-rockchip.h | 8 +----- drivers/pci/controller/pcie-tango.c | 2 +- drivers/pci/controller/pcie-xilinx-nwl.c | 9 ++---- drivers/pci/controller/pcie-xilinx.c | 11 ++------ drivers/pci/controller/vmd.c | 19 ++++++------- drivers/pci/ecam.c | 4 +-- include/linux/pci-ecam.h | 23 +++++++++++++++ 18 files changed, 99 insertions(+), 130 deletions(-) diff --git a/arch/powerpc/platforms/4xx/pci.c b/arch/powerpc/platforms/4xx/pci.c index c13d64c3b019..4f3c529ef3b9 100644 --- a/arch/powerpc/platforms/4xx/pci.c +++ b/arch/powerpc/platforms/4xx/pci.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -1583,9 +1584,10 @@ static int ppc4xx_pciex_validate_bdf(struct ppc4xx_pciex_port *port, static void __iomem *ppc4xx_pciex_get_config_base(struct ppc4xx_pciex_port *port, struct pci_bus *bus, - unsigned int devfn) + unsigned int devfn, + int offset) { - int relbus; + unsigned int busnr_ecam = bus->number - (port->hose->first_busno + 1); /* Remove the casts when we finally remove the stupid volatile * in struct pci_controller @@ -1593,9 +1595,7 @@ static void __iomem *ppc4xx_pciex_get_config_base(struct ppc4xx_pciex_port *port if (bus->number == port->hose->first_busno) return (void __iomem *)port->hose->cfg_addr; - relbus = bus->number - (port->hose->first_busno + 1); - return (void __iomem *)port->hose->cfg_data + - ((relbus << 20) | (devfn << 12)); + return port->hose->cfg_data + PCIE_ECAM_OFFSET(busnr_ecam, devfn, offset); } static int ppc4xx_pciex_read_config(struct pci_bus *bus, unsigned int devfn, @@ -1612,7 +1612,7 @@ static int ppc4xx_pciex_read_config(struct pci_bus *bus, unsigned int devfn, if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0) return PCIBIOS_DEVICE_NOT_FOUND; - addr = ppc4xx_pciex_get_config_base(port, bus, devfn); + addr = ppc4xx_pciex_get_config_base(port, bus, devfn, offset); /* * Reading from configuration space of non-existing device can @@ -1627,20 +1627,20 @@ static int ppc4xx_pciex_read_config(struct pci_bus *bus, unsigned int devfn, switch (len) { case 1: - *val = in_8((u8 *)(addr + offset)); + *val = in_8((u8 *)addr); break; case 2: - *val = in_le16((u16 *)(addr + offset)); + *val = in_le16((u16 *)addr); break; default: - *val = in_le32((u32 *)(addr + offset)); + *val = in_le32((u32 *)addr); break; } pr_debug("pcie-config-read: bus=%3d [%3d..%3d] devfn=0x%04x" " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n", bus->number, hose->first_busno, hose->last_busno, - devfn, offset, len, addr + offset, *val); + devfn, offset, len, addr, *val); /* Check for CRS (440SPe rev B does that for us but heh ..) */ if (in_be32(port->utl_base + PEUTL_RCSTA) & 0x00040000) { @@ -1667,7 +1667,7 @@ static int ppc4xx_pciex_write_config(struct pci_bus *bus, unsigned int devfn, if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0) return PCIBIOS_DEVICE_NOT_FOUND; - addr = ppc4xx_pciex_get_config_base(port, bus, devfn); + addr = ppc4xx_pciex_get_config_base(port, bus, devfn, offset); /* * Reading from configuration space of non-existing device can @@ -1680,17 +1680,17 @@ static int ppc4xx_pciex_write_config(struct pci_bus *bus, unsigned int devfn, pr_debug("pcie-config-write: bus=%3d [%3d..%3d] devfn=0x%04x" " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n", bus->number, hose->first_busno, hose->last_busno, - devfn, offset, len, addr + offset, val); + devfn, offset, len, addr, val); switch (len) { case 1: - out_8((u8 *)(addr + offset), val); + out_8((u8 *)addr, val); break; case 2: - out_le16((u16 *)(addr + offset), val); + out_le16((u16 *)addr, val); break; default: - out_le32((u32 *)(addr + offset), val); + out_le32((u32 *)addr, val); break; } diff --git a/drivers/pci/controller/dwc/pcie-al.c b/drivers/pci/controller/dwc/pcie-al.c index f973fbca90cf..979d93b82df2 100644 --- a/drivers/pci/controller/dwc/pcie-al.c +++ b/drivers/pci/controller/dwc/pcie-al.c @@ -76,7 +76,7 @@ static int al_pcie_init(struct pci_config_window *cfg) } const struct pci_ecam_ops al_pcie_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .init = al_pcie_init, .pci_ops = { .map_bus = al_pcie_map_bus, @@ -138,8 +138,6 @@ struct al_pcie { struct al_pcie_target_bus_cfg target_bus_cfg; }; -#define PCIE_ECAM_DEVFN(x) (((x) & 0xff) << 12) - #define to_al_pcie(x) dev_get_drvdata((x)->dev) static inline u32 al_pcie_controller_readl(struct al_pcie *pcie, u32 offset) @@ -226,11 +224,6 @@ static void __iomem *al_pcie_conf_addr_map_bus(struct pci_bus *bus, struct al_pcie_target_bus_cfg *target_bus_cfg = &pcie->target_bus_cfg; unsigned int busnr_ecam = busnr & target_bus_cfg->ecam_mask; unsigned int busnr_reg = busnr & target_bus_cfg->reg_mask; - void __iomem *pci_base_addr; - - pci_base_addr = (void __iomem *)((uintptr_t)pp->va_cfg0_base + - (busnr_ecam << 20) + - PCIE_ECAM_DEVFN(devfn)); if (busnr_reg != target_bus_cfg->reg_val) { dev_dbg(pcie->pci->dev, "Changing target bus busnum val from 0x%x to 0x%x\n", @@ -241,7 +234,7 @@ static void __iomem *al_pcie_conf_addr_map_bus(struct pci_bus *bus, target_bus_cfg->reg_mask); } - return pci_base_addr + where; + return pp->va_cfg0_base + PCIE_ECAM_OFFSET(busnr_ecam, devfn, where); } static struct pci_ops al_child_pci_ops = { @@ -264,7 +257,7 @@ static void al_pcie_config_prepare(struct al_pcie *pcie) target_bus_cfg = &pcie->target_bus_cfg; - ecam_bus_mask = (pcie->ecam_size >> 20) - 1; + ecam_bus_mask = (pcie->ecam_size >> PCIE_ECAM_BUS_SHIFT) - 1; if (ecam_bus_mask > 255) { dev_warn(pcie->dev, "ECAM window size is larger than 256MB. Cutting off at 256\n"); ecam_bus_mask = 255; diff --git a/drivers/pci/controller/dwc/pcie-hisi.c b/drivers/pci/controller/dwc/pcie-hisi.c index 5ca86796d43a..b7afbf1d4bd9 100644 --- a/drivers/pci/controller/dwc/pcie-hisi.c +++ b/drivers/pci/controller/dwc/pcie-hisi.c @@ -100,7 +100,7 @@ static int hisi_pcie_init(struct pci_config_window *cfg) } const struct pci_ecam_ops hisi_pcie_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .init = hisi_pcie_init, .pci_ops = { .map_bus = hisi_pcie_map_bus, @@ -135,7 +135,7 @@ static int hisi_pcie_platform_init(struct pci_config_window *cfg) } static const struct pci_ecam_ops hisi_pcie_platform_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .init = hisi_pcie_platform_init, .pci_ops = { .map_bus = hisi_pcie_map_bus, diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c index 0be485a25327..1043e54c73bd 100644 --- a/drivers/pci/controller/pci-aardvark.c +++ b/drivers/pci/controller/pci-aardvark.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -164,14 +165,6 @@ #define PCIE_CONFIG_WR_TYPE0 0xa #define PCIE_CONFIG_WR_TYPE1 0xb -#define PCIE_CONF_BUS(bus) (((bus) & 0xff) << 20) -#define PCIE_CONF_DEV(dev) (((dev) & 0x1f) << 15) -#define PCIE_CONF_FUNC(fun) (((fun) & 0x7) << 12) -#define PCIE_CONF_REG(reg) ((reg) & 0xffc) -#define PCIE_CONF_ADDR(bus, devfn, where) \ - (PCIE_CONF_BUS(bus) | PCIE_CONF_DEV(PCI_SLOT(devfn)) | \ - PCIE_CONF_FUNC(PCI_FUNC(devfn)) | PCIE_CONF_REG(where)) - #define PIO_RETRY_CNT 500 #define PIO_RETRY_DELAY 2 /* 2 us*/ @@ -687,7 +680,7 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn, advk_writel(pcie, reg, PIO_CTRL); /* Program the address registers */ - reg = PCIE_CONF_ADDR(bus->number, devfn, where); + reg = ALIGN_DOWN(PCIE_ECAM_OFFSET(bus->number, devfn, where), 4); advk_writel(pcie, reg, PIO_ADDR_LS); advk_writel(pcie, 0, PIO_ADDR_MS); @@ -748,7 +741,7 @@ static int advk_pcie_wr_conf(struct pci_bus *bus, u32 devfn, advk_writel(pcie, reg, PIO_CTRL); /* Program the address registers */ - reg = PCIE_CONF_ADDR(bus->number, devfn, where); + reg = ALIGN_DOWN(PCIE_ECAM_OFFSET(bus->number, devfn, where), 4); advk_writel(pcie, reg, PIO_ADDR_LS); advk_writel(pcie, 0, PIO_ADDR_MS); diff --git a/drivers/pci/controller/pci-host-generic.c b/drivers/pci/controller/pci-host-generic.c index b51977abfdf1..c1c69b11615f 100644 --- a/drivers/pci/controller/pci-host-generic.c +++ b/drivers/pci/controller/pci-host-generic.c @@ -49,7 +49,7 @@ static void __iomem *pci_dw_ecam_map_bus(struct pci_bus *bus, } static const struct pci_ecam_ops pci_dw_ecam_bus_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_dw_ecam_map_bus, .read = pci_generic_config_read, diff --git a/drivers/pci/controller/pci-thunder-ecam.c b/drivers/pci/controller/pci-thunder-ecam.c index 7e8835fee5f7..22ed7e995b39 100644 --- a/drivers/pci/controller/pci-thunder-ecam.c +++ b/drivers/pci/controller/pci-thunder-ecam.c @@ -346,7 +346,7 @@ static int thunder_ecam_config_write(struct pci_bus *bus, unsigned int devfn, } const struct pci_ecam_ops pci_thunder_ecam_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_ecam_map_bus, .read = thunder_ecam_config_read, diff --git a/drivers/pci/controller/pci-thunder-pem.c b/drivers/pci/controller/pci-thunder-pem.c index 3f847969143e..1a3f70ac61fc 100644 --- a/drivers/pci/controller/pci-thunder-pem.c +++ b/drivers/pci/controller/pci-thunder-pem.c @@ -19,6 +19,15 @@ #define PEM_CFG_WR 0x28 #define PEM_CFG_RD 0x30 +/* + * Enhanced Configuration Access Mechanism (ECAM) + * + * N.B. This is a non-standard platform-specific ECAM bus shift value. For + * standard values defined in the PCI Express Base Specification see + * include/linux/pci-ecam.h. + */ +#define THUNDER_PCIE_ECAM_BUS_SHIFT 24 + struct thunder_pem_pci { u32 ea_entry[3]; void __iomem *pem_reg_base; @@ -404,7 +413,7 @@ static int thunder_pem_acpi_init(struct pci_config_window *cfg) } const struct pci_ecam_ops thunder_pem_ecam_ops = { - .bus_shift = 24, + .bus_shift = THUNDER_PCIE_ECAM_BUS_SHIFT, .init = thunder_pem_acpi_init, .pci_ops = { .map_bus = pci_ecam_map_bus, @@ -441,7 +450,7 @@ static int thunder_pem_platform_init(struct pci_config_window *cfg) } static const struct pci_ecam_ops pci_thunder_pem_ops = { - .bus_shift = 24, + .bus_shift = THUNDER_PCIE_ECAM_BUS_SHIFT, .init = thunder_pem_platform_init, .pci_ops = { .map_bus = pci_ecam_map_bus, diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c index 8e0db84f089d..85e7c98265e8 100644 --- a/drivers/pci/controller/pci-xgene.c +++ b/drivers/pci/controller/pci-xgene.c @@ -257,7 +257,6 @@ static int xgene_v1_pcie_ecam_init(struct pci_config_window *cfg) } const struct pci_ecam_ops xgene_v1_pcie_ecam_ops = { - .bus_shift = 16, .init = xgene_v1_pcie_ecam_init, .pci_ops = { .map_bus = xgene_pcie_map_bus, @@ -272,7 +271,6 @@ static int xgene_v2_pcie_ecam_init(struct pci_config_window *cfg) } const struct pci_ecam_ops xgene_v2_pcie_ecam_ops = { - .bus_shift = 16, .init = xgene_v2_pcie_ecam_init, .pci_ops = { .map_bus = xgene_pcie_map_bus, diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c index bea86899bd5d..7fc80fd6f13f 100644 --- a/drivers/pci/controller/pcie-brcmstb.c +++ b/drivers/pci/controller/pcie-brcmstb.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -127,11 +128,7 @@ #define MSI_INT_MASK_CLR 0x14 #define PCIE_EXT_CFG_DATA 0x8000 - #define PCIE_EXT_CFG_INDEX 0x9000 -#define PCIE_EXT_BUSNUM_SHIFT 20 -#define PCIE_EXT_SLOT_SHIFT 15 -#define PCIE_EXT_FUNC_SHIFT 12 #define PCIE_RGR1_SW_INIT_1_PERST_MASK 0x1 #define PCIE_RGR1_SW_INIT_1_PERST_SHIFT 0x0 @@ -695,15 +692,6 @@ static bool brcm_pcie_link_up(struct brcm_pcie *pcie) return dla && plu; } -/* Configuration space read/write support */ -static inline int brcm_pcie_cfg_index(int busnr, int devfn, int reg) -{ - return ((PCI_SLOT(devfn) & 0x1f) << PCIE_EXT_SLOT_SHIFT) - | ((PCI_FUNC(devfn) & 0x07) << PCIE_EXT_FUNC_SHIFT) - | (busnr << PCIE_EXT_BUSNUM_SHIFT) - | (reg & ~3); -} - static void __iomem *brcm_pcie_map_conf(struct pci_bus *bus, unsigned int devfn, int where) { @@ -716,7 +704,7 @@ static void __iomem *brcm_pcie_map_conf(struct pci_bus *bus, unsigned int devfn, return PCI_SLOT(devfn) ? NULL : base + where; /* For devices, write to the config space index register */ - idx = brcm_pcie_cfg_index(bus->number, devfn, 0); + idx = PCIE_ECAM_OFFSET(bus->number, devfn, 0); writel(idx, pcie->base + PCIE_EXT_CFG_INDEX); return base + PCIE_EXT_CFG_DATA + where; } diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c index 905e93808243..503662380ff8 100644 --- a/drivers/pci/controller/pcie-iproc.c +++ b/drivers/pci/controller/pcie-iproc.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -39,16 +40,8 @@ #define CFG_IND_ADDR_MASK 0x00001ffc -#define CFG_ADDR_BUS_NUM_SHIFT 20 -#define CFG_ADDR_BUS_NUM_MASK 0x0ff00000 -#define CFG_ADDR_DEV_NUM_SHIFT 15 -#define CFG_ADDR_DEV_NUM_MASK 0x000f8000 -#define CFG_ADDR_FUNC_NUM_SHIFT 12 -#define CFG_ADDR_FUNC_NUM_MASK 0x00007000 -#define CFG_ADDR_REG_NUM_SHIFT 2 #define CFG_ADDR_REG_NUM_MASK 0x00000ffc -#define CFG_ADDR_CFG_TYPE_SHIFT 0 -#define CFG_ADDR_CFG_TYPE_MASK 0x00000003 +#define CFG_ADDR_CFG_TYPE_1 1 #define SYS_RC_INTX_MASK 0xf @@ -459,19 +452,15 @@ static inline void iproc_pcie_apb_err_disable(struct pci_bus *bus, static void __iomem *iproc_pcie_map_ep_cfg_reg(struct iproc_pcie *pcie, unsigned int busno, - unsigned int slot, - unsigned int fn, + unsigned int devfn, int where) { u16 offset; u32 val; /* EP device access */ - val = (busno << CFG_ADDR_BUS_NUM_SHIFT) | - (slot << CFG_ADDR_DEV_NUM_SHIFT) | - (fn << CFG_ADDR_FUNC_NUM_SHIFT) | - (where & CFG_ADDR_REG_NUM_MASK) | - (1 & CFG_ADDR_CFG_TYPE_MASK); + val = ALIGN_DOWN(PCIE_ECAM_OFFSET(busno, devfn, where), 4) | + CFG_ADDR_CFG_TYPE_1; iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_ADDR, val); offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_DATA); @@ -574,8 +563,6 @@ static int iproc_pcie_config_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val) { struct iproc_pcie *pcie = iproc_data(bus); - unsigned int slot = PCI_SLOT(devfn); - unsigned int fn = PCI_FUNC(devfn); unsigned int busno = bus->number; void __iomem *cfg_data_p; unsigned int data; @@ -590,7 +577,7 @@ static int iproc_pcie_config_read(struct pci_bus *bus, unsigned int devfn, return ret; } - cfg_data_p = iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where); + cfg_data_p = iproc_pcie_map_ep_cfg_reg(pcie, busno, devfn, where); if (!cfg_data_p) return PCIBIOS_DEVICE_NOT_FOUND; @@ -631,13 +618,11 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie, int busno, unsigned int devfn, int where) { - unsigned slot = PCI_SLOT(devfn); - unsigned fn = PCI_FUNC(devfn); u16 offset; /* root complex access */ if (busno == 0) { - if (slot > 0 || fn > 0) + if (PCIE_ECAM_DEVFN(devfn) > 0) return NULL; iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR, @@ -649,7 +634,7 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie, return (pcie->base + offset); } - return iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where); + return iproc_pcie_map_ep_cfg_reg(pcie, busno, devfn, where); } static void __iomem *iproc_pcie_bus_map_cfg_bus(struct pci_bus *bus, diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c index 9705059523a6..f1d08a1b1591 100644 --- a/drivers/pci/controller/pcie-rockchip-host.c +++ b/drivers/pci/controller/pcie-rockchip-host.c @@ -157,12 +157,11 @@ static int rockchip_pcie_rd_other_conf(struct rockchip_pcie *rockchip, struct pci_bus *bus, u32 devfn, int where, int size, u32 *val) { - u32 busdev; + void __iomem *addr; - busdev = PCIE_ECAM_ADDR(bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where); + addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); - if (!IS_ALIGNED(busdev, size)) { + if (!IS_ALIGNED((uintptr_t)addr, size)) { *val = 0; return PCIBIOS_BAD_REGISTER_NUMBER; } @@ -175,11 +174,11 @@ static int rockchip_pcie_rd_other_conf(struct rockchip_pcie *rockchip, AXI_WRAPPER_TYPE1_CFG); if (size == 4) { - *val = readl(rockchip->reg_base + busdev); + *val = readl(addr); } else if (size == 2) { - *val = readw(rockchip->reg_base + busdev); + *val = readw(addr); } else if (size == 1) { - *val = readb(rockchip->reg_base + busdev); + *val = readb(addr); } else { *val = 0; return PCIBIOS_BAD_REGISTER_NUMBER; @@ -191,11 +190,11 @@ static int rockchip_pcie_wr_other_conf(struct rockchip_pcie *rockchip, struct pci_bus *bus, u32 devfn, int where, int size, u32 val) { - u32 busdev; + void __iomem *addr; - busdev = PCIE_ECAM_ADDR(bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where); - if (!IS_ALIGNED(busdev, size)) + addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); + + if (!IS_ALIGNED((uintptr_t)addr, size)) return PCIBIOS_BAD_REGISTER_NUMBER; if (pci_is_root_bus(bus->parent)) @@ -206,11 +205,11 @@ static int rockchip_pcie_wr_other_conf(struct rockchip_pcie *rockchip, AXI_WRAPPER_TYPE1_CFG); if (size == 4) - writel(val, rockchip->reg_base + busdev); + writel(val, addr); else if (size == 2) - writew(val, rockchip->reg_base + busdev); + writew(val, addr); else if (size == 1) - writeb(val, rockchip->reg_base + busdev); + writeb(val, addr); else return PCIBIOS_BAD_REGISTER_NUMBER; diff --git a/drivers/pci/controller/pcie-rockchip.h b/drivers/pci/controller/pcie-rockchip.h index c7d0178fc8c2..1650a5087450 100644 --- a/drivers/pci/controller/pcie-rockchip.h +++ b/drivers/pci/controller/pcie-rockchip.h @@ -13,6 +13,7 @@ #include #include +#include /* * The upper 16 bits of PCIE_CLIENT_CONFIG are a write mask for the lower 16 @@ -178,13 +179,6 @@ #define MIN_AXI_ADDR_BITS_PASSED 8 #define PCIE_RC_SEND_PME_OFF 0x11960 #define ROCKCHIP_VENDOR_ID 0x1d87 -#define PCIE_ECAM_BUS(x) (((x) & 0xff) << 20) -#define PCIE_ECAM_DEV(x) (((x) & 0x1f) << 15) -#define PCIE_ECAM_FUNC(x) (((x) & 0x7) << 12) -#define PCIE_ECAM_REG(x) (((x) & 0xfff) << 0) -#define PCIE_ECAM_ADDR(bus, dev, func, reg) \ - (PCIE_ECAM_BUS(bus) | PCIE_ECAM_DEV(dev) | \ - PCIE_ECAM_FUNC(func) | PCIE_ECAM_REG(reg)) #define PCIE_LINK_IS_L2(x) \ (((x) & PCIE_CLIENT_DEBUG_LTSSM_MASK) == PCIE_CLIENT_DEBUG_LTSSM_L2) #define PCIE_LINK_UP(x) \ diff --git a/drivers/pci/controller/pcie-tango.c b/drivers/pci/controller/pcie-tango.c index d093a8ce4bb1..8f0d695afbde 100644 --- a/drivers/pci/controller/pcie-tango.c +++ b/drivers/pci/controller/pcie-tango.c @@ -208,7 +208,7 @@ static int smp8759_config_write(struct pci_bus *bus, unsigned int devfn, } static const struct pci_ecam_ops smp8759_ecam_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_ecam_map_bus, .read = smp8759_config_read, diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c index f3cf7d61924f..7f29c2fdcd51 100644 --- a/drivers/pci/controller/pcie-xilinx-nwl.c +++ b/drivers/pci/controller/pcie-xilinx-nwl.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -124,8 +125,6 @@ #define E_ECAM_CR_ENABLE BIT(0) #define E_ECAM_SIZE_LOC GENMASK(20, 16) #define E_ECAM_SIZE_SHIFT 16 -#define ECAM_BUS_LOC_SHIFT 20 -#define ECAM_DEV_LOC_SHIFT 12 #define NWL_ECAM_VALUE_DEFAULT 12 #define CFG_DMA_REG_BAR GENMASK(2, 0) @@ -240,15 +239,11 @@ static void __iomem *nwl_pcie_map_bus(struct pci_bus *bus, unsigned int devfn, int where) { struct nwl_pcie *pcie = bus->sysdata; - int relbus; if (!nwl_pcie_valid_device(bus, devfn)) return NULL; - relbus = (bus->number << ECAM_BUS_LOC_SHIFT) | - (devfn << ECAM_DEV_LOC_SHIFT); - - return pcie->ecam_base + relbus + where; + return pcie->ecam_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); } /* PCIe operations */ diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c index 8523be61bba5..fa5baeb82653 100644 --- a/drivers/pci/controller/pcie-xilinx.c +++ b/drivers/pci/controller/pcie-xilinx.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include "../pci.h" @@ -86,10 +87,6 @@ /* Phy Status/Control Register definitions */ #define XILINX_PCIE_REG_PSCR_LNKUP BIT(11) -/* ECAM definitions */ -#define ECAM_BUS_NUM_SHIFT 20 -#define ECAM_DEV_NUM_SHIFT 12 - /* Number of MSI IRQs */ #define XILINX_NUM_MSI_IRQS 128 @@ -183,15 +180,11 @@ static void __iomem *xilinx_pcie_map_bus(struct pci_bus *bus, unsigned int devfn, int where) { struct xilinx_pcie_port *port = bus->sysdata; - int relbus; if (!xilinx_pcie_valid_device(bus, devfn)) return NULL; - relbus = (bus->number << ECAM_BUS_NUM_SHIFT) | - (devfn << ECAM_DEV_NUM_SHIFT); - - return port->reg_base + relbus + where; + return port->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); } /* PCIe operations */ diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index f375c21ceeb1..59fa9a94860f 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -94,7 +95,7 @@ struct vmd_dev { struct pci_dev *dev; spinlock_t cfg_lock; - char __iomem *cfgbar; + void __iomem *cfgbar; int msix_count; struct vmd_irq_list *irqs; @@ -325,18 +326,16 @@ static void vmd_remove_irq_domain(struct vmd_dev *vmd) } } -static char __iomem *vmd_cfg_addr(struct vmd_dev *vmd, struct pci_bus *bus, +static void __iomem *vmd_cfg_addr(struct vmd_dev *vmd, struct pci_bus *bus, unsigned int devfn, int reg, int len) { - char __iomem *addr = vmd->cfgbar + - ((bus->number - vmd->busn_start) << 20) + - (devfn << 12) + reg; + unsigned int busnr_ecam = bus->number - vmd->busn_start; + u32 offset = PCIE_ECAM_OFFSET(busnr_ecam, devfn, reg); - if ((addr - vmd->cfgbar) + len >= - resource_size(&vmd->dev->resource[VMD_CFGBAR])) + if (offset + len >= resource_size(&vmd->dev->resource[VMD_CFGBAR])) return NULL; - return addr; + return vmd->cfgbar + offset; } /* @@ -347,7 +346,7 @@ static int vmd_pci_read(struct pci_bus *bus, unsigned int devfn, int reg, int len, u32 *value) { struct vmd_dev *vmd = vmd_from_bus(bus); - char __iomem *addr = vmd_cfg_addr(vmd, bus, devfn, reg, len); + void __iomem *addr = vmd_cfg_addr(vmd, bus, devfn, reg, len); unsigned long flags; int ret = 0; @@ -382,7 +381,7 @@ static int vmd_pci_write(struct pci_bus *bus, unsigned int devfn, int reg, int len, u32 value) { struct vmd_dev *vmd = vmd_from_bus(bus); - char __iomem *addr = vmd_cfg_addr(vmd, bus, devfn, reg, len); + void __iomem *addr = vmd_cfg_addr(vmd, bus, devfn, reg, len); unsigned long flags; int ret = 0; diff --git a/drivers/pci/ecam.c b/drivers/pci/ecam.c index b54d32a31669..1e0229765349 100644 --- a/drivers/pci/ecam.c +++ b/drivers/pci/ecam.c @@ -149,7 +149,7 @@ EXPORT_SYMBOL_GPL(pci_ecam_map_bus); /* ECAM ops */ const struct pci_ecam_ops pci_generic_ecam_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_ecam_map_bus, .read = pci_generic_config_read, @@ -161,7 +161,7 @@ EXPORT_SYMBOL_GPL(pci_generic_ecam_ops); #if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS) /* ECAM ops for 32-bit access only (non-compliant) */ const struct pci_ecam_ops pci_32b_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_ecam_map_bus, .read = pci_generic_config_read32, diff --git a/include/linux/pci-ecam.h b/include/linux/pci-ecam.h index 033ce74f02e8..9767922461ca 100644 --- a/include/linux/pci-ecam.h +++ b/include/linux/pci-ecam.h @@ -9,6 +9,29 @@ #include #include +/* + * Memory address shift values for the byte-level address that + * can be used when accessing the PCI Express Configuration Space. + */ + +/* + * Enhanced Configuration Access Mechanism (ECAM) + * + * See PCI Express Base Specification, Revision 5.0, Version 1.0, + * Section 7.2.2, Table 7-1, p. 677. + */ +#define PCIE_ECAM_BUS_SHIFT 20 /* Bus Number */ +#define PCIE_ECAM_DEVFN_SHIFT 12 /* Device and Function Number */ + +#define PCIE_ECAM_BUS(x) (((x) & 0xff) << PCIE_ECAM_BUS_SHIFT) +#define PCIE_ECAM_DEVFN(x) (((x) & 0xff) << PCIE_ECAM_DEVFN_SHIFT) +#define PCIE_ECAM_REG(x) ((x) & 0xfff) + +#define PCIE_ECAM_OFFSET(bus, devfn, where) \ + (PCIE_ECAM_BUS(bus) | \ + PCIE_ECAM_DEVFN(devfn) | \ + PCIE_ECAM_REG(where)) + /* * struct to hold pci ops and bus shift of the config window * for a PCI controller. -- 2.29.2 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=-16.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6B4BFC2D0E4 for ; Fri, 27 Nov 2020 10:47:05 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 8A6F5204EA for ; Fri, 27 Nov 2020 10:47:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="wLARQvPt" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8A6F5204EA Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=linux.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=f94iCfEb5f6Nq57c63CPHiRj6DCOSoEq/zpzgglIm9c=; b=wLARQvPtT64EUnr7NVCeQSoPRm TrVrKg29LojYAA7+XB71LUSQSNmsRhuTQ/J08ryhwe7WGLpX4E6q5d9FNQcI8kgQu+7vFVo88D317 5ktSNwEYxtvgphNx2TpDFWeOuWDZSGO1giny7Sk4oLH5AQu1k79N0Q814sdY2V2d4wwNbZyL/MDuz TxuCzinplt6tfUbn+D8HqY/3rUXMZFcVaom7FWS+DUEklSR1Q+6Lmd5nPPQ9LkUBC854cSA7JziVy O1q4qJ2UmT8ELkGAeJOcO8fCfD1zB/KG2e3icTXLl50BR77TTzBlCd9vbyC02KYs4z1hTMtsGVT+q Snt5iiLg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kibHD-0002n8-8z; Fri, 27 Nov 2020 10:46:55 +0000 Received: from mail-pl1-f195.google.com ([209.85.214.195]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kibH7-0002m0-U3; Fri, 27 Nov 2020 10:46:52 +0000 Received: by mail-pl1-f195.google.com with SMTP id l1so2518748pld.5; Fri, 27 Nov 2020 02:46:45 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=/ofhNQSHG3WAD/AojJeiQwmlt67hb9Caduex5mipx9k=; b=qNZFEVsFjdtHjhTVivYA3xCW4KPzWEjAmgy2Iub4l3un+N8K6vO/1vhx57De2TM++D bfLRz0HeRygTks/OuWxUOrdEzQQdR5oY/XGUsXatlVBLGmim9bkbZCB+JETucHe0LeQ2 NdCeONaDX4mKMaauEYYLMPaDAnUT4REjUisP/opPzpfOzCZFLlJDmHh8iKUAaQiur2V1 pfS2nk3mec+2xSldPsGnRL1inW7jCL3hFqPNh4v2NC3pohL7zlZWNRCrt1eFo45mEMqh yieqIKuQJ7NxD1G0uOd7D579g1r1Q6XuDCTAcPzDOCyKTFCz3RrFKBm8/7B6YSZAoRf1 v6Yg== X-Gm-Message-State: AOAM5308zalECwOZciNQM5/Mt2IqR7EQqwLN+z7LRF+ppZIg/xC5dC45 FLmlHVThyt+UUC7Hv8e3CAQ= X-Google-Smtp-Source: ABdhPJxHqGQQEytKXoVDsUeGv6IYcQ2xpnElpAMxdcC+3X4fRm/f7wqyqiJBwbLDhUDt3fZBfILO6w== X-Received: by 2002:a17:902:820e:b029:d6:e802:75aa with SMTP id x14-20020a170902820eb02900d6e80275aamr6214785pln.51.1606474004147; Fri, 27 Nov 2020 02:46:44 -0800 (PST) Received: from workstation.lan ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id v22sm7161494pff.48.2020.11.27.02.46.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Nov 2020 02:46:43 -0800 (PST) From: =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= To: Bjorn Helgaas Subject: [PATCH v5] PCI: Unify ECAM constants in native PCI Express drivers Date: Fri, 27 Nov 2020 10:46:26 +0000 Message-Id: <20201127104626.3979165-1-kw@linux.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201127_054650_030947_66E972F9 X-CRM114-Status: GOOD ( 26.80 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Heiko Stuebner , Benjamin Herrenschmidt , Shawn Lin , Paul Mackerras , Thomas Petazzoni , Jonathan Chocron , Toan Le , Will Deacon , Rob Herring , Lorenzo Pieralisi , Michael Ellerman , Michal Simek , linux-rockchip@lists.infradead.org, bcm-kernel-feedback-list@broadcom.com, Jonathan Derrick , linux-pci@vger.kernel.org, Ray Jui , Florian Fainelli , linux-rpi-kernel@lists.infradead.org, Jonathan Cameron , linux-arm-kernel@lists.infradead.org, Scott Branden , Zhou Wang , Robert Richter , linuxppc-dev@lists.ozlabs.org, Nicolas Saenz Julienne Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org VW5pZnkgRUNBTS1yZWxhdGVkIGNvbnN0YW50cyBpbnRvIGEgc2luZ2xlIHNldCBvZiBzdGFuZGFy ZCBjb25zdGFudHMKZGVmaW5pbmcgbWVtb3J5IGFkZHJlc3Mgc2hpZnQgdmFsdWVzIGZvciB0aGUg Ynl0ZS1sZXZlbCBhZGRyZXNzIHRoYXQgY2FuCmJlIHVzZWQgd2hlbiBhY2Nlc3NpbmcgdGhlIFBD SSBFeHByZXNzIENvbmZpZ3VyYXRpb24gU3BhY2UsIGFuZCB0aGVuCm1vdmUgbmF0aXZlIFBDSSBF eHByZXNzIGNvbnRyb2xsZXIgZHJpdmVycyB0byB1c2UgbmV3bHkgaW50cm9kdWNlZApkZWZpbml0 aW9ucyByZXRpcmluZyBhbnkgZHJpdmVyLXNwZWNpZmljIG9uZXMuCgpUaGUgRUNBTSAoIkVuaGFu Y2VkIENvbmZpZ3VyYXRpb24gQWNjZXNzIE1lY2hhbmlzbSIpIGlzIGRlZmluZWQgYnkgdGhlClBD SSBFeHByZXNzIHNwZWNpZmljYXRpb24gKHNlZSBQQ0kgRXhwcmVzcyBCYXNlIFNwZWNpZmljYXRp b24sIFJldmlzaW9uCjUuMCwgVmVyc2lvbiAxLjAsIFNlY3Rpb24gNy4yLjIsIHAuIDY3NiksIHRo dXMgbW9zdCBoYXJkd2FyZSBzaG91bGQKaW1wbGVtZW50IGl0IHRoZSBzYW1lIHdheS4gIE1vc3Qg b2YgdGhlIG5hdGl2ZSBQQ0kgRXhwcmVzcyBjb250cm9sbGVyCmRyaXZlcnMgZGVmaW5lIHRoZWly IEVDQU0tcmVsYXRlZCBjb25zdGFudHMsIG1hbnkgb2YgdGhlc2UgY291bGQgYmUKc2hhcmVkLCBv ciB1c2Ugb3Blbi1jb2RlZCB2YWx1ZXMgd2hlbiBzZXR0aW5nIHRoZSAuYnVzX3NoaWZ0IGZpZWxk IG9mCnRoZSBzdHJ1Y3QgcGNpX2VjYW1fb3BzLgoKQWxsIG9mIHRoZSBuZXdseSBhZGRlZCBjb25z dGFudHMgc2hvdWxkIHJlbW92ZSBhbWJpZ3VpdHkgYW5kIHJlZHVjZSB0aGUKbnVtYmVyIG9mIG9w ZW4tY29kZWQgdmFsdWVzLCBhbmQgYWxzbyBjb3JyZWxhdGUgbW9yZSBzdHJvbmdseSB3aXRoIHRo ZQpkZXNjcmlwdGlvbnMgaW4gdGhlIGFmb3JlbWVudGlvbmVkIHNwZWNpZmljYXRpb24gKHNlZSBU YWJsZSA3LTEKIkVuaGFuY2VkIENvbmZpZ3VyYXRpb24gQWRkcmVzcyBNYXBwaW5nIiwgcC4gNjc3 KS4KClRoZXJlIGlzIG5vIGNoYW5nZSB0byBmdW5jdGlvbmFsaXR5LgoKU3VnZ2VzdGVkLWJ5OiBC am9ybiBIZWxnYWFzIDxiaGVsZ2Fhc0Bnb29nbGUuY29tPgpTaWduZWQtb2ZmLWJ5OiBLcnp5c3p0 b2YgV2lsY3p5xYRza2kgPGt3QGxpbnV4LmNvbT4KLS0tCkNoYW5nZWQgaW4gdjU6CiAgUmVtb3Zl ZCB1bnVzZWQgY29uc3RhbnQgIlBDSUVfRUNBTV9ERVZfU0hJRlQiLgogIFJlZmFjdG9yZWQgcHBj NHh4X3BjaWV4X2dldF9jb25maWdfYmFzZSgpIHNvIHRoYXQgdGhlICJvZmZzZXQiCiAgcGFyYW1l dGVyIGNhbiBiZSBwYXNzZWQgdG8gc28gdGhhdCB0aGUgUENJRV9FQ0FNX09GRlNFVCgpIG1hY3Jv CiAgY2FuIGJlIHVzZWQuCiAgVXNlZCB0aGUgQUxJR05fRE9XTigpIG1hY3JvIHdoZXJlIDMyIGJp dCBhbGlnbm1lbnQgaXMgcmVxdWlyZWQKICBpbnN0ZWFkIHVzaW5nIHRoZSAweGZmYyBtYXNrLgog IEFkZGVkIENGR19BRERSX0NGR19UWVBFXzEgbWFjcm8gdG8gcGNpL2NvbnRyb2xsZXIvcGNpZS1p cHJvYy5jIHRvCiAgZGVub3RlIHRoYXQgdGhpcyBpcyBhIGNvbmZpZ3VyYXRpb24gdHlwZSAxIGFk ZHJlc3MgYW5kIGFjY2VzcyB0eXBlLgogIFJlZmFjdG9yZWQgYm91bmRhcnkgY2hlY2sgaW4gcGNp L2NvbnRyb2xsZXIvdm1kLmMgYXMgdXNlZCBieSB0aGUKICB2bWRfY2ZnX2FkZHIoKSBmdW5jdGlv biBmb2xsb3dpbmcgYWRkaXRpb24gb2YgdGhlIFBDSUVfRUNBTV9PRkZTRVQoKQogIG1hY3JvLgog IENoYW5nZWQgdGhlICJidXMtPm51bWJlciIgdG8gc2ltcGx5IHBhc3MgdGhlICJidXMiIGFyZ3Vt ZW50IGluIHRoZQogIFBDSUVfRUNBTV9PRkZTRVQoKSBtYWNyby4KCkNoYW5nZWQgaW4gdjQ6CiAg UmVtb3ZlZCBjb25zdGFudHMgcmVsYXRlZCB0byAiQ0FNIi4KICBBZGRlZCBtb3JlIHBsYXRmb3Jt cyBhbmQgZGV2aWNlcyB0aGF0IGNhbiB1c2UgbmV3IEVDQU0gbWFjcm9zIGFuZAogIGNvbnN0YW50 cy4KICBSZW1vdmVkIHVudXNlZCAiLmJ1c19zaGlmdCIgaW5pdGlhbGlzZXJzIGZyb20gcGNpLXhn ZW5lLmMgYXMKICB4Z2VuZV9wY2llX21hcF9idXMoKSBkaWQgbm90IHVzZSB0aGVzZS4KCkNoYW5n ZXMgaW4gdjM6CiAgVXBkYXRlZCBjb21taXQgbWVzc2FnZSB3b3JkaW5nLgogIFVwZGF0ZWQgcmVn YXJkaW5nIGN1c3RvbSBFQ0FNIGJ1cyBzaGlmdCB2YWx1ZXMgYW5kIGNvbmNlcm5pbmcgUENJIGJh c2UKICBjb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcyBmb3IgVHlwZSAxIGFjY2Vzcy4KICBSZWZh Y3RvcmVkIHJvY2tjaGlwX3BjaWVfcmRfb3RoZXJfY29uZigpIGFuZCByb2NrY2hpcF9wY2llX3dy X290aGVyX2NvbmYoKQogIGFuZCByZW1vdmVkIHRoZSAiYnVzZGV2IiB2YXJpYWJsZS4KICBSZW1v dmVkIHN1cnBsdXMgInJlbGJ1cyIgdmFyaWFibGUgZnJvbSBud2xfcGNpZV9tYXBfYnVzKCkgYW5k CiAgeGlsaW54X3BjaWVfbWFwX2J1cygpLgogIFJlbmFtZWQgdGhlIFBDSUVfRUNBTV9BRERSKCkg bWFjcm8gdG8gUENJRV9FQ0FNX09GRlNFVCgpLgoKQ2hhbmdlcyBpbiB2MjoKICBVc2UgUENJRV9F Q0FNX0FERFIgbWFjcm8gd2hlbiBjb21wdXRpbmcgRUNBTSBhZGRyZXNzIG9mZnNldCwgYnV0IGRy b3AKICBQQ0lfU0xPVCBhbmQgUENJX0ZVTkMgbWFjcm9zIGZyb20gdGhlIFBDSUVfRUNBTV9BRERS IG1hY3JvIGluIGZhdm91cgogIG9mIHVzaW5nIGEgc2luZ2xlIHZhbHVlIGZvciB0aGUgZGV2aWNl L2Z1bmN0aW9uLgoKIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jICAgICAgICAgICAg fCAzMCArKysrKysrKysrLS0tLS0tLS0tLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNp ZS1hbC5jICAgICAgICB8IDEzICsrLS0tLS0tLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2Mv cGNpZS1oaXNpLmMgICAgICB8ICA0ICstLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFy ZHZhcmsuYyAgICAgICB8IDEzICsrLS0tLS0tLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2kt aG9zdC1nZW5lcmljLmMgICB8ICAyICstCiBkcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS10aHVu ZGVyLWVjYW0uYyAgIHwgIDIgKy0KIGRyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXRodW5kZXIt cGVtLmMgICAgfCAxMyArKysrKysrLS0KIGRyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXhnZW5l LmMgICAgICAgICAgfCAgMiAtLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2llLWJyY21zdGIu YyAgICAgICB8IDE2ICsrLS0tLS0tLS0tCiBkcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtaXBy b2MuYyAgICAgICAgIHwgMzEgKysrKysrLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL3BjaS9jb250 cm9sbGVyL3BjaWUtcm9ja2NoaXAtaG9zdC5jIHwgMjcgKysrKysrKysrLS0tLS0tLS0tCiBkcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtcm9ja2NoaXAuaCAgICAgIHwgIDggKy0tLS0tCiBkcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtdGFuZ28uYyAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMv cGNpL2NvbnRyb2xsZXIvcGNpZS14aWxpbngtbndsLmMgICAgfCAgOSArKy0tLS0KIGRyaXZlcnMv cGNpL2NvbnRyb2xsZXIvcGNpZS14aWxpbnguYyAgICAgICAgfCAxMSArKy0tLS0tLQogZHJpdmVy cy9wY2kvY29udHJvbGxlci92bWQuYyAgICAgICAgICAgICAgICB8IDE5ICsrKysrKy0tLS0tLS0K IGRyaXZlcnMvcGNpL2VjYW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNCArLS0KIGlu Y2x1ZGUvbGludXgvcGNpLWVjYW0uaCAgICAgICAgICAgICAgICAgICAgfCAyMyArKysrKysrKysr KysrKysKIDE4IGZpbGVzIGNoYW5nZWQsIDk5IGluc2VydGlvbnMoKyksIDEzMCBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4eC9wY2kuYyBiL2FyY2gv cG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jCmluZGV4IGMxM2Q2NGMzYjAxOS4uNGYzYzUyOWVm M2I5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4eC9wY2kuYworKysgYi9h cmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4eC9wY2kuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5j bHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8 bGludXgvcGNpLWVjYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGlu dXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTU4Myw5ICsxNTg0LDEwIEBA IHN0YXRpYyBpbnQgcHBjNHh4X3BjaWV4X3ZhbGlkYXRlX2JkZihzdHJ1Y3QgcHBjNHh4X3BjaWV4 X3BvcnQgKnBvcnQsCiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnBwYzR4eF9wY2lleF9nZXRfY29u ZmlnX2Jhc2Uoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0LAogCQkJCQkJICBzdHJ1Y3Qg cGNpX2J1cyAqYnVzLAotCQkJCQkJICB1bnNpZ25lZCBpbnQgZGV2Zm4pCisJCQkJCQkgIHVuc2ln bmVkIGludCBkZXZmbiwKKwkJCQkJCSAgaW50IG9mZnNldCkKIHsKLQlpbnQgcmVsYnVzOworCXVu c2lnbmVkIGludCBidXNucl9lY2FtID0gYnVzLT5udW1iZXIgLSAocG9ydC0+aG9zZS0+Zmlyc3Rf YnVzbm8gKyAxKTsKIAogCS8qIFJlbW92ZSB0aGUgY2FzdHMgd2hlbiB3ZSBmaW5hbGx5IHJlbW92 ZSB0aGUgc3R1cGlkIHZvbGF0aWxlCiAJICogaW4gc3RydWN0IHBjaV9jb250cm9sbGVyCkBAIC0x NTkzLDkgKzE1OTUsNyBAQCBzdGF0aWMgdm9pZCBfX2lvbWVtICpwcGM0eHhfcGNpZXhfZ2V0X2Nv bmZpZ19iYXNlKHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydAogCWlmIChidXMtPm51bWJl ciA9PSBwb3J0LT5ob3NlLT5maXJzdF9idXNubykKIAkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilw b3J0LT5ob3NlLT5jZmdfYWRkcjsKIAotCXJlbGJ1cyA9IGJ1cy0+bnVtYmVyIC0gKHBvcnQtPmhv c2UtPmZpcnN0X2J1c25vICsgMSk7Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKilwb3J0LT5ob3Nl LT5jZmdfZGF0YSArCi0JCSgocmVsYnVzICA8PCAyMCkgfCAoZGV2Zm4gPDwgMTIpKTsKKwlyZXR1 cm4gcG9ydC0+aG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX0VDQU1fT0ZGU0VUKGJ1c25yX2VjYW0sIGRl dmZuLCBvZmZzZXQpOwogfQogCiBzdGF0aWMgaW50IHBwYzR4eF9wY2lleF9yZWFkX2NvbmZpZyhz dHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCkBAIC0xNjEyLDcgKzE2MTIs NyBAQCBzdGF0aWMgaW50IHBwYzR4eF9wY2lleF9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAq YnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCiAJaWYgKHBwYzR4eF9wY2lleF92YWxpZGF0ZV9iZGYo cG9ydCwgYnVzLCBkZXZmbikgIT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VO RDsKIAotCWFkZHIgPSBwcGM0eHhfcGNpZXhfZ2V0X2NvbmZpZ19iYXNlKHBvcnQsIGJ1cywgZGV2 Zm4pOworCWFkZHIgPSBwcGM0eHhfcGNpZXhfZ2V0X2NvbmZpZ19iYXNlKHBvcnQsIGJ1cywgZGV2 Zm4sIG9mZnNldCk7CiAKIAkvKgogCSAqIFJlYWRpbmcgZnJvbSBjb25maWd1cmF0aW9uIHNwYWNl IG9mIG5vbi1leGlzdGluZyBkZXZpY2UgY2FuCkBAIC0xNjI3LDIwICsxNjI3LDIwIEBAIHN0YXRp YyBpbnQgcHBjNHh4X3BjaWV4X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2ln bmVkIGludCBkZXZmbiwKIAogCXN3aXRjaCAobGVuKSB7CiAJY2FzZSAxOgotCQkqdmFsID0gaW5f OCgodTggKikoYWRkciArIG9mZnNldCkpOworCQkqdmFsID0gaW5fOCgodTggKilhZGRyKTsKIAkJ YnJlYWs7CiAJY2FzZSAyOgotCQkqdmFsID0gaW5fbGUxNigodTE2ICopKGFkZHIgKyBvZmZzZXQp KTsKKwkJKnZhbCA9IGluX2xlMTYoKHUxNiAqKWFkZHIpOwogCQlicmVhazsKIAlkZWZhdWx0Ogot CQkqdmFsID0gaW5fbGUzMigodTMyICopKGFkZHIgKyBvZmZzZXQpKTsKKwkJKnZhbCA9IGluX2xl MzIoKHUzMiAqKWFkZHIpOwogCQlicmVhazsKIAl9CiAKIAlwcl9kZWJ1ZygicGNpZS1jb25maWct cmVhZDogYnVzPSUzZCBbJTNkLi4lM2RdIGRldmZuPTB4JTA0eCIKIAkJICIgb2Zmc2V0PTB4JTA0 eCBsZW49JWQsIGFkZHI9MHglcCB2YWw9MHglMDh4XG4iLAogCQkgYnVzLT5udW1iZXIsIGhvc2Ut PmZpcnN0X2J1c25vLCBob3NlLT5sYXN0X2J1c25vLAotCQkgZGV2Zm4sIG9mZnNldCwgbGVuLCBh ZGRyICsgb2Zmc2V0LCAqdmFsKTsKKwkJIGRldmZuLCBvZmZzZXQsIGxlbiwgYWRkciwgKnZhbCk7 CiAKIAkvKiBDaGVjayBmb3IgQ1JTICg0NDBTUGUgcmV2IEIgZG9lcyB0aGF0IGZvciB1cyBidXQg aGVoIC4uKSAqLwogCWlmIChpbl9iZTMyKHBvcnQtPnV0bF9iYXNlICsgUEVVVExfUkNTVEEpICYg MHgwMDA0MDAwMCkgewpAQCAtMTY2Nyw3ICsxNjY3LDcgQEAgc3RhdGljIGludCBwcGM0eHhfcGNp ZXhfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwK IAlpZiAocHBjNHh4X3BjaWV4X3ZhbGlkYXRlX2JkZihwb3J0LCBidXMsIGRldmZuKSAhPSAwKQog CQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0JYWRkciA9IHBwYzR4eF9wY2ll eF9nZXRfY29uZmlnX2Jhc2UocG9ydCwgYnVzLCBkZXZmbik7CisJYWRkciA9IHBwYzR4eF9wY2ll eF9nZXRfY29uZmlnX2Jhc2UocG9ydCwgYnVzLCBkZXZmbiwgb2Zmc2V0KTsKIAogCS8qCiAJICog UmVhZGluZyBmcm9tIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2Ygbm9uLWV4aXN0aW5nIGRldmljZSBj YW4KQEAgLTE2ODAsMTcgKzE2ODAsMTcgQEAgc3RhdGljIGludCBwcGM0eHhfcGNpZXhfd3JpdGVf Y29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKIAlwcl9kZWJ1 ZygicGNpZS1jb25maWctd3JpdGU6IGJ1cz0lM2QgWyUzZC4uJTNkXSBkZXZmbj0weCUwNHgiCiAJ CSAiIG9mZnNldD0weCUwNHggbGVuPSVkLCBhZGRyPTB4JXAgdmFsPTB4JTA4eFxuIiwKIAkJIGJ1 cy0+bnVtYmVyLCBob3NlLT5maXJzdF9idXNubywgaG9zZS0+bGFzdF9idXNubywKLQkJIGRldmZu LCBvZmZzZXQsIGxlbiwgYWRkciArIG9mZnNldCwgdmFsKTsKKwkJIGRldmZuLCBvZmZzZXQsIGxl biwgYWRkciwgdmFsKTsKIAogCXN3aXRjaCAobGVuKSB7CiAJY2FzZSAxOgotCQlvdXRfOCgodTgg KikoYWRkciArIG9mZnNldCksIHZhbCk7CisJCW91dF84KCh1OCAqKWFkZHIsIHZhbCk7CiAJCWJy ZWFrOwogCWNhc2UgMjoKLQkJb3V0X2xlMTYoKHUxNiAqKShhZGRyICsgb2Zmc2V0KSwgdmFsKTsK KwkJb3V0X2xlMTYoKHUxNiAqKWFkZHIsIHZhbCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW91 dF9sZTMyKCh1MzIgKikoYWRkciArIG9mZnNldCksIHZhbCk7CisJCW91dF9sZTMyKCh1MzIgKilh ZGRyLCB2YWwpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRy b2xsZXIvZHdjL3BjaWUtYWwuYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaWUtYWwu YwppbmRleCBmOTczZmJjYTkwY2YuLjk3OWQ5M2I4MmRmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9w Y2kvY29udHJvbGxlci9kd2MvcGNpZS1hbC5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIv ZHdjL3BjaWUtYWwuYwpAQCAtNzYsNyArNzYsNyBAQCBzdGF0aWMgaW50IGFsX3BjaWVfaW5pdChz dHJ1Y3QgcGNpX2NvbmZpZ193aW5kb3cgKmNmZykKIH0KIAogY29uc3Qgc3RydWN0IHBjaV9lY2Ft X29wcyBhbF9wY2llX29wcyA9IHsKLQkuYnVzX3NoaWZ0ICAgID0gMjAsCisJLmJ1c19zaGlmdCAg ICA9IFBDSUVfRUNBTV9CVVNfU0hJRlQsCiAJLmluaXQgICAgICAgICA9ICBhbF9wY2llX2luaXQs CiAJLnBjaV9vcHMgICAgICA9IHsKIAkJLm1hcF9idXMgICAgPSBhbF9wY2llX21hcF9idXMsCkBA IC0xMzgsOCArMTM4LDYgQEAgc3RydWN0IGFsX3BjaWUgewogCXN0cnVjdCBhbF9wY2llX3Rhcmdl dF9idXNfY2ZnIHRhcmdldF9idXNfY2ZnOwogfTsKIAotI2RlZmluZSBQQ0lFX0VDQU1fREVWRk4o eCkJCSgoKHgpICYgMHhmZikgPDwgMTIpCi0KICNkZWZpbmUgdG9fYWxfcGNpZSh4KQkJZGV2X2dl dF9kcnZkYXRhKCh4KS0+ZGV2KQogCiBzdGF0aWMgaW5saW5lIHUzMiBhbF9wY2llX2NvbnRyb2xs ZXJfcmVhZGwoc3RydWN0IGFsX3BjaWUgKnBjaWUsIHUzMiBvZmZzZXQpCkBAIC0yMjYsMTEgKzIy NCw2IEBAIHN0YXRpYyB2b2lkIF9faW9tZW0gKmFsX3BjaWVfY29uZl9hZGRyX21hcF9idXMoc3Ry dWN0IHBjaV9idXMgKmJ1cywKIAlzdHJ1Y3QgYWxfcGNpZV90YXJnZXRfYnVzX2NmZyAqdGFyZ2V0 X2J1c19jZmcgPSAmcGNpZS0+dGFyZ2V0X2J1c19jZmc7CiAJdW5zaWduZWQgaW50IGJ1c25yX2Vj YW0gPSBidXNuciAmIHRhcmdldF9idXNfY2ZnLT5lY2FtX21hc2s7CiAJdW5zaWduZWQgaW50IGJ1 c25yX3JlZyA9IGJ1c25yICYgdGFyZ2V0X2J1c19jZmctPnJlZ19tYXNrOwotCXZvaWQgX19pb21l bSAqcGNpX2Jhc2VfYWRkcjsKLQotCXBjaV9iYXNlX2FkZHIgPSAodm9pZCBfX2lvbWVtICopKCh1 aW50cHRyX3QpcHAtPnZhX2NmZzBfYmFzZSArCi0JCQkJCSAoYnVzbnJfZWNhbSA8PCAyMCkgKwot CQkJCQkgUENJRV9FQ0FNX0RFVkZOKGRldmZuKSk7CiAKIAlpZiAoYnVzbnJfcmVnICE9IHRhcmdl dF9idXNfY2ZnLT5yZWdfdmFsKSB7CiAJCWRldl9kYmcocGNpZS0+cGNpLT5kZXYsICJDaGFuZ2lu ZyB0YXJnZXQgYnVzIGJ1c251bSB2YWwgZnJvbSAweCV4IHRvIDB4JXhcbiIsCkBAIC0yNDEsNyAr MjM0LDcgQEAgc3RhdGljIHZvaWQgX19pb21lbSAqYWxfcGNpZV9jb25mX2FkZHJfbWFwX2J1cyhz dHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJCSAgICAgICB0YXJnZXRfYnVzX2NmZy0+cmVnX21hc2sp OwogCX0KIAotCXJldHVybiBwY2lfYmFzZV9hZGRyICsgd2hlcmU7CisJcmV0dXJuIHBwLT52YV9j ZmcwX2Jhc2UgKyBQQ0lFX0VDQU1fT0ZGU0VUKGJ1c25yX2VjYW0sIGRldmZuLCB3aGVyZSk7CiB9 CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX29wcyBhbF9jaGlsZF9wY2lfb3BzID0gewpAQCAtMjY0LDcg KzI1Nyw3IEBAIHN0YXRpYyB2b2lkIGFsX3BjaWVfY29uZmlnX3ByZXBhcmUoc3RydWN0IGFsX3Bj aWUgKnBjaWUpCiAKIAl0YXJnZXRfYnVzX2NmZyA9ICZwY2llLT50YXJnZXRfYnVzX2NmZzsKIAot CWVjYW1fYnVzX21hc2sgPSAocGNpZS0+ZWNhbV9zaXplID4+IDIwKSAtIDE7CisJZWNhbV9idXNf bWFzayA9IChwY2llLT5lY2FtX3NpemUgPj4gUENJRV9FQ0FNX0JVU19TSElGVCkgLSAxOwogCWlm IChlY2FtX2J1c19tYXNrID4gMjU1KSB7CiAJCWRldl93YXJuKHBjaWUtPmRldiwgIkVDQU0gd2lu ZG93IHNpemUgaXMgbGFyZ2VyIHRoYW4gMjU2TUIuIEN1dHRpbmcgb2ZmIGF0IDI1NlxuIik7CiAJ CWVjYW1fYnVzX21hc2sgPSAyNTU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVy L2R3Yy9wY2llLWhpc2kuYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaWUtaGlzaS5j CmluZGV4IDVjYTg2Nzk2ZDQzYS4uYjdhZmJmMWQ0YmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bj aS9jb250cm9sbGVyL2R3Yy9wY2llLWhpc2kuYworKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVy L2R3Yy9wY2llLWhpc2kuYwpAQCAtMTAwLDcgKzEwMCw3IEBAIHN0YXRpYyBpbnQgaGlzaV9wY2ll X2luaXQoc3RydWN0IHBjaV9jb25maWdfd2luZG93ICpjZmcpCiB9CiAKIGNvbnN0IHN0cnVjdCBw Y2lfZWNhbV9vcHMgaGlzaV9wY2llX29wcyA9IHsKLQkuYnVzX3NoaWZ0ICAgID0gMjAsCisJLmJ1 c19zaGlmdCAgICA9IFBDSUVfRUNBTV9CVVNfU0hJRlQsCiAJLmluaXQgICAgICAgICA9ICBoaXNp X3BjaWVfaW5pdCwKIAkucGNpX29wcyAgICAgID0gewogCQkubWFwX2J1cyAgICA9IGhpc2lfcGNp ZV9tYXBfYnVzLApAQCAtMTM1LDcgKzEzNSw3IEBAIHN0YXRpYyBpbnQgaGlzaV9wY2llX3BsYXRm b3JtX2luaXQoc3RydWN0IHBjaV9jb25maWdfd2luZG93ICpjZmcpCiB9CiAKIHN0YXRpYyBjb25z dCBzdHJ1Y3QgcGNpX2VjYW1fb3BzIGhpc2lfcGNpZV9wbGF0Zm9ybV9vcHMgPSB7Ci0JLmJ1c19z aGlmdCAgICA9IDIwLAorCS5idXNfc2hpZnQgICAgPSBQQ0lFX0VDQU1fQlVTX1NISUZULAogCS5p bml0ICAgICAgICAgPSAgaGlzaV9wY2llX3BsYXRmb3JtX2luaXQsCiAJLnBjaV9vcHMgICAgICA9 IHsKIAkJLm1hcF9idXMgICAgPSBoaXNpX3BjaWVfbWFwX2J1cywKZGlmZiAtLWdpdCBhL2RyaXZl cnMvcGNpL2NvbnRyb2xsZXIvcGNpLWFhcmR2YXJrLmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVy L3BjaS1hYXJkdmFyay5jCmluZGV4IDBiZTQ4NWEyNTMyNy4uMTA0M2U1NGM3M2JkIDEwMDY0NAot LS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5jCisrKyBiL2RyaXZlcnMv cGNpL2NvbnRyb2xsZXIvcGNpLWFhcmR2YXJrLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRl IDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxs aW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktZWNhbS5oPgogI2luY2x1ZGUgPGxpbnV4 L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxh dGZvcm1fZGV2aWNlLmg+CkBAIC0xNjQsMTQgKzE2NSw2IEBACiAjZGVmaW5lIFBDSUVfQ09ORklH X1dSX1RZUEUwCQkJMHhhCiAjZGVmaW5lIFBDSUVfQ09ORklHX1dSX1RZUEUxCQkJMHhiCiAKLSNk ZWZpbmUgUENJRV9DT05GX0JVUyhidXMpCQkJKCgoYnVzKSAmIDB4ZmYpIDw8IDIwKQotI2RlZmlu ZSBQQ0lFX0NPTkZfREVWKGRldikJCQkoKChkZXYpICYgMHgxZikgPDwgMTUpCi0jZGVmaW5lIFBD SUVfQ09ORl9GVU5DKGZ1bikJCQkoKChmdW4pICYgMHg3KQk8PCAxMikKLSNkZWZpbmUgUENJRV9D T05GX1JFRyhyZWcpCQkJKChyZWcpICYgMHhmZmMpCi0jZGVmaW5lIFBDSUVfQ09ORl9BRERSKGJ1 cywgZGV2Zm4sIHdoZXJlKQlcCi0JKFBDSUVfQ09ORl9CVVMoYnVzKSB8IFBDSUVfQ09ORl9ERVYo UENJX1NMT1QoZGV2Zm4pKQl8IFwKLQkgUENJRV9DT05GX0ZVTkMoUENJX0ZVTkMoZGV2Zm4pKSB8 IFBDSUVfQ09ORl9SRUcod2hlcmUpKQotCiAjZGVmaW5lIFBJT19SRVRSWV9DTlQJCQk1MDAKICNk ZWZpbmUgUElPX1JFVFJZX0RFTEFZCQkJMiAvKiAyIHVzKi8KIApAQCAtNjg3LDcgKzY4MCw3IEBA IHN0YXRpYyBpbnQgYWR2a19wY2llX3JkX2NvbmYoc3RydWN0IHBjaV9idXMgKmJ1cywgdTMyIGRl dmZuLAogCWFkdmtfd3JpdGVsKHBjaWUsIHJlZywgUElPX0NUUkwpOwogCiAJLyogUHJvZ3JhbSB0 aGUgYWRkcmVzcyByZWdpc3RlcnMgKi8KLQlyZWcgPSBQQ0lFX0NPTkZfQUREUihidXMtPm51bWJl ciwgZGV2Zm4sIHdoZXJlKTsKKwlyZWcgPSBBTElHTl9ET1dOKFBDSUVfRUNBTV9PRkZTRVQoYnVz LT5udW1iZXIsIGRldmZuLCB3aGVyZSksIDQpOwogCWFkdmtfd3JpdGVsKHBjaWUsIHJlZywgUElP X0FERFJfTFMpOwogCWFkdmtfd3JpdGVsKHBjaWUsIDAsIFBJT19BRERSX01TKTsKIApAQCAtNzQ4 LDcgKzc0MSw3IEBAIHN0YXRpYyBpbnQgYWR2a19wY2llX3dyX2NvbmYoc3RydWN0IHBjaV9idXMg KmJ1cywgdTMyIGRldmZuLAogCWFkdmtfd3JpdGVsKHBjaWUsIHJlZywgUElPX0NUUkwpOwogCiAJ LyogUHJvZ3JhbSB0aGUgYWRkcmVzcyByZWdpc3RlcnMgKi8KLQlyZWcgPSBQQ0lFX0NPTkZfQURE UihidXMtPm51bWJlciwgZGV2Zm4sIHdoZXJlKTsKKwlyZWcgPSBBTElHTl9ET1dOKFBDSUVfRUNB TV9PRkZTRVQoYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSksIDQpOwogCWFkdmtfd3JpdGVsKHBj aWUsIHJlZywgUElPX0FERFJfTFMpOwogCWFkdmtfd3JpdGVsKHBjaWUsIDAsIFBJT19BRERSX01T KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktaG9zdC1nZW5lcmlj LmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1ob3N0LWdlbmVyaWMuYwppbmRleCBiNTE5 NzdhYmZkZjEuLmMxYzY5YjExNjE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxl ci9wY2ktaG9zdC1nZW5lcmljLmMKKysrIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktaG9z dC1nZW5lcmljLmMKQEAgLTQ5LDcgKzQ5LDcgQEAgc3RhdGljIHZvaWQgX19pb21lbSAqcGNpX2R3 X2VjYW1fbWFwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogfQogCiBzdGF0aWMgY29uc3Qgc3Ry dWN0IHBjaV9lY2FtX29wcyBwY2lfZHdfZWNhbV9idXNfb3BzID0gewotCS5idXNfc2hpZnQJPSAy MCwKKwkuYnVzX3NoaWZ0CT0gUENJRV9FQ0FNX0JVU19TSElGVCwKIAkucGNpX29wcwk9IHsKIAkJ Lm1hcF9idXMJPSBwY2lfZHdfZWNhbV9tYXBfYnVzLAogCQkucmVhZAkJPSBwY2lfZ2VuZXJpY19j b25maWdfcmVhZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXRodW5k ZXItZWNhbS5jIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktdGh1bmRlci1lY2FtLmMKaW5k ZXggN2U4ODM1ZmVlNWY3Li4yMmVkN2U5OTViMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2Nv bnRyb2xsZXIvcGNpLXRodW5kZXItZWNhbS5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIv cGNpLXRodW5kZXItZWNhbS5jCkBAIC0zNDYsNyArMzQ2LDcgQEAgc3RhdGljIGludCB0aHVuZGVy X2VjYW1fY29uZmlnX3dyaXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZm biwKIH0KIAogY29uc3Qgc3RydWN0IHBjaV9lY2FtX29wcyBwY2lfdGh1bmRlcl9lY2FtX29wcyA9 IHsKLQkuYnVzX3NoaWZ0CT0gMjAsCisJLmJ1c19zaGlmdAk9IFBDSUVfRUNBTV9CVVNfU0hJRlQs CiAJLnBjaV9vcHMJPSB7CiAJCS5tYXBfYnVzICAgICAgICA9IHBjaV9lY2FtX21hcF9idXMsCiAJ CS5yZWFkICAgICAgICAgICA9IHRodW5kZXJfZWNhbV9jb25maWdfcmVhZCwKZGlmZiAtLWdpdCBh L2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXRodW5kZXItcGVtLmMgYi9kcml2ZXJzL3BjaS9j b250cm9sbGVyL3BjaS10aHVuZGVyLXBlbS5jCmluZGV4IDNmODQ3OTY5MTQzZS4uMWEzZjcwYWM2 MWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS10aHVuZGVyLXBlbS5j CisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXRodW5kZXItcGVtLmMKQEAgLTE5LDYg KzE5LDE1IEBACiAjZGVmaW5lIFBFTV9DRkdfV1IgMHgyOAogI2RlZmluZSBQRU1fQ0ZHX1JEIDB4 MzAKIAorLyoKKyAqIEVuaGFuY2VkIENvbmZpZ3VyYXRpb24gQWNjZXNzIE1lY2hhbmlzbSAoRUNB TSkKKyAqCisgKiBOLkIuIFRoaXMgaXMgYSBub24tc3RhbmRhcmQgcGxhdGZvcm0tc3BlY2lmaWMg RUNBTSBidXMgc2hpZnQgdmFsdWUuICBGb3IKKyAqIHN0YW5kYXJkIHZhbHVlcyBkZWZpbmVkIGlu IHRoZSBQQ0kgRXhwcmVzcyBCYXNlIFNwZWNpZmljYXRpb24gc2VlCisgKiBpbmNsdWRlL2xpbnV4 L3BjaS1lY2FtLmguCisgKi8KKyNkZWZpbmUgVEhVTkRFUl9QQ0lFX0VDQU1fQlVTX1NISUZUCTI0 CisKIHN0cnVjdCB0aHVuZGVyX3BlbV9wY2kgewogCXUzMgkJZWFfZW50cnlbM107CiAJdm9pZCBf X2lvbWVtCSpwZW1fcmVnX2Jhc2U7CkBAIC00MDQsNyArNDEzLDcgQEAgc3RhdGljIGludCB0aHVu ZGVyX3BlbV9hY3BpX2luaXQoc3RydWN0IHBjaV9jb25maWdfd2luZG93ICpjZmcpCiB9CiAKIGNv bnN0IHN0cnVjdCBwY2lfZWNhbV9vcHMgdGh1bmRlcl9wZW1fZWNhbV9vcHMgPSB7Ci0JLmJ1c19z aGlmdAk9IDI0LAorCS5idXNfc2hpZnQJPSBUSFVOREVSX1BDSUVfRUNBTV9CVVNfU0hJRlQsCiAJ LmluaXQJCT0gdGh1bmRlcl9wZW1fYWNwaV9pbml0LAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1 cwk9IHBjaV9lY2FtX21hcF9idXMsCkBAIC00NDEsNyArNDUwLDcgQEAgc3RhdGljIGludCB0aHVu ZGVyX3BlbV9wbGF0Zm9ybV9pbml0KHN0cnVjdCBwY2lfY29uZmlnX3dpbmRvdyAqY2ZnKQogfQog CiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9lY2FtX29wcyBwY2lfdGh1bmRlcl9wZW1fb3BzID0g ewotCS5idXNfc2hpZnQJPSAyNCwKKwkuYnVzX3NoaWZ0CT0gVEhVTkRFUl9QQ0lFX0VDQU1fQlVT X1NISUZULAogCS5pbml0CQk9IHRodW5kZXJfcGVtX3BsYXRmb3JtX2luaXQsCiAJLnBjaV9vcHMJ PSB7CiAJCS5tYXBfYnVzCT0gcGNpX2VjYW1fbWFwX2J1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMv cGNpL2NvbnRyb2xsZXIvcGNpLXhnZW5lLmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS14 Z2VuZS5jCmluZGV4IDhlMGRiODRmMDg5ZC4uODVlN2M5ODI2NWU4IDEwMDY0NAotLS0gYS9kcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaS14Z2VuZS5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xs ZXIvcGNpLXhnZW5lLmMKQEAgLTI1Nyw3ICsyNTcsNiBAQCBzdGF0aWMgaW50IHhnZW5lX3YxX3Bj aWVfZWNhbV9pbml0KHN0cnVjdCBwY2lfY29uZmlnX3dpbmRvdyAqY2ZnKQogfQogCiBjb25zdCBz dHJ1Y3QgcGNpX2VjYW1fb3BzIHhnZW5lX3YxX3BjaWVfZWNhbV9vcHMgPSB7Ci0JLmJ1c19zaGlm dAk9IDE2LAogCS5pbml0CQk9IHhnZW5lX3YxX3BjaWVfZWNhbV9pbml0LAogCS5wY2lfb3BzCT0g ewogCQkubWFwX2J1cwk9IHhnZW5lX3BjaWVfbWFwX2J1cywKQEAgLTI3Miw3ICsyNzEsNiBAQCBz dGF0aWMgaW50IHhnZW5lX3YyX3BjaWVfZWNhbV9pbml0KHN0cnVjdCBwY2lfY29uZmlnX3dpbmRv dyAqY2ZnKQogfQogCiBjb25zdCBzdHJ1Y3QgcGNpX2VjYW1fb3BzIHhnZW5lX3YyX3BjaWVfZWNh bV9vcHMgPSB7Ci0JLmJ1c19zaGlmdAk9IDE2LAogCS5pbml0CQk9IHhnZW5lX3YyX3BjaWVfZWNh bV9pbml0LAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1cwk9IHhnZW5lX3BjaWVfbWFwX2J1cywK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1icmNtc3RiLmMgYi9kcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtYnJjbXN0Yi5jCmluZGV4IGJlYTg2ODk5YmQ1ZC4uN2Zj ODBmZDZmMTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtYnJjbXN0 Yi5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1icmNtc3RiLmMKQEAgLTIyLDYg KzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9w bGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1l Y2FtLmg+CiAjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzZXQu aD4KICNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgpAQCAtMTI3LDExICsxMjgsNyBAQAogI2RlZmlu ZSAgTVNJX0lOVF9NQVNLX0NMUgkJMHgxNAogCiAjZGVmaW5lIFBDSUVfRVhUX0NGR19EQVRBCQkJ CTB4ODAwMAotCiAjZGVmaW5lIFBDSUVfRVhUX0NGR19JTkRFWAkJCQkweDkwMDAKLSNkZWZpbmUg IFBDSUVfRVhUX0JVU05VTV9TSElGVAkJCQkyMAotI2RlZmluZSAgUENJRV9FWFRfU0xPVF9TSElG VAkJCQkxNQotI2RlZmluZSAgUENJRV9FWFRfRlVOQ19TSElGVAkJCQkxMgogCiAjZGVmaW5lICBQ Q0lFX1JHUjFfU1dfSU5JVF8xX1BFUlNUX01BU0sJCQkweDEKICNkZWZpbmUgIFBDSUVfUkdSMV9T V19JTklUXzFfUEVSU1RfU0hJRlQJCTB4MApAQCAtNjk1LDE1ICs2OTIsNiBAQCBzdGF0aWMgYm9v bCBicmNtX3BjaWVfbGlua191cChzdHJ1Y3QgYnJjbV9wY2llICpwY2llKQogCXJldHVybiBkbGEg JiYgcGx1OwogfQogCi0vKiBDb25maWd1cmF0aW9uIHNwYWNlIHJlYWQvd3JpdGUgc3VwcG9ydCAq Lwotc3RhdGljIGlubGluZSBpbnQgYnJjbV9wY2llX2NmZ19pbmRleChpbnQgYnVzbnIsIGludCBk ZXZmbiwgaW50IHJlZykKLXsKLQlyZXR1cm4gKChQQ0lfU0xPVChkZXZmbikgJiAweDFmKSA8PCBQ Q0lFX0VYVF9TTE9UX1NISUZUKQotCQl8ICgoUENJX0ZVTkMoZGV2Zm4pICYgMHgwNykgPDwgUENJ RV9FWFRfRlVOQ19TSElGVCkKLQkJfCAoYnVzbnIgPDwgUENJRV9FWFRfQlVTTlVNX1NISUZUKQot CQl8IChyZWcgJiB+Myk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW9tZW0gKmJyY21fcGNpZV9tYXBf Y29uZihzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCiAJCQkJCWludCB3 aGVyZSkKIHsKQEAgLTcxNiw3ICs3MDQsNyBAQCBzdGF0aWMgdm9pZCBfX2lvbWVtICpicmNtX3Bj aWVfbWFwX2NvbmYoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAogCQly ZXR1cm4gUENJX1NMT1QoZGV2Zm4pID8gTlVMTCA6IGJhc2UgKyB3aGVyZTsKIAogCS8qIEZvciBk ZXZpY2VzLCB3cml0ZSB0byB0aGUgY29uZmlnIHNwYWNlIGluZGV4IHJlZ2lzdGVyICovCi0JaWR4 ID0gYnJjbV9wY2llX2NmZ19pbmRleChidXMtPm51bWJlciwgZGV2Zm4sIDApOworCWlkeCA9IFBD SUVfRUNBTV9PRkZTRVQoYnVzLT5udW1iZXIsIGRldmZuLCAwKTsKIAl3cml0ZWwoaWR4LCBwY2ll LT5iYXNlICsgUENJRV9FWFRfQ0ZHX0lOREVYKTsKIAlyZXR1cm4gYmFzZSArIFBDSUVfRVhUX0NG R19EQVRBICsgd2hlcmU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3Bj aWUtaXByb2MuYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1pcHJvYy5jCmluZGV4IDkw NWU5MzgwODI0My4uNTAzNjYyMzgwZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9s bGVyL3BjaWUtaXByb2MuYworKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtaXByb2Mu YwpAQCAtNiw2ICs2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUg PGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1lY2FtLmg+CiAjaW5jbHVkZSA8bGlu dXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+CkBAIC0zOSwxNiArNDAsOCBAQAogCiAjZGVmaW5lIENGR19JTkRfQUREUl9NQVNLCQkweDAw MDAxZmZjCiAKLSNkZWZpbmUgQ0ZHX0FERFJfQlVTX05VTV9TSElGVAkJMjAKLSNkZWZpbmUgQ0ZH X0FERFJfQlVTX05VTV9NQVNLCQkweDBmZjAwMDAwCi0jZGVmaW5lIENGR19BRERSX0RFVl9OVU1f U0hJRlQJCTE1Ci0jZGVmaW5lIENGR19BRERSX0RFVl9OVU1fTUFTSwkJMHgwMDBmODAwMAotI2Rl ZmluZSBDRkdfQUREUl9GVU5DX05VTV9TSElGVAkJMTIKLSNkZWZpbmUgQ0ZHX0FERFJfRlVOQ19O VU1fTUFTSwkJMHgwMDAwNzAwMAotI2RlZmluZSBDRkdfQUREUl9SRUdfTlVNX1NISUZUCQkyCiAj ZGVmaW5lIENGR19BRERSX1JFR19OVU1fTUFTSwkJMHgwMDAwMGZmYwotI2RlZmluZSBDRkdfQURE Ul9DRkdfVFlQRV9TSElGVAkJMAotI2RlZmluZSBDRkdfQUREUl9DRkdfVFlQRV9NQVNLCQkweDAw MDAwMDAzCisjZGVmaW5lIENGR19BRERSX0NGR19UWVBFXzEJCTEKIAogI2RlZmluZSBTWVNfUkNf SU5UWF9NQVNLCQkweGYKIApAQCAtNDU5LDE5ICs0NTIsMTUgQEAgc3RhdGljIGlubGluZSB2b2lk IGlwcm9jX3BjaWVfYXBiX2Vycl9kaXNhYmxlKHN0cnVjdCBwY2lfYnVzICpidXMsCiAKIHN0YXRp YyB2b2lkIF9faW9tZW0gKmlwcm9jX3BjaWVfbWFwX2VwX2NmZ19yZWcoc3RydWN0IGlwcm9jX3Bj aWUgKnBjaWUsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnVzbm8sCi0JCQkJCSAgICAgICB1 bnNpZ25lZCBpbnQgc2xvdCwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBmbiwKKwkJCQkJICAg ICAgIHVuc2lnbmVkIGludCBkZXZmbiwKIAkJCQkJICAgICAgIGludCB3aGVyZSkKIHsKIAl1MTYg b2Zmc2V0OwogCXUzMiB2YWw7CiAKIAkvKiBFUCBkZXZpY2UgYWNjZXNzICovCi0JdmFsID0gKGJ1 c25vIDw8IENGR19BRERSX0JVU19OVU1fU0hJRlQpIHwKLQkJKHNsb3QgPDwgQ0ZHX0FERFJfREVW X05VTV9TSElGVCkgfAotCQkoZm4gPDwgQ0ZHX0FERFJfRlVOQ19OVU1fU0hJRlQpIHwKLQkJKHdo ZXJlICYgQ0ZHX0FERFJfUkVHX05VTV9NQVNLKSB8Ci0JCSgxICYgQ0ZHX0FERFJfQ0ZHX1RZUEVf TUFTSyk7CisJdmFsID0gQUxJR05fRE9XTihQQ0lFX0VDQU1fT0ZGU0VUKGJ1c25vLCBkZXZmbiwg d2hlcmUpLCA0KSB8CisJCUNGR19BRERSX0NGR19UWVBFXzE7CiAKIAlpcHJvY19wY2llX3dyaXRl X3JlZyhwY2llLCBJUFJPQ19QQ0lFX0NGR19BRERSLCB2YWwpOwogCW9mZnNldCA9IGlwcm9jX3Bj aWVfcmVnX29mZnNldChwY2llLCBJUFJPQ19QQ0lFX0NGR19EQVRBKTsKQEAgLTU3NCw4ICs1NjMs NiBAQCBzdGF0aWMgaW50IGlwcm9jX3BjaWVfY29uZmlnX3JlYWQoc3RydWN0IHBjaV9idXMgKmJ1 cywgdW5zaWduZWQgaW50IGRldmZuLAogCQkJCSAgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2 YWwpCiB7CiAJc3RydWN0IGlwcm9jX3BjaWUgKnBjaWUgPSBpcHJvY19kYXRhKGJ1cyk7Ci0JdW5z aWduZWQgaW50IHNsb3QgPSBQQ0lfU0xPVChkZXZmbik7Ci0JdW5zaWduZWQgaW50IGZuID0gUENJ X0ZVTkMoZGV2Zm4pOwogCXVuc2lnbmVkIGludCBidXNubyA9IGJ1cy0+bnVtYmVyOwogCXZvaWQg X19pb21lbSAqY2ZnX2RhdGFfcDsKIAl1bnNpZ25lZCBpbnQgZGF0YTsKQEAgLTU5MCw3ICs1Nzcs NyBAQCBzdGF0aWMgaW50IGlwcm9jX3BjaWVfY29uZmlnX3JlYWQoc3RydWN0IHBjaV9idXMgKmJ1 cywgdW5zaWduZWQgaW50IGRldmZuLAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWNmZ19kYXRhX3Ag PSBpcHJvY19wY2llX21hcF9lcF9jZmdfcmVnKHBjaWUsIGJ1c25vLCBzbG90LCBmbiwgd2hlcmUp OworCWNmZ19kYXRhX3AgPSBpcHJvY19wY2llX21hcF9lcF9jZmdfcmVnKHBjaWUsIGJ1c25vLCBk ZXZmbiwgd2hlcmUpOwogCiAJaWYgKCFjZmdfZGF0YV9wKQogCQlyZXR1cm4gUENJQklPU19ERVZJ Q0VfTk9UX0ZPVU5EOwpAQCAtNjMxLDEzICs2MTgsMTEgQEAgc3RhdGljIHZvaWQgX19pb21lbSAq aXByb2NfcGNpZV9tYXBfY2ZnX2J1cyhzdHJ1Y3QgaXByb2NfcGNpZSAqcGNpZSwKIAkJCQkJICAg IGludCBidXNubywgdW5zaWduZWQgaW50IGRldmZuLAogCQkJCQkgICAgaW50IHdoZXJlKQogewot CXVuc2lnbmVkIHNsb3QgPSBQQ0lfU0xPVChkZXZmbik7Ci0JdW5zaWduZWQgZm4gPSBQQ0lfRlVO QyhkZXZmbik7CiAJdTE2IG9mZnNldDsKIAogCS8qIHJvb3QgY29tcGxleCBhY2Nlc3MgKi8KIAlp ZiAoYnVzbm8gPT0gMCkgewotCQlpZiAoc2xvdCA+IDAgfHwgZm4gPiAwKQorCQlpZiAoUENJRV9F Q0FNX0RFVkZOKGRldmZuKSA+IDApCiAJCQlyZXR1cm4gTlVMTDsKIAogCQlpcHJvY19wY2llX3dy aXRlX3JlZyhwY2llLCBJUFJPQ19QQ0lFX0NGR19JTkRfQUREUiwKQEAgLTY0OSw3ICs2MzQsNyBA QCBzdGF0aWMgdm9pZCBfX2lvbWVtICppcHJvY19wY2llX21hcF9jZmdfYnVzKHN0cnVjdCBpcHJv Y19wY2llICpwY2llLAogCQkJcmV0dXJuIChwY2llLT5iYXNlICsgb2Zmc2V0KTsKIAl9CiAKLQly ZXR1cm4gaXByb2NfcGNpZV9tYXBfZXBfY2ZnX3JlZyhwY2llLCBidXNubywgc2xvdCwgZm4sIHdo ZXJlKTsKKwlyZXR1cm4gaXByb2NfcGNpZV9tYXBfZXBfY2ZnX3JlZyhwY2llLCBidXNubywgZGV2 Zm4sIHdoZXJlKTsKIH0KIAogc3RhdGljIHZvaWQgX19pb21lbSAqaXByb2NfcGNpZV9idXNfbWFw X2NmZ19idXMoc3RydWN0IHBjaV9idXMgKmJ1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2Nv bnRyb2xsZXIvcGNpZS1yb2NrY2hpcC1ob3N0LmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3Bj aWUtcm9ja2NoaXAtaG9zdC5jCmluZGV4IDk3MDUwNTk1MjNhNi4uZjFkMDhhMWIxNTkxIDEwMDY0 NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtcm9ja2NoaXAtaG9zdC5jCisrKyBi L2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1yb2NrY2hpcC1ob3N0LmMKQEAgLTE1NywxMiAr MTU3LDExIEBAIHN0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9yZF9vdGhlcl9jb25mKHN0cnVjdCBy b2NrY2hpcF9wY2llICpyb2NrY2hpcCwKIAkJCQkgICAgICAgc3RydWN0IHBjaV9idXMgKmJ1cywg dTMyIGRldmZuLAogCQkJCSAgICAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKIHsK LQl1MzIgYnVzZGV2OworCXZvaWQgX19pb21lbSAqYWRkcjsKIAotCWJ1c2RldiA9IFBDSUVfRUNB TV9BRERSKGJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXZmbiksCi0JCQkJUENJX0ZVTkMoZGV2Zm4p LCB3aGVyZSk7CisJYWRkciA9IHJvY2tjaGlwLT5yZWdfYmFzZSArIFBDSUVfRUNBTV9PRkZTRVQo YnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSk7CiAKLQlpZiAoIUlTX0FMSUdORUQoYnVzZGV2LCBz aXplKSkgeworCWlmICghSVNfQUxJR05FRCgodWludHB0cl90KWFkZHIsIHNpemUpKSB7CiAJCSp2 YWwgPSAwOwogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwogCX0KQEAgLTE3 NSwxMSArMTc0LDExIEBAIHN0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9yZF9vdGhlcl9jb25mKHN0 cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCwKIAkJCQkJCUFYSV9XUkFQUEVSX1RZUEUxX0NG Ryk7CiAKIAlpZiAoc2l6ZSA9PSA0KSB7Ci0JCSp2YWwgPSByZWFkbChyb2NrY2hpcC0+cmVnX2Jh c2UgKyBidXNkZXYpOworCQkqdmFsID0gcmVhZGwoYWRkcik7CiAJfSBlbHNlIGlmIChzaXplID09 IDIpIHsKLQkJKnZhbCA9IHJlYWR3KHJvY2tjaGlwLT5yZWdfYmFzZSArIGJ1c2Rldik7CisJCSp2 YWwgPSByZWFkdyhhZGRyKTsKIAl9IGVsc2UgaWYgKHNpemUgPT0gMSkgewotCQkqdmFsID0gcmVh ZGIocm9ja2NoaXAtPnJlZ19iYXNlICsgYnVzZGV2KTsKKwkJKnZhbCA9IHJlYWRiKGFkZHIpOwog CX0gZWxzZSB7CiAJCSp2YWwgPSAwOwogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVN QkVSOwpAQCAtMTkxLDExICsxOTAsMTEgQEAgc3RhdGljIGludCByb2NrY2hpcF9wY2llX3dyX290 aGVyX2NvbmYoc3RydWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwLAogCQkJCSAgICAgICBzdHJ1 Y3QgcGNpX2J1cyAqYnVzLCB1MzIgZGV2Zm4sCiAJCQkJICAgICAgIGludCB3aGVyZSwgaW50IHNp emUsIHUzMiB2YWwpCiB7Ci0JdTMyIGJ1c2RldjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CiAKLQli dXNkZXYgPSBQQ0lFX0VDQU1fQUREUihidXMtPm51bWJlciwgUENJX1NMT1QoZGV2Zm4pLAotCQkJ CVBDSV9GVU5DKGRldmZuKSwgd2hlcmUpOwotCWlmICghSVNfQUxJR05FRChidXNkZXYsIHNpemUp KQorCWFkZHIgPSByb2NrY2hpcC0+cmVnX2Jhc2UgKyBQQ0lFX0VDQU1fT0ZGU0VUKGJ1cy0+bnVt YmVyLCBkZXZmbiwgd2hlcmUpOworCisJaWYgKCFJU19BTElHTkVEKCh1aW50cHRyX3QpYWRkciwg c2l6ZSkpCiAJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CiAKIAlpZiAocGNp X2lzX3Jvb3RfYnVzKGJ1cy0+cGFyZW50KSkKQEAgLTIwNiwxMSArMjA1LDExIEBAIHN0YXRpYyBp bnQgcm9ja2NoaXBfcGNpZV93cl9vdGhlcl9jb25mKHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2Nr Y2hpcCwKIAkJCQkJCUFYSV9XUkFQUEVSX1RZUEUxX0NGRyk7CiAKIAlpZiAoc2l6ZSA9PSA0KQot CQl3cml0ZWwodmFsLCByb2NrY2hpcC0+cmVnX2Jhc2UgKyBidXNkZXYpOworCQl3cml0ZWwodmFs LCBhZGRyKTsKIAllbHNlIGlmIChzaXplID09IDIpCi0JCXdyaXRldyh2YWwsIHJvY2tjaGlwLT5y ZWdfYmFzZSArIGJ1c2Rldik7CisJCXdyaXRldyh2YWwsIGFkZHIpOwogCWVsc2UgaWYgKHNpemUg PT0gMSkKLQkJd3JpdGViKHZhbCwgcm9ja2NoaXAtPnJlZ19iYXNlICsgYnVzZGV2KTsKKwkJd3Jp dGViKHZhbCwgYWRkcik7CiAJZWxzZQogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVN QkVSOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtcm9ja2NoaXAu aCBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1yb2NrY2hpcC5oCmluZGV4IGM3ZDAxNzhm YzhjMi4uMTY1MGE1MDg3NDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3Bj aWUtcm9ja2NoaXAuaAorKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtcm9ja2NoaXAu aApAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVk ZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWVjYW0uaD4KIAogLyoKICAqIFRo ZSB1cHBlciAxNiBiaXRzIG9mIFBDSUVfQ0xJRU5UX0NPTkZJRyBhcmUgYSB3cml0ZSBtYXNrIGZv ciB0aGUgbG93ZXIgMTYKQEAgLTE3OCwxMyArMTc5LDYgQEAKICNkZWZpbmUgTUlOX0FYSV9BRERS X0JJVFNfUEFTU0VECQk4CiAjZGVmaW5lIFBDSUVfUkNfU0VORF9QTUVfT0ZGCQkJMHgxMTk2MAog I2RlZmluZSBST0NLQ0hJUF9WRU5ET1JfSUQJCQkweDFkODcKLSNkZWZpbmUgUENJRV9FQ0FNX0JV Uyh4KQkJCSgoKHgpICYgMHhmZikgPDwgMjApCi0jZGVmaW5lIFBDSUVfRUNBTV9ERVYoeCkJCQko KCh4KSAmIDB4MWYpIDw8IDE1KQotI2RlZmluZSBQQ0lFX0VDQU1fRlVOQyh4KQkJCSgoKHgpICYg MHg3KSA8PCAxMikKLSNkZWZpbmUgUENJRV9FQ0FNX1JFRyh4KQkJCSgoKHgpICYgMHhmZmYpIDw8 IDApCi0jZGVmaW5lIFBDSUVfRUNBTV9BRERSKGJ1cywgZGV2LCBmdW5jLCByZWcpIFwKLQkgIChQ Q0lFX0VDQU1fQlVTKGJ1cykgfCBQQ0lFX0VDQU1fREVWKGRldikgfCBcCi0JICAgUENJRV9FQ0FN X0ZVTkMoZnVuYykgfCBQQ0lFX0VDQU1fUkVHKHJlZykpCiAjZGVmaW5lIFBDSUVfTElOS19JU19M Mih4KSBcCiAJKCgoeCkgJiBQQ0lFX0NMSUVOVF9ERUJVR19MVFNTTV9NQVNLKSA9PSBQQ0lFX0NM SUVOVF9ERUJVR19MVFNTTV9MMikKICNkZWZpbmUgUENJRV9MSU5LX1VQKHgpIFwKZGlmZiAtLWdp dCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS10YW5nby5jIGIvZHJpdmVycy9wY2kvY29u dHJvbGxlci9wY2llLXRhbmdvLmMKaW5kZXggZDA5M2E4Y2U0YmIxLi44ZjBkNjk1YWZiZGUgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS10YW5nby5jCisrKyBiL2RyaXZl cnMvcGNpL2NvbnRyb2xsZXIvcGNpZS10YW5nby5jCkBAIC0yMDgsNyArMjA4LDcgQEAgc3RhdGlj IGludCBzbXA4NzU5X2NvbmZpZ193cml0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBp bnQgZGV2Zm4sCiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2VjYW1fb3BzIHNtcDg3NTlf ZWNhbV9vcHMgPSB7Ci0JLmJ1c19zaGlmdAk9IDIwLAorCS5idXNfc2hpZnQJPSBQQ0lFX0VDQU1f QlVTX1NISUZULAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1cwk9IHBjaV9lY2FtX21hcF9idXMs CiAJCS5yZWFkCQk9IHNtcDg3NTlfY29uZmlnX3JlYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bj aS9jb250cm9sbGVyL3BjaWUteGlsaW54LW53bC5jIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9w Y2llLXhpbGlueC1ud2wuYwppbmRleCBmM2NmN2Q2MTkyNGYuLjdmMjljMmZkY2Q1MSAxMDA2NDQK LS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2llLXhpbGlueC1ud2wuYworKysgYi9kcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUteGlsaW54LW53bC5jCkBAIC0xOCw2ICsxOCw3IEBACiAj aW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4K ICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktZWNhbS5oPgogI2lu Y2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAv Y2hhaW5lZF9pcnEuaD4KIApAQCAtMTI0LDggKzEyNSw2IEBACiAjZGVmaW5lIEVfRUNBTV9DUl9F TkFCTEUJCUJJVCgwKQogI2RlZmluZSBFX0VDQU1fU0laRV9MT0MJCQlHRU5NQVNLKDIwLCAxNikK ICNkZWZpbmUgRV9FQ0FNX1NJWkVfU0hJRlQJCTE2Ci0jZGVmaW5lIEVDQU1fQlVTX0xPQ19TSElG VAkJMjAKLSNkZWZpbmUgRUNBTV9ERVZfTE9DX1NISUZUCQkxMgogI2RlZmluZSBOV0xfRUNBTV9W QUxVRV9ERUZBVUxUCQkxMgogCiAjZGVmaW5lIENGR19ETUFfUkVHX0JBUgkJCUdFTk1BU0soMiwg MCkKQEAgLTI0MCwxNSArMjM5LDExIEBAIHN0YXRpYyB2b2lkIF9faW9tZW0gKm53bF9wY2llX21h cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAogCQkJCSAgICAg IGludCB3aGVyZSkKIHsKIAlzdHJ1Y3QgbndsX3BjaWUgKnBjaWUgPSBidXMtPnN5c2RhdGE7Ci0J aW50IHJlbGJ1czsKIAogCWlmICghbndsX3BjaWVfdmFsaWRfZGV2aWNlKGJ1cywgZGV2Zm4pKQog CQlyZXR1cm4gTlVMTDsKIAotCXJlbGJ1cyA9IChidXMtPm51bWJlciA8PCBFQ0FNX0JVU19MT0Nf U0hJRlQpIHwKLQkJCShkZXZmbiA8PCBFQ0FNX0RFVl9MT0NfU0hJRlQpOwotCi0JcmV0dXJuIHBj aWUtPmVjYW1fYmFzZSArIHJlbGJ1cyArIHdoZXJlOworCXJldHVybiBwY2llLT5lY2FtX2Jhc2Ug KyBQQ0lFX0VDQU1fT0ZGU0VUKGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUpOwogfQogCiAvKiBQ Q0llIG9wZXJhdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNp ZS14aWxpbnguYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS14aWxpbnguYwppbmRleCA4 NTIzYmU2MWJiYTUuLmZhNWJhZWI4MjY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvY29udHJv bGxlci9wY2llLXhpbGlueC5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS14aWxp bnguYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAj aW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVk ZSA8bGludXgvcGNpLWVjYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4K IAogI2luY2x1ZGUgIi4uL3BjaS5oIgpAQCAtODYsMTAgKzg3LDYgQEAKIC8qIFBoeSBTdGF0dXMv Q29udHJvbCBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBYSUxJTlhfUENJRV9SRUdf UFNDUl9MTktVUAlCSVQoMTEpCiAKLS8qIEVDQU0gZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgRUNB TV9CVVNfTlVNX1NISUZUCQkyMAotI2RlZmluZSBFQ0FNX0RFVl9OVU1fU0hJRlQJCTEyCi0KIC8q IE51bWJlciBvZiBNU0kgSVJRcyAqLwogI2RlZmluZSBYSUxJTlhfTlVNX01TSV9JUlFTCQkxMjgK IApAQCAtMTgzLDE1ICsxODAsMTEgQEAgc3RhdGljIHZvaWQgX19pb21lbSAqeGlsaW54X3BjaWVf bWFwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJCQkgdW5zaWduZWQgaW50IGRldmZuLCBp bnQgd2hlcmUpCiB7CiAJc3RydWN0IHhpbGlueF9wY2llX3BvcnQgKnBvcnQgPSBidXMtPnN5c2Rh dGE7Ci0JaW50IHJlbGJ1czsKIAogCWlmICgheGlsaW54X3BjaWVfdmFsaWRfZGV2aWNlKGJ1cywg ZGV2Zm4pKQogCQlyZXR1cm4gTlVMTDsKIAotCXJlbGJ1cyA9IChidXMtPm51bWJlciA8PCBFQ0FN X0JVU19OVU1fU0hJRlQpIHwKLQkJIChkZXZmbiA8PCBFQ0FNX0RFVl9OVU1fU0hJRlQpOwotCi0J cmV0dXJuIHBvcnQtPnJlZ19iYXNlICsgcmVsYnVzICsgd2hlcmU7CisJcmV0dXJuIHBvcnQtPnJl Z19iYXNlICsgUENJRV9FQ0FNX09GRlNFVChidXMtPm51bWJlciwgZGV2Zm4sIHdoZXJlKTsKIH0K IAogLyogUENJZSBvcGVyYXRpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9s bGVyL3ZtZC5jIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci92bWQuYwppbmRleCBmMzc1YzIxY2Vl YjEuLjU5ZmE5YTk0ODYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci92bWQu YworKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3ZtZC5jCkBAIC0xMSw2ICsxMSw3IEBACiAj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVk ZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWVjYW0uaD4KICNpbmNsdWRlIDxs aW51eC9zcmN1Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4 L3JjdXBkYXRlLmg+CkBAIC05NCw3ICs5NSw3IEBAIHN0cnVjdCB2bWRfZGV2IHsKIAlzdHJ1Y3Qg cGNpX2RldgkJKmRldjsKIAogCXNwaW5sb2NrX3QJCWNmZ19sb2NrOwotCWNoYXIgX19pb21lbQkJ KmNmZ2JhcjsKKwl2b2lkIF9faW9tZW0JCSpjZmdiYXI7CiAKIAlpbnQgbXNpeF9jb3VudDsKIAlz dHJ1Y3Qgdm1kX2lycV9saXN0CSppcnFzOwpAQCAtMzI1LDE4ICszMjYsMTYgQEAgc3RhdGljIHZv aWQgdm1kX3JlbW92ZV9pcnFfZG9tYWluKHN0cnVjdCB2bWRfZGV2ICp2bWQpCiAJfQogfQogCi1z dGF0aWMgY2hhciBfX2lvbWVtICp2bWRfY2ZnX2FkZHIoc3RydWN0IHZtZF9kZXYgKnZtZCwgc3Ry dWN0IHBjaV9idXMgKmJ1cywKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnZtZF9jZmdfYWRkcihzdHJ1 Y3Qgdm1kX2RldiAqdm1kLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJCSAgdW5zaWduZWQgaW50 IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuKQogewotCWNoYXIgX19pb21lbSAqYWRkciA9IHZtZC0+ Y2ZnYmFyICsKLQkJCSAgICAgKChidXMtPm51bWJlciAtIHZtZC0+YnVzbl9zdGFydCkgPDwgMjAp ICsKLQkJCSAgICAgKGRldmZuIDw8IDEyKSArIHJlZzsKKwl1bnNpZ25lZCBpbnQgYnVzbnJfZWNh bSA9IGJ1cy0+bnVtYmVyIC0gdm1kLT5idXNuX3N0YXJ0OworCXUzMiBvZmZzZXQgPSBQQ0lFX0VD QU1fT0ZGU0VUKGJ1c25yX2VjYW0sIGRldmZuLCByZWcpOwogCi0JaWYgKChhZGRyIC0gdm1kLT5j ZmdiYXIpICsgbGVuID49Ci0JICAgIHJlc291cmNlX3NpemUoJnZtZC0+ZGV2LT5yZXNvdXJjZVtW TURfQ0ZHQkFSXSkpCisJaWYgKG9mZnNldCArIGxlbiA+PSByZXNvdXJjZV9zaXplKCZ2bWQtPmRl di0+cmVzb3VyY2VbVk1EX0NGR0JBUl0pKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiBhZGRy OworCXJldHVybiB2bWQtPmNmZ2JhciArIG9mZnNldDsKIH0KIAogLyoKQEAgLTM0Nyw3ICszNDYs NyBAQCBzdGF0aWMgaW50IHZtZF9wY2lfcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25l ZCBpbnQgZGV2Zm4sIGludCByZWcsCiAJCQlpbnQgbGVuLCB1MzIgKnZhbHVlKQogewogCXN0cnVj dCB2bWRfZGV2ICp2bWQgPSB2bWRfZnJvbV9idXMoYnVzKTsKLQljaGFyIF9faW9tZW0gKmFkZHIg PSB2bWRfY2ZnX2FkZHIodm1kLCBidXMsIGRldmZuLCByZWcsIGxlbik7CisJdm9pZCBfX2lvbWVt ICphZGRyID0gdm1kX2NmZ19hZGRyKHZtZCwgYnVzLCBkZXZmbiwgcmVnLCBsZW4pOwogCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKQEAgLTM4Miw3ICszODEsNyBAQCBzdGF0 aWMgaW50IHZtZF9wY2lfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRl dmZuLCBpbnQgcmVnLAogCQkJIGludCBsZW4sIHUzMiB2YWx1ZSkKIHsKIAlzdHJ1Y3Qgdm1kX2Rl diAqdm1kID0gdm1kX2Zyb21fYnVzKGJ1cyk7Ci0JY2hhciBfX2lvbWVtICphZGRyID0gdm1kX2Nm Z19hZGRyKHZtZCwgYnVzLCBkZXZmbiwgcmVnLCBsZW4pOworCXZvaWQgX19pb21lbSAqYWRkciA9 IHZtZF9jZmdfYWRkcih2bWQsIGJ1cywgZGV2Zm4sIHJlZywgbGVuKTsKIAl1bnNpZ25lZCBsb25n IGZsYWdzOwogCWludCByZXQgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9lY2FtLmMg Yi9kcml2ZXJzL3BjaS9lY2FtLmMKaW5kZXggYjU0ZDMyYTMxNjY5Li4xZTAyMjk3NjUzNDkgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2VjYW0uYworKysgYi9kcml2ZXJzL3BjaS9lY2FtLmMKQEAg LTE0OSw3ICsxNDksNyBAQCBFWFBPUlRfU1lNQk9MX0dQTChwY2lfZWNhbV9tYXBfYnVzKTsKIAog LyogRUNBTSBvcHMgKi8KIGNvbnN0IHN0cnVjdCBwY2lfZWNhbV9vcHMgcGNpX2dlbmVyaWNfZWNh bV9vcHMgPSB7Ci0JLmJ1c19zaGlmdAk9IDIwLAorCS5idXNfc2hpZnQJPSBQQ0lFX0VDQU1fQlVT X1NISUZULAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1cwk9IHBjaV9lY2FtX21hcF9idXMsCiAJ CS5yZWFkCQk9IHBjaV9nZW5lcmljX2NvbmZpZ19yZWFkLApAQCAtMTYxLDcgKzE2MSw3IEBAIEVY UE9SVF9TWU1CT0xfR1BMKHBjaV9nZW5lcmljX2VjYW1fb3BzKTsKICNpZiBkZWZpbmVkKENPTkZJ R19BQ1BJKSAmJiBkZWZpbmVkKENPTkZJR19QQ0lfUVVJUktTKQogLyogRUNBTSBvcHMgZm9yIDMy LWJpdCBhY2Nlc3Mgb25seSAobm9uLWNvbXBsaWFudCkgKi8KIGNvbnN0IHN0cnVjdCBwY2lfZWNh bV9vcHMgcGNpXzMyYl9vcHMgPSB7Ci0JLmJ1c19zaGlmdAk9IDIwLAorCS5idXNfc2hpZnQJPSBQ Q0lFX0VDQU1fQlVTX1NISUZULAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1cwk9IHBjaV9lY2Ft X21hcF9idXMsCiAJCS5yZWFkCQk9IHBjaV9nZW5lcmljX2NvbmZpZ19yZWFkMzIsCmRpZmYgLS1n aXQgYS9pbmNsdWRlL2xpbnV4L3BjaS1lY2FtLmggYi9pbmNsdWRlL2xpbnV4L3BjaS1lY2FtLmgK aW5kZXggMDMzY2U3NGYwMmU4Li45NzY3OTIyNDYxY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlu dXgvcGNpLWVjYW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1lY2FtLmgKQEAgLTksNiArOSwy OSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3Jt X2RldmljZS5oPgogCisvKgorICogTWVtb3J5IGFkZHJlc3Mgc2hpZnQgdmFsdWVzIGZvciB0aGUg Ynl0ZS1sZXZlbCBhZGRyZXNzIHRoYXQKKyAqIGNhbiBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIHRo ZSBQQ0kgRXhwcmVzcyBDb25maWd1cmF0aW9uIFNwYWNlLgorICovCisKKy8qCisgKiBFbmhhbmNl ZCBDb25maWd1cmF0aW9uIEFjY2VzcyBNZWNoYW5pc20gKEVDQU0pCisgKgorICogU2VlIFBDSSBF eHByZXNzIEJhc2UgU3BlY2lmaWNhdGlvbiwgUmV2aXNpb24gNS4wLCBWZXJzaW9uIDEuMCwKKyAq IFNlY3Rpb24gNy4yLjIsIFRhYmxlIDctMSwgcC4gNjc3LgorICovCisjZGVmaW5lIFBDSUVfRUNB TV9CVVNfU0hJRlQJMjAgLyogQnVzIE51bWJlciAqLworI2RlZmluZSBQQ0lFX0VDQU1fREVWRk5f U0hJRlQJMTIgLyogRGV2aWNlIGFuZCBGdW5jdGlvbiBOdW1iZXIgKi8KKworI2RlZmluZSBQQ0lF X0VDQU1fQlVTKHgpCSgoKHgpICYgMHhmZikgPDwgUENJRV9FQ0FNX0JVU19TSElGVCkKKyNkZWZp bmUgUENJRV9FQ0FNX0RFVkZOKHgpCSgoKHgpICYgMHhmZikgPDwgUENJRV9FQ0FNX0RFVkZOX1NI SUZUKQorI2RlZmluZSBQQ0lFX0VDQU1fUkVHKHgpCSgoeCkgJiAweGZmZikKKworI2RlZmluZSBQ Q0lFX0VDQU1fT0ZGU0VUKGJ1cywgZGV2Zm4sIHdoZXJlKSBcCisJKFBDSUVfRUNBTV9CVVMoYnVz KSB8IFwKKwkgUENJRV9FQ0FNX0RFVkZOKGRldmZuKSB8IFwKKwkgUENJRV9FQ0FNX1JFRyh3aGVy ZSkpCisKIC8qCiAgKiBzdHJ1Y3QgdG8gaG9sZCBwY2kgb3BzIGFuZCBidXMgc2hpZnQgb2YgdGhl IGNvbmZpZyB3aW5kb3cKICAqIGZvciBhIFBDSSBjb250cm9sbGVyLgotLSAKMi4yOS4yCgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXgtcm9ja2No aXAgbWFpbGluZyBsaXN0CkxpbnV4LXJvY2tjaGlwQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yb2NrY2hpcAo= 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=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7307CC2D0E4 for ; Fri, 27 Nov 2020 10:48:27 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (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 3F749205F4 for ; Fri, 27 Nov 2020 10:48:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3F749205F4 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=linux.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 4CjBDm39kVzDrPt for ; Fri, 27 Nov 2020 21:48:24 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=209.85.214.195; helo=mail-pl1-f195.google.com; envelope-from=kswilczynski@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.com Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4CjBBw20w4zDrdH for ; Fri, 27 Nov 2020 21:46:47 +1100 (AEDT) Received: by mail-pl1-f195.google.com with SMTP id v21so2490303plo.12 for ; Fri, 27 Nov 2020 02:46:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=/ofhNQSHG3WAD/AojJeiQwmlt67hb9Caduex5mipx9k=; b=trhK8Qh5GpNnMADdiSjAaeGkZv56ExgysDopMKGP/MlHNh/OIH8+pHy1BsMNorihNF CFykebaeA39fxw0GFwYJXAkcaAgxxIxKf1yNHb10DbkloW8cir2/XB+bKJivnSwIzvkU JM/BRAOrYprmV85dzsPugd0ftEreoCINYze+tqgWcYLA8ZdU7IfSMvChFKvq1SP0hgGl vUuJ4cVimw9P9Q+jQwpv3YfeJ/3g44cuzM+cR3EPGzGtjL0SwVnz9l3SDers30UwjEZ8 j8u2yi1iAwQ3iPpDvUQ27LgOq7cdt6WWI4r8aLtr8MZpJhY/nNs/iSoYatgK3SYZcuaE jhXA== X-Gm-Message-State: AOAM531JSlvDwO5w0Y2wygN6cdT9DWlmTvWyHe2YkVfr6CqtcKdEqaBr vikgQcCpiHYwmnflzRO6+uc= X-Google-Smtp-Source: ABdhPJxHqGQQEytKXoVDsUeGv6IYcQ2xpnElpAMxdcC+3X4fRm/f7wqyqiJBwbLDhUDt3fZBfILO6w== X-Received: by 2002:a17:902:820e:b029:d6:e802:75aa with SMTP id x14-20020a170902820eb02900d6e80275aamr6214785pln.51.1606474004147; Fri, 27 Nov 2020 02:46:44 -0800 (PST) Received: from workstation.lan ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id v22sm7161494pff.48.2020.11.27.02.46.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Nov 2020 02:46:43 -0800 (PST) From: =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= To: Bjorn Helgaas Subject: [PATCH v5] PCI: Unify ECAM constants in native PCI Express drivers Date: Fri, 27 Nov 2020 10:46:26 +0000 Message-Id: <20201127104626.3979165-1-kw@linux.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Heiko Stuebner , Shawn Lin , Paul Mackerras , Thomas Petazzoni , Jonathan Chocron , Toan Le , Will Deacon , Rob Herring , Lorenzo Pieralisi , Michal Simek , linux-rockchip@lists.infradead.org, bcm-kernel-feedback-list@broadcom.com, Jonathan Derrick , linux-pci@vger.kernel.org, Ray Jui , Florian Fainelli , linux-rpi-kernel@lists.infradead.org, Jonathan Cameron , linux-arm-kernel@lists.infradead.org, Scott Branden , Zhou Wang , Robert Richter , linuxppc-dev@lists.ozlabs.org, Nicolas Saenz Julienne Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" Unify ECAM-related constants into a single set of standard constants defining memory address shift values for the byte-level address that can be used when accessing the PCI Express Configuration Space, and then move native PCI Express controller drivers to use newly introduced definitions retiring any driver-specific ones. The ECAM ("Enhanced Configuration Access Mechanism") is defined by the PCI Express specification (see PCI Express Base Specification, Revision 5.0, Version 1.0, Section 7.2.2, p. 676), thus most hardware should implement it the same way. Most of the native PCI Express controller drivers define their ECAM-related constants, many of these could be shared, or use open-coded values when setting the .bus_shift field of the struct pci_ecam_ops. All of the newly added constants should remove ambiguity and reduce the number of open-coded values, and also correlate more strongly with the descriptions in the aforementioned specification (see Table 7-1 "Enhanced Configuration Address Mapping", p. 677). There is no change to functionality. Suggested-by: Bjorn Helgaas Signed-off-by: Krzysztof WilczyƄski --- Changed in v5: Removed unused constant "PCIE_ECAM_DEV_SHIFT". Refactored ppc4xx_pciex_get_config_base() so that the "offset" parameter can be passed to so that the PCIE_ECAM_OFFSET() macro can be used. Used the ALIGN_DOWN() macro where 32 bit alignment is required instead using the 0xffc mask. Added CFG_ADDR_CFG_TYPE_1 macro to pci/controller/pcie-iproc.c to denote that this is a configuration type 1 address and access type. Refactored boundary check in pci/controller/vmd.c as used by the vmd_cfg_addr() function following addition of the PCIE_ECAM_OFFSET() macro. Changed the "bus->number" to simply pass the "bus" argument in the PCIE_ECAM_OFFSET() macro. Changed in v4: Removed constants related to "CAM". Added more platforms and devices that can use new ECAM macros and constants. Removed unused ".bus_shift" initialisers from pci-xgene.c as xgene_pcie_map_bus() did not use these. Changes in v3: Updated commit message wording. Updated regarding custom ECAM bus shift values and concerning PCI base configuration space access for Type 1 access. Refactored rockchip_pcie_rd_other_conf() and rockchip_pcie_wr_other_conf() and removed the "busdev" variable. Removed surplus "relbus" variable from nwl_pcie_map_bus() and xilinx_pcie_map_bus(). Renamed the PCIE_ECAM_ADDR() macro to PCIE_ECAM_OFFSET(). Changes in v2: Use PCIE_ECAM_ADDR macro when computing ECAM address offset, but drop PCI_SLOT and PCI_FUNC macros from the PCIE_ECAM_ADDR macro in favour of using a single value for the device/function. arch/powerpc/platforms/4xx/pci.c | 30 ++++++++++---------- drivers/pci/controller/dwc/pcie-al.c | 13 ++------- drivers/pci/controller/dwc/pcie-hisi.c | 4 +-- drivers/pci/controller/pci-aardvark.c | 13 ++------- drivers/pci/controller/pci-host-generic.c | 2 +- drivers/pci/controller/pci-thunder-ecam.c | 2 +- drivers/pci/controller/pci-thunder-pem.c | 13 +++++++-- drivers/pci/controller/pci-xgene.c | 2 -- drivers/pci/controller/pcie-brcmstb.c | 16 ++--------- drivers/pci/controller/pcie-iproc.c | 31 ++++++--------------- drivers/pci/controller/pcie-rockchip-host.c | 27 +++++++++--------- drivers/pci/controller/pcie-rockchip.h | 8 +----- drivers/pci/controller/pcie-tango.c | 2 +- drivers/pci/controller/pcie-xilinx-nwl.c | 9 ++---- drivers/pci/controller/pcie-xilinx.c | 11 ++------ drivers/pci/controller/vmd.c | 19 ++++++------- drivers/pci/ecam.c | 4 +-- include/linux/pci-ecam.h | 23 +++++++++++++++ 18 files changed, 99 insertions(+), 130 deletions(-) diff --git a/arch/powerpc/platforms/4xx/pci.c b/arch/powerpc/platforms/4xx/pci.c index c13d64c3b019..4f3c529ef3b9 100644 --- a/arch/powerpc/platforms/4xx/pci.c +++ b/arch/powerpc/platforms/4xx/pci.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -1583,9 +1584,10 @@ static int ppc4xx_pciex_validate_bdf(struct ppc4xx_pciex_port *port, static void __iomem *ppc4xx_pciex_get_config_base(struct ppc4xx_pciex_port *port, struct pci_bus *bus, - unsigned int devfn) + unsigned int devfn, + int offset) { - int relbus; + unsigned int busnr_ecam = bus->number - (port->hose->first_busno + 1); /* Remove the casts when we finally remove the stupid volatile * in struct pci_controller @@ -1593,9 +1595,7 @@ static void __iomem *ppc4xx_pciex_get_config_base(struct ppc4xx_pciex_port *port if (bus->number == port->hose->first_busno) return (void __iomem *)port->hose->cfg_addr; - relbus = bus->number - (port->hose->first_busno + 1); - return (void __iomem *)port->hose->cfg_data + - ((relbus << 20) | (devfn << 12)); + return port->hose->cfg_data + PCIE_ECAM_OFFSET(busnr_ecam, devfn, offset); } static int ppc4xx_pciex_read_config(struct pci_bus *bus, unsigned int devfn, @@ -1612,7 +1612,7 @@ static int ppc4xx_pciex_read_config(struct pci_bus *bus, unsigned int devfn, if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0) return PCIBIOS_DEVICE_NOT_FOUND; - addr = ppc4xx_pciex_get_config_base(port, bus, devfn); + addr = ppc4xx_pciex_get_config_base(port, bus, devfn, offset); /* * Reading from configuration space of non-existing device can @@ -1627,20 +1627,20 @@ static int ppc4xx_pciex_read_config(struct pci_bus *bus, unsigned int devfn, switch (len) { case 1: - *val = in_8((u8 *)(addr + offset)); + *val = in_8((u8 *)addr); break; case 2: - *val = in_le16((u16 *)(addr + offset)); + *val = in_le16((u16 *)addr); break; default: - *val = in_le32((u32 *)(addr + offset)); + *val = in_le32((u32 *)addr); break; } pr_debug("pcie-config-read: bus=%3d [%3d..%3d] devfn=0x%04x" " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n", bus->number, hose->first_busno, hose->last_busno, - devfn, offset, len, addr + offset, *val); + devfn, offset, len, addr, *val); /* Check for CRS (440SPe rev B does that for us but heh ..) */ if (in_be32(port->utl_base + PEUTL_RCSTA) & 0x00040000) { @@ -1667,7 +1667,7 @@ static int ppc4xx_pciex_write_config(struct pci_bus *bus, unsigned int devfn, if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0) return PCIBIOS_DEVICE_NOT_FOUND; - addr = ppc4xx_pciex_get_config_base(port, bus, devfn); + addr = ppc4xx_pciex_get_config_base(port, bus, devfn, offset); /* * Reading from configuration space of non-existing device can @@ -1680,17 +1680,17 @@ static int ppc4xx_pciex_write_config(struct pci_bus *bus, unsigned int devfn, pr_debug("pcie-config-write: bus=%3d [%3d..%3d] devfn=0x%04x" " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n", bus->number, hose->first_busno, hose->last_busno, - devfn, offset, len, addr + offset, val); + devfn, offset, len, addr, val); switch (len) { case 1: - out_8((u8 *)(addr + offset), val); + out_8((u8 *)addr, val); break; case 2: - out_le16((u16 *)(addr + offset), val); + out_le16((u16 *)addr, val); break; default: - out_le32((u32 *)(addr + offset), val); + out_le32((u32 *)addr, val); break; } diff --git a/drivers/pci/controller/dwc/pcie-al.c b/drivers/pci/controller/dwc/pcie-al.c index f973fbca90cf..979d93b82df2 100644 --- a/drivers/pci/controller/dwc/pcie-al.c +++ b/drivers/pci/controller/dwc/pcie-al.c @@ -76,7 +76,7 @@ static int al_pcie_init(struct pci_config_window *cfg) } const struct pci_ecam_ops al_pcie_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .init = al_pcie_init, .pci_ops = { .map_bus = al_pcie_map_bus, @@ -138,8 +138,6 @@ struct al_pcie { struct al_pcie_target_bus_cfg target_bus_cfg; }; -#define PCIE_ECAM_DEVFN(x) (((x) & 0xff) << 12) - #define to_al_pcie(x) dev_get_drvdata((x)->dev) static inline u32 al_pcie_controller_readl(struct al_pcie *pcie, u32 offset) @@ -226,11 +224,6 @@ static void __iomem *al_pcie_conf_addr_map_bus(struct pci_bus *bus, struct al_pcie_target_bus_cfg *target_bus_cfg = &pcie->target_bus_cfg; unsigned int busnr_ecam = busnr & target_bus_cfg->ecam_mask; unsigned int busnr_reg = busnr & target_bus_cfg->reg_mask; - void __iomem *pci_base_addr; - - pci_base_addr = (void __iomem *)((uintptr_t)pp->va_cfg0_base + - (busnr_ecam << 20) + - PCIE_ECAM_DEVFN(devfn)); if (busnr_reg != target_bus_cfg->reg_val) { dev_dbg(pcie->pci->dev, "Changing target bus busnum val from 0x%x to 0x%x\n", @@ -241,7 +234,7 @@ static void __iomem *al_pcie_conf_addr_map_bus(struct pci_bus *bus, target_bus_cfg->reg_mask); } - return pci_base_addr + where; + return pp->va_cfg0_base + PCIE_ECAM_OFFSET(busnr_ecam, devfn, where); } static struct pci_ops al_child_pci_ops = { @@ -264,7 +257,7 @@ static void al_pcie_config_prepare(struct al_pcie *pcie) target_bus_cfg = &pcie->target_bus_cfg; - ecam_bus_mask = (pcie->ecam_size >> 20) - 1; + ecam_bus_mask = (pcie->ecam_size >> PCIE_ECAM_BUS_SHIFT) - 1; if (ecam_bus_mask > 255) { dev_warn(pcie->dev, "ECAM window size is larger than 256MB. Cutting off at 256\n"); ecam_bus_mask = 255; diff --git a/drivers/pci/controller/dwc/pcie-hisi.c b/drivers/pci/controller/dwc/pcie-hisi.c index 5ca86796d43a..b7afbf1d4bd9 100644 --- a/drivers/pci/controller/dwc/pcie-hisi.c +++ b/drivers/pci/controller/dwc/pcie-hisi.c @@ -100,7 +100,7 @@ static int hisi_pcie_init(struct pci_config_window *cfg) } const struct pci_ecam_ops hisi_pcie_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .init = hisi_pcie_init, .pci_ops = { .map_bus = hisi_pcie_map_bus, @@ -135,7 +135,7 @@ static int hisi_pcie_platform_init(struct pci_config_window *cfg) } static const struct pci_ecam_ops hisi_pcie_platform_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .init = hisi_pcie_platform_init, .pci_ops = { .map_bus = hisi_pcie_map_bus, diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c index 0be485a25327..1043e54c73bd 100644 --- a/drivers/pci/controller/pci-aardvark.c +++ b/drivers/pci/controller/pci-aardvark.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -164,14 +165,6 @@ #define PCIE_CONFIG_WR_TYPE0 0xa #define PCIE_CONFIG_WR_TYPE1 0xb -#define PCIE_CONF_BUS(bus) (((bus) & 0xff) << 20) -#define PCIE_CONF_DEV(dev) (((dev) & 0x1f) << 15) -#define PCIE_CONF_FUNC(fun) (((fun) & 0x7) << 12) -#define PCIE_CONF_REG(reg) ((reg) & 0xffc) -#define PCIE_CONF_ADDR(bus, devfn, where) \ - (PCIE_CONF_BUS(bus) | PCIE_CONF_DEV(PCI_SLOT(devfn)) | \ - PCIE_CONF_FUNC(PCI_FUNC(devfn)) | PCIE_CONF_REG(where)) - #define PIO_RETRY_CNT 500 #define PIO_RETRY_DELAY 2 /* 2 us*/ @@ -687,7 +680,7 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn, advk_writel(pcie, reg, PIO_CTRL); /* Program the address registers */ - reg = PCIE_CONF_ADDR(bus->number, devfn, where); + reg = ALIGN_DOWN(PCIE_ECAM_OFFSET(bus->number, devfn, where), 4); advk_writel(pcie, reg, PIO_ADDR_LS); advk_writel(pcie, 0, PIO_ADDR_MS); @@ -748,7 +741,7 @@ static int advk_pcie_wr_conf(struct pci_bus *bus, u32 devfn, advk_writel(pcie, reg, PIO_CTRL); /* Program the address registers */ - reg = PCIE_CONF_ADDR(bus->number, devfn, where); + reg = ALIGN_DOWN(PCIE_ECAM_OFFSET(bus->number, devfn, where), 4); advk_writel(pcie, reg, PIO_ADDR_LS); advk_writel(pcie, 0, PIO_ADDR_MS); diff --git a/drivers/pci/controller/pci-host-generic.c b/drivers/pci/controller/pci-host-generic.c index b51977abfdf1..c1c69b11615f 100644 --- a/drivers/pci/controller/pci-host-generic.c +++ b/drivers/pci/controller/pci-host-generic.c @@ -49,7 +49,7 @@ static void __iomem *pci_dw_ecam_map_bus(struct pci_bus *bus, } static const struct pci_ecam_ops pci_dw_ecam_bus_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_dw_ecam_map_bus, .read = pci_generic_config_read, diff --git a/drivers/pci/controller/pci-thunder-ecam.c b/drivers/pci/controller/pci-thunder-ecam.c index 7e8835fee5f7..22ed7e995b39 100644 --- a/drivers/pci/controller/pci-thunder-ecam.c +++ b/drivers/pci/controller/pci-thunder-ecam.c @@ -346,7 +346,7 @@ static int thunder_ecam_config_write(struct pci_bus *bus, unsigned int devfn, } const struct pci_ecam_ops pci_thunder_ecam_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_ecam_map_bus, .read = thunder_ecam_config_read, diff --git a/drivers/pci/controller/pci-thunder-pem.c b/drivers/pci/controller/pci-thunder-pem.c index 3f847969143e..1a3f70ac61fc 100644 --- a/drivers/pci/controller/pci-thunder-pem.c +++ b/drivers/pci/controller/pci-thunder-pem.c @@ -19,6 +19,15 @@ #define PEM_CFG_WR 0x28 #define PEM_CFG_RD 0x30 +/* + * Enhanced Configuration Access Mechanism (ECAM) + * + * N.B. This is a non-standard platform-specific ECAM bus shift value. For + * standard values defined in the PCI Express Base Specification see + * include/linux/pci-ecam.h. + */ +#define THUNDER_PCIE_ECAM_BUS_SHIFT 24 + struct thunder_pem_pci { u32 ea_entry[3]; void __iomem *pem_reg_base; @@ -404,7 +413,7 @@ static int thunder_pem_acpi_init(struct pci_config_window *cfg) } const struct pci_ecam_ops thunder_pem_ecam_ops = { - .bus_shift = 24, + .bus_shift = THUNDER_PCIE_ECAM_BUS_SHIFT, .init = thunder_pem_acpi_init, .pci_ops = { .map_bus = pci_ecam_map_bus, @@ -441,7 +450,7 @@ static int thunder_pem_platform_init(struct pci_config_window *cfg) } static const struct pci_ecam_ops pci_thunder_pem_ops = { - .bus_shift = 24, + .bus_shift = THUNDER_PCIE_ECAM_BUS_SHIFT, .init = thunder_pem_platform_init, .pci_ops = { .map_bus = pci_ecam_map_bus, diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c index 8e0db84f089d..85e7c98265e8 100644 --- a/drivers/pci/controller/pci-xgene.c +++ b/drivers/pci/controller/pci-xgene.c @@ -257,7 +257,6 @@ static int xgene_v1_pcie_ecam_init(struct pci_config_window *cfg) } const struct pci_ecam_ops xgene_v1_pcie_ecam_ops = { - .bus_shift = 16, .init = xgene_v1_pcie_ecam_init, .pci_ops = { .map_bus = xgene_pcie_map_bus, @@ -272,7 +271,6 @@ static int xgene_v2_pcie_ecam_init(struct pci_config_window *cfg) } const struct pci_ecam_ops xgene_v2_pcie_ecam_ops = { - .bus_shift = 16, .init = xgene_v2_pcie_ecam_init, .pci_ops = { .map_bus = xgene_pcie_map_bus, diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c index bea86899bd5d..7fc80fd6f13f 100644 --- a/drivers/pci/controller/pcie-brcmstb.c +++ b/drivers/pci/controller/pcie-brcmstb.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -127,11 +128,7 @@ #define MSI_INT_MASK_CLR 0x14 #define PCIE_EXT_CFG_DATA 0x8000 - #define PCIE_EXT_CFG_INDEX 0x9000 -#define PCIE_EXT_BUSNUM_SHIFT 20 -#define PCIE_EXT_SLOT_SHIFT 15 -#define PCIE_EXT_FUNC_SHIFT 12 #define PCIE_RGR1_SW_INIT_1_PERST_MASK 0x1 #define PCIE_RGR1_SW_INIT_1_PERST_SHIFT 0x0 @@ -695,15 +692,6 @@ static bool brcm_pcie_link_up(struct brcm_pcie *pcie) return dla && plu; } -/* Configuration space read/write support */ -static inline int brcm_pcie_cfg_index(int busnr, int devfn, int reg) -{ - return ((PCI_SLOT(devfn) & 0x1f) << PCIE_EXT_SLOT_SHIFT) - | ((PCI_FUNC(devfn) & 0x07) << PCIE_EXT_FUNC_SHIFT) - | (busnr << PCIE_EXT_BUSNUM_SHIFT) - | (reg & ~3); -} - static void __iomem *brcm_pcie_map_conf(struct pci_bus *bus, unsigned int devfn, int where) { @@ -716,7 +704,7 @@ static void __iomem *brcm_pcie_map_conf(struct pci_bus *bus, unsigned int devfn, return PCI_SLOT(devfn) ? NULL : base + where; /* For devices, write to the config space index register */ - idx = brcm_pcie_cfg_index(bus->number, devfn, 0); + idx = PCIE_ECAM_OFFSET(bus->number, devfn, 0); writel(idx, pcie->base + PCIE_EXT_CFG_INDEX); return base + PCIE_EXT_CFG_DATA + where; } diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c index 905e93808243..503662380ff8 100644 --- a/drivers/pci/controller/pcie-iproc.c +++ b/drivers/pci/controller/pcie-iproc.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -39,16 +40,8 @@ #define CFG_IND_ADDR_MASK 0x00001ffc -#define CFG_ADDR_BUS_NUM_SHIFT 20 -#define CFG_ADDR_BUS_NUM_MASK 0x0ff00000 -#define CFG_ADDR_DEV_NUM_SHIFT 15 -#define CFG_ADDR_DEV_NUM_MASK 0x000f8000 -#define CFG_ADDR_FUNC_NUM_SHIFT 12 -#define CFG_ADDR_FUNC_NUM_MASK 0x00007000 -#define CFG_ADDR_REG_NUM_SHIFT 2 #define CFG_ADDR_REG_NUM_MASK 0x00000ffc -#define CFG_ADDR_CFG_TYPE_SHIFT 0 -#define CFG_ADDR_CFG_TYPE_MASK 0x00000003 +#define CFG_ADDR_CFG_TYPE_1 1 #define SYS_RC_INTX_MASK 0xf @@ -459,19 +452,15 @@ static inline void iproc_pcie_apb_err_disable(struct pci_bus *bus, static void __iomem *iproc_pcie_map_ep_cfg_reg(struct iproc_pcie *pcie, unsigned int busno, - unsigned int slot, - unsigned int fn, + unsigned int devfn, int where) { u16 offset; u32 val; /* EP device access */ - val = (busno << CFG_ADDR_BUS_NUM_SHIFT) | - (slot << CFG_ADDR_DEV_NUM_SHIFT) | - (fn << CFG_ADDR_FUNC_NUM_SHIFT) | - (where & CFG_ADDR_REG_NUM_MASK) | - (1 & CFG_ADDR_CFG_TYPE_MASK); + val = ALIGN_DOWN(PCIE_ECAM_OFFSET(busno, devfn, where), 4) | + CFG_ADDR_CFG_TYPE_1; iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_ADDR, val); offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_DATA); @@ -574,8 +563,6 @@ static int iproc_pcie_config_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val) { struct iproc_pcie *pcie = iproc_data(bus); - unsigned int slot = PCI_SLOT(devfn); - unsigned int fn = PCI_FUNC(devfn); unsigned int busno = bus->number; void __iomem *cfg_data_p; unsigned int data; @@ -590,7 +577,7 @@ static int iproc_pcie_config_read(struct pci_bus *bus, unsigned int devfn, return ret; } - cfg_data_p = iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where); + cfg_data_p = iproc_pcie_map_ep_cfg_reg(pcie, busno, devfn, where); if (!cfg_data_p) return PCIBIOS_DEVICE_NOT_FOUND; @@ -631,13 +618,11 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie, int busno, unsigned int devfn, int where) { - unsigned slot = PCI_SLOT(devfn); - unsigned fn = PCI_FUNC(devfn); u16 offset; /* root complex access */ if (busno == 0) { - if (slot > 0 || fn > 0) + if (PCIE_ECAM_DEVFN(devfn) > 0) return NULL; iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR, @@ -649,7 +634,7 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie, return (pcie->base + offset); } - return iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where); + return iproc_pcie_map_ep_cfg_reg(pcie, busno, devfn, where); } static void __iomem *iproc_pcie_bus_map_cfg_bus(struct pci_bus *bus, diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c index 9705059523a6..f1d08a1b1591 100644 --- a/drivers/pci/controller/pcie-rockchip-host.c +++ b/drivers/pci/controller/pcie-rockchip-host.c @@ -157,12 +157,11 @@ static int rockchip_pcie_rd_other_conf(struct rockchip_pcie *rockchip, struct pci_bus *bus, u32 devfn, int where, int size, u32 *val) { - u32 busdev; + void __iomem *addr; - busdev = PCIE_ECAM_ADDR(bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where); + addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); - if (!IS_ALIGNED(busdev, size)) { + if (!IS_ALIGNED((uintptr_t)addr, size)) { *val = 0; return PCIBIOS_BAD_REGISTER_NUMBER; } @@ -175,11 +174,11 @@ static int rockchip_pcie_rd_other_conf(struct rockchip_pcie *rockchip, AXI_WRAPPER_TYPE1_CFG); if (size == 4) { - *val = readl(rockchip->reg_base + busdev); + *val = readl(addr); } else if (size == 2) { - *val = readw(rockchip->reg_base + busdev); + *val = readw(addr); } else if (size == 1) { - *val = readb(rockchip->reg_base + busdev); + *val = readb(addr); } else { *val = 0; return PCIBIOS_BAD_REGISTER_NUMBER; @@ -191,11 +190,11 @@ static int rockchip_pcie_wr_other_conf(struct rockchip_pcie *rockchip, struct pci_bus *bus, u32 devfn, int where, int size, u32 val) { - u32 busdev; + void __iomem *addr; - busdev = PCIE_ECAM_ADDR(bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where); - if (!IS_ALIGNED(busdev, size)) + addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); + + if (!IS_ALIGNED((uintptr_t)addr, size)) return PCIBIOS_BAD_REGISTER_NUMBER; if (pci_is_root_bus(bus->parent)) @@ -206,11 +205,11 @@ static int rockchip_pcie_wr_other_conf(struct rockchip_pcie *rockchip, AXI_WRAPPER_TYPE1_CFG); if (size == 4) - writel(val, rockchip->reg_base + busdev); + writel(val, addr); else if (size == 2) - writew(val, rockchip->reg_base + busdev); + writew(val, addr); else if (size == 1) - writeb(val, rockchip->reg_base + busdev); + writeb(val, addr); else return PCIBIOS_BAD_REGISTER_NUMBER; diff --git a/drivers/pci/controller/pcie-rockchip.h b/drivers/pci/controller/pcie-rockchip.h index c7d0178fc8c2..1650a5087450 100644 --- a/drivers/pci/controller/pcie-rockchip.h +++ b/drivers/pci/controller/pcie-rockchip.h @@ -13,6 +13,7 @@ #include #include +#include /* * The upper 16 bits of PCIE_CLIENT_CONFIG are a write mask for the lower 16 @@ -178,13 +179,6 @@ #define MIN_AXI_ADDR_BITS_PASSED 8 #define PCIE_RC_SEND_PME_OFF 0x11960 #define ROCKCHIP_VENDOR_ID 0x1d87 -#define PCIE_ECAM_BUS(x) (((x) & 0xff) << 20) -#define PCIE_ECAM_DEV(x) (((x) & 0x1f) << 15) -#define PCIE_ECAM_FUNC(x) (((x) & 0x7) << 12) -#define PCIE_ECAM_REG(x) (((x) & 0xfff) << 0) -#define PCIE_ECAM_ADDR(bus, dev, func, reg) \ - (PCIE_ECAM_BUS(bus) | PCIE_ECAM_DEV(dev) | \ - PCIE_ECAM_FUNC(func) | PCIE_ECAM_REG(reg)) #define PCIE_LINK_IS_L2(x) \ (((x) & PCIE_CLIENT_DEBUG_LTSSM_MASK) == PCIE_CLIENT_DEBUG_LTSSM_L2) #define PCIE_LINK_UP(x) \ diff --git a/drivers/pci/controller/pcie-tango.c b/drivers/pci/controller/pcie-tango.c index d093a8ce4bb1..8f0d695afbde 100644 --- a/drivers/pci/controller/pcie-tango.c +++ b/drivers/pci/controller/pcie-tango.c @@ -208,7 +208,7 @@ static int smp8759_config_write(struct pci_bus *bus, unsigned int devfn, } static const struct pci_ecam_ops smp8759_ecam_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_ecam_map_bus, .read = smp8759_config_read, diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c index f3cf7d61924f..7f29c2fdcd51 100644 --- a/drivers/pci/controller/pcie-xilinx-nwl.c +++ b/drivers/pci/controller/pcie-xilinx-nwl.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -124,8 +125,6 @@ #define E_ECAM_CR_ENABLE BIT(0) #define E_ECAM_SIZE_LOC GENMASK(20, 16) #define E_ECAM_SIZE_SHIFT 16 -#define ECAM_BUS_LOC_SHIFT 20 -#define ECAM_DEV_LOC_SHIFT 12 #define NWL_ECAM_VALUE_DEFAULT 12 #define CFG_DMA_REG_BAR GENMASK(2, 0) @@ -240,15 +239,11 @@ static void __iomem *nwl_pcie_map_bus(struct pci_bus *bus, unsigned int devfn, int where) { struct nwl_pcie *pcie = bus->sysdata; - int relbus; if (!nwl_pcie_valid_device(bus, devfn)) return NULL; - relbus = (bus->number << ECAM_BUS_LOC_SHIFT) | - (devfn << ECAM_DEV_LOC_SHIFT); - - return pcie->ecam_base + relbus + where; + return pcie->ecam_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); } /* PCIe operations */ diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c index 8523be61bba5..fa5baeb82653 100644 --- a/drivers/pci/controller/pcie-xilinx.c +++ b/drivers/pci/controller/pcie-xilinx.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include "../pci.h" @@ -86,10 +87,6 @@ /* Phy Status/Control Register definitions */ #define XILINX_PCIE_REG_PSCR_LNKUP BIT(11) -/* ECAM definitions */ -#define ECAM_BUS_NUM_SHIFT 20 -#define ECAM_DEV_NUM_SHIFT 12 - /* Number of MSI IRQs */ #define XILINX_NUM_MSI_IRQS 128 @@ -183,15 +180,11 @@ static void __iomem *xilinx_pcie_map_bus(struct pci_bus *bus, unsigned int devfn, int where) { struct xilinx_pcie_port *port = bus->sysdata; - int relbus; if (!xilinx_pcie_valid_device(bus, devfn)) return NULL; - relbus = (bus->number << ECAM_BUS_NUM_SHIFT) | - (devfn << ECAM_DEV_NUM_SHIFT); - - return port->reg_base + relbus + where; + return port->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); } /* PCIe operations */ diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index f375c21ceeb1..59fa9a94860f 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -94,7 +95,7 @@ struct vmd_dev { struct pci_dev *dev; spinlock_t cfg_lock; - char __iomem *cfgbar; + void __iomem *cfgbar; int msix_count; struct vmd_irq_list *irqs; @@ -325,18 +326,16 @@ static void vmd_remove_irq_domain(struct vmd_dev *vmd) } } -static char __iomem *vmd_cfg_addr(struct vmd_dev *vmd, struct pci_bus *bus, +static void __iomem *vmd_cfg_addr(struct vmd_dev *vmd, struct pci_bus *bus, unsigned int devfn, int reg, int len) { - char __iomem *addr = vmd->cfgbar + - ((bus->number - vmd->busn_start) << 20) + - (devfn << 12) + reg; + unsigned int busnr_ecam = bus->number - vmd->busn_start; + u32 offset = PCIE_ECAM_OFFSET(busnr_ecam, devfn, reg); - if ((addr - vmd->cfgbar) + len >= - resource_size(&vmd->dev->resource[VMD_CFGBAR])) + if (offset + len >= resource_size(&vmd->dev->resource[VMD_CFGBAR])) return NULL; - return addr; + return vmd->cfgbar + offset; } /* @@ -347,7 +346,7 @@ static int vmd_pci_read(struct pci_bus *bus, unsigned int devfn, int reg, int len, u32 *value) { struct vmd_dev *vmd = vmd_from_bus(bus); - char __iomem *addr = vmd_cfg_addr(vmd, bus, devfn, reg, len); + void __iomem *addr = vmd_cfg_addr(vmd, bus, devfn, reg, len); unsigned long flags; int ret = 0; @@ -382,7 +381,7 @@ static int vmd_pci_write(struct pci_bus *bus, unsigned int devfn, int reg, int len, u32 value) { struct vmd_dev *vmd = vmd_from_bus(bus); - char __iomem *addr = vmd_cfg_addr(vmd, bus, devfn, reg, len); + void __iomem *addr = vmd_cfg_addr(vmd, bus, devfn, reg, len); unsigned long flags; int ret = 0; diff --git a/drivers/pci/ecam.c b/drivers/pci/ecam.c index b54d32a31669..1e0229765349 100644 --- a/drivers/pci/ecam.c +++ b/drivers/pci/ecam.c @@ -149,7 +149,7 @@ EXPORT_SYMBOL_GPL(pci_ecam_map_bus); /* ECAM ops */ const struct pci_ecam_ops pci_generic_ecam_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_ecam_map_bus, .read = pci_generic_config_read, @@ -161,7 +161,7 @@ EXPORT_SYMBOL_GPL(pci_generic_ecam_ops); #if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS) /* ECAM ops for 32-bit access only (non-compliant) */ const struct pci_ecam_ops pci_32b_ops = { - .bus_shift = 20, + .bus_shift = PCIE_ECAM_BUS_SHIFT, .pci_ops = { .map_bus = pci_ecam_map_bus, .read = pci_generic_config_read32, diff --git a/include/linux/pci-ecam.h b/include/linux/pci-ecam.h index 033ce74f02e8..9767922461ca 100644 --- a/include/linux/pci-ecam.h +++ b/include/linux/pci-ecam.h @@ -9,6 +9,29 @@ #include #include +/* + * Memory address shift values for the byte-level address that + * can be used when accessing the PCI Express Configuration Space. + */ + +/* + * Enhanced Configuration Access Mechanism (ECAM) + * + * See PCI Express Base Specification, Revision 5.0, Version 1.0, + * Section 7.2.2, Table 7-1, p. 677. + */ +#define PCIE_ECAM_BUS_SHIFT 20 /* Bus Number */ +#define PCIE_ECAM_DEVFN_SHIFT 12 /* Device and Function Number */ + +#define PCIE_ECAM_BUS(x) (((x) & 0xff) << PCIE_ECAM_BUS_SHIFT) +#define PCIE_ECAM_DEVFN(x) (((x) & 0xff) << PCIE_ECAM_DEVFN_SHIFT) +#define PCIE_ECAM_REG(x) ((x) & 0xfff) + +#define PCIE_ECAM_OFFSET(bus, devfn, where) \ + (PCIE_ECAM_BUS(bus) | \ + PCIE_ECAM_DEVFN(devfn) | \ + PCIE_ECAM_REG(where)) + /* * struct to hold pci ops and bus shift of the config window * for a PCI controller. -- 2.29.2 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=-16.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 851ACC2D0E4 for ; Fri, 27 Nov 2020 10:48:44 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 EE99D205F4 for ; Fri, 27 Nov 2020 10:48:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="SEChj/3R" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EE99D205F4 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=linux.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=Fzw14eHPgZkhoQxnXcRShfaL6spbLQmEJ9ENgXYweLo=; b=SEChj/3R33v2WiPj3OixCf5Tsw ifCVefy0ecrhuiptM6e34rtPKCr058wh9Ma+8iur8tf2uTKr/1I7C3cVY+JbBjQutUNfVuj9a/92T 9pNX/mu7qnoDyJVBo2POQzBzcVHuHogACKuykBB6l1lRIzIT+xrg/rY03ZiPfHK+cifJyfESmEjg5 MJycupMKzKRTz1sNSxQeXtCQNHKvx5qi09uNvsPHgETYI1VSxu0tKrnIQowWu8YIRwOjFn9RKkrpi KiOd77r1x+kzUCQ7h96xfVslHBbfcJ6lChndZ1TlrMoypjOFZl4QXa6RXDecL8r/ASwOixzTncXV5 bkO19G+g==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kibHB-0002mw-NX; Fri, 27 Nov 2020 10:46:53 +0000 Received: from mail-pl1-f195.google.com ([209.85.214.195]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kibH7-0002m0-U3; Fri, 27 Nov 2020 10:46:52 +0000 Received: by mail-pl1-f195.google.com with SMTP id l1so2518748pld.5; Fri, 27 Nov 2020 02:46:45 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=/ofhNQSHG3WAD/AojJeiQwmlt67hb9Caduex5mipx9k=; b=qNZFEVsFjdtHjhTVivYA3xCW4KPzWEjAmgy2Iub4l3un+N8K6vO/1vhx57De2TM++D bfLRz0HeRygTks/OuWxUOrdEzQQdR5oY/XGUsXatlVBLGmim9bkbZCB+JETucHe0LeQ2 NdCeONaDX4mKMaauEYYLMPaDAnUT4REjUisP/opPzpfOzCZFLlJDmHh8iKUAaQiur2V1 pfS2nk3mec+2xSldPsGnRL1inW7jCL3hFqPNh4v2NC3pohL7zlZWNRCrt1eFo45mEMqh yieqIKuQJ7NxD1G0uOd7D579g1r1Q6XuDCTAcPzDOCyKTFCz3RrFKBm8/7B6YSZAoRf1 v6Yg== X-Gm-Message-State: AOAM5308zalECwOZciNQM5/Mt2IqR7EQqwLN+z7LRF+ppZIg/xC5dC45 FLmlHVThyt+UUC7Hv8e3CAQ= X-Google-Smtp-Source: ABdhPJxHqGQQEytKXoVDsUeGv6IYcQ2xpnElpAMxdcC+3X4fRm/f7wqyqiJBwbLDhUDt3fZBfILO6w== X-Received: by 2002:a17:902:820e:b029:d6:e802:75aa with SMTP id x14-20020a170902820eb02900d6e80275aamr6214785pln.51.1606474004147; Fri, 27 Nov 2020 02:46:44 -0800 (PST) Received: from workstation.lan ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id v22sm7161494pff.48.2020.11.27.02.46.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Nov 2020 02:46:43 -0800 (PST) From: =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= To: Bjorn Helgaas Subject: [PATCH v5] PCI: Unify ECAM constants in native PCI Express drivers Date: Fri, 27 Nov 2020 10:46:26 +0000 Message-Id: <20201127104626.3979165-1-kw@linux.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201127_054650_030947_66E972F9 X-CRM114-Status: GOOD ( 26.80 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Heiko Stuebner , Benjamin Herrenschmidt , Shawn Lin , Paul Mackerras , Thomas Petazzoni , Jonathan Chocron , Toan Le , Will Deacon , Rob Herring , Lorenzo Pieralisi , Michael Ellerman , Michal Simek , linux-rockchip@lists.infradead.org, bcm-kernel-feedback-list@broadcom.com, Jonathan Derrick , linux-pci@vger.kernel.org, Ray Jui , Florian Fainelli , linux-rpi-kernel@lists.infradead.org, Jonathan Cameron , linux-arm-kernel@lists.infradead.org, Scott Branden , Zhou Wang , Robert Richter , linuxppc-dev@lists.ozlabs.org, Nicolas Saenz Julienne Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org VW5pZnkgRUNBTS1yZWxhdGVkIGNvbnN0YW50cyBpbnRvIGEgc2luZ2xlIHNldCBvZiBzdGFuZGFy ZCBjb25zdGFudHMKZGVmaW5pbmcgbWVtb3J5IGFkZHJlc3Mgc2hpZnQgdmFsdWVzIGZvciB0aGUg Ynl0ZS1sZXZlbCBhZGRyZXNzIHRoYXQgY2FuCmJlIHVzZWQgd2hlbiBhY2Nlc3NpbmcgdGhlIFBD SSBFeHByZXNzIENvbmZpZ3VyYXRpb24gU3BhY2UsIGFuZCB0aGVuCm1vdmUgbmF0aXZlIFBDSSBF eHByZXNzIGNvbnRyb2xsZXIgZHJpdmVycyB0byB1c2UgbmV3bHkgaW50cm9kdWNlZApkZWZpbml0 aW9ucyByZXRpcmluZyBhbnkgZHJpdmVyLXNwZWNpZmljIG9uZXMuCgpUaGUgRUNBTSAoIkVuaGFu Y2VkIENvbmZpZ3VyYXRpb24gQWNjZXNzIE1lY2hhbmlzbSIpIGlzIGRlZmluZWQgYnkgdGhlClBD SSBFeHByZXNzIHNwZWNpZmljYXRpb24gKHNlZSBQQ0kgRXhwcmVzcyBCYXNlIFNwZWNpZmljYXRp b24sIFJldmlzaW9uCjUuMCwgVmVyc2lvbiAxLjAsIFNlY3Rpb24gNy4yLjIsIHAuIDY3NiksIHRo dXMgbW9zdCBoYXJkd2FyZSBzaG91bGQKaW1wbGVtZW50IGl0IHRoZSBzYW1lIHdheS4gIE1vc3Qg b2YgdGhlIG5hdGl2ZSBQQ0kgRXhwcmVzcyBjb250cm9sbGVyCmRyaXZlcnMgZGVmaW5lIHRoZWly IEVDQU0tcmVsYXRlZCBjb25zdGFudHMsIG1hbnkgb2YgdGhlc2UgY291bGQgYmUKc2hhcmVkLCBv ciB1c2Ugb3Blbi1jb2RlZCB2YWx1ZXMgd2hlbiBzZXR0aW5nIHRoZSAuYnVzX3NoaWZ0IGZpZWxk IG9mCnRoZSBzdHJ1Y3QgcGNpX2VjYW1fb3BzLgoKQWxsIG9mIHRoZSBuZXdseSBhZGRlZCBjb25z dGFudHMgc2hvdWxkIHJlbW92ZSBhbWJpZ3VpdHkgYW5kIHJlZHVjZSB0aGUKbnVtYmVyIG9mIG9w ZW4tY29kZWQgdmFsdWVzLCBhbmQgYWxzbyBjb3JyZWxhdGUgbW9yZSBzdHJvbmdseSB3aXRoIHRo ZQpkZXNjcmlwdGlvbnMgaW4gdGhlIGFmb3JlbWVudGlvbmVkIHNwZWNpZmljYXRpb24gKHNlZSBU YWJsZSA3LTEKIkVuaGFuY2VkIENvbmZpZ3VyYXRpb24gQWRkcmVzcyBNYXBwaW5nIiwgcC4gNjc3 KS4KClRoZXJlIGlzIG5vIGNoYW5nZSB0byBmdW5jdGlvbmFsaXR5LgoKU3VnZ2VzdGVkLWJ5OiBC am9ybiBIZWxnYWFzIDxiaGVsZ2Fhc0Bnb29nbGUuY29tPgpTaWduZWQtb2ZmLWJ5OiBLcnp5c3p0 b2YgV2lsY3p5xYRza2kgPGt3QGxpbnV4LmNvbT4KLS0tCkNoYW5nZWQgaW4gdjU6CiAgUmVtb3Zl ZCB1bnVzZWQgY29uc3RhbnQgIlBDSUVfRUNBTV9ERVZfU0hJRlQiLgogIFJlZmFjdG9yZWQgcHBj NHh4X3BjaWV4X2dldF9jb25maWdfYmFzZSgpIHNvIHRoYXQgdGhlICJvZmZzZXQiCiAgcGFyYW1l dGVyIGNhbiBiZSBwYXNzZWQgdG8gc28gdGhhdCB0aGUgUENJRV9FQ0FNX09GRlNFVCgpIG1hY3Jv CiAgY2FuIGJlIHVzZWQuCiAgVXNlZCB0aGUgQUxJR05fRE9XTigpIG1hY3JvIHdoZXJlIDMyIGJp dCBhbGlnbm1lbnQgaXMgcmVxdWlyZWQKICBpbnN0ZWFkIHVzaW5nIHRoZSAweGZmYyBtYXNrLgog IEFkZGVkIENGR19BRERSX0NGR19UWVBFXzEgbWFjcm8gdG8gcGNpL2NvbnRyb2xsZXIvcGNpZS1p cHJvYy5jIHRvCiAgZGVub3RlIHRoYXQgdGhpcyBpcyBhIGNvbmZpZ3VyYXRpb24gdHlwZSAxIGFk ZHJlc3MgYW5kIGFjY2VzcyB0eXBlLgogIFJlZmFjdG9yZWQgYm91bmRhcnkgY2hlY2sgaW4gcGNp L2NvbnRyb2xsZXIvdm1kLmMgYXMgdXNlZCBieSB0aGUKICB2bWRfY2ZnX2FkZHIoKSBmdW5jdGlv biBmb2xsb3dpbmcgYWRkaXRpb24gb2YgdGhlIFBDSUVfRUNBTV9PRkZTRVQoKQogIG1hY3JvLgog IENoYW5nZWQgdGhlICJidXMtPm51bWJlciIgdG8gc2ltcGx5IHBhc3MgdGhlICJidXMiIGFyZ3Vt ZW50IGluIHRoZQogIFBDSUVfRUNBTV9PRkZTRVQoKSBtYWNyby4KCkNoYW5nZWQgaW4gdjQ6CiAg UmVtb3ZlZCBjb25zdGFudHMgcmVsYXRlZCB0byAiQ0FNIi4KICBBZGRlZCBtb3JlIHBsYXRmb3Jt cyBhbmQgZGV2aWNlcyB0aGF0IGNhbiB1c2UgbmV3IEVDQU0gbWFjcm9zIGFuZAogIGNvbnN0YW50 cy4KICBSZW1vdmVkIHVudXNlZCAiLmJ1c19zaGlmdCIgaW5pdGlhbGlzZXJzIGZyb20gcGNpLXhn ZW5lLmMgYXMKICB4Z2VuZV9wY2llX21hcF9idXMoKSBkaWQgbm90IHVzZSB0aGVzZS4KCkNoYW5n ZXMgaW4gdjM6CiAgVXBkYXRlZCBjb21taXQgbWVzc2FnZSB3b3JkaW5nLgogIFVwZGF0ZWQgcmVn YXJkaW5nIGN1c3RvbSBFQ0FNIGJ1cyBzaGlmdCB2YWx1ZXMgYW5kIGNvbmNlcm5pbmcgUENJIGJh c2UKICBjb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcyBmb3IgVHlwZSAxIGFjY2Vzcy4KICBSZWZh Y3RvcmVkIHJvY2tjaGlwX3BjaWVfcmRfb3RoZXJfY29uZigpIGFuZCByb2NrY2hpcF9wY2llX3dy X290aGVyX2NvbmYoKQogIGFuZCByZW1vdmVkIHRoZSAiYnVzZGV2IiB2YXJpYWJsZS4KICBSZW1v dmVkIHN1cnBsdXMgInJlbGJ1cyIgdmFyaWFibGUgZnJvbSBud2xfcGNpZV9tYXBfYnVzKCkgYW5k CiAgeGlsaW54X3BjaWVfbWFwX2J1cygpLgogIFJlbmFtZWQgdGhlIFBDSUVfRUNBTV9BRERSKCkg bWFjcm8gdG8gUENJRV9FQ0FNX09GRlNFVCgpLgoKQ2hhbmdlcyBpbiB2MjoKICBVc2UgUENJRV9F Q0FNX0FERFIgbWFjcm8gd2hlbiBjb21wdXRpbmcgRUNBTSBhZGRyZXNzIG9mZnNldCwgYnV0IGRy b3AKICBQQ0lfU0xPVCBhbmQgUENJX0ZVTkMgbWFjcm9zIGZyb20gdGhlIFBDSUVfRUNBTV9BRERS IG1hY3JvIGluIGZhdm91cgogIG9mIHVzaW5nIGEgc2luZ2xlIHZhbHVlIGZvciB0aGUgZGV2aWNl L2Z1bmN0aW9uLgoKIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jICAgICAgICAgICAg fCAzMCArKysrKysrKysrLS0tLS0tLS0tLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNp ZS1hbC5jICAgICAgICB8IDEzICsrLS0tLS0tLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2Mv cGNpZS1oaXNpLmMgICAgICB8ICA0ICstLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFy ZHZhcmsuYyAgICAgICB8IDEzICsrLS0tLS0tLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2kt aG9zdC1nZW5lcmljLmMgICB8ICAyICstCiBkcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS10aHVu ZGVyLWVjYW0uYyAgIHwgIDIgKy0KIGRyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXRodW5kZXIt cGVtLmMgICAgfCAxMyArKysrKysrLS0KIGRyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXhnZW5l LmMgICAgICAgICAgfCAgMiAtLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2llLWJyY21zdGIu YyAgICAgICB8IDE2ICsrLS0tLS0tLS0tCiBkcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtaXBy b2MuYyAgICAgICAgIHwgMzEgKysrKysrLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL3BjaS9jb250 cm9sbGVyL3BjaWUtcm9ja2NoaXAtaG9zdC5jIHwgMjcgKysrKysrKysrLS0tLS0tLS0tCiBkcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtcm9ja2NoaXAuaCAgICAgIHwgIDggKy0tLS0tCiBkcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtdGFuZ28uYyAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMv cGNpL2NvbnRyb2xsZXIvcGNpZS14aWxpbngtbndsLmMgICAgfCAgOSArKy0tLS0KIGRyaXZlcnMv cGNpL2NvbnRyb2xsZXIvcGNpZS14aWxpbnguYyAgICAgICAgfCAxMSArKy0tLS0tLQogZHJpdmVy cy9wY2kvY29udHJvbGxlci92bWQuYyAgICAgICAgICAgICAgICB8IDE5ICsrKysrKy0tLS0tLS0K IGRyaXZlcnMvcGNpL2VjYW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNCArLS0KIGlu Y2x1ZGUvbGludXgvcGNpLWVjYW0uaCAgICAgICAgICAgICAgICAgICAgfCAyMyArKysrKysrKysr KysrKysKIDE4IGZpbGVzIGNoYW5nZWQsIDk5IGluc2VydGlvbnMoKyksIDEzMCBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4eC9wY2kuYyBiL2FyY2gv cG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jCmluZGV4IGMxM2Q2NGMzYjAxOS4uNGYzYzUyOWVm M2I5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4eC9wY2kuYworKysgYi9h cmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4eC9wY2kuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5j bHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8 bGludXgvcGNpLWVjYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGlu dXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTU4Myw5ICsxNTg0LDEwIEBA IHN0YXRpYyBpbnQgcHBjNHh4X3BjaWV4X3ZhbGlkYXRlX2JkZihzdHJ1Y3QgcHBjNHh4X3BjaWV4 X3BvcnQgKnBvcnQsCiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnBwYzR4eF9wY2lleF9nZXRfY29u ZmlnX2Jhc2Uoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0LAogCQkJCQkJICBzdHJ1Y3Qg cGNpX2J1cyAqYnVzLAotCQkJCQkJICB1bnNpZ25lZCBpbnQgZGV2Zm4pCisJCQkJCQkgIHVuc2ln bmVkIGludCBkZXZmbiwKKwkJCQkJCSAgaW50IG9mZnNldCkKIHsKLQlpbnQgcmVsYnVzOworCXVu c2lnbmVkIGludCBidXNucl9lY2FtID0gYnVzLT5udW1iZXIgLSAocG9ydC0+aG9zZS0+Zmlyc3Rf YnVzbm8gKyAxKTsKIAogCS8qIFJlbW92ZSB0aGUgY2FzdHMgd2hlbiB3ZSBmaW5hbGx5IHJlbW92 ZSB0aGUgc3R1cGlkIHZvbGF0aWxlCiAJICogaW4gc3RydWN0IHBjaV9jb250cm9sbGVyCkBAIC0x NTkzLDkgKzE1OTUsNyBAQCBzdGF0aWMgdm9pZCBfX2lvbWVtICpwcGM0eHhfcGNpZXhfZ2V0X2Nv bmZpZ19iYXNlKHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydAogCWlmIChidXMtPm51bWJl ciA9PSBwb3J0LT5ob3NlLT5maXJzdF9idXNubykKIAkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilw b3J0LT5ob3NlLT5jZmdfYWRkcjsKIAotCXJlbGJ1cyA9IGJ1cy0+bnVtYmVyIC0gKHBvcnQtPmhv c2UtPmZpcnN0X2J1c25vICsgMSk7Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKilwb3J0LT5ob3Nl LT5jZmdfZGF0YSArCi0JCSgocmVsYnVzICA8PCAyMCkgfCAoZGV2Zm4gPDwgMTIpKTsKKwlyZXR1 cm4gcG9ydC0+aG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX0VDQU1fT0ZGU0VUKGJ1c25yX2VjYW0sIGRl dmZuLCBvZmZzZXQpOwogfQogCiBzdGF0aWMgaW50IHBwYzR4eF9wY2lleF9yZWFkX2NvbmZpZyhz dHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCkBAIC0xNjEyLDcgKzE2MTIs NyBAQCBzdGF0aWMgaW50IHBwYzR4eF9wY2lleF9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAq YnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCiAJaWYgKHBwYzR4eF9wY2lleF92YWxpZGF0ZV9iZGYo cG9ydCwgYnVzLCBkZXZmbikgIT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VO RDsKIAotCWFkZHIgPSBwcGM0eHhfcGNpZXhfZ2V0X2NvbmZpZ19iYXNlKHBvcnQsIGJ1cywgZGV2 Zm4pOworCWFkZHIgPSBwcGM0eHhfcGNpZXhfZ2V0X2NvbmZpZ19iYXNlKHBvcnQsIGJ1cywgZGV2 Zm4sIG9mZnNldCk7CiAKIAkvKgogCSAqIFJlYWRpbmcgZnJvbSBjb25maWd1cmF0aW9uIHNwYWNl IG9mIG5vbi1leGlzdGluZyBkZXZpY2UgY2FuCkBAIC0xNjI3LDIwICsxNjI3LDIwIEBAIHN0YXRp YyBpbnQgcHBjNHh4X3BjaWV4X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2ln bmVkIGludCBkZXZmbiwKIAogCXN3aXRjaCAobGVuKSB7CiAJY2FzZSAxOgotCQkqdmFsID0gaW5f OCgodTggKikoYWRkciArIG9mZnNldCkpOworCQkqdmFsID0gaW5fOCgodTggKilhZGRyKTsKIAkJ YnJlYWs7CiAJY2FzZSAyOgotCQkqdmFsID0gaW5fbGUxNigodTE2ICopKGFkZHIgKyBvZmZzZXQp KTsKKwkJKnZhbCA9IGluX2xlMTYoKHUxNiAqKWFkZHIpOwogCQlicmVhazsKIAlkZWZhdWx0Ogot CQkqdmFsID0gaW5fbGUzMigodTMyICopKGFkZHIgKyBvZmZzZXQpKTsKKwkJKnZhbCA9IGluX2xl MzIoKHUzMiAqKWFkZHIpOwogCQlicmVhazsKIAl9CiAKIAlwcl9kZWJ1ZygicGNpZS1jb25maWct cmVhZDogYnVzPSUzZCBbJTNkLi4lM2RdIGRldmZuPTB4JTA0eCIKIAkJICIgb2Zmc2V0PTB4JTA0 eCBsZW49JWQsIGFkZHI9MHglcCB2YWw9MHglMDh4XG4iLAogCQkgYnVzLT5udW1iZXIsIGhvc2Ut PmZpcnN0X2J1c25vLCBob3NlLT5sYXN0X2J1c25vLAotCQkgZGV2Zm4sIG9mZnNldCwgbGVuLCBh ZGRyICsgb2Zmc2V0LCAqdmFsKTsKKwkJIGRldmZuLCBvZmZzZXQsIGxlbiwgYWRkciwgKnZhbCk7 CiAKIAkvKiBDaGVjayBmb3IgQ1JTICg0NDBTUGUgcmV2IEIgZG9lcyB0aGF0IGZvciB1cyBidXQg aGVoIC4uKSAqLwogCWlmIChpbl9iZTMyKHBvcnQtPnV0bF9iYXNlICsgUEVVVExfUkNTVEEpICYg MHgwMDA0MDAwMCkgewpAQCAtMTY2Nyw3ICsxNjY3LDcgQEAgc3RhdGljIGludCBwcGM0eHhfcGNp ZXhfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwK IAlpZiAocHBjNHh4X3BjaWV4X3ZhbGlkYXRlX2JkZihwb3J0LCBidXMsIGRldmZuKSAhPSAwKQog CQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0JYWRkciA9IHBwYzR4eF9wY2ll eF9nZXRfY29uZmlnX2Jhc2UocG9ydCwgYnVzLCBkZXZmbik7CisJYWRkciA9IHBwYzR4eF9wY2ll eF9nZXRfY29uZmlnX2Jhc2UocG9ydCwgYnVzLCBkZXZmbiwgb2Zmc2V0KTsKIAogCS8qCiAJICog UmVhZGluZyBmcm9tIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2Ygbm9uLWV4aXN0aW5nIGRldmljZSBj YW4KQEAgLTE2ODAsMTcgKzE2ODAsMTcgQEAgc3RhdGljIGludCBwcGM0eHhfcGNpZXhfd3JpdGVf Y29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKIAlwcl9kZWJ1 ZygicGNpZS1jb25maWctd3JpdGU6IGJ1cz0lM2QgWyUzZC4uJTNkXSBkZXZmbj0weCUwNHgiCiAJ CSAiIG9mZnNldD0weCUwNHggbGVuPSVkLCBhZGRyPTB4JXAgdmFsPTB4JTA4eFxuIiwKIAkJIGJ1 cy0+bnVtYmVyLCBob3NlLT5maXJzdF9idXNubywgaG9zZS0+bGFzdF9idXNubywKLQkJIGRldmZu LCBvZmZzZXQsIGxlbiwgYWRkciArIG9mZnNldCwgdmFsKTsKKwkJIGRldmZuLCBvZmZzZXQsIGxl biwgYWRkciwgdmFsKTsKIAogCXN3aXRjaCAobGVuKSB7CiAJY2FzZSAxOgotCQlvdXRfOCgodTgg KikoYWRkciArIG9mZnNldCksIHZhbCk7CisJCW91dF84KCh1OCAqKWFkZHIsIHZhbCk7CiAJCWJy ZWFrOwogCWNhc2UgMjoKLQkJb3V0X2xlMTYoKHUxNiAqKShhZGRyICsgb2Zmc2V0KSwgdmFsKTsK KwkJb3V0X2xlMTYoKHUxNiAqKWFkZHIsIHZhbCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW91 dF9sZTMyKCh1MzIgKikoYWRkciArIG9mZnNldCksIHZhbCk7CisJCW91dF9sZTMyKCh1MzIgKilh ZGRyLCB2YWwpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRy b2xsZXIvZHdjL3BjaWUtYWwuYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaWUtYWwu YwppbmRleCBmOTczZmJjYTkwY2YuLjk3OWQ5M2I4MmRmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9w Y2kvY29udHJvbGxlci9kd2MvcGNpZS1hbC5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIv ZHdjL3BjaWUtYWwuYwpAQCAtNzYsNyArNzYsNyBAQCBzdGF0aWMgaW50IGFsX3BjaWVfaW5pdChz dHJ1Y3QgcGNpX2NvbmZpZ193aW5kb3cgKmNmZykKIH0KIAogY29uc3Qgc3RydWN0IHBjaV9lY2Ft X29wcyBhbF9wY2llX29wcyA9IHsKLQkuYnVzX3NoaWZ0ICAgID0gMjAsCisJLmJ1c19zaGlmdCAg ICA9IFBDSUVfRUNBTV9CVVNfU0hJRlQsCiAJLmluaXQgICAgICAgICA9ICBhbF9wY2llX2luaXQs CiAJLnBjaV9vcHMgICAgICA9IHsKIAkJLm1hcF9idXMgICAgPSBhbF9wY2llX21hcF9idXMsCkBA IC0xMzgsOCArMTM4LDYgQEAgc3RydWN0IGFsX3BjaWUgewogCXN0cnVjdCBhbF9wY2llX3Rhcmdl dF9idXNfY2ZnIHRhcmdldF9idXNfY2ZnOwogfTsKIAotI2RlZmluZSBQQ0lFX0VDQU1fREVWRk4o eCkJCSgoKHgpICYgMHhmZikgPDwgMTIpCi0KICNkZWZpbmUgdG9fYWxfcGNpZSh4KQkJZGV2X2dl dF9kcnZkYXRhKCh4KS0+ZGV2KQogCiBzdGF0aWMgaW5saW5lIHUzMiBhbF9wY2llX2NvbnRyb2xs ZXJfcmVhZGwoc3RydWN0IGFsX3BjaWUgKnBjaWUsIHUzMiBvZmZzZXQpCkBAIC0yMjYsMTEgKzIy NCw2IEBAIHN0YXRpYyB2b2lkIF9faW9tZW0gKmFsX3BjaWVfY29uZl9hZGRyX21hcF9idXMoc3Ry dWN0IHBjaV9idXMgKmJ1cywKIAlzdHJ1Y3QgYWxfcGNpZV90YXJnZXRfYnVzX2NmZyAqdGFyZ2V0 X2J1c19jZmcgPSAmcGNpZS0+dGFyZ2V0X2J1c19jZmc7CiAJdW5zaWduZWQgaW50IGJ1c25yX2Vj YW0gPSBidXNuciAmIHRhcmdldF9idXNfY2ZnLT5lY2FtX21hc2s7CiAJdW5zaWduZWQgaW50IGJ1 c25yX3JlZyA9IGJ1c25yICYgdGFyZ2V0X2J1c19jZmctPnJlZ19tYXNrOwotCXZvaWQgX19pb21l bSAqcGNpX2Jhc2VfYWRkcjsKLQotCXBjaV9iYXNlX2FkZHIgPSAodm9pZCBfX2lvbWVtICopKCh1 aW50cHRyX3QpcHAtPnZhX2NmZzBfYmFzZSArCi0JCQkJCSAoYnVzbnJfZWNhbSA8PCAyMCkgKwot CQkJCQkgUENJRV9FQ0FNX0RFVkZOKGRldmZuKSk7CiAKIAlpZiAoYnVzbnJfcmVnICE9IHRhcmdl dF9idXNfY2ZnLT5yZWdfdmFsKSB7CiAJCWRldl9kYmcocGNpZS0+cGNpLT5kZXYsICJDaGFuZ2lu ZyB0YXJnZXQgYnVzIGJ1c251bSB2YWwgZnJvbSAweCV4IHRvIDB4JXhcbiIsCkBAIC0yNDEsNyAr MjM0LDcgQEAgc3RhdGljIHZvaWQgX19pb21lbSAqYWxfcGNpZV9jb25mX2FkZHJfbWFwX2J1cyhz dHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJCSAgICAgICB0YXJnZXRfYnVzX2NmZy0+cmVnX21hc2sp OwogCX0KIAotCXJldHVybiBwY2lfYmFzZV9hZGRyICsgd2hlcmU7CisJcmV0dXJuIHBwLT52YV9j ZmcwX2Jhc2UgKyBQQ0lFX0VDQU1fT0ZGU0VUKGJ1c25yX2VjYW0sIGRldmZuLCB3aGVyZSk7CiB9 CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX29wcyBhbF9jaGlsZF9wY2lfb3BzID0gewpAQCAtMjY0LDcg KzI1Nyw3IEBAIHN0YXRpYyB2b2lkIGFsX3BjaWVfY29uZmlnX3ByZXBhcmUoc3RydWN0IGFsX3Bj aWUgKnBjaWUpCiAKIAl0YXJnZXRfYnVzX2NmZyA9ICZwY2llLT50YXJnZXRfYnVzX2NmZzsKIAot CWVjYW1fYnVzX21hc2sgPSAocGNpZS0+ZWNhbV9zaXplID4+IDIwKSAtIDE7CisJZWNhbV9idXNf bWFzayA9IChwY2llLT5lY2FtX3NpemUgPj4gUENJRV9FQ0FNX0JVU19TSElGVCkgLSAxOwogCWlm IChlY2FtX2J1c19tYXNrID4gMjU1KSB7CiAJCWRldl93YXJuKHBjaWUtPmRldiwgIkVDQU0gd2lu ZG93IHNpemUgaXMgbGFyZ2VyIHRoYW4gMjU2TUIuIEN1dHRpbmcgb2ZmIGF0IDI1NlxuIik7CiAJ CWVjYW1fYnVzX21hc2sgPSAyNTU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVy L2R3Yy9wY2llLWhpc2kuYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaWUtaGlzaS5j CmluZGV4IDVjYTg2Nzk2ZDQzYS4uYjdhZmJmMWQ0YmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bj aS9jb250cm9sbGVyL2R3Yy9wY2llLWhpc2kuYworKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVy L2R3Yy9wY2llLWhpc2kuYwpAQCAtMTAwLDcgKzEwMCw3IEBAIHN0YXRpYyBpbnQgaGlzaV9wY2ll X2luaXQoc3RydWN0IHBjaV9jb25maWdfd2luZG93ICpjZmcpCiB9CiAKIGNvbnN0IHN0cnVjdCBw Y2lfZWNhbV9vcHMgaGlzaV9wY2llX29wcyA9IHsKLQkuYnVzX3NoaWZ0ICAgID0gMjAsCisJLmJ1 c19zaGlmdCAgICA9IFBDSUVfRUNBTV9CVVNfU0hJRlQsCiAJLmluaXQgICAgICAgICA9ICBoaXNp X3BjaWVfaW5pdCwKIAkucGNpX29wcyAgICAgID0gewogCQkubWFwX2J1cyAgICA9IGhpc2lfcGNp ZV9tYXBfYnVzLApAQCAtMTM1LDcgKzEzNSw3IEBAIHN0YXRpYyBpbnQgaGlzaV9wY2llX3BsYXRm b3JtX2luaXQoc3RydWN0IHBjaV9jb25maWdfd2luZG93ICpjZmcpCiB9CiAKIHN0YXRpYyBjb25z dCBzdHJ1Y3QgcGNpX2VjYW1fb3BzIGhpc2lfcGNpZV9wbGF0Zm9ybV9vcHMgPSB7Ci0JLmJ1c19z aGlmdCAgICA9IDIwLAorCS5idXNfc2hpZnQgICAgPSBQQ0lFX0VDQU1fQlVTX1NISUZULAogCS5p bml0ICAgICAgICAgPSAgaGlzaV9wY2llX3BsYXRmb3JtX2luaXQsCiAJLnBjaV9vcHMgICAgICA9 IHsKIAkJLm1hcF9idXMgICAgPSBoaXNpX3BjaWVfbWFwX2J1cywKZGlmZiAtLWdpdCBhL2RyaXZl cnMvcGNpL2NvbnRyb2xsZXIvcGNpLWFhcmR2YXJrLmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVy L3BjaS1hYXJkdmFyay5jCmluZGV4IDBiZTQ4NWEyNTMyNy4uMTA0M2U1NGM3M2JkIDEwMDY0NAot LS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5jCisrKyBiL2RyaXZlcnMv cGNpL2NvbnRyb2xsZXIvcGNpLWFhcmR2YXJrLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRl IDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxs aW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktZWNhbS5oPgogI2luY2x1ZGUgPGxpbnV4 L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxh dGZvcm1fZGV2aWNlLmg+CkBAIC0xNjQsMTQgKzE2NSw2IEBACiAjZGVmaW5lIFBDSUVfQ09ORklH X1dSX1RZUEUwCQkJMHhhCiAjZGVmaW5lIFBDSUVfQ09ORklHX1dSX1RZUEUxCQkJMHhiCiAKLSNk ZWZpbmUgUENJRV9DT05GX0JVUyhidXMpCQkJKCgoYnVzKSAmIDB4ZmYpIDw8IDIwKQotI2RlZmlu ZSBQQ0lFX0NPTkZfREVWKGRldikJCQkoKChkZXYpICYgMHgxZikgPDwgMTUpCi0jZGVmaW5lIFBD SUVfQ09ORl9GVU5DKGZ1bikJCQkoKChmdW4pICYgMHg3KQk8PCAxMikKLSNkZWZpbmUgUENJRV9D T05GX1JFRyhyZWcpCQkJKChyZWcpICYgMHhmZmMpCi0jZGVmaW5lIFBDSUVfQ09ORl9BRERSKGJ1 cywgZGV2Zm4sIHdoZXJlKQlcCi0JKFBDSUVfQ09ORl9CVVMoYnVzKSB8IFBDSUVfQ09ORl9ERVYo UENJX1NMT1QoZGV2Zm4pKQl8IFwKLQkgUENJRV9DT05GX0ZVTkMoUENJX0ZVTkMoZGV2Zm4pKSB8 IFBDSUVfQ09ORl9SRUcod2hlcmUpKQotCiAjZGVmaW5lIFBJT19SRVRSWV9DTlQJCQk1MDAKICNk ZWZpbmUgUElPX1JFVFJZX0RFTEFZCQkJMiAvKiAyIHVzKi8KIApAQCAtNjg3LDcgKzY4MCw3IEBA IHN0YXRpYyBpbnQgYWR2a19wY2llX3JkX2NvbmYoc3RydWN0IHBjaV9idXMgKmJ1cywgdTMyIGRl dmZuLAogCWFkdmtfd3JpdGVsKHBjaWUsIHJlZywgUElPX0NUUkwpOwogCiAJLyogUHJvZ3JhbSB0 aGUgYWRkcmVzcyByZWdpc3RlcnMgKi8KLQlyZWcgPSBQQ0lFX0NPTkZfQUREUihidXMtPm51bWJl ciwgZGV2Zm4sIHdoZXJlKTsKKwlyZWcgPSBBTElHTl9ET1dOKFBDSUVfRUNBTV9PRkZTRVQoYnVz LT5udW1iZXIsIGRldmZuLCB3aGVyZSksIDQpOwogCWFkdmtfd3JpdGVsKHBjaWUsIHJlZywgUElP X0FERFJfTFMpOwogCWFkdmtfd3JpdGVsKHBjaWUsIDAsIFBJT19BRERSX01TKTsKIApAQCAtNzQ4 LDcgKzc0MSw3IEBAIHN0YXRpYyBpbnQgYWR2a19wY2llX3dyX2NvbmYoc3RydWN0IHBjaV9idXMg KmJ1cywgdTMyIGRldmZuLAogCWFkdmtfd3JpdGVsKHBjaWUsIHJlZywgUElPX0NUUkwpOwogCiAJ LyogUHJvZ3JhbSB0aGUgYWRkcmVzcyByZWdpc3RlcnMgKi8KLQlyZWcgPSBQQ0lFX0NPTkZfQURE UihidXMtPm51bWJlciwgZGV2Zm4sIHdoZXJlKTsKKwlyZWcgPSBBTElHTl9ET1dOKFBDSUVfRUNB TV9PRkZTRVQoYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSksIDQpOwogCWFkdmtfd3JpdGVsKHBj aWUsIHJlZywgUElPX0FERFJfTFMpOwogCWFkdmtfd3JpdGVsKHBjaWUsIDAsIFBJT19BRERSX01T KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktaG9zdC1nZW5lcmlj LmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1ob3N0LWdlbmVyaWMuYwppbmRleCBiNTE5 NzdhYmZkZjEuLmMxYzY5YjExNjE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxl ci9wY2ktaG9zdC1nZW5lcmljLmMKKysrIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktaG9z dC1nZW5lcmljLmMKQEAgLTQ5LDcgKzQ5LDcgQEAgc3RhdGljIHZvaWQgX19pb21lbSAqcGNpX2R3 X2VjYW1fbWFwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogfQogCiBzdGF0aWMgY29uc3Qgc3Ry dWN0IHBjaV9lY2FtX29wcyBwY2lfZHdfZWNhbV9idXNfb3BzID0gewotCS5idXNfc2hpZnQJPSAy MCwKKwkuYnVzX3NoaWZ0CT0gUENJRV9FQ0FNX0JVU19TSElGVCwKIAkucGNpX29wcwk9IHsKIAkJ Lm1hcF9idXMJPSBwY2lfZHdfZWNhbV9tYXBfYnVzLAogCQkucmVhZAkJPSBwY2lfZ2VuZXJpY19j b25maWdfcmVhZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXRodW5k ZXItZWNhbS5jIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktdGh1bmRlci1lY2FtLmMKaW5k ZXggN2U4ODM1ZmVlNWY3Li4yMmVkN2U5OTViMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2Nv bnRyb2xsZXIvcGNpLXRodW5kZXItZWNhbS5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIv cGNpLXRodW5kZXItZWNhbS5jCkBAIC0zNDYsNyArMzQ2LDcgQEAgc3RhdGljIGludCB0aHVuZGVy X2VjYW1fY29uZmlnX3dyaXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZm biwKIH0KIAogY29uc3Qgc3RydWN0IHBjaV9lY2FtX29wcyBwY2lfdGh1bmRlcl9lY2FtX29wcyA9 IHsKLQkuYnVzX3NoaWZ0CT0gMjAsCisJLmJ1c19zaGlmdAk9IFBDSUVfRUNBTV9CVVNfU0hJRlQs CiAJLnBjaV9vcHMJPSB7CiAJCS5tYXBfYnVzICAgICAgICA9IHBjaV9lY2FtX21hcF9idXMsCiAJ CS5yZWFkICAgICAgICAgICA9IHRodW5kZXJfZWNhbV9jb25maWdfcmVhZCwKZGlmZiAtLWdpdCBh L2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXRodW5kZXItcGVtLmMgYi9kcml2ZXJzL3BjaS9j b250cm9sbGVyL3BjaS10aHVuZGVyLXBlbS5jCmluZGV4IDNmODQ3OTY5MTQzZS4uMWEzZjcwYWM2 MWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS10aHVuZGVyLXBlbS5j CisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLXRodW5kZXItcGVtLmMKQEAgLTE5LDYg KzE5LDE1IEBACiAjZGVmaW5lIFBFTV9DRkdfV1IgMHgyOAogI2RlZmluZSBQRU1fQ0ZHX1JEIDB4 MzAKIAorLyoKKyAqIEVuaGFuY2VkIENvbmZpZ3VyYXRpb24gQWNjZXNzIE1lY2hhbmlzbSAoRUNB TSkKKyAqCisgKiBOLkIuIFRoaXMgaXMgYSBub24tc3RhbmRhcmQgcGxhdGZvcm0tc3BlY2lmaWMg RUNBTSBidXMgc2hpZnQgdmFsdWUuICBGb3IKKyAqIHN0YW5kYXJkIHZhbHVlcyBkZWZpbmVkIGlu IHRoZSBQQ0kgRXhwcmVzcyBCYXNlIFNwZWNpZmljYXRpb24gc2VlCisgKiBpbmNsdWRlL2xpbnV4 L3BjaS1lY2FtLmguCisgKi8KKyNkZWZpbmUgVEhVTkRFUl9QQ0lFX0VDQU1fQlVTX1NISUZUCTI0 CisKIHN0cnVjdCB0aHVuZGVyX3BlbV9wY2kgewogCXUzMgkJZWFfZW50cnlbM107CiAJdm9pZCBf X2lvbWVtCSpwZW1fcmVnX2Jhc2U7CkBAIC00MDQsNyArNDEzLDcgQEAgc3RhdGljIGludCB0aHVu ZGVyX3BlbV9hY3BpX2luaXQoc3RydWN0IHBjaV9jb25maWdfd2luZG93ICpjZmcpCiB9CiAKIGNv bnN0IHN0cnVjdCBwY2lfZWNhbV9vcHMgdGh1bmRlcl9wZW1fZWNhbV9vcHMgPSB7Ci0JLmJ1c19z aGlmdAk9IDI0LAorCS5idXNfc2hpZnQJPSBUSFVOREVSX1BDSUVfRUNBTV9CVVNfU0hJRlQsCiAJ LmluaXQJCT0gdGh1bmRlcl9wZW1fYWNwaV9pbml0LAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1 cwk9IHBjaV9lY2FtX21hcF9idXMsCkBAIC00NDEsNyArNDUwLDcgQEAgc3RhdGljIGludCB0aHVu ZGVyX3BlbV9wbGF0Zm9ybV9pbml0KHN0cnVjdCBwY2lfY29uZmlnX3dpbmRvdyAqY2ZnKQogfQog CiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9lY2FtX29wcyBwY2lfdGh1bmRlcl9wZW1fb3BzID0g ewotCS5idXNfc2hpZnQJPSAyNCwKKwkuYnVzX3NoaWZ0CT0gVEhVTkRFUl9QQ0lFX0VDQU1fQlVT X1NISUZULAogCS5pbml0CQk9IHRodW5kZXJfcGVtX3BsYXRmb3JtX2luaXQsCiAJLnBjaV9vcHMJ PSB7CiAJCS5tYXBfYnVzCT0gcGNpX2VjYW1fbWFwX2J1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMv cGNpL2NvbnRyb2xsZXIvcGNpLXhnZW5lLmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS14 Z2VuZS5jCmluZGV4IDhlMGRiODRmMDg5ZC4uODVlN2M5ODI2NWU4IDEwMDY0NAotLS0gYS9kcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaS14Z2VuZS5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xs ZXIvcGNpLXhnZW5lLmMKQEAgLTI1Nyw3ICsyNTcsNiBAQCBzdGF0aWMgaW50IHhnZW5lX3YxX3Bj aWVfZWNhbV9pbml0KHN0cnVjdCBwY2lfY29uZmlnX3dpbmRvdyAqY2ZnKQogfQogCiBjb25zdCBz dHJ1Y3QgcGNpX2VjYW1fb3BzIHhnZW5lX3YxX3BjaWVfZWNhbV9vcHMgPSB7Ci0JLmJ1c19zaGlm dAk9IDE2LAogCS5pbml0CQk9IHhnZW5lX3YxX3BjaWVfZWNhbV9pbml0LAogCS5wY2lfb3BzCT0g ewogCQkubWFwX2J1cwk9IHhnZW5lX3BjaWVfbWFwX2J1cywKQEAgLTI3Miw3ICsyNzEsNiBAQCBz dGF0aWMgaW50IHhnZW5lX3YyX3BjaWVfZWNhbV9pbml0KHN0cnVjdCBwY2lfY29uZmlnX3dpbmRv dyAqY2ZnKQogfQogCiBjb25zdCBzdHJ1Y3QgcGNpX2VjYW1fb3BzIHhnZW5lX3YyX3BjaWVfZWNh bV9vcHMgPSB7Ci0JLmJ1c19zaGlmdAk9IDE2LAogCS5pbml0CQk9IHhnZW5lX3YyX3BjaWVfZWNh bV9pbml0LAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1cwk9IHhnZW5lX3BjaWVfbWFwX2J1cywK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1icmNtc3RiLmMgYi9kcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtYnJjbXN0Yi5jCmluZGV4IGJlYTg2ODk5YmQ1ZC4uN2Zj ODBmZDZmMTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtYnJjbXN0 Yi5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1icmNtc3RiLmMKQEAgLTIyLDYg KzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9w bGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1l Y2FtLmg+CiAjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzZXQu aD4KICNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgpAQCAtMTI3LDExICsxMjgsNyBAQAogI2RlZmlu ZSAgTVNJX0lOVF9NQVNLX0NMUgkJMHgxNAogCiAjZGVmaW5lIFBDSUVfRVhUX0NGR19EQVRBCQkJ CTB4ODAwMAotCiAjZGVmaW5lIFBDSUVfRVhUX0NGR19JTkRFWAkJCQkweDkwMDAKLSNkZWZpbmUg IFBDSUVfRVhUX0JVU05VTV9TSElGVAkJCQkyMAotI2RlZmluZSAgUENJRV9FWFRfU0xPVF9TSElG VAkJCQkxNQotI2RlZmluZSAgUENJRV9FWFRfRlVOQ19TSElGVAkJCQkxMgogCiAjZGVmaW5lICBQ Q0lFX1JHUjFfU1dfSU5JVF8xX1BFUlNUX01BU0sJCQkweDEKICNkZWZpbmUgIFBDSUVfUkdSMV9T V19JTklUXzFfUEVSU1RfU0hJRlQJCTB4MApAQCAtNjk1LDE1ICs2OTIsNiBAQCBzdGF0aWMgYm9v bCBicmNtX3BjaWVfbGlua191cChzdHJ1Y3QgYnJjbV9wY2llICpwY2llKQogCXJldHVybiBkbGEg JiYgcGx1OwogfQogCi0vKiBDb25maWd1cmF0aW9uIHNwYWNlIHJlYWQvd3JpdGUgc3VwcG9ydCAq Lwotc3RhdGljIGlubGluZSBpbnQgYnJjbV9wY2llX2NmZ19pbmRleChpbnQgYnVzbnIsIGludCBk ZXZmbiwgaW50IHJlZykKLXsKLQlyZXR1cm4gKChQQ0lfU0xPVChkZXZmbikgJiAweDFmKSA8PCBQ Q0lFX0VYVF9TTE9UX1NISUZUKQotCQl8ICgoUENJX0ZVTkMoZGV2Zm4pICYgMHgwNykgPDwgUENJ RV9FWFRfRlVOQ19TSElGVCkKLQkJfCAoYnVzbnIgPDwgUENJRV9FWFRfQlVTTlVNX1NISUZUKQot CQl8IChyZWcgJiB+Myk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW9tZW0gKmJyY21fcGNpZV9tYXBf Y29uZihzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCiAJCQkJCWludCB3 aGVyZSkKIHsKQEAgLTcxNiw3ICs3MDQsNyBAQCBzdGF0aWMgdm9pZCBfX2lvbWVtICpicmNtX3Bj aWVfbWFwX2NvbmYoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAogCQly ZXR1cm4gUENJX1NMT1QoZGV2Zm4pID8gTlVMTCA6IGJhc2UgKyB3aGVyZTsKIAogCS8qIEZvciBk ZXZpY2VzLCB3cml0ZSB0byB0aGUgY29uZmlnIHNwYWNlIGluZGV4IHJlZ2lzdGVyICovCi0JaWR4 ID0gYnJjbV9wY2llX2NmZ19pbmRleChidXMtPm51bWJlciwgZGV2Zm4sIDApOworCWlkeCA9IFBD SUVfRUNBTV9PRkZTRVQoYnVzLT5udW1iZXIsIGRldmZuLCAwKTsKIAl3cml0ZWwoaWR4LCBwY2ll LT5iYXNlICsgUENJRV9FWFRfQ0ZHX0lOREVYKTsKIAlyZXR1cm4gYmFzZSArIFBDSUVfRVhUX0NG R19EQVRBICsgd2hlcmU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3Bj aWUtaXByb2MuYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1pcHJvYy5jCmluZGV4IDkw NWU5MzgwODI0My4uNTAzNjYyMzgwZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9s bGVyL3BjaWUtaXByb2MuYworKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtaXByb2Mu YwpAQCAtNiw2ICs2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUg PGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1lY2FtLmg+CiAjaW5jbHVkZSA8bGlu dXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+CkBAIC0zOSwxNiArNDAsOCBAQAogCiAjZGVmaW5lIENGR19JTkRfQUREUl9NQVNLCQkweDAw MDAxZmZjCiAKLSNkZWZpbmUgQ0ZHX0FERFJfQlVTX05VTV9TSElGVAkJMjAKLSNkZWZpbmUgQ0ZH X0FERFJfQlVTX05VTV9NQVNLCQkweDBmZjAwMDAwCi0jZGVmaW5lIENGR19BRERSX0RFVl9OVU1f U0hJRlQJCTE1Ci0jZGVmaW5lIENGR19BRERSX0RFVl9OVU1fTUFTSwkJMHgwMDBmODAwMAotI2Rl ZmluZSBDRkdfQUREUl9GVU5DX05VTV9TSElGVAkJMTIKLSNkZWZpbmUgQ0ZHX0FERFJfRlVOQ19O VU1fTUFTSwkJMHgwMDAwNzAwMAotI2RlZmluZSBDRkdfQUREUl9SRUdfTlVNX1NISUZUCQkyCiAj ZGVmaW5lIENGR19BRERSX1JFR19OVU1fTUFTSwkJMHgwMDAwMGZmYwotI2RlZmluZSBDRkdfQURE Ul9DRkdfVFlQRV9TSElGVAkJMAotI2RlZmluZSBDRkdfQUREUl9DRkdfVFlQRV9NQVNLCQkweDAw MDAwMDAzCisjZGVmaW5lIENGR19BRERSX0NGR19UWVBFXzEJCTEKIAogI2RlZmluZSBTWVNfUkNf SU5UWF9NQVNLCQkweGYKIApAQCAtNDU5LDE5ICs0NTIsMTUgQEAgc3RhdGljIGlubGluZSB2b2lk IGlwcm9jX3BjaWVfYXBiX2Vycl9kaXNhYmxlKHN0cnVjdCBwY2lfYnVzICpidXMsCiAKIHN0YXRp YyB2b2lkIF9faW9tZW0gKmlwcm9jX3BjaWVfbWFwX2VwX2NmZ19yZWcoc3RydWN0IGlwcm9jX3Bj aWUgKnBjaWUsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnVzbm8sCi0JCQkJCSAgICAgICB1 bnNpZ25lZCBpbnQgc2xvdCwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBmbiwKKwkJCQkJICAg ICAgIHVuc2lnbmVkIGludCBkZXZmbiwKIAkJCQkJICAgICAgIGludCB3aGVyZSkKIHsKIAl1MTYg b2Zmc2V0OwogCXUzMiB2YWw7CiAKIAkvKiBFUCBkZXZpY2UgYWNjZXNzICovCi0JdmFsID0gKGJ1 c25vIDw8IENGR19BRERSX0JVU19OVU1fU0hJRlQpIHwKLQkJKHNsb3QgPDwgQ0ZHX0FERFJfREVW X05VTV9TSElGVCkgfAotCQkoZm4gPDwgQ0ZHX0FERFJfRlVOQ19OVU1fU0hJRlQpIHwKLQkJKHdo ZXJlICYgQ0ZHX0FERFJfUkVHX05VTV9NQVNLKSB8Ci0JCSgxICYgQ0ZHX0FERFJfQ0ZHX1RZUEVf TUFTSyk7CisJdmFsID0gQUxJR05fRE9XTihQQ0lFX0VDQU1fT0ZGU0VUKGJ1c25vLCBkZXZmbiwg d2hlcmUpLCA0KSB8CisJCUNGR19BRERSX0NGR19UWVBFXzE7CiAKIAlpcHJvY19wY2llX3dyaXRl X3JlZyhwY2llLCBJUFJPQ19QQ0lFX0NGR19BRERSLCB2YWwpOwogCW9mZnNldCA9IGlwcm9jX3Bj aWVfcmVnX29mZnNldChwY2llLCBJUFJPQ19QQ0lFX0NGR19EQVRBKTsKQEAgLTU3NCw4ICs1NjMs NiBAQCBzdGF0aWMgaW50IGlwcm9jX3BjaWVfY29uZmlnX3JlYWQoc3RydWN0IHBjaV9idXMgKmJ1 cywgdW5zaWduZWQgaW50IGRldmZuLAogCQkJCSAgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2 YWwpCiB7CiAJc3RydWN0IGlwcm9jX3BjaWUgKnBjaWUgPSBpcHJvY19kYXRhKGJ1cyk7Ci0JdW5z aWduZWQgaW50IHNsb3QgPSBQQ0lfU0xPVChkZXZmbik7Ci0JdW5zaWduZWQgaW50IGZuID0gUENJ X0ZVTkMoZGV2Zm4pOwogCXVuc2lnbmVkIGludCBidXNubyA9IGJ1cy0+bnVtYmVyOwogCXZvaWQg X19pb21lbSAqY2ZnX2RhdGFfcDsKIAl1bnNpZ25lZCBpbnQgZGF0YTsKQEAgLTU5MCw3ICs1Nzcs NyBAQCBzdGF0aWMgaW50IGlwcm9jX3BjaWVfY29uZmlnX3JlYWQoc3RydWN0IHBjaV9idXMgKmJ1 cywgdW5zaWduZWQgaW50IGRldmZuLAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWNmZ19kYXRhX3Ag PSBpcHJvY19wY2llX21hcF9lcF9jZmdfcmVnKHBjaWUsIGJ1c25vLCBzbG90LCBmbiwgd2hlcmUp OworCWNmZ19kYXRhX3AgPSBpcHJvY19wY2llX21hcF9lcF9jZmdfcmVnKHBjaWUsIGJ1c25vLCBk ZXZmbiwgd2hlcmUpOwogCiAJaWYgKCFjZmdfZGF0YV9wKQogCQlyZXR1cm4gUENJQklPU19ERVZJ Q0VfTk9UX0ZPVU5EOwpAQCAtNjMxLDEzICs2MTgsMTEgQEAgc3RhdGljIHZvaWQgX19pb21lbSAq aXByb2NfcGNpZV9tYXBfY2ZnX2J1cyhzdHJ1Y3QgaXByb2NfcGNpZSAqcGNpZSwKIAkJCQkJICAg IGludCBidXNubywgdW5zaWduZWQgaW50IGRldmZuLAogCQkJCQkgICAgaW50IHdoZXJlKQogewot CXVuc2lnbmVkIHNsb3QgPSBQQ0lfU0xPVChkZXZmbik7Ci0JdW5zaWduZWQgZm4gPSBQQ0lfRlVO QyhkZXZmbik7CiAJdTE2IG9mZnNldDsKIAogCS8qIHJvb3QgY29tcGxleCBhY2Nlc3MgKi8KIAlp ZiAoYnVzbm8gPT0gMCkgewotCQlpZiAoc2xvdCA+IDAgfHwgZm4gPiAwKQorCQlpZiAoUENJRV9F Q0FNX0RFVkZOKGRldmZuKSA+IDApCiAJCQlyZXR1cm4gTlVMTDsKIAogCQlpcHJvY19wY2llX3dy aXRlX3JlZyhwY2llLCBJUFJPQ19QQ0lFX0NGR19JTkRfQUREUiwKQEAgLTY0OSw3ICs2MzQsNyBA QCBzdGF0aWMgdm9pZCBfX2lvbWVtICppcHJvY19wY2llX21hcF9jZmdfYnVzKHN0cnVjdCBpcHJv Y19wY2llICpwY2llLAogCQkJcmV0dXJuIChwY2llLT5iYXNlICsgb2Zmc2V0KTsKIAl9CiAKLQly ZXR1cm4gaXByb2NfcGNpZV9tYXBfZXBfY2ZnX3JlZyhwY2llLCBidXNubywgc2xvdCwgZm4sIHdo ZXJlKTsKKwlyZXR1cm4gaXByb2NfcGNpZV9tYXBfZXBfY2ZnX3JlZyhwY2llLCBidXNubywgZGV2 Zm4sIHdoZXJlKTsKIH0KIAogc3RhdGljIHZvaWQgX19pb21lbSAqaXByb2NfcGNpZV9idXNfbWFw X2NmZ19idXMoc3RydWN0IHBjaV9idXMgKmJ1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2Nv bnRyb2xsZXIvcGNpZS1yb2NrY2hpcC1ob3N0LmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3Bj aWUtcm9ja2NoaXAtaG9zdC5jCmluZGV4IDk3MDUwNTk1MjNhNi4uZjFkMDhhMWIxNTkxIDEwMDY0 NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtcm9ja2NoaXAtaG9zdC5jCisrKyBi L2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1yb2NrY2hpcC1ob3N0LmMKQEAgLTE1NywxMiAr MTU3LDExIEBAIHN0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9yZF9vdGhlcl9jb25mKHN0cnVjdCBy b2NrY2hpcF9wY2llICpyb2NrY2hpcCwKIAkJCQkgICAgICAgc3RydWN0IHBjaV9idXMgKmJ1cywg dTMyIGRldmZuLAogCQkJCSAgICAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKIHsK LQl1MzIgYnVzZGV2OworCXZvaWQgX19pb21lbSAqYWRkcjsKIAotCWJ1c2RldiA9IFBDSUVfRUNB TV9BRERSKGJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXZmbiksCi0JCQkJUENJX0ZVTkMoZGV2Zm4p LCB3aGVyZSk7CisJYWRkciA9IHJvY2tjaGlwLT5yZWdfYmFzZSArIFBDSUVfRUNBTV9PRkZTRVQo YnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSk7CiAKLQlpZiAoIUlTX0FMSUdORUQoYnVzZGV2LCBz aXplKSkgeworCWlmICghSVNfQUxJR05FRCgodWludHB0cl90KWFkZHIsIHNpemUpKSB7CiAJCSp2 YWwgPSAwOwogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwogCX0KQEAgLTE3 NSwxMSArMTc0LDExIEBAIHN0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9yZF9vdGhlcl9jb25mKHN0 cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCwKIAkJCQkJCUFYSV9XUkFQUEVSX1RZUEUxX0NG Ryk7CiAKIAlpZiAoc2l6ZSA9PSA0KSB7Ci0JCSp2YWwgPSByZWFkbChyb2NrY2hpcC0+cmVnX2Jh c2UgKyBidXNkZXYpOworCQkqdmFsID0gcmVhZGwoYWRkcik7CiAJfSBlbHNlIGlmIChzaXplID09 IDIpIHsKLQkJKnZhbCA9IHJlYWR3KHJvY2tjaGlwLT5yZWdfYmFzZSArIGJ1c2Rldik7CisJCSp2 YWwgPSByZWFkdyhhZGRyKTsKIAl9IGVsc2UgaWYgKHNpemUgPT0gMSkgewotCQkqdmFsID0gcmVh ZGIocm9ja2NoaXAtPnJlZ19iYXNlICsgYnVzZGV2KTsKKwkJKnZhbCA9IHJlYWRiKGFkZHIpOwog CX0gZWxzZSB7CiAJCSp2YWwgPSAwOwogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVN QkVSOwpAQCAtMTkxLDExICsxOTAsMTEgQEAgc3RhdGljIGludCByb2NrY2hpcF9wY2llX3dyX290 aGVyX2NvbmYoc3RydWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwLAogCQkJCSAgICAgICBzdHJ1 Y3QgcGNpX2J1cyAqYnVzLCB1MzIgZGV2Zm4sCiAJCQkJICAgICAgIGludCB3aGVyZSwgaW50IHNp emUsIHUzMiB2YWwpCiB7Ci0JdTMyIGJ1c2RldjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CiAKLQli dXNkZXYgPSBQQ0lFX0VDQU1fQUREUihidXMtPm51bWJlciwgUENJX1NMT1QoZGV2Zm4pLAotCQkJ CVBDSV9GVU5DKGRldmZuKSwgd2hlcmUpOwotCWlmICghSVNfQUxJR05FRChidXNkZXYsIHNpemUp KQorCWFkZHIgPSByb2NrY2hpcC0+cmVnX2Jhc2UgKyBQQ0lFX0VDQU1fT0ZGU0VUKGJ1cy0+bnVt YmVyLCBkZXZmbiwgd2hlcmUpOworCisJaWYgKCFJU19BTElHTkVEKCh1aW50cHRyX3QpYWRkciwg c2l6ZSkpCiAJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CiAKIAlpZiAocGNp X2lzX3Jvb3RfYnVzKGJ1cy0+cGFyZW50KSkKQEAgLTIwNiwxMSArMjA1LDExIEBAIHN0YXRpYyBp bnQgcm9ja2NoaXBfcGNpZV93cl9vdGhlcl9jb25mKHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2Nr Y2hpcCwKIAkJCQkJCUFYSV9XUkFQUEVSX1RZUEUxX0NGRyk7CiAKIAlpZiAoc2l6ZSA9PSA0KQot CQl3cml0ZWwodmFsLCByb2NrY2hpcC0+cmVnX2Jhc2UgKyBidXNkZXYpOworCQl3cml0ZWwodmFs LCBhZGRyKTsKIAllbHNlIGlmIChzaXplID09IDIpCi0JCXdyaXRldyh2YWwsIHJvY2tjaGlwLT5y ZWdfYmFzZSArIGJ1c2Rldik7CisJCXdyaXRldyh2YWwsIGFkZHIpOwogCWVsc2UgaWYgKHNpemUg PT0gMSkKLQkJd3JpdGViKHZhbCwgcm9ja2NoaXAtPnJlZ19iYXNlICsgYnVzZGV2KTsKKwkJd3Jp dGViKHZhbCwgYWRkcik7CiAJZWxzZQogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVN QkVSOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtcm9ja2NoaXAu aCBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1yb2NrY2hpcC5oCmluZGV4IGM3ZDAxNzhm YzhjMi4uMTY1MGE1MDg3NDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3Bj aWUtcm9ja2NoaXAuaAorKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUtcm9ja2NoaXAu aApAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVk ZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWVjYW0uaD4KIAogLyoKICAqIFRo ZSB1cHBlciAxNiBiaXRzIG9mIFBDSUVfQ0xJRU5UX0NPTkZJRyBhcmUgYSB3cml0ZSBtYXNrIGZv ciB0aGUgbG93ZXIgMTYKQEAgLTE3OCwxMyArMTc5LDYgQEAKICNkZWZpbmUgTUlOX0FYSV9BRERS X0JJVFNfUEFTU0VECQk4CiAjZGVmaW5lIFBDSUVfUkNfU0VORF9QTUVfT0ZGCQkJMHgxMTk2MAog I2RlZmluZSBST0NLQ0hJUF9WRU5ET1JfSUQJCQkweDFkODcKLSNkZWZpbmUgUENJRV9FQ0FNX0JV Uyh4KQkJCSgoKHgpICYgMHhmZikgPDwgMjApCi0jZGVmaW5lIFBDSUVfRUNBTV9ERVYoeCkJCQko KCh4KSAmIDB4MWYpIDw8IDE1KQotI2RlZmluZSBQQ0lFX0VDQU1fRlVOQyh4KQkJCSgoKHgpICYg MHg3KSA8PCAxMikKLSNkZWZpbmUgUENJRV9FQ0FNX1JFRyh4KQkJCSgoKHgpICYgMHhmZmYpIDw8 IDApCi0jZGVmaW5lIFBDSUVfRUNBTV9BRERSKGJ1cywgZGV2LCBmdW5jLCByZWcpIFwKLQkgIChQ Q0lFX0VDQU1fQlVTKGJ1cykgfCBQQ0lFX0VDQU1fREVWKGRldikgfCBcCi0JICAgUENJRV9FQ0FN X0ZVTkMoZnVuYykgfCBQQ0lFX0VDQU1fUkVHKHJlZykpCiAjZGVmaW5lIFBDSUVfTElOS19JU19M Mih4KSBcCiAJKCgoeCkgJiBQQ0lFX0NMSUVOVF9ERUJVR19MVFNTTV9NQVNLKSA9PSBQQ0lFX0NM SUVOVF9ERUJVR19MVFNTTV9MMikKICNkZWZpbmUgUENJRV9MSU5LX1VQKHgpIFwKZGlmZiAtLWdp dCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS10YW5nby5jIGIvZHJpdmVycy9wY2kvY29u dHJvbGxlci9wY2llLXRhbmdvLmMKaW5kZXggZDA5M2E4Y2U0YmIxLi44ZjBkNjk1YWZiZGUgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS10YW5nby5jCisrKyBiL2RyaXZl cnMvcGNpL2NvbnRyb2xsZXIvcGNpZS10YW5nby5jCkBAIC0yMDgsNyArMjA4LDcgQEAgc3RhdGlj IGludCBzbXA4NzU5X2NvbmZpZ193cml0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBp bnQgZGV2Zm4sCiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2VjYW1fb3BzIHNtcDg3NTlf ZWNhbV9vcHMgPSB7Ci0JLmJ1c19zaGlmdAk9IDIwLAorCS5idXNfc2hpZnQJPSBQQ0lFX0VDQU1f QlVTX1NISUZULAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1cwk9IHBjaV9lY2FtX21hcF9idXMs CiAJCS5yZWFkCQk9IHNtcDg3NTlfY29uZmlnX3JlYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bj aS9jb250cm9sbGVyL3BjaWUteGlsaW54LW53bC5jIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9w Y2llLXhpbGlueC1ud2wuYwppbmRleCBmM2NmN2Q2MTkyNGYuLjdmMjljMmZkY2Q1MSAxMDA2NDQK LS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2llLXhpbGlueC1ud2wuYworKysgYi9kcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaWUteGlsaW54LW53bC5jCkBAIC0xOCw2ICsxOCw3IEBACiAj aW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4K ICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktZWNhbS5oPgogI2lu Y2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAv Y2hhaW5lZF9pcnEuaD4KIApAQCAtMTI0LDggKzEyNSw2IEBACiAjZGVmaW5lIEVfRUNBTV9DUl9F TkFCTEUJCUJJVCgwKQogI2RlZmluZSBFX0VDQU1fU0laRV9MT0MJCQlHRU5NQVNLKDIwLCAxNikK ICNkZWZpbmUgRV9FQ0FNX1NJWkVfU0hJRlQJCTE2Ci0jZGVmaW5lIEVDQU1fQlVTX0xPQ19TSElG VAkJMjAKLSNkZWZpbmUgRUNBTV9ERVZfTE9DX1NISUZUCQkxMgogI2RlZmluZSBOV0xfRUNBTV9W QUxVRV9ERUZBVUxUCQkxMgogCiAjZGVmaW5lIENGR19ETUFfUkVHX0JBUgkJCUdFTk1BU0soMiwg MCkKQEAgLTI0MCwxNSArMjM5LDExIEBAIHN0YXRpYyB2b2lkIF9faW9tZW0gKm53bF9wY2llX21h cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAogCQkJCSAgICAg IGludCB3aGVyZSkKIHsKIAlzdHJ1Y3QgbndsX3BjaWUgKnBjaWUgPSBidXMtPnN5c2RhdGE7Ci0J aW50IHJlbGJ1czsKIAogCWlmICghbndsX3BjaWVfdmFsaWRfZGV2aWNlKGJ1cywgZGV2Zm4pKQog CQlyZXR1cm4gTlVMTDsKIAotCXJlbGJ1cyA9IChidXMtPm51bWJlciA8PCBFQ0FNX0JVU19MT0Nf U0hJRlQpIHwKLQkJCShkZXZmbiA8PCBFQ0FNX0RFVl9MT0NfU0hJRlQpOwotCi0JcmV0dXJuIHBj aWUtPmVjYW1fYmFzZSArIHJlbGJ1cyArIHdoZXJlOworCXJldHVybiBwY2llLT5lY2FtX2Jhc2Ug KyBQQ0lFX0VDQU1fT0ZGU0VUKGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUpOwogfQogCiAvKiBQ Q0llIG9wZXJhdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNp ZS14aWxpbnguYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS14aWxpbnguYwppbmRleCA4 NTIzYmU2MWJiYTUuLmZhNWJhZWI4MjY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvY29udHJv bGxlci9wY2llLXhpbGlueC5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS14aWxp bnguYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAj aW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVk ZSA8bGludXgvcGNpLWVjYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4K IAogI2luY2x1ZGUgIi4uL3BjaS5oIgpAQCAtODYsMTAgKzg3LDYgQEAKIC8qIFBoeSBTdGF0dXMv Q29udHJvbCBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBYSUxJTlhfUENJRV9SRUdf UFNDUl9MTktVUAlCSVQoMTEpCiAKLS8qIEVDQU0gZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgRUNB TV9CVVNfTlVNX1NISUZUCQkyMAotI2RlZmluZSBFQ0FNX0RFVl9OVU1fU0hJRlQJCTEyCi0KIC8q IE51bWJlciBvZiBNU0kgSVJRcyAqLwogI2RlZmluZSBYSUxJTlhfTlVNX01TSV9JUlFTCQkxMjgK IApAQCAtMTgzLDE1ICsxODAsMTEgQEAgc3RhdGljIHZvaWQgX19pb21lbSAqeGlsaW54X3BjaWVf bWFwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJCQkgdW5zaWduZWQgaW50IGRldmZuLCBp bnQgd2hlcmUpCiB7CiAJc3RydWN0IHhpbGlueF9wY2llX3BvcnQgKnBvcnQgPSBidXMtPnN5c2Rh dGE7Ci0JaW50IHJlbGJ1czsKIAogCWlmICgheGlsaW54X3BjaWVfdmFsaWRfZGV2aWNlKGJ1cywg ZGV2Zm4pKQogCQlyZXR1cm4gTlVMTDsKIAotCXJlbGJ1cyA9IChidXMtPm51bWJlciA8PCBFQ0FN X0JVU19OVU1fU0hJRlQpIHwKLQkJIChkZXZmbiA8PCBFQ0FNX0RFVl9OVU1fU0hJRlQpOwotCi0J cmV0dXJuIHBvcnQtPnJlZ19iYXNlICsgcmVsYnVzICsgd2hlcmU7CisJcmV0dXJuIHBvcnQtPnJl Z19iYXNlICsgUENJRV9FQ0FNX09GRlNFVChidXMtPm51bWJlciwgZGV2Zm4sIHdoZXJlKTsKIH0K IAogLyogUENJZSBvcGVyYXRpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9s bGVyL3ZtZC5jIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci92bWQuYwppbmRleCBmMzc1YzIxY2Vl YjEuLjU5ZmE5YTk0ODYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci92bWQu YworKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3ZtZC5jCkBAIC0xMSw2ICsxMSw3IEBACiAj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVk ZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWVjYW0uaD4KICNpbmNsdWRlIDxs aW51eC9zcmN1Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4 L3JjdXBkYXRlLmg+CkBAIC05NCw3ICs5NSw3IEBAIHN0cnVjdCB2bWRfZGV2IHsKIAlzdHJ1Y3Qg cGNpX2RldgkJKmRldjsKIAogCXNwaW5sb2NrX3QJCWNmZ19sb2NrOwotCWNoYXIgX19pb21lbQkJ KmNmZ2JhcjsKKwl2b2lkIF9faW9tZW0JCSpjZmdiYXI7CiAKIAlpbnQgbXNpeF9jb3VudDsKIAlz dHJ1Y3Qgdm1kX2lycV9saXN0CSppcnFzOwpAQCAtMzI1LDE4ICszMjYsMTYgQEAgc3RhdGljIHZv aWQgdm1kX3JlbW92ZV9pcnFfZG9tYWluKHN0cnVjdCB2bWRfZGV2ICp2bWQpCiAJfQogfQogCi1z dGF0aWMgY2hhciBfX2lvbWVtICp2bWRfY2ZnX2FkZHIoc3RydWN0IHZtZF9kZXYgKnZtZCwgc3Ry dWN0IHBjaV9idXMgKmJ1cywKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnZtZF9jZmdfYWRkcihzdHJ1 Y3Qgdm1kX2RldiAqdm1kLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJCSAgdW5zaWduZWQgaW50 IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuKQogewotCWNoYXIgX19pb21lbSAqYWRkciA9IHZtZC0+ Y2ZnYmFyICsKLQkJCSAgICAgKChidXMtPm51bWJlciAtIHZtZC0+YnVzbl9zdGFydCkgPDwgMjAp ICsKLQkJCSAgICAgKGRldmZuIDw8IDEyKSArIHJlZzsKKwl1bnNpZ25lZCBpbnQgYnVzbnJfZWNh bSA9IGJ1cy0+bnVtYmVyIC0gdm1kLT5idXNuX3N0YXJ0OworCXUzMiBvZmZzZXQgPSBQQ0lFX0VD QU1fT0ZGU0VUKGJ1c25yX2VjYW0sIGRldmZuLCByZWcpOwogCi0JaWYgKChhZGRyIC0gdm1kLT5j ZmdiYXIpICsgbGVuID49Ci0JICAgIHJlc291cmNlX3NpemUoJnZtZC0+ZGV2LT5yZXNvdXJjZVtW TURfQ0ZHQkFSXSkpCisJaWYgKG9mZnNldCArIGxlbiA+PSByZXNvdXJjZV9zaXplKCZ2bWQtPmRl di0+cmVzb3VyY2VbVk1EX0NGR0JBUl0pKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiBhZGRy OworCXJldHVybiB2bWQtPmNmZ2JhciArIG9mZnNldDsKIH0KIAogLyoKQEAgLTM0Nyw3ICszNDYs NyBAQCBzdGF0aWMgaW50IHZtZF9wY2lfcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25l ZCBpbnQgZGV2Zm4sIGludCByZWcsCiAJCQlpbnQgbGVuLCB1MzIgKnZhbHVlKQogewogCXN0cnVj dCB2bWRfZGV2ICp2bWQgPSB2bWRfZnJvbV9idXMoYnVzKTsKLQljaGFyIF9faW9tZW0gKmFkZHIg PSB2bWRfY2ZnX2FkZHIodm1kLCBidXMsIGRldmZuLCByZWcsIGxlbik7CisJdm9pZCBfX2lvbWVt ICphZGRyID0gdm1kX2NmZ19hZGRyKHZtZCwgYnVzLCBkZXZmbiwgcmVnLCBsZW4pOwogCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKQEAgLTM4Miw3ICszODEsNyBAQCBzdGF0 aWMgaW50IHZtZF9wY2lfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRl dmZuLCBpbnQgcmVnLAogCQkJIGludCBsZW4sIHUzMiB2YWx1ZSkKIHsKIAlzdHJ1Y3Qgdm1kX2Rl diAqdm1kID0gdm1kX2Zyb21fYnVzKGJ1cyk7Ci0JY2hhciBfX2lvbWVtICphZGRyID0gdm1kX2Nm Z19hZGRyKHZtZCwgYnVzLCBkZXZmbiwgcmVnLCBsZW4pOworCXZvaWQgX19pb21lbSAqYWRkciA9 IHZtZF9jZmdfYWRkcih2bWQsIGJ1cywgZGV2Zm4sIHJlZywgbGVuKTsKIAl1bnNpZ25lZCBsb25n IGZsYWdzOwogCWludCByZXQgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9lY2FtLmMg Yi9kcml2ZXJzL3BjaS9lY2FtLmMKaW5kZXggYjU0ZDMyYTMxNjY5Li4xZTAyMjk3NjUzNDkgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2VjYW0uYworKysgYi9kcml2ZXJzL3BjaS9lY2FtLmMKQEAg LTE0OSw3ICsxNDksNyBAQCBFWFBPUlRfU1lNQk9MX0dQTChwY2lfZWNhbV9tYXBfYnVzKTsKIAog LyogRUNBTSBvcHMgKi8KIGNvbnN0IHN0cnVjdCBwY2lfZWNhbV9vcHMgcGNpX2dlbmVyaWNfZWNh bV9vcHMgPSB7Ci0JLmJ1c19zaGlmdAk9IDIwLAorCS5idXNfc2hpZnQJPSBQQ0lFX0VDQU1fQlVT X1NISUZULAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1cwk9IHBjaV9lY2FtX21hcF9idXMsCiAJ CS5yZWFkCQk9IHBjaV9nZW5lcmljX2NvbmZpZ19yZWFkLApAQCAtMTYxLDcgKzE2MSw3IEBAIEVY UE9SVF9TWU1CT0xfR1BMKHBjaV9nZW5lcmljX2VjYW1fb3BzKTsKICNpZiBkZWZpbmVkKENPTkZJ R19BQ1BJKSAmJiBkZWZpbmVkKENPTkZJR19QQ0lfUVVJUktTKQogLyogRUNBTSBvcHMgZm9yIDMy LWJpdCBhY2Nlc3Mgb25seSAobm9uLWNvbXBsaWFudCkgKi8KIGNvbnN0IHN0cnVjdCBwY2lfZWNh bV9vcHMgcGNpXzMyYl9vcHMgPSB7Ci0JLmJ1c19zaGlmdAk9IDIwLAorCS5idXNfc2hpZnQJPSBQ Q0lFX0VDQU1fQlVTX1NISUZULAogCS5wY2lfb3BzCT0gewogCQkubWFwX2J1cwk9IHBjaV9lY2Ft X21hcF9idXMsCiAJCS5yZWFkCQk9IHBjaV9nZW5lcmljX2NvbmZpZ19yZWFkMzIsCmRpZmYgLS1n aXQgYS9pbmNsdWRlL2xpbnV4L3BjaS1lY2FtLmggYi9pbmNsdWRlL2xpbnV4L3BjaS1lY2FtLmgK aW5kZXggMDMzY2U3NGYwMmU4Li45NzY3OTIyNDYxY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlu dXgvcGNpLWVjYW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1lY2FtLmgKQEAgLTksNiArOSwy OSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3Jt X2RldmljZS5oPgogCisvKgorICogTWVtb3J5IGFkZHJlc3Mgc2hpZnQgdmFsdWVzIGZvciB0aGUg Ynl0ZS1sZXZlbCBhZGRyZXNzIHRoYXQKKyAqIGNhbiBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIHRo ZSBQQ0kgRXhwcmVzcyBDb25maWd1cmF0aW9uIFNwYWNlLgorICovCisKKy8qCisgKiBFbmhhbmNl ZCBDb25maWd1cmF0aW9uIEFjY2VzcyBNZWNoYW5pc20gKEVDQU0pCisgKgorICogU2VlIFBDSSBF eHByZXNzIEJhc2UgU3BlY2lmaWNhdGlvbiwgUmV2aXNpb24gNS4wLCBWZXJzaW9uIDEuMCwKKyAq IFNlY3Rpb24gNy4yLjIsIFRhYmxlIDctMSwgcC4gNjc3LgorICovCisjZGVmaW5lIFBDSUVfRUNB TV9CVVNfU0hJRlQJMjAgLyogQnVzIE51bWJlciAqLworI2RlZmluZSBQQ0lFX0VDQU1fREVWRk5f U0hJRlQJMTIgLyogRGV2aWNlIGFuZCBGdW5jdGlvbiBOdW1iZXIgKi8KKworI2RlZmluZSBQQ0lF X0VDQU1fQlVTKHgpCSgoKHgpICYgMHhmZikgPDwgUENJRV9FQ0FNX0JVU19TSElGVCkKKyNkZWZp bmUgUENJRV9FQ0FNX0RFVkZOKHgpCSgoKHgpICYgMHhmZikgPDwgUENJRV9FQ0FNX0RFVkZOX1NI SUZUKQorI2RlZmluZSBQQ0lFX0VDQU1fUkVHKHgpCSgoeCkgJiAweGZmZikKKworI2RlZmluZSBQ Q0lFX0VDQU1fT0ZGU0VUKGJ1cywgZGV2Zm4sIHdoZXJlKSBcCisJKFBDSUVfRUNBTV9CVVMoYnVz KSB8IFwKKwkgUENJRV9FQ0FNX0RFVkZOKGRldmZuKSB8IFwKKwkgUENJRV9FQ0FNX1JFRyh3aGVy ZSkpCisKIC8qCiAgKiBzdHJ1Y3QgdG8gaG9sZCBwY2kgb3BzIGFuZCBidXMgc2hpZnQgb2YgdGhl IGNvbmZpZyB3aW5kb3cKICAqIGZvciBhIFBDSSBjb250cm9sbGVyLgotLSAKMi4yOS4yCgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtl cm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0 dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5l bAo=