Module Name:    src
Committed By:   martin
Date:           Wed Jul  3 19:13:20 UTC 2024

Modified Files:
        src/sys/arch/aarch64/include [netbsd-10]: vmparam.h
        src/sys/arch/arm/pci [netbsd-10]: pci_msi_machdep.c
        src/sys/dev/acpi [netbsd-10]: acpi_resource.c
        src/sys/dev/pci [netbsd-10]: pci_resource.c

Log Message:
Pull up following revision(s) (requested by jmcneill in ticket #735):

        sys/dev/pci/pci_resource.c: revision 1.5
        sys/arch/arm/pci/pci_msi_machdep.c: revision 1.10
        sys/arch/aarch64/include/vmparam.h: revision 1.21
        sys/dev/acpi/acpi_resource.c: revision 1.43

pci_resource: Make unexpected bus numbers in bridges non-fatal.

Firmware bugs happen. Log a warning and continue instead of panicing.
acpi: Ignore producer/consumer bit for fixed memory resources.

The requirement to honour the producer/consumer bit in fixed memory
resource descriptors was dropped at some point in a revision to the ACPI
2.0 specification because too many firmware implementations got it wrong.

aarch64: Bump VM_PHYSSEG_MAX to match DRAM_BANKS / FDT_MEMORY_RANGES.

On aarch64 there is a single free list, so VM_PHYSSEG_MAX needs to be
the same as FDT_MEMORY_RANGES (which needs to be the same as DRAM_BANKS).

Future cleanup should be done to fold these into a single define.

arm: pci: Fix ITS ID lookup for MSIs.
pci_get_frameid expects a BDF requestor ID as input, not a Device ID.

Fixes MSI/MSI-X support on Ampere Altra systems.


To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.19.4.1 src/sys/arch/aarch64/include/vmparam.h
cvs rdiff -u -r1.9 -r1.9.24.1 src/sys/arch/arm/pci/pci_msi_machdep.c
cvs rdiff -u -r1.42 -r1.42.6.1 src/sys/dev/acpi/acpi_resource.c
cvs rdiff -u -r1.3.2.1 -r1.3.2.2 src/sys/dev/pci/pci_resource.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/aarch64/include/vmparam.h
diff -u src/sys/arch/aarch64/include/vmparam.h:1.19 src/sys/arch/aarch64/include/vmparam.h:1.19.4.1
--- src/sys/arch/aarch64/include/vmparam.h:1.19	Sat Apr  2 11:16:06 2022
+++ src/sys/arch/aarch64/include/vmparam.h	Wed Jul  3 19:13:20 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.19 2022/04/02 11:16:06 skrll Exp $ */
+/* $NetBSD: vmparam.h,v 1.19.4.1 2024/07/03 19:13:20 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -179,7 +179,7 @@
 #define AARCH64_KVA_TO_PA(va)	((paddr_t) ((va) & ~AARCH64_DIRECTMAP_MASK))
 
 /* */
-#define VM_PHYSSEG_MAX		64              /* XXX */
+#define VM_PHYSSEG_MAX		256              /* XXX */
 #define VM_PHYSSEG_STRAT	VM_PSTRAT_BSEARCH
 
 #define VM_NFREELIST		1

Index: src/sys/arch/arm/pci/pci_msi_machdep.c
diff -u src/sys/arch/arm/pci/pci_msi_machdep.c:1.9 src/sys/arch/arm/pci/pci_msi_machdep.c:1.9.24.1
--- src/sys/arch/arm/pci/pci_msi_machdep.c:1.9	Thu Feb 13 06:28:25 2020
+++ src/sys/arch/arm/pci/pci_msi_machdep.c	Wed Jul  3 19:13:20 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_msi_machdep.c,v 1.9 2020/02/13 06:28:25 skrll Exp $ */
+/* $NetBSD: pci_msi_machdep.c,v 1.9.24.1 2024/07/03 19:13:20 martin Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_msi_machdep.c,v 1.9 2020/02/13 06:28:25 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_msi_machdep.c,v 1.9.24.1 2024/07/03 19:13:20 martin Exp $");
 
 #include <sys/kernel.h>
 #include <sys/kmem.h>
@@ -63,14 +63,13 @@ static struct arm_pci_msi *
 arm_pci_msi_lookup(const struct pci_attach_args *pa)
 {
 	struct arm_pci_msi *msip;
-	uint32_t devid, frameid;
+	uint32_t rid, frameid;
 	int b, d, f;
 
 	pci_decompose_tag(pa->pa_pc, pa->pa_tag, &b, &d, &f);
 
-	devid = (b << 8) | (d << 3) | f;
-	devid = pci_get_devid(pa->pa_pc, devid);
-	frameid = pci_get_frameid(pa->pa_pc, devid);
+	rid = (b << 8) | (d << 3) | f;
+	frameid = pci_get_frameid(pa->pa_pc, rid);
 
 	SIMPLEQ_FOREACH(msip, &arm_pci_msi_list, msi_link)
 		if (frameid == msip->msi_id)

Index: src/sys/dev/acpi/acpi_resource.c
diff -u src/sys/dev/acpi/acpi_resource.c:1.42 src/sys/dev/acpi/acpi_resource.c:1.42.6.1
--- src/sys/dev/acpi/acpi_resource.c:1.42	Sat Aug  7 18:39:40 2021
+++ src/sys/dev/acpi/acpi_resource.c	Wed Jul  3 19:13:20 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_resource.c,v 1.42 2021/08/07 18:39:40 jmcneill Exp $	*/
+/*	$NetBSD: acpi_resource.c,v 1.42.6.1 2024/07/03 19:13:20 martin Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_resource.c,v 1.42 2021/08/07 18:39:40 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_resource.c,v 1.42.6.1 2024/07/03 19:13:20 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -247,9 +247,7 @@ acpi_resource_parse_callback(ACPI_RESOUR
 
 	case ACPI_RESOURCE_TYPE_ADDRESS32:
 		/* XXX Only fixed size supported for now */
-		if (res->Data.Address32.Address.AddressLength == 0 ||
-		    (!arg->include_producer &&
-		     res->Data.Address32.ProducerConsumer != ACPI_CONSUMER))
+		if (res->Data.Address32.Address.AddressLength == 0)
 			break;
 #define ADDRESS32_FIXED2(r)						\
 	((r)->Data.Address32.MinAddressFixed == ACPI_ADDRESS_FIXED &&	\
@@ -303,9 +301,7 @@ acpi_resource_parse_callback(ACPI_RESOUR
 	case ACPI_RESOURCE_TYPE_ADDRESS64:
 #ifdef _LP64
 		/* XXX Only fixed size supported for now */
-		if (res->Data.Address64.Address.AddressLength == 0 ||
-		    (!arg->include_producer &&
-		     res->Data.Address64.ProducerConsumer != ACPI_CONSUMER))
+		if (res->Data.Address64.Address.AddressLength == 0)
 			break;
 #define ADDRESS64_FIXED2(r)						\
 	((r)->Data.Address64.MinAddressFixed == ACPI_ADDRESS_FIXED &&	\

Index: src/sys/dev/pci/pci_resource.c
diff -u src/sys/dev/pci/pci_resource.c:1.3.2.1 src/sys/dev/pci/pci_resource.c:1.3.2.2
--- src/sys/dev/pci/pci_resource.c:1.3.2.1	Wed Nov 29 12:34:46 2023
+++ src/sys/dev/pci/pci_resource.c	Wed Jul  3 19:13:19 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_resource.c,v 1.3.2.1 2023/11/29 12:34:46 martin Exp $ */
+/* $NetBSD: pci_resource.c,v 1.3.2.2 2024/07/03 19:13:19 martin Exp $ */
 
 /*-
  * Copyright (c) 2022 Jared McNeill <jmcne...@invisible.ca>
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_resource.c,v 1.3.2.1 2023/11/29 12:34:46 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_resource.c,v 1.3.2.2 2024/07/03 19:13:19 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -136,7 +136,7 @@ struct pci_resources {
 	vmem_t		*pr_res[NUM_PCI_RANGES];
 };
 
-static void	pci_resource_scan_bus(struct pci_resources *,
+static int	pci_resource_scan_bus(struct pci_resources *,
 		    struct pci_device *, uint8_t);
 
 #define	PCI_SBDF_FMT			"%04x:%02x:%02x.%u"
@@ -524,7 +524,11 @@ pci_resource_scan_device(struct pci_reso
 		bridge_bus = pci_conf_read(pr->pr_pc, tag, PCI_BRIDGE_BUS_REG);
 		sec_bus = PCI_BRIDGE_BUS_NUM_SECONDARY(bridge_bus);
 		if (sec_bus <= pr->pr_endbus) {
-			pci_resource_scan_bus(pr, pd, sec_bus);
+			if (pci_resource_scan_bus(pr, pd, sec_bus) != 0) {
+				DPRINT("PCI: " PCI_SBDF_FMT " bus %u "
+				       "already scanned (firmware bug!)\n",
+				       PCI_SBDF_FMT_ARGS(pr, pd), sec_bus);
+			}
 		}
 	}
 
@@ -536,7 +540,7 @@ pci_resource_scan_device(struct pci_reso
  *
  *   Enumerate devices on a bus, recursively.
  */
-static void
+static int
 pci_resource_scan_bus(struct pci_resources *pr,
     struct pci_device *bridge_dev, uint8_t busno)
 {
@@ -552,8 +556,7 @@ pci_resource_scan_bus(struct pci_resourc
 		 * Firmware has configured more than one bridge with the
 		 * same secondary bus number.
 		 */
-		panic("Bus %u already scanned (firmware bug!)", busno);
-		return;
+		return EINVAL;
 	}
 
 	pb = pci_new_bus(pr, busno, bridge_dev);
@@ -570,6 +573,8 @@ pci_resource_scan_bus(struct pci_resourc
 			pci_resource_scan_device(pr, pb, devno, funcno);
 		}
 	}
+
+	return 0;
 }
 
 /*

Reply via email to