static int __init setup_serial_console(struct pcdp_uart *uart) { #ifdef CONFIG_SERIAL_8250_CONSOLE int mmio; static char options[64], *p = options; char parity; mmio = (uart->addr.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY); p += sprintf(p, "uart8250,%s,0x%llx", mmio ? "mmio" : "io", uart->addr.address); if (uart->baud) { p += sprintf(p, ",%llu", uart->baud); if (uart->bits) { switch (uart->parity) { case 0x2: parity = 'e'; break; case 0x3: parity = 'o'; break; default: parity = 'n'; } p += sprintf(p, "%c%d", parity, uart->bits); } } add_preferred_console("uart", 8250, &options[9]); return setup_earlycon(options); #else return -ENODEV; #endif }
int __init setup_early_serial8250_console(char *cmdline) { char match[] = "uart8250"; if (cmdline && cmdline[4] == ',') match[4] = '\0'; return setup_earlycon(cmdline, match, early_serial8250_setup); }
/* early_param wrapper for setup_earlycon() */ static int __init param_setup_earlycon(char *buf) { int err; /* * Just 'earlycon' is a valid param for devicetree earlycons; * don't generate a warning from parse_early_params() in that case */ if (!buf || !buf[0]) return 0; err = setup_earlycon(buf); if (err == -ENOENT || err == -EALREADY) return 0; return err; }
/** * parse_spcr() - parse ACPI SPCR table and add preferred console * * @earlycon: set up earlycon for the console specified by the table * * For the architectures with support for ACPI, CONFIG_ACPI_SPCR_TABLE may be * defined to parse ACPI SPCR table. As a result of the parsing preferred * console is registered and if @earlycon is true, earlycon is set up. * * When CONFIG_ACPI_SPCR_TABLE is defined, this function should be called * from arch initialization code as soon as the DT/ACPI decision is made. * */ int __init parse_spcr(bool earlycon) { static char opts[64]; struct acpi_table_spcr *table; acpi_status status; char *uart; char *iotype; int baud_rate; int err; if (acpi_disabled) return -ENODEV; status = acpi_get_table(ACPI_SIG_SPCR, 0, (struct acpi_table_header **)&table); if (ACPI_FAILURE(status)) return -ENOENT; if (table->header.revision < 2) { err = -ENOENT; pr_err("wrong table version\n"); goto done; } if (table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { switch (table->serial_port.access_width) { default: pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n"); case ACPI_ACCESS_SIZE_BYTE: iotype = "mmio"; break; case ACPI_ACCESS_SIZE_WORD: iotype = "mmio16"; break; case ACPI_ACCESS_SIZE_DWORD: iotype = "mmio32"; break; } } else iotype = "io"; switch (table->interface_type) { case ACPI_DBG2_ARM_SBSA_32BIT: iotype = "mmio32"; /* fall through */ case ACPI_DBG2_ARM_PL011: case ACPI_DBG2_ARM_SBSA_GENERIC: case ACPI_DBG2_BCM2835: uart = "pl011"; break; case ACPI_DBG2_16550_COMPATIBLE: case ACPI_DBG2_16550_SUBSET: uart = "uart"; break; default: err = -ENOENT; goto done; } switch (table->baud_rate) { case 3: baud_rate = 9600; break; case 4: baud_rate = 19200; break; case 6: baud_rate = 57600; break; case 7: baud_rate = 115200; break; default: err = -ENOENT; goto done; } if (qdf2400_erratum_44_present(&table->header)) uart = "qdf2400_e44"; if (xgene_8250_erratum_present(table)) iotype = "mmio32"; snprintf(opts, sizeof(opts), "%s,%s,0x%llx,%d", uart, iotype, table->serial_port.address, baud_rate); pr_info("console: %s\n", opts); if (earlycon) setup_earlycon(opts); err = add_preferred_console(uart, 0, opts + strlen(uart) + 1); done: acpi_put_table((struct acpi_table_header *)table); return err; }
/** * parse_spcr() - parse ACPI SPCR table and add preferred console * * @earlycon: set up earlycon for the console specified by the table * * For the architectures with support for ACPI, CONFIG_ACPI_SPCR_TABLE may be * defined to parse ACPI SPCR table. As a result of the parsing preferred * console is registered and if @earlycon is true, earlycon is set up. * * When CONFIG_ACPI_SPCR_TABLE is defined, this function should should be called * from arch inintialization code as soon as the DT/ACPI decision is made. * */ int __init parse_spcr(bool earlycon) { static char opts[64]; struct acpi_table_spcr *table; acpi_size table_size; acpi_status status; char *uart; char *iotype; int baud_rate; int err; if (acpi_disabled) return -ENODEV; status = acpi_get_table_with_size(ACPI_SIG_SPCR, 0, (struct acpi_table_header **)&table, &table_size); if (ACPI_FAILURE(status)) return -ENOENT; if (table->header.revision < 2) { err = -ENOENT; pr_err("wrong table version\n"); goto done; } iotype = table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY ? "mmio" : "io"; switch (table->interface_type) { case ACPI_DBG2_ARM_SBSA_32BIT: iotype = "mmio32"; /* fall through */ case ACPI_DBG2_ARM_PL011: case ACPI_DBG2_ARM_SBSA_GENERIC: case ACPI_DBG2_BCM2835: uart = "pl011"; break; case ACPI_DBG2_16550_COMPATIBLE: case ACPI_DBG2_16550_SUBSET: if (table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY && table->serial_port.bit_width == 32) iotype = "mmio32"; uart = "uart"; break; default: err = -ENOENT; goto done; } switch (table->baud_rate) { case 3: baud_rate = 9600; break; case 4: baud_rate = 19200; break; case 6: baud_rate = 57600; break; case 7: baud_rate = 115200; break; default: err = -ENOENT; goto done; } snprintf(opts, sizeof(opts), "%s,%s,0x%llx", uart, iotype, table->serial_port.address); pr_info("console: %s", opts); if (earlycon) setup_earlycon(opts); err = add_preferred_console(uart, 0, opts + strlen(uart) + 1); done: early_acpi_os_unmap_memory((void __iomem *)table, table_size); return err; }
/** * parse_spcr() - parse ACPI SPCR table and add preferred console * * @earlycon: set up earlycon for the console specified by the table * * For the architectures with support for ACPI, CONFIG_ACPI_SPCR_TABLE may be * defined to parse ACPI SPCR table. As a result of the parsing preferred * console is registered and if @earlycon is true, earlycon is set up. * * When CONFIG_ACPI_SPCR_TABLE is defined, this function should be called * from arch initialization code as soon as the DT/ACPI decision is made. * */ int __init parse_spcr(bool earlycon) { static char opts[64]; struct acpi_table_spcr *table; acpi_status status; char *uart; char *iotype; int baud_rate; int err; if (acpi_disabled) return -ENODEV; status = acpi_get_table(ACPI_SIG_SPCR, 0, (struct acpi_table_header **)&table); if (ACPI_FAILURE(status)) return -ENOENT; if (table->header.revision < 2) { err = -ENOENT; pr_err("wrong table version\n"); goto done; } if (table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { switch (table->serial_port.access_width) { default: pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n"); case ACPI_ACCESS_SIZE_BYTE: iotype = "mmio"; break; case ACPI_ACCESS_SIZE_WORD: iotype = "mmio16"; break; case ACPI_ACCESS_SIZE_DWORD: iotype = "mmio32"; break; } } else iotype = "io"; switch (table->interface_type) { case ACPI_DBG2_ARM_SBSA_32BIT: iotype = "mmio32"; /* fall through */ case ACPI_DBG2_ARM_PL011: case ACPI_DBG2_ARM_SBSA_GENERIC: case ACPI_DBG2_BCM2835: uart = "pl011"; break; case ACPI_DBG2_16550_COMPATIBLE: case ACPI_DBG2_16550_SUBSET: uart = "uart"; break; default: err = -ENOENT; goto done; } switch (table->baud_rate) { case 3: baud_rate = 9600; break; case 4: baud_rate = 19200; break; case 6: baud_rate = 57600; break; case 7: baud_rate = 115200; break; default: err = -ENOENT; goto done; } /* * If the E44 erratum is required, then we need to tell the pl011 * driver to implement the work-around. * * The global variable is used by the probe function when it * creates the UARTs, whether or not they're used as a console. * * If the user specifies "traditional" earlycon, the qdf2400_e44 * console name matches the EARLYCON_DECLARE() statement, and * SPCR is not used. Parameter "earlycon" is false. * * If the user specifies "SPCR" earlycon, then we need to update * the console name so that it also says "qdf2400_e44". Parameter * "earlycon" is true. * * For consistency, if we change the console name, then we do it * for everyone, not just earlycon. */ if (qdf2400_erratum_44_present(&table->header)) { qdf2400_e44_present = true; if (earlycon) uart = "qdf2400_e44"; } if (xgene_8250_erratum_present(table)) iotype = "mmio32"; snprintf(opts, sizeof(opts), "%s,%s,0x%llx,%d", uart, iotype, table->serial_port.address, baud_rate); pr_info("console: %s\n", opts); if (earlycon) setup_earlycon(opts); err = add_preferred_console(uart, 0, opts + strlen(uart) + 1); done: acpi_put_table((struct acpi_table_header *)table); return err; }