Module Name:    src
Committed By:   jmcneill
Date:           Wed Jun 12 21:02:07 UTC 2019

Modified Files:
        src/sys/arch/arm/cortex: gicv3_its.c gicv3_its.h

Log Message:
Allow set_affinity calls before PEs are brought online. We store the
desired target PE if set_affinity is called early and restore the routes
when the PE comes alive.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/cortex/gicv3_its.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/cortex/gicv3_its.h

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/cortex/gicv3_its.c
diff -u src/sys/arch/arm/cortex/gicv3_its.c:1.11 src/sys/arch/arm/cortex/gicv3_its.c:1.12
--- src/sys/arch/arm/cortex/gicv3_its.c:1.11	Wed Jun 12 10:00:09 2019
+++ src/sys/arch/arm/cortex/gicv3_its.c	Wed Jun 12 21:02:07 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: gicv3_its.c,v 1.11 2019/06/12 10:00:09 jmcneill Exp $ */
+/* $NetBSD: gicv3_its.c,v 1.12 2019/06/12 21:02:07 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 #define _INTR_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gicv3_its.c,v 1.11 2019/06/12 10:00:09 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gicv3_its.c,v 1.12 2019/06/12 21:02:07 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -260,11 +260,14 @@ static int
 gicv3_its_msi_alloc_lpi(struct gicv3_its *its,
     const struct pci_attach_args *pa)
 {
+	struct pci_attach_args *new_pa;
 	int n;
 
 	for (n = 0; n < its->its_pic->pic_maxsources; n++) {
 		if (its->its_pa[n] == NULL) {
-			its->its_pa[n] = pa;
+			new_pa = kmem_alloc(sizeof(*new_pa), KM_SLEEP);
+			memcpy(new_pa, pa, sizeof(*new_pa));
+			its->its_pa[n] = new_pa;
 			return n + its->its_pic->pic_irqbase;
 		}
 	}
@@ -275,8 +278,13 @@ gicv3_its_msi_alloc_lpi(struct gicv3_its
 static void
 gicv3_its_msi_free_lpi(struct gicv3_its *its, int lpi)
 {
+	struct pci_attach_args *pa;
+
 	KASSERT(lpi >= its->its_pic->pic_irqbase);
+
+	pa = its->its_pa[lpi - its->its_pic->pic_irqbase];
 	its->its_pa[lpi - its->its_pic->pic_irqbase] = NULL;
+	kmem_free(pa, sizeof(*pa));
 }
 
 static uint32_t
@@ -702,7 +710,9 @@ gicv3_its_cpu_init(void *priv, struct cp
 {
 	struct gicv3_its * const its = priv;
 	struct gicv3_softc * const sc = its->its_gic;
+	const struct pci_attach_args *pa;
 	uint64_t rdbase;
+	size_t irq;
 
 	const uint64_t typer = bus_space_read_8(sc->sc_bst, its->its_bsh, GITS_TYPER);
 	if (typer & GITS_TYPER_PTA) {
@@ -720,6 +730,20 @@ gicv3_its_cpu_init(void *priv, struct cp
 	gits_command_invall(its, cpu_index(ci));
 	gits_wait(its);
 
+	/*
+	 * Update routing for LPIs targetting this CPU
+	 */
+	for (irq = 0; irq < its->its_pic->pic_maxsources; irq++) {
+		if (its->its_targets[irq] != ci)
+			continue;
+		pa = its->its_pa[irq];
+		KASSERT(pa != NULL);
+
+		const uint32_t devid = gicv3_its_devid(pa->pa_pc, pa->pa_tag);
+		gits_command_movi(its, devid, devid, cpu_index(ci));
+		gits_command_sync(its, its->its_rdbase[cpu_index(ci)]);
+	}
+
 	its->its_cpuonline[cpu_index(ci)] = true;
 }
 
@@ -751,15 +775,14 @@ gicv3_its_set_affinity(void *priv, size_
 		return EINVAL;
 
 	ci = cpu_lookup(kcpuset_ffs(affinity) - 1);
-	if (its->its_cpuonline[cpu_index(ci)] == false)
-		return ENXIO;
-
-	const uint32_t devid = gicv3_its_devid(pa->pa_pc, pa->pa_tag);
-	gits_command_movi(its, devid, devid, cpu_index(ci));
-	gits_command_sync(its, its->its_rdbase[cpu_index(ci)]);
-
 	its->its_targets[irq] = ci;
 
+	if (its->its_cpuonline[cpu_index(ci)] == true) {
+		const uint32_t devid = gicv3_its_devid(pa->pa_pc, pa->pa_tag);
+		gits_command_movi(its, devid, devid, cpu_index(ci));
+		gits_command_sync(its, its->its_rdbase[cpu_index(ci)]);
+	}
+
 	return 0;
 }
 

Index: src/sys/arch/arm/cortex/gicv3_its.h
diff -u src/sys/arch/arm/cortex/gicv3_its.h:1.5 src/sys/arch/arm/cortex/gicv3_its.h:1.6
--- src/sys/arch/arm/cortex/gicv3_its.h:1.5	Wed Jun 12 10:00:09 2019
+++ src/sys/arch/arm/cortex/gicv3_its.h	Wed Jun 12 21:02:07 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: gicv3_its.h,v 1.5 2019/06/12 10:00:09 jmcneill Exp $ */
+/* $NetBSD: gicv3_its.h,v 1.6 2019/06/12 21:02:07 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@ struct gicv3_its {
 	struct gicv3_lpi_callback its_cb;
 
 	struct pic_softc	*its_pic;
-	const struct pci_attach_args **its_pa;
+	struct pci_attach_args	**its_pa;
 	struct cpu_info		**its_targets;
 
 	LIST_HEAD(, gicv3_its_device) its_devices;

Reply via email to