git: 15c8a610a80d - main - gicv3: Change how we initialize its children.

From: Warner Losh <imp_at_FreeBSD.org>
Date: Wed, 28 Feb 2024 14:10:40 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=15c8a610a80dfe1980e043174d0fcc8034868676

commit 15c8a610a80dfe1980e043174d0fcc8034868676
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2024-02-28 14:08:15 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2024-02-28 14:09:42 +0000

    gicv3: Change how we initialize its children.
    
    The current code is written such that all the attach routines can do so
    in parallel. However, newbus serializes children today, and is likely to
    do so in the future. Only allocate memory for the first time. Add an
    assertion that this memory is allocated for larger units.
    
    Sponsored by:           Netflix
    Reviewed by:            andrew
    Differential Revision:  https://reviews.freebsd.org/D44032
---
 sys/arm64/arm64/gicv3_its.c | 32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/sys/arm64/arm64/gicv3_its.c b/sys/arm64/arm64/gicv3_its.c
index 42a8fb8a9c26..195e07af3288 100644
--- a/sys/arm64/arm64/gicv3_its.c
+++ b/sys/arm64/arm64/gicv3_its.c
@@ -291,8 +291,6 @@ struct gicv3_its_softc {
 	vm_page_t ma; /* fake msi page */
 };
 
-static void *conf_base;
-
 typedef void (its_quirk_func_t)(device_t);
 static its_quirk_func_t its_quirk_cavium_22375;
 
@@ -680,20 +678,26 @@ gicv3_its_table_init(device_t dev, struct gicv3_its_softc *sc)
 static void
 gicv3_its_conftable_init(struct gicv3_its_softc *sc)
 {
-	void *conf_table;
-
-	conf_table = atomic_load_ptr(&conf_base);
-	if (conf_table == NULL) {
-		conf_table = contigmalloc(LPI_CONFTAB_SIZE,
-		    M_GICV3_ITS, M_WAITOK, 0, LPI_CONFTAB_MAX_ADDR,
-		    LPI_CONFTAB_ALIGN, 0);
+	/* note: we assume the ITS children are serialized by the parent */
+	static void *conf_table;
 
-		if (atomic_cmpset_ptr((uintptr_t *)&conf_base,
-		    (uintptr_t)NULL, (uintptr_t)conf_table) == 0) {
-			contigfree(conf_table, LPI_CONFTAB_SIZE, M_GICV3_ITS);
-			conf_table = atomic_load_ptr(&conf_base);
-		}
+	/*
+	 * The PROPBASER is a singleton in our parent. We only set it up the
+	 * first time through. conf_table is effectively global to all the units
+	 * and we rely on subr_bus to serialize probe/attach.
+	 */
+	if (conf_table != NULL) {
+		sc->sc_conf_base = conf_table;
+		return;
 	}
+
+        /*
+         * Just allocate contiguous pages. We'll configure the PROPBASER
+         * register later in its_init_cpu_lpi().
+         */
+	conf_table = contigmalloc(LPI_CONFTAB_SIZE,
+	    M_GICV3_ITS, M_WAITOK, 0, LPI_CONFTAB_MAX_ADDR,
+	    LPI_CONFTAB_ALIGN, 0);
 	sc->sc_conf_base = conf_table;
 
 	/* Set the default configuration */