From: Johannes Stezenbach <js@sig21.net>
To: iommu@lists.linux.dev
Subject: Asrock X600 port80 UART
Date: Mon, 26 Jan 2026 16:02:40 +0100 [thread overview]
Message-ID: <aXeCECwwtHhhzedL@sig21.net> (raw)
In-Reply-To: <aXeAOtGQUdlNZF6V@sig21.net>
(I post this here for lack of a better place. Hope interested
persons can find it.)
The Asrock Deskmini X600 has a "UART1" connector (search for
"molex picoblade 1.25mm 4-pin cable" to find matching cables).
See https://www.asrock.com/mb/photo/X600M-STX%20R2.0(L2).png at
the bottom between the two SATA connectors.
Pin 1 GND
Pin 2 ?
Pin 3 TX +3.3V
Pin 4 +5V
The X600 has an nct6686d SuperIO chip which has a "PORT80 UART"
function to forward ioport 80 debug writes to the UART interface.
Apparently it is connected to the "UART1" connector, and I dumped
some of the nct6686d configuration registers to confirm the
port80 UART is enabled by strap settings with 115200 8N1
(actual speed is 2MHz / 17).
https://www.nuvoton.com/resource-files/NCT6686D_HW_Datasheet_V0_5.pdf
Connecting a 3.3V compatible USB-serial cable confirms there is
some binary output from firmware debug during boot. I wrote a
simple console driver to write kernel messages via port80 to
get output during suspend/resume/hibernate, it works well enough
with some binary output from firmware interspersed.
Use it with kernel command line options:
console=port80 console=tty0 no_console_suspend keep_bootcon debug
I think this patch is too much of a hack for inclusion in
the kernel, but here it is for anyone who wants it.
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index c883a28e0916..e09a8e987638 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -1037,6 +1037,12 @@ config OXP_EC
source "drivers/platform/x86/tuxedo/Kconfig"
+config PORT80_CONSOLE
+ tristate "PC debug ioport 80 console"
+ help
+ use PC debug ioport 80 as console output via port80-UART
+ supported by some Nuvoton SuperIO chips like NCT6686D
+
endif # X86_PLATFORM_DEVICES
config P2SB
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index c7db2a88c11a..4e92ae18415d 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -163,3 +163,5 @@ obj-$(CONFIG_SEL3350_PLATFORM) += sel3350-platform.o
# OneXPlayer
obj-$(CONFIG_OXP_EC) += oxpec.o
+
+obj-$(CONFIG_PORT80_CONSOLE) += port80_cons.o
diff --git a/drivers/platform/x86/port80_cons.c b/drivers/platform/x86/port80_cons.c
new file mode 100644
index 000000000000..cfe71dd5a760
--- /dev/null
+++ b/drivers/platform/x86/port80_cons.c
@@ -0,0 +1,68 @@
+/* use PC debug ioport 80 as console output via port80-UART
+ * supported by some Nuvoton SuperIO chips like NCT6686D
+ */
+
+#include <linux/console.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/serial_core.h>
+
+
+static uint delay = 200;
+module_param(delay, uint, 0644);
+MODULE_PARM_DESC(delay, "per charater output delay in us (default 200)");
+
+
+static void p80_putchar(u8 ch)
+{
+ if (ch == '\n') {
+ outb_p('\r', 0x80);
+ udelay(delay);
+ }
+ outb_p(ch, 0x80);
+ udelay(delay);
+}
+
+static void p80_write(struct console *con, const char *s, unsigned n)
+{
+ unsigned int i;
+
+ for (i = 0; i < n; i++, s++)
+ p80_putchar(*s);
+}
+
+static int __init p80_early_console_setup(struct earlycon_device *device,
+ const char *opt)
+{
+ device->con->write = p80_write;
+ return 0;
+}
+
+EARLYCON_DECLARE(port80, p80_early_console_setup);
+
+
+static struct console p80cons = {
+ .name = "port80",
+ .write = p80_write,
+ .flags = CON_PRINTBUFFER | CON_ANYTIME,
+};
+
+static int __init p80_init(void)
+{
+ register_console(&p80cons);
+ printk("registered port80 console\n");
+ return 0;
+}
+
+static void p80_exit(void)
+{
+ unregister_console(&p80cons);
+}
+
+module_init(p80_init);
+module_exit(p80_exit);
+
+MODULE_DESCRIPTION("Port80 console driver");
+MODULE_LICENSE("GPL v2");
next prev parent reply other threads:[~2026-01-26 15:02 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-26 14:54 AMD IOMMU issue with hibernate on Asrock X600 Johannes Stezenbach
2026-01-26 15:02 ` Johannes Stezenbach [this message]
2026-01-28 9:31 ` Johannes Stezenbach
2026-02-03 5:38 ` Vasant Hegde
2026-02-03 11:40 ` Johannes Stezenbach
2026-02-04 15:16 ` Johannes Stezenbach
2026-02-05 14:05 ` Johannes Stezenbach
2026-02-21 14:31 ` Vasant Hegde
2026-02-21 20:28 ` Johannes Stezenbach
2026-02-23 8:49 ` Vasant Hegde
2026-02-23 9:09 ` Johannes Stezenbach
2026-02-24 8:56 ` Vasant Hegde
2026-02-24 9:11 ` Johannes Stezenbach
2026-03-05 16:50 ` Vasant Hegde
2026-02-21 13:14 ` Vasant Hegde
2026-02-21 12:51 ` Vasant Hegde
2026-02-23 6:17 ` Naveen N Rao
2026-02-03 5:28 ` Vasant Hegde
2026-02-03 11:49 ` Johannes Stezenbach
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=aXeCECwwtHhhzedL@sig21.net \
--to=js@sig21.net \
--cc=iommu@lists.linux.dev \
/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.