|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] drivers/char: allow using both dbgp=xhci and dbgp=ehci
commit 022e40edd4dc00b9784e5e659dac7f9f92bedfa3
Author: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
AuthorDate: Mon Sep 26 11:09:19 2022 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Sep 26 11:09:19 2022 +0200
drivers/char: allow using both dbgp=xhci and dbgp=ehci
This allows configuring EHCI and XHCI consoles separately,
simultaneously, such that e.g. one can be used for the console and the
other by the debugger.
This changes string_param() to custom_param() in both ehci and xhci
drivers. Both drivers parse only values applicable to them.
Suggested-by: Jan Beulich <jbeulich@xxxxxxxx>
Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
---
docs/misc/xen-command-line.pandoc | 6 ++++--
xen/drivers/char/ehci-dbgp.c | 14 ++++++++++++--
xen/drivers/char/serial.c | 6 ++++++
xen/drivers/char/xhci-dbc.c | 27 +++++++++++++++++++--------
xen/include/xen/serial.h | 3 ++-
5 files changed, 43 insertions(+), 13 deletions(-)
diff --git a/docs/misc/xen-command-line.pandoc
b/docs/misc/xen-command-line.pandoc
index 9a79385a37..c8b07042f5 100644
--- a/docs/misc/xen-command-line.pandoc
+++ b/docs/misc/xen-command-line.pandoc
@@ -409,7 +409,7 @@ The following are examples of correct specifications:
Specify the size of the console ring buffer.
### console
-> `= List of [ vga | com1[H,L] | com2[H,L] | pv | dbgp | none ]`
+> `= List of [ vga | com1[H,L] | com2[H,L] | pv | dbgp | xhci | none ]`
> Default: `console=com1,vga`
@@ -428,7 +428,9 @@ cleared. This allows a single port to be shared by two
subsystems
`pv` indicates that Xen should use Xen's PV console. This option is
only available when used together with `pv-in-pvh`.
-`dbgp` indicates that Xen should use a USB debug port.
+`dbgp` indicates that Xen should use a USB2 debug port.
+
+`xhci` indicates that Xen should use a USB3 debug port.
`none` indicates that Xen should not use a console. This option only
makes sense on its own.
diff --git a/xen/drivers/char/ehci-dbgp.c b/xen/drivers/char/ehci-dbgp.c
index 92c588ec0a..8a0b958506 100644
--- a/xen/drivers/char/ehci-dbgp.c
+++ b/xen/drivers/char/ehci-dbgp.c
@@ -1464,7 +1464,17 @@ static struct uart_driver __read_mostly ehci_dbgp_driver
= {
static struct ehci_dbgp ehci_dbgp = { .state = dbgp_unsafe, .phys_port = 1 };
static char __initdata opt_dbgp[30];
-string_param("dbgp", opt_dbgp);
+
+static int __init parse_ehci_dbgp(const char *opt)
+{
+ if ( strncmp(opt, "ehci", 4) )
+ return 0;
+
+ strlcpy(opt_dbgp, opt, sizeof(opt_dbgp));
+
+ return 0;
+}
+custom_param("dbgp", parse_ehci_dbgp);
void __init ehci_dbgp_init(void)
{
@@ -1472,7 +1482,7 @@ void __init ehci_dbgp_init(void)
u32 debug_port, offset, bar_val;
const char *e;
- if ( strncmp(opt_dbgp, "ehci", 4) )
+ if ( !opt_dbgp[0] )
return;
if ( isdigit(opt_dbgp[4]) || !opt_dbgp[4] )
diff --git a/xen/drivers/char/serial.c b/xen/drivers/char/serial.c
index 47899222ce..9d94450392 100644
--- a/xen/drivers/char/serial.c
+++ b/xen/drivers/char/serial.c
@@ -311,6 +311,12 @@ int __init serial_parse_handle(const char *conf)
goto common;
}
+ if ( !strncmp(conf, "xhci", 4) && (!conf[4] || conf[4] == ',') )
+ {
+ handle = SERHND_XHCI;
+ goto common;
+ }
+
if ( !strncmp(conf, "dtuart", 6) )
{
handle = SERHND_DTUART;
diff --git a/xen/drivers/char/xhci-dbc.c b/xen/drivers/char/xhci-dbc.c
index ca7d4a6213..4712faaabe 100644
--- a/xen/drivers/char/xhci-dbc.c
+++ b/xen/drivers/char/xhci-dbc.c
@@ -245,6 +245,7 @@ struct dbc {
uint64_t xhc_dbc_offset;
void __iomem *xhc_mmio;
+ bool enable; /* whether dbgp=xhci was set at all */
bool open;
unsigned int xhc_num; /* look for n-th xhc */
};
@@ -1058,18 +1059,14 @@ static struct xhci_dbc_ctx ctx __aligned(16);
static uint8_t out_wrk_buf[DBC_WORK_RING_CAP];
static struct xhci_string_descriptor str_buf[DBC_STRINGS_COUNT];
-static char __initdata opt_dbgp[30];
-
-string_param("dbgp", opt_dbgp);
-
-void __init xhci_dbc_uart_init(void)
+static int __init xhci_parse_dbgp(const char *opt_dbgp)
{
struct dbc_uart *uart = &dbc_uart;
struct dbc *dbc = &uart->dbc;
const char *e;
if ( strncmp(opt_dbgp, "xhci", 4) )
- return;
+ return 0;
memset(dbc, 0, sizeof(*dbc));
@@ -1087,12 +1084,26 @@ void __init xhci_dbc_uart_init(void)
printk(XENLOG_ERR
"Invalid dbgp= PCI device spec: '%s'\n",
opt_dbgp + 8);
- return;
+ return -EINVAL;
}
dbc->sbdf = PCI_SBDF(0, bus, slot, func);
}
+ dbc->enable = true;
+
+ return 0;
+}
+custom_param("dbgp", xhci_parse_dbgp);
+
+void __init xhci_dbc_uart_init(void)
+{
+ struct dbc_uart *uart = &dbc_uart;
+ struct dbc *dbc = &uart->dbc;
+
+ if ( !dbc->enable )
+ return;
+
dbc->dbc_ctx = &ctx;
dbc->dbc_erst = &erst;
dbc->dbc_ering.trb = evt_trb;
@@ -1102,7 +1113,7 @@ void __init xhci_dbc_uart_init(void)
dbc->dbc_str = str_buf;
if ( dbc_open(dbc) )
- serial_register_uart(SERHND_DBGP, &dbc_uart_driver, &dbc_uart);
+ serial_register_uart(SERHND_XHCI, &dbc_uart_driver, &dbc_uart);
}
#ifdef DBC_DEBUG
diff --git a/xen/include/xen/serial.h b/xen/include/xen/serial.h
index 4cd4ae5e6f..f0aff7ea76 100644
--- a/xen/include/xen/serial.h
+++ b/xen/include/xen/serial.h
@@ -91,10 +91,11 @@ struct uart_driver {
};
/* 'Serial handles' are composed from the following fields. */
-#define SERHND_IDX (3<<0) /* COM1, COM2, DBGP, DTUART? */
+#define SERHND_IDX (3<<0) /* COM1, COM2, DBGP, XHCI, DTUART? */
# define SERHND_COM1 (0<<0)
# define SERHND_COM2 (1<<0)
# define SERHND_DBGP (2<<0)
+# define SERHND_XHCI (3<<0)
# define SERHND_DTUART (0<<0) /* Steal SERHND_COM1 value */
#define SERHND_HI (1<<2) /* Mux/demux each transferred char by MSB. */
#define SERHND_LO (1<<3) /* Ditto, except that the MSB is cleared. */
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |