|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8] ns16550: Add support for UART parameters to be specifed with name-value pairs
>>> On 02.06.17 at 22:07, <swapnil.paratey@xxxxxxx> wrote:
> Add name=value parsing options for com1 and com2 to add flexibility
> in setting register values for MMIO UART devices.
>
> Maintain backward compatibility with previous positional parameter
> specfications.
>
> eg. com1=115200,8n1,0x3f8,4
> eg. com1=115200,8n1,0x3f8,4,reg_width=4,reg_shift=2
> eg. com1=baud=115200,parity=n,reg_width=4,reg_shift=2,irq=4
>
> Signed-off-by: Swapnil Paratey <swapnil.paratey@xxxxxxx>
> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
For the future, please drop prior tags when fixing bugs or doing
any other not purely mechanical changes.
> +enum serial_param_type {
> + baud,
> + clock_hz,
> + data_bits,
> + io_base,
> + irq,
> + parity,
> + reg_shift,
> + reg_width,
> + stop_bits,
> +#ifdef CONFIG_HAS_PCI
> + bridge_bdf,
> + device,
> + port_bdf,
> +#endif
> + /* List all parameters before this line. */
> + num_serial_params
> +};
Just like you've done here and ...
> @@ -77,6 +96,32 @@ 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},
> + {"clock-hz", clock_hz},
> + {"data-bits", data_bits},
> + {"io-base", io_base},
> + {"irq", irq},
> + {"parity", parity},
> + {"reg-shift", reg_shift},
> + {"reg-width", reg_width},
> + {"stop-bits", stop_bits},
> +#ifdef CONFIG_HAS_PCI
> + {"bridge", bridge_bdf},
> + {"dev", device},
> + {"port", port_bdf},
> +#endif
> +};
... here I would also have expected you to group PCI things ...
> +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;
> +#ifdef CONFIG_HAS_PCI
> + 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;
> +#endif
> + case clock_hz:
> + uart->clock_hz = simple_strtoul(param_value, NULL, 0) << 4;
> + break;
> +#ifdef CONFIG_HAS_PCI
> + 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;
> +#endif
> + 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;
> +#ifdef CONFIG_HAS_PCI
> + 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;
> +#endif
> + 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;
> +}
... here. Furthermore please retain the blank lines you had between
individual case blocks (instead of replacing them by #if-s/#else-s).
And please get rid of the stray blank line at the bottom of above
switch(). With all of this you may then retain my R-b.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |