Module Name: src Committed By: jmcneill Date: Tue Oct 15 00:23:44 UTC 2019
Modified Files: src/sys/arch/arm/acpi: acpipchb.c Log Message: Fix detection of root port resources for Graviton and remove no longer required bridge fixup To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/acpi/acpipchb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/acpi/acpipchb.c diff -u src/sys/arch/arm/acpi/acpipchb.c:1.11 src/sys/arch/arm/acpi/acpipchb.c:1.12 --- src/sys/arch/arm/acpi/acpipchb.c:1.11 Mon Oct 14 22:59:15 2019 +++ src/sys/arch/arm/acpi/acpipchb.c Tue Oct 15 00:23:44 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: acpipchb.c,v 1.11 2019/10/14 22:59:15 jmcneill Exp $ */ +/* $NetBSD: acpipchb.c,v 1.12 2019/10/15 00:23:44 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpipchb.c,v 1.11 2019/10/14 22:59:15 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpipchb.c,v 1.12 2019/10/15 00:23:44 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -146,9 +146,16 @@ acpipchb_amazon_graviton_map(ACPI_HANDLE struct acpi_pci_context *ap = ctx; struct acpi_resources res; struct acpi_mem *mem; + ACPI_HANDLE parent; ACPI_STATUS rv; int error; + rv = AcpiGetParent(handle, &parent); + if (ACPI_FAILURE(rv)) + return rv; + if (ap->ap_handle != parent) + return AE_OK; + rv = acpi_resource_parse(ap->ap_dev, handle, "_CRS", &res, &acpi_resource_parse_ops_quiet); if (ACPI_FAILURE(rv)) return rv; @@ -163,18 +170,10 @@ acpipchb_amazon_graviton_map(ACPI_HANDLE if (error != 0) return AE_NO_MEMORY; - return AE_CTRL_TERMINATE; -} - -static ACPI_STATUS -acpipchb_amazon_graviton_busres(ACPI_RESOURCE *res, void *context) -{ - if (res->Type != ACPI_RESOURCE_TYPE_ADDRESS16) - return AE_OK; - if (res->Data.Address16.ResourceType != ACPI_BUS_NUMBER_RANGE) - return AE_OK; + ap->ap_conf_read = acpipchb_amazon_graviton_conf_read; + ap->ap_conf_write = acpipchb_amazon_graviton_conf_write; + ap->ap_bus_maxdevs = acpipchb_amazon_graviton_bus_maxdevs; - *(ACPI_RESOURCE *)context = *res; return AE_CTRL_TERMINATE; } @@ -182,51 +181,10 @@ static void acpipchb_amazon_graviton_init(struct acpi_pci_context *ap) { ACPI_STATUS rv; - ACPI_RESOURCE res; - pcitag_t tag; - pcireg_t busdata; rv = AcpiGetDevices(__UNCONST("AMZN0001"), acpipchb_amazon_graviton_map, ap, NULL); if (ACPI_FAILURE(rv)) return; - - ap->ap_conf_read = acpipchb_amazon_graviton_conf_read; - ap->ap_conf_write = acpipchb_amazon_graviton_conf_write; - ap->ap_bus_maxdevs = acpipchb_amazon_graviton_bus_maxdevs; - - /* - * The root port's may not have the correct bus information. Fix this up... - */ - /* Find bus number range */ - memset(&res, 0, sizeof(res)); - rv = AcpiWalkResources(ap->ap_handle, "_CRS", acpipchb_amazon_graviton_busres, &res); - if (ACPI_FAILURE(rv) || res.Type != ACPI_RESOURCE_TYPE_ADDRESS16) - return; - - const int bus_primary = res.Data.Address16.Address.Minimum; - const int bus_secondary = bus_primary + 1; - const int bus_subordinate = res.Data.Address16.Address.Maximum; - - tag = pci_make_tag(&ap->ap_pc, ap->ap_bus, 0, 0); - busdata = pci_conf_read(&ap->ap_pc, tag, PCI_BRIDGE_BUS_REG); - if (PCI_BRIDGE_BUS_NUM_PRIMARY(busdata) != bus_primary || - PCI_BRIDGE_BUS_NUM_SECONDARY(busdata) != bus_secondary || - PCI_BRIDGE_BUS_NUM_SUBORDINATE(busdata) != bus_subordinate) { - - aprint_normal_dev(ap->ap_dev, - "fixup bridge bus numbers %#x/%#x/%#x -> %#x/%#x/%#x\n", - PCI_BRIDGE_BUS_NUM_PRIMARY(busdata), - PCI_BRIDGE_BUS_NUM_SECONDARY(busdata), - PCI_BRIDGE_BUS_NUM_SUBORDINATE(busdata), - bus_primary, bus_secondary, bus_subordinate); - busdata &= ~PCI_BRIDGE_BUS_PRIMARY; - busdata |= __SHIFTIN(bus_primary, PCI_BRIDGE_BUS_PRIMARY); - busdata &= ~PCI_BRIDGE_BUS_SECONDARY; - busdata |= __SHIFTIN(bus_secondary, PCI_BRIDGE_BUS_SECONDARY); - busdata &= ~PCI_BRIDGE_BUS_SUBORDINATE; - busdata |= __SHIFTIN(bus_subordinate, PCI_BRIDGE_BUS_SUBORDINATE); - pci_conf_write(&ap->ap_pc, tag, PCI_BRIDGE_BUS_REG, busdata); - } } static const struct acpipchb_quirk {