From: John Ogness <john.ogness@linutronix.de>
To: Ryo Takakura <ryotkkr98@gmail.com>,
gregkh@linuxfoundation.org, jirislaby@kernel.org,
paul.walmsley@sifive.com, samuel.holland@sifive.com,
palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr,
pmladek@suse.com
Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org,
linux-riscv@lists.infradead.org,
Ryo Takakura <ryotkkr98@gmail.com>
Subject: Re: [PATCH] serial: sifive: Switch to nbcon console
Date: Mon, 24 Mar 2025 16:30:20 +0106 [thread overview]
Message-ID: <84sen2fo4b.fsf@jogness.linutronix.de> (raw)
In-Reply-To: <20250323060603.388621-1-ryotkkr98@gmail.com>
Hi Ryo,
On 2025-03-23, Ryo Takakura <ryotkkr98@gmail.com> wrote:
> Add the necessary callbacks(write_atomic, write_thread, device_lock
> and device_unlock) and CON_NBCON flag to switch the sifive console
> driver to perform as nbcon console.
>
> Both ->write_atomic() and ->write_thread() will check for console
> ownership whenever they are accessing registers.
>
> The ->device_lock()/unlock() will provide the additional serilization
> necessary for ->write_thread() which is called from dedicated printing
> thread.
>
> Signed-off-by: Ryo Takakura <ryotkkr98@gmail.com>
This driver has the same issue that the 8250 previously had. The
->startup() and ->shutdown() callbacks are called without the port
lock. However, the sifive driver is accessing SIFIVE_SERIAL_IE_OFFS in
these callbacks and this register is also accessed by the ->write()
callback. This needs to be synchronized.
The related 8250 patches fixing this are startup [0] and shutdown [1]. I
am assuming the following change would be sufficient:
diff --git a/drivers/tty/serial/sifive.c b/drivers/tty/serial/sifive.c
index d032de6199af..1de1b2a5833d 100644
--- a/drivers/tty/serial/sifive.c
+++ b/drivers/tty/serial/sifive.c
@@ -564,8 +564,11 @@ static void sifive_serial_break_ctl(struct uart_port *port, int break_state)
static int sifive_serial_startup(struct uart_port *port)
{
struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
+ unsigned long flags;
+ uart_port_lock_irqsave(&ssp->port, &flags);
__ssp_enable_rxwm(ssp);
+ uart_port_unlock_irqrestore(&ssp->port, flags);
return 0;
}
@@ -573,9 +576,12 @@ static int sifive_serial_startup(struct uart_port *port)
static void sifive_serial_shutdown(struct uart_port *port)
{
struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
+ unsigned long flags;
+ uart_port_lock_irqsave(&ssp->port, &flags);
__ssp_disable_rxwm(ssp);
__ssp_disable_txwm(ssp);
+ uart_port_unlock_irqrestore(&ssp->port, flags);
}
/**
The fix should be applied first (and likely Cc stable) since it is
fixing an existing mainline problem.
Your patch also needs the synchronization. The ->write_atomic() callback
does not use the port lock. However, the uart_port_*() functions also
take the nbcon console ownership, so they synchronize against
->write_atomic() callbacks.
Otherwise, this patch looks good. If the ->startup() and ->shutdown()
callbacks are fixed in a previous patch, feel free to add:
Reviewed-by: John Ogness <john.ogness@linutronix.de>
to this patch.
John Ogness
[0] https://lore.kernel.org/lkml/20230525093159.223817-2-john.ogness@linutronix.de
[1] https://lore.kernel.org/lkml/20230525093159.223817-9-john.ogness@linutronix.de
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: John Ogness <john.ogness@linutronix.de>
To: Ryo Takakura <ryotkkr98@gmail.com>,
gregkh@linuxfoundation.org, jirislaby@kernel.org,
paul.walmsley@sifive.com, samuel.holland@sifive.com,
palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr,
pmladek@suse.com
Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org,
linux-riscv@lists.infradead.org,
Ryo Takakura <ryotkkr98@gmail.com>
Subject: Re: [PATCH] serial: sifive: Switch to nbcon console
Date: Mon, 24 Mar 2025 16:30:20 +0106 [thread overview]
Message-ID: <84sen2fo4b.fsf@jogness.linutronix.de> (raw)
In-Reply-To: <20250323060603.388621-1-ryotkkr98@gmail.com>
Hi Ryo,
On 2025-03-23, Ryo Takakura <ryotkkr98@gmail.com> wrote:
> Add the necessary callbacks(write_atomic, write_thread, device_lock
> and device_unlock) and CON_NBCON flag to switch the sifive console
> driver to perform as nbcon console.
>
> Both ->write_atomic() and ->write_thread() will check for console
> ownership whenever they are accessing registers.
>
> The ->device_lock()/unlock() will provide the additional serilization
> necessary for ->write_thread() which is called from dedicated printing
> thread.
>
> Signed-off-by: Ryo Takakura <ryotkkr98@gmail.com>
This driver has the same issue that the 8250 previously had. The
->startup() and ->shutdown() callbacks are called without the port
lock. However, the sifive driver is accessing SIFIVE_SERIAL_IE_OFFS in
these callbacks and this register is also accessed by the ->write()
callback. This needs to be synchronized.
The related 8250 patches fixing this are startup [0] and shutdown [1]. I
am assuming the following change would be sufficient:
diff --git a/drivers/tty/serial/sifive.c b/drivers/tty/serial/sifive.c
index d032de6199af..1de1b2a5833d 100644
--- a/drivers/tty/serial/sifive.c
+++ b/drivers/tty/serial/sifive.c
@@ -564,8 +564,11 @@ static void sifive_serial_break_ctl(struct uart_port *port, int break_state)
static int sifive_serial_startup(struct uart_port *port)
{
struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
+ unsigned long flags;
+ uart_port_lock_irqsave(&ssp->port, &flags);
__ssp_enable_rxwm(ssp);
+ uart_port_unlock_irqrestore(&ssp->port, flags);
return 0;
}
@@ -573,9 +576,12 @@ static int sifive_serial_startup(struct uart_port *port)
static void sifive_serial_shutdown(struct uart_port *port)
{
struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
+ unsigned long flags;
+ uart_port_lock_irqsave(&ssp->port, &flags);
__ssp_disable_rxwm(ssp);
__ssp_disable_txwm(ssp);
+ uart_port_unlock_irqrestore(&ssp->port, flags);
}
/**
The fix should be applied first (and likely Cc stable) since it is
fixing an existing mainline problem.
Your patch also needs the synchronization. The ->write_atomic() callback
does not use the port lock. However, the uart_port_*() functions also
take the nbcon console ownership, so they synchronize against
->write_atomic() callbacks.
Otherwise, this patch looks good. If the ->startup() and ->shutdown()
callbacks are fixed in a previous patch, feel free to add:
Reviewed-by: John Ogness <john.ogness@linutronix.de>
to this patch.
John Ogness
[0] https://lore.kernel.org/lkml/20230525093159.223817-2-john.ogness@linutronix.de
[1] https://lore.kernel.org/lkml/20230525093159.223817-9-john.ogness@linutronix.de
next prev parent reply other threads:[~2025-03-24 15:24 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-23 6:06 [PATCH] serial: sifive: Switch to nbcon console Ryo Takakura
2025-03-23 6:06 ` Ryo Takakura
2025-03-24 15:24 ` John Ogness [this message]
2025-03-24 15:24 ` John Ogness
2025-03-25 11:01 ` Ryo Takakura
2025-03-25 11:01 ` Ryo Takakura
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=84sen2fo4b.fsf@jogness.linutronix.de \
--to=john.ogness@linutronix.de \
--cc=alex@ghiti.fr \
--cc=aou@eecs.berkeley.edu \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-serial@vger.kernel.org \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=pmladek@suse.com \
--cc=ryotkkr98@gmail.com \
--cc=samuel.holland@sifive.com \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.