From nobody Mon Nov 02 12:21:26 2026 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 4jJ9mR0qf5z6yFPs for ; Mon, 02 Nov 2026 12:21:27 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jJ9mR0DqRz4tK6 for ; Mon, 02 Nov 2026 12:21:27 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793622087; 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=etWwpIh2ftLIjKCe7K6yf5z4zm5ebSg0y+Lw4ItA+Z4=; b=jbSGTv1emkQbE7A9pEvZM0rP6rV8WTz4iWzjQwhU+9to91hQy5/hLARwvEUZ54suhVBcuW 5atUZIolFyXRr9ZLeXOsoZ5hFRGJC2CZ5Lh3lHfpDxoj/suvWfjDMp8389xUaxblN12gk3 K4qKQ9H17GNhpNDjJYyHsnr+xfdaDzX856fBlIRPUaCusIxQfb9rpujew7mHTfnPACkh/r R3jIvK9jhcgMmwCjWs03qXMHU333lfC+dcwizAp5qGKI138FPDWD1ogN8Vks/fiV3h1SY5 +hX5htWEUvCqJ2VUXsq9t6cHuH4EutV/bQfjqZLXuzsXfGAQDgX9FKKjR3K39w== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793622087; b=LYIAAiaByqzIf7+O091Jukxrj9Lggs4F4FOJ2cix7ygrOWDAlypg3iPKqCfpdG7B+Sql5+ l1r09pOd85Wu1wjf3Ti0KC4fapNs9uLLZRJN5T9otLWTby5A3vDU2lcsr7Yagajr19levX vVwXrkHyzPrUFd1MiVHudC8GNI4YHwIgBiAmWSqYfMjE29e6ONit6lCVLu+6hgVQTKLhR3 fyFVFMASbFG3Gby1roydsc48ji0bclF/zfkCo/59qGmvaIb8ECyHderpe41H9ZkVJOhGfG aEk6fH+8tzytb9yPzoLZugrLNaONGq8Qz1r/Ob6yqr33CorPWqDQygdSYBZCew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793622087; 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=etWwpIh2ftLIjKCe7K6yf5z4zm5ebSg0y+Lw4ItA+Z4=; b=PAv0m2fhgoewV8PmhBwhUZblr2StydE28kKtC5KYJQGhf4LcN3yhwX815QFsB0SQ/jiljW /+VulCgmJNY8UF96QHwce6IzNYg+BLJsQQRt2c1KP6eMY8sfB/FgDyQvirsSlhj3Q/ylHX N3aXzzzGeFABQftLp7PxqnD3reGmxE1tzMlPFugGcbQ+DHhuB4GvD7tykduE5R+UnFVU8U DouXbOJCelRkauTZgfuLw2dvA7QyJPdUBZ7AHaexsduNjoXTYeQ80MxKbEbGqFnkfER+wo B72bbNXFy/wmEegLfFtZkx5EIue1EhtZFgG0eCs+6NT2UDXG7NhYYjo1LYh8uw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4jJ9mQ6kBqzmBL for ; Mon, 02 Nov 2026 12:21:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 27c62 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 02 Nov 2026 12:21:26 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Ruslan Bukin Subject: git: 24558f289dd3 - main - riscv intc: convert to a bus. List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: br X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 24558f289dd3b0a2a2372123186455e449d60abf Auto-Submitted: auto-generated Date: Mon, 02 Nov 2026 12:21:26 +0000 Message-Id: <6ae88046.27c62.565692f5@gitrepo.freebsd.org> The branch main has been updated by br: URL: https://cgit.FreeBSD.org/src/commit/?id=24558f289dd3b0a2a2372123186455e449d60abf commit 24558f289dd3b0a2a2372123186455e449d60abf Author: Ruslan Bukin AuthorDate: 2026-11-02 11:31:38 +0000 Commit: Ruslan Bukin CommitDate: 2026-11-02 12:18:44 +0000 riscv intc: convert to a bus. Convert the RISC-V Interrupt Controller (INTC) device to a bus; try to find and attach Incoming Message Signalling Interrupt Controller (IMSIC) device. This allows to establish parent-child relationships between two and to propagate PIC_INIT_SECONDARY call from the INTC (parent) to the IMSIC (child). Reviewed by: mhorne, mmel Sponsored by: EPSRC ("UKRI3001: CHERI Research Centre") Differential Revision: https://reviews.freebsd.org/D59813 --- sys/riscv/riscv/intc.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 2 deletions(-) diff --git a/sys/riscv/riscv/intc.c b/sys/riscv/riscv/intc.c index b700b9c97793..70836adf7c2e 100644 --- a/sys/riscv/riscv/intc.c +++ b/sys/riscv/riscv/intc.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2015-2017 Ruslan Bukin + * Copyright (c) 2015-2017,2026 Ruslan Bukin * All rights reserved. * Copyright (c) 2021 Jessica Clarke * @@ -58,6 +58,7 @@ #include #include "pic_if.h" +#include "ofw_bus_if.h" #define INTC_NIRQS 16 @@ -69,6 +70,12 @@ struct intc_irqsrc { struct intc_softc { device_t dev; struct intc_irqsrc isrcs[INTC_NIRQS]; + device_t imsic; +}; + +struct intc_devinfo { + struct resource_list di_rl; + struct ofw_bus_devinfo di_dinfo; }; static int intc_intr(void *arg); @@ -139,6 +146,61 @@ intc_identify(driver_t *driver, device_t parent) device_printf(parent, "Can't add intc child\n"); } +static int +intc_add_imsic(device_t dev) +{ + struct intc_softc *sc; + struct intc_devinfo *di; + pcell_t addr_cells, size_cells; + phandle_t parent; + phandle_t child; + + sc = device_get_softc(dev); + + child = ofw_bus_find_compatible(OF_finddevice("/"), "riscv,imsics"); + if (child == 0) + return (0); + + parent = OF_parent(child); + + if (OF_getencprop(parent, "#address-cells", &addr_cells, + sizeof(addr_cells)) == -1) { + device_printf(dev, "Unable to read #address-cells\n"); + return (ENXIO); + } + + if (OF_getencprop(parent, "#size-cells", &size_cells, + sizeof(size_cells)) == -1) { + device_printf(dev, "Unable to read #size-cells\n"); + return (ENXIO); + } + + di = malloc(sizeof(*di), M_DEVBUF, M_WAITOK | M_ZERO); + if (di == NULL) + return (ENOMEM); + + if (ofw_bus_gen_setup_devinfo(&di->di_dinfo, child)) { + if (bootverbose) + device_printf(dev, "Could not set up devinfo\n"); + free(di, M_DEVBUF); + return (ENXIO); + } + + sc->imsic = device_add_child(dev, "imsic", DEVICE_UNIT_ANY); + if (sc->imsic == NULL) { + free(di, M_DEVBUF); + return (ENXIO); + } + + /* Initialize and populate resource list. */ + resource_list_init(&di->di_rl); + ofw_bus_reg_to_rl(dev, child, addr_cells, size_cells, &di->di_rl); + ofw_bus_intr_to_rl(dev, child, &di->di_rl, NULL); + device_set_ivars(sc->imsic, di); + + return (0); +} + static int intc_probe(device_t dev) { @@ -181,6 +243,8 @@ intc_attach(device_t dev) if (pic == NULL) return (ENXIO); + intc_add_imsic(dev); + return (intr_pic_claim_root(sc->dev, xref, intc_intr, sc, INTR_ROOT_IRQ)); } @@ -250,7 +314,18 @@ intc_init_secondary(device_t dev, uint32_t rootnum) sc = device_get_softc(dev); cpu = PCPU_GET(cpuid); - /* Unmask attached interrupts */ + /* Mask attached interrupts. */ + for (irq = 0; irq < INTC_NIRQS; irq++) { + isrc = &sc->isrcs[irq].isrc; + if (intr_isrc_init_on_cpu(isrc, cpu)) + intc_disable_intr(dev, isrc); + } + + /* Initialize the child PIC. */ + if (sc->imsic != NULL) + PIC_INIT_SECONDARY(sc->imsic, rootnum); + + /* Unmask attached interrupts. */ for (irq = 0; irq < INTC_NIRQS; irq++) { isrc = &sc->isrcs[irq].isrc; if (intr_isrc_init_on_cpu(isrc, cpu)) @@ -288,12 +363,44 @@ intc_intr(void *arg) return (FILTER_HANDLED); } +static const struct ofw_bus_devinfo * +intc_get_devinfo(device_t bus __unused, device_t child) +{ + struct intc_devinfo *di; + + di = device_get_ivars(child); + if (di == NULL) + return (NULL); + return (&di->di_dinfo); +} + +static struct resource_list * +intc_get_resource_list(device_t bus, device_t child) +{ + struct intc_devinfo *di; + + di = device_get_ivars(child); + KASSERT(di != NULL, ("%s: No devinfo", __func__)); + + return (&di->di_rl); +} + static device_method_t intc_methods[] = { /* Device interface */ DEVMETHOD(device_identify, intc_identify), DEVMETHOD(device_probe, intc_probe), DEVMETHOD(device_attach, intc_attach), + DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), + DEVMETHOD(bus_get_resource_list, intc_get_resource_list), + DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), + DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), + DEVMETHOD(bus_alloc_resource, bus_generic_rl_alloc_resource), + DEVMETHOD(bus_release_resource, bus_generic_rl_release_resource), + DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), + DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + /* Interrupt controller interface */ DEVMETHOD(pic_disable_intr, intc_disable_intr), DEVMETHOD(pic_enable_intr, intc_enable_intr), @@ -302,6 +409,12 @@ static device_method_t intc_methods[] = { #ifdef SMP DEVMETHOD(pic_init_secondary, intc_init_secondary), #endif + DEVMETHOD(ofw_bus_get_devinfo, intc_get_devinfo), + DEVMETHOD(ofw_bus_get_compat, ofw_bus_gen_get_compat), + DEVMETHOD(ofw_bus_get_model, ofw_bus_gen_get_model), + DEVMETHOD(ofw_bus_get_name, ofw_bus_gen_get_name), + DEVMETHOD(ofw_bus_get_node, ofw_bus_gen_get_node), + DEVMETHOD(ofw_bus_get_type, ofw_bus_gen_get_type), DEVMETHOD_END };