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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8BAC2C43219 for ; Wed, 19 Oct 2022 15:21:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231835AbiJSPVF (ORCPT ); Wed, 19 Oct 2022 11:21:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44942 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231964AbiJSPUl (ORCPT ); Wed, 19 Oct 2022 11:20:41 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1FDDA43E7E; Wed, 19 Oct 2022 08:14:28 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 0105BB824BC; Wed, 19 Oct 2022 15:13:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A7435C433D7; Wed, 19 Oct 2022 15:13:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666192396; bh=cjxPuXIUh06Ba3GXCFfVn99lEclLPcRfw+NxBEe4Kg0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hcqsxINcYzTT3DkcHDdYLB3QHhzbGuZGKInydfT12xgHvQHRd+WIXuP/R+G72JcGv 8UsKYmj1ahxyJmVtwy5znbGtIhatHTgimQ0bKYqVvLf5nT+uoyLG5DlBiSi6wqg8aK HQ7odPwMV3m+iM8lqW+mtYrxkBcwzKfb/bfSHmu4Qr5I1og+Bapxwt6ZVQkX/G2KoZ cGkayXvERL+uxCqkHHjG+BVfiodRgnUnAFLCeVdM3ykW5bKp/Z3iYkiKGbHS5rD5Fm UwAx1OMTozZCpDzK8nNraeh4avjKSnvrpt1R9KBMir1uZtRg/J1vsfUk/yGd0yCJYi JEBd8KCEwHd2w== From: Arnd Bergmann To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , Dan Williams , Lennert Buytenhek , Martin Michlmayr , linux-i2c@vger.kernel.org Subject: [PATCH 09/17] ARM: iop32x: remove the platform Date: Wed, 19 Oct 2022 17:03:31 +0200 Message-Id: <20221019150410.3851944-9-arnd@kernel.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20221019150410.3851944-1-arnd@kernel.org> References: <20221019144119.3848027-1-arnd@kernel.org> <20221019150410.3851944-1-arnd@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org From: Arnd Bergmann This was marked as unused in 5.19 and can now be removed Cc: Dan Williams Cc: Lennert Buytenhek Cc: Martin Michlmayr Signed-off-by: Arnd Bergmann --- MAINTAINERS | 30 --- arch/arm/Kconfig | 4 +- arch/arm/Kconfig.debug | 6 +- arch/arm/Makefile | 1 - arch/arm/configs/iop32x_defconfig | 126 --------- arch/arm/kernel/entry-common.S | 15 -- arch/arm/mach-iop32x/Kconfig | 54 ---- arch/arm/mach-iop32x/Makefile | 20 -- arch/arm/mach-iop32x/adma.c | 163 ------------ arch/arm/mach-iop32x/cp6.c | 48 ---- arch/arm/mach-iop32x/em7210.c | 232 ----------------- arch/arm/mach-iop32x/glantank.c | 214 --------------- arch/arm/mach-iop32x/glantank.h | 12 - arch/arm/mach-iop32x/gpio-iop32x.h | 11 - arch/arm/mach-iop32x/hardware.h | 38 --- arch/arm/mach-iop32x/i2c.c | 92 ------- arch/arm/mach-iop32x/iop3xx.h | 326 ----------------------- arch/arm/mach-iop32x/iq31244.c | 333 ------------------------ arch/arm/mach-iop32x/iq31244.h | 16 -- arch/arm/mach-iop32x/iq80321.c | 192 -------------- arch/arm/mach-iop32x/iq80321.h | 16 -- arch/arm/mach-iop32x/irq.c | 95 ------- arch/arm/mach-iop32x/irqs.h | 48 ---- arch/arm/mach-iop32x/n2100.c | 367 -------------------------- arch/arm/mach-iop32x/n2100.h | 18 -- arch/arm/mach-iop32x/pci.c | 404 ----------------------------- arch/arm/mach-iop32x/pmu.c | 29 --- arch/arm/mach-iop32x/restart.c | 17 -- arch/arm/mach-iop32x/setup.c | 31 --- arch/arm/mach-iop32x/time.c | 179 ------------- drivers/i2c/busses/Kconfig | 6 +- 31 files changed, 6 insertions(+), 3137 deletions(-) delete mode 100644 arch/arm/configs/iop32x_defconfig delete mode 100644 arch/arm/mach-iop32x/Kconfig delete mode 100644 arch/arm/mach-iop32x/Makefile delete mode 100644 arch/arm/mach-iop32x/adma.c delete mode 100644 arch/arm/mach-iop32x/cp6.c delete mode 100644 arch/arm/mach-iop32x/em7210.c delete mode 100644 arch/arm/mach-iop32x/glantank.c delete mode 100644 arch/arm/mach-iop32x/glantank.h delete mode 100644 arch/arm/mach-iop32x/gpio-iop32x.h delete mode 100644 arch/arm/mach-iop32x/hardware.h delete mode 100644 arch/arm/mach-iop32x/i2c.c delete mode 100644 arch/arm/mach-iop32x/iop3xx.h delete mode 100644 arch/arm/mach-iop32x/iq31244.c delete mode 100644 arch/arm/mach-iop32x/iq31244.h delete mode 100644 arch/arm/mach-iop32x/iq80321.c delete mode 100644 arch/arm/mach-iop32x/iq80321.h delete mode 100644 arch/arm/mach-iop32x/irq.c delete mode 100644 arch/arm/mach-iop32x/irqs.h delete mode 100644 arch/arm/mach-iop32x/n2100.c delete mode 100644 arch/arm/mach-iop32x/n2100.h delete mode 100644 arch/arm/mach-iop32x/pci.c delete mode 100644 arch/arm/mach-iop32x/pmu.c delete mode 100644 arch/arm/mach-iop32x/restart.c delete mode 100644 arch/arm/mach-iop32x/setup.c delete mode 100644 arch/arm/mach-iop32x/time.c diff --git a/MAINTAINERS b/MAINTAINERS index 89f72dba8e64..da1ff468e27d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2215,21 +2215,6 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) S: Maintained F: arch/arm/mach-pxa/colibri-pxa270-income.c -ARM/INTEL IOP32X ARM ARCHITECTURE -M: Lennert Buytenhek -L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) -S: Maintained - -ARM/INTEL IQ81342EX MACHINE SUPPORT -M: Lennert Buytenhek -L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) -S: Maintained - -ARM/INTEL IXDP2850 MACHINE SUPPORT -M: Lennert Buytenhek -L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) -S: Maintained - ARM/INTEL IXP4XX ARM ARCHITECTURE M: Linus Walleij M: Imre Kaloz @@ -2635,11 +2620,6 @@ F: include/dt-bindings/*/qcom* F: include/linux/*/qcom* F: include/linux/soc/qcom/ -ARM/RADISYS ENP2611 MACHINE SUPPORT -M: Lennert Buytenhek -L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) -S: Maintained - ARM/RDA MICRO ARCHITECTURE M: Manivannan Sadhasivam L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) @@ -2971,11 +2951,6 @@ F: arch/arm64/boot/dts/ti/Makefile F: arch/arm64/boot/dts/ti/k3-* F: include/dt-bindings/pinctrl/k3.h -ARM/THECUS N2100 MACHINE SUPPORT -M: Lennert Buytenhek -L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) -S: Maintained - ARM/TOSA MACHINE SUPPORT M: Dmitry Eremin-Solenikov M: Dirk Opfer @@ -10307,11 +10282,6 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git F: drivers/iommu/intel/ F: include/linux/intel-svm.h -INTEL IOP-ADMA DMA DRIVER -R: Dan Williams -S: Odd fixes -F: drivers/dma/iop-adma.c - INTEL IPU3 CSI-2 CIO2 DRIVER M: Yong Zhi M: Sakari Ailus diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index e58dab0303e6..698d88343e8e 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -280,7 +280,7 @@ config PHYS_OFFSET default 0x00000000 if ARCH_FOOTBRIDGE default 0x10000000 if ARCH_OMAP1 || ARCH_RPC default 0x30000000 if ARCH_S3C24XX - default 0xa0000000 if ARCH_IOP32X || ARCH_PXA + default 0xa0000000 if ARCH_PXA default 0xc0000000 if ARCH_EP93XX || ARCH_SA1100 default 0 help @@ -455,8 +455,6 @@ source "arch/arm/mach-hpe/Kconfig" source "arch/arm/mach-imx/Kconfig" -source "arch/arm/mach-iop32x/Kconfig" - source "arch/arm/mach-ixp4xx/Kconfig" source "arch/arm/mach-keystone/Kconfig" diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 3b11e1d04625..320c93fabb21 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug @@ -1610,7 +1610,7 @@ config DEBUG_UART_PL01X # Compatibility options for 8250 config DEBUG_UART_8250 - def_bool ARCH_IOP32X || ARCH_IXP4XX || ARCH_RPC + def_bool ARCH_IXP4XX || ARCH_RPC config DEBUG_UART_PHYS hex "Physical base address of debug UART" @@ -1720,7 +1720,6 @@ config DEBUG_UART_PHYS default 0xfcb00000 if DEBUG_HI3620_UART default 0xfd883000 if DEBUG_ALPINE_UART0 default 0xfe531000 if DEBUG_STIH41X_SBC_ASC1 - default 0xfe800000 if ARCH_IOP32X default 0xfed32000 if DEBUG_STIH41X_ASC2 default 0xff690000 if DEBUG_RK32_UART2 default 0xffc02000 if DEBUG_SOCFPGA_UART0 @@ -1825,7 +1824,6 @@ config DEBUG_UART_VIRT default 0xfe018000 if DEBUG_MMP_UART3 default 0xfe100000 if DEBUG_IMX23_UART || DEBUG_IMX28_UART default 0xfe300000 if DEBUG_BCM_KONA_UART - default 0xfe800000 if ARCH_IOP32X default 0xfeb00000 if DEBUG_HI3620_UART || DEBUG_HIX5HD2_UART default 0xfeb24000 if DEBUG_RK3X_UART0 default 0xfeb26000 if DEBUG_RK3X_UART1 @@ -1867,7 +1865,7 @@ config DEBUG_UART_VIRT config DEBUG_UART_8250_SHIFT int "Register offset shift for the 8250 debug UART" depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250 - default 0 if DEBUG_FOOTBRIDGE_COM1 || ARCH_IOP32X || DEBUG_BCM_5301X || \ + default 0 if DEBUG_FOOTBRIDGE_COM1 || DEBUG_BCM_5301X || \ DEBUG_BCM_HR2 || DEBUG_OMAP7XXUART1 || DEBUG_OMAP7XXUART2 || \ DEBUG_OMAP7XXUART3 default 3 if DEBUG_MSTARV7_PMUART diff --git a/arch/arm/Makefile b/arch/arm/Makefile index beda22911feb..1a62035d1207 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -179,7 +179,6 @@ machine-$(CONFIG_ARCH_GEMINI) += gemini machine-$(CONFIG_ARCH_HIGHBANK) += highbank machine-$(CONFIG_ARCH_HISI) += hisi machine-$(CONFIG_ARCH_HPE) += hpe -machine-$(CONFIG_ARCH_IOP32X) += iop32x machine-$(CONFIG_ARCH_IXP4XX) += ixp4xx machine-$(CONFIG_ARCH_KEYSTONE) += keystone machine-$(CONFIG_ARCH_LPC18XX) += lpc18xx diff --git a/arch/arm/configs/iop32x_defconfig b/arch/arm/configs/iop32x_defconfig deleted file mode 100644 index 19e30e790d35..000000000000 --- a/arch/arm/configs/iop32x_defconfig +++ /dev/null @@ -1,126 +0,0 @@ -CONFIG_SYSVIPC=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_BLK_DEV_INITRD=y -CONFIG_KALLSYMS_ALL=y -# CONFIG_ARCH_MULTI_V7 is not set -CONFIG_ARCH_IOP32X=y -CONFIG_MACH_GLANTANK=y -CONFIG_ARCH_IQ80321=y -CONFIG_ARCH_IQ31244=y -CONFIG_MACH_N2100=y -CONFIG_UNUSED_BOARD_FILES=y -CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp cachepolicy=writealloc" -CONFIG_FPE_NWFPE=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -CONFIG_PARTITION_ADVANCED=y -CONFIG_SLAB=y -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_PNP=y -CONFIG_IP_PNP_BOOTP=y -CONFIG_IPV6=y -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_IPV6_SIT is not set -CONFIG_MTD=y -CONFIG_MTD_REDBOOT_PARTS=y -CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y -CONFIG_MTD_REDBOOT_PARTS_READONLY=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_CFI=y -CONFIG_MTD_CFI_INTELEXT=y -CONFIG_MTD_PHYSMAP=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_NBD=y -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=8192 -CONFIG_BLK_DEV_SD=y -CONFIG_CHR_DEV_SG=y -# CONFIG_BLK_DEV_BSG is not set -CONFIG_ATA=y -CONFIG_SATA_SIL=y -CONFIG_SATA_VITESSE=y -CONFIG_MD=y -CONFIG_BLK_DEV_MD=y -CONFIG_MD_RAID0=y -CONFIG_MD_RAID1=y -CONFIG_MD_RAID10=y -CONFIG_MD_RAID456=y -CONFIG_BLK_DEV_DM=y -CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y -CONFIG_NET_PCI=y -CONFIG_E100=y -CONFIG_E1000=y -CONFIG_R8169=y -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_HW_RANDOM=y -CONFIG_I2C=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_IOP3XX=y -# CONFIG_VGA_CONSOLE is not set -# CONFIG_USB_HID is not set -CONFIG_USB=y -CONFIG_USB_MON=y -CONFIG_USB_EHCI_HCD=y -CONFIG_USB_EHCI_ROOT_HUB_TT=y -CONFIG_USB_EHCI_TT_NEWSCHED=y -CONFIG_USB_UHCI_HCD=y -CONFIG_USB_STORAGE=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_DRV_RS5C372=y -CONFIG_DMADEVICES=y -CONFIG_INTEL_IOP_ADMA=y -CONFIG_NET_DMA=y -CONFIG_EXT2_FS=y -CONFIG_EXT3_FS=y -CONFIG_TMPFS=y -CONFIG_ECRYPT_FS=y -CONFIG_JFFS2_FS=y -CONFIG_CRAMFS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_ROOT_NFS=y -CONFIG_NFSD=y -CONFIG_KEYS=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_LRW=y -CONFIG_CRYPTO_PCBC=m -CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_XCBC=y -CONFIG_CRYPTO_MD4=y -CONFIG_CRYPTO_MICHAEL_MIC=y -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_SHA512=y -CONFIG_CRYPTO_TGR192=y -CONFIG_CRYPTO_WP512=y -CONFIG_CRYPTO_AES=y -CONFIG_CRYPTO_ANUBIS=y -CONFIG_CRYPTO_ARC4=y -CONFIG_CRYPTO_BLOWFISH=y -CONFIG_CRYPTO_CAST5=y -CONFIG_CRYPTO_CAST6=y -CONFIG_CRYPTO_DES=y -CONFIG_CRYPTO_KHAZAD=y -CONFIG_CRYPTO_SERPENT=y -CONFIG_CRYPTO_TEA=y -CONFIG_CRYPTO_TWOFISH=y -CONFIG_CRYPTO_DEFLATE=y -CONFIG_LIBCRC32C=y -CONFIG_DEBUG_KERNEL=y -CONFIG_MAGIC_SYSRQ=y -CONFIG_DEBUG_USER=y -CONFIG_DEBUG_LL=y -CONFIG_DEBUG_LL_UART_8250=y diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 405a607b754f..03d4c5578c5c 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -16,15 +16,6 @@ .equ NR_syscalls, __NR_syscalls - .macro arch_ret_to_user, tmp -#ifdef CONFIG_ARCH_IOP32X - mrc p15, 0, \tmp, c15, c1, 0 - tst \tmp, #(1 << 6) - bicne \tmp, \tmp, #(1 << 6) - mcrne p15, 0, \tmp, c15, c1, 0 @ Disable cp6 access -#endif - .endm - #include "entry-header.S" saved_psr .req r8 @@ -55,10 +46,6 @@ __ret_fast_syscall: movs r1, r1, lsl #16 bne fast_work_pending - - /* perform architecture specific actions before user return */ - arch_ret_to_user r1 - restore_user_regs fast = 1, offset = S_OFF UNWIND(.fnend ) ENDPROC(ret_fast_syscall) @@ -129,8 +116,6 @@ ENTRY(ret_to_user_from_irq) no_work_pending: asm_trace_hardirqs_on save = 0 - /* perform architecture specific actions before user return */ - arch_ret_to_user r1 ct_user_enter save = 0 restore_user_regs fast = 0, offset = 0 diff --git a/arch/arm/mach-iop32x/Kconfig b/arch/arm/mach-iop32x/Kconfig deleted file mode 100644 index 761fbb04faa1..000000000000 --- a/arch/arm/mach-iop32x/Kconfig +++ /dev/null @@ -1,54 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -menuconfig ARCH_IOP32X - bool "IOP32x-based platforms" - depends on ARCH_MULTI_V5 - depends on CPU_LITTLE_ENDIAN - depends on ATAGS && UNUSED_BOARD_FILES - select CPU_XSCALE - select GPIO_IOP - select GPIOLIB - select FORCE_PCI - help - Support for Intel's 80219 and IOP32X (XScale) family of - processors. - -if ARCH_IOP32X - -config MACH_EP80219 - bool - -config MACH_GLANTANK - bool "Enable support for the IO-Data GLAN Tank" - help - Say Y here if you want to run your kernel on the GLAN Tank - NAS appliance or machines from IO-Data's HDL-Gxxx, HDL-GWxxx - and HDL-GZxxx series. - -config ARCH_IQ80321 - bool "Enable support for IQ80321" - help - Say Y here if you want to run your kernel on the Intel IQ80321 - evaluation kit for the IOP321 processor. - -config ARCH_IQ31244 - bool "Enable support for EP80219/IQ31244" - select MACH_EP80219 - help - Say Y here if you want to run your kernel on the Intel EP80219 - evaluation kit for the Intel 80219 processor (a IOP321 variant) - or the IQ31244 evaluation kit for the IOP321 processor. - -config MACH_N2100 - bool "Enable support for the Thecus n2100" - help - Say Y here if you want to run your kernel on the Thecus n2100 - NAS appliance. - -config MACH_EM7210 - bool "Enable support for the Lanner EM7210" - help - Say Y here if you want to run your kernel on the Lanner EM7210 - board. Say also Y here if you have a SS4000e Baxter Creek NAS - appliance." - -endif diff --git a/arch/arm/mach-iop32x/Makefile b/arch/arm/mach-iop32x/Makefile deleted file mode 100644 index c8018ef5c6a9..000000000000 --- a/arch/arm/mach-iop32x/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Makefile for the linux kernel. -# - -obj-$(CONFIG_ARCH_IOP32X) += irq.o -obj-$(CONFIG_ARCH_IOP32X) += i2c.o -obj-$(CONFIG_ARCH_IOP32X) += pci.o -obj-$(CONFIG_ARCH_IOP32X) += setup.o -obj-$(CONFIG_ARCH_IOP32X) += time.o -obj-$(CONFIG_ARCH_IOP32X) += cp6.o -obj-$(CONFIG_ARCH_IOP32X) += adma.o -obj-$(CONFIG_ARCH_IOP32X) += pmu.o -obj-$(CONFIG_ARCH_IOP32X) += restart.o - -obj-$(CONFIG_MACH_GLANTANK) += glantank.o -obj-$(CONFIG_ARCH_IQ80321) += iq80321.o -obj-$(CONFIG_ARCH_IQ31244) += iq31244.o -obj-$(CONFIG_MACH_N2100) += n2100.o -obj-$(CONFIG_MACH_EM7210) += em7210.o diff --git a/arch/arm/mach-iop32x/adma.c b/arch/arm/mach-iop32x/adma.c deleted file mode 100644 index 764bcbff98df..000000000000 --- a/arch/arm/mach-iop32x/adma.c +++ /dev/null @@ -1,163 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * platform device definitions for the iop3xx dma/xor engines - * Copyright © 2006, Intel Corporation. - */ -#include -#include -#include - -#include "iop3xx.h" -#include "irqs.h" - -#define IRQ_DMA0_EOT IRQ_IOP32X_DMA0_EOT -#define IRQ_DMA0_EOC IRQ_IOP32X_DMA0_EOC -#define IRQ_DMA0_ERR IRQ_IOP32X_DMA0_ERR - -#define IRQ_DMA1_EOT IRQ_IOP32X_DMA1_EOT -#define IRQ_DMA1_EOC IRQ_IOP32X_DMA1_EOC -#define IRQ_DMA1_ERR IRQ_IOP32X_DMA1_ERR - -#define IRQ_AA_EOT IRQ_IOP32X_AA_EOT -#define IRQ_AA_EOC IRQ_IOP32X_AA_EOC -#define IRQ_AA_ERR IRQ_IOP32X_AA_ERR - -/* AAU and DMA Channels */ -static struct resource iop3xx_dma_0_resources[] = { - [0] = { - .start = IOP3XX_DMA_PHYS_BASE(0), - .end = IOP3XX_DMA_UPPER_PA(0), - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_DMA0_EOT, - .end = IRQ_DMA0_EOT, - .flags = IORESOURCE_IRQ - }, - [2] = { - .start = IRQ_DMA0_EOC, - .end = IRQ_DMA0_EOC, - .flags = IORESOURCE_IRQ - }, - [3] = { - .start = IRQ_DMA0_ERR, - .end = IRQ_DMA0_ERR, - .flags = IORESOURCE_IRQ - } -}; - -static struct resource iop3xx_dma_1_resources[] = { - [0] = { - .start = IOP3XX_DMA_PHYS_BASE(1), - .end = IOP3XX_DMA_UPPER_PA(1), - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_DMA1_EOT, - .end = IRQ_DMA1_EOT, - .flags = IORESOURCE_IRQ - }, - [2] = { - .start = IRQ_DMA1_EOC, - .end = IRQ_DMA1_EOC, - .flags = IORESOURCE_IRQ - }, - [3] = { - .start = IRQ_DMA1_ERR, - .end = IRQ_DMA1_ERR, - .flags = IORESOURCE_IRQ - } -}; - - -static struct resource iop3xx_aau_resources[] = { - [0] = { - .start = IOP3XX_AAU_PHYS_BASE, - .end = IOP3XX_AAU_UPPER_PA, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_AA_EOT, - .end = IRQ_AA_EOT, - .flags = IORESOURCE_IRQ - }, - [2] = { - .start = IRQ_AA_EOC, - .end = IRQ_AA_EOC, - .flags = IORESOURCE_IRQ - }, - [3] = { - .start = IRQ_AA_ERR, - .end = IRQ_AA_ERR, - .flags = IORESOURCE_IRQ - } -}; - -static u64 iop3xx_adma_dmamask = DMA_BIT_MASK(32); - -static struct iop_adma_platform_data iop3xx_dma_0_data = { - .hw_id = DMA0_ID, - .pool_size = PAGE_SIZE, -}; - -static struct iop_adma_platform_data iop3xx_dma_1_data = { - .hw_id = DMA1_ID, - .pool_size = PAGE_SIZE, -}; - -static struct iop_adma_platform_data iop3xx_aau_data = { - .hw_id = AAU_ID, - .pool_size = 3 * PAGE_SIZE, -}; - -struct platform_device iop3xx_dma_0_channel = { - .name = "iop-adma", - .id = 0, - .num_resources = 4, - .resource = iop3xx_dma_0_resources, - .dev = { - .dma_mask = &iop3xx_adma_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = (void *) &iop3xx_dma_0_data, - }, -}; - -struct platform_device iop3xx_dma_1_channel = { - .name = "iop-adma", - .id = 1, - .num_resources = 4, - .resource = iop3xx_dma_1_resources, - .dev = { - .dma_mask = &iop3xx_adma_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = (void *) &iop3xx_dma_1_data, - }, -}; - -struct platform_device iop3xx_aau_channel = { - .name = "iop-adma", - .id = 2, - .num_resources = 4, - .resource = iop3xx_aau_resources, - .dev = { - .dma_mask = &iop3xx_adma_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = (void *) &iop3xx_aau_data, - }, -}; - -static int __init iop3xx_adma_cap_init(void) -{ - dma_cap_set(DMA_MEMCPY, iop3xx_dma_0_data.cap_mask); - dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask); - - dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask); - dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask); - - dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask); - dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask); - - return 0; -} - -arch_initcall(iop3xx_adma_cap_init); diff --git a/arch/arm/mach-iop32x/cp6.c b/arch/arm/mach-iop32x/cp6.c deleted file mode 100644 index 7135a0ac9949..000000000000 --- a/arch/arm/mach-iop32x/cp6.c +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * IOP Coprocessor-6 access handler - * Copyright (c) 2006, Intel Corporation. - */ -#include -#include -#include - -#include "iop3xx.h" - -void iop_enable_cp6(void) -{ - u32 temp; - - /* enable cp6 access */ - asm volatile ( - "mrc p15, 0, %0, c15, c1, 0\n\t" - "orr %0, %0, #(1 << 6)\n\t" - "mcr p15, 0, %0, c15, c1, 0\n\t" - "mrc p15, 0, %0, c15, c1, 0\n\t" - "mov %0, %0\n\t" - "sub pc, pc, #4 @ cp_wait\n\t" - : "=r"(temp)); -} - -static int cp6_trap(struct pt_regs *regs, unsigned int instr) -{ - iop_enable_cp6(); - - return 0; -} - -/* permit kernel space cp6 access - * deny user space cp6 access - */ -static struct undef_hook cp6_hook = { - .instr_mask = 0x0f000ff0, - .instr_val = 0x0e000610, - .cpsr_mask = MODE_MASK, - .cpsr_val = SVC_MODE, - .fn = cp6_trap, -}; - -void __init iop_init_cp6_handler(void) -{ - register_undef_hook(&cp6_hook); -} diff --git a/arch/arm/mach-iop32x/em7210.c b/arch/arm/mach-iop32x/em7210.c deleted file mode 100644 index ac130aba5a6e..000000000000 --- a/arch/arm/mach-iop32x/em7210.c +++ /dev/null @@ -1,232 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * arch/arm/mach-iop32x/em7210.c - * - * Board support code for the Lanner EM7210 platforms. - * - * Based on arch/arm/mach-iop32x/iq31244.c file. - * - * Copyright (C) 2007 Arnaud Patard - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hardware.h" -#include "gpio-iop32x.h" -#include "irqs.h" - -static void __init em7210_timer_init(void) -{ - /* http://www.kwaak.net/fotos/fotos-nas/slide_24.html */ - /* 33.333 MHz crystal. */ - iop_init_time(200000000); -} - -/* - * EM7210 RTC - */ -static struct i2c_board_info __initdata em7210_i2c_devices[] = { - { - I2C_BOARD_INFO("rs5c372a", 0x32), - }, -}; - -/* - * EM7210 I/O - */ -static struct map_desc em7210_io_desc[] __initdata = { - { /* on-board devices */ - .virtual = IQ31244_UART, - .pfn = __phys_to_pfn(IQ31244_UART), - .length = 0x00100000, - .type = MT_DEVICE, - }, -}; - -void __init em7210_map_io(void) -{ - iop3xx_map_io(); - iotable_init(em7210_io_desc, ARRAY_SIZE(em7210_io_desc)); -} - - -/* - * EM7210 PCI - */ -#define INTA IRQ_IOP32X_XINT0 -#define INTB IRQ_IOP32X_XINT1 -#define INTC IRQ_IOP32X_XINT2 -#define INTD IRQ_IOP32X_XINT3 - -static int __init -em7210_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) -{ - static int pci_irq_table[][4] = { - /* - * PCI IDSEL/INTPIN->INTLINE - * A B C D - */ - {INTB, INTB, INTB, INTB}, /* console / uart */ - {INTA, INTA, INTA, INTA}, /* 1st 82541 */ - {INTD, INTD, INTD, INTD}, /* 2nd 82541 */ - {INTC, INTC, INTC, INTC}, /* GD31244 */ - {INTD, INTA, INTA, INTA}, /* mini-PCI */ - {INTD, INTC, INTA, INTA}, /* NEC USB */ - }; - - if (pin < 1 || pin > 4) - return -1; - - return pci_irq_table[slot % 6][pin - 1]; -} - -static struct hw_pci em7210_pci __initdata = { - .nr_controllers = 1, - .ops = &iop3xx_ops, - .setup = iop3xx_pci_setup, - .preinit = iop3xx_pci_preinit, - .map_irq = em7210_pci_map_irq, -}; - -static int __init em7210_pci_init(void) -{ - if (machine_is_em7210()) - pci_common_init(&em7210_pci); - - return 0; -} - -subsys_initcall(em7210_pci_init); - - -/* - * EM7210 Flash - */ -static struct physmap_flash_data em7210_flash_data = { - .width = 2, -}; - -static struct resource em7210_flash_resource = { - .start = 0xf0000000, - .end = 0xf1ffffff, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device em7210_flash_device = { - .name = "physmap-flash", - .id = 0, - .dev = { - .platform_data = &em7210_flash_data, - }, - .num_resources = 1, - .resource = &em7210_flash_resource, -}; - - -/* - * EM7210 UART - * The physical address of the serial port is 0xfe800000, - * so it can be used for physical and virtual address. - */ -static struct plat_serial8250_port em7210_serial_port[] = { - { - .mapbase = IQ31244_UART, - .membase = (char *)IQ31244_UART, - .irq = IRQ_IOP32X_XINT1, - .flags = UPF_SKIP_TEST, - .iotype = UPIO_MEM, - .regshift = 0, - .uartclk = 1843200, - }, - { }, -}; - -static struct resource em7210_uart_resource = { - .start = IQ31244_UART, - .end = IQ31244_UART + 7, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device em7210_serial_device = { - .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM, - .dev = { - .platform_data = em7210_serial_port, - }, - .num_resources = 1, - .resource = &em7210_uart_resource, -}; - -#define EM7210_HARDWARE_POWER 0 - -void em7210_power_off(void) -{ - int ret; - - ret = gpio_direction_output(EM7210_HARDWARE_POWER, 1); - if (ret) - pr_crit("could not drive power off GPIO high\n"); -} - -static int __init em7210_request_gpios(void) -{ - int ret; - - if (!machine_is_em7210()) - return 0; - - ret = gpio_request(EM7210_HARDWARE_POWER, "power"); - if (ret) { - pr_err("could not request power off GPIO\n"); - return 0; - } - - pm_power_off = em7210_power_off; - - return 0; -} -device_initcall(em7210_request_gpios); - -static void __init em7210_init_machine(void) -{ - register_iop32x_gpio(); - platform_device_register(&em7210_serial_device); - gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup); - gpiod_add_lookup_table(&iop3xx_i2c1_gpio_lookup); - platform_device_register(&iop3xx_i2c0_device); - platform_device_register(&iop3xx_i2c1_device); - platform_device_register(&em7210_flash_device); - platform_device_register(&iop3xx_dma_0_channel); - platform_device_register(&iop3xx_dma_1_channel); - - i2c_register_board_info(0, em7210_i2c_devices, - ARRAY_SIZE(em7210_i2c_devices)); -} - -MACHINE_START(EM7210, "Lanner EM7210") - .atag_offset = 0x100, - .nr_irqs = IOP32X_NR_IRQS, - .map_io = em7210_map_io, - .init_irq = iop32x_init_irq, - .init_time = em7210_timer_init, - .init_machine = em7210_init_machine, - .restart = iop3xx_restart, -MACHINE_END diff --git a/arch/arm/mach-iop32x/glantank.c b/arch/arm/mach-iop32x/glantank.c deleted file mode 100644 index cd6e7da2ea10..000000000000 --- a/arch/arm/mach-iop32x/glantank.c +++ /dev/null @@ -1,214 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * arch/arm/mach-iop32x/glantank.c - * - * Board support code for the GLAN Tank. - * - * Copyright (C) 2006, 2007 Martin Michlmayr - * Copyright (C) 2006 Lennert Buytenhek - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hardware.h" -#include "gpio-iop32x.h" -#include "irqs.h" - -/* - * GLAN Tank timer tick configuration. - */ -static void __init glantank_timer_init(void) -{ - /* 33.333 MHz crystal. */ - iop_init_time(200000000); -} - - -/* - * GLAN Tank I/O. - */ -static struct map_desc glantank_io_desc[] __initdata = { - { /* on-board devices */ - .virtual = GLANTANK_UART, - .pfn = __phys_to_pfn(GLANTANK_UART), - .length = 0x00100000, - .type = MT_DEVICE - }, -}; - -void __init glantank_map_io(void) -{ - iop3xx_map_io(); - iotable_init(glantank_io_desc, ARRAY_SIZE(glantank_io_desc)); -} - - -/* - * GLAN Tank PCI. - */ -#define INTA IRQ_IOP32X_XINT0 -#define INTB IRQ_IOP32X_XINT1 -#define INTC IRQ_IOP32X_XINT2 -#define INTD IRQ_IOP32X_XINT3 - -static int __init -glantank_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) -{ - static int pci_irq_table[][4] = { - /* - * PCI IDSEL/INTPIN->INTLINE - * A B C D - */ - {INTD, INTD, INTD, INTD}, /* UART (8250) */ - {INTA, INTA, INTA, INTA}, /* Ethernet (E1000) */ - {INTB, INTB, INTB, INTB}, /* IDE (AEC6280R) */ - {INTC, INTC, INTC, INTC}, /* USB (NEC) */ - }; - - BUG_ON(pin < 1 || pin > 4); - - return pci_irq_table[slot % 4][pin - 1]; -} - -static struct hw_pci glantank_pci __initdata = { - .nr_controllers = 1, - .ops = &iop3xx_ops, - .setup = iop3xx_pci_setup, - .preinit = iop3xx_pci_preinit, - .map_irq = glantank_pci_map_irq, -}; - -static int __init glantank_pci_init(void) -{ - if (machine_is_glantank()) - pci_common_init(&glantank_pci); - - return 0; -} - -subsys_initcall(glantank_pci_init); - - -/* - * GLAN Tank machine initialization. - */ -static struct physmap_flash_data glantank_flash_data = { - .width = 2, -}; - -static struct resource glantank_flash_resource = { - .start = 0xf0000000, - .end = 0xf007ffff, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device glantank_flash_device = { - .name = "physmap-flash", - .id = 0, - .dev = { - .platform_data = &glantank_flash_data, - }, - .num_resources = 1, - .resource = &glantank_flash_resource, -}; - -static struct plat_serial8250_port glantank_serial_port[] = { - { - .mapbase = GLANTANK_UART, - .membase = (char *)GLANTANK_UART, - .irq = IRQ_IOP32X_XINT3, - .flags = UPF_SKIP_TEST, - .iotype = UPIO_MEM, - .regshift = 0, - .uartclk = 1843200, - }, - { }, -}; - -static struct resource glantank_uart_resource = { - .start = GLANTANK_UART, - .end = GLANTANK_UART + 7, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device glantank_serial_device = { - .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM, - .dev = { - .platform_data = glantank_serial_port, - }, - .num_resources = 1, - .resource = &glantank_uart_resource, -}; - -static struct f75375s_platform_data glantank_f75375s = { - .pwm = { 255, 255 }, - .pwm_enable = { 0, 0 }, -}; - -static struct i2c_board_info __initdata glantank_i2c_devices[] = { - { - I2C_BOARD_INFO("rs5c372a", 0x32), - }, - { - I2C_BOARD_INFO("f75375", 0x2e), - .platform_data = &glantank_f75375s, - }, -}; - -static void glantank_power_off(void) -{ - __raw_writeb(0x01, IOMEM(0xfe8d0004)); - - while (1) - ; -} - -static void __init glantank_init_machine(void) -{ - register_iop32x_gpio(); - gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup); - gpiod_add_lookup_table(&iop3xx_i2c1_gpio_lookup); - platform_device_register(&iop3xx_i2c0_device); - platform_device_register(&iop3xx_i2c1_device); - platform_device_register(&glantank_flash_device); - platform_device_register(&glantank_serial_device); - platform_device_register(&iop3xx_dma_0_channel); - platform_device_register(&iop3xx_dma_1_channel); - - i2c_register_board_info(0, glantank_i2c_devices, - ARRAY_SIZE(glantank_i2c_devices)); - - pm_power_off = glantank_power_off; -} - -MACHINE_START(GLANTANK, "GLAN Tank") - /* Maintainer: Lennert Buytenhek */ - .atag_offset = 0x100, - .nr_irqs = IOP32X_NR_IRQS, - .map_io = glantank_map_io, - .init_irq = iop32x_init_irq, - .init_time = glantank_timer_init, - .init_machine = glantank_init_machine, - .restart = iop3xx_restart, -MACHINE_END diff --git a/arch/arm/mach-iop32x/glantank.h b/arch/arm/mach-iop32x/glantank.h deleted file mode 100644 index f38e86b82c3d..000000000000 --- a/arch/arm/mach-iop32x/glantank.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * IO-Data GLAN Tank board registers - */ - -#ifndef __GLANTANK_H -#define __GLANTANK_H - -#define GLANTANK_UART 0xfe800000 /* UART */ - - -#endif diff --git a/arch/arm/mach-iop32x/gpio-iop32x.h b/arch/arm/mach-iop32x/gpio-iop32x.h deleted file mode 100644 index 20af87e4c5e8..000000000000 --- a/arch/arm/mach-iop32x/gpio-iop32x.h +++ /dev/null @@ -1,11 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -static struct resource iop32x_gpio_res[] = { - DEFINE_RES_MEM((IOP3XX_PERIPHERAL_PHYS_BASE + 0x07c4), 0x10), -}; - -static inline void register_iop32x_gpio(void) -{ - platform_device_register_simple("gpio-iop", 0, - iop32x_gpio_res, - ARRAY_SIZE(iop32x_gpio_res)); -} diff --git a/arch/arm/mach-iop32x/hardware.h b/arch/arm/mach-iop32x/hardware.h deleted file mode 100644 index 43ab4fb8f9b0..000000000000 --- a/arch/arm/mach-iop32x/hardware.h +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __HARDWARE_H -#define __HARDWARE_H - -#include - -/* - * Note about PCI IO space mappings - * - * To make IO space accesses efficient, we store virtual addresses in - * the IO resources. - * - * The PCI IO space is located at virtual 0xfe000000 from physical - * 0x90000000. The PCI BARs must be programmed with physical addresses, - * but when we read them, we convert them to virtual addresses. See - * arch/arm/plat-iop/pci.c. - */ - -#ifndef __ASSEMBLY__ -void iop32x_init_irq(void); -#endif - - -/* - * Generic chipset bits - */ -#include "iop3xx.h" - -/* - * Board specific bits - */ -#include "glantank.h" -#include "iq80321.h" -#include "iq31244.h" -#include "n2100.h" - - -#endif diff --git a/arch/arm/mach-iop32x/i2c.c b/arch/arm/mach-iop32x/i2c.c deleted file mode 100644 index e422286af469..000000000000 --- a/arch/arm/mach-iop32x/i2c.c +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * arch/arm/plat-iop/i2c.c - * - * Author: Nicolas Pitre - * Copyright (C) 2001 MontaVista Software, Inc. - * Copyright (C) 2004 Intel Corporation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hardware.h" -#include "iop3xx.h" -#include "irqs.h" - -/* - * Each of the I2C busses have corresponding GPIO lines, and the driver - * need to access these directly to drive the bus low at times. - */ - -struct gpiod_lookup_table iop3xx_i2c0_gpio_lookup = { - .dev_id = "IOP3xx-I2C.0", - .table = { - GPIO_LOOKUP("gpio-iop", 7, "scl", GPIO_ACTIVE_HIGH), - GPIO_LOOKUP("gpio-iop", 6, "sda", GPIO_ACTIVE_HIGH), - { } - }, -}; - -struct gpiod_lookup_table iop3xx_i2c1_gpio_lookup = { - .dev_id = "IOP3xx-I2C.1", - .table = { - GPIO_LOOKUP("gpio-iop", 5, "scl", GPIO_ACTIVE_HIGH), - GPIO_LOOKUP("gpio-iop", 4, "sda", GPIO_ACTIVE_HIGH), - { } - }, -}; - -static struct resource iop3xx_i2c0_resources[] = { - [0] = { - .start = 0xfffff680, - .end = 0xfffff697, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_IOP32X_I2C_0, - .end = IRQ_IOP32X_I2C_0, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device iop3xx_i2c0_device = { - .name = "IOP3xx-I2C", - .id = 0, - .num_resources = 2, - .resource = iop3xx_i2c0_resources, -}; - - -static struct resource iop3xx_i2c1_resources[] = { - [0] = { - .start = 0xfffff6a0, - .end = 0xfffff6b7, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_IOP32X_I2C_1, - .end = IRQ_IOP32X_I2C_1, - .flags = IORESOURCE_IRQ, - } -}; - -struct platform_device iop3xx_i2c1_device = { - .name = "IOP3xx-I2C", - .id = 1, - .num_resources = 2, - .resource = iop3xx_i2c1_resources, -}; diff --git a/arch/arm/mach-iop32x/iop3xx.h b/arch/arm/mach-iop32x/iop3xx.h deleted file mode 100644 index a6ec7ebadb35..000000000000 --- a/arch/arm/mach-iop32x/iop3xx.h +++ /dev/null @@ -1,326 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Intel IOP32X and IOP33X register definitions - * - * Author: Rory Bolt - * Copyright (C) 2002 Rory Bolt - * Copyright (C) 2004 Intel Corp. - */ - -#ifndef __IOP3XX_H -#define __IOP3XX_H - -/* - * Peripherals that are shared between the iop32x and iop33x but - * located at different addresses. - */ -#define IOP3XX_TIMER_REG(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + 0x07e0 + (reg)) - -#include "iop3xx.h" - -/* ATU Parameters - * set up a 1:1 bus to physical ram relationship - * w/ physical ram on top of pci in the memory map - */ -#define IOP32X_MAX_RAM_SIZE 0x40000000UL -#define IOP3XX_MAX_RAM_SIZE IOP32X_MAX_RAM_SIZE -#define IOP3XX_PCI_LOWER_MEM_BA 0x80000000 - -/* - * IOP3XX GPIO handling - */ -#define IOP3XX_GPIO_LINE(x) (x) - -#ifndef __ASSEMBLY__ -extern int init_atu; -extern int iop3xx_get_init_atu(void); -#endif - - -/* - * IOP3XX processor registers - */ -#define IOP3XX_PERIPHERAL_PHYS_BASE 0xffffe000 -#define IOP3XX_PERIPHERAL_VIRT_BASE 0xfedfe000 -#define IOP3XX_PERIPHERAL_SIZE 0x00002000 -#define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\ - IOP3XX_PERIPHERAL_SIZE - 1) -#define IOP3XX_PERIPHERAL_UPPER_VA (IOP3XX_PERIPHERAL_VIRT_BASE +\ - IOP3XX_PERIPHERAL_SIZE - 1) -#define IOP3XX_PMMR_PHYS_TO_VIRT(addr) (u32) ((u32) (addr) -\ - (IOP3XX_PERIPHERAL_PHYS_BASE\ - - IOP3XX_PERIPHERAL_VIRT_BASE)) -#define IOP3XX_REG_ADDR(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + (reg)) - -/* Address Translation Unit */ -#define IOP3XX_ATUVID (volatile u16 *)IOP3XX_REG_ADDR(0x0100) -#define IOP3XX_ATUDID (volatile u16 *)IOP3XX_REG_ADDR(0x0102) -#define IOP3XX_ATUCMD (volatile u16 *)IOP3XX_REG_ADDR(0x0104) -#define IOP3XX_ATUSR (volatile u16 *)IOP3XX_REG_ADDR(0x0106) -#define IOP3XX_ATURID (volatile u8 *)IOP3XX_REG_ADDR(0x0108) -#define IOP3XX_ATUCCR (volatile u32 *)IOP3XX_REG_ADDR(0x0109) -#define IOP3XX_ATUCLSR (volatile u8 *)IOP3XX_REG_ADDR(0x010c) -#define IOP3XX_ATULT (volatile u8 *)IOP3XX_REG_ADDR(0x010d) -#define IOP3XX_ATUHTR (volatile u8 *)IOP3XX_REG_ADDR(0x010e) -#define IOP3XX_ATUBIST (volatile u8 *)IOP3XX_REG_ADDR(0x010f) -#define IOP3XX_IABAR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0110) -#define IOP3XX_IAUBAR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0114) -#define IOP3XX_IABAR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0118) -#define IOP3XX_IAUBAR1 (volatile u32 *)IOP3XX_REG_ADDR(0x011c) -#define IOP3XX_IABAR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0120) -#define IOP3XX_IAUBAR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0124) -#define IOP3XX_ASVIR (volatile u16 *)IOP3XX_REG_ADDR(0x012c) -#define IOP3XX_ASIR (volatile u16 *)IOP3XX_REG_ADDR(0x012e) -#define IOP3XX_ERBAR (volatile u32 *)IOP3XX_REG_ADDR(0x0130) -#define IOP3XX_ATUILR (volatile u8 *)IOP3XX_REG_ADDR(0x013c) -#define IOP3XX_ATUIPR (volatile u8 *)IOP3XX_REG_ADDR(0x013d) -#define IOP3XX_ATUMGNT (volatile u8 *)IOP3XX_REG_ADDR(0x013e) -#define IOP3XX_ATUMLAT (volatile u8 *)IOP3XX_REG_ADDR(0x013f) -#define IOP3XX_IALR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0140) -#define IOP3XX_IATVR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0144) -#define IOP3XX_ERLR (volatile u32 *)IOP3XX_REG_ADDR(0x0148) -#define IOP3XX_ERTVR (volatile u32 *)IOP3XX_REG_ADDR(0x014c) -#define IOP3XX_IALR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0150) -#define IOP3XX_IALR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0154) -#define IOP3XX_IATVR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0158) -#define IOP3XX_OIOWTVR (volatile u32 *)IOP3XX_REG_ADDR(0x015c) -#define IOP3XX_OMWTVR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0160) -#define IOP3XX_OUMWTVR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0164) -#define IOP3XX_OMWTVR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0168) -#define IOP3XX_OUMWTVR1 (volatile u32 *)IOP3XX_REG_ADDR(0x016c) -#define IOP3XX_OUDWTVR (volatile u32 *)IOP3XX_REG_ADDR(0x0178) -#define IOP3XX_ATUCR (volatile u32 *)IOP3XX_REG_ADDR(0x0180) -#define IOP3XX_PCSR (volatile u32 *)IOP3XX_REG_ADDR(0x0184) -#define IOP3XX_ATUISR (volatile u32 *)IOP3XX_REG_ADDR(0x0188) -#define IOP3XX_ATUIMR (volatile u32 *)IOP3XX_REG_ADDR(0x018c) -#define IOP3XX_IABAR3 (volatile u32 *)IOP3XX_REG_ADDR(0x0190) -#define IOP3XX_IAUBAR3 (volatile u32 *)IOP3XX_REG_ADDR(0x0194) -#define IOP3XX_IALR3 (volatile u32 *)IOP3XX_REG_ADDR(0x0198) -#define IOP3XX_IATVR3 (volatile u32 *)IOP3XX_REG_ADDR(0x019c) -#define IOP3XX_OCCAR (volatile u32 *)IOP3XX_REG_ADDR(0x01a4) -#define IOP3XX_OCCDR (volatile u32 *)IOP3XX_REG_ADDR(0x01ac) -#define IOP3XX_PDSCR (volatile u32 *)IOP3XX_REG_ADDR(0x01bc) -#define IOP3XX_PMCAPID (volatile u8 *)IOP3XX_REG_ADDR(0x01c0) -#define IOP3XX_PMNEXT (volatile u8 *)IOP3XX_REG_ADDR(0x01c1) -#define IOP3XX_APMCR (volatile u16 *)IOP3XX_REG_ADDR(0x01c2) -#define IOP3XX_APMCSR (volatile u16 *)IOP3XX_REG_ADDR(0x01c4) -#define IOP3XX_PCIXCAPID (volatile u8 *)IOP3XX_REG_ADDR(0x01e0) -#define IOP3XX_PCIXNEXT (volatile u8 *)IOP3XX_REG_ADDR(0x01e1) -#define IOP3XX_PCIXCMD (volatile u16 *)IOP3XX_REG_ADDR(0x01e2) -#define IOP3XX_PCIXSR (volatile u32 *)IOP3XX_REG_ADDR(0x01e4) -#define IOP3XX_PCIIRSR (volatile u32 *)IOP3XX_REG_ADDR(0x01ec) -#define IOP3XX_PCSR_OUT_Q_BUSY (1 << 15) -#define IOP3XX_PCSR_IN_Q_BUSY (1 << 14) -#define IOP3XX_ATUCR_OUT_EN (1 << 1) - -#define IOP3XX_INIT_ATU_DEFAULT 0 -#define IOP3XX_INIT_ATU_DISABLE -1 -#define IOP3XX_INIT_ATU_ENABLE 1 - -/* Messaging Unit */ -#define IOP3XX_IMR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0310) -#define IOP3XX_IMR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0314) -#define IOP3XX_OMR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0318) -#define IOP3XX_OMR1 (volatile u32 *)IOP3XX_REG_ADDR(0x031c) -#define IOP3XX_IDR (volatile u32 *)IOP3XX_REG_ADDR(0x0320) -#define IOP3XX_IISR (volatile u32 *)IOP3XX_REG_ADDR(0x0324) -#define IOP3XX_IIMR (volatile u32 *)IOP3XX_REG_ADDR(0x0328) -#define IOP3XX_ODR (volatile u32 *)IOP3XX_REG_ADDR(0x032c) -#define IOP3XX_OISR (volatile u32 *)IOP3XX_REG_ADDR(0x0330) -#define IOP3XX_OIMR (volatile u32 *)IOP3XX_REG_ADDR(0x0334) -#define IOP3XX_MUCR (volatile u32 *)IOP3XX_REG_ADDR(0x0350) -#define IOP3XX_QBAR (volatile u32 *)IOP3XX_REG_ADDR(0x0354) -#define IOP3XX_IFHPR (volatile u32 *)IOP3XX_REG_ADDR(0x0360) -#define IOP3XX_IFTPR (volatile u32 *)IOP3XX_REG_ADDR(0x0364) -#define IOP3XX_IPHPR (volatile u32 *)IOP3XX_REG_ADDR(0x0368) -#define IOP3XX_IPTPR (volatile u32 *)IOP3XX_REG_ADDR(0x036c) -#define IOP3XX_OFHPR (volatile u32 *)IOP3XX_REG_ADDR(0x0370) -#define IOP3XX_OFTPR (volatile u32 *)IOP3XX_REG_ADDR(0x0374) -#define IOP3XX_OPHPR (volatile u32 *)IOP3XX_REG_ADDR(0x0378) -#define IOP3XX_OPTPR (volatile u32 *)IOP3XX_REG_ADDR(0x037c) -#define IOP3XX_IAR (volatile u32 *)IOP3XX_REG_ADDR(0x0380) - -/* DMA Controller */ -#define IOP3XX_DMA_PHYS_BASE(chan) (IOP3XX_PERIPHERAL_PHYS_BASE + \ - (0x400 + (chan << 6))) -#define IOP3XX_DMA_UPPER_PA(chan) (IOP3XX_DMA_PHYS_BASE(chan) + 0x27) - -/* Peripheral bus interface */ -#define IOP3XX_PBCR (volatile u32 *)IOP3XX_REG_ADDR(0x0680) -#define IOP3XX_PBISR (volatile u32 *)IOP3XX_REG_ADDR(0x0684) -#define IOP3XX_PBBAR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0688) -#define IOP3XX_PBLR0 (volatile u32 *)IOP3XX_REG_ADDR(0x068c) -#define IOP3XX_PBBAR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0690) -#define IOP3XX_PBLR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0694) -#define IOP3XX_PBBAR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0698) -#define IOP3XX_PBLR2 (volatile u32 *)IOP3XX_REG_ADDR(0x069c) -#define IOP3XX_PBBAR3 (volatile u32 *)IOP3XX_REG_ADDR(0x06a0) -#define IOP3XX_PBLR3 (volatile u32 *)IOP3XX_REG_ADDR(0x06a4) -#define IOP3XX_PBBAR4 (volatile u32 *)IOP3XX_REG_ADDR(0x06a8) -#define IOP3XX_PBLR4 (volatile u32 *)IOP3XX_REG_ADDR(0x06ac) -#define IOP3XX_PBBAR5 (volatile u32 *)IOP3XX_REG_ADDR(0x06b0) -#define IOP3XX_PBLR5 (volatile u32 *)IOP3XX_REG_ADDR(0x06b4) -#define IOP3XX_PMBR0 (volatile u32 *)IOP3XX_REG_ADDR(0x06c0) -#define IOP3XX_PMBR1 (volatile u32 *)IOP3XX_REG_ADDR(0x06e0) -#define IOP3XX_PMBR2 (volatile u32 *)IOP3XX_REG_ADDR(0x06e4) - -/* Peripheral performance monitoring unit */ -#define IOP3XX_GTMR (volatile u32 *)IOP3XX_REG_ADDR(0x0700) -#define IOP3XX_ESR (volatile u32 *)IOP3XX_REG_ADDR(0x0704) -#define IOP3XX_EMISR (volatile u32 *)IOP3XX_REG_ADDR(0x0708) -#define IOP3XX_GTSR (volatile u32 *)IOP3XX_REG_ADDR(0x0710) -/* PERCR0 DOESN'T EXIST - index from 1! */ -#define IOP3XX_PERCR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0710) - -/* Timers */ -#define IOP3XX_TU_TMR0 (volatile u32 *)IOP3XX_TIMER_REG(0x0000) -#define IOP3XX_TU_TMR1 (volatile u32 *)IOP3XX_TIMER_REG(0x0004) -#define IOP3XX_TU_TCR0 (volatile u32 *)IOP3XX_TIMER_REG(0x0008) -#define IOP3XX_TU_TCR1 (volatile u32 *)IOP3XX_TIMER_REG(0x000c) -#define IOP3XX_TU_TRR0 (volatile u32 *)IOP3XX_TIMER_REG(0x0010) -#define IOP3XX_TU_TRR1 (volatile u32 *)IOP3XX_TIMER_REG(0x0014) -#define IOP3XX_TU_TISR (volatile u32 *)IOP3XX_TIMER_REG(0x0018) -#define IOP3XX_TU_WDTCR (volatile u32 *)IOP3XX_TIMER_REG(0x001c) -#define IOP_TMR_EN 0x02 -#define IOP_TMR_RELOAD 0x04 -#define IOP_TMR_PRIVILEGED 0x08 -#define IOP_TMR_RATIO_1_1 0x00 - -/* Watchdog timer definitions */ -#define IOP_WDTCR_EN_ARM 0x1e1e1e1e -#define IOP_WDTCR_EN 0xe1e1e1e1 -/* iop3xx does not support stopping the watchdog, so we just re-arm */ -#define IOP_WDTCR_DIS_ARM (IOP_WDTCR_EN_ARM) -#define IOP_WDTCR_DIS (IOP_WDTCR_EN) - -/* Application accelerator unit */ -#define IOP3XX_AAU_PHYS_BASE (IOP3XX_PERIPHERAL_PHYS_BASE + 0x800) -#define IOP3XX_AAU_UPPER_PA (IOP3XX_AAU_PHYS_BASE + 0xa7) - -/* I2C bus interface unit */ -#define IOP3XX_ICR0 (volatile u32 *)IOP3XX_REG_ADDR(0x1680) -#define IOP3XX_ISR0 (volatile u32 *)IOP3XX_REG_ADDR(0x1684) -#define IOP3XX_ISAR0 (volatile u32 *)IOP3XX_REG_ADDR(0x1688) -#define IOP3XX_IDBR0 (volatile u32 *)IOP3XX_REG_ADDR(0x168c) -#define IOP3XX_IBMR0 (volatile u32 *)IOP3XX_REG_ADDR(0x1694) -#define IOP3XX_ICR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16a0) -#define IOP3XX_ISR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16a4) -#define IOP3XX_ISAR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16a8) -#define IOP3XX_IDBR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16ac) -#define IOP3XX_IBMR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16b4) - - -/* - * IOP3XX I/O and Mem space regions for PCI autoconfiguration - */ -#define IOP3XX_PCI_LOWER_MEM_PA 0x80000000 -#define IOP3XX_PCI_MEM_WINDOW_SIZE 0x08000000 - -#define IOP3XX_PCI_LOWER_IO_PA 0x90000000 -#define IOP3XX_PCI_LOWER_IO_BA 0x00000000 - -#ifndef __ASSEMBLY__ - -#include -#include - -void iop3xx_map_io(void); -void iop_enable_cp6(void); -void iop_init_cp6_handler(void); -void iop_init_time(unsigned long tickrate); -void iop3xx_restart(enum reboot_mode, const char *); - -static inline u32 read_tmr0(void) -{ - u32 val; - asm volatile("mrc p6, 0, %0, c0, c1, 0" : "=r" (val)); - return val; -} - -static inline void write_tmr0(u32 val) -{ - asm volatile("mcr p6, 0, %0, c0, c1, 0" : : "r" (val)); -} - -static inline void write_tmr1(u32 val) -{ - asm volatile("mcr p6, 0, %0, c1, c1, 0" : : "r" (val)); -} - -static inline u32 read_tcr0(void) -{ - u32 val; - asm volatile("mrc p6, 0, %0, c2, c1, 0" : "=r" (val)); - return val; -} - -static inline void write_tcr0(u32 val) -{ - asm volatile("mcr p6, 0, %0, c2, c1, 0" : : "r" (val)); -} - -static inline u32 read_tcr1(void) -{ - u32 val; - asm volatile("mrc p6, 0, %0, c3, c1, 0" : "=r" (val)); - return val; -} - -static inline void write_tcr1(u32 val) -{ - asm volatile("mcr p6, 0, %0, c3, c1, 0" : : "r" (val)); -} - -static inline void write_trr0(u32 val) -{ - asm volatile("mcr p6, 0, %0, c4, c1, 0" : : "r" (val)); -} - -static inline void write_trr1(u32 val) -{ - asm volatile("mcr p6, 0, %0, c5, c1, 0" : : "r" (val)); -} - -static inline void write_tisr(u32 val) -{ - asm volatile("mcr p6, 0, %0, c6, c1, 0" : : "r" (val)); -} - -static inline u32 read_wdtcr(void) -{ - u32 val; - asm volatile("mrc p6, 0, %0, c7, c1, 0":"=r" (val)); - return val; -} -static inline void write_wdtcr(u32 val) -{ - asm volatile("mcr p6, 0, %0, c7, c1, 0"::"r" (val)); -} - -extern unsigned long get_iop_tick_rate(void); - -/* only iop13xx has these registers, we define these to present a - * common register interface for the iop_wdt driver. - */ -#define IOP_RCSR_WDT (0) -static inline u32 read_rcsr(void) -{ - return 0; -} -static inline void write_wdtsr(u32 val) -{ - do { } while (0); -} - -extern struct platform_device iop3xx_dma_0_channel; -extern struct platform_device iop3xx_dma_1_channel; -extern struct platform_device iop3xx_aau_channel; -extern struct platform_device iop3xx_i2c0_device; -extern struct platform_device iop3xx_i2c1_device; -extern struct gpiod_lookup_table iop3xx_i2c0_gpio_lookup; -extern struct gpiod_lookup_table iop3xx_i2c1_gpio_lookup; - -#endif - - -#endif diff --git a/arch/arm/mach-iop32x/iq31244.c b/arch/arm/mach-iop32x/iq31244.c deleted file mode 100644 index 8b4c29d17265..000000000000 --- a/arch/arm/mach-iop32x/iq31244.c +++ /dev/null @@ -1,333 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * arch/arm/mach-iop32x/iq31244.c - * - * Board support code for the Intel EP80219 and IQ31244 platforms. - * - * Author: Rory Bolt - * Copyright (C) 2002 Rory Bolt - * Copyright 2003 (c) MontaVista, Software, Inc. - * Copyright (C) 2004 Intel Corp. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hardware.h" -#include "irqs.h" -#include "gpio-iop32x.h" - -/* - * Until March of 2007 iq31244 platforms and ep80219 platforms shared the - * same machine id, and the processor type was used to select board type. - * However this assumption breaks for an iq80219 board which is an iop219 - * processor on an iq31244 board. The force_ep80219 flag has been added - * for old boot loaders using the iq31244 machine id for an ep80219 platform. - */ -static int force_ep80219; - -static int is_80219(void) -{ - return !!((read_cpuid_id() & 0xffffffe0) == 0x69052e20); -} - -static int is_ep80219(void) -{ - if (machine_is_ep80219() || force_ep80219) - return 1; - else - return 0; -} - - -/* - * EP80219/IQ31244 timer tick configuration. - */ -static void __init iq31244_timer_init(void) -{ - if (is_ep80219()) { - /* 33.333 MHz crystal. */ - iop_init_time(200000000); - } else { - /* 33.000 MHz crystal. */ - iop_init_time(198000000); - } -} - - -/* - * IQ31244 I/O. - */ -static struct map_desc iq31244_io_desc[] __initdata = { - { /* on-board devices */ - .virtual = IQ31244_UART, - .pfn = __phys_to_pfn(IQ31244_UART), - .length = 0x00100000, - .type = MT_DEVICE, - }, -}; - -void __init iq31244_map_io(void) -{ - iop3xx_map_io(); - iotable_init(iq31244_io_desc, ARRAY_SIZE(iq31244_io_desc)); -} - - -/* - * EP80219/IQ31244 PCI. - */ -static int __init -ep80219_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) -{ - int irq; - - if (slot == 0) { - /* CFlash */ - irq = IRQ_IOP32X_XINT1; - } else if (slot == 1) { - /* 82551 Pro 100 */ - irq = IRQ_IOP32X_XINT0; - } else if (slot == 2) { - /* PCI-X Slot */ - irq = IRQ_IOP32X_XINT3; - } else if (slot == 3) { - /* SATA */ - irq = IRQ_IOP32X_XINT2; - } else { - printk(KERN_ERR "ep80219_pci_map_irq() called for unknown " - "device PCI:%d:%d:%d\n", dev->bus->number, - PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); - irq = -1; - } - - return irq; -} - -static struct hw_pci ep80219_pci __initdata = { - .nr_controllers = 1, - .ops = &iop3xx_ops, - .setup = iop3xx_pci_setup, - .preinit = iop3xx_pci_preinit, - .map_irq = ep80219_pci_map_irq, -}; - -static int __init -iq31244_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) -{ - int irq; - - if (slot == 0) { - /* CFlash */ - irq = IRQ_IOP32X_XINT1; - } else if (slot == 1) { - /* SATA */ - irq = IRQ_IOP32X_XINT2; - } else if (slot == 2) { - /* PCI-X Slot */ - irq = IRQ_IOP32X_XINT3; - } else if (slot == 3) { - /* 82546 GigE */ - irq = IRQ_IOP32X_XINT0; - } else { - printk(KERN_ERR "iq31244_pci_map_irq called for unknown " - "device PCI:%d:%d:%d\n", dev->bus->number, - PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); - irq = -1; - } - - return irq; -} - -static struct hw_pci iq31244_pci __initdata = { - .nr_controllers = 1, - .ops = &iop3xx_ops, - .setup = iop3xx_pci_setup, - .preinit = iop3xx_pci_preinit, - .map_irq = iq31244_pci_map_irq, -}; - -static int __init iq31244_pci_init(void) -{ - if (is_ep80219()) - pci_common_init(&ep80219_pci); - else if (machine_is_iq31244()) { - if (is_80219()) { - printk("note: iq31244 board type has been selected\n"); - printk("note: to select ep80219 operation:\n"); - printk("\t1/ specify \"force_ep80219\" on the kernel" - " command line\n"); - printk("\t2/ update boot loader to pass" - " the ep80219 id: %d\n", MACH_TYPE_EP80219); - } - pci_common_init(&iq31244_pci); - } - - return 0; -} - -subsys_initcall(iq31244_pci_init); - - -/* - * IQ31244 machine initialisation. - */ -static struct physmap_flash_data iq31244_flash_data = { - .width = 2, -}; - -static struct resource iq31244_flash_resource = { - .start = 0xf0000000, - .end = 0xf07fffff, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device iq31244_flash_device = { - .name = "physmap-flash", - .id = 0, - .dev = { - .platform_data = &iq31244_flash_data, - }, - .num_resources = 1, - .resource = &iq31244_flash_resource, -}; - -static struct plat_serial8250_port iq31244_serial_port[] = { - { - .mapbase = IQ31244_UART, - .membase = (char *)IQ31244_UART, - .irq = IRQ_IOP32X_XINT1, - .flags = UPF_SKIP_TEST, - .iotype = UPIO_MEM, - .regshift = 0, - .uartclk = 1843200, - }, - { }, -}; - -static struct resource iq31244_uart_resource = { - .start = IQ31244_UART, - .end = IQ31244_UART + 7, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device iq31244_serial_device = { - .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM, - .dev = { - .platform_data = iq31244_serial_port, - }, - .num_resources = 1, - .resource = &iq31244_uart_resource, -}; - -/* - * This function will send a SHUTDOWN_COMPLETE message to the PIC - * controller over I2C. We are not using the i2c subsystem since - * we are going to power off and it may be removed - */ -void ep80219_power_off(void) -{ - /* - * Send the Address byte w/ the start condition - */ - *IOP3XX_IDBR1 = 0x60; - *IOP3XX_ICR1 = 0xE9; - mdelay(1); - - /* - * Send the START_MSG byte w/ no start or stop condition - */ - *IOP3XX_IDBR1 = 0x0F; - *IOP3XX_ICR1 = 0xE8; - mdelay(1); - - /* - * Send the SHUTDOWN_COMPLETE Message ID byte w/ no start or - * stop condition - */ - *IOP3XX_IDBR1 = 0x03; - *IOP3XX_ICR1 = 0xE8; - mdelay(1); - - /* - * Send an ignored byte w/ stop condition - */ - *IOP3XX_IDBR1 = 0x00; - *IOP3XX_ICR1 = 0xEA; - - while (1) - ; -} - -static void __init iq31244_init_machine(void) -{ - register_iop32x_gpio(); - gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup); - gpiod_add_lookup_table(&iop3xx_i2c1_gpio_lookup); - platform_device_register(&iop3xx_i2c0_device); - platform_device_register(&iop3xx_i2c1_device); - platform_device_register(&iq31244_flash_device); - platform_device_register(&iq31244_serial_device); - platform_device_register(&iop3xx_dma_0_channel); - platform_device_register(&iop3xx_dma_1_channel); - - if (is_ep80219()) - pm_power_off = ep80219_power_off; - - if (!is_80219()) - platform_device_register(&iop3xx_aau_channel); -} - -static int __init force_ep80219_setup(char *str) -{ - force_ep80219 = 1; - return 1; -} - -__setup("force_ep80219", force_ep80219_setup); - -MACHINE_START(IQ31244, "Intel IQ31244") - /* Maintainer: Intel Corp. */ - .atag_offset = 0x100, - .map_io = iq31244_map_io, - .init_irq = iop32x_init_irq, - .init_time = iq31244_timer_init, - .init_machine = iq31244_init_machine, - .restart = iop3xx_restart, -MACHINE_END - -/* There should have been an ep80219 machine identifier from the beginning. - * Boot roms older than March 2007 do not know the ep80219 machine id. Pass - * "force_ep80219" on the kernel command line, otherwise iq31244 operation - * will be selected. - */ -MACHINE_START(EP80219, "Intel EP80219") - /* Maintainer: Intel Corp. */ - .atag_offset = 0x100, - .nr_irqs = IOP32X_NR_IRQS, - .map_io = iq31244_map_io, - .init_irq = iop32x_init_irq, - .init_time = iq31244_timer_init, - .init_machine = iq31244_init_machine, - .restart = iop3xx_restart, -MACHINE_END diff --git a/arch/arm/mach-iop32x/iq31244.h b/arch/arm/mach-iop32x/iq31244.h deleted file mode 100644 index a7ac691e48d3..000000000000 --- a/arch/arm/mach-iop32x/iq31244.h +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Intel IQ31244 evaluation board registers - */ - -#ifndef __IQ31244_H -#define __IQ31244_H - -#define IQ31244_UART 0xfe800000 /* UART #1 */ -#define IQ31244_7SEG_1 0xfe840000 /* 7-Segment MSB */ -#define IQ31244_7SEG_0 0xfe850000 /* 7-Segment LSB (WO) */ -#define IQ31244_ROTARY_SW 0xfe8d0000 /* Rotary Switch */ -#define IQ31244_BATT_STAT 0xfe8f0000 /* Battery Status */ - - -#endif diff --git a/arch/arm/mach-iop32x/iq80321.c b/arch/arm/mach-iop32x/iq80321.c deleted file mode 100644 index d9780c4660cb..000000000000 --- a/arch/arm/mach-iop32x/iq80321.c +++ /dev/null @@ -1,192 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * arch/arm/mach-iop32x/iq80321.c - * - * Board support code for the Intel IQ80321 platform. - * - * Author: Rory Bolt - * Copyright (C) 2002 Rory Bolt - * Copyright (C) 2004 Intel Corp. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hardware.h" -#include "irqs.h" -#include "gpio-iop32x.h" - -/* - * IQ80321 timer tick configuration. - */ -static void __init iq80321_timer_init(void) -{ - /* 33.333 MHz crystal. */ - iop_init_time(200000000); -} - - -/* - * IQ80321 I/O. - */ -static struct map_desc iq80321_io_desc[] __initdata = { - { /* on-board devices */ - .virtual = IQ80321_UART, - .pfn = __phys_to_pfn(IQ80321_UART), - .length = 0x00100000, - .type = MT_DEVICE, - }, -}; - -void __init iq80321_map_io(void) -{ - iop3xx_map_io(); - iotable_init(iq80321_io_desc, ARRAY_SIZE(iq80321_io_desc)); -} - - -/* - * IQ80321 PCI. - */ -static int __init -iq80321_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) -{ - int irq; - - if ((slot == 2 || slot == 6) && pin == 1) { - /* PCI-X Slot INTA */ - irq = IRQ_IOP32X_XINT2; - } else if ((slot == 2 || slot == 6) && pin == 2) { - /* PCI-X Slot INTA */ - irq = IRQ_IOP32X_XINT3; - } else if ((slot == 2 || slot == 6) && pin == 3) { - /* PCI-X Slot INTA */ - irq = IRQ_IOP32X_XINT0; - } else if ((slot == 2 || slot == 6) && pin == 4) { - /* PCI-X Slot INTA */ - irq = IRQ_IOP32X_XINT1; - } else if (slot == 4 || slot == 8) { - /* Gig-E */ - irq = IRQ_IOP32X_XINT0; - } else { - printk(KERN_ERR "iq80321_pci_map_irq() called for unknown " - "device PCI:%d:%d:%d\n", dev->bus->number, - PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); - irq = -1; - } - - return irq; -} - -static struct hw_pci iq80321_pci __initdata = { - .nr_controllers = 1, - .ops = &iop3xx_ops, - .setup = iop3xx_pci_setup, - .preinit = iop3xx_pci_preinit_cond, - .map_irq = iq80321_pci_map_irq, -}; - -static int __init iq80321_pci_init(void) -{ - if ((iop3xx_get_init_atu() == IOP3XX_INIT_ATU_ENABLE) && - machine_is_iq80321()) - pci_common_init(&iq80321_pci); - - return 0; -} - -subsys_initcall(iq80321_pci_init); - - -/* - * IQ80321 machine initialisation. - */ -static struct physmap_flash_data iq80321_flash_data = { - .width = 1, -}; - -static struct resource iq80321_flash_resource = { - .start = 0xf0000000, - .end = 0xf07fffff, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device iq80321_flash_device = { - .name = "physmap-flash", - .id = 0, - .dev = { - .platform_data = &iq80321_flash_data, - }, - .num_resources = 1, - .resource = &iq80321_flash_resource, -}; - -static struct plat_serial8250_port iq80321_serial_port[] = { - { - .mapbase = IQ80321_UART, - .membase = (char *)IQ80321_UART, - .irq = IRQ_IOP32X_XINT1, - .flags = UPF_SKIP_TEST, - .iotype = UPIO_MEM, - .regshift = 0, - .uartclk = 1843200, - }, - { }, -}; - -static struct resource iq80321_uart_resource = { - .start = IQ80321_UART, - .end = IQ80321_UART + 7, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device iq80321_serial_device = { - .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM, - .dev = { - .platform_data = iq80321_serial_port, - }, - .num_resources = 1, - .resource = &iq80321_uart_resource, -}; - -static void __init iq80321_init_machine(void) -{ - register_iop32x_gpio(); - gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup); - gpiod_add_lookup_table(&iop3xx_i2c1_gpio_lookup); - platform_device_register(&iop3xx_i2c0_device); - platform_device_register(&iop3xx_i2c1_device); - platform_device_register(&iq80321_flash_device); - platform_device_register(&iq80321_serial_device); - platform_device_register(&iop3xx_dma_0_channel); - platform_device_register(&iop3xx_dma_1_channel); - platform_device_register(&iop3xx_aau_channel); -} - -MACHINE_START(IQ80321, "Intel IQ80321") - /* Maintainer: Intel Corp. */ - .atag_offset = 0x100, - .nr_irqs = IOP32X_NR_IRQS, - .map_io = iq80321_map_io, - .init_irq = iop32x_init_irq, - .init_time = iq80321_timer_init, - .init_machine = iq80321_init_machine, - .restart = iop3xx_restart, -MACHINE_END diff --git a/arch/arm/mach-iop32x/iq80321.h b/arch/arm/mach-iop32x/iq80321.h deleted file mode 100644 index 3a5d10626ea6..000000000000 --- a/arch/arm/mach-iop32x/iq80321.h +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Intel IQ80321 evaluation board registers - */ - -#ifndef __IQ80321_H -#define __IQ80321_H - -#define IQ80321_UART 0xfe800000 /* UART #1 */ -#define IQ80321_7SEG_1 0xfe840000 /* 7-Segment MSB */ -#define IQ80321_7SEG_0 0xfe850000 /* 7-Segment LSB (WO) */ -#define IQ80321_ROTARY_SW 0xfe8d0000 /* Rotary Switch */ -#define IQ80321_BATT_STAT 0xfe8f0000 /* Battery Status */ - - -#endif diff --git a/arch/arm/mach-iop32x/irq.c b/arch/arm/mach-iop32x/irq.c deleted file mode 100644 index 6dca7e97d81f..000000000000 --- a/arch/arm/mach-iop32x/irq.c +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * arch/arm/mach-iop32x/irq.c - * - * Generic IOP32X IRQ handling functionality - * - * Author: Rory Bolt - * Copyright (C) 2002 Rory Bolt - */ - -#include -#include -#include -#include -#include -#include - -#include "hardware.h" - -static u32 iop32x_mask; - -static void intctl_write(u32 val) -{ - asm volatile("mcr p6, 0, %0, c0, c0, 0" : : "r" (val)); -} - -static void intstr_write(u32 val) -{ - asm volatile("mcr p6, 0, %0, c4, c0, 0" : : "r" (val)); -} - -static u32 iintsrc_read(void) -{ - int irq; - - asm volatile("mrc p6, 0, %0, c8, c0, 0" : "=r" (irq)); - - return irq; -} - -static void -iop32x_irq_mask(struct irq_data *d) -{ - iop32x_mask &= ~(1 << (d->irq - 1)); - intctl_write(iop32x_mask); -} - -static void -iop32x_irq_unmask(struct irq_data *d) -{ - iop32x_mask |= 1 << (d->irq - 1); - intctl_write(iop32x_mask); -} - -struct irq_chip ext_chip = { - .name = "IOP32x", - .irq_ack = iop32x_irq_mask, - .irq_mask = iop32x_irq_mask, - .irq_unmask = iop32x_irq_unmask, -}; - -static void iop_handle_irq(struct pt_regs *regs) -{ - u32 mask; - - iop_enable_cp6(); - - do { - mask = iintsrc_read(); - if (mask) - generic_handle_irq(fls(mask)); - } while (mask); -} - -void __init iop32x_init_irq(void) -{ - int i; - - iop_init_cp6_handler(); - set_handle_irq(iop_handle_irq); - - intctl_write(0); - intstr_write(0); - if (machine_is_glantank() || - machine_is_iq80321() || - machine_is_iq31244() || - machine_is_n2100() || - machine_is_em7210()) - *IOP3XX_PCIIRSR = 0x0f; - - for (i = 1; i < NR_IRQS; i++) { - irq_set_chip_and_handler(i, &ext_chip, handle_level_irq); - irq_clear_status_flags(i, IRQ_NOREQUEST | IRQ_NOPROBE); - } -} diff --git a/arch/arm/mach-iop32x/irqs.h b/arch/arm/mach-iop32x/irqs.h deleted file mode 100644 index e9fc88e09189..000000000000 --- a/arch/arm/mach-iop32x/irqs.h +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Author: Rory Bolt - * Copyright: (C) 2002 Rory Bolt - */ - -#ifndef __IOP32X_IRQS_H -#define __IOP32X_IRQS_H - -/* Interrupts in Linux start at 1, hardware starts at 0 */ - -#define IOP_IRQ(x) ((x) + 1) - -/* - * IOP80321 chipset interrupts - */ -#define IRQ_IOP32X_DMA0_EOT IOP_IRQ(0) -#define IRQ_IOP32X_DMA0_EOC IOP_IRQ(1) -#define IRQ_IOP32X_DMA1_EOT IOP_IRQ(2) -#define IRQ_IOP32X_DMA1_EOC IOP_IRQ(3) -#define IRQ_IOP32X_AA_EOT IOP_IRQ(6) -#define IRQ_IOP32X_AA_EOC IOP_IRQ(7) -#define IRQ_IOP32X_CORE_PMON IOP_IRQ(8) -#define IRQ_IOP32X_TIMER0 IOP_IRQ(9) -#define IRQ_IOP32X_TIMER1 IOP_IRQ(10) -#define IRQ_IOP32X_I2C_0 IOP_IRQ(11) -#define IRQ_IOP32X_I2C_1 IOP_IRQ(12) -#define IRQ_IOP32X_MESSAGING IOP_IRQ(13) -#define IRQ_IOP32X_ATU_BIST IOP_IRQ(14) -#define IRQ_IOP32X_PERFMON IOP_IRQ(15) -#define IRQ_IOP32X_CORE_PMU IOP_IRQ(16) -#define IRQ_IOP32X_BIU_ERR IOP_IRQ(17) -#define IRQ_IOP32X_ATU_ERR IOP_IRQ(18) -#define IRQ_IOP32X_MCU_ERR IOP_IRQ(19) -#define IRQ_IOP32X_DMA0_ERR IOP_IRQ(20) -#define IRQ_IOP32X_DMA1_ERR IOP_IRQ(21) -#define IRQ_IOP32X_AA_ERR IOP_IRQ(23) -#define IRQ_IOP32X_MSG_ERR IOP_IRQ(24) -#define IRQ_IOP32X_SSP IOP_IRQ(25) -#define IRQ_IOP32X_XINT0 IOP_IRQ(27) -#define IRQ_IOP32X_XINT1 IOP_IRQ(28) -#define IRQ_IOP32X_XINT2 IOP_IRQ(29) -#define IRQ_IOP32X_XINT3 IOP_IRQ(30) -#define IRQ_IOP32X_HPI IOP_IRQ(31) - -#define IOP32X_NR_IRQS (IRQ_IOP32X_HPI + 1) - -#endif diff --git a/arch/arm/mach-iop32x/n2100.c b/arch/arm/mach-iop32x/n2100.c deleted file mode 100644 index bb1e2e11bf35..000000000000 --- a/arch/arm/mach-iop32x/n2100.c +++ /dev/null @@ -1,367 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * arch/arm/mach-iop32x/n2100.c - * - * Board support code for the Thecus N2100 platform. - * - * Author: Rory Bolt - * Copyright (C) 2002 Rory Bolt - * Copyright 2003 (c) MontaVista, Software, Inc. - * Copyright (C) 2004 Intel Corp. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hardware.h" -#include "irqs.h" -#include "gpio-iop32x.h" - -/* - * N2100 timer tick configuration. - */ -static void __init n2100_timer_init(void) -{ - /* 33.000 MHz crystal. */ - iop_init_time(198000000); -} - - -/* - * N2100 I/O. - */ -static struct map_desc n2100_io_desc[] __initdata = { - { /* on-board devices */ - .virtual = N2100_UART, - .pfn = __phys_to_pfn(N2100_UART), - .length = 0x00100000, - .type = MT_DEVICE - }, -}; - -void __init n2100_map_io(void) -{ - iop3xx_map_io(); - iotable_init(n2100_io_desc, ARRAY_SIZE(n2100_io_desc)); -} - - -/* - * N2100 PCI. - */ -static int n2100_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) -{ - int irq; - - if (PCI_SLOT(dev->devfn) == 1) { - /* RTL8110SB #1 */ - irq = IRQ_IOP32X_XINT0; - } else if (PCI_SLOT(dev->devfn) == 2) { - /* RTL8110SB #2 */ - irq = IRQ_IOP32X_XINT3; - } else if (PCI_SLOT(dev->devfn) == 3) { - /* Sil3512 */ - irq = IRQ_IOP32X_XINT2; - } else if (PCI_SLOT(dev->devfn) == 4 && pin == 1) { - /* VT6212 INTA */ - irq = IRQ_IOP32X_XINT1; - } else if (PCI_SLOT(dev->devfn) == 4 && pin == 2) { - /* VT6212 INTB */ - irq = IRQ_IOP32X_XINT0; - } else if (PCI_SLOT(dev->devfn) == 4 && pin == 3) { - /* VT6212 INTC */ - irq = IRQ_IOP32X_XINT2; - } else if (PCI_SLOT(dev->devfn) == 5) { - /* Mini-PCI slot */ - irq = IRQ_IOP32X_XINT3; - } else { - printk(KERN_ERR "n2100_pci_map_irq() called for unknown " - "device PCI:%d:%d:%d\n", dev->bus->number, - PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); - irq = -1; - } - - return irq; -} - -static struct hw_pci n2100_pci __initdata = { - .nr_controllers = 1, - .ops = &iop3xx_ops, - .setup = iop3xx_pci_setup, - .preinit = iop3xx_pci_preinit, - .map_irq = n2100_pci_map_irq, -}; - -/* - * Both r8169 chips on the n2100 exhibit PCI parity problems. Turn - * off parity reporting for both ports so we don't get error interrupts - * for them. - */ -static void n2100_fixup_r8169(struct pci_dev *dev) -{ - if (dev->bus->number == 0 && - (dev->devfn == PCI_DEVFN(1, 0) || - dev->devfn == PCI_DEVFN(2, 0))) - pci_disable_parity(dev); -} -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_REALTEK, PCI_ANY_ID, n2100_fixup_r8169); - -static int __init n2100_pci_init(void) -{ - if (machine_is_n2100()) - pci_common_init(&n2100_pci); - - return 0; -} - -subsys_initcall(n2100_pci_init); - - -/* - * N2100 machine initialisation. - */ -static struct physmap_flash_data n2100_flash_data = { - .width = 2, -}; - -static struct resource n2100_flash_resource = { - .start = 0xf0000000, - .end = 0xf0ffffff, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device n2100_flash_device = { - .name = "physmap-flash", - .id = 0, - .dev = { - .platform_data = &n2100_flash_data, - }, - .num_resources = 1, - .resource = &n2100_flash_resource, -}; - - -static struct plat_serial8250_port n2100_serial_port[] = { - { - .mapbase = N2100_UART, - .membase = (char *)N2100_UART, - .irq = 0, - .flags = UPF_SKIP_TEST | UPF_AUTO_IRQ | UPF_SHARE_IRQ, - .iotype = UPIO_MEM, - .regshift = 0, - .uartclk = 1843200, - }, - { }, -}; - -static struct resource n2100_uart_resource = { - .start = N2100_UART, - .end = N2100_UART + 7, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device n2100_serial_device = { - .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM, - .dev = { - .platform_data = n2100_serial_port, - }, - .num_resources = 1, - .resource = &n2100_uart_resource, -}; - -static struct f75375s_platform_data n2100_f75375s = { - .pwm = { 255, 255 }, - .pwm_enable = { 0, 0 }, -}; - -static struct pca9532_platform_data n2100_leds = { - .leds = { - { .name = "n2100:red:satafail0", - .state = PCA9532_OFF, - .type = PCA9532_TYPE_LED, - }, - { .name = "n2100:red:satafail1", - .state = PCA9532_OFF, - .type = PCA9532_TYPE_LED, - }, - { .name = "n2100:blue:usb", - .state = PCA9532_OFF, - .type = PCA9532_TYPE_LED, - }, - { .type = PCA9532_TYPE_NONE }, - - { .type = PCA9532_TYPE_NONE }, - { .type = PCA9532_TYPE_NONE }, - { .type = PCA9532_TYPE_NONE }, - { .name = "n2100:red:usb", - .state = PCA9532_OFF, - .type = PCA9532_TYPE_LED, - }, - - { .type = PCA9532_TYPE_NONE }, /* power OFF gpio */ - { .type = PCA9532_TYPE_NONE }, /* reset gpio */ - { .type = PCA9532_TYPE_NONE }, - { .type = PCA9532_TYPE_NONE }, - - { .type = PCA9532_TYPE_NONE }, - { .name = "n2100:orange:system", - .state = PCA9532_OFF, - .type = PCA9532_TYPE_LED, - }, - { .name = "n2100:red:system", - .state = PCA9532_OFF, - .type = PCA9532_TYPE_LED, - }, - { .name = "N2100 beeper" , - .state = PCA9532_OFF, - .type = PCA9532_TYPE_N2100_BEEP, - }, - }, - .psc = { 0, 0 }, - .pwm = { 0, 0 }, -}; - -static struct i2c_board_info __initdata n2100_i2c_devices[] = { - { - I2C_BOARD_INFO("rs5c372b", 0x32), - }, - { - I2C_BOARD_INFO("f75375", 0x2e), - .platform_data = &n2100_f75375s, - }, - { - I2C_BOARD_INFO("pca9532", 0x60), - .platform_data = &n2100_leds, - }, -}; - -/* - * Pull PCA9532 GPIO #8 low to power off the machine. - */ -static void n2100_power_off(void) -{ - local_irq_disable(); - - /* Start condition, I2C address of PCA9532, write transaction. */ - *IOP3XX_IDBR0 = 0xc0; - *IOP3XX_ICR0 = 0xe9; - mdelay(1); - - /* Write address 0x08. */ - *IOP3XX_IDBR0 = 0x08; - *IOP3XX_ICR0 = 0xe8; - mdelay(1); - - /* Write data 0x01, stop condition. */ - *IOP3XX_IDBR0 = 0x01; - *IOP3XX_ICR0 = 0xea; - - while (1) - ; -} - -static void n2100_restart(enum reboot_mode mode, const char *cmd) -{ - int ret; - - ret = gpio_direction_output(N2100_HARDWARE_RESET, 0); - if (ret) { - pr_crit("could not drive reset GPIO low\n"); - return; - } - /* Wait for reset to happen */ - while (1) - ; -} - - -static struct timer_list power_button_poll_timer; - -static void power_button_poll(struct timer_list *unused) -{ - if (gpio_get_value(N2100_POWER_BUTTON) == 0) { - ctrl_alt_del(); - return; - } - - power_button_poll_timer.expires = jiffies + (HZ / 10); - add_timer(&power_button_poll_timer); -} - -static int __init n2100_request_gpios(void) -{ - int ret; - - if (!machine_is_n2100()) - return 0; - - ret = gpio_request(N2100_HARDWARE_RESET, "reset"); - if (ret) - pr_err("could not request reset GPIO\n"); - - ret = gpio_request(N2100_POWER_BUTTON, "power"); - if (ret) - pr_err("could not request power GPIO\n"); - else { - ret = gpio_direction_input(N2100_POWER_BUTTON); - if (ret) - pr_err("could not set power GPIO as input\n"); - } - /* Set up power button poll timer */ - timer_setup(&power_button_poll_timer, power_button_poll, 0); - power_button_poll_timer.expires = jiffies + (HZ / 10); - add_timer(&power_button_poll_timer); - return 0; -} -device_initcall(n2100_request_gpios); - -static void __init n2100_init_machine(void) -{ - register_iop32x_gpio(); - gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup); - platform_device_register(&iop3xx_i2c0_device); - platform_device_register(&n2100_flash_device); - platform_device_register(&n2100_serial_device); - platform_device_register(&iop3xx_dma_0_channel); - platform_device_register(&iop3xx_dma_1_channel); - - i2c_register_board_info(0, n2100_i2c_devices, - ARRAY_SIZE(n2100_i2c_devices)); - - pm_power_off = n2100_power_off; -} - -MACHINE_START(N2100, "Thecus N2100") - /* Maintainer: Lennert Buytenhek */ - .atag_offset = 0x100, - .nr_irqs = IOP32X_NR_IRQS, - .map_io = n2100_map_io, - .init_irq = iop32x_init_irq, - .init_time = n2100_timer_init, - .init_machine = n2100_init_machine, - .restart = n2100_restart, -MACHINE_END diff --git a/arch/arm/mach-iop32x/n2100.h b/arch/arm/mach-iop32x/n2100.h deleted file mode 100644 index 0b97b940d3e7..000000000000 --- a/arch/arm/mach-iop32x/n2100.h +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Thecus N2100 board registers - */ - -#ifndef __N2100_H -#define __N2100_H - -#define N2100_UART 0xfe800000 /* UART */ - -#define N2100_COPY_BUTTON IOP3XX_GPIO_LINE(0) -#define N2100_PCA9532_RESET IOP3XX_GPIO_LINE(2) -#define N2100_RESET_BUTTON IOP3XX_GPIO_LINE(3) -#define N2100_HARDWARE_RESET IOP3XX_GPIO_LINE(4) -#define N2100_POWER_BUTTON IOP3XX_GPIO_LINE(5) - - -#endif diff --git a/arch/arm/mach-iop32x/pci.c b/arch/arm/mach-iop32x/pci.c deleted file mode 100644 index 7a215d2ee7e2..000000000000 --- a/arch/arm/mach-iop32x/pci.c +++ /dev/null @@ -1,404 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * arch/arm/plat-iop/pci.c - * - * PCI support for the Intel IOP32X and IOP33X processors - * - * Author: Rory Bolt - * Copyright (C) 2002 Rory Bolt - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "hardware.h" -#include "iop3xx.h" - -// #define DEBUG - -#ifdef DEBUG -#define DBG(x...) printk(x) -#else -#define DBG(x...) do { } while (0) -#endif - -/* - * This routine builds either a type0 or type1 configuration command. If the - * bus is on the 803xx then a type0 made, else a type1 is created. - */ -static u32 iop3xx_cfg_address(struct pci_bus *bus, int devfn, int where) -{ - struct pci_sys_data *sys = bus->sysdata; - u32 addr; - - if (sys->busnr == bus->number) - addr = 1 << (PCI_SLOT(devfn) + 16) | (PCI_SLOT(devfn) << 11); - else - addr = bus->number << 16 | PCI_SLOT(devfn) << 11 | 1; - - addr |= PCI_FUNC(devfn) << 8 | (where & ~3); - - return addr; -} - -/* - * This routine checks the status of the last configuration cycle. If an error - * was detected it returns a 1, else it returns a 0. The errors being checked - * are parity, master abort, target abort (master and target). These types of - * errors occur during a config cycle where there is no device, like during - * the discovery stage. - */ -static int iop3xx_pci_status(void) -{ - unsigned int status; - int ret = 0; - - /* - * Check the status registers. - */ - status = *IOP3XX_ATUSR; - if (status & 0xf900) { - DBG("\t\t\tPCI: P0 - status = 0x%08x\n", status); - *IOP3XX_ATUSR = status & 0xf900; - ret = 1; - } - - status = *IOP3XX_ATUISR; - if (status & 0x679f) { - DBG("\t\t\tPCI: P1 - status = 0x%08x\n", status); - *IOP3XX_ATUISR = status & 0x679f; - ret = 1; - } - - return ret; -} - -/* - * Simply write the address register and read the configuration - * data. Note that the 4 nops ensure that we are able to handle - * a delayed abort (in theory.) - */ -static u32 iop3xx_read(unsigned long addr) -{ - u32 val; - - __asm__ __volatile__( - "str %1, [%2]\n\t" - "ldr %0, [%3]\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - : "=r" (val) - : "r" (addr), "r" (IOP3XX_OCCAR), "r" (IOP3XX_OCCDR)); - - return val; -} - -/* - * The read routines must check the error status of the last configuration - * cycle. If there was an error, the routine returns all hex f's. - */ -static int -iop3xx_read_config(struct pci_bus *bus, unsigned int devfn, int where, - int size, u32 *value) -{ - unsigned long addr = iop3xx_cfg_address(bus, devfn, where); - u32 val = iop3xx_read(addr) >> ((where & 3) * 8); - - if (iop3xx_pci_status()) - val = 0xffffffff; - - *value = val; - - return PCIBIOS_SUCCESSFUL; -} - -static int -iop3xx_write_config(struct pci_bus *bus, unsigned int devfn, int where, - int size, u32 value) -{ - unsigned long addr = iop3xx_cfg_address(bus, devfn, where); - u32 val; - - if (size != 4) { - val = iop3xx_read(addr); - if (iop3xx_pci_status()) - return PCIBIOS_SUCCESSFUL; - - where = (where & 3) * 8; - - if (size == 1) - val &= ~(0xff << where); - else - val &= ~(0xffff << where); - - *IOP3XX_OCCDR = val | value << where; - } else { - asm volatile( - "str %1, [%2]\n\t" - "str %0, [%3]\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - : - : "r" (value), "r" (addr), - "r" (IOP3XX_OCCAR), "r" (IOP3XX_OCCDR)); - } - - return PCIBIOS_SUCCESSFUL; -} - -struct pci_ops iop3xx_ops = { - .read = iop3xx_read_config, - .write = iop3xx_write_config, -}; - -/* - * When a PCI device does not exist during config cycles, the 80200 gets a - * bus error instead of returning 0xffffffff. This handler simply returns. - */ -static int -iop3xx_pci_abort(unsigned long addr, unsigned int fsr, struct pt_regs *regs) -{ - DBG("PCI abort: address = 0x%08lx fsr = 0x%03x PC = 0x%08lx LR = 0x%08lx\n", - addr, fsr, regs->ARM_pc, regs->ARM_lr); - - /* - * If it was an imprecise abort, then we need to correct the - * return address to be _after_ the instruction. - */ - if (fsr & (1 << 10)) - regs->ARM_pc += 4; - - return 0; -} - -int iop3xx_pci_setup(int nr, struct pci_sys_data *sys) -{ - struct resource *res; - struct resource realio; - - if (nr != 0) - return 0; - - res = kzalloc(sizeof(struct resource), GFP_KERNEL); - if (!res) - panic("PCI: unable to alloc resources"); - - res->start = IOP3XX_PCI_LOWER_MEM_PA; - res->end = IOP3XX_PCI_LOWER_MEM_PA + IOP3XX_PCI_MEM_WINDOW_SIZE - 1; - res->name = "IOP3XX PCI Memory Space"; - res->flags = IORESOURCE_MEM; - request_resource(&iomem_resource, res); - - /* - * Use whatever translation is already setup. - */ - sys->mem_offset = IOP3XX_PCI_LOWER_MEM_PA - *IOP3XX_OMWTVR0; - - pci_add_resource_offset(&sys->resources, res, sys->mem_offset); - - realio.start = 0; - realio.end = realio.start + SZ_64K - 1; - pci_remap_iospace(&realio, IOP3XX_PCI_LOWER_IO_PA); - - return 1; -} - -void __init iop3xx_atu_setup(void) -{ - /* BAR 0 ( Disabled ) */ - *IOP3XX_IAUBAR0 = 0x0; - *IOP3XX_IABAR0 = 0x0; - *IOP3XX_IATVR0 = 0x0; - *IOP3XX_IALR0 = 0x0; - - /* BAR 1 ( Disabled ) */ - *IOP3XX_IAUBAR1 = 0x0; - *IOP3XX_IABAR1 = 0x0; - *IOP3XX_IALR1 = 0x0; - - /* BAR 2 (1:1 mapping with Physical RAM) */ - /* Set limit and enable */ - *IOP3XX_IALR2 = ~((u32)IOP3XX_MAX_RAM_SIZE - 1) & ~0x1; - *IOP3XX_IAUBAR2 = 0x0; - - /* Align the inbound bar with the base of memory */ - *IOP3XX_IABAR2 = PHYS_OFFSET | - PCI_BASE_ADDRESS_MEM_TYPE_64 | - PCI_BASE_ADDRESS_MEM_PREFETCH; - - *IOP3XX_IATVR2 = PHYS_OFFSET; - - /* Outbound window 0 */ - *IOP3XX_OMWTVR0 = IOP3XX_PCI_LOWER_MEM_BA; - *IOP3XX_OUMWTVR0 = 0; - - /* Outbound window 1 */ - *IOP3XX_OMWTVR1 = IOP3XX_PCI_LOWER_MEM_BA + - IOP3XX_PCI_MEM_WINDOW_SIZE / 2; - *IOP3XX_OUMWTVR1 = 0; - - /* BAR 3 ( Disabled ) */ - *IOP3XX_IAUBAR3 = 0x0; - *IOP3XX_IABAR3 = 0x0; - *IOP3XX_IATVR3 = 0x0; - *IOP3XX_IALR3 = 0x0; - - /* Setup the I/O Bar - */ - *IOP3XX_OIOWTVR = IOP3XX_PCI_LOWER_IO_BA; - - /* Enable inbound and outbound cycles - */ - *IOP3XX_ATUCMD |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | - PCI_COMMAND_PARITY | PCI_COMMAND_SERR; - *IOP3XX_ATUCR |= IOP3XX_ATUCR_OUT_EN; -} - -void __init iop3xx_atu_disable(void) -{ - *IOP3XX_ATUCMD = 0; - *IOP3XX_ATUCR = 0; - - /* wait for cycles to quiesce */ - while (*IOP3XX_PCSR & (IOP3XX_PCSR_OUT_Q_BUSY | - IOP3XX_PCSR_IN_Q_BUSY)) - cpu_relax(); - - /* BAR 0 ( Disabled ) */ - *IOP3XX_IAUBAR0 = 0x0; - *IOP3XX_IABAR0 = 0x0; - *IOP3XX_IATVR0 = 0x0; - *IOP3XX_IALR0 = 0x0; - - /* BAR 1 ( Disabled ) */ - *IOP3XX_IAUBAR1 = 0x0; - *IOP3XX_IABAR1 = 0x0; - *IOP3XX_IALR1 = 0x0; - - /* BAR 2 ( Disabled ) */ - *IOP3XX_IAUBAR2 = 0x0; - *IOP3XX_IABAR2 = 0x0; - *IOP3XX_IATVR2 = 0x0; - *IOP3XX_IALR2 = 0x0; - - /* BAR 3 ( Disabled ) */ - *IOP3XX_IAUBAR3 = 0x0; - *IOP3XX_IABAR3 = 0x0; - *IOP3XX_IATVR3 = 0x0; - *IOP3XX_IALR3 = 0x0; - - /* Clear the outbound windows */ - *IOP3XX_OIOWTVR = 0; - - /* Outbound window 0 */ - *IOP3XX_OMWTVR0 = 0; - *IOP3XX_OUMWTVR0 = 0; - - /* Outbound window 1 */ - *IOP3XX_OMWTVR1 = 0; - *IOP3XX_OUMWTVR1 = 0; -} - -/* Flag to determine whether the ATU is initialized and the PCI bus scanned */ -int init_atu; - -int iop3xx_get_init_atu(void) { - /* check if default has been overridden */ - if (init_atu != IOP3XX_INIT_ATU_DEFAULT) - return init_atu; - else - return IOP3XX_INIT_ATU_DISABLE; -} - -static void __init iop3xx_atu_debug(void) -{ - DBG("PCI: Intel IOP3xx PCI init.\n"); - DBG("PCI: Outbound memory window 0: PCI 0x%08x%08x\n", - *IOP3XX_OUMWTVR0, *IOP3XX_OMWTVR0); - DBG("PCI: Outbound memory window 1: PCI 0x%08x%08x\n", - *IOP3XX_OUMWTVR1, *IOP3XX_OMWTVR1); - DBG("PCI: Outbound IO window: PCI 0x%08x\n", - *IOP3XX_OIOWTVR); - - DBG("PCI: Inbound memory window 0: PCI 0x%08x%08x 0x%08x -> 0x%08x\n", - *IOP3XX_IAUBAR0, *IOP3XX_IABAR0, *IOP3XX_IALR0, *IOP3XX_IATVR0); - DBG("PCI: Inbound memory window 1: PCI 0x%08x%08x 0x%08x\n", - *IOP3XX_IAUBAR1, *IOP3XX_IABAR1, *IOP3XX_IALR1); - DBG("PCI: Inbound memory window 2: PCI 0x%08x%08x 0x%08x -> 0x%08x\n", - *IOP3XX_IAUBAR2, *IOP3XX_IABAR2, *IOP3XX_IALR2, *IOP3XX_IATVR2); - DBG("PCI: Inbound memory window 3: PCI 0x%08x%08x 0x%08x -> 0x%08x\n", - *IOP3XX_IAUBAR3, *IOP3XX_IABAR3, *IOP3XX_IALR3, *IOP3XX_IATVR3); - - DBG("PCI: Expansion ROM window: PCI 0x%08x%08x 0x%08x -> 0x%08x\n", - 0, *IOP3XX_ERBAR, *IOP3XX_ERLR, *IOP3XX_ERTVR); - - DBG("ATU: IOP3XX_ATUCMD=0x%04x\n", *IOP3XX_ATUCMD); - DBG("ATU: IOP3XX_ATUCR=0x%08x\n", *IOP3XX_ATUCR); - - hook_fault_code(16+6, iop3xx_pci_abort, SIGBUS, 0, "imprecise external abort"); -} - -/* for platforms that might be host-bus-adapters */ -void __init iop3xx_pci_preinit_cond(void) -{ - if (iop3xx_get_init_atu() == IOP3XX_INIT_ATU_ENABLE) { - iop3xx_atu_disable(); - iop3xx_atu_setup(); - iop3xx_atu_debug(); - } -} - -void __init iop3xx_pci_preinit(void) -{ - pcibios_min_mem = 0; - - iop3xx_atu_disable(); - iop3xx_atu_setup(); - iop3xx_atu_debug(); -} - -/* allow init_atu to be user overridden */ -static int __init iop3xx_init_atu_setup(char *str) -{ - init_atu = IOP3XX_INIT_ATU_DEFAULT; - if (str) { - while (*str != '\0') { - switch (*str) { - case 'y': - case 'Y': - init_atu = IOP3XX_INIT_ATU_ENABLE; - break; - case 'n': - case 'N': - init_atu = IOP3XX_INIT_ATU_DISABLE; - break; - case ',': - case '=': - break; - default: - printk(KERN_DEBUG "\"%s\" malformed at " - "character: \'%c\'", - __func__, - *str); - *(str + 1) = '\0'; - } - str++; - } - } - - return 1; -} - -__setup("iop3xx_init_atu", iop3xx_init_atu_setup); - diff --git a/arch/arm/mach-iop32x/pmu.c b/arch/arm/mach-iop32x/pmu.c deleted file mode 100644 index bdbc7a3cb8a3..000000000000 --- a/arch/arm/mach-iop32x/pmu.c +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * PMU IRQ registration for the iop3xx xscale PMU families. - * Copyright (C) 2010 Will Deacon, ARM Ltd. - */ - -#include -#include "irqs.h" - -static struct resource pmu_resource = { - .start = IRQ_IOP32X_CORE_PMU, - .end = IRQ_IOP32X_CORE_PMU, - .flags = IORESOURCE_IRQ, -}; - -static struct platform_device pmu_device = { - .name = "xscale-pmu", - .id = -1, - .resource = &pmu_resource, - .num_resources = 1, -}; - -static int __init iop3xx_pmu_init(void) -{ - platform_device_register(&pmu_device); - return 0; -} - -arch_initcall(iop3xx_pmu_init); diff --git a/arch/arm/mach-iop32x/restart.c b/arch/arm/mach-iop32x/restart.c deleted file mode 100644 index 3dfa54d3a7a8..000000000000 --- a/arch/arm/mach-iop32x/restart.c +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * restart.c - * - * Copyright (C) 2001 MontaVista Software, Inc. - */ -#include -#include "hardware.h" -#include "iop3xx.h" - -void iop3xx_restart(enum reboot_mode mode, const char *cmd) -{ - *IOP3XX_PCSR = 0x30; - - /* Jump into ROM at address 0 */ - soft_restart(0); -} diff --git a/arch/arm/mach-iop32x/setup.c b/arch/arm/mach-iop32x/setup.c deleted file mode 100644 index a0a81c28a632..000000000000 --- a/arch/arm/mach-iop32x/setup.c +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * arch/arm/plat-iop/setup.c - * - * Author: Nicolas Pitre - * Copyright (C) 2001 MontaVista Software, Inc. - * Copyright (C) 2004 Intel Corporation. - */ - -#include -#include -#include -#include "iop3xx.h" - -/* - * Standard IO mapping for all IOP3xx based systems. Note that - * the IOP3xx OCCDR must be mapped uncached and unbuffered. - */ -static struct map_desc iop3xx_std_desc[] __initdata = { - { /* mem mapped registers */ - .virtual = IOP3XX_PERIPHERAL_VIRT_BASE, - .pfn = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE), - .length = IOP3XX_PERIPHERAL_SIZE, - .type = MT_UNCACHED, - }, -}; - -void __init iop3xx_map_io(void) -{ - iotable_init(iop3xx_std_desc, ARRAY_SIZE(iop3xx_std_desc)); -} diff --git a/arch/arm/mach-iop32x/time.c b/arch/arm/mach-iop32x/time.c deleted file mode 100644 index ae533b66fefd..000000000000 --- a/arch/arm/mach-iop32x/time.c +++ /dev/null @@ -1,179 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * arch/arm/plat-iop/time.c - * - * Timer code for IOP32x and IOP33x based systems - * - * Author: Deepak Saxena - * - * Copyright 2002-2003 MontaVista Software Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hardware.h" -#include "irqs.h" - -/* - * Minimum clocksource/clockevent timer range in seconds - */ -#define IOP_MIN_RANGE 4 - -/* - * IOP clocksource (free-running timer 1). - */ -static u64 notrace iop_clocksource_read(struct clocksource *unused) -{ - return 0xffffffffu - read_tcr1(); -} - -static struct clocksource iop_clocksource = { - .name = "iop_timer1", - .rating = 300, - .read = iop_clocksource_read, - .mask = CLOCKSOURCE_MASK(32), - .flags = CLOCK_SOURCE_IS_CONTINUOUS, -}; - -/* - * IOP sched_clock() implementation via its clocksource. - */ -static u64 notrace iop_read_sched_clock(void) -{ - return 0xffffffffu - read_tcr1(); -} - -/* - * IOP clockevents (interrupting timer 0). - */ -static int iop_set_next_event(unsigned long delta, - struct clock_event_device *unused) -{ - u32 tmr = IOP_TMR_PRIVILEGED | IOP_TMR_RATIO_1_1; - - BUG_ON(delta == 0); - write_tmr0(tmr & ~(IOP_TMR_EN | IOP_TMR_RELOAD)); - write_tcr0(delta); - write_tmr0((tmr & ~IOP_TMR_RELOAD) | IOP_TMR_EN); - - return 0; -} - -static unsigned long ticks_per_jiffy; - -static int iop_set_periodic(struct clock_event_device *evt) -{ - u32 tmr = read_tmr0(); - - write_tmr0(tmr & ~IOP_TMR_EN); - write_tcr0(ticks_per_jiffy - 1); - write_trr0(ticks_per_jiffy - 1); - tmr |= (IOP_TMR_RELOAD | IOP_TMR_EN); - - write_tmr0(tmr); - return 0; -} - -static int iop_set_oneshot(struct clock_event_device *evt) -{ - u32 tmr = read_tmr0(); - - /* ->set_next_event sets period and enables timer */ - tmr &= ~(IOP_TMR_RELOAD | IOP_TMR_EN); - write_tmr0(tmr); - return 0; -} - -static int iop_shutdown(struct clock_event_device *evt) -{ - u32 tmr = read_tmr0(); - - tmr &= ~IOP_TMR_EN; - write_tmr0(tmr); - return 0; -} - -static int iop_resume(struct clock_event_device *evt) -{ - u32 tmr = read_tmr0(); - - tmr |= IOP_TMR_EN; - write_tmr0(tmr); - return 0; -} - -static struct clock_event_device iop_clockevent = { - .name = "iop_timer0", - .features = CLOCK_EVT_FEAT_PERIODIC | - CLOCK_EVT_FEAT_ONESHOT, - .rating = 300, - .set_next_event = iop_set_next_event, - .set_state_shutdown = iop_shutdown, - .set_state_periodic = iop_set_periodic, - .tick_resume = iop_resume, - .set_state_oneshot = iop_set_oneshot, -}; - -static irqreturn_t -iop_timer_interrupt(int irq, void *dev_id) -{ - struct clock_event_device *evt = dev_id; - - write_tisr(1); - evt->event_handler(evt); - return IRQ_HANDLED; -} - -static unsigned long iop_tick_rate; -unsigned long get_iop_tick_rate(void) -{ - return iop_tick_rate; -} -EXPORT_SYMBOL(get_iop_tick_rate); - -void __init iop_init_time(unsigned long tick_rate) -{ - u32 timer_ctl; - int irq = IRQ_IOP32X_TIMER0; - - sched_clock_register(iop_read_sched_clock, 32, tick_rate); - - ticks_per_jiffy = DIV_ROUND_CLOSEST(tick_rate, HZ); - iop_tick_rate = tick_rate; - - timer_ctl = IOP_TMR_EN | IOP_TMR_PRIVILEGED | - IOP_TMR_RELOAD | IOP_TMR_RATIO_1_1; - - /* - * Set up interrupting clockevent timer 0. - */ - write_tmr0(timer_ctl & ~IOP_TMR_EN); - write_tisr(1); - if (request_irq(irq, iop_timer_interrupt, IRQF_TIMER | IRQF_IRQPOLL, - "IOP Timer Tick", &iop_clockevent)) - pr_err("Failed to request irq() %d (IOP Timer Tick)\n", irq); - iop_clockevent.cpumask = cpumask_of(0); - clockevents_config_and_register(&iop_clockevent, tick_rate, - 0xf, 0xfffffffe); - - /* - * Set up free-running clocksource timer 1. - */ - write_trr1(0xffffffff); - write_tcr1(0xffffffff); - write_tmr1(timer_ctl); - clocksource_register_hz(&iop_clocksource, tick_rate); -} diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 264e780ae32e..e488e1b8e803 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -723,11 +723,11 @@ config I2C_IMX_LPI2C will be called i2c-imx-lpi2c. config I2C_IOP3XX - tristate "Intel IOPx3xx and IXP4xx on-chip I2C interface" - depends on ARCH_IOP32X || ARCH_IXP4XX || COMPILE_TEST + tristate "Intel IXP4xx on-chip I2C interface" + depends on ARCH_IXP4XX || COMPILE_TEST help Say Y here if you want to use the IIC bus controller on - the Intel IOPx3xx I/O Processors or IXP4xx Network Processors. + the Intel IXP4xx Network Processors. This driver can also be built as a module. If so, the module will be called i2c-iop3xx. -- 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BBACDC4332F for ; Wed, 19 Oct 2022 15:36:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=F3oKaQ1T42Up0lsFcyNkfXLk2HM0KfDNSQoCe3qBdGQ=; b=H07d4hi/RD6mSv AlckL7n8Z7kvVf8XR+mvxpiXaa1g2oRPCaNcNv+MzVnunDYlvmwtbqsHg13AzRXNS+uwAHdBhtrJy 7F5jAanSJ+rmCIR3HX0d6uPr5ldiANCkZdOI+9PoWk5cKm4+n91mg1yvBP7TlP/0GBaqTIS5zad8f 9Qn67nz3eIO1ihSVldPBPltIErqwBvbDQTSeNb0ddyPe7Fi2r0kPXbOByE04M3m59+d2TkMhHn5Gl Zv6AysNy23y8lddUUID+niObvYhpRcdkxsuWIyiEyV8UUqEF8LcN2mQ6U8Fy3Z+ILAVByBjS1sowk jtTbnhCQOrgIePGu4E/w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1olB5c-003Jj0-0R; Wed, 19 Oct 2022 15:34:41 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1olAkw-0037LX-Iy for linux-arm-kernel@lists.infradead.org; Wed, 19 Oct 2022 15:13:25 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 96137618D7; Wed, 19 Oct 2022 15:13:17 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A7435C433D7; Wed, 19 Oct 2022 15:13:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666192396; bh=cjxPuXIUh06Ba3GXCFfVn99lEclLPcRfw+NxBEe4Kg0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hcqsxINcYzTT3DkcHDdYLB3QHhzbGuZGKInydfT12xgHvQHRd+WIXuP/R+G72JcGv 8UsKYmj1ahxyJmVtwy5znbGtIhatHTgimQ0bKYqVvLf5nT+uoyLG5DlBiSi6wqg8aK HQ7odPwMV3m+iM8lqW+mtYrxkBcwzKfb/bfSHmu4Qr5I1og+Bapxwt6ZVQkX/G2KoZ cGkayXvERL+uxCqkHHjG+BVfiodRgnUnAFLCeVdM3ykW5bKp/Z3iYkiKGbHS5rD5Fm UwAx1OMTozZCpDzK8nNraeh4avjKSnvrpt1R9KBMir1uZtRg/J1vsfUk/yGd0yCJYi JEBd8KCEwHd2w== From: Arnd Bergmann To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , Dan Williams , Lennert Buytenhek , Martin Michlmayr , linux-i2c@vger.kernel.org Subject: [PATCH 09/17] ARM: iop32x: remove the platform Date: Wed, 19 Oct 2022 17:03:31 +0200 Message-Id: <20221019150410.3851944-9-arnd@kernel.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20221019150410.3851944-1-arnd@kernel.org> References: <20221019144119.3848027-1-arnd@kernel.org> <20221019150410.3851944-1-arnd@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221019_081318_941187_ACBF589F X-CRM114-Status: GOOD ( 23.17 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RnJvbTogQXJuZCBCZXJnbWFubiA8YXJuZEBhcm5kYi5kZT4KClRoaXMgd2FzIG1hcmtlZCBhcyB1 bnVzZWQgaW4gNS4xOSBhbmQgY2FuIG5vdyBiZSByZW1vdmVkCgpDYzogRGFuIFdpbGxpYW1zIDxk YW4uai53aWxsaWFtc0BpbnRlbC5jb20+CkNjOiBMZW5uZXJ0IEJ1eXRlbmhlayA8a2VybmVsQHdh bnRzdG9mbHkub3JnPgpDYzogTWFydGluIE1pY2hsbWF5ciA8dGJtQGN5cml1cy5jb20+ClNpZ25l ZC1vZmYtYnk6IEFybmQgQmVyZ21hbm4gPGFybmRAYXJuZGIuZGU+Ci0tLQogTUFJTlRBSU5FUlMg ICAgICAgICAgICAgICAgICAgICAgICB8ICAzMCAtLS0KIGFyY2gvYXJtL0tjb25maWcgICAgICAg ICAgICAgICAgICAgfCAgIDQgKy0KIGFyY2gvYXJtL0tjb25maWcuZGVidWcgICAgICAgICAgICAg fCAgIDYgKy0KIGFyY2gvYXJtL01ha2VmaWxlICAgICAgICAgICAgICAgICAgfCAgIDEgLQogYXJj aC9hcm0vY29uZmlncy9pb3AzMnhfZGVmY29uZmlnICB8IDEyNiAtLS0tLS0tLS0KIGFyY2gvYXJt L2tlcm5lbC9lbnRyeS1jb21tb24uUyAgICAgfCAgMTUgLS0KIGFyY2gvYXJtL21hY2gtaW9wMzJ4 L0tjb25maWcgICAgICAgfCAgNTQgLS0tLQogYXJjaC9hcm0vbWFjaC1pb3AzMngvTWFrZWZpbGUg ICAgICB8ICAyMCAtLQogYXJjaC9hcm0vbWFjaC1pb3AzMngvYWRtYS5jICAgICAgICB8IDE2MyAt LS0tLS0tLS0tLS0KIGFyY2gvYXJtL21hY2gtaW9wMzJ4L2NwNi5jICAgICAgICAgfCAgNDggLS0t LQogYXJjaC9hcm0vbWFjaC1pb3AzMngvZW03MjEwLmMgICAgICB8IDIzMiAtLS0tLS0tLS0tLS0t LS0tLQogYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYyAgICB8IDIxNCAtLS0tLS0tLS0t LS0tLS0KIGFyY2gvYXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmggICAgfCAgMTIgLQogYXJjaC9h cm0vbWFjaC1pb3AzMngvZ3Bpby1pb3AzMnguaCB8ICAxMSAtCiBhcmNoL2FybS9tYWNoLWlvcDMy eC9oYXJkd2FyZS5oICAgIHwgIDM4IC0tLQogYXJjaC9hcm0vbWFjaC1pb3AzMngvaTJjLmMgICAg ICAgICB8ICA5MiAtLS0tLS0tCiBhcmNoL2FybS9tYWNoLWlvcDMyeC9pb3AzeHguaCAgICAgIHwg MzI2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBhcmNoL2FybS9tYWNoLWlvcDMyeC9pcTMxMjQ0 LmMgICAgIHwgMzMzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogYXJjaC9hcm0vbWFjaC1pb3Az MngvaXEzMTI0NC5oICAgICB8ICAxNiAtLQogYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5j ICAgICB8IDE5MiAtLS0tLS0tLS0tLS0tLQogYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5o ICAgICB8ICAxNiAtLQogYXJjaC9hcm0vbWFjaC1pb3AzMngvaXJxLmMgICAgICAgICB8ICA5NSAt LS0tLS0tCiBhcmNoL2FybS9tYWNoLWlvcDMyeC9pcnFzLmggICAgICAgIHwgIDQ4IC0tLS0KIGFy Y2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMgICAgICAgfCAzNjcgLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KIGFyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmggICAgICAgfCAgMTggLS0KIGFy Y2gvYXJtL21hY2gtaW9wMzJ4L3BjaS5jICAgICAgICAgfCA0MDQgLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KIGFyY2gvYXJtL21hY2gtaW9wMzJ4L3BtdS5jICAgICAgICAgfCAgMjkgLS0t CiBhcmNoL2FybS9tYWNoLWlvcDMyeC9yZXN0YXJ0LmMgICAgIHwgIDE3IC0tCiBhcmNoL2FybS9t YWNoLWlvcDMyeC9zZXR1cC5jICAgICAgIHwgIDMxIC0tLQogYXJjaC9hcm0vbWFjaC1pb3AzMngv dGltZS5jICAgICAgICB8IDE3OSAtLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2kyYy9idXNzZXMvS2Nv bmZpZyAgICAgICAgIHwgICA2ICstCiAzMSBmaWxlcyBjaGFuZ2VkLCA2IGluc2VydGlvbnMoKyks IDMxMzcgZGVsZXRpb25zKC0pCiBkZWxldGUgbW9kZSAxMDA2NDQgYXJjaC9hcm0vY29uZmlncy9p b3AzMnhfZGVmY29uZmlnCiBkZWxldGUgbW9kZSAxMDA2NDQgYXJjaC9hcm0vbWFjaC1pb3AzMngv S2NvbmZpZwogZGVsZXRlIG1vZGUgMTAwNjQ0IGFyY2gvYXJtL21hY2gtaW9wMzJ4L01ha2VmaWxl CiBkZWxldGUgbW9kZSAxMDA2NDQgYXJjaC9hcm0vbWFjaC1pb3AzMngvYWRtYS5jCiBkZWxldGUg bW9kZSAxMDA2NDQgYXJjaC9hcm0vbWFjaC1pb3AzMngvY3A2LmMKIGRlbGV0ZSBtb2RlIDEwMDY0 NCBhcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYwogZGVsZXRlIG1vZGUgMTAwNjQ0IGFyY2gv YXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmMKIGRlbGV0ZSBtb2RlIDEwMDY0NCBhcmNoL2FybS9t YWNoLWlvcDMyeC9nbGFudGFuay5oCiBkZWxldGUgbW9kZSAxMDA2NDQgYXJjaC9hcm0vbWFjaC1p b3AzMngvZ3Bpby1pb3AzMnguaAogZGVsZXRlIG1vZGUgMTAwNjQ0IGFyY2gvYXJtL21hY2gtaW9w MzJ4L2hhcmR3YXJlLmgKIGRlbGV0ZSBtb2RlIDEwMDY0NCBhcmNoL2FybS9tYWNoLWlvcDMyeC9p MmMuYwogZGVsZXRlIG1vZGUgMTAwNjQ0IGFyY2gvYXJtL21hY2gtaW9wMzJ4L2lvcDN4eC5oCiBk ZWxldGUgbW9kZSAxMDA2NDQgYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jCiBkZWxldGUg bW9kZSAxMDA2NDQgYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5oCiBkZWxldGUgbW9kZSAx MDA2NDQgYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5jCiBkZWxldGUgbW9kZSAxMDA2NDQg YXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5oCiBkZWxldGUgbW9kZSAxMDA2NDQgYXJjaC9h cm0vbWFjaC1pb3AzMngvaXJxLmMKIGRlbGV0ZSBtb2RlIDEwMDY0NCBhcmNoL2FybS9tYWNoLWlv cDMyeC9pcnFzLmgKIGRlbGV0ZSBtb2RlIDEwMDY0NCBhcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEw MC5jCiBkZWxldGUgbW9kZSAxMDA2NDQgYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuaAogZGVs ZXRlIG1vZGUgMTAwNjQ0IGFyY2gvYXJtL21hY2gtaW9wMzJ4L3BjaS5jCiBkZWxldGUgbW9kZSAx MDA2NDQgYXJjaC9hcm0vbWFjaC1pb3AzMngvcG11LmMKIGRlbGV0ZSBtb2RlIDEwMDY0NCBhcmNo L2FybS9tYWNoLWlvcDMyeC9yZXN0YXJ0LmMKIGRlbGV0ZSBtb2RlIDEwMDY0NCBhcmNoL2FybS9t YWNoLWlvcDMyeC9zZXR1cC5jCiBkZWxldGUgbW9kZSAxMDA2NDQgYXJjaC9hcm0vbWFjaC1pb3Az MngvdGltZS5jCgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA4 OWY3MmRiYThlNjQuLmRhMWZmNDY4ZTI3ZCAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIv TUFJTlRBSU5FUlMKQEAgLTIyMTUsMjEgKzIyMTUsNiBAQCBMOglsaW51eC1hcm0ta2VybmVsQGxp c3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogUzoJTWFp bnRhaW5lZAogRjoJYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEyNzAtaW5jb21lLmMKIAot QVJNL0lOVEVMIElPUDMyWCBBUk0gQVJDSElURUNUVVJFCi1NOglMZW5uZXJ0IEJ1eXRlbmhlayA8 a2VybmVsQHdhbnRzdG9mbHkub3JnPgotTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRl YWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKLVM6CU1haW50YWluZWQKLQot QVJNL0lOVEVMIElRODEzNDJFWCBNQUNISU5FIFNVUFBPUlQKLU06CUxlbm5lcnQgQnV5dGVuaGVr IDxrZXJuZWxAd2FudHN0b2ZseS5vcmc+Ci1MOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJh ZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQotUzoJTWFpbnRhaW5lZAot Ci1BUk0vSU5URUwgSVhEUDI4NTAgTUFDSElORSBTVVBQT1JUCi1NOglMZW5uZXJ0IEJ1eXRlbmhl ayA8a2VybmVsQHdhbnRzdG9mbHkub3JnPgotTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZy YWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKLVM6CU1haW50YWluZWQK LQogQVJNL0lOVEVMIElYUDRYWCBBUk0gQVJDSElURUNUVVJFCiBNOglMaW51cyBXYWxsZWlqIDxs aW51c3dAa2VybmVsLm9yZz4KIE06CUltcmUgS2Fsb3ogPGthbG96QG9wZW53cnQub3JnPgpAQCAt MjYzNSwxMSArMjYyMCw2IEBAIEY6CWluY2x1ZGUvZHQtYmluZGluZ3MvKi9xY29tKgogRjoJaW5j bHVkZS9saW51eC8qL3Fjb20qCiBGOglpbmNsdWRlL2xpbnV4L3NvYy9xY29tLwogCi1BUk0vUkFE SVNZUyBFTlAyNjExIE1BQ0hJTkUgU1VQUE9SVAotTToJTGVubmVydCBCdXl0ZW5oZWsgPGtlcm5l bEB3YW50c3RvZmx5Lm9yZz4KLUw6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCi1TOglNYWludGFpbmVkCi0KIEFSTS9S REEgTUlDUk8gQVJDSElURUNUVVJFCiBNOglNYW5pdmFubmFuIFNhZGhhc2l2YW0gPG1hbml2YW5u YW4uc2FkaGFzaXZhbUBsaW5hcm8ub3JnPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZy YWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKQEAgLTI5NzEsMTEgKzI5 NTEsNiBAQCBGOglhcmNoL2FybTY0L2Jvb3QvZHRzL3RpL01ha2VmaWxlCiBGOglhcmNoL2FybTY0 L2Jvb3QvZHRzL3RpL2szLSoKIEY6CWluY2x1ZGUvZHQtYmluZGluZ3MvcGluY3RybC9rMy5oCiAK LUFSTS9USEVDVVMgTjIxMDAgTUFDSElORSBTVVBQT1JUCi1NOglMZW5uZXJ0IEJ1eXRlbmhlayA8 a2VybmVsQHdhbnRzdG9mbHkub3JnPgotTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRl YWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKLVM6CU1haW50YWluZWQKLQog QVJNL1RPU0EgTUFDSElORSBTVVBQT1JUCiBNOglEbWl0cnkgRXJlbWluLVNvbGVuaWtvdiA8ZGJh cnlzaGtvdkBnbWFpbC5jb20+CiBNOglEaXJrIE9wZmVyIDxkaXJrQG9wZmVyLW9ubGluZS5kZT4K QEAgLTEwMzA3LDExICsxMDI4Miw2IEBAIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIv c2NtL2xpbnV4L2tlcm5lbC9naXQvam9yby9pb21tdS5naXQKIEY6CWRyaXZlcnMvaW9tbXUvaW50 ZWwvCiBGOglpbmNsdWRlL2xpbnV4L2ludGVsLXN2bS5oCiAKLUlOVEVMIElPUC1BRE1BIERNQSBE UklWRVIKLVI6CURhbiBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tPgotUzoJT2Rk IGZpeGVzCi1GOglkcml2ZXJzL2RtYS9pb3AtYWRtYS5jCi0KIElOVEVMIElQVTMgQ1NJLTIgQ0lP MiBEUklWRVIKIE06CVlvbmcgWmhpIDx5b25nLnpoaUBpbnRlbC5jb20+CiBNOglTYWthcmkgQWls dXMgPHNha2FyaS5haWx1c0BsaW51eC5pbnRlbC5jb20+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9L Y29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCBlNThkYWIwMzAzZTYuLjY5OGQ4ODM0M2U4 ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBA IC0yODAsNyArMjgwLDcgQEAgY29uZmlnIFBIWVNfT0ZGU0VUCiAJZGVmYXVsdCAweDAwMDAwMDAw IGlmIEFSQ0hfRk9PVEJSSURHRQogCWRlZmF1bHQgMHgxMDAwMDAwMCBpZiBBUkNIX09NQVAxIHx8 IEFSQ0hfUlBDCiAJZGVmYXVsdCAweDMwMDAwMDAwIGlmIEFSQ0hfUzNDMjRYWAotCWRlZmF1bHQg MHhhMDAwMDAwMCBpZiBBUkNIX0lPUDMyWCB8fCBBUkNIX1BYQQorCWRlZmF1bHQgMHhhMDAwMDAw MCBpZiBBUkNIX1BYQQogCWRlZmF1bHQgMHhjMDAwMDAwMCBpZiBBUkNIX0VQOTNYWCB8fCBBUkNI X1NBMTEwMAogCWRlZmF1bHQgMAogCWhlbHAKQEAgLTQ1NSw4ICs0NTUsNiBAQCBzb3VyY2UgImFy Y2gvYXJtL21hY2gtaHBlL0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1pbXgvS2Nv bmZpZyIKIAotc291cmNlICJhcmNoL2FybS9tYWNoLWlvcDMyeC9LY29uZmlnIgotCiBzb3VyY2Ug ImFyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1r ZXlzdG9uZS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZyBiL2Fy Y2gvYXJtL0tjb25maWcuZGVidWcKaW5kZXggM2IxMWUxZDA0NjI1Li4zMjBjOTNmYWJiMjEgMTAw NjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZy5k ZWJ1ZwpAQCAtMTYxMCw3ICsxNjEwLDcgQEAgY29uZmlnIERFQlVHX1VBUlRfUEwwMVgKIAogIyBD b21wYXRpYmlsaXR5IG9wdGlvbnMgZm9yIDgyNTAKIGNvbmZpZyBERUJVR19VQVJUXzgyNTAKLQlk ZWZfYm9vbCBBUkNIX0lPUDMyWCB8fCBBUkNIX0lYUDRYWCB8fCBBUkNIX1JQQworCWRlZl9ib29s IEFSQ0hfSVhQNFhYIHx8IEFSQ0hfUlBDCiAKIGNvbmZpZyBERUJVR19VQVJUX1BIWVMKIAloZXgg IlBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiBkZWJ1ZyBVQVJUIgpAQCAtMTcyMCw3ICsxNzIwLDYg QEAgY29uZmlnIERFQlVHX1VBUlRfUEhZUwogCWRlZmF1bHQgMHhmY2IwMDAwMCBpZiBERUJVR19I STM2MjBfVUFSVAogCWRlZmF1bHQgMHhmZDg4MzAwMCBpZiBERUJVR19BTFBJTkVfVUFSVDAKIAlk ZWZhdWx0IDB4ZmU1MzEwMDAgaWYgREVCVUdfU1RJSDQxWF9TQkNfQVNDMQotCWRlZmF1bHQgMHhm ZTgwMDAwMCBpZiBBUkNIX0lPUDMyWAogCWRlZmF1bHQgMHhmZWQzMjAwMCBpZiBERUJVR19TVElI NDFYX0FTQzIKIAlkZWZhdWx0IDB4ZmY2OTAwMDAgaWYgREVCVUdfUkszMl9VQVJUMgogCWRlZmF1 bHQgMHhmZmMwMjAwMCBpZiBERUJVR19TT0NGUEdBX1VBUlQwCkBAIC0xODI1LDcgKzE4MjQsNiBA QCBjb25maWcgREVCVUdfVUFSVF9WSVJUCiAJZGVmYXVsdCAweGZlMDE4MDAwIGlmIERFQlVHX01N UF9VQVJUMwogCWRlZmF1bHQgMHhmZTEwMDAwMCBpZiBERUJVR19JTVgyM19VQVJUIHx8IERFQlVH X0lNWDI4X1VBUlQKIAlkZWZhdWx0IDB4ZmUzMDAwMDAgaWYgREVCVUdfQkNNX0tPTkFfVUFSVAot CWRlZmF1bHQgMHhmZTgwMDAwMCBpZiBBUkNIX0lPUDMyWAogCWRlZmF1bHQgMHhmZWIwMDAwMCBp ZiBERUJVR19ISTM2MjBfVUFSVCB8fCBERUJVR19ISVg1SEQyX1VBUlQKIAlkZWZhdWx0IDB4ZmVi MjQwMDAgaWYgREVCVUdfUkszWF9VQVJUMAogCWRlZmF1bHQgMHhmZWIyNjAwMCBpZiBERUJVR19S SzNYX1VBUlQxCkBAIC0xODY3LDcgKzE4NjUsNyBAQCBjb25maWcgREVCVUdfVUFSVF9WSVJUCiBj b25maWcgREVCVUdfVUFSVF84MjUwX1NISUZUCiAJaW50ICJSZWdpc3RlciBvZmZzZXQgc2hpZnQg Zm9yIHRoZSA4MjUwIGRlYnVnIFVBUlQiCiAJZGVwZW5kcyBvbiBERUJVR19MTF9VQVJUXzgyNTAg fHwgREVCVUdfVUFSVF84MjUwCi0JZGVmYXVsdCAwIGlmIERFQlVHX0ZPT1RCUklER0VfQ09NMSB8 fCBBUkNIX0lPUDMyWCB8fCBERUJVR19CQ01fNTMwMVggfHwgXAorCWRlZmF1bHQgMCBpZiBERUJV R19GT09UQlJJREdFX0NPTTEgfHwgREVCVUdfQkNNXzUzMDFYIHx8IFwKIAkJREVCVUdfQkNNX0hS MiB8fCBERUJVR19PTUFQN1hYVUFSVDEgfHwgREVCVUdfT01BUDdYWFVBUlQyIHx8IFwKIAkJREVC VUdfT01BUDdYWFVBUlQzCiAJZGVmYXVsdCAzIGlmIERFQlVHX01TVEFSVjdfUE1VQVJUCmRpZmYg LS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IGJlZGEy MjkxMWZlYi4uMWE2MjAzNWQxMjA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9NYWtlZmlsZQorKysg Yi9hcmNoL2FybS9NYWtlZmlsZQpAQCAtMTc5LDcgKzE3OSw2IEBAIG1hY2hpbmUtJChDT05GSUdf QVJDSF9HRU1JTkkpCQkrPSBnZW1pbmkKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9ISUdIQkFOSykJ CSs9IGhpZ2hiYW5rCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSElTSSkJCSs9IGhpc2kKIG1hY2hp bmUtJChDT05GSUdfQVJDSF9IUEUpCQkrPSBocGUKLW1hY2hpbmUtJChDT05GSUdfQVJDSF9JT1Az MlgpCQkrPSBpb3AzMngKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9JWFA0WFgpCQkrPSBpeHA0eHgK IG1hY2hpbmUtJChDT05GSUdfQVJDSF9LRVlTVE9ORSkJCSs9IGtleXN0b25lCiBtYWNoaW5lLSQo Q09ORklHX0FSQ0hfTFBDMThYWCkJCSs9IGxwYzE4eHgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Nv bmZpZ3MvaW9wMzJ4X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW9wMzJ4X2RlZmNvbmZp ZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllMzBlNzkwZDM1Li4wMDAwMDAwMDAw MDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9pb3AzMnhfZGVmY29uZmlnCisrKyAvZGV2L251bGwK QEAgLTEsMTI2ICswLDAgQEAKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19B Q0NUPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQot Q09ORklHX0tBTExTWU1TX0FMTD15Ci0jIENPTkZJR19BUkNIX01VTFRJX1Y3IGlzIG5vdCBzZXQK LUNPTkZJR19BUkNIX0lPUDMyWD15Ci1DT05GSUdfTUFDSF9HTEFOVEFOSz15Ci1DT05GSUdfQVJD SF9JUTgwMzIxPXkKLUNPTkZJR19BUkNIX0lRMzEyNDQ9eQotQ09ORklHX01BQ0hfTjIxMDA9eQot Q09ORklHX1VOVVNFRF9CT0FSRF9GSUxFUz15Ci1DT05GSUdfQ01ETElORT0iY29uc29sZT10dHlT MCwxMTUyMDAgcm9vdD0vZGV2L25mcyBpcD1ib290cCBjYWNoZXBvbGljeT13cml0ZWFsbG9jIgot Q09ORklHX0ZQRV9OV0ZQRT15Ci1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9B RD15Ci1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLUNPTkZJR19TTEFCPXkKLUNPTkZJR19O RVQ9eQotQ09ORklHX1BBQ0tFVD15Ci1DT05GSUdfVU5JWD15Ci1DT05GSUdfSU5FVD15Ci1DT05G SUdfSVBfTVVMVElDQVNUPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9CT09UUD15 Ci1DT05GSUdfSVBWNj15Ci0jIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5v dCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05G SUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9TSVQgaXMg bm90IHNldAotQ09ORklHX01URD15Ci1DT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQotQ09ORklH X01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEPXkKLUNPTkZJR19NVERfUkVEQk9PVF9QQVJU U19SRUFET05MWT15Ci1DT05GSUdfTVREX0JMT0NLPXkKLUNPTkZJR19NVERfQ0ZJPXkKLUNPTkZJ R19NVERfQ0ZJX0lOVEVMRVhUPXkKLUNPTkZJR19NVERfUEhZU01BUD15Ci1DT05GSUdfQkxLX0RF Vl9MT09QPXkKLUNPTkZJR19CTEtfREVWX05CRD15Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09O RklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgotQ09ORklHX0JMS19ERVZfU0Q9eQotQ09ORklHX0NI Ul9ERVZfU0c9eQotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotQ09ORklHX0FUQT15 Ci1DT05GSUdfU0FUQV9TSUw9eQotQ09ORklHX1NBVEFfVklURVNTRT15Ci1DT05GSUdfTUQ9eQot Q09ORklHX0JMS19ERVZfTUQ9eQotQ09ORklHX01EX1JBSUQwPXkKLUNPTkZJR19NRF9SQUlEMT15 Ci1DT05GSUdfTURfUkFJRDEwPXkKLUNPTkZJR19NRF9SQUlENDU2PXkKLUNPTkZJR19CTEtfREVW X0RNPXkKLUNPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklH X05FVF9QQ0k9eQotQ09ORklHX0UxMDA9eQotQ09ORklHX0UxMDAwPXkKLUNPTkZJR19SODE2OT15 Ci0jIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBV VF9LRVlCT0FSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0Ci0j IENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NF UklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX0hXX1JBTkRPTT15Ci1DT05GSUdfSTJDPXkKLUNP TkZJR19JMkNfQ0hBUkRFVj15Ci1DT05GSUdfSTJDX0lPUDNYWD15Ci0jIENPTkZJR19WR0FfQ09O U09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKLUNPTkZJR19VU0I9 eQotQ09ORklHX1VTQl9NT049eQotQ09ORklHX1VTQl9FSENJX0hDRD15Ci1DT05GSUdfVVNCX0VI Q0lfUk9PVF9IVUJfVFQ9eQotQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEPXkKLUNPTkZJR19V U0JfVUhDSV9IQ0Q9eQotQ09ORklHX1VTQl9TVE9SQUdFPXkKLUNPTkZJR19SVENfQ0xBU1M9eQot Q09ORklHX1JUQ19EUlZfUlM1QzM3Mj15Ci1DT05GSUdfRE1BREVWSUNFUz15Ci1DT05GSUdfSU5U RUxfSU9QX0FETUE9eQotQ09ORklHX05FVF9ETUE9eQotQ09ORklHX0VYVDJfRlM9eQotQ09ORklH X0VYVDNfRlM9eQotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19FQ1JZUFRfRlM9eQotQ09ORklHX0pG RlMyX0ZTPXkKLUNPTkZJR19DUkFNRlM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1Yz PXkKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTkZTRD15Ci1DT05GSUdfS0VZUz15Ci1DT05G SUdfQ1JZUFRPX05VTEw9eQotQ09ORklHX0NSWVBUT19MUlc9eQotQ09ORklHX0NSWVBUT19QQ0JD PW0KLUNPTkZJR19DUllQVE9fSE1BQz15Ci1DT05GSUdfQ1JZUFRPX1hDQkM9eQotQ09ORklHX0NS WVBUT19NRDQ9eQotQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz15Ci1DT05GSUdfQ1JZUFRPX1NI QTE9eQotQ09ORklHX0NSWVBUT19TSEEyNTY9eQotQ09ORklHX0NSWVBUT19TSEE1MTI9eQotQ09O RklHX0NSWVBUT19UR1IxOTI9eQotQ09ORklHX0NSWVBUT19XUDUxMj15Ci1DT05GSUdfQ1JZUFRP X0FFUz15Ci1DT05GSUdfQ1JZUFRPX0FOVUJJUz15Ci1DT05GSUdfQ1JZUFRPX0FSQzQ9eQotQ09O RklHX0NSWVBUT19CTE9XRklTSD15Ci1DT05GSUdfQ1JZUFRPX0NBU1Q1PXkKLUNPTkZJR19DUllQ VE9fQ0FTVDY9eQotQ09ORklHX0NSWVBUT19ERVM9eQotQ09ORklHX0NSWVBUT19LSEFaQUQ9eQot Q09ORklHX0NSWVBUT19TRVJQRU5UPXkKLUNPTkZJR19DUllQVE9fVEVBPXkKLUNPTkZJR19DUllQ VE9fVFdPRklTSD15Ci1DT05GSUdfQ1JZUFRPX0RFRkxBVEU9eQotQ09ORklHX0xJQkNSQzMyQz15 Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci1DT05GSUdfREVC VUdfVVNFUj15Ci1DT05GSUdfREVCVUdfTEw9eQotQ09ORklHX0RFQlVHX0xMX1VBUlRfODI1MD15 CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMgYi9hcmNoL2FybS9r ZXJuZWwvZW50cnktY29tbW9uLlMKaW5kZXggNDA1YTYwN2I3NTRmLi4wM2Q0YzU1NzhjNWMgMTAw NjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUworKysgYi9hcmNoL2FybS9r ZXJuZWwvZW50cnktY29tbW9uLlMKQEAgLTE2LDE1ICsxNiw2IEBACiAKIAkuZXF1CU5SX3N5c2Nh bGxzLCBfX05SX3N5c2NhbGxzCiAKLQkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcAotI2lm ZGVmIENPTkZJR19BUkNIX0lPUDMyWAotCW1yYwlwMTUsIDAsIFx0bXAsIGMxNSwgYzEsIDAKLQl0 c3QJXHRtcCwgIygxIDw8IDYpCi0JYmljbmUJXHRtcCwgXHRtcCwgIygxIDw8IDYpCi0JbWNybmUJ cDE1LCAwLCBcdG1wLCBjMTUsIGMxLCAwCUAgRGlzYWJsZSBjcDYgYWNjZXNzCi0jZW5kaWYKLQku ZW5kbQotCiAjaW5jbHVkZSAiZW50cnktaGVhZGVyLlMiCiAKIHNhdmVkX3BzcgkucmVxCXI4CkBA IC01NSwxMCArNDYsNiBAQCBfX3JldF9mYXN0X3N5c2NhbGw6CiAJbW92cwlyMSwgcjEsIGxzbCAj MTYKIAlibmUJZmFzdF93b3JrX3BlbmRpbmcKIAotCi0JLyogcGVyZm9ybSBhcmNoaXRlY3R1cmUg c3BlY2lmaWMgYWN0aW9ucyBiZWZvcmUgdXNlciByZXR1cm4gKi8KLQlhcmNoX3JldF90b191c2Vy IHIxCi0KIAlyZXN0b3JlX3VzZXJfcmVncyBmYXN0ID0gMSwgb2Zmc2V0ID0gU19PRkYKICBVTldJ TkQoLmZuZW5kCQkpCiBFTkRQUk9DKHJldF9mYXN0X3N5c2NhbGwpCkBAIC0xMjksOCArMTE2LDYg QEAgRU5UUlkocmV0X3RvX3VzZXJfZnJvbV9pcnEpCiBub193b3JrX3BlbmRpbmc6CiAJYXNtX3Ry YWNlX2hhcmRpcnFzX29uIHNhdmUgPSAwCiAKLQkvKiBwZXJmb3JtIGFyY2hpdGVjdHVyZSBzcGVj aWZpYyBhY3Rpb25zIGJlZm9yZSB1c2VyIHJldHVybiAqLwotCWFyY2hfcmV0X3RvX3VzZXIgcjEK IAljdF91c2VyX2VudGVyIHNhdmUgPSAwCiAKIAlyZXN0b3JlX3VzZXJfcmVncyBmYXN0ID0gMCwg b2Zmc2V0ID0gMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvS2NvbmZpZyBiL2Fy Y2gvYXJtL21hY2gtaW9wMzJ4L0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDc2MWZiYjA0ZmFhMS4uMDAwMDAwMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L0tj b25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0jIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wCi1tZW51Y29uZmlnIEFSQ0hfSU9QMzJYCi0JYm9vbCAiSU9QMzJ4LWJh c2VkIHBsYXRmb3JtcyIKLQlkZXBlbmRzIG9uIEFSQ0hfTVVMVElfVjUKLQlkZXBlbmRzIG9uIENQ VV9MSVRUTEVfRU5ESUFOCi0JZGVwZW5kcyBvbiBBVEFHUyAmJiBVTlVTRURfQk9BUkRfRklMRVMK LQlzZWxlY3QgQ1BVX1hTQ0FMRQotCXNlbGVjdCBHUElPX0lPUAotCXNlbGVjdCBHUElPTElCCi0J c2VsZWN0IEZPUkNFX1BDSQotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIEludGVsJ3MgODAyMTkgYW5k IElPUDMyWCAoWFNjYWxlKSBmYW1pbHkgb2YKLQkgIHByb2Nlc3NvcnMuCi0KLWlmIEFSQ0hfSU9Q MzJYCi0KLWNvbmZpZyBNQUNIX0VQODAyMTkKLQlib29sCi0KLWNvbmZpZyBNQUNIX0dMQU5UQU5L Ci0JYm9vbCAiRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBJTy1EYXRhIEdMQU4gVGFuayIKLQloZWxw Ci0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHJ1biB5b3VyIGtlcm5lbCBvbiB0aGUgR0xB TiBUYW5rCi0JICBOQVMgYXBwbGlhbmNlIG9yIG1hY2hpbmVzIGZyb20gSU8tRGF0YSdzIEhETC1H eHh4LCBIREwtR1d4eHgKLQkgIGFuZCBIREwtR1p4eHggc2VyaWVzLgotCi1jb25maWcgQVJDSF9J UTgwMzIxCi0JYm9vbCAiRW5hYmxlIHN1cHBvcnQgZm9yIElRODAzMjEiCi0JaGVscAotCSAgU2F5 IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBydW4geW91ciBrZXJuZWwgb24gdGhlIEludGVsIElRODAz MjEKLQkgIGV2YWx1YXRpb24ga2l0IGZvciB0aGUgSU9QMzIxIHByb2Nlc3Nvci4KLQotY29uZmln IEFSQ0hfSVEzMTI0NAotCWJvb2wgIkVuYWJsZSBzdXBwb3J0IGZvciBFUDgwMjE5L0lRMzEyNDQi Ci0Jc2VsZWN0IE1BQ0hfRVA4MDIxOQotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQg dG8gcnVuIHlvdXIga2VybmVsIG9uIHRoZSBJbnRlbCBFUDgwMjE5Ci0JICBldmFsdWF0aW9uIGtp dCBmb3IgdGhlIEludGVsIDgwMjE5IHByb2Nlc3NvciAoYSBJT1AzMjEgdmFyaWFudCkKLQkgIG9y IHRoZSBJUTMxMjQ0IGV2YWx1YXRpb24ga2l0IGZvciB0aGUgSU9QMzIxIHByb2Nlc3Nvci4KLQot Y29uZmlnIE1BQ0hfTjIxMDAKLQlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFRoZWN1cyBu MjEwMCIKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHJ1biB5b3VyIGtlcm5l bCBvbiB0aGUgVGhlY3VzIG4yMTAwCi0JICBOQVMgYXBwbGlhbmNlLgotCi1jb25maWcgTUFDSF9F TTcyMTAKLQlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgdGhlIExhbm5lciBFTTcyMTAiCi0JaGVs cAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBydW4geW91ciBrZXJuZWwgb24gdGhlIExh bm5lciBFTTcyMTAKLQkgIGJvYXJkLiBTYXkgYWxzbyBZIGhlcmUgaWYgeW91IGhhdmUgYSBTUzQw MDBlIEJheHRlciBDcmVlayBOQVMKLQkgIGFwcGxpYW5jZS4iCi0KLWVuZGlmCmRpZmYgLS1naXQg YS9hcmNoL2FybS9tYWNoLWlvcDMyeC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L01h a2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODAxOGVmNWM2YTkuLjAwMDAw MDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9NYWtlZmlsZQorKysgL2Rldi9udWxs CkBAIC0xLDIwICswLDAgQEAKLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKLSMK LSMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCi0jCi0KLW9iai0kKENPTkZJR19BUkNI X0lPUDMyWCkgKz0gaXJxLm8KLW9iai0kKENPTkZJR19BUkNIX0lPUDMyWCkgKz0gaTJjLm8KLW9i ai0kKENPTkZJR19BUkNIX0lPUDMyWCkgKz0gcGNpLm8KLW9iai0kKENPTkZJR19BUkNIX0lPUDMy WCkgKz0gc2V0dXAubwotb2JqLSQoQ09ORklHX0FSQ0hfSU9QMzJYKSArPSB0aW1lLm8KLW9iai0k KENPTkZJR19BUkNIX0lPUDMyWCkgKz0gY3A2Lm8KLW9iai0kKENPTkZJR19BUkNIX0lPUDMyWCkg Kz0gYWRtYS5vCi1vYmotJChDT05GSUdfQVJDSF9JT1AzMlgpICs9IHBtdS5vCi1vYmotJChDT05G SUdfQVJDSF9JT1AzMlgpICs9IHJlc3RhcnQubwotCi1vYmotJChDT05GSUdfTUFDSF9HTEFOVEFO SykgKz0gZ2xhbnRhbmsubwotb2JqLSQoQ09ORklHX0FSQ0hfSVE4MDMyMSkgKz0gaXE4MDMyMS5v Ci1vYmotJChDT05GSUdfQVJDSF9JUTMxMjQ0KSArPSBpcTMxMjQ0Lm8KLW9iai0kKENPTkZJR19N QUNIX04yMTAwKSArPSBuMjEwMC5vCi1vYmotJChDT05GSUdfTUFDSF9FTTcyMTApICs9IGVtNzIx MC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9hZG1hLmMgYi9hcmNoL2FybS9t YWNoLWlvcDMyeC9hZG1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NGJjYmZm OThkZi4uMDAwMDAwMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2FkbWEuYworKysg L2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog R1BMLTIuMC1vbmx5Ci0vKgotICogcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb25zIGZvciB0aGUg aW9wM3h4IGRtYS94b3IgZW5naW5lcwotICogQ29weXJpZ2h0IMKpIDIwMDYsIEludGVsIENvcnBv cmF0aW9uLgotICovCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVk ZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2Rt YS1pb3AzMnguaD4KLQotI2luY2x1ZGUgImlvcDN4eC5oIgotI2luY2x1ZGUgImlycXMuaCIKLQot I2RlZmluZSBJUlFfRE1BMF9FT1QgSVJRX0lPUDMyWF9ETUEwX0VPVAotI2RlZmluZSBJUlFfRE1B MF9FT0MgSVJRX0lPUDMyWF9ETUEwX0VPQwotI2RlZmluZSBJUlFfRE1BMF9FUlIgSVJRX0lPUDMy WF9ETUEwX0VSUgotCi0jZGVmaW5lIElSUV9ETUExX0VPVCBJUlFfSU9QMzJYX0RNQTFfRU9UCi0j ZGVmaW5lIElSUV9ETUExX0VPQyBJUlFfSU9QMzJYX0RNQTFfRU9DCi0jZGVmaW5lIElSUV9ETUEx X0VSUiBJUlFfSU9QMzJYX0RNQTFfRVJSCi0KLSNkZWZpbmUgSVJRX0FBX0VPVCBJUlFfSU9QMzJY X0FBX0VPVAotI2RlZmluZSBJUlFfQUFfRU9DIElSUV9JT1AzMlhfQUFfRU9DCi0jZGVmaW5lIElS UV9BQV9FUlIgSVJRX0lPUDMyWF9BQV9FUlIKLQotLyogQUFVIGFuZCBETUEgQ2hhbm5lbHMgKi8K LXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9wM3h4X2RtYV8wX3Jlc291cmNlc1tdID0gewotCVsw XSA9IHsKLQkJLnN0YXJ0ID0gSU9QM1hYX0RNQV9QSFlTX0JBU0UoMCksCi0JCS5lbmQgPSBJT1Az WFhfRE1BX1VQUEVSX1BBKDApLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsx XSA9IHsKLQkJLnN0YXJ0ID0gSVJRX0RNQTBfRU9ULAotCQkuZW5kID0gSVJRX0RNQTBfRU9ULAot CQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUQotCX0sCi0JWzJdID0gewotCQkuc3RhcnQgPSBJUlFf RE1BMF9FT0MsCi0JCS5lbmQgPSBJUlFfRE1BMF9FT0MsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0Vf SVJRCi0JfSwKLQlbM10gPSB7Ci0JCS5zdGFydCA9IElSUV9ETUEwX0VSUiwKLQkJLmVuZCA9IElS UV9ETUEwX0VSUiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEKLQl9Ci19OwotCi1zdGF0aWMg c3RydWN0IHJlc291cmNlIGlvcDN4eF9kbWFfMV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0J CS5zdGFydCA9IElPUDNYWF9ETUFfUEhZU19CQVNFKDEpLAotCQkuZW5kID0gSU9QM1hYX0RNQV9V UFBFUl9QQSgxKSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0J CS5zdGFydCA9IElSUV9ETUExX0VPVCwKLQkJLmVuZCA9IElSUV9ETUExX0VPVCwKLQkJLmZsYWdz ID0gSU9SRVNPVVJDRV9JUlEKLQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX0RNQTFfRU9D LAotCQkuZW5kID0gSVJRX0RNQTFfRU9DLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUQotCX0s Ci0JWzNdID0gewotCQkuc3RhcnQgPSBJUlFfRE1BMV9FUlIsCi0JCS5lbmQgPSBJUlFfRE1BMV9F UlIsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCi0JfQotfTsKLQotCi1zdGF0aWMgc3RydWN0 IHJlc291cmNlIGlvcDN4eF9hYXVfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQg PSBJT1AzWFhfQUFVX1BIWVNfQkFTRSwKLQkJLmVuZCA9IElPUDNYWF9BQVVfVVBQRVJfUEEsCi0J CS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFf QUFfRU9ULAotCQkuZW5kID0gSVJRX0FBX0VPVCwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEK LQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX0FBX0VPQywKLQkJLmVuZCA9IElSUV9BQV9F T0MsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCi0JfSwKLQlbM10gPSB7Ci0JCS5zdGFydCA9 IElSUV9BQV9FUlIsCi0JCS5lbmQgPSBJUlFfQUFfRVJSLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNF X0lSUQotCX0KLX07Ci0KLXN0YXRpYyB1NjQgaW9wM3h4X2FkbWFfZG1hbWFzayA9IERNQV9CSVRf TUFTSygzMik7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW9wX2FkbWFfcGxhdGZvcm1fZGF0YSBpb3AzeHhf ZG1hXzBfZGF0YSA9IHsKLQkuaHdfaWQgPSBETUEwX0lELAotCS5wb29sX3NpemUgPSBQQUdFX1NJ WkUsCi19OwotCi1zdGF0aWMgc3RydWN0IGlvcF9hZG1hX3BsYXRmb3JtX2RhdGEgaW9wM3h4X2Rt YV8xX2RhdGEgPSB7Ci0JLmh3X2lkID0gRE1BMV9JRCwKLQkucG9vbF9zaXplID0gUEFHRV9TSVpF LAotfTsKLQotc3RhdGljIHN0cnVjdCBpb3BfYWRtYV9wbGF0Zm9ybV9kYXRhIGlvcDN4eF9hYXVf ZGF0YSA9IHsKLQkuaHdfaWQgPSBBQVVfSUQsCi0JLnBvb2xfc2l6ZSA9IDMgKiBQQUdFX1NJWkUs Ci19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlvcDN4eF9kbWFfMF9jaGFubmVsID0gewot CS5uYW1lID0gImlvcC1hZG1hIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gNCwKLQku cmVzb3VyY2UgPSBpb3AzeHhfZG1hXzBfcmVzb3VyY2VzLAotCS5kZXYgPSB7Ci0JCS5kbWFfbWFz ayA9ICZpb3AzeHhfYWRtYV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklU X01BU0soMzIpLAotCQkucGxhdGZvcm1fZGF0YSA9ICh2b2lkICopICZpb3AzeHhfZG1hXzBfZGF0 YSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBpb3AzeHhfZG1hXzFfY2hhbm5l bCA9IHsKLQkubmFtZSA9ICJpb3AtYWRtYSIsCi0JLmlkID0gMSwKLQkubnVtX3Jlc291cmNlcyA9 IDQsCi0JLnJlc291cmNlID0gaW9wM3h4X2RtYV8xX3Jlc291cmNlcywKLQkuZGV2ID0gewotCQku ZG1hX21hc2sgPSAmaW9wM3h4X2FkbWFfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0g RE1BX0JJVF9NQVNLKDMyKSwKLQkJLnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKSAmaW9wM3h4X2Rt YV8xX2RhdGEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW9wM3h4X2FhdV9j aGFubmVsID0gewotCS5uYW1lID0gImlvcC1hZG1hIiwKLQkuaWQgPSAyLAotCS5udW1fcmVzb3Vy Y2VzID0gNCwKLQkucmVzb3VyY2UgPSBpb3AzeHhfYWF1X3Jlc291cmNlcywKLQkuZGV2ID0gewot CQkuZG1hX21hc2sgPSAmaW9wM3h4X2FkbWFfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNr ID0gRE1BX0JJVF9NQVNLKDMyKSwKLQkJLnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKSAmaW9wM3h4 X2FhdV9kYXRhLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpb3AzeHhfYWRtYV9jYXBf aW5pdCh2b2lkKQotewotCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGlvcDN4eF9kbWFfMF9kYXRh LmNhcF9tYXNrKTsKLQlkbWFfY2FwX3NldChETUFfSU5URVJSVVBULCBpb3AzeHhfZG1hXzBfZGF0 YS5jYXBfbWFzayk7Ci0KLQlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBpb3AzeHhfZG1hXzFfZGF0 YS5jYXBfbWFzayk7Ci0JZG1hX2NhcF9zZXQoRE1BX0lOVEVSUlVQVCwgaW9wM3h4X2RtYV8xX2Rh dGEuY2FwX21hc2spOwotCi0JZG1hX2NhcF9zZXQoRE1BX1hPUiwgaW9wM3h4X2FhdV9kYXRhLmNh cF9tYXNrKTsKLQlkbWFfY2FwX3NldChETUFfSU5URVJSVVBULCBpb3AzeHhfYWF1X2RhdGEuY2Fw X21hc2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWFyY2hfaW5pdGNhbGwoaW9wM3h4X2FkbWFfY2Fw X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvY3A2LmMgYi9hcmNoL2Fy bS9tYWNoLWlvcDMyeC9jcDYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEzNWEw YWM5OTQ5Li4wMDAwMDAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvY3A2LmMKKysr IC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog R1BMLTIuMC1vbmx5Ci0vKgotICogSU9QIENvcHJvY2Vzc29yLTYgYWNjZXNzIGhhbmRsZXIKLSAq IENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKi8KLSNpbmNsdWRlIDxs aW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL3RyYXBzLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFj ZS5oPgotCi0jaW5jbHVkZSAiaW9wM3h4LmgiCi0KLXZvaWQgaW9wX2VuYWJsZV9jcDYodm9pZCkK LXsKLQl1MzIgdGVtcDsKLQotICAgICAgICAvKiBlbmFibGUgY3A2IGFjY2VzcyAqLwotICAgICAg ICBhc20gdm9sYXRpbGUgKAotCQkibXJjCXAxNSwgMCwgJTAsIGMxNSwgYzEsIDBcblx0IgotCQki b3JyCSUwLCAlMCwgIygxIDw8IDYpXG5cdCIKLQkJIm1jcglwMTUsIDAsICUwLCBjMTUsIGMxLCAw XG5cdCIKLQkJIm1yYwlwMTUsIDAsICUwLCBjMTUsIGMxLCAwXG5cdCIKLQkJIm1vdgklMCwgJTBc blx0IgotCQkic3ViCXBjLCBwYywgIzQgIEAgY3Bfd2FpdFxuXHQiCi0JCTogIj1yIih0ZW1wKSk7 Ci19Ci0KLXN0YXRpYyBpbnQgY3A2X3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVk IGludCBpbnN0cikKLXsKLQlpb3BfZW5hYmxlX2NwNigpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8q IHBlcm1pdCBrZXJuZWwgc3BhY2UgY3A2IGFjY2VzcwotICogZGVueSB1c2VyIHNwYWNlIGNwNiBh Y2Nlc3MKLSAqLwotc3RhdGljIHN0cnVjdCB1bmRlZl9ob29rIGNwNl9ob29rID0gewotCS5pbnN0 cl9tYXNrICAgICA9IDB4MGYwMDBmZjAsCi0JLmluc3RyX3ZhbCAgICAgID0gMHgwZTAwMDYxMCwK LQkuY3Bzcl9tYXNrICAgICAgPSBNT0RFX01BU0ssCi0JLmNwc3JfdmFsICAgICAgID0gU1ZDX01P REUsCi0JLmZuICAgICAgICAgICAgID0gY3A2X3RyYXAsCi19OwotCi12b2lkIF9faW5pdCBpb3Bf aW5pdF9jcDZfaGFuZGxlcih2b2lkKQotewotCXJlZ2lzdGVyX3VuZGVmX2hvb2soJmNwNl9ob29r KTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jIGIvYXJjaC9h cm0vbWFjaC1pb3AzMngvZW03MjEwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFj MTMwYWJhNWE2ZS4uMDAwMDAwMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIx MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wLW9ubHkKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAu YwotICoKLSAqIEJvYXJkIHN1cHBvcnQgY29kZSBmb3IgdGhlIExhbm5lciBFTTcyMTAgcGxhdGZv cm1zLgotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYyBmaWxl LgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJk QHJ0cC1uZXQub3JnPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxp bnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9w Y2kuaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3Jl Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQv cGh5c21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUg PGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9n cGlvL21hY2hpbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2ly cS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAu aD4KLSNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+ Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgImhhcmR3YXJlLmgiCi0j aW5jbHVkZSAiZ3Bpby1pb3AzMnguaCIKLSNpbmNsdWRlICJpcnFzLmgiCi0KLXN0YXRpYyB2b2lk IF9faW5pdCBlbTcyMTBfdGltZXJfaW5pdCh2b2lkKQotewotCS8qIGh0dHA6Ly93d3cua3dhYWsu bmV0L2ZvdG9zL2ZvdG9zLW5hcy9zbGlkZV8yNC5odG1sICovCi0JLyogMzMuMzMzIE1IeiBjcnlz dGFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlpb3BfaW5pdF90aW1lKDIw MDAwMDAwMCk7Ci19Ci0KLS8qCi0gKiBFTTcyMTAgUlRDCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaTJj X2JvYXJkX2luZm8gX19pbml0ZGF0YSBlbTcyMTBfaTJjX2RldmljZXNbXSA9IHsKLQl7Ci0JCUky Q19CT0FSRF9JTkZPKCJyczVjMzcyYSIsIDB4MzIpLAotCX0sCi19OwotCi0vKgotICogRU03MjEw IEkvTwotICovCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGVtNzIxMF9pb19kZXNjW10gX19pbml0 ZGF0YSA9IHsKLQl7CS8qIG9uLWJvYXJkIGRldmljZXMgKi8KLQkJLnZpcnR1YWwJPSBJUTMxMjQ0 X1VBUlQsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihJUTMxMjQ0X1VBUlQpLAotCQkubGVuZ3Ro CQk9IDB4MDAxMDAwMDAsCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotfTsKLQotdm9pZCBf X2luaXQgZW03MjEwX21hcF9pbyh2b2lkKQotewotCWlvcDN4eF9tYXBfaW8oKTsKLQlpb3RhYmxl X2luaXQoZW03MjEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoZW03MjEwX2lvX2Rlc2MpKTsKLX0KLQot Ci0vKgotICogRU03MjEwIFBDSQotICovCi0jZGVmaW5lIElOVEEJSVJRX0lPUDMyWF9YSU5UMAot I2RlZmluZSBJTlRCCUlSUV9JT1AzMlhfWElOVDEKLSNkZWZpbmUgSU5UQwlJUlFfSU9QMzJYX1hJ TlQyCi0jZGVmaW5lIElOVEQJSVJRX0lPUDMyWF9YSU5UMwotCi1zdGF0aWMgaW50IF9faW5pdAot ZW03MjEwX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4 IHBpbikKLXsKLQlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbXVs0XSA9IHsKLQkJLyoKLQkJICog UENJIElEU0VML0lOVFBJTi0+SU5UTElORQotCQkgKiBBICAgICAgIEIgICAgICAgQyAgICAgICBE Ci0JCSAqLwotCQl7SU5UQiwgSU5UQiwgSU5UQiwgSU5UQn0sIC8qIGNvbnNvbGUgLyB1YXJ0ICov Ci0JCXtJTlRBLCBJTlRBLCBJTlRBLCBJTlRBfSwgLyogMXN0IDgyNTQxICAgICAgKi8KLQkJe0lO VEQsIElOVEQsIElOVEQsIElOVER9LCAvKiAybmQgODI1NDEgICAgICAqLwotCQl7SU5UQywgSU5U QywgSU5UQywgSU5UQ30sIC8qIEdEMzEyNDQgICAgICAgICovCi0JCXtJTlRELCBJTlRBLCBJTlRB LCBJTlRBfSwgLyogbWluaS1QQ0kgICAgICAgKi8KLQkJe0lOVEQsIElOVEMsIElOVEEsIElOVEF9 LCAvKiBORUMgVVNCICAgICAgICAqLwotCX07Ci0KLQlpZiAocGluIDwgMSB8fCBwaW4gPiA0KQot CQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gcGNpX2lycV90YWJsZVtzbG90ICUgNl1bcGluIC0gMV07 Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfcGNpIGVtNzIxMF9wY2kgX19pbml0ZGF0YSA9IHsKLQku bnJfY29udHJvbGxlcnMgPSAxLAotCS5vcHMJCT0gJmlvcDN4eF9vcHMsCi0JLnNldHVwCQk9IGlv cDN4eF9wY2lfc2V0dXAsCi0JLnByZWluaXQJPSBpb3AzeHhfcGNpX3ByZWluaXQsCi0JLm1hcF9p cnEJPSBlbTcyMTBfcGNpX21hcF9pcnEsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBlbTcyMTBf cGNpX2luaXQodm9pZCkKLXsKLQlpZiAobWFjaGluZV9pc19lbTcyMTAoKSkKLQkJcGNpX2NvbW1v bl9pbml0KCZlbTcyMTBfcGNpKTsKLQotCXJldHVybiAwOwotfQotCi1zdWJzeXNfaW5pdGNhbGwo ZW03MjEwX3BjaV9pbml0KTsKLQotCi0vKgotICogRU03MjEwIEZsYXNoCi0gKi8KLXN0YXRpYyBz dHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGVtNzIxMF9mbGFzaF9kYXRhID0gewotCS53aWR0aAkJ PSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlbTcyMTBfZmxhc2hfcmVzb3VyY2Ug PSB7Ci0JLnN0YXJ0CQk9IDB4ZjAwMDAwMDAsCi0JLmVuZAkJPSAweGYxZmZmZmZmLAotCS5mbGFn cwkJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl IGVtNzIxMF9mbGFzaF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAotCS5p ZAkJPSAwLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZlbTcyMTBfZmxhc2hfZGF0 YSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gMSwKLQkucmVzb3VyY2UJPSAmZW03MjEwX2ZsYXNo X3Jlc291cmNlLAotfTsKLQotCi0vKgotICogRU03MjEwIFVBUlQKLSAqIFRoZSBwaHlzaWNhbCBh ZGRyZXNzIG9mIHRoZSBzZXJpYWwgcG9ydCBpcyAweGZlODAwMDAwLAotICogc28gaXQgY2FuIGJl IHVzZWQgZm9yIHBoeXNpY2FsIGFuZCB2aXJ0dWFsIGFkZHJlc3MuCi0gKi8KLXN0YXRpYyBzdHJ1 Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgZW03MjEwX3NlcmlhbF9wb3J0W10gPSB7Ci0JewotCQku bWFwYmFzZQk9IElRMzEyNDRfVUFSVCwKLQkJLm1lbWJhc2UJPSAoY2hhciAqKUlRMzEyNDRfVUFS VCwKLQkJLmlycQkJPSBJUlFfSU9QMzJYX1hJTlQxLAotCQkuZmxhZ3MJCT0gVVBGX1NLSVBfVEVT VCwKLQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJLnJlZ3NoaWZ0CT0gMCwKLQkJLnVhcnRjbGsJ PSAxODQzMjAwLAotCX0sCi0JeyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlbTcy MTBfdWFydF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gSVEzMTI0NF9VQVJULAotCS5lbmQJCT0g SVEzMTI0NF9VQVJUICsgNywKLQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0 aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlbTcyMTBfc2VyaWFsX2RldmljZSA9IHsKLQkubmFt ZQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKLQkuZGV2 CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJCT0gZW03MjEwX3NlcmlhbF9wb3J0LAotCX0sCi0JLm51 bV9yZXNvdXJjZXMJPSAxLAotCS5yZXNvdXJjZQk9ICZlbTcyMTBfdWFydF9yZXNvdXJjZSwKLX07 Ci0KLSNkZWZpbmUgRU03MjEwX0hBUkRXQVJFX1BPV0VSIDAKLQotdm9pZCBlbTcyMTBfcG93ZXJf b2ZmKHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChF TTcyMTBfSEFSRFdBUkVfUE9XRVIsIDEpOwotCWlmIChyZXQpCi0JCXByX2NyaXQoImNvdWxkIG5v dCBkcml2ZSBwb3dlciBvZmYgR1BJTyBoaWdoXG4iKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQg ZW03MjEwX3JlcXVlc3RfZ3Bpb3Modm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKCFtYWNoaW5l X2lzX2VtNzIxMCgpKQotCQlyZXR1cm4gMDsKLQotCXJldCA9IGdwaW9fcmVxdWVzdChFTTcyMTBf SEFSRFdBUkVfUE9XRVIsICJwb3dlciIpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJjb3VsZCBu b3QgcmVxdWVzdCBwb3dlciBvZmYgR1BJT1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXBtX3Bv d2VyX29mZiA9IGVtNzIxMF9wb3dlcl9vZmY7Ci0KLQlyZXR1cm4gMDsKLX0KLWRldmljZV9pbml0 Y2FsbChlbTcyMTBfcmVxdWVzdF9ncGlvcyk7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBlbTcyMTBf aW5pdF9tYWNoaW5lKHZvaWQpCi17Ci0JcmVnaXN0ZXJfaW9wMzJ4X2dwaW8oKTsKLQlwbGF0Zm9y bV9kZXZpY2VfcmVnaXN0ZXIoJmVtNzIxMF9zZXJpYWxfZGV2aWNlKTsKLQlncGlvZF9hZGRfbG9v a3VwX3RhYmxlKCZpb3AzeHhfaTJjMF9ncGlvX2xvb2t1cCk7Ci0JZ3Bpb2RfYWRkX2xvb2t1cF90 YWJsZSgmaW9wM3h4X2kyYzFfZ3Bpb19sb29rdXApOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rl cigmaW9wM3h4X2kyYzBfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4 eF9pMmMxX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlbTcyMTBfZmxhc2hf ZGV2aWNlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9kbWFfMF9jaGFubmVs KTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9kbWFfMV9jaGFubmVsKTsKLQot CWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGVtNzIxMF9pMmNfZGV2aWNlcywKLQkJQVJSQVlf U0laRShlbTcyMTBfaTJjX2RldmljZXMpKTsKLX0KLQotTUFDSElORV9TVEFSVChFTTcyMTAsICJM YW5uZXIgRU03MjEwIikKLQkuYXRhZ19vZmZzZXQJPSAweDEwMCwKLQkubnJfaXJxcwk9IElPUDMy WF9OUl9JUlFTLAotCS5tYXBfaW8JCT0gZW03MjEwX21hcF9pbywKLQkuaW5pdF9pcnEJPSBpb3Az MnhfaW5pdF9pcnEsCi0JLmluaXRfdGltZQk9IGVtNzIxMF90aW1lcl9pbml0LAotCS5pbml0X21h Y2hpbmUJPSBlbTcyMTBfaW5pdF9tYWNoaW5lLAotCS5yZXN0YXJ0CT0gaW9wM3h4X3Jlc3RhcnQs Ci1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsu YyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IGNkNmU3ZGEyZWExMC4uMDAwMDAwMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gt aW9wMzJ4L2dsYW50YW5rLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKLS8qCi0gKiBhcmNoL2FybS9t YWNoLWlvcDMyeC9nbGFudGFuay5jCi0gKgotICogQm9hcmQgc3VwcG9ydCBjb2RlIGZvciB0aGUg R0xBTiBUYW5rLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBNYXJ0aW4gTWljaGxt YXlyIDx0Ym1AY3lyaXVzLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBMZW5uZXJ0IEJ1eXRl bmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0u aD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZjc1Mzc1cy5oPgot I2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1 ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGlu dXgvc2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgotI2luY2x1 ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNs dWRlIDxsaW51eC9ncGlvL21hY2hpbmUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVk ZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUg PGFzbS9tYWNoL3BjaS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLSNpbmNsdWRlIDxh c20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0KLSNpbmNsdWRlICJoYXJk d2FyZS5oIgotI2luY2x1ZGUgImdwaW8taW9wMzJ4LmgiCi0jaW5jbHVkZSAiaXJxcy5oIgotCi0v KgotICogR0xBTiBUYW5rIHRpbWVyIHRpY2sgY29uZmlndXJhdGlvbi4KLSAqLwotc3RhdGljIHZv aWQgX19pbml0IGdsYW50YW5rX3RpbWVyX2luaXQodm9pZCkKLXsKLQkvKiAzMy4zMzMgTUh6IGNy eXN0YWwuICAqLwotCWlvcF9pbml0X3RpbWUoMjAwMDAwMDAwKTsKLX0KLQotCi0vKgotICogR0xB TiBUYW5rIEkvTy4KLSAqLwotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBnbGFudGFua19pb19kZXNj W10gX19pbml0ZGF0YSA9IHsKLQl7CS8qIG9uLWJvYXJkIGRldmljZXMgKi8KLQkJLnZpcnR1YWwJ PSBHTEFOVEFOS19VQVJULAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oR0xBTlRBTktfVUFSVCks Ci0JCS5sZW5ndGgJCT0gMHgwMDEwMDAwMCwKLQkJLnR5cGUJCT0gTVRfREVWSUNFCi0JfSwKLX07 Ci0KLXZvaWQgX19pbml0IGdsYW50YW5rX21hcF9pbyh2b2lkKQotewotCWlvcDN4eF9tYXBfaW8o KTsKLQlpb3RhYmxlX2luaXQoZ2xhbnRhbmtfaW9fZGVzYywgQVJSQVlfU0laRShnbGFudGFua19p b19kZXNjKSk7Ci19Ci0KLQotLyoKLSAqIEdMQU4gVGFuayBQQ0kuCi0gKi8KLSNkZWZpbmUgSU5U QQlJUlFfSU9QMzJYX1hJTlQwCi0jZGVmaW5lIElOVEIJSVJRX0lPUDMyWF9YSU5UMQotI2RlZmlu ZSBJTlRDCUlSUV9JT1AzMlhfWElOVDIKLSNkZWZpbmUgSU5URAlJUlFfSU9QMzJYX1hJTlQzCi0K LXN0YXRpYyBpbnQgX19pbml0Ci1nbGFudGFua19wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNp X2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0Jc3RhdGljIGludCBwY2lfaXJxX3RhYmxl W11bNF0gPSB7Ci0JCS8qCi0JCSAqIFBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKLQkJICogQSAg ICAgICBCICAgICAgIEMgICAgICAgRAotCQkgKi8KLQkJe0lOVEQsIElOVEQsIElOVEQsIElOVER9 LCAvKiBVQVJUICg4MjUwKSAqLwotCQl7SU5UQSwgSU5UQSwgSU5UQSwgSU5UQX0sIC8qIEV0aGVy bmV0IChFMTAwMCkgKi8KLQkJe0lOVEIsIElOVEIsIElOVEIsIElOVEJ9LCAvKiBJREUgKEFFQzYy ODBSKSAqLwotCQl7SU5UQywgSU5UQywgSU5UQywgSU5UQ30sIC8qIFVTQiAoTkVDKSAqLwotCX07 Ci0KLQlCVUdfT04ocGluIDwgMSB8fCBwaW4gPiA0KTsKLQotCXJldHVybiBwY2lfaXJxX3RhYmxl W3Nsb3QgJSA0XVtwaW4gLSAxXTsKLX0KLQotc3RhdGljIHN0cnVjdCBod19wY2kgZ2xhbnRhbmtf cGNpIF9faW5pdGRhdGEgPSB7Ci0JLm5yX2NvbnRyb2xsZXJzID0gMSwKLQkub3BzCQk9ICZpb3Az eHhfb3BzLAotCS5zZXR1cAkJPSBpb3AzeHhfcGNpX3NldHVwLAotCS5wcmVpbml0CT0gaW9wM3h4 X3BjaV9wcmVpbml0LAotCS5tYXBfaXJxCT0gZ2xhbnRhbmtfcGNpX21hcF9pcnEsCi19OwotCi1z dGF0aWMgaW50IF9faW5pdCBnbGFudGFua19wY2lfaW5pdCh2b2lkKQotewotCWlmIChtYWNoaW5l X2lzX2dsYW50YW5rKCkpCi0JCXBjaV9jb21tb25faW5pdCgmZ2xhbnRhbmtfcGNpKTsKLQotCXJl dHVybiAwOwotfQotCi1zdWJzeXNfaW5pdGNhbGwoZ2xhbnRhbmtfcGNpX2luaXQpOwotCi0KLS8q Ci0gKiBHTEFOIFRhbmsgbWFjaGluZSBpbml0aWFsaXphdGlvbi4KLSAqLwotc3RhdGljIHN0cnVj dCBwaHlzbWFwX2ZsYXNoX2RhdGEgZ2xhbnRhbmtfZmxhc2hfZGF0YSA9IHsKLQkud2lkdGgJCT0g MiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ2xhbnRhbmtfZmxhc2hfcmVzb3VyY2Ug PSB7Ci0JLnN0YXJ0CQk9IDB4ZjAwMDAwMDAsCi0JLmVuZAkJPSAweGYwMDdmZmZmLAotCS5mbGFn cwkJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl IGdsYW50YW5rX2ZsYXNoX2RldmljZSA9IHsKLQkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCi0J LmlkCQk9IDAsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmdsYW50YW5rX2ZsYXNo X2RhdGEsCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IDEsCi0JLnJlc291cmNlCT0gJmdsYW50YW5r X2ZsYXNoX3Jlc291cmNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9y dCBnbGFudGFua19zZXJpYWxfcG9ydFtdID0gewotCXsKLQkJLm1hcGJhc2UJPSBHTEFOVEFOS19V QVJULAotCQkubWVtYmFzZQk9IChjaGFyICopR0xBTlRBTktfVUFSVCwKLQkJLmlycQkJPSBJUlFf SU9QMzJYX1hJTlQzLAotCQkuZmxhZ3MJCT0gVVBGX1NLSVBfVEVTVCwKLQkJLmlvdHlwZQkJPSBV UElPX01FTSwKLQkJLnJlZ3NoaWZ0CT0gMCwKLQkJLnVhcnRjbGsJPSAxODQzMjAwLAotCX0sCi0J eyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBnbGFudGFua191YXJ0X3Jlc291cmNl ID0gewotCS5zdGFydAkJPSBHTEFOVEFOS19VQVJULAotCS5lbmQJCT0gR0xBTlRBTktfVUFSVCAr IDcsCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgZ2xhbnRhbmtfc2VyaWFsX2RldmljZSA9IHsKLQkubmFtZQkJPSAic2VyaWFs ODI1MCIsCi0JLmlkCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKLQkuZGV2CQk9IHsKLQkJLnBs YXRmb3JtX2RhdGEJCT0gZ2xhbnRhbmtfc2VyaWFsX3BvcnQsCi0JfSwKLQkubnVtX3Jlc291cmNl cwk9IDEsCi0JLnJlc291cmNlCT0gJmdsYW50YW5rX3VhcnRfcmVzb3VyY2UsCi19OwotCi1zdGF0 aWMgc3RydWN0IGY3NTM3NXNfcGxhdGZvcm1fZGF0YSBnbGFudGFua19mNzUzNzVzID0gewotCS5w d20JCT0geyAyNTUsIDI1NSB9LAotCS5wd21fZW5hYmxlCT0geyAwLCAwIH0sCi19OwotCi1zdGF0 aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgZ2xhbnRhbmtfaTJjX2RldmljZXNb XSA9IHsKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJyczVjMzcyYSIsIDB4MzIpLAotCX0sCi0Jewot CQlJMkNfQk9BUkRfSU5GTygiZjc1Mzc1IiwgMHgyZSksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJmds YW50YW5rX2Y3NTM3NXMsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIGdsYW50YW5rX3Bvd2VyX29m Zih2b2lkKQotewotCV9fcmF3X3dyaXRlYigweDAxLCBJT01FTSgweGZlOGQwMDA0KSk7Ci0KLQl3 aGlsZSAoMSkKLQkJOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2xhbnRhbmtfaW5pdF9tYWNo aW5lKHZvaWQpCi17Ci0JcmVnaXN0ZXJfaW9wMzJ4X2dwaW8oKTsKLQlncGlvZF9hZGRfbG9va3Vw X3RhYmxlKCZpb3AzeHhfaTJjMF9ncGlvX2xvb2t1cCk7Ci0JZ3Bpb2RfYWRkX2xvb2t1cF90YWJs ZSgmaW9wM3h4X2kyYzFfZ3Bpb19sb29rdXApOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigm aW9wM3h4X2kyYzBfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9p MmMxX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZnbGFudGFua19mbGFzaF9k ZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZ2xhbnRhbmtfc2VyaWFsX2Rldmlj ZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpb3AzeHhfZG1hXzBfY2hhbm5lbCk7Ci0J cGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpb3AzeHhfZG1hXzFfY2hhbm5lbCk7Ci0KLQlpMmNf cmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBnbGFudGFua19pMmNfZGV2aWNlcywKLQkJQVJSQVlfU0la RShnbGFudGFua19pMmNfZGV2aWNlcykpOwotCi0JcG1fcG93ZXJfb2ZmID0gZ2xhbnRhbmtfcG93 ZXJfb2ZmOwotfQotCi1NQUNISU5FX1NUQVJUKEdMQU5UQU5LLCAiR0xBTiBUYW5rIikKLQkvKiBN YWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8K LQkuYXRhZ19vZmZzZXQJPSAweDEwMCwKLQkubnJfaXJxcwk9IElPUDMyWF9OUl9JUlFTLAotCS5t YXBfaW8JCT0gZ2xhbnRhbmtfbWFwX2lvLAotCS5pbml0X2lycQk9IGlvcDMyeF9pbml0X2lycSwK LQkuaW5pdF90aW1lCT0gZ2xhbnRhbmtfdGltZXJfaW5pdCwKLQkuaW5pdF9tYWNoaW5lCT0gZ2xh bnRhbmtfaW5pdF9tYWNoaW5lLAotCS5yZXN0YXJ0CT0gaW9wM3h4X3Jlc3RhcnQsCi1NQUNISU5F X0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuaCBiL2FyY2gv YXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IGYzOGU4NmI4MmMzZC4uMDAwMDAwMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2ds YW50YW5rLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKiBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMCAqLwotLyoKLSAqIElPLURhdGEgR0xBTiBUYW5rIGJvYXJkIHJl Z2lzdGVycwotICovCi0KLSNpZm5kZWYgX19HTEFOVEFOS19ICi0jZGVmaW5lIF9fR0xBTlRBTktf SAotCi0jZGVmaW5lIEdMQU5UQU5LX1VBUlQJCTB4ZmU4MDAwMDAJLyogVUFSVCAqLwotCi0KLSNl bmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ3Bpby1pb3AzMnguaCBiL2Fy Y2gvYXJtL21hY2gtaW9wMzJ4L2dwaW8taW9wMzJ4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDIwYWY4N2U0YzVlOC4uMDAwMDAwMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW9w MzJ4L2dwaW8taW9wMzJ4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBp b3AzMnhfZ3Bpb19yZXNbXSA9IHsKLQlERUZJTkVfUkVTX01FTSgoSU9QM1hYX1BFUklQSEVSQUxf UEhZU19CQVNFICsgMHgwN2M0KSwgMHgxMCksCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVn aXN0ZXJfaW9wMzJ4X2dwaW8odm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2lt cGxlKCJncGlvLWlvcCIsIDAsCi0JCQkJCWlvcDMyeF9ncGlvX3JlcywKLQkJCQkJQVJSQVlfU0la RShpb3AzMnhfZ3Bpb19yZXMpKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4 L2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9oYXJkd2FyZS5oCmRlbGV0ZWQgZmls ZSBtb2RlIDEwMDY0NAppbmRleCA0M2FiNGZiOGY5YjAuLjAwMDAwMDAwMDAwMAotLS0gYS9hcmNo L2FybS9tYWNoLWlvcDMyeC9oYXJkd2FyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBA QAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KLSNpZm5kZWYgX19IQVJE V0FSRV9ICi0jZGVmaW5lIF9fSEFSRFdBUkVfSAotCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0K LS8qCi0gKiBOb3RlIGFib3V0IFBDSSBJTyBzcGFjZSBtYXBwaW5ncwotICoKLSAqIFRvIG1ha2Ug SU8gc3BhY2UgYWNjZXNzZXMgZWZmaWNpZW50LCB3ZSBzdG9yZSB2aXJ0dWFsIGFkZHJlc3NlcyBp bgotICogdGhlIElPIHJlc291cmNlcy4KLSAqCi0gKiBUaGUgUENJIElPIHNwYWNlIGlzIGxvY2F0 ZWQgYXQgdmlydHVhbCAweGZlMDAwMDAwIGZyb20gcGh5c2ljYWwKLSAqIDB4OTAwMDAwMDAuIFRo ZSBQQ0kgQkFScyBtdXN0IGJlIHByb2dyYW1tZWQgd2l0aCBwaHlzaWNhbCBhZGRyZXNzZXMsCi0g KiBidXQgd2hlbiB3ZSByZWFkIHRoZW0sIHdlIGNvbnZlcnQgdGhlbSB0byB2aXJ0dWFsIGFkZHJl c3Nlcy4gU2VlCi0gKiBhcmNoL2FybS9wbGF0LWlvcC9wY2kuYy4KLSAqLwotCi0jaWZuZGVmIF9f QVNTRU1CTFlfXwotdm9pZCBpb3AzMnhfaW5pdF9pcnEodm9pZCk7Ci0jZW5kaWYKLQotCi0vKgot ICogR2VuZXJpYyBjaGlwc2V0IGJpdHMKLSAqLwotI2luY2x1ZGUgImlvcDN4eC5oIgotCi0vKgot ICogQm9hcmQgc3BlY2lmaWMgYml0cwotICovCi0jaW5jbHVkZSAiZ2xhbnRhbmsuaCIKLSNpbmNs dWRlICJpcTgwMzIxLmgiCi0jaW5jbHVkZSAiaXEzMTI0NC5oIgotI2luY2x1ZGUgIm4yMTAwLmgi Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pMmMuYyBiL2Fy Y2gvYXJtL21hY2gtaW9wMzJ4L2kyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBl NDIyMjg2YWY0NjkuLjAwMDAwMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pMmMu YworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wLW9ubHkKLS8qCi0gKiBhcmNoL2FybS9wbGF0LWlvcC9pMmMuYwotICoKLSAq IEF1dGhvcjogTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgotICogQ29weXJpZ2h0IChDKSAy MDAxIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwNCBJbnRl bCBDb3Jwb3JhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxs aW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9m cy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4 L3NlcmlhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3Nlcmlh bF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvL21h Y2hpbmUuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5o PgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KLSNpbmNs dWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS5oIgotI2luY2x1ZGUg ImlvcDN4eC5oIgotI2luY2x1ZGUgImlycXMuaCIKLQotLyoKLSAqIEVhY2ggb2YgdGhlIEkyQyBi dXNzZXMgaGF2ZSBjb3JyZXNwb25kaW5nIEdQSU8gbGluZXMsIGFuZCB0aGUgZHJpdmVyCi0gKiBu ZWVkIHRvIGFjY2VzcyB0aGVzZSBkaXJlY3RseSB0byBkcml2ZSB0aGUgYnVzIGxvdyBhdCB0aW1l cy4KLSAqLwotCi1zdHJ1Y3QgZ3Bpb2RfbG9va3VwX3RhYmxlIGlvcDN4eF9pMmMwX2dwaW9fbG9v a3VwID0gewotCS5kZXZfaWQgPSAiSU9QM3h4LUkyQy4wIiwKLQkudGFibGUgPSB7Ci0JCUdQSU9f TE9PS1VQKCJncGlvLWlvcCIsIDcsICJzY2wiLCBHUElPX0FDVElWRV9ISUdIKSwKLQkJR1BJT19M T09LVVAoImdwaW8taW9wIiwgNiwgInNkYSIsIEdQSU9fQUNUSVZFX0hJR0gpLAotCQl7IH0KLQl9 LAotfTsKLQotc3RydWN0IGdwaW9kX2xvb2t1cF90YWJsZSBpb3AzeHhfaTJjMV9ncGlvX2xvb2t1 cCA9IHsKLQkuZGV2X2lkID0gIklPUDN4eC1JMkMuMSIsCi0JLnRhYmxlID0gewotCQlHUElPX0xP T0tVUCgiZ3Bpby1pb3AiLCA1LCAic2NsIiwgR1BJT19BQ1RJVkVfSElHSCksCi0JCUdQSU9fTE9P S1VQKCJncGlvLWlvcCIsIDQsICJzZGEiLCBHUElPX0FDVElWRV9ISUdIKSwKLQkJeyB9Ci0JfSwK LX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9wM3h4X2kyYzBfcmVzb3VyY2VzW10gPSB7 Ci0JWzBdID0gewotCQkuc3RhcnQJPSAweGZmZmZmNjgwLAotCQkuZW5kCT0gMHhmZmZmZjY5NywK LQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElS UV9JT1AzMlhfSTJDXzAsCi0JCS5lbmQJPSBJUlFfSU9QMzJYX0kyQ18wLAotCQkuZmxhZ3MJPSBJ T1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBpb3AzeHhf aTJjMF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gIklPUDN4eC1JMkMiLAotCS5pZAkJPSAwLAotCS5u dW1fcmVzb3VyY2VzCT0gMiwKLQkucmVzb3VyY2UJPSBpb3AzeHhfaTJjMF9yZXNvdXJjZXMsCi19 OwotCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9wM3h4X2kyYzFfcmVzb3VyY2VzW10gPSB7 Ci0JWzBdID0gewotCQkuc3RhcnQJPSAweGZmZmZmNmEwLAotCQkuZW5kCT0gMHhmZmZmZjZiNywK LQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElS UV9JT1AzMlhfSTJDXzEsCi0JCS5lbmQJPSBJUlFfSU9QMzJYX0kyQ18xLAotCQkuZmxhZ3MJPSBJ T1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlvcDN4eF9p MmMxX2RldmljZSA9IHsKLQkubmFtZQkJPSAiSU9QM3h4LUkyQyIsCi0JLmlkCQk9IDEsCi0JLm51 bV9yZXNvdXJjZXMJPSAyLAotCS5yZXNvdXJjZQk9IGlvcDN4eF9pMmMxX3Jlc291cmNlcywKLX07 CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pb3AzeHguaCBiL2FyY2gvYXJtL21h Y2gtaW9wMzJ4L2lvcDN4eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmVjN2Vi YWRiMzUuLjAwMDAwMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pb3AzeHguaAor KysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmll cjogR1BMLTIuMC1vbmx5ICovCi0vKgotICogSW50ZWwgSU9QMzJYIGFuZCBJT1AzM1ggcmVnaXN0 ZXIgZGVmaW5pdGlvbnMKLSAqCi0gKiBBdXRob3I6IFJvcnkgQm9sdCA8cm9yeWJvbHRAcGFjYmVs bC5uZXQ+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9yeSBCb2x0Ci0gKiBDb3B5cmlnaHQgKEMp IDIwMDQgSW50ZWwgQ29ycC4KLSAqLwotCi0jaWZuZGVmIF9fSU9QM1hYX0gKLSNkZWZpbmUgX19J T1AzWFhfSAotCi0vKgotICogUGVyaXBoZXJhbHMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gdGhl IGlvcDMyeCBhbmQgaW9wMzN4IGJ1dAotICogbG9jYXRlZCBhdCBkaWZmZXJlbnQgYWRkcmVzc2Vz LgotICovCi0jZGVmaW5lIElPUDNYWF9USU1FUl9SRUcocmVnKQkoSU9QM1hYX1BFUklQSEVSQUxf VklSVF9CQVNFICsgMHgwN2UwICsgKHJlZykpCi0KLSNpbmNsdWRlICJpb3AzeHguaCIKLQotLyog QVRVIFBhcmFtZXRlcnMKLSAqIHNldCB1cCBhIDE6MSBidXMgdG8gcGh5c2ljYWwgcmFtIHJlbGF0 aW9uc2hpcAotICogdy8gcGh5c2ljYWwgcmFtIG9uIHRvcCBvZiBwY2kgaW4gdGhlIG1lbW9yeSBt YXAKLSAqLwotI2RlZmluZSBJT1AzMlhfTUFYX1JBTV9TSVpFICAgICAgICAgICAgMHg0MDAwMDAw MFVMCi0jZGVmaW5lIElPUDNYWF9NQVhfUkFNX1NJWkUgICAgICAgICAgICBJT1AzMlhfTUFYX1JB TV9TSVpFCi0jZGVmaW5lIElPUDNYWF9QQ0lfTE9XRVJfTUVNX0JBICAgICAgICAweDgwMDAwMDAw Ci0KLS8qCi0gKiBJT1AzWFggR1BJTyBoYW5kbGluZwotICovCi0jZGVmaW5lIElPUDNYWF9HUElP X0xJTkUoeCkJKHgpCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi1leHRlcm4gaW50IGluaXRfYXR1 OwotZXh0ZXJuIGludCBpb3AzeHhfZ2V0X2luaXRfYXR1KHZvaWQpOwotI2VuZGlmCi0KLQotLyoK LSAqIElPUDNYWCBwcm9jZXNzb3IgcmVnaXN0ZXJzCi0gKi8KLSNkZWZpbmUgSU9QM1hYX1BFUklQ SEVSQUxfUEhZU19CQVNFCTB4ZmZmZmUwMDAKLSNkZWZpbmUgSU9QM1hYX1BFUklQSEVSQUxfVklS VF9CQVNFCTB4ZmVkZmUwMDAKLSNkZWZpbmUgSU9QM1hYX1BFUklQSEVSQUxfU0laRQkJMHgwMDAw MjAwMAotI2RlZmluZSBJT1AzWFhfUEVSSVBIRVJBTF9VUFBFUl9QQSAoSU9QM1hYX1BFUklQSEVS QUxfUEhZU19CQVNFICtcCi0JCQkJCUlPUDNYWF9QRVJJUEhFUkFMX1NJWkUgLSAxKQotI2RlZmlu ZSBJT1AzWFhfUEVSSVBIRVJBTF9VUFBFUl9WQSAoSU9QM1hYX1BFUklQSEVSQUxfVklSVF9CQVNF ICtcCi0JCQkJCUlPUDNYWF9QRVJJUEhFUkFMX1NJWkUgLSAxKQotI2RlZmluZSBJT1AzWFhfUE1N Ul9QSFlTX1RPX1ZJUlQoYWRkcikgKHUzMikgKCh1MzIpIChhZGRyKSAtXAotCQkJCQkoSU9QM1hY X1BFUklQSEVSQUxfUEhZU19CQVNFXAotCQkJCQktIElPUDNYWF9QRVJJUEhFUkFMX1ZJUlRfQkFT RSkpCi0jZGVmaW5lIElPUDNYWF9SRUdfQUREUihyZWcpCQkoSU9QM1hYX1BFUklQSEVSQUxfVklS VF9CQVNFICsgKHJlZykpCi0KLS8qIEFkZHJlc3MgVHJhbnNsYXRpb24gVW5pdCAgKi8KLSNkZWZp bmUgSU9QM1hYX0FUVVZJRAkJKHZvbGF0aWxlIHUxNiAqKUlPUDNYWF9SRUdfQUREUigweDAxMDAp Ci0jZGVmaW5lIElPUDNYWF9BVFVESUQJCSh2b2xhdGlsZSB1MTYgKilJT1AzWFhfUkVHX0FERFIo MHgwMTAyKQotI2RlZmluZSBJT1AzWFhfQVRVQ01ECQkodm9sYXRpbGUgdTE2ICopSU9QM1hYX1JF R19BRERSKDB4MDEwNCkKLSNkZWZpbmUgSU9QM1hYX0FUVVNSCQkodm9sYXRpbGUgdTE2ICopSU9Q M1hYX1JFR19BRERSKDB4MDEwNikKLSNkZWZpbmUgSU9QM1hYX0FUVVJJRAkJKHZvbGF0aWxlIHU4 ICAqKUlPUDNYWF9SRUdfQUREUigweDAxMDgpCi0jZGVmaW5lIElPUDNYWF9BVFVDQ1IJCSh2b2xh dGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMTA5KQotI2RlZmluZSBJT1AzWFhfQVRVQ0xT UgkJKHZvbGF0aWxlIHU4ICAqKUlPUDNYWF9SRUdfQUREUigweDAxMGMpCi0jZGVmaW5lIElPUDNY WF9BVFVMVAkJKHZvbGF0aWxlIHU4ICAqKUlPUDNYWF9SRUdfQUREUigweDAxMGQpCi0jZGVmaW5l IElPUDNYWF9BVFVIVFIJCSh2b2xhdGlsZSB1OCAgKilJT1AzWFhfUkVHX0FERFIoMHgwMTBlKQot I2RlZmluZSBJT1AzWFhfQVRVQklTVAkJKHZvbGF0aWxlIHU4ICAqKUlPUDNYWF9SRUdfQUREUigw eDAxMGYpCi0jZGVmaW5lIElPUDNYWF9JQUJBUjAJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVH X0FERFIoMHgwMTEwKQotI2RlZmluZSBJT1AzWFhfSUFVQkFSMAkJKHZvbGF0aWxlIHUzMiAqKUlP UDNYWF9SRUdfQUREUigweDAxMTQpCi0jZGVmaW5lIElPUDNYWF9JQUJBUjEJCSh2b2xhdGlsZSB1 MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMTE4KQotI2RlZmluZSBJT1AzWFhfSUFVQkFSMQkJKHZv bGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDAxMWMpCi0jZGVmaW5lIElPUDNYWF9JQUJB UjIJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMTIwKQotI2RlZmluZSBJT1Az WFhfSUFVQkFSMgkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDAxMjQpCi0jZGVm aW5lIElPUDNYWF9BU1ZJUgkJKHZvbGF0aWxlIHUxNiAqKUlPUDNYWF9SRUdfQUREUigweDAxMmMp Ci0jZGVmaW5lIElPUDNYWF9BU0lSCQkodm9sYXRpbGUgdTE2ICopSU9QM1hYX1JFR19BRERSKDB4 MDEyZSkKLSNkZWZpbmUgSU9QM1hYX0VSQkFSCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19B RERSKDB4MDEzMCkKLSNkZWZpbmUgSU9QM1hYX0FUVUlMUgkJKHZvbGF0aWxlIHU4ICAqKUlPUDNY WF9SRUdfQUREUigweDAxM2MpCi0jZGVmaW5lIElPUDNYWF9BVFVJUFIJCSh2b2xhdGlsZSB1OCAg KilJT1AzWFhfUkVHX0FERFIoMHgwMTNkKQotI2RlZmluZSBJT1AzWFhfQVRVTUdOVAkJKHZvbGF0 aWxlIHU4ICAqKUlPUDNYWF9SRUdfQUREUigweDAxM2UpCi0jZGVmaW5lIElPUDNYWF9BVFVNTEFU CQkodm9sYXRpbGUgdTggICopSU9QM1hYX1JFR19BRERSKDB4MDEzZikKLSNkZWZpbmUgSU9QM1hY X0lBTFIwCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDE0MCkKLSNkZWZpbmUg SU9QM1hYX0lBVFZSMAkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDAxNDQpCi0j ZGVmaW5lIElPUDNYWF9FUkxSCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDE0 OCkKLSNkZWZpbmUgSU9QM1hYX0VSVFZSCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERS KDB4MDE0YykKLSNkZWZpbmUgSU9QM1hYX0lBTFIxCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JF R19BRERSKDB4MDE1MCkKLSNkZWZpbmUgSU9QM1hYX0lBTFIyCQkodm9sYXRpbGUgdTMyICopSU9Q M1hYX1JFR19BRERSKDB4MDE1NCkKLSNkZWZpbmUgSU9QM1hYX0lBVFZSMgkJKHZvbGF0aWxlIHUz MiAqKUlPUDNYWF9SRUdfQUREUigweDAxNTgpCi0jZGVmaW5lIElPUDNYWF9PSU9XVFZSCQkodm9s YXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDE1YykKLSNkZWZpbmUgSU9QM1hYX09NV1RW UjAJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMTYwKQotI2RlZmluZSBJT1Az WFhfT1VNV1RWUjAJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMTY0KQotI2Rl ZmluZSBJT1AzWFhfT01XVFZSMQkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDAx NjgpCi0jZGVmaW5lIElPUDNYWF9PVU1XVFZSMQkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdf QUREUigweDAxNmMpCi0jZGVmaW5lIElPUDNYWF9PVURXVFZSCQkodm9sYXRpbGUgdTMyICopSU9Q M1hYX1JFR19BRERSKDB4MDE3OCkKLSNkZWZpbmUgSU9QM1hYX0FUVUNSCQkodm9sYXRpbGUgdTMy ICopSU9QM1hYX1JFR19BRERSKDB4MDE4MCkKLSNkZWZpbmUgSU9QM1hYX1BDU1IJCSh2b2xhdGls ZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMTg0KQotI2RlZmluZSBJT1AzWFhfQVRVSVNSCQko dm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDE4OCkKLSNkZWZpbmUgSU9QM1hYX0FU VUlNUgkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDAxOGMpCi0jZGVmaW5lIElP UDNYWF9JQUJBUjMJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMTkwKQotI2Rl ZmluZSBJT1AzWFhfSUFVQkFSMwkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDAx OTQpCi0jZGVmaW5lIElPUDNYWF9JQUxSMwkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQURE UigweDAxOTgpCi0jZGVmaW5lIElPUDNYWF9JQVRWUjMJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhf UkVHX0FERFIoMHgwMTljKQotI2RlZmluZSBJT1AzWFhfT0NDQVIJCSh2b2xhdGlsZSB1MzIgKilJ T1AzWFhfUkVHX0FERFIoMHgwMWE0KQotI2RlZmluZSBJT1AzWFhfT0NDRFIJCSh2b2xhdGlsZSB1 MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMWFjKQotI2RlZmluZSBJT1AzWFhfUERTQ1IJCSh2b2xh dGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMWJjKQotI2RlZmluZSBJT1AzWFhfUE1DQVBJ RAkJKHZvbGF0aWxlIHU4ICAqKUlPUDNYWF9SRUdfQUREUigweDAxYzApCi0jZGVmaW5lIElPUDNY WF9QTU5FWFQJCSh2b2xhdGlsZSB1OCAgKilJT1AzWFhfUkVHX0FERFIoMHgwMWMxKQotI2RlZmlu ZSBJT1AzWFhfQVBNQ1IJCSh2b2xhdGlsZSB1MTYgKilJT1AzWFhfUkVHX0FERFIoMHgwMWMyKQot I2RlZmluZSBJT1AzWFhfQVBNQ1NSCQkodm9sYXRpbGUgdTE2ICopSU9QM1hYX1JFR19BRERSKDB4 MDFjNCkKLSNkZWZpbmUgSU9QM1hYX1BDSVhDQVBJRAkodm9sYXRpbGUgdTggICopSU9QM1hYX1JF R19BRERSKDB4MDFlMCkKLSNkZWZpbmUgSU9QM1hYX1BDSVhORVhUCQkodm9sYXRpbGUgdTggICop SU9QM1hYX1JFR19BRERSKDB4MDFlMSkKLSNkZWZpbmUgSU9QM1hYX1BDSVhDTUQJCSh2b2xhdGls ZSB1MTYgKilJT1AzWFhfUkVHX0FERFIoMHgwMWUyKQotI2RlZmluZSBJT1AzWFhfUENJWFNSCQko dm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDFlNCkKLSNkZWZpbmUgSU9QM1hYX1BD SUlSU1IJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMWVjKQotI2RlZmluZSBJ T1AzWFhfUENTUl9PVVRfUV9CVVNZICgxIDw8IDE1KQotI2RlZmluZSBJT1AzWFhfUENTUl9JTl9R X0JVU1kJKDEgPDwgMTQpCi0jZGVmaW5lIElPUDNYWF9BVFVDUl9PVVRfRU4JKDEgPDwgMSkKLQot I2RlZmluZSBJT1AzWFhfSU5JVF9BVFVfREVGQVVMVCAwCi0jZGVmaW5lIElPUDNYWF9JTklUX0FU VV9ESVNBQkxFIC0xCi0jZGVmaW5lIElPUDNYWF9JTklUX0FUVV9FTkFCTEUJIDEKLQotLyogTWVz c2FnaW5nIFVuaXQgICovCi0jZGVmaW5lIElPUDNYWF9JTVIwCQkodm9sYXRpbGUgdTMyICopSU9Q M1hYX1JFR19BRERSKDB4MDMxMCkKLSNkZWZpbmUgSU9QM1hYX0lNUjEJCSh2b2xhdGlsZSB1MzIg KilJT1AzWFhfUkVHX0FERFIoMHgwMzE0KQotI2RlZmluZSBJT1AzWFhfT01SMAkJKHZvbGF0aWxl IHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDAzMTgpCi0jZGVmaW5lIElPUDNYWF9PTVIxCQkodm9s YXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDMxYykKLSNkZWZpbmUgSU9QM1hYX0lEUgkJ KHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDAzMjApCi0jZGVmaW5lIElPUDNYWF9J SVNSCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDMyNCkKLSNkZWZpbmUgSU9Q M1hYX0lJTVIJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMzI4KQotI2RlZmlu ZSBJT1AzWFhfT0RSCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDMyYykKLSNk ZWZpbmUgSU9QM1hYX09JU1IJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMzMw KQotI2RlZmluZSBJT1AzWFhfT0lNUgkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigw eDAzMzQpCi0jZGVmaW5lIElPUDNYWF9NVUNSCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19B RERSKDB4MDM1MCkKLSNkZWZpbmUgSU9QM1hYX1FCQVIJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhf UkVHX0FERFIoMHgwMzU0KQotI2RlZmluZSBJT1AzWFhfSUZIUFIJCSh2b2xhdGlsZSB1MzIgKilJ T1AzWFhfUkVHX0FERFIoMHgwMzYwKQotI2RlZmluZSBJT1AzWFhfSUZUUFIJCSh2b2xhdGlsZSB1 MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMzY0KQotI2RlZmluZSBJT1AzWFhfSVBIUFIJCSh2b2xh dGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMzY4KQotI2RlZmluZSBJT1AzWFhfSVBUUFIJ CSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMzZjKQotI2RlZmluZSBJT1AzWFhf T0ZIUFIJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMzcwKQotI2RlZmluZSBJ T1AzWFhfT0ZUUFIJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMzc0KQotI2Rl ZmluZSBJT1AzWFhfT1BIUFIJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwMzc4 KQotI2RlZmluZSBJT1AzWFhfT1BUUFIJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIo MHgwMzdjKQotI2RlZmluZSBJT1AzWFhfSUFSCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19B RERSKDB4MDM4MCkKLQotLyogRE1BIENvbnRyb2xsZXIgICovCi0jZGVmaW5lIElPUDNYWF9ETUFf UEhZU19CQVNFKGNoYW4pIChJT1AzWFhfUEVSSVBIRVJBTF9QSFlTX0JBU0UgKyBcCi0JCQkJCSgw eDQwMCArIChjaGFuIDw8IDYpKSkKLSNkZWZpbmUgSU9QM1hYX0RNQV9VUFBFUl9QQShjaGFuKSAg KElPUDNYWF9ETUFfUEhZU19CQVNFKGNoYW4pICsgMHgyNykKLQotLyogUGVyaXBoZXJhbCBidXMg aW50ZXJmYWNlICAqLwotI2RlZmluZSBJT1AzWFhfUEJDUgkJKHZvbGF0aWxlIHUzMiAqKUlPUDNY WF9SRUdfQUREUigweDA2ODApCi0jZGVmaW5lIElPUDNYWF9QQklTUgkJKHZvbGF0aWxlIHUzMiAq KUlPUDNYWF9SRUdfQUREUigweDA2ODQpCi0jZGVmaW5lIElPUDNYWF9QQkJBUjAJCSh2b2xhdGls ZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwNjg4KQotI2RlZmluZSBJT1AzWFhfUEJMUjAJCSh2 b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgwNjhjKQotI2RlZmluZSBJT1AzWFhfUEJC QVIxCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDY5MCkKLSNkZWZpbmUgSU9Q M1hYX1BCTFIxCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDY5NCkKLSNkZWZp bmUgSU9QM1hYX1BCQkFSMgkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDA2OTgp Ci0jZGVmaW5lIElPUDNYWF9QQkxSMgkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigw eDA2OWMpCi0jZGVmaW5lIElPUDNYWF9QQkJBUjMJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVH X0FERFIoMHgwNmEwKQotI2RlZmluZSBJT1AzWFhfUEJMUjMJCSh2b2xhdGlsZSB1MzIgKilJT1Az WFhfUkVHX0FERFIoMHgwNmE0KQotI2RlZmluZSBJT1AzWFhfUEJCQVI0CQkodm9sYXRpbGUgdTMy ICopSU9QM1hYX1JFR19BRERSKDB4MDZhOCkKLSNkZWZpbmUgSU9QM1hYX1BCTFI0CQkodm9sYXRp bGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MDZhYykKLSNkZWZpbmUgSU9QM1hYX1BCQkFSNQkJ KHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDA2YjApCi0jZGVmaW5lIElPUDNYWF9Q QkxSNQkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDA2YjQpCi0jZGVmaW5lIElP UDNYWF9QTUJSMAkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDA2YzApCi0jZGVm aW5lIElPUDNYWF9QTUJSMQkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDA2ZTAp Ci0jZGVmaW5lIElPUDNYWF9QTUJSMgkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigw eDA2ZTQpCi0KLS8qIFBlcmlwaGVyYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyB1bml0ICAqLwot I2RlZmluZSBJT1AzWFhfR1RNUgkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDA3 MDApCi0jZGVmaW5lIElPUDNYWF9FU1IJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIo MHgwNzA0KQotI2RlZmluZSBJT1AzWFhfRU1JU1IJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVH X0FERFIoMHgwNzA4KQotI2RlZmluZSBJT1AzWFhfR1RTUgkJKHZvbGF0aWxlIHUzMiAqKUlPUDNY WF9SRUdfQUREUigweDA3MTApCi0vKiBQRVJDUjAgRE9FU04nVCBFWElTVCAtIGluZGV4IGZyb20g MSEgKi8KLSNkZWZpbmUgSU9QM1hYX1BFUkNSMAkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdf QUREUigweDA3MTApCi0KLS8qIFRpbWVycyAgKi8KLSNkZWZpbmUgSU9QM1hYX1RVX1RNUjAJCSh2 b2xhdGlsZSB1MzIgKilJT1AzWFhfVElNRVJfUkVHKDB4MDAwMCkKLSNkZWZpbmUgSU9QM1hYX1RV X1RNUjEJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfVElNRVJfUkVHKDB4MDAwNCkKLSNkZWZpbmUg SU9QM1hYX1RVX1RDUjAJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfVElNRVJfUkVHKDB4MDAwOCkK LSNkZWZpbmUgSU9QM1hYX1RVX1RDUjEJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfVElNRVJfUkVH KDB4MDAwYykKLSNkZWZpbmUgSU9QM1hYX1RVX1RSUjAJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhf VElNRVJfUkVHKDB4MDAxMCkKLSNkZWZpbmUgSU9QM1hYX1RVX1RSUjEJCSh2b2xhdGlsZSB1MzIg KilJT1AzWFhfVElNRVJfUkVHKDB4MDAxNCkKLSNkZWZpbmUgSU9QM1hYX1RVX1RJU1IJCSh2b2xh dGlsZSB1MzIgKilJT1AzWFhfVElNRVJfUkVHKDB4MDAxOCkKLSNkZWZpbmUgSU9QM1hYX1RVX1dE VENSCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1RJTUVSX1JFRygweDAwMWMpCi0jZGVmaW5lIElP UF9UTVJfRU4JICAgIDB4MDIKLSNkZWZpbmUgSU9QX1RNUl9SRUxPQUQJICAgIDB4MDQKLSNkZWZp bmUgSU9QX1RNUl9QUklWSUxFR0VEIDB4MDgKLSNkZWZpbmUgSU9QX1RNUl9SQVRJT18xXzEgIDB4 MDAKLQotLyogV2F0Y2hkb2cgdGltZXIgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgSU9QX1dEVENS X0VOX0FSTSAgICAgICAgMHgxZTFlMWUxZQotI2RlZmluZSBJT1BfV0RUQ1JfRU4gICAgICAgICAg ICAweGUxZTFlMWUxCi0vKiBpb3AzeHggZG9lcyBub3Qgc3VwcG9ydCBzdG9wcGluZyB0aGUgd2F0 Y2hkb2csIHNvIHdlIGp1c3QgcmUtYXJtICovCi0jZGVmaW5lIElPUF9XRFRDUl9ESVNfQVJNCShJ T1BfV0RUQ1JfRU5fQVJNKQotI2RlZmluZSBJT1BfV0RUQ1JfRElTCQkoSU9QX1dEVENSX0VOKQot Ci0vKiBBcHBsaWNhdGlvbiBhY2NlbGVyYXRvciB1bml0ICAqLwotI2RlZmluZSBJT1AzWFhfQUFV X1BIWVNfQkFTRSAoSU9QM1hYX1BFUklQSEVSQUxfUEhZU19CQVNFICsgMHg4MDApCi0jZGVmaW5l IElPUDNYWF9BQVVfVVBQRVJfUEEgKElPUDNYWF9BQVVfUEhZU19CQVNFICsgMHhhNykKLQotLyog STJDIGJ1cyBpbnRlcmZhY2UgdW5pdCAgKi8KLSNkZWZpbmUgSU9QM1hYX0lDUjAJCSh2b2xhdGls ZSB1MzIgKilJT1AzWFhfUkVHX0FERFIoMHgxNjgwKQotI2RlZmluZSBJT1AzWFhfSVNSMAkJKHZv bGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDE2ODQpCi0jZGVmaW5lIElPUDNYWF9JU0FS MAkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDE2ODgpCi0jZGVmaW5lIElPUDNY WF9JREJSMAkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDE2OGMpCi0jZGVmaW5l IElPUDNYWF9JQk1SMAkJKHZvbGF0aWxlIHUzMiAqKUlPUDNYWF9SRUdfQUREUigweDE2OTQpCi0j ZGVmaW5lIElPUDNYWF9JQ1IxCQkodm9sYXRpbGUgdTMyICopSU9QM1hYX1JFR19BRERSKDB4MTZh MCkKLSNkZWZpbmUgSU9QM1hYX0lTUjEJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVHX0FERFIo MHgxNmE0KQotI2RlZmluZSBJT1AzWFhfSVNBUjEJCSh2b2xhdGlsZSB1MzIgKilJT1AzWFhfUkVH X0FERFIoMHgxNmE4KQotI2RlZmluZSBJT1AzWFhfSURCUjEJCSh2b2xhdGlsZSB1MzIgKilJT1Az WFhfUkVHX0FERFIoMHgxNmFjKQotI2RlZmluZSBJT1AzWFhfSUJNUjEJCSh2b2xhdGlsZSB1MzIg KilJT1AzWFhfUkVHX0FERFIoMHgxNmI0KQotCi0KLS8qCi0gKiBJT1AzWFggSS9PIGFuZCBNZW0g c3BhY2UgcmVnaW9ucyBmb3IgUENJIGF1dG9jb25maWd1cmF0aW9uCi0gKi8KLSNkZWZpbmUgSU9Q M1hYX1BDSV9MT1dFUl9NRU1fUEEJMHg4MDAwMDAwMAotI2RlZmluZSBJT1AzWFhfUENJX01FTV9X SU5ET1dfU0laRQkweDA4MDAwMDAwCi0KLSNkZWZpbmUgSU9QM1hYX1BDSV9MT1dFUl9JT19QQQkJ MHg5MDAwMDAwMAotI2RlZmluZSBJT1AzWFhfUENJX0xPV0VSX0lPX0JBCQkweDAwMDAwMDAwCi0K LSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1 ZGUgPGxpbnV4L3JlYm9vdC5oPgotCi12b2lkIGlvcDN4eF9tYXBfaW8odm9pZCk7Ci12b2lkIGlv cF9lbmFibGVfY3A2KHZvaWQpOwotdm9pZCBpb3BfaW5pdF9jcDZfaGFuZGxlcih2b2lkKTsKLXZv aWQgaW9wX2luaXRfdGltZSh1bnNpZ25lZCBsb25nIHRpY2tyYXRlKTsKLXZvaWQgaW9wM3h4X3Jl c3RhcnQoZW51bSByZWJvb3RfbW9kZSwgY29uc3QgY2hhciAqKTsKLQotc3RhdGljIGlubGluZSB1 MzIgcmVhZF90bXIwKHZvaWQpCi17Ci0JdTMyIHZhbDsKLQlhc20gdm9sYXRpbGUoIm1yYyBwNiwg MCwgJTAsIGMwLCBjMSwgMCIgOiAiPXIiICh2YWwpKTsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0 aWMgaW5saW5lIHZvaWQgd3JpdGVfdG1yMCh1MzIgdmFsKQotewotCWFzbSB2b2xhdGlsZSgibWNy IHA2LCAwLCAlMCwgYzAsIGMxLCAwIiA6IDogInIiICh2YWwpKTsKLX0KLQotc3RhdGljIGlubGlu ZSB2b2lkIHdyaXRlX3RtcjEodTMyIHZhbCkKLXsKLQlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwg JTAsIGMxLCBjMSwgMCIgOiA6ICJyIiAodmFsKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIHJl YWRfdGNyMCh2b2lkKQotewotCXUzMiB2YWw7Ci0JYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUw LCBjMiwgYzEsIDAiIDogIj1yIiAodmFsKSk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGlu bGluZSB2b2lkIHdyaXRlX3RjcjAodTMyIHZhbCkKLXsKLQlhc20gdm9sYXRpbGUoIm1jciBwNiwg MCwgJTAsIGMyLCBjMSwgMCIgOiA6ICJyIiAodmFsKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMy IHJlYWRfdGNyMSh2b2lkKQotewotCXUzMiB2YWw7Ci0JYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAs ICUwLCBjMywgYzEsIDAiIDogIj1yIiAodmFsKSk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGlj IGlubGluZSB2b2lkIHdyaXRlX3RjcjEodTMyIHZhbCkKLXsKLQlhc20gdm9sYXRpbGUoIm1jciBw NiwgMCwgJTAsIGMzLCBjMSwgMCIgOiA6ICJyIiAodmFsKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg dm9pZCB3cml0ZV90cnIwKHUzMiB2YWwpCi17Ci0JYXNtIHZvbGF0aWxlKCJtY3IgcDYsIDAsICUw LCBjNCwgYzEsIDAiIDogOiAiciIgKHZhbCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3Jp dGVfdHJyMSh1MzIgdmFsKQotewotCWFzbSB2b2xhdGlsZSgibWNyIHA2LCAwLCAlMCwgYzUsIGMx LCAwIiA6IDogInIiICh2YWwpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3Rpc3Io dTMyIHZhbCkKLXsKLQlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGM2LCBjMSwgMCIgOiA6 ICJyIiAodmFsKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIHJlYWRfd2R0Y3Iodm9pZCkKLXsK LQl1MzIgdmFsOwotCWFzbSB2b2xhdGlsZSgibXJjIHA2LCAwLCAlMCwgYzcsIGMxLCAwIjoiPXIi ICh2YWwpKTsKLQlyZXR1cm4gdmFsOwotfQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3dkdGNy KHUzMiB2YWwpCi17Ci0JYXNtIHZvbGF0aWxlKCJtY3IgcDYsIDAsICUwLCBjNywgYzEsIDAiOjoi ciIgKHZhbCkpOwotfQotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfaW9wX3RpY2tfcmF0ZSh2 b2lkKTsKLQotLyogb25seSBpb3AxM3h4IGhhcyB0aGVzZSByZWdpc3RlcnMsIHdlIGRlZmluZSB0 aGVzZSB0byBwcmVzZW50IGEKLSAqIGNvbW1vbiByZWdpc3RlciBpbnRlcmZhY2UgZm9yIHRoZSBp b3Bfd2R0IGRyaXZlci4KLSAqLwotI2RlZmluZSBJT1BfUkNTUl9XRFQJKDApCi1zdGF0aWMgaW5s aW5lIHUzMiByZWFkX3Jjc3Iodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbmxpbmUg dm9pZCB3cml0ZV93ZHRzcih1MzIgdmFsKQotewotCWRvIHsgfSB3aGlsZSAoMCk7Ci19Ci0KLWV4 dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlvcDN4eF9kbWFfMF9jaGFubmVsOwotZXh0ZXJu IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW9wM3h4X2RtYV8xX2NoYW5uZWw7Ci1leHRlcm4gc3Ry dWN0IHBsYXRmb3JtX2RldmljZSBpb3AzeHhfYWF1X2NoYW5uZWw7Ci1leHRlcm4gc3RydWN0IHBs YXRmb3JtX2RldmljZSBpb3AzeHhfaTJjMF9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3Jt X2RldmljZSBpb3AzeHhfaTJjMV9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IGdwaW9kX2xvb2t1cF90 YWJsZSBpb3AzeHhfaTJjMF9ncGlvX2xvb2t1cDsKLWV4dGVybiBzdHJ1Y3QgZ3Bpb2RfbG9va3Vw X3RhYmxlIGlvcDN4eF9pMmMxX2dwaW9fbG9va3VwOwotCi0jZW5kaWYKLQotCi0jZW5kaWYKZGlm ZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYyBiL2FyY2gvYXJtL21hY2gt aW9wMzJ4L2lxMzEyNDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0YzI5ZDE3 MjY1Li4wMDAwMDAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jCisr KyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wLW9yLWxhdGVyCi0vKgotICogYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5j Ci0gKgotICogQm9hcmQgc3VwcG9ydCBjb2RlIGZvciB0aGUgSW50ZWwgRVA4MDIxOSBhbmQgSVEz MTI0NCBwbGF0Zm9ybXMuCi0gKgotICogQXV0aG9yOiBSb3J5IEJvbHQgPHJvcnlib2x0QHBhY2Jl bGwubmV0PgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJvcnkgQm9sdAotICogQ29weXJpZ2h0IDIw MDMgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQg SW50ZWwgQ29ycC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51 eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJu ZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2lu Y2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0j aW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21h cC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4 L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby9tYWNoaW5lLmg+Ci0jaW5jbHVkZSA8YXNtL2Nw dXR5cGUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5o PgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgot I2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgot I2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS5oIgotI2luY2x1ZGUg ImlycXMuaCIKLSNpbmNsdWRlICJncGlvLWlvcDMyeC5oIgotCi0vKgotICogVW50aWwgTWFyY2gg b2YgMjAwNyBpcTMxMjQ0IHBsYXRmb3JtcyBhbmQgZXA4MDIxOSBwbGF0Zm9ybXMgc2hhcmVkIHRo ZQotICogc2FtZSBtYWNoaW5lIGlkLCBhbmQgdGhlIHByb2Nlc3NvciB0eXBlIHdhcyB1c2VkIHRv IHNlbGVjdCBib2FyZCB0eXBlLgotICogSG93ZXZlciB0aGlzIGFzc3VtcHRpb24gYnJlYWtzIGZv ciBhbiBpcTgwMjE5IGJvYXJkIHdoaWNoIGlzIGFuIGlvcDIxOQotICogcHJvY2Vzc29yIG9uIGFu IGlxMzEyNDQgYm9hcmQuICBUaGUgZm9yY2VfZXA4MDIxOSBmbGFnIGhhcyBiZWVuIGFkZGVkCi0g KiBmb3Igb2xkIGJvb3QgbG9hZGVycyB1c2luZyB0aGUgaXEzMTI0NCBtYWNoaW5lIGlkIGZvciBh biBlcDgwMjE5IHBsYXRmb3JtLgotICovCi1zdGF0aWMgaW50IGZvcmNlX2VwODAyMTk7Ci0KLXN0 YXRpYyBpbnQgaXNfODAyMTkodm9pZCkKLXsKLQlyZXR1cm4gISEoKHJlYWRfY3B1aWRfaWQoKSAm IDB4ZmZmZmZmZTApID09IDB4NjkwNTJlMjApOwotfQotCi1zdGF0aWMgaW50IGlzX2VwODAyMTko dm9pZCkKLXsKLQlpZiAobWFjaGluZV9pc19lcDgwMjE5KCkgfHwgZm9yY2VfZXA4MDIxOSkKLQkJ cmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogRVA4MDIxOS9JUTMx MjQ0IHRpbWVyIHRpY2sgY29uZmlndXJhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IGlx MzEyNDRfdGltZXJfaW5pdCh2b2lkKQotewotCWlmIChpc19lcDgwMjE5KCkpIHsKLQkJLyogMzMu MzMzIE1IeiBjcnlzdGFsLiAgKi8KLQkJaW9wX2luaXRfdGltZSgyMDAwMDAwMDApOwotCX0gZWxz ZSB7Ci0JCS8qIDMzLjAwMCBNSHogY3J5c3RhbC4gICovCi0JCWlvcF9pbml0X3RpbWUoMTk4MDAw MDAwKTsKLQl9Ci19Ci0KLQotLyoKLSAqIElRMzEyNDQgSS9PLgotICovCi1zdGF0aWMgc3RydWN0 IG1hcF9kZXNjIGlxMzEyNDRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewkvKiBvbi1ib2Fy ZCBkZXZpY2VzICovCi0JCS52aXJ0dWFsCT0gSVEzMTI0NF9VQVJULAotCQkucGZuCQk9IF9fcGh5 c190b19wZm4oSVEzMTI0NF9VQVJUKSwKLQkJLmxlbmd0aAkJPSAweDAwMTAwMDAwLAotCQkudHlw ZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLX07Ci0KLXZvaWQgX19pbml0IGlxMzEyNDRfbWFwX2lvKHZv aWQpCi17Ci0JaW9wM3h4X21hcF9pbygpOwotCWlvdGFibGVfaW5pdChpcTMxMjQ0X2lvX2Rlc2Ms IEFSUkFZX1NJWkUoaXEzMTI0NF9pb19kZXNjKSk7Ci19Ci0KLQotLyoKLSAqIEVQODAyMTkvSVEz MTI0NCBQQ0kuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1lcDgwMjE5X3BjaV9tYXBfaXJxKGNv bnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlpbnQgaXJxOwot Ci0JaWYgKHNsb3QgPT0gMCkgewotCQkvKiBDRmxhc2ggKi8KLQkJaXJxID0gSVJRX0lPUDMyWF9Y SU5UMTsKLQl9IGVsc2UgaWYgKHNsb3QgPT0gMSkgewotCQkvKiA4MjU1MSBQcm8gMTAwICovCi0J CWlycSA9IElSUV9JT1AzMlhfWElOVDA7Ci0JfSBlbHNlIGlmIChzbG90ID09IDIpIHsKLQkJLyog UENJLVggU2xvdCAqLwotCQlpcnEgPSBJUlFfSU9QMzJYX1hJTlQzOwotCX0gZWxzZSBpZiAoc2xv dCA9PSAzKSB7Ci0JCS8qIFNBVEEgKi8KLQkJaXJxID0gSVJRX0lPUDMyWF9YSU5UMjsKLQl9IGVs c2UgewotCQlwcmludGsoS0VSTl9FUlIgImVwODAyMTlfcGNpX21hcF9pcnEoKSBjYWxsZWQgZm9y IHVua25vd24gIgotCQkJImRldmljZSBQQ0k6JWQ6JWQ6JWRcbiIsIGRldi0+YnVzLT5udW1iZXIs Ci0JCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwgUENJX0ZVTkMoZGV2LT5kZXZmbikpOwotCQlpcnEg PSAtMTsKLQl9Ci0KLQlyZXR1cm4gaXJxOwotfQotCi1zdGF0aWMgc3RydWN0IGh3X3BjaSBlcDgw MjE5X3BjaSBfX2luaXRkYXRhID0gewotCS5ucl9jb250cm9sbGVycyA9IDEsCi0JLm9wcwkJPSAm aW9wM3h4X29wcywKLQkuc2V0dXAJCT0gaW9wM3h4X3BjaV9zZXR1cCwKLQkucHJlaW5pdAk9IGlv cDN4eF9wY2lfcHJlaW5pdCwKLQkubWFwX2lycQk9IGVwODAyMTlfcGNpX21hcF9pcnEsCi19Owot Ci1zdGF0aWMgaW50IF9faW5pdAotaXEzMTI0NF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNp X2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0JaW50IGlycTsKLQotCWlmIChzbG90ID09 IDApIHsKLQkJLyogQ0ZsYXNoICovCi0JCWlycSA9IElSUV9JT1AzMlhfWElOVDE7Ci0JfSBlbHNl IGlmIChzbG90ID09IDEpIHsKLQkJLyogU0FUQSAqLwotCQlpcnEgPSBJUlFfSU9QMzJYX1hJTlQy OwotCX0gZWxzZSBpZiAoc2xvdCA9PSAyKSB7Ci0JCS8qIFBDSS1YIFNsb3QgKi8KLQkJaXJxID0g SVJRX0lPUDMyWF9YSU5UMzsKLQl9IGVsc2UgaWYgKHNsb3QgPT0gMykgewotCQkvKiA4MjU0NiBH aWdFICovCi0JCWlycSA9IElSUV9JT1AzMlhfWElOVDA7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtF Uk5fRVJSICJpcTMxMjQ0X3BjaV9tYXBfaXJxIGNhbGxlZCBmb3IgdW5rbm93biAiCi0JCQkiZGV2 aWNlIFBDSTolZDolZDolZFxuIiwgZGV2LT5idXMtPm51bWJlciwKLQkJCVBDSV9TTE9UKGRldi0+ ZGV2Zm4pLCBQQ0lfRlVOQyhkZXYtPmRldmZuKSk7Ci0JCWlycSA9IC0xOwotCX0KLQotCXJldHVy biBpcnE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfcGNpIGlxMzEyNDRfcGNpIF9faW5pdGRhdGEg PSB7Ci0JLm5yX2NvbnRyb2xsZXJzID0gMSwKLQkub3BzCQk9ICZpb3AzeHhfb3BzLAotCS5zZXR1 cAkJPSBpb3AzeHhfcGNpX3NldHVwLAotCS5wcmVpbml0CT0gaW9wM3h4X3BjaV9wcmVpbml0LAot CS5tYXBfaXJxCT0gaXEzMTI0NF9wY2lfbWFwX2lycSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0 IGlxMzEyNDRfcGNpX2luaXQodm9pZCkKLXsKLQlpZiAoaXNfZXA4MDIxOSgpKQotCQlwY2lfY29t bW9uX2luaXQoJmVwODAyMTlfcGNpKTsKLQllbHNlIGlmIChtYWNoaW5lX2lzX2lxMzEyNDQoKSkg ewotCQlpZiAoaXNfODAyMTkoKSkgewotCQkJcHJpbnRrKCJub3RlOiBpcTMxMjQ0IGJvYXJkIHR5 cGUgaGFzIGJlZW4gc2VsZWN0ZWRcbiIpOwotCQkJcHJpbnRrKCJub3RlOiB0byBzZWxlY3QgZXA4 MDIxOSBvcGVyYXRpb246XG4iKTsKLQkJCXByaW50aygiXHQxLyBzcGVjaWZ5IFwiZm9yY2VfZXA4 MDIxOVwiIG9uIHRoZSBrZXJuZWwiCi0JCQkJIiBjb21tYW5kIGxpbmVcbiIpOwotCQkJcHJpbnRr KCJcdDIvIHVwZGF0ZSBib290IGxvYWRlciB0byBwYXNzIgotCQkJCSIgdGhlIGVwODAyMTkgaWQ6 ICVkXG4iLCBNQUNIX1RZUEVfRVA4MDIxOSk7Ci0JCX0KLQkJcGNpX2NvbW1vbl9pbml0KCZpcTMx MjQ0X3BjaSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbChpcTMxMjQ0 X3BjaV9pbml0KTsKLQotCi0vKgotICogSVEzMTI0NCBtYWNoaW5lIGluaXRpYWxpc2F0aW9uLgot ICovCi1zdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBpcTMxMjQ0X2ZsYXNoX2RhdGEg PSB7Ci0JLndpZHRoCQk9IDIsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGlxMzEyNDRf Zmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IDB4ZjAwMDAwMDAsCi0JLmVuZAkJPSAweGYw N2ZmZmZmLAotCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlIGlxMzEyNDRfZmxhc2hfZGV2aWNlID0gewotCS5uYW1lCQk9ICJwaHlz bWFwLWZsYXNoIiwKLQkuaWQJCT0gMCwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAm aXEzMTI0NF9mbGFzaF9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAxLAotCS5yZXNvdXJj ZQk9ICZpcTMxMjQ0X2ZsYXNoX3Jlc291cmNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0X3Nl cmlhbDgyNTBfcG9ydCBpcTMxMjQ0X3NlcmlhbF9wb3J0W10gPSB7Ci0JewotCQkubWFwYmFzZQk9 IElRMzEyNDRfVUFSVCwKLQkJLm1lbWJhc2UJPSAoY2hhciAqKUlRMzEyNDRfVUFSVCwKLQkJLmly cQkJPSBJUlFfSU9QMzJYX1hJTlQxLAotCQkuZmxhZ3MJCT0gVVBGX1NLSVBfVEVTVCwKLQkJLmlv dHlwZQkJPSBVUElPX01FTSwKLQkJLnJlZ3NoaWZ0CT0gMCwKLQkJLnVhcnRjbGsJPSAxODQzMjAw LAotCX0sCi0JeyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpcTMxMjQ0X3VhcnRf cmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IElRMzEyNDRfVUFSVCwKLQkuZW5kCQk9IElRMzEyNDRf VUFSVCArIDcsCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RhdGljIHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgaXEzMTI0NF9zZXJpYWxfZGV2aWNlID0gewotCS5uYW1lCQk9ICJz ZXJpYWw4MjUwIiwKLQkuaWQJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAotCS5kZXYJCT0gewot CQkucGxhdGZvcm1fZGF0YQkJPSBpcTMxMjQ0X3NlcmlhbF9wb3J0LAotCX0sCi0JLm51bV9yZXNv dXJjZXMJPSAxLAotCS5yZXNvdXJjZQk9ICZpcTMxMjQ0X3VhcnRfcmVzb3VyY2UsCi19OwotCi0v KgotICogVGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgYSBTSFVURE9XTl9DT01QTEVURSBtZXNzYWdl IHRvIHRoZSBQSUMKLSAqIGNvbnRyb2xsZXIgb3ZlciBJMkMuICBXZSBhcmUgbm90IHVzaW5nIHRo ZSBpMmMgc3Vic3lzdGVtIHNpbmNlCi0gKiB3ZSBhcmUgZ29pbmcgdG8gcG93ZXIgb2ZmIGFuZCBp dCBtYXkgYmUgcmVtb3ZlZAotICovCi12b2lkIGVwODAyMTlfcG93ZXJfb2ZmKHZvaWQpCi17Ci0J LyoKLQkgKiBTZW5kIHRoZSBBZGRyZXNzIGJ5dGUgdy8gdGhlIHN0YXJ0IGNvbmRpdGlvbgotCSAq LwotCSpJT1AzWFhfSURCUjEgPSAweDYwOwotCSpJT1AzWFhfSUNSMSA9IDB4RTk7Ci0JbWRlbGF5 KDEpOwotCi0JLyoKLQkgKiBTZW5kIHRoZSBTVEFSVF9NU0cgYnl0ZSB3LyBubyBzdGFydCBvciBz dG9wIGNvbmRpdGlvbgotCSAqLwotCSpJT1AzWFhfSURCUjEgPSAweDBGOwotCSpJT1AzWFhfSUNS MSA9IDB4RTg7Ci0JbWRlbGF5KDEpOwotCi0JLyoKLQkgKiBTZW5kIHRoZSBTSFVURE9XTl9DT01Q TEVURSBNZXNzYWdlIElEIGJ5dGUgdy8gbm8gc3RhcnQgb3IKLQkgKiBzdG9wIGNvbmRpdGlvbgot CSAqLwotCSpJT1AzWFhfSURCUjEgPSAweDAzOwotCSpJT1AzWFhfSUNSMSA9IDB4RTg7Ci0JbWRl bGF5KDEpOwotCi0JLyoKLQkgKiBTZW5kIGFuIGlnbm9yZWQgYnl0ZSB3LyBzdG9wIGNvbmRpdGlv bgotCSAqLwotCSpJT1AzWFhfSURCUjEgPSAweDAwOwotCSpJT1AzWFhfSUNSMSA9IDB4RUE7Ci0K LQl3aGlsZSAoMSkKLQkJOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgaXEzMTI0NF9pbml0X21h Y2hpbmUodm9pZCkKLXsKLQlyZWdpc3Rlcl9pb3AzMnhfZ3BpbygpOwotCWdwaW9kX2FkZF9sb29r dXBfdGFibGUoJmlvcDN4eF9pMmMwX2dwaW9fbG9va3VwKTsKLQlncGlvZF9hZGRfbG9va3VwX3Rh YmxlKCZpb3AzeHhfaTJjMV9ncGlvX2xvb2t1cCk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVy KCZpb3AzeHhfaTJjMF9kZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaW9wM3h4 X2kyYzFfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlxMzEyNDRfZmxhc2hf ZGV2aWNlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlxMzEyNDRfc2VyaWFsX2Rldmlj ZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpb3AzeHhfZG1hXzBfY2hhbm5lbCk7Ci0J cGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpb3AzeHhfZG1hXzFfY2hhbm5lbCk7Ci0KLQlpZiAo aXNfZXA4MDIxOSgpKQotCQlwbV9wb3dlcl9vZmYgPSBlcDgwMjE5X3Bvd2VyX29mZjsKLQotCWlm ICghaXNfODAyMTkoKSkKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpb3AzeHhfYWF1X2No YW5uZWwpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBmb3JjZV9lcDgwMjE5X3NldHVwKGNoYXIg KnN0cikKLXsKLQlmb3JjZV9lcDgwMjE5ID0gMTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgi Zm9yY2VfZXA4MDIxOSIsIGZvcmNlX2VwODAyMTlfc2V0dXApOwotCi1NQUNISU5FX1NUQVJUKElR MzEyNDQsICJJbnRlbCBJUTMxMjQ0IikKLQkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLwot CS5hdGFnX29mZnNldAk9IDB4MTAwLAotCS5tYXBfaW8JCT0gaXEzMTI0NF9tYXBfaW8sCi0JLmlu aXRfaXJxCT0gaW9wMzJ4X2luaXRfaXJxLAotCS5pbml0X3RpbWUJPSBpcTMxMjQ0X3RpbWVyX2lu aXQsCi0JLmluaXRfbWFjaGluZQk9IGlxMzEyNDRfaW5pdF9tYWNoaW5lLAotCS5yZXN0YXJ0CT0g aW9wM3h4X3Jlc3RhcnQsCi1NQUNISU5FX0VORAotCi0vKiBUaGVyZSBzaG91bGQgaGF2ZSBiZWVu IGFuIGVwODAyMTkgbWFjaGluZSBpZGVudGlmaWVyIGZyb20gdGhlIGJlZ2lubmluZy4KLSAqIEJv b3Qgcm9tcyBvbGRlciB0aGFuIE1hcmNoIDIwMDcgZG8gbm90IGtub3cgdGhlIGVwODAyMTkgbWFj aGluZSBpZC4gIFBhc3MKLSAqICJmb3JjZV9lcDgwMjE5IiBvbiB0aGUga2VybmVsIGNvbW1hbmQg bGluZSwgb3RoZXJ3aXNlIGlxMzEyNDQgb3BlcmF0aW9uCi0gKiB3aWxsIGJlIHNlbGVjdGVkLgot ICovCi1NQUNISU5FX1NUQVJUKEVQODAyMTksICJJbnRlbCBFUDgwMjE5IikKLQkvKiBNYWludGFp bmVyOiBJbnRlbCBDb3JwLiAqLwotCS5hdGFnX29mZnNldAk9IDB4MTAwLAotCS5ucl9pcnFzCT0g SU9QMzJYX05SX0lSUVMsCi0JLm1hcF9pbwkJPSBpcTMxMjQ0X21hcF9pbywKLQkuaW5pdF9pcnEJ PSBpb3AzMnhfaW5pdF9pcnEsCi0JLmluaXRfdGltZQk9IGlxMzEyNDRfdGltZXJfaW5pdCwKLQku aW5pdF9tYWNoaW5lCT0gaXEzMTI0NF9pbml0X21hY2hpbmUsCi0JLnJlc3RhcnQJPSBpb3AzeHhf cmVzdGFydCwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9p cTMxMjQ0LmggYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTMxMjQ0LmgKZGVsZXRlZCBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IGE3YWM2OTFlNDhkMy4uMDAwMDAwMDAwMDAwCi0tLSBhL2FyY2gvYXJt L21hY2gtaW9wMzJ4L2lxMzEyNDQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8q IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCi0vKgotICogSW50ZWwgSVEzMTI0 NCBldmFsdWF0aW9uIGJvYXJkIHJlZ2lzdGVycwotICovCi0KLSNpZm5kZWYgX19JUTMxMjQ0X0gK LSNkZWZpbmUgX19JUTMxMjQ0X0gKLQotI2RlZmluZSBJUTMxMjQ0X1VBUlQJCTB4ZmU4MDAwMDAJ LyogVUFSVCAjMSAqLwotI2RlZmluZSBJUTMxMjQ0XzdTRUdfMQkJMHhmZTg0MDAwMAkvKiA3LVNl Z21lbnQgTVNCICovCi0jZGVmaW5lIElRMzEyNDRfN1NFR18wCQkweGZlODUwMDAwCS8qIDctU2Vn bWVudCBMU0IgKFdPKSAqLwotI2RlZmluZSBJUTMxMjQ0X1JPVEFSWV9TVwkweGZlOGQwMDAwCS8q IFJvdGFyeSBTd2l0Y2ggKi8KLSNkZWZpbmUgSVEzMTI0NF9CQVRUX1NUQVQJMHhmZThmMDAwMAkv KiBCYXR0ZXJ5IFN0YXR1cyAqLwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFj aC1pb3AzMngvaXE4MDMyMS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5jCmRlbGV0 ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTc4MGM0NjYwY2IuLjAwMDAwMDAwMDAwMAotLS0g YS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIg KzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKLS8q Ci0gKiBhcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMKLSAqCi0gKiBCb2FyZCBzdXBwb3J0 IGNvZGUgZm9yIHRoZSBJbnRlbCBJUTgwMzIxIHBsYXRmb3JtLgotICoKLSAqIEF1dGhvcjogUm9y eSBCb2x0IDxyb3J5Ym9sdEBwYWNiZWxsLm5ldD4KLSAqIENvcHlyaWdodCAoQykgMjAwMiBSb3J5 IEJvbHQKLSAqIENvcHlyaWdodCAoQykgMjAwNCBJbnRlbCBDb3JwLgotICovCi0KLSNpbmNsdWRl IDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9r ZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcu aD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Nlcmlh bF84MjUwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51 eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxp bnV4L2dwaW8vbWFjaGluZS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20v bWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21h Y2gvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNo LXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLQotI2luY2x1ZGUgImhhcmR3YXJlLmgi Ci0jaW5jbHVkZSAiaXJxcy5oIgotI2luY2x1ZGUgImdwaW8taW9wMzJ4LmgiCi0KLS8qCi0gKiBJ UTgwMzIxIHRpbWVyIHRpY2sgY29uZmlndXJhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0 IGlxODAzMjFfdGltZXJfaW5pdCh2b2lkKQotewotCS8qIDMzLjMzMyBNSHogY3J5c3RhbC4gICov Ci0JaW9wX2luaXRfdGltZSgyMDAwMDAwMDApOwotfQotCi0KLS8qCi0gKiBJUTgwMzIxIEkvTy4K LSAqLwotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpcTgwMzIxX2lvX2Rlc2NbXSBfX2luaXRkYXRh ID0gewotIAl7CS8qIG9uLWJvYXJkIGRldmljZXMgKi8KLQkJLnZpcnR1YWwJPSBJUTgwMzIxX1VB UlQsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihJUTgwMzIxX1VBUlQpLAotCQkubGVuZ3RoCQk9 IDB4MDAxMDAwMDAsCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotfTsKLQotdm9pZCBfX2lu aXQgaXE4MDMyMV9tYXBfaW8odm9pZCkKLXsKLQlpb3AzeHhfbWFwX2lvKCk7Ci0JaW90YWJsZV9p bml0KGlxODAzMjFfaW9fZGVzYywgQVJSQVlfU0laRShpcTgwMzIxX2lvX2Rlc2MpKTsKLX0KLQot Ci0vKgotICogSVE4MDMyMSBQQ0kuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1pcTgwMzIxX3Bj aV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsK LQlpbnQgaXJxOwotCi0JaWYgKChzbG90ID09IDIgfHwgc2xvdCA9PSA2KSAmJiBwaW4gPT0gMSkg ewotCQkvKiBQQ0ktWCBTbG90IElOVEEgKi8KLQkJaXJxID0gSVJRX0lPUDMyWF9YSU5UMjsKLQl9 IGVsc2UgaWYgKChzbG90ID09IDIgfHwgc2xvdCA9PSA2KSAmJiBwaW4gPT0gMikgewotCQkvKiBQ Q0ktWCBTbG90IElOVEEgKi8KLQkJaXJxID0gSVJRX0lPUDMyWF9YSU5UMzsKLQl9IGVsc2UgaWYg KChzbG90ID09IDIgfHwgc2xvdCA9PSA2KSAmJiBwaW4gPT0gMykgewotCQkvKiBQQ0ktWCBTbG90 IElOVEEgKi8KLQkJaXJxID0gSVJRX0lPUDMyWF9YSU5UMDsKLQl9IGVsc2UgaWYgKChzbG90ID09 IDIgfHwgc2xvdCA9PSA2KSAmJiBwaW4gPT0gNCkgewotCQkvKiBQQ0ktWCBTbG90IElOVEEgKi8K LQkJaXJxID0gSVJRX0lPUDMyWF9YSU5UMTsKLQl9IGVsc2UgaWYgKHNsb3QgPT0gNCB8fCBzbG90 ID09IDgpIHsKLQkJLyogR2lnLUUgKi8KLQkJaXJxID0gSVJRX0lPUDMyWF9YSU5UMDsKLQl9IGVs c2UgewotCQlwcmludGsoS0VSTl9FUlIgImlxODAzMjFfcGNpX21hcF9pcnEoKSBjYWxsZWQgZm9y IHVua25vd24gIgotCQkJImRldmljZSBQQ0k6JWQ6JWQ6JWRcbiIsIGRldi0+YnVzLT5udW1iZXIs Ci0JCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwgUENJX0ZVTkMoZGV2LT5kZXZmbikpOwotCQlpcnEg PSAtMTsKLQl9Ci0KLQlyZXR1cm4gaXJxOwotfQotCi1zdGF0aWMgc3RydWN0IGh3X3BjaSBpcTgw MzIxX3BjaSBfX2luaXRkYXRhID0gewotCS5ucl9jb250cm9sbGVycyA9IDEsCi0JLm9wcwkJPSAm aW9wM3h4X29wcywKLQkuc2V0dXAJCT0gaW9wM3h4X3BjaV9zZXR1cCwKLQkucHJlaW5pdAk9IGlv cDN4eF9wY2lfcHJlaW5pdF9jb25kLAotCS5tYXBfaXJxCT0gaXE4MDMyMV9wY2lfbWFwX2lycSwK LX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlxODAzMjFfcGNpX2luaXQodm9pZCkKLXsKLQlpZiAo KGlvcDN4eF9nZXRfaW5pdF9hdHUoKSA9PSBJT1AzWFhfSU5JVF9BVFVfRU5BQkxFKSAmJgotCQlt YWNoaW5lX2lzX2lxODAzMjEoKSkKLQkJcGNpX2NvbW1vbl9pbml0KCZpcTgwMzIxX3BjaSk7Ci0K LQlyZXR1cm4gMDsKLX0KLQotc3Vic3lzX2luaXRjYWxsKGlxODAzMjFfcGNpX2luaXQpOwotCi0K LS8qCi0gKiBJUTgwMzIxIG1hY2hpbmUgaW5pdGlhbGlzYXRpb24uCi0gKi8KLXN0YXRpYyBzdHJ1 Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGlxODAzMjFfZmxhc2hfZGF0YSA9IHsKLQkud2lkdGgJCT0g MSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXE4MDMyMV9mbGFzaF9yZXNvdXJjZSA9 IHsKLQkuc3RhcnQJCT0gMHhmMDAwMDAwMCwKLQkuZW5kCQk9IDB4ZjA3ZmZmZmYsCi0JLmZsYWdz CQk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug aXE4MDMyMV9mbGFzaF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAotCS5p ZAkJPSAwLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZpcTgwMzIxX2ZsYXNoX2Rh dGEsCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IDEsCi0JLnJlc291cmNlCT0gJmlxODAzMjFfZmxh c2hfcmVzb3VyY2UsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGlx ODAzMjFfc2VyaWFsX3BvcnRbXSA9IHsKLQl7Ci0JCS5tYXBiYXNlCT0gSVE4MDMyMV9VQVJULAot CQkubWVtYmFzZQk9IChjaGFyICopSVE4MDMyMV9VQVJULAotCQkuaXJxCQk9IElSUV9JT1AzMlhf WElOVDEsCi0JCS5mbGFncwkJPSBVUEZfU0tJUF9URVNULAotCQkuaW90eXBlCQk9IFVQSU9fTUVN LAotCQkucmVnc2hpZnQJPSAwLAotCQkudWFydGNsawk9IDE4NDMyMDAsCi0JfSwKLQl7IH0sCi19 OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGlxODAzMjFfdWFydF9yZXNvdXJjZSA9IHsKLQku c3RhcnQJCT0gSVE4MDMyMV9VQVJULAotCS5lbmQJCT0gSVE4MDMyMV9VQVJUICsgNywKLQkuZmxh Z3MJCT0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSBpcTgwMzIxX3NlcmlhbF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInNlcmlhbDgyNTAiLAotCS5p ZAkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRh CQk9IGlxODAzMjFfc2VyaWFsX3BvcnQsCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IDEsCi0JLnJl c291cmNlCT0gJmlxODAzMjFfdWFydF9yZXNvdXJjZSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5p dCBpcTgwMzIxX2luaXRfbWFjaGluZSh2b2lkKQotewotCXJlZ2lzdGVyX2lvcDMyeF9ncGlvKCk7 Ci0JZ3Bpb2RfYWRkX2xvb2t1cF90YWJsZSgmaW9wM3h4X2kyYzBfZ3Bpb19sb29rdXApOwotCWdw aW9kX2FkZF9sb29rdXBfdGFibGUoJmlvcDN4eF9pMmMxX2dwaW9fbG9va3VwKTsKLQlwbGF0Zm9y bV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9pMmMwX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNl X3JlZ2lzdGVyKCZpb3AzeHhfaTJjMV9kZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rl cigmaXE4MDMyMV9mbGFzaF9kZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaXE4 MDMyMV9zZXJpYWxfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9k bWFfMF9jaGFubmVsKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9kbWFfMV9j aGFubmVsKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9hYXVfY2hhbm5lbCk7 Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoSVE4MDMyMSwgIkludGVsIElRODAzMjEiKQotCS8qIE1haW50 YWluZXI6IEludGVsIENvcnAuICovCi0JLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCi0JLm5yX2lycXMJ PSBJT1AzMlhfTlJfSVJRUywKLQkubWFwX2lvCQk9IGlxODAzMjFfbWFwX2lvLAotCS5pbml0X2ly cQk9IGlvcDMyeF9pbml0X2lycSwKLQkuaW5pdF90aW1lCT0gaXE4MDMyMV90aW1lcl9pbml0LAot CS5pbml0X21hY2hpbmUJPSBpcTgwMzIxX2luaXRfbWFjaGluZSwKLQkucmVzdGFydAk9IGlvcDN4 eF9yZXN0YXJ0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4 L2lxODAzMjEuaCBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxODAzMjEuaApkZWxldGVkIGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggM2E1ZDEwNjI2ZWE2Li4wMDAwMDAwMDAwMDAKLS0tIGEvYXJjaC9h cm0vbWFjaC1pb3AzMngvaXE4MDMyMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAot LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KLS8qCi0gKiBJbnRlbCBJUTgw MzIxIGV2YWx1YXRpb24gYm9hcmQgcmVnaXN0ZXJzCi0gKi8KLQotI2lmbmRlZiBfX0lRODAzMjFf SAotI2RlZmluZSBfX0lRODAzMjFfSAotCi0jZGVmaW5lIElRODAzMjFfVUFSVAkJMHhmZTgwMDAw MAkvKiBVQVJUICMxICovCi0jZGVmaW5lIElRODAzMjFfN1NFR18xCQkweGZlODQwMDAwCS8qIDct U2VnbWVudCBNU0IgKi8KLSNkZWZpbmUgSVE4MDMyMV83U0VHXzAJCTB4ZmU4NTAwMDAJLyogNy1T ZWdtZW50IExTQiAoV08pICovCi0jZGVmaW5lIElRODAzMjFfUk9UQVJZX1NXCTB4ZmU4ZDAwMDAJ LyogUm90YXJ5IFN3aXRjaCAqLwotI2RlZmluZSBJUTgwMzIxX0JBVFRfU1RBVAkweGZlOGYwMDAw CS8qIEJhdHRlcnkgU3RhdHVzICovCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9t YWNoLWlvcDMyeC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lycS5jCmRlbGV0ZWQgZmls ZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNhN2U5N2Q4MWYuLjAwMDAwMDAwMDAwMAotLS0gYS9hcmNo L2FybS9tYWNoLWlvcDMyeC9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8v IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKLS8qCi0gKiBhcmNoL2FybS9t YWNoLWlvcDMyeC9pcnEuYwotICoKLSAqIEdlbmVyaWMgSU9QMzJYIElSUSBoYW5kbGluZyBmdW5j dGlvbmFsaXR5Ci0gKgotICogQXV0aG9yOiBSb3J5IEJvbHQgPHJvcnlib2x0QHBhY2JlbGwubmV0 PgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJvcnkgQm9sdAotICovCi0KLSNpbmNsdWRlIDxsaW51 eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgv bGlzdC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4K LSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSAiaGFyZHdhcmUuaCIKLQot c3RhdGljIHUzMiBpb3AzMnhfbWFzazsKLQotc3RhdGljIHZvaWQgaW50Y3RsX3dyaXRlKHUzMiB2 YWwpCi17Ci0JYXNtIHZvbGF0aWxlKCJtY3IgcDYsIDAsICUwLCBjMCwgYzAsIDAiIDogOiAiciIg KHZhbCkpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRzdHJfd3JpdGUodTMyIHZhbCkKLXsKLQlhc20g dm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGM0LCBjMCwgMCIgOiA6ICJyIiAodmFsKSk7Ci19Ci0K LXN0YXRpYyB1MzIgaWludHNyY19yZWFkKHZvaWQpCi17Ci0JaW50IGlycTsKLQotCWFzbSB2b2xh dGlsZSgibXJjIHA2LCAwLCAlMCwgYzgsIGMwLCAwIiA6ICI9ciIgKGlycSkpOwotCi0JcmV0dXJu IGlycTsKLX0KLQotc3RhdGljIHZvaWQKLWlvcDMyeF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEg KmQpCi17Ci0JaW9wMzJ4X21hc2sgJj0gfigxIDw8IChkLT5pcnEgLSAxKSk7Ci0JaW50Y3RsX3dy aXRlKGlvcDMyeF9tYXNrKTsKLX0KLQotc3RhdGljIHZvaWQKLWlvcDMyeF9pcnFfdW5tYXNrKHN0 cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlpb3AzMnhfbWFzayB8PSAxIDw8IChkLT5pcnEgLSAxKTsK LQlpbnRjdGxfd3JpdGUoaW9wMzJ4X21hc2spOwotfQotCi1zdHJ1Y3QgaXJxX2NoaXAgZXh0X2No aXAgPSB7Ci0JLm5hbWUJCT0gIklPUDMyeCIsCi0JLmlycV9hY2sJPSBpb3AzMnhfaXJxX21hc2ss Ci0JLmlycV9tYXNrCT0gaW9wMzJ4X2lycV9tYXNrLAotCS5pcnFfdW5tYXNrCT0gaW9wMzJ4X2ly cV91bm1hc2ssCi19OwotCi1zdGF0aWMgdm9pZCBpb3BfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVn cyAqcmVncykKLXsKLQl1MzIgbWFzazsKLQotCWlvcF9lbmFibGVfY3A2KCk7Ci0KLQlkbyB7Ci0J CW1hc2sgPSBpaW50c3JjX3JlYWQoKTsKLQkJaWYgKG1hc2spCi0JCQlnZW5lcmljX2hhbmRsZV9p cnEoZmxzKG1hc2spKTsKLQl9IHdoaWxlIChtYXNrKTsKLX0KLQotdm9pZCBfX2luaXQgaW9wMzJ4 X2luaXRfaXJxKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpb3BfaW5pdF9jcDZfaGFuZGxlcigpOwot CXNldF9oYW5kbGVfaXJxKGlvcF9oYW5kbGVfaXJxKTsKLQotCWludGN0bF93cml0ZSgwKTsKLQlp bnRzdHJfd3JpdGUoMCk7Ci0JaWYgKG1hY2hpbmVfaXNfZ2xhbnRhbmsoKSB8fAotCSAgICBtYWNo aW5lX2lzX2lxODAzMjEoKSB8fAotCSAgICBtYWNoaW5lX2lzX2lxMzEyNDQoKSB8fAotCSAgICBt YWNoaW5lX2lzX24yMTAwKCkgfHwKLQkgICAgbWFjaGluZV9pc19lbTcyMTAoKSkKLQkJKklPUDNY WF9QQ0lJUlNSID0gMHgwZjsKLQotCWZvciAoaSA9IDE7IGkgPCBOUl9JUlFTOyBpKyspIHsKLQkJ aXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZleHRfY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7 Ci0JCWlycV9jbGVhcl9zdGF0dXNfZmxhZ3MoaSwgSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JF KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcnFzLmggYi9hcmNo L2FybS9tYWNoLWlvcDMyeC9pcnFzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5 ZmM4OGUwOTE4OS4uMDAwMDAwMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lycXMu aAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wLW9ubHkgKi8KLS8qCi0gKiBBdXRob3I6CVJvcnkgQm9sdCA8cm9yeWJvbHRA cGFjYmVsbC5uZXQ+Ci0gKiBDb3B5cmlnaHQ6CShDKSAyMDAyIFJvcnkgQm9sdAotICovCi0KLSNp Zm5kZWYgX19JT1AzMlhfSVJRU19ICi0jZGVmaW5lIF9fSU9QMzJYX0lSUVNfSAotCi0vKiBJbnRl cnJ1cHRzIGluIExpbnV4IHN0YXJ0IGF0IDEsIGhhcmR3YXJlIHN0YXJ0cyBhdCAwICovCi0KLSNk ZWZpbmUgSU9QX0lSUSh4KSAoKHgpICsgMSkKLQotLyoKLSAqIElPUDgwMzIxIGNoaXBzZXQgaW50 ZXJydXB0cwotICovCi0jZGVmaW5lIElSUV9JT1AzMlhfRE1BMF9FT1QJSU9QX0lSUSgwKQotI2Rl ZmluZSBJUlFfSU9QMzJYX0RNQTBfRU9DCUlPUF9JUlEoMSkKLSNkZWZpbmUgSVJRX0lPUDMyWF9E TUExX0VPVAlJT1BfSVJRKDIpCi0jZGVmaW5lIElSUV9JT1AzMlhfRE1BMV9FT0MJSU9QX0lSUSgz KQotI2RlZmluZSBJUlFfSU9QMzJYX0FBX0VPVAlJT1BfSVJRKDYpCi0jZGVmaW5lIElSUV9JT1Az MlhfQUFfRU9DCUlPUF9JUlEoNykKLSNkZWZpbmUgSVJRX0lPUDMyWF9DT1JFX1BNT04JSU9QX0lS USg4KQotI2RlZmluZSBJUlFfSU9QMzJYX1RJTUVSMAlJT1BfSVJRKDkpCi0jZGVmaW5lIElSUV9J T1AzMlhfVElNRVIxCUlPUF9JUlEoMTApCi0jZGVmaW5lIElSUV9JT1AzMlhfSTJDXzAJSU9QX0lS USgxMSkKLSNkZWZpbmUgSVJRX0lPUDMyWF9JMkNfMQlJT1BfSVJRKDEyKQotI2RlZmluZSBJUlFf SU9QMzJYX01FU1NBR0lORwlJT1BfSVJRKDEzKQotI2RlZmluZSBJUlFfSU9QMzJYX0FUVV9CSVNU CUlPUF9JUlEoMTQpCi0jZGVmaW5lIElSUV9JT1AzMlhfUEVSRk1PTglJT1BfSVJRKDE1KQotI2Rl ZmluZSBJUlFfSU9QMzJYX0NPUkVfUE1VCUlPUF9JUlEoMTYpCi0jZGVmaW5lIElSUV9JT1AzMlhf QklVX0VSUglJT1BfSVJRKDE3KQotI2RlZmluZSBJUlFfSU9QMzJYX0FUVV9FUlIJSU9QX0lSUSgx OCkKLSNkZWZpbmUgSVJRX0lPUDMyWF9NQ1VfRVJSCUlPUF9JUlEoMTkpCi0jZGVmaW5lIElSUV9J T1AzMlhfRE1BMF9FUlIJSU9QX0lSUSgyMCkKLSNkZWZpbmUgSVJRX0lPUDMyWF9ETUExX0VSUglJ T1BfSVJRKDIxKQotI2RlZmluZSBJUlFfSU9QMzJYX0FBX0VSUglJT1BfSVJRKDIzKQotI2RlZmlu ZSBJUlFfSU9QMzJYX01TR19FUlIJSU9QX0lSUSgyNCkKLSNkZWZpbmUgSVJRX0lPUDMyWF9TU1AJ CUlPUF9JUlEoMjUpCi0jZGVmaW5lIElSUV9JT1AzMlhfWElOVDAJSU9QX0lSUSgyNykKLSNkZWZp bmUgSVJRX0lPUDMyWF9YSU5UMQlJT1BfSVJRKDI4KQotI2RlZmluZSBJUlFfSU9QMzJYX1hJTlQy CUlPUF9JUlEoMjkpCi0jZGVmaW5lIElSUV9JT1AzMlhfWElOVDMJSU9QX0lSUSgzMCkKLSNkZWZp bmUgSVJRX0lPUDMyWF9IUEkJCUlPUF9JUlEoMzEpCi0KLSNkZWZpbmUgSU9QMzJYX05SX0lSUVMJ CShJUlFfSU9QMzJYX0hQSSArIDEpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFj aC1pb3AzMngvbjIxMDAuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKZGVsZXRlZCBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMWUyZTExYmYzNS4uMDAwMDAwMDAwMDAwCi0tLSBhL2Fy Y2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBA QAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKLS8qCi0gKiBh cmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCi0gKgotICogQm9hcmQgc3VwcG9ydCBjb2RlIGZv ciB0aGUgVGhlY3VzIE4yMTAwIHBsYXRmb3JtLgotICoKLSAqIEF1dGhvcjogUm9yeSBCb2x0IDxy b3J5Ym9sdEBwYWNiZWxsLm5ldD4KLSAqIENvcHlyaWdodCAoQykgMjAwMiBSb3J5IEJvbHQKLSAq IENvcHlyaWdodCAyMDAzIChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLgotICogQ29weXJp Z2h0IChDKSAyMDA0IEludGVsIENvcnAuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0j aW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Y3NTM3NXMuaD4KLSNpbmNs dWRlIDxsaW51eC9sZWRzLXBjYTk1MzIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2lu Y2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUg PGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgv c2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgotI2luY2x1ZGUg PGxpbnV4L210ZC9waHlzbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+Ci0jaW5j bHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGlu dXgvZ3Bpby9tYWNoaW5lLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9t YWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFj aC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gt dHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotCi0jaW5jbHVkZSAiaGFyZHdhcmUuaCIK LSNpbmNsdWRlICJpcnFzLmgiCi0jaW5jbHVkZSAiZ3Bpby1pb3AzMnguaCIKLQotLyoKLSAqIE4y MTAwIHRpbWVyIHRpY2sgY29uZmlndXJhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IG4y MTAwX3RpbWVyX2luaXQodm9pZCkKLXsKLQkvKiAzMy4wMDAgTUh6IGNyeXN0YWwuICAqLwotCWlv cF9pbml0X3RpbWUoMTk4MDAwMDAwKTsKLX0KLQotCi0vKgotICogTjIxMDAgSS9PLgotICovCi1z dGF0aWMgc3RydWN0IG1hcF9kZXNjIG4yMTAwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsJ Lyogb24tYm9hcmQgZGV2aWNlcyAqLwotCQkudmlydHVhbAk9IE4yMTAwX1VBUlQsCi0JCS5wZm4J CT0gX19waHlzX3RvX3BmbihOMjEwMF9VQVJUKSwKLQkJLmxlbmd0aAkJPSAweDAwMTAwMDAwLAot CQkudHlwZQkJPSBNVF9ERVZJQ0UKLQl9LAotfTsKLQotdm9pZCBfX2luaXQgbjIxMDBfbWFwX2lv KHZvaWQpCi17Ci0JaW9wM3h4X21hcF9pbygpOwotCWlvdGFibGVfaW5pdChuMjEwMF9pb19kZXNj LCBBUlJBWV9TSVpFKG4yMTAwX2lvX2Rlc2MpKTsKLX0KLQotCi0vKgotICogTjIxMDAgUENJLgot ICovCi1zdGF0aWMgaW50IG4yMTAwX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpk ZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlpbnQgaXJxOwotCi0JaWYgKFBDSV9TTE9UKGRldi0+ ZGV2Zm4pID09IDEpIHsKLQkJLyogUlRMODExMFNCICMxICovCi0JCWlycSA9IElSUV9JT1AzMlhf WElOVDA7Ci0JfSBlbHNlIGlmIChQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSAyKSB7Ci0JCS8qIFJU TDgxMTBTQiAjMiAqLwotCQlpcnEgPSBJUlFfSU9QMzJYX1hJTlQzOwotCX0gZWxzZSBpZiAoUENJ X1NMT1QoZGV2LT5kZXZmbikgPT0gMykgewotCQkvKiBTaWwzNTEyICovCi0JCWlycSA9IElSUV9J T1AzMlhfWElOVDI7Ci0JfSBlbHNlIGlmIChQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSA0ICYmIHBp biA9PSAxKSB7Ci0JCS8qIFZUNjIxMiBJTlRBICovCi0JCWlycSA9IElSUV9JT1AzMlhfWElOVDE7 Ci0JfSBlbHNlIGlmIChQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSA0ICYmIHBpbiA9PSAyKSB7Ci0J CS8qIFZUNjIxMiBJTlRCICovCi0JCWlycSA9IElSUV9JT1AzMlhfWElOVDA7Ci0JfSBlbHNlIGlm IChQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSA0ICYmIHBpbiA9PSAzKSB7Ci0JCS8qIFZUNjIxMiBJ TlRDICovCi0JCWlycSA9IElSUV9JT1AzMlhfWElOVDI7Ci0JfSBlbHNlIGlmIChQQ0lfU0xPVChk ZXYtPmRldmZuKSA9PSA1KSB7Ci0JCS8qIE1pbmktUENJIHNsb3QgKi8KLQkJaXJxID0gSVJRX0lP UDMyWF9YSU5UMzsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIm4yMTAwX3BjaV9tYXBf aXJxKCkgY2FsbGVkIGZvciB1bmtub3duICIKLQkJCSJkZXZpY2UgUENJOiVkOiVkOiVkXG4iLCBk ZXYtPmJ1cy0+bnVtYmVyLAotCQkJUENJX1NMT1QoZGV2LT5kZXZmbiksIFBDSV9GVU5DKGRldi0+ ZGV2Zm4pKTsKLQkJaXJxID0gLTE7Ci0JfQotCi0JcmV0dXJuIGlycTsKLX0KLQotc3RhdGljIHN0 cnVjdCBod19wY2kgbjIxMDBfcGNpIF9faW5pdGRhdGEgPSB7Ci0JLm5yX2NvbnRyb2xsZXJzID0g MSwKLQkub3BzCQk9ICZpb3AzeHhfb3BzLAotCS5zZXR1cAkJPSBpb3AzeHhfcGNpX3NldHVwLAot CS5wcmVpbml0CT0gaW9wM3h4X3BjaV9wcmVpbml0LAotCS5tYXBfaXJxCT0gbjIxMDBfcGNpX21h cF9pcnEsCi19OwotCi0vKgotICogQm90aCByODE2OSBjaGlwcyBvbiB0aGUgbjIxMDAgZXhoaWJp dCBQQ0kgcGFyaXR5IHByb2JsZW1zLiAgVHVybgotICogb2ZmIHBhcml0eSByZXBvcnRpbmcgZm9y IGJvdGggcG9ydHMgc28gd2UgZG9uJ3QgZ2V0IGVycm9yIGludGVycnVwdHMKLSAqIGZvciB0aGVt LgotICovCi1zdGF0aWMgdm9pZCBuMjEwMF9maXh1cF9yODE2OShzdHJ1Y3QgcGNpX2RldiAqZGV2 KQotewotCWlmIChkZXYtPmJ1cy0+bnVtYmVyID09IDAgJiYKLQkgICAgKGRldi0+ZGV2Zm4gPT0g UENJX0RFVkZOKDEsIDApIHx8Ci0JICAgICBkZXYtPmRldmZuID09IFBDSV9ERVZGTigyLCAwKSkp Ci0JCXBjaV9kaXNhYmxlX3Bhcml0eShkZXYpOwotfQotREVDTEFSRV9QQ0lfRklYVVBfRklOQUwo UENJX1ZFTkRPUl9JRF9SRUFMVEVLLCBQQ0lfQU5ZX0lELCBuMjEwMF9maXh1cF9yODE2OSk7Ci0K LXN0YXRpYyBpbnQgX19pbml0IG4yMTAwX3BjaV9pbml0KHZvaWQpCi17Ci0JaWYgKG1hY2hpbmVf aXNfbjIxMDAoKSkKLQkJcGNpX2NvbW1vbl9pbml0KCZuMjEwMF9wY2kpOwotCi0JcmV0dXJuIDA7 Ci19Ci0KLXN1YnN5c19pbml0Y2FsbChuMjEwMF9wY2lfaW5pdCk7Ci0KLQotLyoKLSAqIE4yMTAw IG1hY2hpbmUgaW5pdGlhbGlzYXRpb24uCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFz aF9kYXRhIG4yMTAwX2ZsYXNoX2RhdGEgPSB7Ci0JLndpZHRoCQk9IDIsCi19OwotCi1zdGF0aWMg c3RydWN0IHJlc291cmNlIG4yMTAwX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSAweGYw MDAwMDAwLAotCS5lbmQJCT0gMHhmMGZmZmZmZiwKLQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0s Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBuMjEwMF9mbGFzaF9kZXZpY2Ug PSB7Ci0JLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAotCS5pZAkJPSAwLAotCS5kZXYJCT0gewot CQkucGxhdGZvcm1fZGF0YQk9ICZuMjEwMF9mbGFzaF9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJj ZXMJPSAxLAotCS5yZXNvdXJjZQk9ICZuMjEwMF9mbGFzaF9yZXNvdXJjZSwKLX07Ci0KLQotc3Rh dGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBuMjEwMF9zZXJpYWxfcG9ydFtdID0gewot CXsKLQkJLm1hcGJhc2UJPSBOMjEwMF9VQVJULAotCQkubWVtYmFzZQk9IChjaGFyICopTjIxMDBf VUFSVCwKLQkJLmlycQkJPSAwLAotCQkuZmxhZ3MJCT0gVVBGX1NLSVBfVEVTVCB8IFVQRl9BVVRP X0lSUSB8IFVQRl9TSEFSRV9JUlEsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5yZWdzaGlm dAk9IDAsCi0JCS51YXJ0Y2xrCT0gMTg0MzIwMCwKLQl9LAotCXsgfSwKLX07Ci0KLXN0YXRpYyBz dHJ1Y3QgcmVzb3VyY2UgbjIxMDBfdWFydF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gTjIxMDBf VUFSVCwKLQkuZW5kCQk9IE4yMTAwX1VBUlQgKyA3LAotCS5mbGFncwkJPSBJT1JFU09VUkNFX01F TSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG4yMTAwX3NlcmlhbF9kZXZp Y2UgPSB7Ci0JLm5hbWUJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJPSBQTEFUODI1MF9ERVZfUExB VEZPUk0sCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCQk9IG4yMTAwX3NlcmlhbF9wb3J0 LAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAxLAotCS5yZXNvdXJjZQk9ICZuMjEwMF91YXJ0X3Jl c291cmNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBmNzUzNzVzX3BsYXRmb3JtX2RhdGEgbjIxMDBf Zjc1Mzc1cyA9IHsKLQkucHdtCQk9IHsgMjU1LCAyNTUgfSwKLQkucHdtX2VuYWJsZSA9IHsgMCwg MCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwY2E5NTMyX3BsYXRmb3JtX2RhdGEgbjIxMDBfbGVk cyA9IHsKLQkubGVkcyA9IHsKLQl7CS5uYW1lID0gIm4yMTAwOnJlZDpzYXRhZmFpbDAiLAotCQku c3RhdGUgPSBQQ0E5NTMyX09GRiwKLQkJLnR5cGUgPSBQQ0E5NTMyX1RZUEVfTEVELAotCX0sCi0J ewkubmFtZSA9ICJuMjEwMDpyZWQ6c2F0YWZhaWwxIiwKLQkJLnN0YXRlID0gUENBOTUzMl9PRkYs Ci0JCS50eXBlID0gUENBOTUzMl9UWVBFX0xFRCwKLQl9LAotCXsJLm5hbWUgPSAibjIxMDA6Ymx1 ZTp1c2IiLAotCQkuc3RhdGUgPSBQQ0E5NTMyX09GRiwKLQkJLnR5cGUgPSBQQ0E5NTMyX1RZUEVf TEVELAotCX0sCi0JeyAJLnR5cGUgPSBQQ0E5NTMyX1RZUEVfTk9ORSB9LAotCi0JeyAJLnR5cGUg PSBQQ0E5NTMyX1RZUEVfTk9ORSB9LAotCXsgCS50eXBlID0gUENBOTUzMl9UWVBFX05PTkUgfSwK LQl7IAkudHlwZSA9IFBDQTk1MzJfVFlQRV9OT05FIH0sCi0JewkubmFtZSA9ICJuMjEwMDpyZWQ6 dXNiIiwKLQkJLnN0YXRlID0gUENBOTUzMl9PRkYsCi0JCS50eXBlID0gUENBOTUzMl9UWVBFX0xF RCwKLQl9LAotCi0JewkudHlwZSA9IFBDQTk1MzJfVFlQRV9OT05FIH0sIC8qIHBvd2VyIE9GRiBn cGlvICovCi0JewkudHlwZSA9IFBDQTk1MzJfVFlQRV9OT05FIH0sIC8qIHJlc2V0IGdwaW8gKi8K LQl7CS50eXBlID0gUENBOTUzMl9UWVBFX05PTkUgfSwKLQl7CS50eXBlID0gUENBOTUzMl9UWVBF X05PTkUgfSwKLQotCXsJLnR5cGUgPSBQQ0E5NTMyX1RZUEVfTk9ORSB9LAotCXsJLm5hbWUgPSAi bjIxMDA6b3JhbmdlOnN5c3RlbSIsCi0JCS5zdGF0ZSA9IFBDQTk1MzJfT0ZGLAotCQkudHlwZSA9 IFBDQTk1MzJfVFlQRV9MRUQsCi0JfSwKLQl7CS5uYW1lID0gIm4yMTAwOnJlZDpzeXN0ZW0iLAot CQkuc3RhdGUgPSBQQ0E5NTMyX09GRiwKLQkJLnR5cGUgPSBQQ0E5NTMyX1RZUEVfTEVELAotCX0s Ci0JewkubmFtZSA9ICJOMjEwMCBiZWVwZXIiICAsCi0JCS5zdGF0ZSA9ICBQQ0E5NTMyX09GRiwK LQkJLnR5cGUgPSBQQ0E5NTMyX1RZUEVfTjIxMDBfQkVFUCwKLQl9LAotCX0sCi0JLnBzYyA9IHsg MCwgMCB9LAotCS5wd20gPSB7IDAsIDAgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJk X2luZm8gX19pbml0ZGF0YSBuMjEwMF9pMmNfZGV2aWNlc1tdID0gewotCXsKLQkJSTJDX0JPQVJE X0lORk8oInJzNWMzNzJiIiwgMHgzMiksCi0JfSwKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJmNzUz NzUiLCAweDJlKSwKLQkJLnBsYXRmb3JtX2RhdGEgPSAmbjIxMDBfZjc1Mzc1cywKLQl9LAotCXsK LQkJSTJDX0JPQVJEX0lORk8oInBjYTk1MzIiLCAweDYwKSwKLQkJLnBsYXRmb3JtX2RhdGEgPSAm bjIxMDBfbGVkcywKLQl9LAotfTsKLQotLyoKLSAqIFB1bGwgUENBOTUzMiBHUElPICM4IGxvdyB0 byBwb3dlciBvZmYgdGhlIG1hY2hpbmUuCi0gKi8KLXN0YXRpYyB2b2lkIG4yMTAwX3Bvd2VyX29m Zih2b2lkKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KLQkvKiBTdGFydCBjb25kaXRpb24s IEkyQyBhZGRyZXNzIG9mIFBDQTk1MzIsIHdyaXRlIHRyYW5zYWN0aW9uLiAgKi8KLQkqSU9QM1hY X0lEQlIwID0gMHhjMDsKLQkqSU9QM1hYX0lDUjAgPSAweGU5OwotCW1kZWxheSgxKTsKLQotCS8q IFdyaXRlIGFkZHJlc3MgMHgwOC4gICovCi0JKklPUDNYWF9JREJSMCA9IDB4MDg7Ci0JKklPUDNY WF9JQ1IwID0gMHhlODsKLQltZGVsYXkoMSk7Ci0KLQkvKiBXcml0ZSBkYXRhIDB4MDEsIHN0b3Ag Y29uZGl0aW9uLiAgKi8KLQkqSU9QM1hYX0lEQlIwID0gMHgwMTsKLQkqSU9QM1hYX0lDUjAgPSAw eGVhOwotCi0Jd2hpbGUgKDEpCi0JCTsKLX0KLQotc3RhdGljIHZvaWQgbjIxMDBfcmVzdGFydChl bnVtIHJlYm9vdF9tb2RlIG1vZGUsIGNvbnN0IGNoYXIgKmNtZCkKLXsKLQlpbnQgcmV0OwotCi0J cmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE4yMTAwX0hBUkRXQVJFX1JFU0VULCAwKTsKLQlp ZiAocmV0KSB7Ci0JCXByX2NyaXQoImNvdWxkIG5vdCBkcml2ZSByZXNldCBHUElPIGxvd1xuIik7 Ci0JCXJldHVybjsKLQl9Ci0JLyogV2FpdCBmb3IgcmVzZXQgdG8gaGFwcGVuICovCi0Jd2hpbGUg KDEpCi0JCTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcG93ZXJfYnV0dG9uX3Bv bGxfdGltZXI7Ci0KLXN0YXRpYyB2b2lkIHBvd2VyX2J1dHRvbl9wb2xsKHN0cnVjdCB0aW1lcl9s aXN0ICp1bnVzZWQpCi17Ci0JaWYgKGdwaW9fZ2V0X3ZhbHVlKE4yMTAwX1BPV0VSX0JVVFRPTikg PT0gMCkgewotCQljdHJsX2FsdF9kZWwoKTsKLQkJcmV0dXJuOwotCX0KLQotCXBvd2VyX2J1dHRv bl9wb2xsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMTApOwotCWFkZF90aW1lcigm cG93ZXJfYnV0dG9uX3BvbGxfdGltZXIpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBuMjEwMF9y ZXF1ZXN0X2dwaW9zKHZvaWQpCi17Ci0JaW50IHJldDsKLQotCWlmICghbWFjaGluZV9pc19uMjEw MCgpKQotCQlyZXR1cm4gMDsKLQotCXJldCA9IGdwaW9fcmVxdWVzdChOMjEwMF9IQVJEV0FSRV9S RVNFVCwgInJlc2V0Iik7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCJjb3VsZCBub3QgcmVxdWVzdCBy ZXNldCBHUElPXG4iKTsKLQotCXJldCA9IGdwaW9fcmVxdWVzdChOMjEwMF9QT1dFUl9CVVRUT04s ICJwb3dlciIpOwotCWlmIChyZXQpCi0JCXByX2VycigiY291bGQgbm90IHJlcXVlc3QgcG93ZXIg R1BJT1xuIik7Ci0JZWxzZSB7Ci0JCXJldCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KE4yMTAwX1BP V0VSX0JVVFRPTik7Ci0JCWlmIChyZXQpCi0JCQlwcl9lcnIoImNvdWxkIG5vdCBzZXQgcG93ZXIg R1BJTyBhcyBpbnB1dFxuIik7Ci0JfQotCS8qIFNldCB1cCBwb3dlciBidXR0b24gcG9sbCB0aW1l ciAqLwotCXRpbWVyX3NldHVwKCZwb3dlcl9idXR0b25fcG9sbF90aW1lciwgcG93ZXJfYnV0dG9u X3BvbGwsIDApOwotCXBvd2VyX2J1dHRvbl9wb2xsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsg KEhaIC8gMTApOwotCWFkZF90aW1lcigmcG93ZXJfYnV0dG9uX3BvbGxfdGltZXIpOwotCXJldHVy biAwOwotfQotZGV2aWNlX2luaXRjYWxsKG4yMTAwX3JlcXVlc3RfZ3Bpb3MpOwotCi1zdGF0aWMg dm9pZCBfX2luaXQgbjIxMDBfaW5pdF9tYWNoaW5lKHZvaWQpCi17Ci0JcmVnaXN0ZXJfaW9wMzJ4 X2dwaW8oKTsKLQlncGlvZF9hZGRfbG9va3VwX3RhYmxlKCZpb3AzeHhfaTJjMF9ncGlvX2xvb2t1 cCk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpb3AzeHhfaTJjMF9kZXZpY2UpOwotCXBs YXRmb3JtX2RldmljZV9yZWdpc3RlcigmbjIxMDBfZmxhc2hfZGV2aWNlKTsKLQlwbGF0Zm9ybV9k ZXZpY2VfcmVnaXN0ZXIoJm4yMTAwX3NlcmlhbF9kZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV9y ZWdpc3RlcigmaW9wM3h4X2RtYV8wX2NoYW5uZWwpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rl cigmaW9wM3h4X2RtYV8xX2NoYW5uZWwpOwotCi0JaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwg bjIxMDBfaTJjX2RldmljZXMsCi0JCUFSUkFZX1NJWkUobjIxMDBfaTJjX2RldmljZXMpKTsKLQot CXBtX3Bvd2VyX29mZiA9IG4yMTAwX3Bvd2VyX29mZjsKLX0KLQotTUFDSElORV9TVEFSVChOMjEw MCwgIlRoZWN1cyBOMjEwMCIpCi0JLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1 eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCi0JLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCi0JLm5yX2ly cXMJPSBJT1AzMlhfTlJfSVJRUywKLQkubWFwX2lvCQk9IG4yMTAwX21hcF9pbywKLQkuaW5pdF9p cnEJPSBpb3AzMnhfaW5pdF9pcnEsCi0JLmluaXRfdGltZQk9IG4yMTAwX3RpbWVyX2luaXQsCi0J LmluaXRfbWFjaGluZQk9IG4yMTAwX2luaXRfbWFjaGluZSwKLQkucmVzdGFydAk9IG4yMTAwX3Jl c3RhcnQsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIx MDAuaCBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDBiOTdiOTQwZDNlNy4uMDAwMDAwMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gt aW9wMzJ4L24yMTAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwotLyoKLSAqIFRoZWN1cyBOMjEwMCBib2FyZCBy ZWdpc3RlcnMKLSAqLwotCi0jaWZuZGVmIF9fTjIxMDBfSAotI2RlZmluZSBfX04yMTAwX0gKLQot I2RlZmluZSBOMjEwMF9VQVJUCQkweGZlODAwMDAwCS8qIFVBUlQgKi8KLQotI2RlZmluZSBOMjEw MF9DT1BZX0JVVFRPTglJT1AzWFhfR1BJT19MSU5FKDApCi0jZGVmaW5lIE4yMTAwX1BDQTk1MzJf UkVTRVQJSU9QM1hYX0dQSU9fTElORSgyKQotI2RlZmluZSBOMjEwMF9SRVNFVF9CVVRUT04JSU9Q M1hYX0dQSU9fTElORSgzKQotI2RlZmluZSBOMjEwMF9IQVJEV0FSRV9SRVNFVAlJT1AzWFhfR1BJ T19MSU5FKDQpCi0jZGVmaW5lIE4yMTAwX1BPV0VSX0JVVFRPTglJT1AzWFhfR1BJT19MSU5FKDUp Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9wY2kuYyBiL2Fy Y2gvYXJtL21hY2gtaW9wMzJ4L3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3 YTIxNWQyZWU3ZTIuLjAwMDAwMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9wY2ku YworKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogYXJjaC9hcm0vcGxhdC1pb3AvcGNpLmMKLSAqCi0g KiBQQ0kgc3VwcG9ydCBmb3IgdGhlIEludGVsIElPUDMyWCBhbmQgSU9QMzNYIHByb2Nlc3NvcnMK LSAqCi0gKiBBdXRob3I6IFJvcnkgQm9sdCA8cm9yeWJvbHRAcGFjYmVsbC5uZXQ+Ci0gKiBDb3B5 cmlnaHQgKEMpIDIwMDIgUm9yeSBCb2x0Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5o PgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNs dWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51 eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4K LSNpbmNsdWRlIDxhc20vc2lnbmFsLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+Ci0jaW5j bHVkZSAiaGFyZHdhcmUuaCIKLSNpbmNsdWRlICJpb3AzeHguaCIKLQotLy8gI2RlZmluZSBERUJV RwotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgIERCRyh4Li4uKSBwcmludGsoeCkKLSNlbHNlCi0j ZGVmaW5lICBEQkcoeC4uLikgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLS8qCi0gKiBUaGlz IHJvdXRpbmUgYnVpbGRzIGVpdGhlciBhIHR5cGUwIG9yIHR5cGUxIGNvbmZpZ3VyYXRpb24gY29t bWFuZC4gIElmIHRoZQotICogYnVzIGlzIG9uIHRoZSA4MDN4eCB0aGVuIGEgdHlwZTAgbWFkZSwg ZWxzZSBhIHR5cGUxIGlzIGNyZWF0ZWQuCi0gKi8KLXN0YXRpYyB1MzIgaW9wM3h4X2NmZ19hZGRy ZXNzKHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbiwgaW50IHdoZXJlKQotewotCXN0cnVj dCBwY2lfc3lzX2RhdGEgKnN5cyA9IGJ1cy0+c3lzZGF0YTsKLQl1MzIgYWRkcjsKLQotCWlmIChz eXMtPmJ1c25yID09IGJ1cy0+bnVtYmVyKQotCQlhZGRyID0gMSA8PCAoUENJX1NMT1QoZGV2Zm4p ICsgMTYpIHwgKFBDSV9TTE9UKGRldmZuKSA8PCAxMSk7Ci0JZWxzZQotCQlhZGRyID0gYnVzLT5u dW1iZXIgPDwgMTYgfCBQQ0lfU0xPVChkZXZmbikgPDwgMTEgfCAxOwotCi0JYWRkciB8PQlQQ0lf RlVOQyhkZXZmbikgPDwgOCB8ICh3aGVyZSAmIH4zKTsKLQotCXJldHVybiBhZGRyOwotfQotCi0v KgotICogVGhpcyByb3V0aW5lIGNoZWNrcyB0aGUgc3RhdHVzIG9mIHRoZSBsYXN0IGNvbmZpZ3Vy YXRpb24gY3ljbGUuICBJZiBhbiBlcnJvcgotICogd2FzIGRldGVjdGVkIGl0IHJldHVybnMgYSAx LCBlbHNlIGl0IHJldHVybnMgYSAwLiAgVGhlIGVycm9ycyBiZWluZyBjaGVja2VkCi0gKiBhcmUg cGFyaXR5LCBtYXN0ZXIgYWJvcnQsIHRhcmdldCBhYm9ydCAobWFzdGVyIGFuZCB0YXJnZXQpLiAg VGhlc2UgdHlwZXMgb2YKLSAqIGVycm9ycyBvY2N1ciBkdXJpbmcgYSBjb25maWcgY3ljbGUgd2hl cmUgdGhlcmUgaXMgbm8gZGV2aWNlLCBsaWtlIGR1cmluZwotICogdGhlIGRpc2NvdmVyeSBzdGFn ZS4KLSAqLwotc3RhdGljIGludCBpb3AzeHhfcGNpX3N0YXR1cyh2b2lkKQotewotCXVuc2lnbmVk IGludCBzdGF0dXM7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKgotCSAqIENoZWNrIHRoZSBzdGF0dXMg cmVnaXN0ZXJzLgotCSAqLwotCXN0YXR1cyA9ICpJT1AzWFhfQVRVU1I7Ci0JaWYgKHN0YXR1cyAm IDB4ZjkwMCkgewotCQlEQkcoIlx0XHRcdFBDSTogUDAgLSBzdGF0dXMgPSAweCUwOHhcbiIsIHN0 YXR1cyk7Ci0JCSpJT1AzWFhfQVRVU1IgPSBzdGF0dXMgJiAweGY5MDA7Ci0JCXJldCA9IDE7Ci0J fQotCi0Jc3RhdHVzID0gKklPUDNYWF9BVFVJU1I7Ci0JaWYgKHN0YXR1cyAmIDB4Njc5Zikgewot CQlEQkcoIlx0XHRcdFBDSTogUDEgLSBzdGF0dXMgPSAweCUwOHhcbiIsIHN0YXR1cyk7Ci0JCSpJ T1AzWFhfQVRVSVNSID0gc3RhdHVzICYgMHg2NzlmOwotCQlyZXQgPSAxOwotCX0KLQotCXJldHVy biByZXQ7Ci19Ci0KLS8qCi0gKiBTaW1wbHkgd3JpdGUgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgYW5k IHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24KLSAqIGRhdGEuICBOb3RlIHRoYXQgdGhlIDQgbm9wcyBl bnN1cmUgdGhhdCB3ZSBhcmUgYWJsZSB0byBoYW5kbGUKLSAqIGEgZGVsYXllZCBhYm9ydCAoaW4g dGhlb3J5LikKLSAqLwotc3RhdGljIHUzMiBpb3AzeHhfcmVhZCh1bnNpZ25lZCBsb25nIGFkZHIp Ci17Ci0JdTMyIHZhbDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkic3RyCSUxLCBbJTJd XG5cdCIKLQkJImxkcgklMCwgWyUzXVxuXHQiCi0JCSJub3Bcblx0IgotCQkibm9wXG5cdCIKLQkJ Im5vcFxuXHQiCi0JCSJub3Bcblx0IgotCQk6ICI9ciIgKHZhbCkKLQkJOiAiciIgKGFkZHIpLCAi ciIgKElPUDNYWF9PQ0NBUiksICJyIiAoSU9QM1hYX09DQ0RSKSk7Ci0KLQlyZXR1cm4gdmFsOwot fQotCi0vKgotICogVGhlIHJlYWQgcm91dGluZXMgbXVzdCBjaGVjayB0aGUgZXJyb3Igc3RhdHVz IG9mIHRoZSBsYXN0IGNvbmZpZ3VyYXRpb24KLSAqIGN5Y2xlLiAgSWYgdGhlcmUgd2FzIGFuIGVy cm9yLCB0aGUgcm91dGluZSByZXR1cm5zIGFsbCBoZXggZidzLgotICovCi1zdGF0aWMgaW50Ci1p b3AzeHhfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZu LCBpbnQgd2hlcmUsCi0JCWludCBzaXplLCB1MzIgKnZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcg YWRkciA9IGlvcDN4eF9jZmdfYWRkcmVzcyhidXMsIGRldmZuLCB3aGVyZSk7Ci0JdTMyIHZhbCA9 IGlvcDN4eF9yZWFkKGFkZHIpID4+ICgod2hlcmUgJiAzKSAqIDgpOwotCi0JaWYgKGlvcDN4eF9w Y2lfc3RhdHVzKCkpCi0JCXZhbCA9IDB4ZmZmZmZmZmY7Ci0KLQkqdmFsdWUgPSB2YWw7Ci0KLQly ZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50Ci1pb3AzeHhfd3JpdGVf Y29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJl LAotCQlpbnQgc2l6ZSwgdTMyIHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgYWRkciA9IGlvcDN4 eF9jZmdfYWRkcmVzcyhidXMsIGRldmZuLCB3aGVyZSk7Ci0JdTMyIHZhbDsKLQotCWlmIChzaXpl ICE9IDQpIHsKLQkJdmFsID0gaW9wM3h4X3JlYWQoYWRkcik7Ci0JCWlmIChpb3AzeHhfcGNpX3N0 YXR1cygpKQotCQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQotCQl3aGVyZSA9ICh3aGVy ZSAmIDMpICogODsKLQotCQlpZiAoc2l6ZSA9PSAxKQotCQkJdmFsICY9IH4oMHhmZiA8PCB3aGVy ZSk7Ci0JCWVsc2UKLQkJCXZhbCAmPSB+KDB4ZmZmZiA8PCB3aGVyZSk7Ci0KLQkJKklPUDNYWF9P Q0NEUiA9IHZhbCB8IHZhbHVlIDw8IHdoZXJlOwotCX0gZWxzZSB7Ci0JCWFzbSB2b2xhdGlsZSgK LQkJCSJzdHIJJTEsIFslMl1cblx0IgotCQkJInN0cgklMCwgWyUzXVxuXHQiCi0JCQkibm9wXG5c dCIKLQkJCSJub3Bcblx0IgotCQkJIm5vcFxuXHQiCi0JCQkibm9wXG5cdCIKLQkJCToKLQkJCTog InIiICh2YWx1ZSksICJyIiAoYWRkciksCi0JCQkgICJyIiAoSU9QM1hYX09DQ0FSKSwgInIiIChJ T1AzWFhfT0NDRFIpKTsKLQl9Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1z dHJ1Y3QgcGNpX29wcyBpb3AzeHhfb3BzID0gewotCS5yZWFkCT0gaW9wM3h4X3JlYWRfY29uZmln LAotCS53cml0ZQk9IGlvcDN4eF93cml0ZV9jb25maWcsCi19OwotCi0vKgotICogV2hlbiBhIFBD SSBkZXZpY2UgZG9lcyBub3QgZXhpc3QgZHVyaW5nIGNvbmZpZyBjeWNsZXMsIHRoZSA4MDIwMCBn ZXRzIGEKLSAqIGJ1cyBlcnJvciBpbnN0ZWFkIG9mIHJldHVybmluZyAweGZmZmZmZmZmLiBUaGlz IGhhbmRsZXIgc2ltcGx5IHJldHVybnMuCi0gKi8KLXN0YXRpYyBpbnQKLWlvcDN4eF9wY2lfYWJv cnQodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZnNyLCBzdHJ1Y3QgcHRfcmVncyAq cmVncykKLXsKLQlEQkcoIlBDSSBhYm9ydDogYWRkcmVzcyA9IDB4JTA4bHggZnNyID0gMHglMDN4 IFBDID0gMHglMDhseCBMUiA9IDB4JTA4bHhcbiIsCi0JCWFkZHIsIGZzciwgcmVncy0+QVJNX3Bj LCByZWdzLT5BUk1fbHIpOwotCi0JLyoKLQkgKiBJZiBpdCB3YXMgYW4gaW1wcmVjaXNlIGFib3J0 LCB0aGVuIHdlIG5lZWQgdG8gY29ycmVjdCB0aGUKLQkgKiByZXR1cm4gYWRkcmVzcyB0byBiZSBf YWZ0ZXJfIHRoZSBpbnN0cnVjdGlvbi4KLQkgKi8KLQlpZiAoZnNyICYgKDEgPDwgMTApKQotCQly ZWdzLT5BUk1fcGMgKz0gNDsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaW9wM3h4X3BjaV9zZXR1 cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKLXsKLQlzdHJ1Y3QgcmVzb3VyY2Ug KnJlczsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVhbGlvOwotCi0JaWYgKG5yICE9IDApCi0JCXJldHVy biAwOwotCi0JcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSwgR0ZQX0tFUk5F TCk7Ci0JaWYgKCFyZXMpCi0JCXBhbmljKCJQQ0k6IHVuYWJsZSB0byBhbGxvYyByZXNvdXJjZXMi KTsKLQotCXJlcy0+c3RhcnQgPSBJT1AzWFhfUENJX0xPV0VSX01FTV9QQTsKLQlyZXMtPmVuZCAg ID0gSU9QM1hYX1BDSV9MT1dFUl9NRU1fUEEgKyBJT1AzWFhfUENJX01FTV9XSU5ET1dfU0laRSAt IDE7Ci0JcmVzLT5uYW1lICA9ICJJT1AzWFggUENJIE1lbW9yeSBTcGFjZSI7Ci0JcmVzLT5mbGFn cyA9IElPUkVTT1VSQ0VfTUVNOwotCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCBy ZXMpOwotCi0JLyoKLQkgKiBVc2Ugd2hhdGV2ZXIgdHJhbnNsYXRpb24gaXMgYWxyZWFkeSBzZXR1 cC4KLQkgKi8KLQlzeXMtPm1lbV9vZmZzZXQgPSBJT1AzWFhfUENJX0xPV0VSX01FTV9QQSAtICpJ T1AzWFhfT01XVFZSMDsKLQotCXBjaV9hZGRfcmVzb3VyY2Vfb2Zmc2V0KCZzeXMtPnJlc291cmNl cywgcmVzLCBzeXMtPm1lbV9vZmZzZXQpOwotCi0JcmVhbGlvLnN0YXJ0ID0gMDsKLQlyZWFsaW8u ZW5kID0gcmVhbGlvLnN0YXJ0ICsgU1pfNjRLIC0gMTsKLQlwY2lfcmVtYXBfaW9zcGFjZSgmcmVh bGlvLCBJT1AzWFhfUENJX0xPV0VSX0lPX1BBKTsKLQotCXJldHVybiAxOwotfQotCi12b2lkIF9f aW5pdCBpb3AzeHhfYXR1X3NldHVwKHZvaWQpCi17Ci0JLyogQkFSIDAgKCBEaXNhYmxlZCApICov Ci0JKklPUDNYWF9JQVVCQVIwID0gMHgwOwotCSpJT1AzWFhfSUFCQVIwICA9IDB4MDsKLQkqSU9Q M1hYX0lBVFZSMCAgPSAweDA7Ci0JKklPUDNYWF9JQUxSMCAgID0gMHgwOwotCi0JLyogQkFSIDEg KCBEaXNhYmxlZCApICovCi0JKklPUDNYWF9JQVVCQVIxID0gMHgwOwotCSpJT1AzWFhfSUFCQVIx ICA9IDB4MDsKLQkqSU9QM1hYX0lBTFIxICAgPSAweDA7Ci0KLQkvKiBCQVIgMiAoMToxIG1hcHBp bmcgd2l0aCBQaHlzaWNhbCBSQU0pICovCi0JLyogU2V0IGxpbWl0IGFuZCBlbmFibGUgKi8KLQkq SU9QM1hYX0lBTFIyID0gfigodTMyKUlPUDNYWF9NQVhfUkFNX1NJWkUgLSAxKSAmIH4weDE7Ci0J KklPUDNYWF9JQVVCQVIyID0gMHgwOwotCi0JLyogQWxpZ24gdGhlIGluYm91bmQgYmFyIHdpdGgg dGhlIGJhc2Ugb2YgbWVtb3J5ICovCi0JKklPUDNYWF9JQUJBUjIgPSBQSFlTX09GRlNFVCB8Ci0J CQkgICAgICAgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCB8Ci0JCQkgICAgICAgUENJX0JB U0VfQUREUkVTU19NRU1fUFJFRkVUQ0g7Ci0KLQkqSU9QM1hYX0lBVFZSMiA9IFBIWVNfT0ZGU0VU OwotCi0JLyogT3V0Ym91bmQgd2luZG93IDAgKi8KLQkqSU9QM1hYX09NV1RWUjAgPSBJT1AzWFhf UENJX0xPV0VSX01FTV9CQTsKLQkqSU9QM1hYX09VTVdUVlIwID0gMDsKLQotCS8qIE91dGJvdW5k IHdpbmRvdyAxICovCi0JKklPUDNYWF9PTVdUVlIxID0gSU9QM1hYX1BDSV9MT1dFUl9NRU1fQkEg KwotCQkJICBJT1AzWFhfUENJX01FTV9XSU5ET1dfU0laRSAvIDI7Ci0JKklPUDNYWF9PVU1XVFZS MSA9IDA7Ci0KLQkvKiBCQVIgMyAoIERpc2FibGVkICkgKi8KLQkqSU9QM1hYX0lBVUJBUjMgPSAw eDA7Ci0JKklPUDNYWF9JQUJBUjMgID0gMHgwOwotCSpJT1AzWFhfSUFUVlIzICA9IDB4MDsKLQkq SU9QM1hYX0lBTFIzICAgPSAweDA7Ci0KLQkvKiBTZXR1cCB0aGUgSS9PIEJhcgotCSAqLwotCSpJ T1AzWFhfT0lPV1RWUiA9IElPUDNYWF9QQ0lfTE9XRVJfSU9fQkE7Ci0KLQkvKiBFbmFibGUgaW5i b3VuZCBhbmQgb3V0Ym91bmQgY3ljbGVzCi0JICovCi0JKklPUDNYWF9BVFVDTUQgfD0gUENJX0NP TU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwKLQkJCSAgICAgICBQQ0lfQ09NTUFO RF9QQVJJVFkgfCBQQ0lfQ09NTUFORF9TRVJSOwotCSpJT1AzWFhfQVRVQ1IgfD0gSU9QM1hYX0FU VUNSX09VVF9FTjsKLX0KLQotdm9pZCBfX2luaXQgaW9wM3h4X2F0dV9kaXNhYmxlKHZvaWQpCi17 Ci0JKklPUDNYWF9BVFVDTUQgPSAwOwotCSpJT1AzWFhfQVRVQ1IgPSAwOwotCi0JLyogd2FpdCBm b3IgY3ljbGVzIHRvIHF1aWVzY2UgKi8KLQl3aGlsZSAoKklPUDNYWF9QQ1NSICYgKElPUDNYWF9Q Q1NSX09VVF9RX0JVU1kgfAotCQkJCSAgICAgSU9QM1hYX1BDU1JfSU5fUV9CVVNZKSkKLQkJY3B1 X3JlbGF4KCk7Ci0KLQkvKiBCQVIgMCAoIERpc2FibGVkICkgKi8KLQkqSU9QM1hYX0lBVUJBUjAg PSAweDA7Ci0JKklPUDNYWF9JQUJBUjAgID0gMHgwOwotCSpJT1AzWFhfSUFUVlIwICA9IDB4MDsK LQkqSU9QM1hYX0lBTFIwICAgPSAweDA7Ci0KLQkvKiBCQVIgMSAoIERpc2FibGVkICkgKi8KLQkq SU9QM1hYX0lBVUJBUjEgPSAweDA7Ci0JKklPUDNYWF9JQUJBUjEgID0gMHgwOwotCSpJT1AzWFhf SUFMUjEgICA9IDB4MDsKLQotCS8qIEJBUiAyICggRGlzYWJsZWQgKSAqLwotCSpJT1AzWFhfSUFV QkFSMiA9IDB4MDsKLQkqSU9QM1hYX0lBQkFSMiAgPSAweDA7Ci0JKklPUDNYWF9JQVRWUjIgID0g MHgwOwotCSpJT1AzWFhfSUFMUjIgICA9IDB4MDsKLQotCS8qIEJBUiAzICggRGlzYWJsZWQgKSAq LwotCSpJT1AzWFhfSUFVQkFSMyA9IDB4MDsKLQkqSU9QM1hYX0lBQkFSMyAgPSAweDA7Ci0JKklP UDNYWF9JQVRWUjMgID0gMHgwOwotCSpJT1AzWFhfSUFMUjMgICA9IDB4MDsKLQotCS8qIENsZWFy IHRoZSBvdXRib3VuZCB3aW5kb3dzICovCi0JKklPUDNYWF9PSU9XVFZSICA9IDA7Ci0KLQkvKiBP dXRib3VuZCB3aW5kb3cgMCAqLwotCSpJT1AzWFhfT01XVFZSMCA9IDA7Ci0JKklPUDNYWF9PVU1X VFZSMCA9IDA7Ci0KLQkvKiBPdXRib3VuZCB3aW5kb3cgMSAqLwotCSpJT1AzWFhfT01XVFZSMSA9 IDA7Ci0JKklPUDNYWF9PVU1XVFZSMSA9IDA7Ci19Ci0KLS8qIEZsYWcgdG8gZGV0ZXJtaW5lIHdo ZXRoZXIgdGhlIEFUVSBpcyBpbml0aWFsaXplZCBhbmQgdGhlIFBDSSBidXMgc2Nhbm5lZCAqLwot aW50IGluaXRfYXR1OwotCi1pbnQgaW9wM3h4X2dldF9pbml0X2F0dSh2b2lkKSB7Ci0JLyogY2hl Y2sgaWYgZGVmYXVsdCBoYXMgYmVlbiBvdmVycmlkZGVuICovCi0JaWYgKGluaXRfYXR1ICE9IElP UDNYWF9JTklUX0FUVV9ERUZBVUxUKQotCQlyZXR1cm4gaW5pdF9hdHU7Ci0JZWxzZQotCQlyZXR1 cm4gSU9QM1hYX0lOSVRfQVRVX0RJU0FCTEU7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBpb3Az eHhfYXR1X2RlYnVnKHZvaWQpCi17Ci0JREJHKCJQQ0k6IEludGVsIElPUDN4eCBQQ0kgaW5pdC5c biIpOwotCURCRygiUENJOiBPdXRib3VuZCBtZW1vcnkgd2luZG93IDA6IFBDSSAweCUwOHglMDh4 XG4iLAotCQkqSU9QM1hYX09VTVdUVlIwLCAqSU9QM1hYX09NV1RWUjApOwotCURCRygiUENJOiBP dXRib3VuZCBtZW1vcnkgd2luZG93IDE6IFBDSSAweCUwOHglMDh4XG4iLAotCQkqSU9QM1hYX09V TVdUVlIxLCAqSU9QM1hYX09NV1RWUjEpOwotCURCRygiUENJOiBPdXRib3VuZCBJTyB3aW5kb3c6 IFBDSSAweCUwOHhcbiIsCi0JCSpJT1AzWFhfT0lPV1RWUik7Ci0KLQlEQkcoIlBDSTogSW5ib3Vu ZCBtZW1vcnkgd2luZG93IDA6IFBDSSAweCUwOHglMDh4IDB4JTA4eCAtPiAweCUwOHhcbiIsCi0J CSpJT1AzWFhfSUFVQkFSMCwgKklPUDNYWF9JQUJBUjAsICpJT1AzWFhfSUFMUjAsICpJT1AzWFhf SUFUVlIwKTsKLQlEQkcoIlBDSTogSW5ib3VuZCBtZW1vcnkgd2luZG93IDE6IFBDSSAweCUwOHgl MDh4IDB4JTA4eFxuIiwKLQkJKklPUDNYWF9JQVVCQVIxLCAqSU9QM1hYX0lBQkFSMSwgKklPUDNY WF9JQUxSMSk7Ci0JREJHKCJQQ0k6IEluYm91bmQgbWVtb3J5IHdpbmRvdyAyOiBQQ0kgMHglMDh4 JTA4eCAweCUwOHggLT4gMHglMDh4XG4iLAotCQkqSU9QM1hYX0lBVUJBUjIsICpJT1AzWFhfSUFC QVIyLCAqSU9QM1hYX0lBTFIyLCAqSU9QM1hYX0lBVFZSMik7Ci0JREJHKCJQQ0k6IEluYm91bmQg bWVtb3J5IHdpbmRvdyAzOiBQQ0kgMHglMDh4JTA4eCAweCUwOHggLT4gMHglMDh4XG4iLAotCQkq SU9QM1hYX0lBVUJBUjMsICpJT1AzWFhfSUFCQVIzLCAqSU9QM1hYX0lBTFIzLCAqSU9QM1hYX0lB VFZSMyk7Ci0KLQlEQkcoIlBDSTogRXhwYW5zaW9uIFJPTSB3aW5kb3c6IFBDSSAweCUwOHglMDh4 IDB4JTA4eCAtPiAweCUwOHhcbiIsCi0JCTAsICpJT1AzWFhfRVJCQVIsICpJT1AzWFhfRVJMUiwg KklPUDNYWF9FUlRWUik7Ci0KLQlEQkcoIkFUVTogSU9QM1hYX0FUVUNNRD0weCUwNHhcbiIsICpJ T1AzWFhfQVRVQ01EKTsKLQlEQkcoIkFUVTogSU9QM1hYX0FUVUNSPTB4JTA4eFxuIiwgKklPUDNY WF9BVFVDUik7Ci0KLQlob29rX2ZhdWx0X2NvZGUoMTYrNiwgaW9wM3h4X3BjaV9hYm9ydCwgU0lH QlVTLCAwLCAiaW1wcmVjaXNlIGV4dGVybmFsIGFib3J0Iik7Ci19Ci0KLS8qIGZvciBwbGF0Zm9y bXMgdGhhdCBtaWdodCBiZSBob3N0LWJ1cy1hZGFwdGVycyAqLwotdm9pZCBfX2luaXQgaW9wM3h4 X3BjaV9wcmVpbml0X2NvbmQodm9pZCkKLXsKLQlpZiAoaW9wM3h4X2dldF9pbml0X2F0dSgpID09 IElPUDNYWF9JTklUX0FUVV9FTkFCTEUpIHsKLQkJaW9wM3h4X2F0dV9kaXNhYmxlKCk7Ci0JCWlv cDN4eF9hdHVfc2V0dXAoKTsKLQkJaW9wM3h4X2F0dV9kZWJ1ZygpOwotCX0KLX0KLQotdm9pZCBf X2luaXQgaW9wM3h4X3BjaV9wcmVpbml0KHZvaWQpCi17Ci0JcGNpYmlvc19taW5fbWVtID0gMDsK LQotCWlvcDN4eF9hdHVfZGlzYWJsZSgpOwotCWlvcDN4eF9hdHVfc2V0dXAoKTsKLQlpb3AzeHhf YXR1X2RlYnVnKCk7Ci19Ci0KLS8qIGFsbG93IGluaXRfYXR1IHRvIGJlIHVzZXIgb3ZlcnJpZGRl biAqLwotc3RhdGljIGludCBfX2luaXQgaW9wM3h4X2luaXRfYXR1X3NldHVwKGNoYXIgKnN0cikK LXsKLQlpbml0X2F0dSA9IElPUDNYWF9JTklUX0FUVV9ERUZBVUxUOwotCWlmIChzdHIpIHsKLQkJ d2hpbGUgKCpzdHIgIT0gJ1wwJykgewotCQkJc3dpdGNoICgqc3RyKSB7Ci0JCQljYXNlICd5JzoK LQkJCWNhc2UgJ1knOgotCQkJCWluaXRfYXR1ID0gSU9QM1hYX0lOSVRfQVRVX0VOQUJMRTsKLQkJ CQlicmVhazsKLQkJCWNhc2UgJ24nOgotCQkJY2FzZSAnTic6Ci0JCQkJaW5pdF9hdHUgPSBJT1Az WFhfSU5JVF9BVFVfRElTQUJMRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJywnOgotCQkJY2FzZSAn PSc6Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX0RFQlVHICJcIiVz XCIgbWFsZm9ybWVkIGF0ICIKLQkJCQkJICAgICJjaGFyYWN0ZXI6IFwnJWNcJyIsCi0JCQkJCSAg ICBfX2Z1bmNfXywKLQkJCQkJICAgICpzdHIpOwotCQkJCSooc3RyICsgMSkgPSAnXDAnOwotCQkJ fQotCQkJc3RyKys7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgiaW9wM3h4 X2luaXRfYXR1IiwgaW9wM3h4X2luaXRfYXR1X3NldHVwKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9h cm0vbWFjaC1pb3AzMngvcG11LmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9wbXUuYwpkZWxldGVk IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiYzdhM2NiOGEzLi4wMDAwMDAwMDAwMDAKLS0tIGEv YXJjaC9hcm0vbWFjaC1pb3AzMngvcG11LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBA Ci0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogUE1VIElS USByZWdpc3RyYXRpb24gZm9yIHRoZSBpb3AzeHggeHNjYWxlIFBNVSBmYW1pbGllcy4KLSAqIENv cHlyaWdodCAoQykgMjAxMCBXaWxsIERlYWNvbiwgQVJNIEx0ZC4KLSAqLwotCi0jaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSAiaXJxcy5oIgotCi1zdGF0aWMgc3Ry dWN0IHJlc291cmNlIHBtdV9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJPSBJUlFfSU9QMzJYX0NPUkVf UE1VLAotCS5lbmQJPSBJUlFfSU9QMzJYX0NPUkVfUE1VLAotCS5mbGFncwk9IElPUkVTT1VSQ0Vf SVJRLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcG11X2RldmljZSA9IHsK LQkubmFtZQkJPSAieHNjYWxlLXBtdSIsCi0JLmlkCQk9IC0xLAotCS5yZXNvdXJjZQk9ICZwbXVf cmVzb3VyY2UsCi0JLm51bV9yZXNvdXJjZXMJPSAxLAotfTsKLQotc3RhdGljIGludCBfX2luaXQg aW9wM3h4X3BtdV9pbml0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwbXVf ZGV2aWNlKTsKLQlyZXR1cm4gMDsKLX0KLQotYXJjaF9pbml0Y2FsbChpb3AzeHhfcG11X2luaXQp OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvcmVzdGFydC5jIGIvYXJjaC9hcm0v bWFjaC1pb3AzMngvcmVzdGFydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGZh NTRkM2E3YTguLjAwMDAwMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9yZXN0YXJ0 LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogcmVzdGFydC5jCi0gKgotICogQ29weXJpZ2h0IChD KSAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqLwotI2luY2x1ZGUgPGFzbS9zeXN0 ZW1fbWlzYy5oPgotI2luY2x1ZGUgImhhcmR3YXJlLmgiCi0jaW5jbHVkZSAiaW9wM3h4LmgiCi0K LXZvaWQgaW9wM3h4X3Jlc3RhcnQoZW51bSByZWJvb3RfbW9kZSBtb2RlLCBjb25zdCBjaGFyICpj bWQpCi17Ci0JKklPUDNYWF9QQ1NSID0gMHgzMDsKLQotCS8qIEp1bXAgaW50byBST00gYXQgYWRk cmVzcyAwICovCi0Jc29mdF9yZXN0YXJ0KDApOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFj aC1pb3AzMngvc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L3NldHVwLmMKZGVsZXRlZCBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTgxYzI4YTYzMi4uMDAwMDAwMDAwMDAwCi0tLSBhL2Fy Y2gvYXJtL21hY2gtaW9wMzJ4L3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBA Ci0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogYXJjaC9h cm0vcGxhdC1pb3Avc2V0dXAuYwotICoKLSAqIEF1dGhvcjogTmljb2xhcyBQaXRyZSA8bmljb0Bm bHV4bmljLm5ldD4KLSAqIENvcHlyaWdodCAoQykgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlLCBJ bmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uCi0gKi8KLQotI2lu Y2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFz bS9tYWNoL21hcC5oPgotI2luY2x1ZGUgImlvcDN4eC5oIgotCi0vKgotICogU3RhbmRhcmQgSU8g bWFwcGluZyBmb3IgYWxsIElPUDN4eCBiYXNlZCBzeXN0ZW1zLiAgTm90ZSB0aGF0Ci0gKiB0aGUg SU9QM3h4IE9DQ0RSIG11c3QgYmUgbWFwcGVkIHVuY2FjaGVkIGFuZCB1bmJ1ZmZlcmVkLgotICov Ci1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGlvcDN4eF9zdGRfZGVzY1tdIF9faW5pdGRhdGEgPSB7 Ci0JewkvKiBtZW0gbWFwcGVkIHJlZ2lzdGVycyAqLwotCQkudmlydHVhbAk9IElPUDNYWF9QRVJJ UEhFUkFMX1ZJUlRfQkFTRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElPUDNYWF9QRVJJUEhF UkFMX1BIWVNfQkFTRSksCi0JCS5sZW5ndGgJCT0gSU9QM1hYX1BFUklQSEVSQUxfU0laRSwKLQkJ LnR5cGUJCT0gTVRfVU5DQUNIRUQsCi0JfSwKLX07Ci0KLXZvaWQgX19pbml0IGlvcDN4eF9tYXBf aW8odm9pZCkKLXsKLQlpb3RhYmxlX2luaXQoaW9wM3h4X3N0ZF9kZXNjLCBBUlJBWV9TSVpFKGlv cDN4eF9zdGRfZGVzYykpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvdGlt ZS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvdGltZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCBhZTUzM2I2NmZlZmQuLjAwMDAwMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlv cDMyeC90aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKLS8qCi0gKiBhcmNoL2FybS9wbGF0LWlv cC90aW1lLmMKLSAqCi0gKiBUaW1lciBjb2RlIGZvciBJT1AzMnggYW5kIElPUDMzeCBiYXNlZCBz eXN0ZW1zCi0gKgotICogQXV0aG9yOiBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQG12aXN0YS5jb20+ Ci0gKgotICogQ29weXJpZ2h0IDIwMDItMjAwMyBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAq LwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0 Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNp bmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8 bGludXgvY2xvY2tzb3VyY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+Ci0jaW5j bHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWRfY2xvY2suaD4KLSNp bmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUg PGFzbS9tYWNoL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLQotI2luY2x1ZGUg ImhhcmR3YXJlLmgiCi0jaW5jbHVkZSAiaXJxcy5oIgotCi0vKgotICogTWluaW11bSBjbG9ja3Nv dXJjZS9jbG9ja2V2ZW50IHRpbWVyIHJhbmdlIGluIHNlY29uZHMKLSAqLwotI2RlZmluZSBJT1Bf TUlOX1JBTkdFIDQKLQotLyoKLSAqIElPUCBjbG9ja3NvdXJjZSAoZnJlZS1ydW5uaW5nIHRpbWVy IDEpLgotICovCi1zdGF0aWMgdTY0IG5vdHJhY2UgaW9wX2Nsb2Nrc291cmNlX3JlYWQoc3RydWN0 IGNsb2Nrc291cmNlICp1bnVzZWQpCi17Ci0JcmV0dXJuIDB4ZmZmZmZmZmZ1IC0gcmVhZF90Y3Ix KCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgaW9wX2Nsb2Nrc291cmNlID0gewot CS5uYW1lIAkJPSAiaW9wX3RpbWVyMSIsCi0JLnJhdGluZwkJPSAzMDAsCi0JLnJlYWQJCT0gaW9w X2Nsb2Nrc291cmNlX3JlYWQsCi0JLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCi0JLmZs YWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAotfTsKLQotLyoKLSAqIElPUCBzY2hl ZF9jbG9jaygpIGltcGxlbWVudGF0aW9uIHZpYSBpdHMgY2xvY2tzb3VyY2UuCi0gKi8KLXN0YXRp YyB1NjQgbm90cmFjZSBpb3BfcmVhZF9zY2hlZF9jbG9jayh2b2lkKQotewotCXJldHVybiAweGZm ZmZmZmZmdSAtIHJlYWRfdGNyMSgpOwotfQotCi0vKgotICogSU9QIGNsb2NrZXZlbnRzIChpbnRl cnJ1cHRpbmcgdGltZXIgMCkuCi0gKi8KLXN0YXRpYyBpbnQgaW9wX3NldF9uZXh0X2V2ZW50KHVu c2lnbmVkIGxvbmcgZGVsdGEsCi0JCQkgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICp1 bnVzZWQpCi17Ci0JdTMyIHRtciA9IElPUF9UTVJfUFJJVklMRUdFRCB8IElPUF9UTVJfUkFUSU9f MV8xOwotCi0JQlVHX09OKGRlbHRhID09IDApOwotCXdyaXRlX3RtcjAodG1yICYgfihJT1BfVE1S X0VOIHwgSU9QX1RNUl9SRUxPQUQpKTsKLQl3cml0ZV90Y3IwKGRlbHRhKTsKLQl3cml0ZV90bXIw KCh0bXIgJiB+SU9QX1RNUl9SRUxPQUQpIHwgSU9QX1RNUl9FTik7Ci0KLQlyZXR1cm4gMDsKLX0K LQotc3RhdGljIHVuc2lnbmVkIGxvbmcgdGlja3NfcGVyX2ppZmZ5OwotCi1zdGF0aWMgaW50IGlv cF9zZXRfcGVyaW9kaWMoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewotCXUzMiB0 bXIgPSByZWFkX3RtcjAoKTsKLQotCXdyaXRlX3RtcjAodG1yICYgfklPUF9UTVJfRU4pOwotCXdy aXRlX3RjcjAodGlja3NfcGVyX2ppZmZ5IC0gMSk7Ci0Jd3JpdGVfdHJyMCh0aWNrc19wZXJfamlm ZnkgLSAxKTsKLQl0bXIgfD0gKElPUF9UTVJfUkVMT0FEIHwgSU9QX1RNUl9FTik7Ci0KLQl3cml0 ZV90bXIwKHRtcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW9wX3NldF9vbmVzaG90 KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQl1MzIgdG1yID0gcmVhZF90bXIw KCk7Ci0KLQkvKiAtPnNldF9uZXh0X2V2ZW50IHNldHMgcGVyaW9kIGFuZCBlbmFibGVzIHRpbWVy ICovCi0JdG1yICY9IH4oSU9QX1RNUl9SRUxPQUQgfCBJT1BfVE1SX0VOKTsKLQl3cml0ZV90bXIw KHRtcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW9wX3NodXRkb3duKHN0cnVjdCBj bG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQl1MzIgdG1yID0gcmVhZF90bXIwKCk7Ci0KLQl0 bXIgJj0gfklPUF9UTVJfRU47Ci0Jd3JpdGVfdG1yMCh0bXIpOwotCXJldHVybiAwOwotfQotCi1z dGF0aWMgaW50IGlvcF9yZXN1bWUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewot CXUzMiB0bXIgPSByZWFkX3RtcjAoKTsKLQotCXRtciB8PSBJT1BfVE1SX0VOOwotCXdyaXRlX3Rt cjAodG1yKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZp Y2UgaW9wX2Nsb2NrZXZlbnQgPSB7Ci0JLm5hbWUJCQk9ICJpb3BfdGltZXIwIiwKLQkuZmVhdHVy ZXMJCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfAotCQkJCSAgQ0xPQ0tfRVZUX0ZFQVRfT05F U0hPVCwKLQkucmF0aW5nCQkJPSAzMDAsCi0JLnNldF9uZXh0X2V2ZW50CQk9IGlvcF9zZXRfbmV4 dF9ldmVudCwKLQkuc2V0X3N0YXRlX3NodXRkb3duCT0gaW9wX3NodXRkb3duLAotCS5zZXRfc3Rh dGVfcGVyaW9kaWMJPSBpb3Bfc2V0X3BlcmlvZGljLAotCS50aWNrX3Jlc3VtZQkJPSBpb3BfcmVz dW1lLAotCS5zZXRfc3RhdGVfb25lc2hvdAk9IGlvcF9zZXRfb25lc2hvdCwKLX07Ci0KLXN0YXRp YyBpcnFyZXR1cm5fdAotaW9wX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQp Ci17Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gZGV2X2lkOwotCi0Jd3JpdGVf dGlzcigxKTsKLQlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7 Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlvcF90aWNrX3JhdGU7Ci11bnNpZ25lZCBsb25n IGdldF9pb3BfdGlja19yYXRlKHZvaWQpCi17Ci0JcmV0dXJuIGlvcF90aWNrX3JhdGU7Ci19Ci1F WFBPUlRfU1lNQk9MKGdldF9pb3BfdGlja19yYXRlKTsKLQotdm9pZCBfX2luaXQgaW9wX2luaXRf dGltZSh1bnNpZ25lZCBsb25nIHRpY2tfcmF0ZSkKLXsKLQl1MzIgdGltZXJfY3RsOwotCWludCBp cnEgPSBJUlFfSU9QMzJYX1RJTUVSMDsKLQotCXNjaGVkX2Nsb2NrX3JlZ2lzdGVyKGlvcF9yZWFk X3NjaGVkX2Nsb2NrLCAzMiwgdGlja19yYXRlKTsKLQotCXRpY2tzX3Blcl9qaWZmeSA9IERJVl9S T1VORF9DTE9TRVNUKHRpY2tfcmF0ZSwgSFopOwotCWlvcF90aWNrX3JhdGUgPSB0aWNrX3JhdGU7 Ci0KLQl0aW1lcl9jdGwgPSBJT1BfVE1SX0VOIHwgSU9QX1RNUl9QUklWSUxFR0VEIHwKLQkJCUlP UF9UTVJfUkVMT0FEIHwgSU9QX1RNUl9SQVRJT18xXzE7Ci0KLQkvKgotCSAqIFNldCB1cCBpbnRl cnJ1cHRpbmcgY2xvY2tldmVudCB0aW1lciAwLgotCSAqLwotCXdyaXRlX3RtcjAodGltZXJfY3Rs ICYgfklPUF9UTVJfRU4pOwotCXdyaXRlX3Rpc3IoMSk7Ci0JaWYgKHJlcXVlc3RfaXJxKGlycSwg aW9wX3RpbWVyX2ludGVycnVwdCwgSVJRRl9USU1FUiB8IElSUUZfSVJRUE9MTCwKLQkJCSJJT1Ag VGltZXIgVGljayIsICZpb3BfY2xvY2tldmVudCkpCi0JCXByX2VycigiRmFpbGVkIHRvIHJlcXVl c3QgaXJxKCkgJWQgKElPUCBUaW1lciBUaWNrKVxuIiwgaXJxKTsKLQlpb3BfY2xvY2tldmVudC5j cHVtYXNrID0gY3B1bWFza19vZigwKTsKLQljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVy KCZpb3BfY2xvY2tldmVudCwgdGlja19yYXRlLAotCQkJCQkweGYsIDB4ZmZmZmZmZmUpOwotCi0J LyoKLQkgKiBTZXQgdXAgZnJlZS1ydW5uaW5nIGNsb2Nrc291cmNlIHRpbWVyIDEuCi0JICovCi0J d3JpdGVfdHJyMSgweGZmZmZmZmZmKTsKLQl3cml0ZV90Y3IxKDB4ZmZmZmZmZmYpOwotCXdyaXRl X3RtcjEodGltZXJfY3RsKTsKLQljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmaW9wX2Nsb2Nrc291 cmNlLCB0aWNrX3JhdGUpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25m aWcgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwppbmRleCAyNjRlNzgwYWUzMmUuLmU0ODhl MWI4ZTgwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJp dmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTcyMywxMSArNzIzLDExIEBAIGNvbmZpZyBJMkNf SU1YX0xQSTJDCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtaW14LWxwaTJjLgogCiBjb25maWcgSTJD X0lPUDNYWAotCXRyaXN0YXRlICJJbnRlbCBJT1B4M3h4IGFuZCBJWFA0eHggb24tY2hpcCBJMkMg aW50ZXJmYWNlIgotCWRlcGVuZHMgb24gQVJDSF9JT1AzMlggfHwgQVJDSF9JWFA0WFggfHwgQ09N UElMRV9URVNUCisJdHJpc3RhdGUgIkludGVsIElYUDR4eCBvbi1jaGlwIEkyQyBpbnRlcmZhY2Ui CisJZGVwZW5kcyBvbiBBUkNIX0lYUDRYWCB8fCBDT01QSUxFX1RFU1QKIAloZWxwCiAJICBTYXkg WSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgSUlDIGJ1cyBjb250cm9sbGVyIG9uCi0JICB0 aGUgSW50ZWwgSU9QeDN4eCBJL08gUHJvY2Vzc29ycyBvciBJWFA0eHggTmV0d29yayBQcm9jZXNz b3JzLgorCSAgdGhlIEludGVsIElYUDR4eCBOZXR3b3JrIFByb2Nlc3NvcnMuCiAKIAkgIFRoaXMg ZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUK IAkgIHdpbGwgYmUgY2FsbGVkIGkyYy1pb3AzeHguCi0tIAoyLjI5LjIKCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==