aspeed: Introduce a "bmc-console" machine option
Most of the Aspeed machines use the UART5 device for the boot console, and QEMU connects the first serial Chardev to this SoC device for this purpose. See routine connect_serial_hds_to_uarts(). Nevertheless, some machines use another boot console, such as the fuji, and commit5d63d0c76c
("hw/arm/aspeed: Allow machine to set UART default") introduced a SoC class attribute 'uart_default' and property to be able to change the boot console device. It was later changed by commitd2b3eaefb4
("aspeed: Refactor UART init for multi-SoC machines"). The "bmc-console" machine option goes a step further and lets the user define the UART device from the QEMU command line without introducing a new machine definition. For instance, to use device UART3 (mapped on /dev/ttyS2 under Linux) instead of the default UART5, one would use : -M ast2500-evb,bmc-console=uart3 Cc: Abhishek Singh Dagur <abhishek@drut.io> Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Joel Stanley <joel@jms.id.au> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
ebd643ebd2
commit
f65f6ad5a7
@ -122,6 +122,11 @@ Options specific to Aspeed machines are :
|
||||
|
||||
* ``spi-model`` to change the SPI Flash model.
|
||||
|
||||
* ``bmc-console`` to change the default console device. Most of the
|
||||
machines use the ``UART5`` device for a boot console, which is
|
||||
mapped on ``/dev/ttyS4`` under Linux, but it is not always the
|
||||
case.
|
||||
|
||||
For instance, to start the ``ast2500-evb`` machine with a different
|
||||
FMC chip and a bigger (64M) SPI chip, use :
|
||||
|
||||
@ -129,6 +134,12 @@ FMC chip and a bigger (64M) SPI chip, use :
|
||||
|
||||
-M ast2500-evb,fmc-model=mx25l25635e,spi-model=mx66u51235f
|
||||
|
||||
To change the boot console and use device ``UART3`` (``/dev/ttyS2``
|
||||
under Linux), use :
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
-M ast2500-evb,bmc-console=uart3
|
||||
|
||||
Aspeed minibmc family boards (``ast1030-evb``)
|
||||
==================================================================
|
||||
|
@ -42,6 +42,7 @@ struct AspeedMachineState {
|
||||
AspeedSoCState soc;
|
||||
MemoryRegion boot_rom;
|
||||
bool mmio_exec;
|
||||
uint32_t uart_chosen;
|
||||
char *fmc_model;
|
||||
char *spi_model;
|
||||
};
|
||||
@ -333,10 +334,11 @@ static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
|
||||
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
|
||||
AspeedSoCState *s = &bmc->soc;
|
||||
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
|
||||
int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
|
||||
|
||||
aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0));
|
||||
aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
|
||||
for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
|
||||
if (uart == amc->uart_default) {
|
||||
if (uart == uart_chosen) {
|
||||
continue;
|
||||
}
|
||||
aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
|
||||
@ -1078,6 +1080,35 @@ static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
|
||||
bmc->spi_model = g_strdup(value);
|
||||
}
|
||||
|
||||
static char *aspeed_get_bmc_console(Object *obj, Error **errp)
|
||||
{
|
||||
AspeedMachineState *bmc = ASPEED_MACHINE(obj);
|
||||
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
|
||||
int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
|
||||
|
||||
return g_strdup_printf("uart%d", uart_chosen - ASPEED_DEV_UART1 + 1);
|
||||
}
|
||||
|
||||
static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
|
||||
{
|
||||
AspeedMachineState *bmc = ASPEED_MACHINE(obj);
|
||||
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
|
||||
AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
|
||||
int val;
|
||||
|
||||
if (sscanf(value, "uart%u", &val) != 1) {
|
||||
error_setg(errp, "Bad value for \"uart\" property");
|
||||
return;
|
||||
}
|
||||
|
||||
/* The number of UART depends on the SoC */
|
||||
if (val < 1 || val > sc->uarts_num) {
|
||||
error_setg(errp, "\"uart\" should be in range [1 - %d]", sc->uarts_num);
|
||||
return;
|
||||
}
|
||||
bmc->uart_chosen = ASPEED_DEV_UART1 + val - 1;
|
||||
}
|
||||
|
||||
static void aspeed_machine_class_props_init(ObjectClass *oc)
|
||||
{
|
||||
object_class_property_add_bool(oc, "execute-in-place",
|
||||
@ -1086,6 +1117,11 @@ static void aspeed_machine_class_props_init(ObjectClass *oc)
|
||||
object_class_property_set_description(oc, "execute-in-place",
|
||||
"boot directly from CE0 flash device");
|
||||
|
||||
object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
|
||||
aspeed_set_bmc_console);
|
||||
object_class_property_set_description(oc, "bmc-console",
|
||||
"Change the default UART to \"uartX\"");
|
||||
|
||||
object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
|
||||
aspeed_set_fmc_model);
|
||||
object_class_property_set_description(oc, "fmc-model",
|
||||
|
Loading…
Reference in New Issue
Block a user