diff mbox series

serial: core: Add support for dev_name:0.0 naming for kernel console

Message ID 20230719051525.46494-1-tony@atomide.com
State New
Headers show
Series serial: core: Add support for dev_name:0.0 naming for kernel console | expand

Commit Message

Tony Lindgren July 19, 2023, 5:15 a.m. UTC
With the serial core controller related changes we can now start
addressing serial ports with dev_name:0.0 naming. The names are something
like 00:04.0:0.0 on qemu, and 2800000.serial.0:0.0 on ARM for example.

The dev_name is unique serial port hardware controller device name, also
known as port->dev, and 0.0 are the serial core controller id and port id.

Typically 0.0 are used for each controller and port instance unless the
serial port hardware controller has multiple controllers or ports.

Signed-off-by: Tony Lindgren <tony@atomide.com>
---

Note that this depends on fix for serial core port ids patch
"[PATCH] serial: core: Fix serial core port id to not use port->line"

---
 drivers/tty/serial/serial_core.c | 47 ++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

Comments

Tony Lindgren July 19, 2023, 5:32 a.m. UTC | #1
* Jiri Slaby <jirislaby@kernel.org> [230719 05:29]:
> On 19. 07. 23, 7:28, Tony Lindgren wrote:
> > * Jiri Slaby <jirislaby@kernel.org> [230719 05:25]:
> > > On 19. 07. 23, 7:15, Tony Lindgren wrote:
> > > > +/*
> > > > + * Add preferred console if configured on kernel command line with naming
> > > > + * "console=dev_name:0.0".
> > > > + */
> > > > +static int serial_core_add_preferred_console(struct uart_driver *drv,
> > > > +					     struct uart_port *port)
> > > > +{
> > > > +	char *port_match, *opt, *name;
> > > > +	int len, ret = 0;
> > > > +
> > > > +	port_match = kasprintf(GFP_KERNEL, "console=%s:%i.%i",
> > > > +			       dev_name(port->dev), port->ctrl_id,
> > > > +			       port->port_id);
> > > > +	if (!port_match)
> > > > +		return -ENOMEM;
> > > > +
> > > > +	opt = strstr(saved_command_line, port_match);
> > > > +	if (!opt)
> > > > +		goto free_port_match;
> > > > +
> > > > +	len = strlen(port_match);
> > > > +
> > > > +	if (strlen(opt) > len + 1 && opt[len] == ',')
> > > > +		opt += len + 1;
> > > > +	else
> > > > +		opt = NULL;
> > > > +
> > > > +	name = kstrdup(drv->dev_name, GFP_KERNEL);
> > > 
> > > Why do you dup the name here?
> > 
> > I was getting ignoring const warning, but maybe the right solution is
> > to just use const char *name here.. Let me check.
> 
> So fix add_preferred_console() instead ;).

Let's see what kind of trouble changing it to use const char *name
might be.

Tony
Andy Shevchenko July 19, 2023, 5:37 a.m. UTC | #2
On Wed, Jul 19, 2023 at 08:15:23AM +0300, Tony Lindgren wrote:
> With the serial core controller related changes we can now start
> addressing serial ports with dev_name:0.0 naming. The names are something
> like 00:04.0:0.0 on qemu, and 2800000.serial.0:0.0 on ARM for example.
> 
> The dev_name is unique serial port hardware controller device name, also

Maybe for the sake of consistency you may use DEVNAME here and everywhere else
to link this to the DEVNAME uevent environment variable?

> known as port->dev, and 0.0 are the serial core controller id and port id.
> 
> Typically 0.0 are used for each controller and port instance unless the
> serial port hardware controller has multiple controllers or ports.
Tony Lindgren July 20, 2023, 4:13 a.m. UTC | #3
* Andy Shevchenko <andriy.shevchenko@intel.com> [230719 05:37]:
> On Wed, Jul 19, 2023 at 08:15:23AM +0300, Tony Lindgren wrote:
> > With the serial core controller related changes we can now start
> > addressing serial ports with dev_name:0.0 naming. The names are something
> > like 00:04.0:0.0 on qemu, and 2800000.serial.0:0.0 on ARM for example.
> > 
> > The dev_name is unique serial port hardware controller device name, also
> 
> Maybe for the sake of consistency you may use DEVNAME here and everywhere else
> to link this to the DEVNAME uevent environment variable?

Yes good idea will do.

Regards,

Tony
diff mbox series

Patch

diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -3322,6 +3322,49 @@  static int serial_core_port_device_add(struct serial_ctrl_device *ctrl_dev,
 	return 0;
 }
 
+/*
+ * Add preferred console if configured on kernel command line with naming
+ * "console=dev_name:0.0".
+ */
+static int serial_core_add_preferred_console(struct uart_driver *drv,
+					     struct uart_port *port)
+{
+	char *port_match, *opt, *name;
+	int len, ret = 0;
+
+	port_match = kasprintf(GFP_KERNEL, "console=%s:%i.%i",
+			       dev_name(port->dev), port->ctrl_id,
+			       port->port_id);
+	if (!port_match)
+		return -ENOMEM;
+
+	opt = strstr(saved_command_line, port_match);
+	if (!opt)
+		goto free_port_match;
+
+	len = strlen(port_match);
+
+	if (strlen(opt) > len + 1 && opt[len] == ',')
+		opt += len + 1;
+	else
+		opt = NULL;
+
+	name = kstrdup(drv->dev_name, GFP_KERNEL);
+	if (!name) {
+		ret = -ENOMEM;
+		goto free_port_match;
+	}
+
+	add_preferred_console(name, port->line, opt);
+
+	kfree(name);
+
+free_port_match:
+	kfree(port_match);
+
+	return ret;
+}
+
 /*
  * Initialize a serial core port device, and a controller device if needed.
  */
@@ -3358,6 +3401,10 @@  int serial_core_register_port(struct uart_driver *drv, struct uart_port *port)
 	if (ret)
 		goto err_unregister_ctrl_dev;
 
+	ret = serial_core_add_preferred_console(drv, port);
+	if (ret)
+		goto err_unregister_port_dev;
+
 	ret = serial_core_add_one_port(drv, port);
 	if (ret)
 		goto err_unregister_port_dev;