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=-19.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C6C49C4338F for ; Mon, 9 Aug 2021 14:55:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A670E6101D for ; Mon, 9 Aug 2021 14:55:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235262AbhHIOzy (ORCPT ); Mon, 9 Aug 2021 10:55:54 -0400 Received: from mail.kernel.org ([198.145.29.99]:44416 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235293AbhHIOzW (ORCPT ); Mon, 9 Aug 2021 10:55:22 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3AC796101D; Mon, 9 Aug 2021 14:54:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1628520896; bh=YCFy1J2Y2QsNsPSVYSAN99rjizBKWXJw6JQNinsDlbo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TS4nSHJiOxNWQNoIxwClvDENw00c1lcg2XvB9Pv7QTObBnjaAH+2CZ8tNOb9lSCNT X9z+pcGnnF/mhQal3Th0n/ZG7aF6Ho1GyedVBXb1Imp63+jeiFPXUcg30N9LvCrIYh 9E/1wYctTBFC8FmMso6G27anRRcH6uhMh8GXrUeCgVfKFSypVQnZgXqy0i9dWcDN1K K9tOscWmJ2VsmN+11JXSm/yl+0wX9pnZjpNXpUBKux4MXLBWfdOWh6RhCNUbHf6jvi 6Ddjn48Ib0RCtufyT743xEqV2I4PHEuFt6fnOiwdUSvtTpPAq6ZPYMF8f3fqKzRMoj DsPVJ13fA55sg== Received: by pali.im (Postfix) id EFC1AC7C; Mon, 9 Aug 2021 16:54:55 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Michael Turquette , Stephen Boyd , Rob Herring , Greg Kroah-Hartman Cc: Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Vladimir Vid , =?UTF-8?q?Marek=20Beh=C3=BAn?= , linux-clk@vger.kernel.org, linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v5 6/6] serial: mvebu-uart: implement support for baudrates higher than 230400 Date: Mon, 9 Aug 2021 16:53:29 +0200 Message-Id: <20210809145329.24177-7-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210809145329.24177-1-pali@kernel.org> References: <20210624224909.6350-1-pali@kernel.org> <20210809145329.24177-1-pali@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-kernel@vger.kernel.org This change implements simple usage of fractional divisor. When main divisor D is too large to represent requested baudrate then use divisor M from fractional divisor feature. All the M prescalers are set to same and maximal value 63, so fractional part is not used at all. Tests showed that UART at 1500000 baudrate via this configuration is stable and usable. So there is no need to implement complicated calculation of fractional coefficients yet. To use this feature with higher baudrates, it is required to use UART clock provided by UART clock driver. Default boot xtal clock is not capable of higher baudrates and this change also contains code for determining upper limit of possible baudrate. Signed-off-by: Pali Rohár --- drivers/tty/serial/mvebu-uart.c | 79 ++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c index a31235add99f..0fe251b8627b 100644 --- a/drivers/tty/serial/mvebu-uart.c +++ b/drivers/tty/serial/mvebu-uart.c @@ -99,6 +99,7 @@ #define UART_OSAMP 0x14 #define OSAMP_DEFAULT_DIVISOR 16 #define OSAMP_DIVISORS_MASK 0x3F3F3F3F +#define OSAMP_MAX_DIVISOR 63 #define MVEBU_NR_UARTS 2 @@ -479,18 +480,59 @@ static int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud) return -EOPNOTSUPP; /* - * The baudrate is derived from the UART clock thanks to two divisors: - * > D ("baud generator"): can divide the clock from 2 to 2^10 - 1. - * > M ("fractional divisor"): allows a better accuracy for - * baudrates higher than 230400. + * The baudrate is derived from the UART clock thanks to divisors: + * > d1 * d2 ("TBG divisors"): can divide only TBG clock from 1 to 6 + * > D ("baud generator"): can divide the clock from 1 to 1023 + * > M ("fractional divisor"): allows a better accuracy (from 1 to 63) * - * As the derivation of M is rather complicated, the code sticks to its - * default value (x16) when all the prescalers are zeroed, and only - * makes use of D to configure the desired baudrate. + * Exact formulas for calculating baudrate: + * + * with default x16 scheme: + * baudrate = xtal / (d * 16) + * baudrate = tbg / (d1 * d2 * d * 16) + * + * with fractional divisor: + * baudrate = 10 * xtal / (d * (3 * (m1 + m2) + 2 * (m3 + m4))) + * baudrate = 10 * tbg / (d1*d2 * d * (3 * (m1 + m2) + 2 * (m3 + m4))) + * + * Oversampling value: + * osamp = (m1 << 0) | (m2 << 8) | (m3 << 16) | (m4 << 24); + * + * Where m1 controls number of clock cycles per bit for bits 1,2,3; + * m2 for bits 4,5,6; m3 for bits 7,8 and m4 for bits 9,10. + * + * To simplify baudrate setup set all the M prescalers to same value. + * For 9600 baudrate and higher it is enough to use just default (x16) + * divisor or fractional divisor with M = 63, so there is no need to + * use real fractional support (when the M prescalers are not equal). + * + * When all the M prescalers are zeroed then default (x16) divisor is + * used. Default x16 scheme is more stable than M (fractional divisor), + * so use M only when D divisor is not enough to derivate baudrate. + * + * Member port->uartclk is either xtal clock rate or TBG clock rate + * divided by (d1 * d2). So UART clock driver already sets d1 and d2 + * divisors and UART driver cannot change them. Moreover they are + * shared with both UARTs. */ + m_divisor = OSAMP_DEFAULT_DIVISOR; d_divisor = DIV_ROUND_CLOSEST(port->uartclk, baud * m_divisor); + if (d_divisor > BRDV_BAUD_MAX) { + /* + * Experiments showed that small M divisors are unstable. + * So use maximal possible M = 63 and calculate D divisor. + */ + m_divisor = OSAMP_MAX_DIVISOR; + d_divisor = DIV_ROUND_CLOSEST(port->uartclk, baud * m_divisor); + } + + if (d_divisor < 1) + d_divisor = 1; + else if (d_divisor > BRDV_BAUD_MAX) + d_divisor = BRDV_BAUD_MAX; + spin_lock_irqsave(&mvebu_uart_lock, flags); brdv = readl(port->membase + UART_BRDV); brdv &= ~BRDV_BAUD_MASK; @@ -500,6 +542,9 @@ static int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud) osamp = readl(port->membase + UART_OSAMP); osamp &= ~OSAMP_DIVISORS_MASK; + if (m_divisor != OSAMP_DEFAULT_DIVISOR) + osamp |= (m_divisor << 0) | (m_divisor << 8) | + (m_divisor << 16) | (m_divisor << 24); writel(osamp, port->membase + UART_OSAMP); return 0; @@ -529,14 +574,14 @@ static void mvebu_uart_set_termios(struct uart_port *port, port->ignore_status_mask |= STAT_RX_RDY(port) | STAT_BRK_ERR; /* - * Maximal divisor is 1023 * 16 when using default (x16) scheme. - * Maximum achievable frequency with simple baudrate divisor is 230400. - * Since the error per bit frame would be of more than 15%, achieving - * higher frequencies would require to implement the fractional divisor - * feature. + * Maximal divisor is 1023 and maximal fractional divisor is 63. And + * experiments showed that baudrates above 1/80 of base clock are not + * stable and usable. So disallow baudrate above 1/80 of the base clock. + * When port->uartclk is not available then mvebu_uart_baud_rate_set() + * fails so values min_baud and max_baud in this case does not matter. */ - min_baud = DIV_ROUND_UP(port->uartclk, 1023 * 16); - max_baud = 230400; + min_baud = DIV_ROUND_UP(port->uartclk, BRDV_BAUD_MAX*OSAMP_MAX_DIVISOR); + max_baud = port->uartclk / 80; baud = uart_get_baud_rate(port, termios, old, min_baud, max_baud); if (mvebu_uart_baud_rate_set(port, baud)) { @@ -1397,14 +1442,14 @@ static int mvebu_uart_clock_probe(struct platform_device *pdev) * Calculate the smallest TBG d1 and d2 divisors that * still can provide 9600 baudrate. */ - d1 = DIV_ROUND_UP(rate, 9600 * OSAMP_DEFAULT_DIVISOR * + d1 = DIV_ROUND_UP(rate, 9600 * OSAMP_MAX_DIVISOR * BRDV_BAUD_MAX); if (d1 < 1) d1 = 1; else if (d1 > CLK_TBG_DIV1_MAX) d1 = CLK_TBG_DIV1_MAX; - d2 = DIV_ROUND_UP(rate, 9600 * OSAMP_DEFAULT_DIVISOR * + d2 = DIV_ROUND_UP(rate, 9600 * OSAMP_MAX_DIVISOR * BRDV_BAUD_MAX * d1); if (d2 < 1) d2 = 1; @@ -1419,7 +1464,7 @@ static int mvebu_uart_clock_probe(struct platform_device *pdev) } /* Skip clock source which cannot provide 9600 baudrate */ - if (rate > 9600 * OSAMP_DEFAULT_DIVISOR * BRDV_BAUD_MAX * d1 * d2) + if (rate > 9600 * OSAMP_MAX_DIVISOR * BRDV_BAUD_MAX * d1 * d2) continue; /* -- 2.20.1 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=-17.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C3A2C4338F for ; Mon, 9 Aug 2021 14:59:21 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 58AA461019 for ; Mon, 9 Aug 2021 14:59:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 58AA461019 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org 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=U5XU4gsr4ElDVmig78PRN0Wu+UJTGDpKbc9Bkws78Lk=; b=Ar9+un0aU6pvQr Yo92oQ/6JFqQ3/o7S/KB3Caa8wfXGKy7iWBThfEReHRHYjy7LWIE7EsOdry9AdZhqv+WPv7HZHyyB 4+K4A+gglrUNwShk/EwNhXt4G2FEPh8Oe1OBoZKJU/Nw1cJ5rXXSwASKEoToCDaYVJrQY6KsJWRPp YojkTk2tu1BozcFxvVjcHGzUsrUXFFVYqtHa3b21cSSxBLm8HCKHM7fhgXYneZJxcoAc9tpGp3I83 hW+NbEUcquEjXUXtgPyBY7/BktOCU7G9S3fi8r4AWkk2jRx+3NlOnJ+aPH1r+Eo4yuYyG8CIHkSon blBvLKuy9uX+UCvROq5g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mD6io-0010UD-EP; Mon, 09 Aug 2021 14:57:46 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mD6g5-000zIc-KO for linux-arm-kernel@lists.infradead.org; Mon, 09 Aug 2021 14:55:04 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3AC796101D; Mon, 9 Aug 2021 14:54:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1628520896; bh=YCFy1J2Y2QsNsPSVYSAN99rjizBKWXJw6JQNinsDlbo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TS4nSHJiOxNWQNoIxwClvDENw00c1lcg2XvB9Pv7QTObBnjaAH+2CZ8tNOb9lSCNT X9z+pcGnnF/mhQal3Th0n/ZG7aF6Ho1GyedVBXb1Imp63+jeiFPXUcg30N9LvCrIYh 9E/1wYctTBFC8FmMso6G27anRRcH6uhMh8GXrUeCgVfKFSypVQnZgXqy0i9dWcDN1K K9tOscWmJ2VsmN+11JXSm/yl+0wX9pnZjpNXpUBKux4MXLBWfdOWh6RhCNUbHf6jvi 6Ddjn48Ib0RCtufyT743xEqV2I4PHEuFt6fnOiwdUSvtTpPAq6ZPYMF8f3fqKzRMoj DsPVJ13fA55sg== Received: by pali.im (Postfix) id EFC1AC7C; Mon, 9 Aug 2021 16:54:55 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Michael Turquette , Stephen Boyd , Rob Herring , Greg Kroah-Hartman Cc: Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Vladimir Vid , =?UTF-8?q?Marek=20Beh=C3=BAn?= , linux-clk@vger.kernel.org, linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v5 6/6] serial: mvebu-uart: implement support for baudrates higher than 230400 Date: Mon, 9 Aug 2021 16:53:29 +0200 Message-Id: <20210809145329.24177-7-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210809145329.24177-1-pali@kernel.org> References: <20210624224909.6350-1-pali@kernel.org> <20210809145329.24177-1-pali@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210809_075457_817871_F6C02CB7 X-CRM114-Status: GOOD ( 24.56 ) 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 VGhpcyBjaGFuZ2UgaW1wbGVtZW50cyBzaW1wbGUgdXNhZ2Ugb2YgZnJhY3Rpb25hbCBkaXZpc29y LiBXaGVuIG1haW4KZGl2aXNvciBEIGlzIHRvbyBsYXJnZSB0byByZXByZXNlbnQgcmVxdWVzdGVk IGJhdWRyYXRlIHRoZW4gdXNlIGRpdmlzb3IgTQpmcm9tIGZyYWN0aW9uYWwgZGl2aXNvciBmZWF0 dXJlLiBBbGwgdGhlIE0gcHJlc2NhbGVycyBhcmUgc2V0IHRvIHNhbWUgYW5kCm1heGltYWwgdmFs dWUgNjMsIHNvIGZyYWN0aW9uYWwgcGFydCBpcyBub3QgdXNlZCBhdCBhbGwuCgpUZXN0cyBzaG93 ZWQgdGhhdCBVQVJUIGF0IDE1MDAwMDAgYmF1ZHJhdGUgdmlhIHRoaXMgY29uZmlndXJhdGlvbiBp cyBzdGFibGUKYW5kIHVzYWJsZS4gU28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbXBsZW1lbnQgY29t cGxpY2F0ZWQgY2FsY3VsYXRpb24gb2YKZnJhY3Rpb25hbCBjb2VmZmljaWVudHMgeWV0LgoKVG8g dXNlIHRoaXMgZmVhdHVyZSB3aXRoIGhpZ2hlciBiYXVkcmF0ZXMsIGl0IGlzIHJlcXVpcmVkIHRv IHVzZSBVQVJUIGNsb2NrCnByb3ZpZGVkIGJ5IFVBUlQgY2xvY2sgZHJpdmVyLiBEZWZhdWx0IGJv b3QgeHRhbCBjbG9jayBpcyBub3QgY2FwYWJsZSBvZgpoaWdoZXIgYmF1ZHJhdGVzIGFuZCB0aGlz IGNoYW5nZSBhbHNvIGNvbnRhaW5zIGNvZGUgZm9yIGRldGVybWluaW5nIHVwcGVyCmxpbWl0IG9m IHBvc3NpYmxlIGJhdWRyYXRlLgoKU2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGlAa2Vy bmVsLm9yZz4KLS0tCiBkcml2ZXJzL3R0eS9zZXJpYWwvbXZlYnUtdWFydC5jIHwgNzkgKysrKysr KysrKysrKysrKysrKysrKysrKystLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgNjIgaW5zZXJ0aW9u cygrKSwgMTcgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL212 ZWJ1LXVhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tdmVidS11YXJ0LmMKaW5kZXggYTMxMjM1 YWRkOTlmLi4wZmUyNTFiODYyN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tdmVi dS11YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL212ZWJ1LXVhcnQuYwpAQCAtOTksNiAr OTksNyBAQAogI2RlZmluZSBVQVJUX09TQU1QCQkweDE0CiAjZGVmaW5lICBPU0FNUF9ERUZBVUxU X0RJVklTT1IJMTYKICNkZWZpbmUgIE9TQU1QX0RJVklTT1JTX01BU0sJMHgzRjNGM0YzRgorI2Rl ZmluZSAgT1NBTVBfTUFYX0RJVklTT1IJNjMKIAogI2RlZmluZSBNVkVCVV9OUl9VQVJUUwkJMgog CkBAIC00NzksMTggKzQ4MCw1OSBAQCBzdGF0aWMgaW50IG12ZWJ1X3VhcnRfYmF1ZF9yYXRlX3Nl dChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgYmF1ZCkKIAkJcmV0dXJuIC1F T1BOT1RTVVBQOwogCiAJLyoKLQkgKiBUaGUgYmF1ZHJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBV QVJUIGNsb2NrIHRoYW5rcyB0byB0d28gZGl2aXNvcnM6Ci0JICogICA+IEQgKCJiYXVkIGdlbmVy YXRvciIpOiBjYW4gZGl2aWRlIHRoZSBjbG9jayBmcm9tIDIgdG8gMl4xMCAtIDEuCi0JICogICA+ IE0gKCJmcmFjdGlvbmFsIGRpdmlzb3IiKTogYWxsb3dzIGEgYmV0dGVyIGFjY3VyYWN5IGZvcgot CSAqICAgICBiYXVkcmF0ZXMgaGlnaGVyIHRoYW4gMjMwNDAwLgorCSAqIFRoZSBiYXVkcmF0ZSBp cyBkZXJpdmVkIGZyb20gdGhlIFVBUlQgY2xvY2sgdGhhbmtzIHRvIGRpdmlzb3JzOgorCSAqICAg PiBkMSAqIGQyICgiVEJHIGRpdmlzb3JzIik6IGNhbiBkaXZpZGUgb25seSBUQkcgY2xvY2sgZnJv bSAxIHRvIDYKKwkgKiAgID4gRCAoImJhdWQgZ2VuZXJhdG9yIik6IGNhbiBkaXZpZGUgdGhlIGNs b2NrIGZyb20gMSB0byAxMDIzCisJICogICA+IE0gKCJmcmFjdGlvbmFsIGRpdmlzb3IiKTogYWxs b3dzIGEgYmV0dGVyIGFjY3VyYWN5IChmcm9tIDEgdG8gNjMpCiAJICoKLQkgKiBBcyB0aGUgZGVy aXZhdGlvbiBvZiBNIGlzIHJhdGhlciBjb21wbGljYXRlZCwgdGhlIGNvZGUgc3RpY2tzIHRvIGl0 cwotCSAqIGRlZmF1bHQgdmFsdWUgKHgxNikgd2hlbiBhbGwgdGhlIHByZXNjYWxlcnMgYXJlIHpl cm9lZCwgYW5kIG9ubHkKLQkgKiBtYWtlcyB1c2Ugb2YgRCB0byBjb25maWd1cmUgdGhlIGRlc2ly ZWQgYmF1ZHJhdGUuCisJICogRXhhY3QgZm9ybXVsYXMgZm9yIGNhbGN1bGF0aW5nIGJhdWRyYXRl OgorCSAqCisJICogd2l0aCBkZWZhdWx0IHgxNiBzY2hlbWU6CisJICogICBiYXVkcmF0ZSA9IHh0 YWwgLyAoZCAqIDE2KQorCSAqICAgYmF1ZHJhdGUgPSB0YmcgLyAoZDEgKiBkMiAqIGQgKiAxNikK KwkgKgorCSAqIHdpdGggZnJhY3Rpb25hbCBkaXZpc29yOgorCSAqICAgYmF1ZHJhdGUgPSAxMCAq IHh0YWwgLyAoZCAqICgzICogKG0xICsgbTIpICsgMiAqIChtMyArIG00KSkpCisJICogICBiYXVk cmF0ZSA9IDEwICogdGJnIC8gKGQxKmQyICogZCAqICgzICogKG0xICsgbTIpICsgMiAqIChtMyAr IG00KSkpCisJICoKKwkgKiBPdmVyc2FtcGxpbmcgdmFsdWU6CisJICogICBvc2FtcCA9IChtMSA8 PCAwKSB8IChtMiA8PCA4KSB8IChtMyA8PCAxNikgfCAobTQgPDwgMjQpOworCSAqCisJICogV2hl cmUgbTEgY29udHJvbHMgbnVtYmVyIG9mIGNsb2NrIGN5Y2xlcyBwZXIgYml0IGZvciBiaXRzIDEs MiwzOworCSAqIG0yIGZvciBiaXRzIDQsNSw2OyBtMyBmb3IgYml0cyA3LDggYW5kIG00IGZvciBi aXRzIDksMTAuCisJICoKKwkgKiBUbyBzaW1wbGlmeSBiYXVkcmF0ZSBzZXR1cCBzZXQgYWxsIHRo ZSBNIHByZXNjYWxlcnMgdG8gc2FtZSB2YWx1ZS4KKwkgKiBGb3IgOTYwMCBiYXVkcmF0ZSBhbmQg aGlnaGVyIGl0IGlzIGVub3VnaCB0byB1c2UganVzdCBkZWZhdWx0ICh4MTYpCisJICogZGl2aXNv ciBvciBmcmFjdGlvbmFsIGRpdmlzb3Igd2l0aCBNID0gNjMsIHNvIHRoZXJlIGlzIG5vIG5lZWQg dG8KKwkgKiB1c2UgcmVhbCBmcmFjdGlvbmFsIHN1cHBvcnQgKHdoZW4gdGhlIE0gcHJlc2NhbGVy cyBhcmUgbm90IGVxdWFsKS4KKwkgKgorCSAqIFdoZW4gYWxsIHRoZSBNIHByZXNjYWxlcnMgYXJl IHplcm9lZCB0aGVuIGRlZmF1bHQgKHgxNikgZGl2aXNvciBpcworCSAqIHVzZWQuIERlZmF1bHQg eDE2IHNjaGVtZSBpcyBtb3JlIHN0YWJsZSB0aGFuIE0gKGZyYWN0aW9uYWwgZGl2aXNvciksCisJ ICogc28gdXNlIE0gb25seSB3aGVuIEQgZGl2aXNvciBpcyBub3QgZW5vdWdoIHRvIGRlcml2YXRl IGJhdWRyYXRlLgorCSAqCisJICogTWVtYmVyIHBvcnQtPnVhcnRjbGsgaXMgZWl0aGVyIHh0YWwg Y2xvY2sgcmF0ZSBvciBUQkcgY2xvY2sgcmF0ZQorCSAqIGRpdmlkZWQgYnkgKGQxICogZDIpLiBT byBVQVJUIGNsb2NrIGRyaXZlciBhbHJlYWR5IHNldHMgZDEgYW5kIGQyCisJICogZGl2aXNvcnMg YW5kIFVBUlQgZHJpdmVyIGNhbm5vdCBjaGFuZ2UgdGhlbS4gTW9yZW92ZXIgdGhleSBhcmUKKwkg KiBzaGFyZWQgd2l0aCBib3RoIFVBUlRzLgogCSAqLworCiAJbV9kaXZpc29yID0gT1NBTVBfREVG QVVMVF9ESVZJU09SOwogCWRfZGl2aXNvciA9IERJVl9ST1VORF9DTE9TRVNUKHBvcnQtPnVhcnRj bGssIGJhdWQgKiBtX2Rpdmlzb3IpOwogCisJaWYgKGRfZGl2aXNvciA+IEJSRFZfQkFVRF9NQVgp IHsKKwkJLyoKKwkJICogRXhwZXJpbWVudHMgc2hvd2VkIHRoYXQgc21hbGwgTSBkaXZpc29ycyBh cmUgdW5zdGFibGUuCisJCSAqIFNvIHVzZSBtYXhpbWFsIHBvc3NpYmxlIE0gPSA2MyBhbmQgY2Fs Y3VsYXRlIEQgZGl2aXNvci4KKwkJICovCisJCW1fZGl2aXNvciA9IE9TQU1QX01BWF9ESVZJU09S OworCQlkX2Rpdmlzb3IgPSBESVZfUk9VTkRfQ0xPU0VTVChwb3J0LT51YXJ0Y2xrLCBiYXVkICog bV9kaXZpc29yKTsKKwl9CisKKwlpZiAoZF9kaXZpc29yIDwgMSkKKwkJZF9kaXZpc29yID0gMTsK KwllbHNlIGlmIChkX2Rpdmlzb3IgPiBCUkRWX0JBVURfTUFYKQorCQlkX2Rpdmlzb3IgPSBCUkRW X0JBVURfTUFYOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm12ZWJ1X3VhcnRfbG9jaywgZmxhZ3Mp OwogCWJyZHYgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9CUkRWKTsKIAlicmR2ICY9IH5C UkRWX0JBVURfTUFTSzsKQEAgLTUwMCw2ICs1NDIsOSBAQCBzdGF0aWMgaW50IG12ZWJ1X3VhcnRf YmF1ZF9yYXRlX3NldChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgYmF1ZCkK IAogCW9zYW1wID0gcmVhZGwocG9ydC0+bWVtYmFzZSArIFVBUlRfT1NBTVApOwogCW9zYW1wICY9 IH5PU0FNUF9ESVZJU09SU19NQVNLOworCWlmIChtX2Rpdmlzb3IgIT0gT1NBTVBfREVGQVVMVF9E SVZJU09SKQorCQlvc2FtcCB8PSAobV9kaXZpc29yIDw8IDApIHwgKG1fZGl2aXNvciA8PCA4KSB8 CisJCQkobV9kaXZpc29yIDw8IDE2KSB8IChtX2Rpdmlzb3IgPDwgMjQpOwogCXdyaXRlbChvc2Ft cCwgcG9ydC0+bWVtYmFzZSArIFVBUlRfT1NBTVApOwogCiAJcmV0dXJuIDA7CkBAIC01MjksMTQg KzU3NCwxNCBAQCBzdGF0aWMgdm9pZCBtdmVidV91YXJ0X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0 X3BvcnQgKnBvcnQsCiAJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBTVEFUX1JYX1JEWShw b3J0KSB8IFNUQVRfQlJLX0VSUjsKIAogCS8qCi0JICogTWF4aW1hbCBkaXZpc29yIGlzIDEwMjMg KiAxNiB3aGVuIHVzaW5nIGRlZmF1bHQgKHgxNikgc2NoZW1lLgotCSAqIE1heGltdW0gYWNoaWV2 YWJsZSBmcmVxdWVuY3kgd2l0aCBzaW1wbGUgYmF1ZHJhdGUgZGl2aXNvciBpcyAyMzA0MDAuCi0J ICogU2luY2UgdGhlIGVycm9yIHBlciBiaXQgZnJhbWUgd291bGQgYmUgb2YgbW9yZSB0aGFuIDE1 JSwgYWNoaWV2aW5nCi0JICogaGlnaGVyIGZyZXF1ZW5jaWVzIHdvdWxkIHJlcXVpcmUgdG8gaW1w bGVtZW50IHRoZSBmcmFjdGlvbmFsIGRpdmlzb3IKLQkgKiBmZWF0dXJlLgorCSAqIE1heGltYWwg ZGl2aXNvciBpcyAxMDIzIGFuZCBtYXhpbWFsIGZyYWN0aW9uYWwgZGl2aXNvciBpcyA2My4gQW5k CisJICogZXhwZXJpbWVudHMgc2hvd2VkIHRoYXQgYmF1ZHJhdGVzIGFib3ZlIDEvODAgb2YgYmFz ZSBjbG9jayBhcmUgbm90CisJICogc3RhYmxlIGFuZCB1c2FibGUuIFNvIGRpc2FsbG93IGJhdWRy YXRlIGFib3ZlIDEvODAgb2YgdGhlIGJhc2UgY2xvY2suCisJICogV2hlbiBwb3J0LT51YXJ0Y2xr IGlzIG5vdCBhdmFpbGFibGUgdGhlbiBtdmVidV91YXJ0X2JhdWRfcmF0ZV9zZXQoKQorCSAqIGZh aWxzIHNvIHZhbHVlcyBtaW5fYmF1ZCBhbmQgbWF4X2JhdWQgaW4gdGhpcyBjYXNlIGRvZXMgbm90 IG1hdHRlci4KIAkgKi8KLQltaW5fYmF1ZCA9IERJVl9ST1VORF9VUChwb3J0LT51YXJ0Y2xrLCAx MDIzICogMTYpOwotCW1heF9iYXVkID0gMjMwNDAwOworCW1pbl9iYXVkID0gRElWX1JPVU5EX1VQ KHBvcnQtPnVhcnRjbGssIEJSRFZfQkFVRF9NQVgqT1NBTVBfTUFYX0RJVklTT1IpOworCW1heF9i YXVkID0gcG9ydC0+dWFydGNsayAvIDgwOwogCiAJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShw b3J0LCB0ZXJtaW9zLCBvbGQsIG1pbl9iYXVkLCBtYXhfYmF1ZCk7CiAJaWYgKG12ZWJ1X3VhcnRf YmF1ZF9yYXRlX3NldChwb3J0LCBiYXVkKSkgewpAQCAtMTM5NywxNCArMTQ0MiwxNCBAQCBzdGF0 aWMgaW50IG12ZWJ1X3VhcnRfY2xvY2tfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKIAkJCSAqIENhbGN1bGF0ZSB0aGUgc21hbGxlc3QgVEJHIGQxIGFuZCBkMiBkaXZpc29ycyB0 aGF0CiAJCQkgKiBzdGlsbCBjYW4gcHJvdmlkZSA5NjAwIGJhdWRyYXRlLgogCQkJICovCi0JCQlk MSA9IERJVl9ST1VORF9VUChyYXRlLCA5NjAwICogT1NBTVBfREVGQVVMVF9ESVZJU09SICoKKwkJ CWQxID0gRElWX1JPVU5EX1VQKHJhdGUsIDk2MDAgKiBPU0FNUF9NQVhfRElWSVNPUiAqCiAJCQkJ CQlCUkRWX0JBVURfTUFYKTsKIAkJCWlmIChkMSA8IDEpCiAJCQkJZDEgPSAxOwogCQkJZWxzZSBp ZiAoZDEgPiBDTEtfVEJHX0RJVjFfTUFYKQogCQkJCWQxID0gQ0xLX1RCR19ESVYxX01BWDsKIAot CQkJZDIgPSBESVZfUk9VTkRfVVAocmF0ZSwgOTYwMCAqIE9TQU1QX0RFRkFVTFRfRElWSVNPUiAq CisJCQlkMiA9IERJVl9ST1VORF9VUChyYXRlLCA5NjAwICogT1NBTVBfTUFYX0RJVklTT1IgKgog CQkJCQkJQlJEVl9CQVVEX01BWCAqIGQxKTsKIAkJCWlmIChkMiA8IDEpCiAJCQkJZDIgPSAxOwpA QCAtMTQxOSw3ICsxNDY0LDcgQEAgc3RhdGljIGludCBtdmVidV91YXJ0X2Nsb2NrX3Byb2JlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJCX0KIAogCQkvKiBTa2lwIGNsb2NrIHNvdXJj ZSB3aGljaCBjYW5ub3QgcHJvdmlkZSA5NjAwIGJhdWRyYXRlICovCi0JCWlmIChyYXRlID4gOTYw MCAqIE9TQU1QX0RFRkFVTFRfRElWSVNPUiAqIEJSRFZfQkFVRF9NQVggKiBkMSAqIGQyKQorCQlp ZiAocmF0ZSA+IDk2MDAgKiBPU0FNUF9NQVhfRElWSVNPUiAqIEJSRFZfQkFVRF9NQVggKiBkMSAq IGQyKQogCQkJY29udGludWU7CiAKIAkJLyoKLS0gCjIuMjAuMQoKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBs aXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK