From nobody Wed Jan 24 23:50:22 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4TL10t4RjVz58xbm; Wed, 24 Jan 2024 23:50:22 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4TL10t2PFLz4qhg; Wed, 24 Jan 2024 23:50:22 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1706140222; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=hJNJ9fAh3KWF6YkvHKnJfM4idjQlEyc3SJcR2r6ifwc=; b=XbVr0umDnQE7UGgz/tMkw68nO/JF0Uqgt+J5xwpdO+nUoNzQ+LwnlqaLerAxIIXIv7uzIc f3cTc3koLMcffURH8n8APZIBBxMe7M8mJ2Uj41sVo3cOGy1YIgUsnVDyuH83H7OatA5P6Y byUehIAy4TwFcwAZjzLHAldSz5ra13iTUp7TwPbA0TGWAOszCrtlsojavzd7LJ4jvBEf4j PQAYtEWqRNUvjQVdqDYEVqTUfLPPZdaHuMPTDmcAodHC0QyqK9SQhcMGaGNpJoE6qU4lMJ xlCNDgGk4QjILx1DJDNVwC2bnJvMxhpSh/BEwfCeWimpsbdcSNZZnSt6FHP+jg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1706140222; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=hJNJ9fAh3KWF6YkvHKnJfM4idjQlEyc3SJcR2r6ifwc=; b=cW1u6+9qUz1he3hqViP9p8Kkga/AypsSqQh97p5VuRwS6iexg58CvJ4kSgn9VZ9Vlgiuy4 cYqTGsnIEl74b64q0cjwbEC5Al6d1o9WTEuCO2Z7TXy4DXb6YMN4t5wtPRceabcD40PgFz XZ0Nh05GHMwl01xzdSFhUc7iKCCcuGZ/HIwl2olrae5tNDzLuMxDyVKYSfrlHZZPQtdPBR 1V4Fvycw5ePZvcRrErY+bVxpANNYcFPyaFyGv43fpvY1NSvrAXynkCdkQwhkk3fQvANSrM TccdEpIaj3WGftf82r7HhlDHxa6MNlZi5yz0N5Cm/KPP2ZSu8fInvd+Br2OVzQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1706140222; a=rsa-sha256; cv=none; b=doS++zQPHIPXx72KPQCJq2FAJoH0s0Bbc+z6m9dafUKa3bCTWCYd86xT9Ly2JXtdQd6s0h x9vRUfkXNVKsfzGqAI+v8L0GxLmCMOtbhMR0n5HZLvq2s9Imsrh0q7kBIuJmquKjHyB0FV mIq2nJIslwNSCRPWn+OxT5cOASjvRropkftXX3VT1j8uXBC8sqe5VWPLmKcER7ZSShhuQU V2agNxBMEsdRG9rkJnz00O+e/AZvH2EcqazO3EQsbsiv6og6f2FMbFyj420/8k2rK+w7eK M1Rvt3zR05z173O5XzDCF3qdV9qrHmSCvJjlcatGOCyPQQfGys3dm34HfBsvgQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4TL10t1ShwzbJ0; Wed, 24 Jan 2024 23:50:22 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 40ONoM6p018581; Wed, 24 Jan 2024 23:50:22 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 40ONoM8Z018578; Wed, 24 Jan 2024 23:50:22 GMT (envelope-from git) Date: Wed, 24 Jan 2024 23:50:22 GMT Message-Id: <202401242350.40ONoM8Z018578@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Jessica Clarke Subject: git: 103d39efe0c6 - main - intrng: Allow alternative IPI PICs to be registered and used List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jrtc27 X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 103d39efe0c68cb2a808c306b14c3f473a02535d Auto-Submitted: auto-generated The branch main has been updated by jrtc27: URL: https://cgit.FreeBSD.org/src/commit/?id=103d39efe0c68cb2a808c306b14c3f473a02535d commit 103d39efe0c68cb2a808c306b14c3f473a02535d Author: Jessica Clarke AuthorDate: 2024-01-24 23:49:54 +0000 Commit: Jessica Clarke CommitDate: 2024-01-24 23:49:54 +0000 intrng: Allow alternative IPI PICs to be registered and used On RISC-V, the root PIC (whether the PLIC or, as will be the case in future, the local interrupt controller) cannot send IPIs, relying on another means to trigger the necessary software interrupts (firmware calls), but there are upcoming standard devices that will be able to inject them, so we can't just put the firmware calls in the root PIC driver. Thus, split out a new intr_ipi_dev from intr_irq_root_dev to use for sending IPIs. New devices can be registered with a given priority up until the first IPI is set up, when the best device seen so far gets frozen as the IPI device to use. Reviewed by: mhorne MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D35899 --- sys/arm/arm/gic_acpi.c | 8 ++++++++ sys/arm/arm/gic_fdt.c | 7 +++++++ sys/arm/broadcom/bcm2835/bcm2836.c | 12 ++++++++++- sys/arm64/arm64/gic_v3_acpi.c | 8 ++++++++ sys/arm64/arm64/gic_v3_fdt.c | 8 ++++++++ sys/kern/subr_intr.c | 42 +++++++++++++++++++++++++++++++------- sys/sys/intr.h | 1 + 7 files changed, 78 insertions(+), 8 deletions(-) diff --git a/sys/arm/arm/gic_acpi.c b/sys/arm/arm/gic_acpi.c index cdd2fc72a224..8b79558da6e8 100644 --- a/sys/arm/arm/gic_acpi.c +++ b/sys/arm/arm/gic_acpi.c @@ -232,6 +232,14 @@ gic_acpi_attach(device_t dev) intr_pic_deregister(dev, xref); goto cleanup; } + +#ifdef SMP + if (intr_ipi_pic_register(dev, 0) != 0) { + device_printf(dev, "could not register for IPIs\n"); + goto cleanup; + } +#endif + /* If we have children probe and attach them */ if (arm_gic_add_children(dev)) { bus_generic_probe(dev); diff --git a/sys/arm/arm/gic_fdt.c b/sys/arm/arm/gic_fdt.c index c51522b0d58c..a8886abf1c18 100644 --- a/sys/arm/arm/gic_fdt.c +++ b/sys/arm/arm/gic_fdt.c @@ -158,6 +158,13 @@ gic_fdt_attach(device_t dev) intr_pic_deregister(dev, xref); goto cleanup; } + +#ifdef SMP + if (intr_ipi_pic_register(dev, 0) != 0) { + device_printf(dev, "could not register for IPIs\n"); + goto cleanup; + } +#endif } else { if (sc->base.gic_res[2] == NULL) { device_printf(dev, diff --git a/sys/arm/broadcom/bcm2835/bcm2836.c b/sys/arm/broadcom/bcm2835/bcm2836.c index f72bd9075982..8ff824d34521 100644 --- a/sys/arm/broadcom/bcm2835/bcm2836.c +++ b/sys/arm/broadcom/bcm2835/bcm2836.c @@ -646,7 +646,17 @@ bcm_lintc_pic_attach(struct bcm_lintc_softc *sc) if (pic == NULL) return (ENXIO); - return (intr_pic_claim_root(sc->bls_dev, xref, bcm_lintc_intr, sc)); + error = intr_pic_claim_root(sc->bls_dev, xref, bcm_lintc_intr, sc); + if (error != 0) + return (error); + +#ifdef SMP + error = intr_ipi_pic_register(sc->bls_dev, 0); + if (error != 0) + return (error); +#endif + + return (0); } static int diff --git a/sys/arm64/arm64/gic_v3_acpi.c b/sys/arm64/arm64/gic_v3_acpi.c index e55aea86157e..f91a8f6078d9 100644 --- a/sys/arm64/arm64/gic_v3_acpi.c +++ b/sys/arm64/arm64/gic_v3_acpi.c @@ -351,6 +351,14 @@ gic_v3_acpi_attach(device_t dev) goto error; } +#ifdef SMP + err = intr_ipi_pic_register(dev, 0); + if (err != 0) { + device_printf(dev, "could not register for IPIs\n"); + goto error; + } +#endif + /* * Try to register the ITS driver to this GIC. The GIC will act as * a bus in that case. Failure here will not affect the main GIC diff --git a/sys/arm64/arm64/gic_v3_fdt.c b/sys/arm64/arm64/gic_v3_fdt.c index 8adb0497771e..3a3647fc89a5 100644 --- a/sys/arm64/arm64/gic_v3_fdt.c +++ b/sys/arm64/arm64/gic_v3_fdt.c @@ -166,6 +166,14 @@ gic_v3_fdt_attach(device_t dev) goto error; } +#ifdef SMP + err = intr_ipi_pic_register(dev, 0); + if (err != 0) { + device_printf(dev, "could not register for IPIs\n"); + goto error; + } +#endif + /* * Try to register ITS to this GIC. * GIC will act as a bus in that case. diff --git a/sys/kern/subr_intr.c b/sys/kern/subr_intr.c index c89f12a30ec9..a03607c781b2 100644 --- a/sys/kern/subr_intr.c +++ b/sys/kern/subr_intr.c @@ -139,6 +139,10 @@ struct intr_ipi { char ii_name[INTR_IPI_NAMELEN]; u_long *ii_count; }; + +static device_t intr_ipi_dev; +static u_int intr_ipi_dev_priority; +static bool intr_ipi_dev_frozen; #endif static struct mtx pic_list_lock; @@ -380,7 +384,8 @@ intr_isrc_dispatch(struct intr_irqsrc *isrc, struct trapframe *tf) KASSERT(isrc != NULL, ("%s: no source", __func__)); - isrc_increment_count(isrc); + if ((isrc->isrc_flags & INTR_ISRCF_IPI) == 0) + isrc_increment_count(isrc); #ifdef INTR_SOLO if (isrc->isrc_filter != NULL) { @@ -396,7 +401,8 @@ intr_isrc_dispatch(struct intr_irqsrc *isrc, struct trapframe *tf) return (0); } - isrc_increment_straycount(isrc); + if ((isrc->isrc_flags & INTR_ISRCF_IPI) == 0) + isrc_increment_straycount(isrc); return (EINVAL); } @@ -1815,6 +1821,20 @@ intr_ipi_lookup(u_int ipi) return (&ipi_sources[ipi]); } +int +intr_ipi_pic_register(device_t dev, u_int priority) +{ + if (intr_ipi_dev_frozen) { + device_printf(dev, "IPI device already frozen"); + return (EBUSY); + } + + if (intr_ipi_dev == NULL || priority > intr_ipi_dev_priority) + intr_ipi_dev = dev; + + return (0); +} + /* * Setup IPI handler on interrupt controller. * @@ -1828,10 +1848,17 @@ intr_ipi_setup(u_int ipi, const char *name, intr_ipi_handler_t *hand, struct intr_ipi *ii; int error; - KASSERT(intr_irq_root_dev != NULL, ("%s: no root attached", __func__)); + if (!intr_ipi_dev_frozen) { + if (intr_ipi_dev == NULL) + panic("%s: no IPI PIC attached", __func__); + + intr_ipi_dev_frozen = true; + device_printf(intr_ipi_dev, "using for IPIs\n"); + } + KASSERT(hand != NULL, ("%s: ipi %u no handler", __func__, ipi)); - error = PIC_IPI_SETUP(intr_irq_root_dev, ipi, &isrc); + error = PIC_IPI_SETUP(intr_ipi_dev, ipi, &isrc); if (error != 0) return; @@ -1846,7 +1873,7 @@ intr_ipi_setup(u_int ipi, const char *name, intr_ipi_handler_t *hand, strlcpy(ii->ii_name, name, INTR_IPI_NAMELEN); ii->ii_count = intr_ipi_setup_counters(name); - PIC_ENABLE_INTR(intr_irq_root_dev, isrc); + PIC_ENABLE_INTR(intr_ipi_dev, isrc); } void @@ -1854,7 +1881,8 @@ intr_ipi_send(cpuset_t cpus, u_int ipi) { struct intr_ipi *ii; - KASSERT(intr_irq_root_dev != NULL, ("%s: no root attached", __func__)); + KASSERT(intr_ipi_dev_frozen, + ("%s: IPI device not yet frozen", __func__)); ii = intr_ipi_lookup(ipi); if (ii->ii_count == NULL) @@ -1873,7 +1901,7 @@ intr_ipi_send(cpuset_t cpus, u_int ipi) dsb(ishst); #endif - PIC_IPI_SEND(intr_irq_root_dev, ii->ii_isrc, cpus, ipi); + PIC_IPI_SEND(intr_ipi_dev, ii->ii_isrc, cpus, ipi); } /* diff --git a/sys/sys/intr.h b/sys/sys/intr.h index 57b0ca393912..f6957864c639 100644 --- a/sys/sys/intr.h +++ b/sys/sys/intr.h @@ -156,6 +156,7 @@ extern u_int intr_nirq; /* number of IRQs on intrng platforms */ #ifdef SMP typedef void intr_ipi_handler_t(void *); +int intr_ipi_pic_register(device_t dev, u_int priority); void intr_ipi_setup(u_int ipi, const char *name, intr_ipi_handler_t *hand, void *arg); void intr_ipi_send(cpuset_t cpus, u_int ipi);