[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] Revert "ns16550: add support for UART parameters to be specifed with name-value pairs"
commit c1abc2f7bc90f35797ef7d9db344cc9788f566db Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Wed May 31 11:18:58 2017 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Wed May 31 11:18:58 2017 +0200 Revert "ns16550: add support for UART parameters to be specifed with name-value pairs" This reverts commit a91252ff0d219d801f2dc947511c1755fe5b05fe, as it breaks the build on ARM. --- docs/misc/xen-command-line.markdown | 38 ------ xen/common/kernel.c | 2 +- xen/drivers/char/ns16550.c | 243 +++--------------------------------- 3 files changed, 17 insertions(+), 266 deletions(-) diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index 8c939c4..44d9985 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -324,44 +324,6 @@ Both option `com1` and `com2` follow the same format. A typical setup for most situations might be `com1=115200,8n1` -In addition to the above positional specification for UART parameters, -name=value pair specfications are also supported. This is used to add -flexibility for UART devices which require additional UART parameter -configurations. - -The comma separation still delineates positional parameters. Hence, -unless the parameter is explicitly specified with name=value option, it -will be considered a positional parameter. - -The syntax consists of -com1=(comma-separated positional parameters),(comma separated name-value pairs) - -The accepted name keywords for name=value pairs are - * `baud` - accepts integer baud rate (eg. 115200) or `auto` - * `bridge`- Similar to bridge-bdf in positional parameters. - Used to determine the PCI bridge to access the UART device. - Notation is xx:xx.xx <bus>:<device>.<function> - * `clock-hz`- accepts large integers to setup UART clock frequencies. - Do note - these values are multiplied by 16. - * `data-bits` - integer between 5 and 8 - * `dev` - accepted values are `pci` OR `amt`. If this option - is used to specify if the serial device is pci-based. The io_base - cannot be specified when `dev=pci` or `dev=amt` is used. - * `io-base` - accepts integer which specified IO base port for UART registers - * `irq` - IRQ number to use - * `parity` - accepted values are same as positional parameters - * `port` - Used to specify which port the PCI serial device is located on - Notation is xx:xx.xx <bus>:<device>.<function> - * `reg-shift` - register shifts required to set UART registers - * `reg-width` - register width required to set UART registers - (only accepts 1 and 4) - * `stop-bits` - only accepts 1 or 2 for the number of stop bits - -The following are examples of correct specifications: -`com1=115200,8n1,0x3f8,4` -`com1=115200,8n1,0x3f8,4,reg_width=4,reg_shift=2` -`com1=baud=115200,parity=n,stop_bits=1,io_base=0x3f8,reg_width=4` - ### conring\_size > `= <size>` diff --git a/xen/common/kernel.c b/xen/common/kernel.c index e1ebb0b..8461871 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -49,7 +49,7 @@ static void __init assign_integer_param( static void __init _cmdline_parse(const char *cmdline) { - char opt[128], *optval, *optkey, *q; + char opt[100], *optval, *optkey, *q; const char *p = cmdline; const struct kernel_param *param; int bool_assert; diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c index 899d322..e4de3b4 100644 --- a/xen/drivers/char/ns16550.c +++ b/xen/drivers/char/ns16550.c @@ -38,28 +38,11 @@ * can be specified in place of a numeric baud rate. Polled mode is specified * by requesting irq 0. */ -static char __initdata opt_com1[128] = ""; -static char __initdata opt_com2[128] = ""; +static char __initdata opt_com1[30] = ""; +static char __initdata opt_com2[30] = ""; string_param("com1", opt_com1); string_param("com2", opt_com2); -enum serial_param_type { - baud, - bridge_bdf, - clock_hz, - data_bits, - device, - io_base, - irq, - parity, - port_bdf, - reg_shift, - reg_width, - stop_bits, - /* List all parameters before this line. */ - num_serial_params -}; - static struct ns16550 { int baud, clock_hz, data_bits, parity, stop_bits, fifo_size, irq; u64 io_base; /* I/O port or memory-mapped I/O address. */ @@ -94,30 +77,6 @@ static struct ns16550 { #endif } ns16550_com[2] = { { 0 } }; -struct serial_param_var { - char name[12]; - enum serial_param_type type; -}; - -/* - * Enum struct keeping a table of all accepted parameter names for parsing - * com_console_options for serial port com1 and com2. - */ -static const struct serial_param_var __initconst sp_vars[] = { - {"baud", baud}, - {"bridge", bridge_bdf}, - {"clock-hz", clock_hz}, - {"data-bits", data_bits}, - {"dev", device}, - {"io-base", io_base}, - {"irq", irq}, - {"parity", parity}, - {"port", port_bdf}, - {"reg-shift", reg_shift}, - {"reg-width", reg_width}, - {"stop-bits", stop_bits}, -}; - #ifdef CONFIG_HAS_PCI struct ns16550_config { u16 vendor_id; @@ -1124,73 +1083,26 @@ pci_uart_config(struct ns16550 *uart, bool_t skip_amt, unsigned int idx) } #endif -/* - * Used to parse name value pairs and return which value it is along with - * pointer for the extracted value. - */ -static enum __init serial_param_type get_token(char *token, char **value) -{ - const char *param_name; - unsigned int i; - - param_name = strsep(&token, "="); - if ( param_name == NULL ) - return num_serial_params; - - /* Linear search for the parameter. */ - for ( i = 0; i < ARRAY_SIZE(sp_vars); i++ ) - { - if ( strcmp(sp_vars[i].name, param_name) == 0 ) - { - *value = token; - return sp_vars[i].type; - } - } - - return num_serial_params; -} - #define PARSE_ERR(_f, _a...) \ do { \ printk( "ERROR: " _f "\n" , ## _a ); \ return; \ } while ( 0 ) -#define PARSE_ERR_RET(_f, _a...) \ - do { \ - printk( "ERROR: " _f "\n" , ## _a ); \ - return false; \ - } while ( 0 ) - - -static bool __init parse_positional(struct ns16550 *uart, char **str) +static void __init ns16550_parse_port_config( + struct ns16550 *uart, const char *conf) { int baud; - const char *conf; - char *name_val_pos; - - conf = *str; - name_val_pos = strchr(conf, '='); - /* Finding the end of the positional parameters. */ - while ( name_val_pos > *str ) + /* No user-specified configuration? */ + if ( (conf == NULL) || (*conf == '\0') ) { - /* Working backwards from the '=' sign. */ - name_val_pos--; - if ( *name_val_pos == ',' ) - { - *name_val_pos = '\0'; - name_val_pos++; - break; - } + /* Some platforms may automatically probe the UART configuartion. */ + if ( uart->baud != 0 ) + goto config_parsed; + return; } - *str = name_val_pos; - /* When there are no positional parameters, we return from the function. */ - if ( conf == *str ) - return true; - - /* Parse positional parameters here. */ if ( strncmp(conf, "auto", 4) == 0 ) { uart->baud = BAUD_AUTO; @@ -1220,13 +1132,13 @@ static bool __init parse_positional(struct ns16550 *uart, char **str) if ( strncmp(conf, "pci", 3) == 0 ) { if ( pci_uart_config(uart, 1/* skip AMT */, uart - ns16550_com) ) - return true; + return; conf += 3; } else if ( strncmp(conf, "amt", 3) == 0 ) { if ( pci_uart_config(uart, 0, uart - ns16550_com) ) - return true; + return; conf += 3; } else @@ -1245,140 +1157,19 @@ static bool __init parse_positional(struct ns16550 *uart, char **str) conf = parse_pci(conf, NULL, &uart->ps_bdf[0], &uart->ps_bdf[1], &uart->ps_bdf[2]); if ( !conf ) - PARSE_ERR_RET("Bad port PCI coordinates"); - uart->ps_bdf_enable = true; + PARSE_ERR("Bad port PCI coordinates"); + uart->ps_bdf_enable = 1; } if ( *conf == ',' && *++conf != ',' ) { if ( !parse_pci(conf, NULL, &uart->pb_bdf[0], &uart->pb_bdf[1], &uart->pb_bdf[2]) ) - PARSE_ERR_RET("Bad bridge PCI coordinates"); - uart->pb_bdf_enable = true; + PARSE_ERR("Bad bridge PCI coordinates"); + uart->pb_bdf_enable = 1; } #endif - return true; -} - -static bool __init parse_namevalue_pairs(char *str, struct ns16550 *uart) -{ - char *token, *start = str; - char *param_value = NULL; - bool dev_set = false; - - if ( (str == NULL) || (*str == '\0') ) - return true; - - do - { - /* When no tokens are found, start will be NULL */ - token = strsep(&start, ","); - - switch ( get_token(token, ¶m_value) ) - { - case baud: - uart->baud = simple_strtoul(param_value, NULL, 0); - break; - - case bridge_bdf: - if ( !parse_pci(param_value, NULL, &uart->ps_bdf[0], - &uart->ps_bdf[1], &uart->ps_bdf[2]) ) - PARSE_ERR_RET("Bad port PCI coordinates\n"); - uart->ps_bdf_enable = true; - break; - - case clock_hz: - uart->clock_hz = simple_strtoul(param_value, NULL, 0) << 4; - break; - - case device: - if ( strncmp(param_value, "pci", 3) == 0 ) - { - pci_uart_config(uart, 1/* skip AMT */, uart - ns16550_com); - dev_set = true; - } - else if ( strncmp(param_value, "amt", 3) == 0 ) - { - pci_uart_config(uart, 0, uart - ns16550_com); - dev_set = true; - } - break; - - case io_base: - if ( dev_set ) - { - printk(XENLOG_WARNING - "Can't use io_base with dev=pci or dev=amt options\n"); - break; - } - uart->io_base = simple_strtoul(param_value, NULL, 0); - break; - - case irq: - uart->irq = simple_strtoul(param_value, NULL, 0); - break; - - case data_bits: - uart->data_bits = simple_strtoul(param_value, NULL, 0); - break; - - case parity: - uart->parity = parse_parity_char(*param_value); - break; - - case port_bdf: - if ( !parse_pci(param_value, NULL, &uart->pb_bdf[0], - &uart->pb_bdf[1], &uart->pb_bdf[2]) ) - PARSE_ERR_RET("Bad port PCI coordinates\n"); - uart->pb_bdf_enable = true; - break; - - case stop_bits: - uart->stop_bits = simple_strtoul(param_value, NULL, 0); - break; - - case reg_shift: - uart->reg_shift = simple_strtoul(param_value, NULL, 0); - break; - - case reg_width: - uart->reg_width = simple_strtoul(param_value, NULL, 0); - break; - - default: - PARSE_ERR_RET("Invalid parameter: %s\n", token); - } - } while ( start != NULL ); - - return true; -} - -static void __init ns16550_parse_port_config( - struct ns16550 *uart, const char *conf) -{ - char com_console_options[128]; - char *str; - - /* No user-specified configuration? */ - if ( (conf == NULL) || (*conf == '\0') ) - { - /* Some platforms may automatically probe the UART configuartion. */ - if ( uart->baud != 0 ) - goto config_parsed; - return; - } - - strlcpy(com_console_options, conf, ARRAY_SIZE(com_console_options)); - str = com_console_options; - - /* parse positional parameters and get pointer for name-value pairs */ - if ( !parse_positional(uart, &str) ) - return; - - if ( !parse_namevalue_pairs(str, uart) ) - return; - config_parsed: /* Sanity checks. */ if ( (uart->baud != BAUD_AUTO) && @@ -1386,8 +1177,6 @@ static void __init ns16550_parse_port_config( PARSE_ERR("Baud rate %d outside supported range.", uart->baud); if ( (uart->data_bits < 5) || (uart->data_bits > 8) ) PARSE_ERR("%d data bits are unsupported.", uart->data_bits); - if ( (uart->reg_width != 1) && (uart->reg_width != 4) ) - PARSE_ERR("Accepted values of reg_width are 1 and 4 only"); if ( (uart->stop_bits < 1) || (uart->stop_bits > 2) ) PARSE_ERR("%d stop bits are unsupported.", uart->stop_bits); if ( uart->io_base == 0 ) -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |