Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm/acpi acpi: Cleanup SPCR setup and style fixes.
details: https://anonhg.NetBSD.org/src/rev/52cc9b8d336d
branches: trunk
changeset: 946704:52cc9b8d336d
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Sun Dec 06 14:01:40 2020 +0000
description:
acpi: Cleanup SPCR setup and style fixes.
diffstat:
sys/arch/arm/acpi/acpi_platform.c | 201 +++++++++++++++++++++++--------------
1 files changed, 126 insertions(+), 75 deletions(-)
diffs (297 lines):
diff -r 3daaf2181158 -r 52cc9b8d336d sys/arch/arm/acpi/acpi_platform.c
--- a/sys/arch/arm/acpi/acpi_platform.c Sun Dec 06 13:51:06 2020 +0000
+++ b/sys/arch/arm/acpi/acpi_platform.c Sun Dec 06 14:01:40 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_platform.c,v 1.21 2020/10/10 15:25:31 jmcneill Exp $ */
+/* $NetBSD: acpi_platform.c,v 1.22 2020/12/06 14:01:40 jmcneill Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
#include "opt_multiprocessor.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_platform.c,v 1.21 2020/10/10 15:25:31 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_platform.c,v 1.22 2020/12/06 14:01:40 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -81,14 +81,24 @@
#include <libfdt.h>
-#define SPCR_BAUD_UNKNOWN 0
+#define SPCR_BAUD_DEFAULT 0
#define SPCR_BAUD_9600 3
#define SPCR_BAUD_19200 4
#define SPCR_BAUD_57600 6
#define SPCR_BAUD_115200 7
+static const struct acpi_spcr_baud_rate {
+ uint8_t id;
+ uint32_t baud_rate;
+} acpi_spcr_baud_rates[] = {
+ { SPCR_BAUD_DEFAULT, 0 },
+ { SPCR_BAUD_9600, 9600 },
+ { SPCR_BAUD_19200, 19200 },
+ { SPCR_BAUD_57600, 57600 },
+ { SPCR_BAUD_115200, 115200 },
+};
+
extern struct bus_space arm_generic_bs_tag;
-extern struct bus_space arm_generic_a4x_bs_tag;
#if NPLCOM > 0
static struct plcom_instance plcom_console;
@@ -125,6 +135,88 @@
}
static void
+acpi_platform_attach_uart(ACPI_TABLE_SPCR *spcr)
+{
+#if NCOM > 0
+ struct com_regs regs;
+ bus_space_handle_t dummy_bsh;
+ u_int reg_shift;
+#endif
+ int baud_rate, n;
+
+ /*
+ * Only MMIO access is supported today.
+ */
+ if (spcr->SerialPort.SpaceId != ACPI_ADR_SPACE_SYSTEM_MEMORY) {
+ return;
+ }
+ if (le64toh(spcr->SerialPort.Address) == 0) {
+ return;
+ }
+
+ /*
+ * Lookup SPCR baud rate.
+ */
+ baud_rate = 0;
+ for (n = 0; n < __arraycount(acpi_spcr_baud_rates); n++) {
+ if (acpi_spcr_baud_rates[n].id == spcr->BaudRate) {
+ baud_rate = acpi_spcr_baud_rates[n].baud_rate;
+ break;
+ }
+ }
+
+ /*
+ * Attach console device.
+ */
+ switch (spcr->InterfaceType) {
+#if NPLCOM > 0
+ case ACPI_DBG2_ARM_PL011:
+ case ACPI_DBG2_ARM_SBSA_32BIT:
+ case ACPI_DBG2_ARM_SBSA_GENERIC:
+ plcom_console.pi_type = PLCOM_TYPE_PL011;
+ plcom_console.pi_iot = &arm_generic_bs_tag;
+ plcom_console.pi_iobase = le64toh(spcr->SerialPort.Address);
+ plcom_console.pi_size = PL011COM_UART_SIZE;
+ plcom_console.pi_flags = PLC_FLAG_32BIT_ACCESS;
+
+ plcomcnattach(&plcom_console, baud_rate, 0, TTYDEF_CFLAG, -1);
+ break;
+#endif
+
+#if NCOM > 0
+ case ACPI_DBG2_16550_COMPATIBLE:
+ case ACPI_DBG2_16550_SUBSET:
+ memset(&dummy_bsh, 0, sizeof(dummy_bsh));
+ if (ACPI_ACCESS_BIT_WIDTH(spcr->SerialPort.AccessWidth) == 8) {
+ reg_shift = 0;
+ } else {
+ reg_shift = 2;
+ }
+ com_init_regs_stride(®s, &arm_generic_bs_tag, dummy_bsh,
+ le64toh(spcr->SerialPort.Address), reg_shift);
+ comcnattach1(®s, baud_rate, -1, COM_TYPE_NORMAL,
+ TTYDEF_CFLAG);
+ break;
+
+ case ACPI_DBG2_BCM2835:
+ memset(&dummy_bsh, 0, sizeof(dummy_bsh));
+ com_init_regs_stride(®s, &arm_generic_bs_tag, dummy_bsh,
+ le64toh(spcr->SerialPort.Address) + 0x40, 2);
+ comcnattach1(®s, baud_rate, -1, COM_TYPE_BCMAUXUART,
+ TTYDEF_CFLAG);
+ cn_set_magic("+++++");
+ break;
+#endif
+
+ default:
+ printf("SPCR: kernel does not support interface type %#x\n",
+ spcr->InterfaceType);
+ break;
+ }
+
+}
+
+static void
acpi_platform_startup(void)
{
ACPI_TABLE_SPCR *spcr;
@@ -132,68 +224,12 @@
#ifdef MULTIPROCESSOR
ACPI_TABLE_MADT *madt;
#endif
- int baud_rate;
/*
* Setup serial console device
*/
if (ACPI_SUCCESS(acpi_table_find(ACPI_SIG_SPCR, (void **)&spcr))) {
-
- switch (spcr->BaudRate) {
- case SPCR_BAUD_9600:
- baud_rate = 9600;
- break;
- case SPCR_BAUD_19200:
- baud_rate = 19200;
- break;
- case SPCR_BAUD_57600:
- baud_rate = 57600;
- break;
- case SPCR_BAUD_115200:
- case SPCR_BAUD_UNKNOWN:
- default:
- baud_rate = 115200;
- break;
- }
-
- if (spcr->SerialPort.SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY &&
- le64toh(spcr->SerialPort.Address) != 0) {
- switch (spcr->InterfaceType) {
-#if NPLCOM > 0
- case ACPI_DBG2_ARM_PL011:
- case ACPI_DBG2_ARM_SBSA_32BIT:
- case ACPI_DBG2_ARM_SBSA_GENERIC:
- plcom_console.pi_type = PLCOM_TYPE_PL011;
- plcom_console.pi_iot = &arm_generic_bs_tag;
- plcom_console.pi_iobase = le64toh(spcr->SerialPort.Address);
- plcom_console.pi_size = PL011COM_UART_SIZE;
- plcom_console.pi_flags = PLC_FLAG_32BIT_ACCESS;
-
- plcomcnattach(&plcom_console, baud_rate, 0, TTYDEF_CFLAG, -1);
- break;
-#endif
-#if NCOM > 0
- case ACPI_DBG2_16550_COMPATIBLE:
- case ACPI_DBG2_16550_SUBSET:
- if (ACPI_ACCESS_BIT_WIDTH(spcr->SerialPort.AccessWidth) == 8) {
- comcnattach(&arm_generic_bs_tag, le64toh(spcr->SerialPort.Address), baud_rate, -1,
- COM_TYPE_NORMAL, TTYDEF_CFLAG);
- } else {
- comcnattach(&arm_generic_a4x_bs_tag, le64toh(spcr->SerialPort.Address), baud_rate, -1,
- COM_TYPE_NORMAL, TTYDEF_CFLAG);
- }
- break;
- case ACPI_DBG2_BCM2835:
- comcnattach(&arm_generic_a4x_bs_tag, le64toh(spcr->SerialPort.Address) + 0x40, baud_rate, -1,
- COM_TYPE_BCMAUXUART, TTYDEF_CFLAG);
- cn_set_magic("+++++");
- break;
-#endif
- default:
- printf("SPCR: kernel does not support interface type %#x\n", spcr->InterfaceType);
- break;
- }
- }
+ acpi_platform_attach_uart(spcr);
acpi_table_unmap((ACPI_TABLE_HEADER *)spcr);
}
@@ -201,8 +237,9 @@
* Initialize PSCI 0.2+ if implemented
*/
if (ACPI_SUCCESS(acpi_table_find(ACPI_SIG_FADT, (void **)&fadt))) {
- if (le16toh(fadt->ArmBootFlags) & ACPI_FADT_PSCI_COMPLIANT) {
- if (le16toh(fadt->ArmBootFlags) & ACPI_FADT_PSCI_USE_HVC) {
+ const uint16_t boot_flags = le16toh(fadt->ArmBootFlags);
+ if ((boot_flags & ACPI_FADT_PSCI_COMPLIANT) != 0) {
+ if ((boot_flags & ACPI_FADT_PSCI_USE_HVC) != 0) {
psci_init(psci_call_hvc);
} else {
psci_init(psci_call_smc);
@@ -219,7 +256,8 @@
char *end = (char *)madt + le32toh(madt->Header.Length);
char *where = (char *)madt + sizeof(ACPI_TABLE_MADT);
while (where < end) {
- ACPI_SUBTABLE_HEADER *subtable = (ACPI_SUBTABLE_HEADER *)where;
+ ACPI_SUBTABLE_HEADER *subtable =
+ (ACPI_SUBTABLE_HEADER *)where;
if (subtable->Type == ACPI_MADT_TYPE_GENERIC_INTERRUPT)
arm_cpu_max++;
where += subtable->Length;
@@ -243,20 +281,26 @@
{
#if NCOM > 0
prop_dictionary_t prop = device_properties(self);
+ ACPI_STATUS rv;
if (device_is_a(self, "com")) {
ACPI_TABLE_SPCR *spcr;
- if (ACPI_FAILURE(acpi_table_find(ACPI_SIG_SPCR, (void **)&spcr)))
+ rv = acpi_table_find(ACPI_SIG_SPCR, (void **)&spcr);
+ if (ACPI_FAILURE(rv)) {
return;
+ }
- if (spcr->SerialPort.SpaceId != ACPI_ADR_SPACE_SYSTEM_MEMORY)
+ if (spcr->SerialPort.SpaceId != ACPI_ADR_SPACE_SYSTEM_MEMORY) {
goto spcr_unmap;
- if (le64toh(spcr->SerialPort.Address) == 0)
+ }
+ if (le64toh(spcr->SerialPort.Address) == 0) {
goto spcr_unmap;
+ }
if (spcr->InterfaceType != ACPI_DBG2_16550_COMPATIBLE &&
- spcr->InterfaceType != ACPI_DBG2_16550_SUBSET)
+ spcr->InterfaceType != ACPI_DBG2_16550_SUBSET) {
goto spcr_unmap;
+ }
if (device_is_a(device_parent(self), "puc")) {
const struct puc_attach_args * const paa = aux;
@@ -266,8 +310,10 @@
pci_decompose_tag(paa->pc, paa->tag, &b, &d, &f);
if (spcr->PciSegment == s && spcr->PciBus == b &&
- spcr->PciDevice == d && spcr->PciFunction == f)
- prop_dictionary_set_bool(prop, "force_console", true);
+ spcr->PciDevice == d && spcr->PciFunction == f) {
+ prop_dictionary_set_bool(prop,
+ "force_console", true);
+ }
}
if (device_is_a(device_parent(self), "acpi")) {
@@ -275,16 +321,21 @@
struct acpi_resources res;
struct acpi_mem *mem;
- if (ACPI_FAILURE(acpi_resource_parse(self, aa->aa_node->ad_handle, "_CRS",
- &res, &acpi_resource_parse_ops_quiet)))
+ if (ACPI_FAILURE(acpi_resource_parse(self,
+ aa->aa_node->ad_handle, "_CRS", &res,
+ &acpi_resource_parse_ops_quiet))) {
goto spcr_unmap;
+ }
mem = acpi_res_mem(&res, 0);
- if (mem == NULL)
+ if (mem == NULL) {
goto crs_cleanup;
+ }
- if (mem->ar_base == le64toh(spcr->SerialPort.Address))
- prop_dictionary_set_bool(prop, "force_console", true);
+ if (mem->ar_base == le64toh(spcr->SerialPort.Address)) {
+ prop_dictionary_set_bool(prop,
+ "force_console", true);
+ }
crs_cleanup:
acpi_resource_cleanup(&res);
Home |
Main Index |
Thread Index |
Old Index