Skip to contentSkip to conversation

pch_uart: Cleanups, board quirks, and user uartclk parameter

PATCH Superseded Darren Hart 5 participants 19 messages Feb 22, 2012 – Feb 24, 2012 TTY layer and serial drivers

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

cover pch_uart: Cleanups, board quirks, and user uartclk parameter

This series does some minor clean-up to the pch_uart driver, adds support for the Fish River Island II UART clock, and introduces a user_uartclk parameter to aid in developing for early and changing hardware.

Note that this series is my proposed alternative solution to that provided by Tomoya MORNIAGA and Feng Tang which drops the board quirks and opts to assume a 192 MHz clock on all boards. The problem with this approach is that the CLKCFG register may have been set to something other than the 192MHz configuration by the firmware. If so, then the pch_uart will send garbage between the time the boot console is disabled and the pch_phub sets the CLKCFG register again. In my case, the pch_phub PCI probe occurs after the pch_uart_console_setup. Even if it happened before, the output up until the PCI probing would be garbage.

In order to support an early serial console, we cannot rely on the pch_phub probe function to setup the CFGCLK register. This series relies on the board quirks and doesn't force the setting of the CLKREG in the pch_phub code. Instead, it aligns with what is the default configuration (defined by firmware) for a given board. The user_uartclk provides a mechanism to force a specific uartclk if necessary.

--
Darren

The following changes since commit 27e74da9800289e69ba907777df1e2085231eff7:

i387: export 'fpu_owner_task' per-cpu variable (2012-02-20 19:34:10 -0800)

are available in the git repository at:
git://git.infradead.org/users/dvhart/linux-2.6.git pch_uart
http://git.infradead.org/users/dvhart/linux-2.6.git/shortlog/refs/heads/pch_uart
Darren Hart (4):
pch_uart: Use uartclk instead of base_baud
pch_uart: Add Fish River Island II uart clock quirks
pch_uart: Add user_uartclk parameter
pch_uart: Use existing default_baud in setup_console

 drivers/tty/serial/pch_uart.c |   52 +++++++++++++++++++++++++++++-----------
 1 files changed, 37 insertions(+), 15 deletions(-)
Signature · 1 line
1.7.6.5
#1 lore raw

PATCH 1/4 pch_uart: Use uartclk instead of base_baud

The term "base baud" refers to the fastest baud rate the device can communicate at. This is clock/16. pch_uart is using base_baud as the clock itself. Rename the variables to be semantically correct.

CC Tomoya MORINAGA <[email protected]>
CC Feng Tang <[email protected]>
CC Greg Kroah-Hartman <[email protected]>
CC Alan Cox <[email protected]>
---
 drivers/tty/serial/pch_uart.c |   24 ++++++++++++------------
 1 files changed, 12 insertions(+), 12 deletions(-)
drivers/tty/serial/pch_uart.c +12 -12
index 17ae657..c565817 100644
@@ -203,7 +203,7 @@ enum {
 
 #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
 
-#define DEFAULT_BAUD_RATE 1843200 /* 1.8432MHz */
+#define DEFAULT_UARTCLK 1843200 /* 1.8432MHz */
 
 struct pch_uart_buffer {
 	unsigned char *buf;
@@ -218,7 +218,7 @@ struct eg20t_port {
 	unsigned int iobase;
 	struct pci_dev *pdev;
 	int fifo_size;
-	int base_baud;
+	int uartclk;
 	int start_tx;
 	int start_rx;
 	int tx_empty;
@@ -293,7 +293,7 @@ static const int trigger_level_16[4] = { 1, 4, 8, 14 };
 static const int trigger_level_1[4] = { 1, 1, 1, 1 };
 
 static void pch_uart_hal_request(struct pci_dev *pdev, int fifosize,
-				 int base_baud)
+				 int uartclk)
 {
 	struct eg20t_port *priv = pci_get_drvdata(pdev);
 
@@ -332,7 +332,7 @@ static int pch_uart_hal_set_line(struct eg20t_port *priv, int baud,
 	unsigned int dll, dlm, lcr;
 	int div;
 
-	div = DIV_ROUND_CLOSEST(priv->base_baud / 16, baud);
+	div = DIV_ROUND_CLOSEST(priv->uartclk / 16, baud);
 	if (div < 0 || USHRT_MAX <= div) {
 		dev_err(priv->port.dev, "Invalid Baud(div=0x%x)\n", div);
 		return -EINVAL;
@@ -1153,9 +1153,9 @@ static int pch_uart_startup(struct uart_port *port)
 	priv->tx_empty = 1;
 
 	if (port->uartclk)
-		priv->base_baud = port->uartclk;
+		priv->uartclk = port->uartclk;
 	else
-		port->uartclk = priv->base_baud;
+		port->uartclk = priv->uartclk;
 
 	pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_ALL_INT);
 	ret = pch_uart_hal_set_line(priv, default_baud,
@@ -1507,7 +1507,7 @@ static int __init pch_console_setup(struct console *co, char *options)
 		return -ENODEV;
 
 	/* setup uartclock */
-	port->uartclk = DEFAULT_BAUD_RATE;
+	port->uartclk = DEFAULT_UARTCLK;
 
 	if (options)
 		uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -1550,7 +1550,7 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
 	unsigned int iobase;
 	unsigned int mapbase;
 	unsigned char *rxbuf;
-	int fifosize, base_baud;
+	int fifosize, uartclk;
 	int port_type;
 	struct pch_uart_driver_data *board;
 	const char *board_name;
@@ -1566,12 +1566,12 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
 	if (!rxbuf)
 		goto init_port_free_txbuf;
 
-	base_baud = DEFAULT_BAUD_RATE;
+	uartclk = DEFAULT_UARTCLK;
 
 	/* quirk for CM-iTC board */
 	board_name = dmi_get_system_info(DMI_BOARD_NAME);
 	if (board_name && strstr(board_name, "CM-iTC"))
-		base_baud = 192000000; /* 192.0MHz */
+		uartclk = 192000000; /* 192.0MHz */
 
 	switch (port_type) {
 	case PORT_UNKNOWN:
@@ -1597,7 +1597,7 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
 	priv->rxbuf.size = PAGE_SIZE;
 
 	priv->fifo_size = fifosize;
-	priv->base_baud = base_baud;
+	priv->uartclk = uartclk;
 	priv->port_type = PORT_MAX_8250 + port_type + 1;
 	priv->port.dev = &pdev->dev;
 	priv->port.iobase = iobase;
@@ -1614,7 +1614,7 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
 	spin_lock_init(&priv->port.lock);
 
 	pci_set_drvdata(pdev, priv);
-	pch_uart_hal_request(pdev, fifosize, base_baud);
+	pch_uart_hal_request(pdev, fifosize, uartclk);
 
 #ifdef CONFIG_SERIAL_PCH_UART_CONSOLE
 	pch_uart_ports[board->line_no] = priv;
Signature · 1 line
1.7.6.5
#2 lore raw

PATCH 2/4 pch_uart: Add Fish River Island II uart clock quirks

Add support for the Fish River Island II (FRI2) 64MHz UART clock following the CM-iTC quirk handling mechanism.

Add similar UART clock quirk handling to the pch_console_setup() function to enable kernel messages on boards with non-standard UART clocks.

CC Tomoya MORINAGA <[email protected]>
CC Feng Tang <[email protected]>
CC Greg Kroah-Hartman <[email protected]>
CC Alan Cox <[email protected]>
---
 drivers/tty/serial/pch_uart.c |   28 +++++++++++++++++++++++-----
 1 files changed, 23 insertions(+), 5 deletions(-)
drivers/tty/serial/pch_uart.c +23 -5
index c565817..b070a4a 100644
@@ -203,7 +203,9 @@ enum {
 
 #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
 
-#define DEFAULT_UARTCLK 1843200 /* 1.8432MHz */
+#define DEFAULT_UARTCLK  1843200 /*   1.8432 MHz */
+#define CMITC_UARTCLK  192000000 /* 192.0000 MHz */
+#define FRI2_UARTCLK    64000000 /*  64.0000 MHz */
 
 struct pch_uart_buffer {
 	unsigned char *buf;
@@ -1488,11 +1490,13 @@ pch_console_write(struct console *co, const char *s, unsigned int count)
 
 static int __init pch_console_setup(struct console *co, char *options)
 {
+	const char *board_name;
 	struct uart_port *port;
 	int baud = 9600;
 	int bits = 8;
 	int parity = 'n';
 	int flow = 'n';
+	int uartclk;
 
 	/*
 	 * Check whether an invalid uart number has been specified, and
@@ -1506,8 +1510,18 @@ static int __init pch_console_setup(struct console *co, char *options)
 	if (!port || (!port->iobase && !port->membase))
 		return -ENODEV;
 
-	/* setup uartclock */
-	port->uartclk = DEFAULT_UARTCLK;
+	/* Setup UART clock, checking for board specific clocks. */
+	uartclk = DEFAULT_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_BOARD_NAME);
+	if (board_name && strstr(board_name, "CM-iTC"))
+		uartclk = CMITC_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+	if (board_name && strstr(board_name, "Fish River Island II"))
+		uartclk = FRI2_UARTCLK;
+
+	port->uartclk = uartclk;
 
 	if (options)
 		uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -1566,12 +1580,16 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
 	if (!rxbuf)
 		goto init_port_free_txbuf;
 
+	/* Setup UART clock, checking for board specific clocks. */
 	uartclk = DEFAULT_UARTCLK;
 
-	/* quirk for CM-iTC board */
 	board_name = dmi_get_system_info(DMI_BOARD_NAME);
 	if (board_name && strstr(board_name, "CM-iTC"))
-		uartclk = 192000000; /* 192.0MHz */
+		uartclk = CMITC_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+	if (board_name && strstr(board_name, "Fish River Island II"))
+		uartclk = FRI2_UARTCLK;
 
 	switch (port_type) {
 	case PORT_UNKNOWN:
Signature · 1 line
1.7.6.5
#3 lore raw

Re: [PATCH 2/4] pch_uart: Add Fish River Island II uart clock quirks

drivers/tty/serial/pch_uart.c static int __init pch_console_setup(struct console *co, char *options) · line 1524

Quoted 12 lines
drivers/tty/serial/pch_uart.c +12 -0
+	/* Setup UART clock, checking for board specific clocks. */
+	uartclk = DEFAULT_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_BOARD_NAME);
+	if (board_name && strstr(board_name, "CM-iTC"))
+		uartclk = CMITC_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+	if (board_name && strstr(board_name, "Fish River Island II"))
+		uartclk = FRI2_UARTCLK;
+
+	port->uartclk = uartclk;

This is confusing, you load product name into a variable called board_name ?? perhaps "name" would be clearer ?

Quoted 9 lines
drivers/tty/serial/pch_uart.c +1 -0
 	if (options)
 		uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -1566,12 +1580,16 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
 	if (!rxbuf)
 		goto init_port_free_txbuf;
 
+	/* Setup UART clock, checking for board specific clocks. */
 	uartclk = DEFAULT_UARTCLK;

drivers/tty/serial/pch_uart.c static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev, · line 1592

Quoted 10 lines
drivers/tty/serial/pch_uart.c +5 -2
 
-	/* quirk for CM-iTC board */
 	board_name = dmi_get_system_info(DMI_BOARD_NAME);
 	if (board_name && strstr(board_name, "CM-iTC"))
-		uartclk = 192000000; /* 192.0MHz */
+		uartclk = CMITC_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+	if (board_name && strstr(board_name, "Fish River Island II"))
+		uartclk = FRI2_UARTCLK;

And we have two locations so this is going to get missed on updates. Can we have one function for this please ?

Alan

#4 lore raw

Re: [PATCH 2/4] pch_uart: Add Fish River Island II uart clock quirks

Quoted 7 lines · Alan Cox
Quoted 7 lines
drivers/tty/serial/pch_uart.c +7 -0
+	/* Setup UART clock, checking for board specific clocks. */
+	uartclk = DEFAULT_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_BOARD_NAME);
+	if (board_name && strstr(board_name, "CM-iTC"))
+		uartclk = CMITC_UARTCLK;
+
Quoted 8 lines

drivers/tty/serial/pch_uart.c static int __init pch_console_setup(struct console *co, char *options) · line 1524

Quoted 5 lines
drivers/tty/serial/pch_uart.c +5 -0
+	board_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+	if (board_name && strstr(board_name, "Fish River Island II"))
+		uartclk = FRI2_UARTCLK;
+
+	port->uartclk = uartclk;

This is confusing, you load product name into a variable called board_name ?? perhaps "name" would be clearer ?

OK, done.

Quoted 11 lines
Quoted 11 lines
drivers/tty/serial/pch_uart.c +1 -0
 	if (options)
 		uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -1566,12 +1580,16 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
 	if (!rxbuf)
 		goto init_port_free_txbuf;
 
+	/* Setup UART clock, checking for board specific clocks. */
 	uartclk = DEFAULT_UARTCLK;
 
Quoted 12 lines

drivers/tty/serial/pch_uart.c static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev, · line 1592

Quoted 9 lines
drivers/tty/serial/pch_uart.c +5 -2
-	/* quirk for CM-iTC board */
 	board_name = dmi_get_system_info(DMI_BOARD_NAME);
 	if (board_name && strstr(board_name, "CM-iTC"))
-		uartclk = 192000000; /* 192.0MHz */
+		uartclk = CMITC_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+	if (board_name && strstr(board_name, "Fish River Island II"))
+		uartclk = FRI2_UARTCLK;

And we have two locations so this is going to get missed on updates. Can we have one function for this please ?

Right, bad dvhart. Done. That cleans things up nicely. I'll resend as V2 after considering your 0/4 response....

Signature · 3 lines
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
#5 lore raw

Re: [PATCH 2/4] pch_uart: Add Fish River Island II uart clock quirks

Quoted 19 lines · Darren Hart
Quoted 7 lines · Alan Cox
Quoted 7 lines
drivers/tty/serial/pch_uart.c +7 -0
+	/* Setup UART clock, checking for board specific clocks. */
+	uartclk = DEFAULT_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_BOARD_NAME);
+	if (board_name && strstr(board_name, "CM-iTC"))
+		uartclk = CMITC_UARTCLK;
+
Quoted 8 lines

drivers/tty/serial/pch_uart.c static int __init pch_console_setup(struct console *co, char *options) · line 1524

Quoted 5 lines
drivers/tty/serial/pch_uart.c +5 -0
+	board_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+	if (board_name && strstr(board_name, "Fish River Island II"))
+		uartclk = FRI2_UARTCLK;
+
+	port->uartclk = uartclk;

This is confusing, you load product name into a variable called board_name ?? perhaps "name" would be clearer ?

Quoted 1 line

OK, done.

"Done" where? Is there a newer patch series I should be looking at here to apply? I'm guessing I can ignore this one, right?

consider it ignored :)

greg k-h

#6 lore raw

Re: [PATCH 2/4] pch_uart: Add Fish River Island II uart clock quirks

Quoted 20 lines · Greg Kroah-Hartman
Quoted 19 lines · Darren Hart
Quoted 15 lines · Alan Cox

drivers/tty/serial/pch_uart.c static int __init pch_console_setup(struct console *co, char *options) · line 1524

Quoted 12 lines
drivers/tty/serial/pch_uart.c +12 -0
+	/* Setup UART clock, checking for board specific clocks. */
+	uartclk = DEFAULT_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_BOARD_NAME);
+	if (board_name && strstr(board_name, "CM-iTC"))
+		uartclk = CMITC_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+	if (board_name && strstr(board_name, "Fish River Island II"))
+		uartclk = FRI2_UARTCLK;
+
+	port->uartclk = uartclk;

This is confusing, you load product name into a variable called board_name ?? perhaps "name" would be clearer ?

Quoted 6 lines
Quoted 1 line

OK, done.

"Done" where? Is there a newer patch series I should be looking at here to apply? I'm guessing I can ignore this one, right?

consider it ignored :)

I have the V2 patch series here, tested it, was going to send it today .... then received a new revision of the hardware/firmware which hides the PCI device and the UART is driven by the 8250 driver and requires me to use 3318 as the baud ..... ***sigh***. I'm not sure what the right thing is to do right now. I'm going to have a conversation with the hardware manufacturer and the TWO firmware teams I'm working with.

If anyone has experience with this sort of mess and would like to offer a recommended course of action, I'm all ears.

Signature · 3 lines
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
#7 lore raw

Re: [PATCH 2/4] pch_uart: Add Fish River Island II uart clock quirks

Quoted 37 lines · Darren Hart
Quoted 20 lines · Greg Kroah-Hartman
Quoted 19 lines · Darren Hart
Quoted 15 lines · Alan Cox

drivers/tty/serial/pch_uart.c static int __init pch_console_setup(struct console *co, char *options) · line 1524

Quoted 12 lines
drivers/tty/serial/pch_uart.c +12 -0
+	/* Setup UART clock, checking for board specific clocks. */
+	uartclk = DEFAULT_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_BOARD_NAME);
+	if (board_name && strstr(board_name, "CM-iTC"))
+		uartclk = CMITC_UARTCLK;
+
+	board_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+	if (board_name && strstr(board_name, "Fish River Island II"))
+		uartclk = FRI2_UARTCLK;
+
+	port->uartclk = uartclk;

This is confusing, you load product name into a variable called board_name ?? perhaps "name" would be clearer ?

Quoted 6 lines
Quoted 1 line

OK, done.

"Done" where? Is there a newer patch series I should be looking at here to apply? I'm guessing I can ignore this one, right?

consider it ignored :)

I have the V2 patch series here, tested it, was going to send it today .... then received a new revision of the hardware/firmware which hides the PCI device and the UART is driven by the 8250 driver and requires me to use 3318 as the baud ..... ***sigh***. I'm not sure what the right thing is to do right now. I'm going to have a conversation with the hardware manufacturer and the TWO firmware teams I'm working with.

Quoted 2 lines

If anyone has experience with this sort of mess and would like to offer a recommended course of action, I'm all ears.

A big stick is usually best to use on the firmware engineers...

Good luck,

greg k-h

#8 lore raw

PATCH 3/4 pch_uart: Add user_uartclk parameter

In reply to Darren Hart

For cases where boards with non-default clocks are not yet added to the kernel or when the clock varies across hardware revisions, it is useful to be able to specify the UART clock on the kernel command line.

Add the user_uartclk parameter and prefer it, if set, to the default and board specific UART clock settings. Specify user_uartclock on the command-line with "pch_uart.user_uartclk=48000000".

CC Tomoya MORINAGA <[email protected]>
CC Feng Tang <[email protected]>
CC Greg Kroah-Hartman <[email protected]>
CC Alan Cox <[email protected]>
---
 drivers/tty/serial/pch_uart.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)
drivers/tty/serial/pch_uart.c +5 -1
index b070a4a..d00b75c 100644
@@ -289,6 +289,7 @@ static struct pch_uart_driver_data drv_dat[] = {
 static struct eg20t_port *pch_uart_ports[PCH_UART_NR];
 #endif
 static unsigned int default_baud = 9600;
+static unsigned int user_uartclk = 0;
 static const int trigger_level_256[4] = { 1, 64, 128, 224 };
 static const int trigger_level_64[4] = { 1, 16, 32, 56 };
 static const int trigger_level_16[4] = { 1, 4, 8, 14 };
@@ -1521,7 +1522,7 @@ static int __init pch_console_setup(struct console *co, char *options)
 	if (board_name && strstr(board_name, "Fish River Island II"))
 		uartclk = FRI2_UARTCLK;
 
-	port->uartclk = uartclk;
+	port->uartclk = user_uartclk ? user_uartclk : uartclk;
 
 	if (options)
 		uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -1591,6 +1592,8 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
 	if (board_name && strstr(board_name, "Fish River Island II"))
 		uartclk = FRI2_UARTCLK;
 
+	uartclk = user_uartclk ? user_uartclk : uartclk;
+
 	switch (port_type) {
 	case PORT_UNKNOWN:
 		fifosize = 256; /* EG20T/ML7213: UART0 */
@@ -1803,3 +1806,4 @@ module_exit(pch_uart_module_exit);
 MODULE_LICENSE("GPL v2");
 MODULE_DESCRIPTION("Intel EG20T PCH UART PCI Driver");
 module_param(default_baud, uint, S_IRUGO);
+module_param(user_uartclk, uint, S_IRUGO);
Signature · 1 line
1.7.6.5
#9 lore raw

PATCH 4/4 pch_uart: Use existing default_baud in setup_console

In reply to Darren Hart

Rather than hardcode 9600, use the existing default_baud parameter (which also defaults to 9600).

CC Tomoya MORINAGA <[email protected]>
CC Feng Tang <[email protected]>
CC Greg Kroah-Hartman <[email protected]>
CC Alan Cox <[email protected]>
---
 drivers/tty/serial/pch_uart.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/tty/serial/pch_uart.c +1 -1
index d00b75c..c2c1bac 100644
@@ -1493,7 +1493,7 @@ static int __init pch_console_setup(struct console *co, char *options)
 {
 	const char *board_name;
 	struct uart_port *port;
-	int baud = 9600;
+	int baud = default_baud;
 	int bits = 8;
 	int parity = 'n';
 	int flow = 'n';
Signature · 1 line
1.7.6.5
#10 lore raw
In reply to Darren Hart

2012年2月22日10:59 Darren Hart <[email protected]>:

Quoted 14 lines

This series does some minor clean-up to the pch_uart driver, adds support for the Fish River Island II UART clock, and introduces a user_uartclk parameter to aid in developing for early and changing hardware.

Note that this series is my proposed alternative solution to that provided by Tomoya MORNIAGA and Feng Tang which drops the board quirks and opts to assume a 192 MHz clock on all boards. The problem with this approach is that the CLKCFG register may have been set to something other than the 192MHz configuration by the firmware. If so, then the pch_uart will send garbage between the time the boot console is disabled and the pch_phub sets the CLKCFG register again. In my case, the pch_phub PCI probe occurs after the pch_uart_console_setup. Even if it happened before, the output up until the PCI probing would be garbage.

Quoted 6 lines

In order to support an early serial console, we cannot rely on the pch_phub probe function to setup the CFGCLK register. This series relies on the board quirks and doesn't force the setting of the CLKREG in the pch_phub code. Instead, it aligns with what is the default configuration (defined by firmware) for a given board. The user_uartclk provides a mechanism to force a specific uartclk if necessary.

I think UART console function(including "early serial console") is used for debug use.

So, if people who want to see the boot log correctly before pch_phub installed, the people have only to do configure uart_clock by themselves.

So, I think default uart_clock 192MHz setting is better than Darren's opinion.

Let me know your opinion.

thanks,

---
ROHM Co., Ltd.
tomoya

#11 lore raw
Quoted 25 lines · Tomoya MORINAGA

2012年2月22日10:59 Darren Hart <[email protected]>:

Quoted 14 lines

This series does some minor clean-up to the pch_uart driver, adds support for the Fish River Island II UART clock, and introduces a user_uartclk parameter to aid in developing for early and changing hardware.

Note that this series is my proposed alternative solution to that provided by Tomoya MORNIAGA and Feng Tang which drops the board quirks and opts to assume a 192 MHz clock on all boards. The problem with this approach is that the CLKCFG register may have been set to something other than the 192MHz configuration by the firmware. If so, then the pch_uart will send garbage between the time the boot console is disabled and the pch_phub sets the CLKCFG register again. In my case, the pch_phub PCI probe occurs after the pch_uart_console_setup. Even if it happened before, the output up until the PCI probing would be garbage.

Quoted 6 lines

In order to support an early serial console, we cannot rely on the pch_phub probe function to setup the CFGCLK register. This series relies on the board quirks and doesn't force the setting of the CLKREG in the pch_phub code. Instead, it aligns with what is the default configuration (defined by firmware) for a given board. The user_uartclk provides a mechanism to force a specific uartclk if necessary.

I think UART console function(including "early serial console") is used for debug use.

Quoted 6 lines

So, if people who want to see the boot log correctly before pch_phub installed, the people have only to do configure uart_clock by themselves.

So, I think default uart_clock 192MHz setting is better than Darren's opinion.

Let me know your opinion.

This patch series allows for a functional early serial console as well as using the UART after boot. It leaves the CM-iTC board alone. So this seems to enable all use cases, while forcing 192MHz breaks the FRI2 early serial console. I don't see an advantage to that approach other than the obviously simpler code (which is nice, but should not trump functionality).

Signature · 3 lines
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
#12 lore raw

2012年2月22日12:36 Darren Hart <[email protected]>:

Quoted 6 lines

This patch series allows for a functional early serial console as well as using the UART after boot. It leaves the CM-iTC board alone. So this seems to enable all use cases, while forcing 192MHz breaks the FRI2 early serial console. I don't see an advantage to that approach other than the obviously simpler code (which is nice, but should not trump functionality).

Your quark "Fish River Island II" is OK.
My concern is default uart_clock remains 1.8432 MHz.
Like I said the advantage before, I think this should be 192MHz not 1.8432 MHz.

Or do you have any reason 1.8432 MHz should be set as PCH_UART default clock.

thanks
---
ROHM Co., Ltd.
tomoya

#13 lore raw
Quoted 8 lines · Tomoya MORINAGA

2012年2月22日12:36 Darren Hart <[email protected]>:

Quoted 6 lines

This patch series allows for a functional early serial console as well as using the UART after boot. It leaves the CM-iTC board alone. So this seems to enable all use cases, while forcing 192MHz breaks the FRI2 early serial console. I don't see an advantage to that approach other than the obviously simpler code (which is nice, but should not trump functionality).

Quoted 5 lines

Your quark "Fish River Island II" is OK.
My concern is default uart_clock remains 1.8432 MHz.
Like I said the advantage before, I think this should be 192MHz not 1.8432 MHz.

Or do you have any reason 1.8432 MHz should be set as PCH_UART default clock.

Ah, that's a good point. We can add a patch to this series that sets the default to 192MHz, drops the CM-iTC quirk, and does nothing in pch_phub probe for the FRI2. Would you care to Ack this series and then follow-up with a patch set the default clock to 192MHz?

Signature · 3 lines
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
#14 lore raw

2012年2月22日15:39 Darren Hart <[email protected]>:

Quoted 3 lines

We can add a patch to this series that sets the
default to 192MHz, drops the CM-iTC quirk, and does nothing in pch_phub probe for the FRI2.

If you set the clock of pch_uart as 64MHz,
do you need to add quirk for FRI2 to pch_phub so as to provide 64MHz clock?

---
ROHM Co., Ltd.
tomoya

#15 lore raw
Quoted 7 lines · Tomoya MORINAGA

2012年2月22日15:39 Darren Hart <[email protected]>:

Quoted 3 lines

We can add a patch to this series that sets the
default to 192MHz, drops the CM-iTC quirk, and does nothing in pch_phub probe for the FRI2.

If you set the clock of pch_uart as 64MHz,
do you need to add quirk for FRI2 to pch_phub so as to provide 64MHz clock?

I admit the value of pch_phub eludes me a bit. In my case, the firmware sets up the CLKCFG register, so there is no need to set it manually after boot. Instead, I'm making sure the pch_uart driver defaults to what the firmware sets up.

Signature · 3 lines
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
#16 lore raw
Quoted 8 lines · Darren Hart
Quoted 5 lines · Tomoya MORINAGA

2012年2月22日15:39 Darren Hart <[email protected]>:

Quoted 3 lines

We can add a patch to this series that sets the
default to 192MHz, drops the CM-iTC quirk, and does nothing in pch_phub probe for the FRI2.

Quoted 7 lines
Quoted 2 lines

If you set the clock of pch_uart as 64MHz,
do you need to add quirk for FRI2 to pch_phub so as to provide 64MHz clock?

I admit the value of pch_phub eludes me a bit. In my case, the firmware sets up the CLKCFG register, so there is no need to set it manually after boot. Instead, I'm making sure the pch_uart driver defaults to what the firmware sets up.

I think long term wise, we should suggest BIOS vendor to set the UART clk to 192MHz in chipset's release notes, since 192MHz works on Darren's, Tomoya's and my boards.

Thanks,
Feng

Quoted 5 lines
Signature · 4 lines
-- 
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
#17 lore raw
In reply to Tomoya MORINAGA
Quoted 3 lines
Quoted 3 lines

assume a 192 MHz clock on all boards. The problem with this approach is that the CLKCFG register may have been set to something other than the 192MHz configuration by the firmware.

So you can use the early PCI hooks or even bash the register directly in your early bootup code. You won't be the only early boot console that does this sort of thing. There are even people bitbanging PCI I²C interfaces at boot time for such purpose.

Quoted 1 line

So, I think default uart_clock 192MHz setting is better than Darren's opinion.

It's certainly easier to maintain, but it would be good to know if the setting can be written or retrieved directly in the early console setup using the early PCI ops or similar.

Alan

Alan

#18 lore raw
Quoted 9 lines · Alan Cox
Quoted 3 lines
Quoted 3 lines

assume a 192 MHz clock on all boards. The problem with this approach is that the CLKCFG register may have been set to something other than the 192MHz configuration by the firmware.

So you can use the early PCI hooks or even bash the register directly in your early bootup code. You won't be the only early boot console that does this sort of thing. There are even people bitbanging PCI I²C interfaces at boot time for such purpose.

Quoted 5 lines
Quoted 1 line

So, I think default uart_clock 192MHz setting is better than Darren's opinion.

It's certainly easier to maintain, but it would be good to know if the setting can be written or retrieved directly in the early console setup using the early PCI ops or similar.

OK, I'm not opposed to forcing everything to 192MHz, that would clean up pch_uart.c quite a bit. I have heard different things about the specification for this chipset. One statement was that 64MHz was the maximum UART clock. Feng suggests that 192MHz is the recommended UART clock. I need to dig up this spec and determine what it actually says.

I have V2 with Alan's feedback from 2/4 incorporated, but I'll hold off unless people want to see it now. Seems like it will change a lot if we force 192MHz everywhere.

Signature · 7 lines
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html