From nobody Wed Feb 5 09:34:41 2025 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 4Ynw75637Lz5mT8t; Wed, 05 Feb 2025 09:34:41 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Ynw753WQKz3Vt2; Wed, 05 Feb 2025 09:34:41 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738748081; 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=V6aZDT3ZNgpMeEFh5pIKhiCy85/j0mlREFpgiDNSQ8M=; b=wTm4QeAyyJy/7APVZhlqPB3jL/XOjEPfATIZBtQ+K6M7nig8N2Hucun4Guqc6q0necHdHv K0zyllBvwmVRsBprfTsGd7dFUcTS7XRBn3h7S6tdkVt/jSZhPAX/JKYOhiaPzndaH8n/ZN Kg7b4gKQedOJH8wYzT7OOy6Bs2o7a09nLzv4bbPN+ka9uMWCmWOHzmjEpeykx/KaPPmse4 wdevWoCS+v+LmznahbD4QwGMJ/z4zNr2RLqPVkNUdLSNfNjyrmRbNhulkVSO69Y+7fIVIa noPRJlyKAXbemJeK97vTluypxMBYMyJ5nBgNIvxD/1b9KRYp1gRpPR1FNkJ5NQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738748081; 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=V6aZDT3ZNgpMeEFh5pIKhiCy85/j0mlREFpgiDNSQ8M=; b=Qhnnv4Pe1N/Q4s/UzYhGexinHCjAiUonDnG0HV7/gbuDfFLdvdfdVuGz8h7PU78+axpXEy gMV30rW/3G1Qyf+iiP+nXfxvwKKKMhnbPhZLKJP+382jL70axtp5BGA2SWqz8nPcjwaM8V CMqu55vCBfXn8hR1U/w0EMD6XHatHMb3Ufwmzlx68dtzvOGt4w2jn7xIukyBHfWqJXd7Bg QlqDWaTMJ5PJ/2l+NBCP4lPstjHWIZckt+Dgb639tPdi/RPc2u1hNbbeNwOGt/hOaDqrut yraQGRAr3I/NGoFz2t64DgdXqUjLprek4+jcSW7juN555/bvEnadg1EzS6XwaQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1738748081; a=rsa-sha256; cv=none; b=tEfwpv5AUvD5FRG6Tom3qeS7MFogVvCAGMw9byTyX/gdDUXSAniE4vqbOqA0GSit/jTGyh u+mO9JXE/vFTfZBfOx5nPcpCNtmp/T/tYm96EGttHPCuZsQuDW1I+Mezgl2GTp2udXycaH OddMIf6SnjniNViOFbU4qhBiEKfzAUNogqA9mqdknISclJCR7+3gDc4XJqkoXY1D4vLg/E qbDlXugJgUwEsatRcbXSLbiCGWXLlWdShS/bso8O3RHkniyNSc2HNXNxmT5Az6EIsypaLS I4v5Bq5bOnYErdMhSkDj9qOCpFvsJqTErRKCK872qEDUxkT85Kam+4HguI36zQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none 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 4Ynw752nc8zmtY; Wed, 05 Feb 2025 09:34:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 5159Yfek025612; Wed, 5 Feb 2025 09:34:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5159YfUu025609; Wed, 5 Feb 2025 09:34:41 GMT (envelope-from git) Date: Wed, 5 Feb 2025 09:34:41 GMT Message-Id: <202502050934.5159YfUu025609@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Ruslan Bukin Subject: git: ae65d59d4b8c - main - riscv vmm: various fixes in APLIC. 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: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org 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: ae65d59d4b8c227ac27b58497b9295e09fa9a179 Auto-Submitted: auto-generated The branch main has been updated by br: URL: https://cgit.FreeBSD.org/src/commit/?id=ae65d59d4b8c227ac27b58497b9295e09fa9a179 commit ae65d59d4b8c227ac27b58497b9295e09fa9a179 Author: Ruslan Bukin AuthorDate: 2025-02-05 09:25:37 +0000 Commit: Ruslan Bukin CommitDate: 2025-02-05 09:30:11 +0000 riscv vmm: various fixes in APLIC. - Implement Level-sensitive interrupts - Disable up to 32 interrupts by a single query (CLRIE register handling) - Implement reading from DOMAINCFG All of this needed for Linux guest. Differential Revision: https://reviews.freebsd.org/D48808 --- sys/riscv/vmm/vmm_aplic.c | 85 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 12 deletions(-) diff --git a/sys/riscv/vmm/vmm_aplic.c b/sys/riscv/vmm/vmm_aplic.c index 60da6b4a27fb..4df41f2de1a5 100644 --- a/sys/riscv/vmm/vmm_aplic.c +++ b/sys/riscv/vmm/vmm_aplic.c @@ -70,9 +70,13 @@ MALLOC_DEFINE(M_APLIC, "RISC-V VMM APLIC", "RISC-V AIA APLIC"); /* If D == 1. */ #define SOURCECFG_CHILD_INDEX_S (0) #define SOURCECFG_CHILD_INDEX_M (0x3ff << SOURCECFG_CHILD_INDEX_S) +#define APLIC_SETIP 0x1c00 #define APLIC_SETIPNUM 0x1cdc +#define APLIC_CLRIP 0x1d00 #define APLIC_CLRIPNUM 0x1ddc +#define APLIC_SETIE 0x1e00 #define APLIC_SETIENUM 0x1edc +#define APLIC_CLRIE 0x1f00 #define APLIC_CLRIENUM 0x1fdc #define APLIC_GENMSI 0x3000 #define APLIC_TARGET(x) (0x3004 + ((x) - 1) * 4) @@ -96,6 +100,7 @@ struct aplic_irq { uint32_t state; #define APLIC_IRQ_STATE_PENDING (1 << 0) #define APLIC_IRQ_STATE_ENABLED (1 << 1) +#define APLIC_IRQ_STATE_INPUT (1 << 2) uint32_t target; uint32_t target_hart; }; @@ -146,15 +151,40 @@ aplic_set_enabled(struct aplic *aplic, bool write, uint64_t *val, bool enabled) irq = &aplic->irqs[i]; mtx_lock_spin(&aplic->mtx); - if (enabled) - irq->state |= APLIC_IRQ_STATE_ENABLED; - else - irq->state &= ~APLIC_IRQ_STATE_ENABLED; + if ((irq->sourcecfg & SOURCECFG_SM_M) != SOURCECFG_SM_INACTIVE) { + if (enabled) + irq->state |= APLIC_IRQ_STATE_ENABLED; + else + irq->state &= ~APLIC_IRQ_STATE_ENABLED; + } mtx_unlock_spin(&aplic->mtx); return (0); } +static void +aplic_set_enabled_word(struct aplic *aplic, bool write, uint32_t word, + uint64_t *val, bool enabled) +{ + uint64_t v; + int i; + + if (!write) { + *val = 0; + return; + } + + /* + * The write is ignored if value written is not an active interrupt + * source number in the domain. + */ + for (i = 0; i < 32; i++) + if (*val & (1u << i)) { + v = word * 32 + i; + (void)aplic_set_enabled(aplic, write, &v, enabled); + } +} + static int aplic_handle_target(struct aplic *aplic, int i, bool write, uint64_t *val) { @@ -238,6 +268,8 @@ aplic_mmio_access(struct hyp *hyp, struct aplic *aplic, uint64_t reg, int r; int i; + dprintf("%s: reg %lx\n", __func__, reg); + if ((reg >= APLIC_SOURCECFG(1)) && (reg <= APLIC_SOURCECFG(aplic->nirqs))) { i = ((reg - APLIC_SOURCECFG(1)) >> 2) + 1; @@ -258,9 +290,20 @@ aplic_mmio_access(struct hyp *hyp, struct aplic *aplic, uint64_t reg, return (error); } + if ((reg >= APLIC_CLRIE) && (reg < (APLIC_CLRIE + aplic->nirqs * 4))) { + i = (reg - APLIC_CLRIE) >> 2; + aplic_set_enabled_word(aplic, write, i, val, false); + return (0); + } + switch (reg) { case APLIC_DOMAINCFG: - aplic->domaincfg = *val & DOMAINCFG_IE; + mtx_lock_spin(&aplic->mtx); + if (write) + aplic->domaincfg = *val & DOMAINCFG_IE; + else + *val = aplic->domaincfg; + mtx_unlock_spin(&aplic->mtx); error = 0; break; case APLIC_SETIENUM: @@ -441,6 +484,7 @@ aplic_inject_irq(struct hyp *hyp, int vcpuid, uint32_t irqid, bool level) struct aplic *aplic; bool notify; int error; + int mask; aplic = hyp->aplic; @@ -460,22 +504,39 @@ aplic_inject_irq(struct hyp *hyp, int vcpuid, uint32_t irqid, bool level) notify = false; switch (irq->sourcecfg & SOURCECFG_SM_M) { + case SOURCECFG_SM_LEVEL0: + if (!level) + irq->state |= APLIC_IRQ_STATE_PENDING; + break; + case SOURCECFG_SM_LEVEL1: + if (level) + irq->state |= APLIC_IRQ_STATE_PENDING; + break; + case SOURCECFG_SM_EDGE0: + if (!level && (irq->state & APLIC_IRQ_STATE_INPUT)) + irq->state |= APLIC_IRQ_STATE_PENDING; + break; case SOURCECFG_SM_EDGE1: - if (level) { + if (level && !(irq->state & APLIC_IRQ_STATE_INPUT)) irq->state |= APLIC_IRQ_STATE_PENDING; - if (irq->state & APLIC_IRQ_STATE_ENABLED) - notify = true; - } else - irq->state &= ~APLIC_IRQ_STATE_PENDING; break; case SOURCECFG_SM_DETACHED: + case SOURCECFG_SM_INACTIVE: break; default: - /* TODO. */ - dprintf("sourcecfg %d\n", irq->sourcecfg & SOURCECFG_SM_M); error = ENXIO; break; } + + if (level) + irq->state |= APLIC_IRQ_STATE_INPUT; + else + irq->state &= ~APLIC_IRQ_STATE_INPUT; + + mask = APLIC_IRQ_STATE_ENABLED | APLIC_IRQ_STATE_PENDING; + if ((irq->state & mask) == mask) + notify = true; + mtx_unlock_spin(&aplic->mtx); if (notify)