Module Name:    src
Committed By:   jmcneill
Date:           Thu Feb 13 00:02:21 UTC 2020

Modified Files:
        src/sys/arch/arm/acpi: acpi_iort.c acpi_iort.h acpi_pci_machdep.c
            gicv3_acpi.c
        src/sys/arch/arm/include: pci_machdep.h
        src/sys/arch/arm/pci: pci_msi_machdep.c

Log Message:
Add support for multiple GICv3 ITS domains.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/acpi/acpi_iort.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/acpi/acpi_iort.h
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/acpi/acpi_pci_machdep.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/acpi/gicv3_acpi.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/include/pci_machdep.h
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/pci/pci_msi_machdep.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_iort.c
diff -u src/sys/arch/arm/acpi/acpi_iort.c:1.2 src/sys/arch/arm/acpi/acpi_iort.c:1.3
--- src/sys/arch/arm/acpi/acpi_iort.c:1.2	Fri Feb  7 00:35:00 2020
+++ src/sys/arch/arm/acpi/acpi_iort.c	Thu Feb 13 00:02:21 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_iort.c,v 1.2 2020/02/07 00:35:00 jmcneill Exp $ */
+/* $NetBSD: acpi_iort.c,v 1.3 2020/02/13 00:02:21 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_iort.c,v 1.2 2020/02/07 00:35:00 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_iort.c,v 1.3 2020/02/13 00:02:21 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -99,7 +99,7 @@ acpi_iort_pci_root_map(u_int seg, uint32
 				do {
 					node = acpi_iort_find_ref(iort, node, &devid);
 				} while (node != NULL);
-				aprint_debug("ACPI: IORT remapped devid %#x -> %#x\n", odevid, devid);
+				aprint_debug("ACPI: IORT mapped devid %#x -> devid %#x\n", odevid, devid);
 				return devid;
 			}
 		}
@@ -108,3 +108,44 @@ acpi_iort_pci_root_map(u_int seg, uint32
 
 	return devid;
 }
+
+uint32_t
+acpi_iort_its_id_map(u_int seg, uint32_t devid)
+{
+	ACPI_TABLE_IORT *iort;
+	ACPI_IORT_NODE *node;
+	ACPI_IORT_ROOT_COMPLEX *root;
+	ACPI_IORT_ITS_GROUP *its_group;
+	uint32_t offset, n;
+	ACPI_STATUS rv;
+
+	rv = AcpiGetTable(ACPI_SIG_IORT, 0, (ACPI_TABLE_HEADER **)&iort);
+	if (ACPI_FAILURE(rv))
+		return 0;
+
+	offset = iort->NodeOffset;
+	for (n = 0; n < iort->NodeCount; n++) {
+		node = ACPI_ADD_PTR(ACPI_IORT_NODE, iort, offset);
+		if (node->Type == ACPI_IORT_NODE_PCI_ROOT_COMPLEX) {
+			root = (ACPI_IORT_ROOT_COMPLEX *)node->NodeData;
+			if (root->PciSegmentNumber == seg) {
+				const uint32_t odevid = devid;
+				do {
+					node = acpi_iort_find_ref(iort, node, &devid);
+					if (node != NULL && node->Type == ACPI_IORT_NODE_ITS_GROUP) {
+						its_group = (ACPI_IORT_ITS_GROUP *)node->NodeData;
+						if (its_group->ItsCount == 0)
+							return 0;
+						aprint_debug("ACPI: IORT mapped devid %#x -> ITS %#x\n",
+						    odevid, its_group->Identifiers[0]);
+						return its_group->Identifiers[0];
+					}
+				} while (node != NULL);
+				return 0;
+			}
+		}
+		offset += node->Length;
+	}
+
+	return 0;
+}

Index: src/sys/arch/arm/acpi/acpi_iort.h
diff -u src/sys/arch/arm/acpi/acpi_iort.h:1.1 src/sys/arch/arm/acpi/acpi_iort.h:1.2
--- src/sys/arch/arm/acpi/acpi_iort.h:1.1	Sat Dec  8 15:04:40 2018
+++ src/sys/arch/arm/acpi/acpi_iort.h	Thu Feb 13 00:02:21 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_iort.h,v 1.1 2018/12/08 15:04:40 jmcneill Exp $ */
+/* $NetBSD: acpi_iort.h,v 1.2 2020/02/13 00:02:21 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -33,5 +33,6 @@
 #define _ARM_ACPI_ACPI_IORT_H
 
 uint32_t	acpi_iort_pci_root_map(u_int, uint32_t);
+uint32_t	acpi_iort_its_id_map(u_int, uint32_t);
 
 #endif /* !_ARM_ACPI_ACPI_IORT_H */

Index: src/sys/arch/arm/acpi/acpi_pci_machdep.c
diff -u src/sys/arch/arm/acpi/acpi_pci_machdep.c:1.15 src/sys/arch/arm/acpi/acpi_pci_machdep.c:1.16
--- src/sys/arch/arm/acpi/acpi_pci_machdep.c:1.15	Sat Feb  1 13:26:43 2020
+++ src/sys/arch/arm/acpi/acpi_pci_machdep.c	Thu Feb 13 00:02:21 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_pci_machdep.c,v 1.15 2020/02/01 13:26:43 jmcneill Exp $ */
+/* $NetBSD: acpi_pci_machdep.c,v 1.16 2020/02/13 00:02:21 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 #define	_INTR_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_pci_machdep.c,v 1.15 2020/02/01 13:26:43 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_pci_machdep.c,v 1.16 2020/02/13 00:02:21 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -113,6 +113,7 @@ static pcitag_t	acpi_pci_md_make_tag(voi
 static void	acpi_pci_md_decompose_tag(void *, pcitag_t, int *, int *, int *);
 static u_int	acpi_pci_md_get_segment(void *);
 static uint32_t	acpi_pci_md_get_devid(void *, uint32_t);
+static uint32_t	acpi_pci_md_get_frameid(void *, uint32_t);
 static pcireg_t	acpi_pci_md_conf_read(void *, pcitag_t, int);
 static void	acpi_pci_md_conf_write(void *, pcitag_t, int, pcireg_t);
 static int	acpi_pci_md_conf_hook(void *, int, int, int, pcireg_t);
@@ -137,6 +138,7 @@ struct arm32_pci_chipset arm_acpi_pci_ch
 	.pc_decompose_tag = acpi_pci_md_decompose_tag,
 	.pc_get_segment = acpi_pci_md_get_segment,
 	.pc_get_devid = acpi_pci_md_get_devid,
+	.pc_get_frameid = acpi_pci_md_get_frameid,
 	.pc_conf_read = acpi_pci_md_conf_read,
 	.pc_conf_write = acpi_pci_md_conf_write,
 	.pc_conf_hook = acpi_pci_md_conf_hook,
@@ -287,6 +289,14 @@ acpi_pci_md_get_devid(void *v, uint32_t 
 	return acpi_iort_pci_root_map(ap->ap_seg, devid);
 }
 
+static uint32_t
+acpi_pci_md_get_frameid(void *v, uint32_t devid)
+{
+	struct acpi_pci_context * const ap = v;
+
+	return acpi_iort_its_id_map(ap->ap_seg, devid);
+}
+
 static pcireg_t
 acpi_pci_md_conf_read(void *v, pcitag_t tag, int offset)
 {

Index: src/sys/arch/arm/acpi/gicv3_acpi.c
diff -u src/sys/arch/arm/acpi/gicv3_acpi.c:1.6 src/sys/arch/arm/acpi/gicv3_acpi.c:1.7
--- src/sys/arch/arm/acpi/gicv3_acpi.c:1.6	Fri Jan 17 16:58:57 2020
+++ src/sys/arch/arm/acpi/gicv3_acpi.c	Thu Feb 13 00:02:21 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: gicv3_acpi.c,v 1.6 2020/01/17 16:58:57 jmcneill Exp $ */
+/* $NetBSD: gicv3_acpi.c,v 1.7 2020/02/13 00:02:21 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 #define	_INTR_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gicv3_acpi.c,v 1.6 2020/01/17 16:58:57 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gicv3_acpi.c,v 1.7 2020/02/13 00:02:21 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -288,7 +288,6 @@ gicv3_acpi_map_redist(struct gicv3_acpi_
 static ACPI_STATUS
 gicv3_acpi_map_gits(ACPI_SUBTABLE_HEADER *hdrp, void *aux)
 {
-	static bool its_attached;
 	struct gicv3_acpi_softc * const sc = aux;
 	ACPI_MADT_GENERIC_TRANSLATOR *gits;
 	bus_space_handle_t bsh;
@@ -304,13 +303,10 @@ gicv3_acpi_map_gits(ACPI_SUBTABLE_HEADER
 		return AE_OK;
 	}
 
-	aprint_normal_dev(sc->sc_gic.sc_dev, "ITS #%d at 0x%" PRIx64 "%s\n",
-	    gits->TranslationId, gits->BaseAddress, its_attached ? " (disabled)" : "");
+	aprint_normal_dev(sc->sc_gic.sc_dev, "ITS #%d at 0x%" PRIx64 "\n",
+	    gits->TranslationId, gits->BaseAddress);
 
-	if (its_attached == false) {
-		gicv3_its_init(&sc->sc_gic, bsh, gits->BaseAddress, gits->TranslationId);
-		its_attached = true;
-	}
+	gicv3_its_init(&sc->sc_gic, bsh, gits->BaseAddress, gits->TranslationId);
 
 	return AE_OK;
 }

Index: src/sys/arch/arm/include/pci_machdep.h
diff -u src/sys/arch/arm/include/pci_machdep.h:1.17 src/sys/arch/arm/include/pci_machdep.h:1.18
--- src/sys/arch/arm/include/pci_machdep.h:1.17	Sat Dec  8 15:04:40 2018
+++ src/sys/arch/arm/include/pci_machdep.h	Thu Feb 13 00:02:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: pci_machdep.h,v 1.17 2018/12/08 15:04:40 jmcneill Exp $	*/
+/*	$NetBSD: pci_machdep.h,v 1.18 2020/02/13 00:02:21 jmcneill Exp $	*/
 
 /*
  * Modified for arm32 by Mark Brinicombe
@@ -93,6 +93,7 @@ struct arm32_pci_chipset {
 			    int *, int *);
 	u_int		(*pc_get_segment)(void *);
 	uint32_t	(*pc_get_devid)(void *, uint32_t);
+	uint32_t	(*pc_get_frameid)(void *, uint32_t);
 	pcireg_t	(*pc_conf_read)(void *, pcitag_t, int);
 	void		(*pc_conf_write)(void *, pcitag_t, int, pcireg_t);
 
@@ -151,6 +152,8 @@ struct arm32_pci_chipset {
     ((c)->pc_get_segment ? (*(c)->pc_get_segment)((c)->pc_conf_v) : 0)
 #define pci_get_devid(c, d)						\
     ((c)->pc_get_devid ? (*(c)->pc_get_devid)((c)->pc_conf_v, (d)) : (d))
+#define pci_get_frameid(c, d)						\
+    ((c)->pc_get_frameid ? (*(c)->pc_get_frameid)((c)->pc_conf_v, (d)) : 0)
 #define	pci_conf_read(c, t, r)						\
     (*(c)->pc_conf_read)((c)->pc_conf_v, (t), (r))
 #define	pci_conf_write(c, t, r, v)					\

Index: src/sys/arch/arm/pci/pci_msi_machdep.c
diff -u src/sys/arch/arm/pci/pci_msi_machdep.c:1.7 src/sys/arch/arm/pci/pci_msi_machdep.c:1.8
--- src/sys/arch/arm/pci/pci_msi_machdep.c:1.7	Sat Aug  3 12:55:46 2019
+++ src/sys/arch/arm/pci/pci_msi_machdep.c	Thu Feb 13 00:02:21 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_msi_machdep.c,v 1.7 2019/08/03 12:55:46 jmcneill Exp $ */
+/* $NetBSD: pci_msi_machdep.c,v 1.8 2020/02/13 00:02:21 jmcneill 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.7 2019/08/03 12:55:46 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_msi_machdep.c,v 1.8 2020/02/13 00:02:21 jmcneill Exp $");
 
 #include <sys/kernel.h>
 #include <sys/kmem.h>
@@ -59,6 +59,26 @@ arm_pci_msi_find_frame(pci_intr_handle_t
 	return NULL;
 }
 
+static struct arm_pci_msi *
+arm_pci_msi_lookup(const struct pci_attach_args *pa)
+{
+	struct arm_pci_msi *msip;
+	uint32_t devid, 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);
+
+	SIMPLEQ_FOREACH(msip, &arm_pci_msi_list, msi_link)
+		if (frameid == msip->msi_id)
+			return msip;
+
+	return NULL;
+}
+
 static int
 arm_pci_msi_alloc_common(pci_intr_handle_t **ihps, int *count, const struct pci_attach_args *pa, bool exact)
 {
@@ -68,7 +88,7 @@ arm_pci_msi_alloc_common(pci_intr_handle
 	if ((pa->pa_flags & PCI_FLAGS_MSI_OKAY) == 0)
 		return ENODEV;
 
-	msi = SIMPLEQ_FIRST(&arm_pci_msi_list);		/* XXX multiple frame support */
+	msi = arm_pci_msi_lookup(pa);
 	if (msi == NULL || msi->msi_alloc == NULL)
 		return EINVAL;
 
@@ -90,7 +110,7 @@ arm_pci_msix_alloc_common(pci_intr_handl
 	if ((pa->pa_flags & PCI_FLAGS_MSIX_OKAY) == 0)
 		return ENODEV;
 
-	msi = SIMPLEQ_FIRST(&arm_pci_msi_list);		/* XXX multiple frame support */
+	msi = arm_pci_msi_lookup(pa);
 	if (msi == NULL || msi->msix_alloc == NULL)
 		return EINVAL;
 

Reply via email to