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 85D8EC4321E for ; Fri, 11 Feb 2022 19:13:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352754AbiBKTND (ORCPT ); Fri, 11 Feb 2022 14:13:03 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:39742 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349940AbiBKTNB (ORCPT ); Fri, 11 Feb 2022 14:13:01 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 14051CF0; Fri, 11 Feb 2022 11:12:59 -0800 (PST) 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 98F8461F3C; Fri, 11 Feb 2022 19:12:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 086E8C340E9; Fri, 11 Feb 2022 19:12:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1644606778; bh=+AeaotqsM8rM5bOHFOpDOXMyO/XVaJ+vOedzjI39y7Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kEgi6NKeSbfB0okv7KmfDi7SnjYOstpC5RNvMQPPMsPXv03xkosCy08F5z0aiMY5N LpaDMbXLDcM+JJD4deyrCmdZDZQnCLto/jqY4UEeubuWHyVqWictP8/FsfT8xzDHhD G6CdSmZT0DaFDWjCdZhkHLdSAhv1gy5oDYvdzdv7Vk/KMK2XykSLq1JRoX+47i/4W5 8CkvA2Tto4GJzBQPqSa8klzf0VlXv9egGzhUtJypAc7jTw4BS3x9gf3/svZjUbUdP3 rsP0wA/eOl2a9IOKZpezr07l/1GBBWwOo85yktNCsWarLrtcO1lWY1HAELak50o0y2 FLOKdTJhOKDCQ== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Stephen Boyd , Michael Turquette , Greg Kroah-Hartman , Gregory Clement Cc: =?UTF-8?q?Pali=20Roh=C3=A1r?= , linux-clk@vger.kernel.org, linux-serial@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH v8 6/6] serial: mvebu-uart: implement support for baudrates higher than 230400 Bd Date: Fri, 11 Feb 2022 20:12:38 +0100 Message-Id: <20220211191238.2142-7-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220211191238.2142-1-kabel@kernel.org> References: <20220211191238.2142-1-kabel@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-clk@vger.kernel.org From: Pali Rohár Implement simple usage of fractional divisor. When main divisor D is too large to represent requested baudrate then use divisor M from the fractional divisor feature. All the M prescalers are set to the same and maximal value 63, so the fractional part of the fractional divisor is not used at all. We also determine upper limit for possible baudrates. Experiments show that UART at baudrate 1500000 Bd with this configuration is stable. 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. Signed-off-by: Pali Rohár Reviewed-by: Marek Behún Signed-off-by: Marek Behún --- Changes since v7: - change commit message a little - fixed indentation at some places - added Marek's Reviewed-by tag --- drivers/tty/serial/mvebu-uart.c | 83 ++++++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 18 deletions(-) diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c index 56278b29f5f5..97563a2b9f75 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,60 @@ 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 the same + * value. For baudrates 9600 Bd and higher, it is enough to use the + * default (x16) divisor or fractional divisor with M = 63, so there + * is no need to use real fractional support (where 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 derive baudrate. + * + * Member port->uartclk is either xtal clock rate or TBG clock rate + * divided by (d1 * d2). So d1 and d2 are already set by the UART clock + * driver (and UART driver itself cannot change them). Moreover they are + * shared between both UARTs. */ + m_divisor = OSAMP_DEFAULT_DIVISOR; d_divisor = DIV_ROUND_CLOSEST(port->uartclk, baud * m_divisor); + if (d_divisor > BRDV_BAUD_MAX) { + /* + * Experiments show that small M divisors are unstable. + * 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 +543,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 +575,16 @@ 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 show that baudrates above 1/80 of parent clock rate are + * not stable. So disallow baudrates above 1/80 of the parent clock + * rate. If port->uartclk is not available, then + * mvebu_uart_baud_rate_set() fails, so values min_baud and max_baud + * in this case do 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)) { @@ -1395,14 +1443,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; @@ -1417,8 +1465,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.34.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 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 03560C433EF for ; Fri, 11 Feb 2022 19:15:15 +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=unlOF3PDrz/ktq3ywr9M9t1ks4GpeQXA6wJtzREGYkY=; b=vQL/1Am6S6mWYX UOM+5p0otKiY6affVaYDdG/XH/MCgmOpizQndpP+As7aUvdpas2lkK3yDaUky1GFCECkX9/ZW+xlT /3zuTFJdy7KRCW+0mjof/M6lhMr+lhZsKCuhKIijbTJnncTH+d0cPNPn3+LPEoyPiEpG+vtQjApd1 F1zwQ6YsX46KcWAwWYX7vGgKkTe+nVQyXy8QrSedz7Ax241W2Os6vGTIEAnbo3rfFIJPO0z/jf+Lg DgCLLquEO9SLjfSkWhoyvYMyDkzG/2Pquh5cmqYFNw3sBMiItaRmNmdjTaPqbCIbggyiH/06mfVO4 j4y6USi+pETvNa0sNMeg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nIbMf-008X2O-UN; Fri, 11 Feb 2022 19:13:54 +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 1nIbLr-008Wgh-6m for linux-arm-kernel@lists.infradead.org; Fri, 11 Feb 2022 19:13:06 +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 9869061F3B; Fri, 11 Feb 2022 19:12:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 086E8C340E9; Fri, 11 Feb 2022 19:12:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1644606778; bh=+AeaotqsM8rM5bOHFOpDOXMyO/XVaJ+vOedzjI39y7Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kEgi6NKeSbfB0okv7KmfDi7SnjYOstpC5RNvMQPPMsPXv03xkosCy08F5z0aiMY5N LpaDMbXLDcM+JJD4deyrCmdZDZQnCLto/jqY4UEeubuWHyVqWictP8/FsfT8xzDHhD G6CdSmZT0DaFDWjCdZhkHLdSAhv1gy5oDYvdzdv7Vk/KMK2XykSLq1JRoX+47i/4W5 8CkvA2Tto4GJzBQPqSa8klzf0VlXv9egGzhUtJypAc7jTw4BS3x9gf3/svZjUbUdP3 rsP0wA/eOl2a9IOKZpezr07l/1GBBWwOo85yktNCsWarLrtcO1lWY1HAELak50o0y2 FLOKdTJhOKDCQ== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Stephen Boyd , Michael Turquette , Greg Kroah-Hartman , Gregory Clement Cc: =?UTF-8?q?Pali=20Roh=C3=A1r?= , linux-clk@vger.kernel.org, linux-serial@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH v8 6/6] serial: mvebu-uart: implement support for baudrates higher than 230400 Bd Date: Fri, 11 Feb 2022 20:12:38 +0100 Message-Id: <20220211191238.2142-7-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220211191238.2142-1-kabel@kernel.org> References: <20220211191238.2142-1-kabel@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220211_111303_421401_50E2CBF3 X-CRM114-Status: GOOD ( 26.16 ) 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 RnJvbTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4KCkltcGxlbWVudCBzaW1wbGUgdXNh Z2Ugb2YgZnJhY3Rpb25hbCBkaXZpc29yLiBXaGVuIG1haW4gZGl2aXNvciBEIGlzIHRvbwpsYXJn ZSB0byByZXByZXNlbnQgcmVxdWVzdGVkIGJhdWRyYXRlIHRoZW4gdXNlIGRpdmlzb3IgTSBmcm9t IHRoZQpmcmFjdGlvbmFsIGRpdmlzb3IgZmVhdHVyZS4gQWxsIHRoZSBNIHByZXNjYWxlcnMgYXJl IHNldCB0byB0aGUgc2FtZSBhbmQKbWF4aW1hbCB2YWx1ZSA2Mywgc28gdGhlIGZyYWN0aW9uYWwg cGFydCBvZiB0aGUgZnJhY3Rpb25hbCBkaXZpc29yIGlzIG5vdAp1c2VkIGF0IGFsbC4gV2UgYWxz byBkZXRlcm1pbmUgdXBwZXIgbGltaXQgZm9yIHBvc3NpYmxlIGJhdWRyYXRlcy4KCkV4cGVyaW1l bnRzIHNob3cgdGhhdCBVQVJUIGF0IGJhdWRyYXRlIDE1MDAwMDAgQmQgd2l0aCB0aGlzIGNvbmZp Z3VyYXRpb24KaXMgc3RhYmxlLiBTbyB0aGVyZSBpcyBubyBuZWVkIHRvIGltcGxlbWVudCBjb21w bGljYXRlZCBjYWxjdWxhdGlvbiBvZgpmcmFjdGlvbmFsIGNvZWZmaWNpZW50cyB5ZXQuCgpUbyB1 c2UgdGhpcyBmZWF0dXJlIHdpdGggaGlnaGVyIGJhdWRyYXRlcywgaXQgaXMgcmVxdWlyZWQgdG8g dXNlIFVBUlQgY2xvY2sKcHJvdmlkZWQgYnkgVUFSVCBjbG9jayBkcml2ZXIuIERlZmF1bHQgYm9v dCB4dGFsIGNsb2NrIGlzIG5vdCBjYXBhYmxlIG9mCmhpZ2hlciBiYXVkcmF0ZXMuCgpTaWduZWQt b2ZmLWJ5OiBQYWxpIFJvaMOhciA8cGFsaUBrZXJuZWwub3JnPgpSZXZpZXdlZC1ieTogTWFyZWsg QmVow7puIDxrYWJlbEBrZXJuZWwub3JnPgpTaWduZWQtb2ZmLWJ5OiBNYXJlayBCZWjDum4gPGth YmVsQGtlcm5lbC5vcmc+Ci0tLQpDaGFuZ2VzIHNpbmNlIHY3OgotIGNoYW5nZSBjb21taXQgbWVz c2FnZSBhIGxpdHRsZQotIGZpeGVkIGluZGVudGF0aW9uIGF0IHNvbWUgcGxhY2VzCi0gYWRkZWQg TWFyZWsncyBSZXZpZXdlZC1ieSB0YWcKLS0tCiBkcml2ZXJzL3R0eS9zZXJpYWwvbXZlYnUtdWFy dC5jIHwgODMgKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tCiAxIGZpbGUgY2hhbmdl ZCwgNjUgaW5zZXJ0aW9ucygrKSwgMTggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVy cy90dHkvc2VyaWFsL212ZWJ1LXVhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tdmVidS11YXJ0 LmMKaW5kZXggNTYyNzhiMjlmNWY1Li45NzU2M2EyYjlmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv dHR5L3NlcmlhbC9tdmVidS11YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL212ZWJ1LXVh cnQuYwpAQCAtOTksNiArOTksNyBAQAogI2RlZmluZSBVQVJUX09TQU1QCQkweDE0CiAjZGVmaW5l ICBPU0FNUF9ERUZBVUxUX0RJVklTT1IJMTYKICNkZWZpbmUgIE9TQU1QX0RJVklTT1JTX01BU0sJ MHgzRjNGM0YzRgorI2RlZmluZSAgT1NBTVBfTUFYX0RJVklTT1IJNjMKIAogI2RlZmluZSBNVkVC VV9OUl9VQVJUUwkJMgogCkBAIC00NzksMTggKzQ4MCw2MCBAQCBzdGF0aWMgaW50IG12ZWJ1X3Vh cnRfYmF1ZF9yYXRlX3NldChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgYmF1 ZCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyoKLQkgKiBUaGUgYmF1ZHJhdGUgaXMgZGVy aXZlZCBmcm9tIHRoZSBVQVJUIGNsb2NrIHRoYW5rcyB0byB0d28gZGl2aXNvcnM6Ci0JICogICA+ IEQgKCJiYXVkIGdlbmVyYXRvciIpOiBjYW4gZGl2aWRlIHRoZSBjbG9jayBmcm9tIDIgdG8gMl4x MCAtIDEuCi0JICogICA+IE0gKCJmcmFjdGlvbmFsIGRpdmlzb3IiKTogYWxsb3dzIGEgYmV0dGVy IGFjY3VyYWN5IGZvcgotCSAqICAgICBiYXVkcmF0ZXMgaGlnaGVyIHRoYW4gMjMwNDAwLgorCSAq IFRoZSBiYXVkcmF0ZSBpcyBkZXJpdmVkIGZyb20gdGhlIFVBUlQgY2xvY2sgdGhhbmtzIHRvIGRp dmlzb3JzOgorCSAqICAgPiBkMSAqIGQyICgiVEJHIGRpdmlzb3JzIik6IGNhbiBkaXZpZGUgb25s eSBUQkcgY2xvY2sgZnJvbSAxIHRvIDYKKwkgKiAgID4gRCAoImJhdWQgZ2VuZXJhdG9yIik6IGNh biBkaXZpZGUgdGhlIGNsb2NrIGZyb20gMSB0byAxMDIzCisJICogICA+IE0gKCJmcmFjdGlvbmFs IGRpdmlzb3IiKTogYWxsb3dzIGEgYmV0dGVyIGFjY3VyYWN5IChmcm9tIDEgdG8gNjMpCiAJICoK LQkgKiBBcyB0aGUgZGVyaXZhdGlvbiBvZiBNIGlzIHJhdGhlciBjb21wbGljYXRlZCwgdGhlIGNv ZGUgc3RpY2tzIHRvIGl0cwotCSAqIGRlZmF1bHQgdmFsdWUgKHgxNikgd2hlbiBhbGwgdGhlIHBy ZXNjYWxlcnMgYXJlIHplcm9lZCwgYW5kIG9ubHkKLQkgKiBtYWtlcyB1c2Ugb2YgRCB0byBjb25m aWd1cmUgdGhlIGRlc2lyZWQgYmF1ZHJhdGUuCisJICogRXhhY3QgZm9ybXVsYXMgZm9yIGNhbGN1 bGF0aW5nIGJhdWRyYXRlOgorCSAqCisJICogd2l0aCBkZWZhdWx0IHgxNiBzY2hlbWU6CisJICog ICBiYXVkcmF0ZSA9IHh0YWwgLyAoZCAqIDE2KQorCSAqICAgYmF1ZHJhdGUgPSB0YmcgLyAoZDEg KiBkMiAqIGQgKiAxNikKKwkgKgorCSAqIHdpdGggZnJhY3Rpb25hbCBkaXZpc29yOgorCSAqICAg YmF1ZHJhdGUgPSAxMCAqIHh0YWwgLyAoZCAqICgzICogKG0xICsgbTIpICsgMiAqIChtMyArIG00 KSkpCisJICogICBiYXVkcmF0ZSA9IDEwICogdGJnIC8gKGQxKmQyICogZCAqICgzICogKG0xICsg bTIpICsgMiAqIChtMyArIG00KSkpCisJICoKKwkgKiBPdmVyc2FtcGxpbmcgdmFsdWU6CisJICog ICBvc2FtcCA9IChtMSA8PCAwKSB8IChtMiA8PCA4KSB8IChtMyA8PCAxNikgfCAobTQgPDwgMjQp OworCSAqCisJICogV2hlcmUgbTEgY29udHJvbHMgbnVtYmVyIG9mIGNsb2NrIGN5Y2xlcyBwZXIg Yml0IGZvciBiaXRzIDEsMiwzOworCSAqIG0yIGZvciBiaXRzIDQsNSw2OyBtMyBmb3IgYml0cyA3 LDggYW5kIG00IGZvciBiaXRzIDksMTAuCisJICoKKwkgKiBUbyBzaW1wbGlmeSBiYXVkcmF0ZSBz ZXR1cCBzZXQgYWxsIHRoZSBNIHByZXNjYWxlcnMgdG8gdGhlIHNhbWUKKwkgKiB2YWx1ZS4gRm9y IGJhdWRyYXRlcyA5NjAwIEJkIGFuZCBoaWdoZXIsIGl0IGlzIGVub3VnaCB0byB1c2UgdGhlCisJ ICogZGVmYXVsdCAoeDE2KSBkaXZpc29yIG9yIGZyYWN0aW9uYWwgZGl2aXNvciB3aXRoIE0gPSA2 Mywgc28gdGhlcmUKKwkgKiBpcyBubyBuZWVkIHRvIHVzZSByZWFsIGZyYWN0aW9uYWwgc3VwcG9y dCAod2hlcmUgdGhlIE0gcHJlc2NhbGVycworCSAqIGFyZSBub3QgZXF1YWwpLgorCSAqCisJICog V2hlbiBhbGwgdGhlIE0gcHJlc2NhbGVycyBhcmUgemVyb2VkIHRoZW4gZGVmYXVsdCAoeDE2KSBk aXZpc29yIGlzCisJICogdXNlZC4gRGVmYXVsdCB4MTYgc2NoZW1lIGlzIG1vcmUgc3RhYmxlIHRo YW4gTSAoZnJhY3Rpb25hbCBkaXZpc29yKSwKKwkgKiBzbyB1c2UgTSBvbmx5IHdoZW4gRCBkaXZp c29yIGlzIG5vdCBlbm91Z2ggdG8gZGVyaXZlIGJhdWRyYXRlLgorCSAqCisJICogTWVtYmVyIHBv cnQtPnVhcnRjbGsgaXMgZWl0aGVyIHh0YWwgY2xvY2sgcmF0ZSBvciBUQkcgY2xvY2sgcmF0ZQor CSAqIGRpdmlkZWQgYnkgKGQxICogZDIpLiBTbyBkMSBhbmQgZDIgYXJlIGFscmVhZHkgc2V0IGJ5 IHRoZSBVQVJUIGNsb2NrCisJICogZHJpdmVyIChhbmQgVUFSVCBkcml2ZXIgaXRzZWxmIGNhbm5v dCBjaGFuZ2UgdGhlbSkuIE1vcmVvdmVyIHRoZXkgYXJlCisJICogc2hhcmVkIGJldHdlZW4gYm90 aCBVQVJUcy4KIAkgKi8KKwogCW1fZGl2aXNvciA9IE9TQU1QX0RFRkFVTFRfRElWSVNPUjsKIAlk X2Rpdmlzb3IgPSBESVZfUk9VTkRfQ0xPU0VTVChwb3J0LT51YXJ0Y2xrLCBiYXVkICogbV9kaXZp c29yKTsKIAorCWlmIChkX2Rpdmlzb3IgPiBCUkRWX0JBVURfTUFYKSB7CisJCS8qCisJCSAqIEV4 cGVyaW1lbnRzIHNob3cgdGhhdCBzbWFsbCBNIGRpdmlzb3JzIGFyZSB1bnN0YWJsZS4KKwkJICog VXNlIG1heGltYWwgcG9zc2libGUgTSA9IDYzIGFuZCBjYWxjdWxhdGUgRCBkaXZpc29yLgorCQkg Ki8KKwkJbV9kaXZpc29yID0gT1NBTVBfTUFYX0RJVklTT1I7CisJCWRfZGl2aXNvciA9IERJVl9S T1VORF9DTE9TRVNUKHBvcnQtPnVhcnRjbGssIGJhdWQgKiBtX2Rpdmlzb3IpOworCX0KKworCWlm IChkX2Rpdmlzb3IgPCAxKQorCQlkX2Rpdmlzb3IgPSAxOworCWVsc2UgaWYgKGRfZGl2aXNvciA+ IEJSRFZfQkFVRF9NQVgpCisJCWRfZGl2aXNvciA9IEJSRFZfQkFVRF9NQVg7CisKIAlzcGluX2xv Y2tfaXJxc2F2ZSgmbXZlYnVfdWFydF9sb2NrLCBmbGFncyk7CiAJYnJkdiA9IHJlYWRsKHBvcnQt Pm1lbWJhc2UgKyBVQVJUX0JSRFYpOwogCWJyZHYgJj0gfkJSRFZfQkFVRF9NQVNLOwpAQCAtNTAw LDYgKzU0Myw5IEBAIHN0YXRpYyBpbnQgbXZlYnVfdWFydF9iYXVkX3JhdGVfc2V0KHN0cnVjdCB1 YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBiYXVkKQogCiAJb3NhbXAgPSByZWFkbChwb3J0 LT5tZW1iYXNlICsgVUFSVF9PU0FNUCk7CiAJb3NhbXAgJj0gfk9TQU1QX0RJVklTT1JTX01BU0s7 CisJaWYgKG1fZGl2aXNvciAhPSBPU0FNUF9ERUZBVUxUX0RJVklTT1IpCisJCW9zYW1wIHw9ICht X2Rpdmlzb3IgPDwgMCkgfCAobV9kaXZpc29yIDw8IDgpIHwKKwkJCShtX2Rpdmlzb3IgPDwgMTYp IHwgKG1fZGl2aXNvciA8PCAyNCk7CiAJd3JpdGVsKG9zYW1wLCBwb3J0LT5tZW1iYXNlICsgVUFS VF9PU0FNUCk7CiAKIAlyZXR1cm4gMDsKQEAgLTUyOSwxNCArNTc1LDE2IEBAIHN0YXRpYyB2b2lk IG12ZWJ1X3VhcnRfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKIAkJcG9ydC0+ aWdub3JlX3N0YXR1c19tYXNrIHw9IFNUQVRfUlhfUkRZKHBvcnQpIHwgU1RBVF9CUktfRVJSOwog CiAJLyoKLQkgKiBNYXhpbWFsIGRpdmlzb3IgaXMgMTAyMyAqIDE2IHdoZW4gdXNpbmcgZGVmYXVs dCAoeDE2KSBzY2hlbWUuCi0JICogTWF4aW11bSBhY2hpZXZhYmxlIGZyZXF1ZW5jeSB3aXRoIHNp bXBsZSBiYXVkcmF0ZSBkaXZpc29yIGlzIDIzMDQwMC4KLQkgKiBTaW5jZSB0aGUgZXJyb3IgcGVy IGJpdCBmcmFtZSB3b3VsZCBiZSBvZiBtb3JlIHRoYW4gMTUlLCBhY2hpZXZpbmcKLQkgKiBoaWdo ZXIgZnJlcXVlbmNpZXMgd291bGQgcmVxdWlyZSB0byBpbXBsZW1lbnQgdGhlIGZyYWN0aW9uYWwg ZGl2aXNvcgotCSAqIGZlYXR1cmUuCisJICogTWF4aW1hbCBkaXZpc29yIGlzIDEwMjMgYW5kIG1h eGltYWwgZnJhY3Rpb25hbCBkaXZpc29yIGlzIDYzLiBBbmQKKwkgKiBleHBlcmltZW50cyBzaG93 IHRoYXQgYmF1ZHJhdGVzIGFib3ZlIDEvODAgb2YgcGFyZW50IGNsb2NrIHJhdGUgYXJlCisJICog bm90IHN0YWJsZS4gU28gZGlzYWxsb3cgYmF1ZHJhdGVzIGFib3ZlIDEvODAgb2YgdGhlIHBhcmVu dCBjbG9jaworCSAqIHJhdGUuIElmIHBvcnQtPnVhcnRjbGsgaXMgbm90IGF2YWlsYWJsZSwgdGhl bgorCSAqIG12ZWJ1X3VhcnRfYmF1ZF9yYXRlX3NldCgpIGZhaWxzLCBzbyB2YWx1ZXMgbWluX2Jh dWQgYW5kIG1heF9iYXVkCisJICogaW4gdGhpcyBjYXNlIGRvIG5vdCBtYXR0ZXIuCiAJICovCi0J bWluX2JhdWQgPSBESVZfUk9VTkRfVVAocG9ydC0+dWFydGNsaywgMTAyMyAqIDE2KTsKLQltYXhf YmF1ZCA9IDIzMDQwMDsKKwltaW5fYmF1ZCA9IERJVl9ST1VORF9VUChwb3J0LT51YXJ0Y2xrLCBC UkRWX0JBVURfTUFYICoKKwkJCQlPU0FNUF9NQVhfRElWSVNPUik7CisJbWF4X2JhdWQgPSBwb3J0 LT51YXJ0Y2xrIC8gODA7CiAKIAliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1p b3MsIG9sZCwgbWluX2JhdWQsIG1heF9iYXVkKTsKIAlpZiAobXZlYnVfdWFydF9iYXVkX3JhdGVf c2V0KHBvcnQsIGJhdWQpKSB7CkBAIC0xMzk1LDE0ICsxNDQzLDE0IEBAIHN0YXRpYyBpbnQgbXZl YnVfdWFydF9jbG9ja19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCQkJICog Q2FsY3VsYXRlIHRoZSBzbWFsbGVzdCBUQkcgZDEgYW5kIGQyIGRpdmlzb3JzIHRoYXQKIAkJCSAq IHN0aWxsIGNhbiBwcm92aWRlIDk2MDAgYmF1ZHJhdGUuCiAJCQkgKi8KLQkJCWQxID0gRElWX1JP VU5EX1VQKHJhdGUsIDk2MDAgKiBPU0FNUF9ERUZBVUxUX0RJVklTT1IgKgorCQkJZDEgPSBESVZf Uk9VTkRfVVAocmF0ZSwgOTYwMCAqIE9TQU1QX01BWF9ESVZJU09SICoKIAkJCQkJICBCUkRWX0JB VURfTUFYKTsKIAkJCWlmIChkMSA8IDEpCiAJCQkJZDEgPSAxOwogCQkJZWxzZSBpZiAoZDEgPiBD TEtfVEJHX0RJVjFfTUFYKQogCQkJCWQxID0gQ0xLX1RCR19ESVYxX01BWDsKIAotCQkJZDIgPSBE SVZfUk9VTkRfVVAocmF0ZSwgOTYwMCAqIE9TQU1QX0RFRkFVTFRfRElWSVNPUiAqCisJCQlkMiA9 IERJVl9ST1VORF9VUChyYXRlLCA5NjAwICogT1NBTVBfTUFYX0RJVklTT1IgKgogCQkJCQkgIEJS RFZfQkFVRF9NQVggKiBkMSk7CiAJCQlpZiAoZDIgPCAxKQogCQkJCWQyID0gMTsKQEAgLTE0MTcs OCArMTQ2NSw3IEBAIHN0YXRpYyBpbnQgbXZlYnVfdWFydF9jbG9ja19wcm9iZShzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2KQogCQl9CiAKIAkJLyogU2tpcCBjbG9jayBzb3VyY2Ugd2hpY2gg Y2Fubm90IHByb3ZpZGUgOTYwMCBiYXVkcmF0ZSAqLwotCQlpZiAocmF0ZSA+IDk2MDAgKiBPU0FN UF9ERUZBVUxUX0RJVklTT1IgKiBCUkRWX0JBVURfTUFYICogZDEgKgotCQkJICAgZDIpCisJCWlm IChyYXRlID4gOTYwMCAqIE9TQU1QX01BWF9ESVZJU09SICogQlJEVl9CQVVEX01BWCAqIGQxICog ZDIpCiAJCQljb250aW51ZTsKIAogCQkvKgotLSAKMi4zNC4xCgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxp c3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=