Message ID | 20240214135009.3299940-1-andriy.shevchenko@linux.intel.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel+bounces-65294-ouuuleilei=gmail.com@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:bc8a:b0:106:860b:bbdd with SMTP id dn10csp1398322dyb; Wed, 14 Feb 2024 10:06:19 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCUXqScRbvw0rRhPpoW70OwICi1y7Rz958fwfqdj0N4fAWSzPx64UwLuIrHACUgWqIhaMDsHvCShcY8de7mAWbvHNmXDpQ== X-Google-Smtp-Source: AGHT+IFAgT2njNcgy0HIOigxSX6XDMOSGD16VPxrqdIz/nPNhl2oaV28kbpE07yFwQPuzCZTqvO/ X-Received: by 2002:ac8:5790:0:b0:42c:5f4d:1e5a with SMTP id v16-20020ac85790000000b0042c5f4d1e5amr3569863qta.11.1707933978767; Wed, 14 Feb 2024 10:06:18 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707933978; cv=pass; d=google.com; s=arc-20160816; b=aONHVoZEtC8WkNIyx3Ey9va5Jv9LcFc8EfiXsnvWCF2XHjWYpfZYIXO2hg1eFFD22n BOuj4o20TUb9OKbVSqA++mKwx9/lL7yYw3/kEkaUuen+YnrX9hEDADN9zXpaQaFzpg1c NQwYfAzLELkHNwLetmln1I+K5824hyZhZbt0hl+x/4UrReXBEiIP8WvB6SuGBtH1u/wS Nx6HwTg2GsPWkxXzQqGXw5X49ByCg6h8GT0ge+XwKyGac591wLYGCm2Nn/XeZLCKCoR+ qTHb2DgZjFBgu1wQbeggh8MuIxw2rcZrFyTEEqUpFIhEYr2uzLzyY5v/zZNVNWTgA4/8 oTgg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=2Et2eb8xv1BVpEvsHsW/SDlT/c5iH1qdhN4ARZgg8MU=; fh=UZdJMCE5y0DE/xqDXp8WoTp8adhHKqmanFx3Ej1TuRM=; b=pNKDZR2rgUxGVKikZjuKxS6i3Yx2b/BxZ2xLm3/ZnlB7FuiVNgkae16+GPnWRW5PZ8 xmlOXQkpR2cKxfsA2ClNp1ws4BT42xX3TBRvUY+n5jeU8Mn7naLlVyii9PNLt0TtxO9x oHaR0XOMXipQhAhhiXCJKBongmVr8QA5xZ4P9CCg8S7bwccMUtMbjyoCeS8qtvgX+FPL 4j89tGEDweifK5kl41SNCId5YUyC6k7FOdaub9npOf645d7+HM9k8g8sAf7ueIjaoO3J bTMo8EWpHLTFi2JTryaqPlaIDR3gxNkb0M330qYNCBDE5z45MtODwjFl17YYYcJkt115 h6EA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=VQ3gJj7H; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-65294-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-65294-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Forwarded-Encrypted: i=2; AJvYcCVQgxSvV6HROAmLuuGDoZ3NWB2Fo91D9Ydkpm+SqmUpFjDVvAmgRemG+Sz3GqOtamYfdSm76r3pxgeLxtiAO51s+fP9mQ== Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id w5-20020ac857c5000000b0042be7c435casi6220427qta.763.2024.02.14.10.06.18 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Feb 2024 10:06:18 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-65294-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=VQ3gJj7H; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-65294-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-65294-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 3ADF51C269E4 for <ouuuleilei@gmail.com>; Wed, 14 Feb 2024 13:50:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4450254BFC; Wed, 14 Feb 2024 13:50:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="VQ3gJj7H" Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 34DD81CABA; Wed, 14 Feb 2024 13:50:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707918617; cv=none; b=IuJ8V84HkDw8Cr/PbJObI6EP6XPHDC6nNZMINAVycqnYJte+NY9zs+BhfSpPOXB6KmoCb0vizABG7iSHjuS9ea0JCl/a8i7N7jWrDFD6bVsL8xBJQXDxYbuHXR52oi8YsuHsa14pxZ2OiL/um6FRWJug2Bp1pNYPFWWKFtUrk7Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707918617; c=relaxed/simple; bh=2zSiHcUofHHkfA9c7NZI3mbaPTePHSRW8IdwMe4QS0s=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=awHCTEdRWInwmzgUPCFY1IFFD/piPWaXyWCFRjrWzuGKmy1seZXd/iYHQ4FrOu+nHWGCEdTivuo7Q8tGkNYDkXkrSSYBEq3unYscfljggLuSo1JBlsT1+VbxDPYMCWYcRO/oJ4sOtFlhWq8O22PcrQCF3fT38c4hfIYxWz9RoH0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=VQ3gJj7H; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1707918615; x=1739454615; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=2zSiHcUofHHkfA9c7NZI3mbaPTePHSRW8IdwMe4QS0s=; b=VQ3gJj7HR63l+c8MAGxNWgdYLLPeDrT4LcS6j+NrpCOvYIWHeVohgs1W E667x3W2B121nsy6lmxqyxd7TVxZz1Dghl6JIVjr5COtvsgdkREDzsaJs PU+3kX1jUw1//cwe0lvSvDzRINMfSa0g5u9e1EQJmoaYLd2moXjSZL75u y6n7WvaGw4GTqwA6EvreReYw43wk0gTgCszacjmjBwVH4xe2mZKy7J2hO fe175yQWBsXyKyYoT6B7FORgODVhnVnnwGysrRjCJvOJEUJcAkQhtC6uR d7KS+iFPhxmnamogDncNzX6NvYo7uLns/UtazlVcYHuKnBZubZblhxKAK Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10982"; a="2104930" X-IronPort-AV: E=Sophos;i="6.06,159,1705392000"; d="scan'208";a="2104930" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Feb 2024 05:50:14 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10982"; a="935616681" X-IronPort-AV: E=Sophos;i="6.06,159,1705392000"; d="scan'208";a="935616681" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga001.fm.intel.com with ESMTP; 14 Feb 2024 05:50:12 -0800 Received: by black.fi.intel.com (Postfix, from userid 1003) id D3940195; Wed, 14 Feb 2024 15:50:10 +0200 (EET) From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Rengarajan S <rengarajan.s@microchip.com>, linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Kumaravel Thiagarajan <kumaravel.thiagarajan@microchip.com>, Tharun Kumar P <tharunkumar.pasumarthi@microchip.com>, Jiri Slaby <jirislaby@kernel.org>, Andy Shevchenko <andriy.shevchenko@linux.intel.com> Subject: [PATCH v1 1/1] serial: 8250_pci1xxxx: Drop quirk from 8250_port Date: Wed, 14 Feb 2024 15:50:09 +0200 Message-ID: <20240214135009.3299940-1-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.43.0.rc1.1.gbec44491f096 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: <linux-kernel.vger.kernel.org> List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org> List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1790898579733864636 X-GMAIL-MSGID: 1790898579733864636 |
Series |
[v1,1/1] serial: 8250_pci1xxxx: Drop quirk from 8250_port
|
|
Commit Message
Andy Shevchenko
Feb. 14, 2024, 1:50 p.m. UTC
We are not supposed to spread quirks in 8250_port module especially
when we have a separate driver for the hardware in question.
Move quirk from generic module to the driver that uses it.
While at it, move IO to ->set_divisor() callback as it has to be from
day 1. ->get_divisor() is not supposed to perform any IO as UART port:
- might not be powered on
- is not locked by a spin lock
Fixes: 1ed67ecd1349 ("8250: microchip: Add 4 Mbps support in PCI1XXXX UART")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/tty/serial/8250/8250_pci1xxxx.c | 25 ++++++++++++++++++-------
drivers/tty/serial/8250/8250_port.c | 6 ------
2 files changed, 18 insertions(+), 13 deletions(-)
Comments
Hi Andy, On Wed, 2024-02-14 at 15:50 +0200, Andy Shevchenko wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you > know the content is safe > > We are not supposed to spread quirks in 8250_port module especially > when we have a separate driver for the hardware in question. > > Move quirk from generic module to the driver that uses it. > > While at it, move IO to ->set_divisor() callback as it has to be from > day 1. ->get_divisor() is not supposed to perform any IO as UART > port: > - might not be powered on > - is not locked by a spin lock > > Fixes: 1ed67ecd1349 ("8250: microchip: Add 4 Mbps support in PCI1XXXX > UART") > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> > --- > drivers/tty/serial/8250/8250_pci1xxxx.c | 25 ++++++++++++++++++----- > -- > drivers/tty/serial/8250/8250_port.c | 6 ------ > 2 files changed, 18 insertions(+), 13 deletions(-) > > diff --git a/drivers/tty/serial/8250/8250_pci1xxxx.c > b/drivers/tty/serial/8250/8250_pci1xxxx.c > index 55eada1dba56..2fbb5851f788 100644 > --- a/drivers/tty/serial/8250/8250_pci1xxxx.c > +++ b/drivers/tty/serial/8250/8250_pci1xxxx.c > @@ -94,7 +94,6 @@ > #define UART_BIT_SAMPLE_CNT_16 16 > #define BAUD_CLOCK_DIV_INT_MSK GENMASK(31, 8) > #define ADCL_CFG_RTS_DELAY_MASK GENMASK(11, > 8) > -#define UART_CLOCK_DEFAULT (62500 * HZ_PER_KHZ) > > #define UART_WAKE_REG 0x8C > #define UART_WAKE_MASK_REG 0x90 > @@ -227,13 +226,10 @@ static unsigned int pci1xxxx_get_divisor(struct > uart_port *port, > unsigned int uart_sample_cnt; > unsigned int quot; > > - if (baud >= UART_BAUD_4MBPS) { > + if (baud >= UART_BAUD_4MBPS) > uart_sample_cnt = UART_BIT_SAMPLE_CNT_8; > - writel(UART_BIT_DIVISOR_8, (port->membase + > FRAC_DIV_CFG_REG)); > - } else { > + else > uart_sample_cnt = UART_BIT_SAMPLE_CNT_16; > - writel(UART_BIT_DIVISOR_16, (port->membase + > FRAC_DIV_CFG_REG)); > - } > > /* > * Calculate baud rate sampling period in nanoseconds. > @@ -249,6 +245,11 @@ static unsigned int pci1xxxx_get_divisor(struct > uart_port *port, > static void pci1xxxx_set_divisor(struct uart_port *port, unsigned > int baud, > unsigned int quot, unsigned int > frac) > { > + if (baud >= UART_BAUD_4MBPS) > + writel(UART_BIT_DIVISOR_8, port->membase + > FRAC_DIV_CFG_REG); > + else > + writel(UART_BIT_DIVISOR_16, port->membase + > FRAC_DIV_CFG_REG); > + > writel(FIELD_PREP(BAUD_CLOCK_DIV_INT_MSK, quot) | frac, > port->membase + UART_BAUD_CLK_DIVISOR_REG); > } > @@ -619,6 +620,17 @@ static int pci1xxxx_setup(struct pci_dev *pdev, > > port->port.flags |= UPF_FIXED_TYPE | UPF_SKIP_TEST; > port->port.type = PORT_MCHP16550A; > + /* > + * 8250 core considers prescaller value to be always 16. > + * The MCHP ports support downscaled mode and hence the > + * functional UART clock can be lower, i.e. 62.5MHz, than > + * software expects in order to support higher baud rates. > + * Assign here 64MHz to support 4Mbps. > + * > + * The value itself is not really used anywhere except baud > + * rate calculations, so we can mangle it as we wish. > + */ > + port->port.uartclk = 64 * HZ_PER_MHZ; As per internal MCHP DOS, PCI1XXXX driver uses a simple method of converting "legacy 16 bit baud rate generator" to a "32 bit fractional baud rate generator" which enables generation of an acceptable baud rate from any valuable frequency. This is applicable only when the baud clock selected is 62.5 MHz, so when we configure the baud clock to 64 MHz(as above) will it be downscaled to 62.5 MHz, thus supporting the above feature? Other changes looks good to me. > port->port.set_termios = serial8250_do_set_termios; > port->port.get_divisor = pci1xxxx_get_divisor; > port->port.set_divisor = pci1xxxx_set_divisor; > @@ -732,7 +744,6 @@ static int pci1xxxx_serial_probe(struct pci_dev > *pdev, > > memset(&uart, 0, sizeof(uart)); > uart.port.flags = UPF_SHARE_IRQ | UPF_FIXED_PORT; > - uart.port.uartclk = UART_CLOCK_DEFAULT; > uart.port.dev = dev; > > if (num_vectors == max_vec_reqd) > diff --git a/drivers/tty/serial/8250/8250_port.c > b/drivers/tty/serial/8250/8250_port.c > index c37905ea3cae..d59dc219c899 100644 > --- a/drivers/tty/serial/8250/8250_port.c > +++ b/drivers/tty/serial/8250/8250_port.c > @@ -2699,12 +2699,6 @@ static unsigned int > serial8250_get_baud_rate(struct uart_port *port, > max = (port->uartclk + tolerance) / 16; > } > > - /* > - * Microchip PCI1XXXX UART supports maximum baud rate up to 4 > Mbps > - */ > - if (up->port.type == PORT_MCHP16550A) > - max = 4000000; > - > /* > * Ask the core to calculate the divisor for us. > * Allow 1% tolerance at the upper limit so uart clks > marginally > -- > 2.43.0.rc1.1.gbec44491f096 > Acked-by: Rengarajan S <rengarajan.s@microchip.com>
On Wed, Feb 14, 2024 at 03:50:09PM +0200, Andy Shevchenko wrote: > We are not supposed to spread quirks in 8250_port module especially > when we have a separate driver for the hardware in question. > > Move quirk from generic module to the driver that uses it. > > While at it, move IO to ->set_divisor() callback as it has to be from > day 1. ->get_divisor() is not supposed to perform any IO as UART port: > - might not be powered on > - is not locked by a spin lock > > Fixes: 1ed67ecd1349 ("8250: microchip: Add 4 Mbps support in PCI1XXXX UART") > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Breaks the build: drivers/tty/serial/8250/8250_port.c: In function ‘serial8250_get_baud_rate’: drivers/tty/serial/8250/8250_port.c:2684:32: error: unused variable ‘up’ [-Werror=unused-variable] 2684 | struct uart_8250_port *up = up_to_u8250p(port); | ^~ cc1: all warnings being treated as errors
On Thu, Feb 15, 2024 at 09:26:21AM +0000, Rengarajan.S@microchip.com wrote: > On Wed, 2024-02-14 at 15:50 +0200, Andy Shevchenko wrote: .. > > + /* > > + * 8250 core considers prescaller value to be always 16. > > + * The MCHP ports support downscaled mode and hence the > > + * functional UART clock can be lower, i.e. 62.5MHz, than > > + * software expects in order to support higher baud rates. > > + * Assign here 64MHz to support 4Mbps. > > + * > > + * The value itself is not really used anywhere except baud > > + * rate calculations, so we can mangle it as we wish. > > + */ > > + port->port.uartclk = 64 * HZ_PER_MHZ; > > As per internal MCHP DOS, PCI1XXXX driver uses a simple method of > converting "legacy 16 bit baud rate generator" to a "32 bit fractional > baud rate generator" which enables generation of an acceptable baud > rate from any valuable frequency. > > This is applicable only when the baud clock selected is 62.5 MHz, so > when we configure the baud clock to 64 MHz(as above) will it be > downscaled to 62.5 MHz, thus supporting the above feature? I specifically added the above comment. If you look closer, your driver does not use this value at all, the 8250 port code uses it in several places: - 8250_rsa case (not applicable to your driver) - probe_baud() call (applicable iff the kernel command line misses the baudrate, but even without this patch it's broken for your driver) - serial8250_update_uartclk() call (not applicable to your driver) - serial8250_get_baud_rate() call (only to get max and min range; my change will have an effect on min (max is exactly what your quirk is doing right no), so 62500000/16/65535 ~= 59.6, while with my change 64000000/16/65535 ~= 61.0, but standard baudrate here is 50 and 75, the former isn't supported by the existing code either - serial8250_do_get_divisor() call when magic_multiplier supplied (not applicable to your driver) - autoconfig_16550a() call (not applicable to your driver) Hope this clarifies the case. Of course if you able to test, will be even better. But wait for v2 where I update what Greg caught. .. > Acked-by: Rengarajan S <rengarajan.s@microchip.com> Thank you!
On Mon, 2024-02-19 at 18:19 +0200, Andy Shevchenko wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you > know the content is safe > > On Thu, Feb 15, 2024 at 09:26:21AM +0000, > Rengarajan.S@microchip.com wrote: > > On Wed, 2024-02-14 at 15:50 +0200, Andy Shevchenko wrote: > > ... > > > > + /* > > > + * 8250 core considers prescaller value to be always 16. > > > + * The MCHP ports support downscaled mode and hence the > > > + * functional UART clock can be lower, i.e. 62.5MHz, than > > > + * software expects in order to support higher baud > > > rates. > > > + * Assign here 64MHz to support 4Mbps. > > > + * > > > + * The value itself is not really used anywhere except > > > baud > > > + * rate calculations, so we can mangle it as we wish. > > > + */ > > > + port->port.uartclk = 64 * HZ_PER_MHZ; > > > > As per internal MCHP DOS, PCI1XXXX driver uses a simple method of > > converting "legacy 16 bit baud rate generator" to a "32 bit > > fractional > > baud rate generator" which enables generation of an acceptable baud > > rate from any valuable frequency. > > > > This is applicable only when the baud clock selected is 62.5 MHz, > > so > > when we configure the baud clock to 64 MHz(as above) will it be > > downscaled to 62.5 MHz, thus supporting the above feature? > > I specifically added the above comment. If you look closer, your > driver does > not use this value at all, the 8250 port code uses it in several > places: > > - 8250_rsa case (not applicable to your driver) > > - probe_baud() call (applicable iff the kernel command line misses > the > baudrate, but even without this patch it's broken for your driver) > > - serial8250_update_uartclk() call (not applicable to your driver) > > - serial8250_get_baud_rate() call (only to get max and min range; > my change will have an effect on min (max is exactly what your > quirk is doing right no), so 62500000/16/65535 ~= 59.6, while > with my change 64000000/16/65535 ~= 61.0, but standard baudrate > here is 50 and 75, the former isn't supported by the existing > code either > > - serial8250_do_get_divisor() call when magic_multiplier supplied > (not applicable to your driver) > > - autoconfig_16550a() call (not applicable to your driver) > > Hope this clarifies the case. > > Of course if you able to test, will be even better. > But wait for v2 where I update what Greg caught. Thanks for the clarification Andy. Will start with the testing after v2 patch. > > ... > > > Acked-by: Rengarajan S <rengarajan.s@microchip.com> > > Thank you! > > -- > With Best Regards, > Andy Shevchenko > >
On Tue, Feb 20, 2024 at 04:21:59AM +0000, Rengarajan.S@microchip.com wrote: > On Mon, 2024-02-19 at 18:19 +0200, Andy Shevchenko wrote: > > On Thu, Feb 15, 2024 at 09:26:21AM +0000, > > Rengarajan.S@microchip.com wrote: > > > On Wed, 2024-02-14 at 15:50 +0200, Andy Shevchenko wrote: .. > > > > + /* > > > > + * 8250 core considers prescaller value to be always 16. > > > > + * The MCHP ports support downscaled mode and hence the > > > > + * functional UART clock can be lower, i.e. 62.5MHz, than > > > > + * software expects in order to support higher baud > > > > rates. > > > > + * Assign here 64MHz to support 4Mbps. > > > > + * > > > > + * The value itself is not really used anywhere except > > > > baud > > > > + * rate calculations, so we can mangle it as we wish. > > > > + */ > > > > + port->port.uartclk = 64 * HZ_PER_MHZ; > > > > > > As per internal MCHP DOS, PCI1XXXX driver uses a simple method of > > > converting "legacy 16 bit baud rate generator" to a "32 bit > > > fractional > > > baud rate generator" which enables generation of an acceptable baud > > > rate from any valuable frequency. > > > > > > This is applicable only when the baud clock selected is 62.5 MHz, > > > so > > > when we configure the baud clock to 64 MHz(as above) will it be > > > downscaled to 62.5 MHz, thus supporting the above feature? > > > > I specifically added the above comment. If you look closer, your > > driver does > > not use this value at all, the 8250 port code uses it in several > > places: > > > > - 8250_rsa case (not applicable to your driver) > > > > - probe_baud() call (applicable iff the kernel command line misses > > the > > baudrate, but even without this patch it's broken for your driver) > > > > - serial8250_update_uartclk() call (not applicable to your driver) > > > > - serial8250_get_baud_rate() call (only to get max and min range; > > my change will have an effect on min (max is exactly what your > > quirk is doing right no), so 62500000/16/65535 ~= 59.6, while > > with my change 64000000/16/65535 ~= 61.0, but standard baudrate > > here is 50 and 75, the former isn't supported by the existing > > code either > > > > - serial8250_do_get_divisor() call when magic_multiplier supplied > > (not applicable to your driver) > > > > - autoconfig_16550a() call (not applicable to your driver) > > > > Hope this clarifies the case. > > > > Of course if you able to test, will be even better. > > But wait for v2 where I update what Greg caught. > > Thanks for the clarification Andy. Will start with the testing after v2 > patch. v2 is here: https://lore.kernel.org/r/20240219162917.2159736-1-andriy.shevchenko@linux.intel.com
diff --git a/drivers/tty/serial/8250/8250_pci1xxxx.c b/drivers/tty/serial/8250/8250_pci1xxxx.c index 55eada1dba56..2fbb5851f788 100644 --- a/drivers/tty/serial/8250/8250_pci1xxxx.c +++ b/drivers/tty/serial/8250/8250_pci1xxxx.c @@ -94,7 +94,6 @@ #define UART_BIT_SAMPLE_CNT_16 16 #define BAUD_CLOCK_DIV_INT_MSK GENMASK(31, 8) #define ADCL_CFG_RTS_DELAY_MASK GENMASK(11, 8) -#define UART_CLOCK_DEFAULT (62500 * HZ_PER_KHZ) #define UART_WAKE_REG 0x8C #define UART_WAKE_MASK_REG 0x90 @@ -227,13 +226,10 @@ static unsigned int pci1xxxx_get_divisor(struct uart_port *port, unsigned int uart_sample_cnt; unsigned int quot; - if (baud >= UART_BAUD_4MBPS) { + if (baud >= UART_BAUD_4MBPS) uart_sample_cnt = UART_BIT_SAMPLE_CNT_8; - writel(UART_BIT_DIVISOR_8, (port->membase + FRAC_DIV_CFG_REG)); - } else { + else uart_sample_cnt = UART_BIT_SAMPLE_CNT_16; - writel(UART_BIT_DIVISOR_16, (port->membase + FRAC_DIV_CFG_REG)); - } /* * Calculate baud rate sampling period in nanoseconds. @@ -249,6 +245,11 @@ static unsigned int pci1xxxx_get_divisor(struct uart_port *port, static void pci1xxxx_set_divisor(struct uart_port *port, unsigned int baud, unsigned int quot, unsigned int frac) { + if (baud >= UART_BAUD_4MBPS) + writel(UART_BIT_DIVISOR_8, port->membase + FRAC_DIV_CFG_REG); + else + writel(UART_BIT_DIVISOR_16, port->membase + FRAC_DIV_CFG_REG); + writel(FIELD_PREP(BAUD_CLOCK_DIV_INT_MSK, quot) | frac, port->membase + UART_BAUD_CLK_DIVISOR_REG); } @@ -619,6 +620,17 @@ static int pci1xxxx_setup(struct pci_dev *pdev, port->port.flags |= UPF_FIXED_TYPE | UPF_SKIP_TEST; port->port.type = PORT_MCHP16550A; + /* + * 8250 core considers prescaller value to be always 16. + * The MCHP ports support downscaled mode and hence the + * functional UART clock can be lower, i.e. 62.5MHz, than + * software expects in order to support higher baud rates. + * Assign here 64MHz to support 4Mbps. + * + * The value itself is not really used anywhere except baud + * rate calculations, so we can mangle it as we wish. + */ + port->port.uartclk = 64 * HZ_PER_MHZ; port->port.set_termios = serial8250_do_set_termios; port->port.get_divisor = pci1xxxx_get_divisor; port->port.set_divisor = pci1xxxx_set_divisor; @@ -732,7 +744,6 @@ static int pci1xxxx_serial_probe(struct pci_dev *pdev, memset(&uart, 0, sizeof(uart)); uart.port.flags = UPF_SHARE_IRQ | UPF_FIXED_PORT; - uart.port.uartclk = UART_CLOCK_DEFAULT; uart.port.dev = dev; if (num_vectors == max_vec_reqd) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index c37905ea3cae..d59dc219c899 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -2699,12 +2699,6 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port, max = (port->uartclk + tolerance) / 16; } - /* - * Microchip PCI1XXXX UART supports maximum baud rate up to 4 Mbps - */ - if (up->port.type == PORT_MCHP16550A) - max = 4000000; - /* * Ask the core to calculate the divisor for us. * Allow 1% tolerance at the upper limit so uart clks marginally