From: Alexey Sheplyakov <asheplyakov@basealt.ru> To: devel-kernel@lists.altlinux.org Cc: "Роман Ставцев" <rst@basealt.ru>, "Игорь Чудов" <nir@basealt.ru>, "Евгений Синельников" <sin@basealt.ru>, "Дмитрий Терёхин" <jqt4@basealt.ru> Subject: [d-kernel] [PATCH 03/32] serial: 8250_dw: verify clock rate in dw8250_set_termios Date: Wed, 14 Dec 2022 17:18:50 +0400 Message-ID: <20221214131919.681481-3-asheplyakov@basealt.ru> (raw) In-Reply-To: <20221214131919.681481-1-asheplyakov@basealt.ru> Refuse to change the clock rate if clk_round_rate() returns a rate which is way too off (i.e. by more than 1/16 from the one necessary for a given baud rate). In particular this happens if the requested rate is below the minimum supported by the clock. Fixes the UART console on Baikal-M SoC. Without this patch the console gets garbled immediately after loading the driver. dw8250_set_termios tries to configure the baud rate (115200), and calls clk_round_rate to figure out the supported rate closest to 1843200 Hz (which is 115200 * 16). However the (SoC-specific) clock driver returns 4705882 Hz. This frequency is way too off, hence after setting it the console gets garbled. On Baikal-M Linux has no direct control over (most) clocks. The registers of CMU (clock management unit) are accessible only from the secure world, therefore clocks are managed by the firmware (ARM-TF). Linux' driver, clk-baikal, is a shim which calls into firmware. And that 4705882 Hz is exactly what the firmware returns. According to 8250_dw maintainer (Andy Shevchenko) the correct way to fix the problem is to 1) use DLAB for the baud rate and fixed clock rate, 2) fix the firmware Neither of these advices can be applied in practice. For one, both methods require replacing the DTB, which is embedded into the firmware. Updating firmware is possible only for some types of (Baikal-M) based boards, and requires special hardware (JTAG programmer) and skills. Therfore the only practical way to address the issue is to adjust the kernel (with this ugly patch). Signed-off-by: Alexey Sheplyakov <asheplyakov@basealt.ru> Co-developed-by: Vadim V. Vlasov <vadim.vlasov@elpitech.ru> X-DONTUPSTREAM X-feature-Baikal-M --- drivers/tty/serial/8250/8250_dw.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index 7db51781289e..6bed3c5f6ec1 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c @@ -352,14 +352,15 @@ dw8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old) static void dw8250_set_termios(struct uart_port *p, struct ktermios *termios, const struct ktermios *old) { - unsigned long newrate = tty_termios_baud_rate(termios) * 16; + unsigned long baud = tty_termios_baud_rate(termios); + unsigned long newrate = baud * 16; struct dw8250_data *d = to_dw8250_data(p->private_data); long rate; int ret; clk_disable_unprepare(d->clk); rate = clk_round_rate(d->clk, newrate); - if (rate > 0) { + if (rate > 0 && rate >= baud * 15 && rate <= baud * 17) { /* * Note that any clock-notifer worker will block in * serial8250_update_uartclk() until we are done. -- 2.33.5
next prev parent reply other threads:[~2022-12-14 13:18 UTC|newest] Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-12-14 13:18 [d-kernel] [PATCH 01/32] clk: added Baikal-M clock management unit driver Alexey Sheplyakov 2022-12-14 13:18 ` [d-kernel] [PATCH 02/32] cpufreq-dt: don't load on Baikal-M SoC Alexey Sheplyakov 2022-12-14 13:18 ` Alexey Sheplyakov [this message] 2022-12-14 13:18 ` [d-kernel] [PATCH 04/32] usb: dwc3: of-simple: added compatible string for " Alexey Sheplyakov 2022-12-14 13:18 ` [d-kernel] [PATCH 05/32] dw-pcie: refuse to load on Baikal-M with recent firmware Alexey Sheplyakov 2022-12-14 13:18 ` [d-kernel] [PATCH 06/32] arm64: Enable armv8 based Baikal-M SoC support Alexey Sheplyakov 2022-12-14 13:18 ` [d-kernel] [PATCH 07/32] efi-rtc: avoid calling efi.get_time on Baikal-M SoC Alexey Sheplyakov 2022-12-14 13:18 ` [d-kernel] [PATCH 08/32] arm64-stub: fixed secondary cores boot " Alexey Sheplyakov 2022-12-14 13:18 ` [d-kernel] [PATCH 09/32] pm: disable all sleep states on Baikal-M based boards Alexey Sheplyakov 2022-12-14 13:18 ` [d-kernel] [PATCH 10/32] net: fwnode_get_phy_id: consider all compatible strings Alexey Sheplyakov 2022-12-14 13:18 ` [d-kernel] [PATCH 11/32] net: stmmac: inital support of Baikal-T1/M SoCs GMAC Alexey Sheplyakov 2022-12-14 13:18 ` [d-kernel] [PATCH 12/32] dt-bindings: dwmac: Add bindings for Baikal-T1/M SoCs Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 13/32] net: dwmac-baikal: added compatible strings Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 14/32] Added TF307/TF306 board management controller driver Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 15/32] hwmon: bt1-pvt: access registers via pvt_{readl, writel} helpers Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 16/32] hwmon: bt1-pvt: define pvt_readl/pvt_writel for Baikal-M SoC Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 17/32] hwmon: bt1-pvt: adjusted probing " Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 18/32] hwmon: bt1-pvt: added compatible baikal, pvt Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 19/32] drm: new bridge driver - stdp4028 Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 20/32] drm: added Baikal-M SoC video display unit driver Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 21/32] drm/bridge: dw-hdmi: support ahb audio hw revision 0x2a Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 22/32] dt-bindings: dw-hdmi: added ahb-audio-regshift Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 23/32] drm/bridge: dw-hdmi: force ahb audio register offset for Baikal-M Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 24/32] drm/panfrost: forcibly set dma-coherent on Baikal-M Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 25/32] drm/panfrost: disable devfreq " Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 26/32] ALSA: hda: Baikal-M support Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 27/32] PCI: pcie-baikal: driver for Baikal-M with new firmware Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 28/32] (BROKEN) dwc-i2s: support Baikal-M SoC Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 29/32] input: added TF307 serio PS/2 emulator driver Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 30/32] input: new driver - serdev-serio Alexey Sheplyakov 2022-12-14 13:19 ` [d-kernel] [PATCH 31/32] phy: realtek: leds configuration for RTL8211f Alexey Sheplyakov 2022-12-14 15:06 ` [d-kernel] [PATCH 01/32] clk: added Baikal-M clock management unit driver Vitaly Chikunov 2022-12-16 9:54 ` Alexey Sheplyakov 2022-12-16 12:34 ` Vitaly Chikunov 2022-12-16 12:40 ` Vitaly Chikunov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20221214131919.681481-3-asheplyakov@basealt.ru \ --to=asheplyakov@basealt.ru \ --cc=devel-kernel@lists.altlinux.org \ --cc=jqt4@basealt.ru \ --cc=nir@basealt.ru \ --cc=rst@basealt.ru \ --cc=sin@basealt.ru \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux kernel packages development This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel-kernel/0 devel-kernel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel-kernel devel-kernel/ http://lore.altlinux.org/devel-kernel \ devel-kernel@altlinux.org devel-kernel@altlinux.ru devel-kernel@altlinux.com public-inbox-index devel-kernel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel-kernel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git