From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9E99CC433DB for ; Fri, 5 Mar 2021 01:24:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6539F65001 for ; Fri, 5 Mar 2021 01:24:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229601AbhCEBYj convert rfc822-to-8bit (ORCPT ); Thu, 4 Mar 2021 20:24:39 -0500 Received: from mail-io1-f44.google.com ([209.85.166.44]:41014 "EHLO mail-io1-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229437AbhCEBYj (ORCPT ); Thu, 4 Mar 2021 20:24:39 -0500 Received: by mail-io1-f44.google.com with SMTP id z13so253376iox.8 for ; Thu, 04 Mar 2021 17:24:39 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=tW3NXvFvBalaTF7h/3KBcn4BZri8iHoiBz7ZbXqYf/I=; b=Ujq3B90Nt05SJocUMKBANqYWI5Pq5ivhoVwqRb5HCSypqSTKgaHRMtiYxnF70rYC/Y 4hdVb9Vyfjy/Cvv6hBf+QGnB+rTZ/2aNOwRAaHhGnU1P/4lu6ceFlp1qsOL6zBYNM8wm FZI2Sd1moqDhPVOFhWa9NI+R0sbK9B/2YWTPKn5NUqwq5EPq0U1Xh5WwgURlXMy4+wSn llZLPv8l/BtKfBYP15L5aha6RUlJohfw+Cs62tCSnf1LMMoAmca3EawIO9TcJwM475Yi PGarYJmkXfSWkfZQsseHmqsUT67bJz9UNhuZ2mCY3J0otCuZop3Cg7UPynz2P0puLJbH yx3w== X-Gm-Message-State: AOAM530Us7RwOa+yOeSkX9deGoYAAdAe6KacJZ7l6Y/y3213cQQW37Fi EeRI8Eat5akK9SnQGzdcjRHca5zG93/vY4ergOs= X-Google-Smtp-Source: ABdhPJyvvjaDk6hmKIpSJxIdwZqNOP92TIMGRUKQRcOdp61Iygkarsv92noUrlyYL1W5DQhBEHg+otWXP2opi2ykWVU= X-Received: by 2002:a5d:81c8:: with SMTP id t8mr6138514iol.38.1614907478757; Thu, 04 Mar 2021 17:24:38 -0800 (PST) MIME-Version: 1.0 References: <20210224113918.957738-1-jay.xu@rock-chips.com> <20210304013342.1106361-1-jay.xu@rock-chips.com> In-Reply-To: <20210304013342.1106361-1-jay.xu@rock-chips.com> From: Kever Yang Date: Fri, 5 Mar 2021 09:24:27 +0800 Message-ID: Subject: Re: [PATCH v3 RESEND] pinctrl: rockchip: add support for rk3568 To: Jianqun Xu Cc: Linus Walleij , Heiko Stuebner , "open list:GPIO SUBSYSTEM" , "open list:ARM/Rockchip SoC..." Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Jianqun Xu 于2021年3月4日周四 上午9:33写道: > > RK3568 SoCs have 5 gpio controllers, each gpio has 32 pins. GPIO supports > set iomux, pull, drive strength, schmitt and slew rate. > > Signed-off-by: Jianqun Xu Patch looks good to me. Reviewed-by: Kever Yang Thanks, - Kever > --- > changes since v2: > - fix mux route grf base for gpio bank 0 > changes since v1: > suggested by Heiko, thank for heiko > - modify _GENMASK to WRITE_MASK_VAL, and add comment for the define > - modify MR_GRF to RK_MUXROUTE_GRF, also for MR_SAME and MR_PMU > - add comment for pull setting for GPIO0_D0-D6 > > drivers/pinctrl/pinctrl-rockchip.c | 319 ++++++++++++++++++++++++++++- > 1 file changed, 317 insertions(+), 2 deletions(-) > > diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c > index aa1a1c850d05..68ae46a2a919 100644 > --- a/drivers/pinctrl/pinctrl-rockchip.c > +++ b/drivers/pinctrl/pinctrl-rockchip.c > @@ -61,8 +61,17 @@ enum rockchip_pinctrl_type { > RK3308, > RK3368, > RK3399, > + RK3568, > }; > > + > +/** > + * Generate a bitmask for setting a value (v) with a write mask bit in hiword > + * register 31:16 area. > + */ > +#define WRITE_MASK_VAL(h, l, v) \ > + (GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l)))) > + > /* > * Encode variants of iomux registers into a type variable > */ > @@ -290,6 +299,25 @@ struct rockchip_pin_bank { > .pull_type[3] = pull3, \ > } > > +#define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG) \ > + { \ > + .bank_num = ID, \ > + .pin = PIN, \ > + .func = FUNC, \ > + .route_offset = REG, \ > + .route_val = VAL, \ > + .route_type = FLAG, \ > + } > + > +#define RK_MUXROUTE_SAME(ID, PIN, FUNC, REG, VAL) \ > + PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_SAME) > + > +#define RK_MUXROUTE_GRF(ID, PIN, FUNC, REG, VAL) \ > + PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_GRF) > + > +#define RK_MUXROUTE_PMU(ID, PIN, FUNC, REG, VAL) \ > + PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_PMU) > + > /** > * struct rockchip_mux_recalced_data: represent a pin iomux data. > * @num: bank number. > @@ -1394,6 +1422,102 @@ static struct rockchip_mux_route_data rk3399_mux_route_data[] = { > }, > }; > > +static struct rockchip_mux_route_data rk3568_mux_route_data[] = { > + RK_MUXROUTE_PMU(0, RK_PB7, 1, 0x0110, WRITE_MASK_VAL(1, 0, 0)), /* PWM0 IO mux M0 */ > + RK_MUXROUTE_PMU(0, RK_PC7, 2, 0x0110, WRITE_MASK_VAL(1, 0, 1)), /* PWM0 IO mux M1 */ > + RK_MUXROUTE_PMU(0, RK_PC0, 1, 0x0110, WRITE_MASK_VAL(3, 2, 0)), /* PWM1 IO mux M0 */ > + RK_MUXROUTE_PMU(0, RK_PB5, 4, 0x0110, WRITE_MASK_VAL(3, 2, 1)), /* PWM1 IO mux M1 */ > + RK_MUXROUTE_PMU(0, RK_PC1, 1, 0x0110, WRITE_MASK_VAL(5, 4, 0)), /* PWM2 IO mux M0 */ > + RK_MUXROUTE_PMU(0, RK_PB6, 4, 0x0110, WRITE_MASK_VAL(5, 4, 1)), /* PWM2 IO mux M1 */ > + RK_MUXROUTE_PMU(0, RK_PB3, 2, 0x0300, WRITE_MASK_VAL(0, 0, 0)), /* CAN0 IO mux M0 */ > + RK_MUXROUTE_GRF(2, RK_PA1, 4, 0x0300, WRITE_MASK_VAL(0, 0, 1)), /* CAN0 IO mux M1 */ > + RK_MUXROUTE_GRF(1, RK_PA1, 3, 0x0300, WRITE_MASK_VAL(2, 2, 0)), /* CAN1 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PC3, 3, 0x0300, WRITE_MASK_VAL(2, 2, 1)), /* CAN1 IO mux M1 */ > + RK_MUXROUTE_GRF(4, RK_PB5, 3, 0x0300, WRITE_MASK_VAL(4, 4, 0)), /* CAN2 IO mux M0 */ > + RK_MUXROUTE_GRF(2, RK_PB2, 4, 0x0300, WRITE_MASK_VAL(4, 4, 1)), /* CAN2 IO mux M1 */ > + RK_MUXROUTE_GRF(4, RK_PC4, 1, 0x0300, WRITE_MASK_VAL(6, 6, 0)), /* HPDIN IO mux M0 */ > + RK_MUXROUTE_GRF(0, RK_PC2, 2, 0x0300, WRITE_MASK_VAL(6, 6, 1)), /* HPDIN IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x0300, WRITE_MASK_VAL(8, 8, 0)), /* GMAC1 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PA7, 3, 0x0300, WRITE_MASK_VAL(8, 8, 1)), /* GMAC1 IO mux M1 */ > + RK_MUXROUTE_GRF(4, RK_PD1, 1, 0x0300, WRITE_MASK_VAL(10, 10, 0)), /* HDMITX IO mux M0 */ > + RK_MUXROUTE_GRF(0, RK_PC7, 1, 0x0300, WRITE_MASK_VAL(10, 10, 1)), /* HDMITX IO mux M1 */ > + RK_MUXROUTE_GRF(0, RK_PB6, 1, 0x0300, WRITE_MASK_VAL(14, 14, 0)), /* I2C2 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PB4, 1, 0x0300, WRITE_MASK_VAL(14, 14, 1)), /* I2C2 IO mux M1 */ > + RK_MUXROUTE_GRF(1, RK_PA0, 1, 0x0304, WRITE_MASK_VAL(0, 0, 0)), /* I2C3 IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PB6, 4, 0x0304, WRITE_MASK_VAL(0, 0, 1)), /* I2C3 IO mux M1 */ > + RK_MUXROUTE_GRF(4, RK_PB2, 1, 0x0304, WRITE_MASK_VAL(2, 2, 0)), /* I2C4 IO mux M0 */ > + RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x0304, WRITE_MASK_VAL(2, 2, 1)), /* I2C4 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PB4, 4, 0x0304, WRITE_MASK_VAL(4, 4, 0)), /* I2C5 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PD0, 2, 0x0304, WRITE_MASK_VAL(4, 4, 1)), /* I2C5 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PB1, 5, 0x0304, WRITE_MASK_VAL(14, 14, 0)), /* PWM8 IO mux M0 */ > + RK_MUXROUTE_GRF(1, RK_PD5, 4, 0x0304, WRITE_MASK_VAL(14, 14, 1)), /* PWM8 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PB2, 5, 0x0308, WRITE_MASK_VAL(0, 0, 0)), /* PWM9 IO mux M0 */ > + RK_MUXROUTE_GRF(1, RK_PD6, 4, 0x0308, WRITE_MASK_VAL(0, 0, 1)), /* PWM9 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PB5, 5, 0x0308, WRITE_MASK_VAL(2, 2, 0)), /* PWM10 IO mux M0 */ > + RK_MUXROUTE_GRF(2, RK_PA1, 2, 0x0308, WRITE_MASK_VAL(2, 2, 1)), /* PWM10 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PB6, 5, 0x0308, WRITE_MASK_VAL(4, 4, 0)), /* PWM11 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PC0, 3, 0x0308, WRITE_MASK_VAL(4, 4, 1)), /* PWM11 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PB7, 2, 0x0308, WRITE_MASK_VAL(6, 6, 0)), /* PWM12 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(6, 6, 1)), /* PWM12 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PC0, 2, 0x0308, WRITE_MASK_VAL(8, 8, 0)), /* PWM13 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PC6, 1, 0x0308, WRITE_MASK_VAL(8, 8, 1)), /* PWM13 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PC4, 1, 0x0308, WRITE_MASK_VAL(10, 10, 0)), /* PWM14 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PC2, 1, 0x0308, WRITE_MASK_VAL(10, 10, 1)), /* PWM14 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(12, 12, 0)), /* PWM15 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PC3, 1, 0x0308, WRITE_MASK_VAL(12, 12, 1)), /* PWM15 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PD2, 3, 0x0308, WRITE_MASK_VAL(14, 14, 0)), /* SDMMC2 IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PA5, 5, 0x0308, WRITE_MASK_VAL(14, 14, 1)), /* SDMMC2 IO mux M1 */ > + RK_MUXROUTE_GRF(0, RK_PB5, 2, 0x030c, WRITE_MASK_VAL(0, 0, 0)), /* SPI0 IO mux M0 */ > + RK_MUXROUTE_GRF(2, RK_PD3, 3, 0x030c, WRITE_MASK_VAL(0, 0, 1)), /* SPI0 IO mux M1 */ > + RK_MUXROUTE_GRF(2, RK_PB5, 3, 0x030c, WRITE_MASK_VAL(2, 2, 0)), /* SPI1 IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PC3, 3, 0x030c, WRITE_MASK_VAL(2, 2, 1)), /* SPI1 IO mux M1 */ > + RK_MUXROUTE_GRF(2, RK_PC1, 4, 0x030c, WRITE_MASK_VAL(4, 4, 0)), /* SPI2 IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PA0, 3, 0x030c, WRITE_MASK_VAL(4, 4, 1)), /* SPI2 IO mux M1 */ > + RK_MUXROUTE_GRF(4, RK_PB3, 4, 0x030c, WRITE_MASK_VAL(6, 6, 0)), /* SPI3 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PC2, 2, 0x030c, WRITE_MASK_VAL(6, 6, 1)), /* SPI3 IO mux M1 */ > + RK_MUXROUTE_GRF(2, RK_PB4, 2, 0x030c, WRITE_MASK_VAL(8, 8, 0)), /* UART1 IO mux M0 */ > + RK_MUXROUTE_GRF(0, RK_PD1, 1, 0x030c, WRITE_MASK_VAL(8, 8, 1)), /* UART1 IO mux M1 */ > + RK_MUXROUTE_GRF(0, RK_PD1, 1, 0x030c, WRITE_MASK_VAL(10, 10, 0)), /* UART2 IO mux M0 */ > + RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x030c, WRITE_MASK_VAL(10, 10, 1)), /* UART2 IO mux M1 */ > + RK_MUXROUTE_GRF(1, RK_PA1, 2, 0x030c, WRITE_MASK_VAL(12, 12, 0)), /* UART3 IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PB7, 4, 0x030c, WRITE_MASK_VAL(12, 12, 1)), /* UART3 IO mux M1 */ > + RK_MUXROUTE_GRF(1, RK_PA6, 2, 0x030c, WRITE_MASK_VAL(14, 14, 0)), /* UART4 IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PB2, 4, 0x030c, WRITE_MASK_VAL(14, 14, 1)), /* UART4 IO mux M1 */ > + RK_MUXROUTE_GRF(2, RK_PA2, 3, 0x0310, WRITE_MASK_VAL(0, 0, 0)), /* UART5 IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PC2, 4, 0x0310, WRITE_MASK_VAL(0, 0, 1)), /* UART5 IO mux M1 */ > + RK_MUXROUTE_GRF(2, RK_PA4, 3, 0x0310, WRITE_MASK_VAL(2, 2, 0)), /* UART6 IO mux M0 */ > + RK_MUXROUTE_GRF(1, RK_PD5, 3, 0x0310, WRITE_MASK_VAL(2, 2, 1)), /* UART6 IO mux M1 */ > + RK_MUXROUTE_GRF(2, RK_PA6, 3, 0x0310, WRITE_MASK_VAL(5, 4, 0)), /* UART7 IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PC4, 4, 0x0310, WRITE_MASK_VAL(5, 4, 1)), /* UART7 IO mux M1 */ > + RK_MUXROUTE_GRF(4, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(5, 4, 2)), /* UART7 IO mux M2 */ > + RK_MUXROUTE_GRF(2, RK_PC5, 3, 0x0310, WRITE_MASK_VAL(6, 6, 0)), /* UART8 IO mux M0 */ > + RK_MUXROUTE_GRF(2, RK_PD7, 4, 0x0310, WRITE_MASK_VAL(6, 6, 1)), /* UART8 IO mux M1 */ > + RK_MUXROUTE_GRF(2, RK_PB0, 3, 0x0310, WRITE_MASK_VAL(9, 8, 0)), /* UART9 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */ > + RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */ > + RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux M1 */ > + RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux M2 */ > + RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux M0 */ > + RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux M1 */ > + RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */ > + RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */ > + RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */ > + RK_MUXROUTE_GRF(4, RK_PA0, 4, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */ > + RK_MUXROUTE_GRF(3, RK_PC4, 5, 0x0314, WRITE_MASK_VAL(1, 0, 2)), /* PDM IO mux M2 */ > + RK_MUXROUTE_GRF(0, RK_PA5, 3, 0x0314, WRITE_MASK_VAL(3, 2, 0)), /* PCIE20 IO mux M0 */ > + RK_MUXROUTE_GRF(2, RK_PD0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 1)), /* PCIE20 IO mux M1 */ > + RK_MUXROUTE_GRF(1, RK_PB0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 2)), /* PCIE20 IO mux M2 */ > + RK_MUXROUTE_GRF(0, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(5, 4, 0)), /* PCIE30X1 IO mux M0 */ > + RK_MUXROUTE_GRF(2, RK_PD2, 4, 0x0314, WRITE_MASK_VAL(5, 4, 1)), /* PCIE30X1 IO mux M1 */ > + RK_MUXROUTE_GRF(1, RK_PA5, 4, 0x0314, WRITE_MASK_VAL(5, 4, 2)), /* PCIE30X1 IO mux M2 */ > + RK_MUXROUTE_GRF(0, RK_PA6, 2, 0x0314, WRITE_MASK_VAL(7, 6, 0)), /* PCIE30X2 IO mux M0 */ > + RK_MUXROUTE_GRF(2, RK_PD4, 4, 0x0314, WRITE_MASK_VAL(7, 6, 1)), /* PCIE30X2 IO mux M1 */ > + RK_MUXROUTE_GRF(4, RK_PC2, 4, 0x0314, WRITE_MASK_VAL(7, 6, 2)), /* PCIE30X2 IO mux M2 */ > +}; > + > static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin, > int mux, u32 *loc, u32 *reg, u32 *value) > { > @@ -2102,6 +2226,94 @@ static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, > *bit = (pin_num % 8) * 2; > } > > +#define RK3568_SR_PMU_OFFSET 0x60 > +#define RK3568_SR_GRF_OFFSET 0x0180 > +#define RK3568_SR_BANK_STRIDE 0x10 > +#define RK3568_SR_PINS_PER_REG 16 > + > +static int rk3568_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank, > + int pin_num, > + struct regmap **regmap, > + int *reg, u8 *bit) > +{ > + struct rockchip_pinctrl *info = bank->drvdata; > + > + if (bank->bank_num == 0) { > + *regmap = info->regmap_pmu; > + *reg = RK3568_SR_PMU_OFFSET; > + } else { > + *regmap = info->regmap_base; > + *reg = RK3568_SR_GRF_OFFSET; > + *reg += (bank->bank_num - 1) * RK3568_SR_BANK_STRIDE; > + } > + *reg += ((pin_num / RK3568_SR_PINS_PER_REG) * 4); > + *bit = pin_num % RK3568_SR_PINS_PER_REG; > + > + return 0; > +} > + > +#define RK3568_PULL_PMU_OFFSET 0x20 > +#define RK3568_PULL_GRF_OFFSET 0x80 > +#define RK3568_PULL_BITS_PER_PIN 2 > +#define RK3568_PULL_PINS_PER_REG 8 > +#define RK3568_PULL_BANK_STRIDE 0x10 > + > +static void rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, > + int pin_num, struct regmap **regmap, > + int *reg, u8 *bit) > +{ > + struct rockchip_pinctrl *info = bank->drvdata; > + > + if (bank->bank_num == 0) { > + *regmap = info->regmap_pmu; > + *reg = RK3568_PULL_PMU_OFFSET; > + *reg += bank->bank_num * RK3568_PULL_BANK_STRIDE; > + *reg += ((pin_num / RK3568_PULL_PINS_PER_REG) * 4); > + > + *bit = pin_num % RK3568_PULL_PINS_PER_REG; > + *bit *= RK3568_PULL_BITS_PER_PIN; > + } else { > + *regmap = info->regmap_base; > + *reg = RK3568_PULL_GRF_OFFSET; > + *reg += (bank->bank_num - 1) * RK3568_PULL_BANK_STRIDE; > + *reg += ((pin_num / RK3568_PULL_PINS_PER_REG) * 4); > + > + *bit = (pin_num % RK3568_PULL_PINS_PER_REG); > + *bit *= RK3568_PULL_BITS_PER_PIN; > + } > +} > + > +#define RK3568_DRV_PMU_OFFSET 0x70 > +#define RK3568_DRV_GRF_OFFSET 0x200 > +#define RK3568_DRV_BITS_PER_PIN 8 > +#define RK3568_DRV_PINS_PER_REG 2 > +#define RK3568_DRV_BANK_STRIDE 0x40 > + > +static void rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, > + int pin_num, struct regmap **regmap, > + int *reg, u8 *bit) > +{ > + struct rockchip_pinctrl *info = bank->drvdata; > + > + /* The first 32 pins of the first bank are located in PMU */ > + if (bank->bank_num == 0) { > + *regmap = info->regmap_pmu; > + *reg = RK3568_DRV_PMU_OFFSET; > + *reg += ((pin_num / RK3568_DRV_PINS_PER_REG) * 4); > + > + *bit = pin_num % RK3568_DRV_PINS_PER_REG; > + *bit *= RK3568_DRV_BITS_PER_PIN; > + } else { > + *regmap = info->regmap_base; > + *reg = RK3568_DRV_GRF_OFFSET; > + *reg += (bank->bank_num - 1) * RK3568_DRV_BANK_STRIDE; > + *reg += ((pin_num / RK3568_DRV_PINS_PER_REG) * 4); > + > + *bit = (pin_num % RK3568_DRV_PINS_PER_REG); > + *bit *= RK3568_DRV_BITS_PER_PIN; > + } > +} > + > static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = { > { 2, 4, 8, 12, -1, -1, -1, -1 }, > { 3, 6, 9, 12, -1, -1, -1, -1 }, > @@ -2202,6 +2414,11 @@ static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, > bank->bank_num, pin_num, strength); > > ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); > + if (ctrl->type == RK3568) { > + rmask_bits = RK3568_DRV_BITS_PER_PIN; > + ret = (1 << (strength + 1)) - 1; > + goto config; > + } > > ret = -EINVAL; > for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) { > @@ -2271,6 +2488,7 @@ static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, > return -EINVAL; > } > > +config: > /* enable the write to the equivalent lower bits */ > data = ((1 << rmask_bits) - 1) << (bit + 16); > rmask = data | (data >> 16); > @@ -2373,6 +2591,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank, > case RK3308: > case RK3368: > case RK3399: > + case RK3568: > pull_type = bank->pull_type[pin_num / 8]; > ret = -EINVAL; > for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]); > @@ -2382,6 +2601,14 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank, > break; > } > } > + /* > + * In the TRM, pull-up being 1 for everything except the GPIO0_D0-D6, > + * where that pull up value becomes 3. > + */ > + if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) { > + if (ret == 1) > + ret = 3; > + } > > if (ret < 0) { > dev_err(info->dev, "unsupported pull setting %d\n", > @@ -2426,6 +2653,35 @@ static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, > return 0; > } > > +#define RK3568_SCHMITT_BITS_PER_PIN 2 > +#define RK3568_SCHMITT_PINS_PER_REG 8 > +#define RK3568_SCHMITT_BANK_STRIDE 0x10 > +#define RK3568_SCHMITT_GRF_OFFSET 0xc0 > +#define RK3568_SCHMITT_PMUGRF_OFFSET 0x30 > + > +static int rk3568_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, > + int pin_num, > + struct regmap **regmap, > + int *reg, u8 *bit) > +{ > + struct rockchip_pinctrl *info = bank->drvdata; > + > + if (bank->bank_num == 0) { > + *regmap = info->regmap_pmu; > + *reg = RK3568_SCHMITT_PMUGRF_OFFSET; > + } else { > + *regmap = info->regmap_base; > + *reg = RK3568_SCHMITT_GRF_OFFSET; > + *reg += (bank->bank_num - 1) * RK3568_SCHMITT_BANK_STRIDE; > + } > + > + *reg += ((pin_num / RK3568_SCHMITT_PINS_PER_REG) * 4); > + *bit = pin_num % RK3568_SCHMITT_PINS_PER_REG; > + *bit *= RK3568_SCHMITT_BITS_PER_PIN; > + > + return 0; > +} > + > static int rockchip_get_schmitt(struct rockchip_pin_bank *bank, int pin_num) > { > struct rockchip_pinctrl *info = bank->drvdata; > @@ -2444,6 +2700,13 @@ static int rockchip_get_schmitt(struct rockchip_pin_bank *bank, int pin_num) > return ret; > > data >>= bit; > + switch (ctrl->type) { > + case RK3568: > + return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1); > + default: > + break; > + } > + > return data & 0x1; > } > > @@ -2465,8 +2728,17 @@ static int rockchip_set_schmitt(struct rockchip_pin_bank *bank, > return ret; > > /* enable the write to the equivalent lower bits */ > - data = BIT(bit + 16) | (enable << bit); > - rmask = BIT(bit + 16) | BIT(bit); > + switch (ctrl->type) { > + case RK3568: > + data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16); > + rmask = data | (data >> 16); > + data |= ((enable ? 0x2 : 0x1) << bit); > + break; > + default: > + data = BIT(bit + 16) | (enable << bit); > + rmask = BIT(bit + 16) | BIT(bit); > + break; > + } > > return regmap_update_bits(regmap, reg, rmask, data); > } > @@ -2640,6 +2912,7 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, > case RK3308: > case RK3368: > case RK3399: > + case RK3568: > return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT); > } > > @@ -4210,6 +4483,46 @@ static struct rockchip_pin_ctrl rk3399_pin_ctrl = { > .drv_calc_reg = rk3399_calc_drv_reg_and_bit, > }; > > +static struct rockchip_pin_bank rk3568_pin_banks[] = { > + PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, > + IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, > + IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, > + IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT), > + PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT), > + PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT), > + PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT), > + PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT, > + IOMUX_WIDTH_4BIT), > +}; > + > +static struct rockchip_pin_ctrl rk3568_pin_ctrl = { > + .pin_banks = rk3568_pin_banks, > + .nr_banks = ARRAY_SIZE(rk3568_pin_banks), > + .label = "RK3568-GPIO", > + .type = RK3568, > + .grf_mux_offset = 0x0, > + .pmu_mux_offset = 0x0, > + .grf_drv_offset = 0x0200, > + .pmu_drv_offset = 0x0070, > + .iomux_routes = rk3568_mux_route_data, > + .niomux_routes = ARRAY_SIZE(rk3568_mux_route_data), > + .pull_calc_reg = rk3568_calc_pull_reg_and_bit, > + .drv_calc_reg = rk3568_calc_drv_reg_and_bit, > + .slew_rate_calc_reg = rk3568_calc_slew_rate_reg_and_bit, > + .schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit, > +}; > + > static const struct of_device_id rockchip_pinctrl_dt_match[] = { > { .compatible = "rockchip,px30-pinctrl", > .data = &px30_pin_ctrl }, > @@ -4239,6 +4552,8 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = { > .data = &rk3368_pin_ctrl }, > { .compatible = "rockchip,rk3399-pinctrl", > .data = &rk3399_pin_ctrl }, > + { .compatible = "rockchip,rk3568-pinctrl", > + .data = &rk3568_pin_ctrl }, > {}, > }; > > -- > 2.25.1 > > > > > _______________________________________________ > Linux-rockchip mailing list > Linux-rockchip@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-rockchip > > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 11E43C433DB for ; Fri, 5 Mar 2021 01:24:55 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 26B2164F6F for ; Fri, 5 Mar 2021 01:24:54 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 26B2164F6F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=rock-chips.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=VL7KpMTkC//wmgjTBE+D4+0X3sUdMTjuSOYYnam+2ac=; b=LqtHTm9uYbgmoOfDHZbdkQ/Hn bYJ1U/QRy/fea8t5LX/ixGIFWGvFrY6/AKUTFQwKq4EqaZnS5JdxknW8ggd9d8DxkozYqIhAOn8CE m19WZdE6PmE+rMRaxQUcY9/3VbymjYdm5T6iJYYVJFb6JJ9gpnmL+3hSrSLyp1n7IiI/oimjNpbOA ZMpMPPmS3MHudZ4AvLKugt3DvdwKOcs4NRKrlZLipmzQmjofw4aoIgYDXRe+8Rn7xxYCdVzCYQIrX sXnWD3JrQXDVT/k8P+MPCItGaxMjBWPdo6Y0i/gi61uZsV4npgrDy/0tPFes2YeErG5Itq3zQnQSx 3mBpWWh1g==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lHzCy-00BI9l-GS; Fri, 05 Mar 2021 01:24:48 +0000 Received: from mail-io1-f49.google.com ([209.85.166.49]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lHzCt-00BI78-6d for linux-rockchip@lists.infradead.org; Fri, 05 Mar 2021 01:24:45 +0000 Received: by mail-io1-f49.google.com with SMTP id f20so241202ioo.10 for ; Thu, 04 Mar 2021 17:24:39 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=tW3NXvFvBalaTF7h/3KBcn4BZri8iHoiBz7ZbXqYf/I=; b=KAs9a1IWZnaIENd0Ri8Xs7bXnztDsnx1SxpkZbizV5Kh2/rQL22ZEYiZ+SvV7QWt1f CAZCZJTwfss3oiXhb6xW+TKTCxPHhGLQtpEzMbJKx3a7VD2vtPX0T07Vs6Ga2joBLGW3 vvJjrCHp7V6xfC3SNmevJiasM97HsGaPJnX1hmO8LFV2W1DXy0GIsDW1HBT0V1zlnTzj jQ9gk+CrtYItCr3OvJ7nrcoRk3WU6uM8LblXfkogkGSDpttynqp3QREQAZBzTCyAzGfF 1UczkKLrL8suFTvs/cAIZ9b/UVMImmjwpxNwKuXfR4YyivOo7S6XReMse59T1TPeklYj jFAg== X-Gm-Message-State: AOAM5337PzV64fH+MRGOXreJDqUf5LTgbaw7fTpR+pw1ZlOIRtyaDHOB CN8WUOwWiUGCw+LJ4DeZbQ12JrpfzdSvx39EJv8uq6JK6GU= X-Google-Smtp-Source: ABdhPJyvvjaDk6hmKIpSJxIdwZqNOP92TIMGRUKQRcOdp61Iygkarsv92noUrlyYL1W5DQhBEHg+otWXP2opi2ykWVU= X-Received: by 2002:a5d:81c8:: with SMTP id t8mr6138514iol.38.1614907478757; Thu, 04 Mar 2021 17:24:38 -0800 (PST) MIME-Version: 1.0 References: <20210224113918.957738-1-jay.xu@rock-chips.com> <20210304013342.1106361-1-jay.xu@rock-chips.com> In-Reply-To: <20210304013342.1106361-1-jay.xu@rock-chips.com> From: Kever Yang Date: Fri, 5 Mar 2021 09:24:27 +0800 Message-ID: Subject: Re: [PATCH v3 RESEND] pinctrl: rockchip: add support for rk3568 To: Jianqun Xu Cc: Linus Walleij , Heiko Stuebner , "open list:GPIO SUBSYSTEM" , "open list:ARM/Rockchip SoC..." X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210305_012443_435832_9DC87758 X-CRM114-Status: GOOD ( 22.03 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org SmlhbnF1biBYdSA8amF5Lnh1QHJvY2stY2hpcHMuY29tPiDkuo4yMDIx5bm0M+aciDTml6Xlkajl m5sg5LiK5Y2IOTozM+WGmemBk++8mgo+Cj4gUkszNTY4IFNvQ3MgaGF2ZSA1IGdwaW8gY29udHJv bGxlcnMsIGVhY2ggZ3BpbyBoYXMgMzIgcGlucy4gR1BJTyBzdXBwb3J0cwo+IHNldCBpb211eCwg cHVsbCwgZHJpdmUgc3RyZW5ndGgsIHNjaG1pdHQgYW5kIHNsZXcgcmF0ZS4KPgo+IFNpZ25lZC1v ZmYtYnk6IEppYW5xdW4gWHUgPGpheS54dUByb2NrLWNoaXBzLmNvbT4KClBhdGNoIGxvb2tzIGdv b2QgdG8gbWUuCgpSZXZpZXdlZC1ieTogS2V2ZXIgWWFuZyA8a2V2ZXIueWFuZ0Byb2NrLWNoaXBz LmNvbT4KClRoYW5rcywKLSBLZXZlcgo+IC0tLQo+IGNoYW5nZXMgc2luY2UgdjI6Cj4gLSBmaXgg bXV4IHJvdXRlIGdyZiBiYXNlIGZvciBncGlvIGJhbmsgMAo+IGNoYW5nZXMgc2luY2UgdjE6Cj4g ICBzdWdnZXN0ZWQgYnkgSGVpa28sIHRoYW5rIGZvciBoZWlrbwo+IC0gbW9kaWZ5IF9HRU5NQVNL IHRvIFdSSVRFX01BU0tfVkFMLCBhbmQgYWRkIGNvbW1lbnQgZm9yIHRoZSBkZWZpbmUKPiAtIG1v ZGlmeSBNUl9HUkYgdG8gUktfTVVYUk9VVEVfR1JGLCBhbHNvIGZvciBNUl9TQU1FIGFuZCBNUl9Q TVUKPiAtIGFkZCBjb21tZW50IGZvciBwdWxsIHNldHRpbmcgZm9yIEdQSU8wX0QwLUQ2Cj4KPiAg ZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcm9ja2NoaXAuYyB8IDMxOSArKysrKysrKysrKysrKysr KysrKysrKysrKysrLQo+ICAxIGZpbGUgY2hhbmdlZCwgMzE3IGluc2VydGlvbnMoKyksIDIgZGVs ZXRpb25zKC0pCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcm9ja2No aXAuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXJvY2tjaGlwLmMKPiBpbmRleCBhYTFhMWM4 NTBkMDUuLjY4YWU0NmEyYTkxOSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3Ry bC1yb2NrY2hpcC5jCj4gKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcm9ja2NoaXAuYwo+ IEBAIC02MSw4ICs2MSwxNyBAQCBlbnVtIHJvY2tjaGlwX3BpbmN0cmxfdHlwZSB7Cj4gICAgICAg ICBSSzMzMDgsCj4gICAgICAgICBSSzMzNjgsCj4gICAgICAgICBSSzMzOTksCj4gKyAgICAgICBS SzM1NjgsCj4gIH07Cj4KPiArCj4gKy8qKgo+ICsgKiBHZW5lcmF0ZSBhIGJpdG1hc2sgZm9yIHNl dHRpbmcgYSB2YWx1ZSAodikgd2l0aCBhIHdyaXRlIG1hc2sgYml0IGluIGhpd29yZAo+ICsgKiBy ZWdpc3RlciAzMToxNiBhcmVhLgo+ICsgKi8KPiArI2RlZmluZSBXUklURV9NQVNLX1ZBTChoLCBs LCB2KSBcCj4gKyAgICAgICAoR0VOTUFTSygoKGgpICsgMTYpLCAoKGwpICsgMTYpKSB8ICgoKHYp IDw8IChsKSkgJiBHRU5NQVNLKChoKSwgKGwpKSkpCj4gKwo+ICAvKgo+ICAgKiBFbmNvZGUgdmFy aWFudHMgb2YgaW9tdXggcmVnaXN0ZXJzIGludG8gYSB0eXBlIHZhcmlhYmxlCj4gICAqLwo+IEBA IC0yOTAsNiArMjk5LDI1IEBAIHN0cnVjdCByb2NrY2hpcF9waW5fYmFuayB7Cj4gICAgICAgICAg ICAgICAgIC5wdWxsX3R5cGVbM10gPSBwdWxsMywgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ICAgICAgICAgfQo+Cj4gKyNkZWZpbmUgUElOX0JBTktfTVVYX1JPVVRFX0ZMQUdT KElELCBQSU4sIEZVTkMsIFJFRywgVkFMLCBGTEFHKSAgICAgICAgICAgICAgICBcCj4gKyAgICAg ICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAo+ICsgICAgICAgICAgICAgICAuYmFua19udW0gICAgICAgPSBJRCwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiArICAgICAgICAgICAgICAgLnBpbiAgICAg ICAgICAgID0gUElOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gKyAgICAg ICAgICAgICAgIC5mdW5jICAgICAgICAgICA9IEZVTkMsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAo+ICsgICAgICAgICAgICAgICAucm91dGVfb2Zmc2V0ICAgPSBSRUcsICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiArICAgICAgICAgICAgICAgLnJvdXRlX3Zh bCAgICAgID0gVkFMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gKyAgICAg ICAgICAgICAgIC5yb3V0ZV90eXBlICAgICA9IEZMQUcsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAo+ICsgICAgICAgfQo+ICsKPiArI2RlZmluZSBSS19NVVhST1VURV9TQU1FKElE LCBQSU4sIEZVTkMsIFJFRywgVkFMKSAgICAgIFwKPiArICAgICAgIFBJTl9CQU5LX01VWF9ST1VU RV9GTEFHUyhJRCwgUElOLCBGVU5DLCBSRUcsIFZBTCwgUk9DS0NISVBfUk9VVEVfU0FNRSkKPiAr Cj4gKyNkZWZpbmUgUktfTVVYUk9VVEVfR1JGKElELCBQSU4sIEZVTkMsIFJFRywgVkFMKSAgICAg ICBcCj4gKyAgICAgICBQSU5fQkFOS19NVVhfUk9VVEVfRkxBR1MoSUQsIFBJTiwgRlVOQywgUkVH LCBWQUwsIFJPQ0tDSElQX1JPVVRFX0dSRikKPiArCj4gKyNkZWZpbmUgUktfTVVYUk9VVEVfUE1V KElELCBQSU4sIEZVTkMsIFJFRywgVkFMKSAgICAgICBcCj4gKyAgICAgICBQSU5fQkFOS19NVVhf Uk9VVEVfRkxBR1MoSUQsIFBJTiwgRlVOQywgUkVHLCBWQUwsIFJPQ0tDSElQX1JPVVRFX1BNVSkK PiArCj4gIC8qKgo+ICAgKiBzdHJ1Y3Qgcm9ja2NoaXBfbXV4X3JlY2FsY2VkX2RhdGE6IHJlcHJl c2VudCBhIHBpbiBpb211eCBkYXRhLgo+ICAgKiBAbnVtOiBiYW5rIG51bWJlci4KPiBAQCAtMTM5 NCw2ICsxNDIyLDEwMiBAQCBzdGF0aWMgc3RydWN0IHJvY2tjaGlwX211eF9yb3V0ZV9kYXRhIHJr MzM5OV9tdXhfcm91dGVfZGF0YVtdID0gewo+ICAgICAgICAgfSwKPiAgfTsKPgo+ICtzdGF0aWMg c3RydWN0IHJvY2tjaGlwX211eF9yb3V0ZV9kYXRhIHJrMzU2OF9tdXhfcm91dGVfZGF0YVtdID0g ewo+ICsgICAgICAgUktfTVVYUk9VVEVfUE1VKDAsIFJLX1BCNywgMSwgMHgwMTEwLCBXUklURV9N QVNLX1ZBTCgxLCAwLCAwKSksIC8qIFBXTTAgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhS T1VURV9QTVUoMCwgUktfUEM3LCAyLCAweDAxMTAsIFdSSVRFX01BU0tfVkFMKDEsIDAsIDEpKSwg LyogUFdNMCBJTyBtdXggTTEgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX1BNVSgwLCBSS19QQzAs IDEsIDB4MDExMCwgV1JJVEVfTUFTS19WQUwoMywgMiwgMCkpLCAvKiBQV00xIElPIG11eCBNMCAq Lwo+ICsgICAgICAgUktfTVVYUk9VVEVfUE1VKDAsIFJLX1BCNSwgNCwgMHgwMTEwLCBXUklURV9N QVNLX1ZBTCgzLCAyLCAxKSksIC8qIFBXTTEgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhS T1VURV9QTVUoMCwgUktfUEMxLCAxLCAweDAxMTAsIFdSSVRFX01BU0tfVkFMKDUsIDQsIDApKSwg LyogUFdNMiBJTyBtdXggTTAgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX1BNVSgwLCBSS19QQjYs IDQsIDB4MDExMCwgV1JJVEVfTUFTS19WQUwoNSwgNCwgMSkpLCAvKiBQV00yIElPIG11eCBNMSAq Lwo+ICsgICAgICAgUktfTVVYUk9VVEVfUE1VKDAsIFJLX1BCMywgMiwgMHgwMzAwLCBXUklURV9N QVNLX1ZBTCgwLCAwLCAwKSksIC8qIENBTjAgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhS T1VURV9HUkYoMiwgUktfUEExLCA0LCAweDAzMDAsIFdSSVRFX01BU0tfVkFMKDAsIDAsIDEpKSwg LyogQ0FOMCBJTyBtdXggTTEgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX0dSRigxLCBSS19QQTEs IDMsIDB4MDMwMCwgV1JJVEVfTUFTS19WQUwoMiwgMiwgMCkpLCAvKiBDQU4xIElPIG11eCBNMCAq Lwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDQsIFJLX1BDMywgMywgMHgwMzAwLCBXUklURV9N QVNLX1ZBTCgyLCAyLCAxKSksIC8qIENBTjEgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhS T1VURV9HUkYoNCwgUktfUEI1LCAzLCAweDAzMDAsIFdSSVRFX01BU0tfVkFMKDQsIDQsIDApKSwg LyogQ0FOMiBJTyBtdXggTTAgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX0dSRigyLCBSS19QQjIs IDQsIDB4MDMwMCwgV1JJVEVfTUFTS19WQUwoNCwgNCwgMSkpLCAvKiBDQU4yIElPIG11eCBNMSAq Lwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDQsIFJLX1BDNCwgMSwgMHgwMzAwLCBXUklURV9N QVNLX1ZBTCg2LCA2LCAwKSksIC8qIEhQRElOIElPIG11eCBNMCAqLwo+ICsgICAgICAgUktfTVVY Uk9VVEVfR1JGKDAsIFJLX1BDMiwgMiwgMHgwMzAwLCBXUklURV9NQVNLX1ZBTCg2LCA2LCAxKSks IC8qIEhQRElOIElPIG11eCBNMSAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDMsIFJLX1BC MSwgMywgMHgwMzAwLCBXUklURV9NQVNLX1ZBTCg4LCA4LCAwKSksIC8qIEdNQUMxIElPIG11eCBN MCAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDQsIFJLX1BBNywgMywgMHgwMzAwLCBXUklU RV9NQVNLX1ZBTCg4LCA4LCAxKSksIC8qIEdNQUMxIElPIG11eCBNMSAqLwo+ICsgICAgICAgUktf TVVYUk9VVEVfR1JGKDQsIFJLX1BEMSwgMSwgMHgwMzAwLCBXUklURV9NQVNLX1ZBTCgxMCwgMTAs IDApKSwgLyogSERNSVRYIElPIG11eCBNMCAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDAs IFJLX1BDNywgMSwgMHgwMzAwLCBXUklURV9NQVNLX1ZBTCgxMCwgMTAsIDEpKSwgLyogSERNSVRY IElPIG11eCBNMSAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDAsIFJLX1BCNiwgMSwgMHgw MzAwLCBXUklURV9NQVNLX1ZBTCgxNCwgMTQsIDApKSwgLyogSTJDMiBJTyBtdXggTTAgKi8KPiAr ICAgICAgIFJLX01VWFJPVVRFX0dSRig0LCBSS19QQjQsIDEsIDB4MDMwMCwgV1JJVEVfTUFTS19W QUwoMTQsIDE0LCAxKSksIC8qIEkyQzIgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VU RV9HUkYoMSwgUktfUEEwLCAxLCAweDAzMDQsIFdSSVRFX01BU0tfVkFMKDAsIDAsIDApKSwgLyog STJDMyBJTyBtdXggTTAgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX0dSRigzLCBSS19QQjYsIDQs IDB4MDMwNCwgV1JJVEVfTUFTS19WQUwoMCwgMCwgMSkpLCAvKiBJMkMzIElPIG11eCBNMSAqLwo+ ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDQsIFJLX1BCMiwgMSwgMHgwMzA0LCBXUklURV9NQVNL X1ZBTCgyLCAyLCAwKSksIC8qIEkyQzQgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VU RV9HUkYoMiwgUktfUEIxLCAyLCAweDAzMDQsIFdSSVRFX01BU0tfVkFMKDIsIDIsIDEpKSwgLyog STJDNCBJTyBtdXggTTEgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX0dSRigzLCBSS19QQjQsIDQs IDB4MDMwNCwgV1JJVEVfTUFTS19WQUwoNCwgNCwgMCkpLCAvKiBJMkM1IElPIG11eCBNMCAqLwo+ ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDQsIFJLX1BEMCwgMiwgMHgwMzA0LCBXUklURV9NQVNL X1ZBTCg0LCA0LCAxKSksIC8qIEkyQzUgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VU RV9HUkYoMywgUktfUEIxLCA1LCAweDAzMDQsIFdSSVRFX01BU0tfVkFMKDE0LCAxNCwgMCkpLCAv KiBQV004IElPIG11eCBNMCAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDEsIFJLX1BENSwg NCwgMHgwMzA0LCBXUklURV9NQVNLX1ZBTCgxNCwgMTQsIDEpKSwgLyogUFdNOCBJTyBtdXggTTEg Ki8KPiArICAgICAgIFJLX01VWFJPVVRFX0dSRigzLCBSS19QQjIsIDUsIDB4MDMwOCwgV1JJVEVf TUFTS19WQUwoMCwgMCwgMCkpLCAvKiBQV005IElPIG11eCBNMCAqLwo+ICsgICAgICAgUktfTVVY Uk9VVEVfR1JGKDEsIFJLX1BENiwgNCwgMHgwMzA4LCBXUklURV9NQVNLX1ZBTCgwLCAwLCAxKSks IC8qIFBXTTkgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMywgUktfUEI1 LCA1LCAweDAzMDgsIFdSSVRFX01BU0tfVkFMKDIsIDIsIDApKSwgLyogUFdNMTAgSU8gbXV4IE0w ICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMiwgUktfUEExLCAyLCAweDAzMDgsIFdSSVRF X01BU0tfVkFMKDIsIDIsIDEpKSwgLyogUFdNMTAgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19N VVhST1VURV9HUkYoMywgUktfUEI2LCA1LCAweDAzMDgsIFdSSVRFX01BU0tfVkFMKDQsIDQsIDAp KSwgLyogUFdNMTEgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoNCwgUktf UEMwLCAzLCAweDAzMDgsIFdSSVRFX01BU0tfVkFMKDQsIDQsIDEpKSwgLyogUFdNMTEgSU8gbXV4 IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMywgUktfUEI3LCAyLCAweDAzMDgsIFdS SVRFX01BU0tfVkFMKDYsIDYsIDApKSwgLyogUFdNMTIgSU8gbXV4IE0wICovCj4gKyAgICAgICBS S19NVVhST1VURV9HUkYoNCwgUktfUEM1LCAxLCAweDAzMDgsIFdSSVRFX01BU0tfVkFMKDYsIDYs IDEpKSwgLyogUFdNMTIgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMywg UktfUEMwLCAyLCAweDAzMDgsIFdSSVRFX01BU0tfVkFMKDgsIDgsIDApKSwgLyogUFdNMTMgSU8g bXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoNCwgUktfUEM2LCAxLCAweDAzMDgs IFdSSVRFX01BU0tfVkFMKDgsIDgsIDEpKSwgLyogUFdNMTMgSU8gbXV4IE0xICovCj4gKyAgICAg ICBSS19NVVhST1VURV9HUkYoMywgUktfUEM0LCAxLCAweDAzMDgsIFdSSVRFX01BU0tfVkFMKDEw LCAxMCwgMCkpLCAvKiBQV00xNCBJTyBtdXggTTAgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX0dS Rig0LCBSS19QQzIsIDEsIDB4MDMwOCwgV1JJVEVfTUFTS19WQUwoMTAsIDEwLCAxKSksIC8qIFBX TTE0IElPIG11eCBNMSAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDMsIFJLX1BDNSwgMSwg MHgwMzA4LCBXUklURV9NQVNLX1ZBTCgxMiwgMTIsIDApKSwgLyogUFdNMTUgSU8gbXV4IE0wICov Cj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoNCwgUktfUEMzLCAxLCAweDAzMDgsIFdSSVRFX01B U0tfVkFMKDEyLCAxMiwgMSkpLCAvKiBQV00xNSBJTyBtdXggTTEgKi8KPiArICAgICAgIFJLX01V WFJPVVRFX0dSRigzLCBSS19QRDIsIDMsIDB4MDMwOCwgV1JJVEVfTUFTS19WQUwoMTQsIDE0LCAw KSksIC8qIFNETU1DMiBJTyBtdXggTTAgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX0dSRigzLCBS S19QQTUsIDUsIDB4MDMwOCwgV1JJVEVfTUFTS19WQUwoMTQsIDE0LCAxKSksIC8qIFNETU1DMiBJ TyBtdXggTTEgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX0dSRigwLCBSS19QQjUsIDIsIDB4MDMw YywgV1JJVEVfTUFTS19WQUwoMCwgMCwgMCkpLCAvKiBTUEkwIElPIG11eCBNMCAqLwo+ICsgICAg ICAgUktfTVVYUk9VVEVfR1JGKDIsIFJLX1BEMywgMywgMHgwMzBjLCBXUklURV9NQVNLX1ZBTCgw LCAwLCAxKSksIC8qIFNQSTAgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYo MiwgUktfUEI1LCAzLCAweDAzMGMsIFdSSVRFX01BU0tfVkFMKDIsIDIsIDApKSwgLyogU1BJMSBJ TyBtdXggTTAgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX0dSRigzLCBSS19QQzMsIDMsIDB4MDMw YywgV1JJVEVfTUFTS19WQUwoMiwgMiwgMSkpLCAvKiBTUEkxIElPIG11eCBNMSAqLwo+ICsgICAg ICAgUktfTVVYUk9VVEVfR1JGKDIsIFJLX1BDMSwgNCwgMHgwMzBjLCBXUklURV9NQVNLX1ZBTCg0 LCA0LCAwKSksIC8qIFNQSTIgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYo MywgUktfUEEwLCAzLCAweDAzMGMsIFdSSVRFX01BU0tfVkFMKDQsIDQsIDEpKSwgLyogU1BJMiBJ TyBtdXggTTEgKi8KPiArICAgICAgIFJLX01VWFJPVVRFX0dSRig0LCBSS19QQjMsIDQsIDB4MDMw YywgV1JJVEVfTUFTS19WQUwoNiwgNiwgMCkpLCAvKiBTUEkzIElPIG11eCBNMCAqLwo+ICsgICAg ICAgUktfTVVYUk9VVEVfR1JGKDQsIFJLX1BDMiwgMiwgMHgwMzBjLCBXUklURV9NQVNLX1ZBTCg2 LCA2LCAxKSksIC8qIFNQSTMgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYo MiwgUktfUEI0LCAyLCAweDAzMGMsIFdSSVRFX01BU0tfVkFMKDgsIDgsIDApKSwgLyogVUFSVDEg SU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMCwgUktfUEQxLCAxLCAweDAz MGMsIFdSSVRFX01BU0tfVkFMKDgsIDgsIDEpKSwgLyogVUFSVDEgSU8gbXV4IE0xICovCj4gKyAg ICAgICBSS19NVVhST1VURV9HUkYoMCwgUktfUEQxLCAxLCAweDAzMGMsIFdSSVRFX01BU0tfVkFM KDEwLCAxMCwgMCkpLCAvKiBVQVJUMiBJTyBtdXggTTAgKi8KPiArICAgICAgIFJLX01VWFJPVVRF X0dSRigxLCBSS19QRDUsIDIsIDB4MDMwYywgV1JJVEVfTUFTS19WQUwoMTAsIDEwLCAxKSksIC8q IFVBUlQyIElPIG11eCBNMSAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDEsIFJLX1BBMSwg MiwgMHgwMzBjLCBXUklURV9NQVNLX1ZBTCgxMiwgMTIsIDApKSwgLyogVUFSVDMgSU8gbXV4IE0w ICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMywgUktfUEI3LCA0LCAweDAzMGMsIFdSSVRF X01BU0tfVkFMKDEyLCAxMiwgMSkpLCAvKiBVQVJUMyBJTyBtdXggTTEgKi8KPiArICAgICAgIFJL X01VWFJPVVRFX0dSRigxLCBSS19QQTYsIDIsIDB4MDMwYywgV1JJVEVfTUFTS19WQUwoMTQsIDE0 LCAwKSksIC8qIFVBUlQ0IElPIG11eCBNMCAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDMs IFJLX1BCMiwgNCwgMHgwMzBjLCBXUklURV9NQVNLX1ZBTCgxNCwgMTQsIDEpKSwgLyogVUFSVDQg SU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMiwgUktfUEEyLCAzLCAweDAz MTAsIFdSSVRFX01BU0tfVkFMKDAsIDAsIDApKSwgLyogVUFSVDUgSU8gbXV4IE0wICovCj4gKyAg ICAgICBSS19NVVhST1VURV9HUkYoMywgUktfUEMyLCA0LCAweDAzMTAsIFdSSVRFX01BU0tfVkFM KDAsIDAsIDEpKSwgLyogVUFSVDUgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9H UkYoMiwgUktfUEE0LCAzLCAweDAzMTAsIFdSSVRFX01BU0tfVkFMKDIsIDIsIDApKSwgLyogVUFS VDYgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMSwgUktfUEQ1LCAzLCAw eDAzMTAsIFdSSVRFX01BU0tfVkFMKDIsIDIsIDEpKSwgLyogVUFSVDYgSU8gbXV4IE0xICovCj4g KyAgICAgICBSS19NVVhST1VURV9HUkYoMiwgUktfUEE2LCAzLCAweDAzMTAsIFdSSVRFX01BU0tf VkFMKDUsIDQsIDApKSwgLyogVUFSVDcgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VU RV9HUkYoMywgUktfUEM0LCA0LCAweDAzMTAsIFdSSVRFX01BU0tfVkFMKDUsIDQsIDEpKSwgLyog VUFSVDcgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoNCwgUktfUEEyLCA0 LCAweDAzMTAsIFdSSVRFX01BU0tfVkFMKDUsIDQsIDIpKSwgLyogVUFSVDcgSU8gbXV4IE0yICov Cj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMiwgUktfUEM1LCAzLCAweDAzMTAsIFdSSVRFX01B U0tfVkFMKDYsIDYsIDApKSwgLyogVUFSVDggSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhS T1VURV9HUkYoMiwgUktfUEQ3LCA0LCAweDAzMTAsIFdSSVRFX01BU0tfVkFMKDYsIDYsIDEpKSwg LyogVUFSVDggSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMiwgUktfUEIw LCAzLCAweDAzMTAsIFdSSVRFX01BU0tfVkFMKDksIDgsIDApKSwgLyogVUFSVDkgSU8gbXV4IE0w ICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoNCwgUktfUEM1LCA0LCAweDAzMTAsIFdSSVRF X01BU0tfVkFMKDksIDgsIDEpKSwgLyogVUFSVDkgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19N VVhST1VURV9HUkYoNCwgUktfUEE0LCA0LCAweDAzMTAsIFdSSVRFX01BU0tfVkFMKDksIDgsIDIp KSwgLyogVUFSVDkgSU8gbXV4IE0yICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMSwgUktf UEEyLCAxLCAweDAzMTAsIFdSSVRFX01BU0tfVkFMKDExLCAxMCwgMCkpLCAvKiBJMlMxIElPIG11 eCBNMCAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDMsIFJLX1BDNiwgNCwgMHgwMzEwLCBX UklURV9NQVNLX1ZBTCgxMSwgMTAsIDEpKSwgLyogSTJTMSBJTyBtdXggTTEgKi8KPiArICAgICAg IFJLX01VWFJPVVRFX0dSRigyLCBSS19QRDAsIDUsIDB4MDMxMCwgV1JJVEVfTUFTS19WQUwoMTEs IDEwLCAyKSksIC8qIEkyUzEgSU8gbXV4IE0yICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYo MiwgUktfUEMxLCAxLCAweDAzMTAsIFdSSVRFX01BU0tfVkFMKDEyLCAxMiwgMCkpLCAvKiBJMlMy IElPIG11eCBNMCAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDQsIFJLX1BCNiwgNSwgMHgw MzEwLCBXUklURV9NQVNLX1ZBTCgxMiwgMTIsIDEpKSwgLyogSTJTMiBJTyBtdXggTTEgKi8KPiAr ICAgICAgIFJLX01VWFJPVVRFX0dSRigzLCBSS19QQTIsIDQsIDB4MDMxMCwgV1JJVEVfTUFTS19W QUwoMTQsIDE0LCAwKSksIC8qIEkyUzMgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VU RV9HUkYoNCwgUktfUEMyLCA1LCAweDAzMTAsIFdSSVRFX01BU0tfVkFMKDE0LCAxNCwgMSkpLCAv KiBJMlMzIElPIG11eCBNMSAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDEsIFJLX1BBNCwg MywgMHgwMzE0LCBXUklURV9NQVNLX1ZBTCgxLCAwLCAwKSksIC8qIFBETSBJTyBtdXggTTAgKi8K PiArICAgICAgIFJLX01VWFJPVVRFX0dSRigxLCBSS19QQTYsIDMsIDB4MDMxNCwgV1JJVEVfTUFT S19WQUwoMSwgMCwgMCkpLCAvKiBQRE0gSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VU RV9HUkYoMywgUktfUEQ2LCA1LCAweDAzMTQsIFdSSVRFX01BU0tfVkFMKDEsIDAsIDEpKSwgLyog UERNIElPIG11eCBNMSAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDQsIFJLX1BBMCwgNCwg MHgwMzE0LCBXUklURV9NQVNLX1ZBTCgxLCAwLCAxKSksIC8qIFBETSBJTyBtdXggTTEgKi8KPiAr ICAgICAgIFJLX01VWFJPVVRFX0dSRigzLCBSS19QQzQsIDUsIDB4MDMxNCwgV1JJVEVfTUFTS19W QUwoMSwgMCwgMikpLCAvKiBQRE0gSU8gbXV4IE0yICovCj4gKyAgICAgICBSS19NVVhST1VURV9H UkYoMCwgUktfUEE1LCAzLCAweDAzMTQsIFdSSVRFX01BU0tfVkFMKDMsIDIsIDApKSwgLyogUENJ RTIwIElPIG11eCBNMCAqLwo+ICsgICAgICAgUktfTVVYUk9VVEVfR1JGKDIsIFJLX1BEMCwgNCwg MHgwMzE0LCBXUklURV9NQVNLX1ZBTCgzLCAyLCAxKSksIC8qIFBDSUUyMCBJTyBtdXggTTEgKi8K PiArICAgICAgIFJLX01VWFJPVVRFX0dSRigxLCBSS19QQjAsIDQsIDB4MDMxNCwgV1JJVEVfTUFT S19WQUwoMywgMiwgMikpLCAvKiBQQ0lFMjAgSU8gbXV4IE0yICovCj4gKyAgICAgICBSS19NVVhS T1VURV9HUkYoMCwgUktfUEE0LCAzLCAweDAzMTQsIFdSSVRFX01BU0tfVkFMKDUsIDQsIDApKSwg LyogUENJRTMwWDEgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMiwgUktf UEQyLCA0LCAweDAzMTQsIFdSSVRFX01BU0tfVkFMKDUsIDQsIDEpKSwgLyogUENJRTMwWDEgSU8g bXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoMSwgUktfUEE1LCA0LCAweDAzMTQs IFdSSVRFX01BU0tfVkFMKDUsIDQsIDIpKSwgLyogUENJRTMwWDEgSU8gbXV4IE0yICovCj4gKyAg ICAgICBSS19NVVhST1VURV9HUkYoMCwgUktfUEE2LCAyLCAweDAzMTQsIFdSSVRFX01BU0tfVkFM KDcsIDYsIDApKSwgLyogUENJRTMwWDIgSU8gbXV4IE0wICovCj4gKyAgICAgICBSS19NVVhST1VU RV9HUkYoMiwgUktfUEQ0LCA0LCAweDAzMTQsIFdSSVRFX01BU0tfVkFMKDcsIDYsIDEpKSwgLyog UENJRTMwWDIgSU8gbXV4IE0xICovCj4gKyAgICAgICBSS19NVVhST1VURV9HUkYoNCwgUktfUEMy LCA0LCAweDAzMTQsIFdSSVRFX01BU0tfVkFMKDcsIDYsIDIpKSwgLyogUENJRTMwWDIgSU8gbXV4 IE0yICovCj4gK307Cj4gKwo+ICBzdGF0aWMgYm9vbCByb2NrY2hpcF9nZXRfbXV4X3JvdXRlKHN0 cnVjdCByb2NrY2hpcF9waW5fYmFuayAqYmFuaywgaW50IHBpbiwKPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGludCBtdXgsIHUzMiAqbG9jLCB1MzIgKnJlZywgdTMyICp2YWx1 ZSkKPiAgewo+IEBAIC0yMTAyLDYgKzIyMjYsOTQgQEAgc3RhdGljIHZvaWQgcmszMzk5X2NhbGNf ZHJ2X3JlZ19hbmRfYml0KHN0cnVjdCByb2NrY2hpcF9waW5fYmFuayAqYmFuaywKPiAgICAgICAg ICAgICAgICAgKmJpdCA9IChwaW5fbnVtICUgOCkgKiAyOwo+ICB9Cj4KPiArI2RlZmluZSBSSzM1 NjhfU1JfUE1VX09GRlNFVCAgICAgICAgICAgMHg2MAo+ICsjZGVmaW5lIFJLMzU2OF9TUl9HUkZf T0ZGU0VUICAgICAgICAgICAweDAxODAKPiArI2RlZmluZSBSSzM1NjhfU1JfQkFOS19TVFJJREUg ICAgICAgICAgMHgxMAo+ICsjZGVmaW5lIFJLMzU2OF9TUl9QSU5TX1BFUl9SRUcgICAgICAgICAx Ngo+ICsKPiArc3RhdGljIGludCByazM1NjhfY2FsY19zbGV3X3JhdGVfcmVnX2FuZF9iaXQoc3Ry dWN0IHJvY2tjaGlwX3Bpbl9iYW5rICpiYW5rLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGludCBwaW5fbnVtLAo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWdtYXAgKipyZWdtYXAsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZWcsIHU4ICpiaXQpCj4g K3sKPiArICAgICAgIHN0cnVjdCByb2NrY2hpcF9waW5jdHJsICppbmZvID0gYmFuay0+ZHJ2ZGF0 YTsKPiArCj4gKyAgICAgICBpZiAoYmFuay0+YmFua19udW0gPT0gMCkgewo+ICsgICAgICAgICAg ICAgICAqcmVnbWFwID0gaW5mby0+cmVnbWFwX3BtdTsKPiArICAgICAgICAgICAgICAgKnJlZyA9 IFJLMzU2OF9TUl9QTVVfT0ZGU0VUOwo+ICsgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAg ICAgKnJlZ21hcCA9IGluZm8tPnJlZ21hcF9iYXNlOwo+ICsgICAgICAgICAgICAgICAqcmVnID0g UkszNTY4X1NSX0dSRl9PRkZTRVQ7Cj4gKyAgICAgICAgICAgICAgICpyZWcgKz0gKGJhbmstPmJh bmtfbnVtICAtIDEpICogUkszNTY4X1NSX0JBTktfU1RSSURFOwo+ICsgICAgICAgfQo+ICsgICAg ICAgKnJlZyArPSAoKHBpbl9udW0gLyBSSzM1NjhfU1JfUElOU19QRVJfUkVHKSAqIDQpOwo+ICsg ICAgICAgKmJpdCA9IHBpbl9udW0gJSBSSzM1NjhfU1JfUElOU19QRVJfUkVHOwo+ICsKPiArICAg ICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICsjZGVmaW5lIFJLMzU2OF9QVUxMX1BNVV9PRkZTRVQg ICAgICAgICAweDIwCj4gKyNkZWZpbmUgUkszNTY4X1BVTExfR1JGX09GRlNFVCAgICAgICAgIDB4 ODAKPiArI2RlZmluZSBSSzM1NjhfUFVMTF9CSVRTX1BFUl9QSU4gICAgICAgMgo+ICsjZGVmaW5l IFJLMzU2OF9QVUxMX1BJTlNfUEVSX1JFRyAgICAgICA4Cj4gKyNkZWZpbmUgUkszNTY4X1BVTExf QkFOS19TVFJJREUgICAgICAgICAgICAgICAgMHgxMAo+ICsKPiArc3RhdGljIHZvaWQgcmszNTY4 X2NhbGNfcHVsbF9yZWdfYW5kX2JpdChzdHJ1Y3Qgcm9ja2NoaXBfcGluX2JhbmsgKmJhbmssCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGluX251bSwgc3Ry dWN0IHJlZ21hcCAqKnJlZ21hcCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGludCAqcmVnLCB1OCAqYml0KQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3Qgcm9ja2NoaXBf cGluY3RybCAqaW5mbyA9IGJhbmstPmRydmRhdGE7Cj4gKwo+ICsgICAgICAgaWYgKGJhbmstPmJh bmtfbnVtID09IDApIHsKPiArICAgICAgICAgICAgICAgKnJlZ21hcCA9IGluZm8tPnJlZ21hcF9w bXU7Cj4gKyAgICAgICAgICAgICAgICpyZWcgPSBSSzM1NjhfUFVMTF9QTVVfT0ZGU0VUOwo+ICsg ICAgICAgICAgICAgICAqcmVnICs9IGJhbmstPmJhbmtfbnVtICogUkszNTY4X1BVTExfQkFOS19T VFJJREU7Cj4gKyAgICAgICAgICAgICAgICpyZWcgKz0gKChwaW5fbnVtIC8gUkszNTY4X1BVTExf UElOU19QRVJfUkVHKSAqIDQpOwo+ICsKPiArICAgICAgICAgICAgICAgKmJpdCA9IHBpbl9udW0g JSBSSzM1NjhfUFVMTF9QSU5TX1BFUl9SRUc7Cj4gKyAgICAgICAgICAgICAgICpiaXQgKj0gUksz NTY4X1BVTExfQklUU19QRVJfUElOOwo+ICsgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAg ICAgKnJlZ21hcCA9IGluZm8tPnJlZ21hcF9iYXNlOwo+ICsgICAgICAgICAgICAgICAqcmVnID0g UkszNTY4X1BVTExfR1JGX09GRlNFVDsKPiArICAgICAgICAgICAgICAgKnJlZyArPSAoYmFuay0+ YmFua19udW0gLSAxKSAqIFJLMzU2OF9QVUxMX0JBTktfU1RSSURFOwo+ICsgICAgICAgICAgICAg ICAqcmVnICs9ICgocGluX251bSAvIFJLMzU2OF9QVUxMX1BJTlNfUEVSX1JFRykgKiA0KTsKPiAr Cj4gKyAgICAgICAgICAgICAgICpiaXQgPSAocGluX251bSAlIFJLMzU2OF9QVUxMX1BJTlNfUEVS X1JFRyk7Cj4gKyAgICAgICAgICAgICAgICpiaXQgKj0gUkszNTY4X1BVTExfQklUU19QRVJfUElO Owo+ICsgICAgICAgfQo+ICt9Cj4gKwo+ICsjZGVmaW5lIFJLMzU2OF9EUlZfUE1VX09GRlNFVCAg ICAgICAgICAweDcwCj4gKyNkZWZpbmUgUkszNTY4X0RSVl9HUkZfT0ZGU0VUICAgICAgICAgIDB4 MjAwCj4gKyNkZWZpbmUgUkszNTY4X0RSVl9CSVRTX1BFUl9QSU4gICAgICAgICAgICAgICAgOAo+ ICsjZGVmaW5lIFJLMzU2OF9EUlZfUElOU19QRVJfUkVHICAgICAgICAgICAgICAgIDIKPiArI2Rl ZmluZSBSSzM1NjhfRFJWX0JBTktfU1RSSURFICAgICAgICAgMHg0MAo+ICsKPiArc3RhdGljIHZv aWQgcmszNTY4X2NhbGNfZHJ2X3JlZ19hbmRfYml0KHN0cnVjdCByb2NrY2hpcF9waW5fYmFuayAq YmFuaywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpbl9u dW0sIHN0cnVjdCByZWdtYXAgKipyZWdtYXAsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGludCAqcmVnLCB1OCAqYml0KQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3Qgcm9j a2NoaXBfcGluY3RybCAqaW5mbyA9IGJhbmstPmRydmRhdGE7Cj4gKwo+ICsgICAgICAgLyogVGhl IGZpcnN0IDMyIHBpbnMgb2YgdGhlIGZpcnN0IGJhbmsgYXJlIGxvY2F0ZWQgaW4gUE1VICovCj4g KyAgICAgICBpZiAoYmFuay0+YmFua19udW0gPT0gMCkgewo+ICsgICAgICAgICAgICAgICAqcmVn bWFwID0gaW5mby0+cmVnbWFwX3BtdTsKPiArICAgICAgICAgICAgICAgKnJlZyA9IFJLMzU2OF9E UlZfUE1VX09GRlNFVDsKPiArICAgICAgICAgICAgICAgKnJlZyArPSAoKHBpbl9udW0gLyBSSzM1 NjhfRFJWX1BJTlNfUEVSX1JFRykgKiA0KTsKPiArCj4gKyAgICAgICAgICAgICAgICpiaXQgPSBw aW5fbnVtICUgUkszNTY4X0RSVl9QSU5TX1BFUl9SRUc7Cj4gKyAgICAgICAgICAgICAgICpiaXQg Kj0gUkszNTY4X0RSVl9CSVRTX1BFUl9QSU47Cj4gKyAgICAgICB9IGVsc2Ugewo+ICsgICAgICAg ICAgICAgICAqcmVnbWFwID0gaW5mby0+cmVnbWFwX2Jhc2U7Cj4gKyAgICAgICAgICAgICAgICpy ZWcgPSBSSzM1NjhfRFJWX0dSRl9PRkZTRVQ7Cj4gKyAgICAgICAgICAgICAgICpyZWcgKz0gKGJh bmstPmJhbmtfbnVtIC0gMSkgKiBSSzM1NjhfRFJWX0JBTktfU1RSSURFOwo+ICsgICAgICAgICAg ICAgICAqcmVnICs9ICgocGluX251bSAvIFJLMzU2OF9EUlZfUElOU19QRVJfUkVHKSAqIDQpOwo+ ICsKPiArICAgICAgICAgICAgICAgKmJpdCA9IChwaW5fbnVtICUgUkszNTY4X0RSVl9QSU5TX1BF Ul9SRUcpOwo+ICsgICAgICAgICAgICAgICAqYml0ICo9IFJLMzU2OF9EUlZfQklUU19QRVJfUElO Owo+ICsgICAgICAgfQo+ICt9Cj4gKwo+ICBzdGF0aWMgaW50IHJvY2tjaGlwX3BlcnBpbl9kcnZf bGlzdFtEUlZfVFlQRV9NQVhdWzhdID0gewo+ICAgICAgICAgeyAyLCA0LCA4LCAxMiwgLTEsIC0x LCAtMSwgLTEgfSwKPiAgICAgICAgIHsgMywgNiwgOSwgMTIsIC0xLCAtMSwgLTEsIC0xIH0sCj4g QEAgLTIyMDIsNiArMjQxNCwxMSBAQCBzdGF0aWMgaW50IHJvY2tjaGlwX3NldF9kcml2ZV9wZXJw aW4oc3RydWN0IHJvY2tjaGlwX3Bpbl9iYW5rICpiYW5rLAo+ICAgICAgICAgICAgICAgICBiYW5r LT5iYW5rX251bSwgcGluX251bSwgc3RyZW5ndGgpOwo+Cj4gICAgICAgICBjdHJsLT5kcnZfY2Fs Y19yZWcoYmFuaywgcGluX251bSwgJnJlZ21hcCwgJnJlZywgJmJpdCk7Cj4gKyAgICAgICBpZiAo Y3RybC0+dHlwZSA9PSBSSzM1NjgpIHsKPiArICAgICAgICAgICAgICAgcm1hc2tfYml0cyA9IFJL MzU2OF9EUlZfQklUU19QRVJfUElOOwo+ICsgICAgICAgICAgICAgICByZXQgPSAoMSA8PCAoc3Ry ZW5ndGggKyAxKSkgLSAxOwo+ICsgICAgICAgICAgICAgICBnb3RvIGNvbmZpZzsKPiArICAgICAg IH0KPgo+ICAgICAgICAgcmV0ID0gLUVJTlZBTDsKPiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKHJvY2tjaGlwX3BlcnBpbl9kcnZfbGlzdFtkcnZfdHlwZV0pOyBpKyspIHsKPiBA QCAtMjI3MSw2ICsyNDg4LDcgQEAgc3RhdGljIGludCByb2NrY2hpcF9zZXRfZHJpdmVfcGVycGlu KHN0cnVjdCByb2NrY2hpcF9waW5fYmFuayAqYmFuaywKPiAgICAgICAgICAgICAgICAgcmV0dXJu IC1FSU5WQUw7Cj4gICAgICAgICB9Cj4KPiArY29uZmlnOgo+ICAgICAgICAgLyogZW5hYmxlIHRo ZSB3cml0ZSB0byB0aGUgZXF1aXZhbGVudCBsb3dlciBiaXRzICovCj4gICAgICAgICBkYXRhID0g KCgxIDw8IHJtYXNrX2JpdHMpIC0gMSkgPDwgKGJpdCArIDE2KTsKPiAgICAgICAgIHJtYXNrID0g ZGF0YSB8IChkYXRhID4+IDE2KTsKPiBAQCAtMjM3Myw2ICsyNTkxLDcgQEAgc3RhdGljIGludCBy b2NrY2hpcF9zZXRfcHVsbChzdHJ1Y3Qgcm9ja2NoaXBfcGluX2JhbmsgKmJhbmssCj4gICAgICAg ICBjYXNlIFJLMzMwODoKPiAgICAgICAgIGNhc2UgUkszMzY4Ogo+ICAgICAgICAgY2FzZSBSSzMz OTk6Cj4gKyAgICAgICBjYXNlIFJLMzU2ODoKPiAgICAgICAgICAgICAgICAgcHVsbF90eXBlID0g YmFuay0+cHVsbF90eXBlW3Bpbl9udW0gLyA4XTsKPiAgICAgICAgICAgICAgICAgcmV0ID0gLUVJ TlZBTDsKPiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocm9ja2No aXBfcHVsbF9saXN0W3B1bGxfdHlwZV0pOwo+IEBAIC0yMzgyLDYgKzI2MDEsMTQgQEAgc3RhdGlj IGludCByb2NrY2hpcF9zZXRfcHVsbChzdHJ1Y3Qgcm9ja2NoaXBfcGluX2JhbmsgKmJhbmssCj4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKPiAgICAgICAgICAgICAgICAg ICAgICAgICB9Cj4gICAgICAgICAgICAgICAgIH0KPiArICAgICAgICAgICAgICAgLyoKPiArICAg ICAgICAgICAgICAgICogSW4gdGhlIFRSTSwgcHVsbC11cCBiZWluZyAxIGZvciBldmVyeXRoaW5n IGV4Y2VwdCB0aGUgR1BJTzBfRDAtRDYsCj4gKyAgICAgICAgICAgICAgICAqIHdoZXJlIHRoYXQg cHVsbCB1cCB2YWx1ZSBiZWNvbWVzIDMuCj4gKyAgICAgICAgICAgICAgICAqLwo+ICsgICAgICAg ICAgICAgICBpZiAoY3RybC0+dHlwZSA9PSBSSzM1NjggJiYgYmFuay0+YmFua19udW0gPT0gMCAm JiBwaW5fbnVtID49IDI3ICYmIHBpbl9udW0gPD0gMzApIHsKPiArICAgICAgICAgICAgICAgICAg ICAgICBpZiAocmV0ID09IDEpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQg PSAzOwo+ICsgICAgICAgICAgICAgICB9Cj4KPiAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDAp IHsKPiAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKGluZm8tPmRldiwgInVuc3VwcG9y dGVkIHB1bGwgc2V0dGluZyAlZFxuIiwKPiBAQCAtMjQyNiw2ICsyNjUzLDM1IEBAIHN0YXRpYyBp bnQgcmszMzI4X2NhbGNfc2NobWl0dF9yZWdfYW5kX2JpdChzdHJ1Y3Qgcm9ja2NoaXBfcGluX2Jh bmsgKmJhbmssCj4gICAgICAgICByZXR1cm4gMDsKPiAgfQo+Cj4gKyNkZWZpbmUgUkszNTY4X1ND SE1JVFRfQklUU19QRVJfUElOICAgICAgICAgICAgMgo+ICsjZGVmaW5lIFJLMzU2OF9TQ0hNSVRU X1BJTlNfUEVSX1JFRyAgICAgICAgICAgIDgKPiArI2RlZmluZSBSSzM1NjhfU0NITUlUVF9CQU5L X1NUUklERSAgICAgICAgICAgICAweDEwCj4gKyNkZWZpbmUgUkszNTY4X1NDSE1JVFRfR1JGX09G RlNFVCAgICAgICAgICAgICAgMHhjMAo+ICsjZGVmaW5lIFJLMzU2OF9TQ0hNSVRUX1BNVUdSRl9P RkZTRVQgICAgICAgICAgIDB4MzAKPiArCj4gK3N0YXRpYyBpbnQgcmszNTY4X2NhbGNfc2NobWl0 dF9yZWdfYW5kX2JpdChzdHJ1Y3Qgcm9ja2NoaXBfcGluX2JhbmsgKmJhbmssCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaW5fbnVtLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVnbWFwICoqcmVnbWFw LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZywg dTggKmJpdCkKPiArewo+ICsgICAgICAgc3RydWN0IHJvY2tjaGlwX3BpbmN0cmwgKmluZm8gPSBi YW5rLT5kcnZkYXRhOwo+ICsKPiArICAgICAgIGlmIChiYW5rLT5iYW5rX251bSA9PSAwKSB7Cj4g KyAgICAgICAgICAgICAgICpyZWdtYXAgPSBpbmZvLT5yZWdtYXBfcG11Owo+ICsgICAgICAgICAg ICAgICAqcmVnID0gUkszNTY4X1NDSE1JVFRfUE1VR1JGX09GRlNFVDsKPiArICAgICAgIH0gZWxz ZSB7Cj4gKyAgICAgICAgICAgICAgICpyZWdtYXAgPSBpbmZvLT5yZWdtYXBfYmFzZTsKPiArICAg ICAgICAgICAgICAgKnJlZyA9IFJLMzU2OF9TQ0hNSVRUX0dSRl9PRkZTRVQ7Cj4gKyAgICAgICAg ICAgICAgICpyZWcgKz0gKGJhbmstPmJhbmtfbnVtIC0gMSkgKiBSSzM1NjhfU0NITUlUVF9CQU5L X1NUUklERTsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICAqcmVnICs9ICgocGluX251bSAvIFJL MzU2OF9TQ0hNSVRUX1BJTlNfUEVSX1JFRykgKiA0KTsKPiArICAgICAgICpiaXQgPSBwaW5fbnVt ICUgUkszNTY4X1NDSE1JVFRfUElOU19QRVJfUkVHOwo+ICsgICAgICAgKmJpdCAqPSBSSzM1Njhf U0NITUlUVF9CSVRTX1BFUl9QSU47Cj4gKwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4g IHN0YXRpYyBpbnQgcm9ja2NoaXBfZ2V0X3NjaG1pdHQoc3RydWN0IHJvY2tjaGlwX3Bpbl9iYW5r ICpiYW5rLCBpbnQgcGluX251bSkKPiAgewo+ICAgICAgICAgc3RydWN0IHJvY2tjaGlwX3BpbmN0 cmwgKmluZm8gPSBiYW5rLT5kcnZkYXRhOwo+IEBAIC0yNDQ0LDYgKzI3MDAsMTMgQEAgc3RhdGlj IGludCByb2NrY2hpcF9nZXRfc2NobWl0dChzdHJ1Y3Qgcm9ja2NoaXBfcGluX2JhbmsgKmJhbmss IGludCBwaW5fbnVtKQo+ICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Cj4gICAgICAgICBk YXRhID4+PSBiaXQ7Cj4gKyAgICAgICBzd2l0Y2ggKGN0cmwtPnR5cGUpIHsKPiArICAgICAgIGNh c2UgUkszNTY4Ogo+ICsgICAgICAgICAgICAgICByZXR1cm4gZGF0YSAmICgoMSA8PCBSSzM1Njhf U0NITUlUVF9CSVRTX1BFUl9QSU4pIC0gMSk7Cj4gKyAgICAgICBkZWZhdWx0Ogo+ICsgICAgICAg ICAgICAgICBicmVhazsKPiArICAgICAgIH0KPiArCj4gICAgICAgICByZXR1cm4gZGF0YSAmIDB4 MTsKPiAgfQo+Cj4gQEAgLTI0NjUsOCArMjcyOCwxNyBAQCBzdGF0aWMgaW50IHJvY2tjaGlwX3Nl dF9zY2htaXR0KHN0cnVjdCByb2NrY2hpcF9waW5fYmFuayAqYmFuaywKPiAgICAgICAgICAgICAg ICAgcmV0dXJuIHJldDsKPgo+ICAgICAgICAgLyogZW5hYmxlIHRoZSB3cml0ZSB0byB0aGUgZXF1 aXZhbGVudCBsb3dlciBiaXRzICovCj4gLSAgICAgICBkYXRhID0gQklUKGJpdCArIDE2KSB8IChl bmFibGUgPDwgYml0KTsKPiAtICAgICAgIHJtYXNrID0gQklUKGJpdCArIDE2KSB8IEJJVChiaXQp Owo+ICsgICAgICAgc3dpdGNoIChjdHJsLT50eXBlKSB7Cj4gKyAgICAgICBjYXNlIFJLMzU2ODoK PiArICAgICAgICAgICAgICAgZGF0YSA9ICgoMSA8PCBSSzM1NjhfU0NITUlUVF9CSVRTX1BFUl9Q SU4pIC0gMSkgPDwgKGJpdCArIDE2KTsKPiArICAgICAgICAgICAgICAgcm1hc2sgPSBkYXRhIHwg KGRhdGEgPj4gMTYpOwo+ICsgICAgICAgICAgICAgICBkYXRhIHw9ICgoZW5hYmxlID8gMHgyIDog MHgxKSA8PCBiaXQpOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGRlZmF1bHQ6 Cj4gKyAgICAgICAgICAgICAgIGRhdGEgPSBCSVQoYml0ICsgMTYpIHwgKGVuYWJsZSA8PCBiaXQp Owo+ICsgICAgICAgICAgICAgICBybWFzayA9IEJJVChiaXQgKyAxNikgfCBCSVQoYml0KTsKPiAr ICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICB9Cj4KPiAgICAgICAgIHJldHVybiByZWdt YXBfdXBkYXRlX2JpdHMocmVnbWFwLCByZWcsIHJtYXNrLCBkYXRhKTsKPiAgfQo+IEBAIC0yNjQw LDYgKzI5MTIsNyBAQCBzdGF0aWMgYm9vbCByb2NrY2hpcF9waW5jb25mX3B1bGxfdmFsaWQoc3Ry dWN0IHJvY2tjaGlwX3Bpbl9jdHJsICpjdHJsLAo+ICAgICAgICAgY2FzZSBSSzMzMDg6Cj4gICAg ICAgICBjYXNlIFJLMzM2ODoKPiAgICAgICAgIGNhc2UgUkszMzk5Ogo+ICsgICAgICAgY2FzZSBS SzM1Njg6Cj4gICAgICAgICAgICAgICAgIHJldHVybiAocHVsbCAhPSBQSU5fQ09ORklHX0JJQVNf UFVMTF9QSU5fREVGQVVMVCk7Cj4gICAgICAgICB9Cj4KPiBAQCAtNDIxMCw2ICs0NDgzLDQ2IEBA IHN0YXRpYyBzdHJ1Y3Qgcm9ja2NoaXBfcGluX2N0cmwgcmszMzk5X3Bpbl9jdHJsID0gewo+ICAg ICAgICAgICAgICAgICAuZHJ2X2NhbGNfcmVnICAgICAgICAgICA9IHJrMzM5OV9jYWxjX2Rydl9y ZWdfYW5kX2JpdCwKPiAgfTsKPgo+ICtzdGF0aWMgc3RydWN0IHJvY2tjaGlwX3Bpbl9iYW5rIHJr MzU2OF9waW5fYmFua3NbXSA9IHsKPiArICAgICAgIFBJTl9CQU5LX0lPTVVYX0ZMQUdTKDAsIDMy LCAiZ3BpbzAiLCBJT01VWF9TT1VSQ0VfUE1VIHwgSU9NVVhfV0lEVEhfNEJJVCwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT01VWF9TT1VSQ0VfUE1VIHwg SU9NVVhfV0lEVEhfNEJJVCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBJT01VWF9TT1VSQ0VfUE1VIHwgSU9NVVhfV0lEVEhfNEJJVCwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT01VWF9TT1VSQ0VfUE1VIHwgSU9N VVhfV0lEVEhfNEJJVCksCj4gKyAgICAgICBQSU5fQkFOS19JT01VWF9GTEFHUygxLCAzMiwgImdw aW8xIiwgSU9NVVhfV0lEVEhfNEJJVCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBJT01VWF9XSURUSF80QklULAo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIElPTVVYX1dJRFRIXzRCSVQsCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9NVVhfV0lEVEhfNEJJVCksCj4gKyAgICAg ICBQSU5fQkFOS19JT01VWF9GTEFHUygyLCAzMiwgImdwaW8yIiwgSU9NVVhfV0lEVEhfNEJJVCwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT01VWF9XSURU SF80QklULAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElP TVVYX1dJRFRIXzRCSVQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgSU9NVVhfV0lEVEhfNEJJVCksCj4gKyAgICAgICBQSU5fQkFOS19JT01VWF9GTEFHUygz LCAzMiwgImdwaW8zIiwgSU9NVVhfV0lEVEhfNEJJVCwKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBJT01VWF9XSURUSF80QklULAo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTVVYX1dJRFRIXzRCSVQsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9NVVhfV0lEVEhfNEJJVCks Cj4gKyAgICAgICBQSU5fQkFOS19JT01VWF9GTEFHUyg0LCAzMiwgImdwaW80IiwgSU9NVVhfV0lE VEhfNEJJVCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJ T01VWF9XSURUSF80QklULAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIElPTVVYX1dJRFRIXzRCSVQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgSU9NVVhfV0lEVEhfNEJJVCksCj4gK307Cj4gKwo+ICtzdGF0aWMgc3Ry dWN0IHJvY2tjaGlwX3Bpbl9jdHJsIHJrMzU2OF9waW5fY3RybCA9IHsKPiArICAgICAgIC5waW5f YmFua3MgICAgICAgICAgICAgID0gcmszNTY4X3Bpbl9iYW5rcywKPiArICAgICAgIC5ucl9iYW5r cyAgICAgICAgICAgICAgID0gQVJSQVlfU0laRShyazM1NjhfcGluX2JhbmtzKSwKPiArICAgICAg IC5sYWJlbCAgICAgICAgICAgICAgICAgID0gIlJLMzU2OC1HUElPIiwKPiArICAgICAgIC50eXBl ICAgICAgICAgICAgICAgICAgID0gUkszNTY4LAo+ICsgICAgICAgLmdyZl9tdXhfb2Zmc2V0ICAg ICAgICAgPSAweDAsCj4gKyAgICAgICAucG11X211eF9vZmZzZXQgICAgICAgICA9IDB4MCwKPiAr ICAgICAgIC5ncmZfZHJ2X29mZnNldCAgICAgICAgID0gMHgwMjAwLAo+ICsgICAgICAgLnBtdV9k cnZfb2Zmc2V0ICAgICAgICAgPSAweDAwNzAsCj4gKyAgICAgICAuaW9tdXhfcm91dGVzICAgICAg ICAgICA9IHJrMzU2OF9tdXhfcm91dGVfZGF0YSwKPiArICAgICAgIC5uaW9tdXhfcm91dGVzICAg ICAgICAgID0gQVJSQVlfU0laRShyazM1NjhfbXV4X3JvdXRlX2RhdGEpLAo+ICsgICAgICAgLnB1 bGxfY2FsY19yZWcgICAgICAgICAgPSByazM1NjhfY2FsY19wdWxsX3JlZ19hbmRfYml0LAo+ICsg ICAgICAgLmRydl9jYWxjX3JlZyAgICAgICAgICAgPSByazM1NjhfY2FsY19kcnZfcmVnX2FuZF9i aXQsCj4gKyAgICAgICAuc2xld19yYXRlX2NhbGNfcmVnICAgICA9IHJrMzU2OF9jYWxjX3NsZXdf cmF0ZV9yZWdfYW5kX2JpdCwKPiArICAgICAgIC5zY2htaXR0X2NhbGNfcmVnICAgICAgID0gcmsz NTY4X2NhbGNfc2NobWl0dF9yZWdfYW5kX2JpdCwKPiArfTsKPiArCj4gIHN0YXRpYyBjb25zdCBz dHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJvY2tjaGlwX3BpbmN0cmxfZHRfbWF0Y2hbXSA9IHsKPiAgICAg ICAgIHsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscHgzMC1waW5jdHJsIiwKPiAgICAgICAgICAg ICAgICAgLmRhdGEgPSAmcHgzMF9waW5fY3RybCB9LAo+IEBAIC00MjM5LDYgKzQ1NTIsOCBAQCBz dGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF9waW5jdHJsX2R0X21hdGNo W10gPSB7Cj4gICAgICAgICAgICAgICAgIC5kYXRhID0gJnJrMzM2OF9waW5fY3RybCB9LAo+ICAg ICAgICAgeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktcGluY3RybCIsCj4gICAgICAg ICAgICAgICAgIC5kYXRhID0gJnJrMzM5OV9waW5fY3RybCB9LAo+ICsgICAgICAgeyAuY29tcGF0 aWJsZSA9ICJyb2NrY2hpcCxyazM1NjgtcGluY3RybCIsCj4gKyAgICAgICAgICAgICAgIC5kYXRh ID0gJnJrMzU2OF9waW5fY3RybCB9LAo+ICAgICAgICAge30sCj4gIH07Cj4KPiAtLQo+IDIuMjUu MQo+Cj4KPgo+Cj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KPiBMaW51eC1yb2NrY2hpcCBtYWlsaW5nIGxpc3QKPiBMaW51eC1yb2NrY2hpcEBsaXN0cy5p bmZyYWRlYWQub3JnCj4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1yb2NrY2hpcAo+Cj4KPgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KTGludXgtcm9ja2NoaXAgbWFpbGluZyBsaXN0CkxpbnV4LXJvY2tjaGlw QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1yb2NrY2hpcAo=