Module Name:    src
Committed By:   jmcneill
Date:           Fri Oct 19 11:40:27 UTC 2018

Modified Files:
        src/sys/arch/arm/acpi: acpi_pci_machdep.c acpi_pci_machdep.h acpipchb.c

Log Message:
Add support for PCI Segment Groups.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/acpi/acpi_pci_machdep.c \
    src/sys/arch/arm/acpi/acpi_pci_machdep.h 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/acpi_pci_machdep.c
diff -u src/sys/arch/arm/acpi/acpi_pci_machdep.c:1.1 src/sys/arch/arm/acpi/acpi_pci_machdep.c:1.2
--- src/sys/arch/arm/acpi/acpi_pci_machdep.c:1.1	Mon Oct 15 11:35:03 2018
+++ src/sys/arch/arm/acpi/acpi_pci_machdep.c	Fri Oct 19 11:40:27 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_pci_machdep.c,v 1.1 2018/10/15 11:35:03 jmcneill Exp $ */
+/* $NetBSD: acpi_pci_machdep.c,v 1.2 2018/10/19 11:40:27 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_pci_machdep.c,v 1.1 2018/10/15 11:35:03 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_pci_machdep.c,v 1.2 2018/10/19 11:40:27 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -55,6 +55,8 @@ __KERNEL_RCSID(0, "$NetBSD: acpi_pci_mac
 #include <dev/acpi/acpi_mcfg.h>
 #include <dev/acpi/acpi_pci.h>
 
+#include <arm/acpi/acpi_pci_machdep.h>
+
 #define	IH_INDEX_MASK			0x0000ffff
 #define	IH_MPSAFE			0x80000000
 
@@ -150,12 +152,13 @@ static void
 acpi_pci_md_attach_hook(device_t parent, device_t self,
     struct pcibus_attach_args *pba)
 {
+	struct acpi_pci_context *ap = pba->pba_pc->pc_conf_v;
 	struct acpi_pci_prt *prt, *prtp;
 	struct acpi_devnode *ad;
 	ACPI_HANDLE handle;
 	int seg, bus, dev, func;
 
-	seg = 0;	/* XXX segment */
+	seg = ap->ap_seg;
 	handle = NULL;
 
 	if (pba->pba_bridgetag) {
@@ -228,12 +231,13 @@ acpi_pci_md_decompose_tag(void *v, pcita
 static pcireg_t
 acpi_pci_md_conf_read(void *v, pcitag_t tag, int offset)
 {
+	struct acpi_pci_context * const ap = v;
 	pcireg_t val;
 
 	if (offset < 0 || offset >= PCI_EXTCONF_SIZE)
 		return (pcireg_t) -1;
 
-	acpimcfg_conf_read(&arm_acpi_pci_chipset, tag, offset, &val);
+	acpimcfg_conf_read(&ap->ap_pc, tag, offset, &val);
 
 	return val;
 }
@@ -241,10 +245,12 @@ acpi_pci_md_conf_read(void *v, pcitag_t 
 static void
 acpi_pci_md_conf_write(void *v, pcitag_t tag, int offset, pcireg_t val)
 {
+	struct acpi_pci_context * const ap = v;
+
 	if (offset < 0 || offset >= PCI_EXTCONF_SIZE)
 		return;
 
-	acpimcfg_conf_write(&arm_acpi_pci_chipset, tag, offset, val);
+	acpimcfg_conf_write(&ap->ap_pc, tag, offset, val);
 }
 
 static int
Index: src/sys/arch/arm/acpi/acpi_pci_machdep.h
diff -u src/sys/arch/arm/acpi/acpi_pci_machdep.h:1.1 src/sys/arch/arm/acpi/acpi_pci_machdep.h:1.2
--- src/sys/arch/arm/acpi/acpi_pci_machdep.h:1.1	Mon Oct 15 11:35:03 2018
+++ src/sys/arch/arm/acpi/acpi_pci_machdep.h	Fri Oct 19 11:40:27 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_pci_machdep.h,v 1.1 2018/10/15 11:35:03 jmcneill Exp $ */
+/* $NetBSD: acpi_pci_machdep.h,v 1.2 2018/10/19 11:40:27 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -34,4 +34,9 @@
 
 extern struct arm32_pci_chipset arm_acpi_pci_chipset;
 
+struct acpi_pci_context {
+	struct arm32_pci_chipset ap_pc;
+	u_int ap_seg;
+};
+
 #endif /* !_ARM_ACPI_PCI_MACHDEP_H */
Index: src/sys/arch/arm/acpi/acpipchb.c
diff -u src/sys/arch/arm/acpi/acpipchb.c:1.1 src/sys/arch/arm/acpi/acpipchb.c:1.2
--- src/sys/arch/arm/acpi/acpipchb.c:1.1	Mon Oct 15 11:35:03 2018
+++ src/sys/arch/arm/acpi/acpipchb.c	Fri Oct 19 11:40:27 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: acpipchb.c,v 1.1 2018/10/15 11:35:03 jmcneill Exp $ */
+/* $NetBSD: acpipchb.c,v 1.2 2018/10/19 11:40:27 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.1 2018/10/15 11:35:03 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpipchb.c,v 1.2 2018/10/19 11:40:27 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -54,12 +54,15 @@ __KERNEL_RCSID(0, "$NetBSD: acpipchb.c,v
 #include <dev/acpi/acpivar.h>
 #include <dev/acpi/acpi_mcfg.h>
 
+#include <arm/acpi/acpi_pci_machdep.h>
+
 #define	PCIHOST_CACHELINE_SIZE		arm_dcache_align
 
 struct acpipchb_softc {
 	device_t		sc_dev;
 
 	struct arm32_bus_dma_tag sc_dmat;
+	struct acpi_pci_context sc_ap;
 
 	ACPI_HANDLE		sc_handle;
 	ACPI_INTEGER		sc_bus;
@@ -102,7 +105,7 @@ acpipchb_attach(device_t parent, device_
 	struct acpipchb_softc * const sc = device_private(self);
 	struct acpi_attach_args *aa = aux;
 	struct pcibus_attach_args pba;
-	ACPI_INTEGER cca;
+	ACPI_INTEGER cca, seg;
 
 	sc->sc_dev = self;
 	sc->sc_handle = aa->aa_node->ad_handle;
@@ -110,23 +113,30 @@ acpipchb_attach(device_t parent, device_
 	if (ACPI_FAILURE(acpi_eval_integer(sc->sc_handle, "_BBN", &sc->sc_bus)))
 		sc->sc_bus = 0;
 
+	if (ACPI_FAILURE(acpi_eval_integer(sc->sc_handle, "_SEG", &seg)))
+		seg = 0;
+
 	if (ACPI_FAILURE(acpi_eval_integer(sc->sc_handle, "_CCA", &cca)))
 		cca = 0;
 
 	aprint_naive("\n");
 	aprint_normal(": PCI Express Host Bridge\n");
 
-	if (acpimcfg_configure_bus(self, aa->aa_pc, sc->sc_handle, sc->sc_bus, PCIHOST_CACHELINE_SIZE) != 0) {
-		aprint_error_dev(self, "failed to configure PCI bus\n");
-		return;
-	}
-
 	sc->sc_dmat = *aa->aa_dmat;
 	if (cca) {
 		sc->sc_dmat._ranges = ahcipchb_coherent_ranges;
 		sc->sc_dmat._nranges = __arraycount(ahcipchb_coherent_ranges);
 	}
 
+	sc->sc_ap.ap_pc = *aa->aa_pc;
+	sc->sc_ap.ap_pc.pc_conf_v = &sc->sc_ap;
+	sc->sc_ap.ap_seg = seg;
+
+	if (acpimcfg_configure_bus(self, &sc->sc_ap.ap_pc, sc->sc_handle, sc->sc_bus, PCIHOST_CACHELINE_SIZE) != 0) {
+		aprint_error_dev(self, "failed to configure PCI bus\n");
+		return;
+	}
+
 	memset(&pba, 0, sizeof(pba));
 	pba.pba_flags = aa->aa_pciflags;
 	pba.pba_iot = aa->aa_iot;
@@ -135,7 +145,7 @@ acpipchb_attach(device_t parent, device_
 #ifdef _PCI_HAVE_DMA64
 	pba.pba_dmat64 = &sc->sc_dmat;
 #endif
-	pba.pba_pc = aa->aa_pc;
+	pba.pba_pc = &sc->sc_ap.ap_pc;
 	pba.pba_bus = sc->sc_bus;
 
 	config_found_ia(self, "pcibus", &pba, pcibusprint);

Reply via email to