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 BE561C433EF for ; Sat, 19 Feb 2022 15:28:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242573AbiBSP3L (ORCPT ); Sat, 19 Feb 2022 10:29:11 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:43978 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242556AbiBSP3J (ORCPT ); Sat, 19 Feb 2022 10:29:09 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 244575D641; Sat, 19 Feb 2022 07:28:38 -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 ams.source.kernel.org (Postfix) with ESMTPS id C4BE8B80968; Sat, 19 Feb 2022 15:28:36 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8C8C7C340EF; Sat, 19 Feb 2022 15:28:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645284515; bh=r3iqPCoANxpwhUGnTd+JNF0yIf5d3A5itF0q+px7HIs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cAS4vy5466az6eQ1Pqk0VeqKGk92+l2nyMfxbqgJjHRIoJScndcXCnCIySMhua7e+ nBcbZDPwTh5C2ELBQod8QIoa77a5qRx53K+6GV5Hw14hgDbJuYAqjCzELSqt/C0Vr+ ezTay4Z2icQUb+e8FfgPJPSZ1SJBQ5Pzq/haeOg4W4baApysYinOvgME0KLTLMAvl2 /d5UEGMqpm4IsqjOppJXhq6BEJ1gHV1HdZZ+wi9/E+2a/Ktuqbl5i2gbIl19KIxhAe RHmMzHCYWIvXpIqxOf/J6VjUNWYOgFgHm4mMshjTJGhN0U3LHzaOGbM/7J8LXR8wS2 NYnELHWMaHVmA== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Greg Kroah-Hartman , Stephen Boyd Cc: Gregory Clement , =?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 v9 5/6] serial: mvebu-uart: implement support for baudrates higher than 230400 Bd Date: Sat, 19 Feb 2022 16:28:17 +0100 Message-Id: <20220219152818.4319-6-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220219152818.4319-1-kabel@kernel.org> References: <20220219152818.4319-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 --- 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..2e9263888ddc 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 74DE6C433F5 for ; Sat, 19 Feb 2022 15:30:59 +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=E5J9VRLCRXL0c2PJQKpbu1UkE1ocY7e9V7W+dekd7Mw=; b=LO6ptSaLKdO6rO 7BsRfZmAd5UtvnjTELccjoe3Fzpb/CM11Q1bDZYaGvACIFZrVdFJhEIpdalW2Coaua5WGY+86xe0p l0nMQNUY/1thLnEoAQFkYBdGI8UcVACL2cSmLgtVKX26Fm3EIcLKG5tO5GLZaareOc6I0X6ejGmz7 p7+Kces7vjX2YCbC2Gd4MbA/p/ol74Et+PsJU7hM0A/xRPT2j/XFpJjNLJmB4VgwXvD7as6hnjmtM EceTeJev8bUOilSRLIsxwWmO49InIffTDveP3FYJB+20Hg1c1LLMMTJPJRr5fyXQoC5lf05m/7SqR 7OmiS1gKBlD4eVITqCOA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nLRg2-00HAVb-D5; Sat, 19 Feb 2022 15:29:38 +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 1nLRf2-00HA7G-8U for linux-arm-kernel@lists.infradead.org; Sat, 19 Feb 2022 15:28:39 +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 9F6B160B58; Sat, 19 Feb 2022 15:28:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8C8C7C340EF; Sat, 19 Feb 2022 15:28:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645284515; bh=r3iqPCoANxpwhUGnTd+JNF0yIf5d3A5itF0q+px7HIs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cAS4vy5466az6eQ1Pqk0VeqKGk92+l2nyMfxbqgJjHRIoJScndcXCnCIySMhua7e+ nBcbZDPwTh5C2ELBQod8QIoa77a5qRx53K+6GV5Hw14hgDbJuYAqjCzELSqt/C0Vr+ ezTay4Z2icQUb+e8FfgPJPSZ1SJBQ5Pzq/haeOg4W4baApysYinOvgME0KLTLMAvl2 /d5UEGMqpm4IsqjOppJXhq6BEJ1gHV1HdZZ+wi9/E+2a/Ktuqbl5i2gbIl19KIxhAe RHmMzHCYWIvXpIqxOf/J6VjUNWYOgFgHm4mMshjTJGhN0U3LHzaOGbM/7J8LXR8wS2 NYnELHWMaHVmA== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Greg Kroah-Hartman , Stephen Boyd Cc: Gregory Clement , =?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 v9 5/6] serial: mvebu-uart: implement support for baudrates higher than 230400 Bd Date: Sat, 19 Feb 2022 16:28:17 +0100 Message-Id: <20220219152818.4319-6-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220219152818.4319-1-kabel@kernel.org> References: <20220219152818.4319-1-kabel@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220219_072836_422111_31BE7A6F X-CRM114-Status: GOOD ( 26.12 ) 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+Ci0tLQogZHJpdmVycy90dHkvc2VyaWFsL212ZWJ1LXVhcnQuYyB8IDgz ICsrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDY1IGlu c2VydGlvbnMoKyksIDE4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3Nl cmlhbC9tdmVidS11YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXZlYnUtdWFydC5jCmluZGV4 IDU2Mjc4YjI5ZjVmNS4uMmU5MjYzODg4ZGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJp YWwvbXZlYnUtdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tdmVidS11YXJ0LmMKQEAg LTk5LDYgKzk5LDcgQEAKICNkZWZpbmUgVUFSVF9PU0FNUAkJMHgxNAogI2RlZmluZSAgT1NBTVBf REVGQVVMVF9ESVZJU09SCTE2CiAjZGVmaW5lICBPU0FNUF9ESVZJU09SU19NQVNLCTB4M0YzRjNG M0YKKyNkZWZpbmUgIE9TQU1QX01BWF9ESVZJU09SCTYzCiAKICNkZWZpbmUgTVZFQlVfTlJfVUFS VFMJCTIKIApAQCAtNDc5LDE4ICs0ODAsNjAgQEAgc3RhdGljIGludCBtdmVidV91YXJ0X2JhdWRf cmF0ZV9zZXQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGJhdWQpCiAJCXJl dHVybiAtRU9QTk9UU1VQUDsKIAogCS8qCi0JICogVGhlIGJhdWRyYXRlIGlzIGRlcml2ZWQgZnJv bSB0aGUgVUFSVCBjbG9jayB0aGFua3MgdG8gdHdvIGRpdmlzb3JzOgotCSAqICAgPiBEICgiYmF1 ZCBnZW5lcmF0b3IiKTogY2FuIGRpdmlkZSB0aGUgY2xvY2sgZnJvbSAyIHRvIDJeMTAgLSAxLgot CSAqICAgPiBNICgiZnJhY3Rpb25hbCBkaXZpc29yIik6IGFsbG93cyBhIGJldHRlciBhY2N1cmFj eSBmb3IKLQkgKiAgICAgYmF1ZHJhdGVzIGhpZ2hlciB0aGFuIDIzMDQwMC4KKwkgKiBUaGUgYmF1 ZHJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBVQVJUIGNsb2NrIHRoYW5rcyB0byBkaXZpc29yczoK KwkgKiAgID4gZDEgKiBkMiAoIlRCRyBkaXZpc29ycyIpOiBjYW4gZGl2aWRlIG9ubHkgVEJHIGNs b2NrIGZyb20gMSB0byA2CisJICogICA+IEQgKCJiYXVkIGdlbmVyYXRvciIpOiBjYW4gZGl2aWRl IHRoZSBjbG9jayBmcm9tIDEgdG8gMTAyMworCSAqICAgPiBNICgiZnJhY3Rpb25hbCBkaXZpc29y Iik6IGFsbG93cyBhIGJldHRlciBhY2N1cmFjeSAoZnJvbSAxIHRvIDYzKQogCSAqCi0JICogQXMg dGhlIGRlcml2YXRpb24gb2YgTSBpcyByYXRoZXIgY29tcGxpY2F0ZWQsIHRoZSBjb2RlIHN0aWNr cyB0byBpdHMKLQkgKiBkZWZhdWx0IHZhbHVlICh4MTYpIHdoZW4gYWxsIHRoZSBwcmVzY2FsZXJz IGFyZSB6ZXJvZWQsIGFuZCBvbmx5Ci0JICogbWFrZXMgdXNlIG9mIEQgdG8gY29uZmlndXJlIHRo ZSBkZXNpcmVkIGJhdWRyYXRlLgorCSAqIEV4YWN0IGZvcm11bGFzIGZvciBjYWxjdWxhdGluZyBi YXVkcmF0ZToKKwkgKgorCSAqIHdpdGggZGVmYXVsdCB4MTYgc2NoZW1lOgorCSAqICAgYmF1ZHJh dGUgPSB4dGFsIC8gKGQgKiAxNikKKwkgKiAgIGJhdWRyYXRlID0gdGJnIC8gKGQxICogZDIgKiBk ICogMTYpCisJICoKKwkgKiB3aXRoIGZyYWN0aW9uYWwgZGl2aXNvcjoKKwkgKiAgIGJhdWRyYXRl ID0gMTAgKiB4dGFsIC8gKGQgKiAoMyAqIChtMSArIG0yKSArIDIgKiAobTMgKyBtNCkpKQorCSAq ICAgYmF1ZHJhdGUgPSAxMCAqIHRiZyAvIChkMSpkMiAqIGQgKiAoMyAqIChtMSArIG0yKSArIDIg KiAobTMgKyBtNCkpKQorCSAqCisJICogT3ZlcnNhbXBsaW5nIHZhbHVlOgorCSAqICAgb3NhbXAg PSAobTEgPDwgMCkgfCAobTIgPDwgOCkgfCAobTMgPDwgMTYpIHwgKG00IDw8IDI0KTsKKwkgKgor CSAqIFdoZXJlIG0xIGNvbnRyb2xzIG51bWJlciBvZiBjbG9jayBjeWNsZXMgcGVyIGJpdCBmb3Ig Yml0cyAxLDIsMzsKKwkgKiBtMiBmb3IgYml0cyA0LDUsNjsgbTMgZm9yIGJpdHMgNyw4IGFuZCBt NCBmb3IgYml0cyA5LDEwLgorCSAqCisJICogVG8gc2ltcGxpZnkgYmF1ZHJhdGUgc2V0dXAgc2V0 IGFsbCB0aGUgTSBwcmVzY2FsZXJzIHRvIHRoZSBzYW1lCisJICogdmFsdWUuIEZvciBiYXVkcmF0 ZXMgOTYwMCBCZCBhbmQgaGlnaGVyLCBpdCBpcyBlbm91Z2ggdG8gdXNlIHRoZQorCSAqIGRlZmF1 bHQgKHgxNikgZGl2aXNvciBvciBmcmFjdGlvbmFsIGRpdmlzb3Igd2l0aCBNID0gNjMsIHNvIHRo ZXJlCisJICogaXMgbm8gbmVlZCB0byB1c2UgcmVhbCBmcmFjdGlvbmFsIHN1cHBvcnQgKHdoZXJl IHRoZSBNIHByZXNjYWxlcnMKKwkgKiBhcmUgbm90IGVxdWFsKS4KKwkgKgorCSAqIFdoZW4gYWxs IHRoZSBNIHByZXNjYWxlcnMgYXJlIHplcm9lZCB0aGVuIGRlZmF1bHQgKHgxNikgZGl2aXNvciBp cworCSAqIHVzZWQuIERlZmF1bHQgeDE2IHNjaGVtZSBpcyBtb3JlIHN0YWJsZSB0aGFuIE0gKGZy YWN0aW9uYWwgZGl2aXNvciksCisJICogc28gdXNlIE0gb25seSB3aGVuIEQgZGl2aXNvciBpcyBu b3QgZW5vdWdoIHRvIGRlcml2ZSBiYXVkcmF0ZS4KKwkgKgorCSAqIE1lbWJlciBwb3J0LT51YXJ0 Y2xrIGlzIGVpdGhlciB4dGFsIGNsb2NrIHJhdGUgb3IgVEJHIGNsb2NrIHJhdGUKKwkgKiBkaXZp ZGVkIGJ5IChkMSAqIGQyKS4gU28gZDEgYW5kIGQyIGFyZSBhbHJlYWR5IHNldCBieSB0aGUgVUFS VCBjbG9jaworCSAqIGRyaXZlciAoYW5kIFVBUlQgZHJpdmVyIGl0c2VsZiBjYW5ub3QgY2hhbmdl IHRoZW0pLiBNb3Jlb3ZlciB0aGV5IGFyZQorCSAqIHNoYXJlZCBiZXR3ZWVuIGJvdGggVUFSVHMu CiAJICovCisKIAltX2Rpdmlzb3IgPSBPU0FNUF9ERUZBVUxUX0RJVklTT1I7CiAJZF9kaXZpc29y ID0gRElWX1JPVU5EX0NMT1NFU1QocG9ydC0+dWFydGNsaywgYmF1ZCAqIG1fZGl2aXNvcik7CiAK KwlpZiAoZF9kaXZpc29yID4gQlJEVl9CQVVEX01BWCkgeworCQkvKgorCQkgKiBFeHBlcmltZW50 cyBzaG93IHRoYXQgc21hbGwgTSBkaXZpc29ycyBhcmUgdW5zdGFibGUuCisJCSAqIFVzZSBtYXhp bWFsIHBvc3NpYmxlIE0gPSA2MyBhbmQgY2FsY3VsYXRlIEQgZGl2aXNvci4KKwkJICovCisJCW1f ZGl2aXNvciA9IE9TQU1QX01BWF9ESVZJU09SOworCQlkX2Rpdmlzb3IgPSBESVZfUk9VTkRfQ0xP U0VTVChwb3J0LT51YXJ0Y2xrLCBiYXVkICogbV9kaXZpc29yKTsKKwl9CisKKwlpZiAoZF9kaXZp c29yIDwgMSkKKwkJZF9kaXZpc29yID0gMTsKKwllbHNlIGlmIChkX2Rpdmlzb3IgPiBCUkRWX0JB VURfTUFYKQorCQlkX2Rpdmlzb3IgPSBCUkRWX0JBVURfTUFYOworCiAJc3Bpbl9sb2NrX2lycXNh dmUoJm12ZWJ1X3VhcnRfbG9jaywgZmxhZ3MpOwogCWJyZHYgPSByZWFkbChwb3J0LT5tZW1iYXNl ICsgVUFSVF9CUkRWKTsKIAlicmR2ICY9IH5CUkRWX0JBVURfTUFTSzsKQEAgLTUwMCw2ICs1NDMs OSBAQCBzdGF0aWMgaW50IG12ZWJ1X3VhcnRfYmF1ZF9yYXRlX3NldChzdHJ1Y3QgdWFydF9wb3J0 ICpwb3J0LCB1bnNpZ25lZCBpbnQgYmF1ZCkKIAogCW9zYW1wID0gcmVhZGwocG9ydC0+bWVtYmFz ZSArIFVBUlRfT1NBTVApOwogCW9zYW1wICY9IH5PU0FNUF9ESVZJU09SU19NQVNLOworCWlmICht X2Rpdmlzb3IgIT0gT1NBTVBfREVGQVVMVF9ESVZJU09SKQorCQlvc2FtcCB8PSAobV9kaXZpc29y IDw8IDApIHwgKG1fZGl2aXNvciA8PCA4KSB8CisJCQkobV9kaXZpc29yIDw8IDE2KSB8IChtX2Rp dmlzb3IgPDwgMjQpOwogCXdyaXRlbChvc2FtcCwgcG9ydC0+bWVtYmFzZSArIFVBUlRfT1NBTVAp OwogCiAJcmV0dXJuIDA7CkBAIC01MjksMTQgKzU3NSwxNiBAQCBzdGF0aWMgdm9pZCBtdmVidV91 YXJ0X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCiAJCXBvcnQtPmlnbm9yZV9z dGF0dXNfbWFzayB8PSBTVEFUX1JYX1JEWShwb3J0KSB8IFNUQVRfQlJLX0VSUjsKIAogCS8qCi0J ICogTWF4aW1hbCBkaXZpc29yIGlzIDEwMjMgKiAxNiB3aGVuIHVzaW5nIGRlZmF1bHQgKHgxNikg c2NoZW1lLgotCSAqIE1heGltdW0gYWNoaWV2YWJsZSBmcmVxdWVuY3kgd2l0aCBzaW1wbGUgYmF1 ZHJhdGUgZGl2aXNvciBpcyAyMzA0MDAuCi0JICogU2luY2UgdGhlIGVycm9yIHBlciBiaXQgZnJh bWUgd291bGQgYmUgb2YgbW9yZSB0aGFuIDE1JSwgYWNoaWV2aW5nCi0JICogaGlnaGVyIGZyZXF1 ZW5jaWVzIHdvdWxkIHJlcXVpcmUgdG8gaW1wbGVtZW50IHRoZSBmcmFjdGlvbmFsIGRpdmlzb3IK LQkgKiBmZWF0dXJlLgorCSAqIE1heGltYWwgZGl2aXNvciBpcyAxMDIzIGFuZCBtYXhpbWFsIGZy YWN0aW9uYWwgZGl2aXNvciBpcyA2My4gQW5kCisJICogZXhwZXJpbWVudHMgc2hvdyB0aGF0IGJh dWRyYXRlcyBhYm92ZSAxLzgwIG9mIHBhcmVudCBjbG9jayByYXRlIGFyZQorCSAqIG5vdCBzdGFi bGUuIFNvIGRpc2FsbG93IGJhdWRyYXRlcyBhYm92ZSAxLzgwIG9mIHRoZSBwYXJlbnQgY2xvY2sK KwkgKiByYXRlLiBJZiBwb3J0LT51YXJ0Y2xrIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4KKwkgKiBt dmVidV91YXJ0X2JhdWRfcmF0ZV9zZXQoKSBmYWlscywgc28gdmFsdWVzIG1pbl9iYXVkIGFuZCBt YXhfYmF1ZAorCSAqIGluIHRoaXMgY2FzZSBkbyBub3QgbWF0dGVyLgogCSAqLwotCW1pbl9iYXVk ID0gRElWX1JPVU5EX1VQKHBvcnQtPnVhcnRjbGssIDEwMjMgKiAxNik7Ci0JbWF4X2JhdWQgPSAy MzA0MDA7CisJbWluX2JhdWQgPSBESVZfUk9VTkRfVVAocG9ydC0+dWFydGNsaywgQlJEVl9CQVVE X01BWCAqCisJCQkJT1NBTVBfTUFYX0RJVklTT1IpOworCW1heF9iYXVkID0gcG9ydC0+dWFydGNs ayAvIDgwOwogCiAJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQs IG1pbl9iYXVkLCBtYXhfYmF1ZCk7CiAJaWYgKG12ZWJ1X3VhcnRfYmF1ZF9yYXRlX3NldChwb3J0 LCBiYXVkKSkgewpAQCAtMTM5NSwxNCArMTQ0MywxNCBAQCBzdGF0aWMgaW50IG12ZWJ1X3VhcnRf Y2xvY2tfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAkJCSAqIENhbGN1bGF0 ZSB0aGUgc21hbGxlc3QgVEJHIGQxIGFuZCBkMiBkaXZpc29ycyB0aGF0CiAJCQkgKiBzdGlsbCBj YW4gcHJvdmlkZSA5NjAwIGJhdWRyYXRlLgogCQkJICovCi0JCQlkMSA9IERJVl9ST1VORF9VUChy YXRlLCA5NjAwICogT1NBTVBfREVGQVVMVF9ESVZJU09SICoKKwkJCWQxID0gRElWX1JPVU5EX1VQ KHJhdGUsIDk2MDAgKiBPU0FNUF9NQVhfRElWSVNPUiAqCiAJCQkJCSAgQlJEVl9CQVVEX01BWCk7 CiAJCQlpZiAoZDEgPCAxKQogCQkJCWQxID0gMTsKIAkJCWVsc2UgaWYgKGQxID4gQ0xLX1RCR19E SVYxX01BWCkKIAkJCQlkMSA9IENMS19UQkdfRElWMV9NQVg7CiAKLQkJCWQyID0gRElWX1JPVU5E X1VQKHJhdGUsIDk2MDAgKiBPU0FNUF9ERUZBVUxUX0RJVklTT1IgKgorCQkJZDIgPSBESVZfUk9V TkRfVVAocmF0ZSwgOTYwMCAqIE9TQU1QX01BWF9ESVZJU09SICoKIAkJCQkJICBCUkRWX0JBVURf TUFYICogZDEpOwogCQkJaWYgKGQyIDwgMSkKIAkJCQlkMiA9IDE7CkBAIC0xNDE3LDggKzE0NjUs NyBAQCBzdGF0aWMgaW50IG12ZWJ1X3VhcnRfY2xvY2tfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKIAkJfQogCiAJCS8qIFNraXAgY2xvY2sgc291cmNlIHdoaWNoIGNhbm5vdCBw cm92aWRlIDk2MDAgYmF1ZHJhdGUgKi8KLQkJaWYgKHJhdGUgPiA5NjAwICogT1NBTVBfREVGQVVM VF9ESVZJU09SICogQlJEVl9CQVVEX01BWCAqIGQxICoKLQkJCSAgIGQyKQorCQlpZiAocmF0ZSA+ IDk2MDAgKiBPU0FNUF9NQVhfRElWSVNPUiAqIEJSRFZfQkFVRF9NQVggKiBkMSAqIGQyKQogCQkJ Y29udGludWU7CiAKIAkJLyoKLS0gCjIuMzQuMQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK