From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787957877206.49126252731332; Mon, 29 Jun 2026 19:52:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOYA-0004Al-EI; Mon, 29 Jun 2026 22:50:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOY7-00049z-Ic for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:11 -0400 Received: from mail-pj1-x1035.google.com ([2607:f8b0:4864:20::1035]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOY5-0001tE-W1 for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:11 -0400 Received: by mail-pj1-x1035.google.com with SMTP id 98e67ed59e1d1-380544d00b1so142142a91.0 for ; Mon, 29 Jun 2026 19:50:09 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:50:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787808; x=1783392608; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=WsWbPE3Bt2Gd8XbRXKbewV3tBI1M4bc8RRw0T8jY90g=; b=F8G4ljvE5L3fnlAAWKKILznRQwEh4MDmoZpZhgDmSwsOpSLXV+a1SgQsXKMc2HCMAo uvm5qgRCh0jT2fn8lIeVN5VXcxPcpOMr+TdSvK145gcET1X9Zi1+RWepCkMlRJq2ZjMk d71AtuYXZSbT9gvrF23KZOWxTM1HxH5k5KlIu0g/UuR2q+dVfOXLOY2DfOZV5R8OzzRk m3EB8MP0Vz/i5P/br9jBTB+SP0wMawsNXXhQ+gDKekLUkleqVVp2BNdT5/XFCt24SIgR kd5+oO5p9W05h/iJTFoQQy0ZtqgwTW6LaU4E0NzUljlTXKGU7CoMXESgB497lVVW/hUr S6SA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787808; x=1783392608; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=WsWbPE3Bt2Gd8XbRXKbewV3tBI1M4bc8RRw0T8jY90g=; b=kbX83XnD80Kcyd53Bm3CjCxR13O3shX93/PoRhTGO+rb7D/ZBC4FJpikvtMxyTN780 oahcS17hXmIxbhdtxSVSWrQ3YYDxHX11Nj/XQ3Ng+StoZikl/QY4PDVQJz6IlgLUaQ0j ccWyJW9ZIbbNkUuMpBU+w8NDN2tjzTt1hcrC91RwmfMdOoojkr3SI5QLg/uFot0NLNod u5CMn5ywPr0XZtUvXBCF/nLv8G2Fb/ehME2Rr41MnrtxWpRLeAlhn42VP+6fDoH6er0E Y6ignqbAnbctPzrfx1uF3GKsF1s4ggCWZ2aRUROmyRgvle+Y9C3RHkXKADNzPnlEnydr axgw== X-Forwarded-Encrypted: i=1; AHgh+RobUhGf+YVVaPIfeEeDonju3+928IxHQ1s85j4wRoepDIXCGsJgTRhY6oOlMRuNcwd4FbYxtPawD/w0@nongnu.org X-Gm-Message-State: AOJu0YxqMJ/KYYS3DsH8n0a/3IApNrwLUSlATPYVnSQps7d7jMn62U8S 6K0BiDR5Ge38kVfAAHKRK32RVlSWcERRFtR5CA2cEvtwwLA8Na6x1H0i X-Gm-Gg: AfdE7cnBeolemki3jvmQbnEU1BzEXTY/jb450/gzoNWsdn3X3ufY6l4IlmELQ9omFJJ eoe130gOlK+bVUgEEpJHnsVPbYhriHSbzegqxOpADRuSZUgiOFAAg/7nD8QnzQGI80PRWLn39se yp0pMUqDIH5GF9/6BUUhafvjQQ7N4bednf2myOCRTfD55SyPhmELUuu4bjVXkMI9OllyUfX0T02 QF7BljaNISgWifRfB1F1DoTULpvfzYg1eRvRdJsMfHTlyHzuWxHiYekmKmSGbkPhjnUE+BXZcaj A64PFfn71gpB2Ddvci0SvETrQWuU7NXEs2CggfqRB+Bw3vMN4D+4xPLlJgT2kl6wX8mW3lLAk+8 mTRbrAEhI/KEO27Ofr10FeW8r839RX6nJqN0AfAZhx5vPwE2Ns81lP+jsRh+fqKw68yUkcQ+C5A PIMSOKZt9lNBxR9mFje4uQ+0IFKpBRTYySaC/XlHPeVCgh1RgQAllvWYSiktS4+zF80y09XSqis u2t5hSWpgVAczAtG9Jq61APg97rUw+JlBRz3ES4Zr0= X-Received: by 2002:a17:90b:58c5:b0:37f:e483:e933 with SMTP id 98e67ed59e1d1-380527a829dmr1187031a91.23.1782787808266; Mon, 29 Jun 2026 19:50:08 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v10 01/12] hw/riscv/boot: Describe discontiguous memory in boot_info Date: Tue, 30 Jun 2026 12:19:39 +0930 Message-ID: <20260630024952.1520546-2-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1035; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x1035.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787959699158500 Content-Type: text/plain; charset="utf-8" From: Nicholas Piggin Machines that have discontiguous memory may need to adjust where firmware and images are loaded at boot. Provide an interface for machines to describe a discontiguous low/high RAM scheme for this purpose. Reviewed-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley --- include/hw/riscv/boot.h | 7 +++++++ hw/riscv/boot.c | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index f00b3ca12245..69c99a149613 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -28,6 +28,10 @@ #define RISCV64_BIOS_BIN "opensbi-riscv64-generic-fw_dynamic.bin" =20 typedef struct RISCVBootInfo { + /* First contiguous RAM region. If size is zero then assume entire RAM= */ + hwaddr ram_low_start; + hwaddr ram_low_size; + ssize_t kernel_size; hwaddr image_low_addr; hwaddr image_high_addr; @@ -43,6 +47,9 @@ bool riscv_is_32bit(RISCVHartArrayState *harts); char *riscv_plic_hart_config_string(int hart_count); =20 void riscv_boot_info_init(RISCVBootInfo *info, RISCVHartArrayState *harts); +void riscv_boot_info_init_discontig_mem(RISCVBootInfo *info, + RISCVHartArrayState *harts, + hwaddr low_start, hwaddr low_size); vaddr riscv_calc_kernel_start_addr(RISCVBootInfo *info, hwaddr firmware_end_addr); hwaddr riscv_find_and_load_firmware(MachineState *machine, diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 7c9cd6146815..c8418f83f480 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -70,11 +70,27 @@ char *riscv_plic_hart_config_string(int hart_count) =20 void riscv_boot_info_init(RISCVBootInfo *info, RISCVHartArrayState *harts) { + info->ram_low_start =3D 0; + info->ram_low_size =3D 0; info->kernel_size =3D 0; info->initrd_size =3D 0; info->is_32bit =3D riscv_is_32bit(harts); } =20 +/* + * This can be used instead of riscv_boot_info_init() if the machine has + * discontiguous physical memory. The low memory range specified will be + * used to place firmware images. + */ +void riscv_boot_info_init_discontig_mem(RISCVBootInfo *info, + RISCVHartArrayState *harts, + hwaddr low_start, hwaddr low_size) +{ + riscv_boot_info_init(info, harts); + info->ram_low_start =3D low_start; + info->ram_low_size =3D low_size; +} + vaddr riscv_calc_kernel_start_addr(RISCVBootInfo *info, hwaddr firmware_end_addr) { if (info->is_32bit) { --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787956277490.5993961647997; Mon, 29 Jun 2026 19:52:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOYH-0004Bv-Ee; Mon, 29 Jun 2026 22:50:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOYD-0004BQ-Ct for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:17 -0400 Received: from mail-pj1-x1032.google.com ([2607:f8b0:4864:20::1032]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOYB-0001uy-5l for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:17 -0400 Received: by mail-pj1-x1032.google.com with SMTP id 98e67ed59e1d1-37f7a5a217fso1703484a91.0 for ; Mon, 29 Jun 2026 19:50:14 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:50:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787814; x=1783392614; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=Ge/bDZKkp5kU+zzRTvO0zxyjwDVB2aGDxgbINx2omgA=; b=eoYTrXv9zqgq9ybVlT9wnpmdzKojINPYsOTfuk6Qbiwv2hX+8wYKjItePFEkBdUh8/ QfhCuuMDTIxCYD38052/bJerC/V9806JxO46wfDgpJ+UcyPlm6o8+D6N0AUFoB63TdI0 VzuaFbJ3l5520Y3GogZyFau2sSR4XBtKwzOPmt3BnF08YkUNTb7ijbG4gA4uCor4qY3h z66OJu3+1hP+pPys2F4QInQ4tLYJHov/c0MVUHoAyNYIlNMio6O3/FLhQouot5CHThNq gNxj8/DQSZz/Vzy690lRunxM/b/b8aTlqGBlr/OBr5viH0WUIj/YEVcOEQRTnnQ3ZMtI Tc9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787814; x=1783392614; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Ge/bDZKkp5kU+zzRTvO0zxyjwDVB2aGDxgbINx2omgA=; b=qBfhLFlGcwpLhjlp3+f7Q8JmtuVK5g7qCg7t3Qt2z4sQQdx22y6HLgV6ZQShSB6JKa 2a1it2wDTGKEGCaznEmLMtQTrvv6stHKWVPzwmOqfV8Puo2C9B/lxfaxTe/uBjcjbIPz p/gjMPr3p6NcINzGa67OeSTR9jHb9a83lO+9sM6XwC7fYRCrDsbTPI0fbC89NlCaLumS 7IpOd9AkT8KROgwznXgAq7o/ihmPjtTXBcjw/L30pS+GhFEN+4JOmNw03VFnlyPo/p1D YT12qjKklTzYgeyJH4IuBgBkwXb0hWTwYdID9UQAQ8bCy6YWXZTujkbJglOUvcXgQZ5f zRgA== X-Forwarded-Encrypted: i=1; AHgh+Rrb1Zbh2CeRDZSDx8ayYBYXjlN+LQo7Fn66rXRP7KmpQErevgl2iOnzyWfw/WKyAoPlpHq06G2o1l+5@nongnu.org X-Gm-Message-State: AOJu0Yx1V4OEatESxXPourISw9o5ANYu2fiLjQYSykx25jflTUVO8j+I b00aG0EWUy/eLyw8ajr/G4vNe6mv5zYqSjKTIrqzaEARr7f8eP0VgJGL X-Gm-Gg: AfdE7cliBtGtfqA/Dlh3dZ6JUcFJTG1r+u+C/c2hmal5CCamiSXpZNGp8TOoEh2JBRo s+xt9NTWOU86FMXqTG2xXRjRpjJuIdlyCzXD9MAUa4XCfhTBEv8zb6W8GZCM9H4Zua+1/vOhBuf yegjIUfDybyERdk/D4Pd0b87f5L7jDmYm/SeWAJbxQHQSEI4R8oPcQdDIBrHciIPsPhBALZKhAu nnxyG+/lDq9HAKkGLqYym92ehNuAIcBOFXaSxLHytdJ0rQPSZkPkQ7EhjjnimrUFVFFmumCUec7 eOqDvJUlgJeLfwEBJd3R+H9CW8rbrWp0h0DanDbzWixm2YzTBFkgGoIeWn4NBj85a2RPhrs//K8 bQ5Vpao9sTfRGpv4D9Ae9JS0F6tqaqivLIasj0ynq4z79QXLbNVnCLuwAYfLVpwtgWxwU2oZJ+W f18axPCkUZPvVZl8JiHuzgmKvBF2yhJ4mtccZHV81nRiAg8OO1MeMz0yb21EM0+D2GK2awvuEvL zgnF4A2+YTT3524fI6+UHNhPB/RwygBUXzLyEskzV0= X-Received: by 2002:a17:90b:3944:b0:37f:7210:ccd7 with SMTP id 98e67ed59e1d1-3805272a521mr1453229a91.20.1782787813674; Mon, 29 Jun 2026 19:50:13 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v10 02/12] hw/riscv/boot: Account for discontiguous memory when loading firmware Date: Tue, 30 Jun 2026 12:19:40 +0930 Message-ID: <20260630024952.1520546-3-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1032; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x1032.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787958027158500 Content-Type: text/plain; charset="utf-8" From: Nicholas Piggin This loads firmware into the first (low) memory range, accounting for machines having discontiguous memory regions. Reviewed-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley --- include/hw/riscv/boot.h | 5 ++++- hw/riscv/boot.c | 18 ++++++++++++------ hw/riscv/k230.c | 8 ++++++-- hw/riscv/microchip_pfsoc.c | 8 ++++++-- hw/riscv/opentitan.c | 6 ++++-- hw/riscv/shakti_c.c | 6 +++++- hw/riscv/sifive_u.c | 6 ++++-- hw/riscv/spike.c | 6 ++++-- hw/riscv/virt.c | 7 ++++--- hw/riscv/xiangshan_kmh.c | 6 +++++- 10 files changed, 54 insertions(+), 22 deletions(-) diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index 69c99a149613..4e7bd9a225ef 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -53,13 +53,16 @@ void riscv_boot_info_init_discontig_mem(RISCVBootInfo *= info, vaddr riscv_calc_kernel_start_addr(RISCVBootInfo *info, hwaddr firmware_end_addr); hwaddr riscv_find_and_load_firmware(MachineState *machine, + RISCVBootInfo *info, const char *default_machine_firmware, hwaddr *firmware_load_addr, symbol_fn_t sym_cb); const char *riscv_default_firmware_name(RISCVHartArrayState *harts); char *riscv_find_firmware(const char *firmware_filename, const char *default_machine_firmware); -hwaddr riscv_load_firmware(const char *firmware_filename, +hwaddr riscv_load_firmware(MachineState *machine, + const RISCVBootInfo *info, + const char *firmware_filename, hwaddr *firmware_load_addr, symbol_fn_t sym_cb); void riscv_load_kernel(MachineState *machine, diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index c8418f83f480..5e2dfa091a13 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -151,6 +151,7 @@ char *riscv_find_firmware(const char *firmware_filename, } =20 hwaddr riscv_find_and_load_firmware(MachineState *machine, + RISCVBootInfo *info, const char *default_machine_firmware, hwaddr *firmware_load_addr, symbol_fn_t sym_cb) @@ -163,7 +164,8 @@ hwaddr riscv_find_and_load_firmware(MachineState *machi= ne, =20 if (firmware_filename) { /* If not "none" load the firmware */ - firmware_end_addr =3D riscv_load_firmware(firmware_filename, + firmware_end_addr =3D riscv_load_firmware(machine, info, + firmware_filename, firmware_load_addr, sym_cb= ); g_free(firmware_filename); } @@ -171,10 +173,13 @@ hwaddr riscv_find_and_load_firmware(MachineState *mac= hine, return firmware_end_addr; } =20 -hwaddr riscv_load_firmware(const char *firmware_filename, +hwaddr riscv_load_firmware(MachineState *machine, + const RISCVBootInfo *info, + const char *firmware_filename, hwaddr *firmware_load_addr, symbol_fn_t sym_cb) { + uint64_t mem_size =3D info->ram_low_size ?: machine->ram_size; uint64_t firmware_entry, firmware_end; ssize_t firmware_size; =20 @@ -203,7 +208,7 @@ hwaddr riscv_load_firmware(const char *firmware_filenam= e, =20 firmware_size =3D load_image_targphys_as(firmware_filename, *firmware_load_addr, - current_machine->ram_size, NULL, + mem_size, NULL, NULL); =20 if (firmware_size > 0) { @@ -218,7 +223,7 @@ hwaddr riscv_load_firmware(const char *firmware_filenam= e, static void riscv_load_initrd(MachineState *machine, RISCVBootInfo *info) { const char *filename =3D machine->initrd_filename; - uint64_t mem_size =3D machine->ram_size; + uint64_t mem_size =3D info->ram_low_size ?: machine->ram_size; void *fdt =3D machine->fdt; hwaddr start, end; ssize_t size; @@ -264,6 +269,7 @@ void riscv_load_kernel(MachineState *machine, bool load_initrd, symbol_fn_t sym_cb) { + uint64_t mem_size =3D info->ram_low_size ?: machine->ram_size; const char *kernel_filename =3D machine->kernel_filename; ssize_t kernel_size; void *fdt =3D machine->fdt; @@ -295,7 +301,7 @@ void riscv_load_kernel(MachineState *machine, } =20 kernel_size =3D load_image_targphys_as(kernel_filename, kernel_start_a= ddr, - current_machine->ram_size, NULL, = NULL); + mem_size, NULL, NULL); if (kernel_size > 0) { info->kernel_size =3D kernel_size; info->image_low_addr =3D kernel_start_addr; @@ -391,7 +397,7 @@ uint64_t riscv_compute_fdt_addr(hwaddr dram_base, hwadd= r dram_size, dtb_start =3D QEMU_ALIGN_DOWN(temp - fdtsize, 2 * MiB); =20 if (dtb_start_limit && (dtb_start < dtb_start_limit)) { - error_report("No enough memory to place DTB after kernel/initrd"); + error_report("Not enough memory to place DTB after kernel/initrd"); exit(1); } =20 diff --git a/hw/riscv/k230.c b/hw/riscv/k230.c index 502281c52cff..656f28190cd0 100644 --- a/hw/riscv/k230.c +++ b/hw/riscv/k230.c @@ -424,7 +424,8 @@ static void k230_direct_boot(K230MachineState *s, Machi= neState *machine) =20 riscv_load_fdt(K230_DIRECT_DTB_ADDR, machine->fdt); =20 - firmware_end_addr =3D riscv_find_and_load_firmware(machine, firmware_n= ame, + firmware_end_addr =3D riscv_find_and_load_firmware(machine, &boot_info, + firmware_name, &start_addr, NULL); if (firmware_end_addr > K230_DIRECT_KERNEL_ADDR) { error_report("K230 firmware overlaps kernel address 0x%x", @@ -442,13 +443,16 @@ static void k230_firmware_boot(K230MachineState *s, M= achineState *machine) { const char *firmware_name =3D riscv_default_firmware_name(&s->soc.c908= _cpu); hwaddr start_addr =3D memmap[K230_DEV_DDRC].base; + RISCVBootInfo boot_info =3D {0}; =20 if (machine->dtb || (machine->kernel_cmdline && *machine->kernel_cmdli= ne)) { error_report("K230 firmware boot does not support -dtb or -append"= ); exit(EXIT_FAILURE); } =20 - riscv_find_and_load_firmware(machine, firmware_name, &start_addr, NULL= ); + riscv_boot_info_init(&boot_info, &s->soc.c908_cpu); + riscv_find_and_load_firmware(machine, &boot_info, firmware_name, + &start_addr, NULL); =20 riscv_setup_rom_reset_vec(machine, &s->soc.c908_cpu, start_addr, memmap[K230_DEV_BOOTROM].base, diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c index 5e48a2970838..4017129c8304 100644 --- a/hw/riscv/microchip_pfsoc.c +++ b/hw/riscv/microchip_pfsoc.c @@ -619,18 +619,22 @@ static void microchip_icicle_kit_machine_init(Machine= State *machine) firmware_load_addr =3D RESET_VECTOR; } =20 + riscv_boot_info_init_discontig_mem(&boot_info, &s->soc.u_cpus, + memmap[MICROCHIP_PFSOC_DRAM_LO].bas= e, + mem_low_size); + /* Load the firmware if necessary */ firmware_end_addr =3D firmware_load_addr; if (firmware_name) { char *filename =3D riscv_find_firmware(firmware_name, NULL); if (filename) { - firmware_end_addr =3D riscv_load_firmware(filename, + firmware_end_addr =3D riscv_load_firmware(machine, &boot_info, + filename, &firmware_load_addr, N= ULL); g_free(filename); } } =20 - riscv_boot_info_init(&boot_info, &s->soc.u_cpus); if (machine->kernel_filename) { kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_info, firmware_end_addr= ); diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c index c8b2f028f237..5b2f33d5acac 100644 --- a/hw/riscv/opentitan.c +++ b/hw/riscv/opentitan.c @@ -100,12 +100,14 @@ static void opentitan_machine_init(MachineState *mach= ine) memory_region_add_subregion(sys_mem, memmap[IBEX_DEV_RAM].base, machine->ram); =20 + riscv_boot_info_init(&boot_info, &s->soc.cpus); + if (machine->firmware) { hwaddr firmware_load_addr =3D memmap[IBEX_DEV_RAM].base; - riscv_load_firmware(machine->firmware, &firmware_load_addr, NULL); + riscv_load_firmware(machine, &boot_info, machine->firmware, + &firmware_load_addr, NULL); } =20 - riscv_boot_info_init(&boot_info, &s->soc.cpus); if (machine->kernel_filename) { riscv_load_kernel(machine, &boot_info, memmap[IBEX_DEV_RAM].base, diff --git a/hw/riscv/shakti_c.c b/hw/riscv/shakti_c.c index b1823a312508..835b1f879b7f 100644 --- a/hw/riscv/shakti_c.c +++ b/hw/riscv/shakti_c.c @@ -46,6 +46,7 @@ static void shakti_c_machine_state_init(MachineState *mst= ate) { ShaktiCMachineState *sms =3D RISCV_SHAKTI_MACHINE(mstate); MemoryRegion *system_memory =3D get_system_memory(); + RISCVBootInfo boot_info; hwaddr firmware_load_addr =3D shakti_c_memmap[SHAKTI_C_RAM].base; =20 /* Initialize SoC */ @@ -58,8 +59,11 @@ static void shakti_c_machine_state_init(MachineState *ms= tate) shakti_c_memmap[SHAKTI_C_RAM].base, mstate->ram); =20 + riscv_boot_info_init(&boot_info, &sms->soc.cpus); + if (mstate->firmware) { - riscv_load_firmware(mstate->firmware, &firmware_load_addr, NULL); + riscv_load_firmware(mstate, &boot_info, mstate->firmware, + &firmware_load_addr, NULL); } =20 /* ROM reset vector */ diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index d923f041e064..99423ef472d6 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -524,11 +524,13 @@ static void sifive_u_machine_init(MachineState *machi= ne) break; } =20 + riscv_boot_info_init(&boot_info, &s->soc.u_cpus); + firmware_name =3D riscv_default_firmware_name(&s->soc.u_cpus); - firmware_end_addr =3D riscv_find_and_load_firmware(machine, firmware_n= ame, + firmware_end_addr =3D riscv_find_and_load_firmware(machine, &boot_info, + firmware_name, &start_addr, NULL); =20 - riscv_boot_info_init(&boot_info, &s->soc.u_cpus); if (machine->kernel_filename) { kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_info, firmware_end_addr= ); diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c index 4e60724c147f..9fde0faf39db 100644 --- a/hw/riscv/spike.c +++ b/hw/riscv/spike.c @@ -205,9 +205,12 @@ static void spike_board_init(MachineState *machine) } } =20 + riscv_boot_info_init(&boot_info, &s->soc[0]); + /* Load firmware */ if (firmware_name) { - firmware_end_addr =3D riscv_load_firmware(firmware_name, + firmware_end_addr =3D riscv_load_firmware(machine, &boot_info, + firmware_name, &firmware_load_addr, htif_symbol_callback); g_free(firmware_name); @@ -217,7 +220,6 @@ static void spike_board_init(MachineState *machine) create_fdt(s, memmap, riscv_is_32bit(&s->soc[0]), htif_custom_base); =20 /* Load kernel */ - riscv_boot_info_init(&boot_info, &s->soc[0]); if (machine->kernel_filename) { kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_info, firmware_end_addr= ); diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 92c30a6f4cbc..efdb992cb88c 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1310,7 +1310,10 @@ static void virt_machine_done(Notifier *notifier, vo= id *data) } } =20 - firmware_end_addr =3D riscv_find_and_load_firmware(machine, firmware_n= ame, + riscv_boot_info_init(&boot_info, &s->soc[0]); + + firmware_end_addr =3D riscv_find_and_load_firmware(machine, &boot_info, + firmware_name, &start_addr, NULL); =20 pflash_blk0 =3D pflash_cfi01_get_blk(s->flash[0]); @@ -1333,8 +1336,6 @@ static void virt_machine_done(Notifier *notifier, voi= d *data) } } =20 - riscv_boot_info_init(&boot_info, &s->soc[0]); - if (machine->kernel_filename && !kernel_entry) { kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_info, firmware_end_addr= ); diff --git a/hw/riscv/xiangshan_kmh.c b/hw/riscv/xiangshan_kmh.c index 76417ba7aba1..384624d69ad5 100644 --- a/hw/riscv/xiangshan_kmh.c +++ b/hw/riscv/xiangshan_kmh.c @@ -167,6 +167,7 @@ static void xiangshan_kmh_machine_init(MachineState *ma= chine) const MemMapEntry *memmap =3D xiangshan_kmh_memmap; MemoryRegion *system_memory =3D get_system_memory(); hwaddr start_addr =3D memmap[XIANGSHAN_KMH_DRAM].base; + RISCVBootInfo boot_info; =20 /* Initialize SoC */ object_initialize_child(OBJECT(machine), "soc", &s->soc, @@ -178,13 +179,16 @@ static void xiangshan_kmh_machine_init(MachineState *= machine) memmap[XIANGSHAN_KMH_DRAM].base, machine->ram); =20 + riscv_boot_info_init(&boot_info, &s->soc.cpus); + /* ROM reset vector */ riscv_setup_rom_reset_vec(machine, &s->soc.cpus, start_addr, memmap[XIANGSHAN_KMH_ROM].base, memmap[XIANGSHAN_KMH_ROM].size, 0, 0); if (machine->firmware) { - riscv_load_firmware(machine->firmware, &start_addr, NULL); + riscv_load_firmware(machine, &boot_info, machine->firmware, + &start_addr, NULL); } =20 /* Note: dtb has been integrated into firmware(OpenSBI) when compiling= */ --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787850713992.2346457115021; Mon, 29 Jun 2026 19:50:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOYO-0004DS-QT; Mon, 29 Jun 2026 22:50:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOYL-0004Cg-3u for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:26 -0400 Received: from mail-pj1-x102d.google.com ([2607:f8b0:4864:20::102d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOYH-00024Q-0H for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:23 -0400 Received: by mail-pj1-x102d.google.com with SMTP id 98e67ed59e1d1-37fcae0ecb3so1260726a91.3 for ; Mon, 29 Jun 2026 19:50:20 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:50:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787819; x=1783392619; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=JxhVoRDCc+6HswbZvjtn/WjcJxiW0SOAudvabfDX9ok=; b=XpnL9rxoApAix5SVfVAjY2wbtO0nTqq4OZikdqy6OqD3wlohlScAHmgl3Clg39k5cp xx9iGfPPqE0jro4jhUl2DcO75YLQQpOfo3NirqaWase2UzmutxGyoamvi3gvb+SJxSgX PmoKgXIixV2rtOh87VvFO05Tx9Np3xfccHqecCZhp/J+H3T0h9JpEOEpoZF4VHnSMPF5 wQ22YA0TFzA4T4+jt0yPttnhsV1GqYO26vkUVBGGvjwOb0DbV1+lUe0nZ0FTYTssmqB0 iHtUEUkqPzQDC/dHg4Bbci1TZ8nBrYtmd8xytiCjtLrFflWuCMCKba6B517ennSz8t3Q S+zA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787819; x=1783392619; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=JxhVoRDCc+6HswbZvjtn/WjcJxiW0SOAudvabfDX9ok=; b=G2E32GmKAkDeIgiBgf195WbeMQjMuo6k3NJNJ27Gke81Vrt9FIkClzkU4wrUZIG//9 Q7ChPOplvyi4iW3nWrif0DxMr2fZWpLX1M03/mXcoQt4Jd4mHyd5P6Waxblq9AvNjqey th7DrEK8gALtf3GAGXq2cT2ye+xCUxo0xIs7WMJEUTp3aFlKGurGsEYbDYWbFz+ACuOj oCRtS/xL0g2EuWWU3nCqoP6RJoUlJdyRVJlJy0VX4BE0/lFoD0xW1YpbWLZQU85aCVdD SD155ZEUGzVU6qdKP4Mg6KWVrtGxS75lzy6fvs3CfiDBVfSh7a48+zDDXP1/zW9wPIah WnDA== X-Forwarded-Encrypted: i=1; AHgh+RoIkx4hLPZOU3v4DvEKPwOuA9Tzgt1ZczlH+PNnrCoXdMS+2iDCm23JQqLfD/adg5XAU7z1SH+pB7hB@nongnu.org X-Gm-Message-State: AOJu0Yz9A9GBl10TXD04aHaCLAXdULdNNJ+m6XMw0TBh9GBuux6Z/F5f vGK4S2jPBxU1skTJw1owM9zjmm21iXQ7Chh6YmMnPeg/0Lqibfu6Bccn X-Gm-Gg: AfdE7cm3WuP4TjPW0T2AIMmQ1oDpZDqsBUA27naX9+gpSumaUKCqpEvVnlMJshcrw18 XwTVUJdNDeEHlVmT2UiFXV4r96Uz3tVZ+2Zbz6nn8AWKb/yyWoaROWMOnc5eCoU3Muc+OCkcn/5 G/UGNbraG/H6ki9c0Qmnl25RM5ry1Jb4OWSBA/KUSkLgWEtVn6zi/MSomybz1WwTSwVmYJYYm1D sqffHHsVUsyFQQ4iosN/4dYc6o7bmP56kxA+EpvJ6zAyBkSNow4Y1kSSnrnkdqiSX+njxXPiDd9 uJ+R0jabDIs+kW2GdGZf/tzg00dKBlLu9AkZg7L6PVUC/AwOM3wJxUzDW3lS2H8FWxCkteyVeBC E31dvhIDeB9yL5LHreTZbzmgGbsc7tvSfXNVTDeTIy68TEI9u4OB294Id+B0bPPhYxighbyw3N/ g+W8DBUb3R5VkpvzjX8UnYXTXQvkXvZ+vJymstynBzhPzGwfbQvFgp1yXdEb1PcuoejtKq2ANeX 9D4MocOgNez1GpVdna6hqNhUa9VIJhVj02iVCW6A7s= X-Received: by 2002:a17:90b:2cce:b0:37f:9ce1:7367 with SMTP id 98e67ed59e1d1-3805277ed34mr1441341a91.29.1782787819363; Mon, 29 Jun 2026 19:50:19 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Nutty Liu , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v10 03/12] hw/riscv/virt: Move AIA initialisation to helper file Date: Tue, 30 Jun 2026 12:19:41 +0930 Message-ID: <20260630024952.1520546-4-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102d; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x102d.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787855611158500 The AIA init will be used by any server class riscv machine. Separate it out in order to share code with such systems. The virt machine keeps machine specific #defines such as VIRT_IRQCHIP_NUM_MSIS, VIRT_IRQCHIP_NUM_PRIO_BITS. Reviewed-by: Daniel Henrique Barboza Reviewed-by: Nutty Liu Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley --- hw/riscv/aia.h | 26 +++++++++++ include/hw/riscv/virt.h | 1 - hw/riscv/aia.c | 89 ++++++++++++++++++++++++++++++++++++++ hw/riscv/virt-acpi-build.c | 2 + hw/riscv/virt.c | 87 +++++-------------------------------- hw/riscv/meson.build | 1 + 6 files changed, 129 insertions(+), 77 deletions(-) create mode 100644 hw/riscv/aia.h create mode 100644 hw/riscv/aia.c diff --git a/hw/riscv/aia.h b/hw/riscv/aia.h new file mode 100644 index 000000000000..dbb833340276 --- /dev/null +++ b/hw/riscv/aia.h @@ -0,0 +1,26 @@ +/* + * QEMU RISC-V Advanced Interrupt Architecture (AIA) + * + * Copyright (C) 2019 Western Digital Corporation or its affiliates. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_RISCV_AIA_H +#define HW_RISCV_AIA_H + +#include "exec/hwaddr.h" + +#define VIRT_IRQCHIP_NUM_SOURCES 96 + +uint32_t imsic_num_bits(uint32_t count); + +DeviceState *riscv_create_aia(bool msimode, int aia_guests, + const MemMapEntry *aplic_m, + const MemMapEntry *aplic_s, + const MemMapEntry *imsic_m, + const MemMapEntry *imsic_s, + int socket, int base_hartid, int hart_count, + uint32_t num_msis, uint32_t num_prio_bits); + +#endif diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 18a2a323a344..ad858deb76ad 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -135,7 +135,6 @@ enum { bool virt_is_acpi_enabled(RISCVVirtState *s); bool virt_is_iommu_sys_enabled(RISCVVirtState *s); void virt_acpi_setup(RISCVVirtState *vms); -uint32_t imsic_num_bits(uint32_t count); =20 /* * The virt machine physical address space used by some of the devices diff --git a/hw/riscv/aia.c b/hw/riscv/aia.c new file mode 100644 index 000000000000..c724612a50a5 --- /dev/null +++ b/hw/riscv/aia.c @@ -0,0 +1,89 @@ +/* + * QEMU RISC-V Advanced Interrupt Architecture (AIA) + * + * Copyright (C) 2019 Western Digital Corporation or its affiliates. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "system/kvm.h" +#include "hw/intc/riscv_aplic.h" +#include "hw/intc/riscv_imsic.h" + +#include "aia.h" + +uint32_t imsic_num_bits(uint32_t count) +{ + uint32_t ret =3D 0; + + while (BIT(ret) < count) { + ret++; + } + + return ret; +} + +DeviceState *riscv_create_aia(bool msimode, int aia_guests, + const MemMapEntry *aplic_m, + const MemMapEntry *aplic_s, + const MemMapEntry *imsic_m, + const MemMapEntry *imsic_s, + int socket, int base_hartid, int hart_count, + uint32_t num_msis, uint32_t num_prio_bits) +{ + int i; + hwaddr addr =3D 0; + uint32_t guest_bits; + DeviceState *aplic_s_dev =3D NULL; + DeviceState *aplic_m_dev =3D NULL; + + if (msimode) { + if (!kvm_enabled()) { + /* Per-socket M-level IMSICs */ + addr =3D imsic_m->base + socket * (1U << IMSIC_MMIO_GROUP_MIN_= SHIFT); + for (i =3D 0; i < hart_count; i++) { + riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0), + base_hartid + i, true, 1, + num_msis); + } + } + + /* Per-socket S-level IMSICs */ + guest_bits =3D imsic_num_bits(aia_guests + 1); + addr =3D imsic_s->base + socket * (1U << IMSIC_MMIO_GROUP_MIN_SHIF= T); + for (i =3D 0; i < hart_count; i++) { + riscv_imsic_create(addr + i * IMSIC_HART_SIZE(guest_bits), + base_hartid + i, false, 1 + aia_guests, + num_msis); + } + } + + if (!kvm_enabled()) { + /* Per-socket M-level APLIC */ + aplic_m_dev =3D riscv_aplic_create(aplic_m->base + + socket * aplic_m->size, + aplic_m->size, + (msimode) ? 0 : base_hartid, + (msimode) ? 0 : hart_count, + VIRT_IRQCHIP_NUM_SOURCES, + num_prio_bits, + msimode, true, NULL); + } + + /* Per-socket S-level APLIC */ + aplic_s_dev =3D riscv_aplic_create(aplic_s->base + + socket * aplic_s->size, + aplic_s->size, + (msimode) ? 0 : base_hartid, + (msimode) ? 0 : hart_count, + VIRT_IRQCHIP_NUM_SOURCES, + num_prio_bits, + msimode, false, aplic_m_dev); + + if (kvm_enabled() && msimode) { + riscv_aplic_set_kvm_msicfgaddr(RISCV_APLIC(aplic_s_dev), addr); + } + + return kvm_enabled() ? aplic_s_dev : aplic_m_dev; +} diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c index 6b06d9aa87cb..02ab460e589c 100644 --- a/hw/riscv/virt-acpi-build.c +++ b/hw/riscv/virt-acpi-build.c @@ -42,6 +42,8 @@ #include "system/kvm.h" #include "system/reset.h" =20 +#include "aia.h" + #define ACPI_BUILD_TABLE_SIZE 0x20000 #define ACPI_BUILD_INTC_ID(socket, index) ((socket << 24) | (index)) =20 diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index efdb992cb88c..b76bbb62f888 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -61,6 +61,8 @@ #include "hw/virtio/virtio-iommu.h" #include "hw/uefi/var-service-api.h" =20 +#include "aia.h" + /* KVM AIA only supports APLIC MSI. APLIC Wired is always emulated by QEMU= . */ static bool virt_use_kvm_aia_aplic_imsic(RISCVVirtAIAType aia_type) { @@ -371,17 +373,6 @@ static void create_fdt_socket_plic(RISCVVirtState *s, } } =20 -uint32_t imsic_num_bits(uint32_t count) -{ - uint32_t ret =3D 0; - - while (BIT(ret) < count) { - ret++; - } - - return ret; -} - static void create_fdt_one_imsic(RISCVVirtState *s, hwaddr base_addr, uint32_t *intc_phandles, uint32_t msi_pha= ndle, bool m_mode, uint32_t imsic_guest_bits) @@ -1146,68 +1137,6 @@ static DeviceState *virt_create_plic(const MemMapEnt= ry *memmap, int socket, memmap[VIRT_PLIC].size); } =20 -static DeviceState *virt_create_aia(RISCVVirtAIAType aia_type, int aia_gue= sts, - const MemMapEntry *memmap, int socket, - int base_hartid, int hart_count) -{ - int i; - hwaddr addr =3D 0; - uint32_t guest_bits; - DeviceState *aplic_s =3D NULL; - DeviceState *aplic_m =3D NULL; - bool msimode =3D aia_type =3D=3D VIRT_AIA_TYPE_APLIC_IMSIC; - - if (msimode) { - if (!kvm_enabled()) { - /* Per-socket M-level IMSICs */ - addr =3D memmap[VIRT_IMSIC_M].base + - socket * VIRT_IMSIC_GROUP_MAX_SIZE; - for (i =3D 0; i < hart_count; i++) { - riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0), - base_hartid + i, true, 1, - VIRT_IRQCHIP_NUM_MSIS); - } - } - - /* Per-socket S-level IMSICs */ - guest_bits =3D imsic_num_bits(aia_guests + 1); - addr =3D memmap[VIRT_IMSIC_S].base + socket * VIRT_IMSIC_GROUP_MAX= _SIZE; - for (i =3D 0; i < hart_count; i++) { - riscv_imsic_create(addr + i * IMSIC_HART_SIZE(guest_bits), - base_hartid + i, false, 1 + aia_guests, - VIRT_IRQCHIP_NUM_MSIS); - } - } - - if (!kvm_enabled()) { - /* Per-socket M-level APLIC */ - aplic_m =3D riscv_aplic_create(memmap[VIRT_APLIC_M].base + - socket * memmap[VIRT_APLIC_M].size, - memmap[VIRT_APLIC_M].size, - (msimode) ? 0 : base_hartid, - (msimode) ? 0 : hart_count, - VIRT_IRQCHIP_NUM_SOURCES, - VIRT_IRQCHIP_NUM_PRIO_BITS, - msimode, true, NULL); - } - - /* Per-socket S-level APLIC */ - aplic_s =3D riscv_aplic_create(memmap[VIRT_APLIC_S].base + - socket * memmap[VIRT_APLIC_S].size, - memmap[VIRT_APLIC_S].size, - (msimode) ? 0 : base_hartid, - (msimode) ? 0 : hart_count, - VIRT_IRQCHIP_NUM_SOURCES, - VIRT_IRQCHIP_NUM_PRIO_BITS, - msimode, false, aplic_m); - - if (kvm_enabled() && msimode) { - riscv_aplic_set_kvm_msicfgaddr(RISCV_APLIC(aplic_s), addr); - } - - return kvm_enabled() ? aplic_s : aplic_m; -} - static void create_platform_bus(RISCVVirtState *s, DeviceState *irqchip) { DeviceState *dev; @@ -1470,9 +1399,15 @@ static void virt_machine_init(MachineState *machine) s->irqchip[i] =3D virt_create_plic(s->memmap, i, base_hartid, hart_count); } else { - s->irqchip[i] =3D virt_create_aia(s->aia_type, s->aia_guests, - s->memmap, i, base_hartid, - hart_count); + s->irqchip[i] =3D riscv_create_aia(s->aia_type =3D=3D VIRT_AIA= _TYPE_APLIC_IMSIC, + s->aia_guests, + &s->memmap[VIRT_APLIC_M], + &s->memmap[VIRT_APLIC_S], + &s->memmap[VIRT_IMSIC_M], + &s->memmap[VIRT_IMSIC_S], + i, base_hartid, hart_count, + VIRT_IRQCHIP_NUM_MSIS, + VIRT_IRQCHIP_NUM_PRIO_BITS); } =20 /* Try to use different IRQCHIP instance based device type */ diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index b70a054579ae..798477b7882a 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -1,4 +1,5 @@ riscv_ss =3D ss.source_set() +riscv_ss.add(files('aia.c')) riscv_ss.add(files('boot.c')) riscv_ss.add(files('fdt-common.c')) riscv_ss.add(when: 'CONFIG_RISCV_NUMA', if_true: files('numa.c')) --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787904422824.5970539178498; Mon, 29 Jun 2026 19:51:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOYT-0004EV-Be; Mon, 29 Jun 2026 22:50:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOYQ-0004Dl-Pw for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:30 -0400 Received: from mail-pj1-x102f.google.com ([2607:f8b0:4864:20::102f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOYN-00029C-6F for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:30 -0400 Received: by mail-pj1-x102f.google.com with SMTP id 98e67ed59e1d1-37e4098e920so1617160a91.3 for ; Mon, 29 Jun 2026 19:50:26 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:50:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787825; x=1783392625; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=t10Ezi/uwWFyoRD6k5OU/iZ8iwpW3lBUPBJKT84zHY0=; b=C8tEx26qleQE4pMx1wVuU8zm1nxkeNJ93c5kIG3lZUHh6xjNxK2R11EM68dN+RzXIN ONQEOCDQV7r9oaYBFnbJhXKhILDd52S4M0Lw1zTfzj9UJHlz1Pao2LmbzFeYLDawdfP1 ai8qmAininHKvvNpd/rrWwWchYkyT6gC9tY4+xOc00X0ajE2+b62/Zh5SOvylujPJcfW yPM5fpWcTtg0ywP6lI+xW3/Kwp1tzsdzO2RrXxdxZq2mpgGjgWcTA1gpsHUgwyYYOuHw /VNosHxywNxHkvPRMAgPJ0OBebNxRkmgERz50XY14o7QiftpcrIiVicsvrxx91/o1gTK 8MgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787826; x=1783392626; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=t10Ezi/uwWFyoRD6k5OU/iZ8iwpW3lBUPBJKT84zHY0=; b=nrW3XwpvAQwJe9jzmxPRV6YFYxtMR246jbLY8Vx1Yc3gx+7vp+40zJvTtm9y8xW494 Qn1Nt1r4YGr7uTO9t1bxxl4dtKwWGDq32paH6Ebuxe0CcDwipcoGf1ChbUNoFLGjikuV kOpvLdLe99l4wC2k6ygZx/eTJTPh3sM1p48lWdlzDYshW+Im7cY8QoVsLNKl0Owjq7S8 IaOIzToxRea9ZhD8Fm/PnrKTxAYZLWL1J8xIvH4APhsiMyfKV9wjztwrfPWNrlTZJVWu GEn/JOcvZ6dpG6yVVCxlipsl/h46ROK52XMR12205ty8D4nXubO6uiSKG+eedr1SF6J8 BgTg== X-Forwarded-Encrypted: i=1; AHgh+RovQZsqnlXmC8FnN4o5Ksq8LjH1q04aMJWye8VqstHGhlnA55YMag/lApLPrEZNA0qp8V673RPoL28+@nongnu.org X-Gm-Message-State: AOJu0YwTPPZ5jh/k5CwhyGeiVCjetm7mI11gzacLCywj8ohMjCniRHu7 /9w0JfvGI00fnIoapIGC6M945OunFfpxTGjqLPp8SqJT4iNTg+78ahtu X-Gm-Gg: AfdE7cmeKU6vQN08iH28eOVLBuKig65grNjDxOGDSKe+TBSSIjBawaoOgXhLVcE0w4s rr5fbCU5cRvaqGtz6fxIcVqDIOraKBTR+UiOBoQxK3DLqF/+6+wY0zbKRCrQRp9Xr/GIfkHg4G3 FaT3yAYZJhnrOE7JjJpWEM+cAiIVS54lQ/odRqJi1qTXfY4r5f3pahR11Z1Muyr6D0hr+p0iLZv FuzVnKwlrut2XaY4oVQI3ExpOMiCuDPcTPOwWS/yhCYZTZIiHtgzq4WcbuNvnBKcIVzUUsUhsev v3NaiJQWZ/myMWvNnVmlLa7kZsf5bfnDR1sBNoJY35MIUbZhfyQJGOLXDxcZjDajmavU38K+bJZ Iz/pqknnuxFcoomrImvF6q718FW/kX3Rio/IGjXKLw1hWkIGzBhvIsgoc/YTTnFDRIgDgFKBZ9N b1ojgZ1dYzklkLAHdJWdUYraXHvuOjDEHI8hQs5aa6S2ULrMaYKorXGuFs/jFAxXIXMAgoPHdo0 LNFvAQLBkI672LhbQO1RIijE1tJrxz9+OpszJ0wSww= X-Received: by 2002:a17:90b:3f0f:b0:37f:eb45:e058 with SMTP id 98e67ed59e1d1-380527a8a91mr1251367a91.19.1782787825532; Mon, 29 Jun 2026 19:50:25 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Nutty Liu , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v10 04/12] hw/riscv/aia: Provide number of irq sources Date: Tue, 30 Jun 2026 12:19:42 +0930 Message-ID: <20260630024952.1520546-5-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102f; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x102f.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787905816158500 Instead of hard coding the number of IRQ sources used by the APLIC pass it in as a parameter. This allows other machines to configure this as required. The maximum number of sources is 1023. Reviewed-by: Nutty Liu Reviewed-by: Daniel Henrique Barboza Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley --- hw/riscv/aia.h | 3 +-- include/hw/riscv/virt.h | 1 + hw/riscv/aia.c | 8 ++++++-- hw/riscv/virt-acpi-build.c | 25 ++++++++++++++++--------- hw/riscv/virt.c | 2 ++ 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/hw/riscv/aia.h b/hw/riscv/aia.h index dbb833340276..5ad0a902be0d 100644 --- a/hw/riscv/aia.h +++ b/hw/riscv/aia.h @@ -11,11 +11,10 @@ =20 #include "exec/hwaddr.h" =20 -#define VIRT_IRQCHIP_NUM_SOURCES 96 - uint32_t imsic_num_bits(uint32_t count); =20 DeviceState *riscv_create_aia(bool msimode, int aia_guests, + uint16_t num_sources, const MemMapEntry *aplic_m, const MemMapEntry *aplic_s, const MemMapEntry *imsic_m, diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index ad858deb76ad..36a2def41096 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -64,6 +64,7 @@ struct RISCVVirtState { struct GPEXHost *gpex_host; OnOffAuto iommu_sys; uint16_t pci_iommu_bdf; + uint16_t num_sources; }; =20 enum { diff --git a/hw/riscv/aia.c b/hw/riscv/aia.c index c724612a50a5..82ea9d48ea75 100644 --- a/hw/riscv/aia.c +++ b/hw/riscv/aia.c @@ -25,6 +25,7 @@ uint32_t imsic_num_bits(uint32_t count) } =20 DeviceState *riscv_create_aia(bool msimode, int aia_guests, + uint16_t num_sources, const MemMapEntry *aplic_m, const MemMapEntry *aplic_s, const MemMapEntry *imsic_m, @@ -38,6 +39,9 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guest= s, DeviceState *aplic_s_dev =3D NULL; DeviceState *aplic_m_dev =3D NULL; =20 + /* The RISC-V Advanced Interrupt Architecture, Chapter 1.2. Limits */ + g_assert(num_sources <=3D 1023); + if (msimode) { if (!kvm_enabled()) { /* Per-socket M-level IMSICs */ @@ -66,7 +70,7 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guest= s, aplic_m->size, (msimode) ? 0 : base_hartid, (msimode) ? 0 : hart_count, - VIRT_IRQCHIP_NUM_SOURCES, + num_sources, num_prio_bits, msimode, true, NULL); } @@ -77,7 +81,7 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guest= s, aplic_s->size, (msimode) ? 0 : base_hartid, (msimode) ? 0 : hart_count, - VIRT_IRQCHIP_NUM_SOURCES, + num_sources, num_prio_bits, msimode, false, aplic_m_dev); =20 diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c index 02ab460e589c..59c454f4f94e 100644 --- a/hw/riscv/virt-acpi-build.c +++ b/hw/riscv/virt-acpi-build.c @@ -148,6 +148,7 @@ static void acpi_dsdt_add_cpus(Aml *scope, RISCVVirtSta= te *s) } =20 static void acpi_dsdt_add_plic_aplic(Aml *scope, uint8_t socket_count, + uint16_t num_sources, uint64_t mmio_base, uint64_t mmio_siz= e, const char *hid) { @@ -155,9 +156,12 @@ static void acpi_dsdt_add_plic_aplic(Aml *scope, uint8= _t socket_count, uint32_t gsi_base; uint8_t socket; =20 + /* The RISC-V Advanced Interrupt Architecture, Chapter 1.2. Limits */ + g_assert(num_sources <=3D 1023); + for (socket =3D 0; socket < socket_count; socket++) { plic_aplic_addr =3D mmio_base + mmio_size * socket; - gsi_base =3D VIRT_IRQCHIP_NUM_SOURCES * socket; + gsi_base =3D num_sources * socket; Aml *dev =3D aml_device("IC%.02X", socket); aml_append(dev, aml_name_decl("_HID", aml_string("%s", hid))); aml_append(dev, aml_name_decl("_UID", aml_int(socket))); @@ -476,10 +480,13 @@ static void build_dsdt(GArray *table_data, socket_count =3D riscv_socket_count(ms); =20 if (s->aia_type =3D=3D VIRT_AIA_TYPE_NONE) { - acpi_dsdt_add_plic_aplic(scope, socket_count, memmap[VIRT_PLIC].ba= se, - memmap[VIRT_PLIC].size, "RSCV0001"); + acpi_dsdt_add_plic_aplic(scope, socket_count, s->num_sources, + memmap[VIRT_PLIC].base, + memmap[VIRT_PLIC].size, + "RSCV0001"); } else { - acpi_dsdt_add_plic_aplic(scope, socket_count, memmap[VIRT_APLIC_S]= .base, + acpi_dsdt_add_plic_aplic(scope, socket_count, s->num_sources, + memmap[VIRT_APLIC_S].base, memmap[VIRT_APLIC_S].size, "RSCV0002"); } =20 @@ -496,15 +503,15 @@ static void build_dsdt(GArray *table_data, } else if (socket_count =3D=3D 2) { virtio_acpi_dsdt_add(scope, memmap[VIRT_VIRTIO].base, memmap[VIRT_VIRTIO].size, - VIRTIO_IRQ + VIRT_IRQCHIP_NUM_SOURCES, 0, + VIRTIO_IRQ + s->num_sources, 0, VIRTIO_COUNT); - acpi_dsdt_add_gpex_host(scope, PCIE_IRQ + VIRT_IRQCHIP_NUM_SOURCES= ); + acpi_dsdt_add_gpex_host(scope, PCIE_IRQ + s->num_sources); } else { virtio_acpi_dsdt_add(scope, memmap[VIRT_VIRTIO].base, memmap[VIRT_VIRTIO].size, - VIRTIO_IRQ + VIRT_IRQCHIP_NUM_SOURCES, 0, + VIRTIO_IRQ + s->num_sources, 0, VIRTIO_COUNT); - acpi_dsdt_add_gpex_host(scope, PCIE_IRQ + VIRT_IRQCHIP_NUM_SOURCES= * 2); + acpi_dsdt_add_gpex_host(scope, PCIE_IRQ + s->num_sources * 2); } =20 aml_append(dsdt, scope); @@ -583,7 +590,7 @@ static void build_madt(GArray *table_data, for (socket =3D 0; socket < riscv_socket_count(ms); socket++) { aplic_addr =3D s->memmap[VIRT_APLIC_S].base + s->memmap[VIRT_APLIC_S].size * socket; - gsi_base =3D VIRT_IRQCHIP_NUM_SOURCES * socket; + gsi_base =3D s->num_sources * socket; build_append_int_noprefix(table_data, 0x1A, 1); /* Type */ build_append_int_noprefix(table_data, 36, 1); /* Length */ build_append_int_noprefix(table_data, 1, 1); /* Version = */ diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index b76bbb62f888..8f80c0607b92 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1401,6 +1401,7 @@ static void virt_machine_init(MachineState *machine) } else { s->irqchip[i] =3D riscv_create_aia(s->aia_type =3D=3D VIRT_AIA= _TYPE_APLIC_IMSIC, s->aia_guests, + s->num_sources, &s->memmap[VIRT_APLIC_M], &s->memmap[VIRT_APLIC_S], &s->memmap[VIRT_IMSIC_M], @@ -1557,6 +1558,7 @@ static void virt_machine_instance_init(Object *obj) s->oem_table_id =3D g_strndup(ACPI_BUILD_APPNAME8, 8); s->acpi =3D ON_OFF_AUTO_AUTO; s->iommu_sys =3D ON_OFF_AUTO_AUTO; + s->num_sources =3D VIRT_IRQCHIP_NUM_SOURCES; } =20 static char *virt_get_aia_guests(Object *obj, Error **errp) --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787906900624.669564207533; Mon, 29 Jun 2026 19:51:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOYW-0004Fc-1z; Mon, 29 Jun 2026 22:50:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOYU-0004Ev-Ly for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:34 -0400 Received: from mail-pj1-x1035.google.com ([2607:f8b0:4864:20::1035]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOYT-0002Le-0t for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:34 -0400 Received: by mail-pj1-x1035.google.com with SMTP id 98e67ed59e1d1-37e0a189b0bso2112191a91.1 for ; Mon, 29 Jun 2026 19:50:32 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:50:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787831; x=1783392631; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=skdYhJTqd6ST5O5dhp4YffIjdJRjr5no/Dx8UOIavo8=; b=M0MZicOVTMIgWmua6tYVIC2/Oh52TN0i2LLvgCLthYvCKM97Iw1f1bzQwQxMs+pSYS rb80SFYm8mKzuR3w7rEtHWgLDhGxDHft/jtCKsPfsUk54hXaeW3nmXancJow+lismd1j t/qsuLSSyQWrEtB+tgROfxfynSB4Fq4DTds6F0jBKRshVtheJmaCJ/g8p8Uw42/p2poP QO/Ik/AimcGfhNjP5mJHlCyIVZIdDVfCz4WKup6HH4tepilt2Y4GjXHXGL8xPy5vFbrR 5RdIh9FgU9S3bI8YzJ+fikLnBoaGnM4LaQOAUjjpBuoX+Lv3YKUTcBLvD/sg1P0Gxdc/ Vm8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787831; x=1783392631; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=skdYhJTqd6ST5O5dhp4YffIjdJRjr5no/Dx8UOIavo8=; b=ZFESgF7LzNz3DnpJNe525Bw5N4LECvOqKHA8uEEQXfaZAtTR/HLWPtXQT6CcX9wwV4 bUsUX1xKMte0WILvi8eB6N5s5p+pouFuCKybTz26uzJmT7OYBxK0bHyPM8QS1M0schPK A9k0eAnul+6a3Xoa33TyYdYvlR40GOKxxlD/7ZYRCiQyZOZh3CCnWyQuk1vR34yB2v70 H2Cr1Vl4f4GcSS8rYsj/qSnt8Nxn0qFz1rLQSA4M5do90MeEvdpkVvOZFM74WFYHOcQn 6Fi3HcPbNTwLilf6FOAAecPn+ptU8WFQZOY70f2yWElt6XjToMi+aRXAwfED/H/hFmD2 C2OA== X-Forwarded-Encrypted: i=1; AHgh+RrpFhFcfA8IsZpZXS+V1zUSbarlXkBiaud9T5iHaUppXlVL2vff6nJEUku4qQizOO3JIir3fzkD2nSH@nongnu.org X-Gm-Message-State: AOJu0YxuIKfOLVm075D84wgAMi86vXapc5nJM/3yQ6mtFhFXUhh4Dey1 FuGH9jYTYRctGeZgDz1lIMZTa/HaeV8E6GlG0X2hjNyhaBOA0zzM/zcE X-Gm-Gg: AfdE7cknDPg3MxqGr5wWehTkO1riKM+dFUHX93HQdaAYyNO2FvSst6oAE6oMTQmNJfO Vev76YQILgoZqLyChL4IVMM1mGC02YwbPiRdPgDV1Z5u3X9H/4ApySjJkv1snuI2N607snm+qMa C3S5jB+tB7sOeaQvMW9lqZoIeMnqETuYBo0UY3PChLfWtMOUmSyeFlybF8noV9ee4msh/oYwL4s VNt0uI7sAfBp3kfUIM4ZyNZVizbBwkhiOjN6NQ0hUoXqNE4Kj7zut3SgX8QMvooESHDGx6O46Zp lFPn5W7AkCf5ofPI9qf8c1ROTksLYFTDJPHSKwYKcYr62cieR/o2tkMOAAGSqaZuvrCVD51lXEz 3dZGkdhfgeawbHe8sJaWju/94J5RVmMGuJyGX39vY5YurNqcucGdSzGy1QO8XmZ7gkRKhySsL6b eER+b/tmWuMhORTC3RdDHdmaUK2AD2IYpvLY1IFx/p+ZNgecbpYrmGuTPPtLwnPUmJfViD7PRrP awsMxpCsqD3xFsvHl5FF28BezFmYK5wu3eFzNw8yEw= X-Received: by 2002:a17:90b:554f:b0:37f:9cdf:f038 with SMTP id 98e67ed59e1d1-380527a8ea4mr1175010a91.27.1782787831251; Mon, 29 Jun 2026 19:50:31 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v10 05/12] hw/riscv/aia: Configure stride for the M-mode IMSIC Date: Tue, 30 Jun 2026 12:19:43 +0930 Message-ID: <20260630024952.1520546-6-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1035; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x1035.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787907543158501 riscv_create_aia() currently hard-codes the M-IMSIC at one 4 KiB page per hart and gives callers no way to widen it. Add an m_imsic_stride parameter that supplies the per hart byte stride directly. The virt machine passes IMSIC_HART_SIZE(0) (=3D 4 KiB), preserving its existing compact layout. The parameter only changes how the slots are spaced, with the rest of each slot reserved. This allows future platforms that have different layouts to control the stride. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis Signed-off-by: Joel Stanley --- hw/riscv/aia.h | 1 + hw/riscv/aia.c | 3 ++- hw/riscv/virt.c | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/riscv/aia.h b/hw/riscv/aia.h index 5ad0a902be0d..565f91accc09 100644 --- a/hw/riscv/aia.h +++ b/hw/riscv/aia.h @@ -14,6 +14,7 @@ uint32_t imsic_num_bits(uint32_t count); =20 DeviceState *riscv_create_aia(bool msimode, int aia_guests, + uint32_t m_imsic_stride, uint16_t num_sources, const MemMapEntry *aplic_m, const MemMapEntry *aplic_s, diff --git a/hw/riscv/aia.c b/hw/riscv/aia.c index 82ea9d48ea75..ed8916002945 100644 --- a/hw/riscv/aia.c +++ b/hw/riscv/aia.c @@ -25,6 +25,7 @@ uint32_t imsic_num_bits(uint32_t count) } =20 DeviceState *riscv_create_aia(bool msimode, int aia_guests, + uint32_t m_imsic_stride, uint16_t num_sources, const MemMapEntry *aplic_m, const MemMapEntry *aplic_s, @@ -47,7 +48,7 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guest= s, /* Per-socket M-level IMSICs */ addr =3D imsic_m->base + socket * (1U << IMSIC_MMIO_GROUP_MIN_= SHIFT); for (i =3D 0; i < hart_count; i++) { - riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0), + riscv_imsic_create(addr + i * m_imsic_stride, base_hartid + i, true, 1, num_msis); } diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 8f80c0607b92..b68067cfddd4 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1401,6 +1401,7 @@ static void virt_machine_init(MachineState *machine) } else { s->irqchip[i] =3D riscv_create_aia(s->aia_type =3D=3D VIRT_AIA= _TYPE_APLIC_IMSIC, s->aia_guests, + IMSIC_HART_SIZE(0), s->num_sources, &s->memmap[VIRT_APLIC_M], &s->memmap[VIRT_APLIC_S], --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787978706367.6804050546684; Mon, 29 Jun 2026 19:52:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOYc-0004HU-5n; Mon, 29 Jun 2026 22:50:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOYa-0004Gy-NR for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:40 -0400 Received: from mail-pj1-x102a.google.com ([2607:f8b0:4864:20::102a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOYZ-0002OG-8g for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:40 -0400 Received: by mail-pj1-x102a.google.com with SMTP id 98e67ed59e1d1-37ff798fe89so1055571a91.1 for ; Mon, 29 Jun 2026 19:50:38 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:50:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787838; x=1783392638; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=YlDwRDlBQ/gUwrgfwu6cin/6C44gvUhKFn8kgeqaXU4=; b=sUEAB32VSOt84zOJfeBW1bqEenxPnwhrN29P4w9RepYuAusmm5s8H4O2F5lJacu68k d2hQ/bly0wi+UUFaV+nKCNDYHb3JHwWzcMP1oZ+0Vy+CEEXYUFKl8pX4ZCUKMdXQzKYz CSE4cOuxiy/8TOwTJ4QqD3uUaFv3UwnMkVgfScq1CyY2ZwukJjDnmKyBsYzC/4sqcKeI PQGbE4576JMQNfHr+rw56JbHfaiCN++X6zKH6sRzpgGx3SC711f2UkdE05F90GCmp0bk qkkWsB3F9z0mwJsqGVatS5sYEaVWYqHixvWrC0JabAePG2x2He0EZx6ih2IK+e+4rXWU SXwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787838; x=1783392638; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YlDwRDlBQ/gUwrgfwu6cin/6C44gvUhKFn8kgeqaXU4=; b=TP/+/FVUh3SPEcIzPonFGowgAX5SVGa4/uVVa8jzeqkQ8lLimDplAfUd0kssOC5gVg X0VKAvcA4fyh97x2rRPaNQLll0k+pn42Q6hyQg7kcsraUQ0nOUu0oYO8pdAUoqHUSsbg vBSqY53zjmAnwlGyQ2zZduLVAQ2wFJ6MTY9QWcpu5h8tp+zCGvgn9G9cQjPpDitq2VP/ UZf8FgJIMUm2t8JC7OQXp7VI87md5Vn92QNjG2AFpC8ELcfFO4AeqBAKE3DhIYEjtHNg R2pWSMm9Dv2VjJ74z3yasqu0SO3Wq9SYlBKO9d9yzugUecgFO0P16ECPntpI3lVN95QT U1IA== X-Forwarded-Encrypted: i=1; AHgh+RpRH6bX8/RGxDS+ZKOR8Awya2CsWINFPfFTIHr9m1Ql/wmGlkcBwXPzeYAAPbMC7o6w//eJNFEbRYgM@nongnu.org X-Gm-Message-State: AOJu0YwplFNI1K+kS35FF40nk9Z4Oq7bkWNrGBhEn9MKfIsNiBkSLoFl NU1oW5UUmlG3uFMrQ4QWiU4ZCnG5kLRoPCxlcrja6TEBSbrxHDY6n6iy X-Gm-Gg: AfdE7clTTQ4uY0LY9GSmONz39m1GDHyl7LCnNfmUgOYJ4z8dZvN3jYXZ9KzC+Vs9ZAh UdQwu3vYYsIOzuONJ07EpPGEj5ug69uMtlJVELjXfPQXR8CJYW+C7R2Anm7OSTdrazXL01BXPl3 0F3r1B3zKooFdfE9SJMQtz0h8M27ZjZtt2mNBws9+NTAgLUgQuepIy8GDnOCsUHl7PB0DykWmsd pJBjqlUw4fLMrJ3iUt/THHs1ik4N6mLHvkEAmtscB0V+Y+b3IFbF+nbX+r7XhqZt8o6wUaLo2U+ m3LFVZ0o2ugE1zr+lhc1/IvPY2QVkfhasdD4mhPUAtXS2RZcbYZPQ2ybADpOOGQff/2PjlGXooT 3QwGdIo/+tUjxGWuWsYVh4bgweVKcE7RFA1nEwrGO0MHpUunvb11nFUN0X5p1hGh2KVID3F3W9k p1EQX1obkMAAIhkBTlXhSSNFwMars8dSy8iZ47F9NA1YK4tPT+wBZNs8XE5GAKJ2LiyOx2RgbbN ApPs5YdM5fVfbcInBuiL9VFyHJVPoDj7j3Y1F7zTuI= X-Received: by 2002:a17:90b:2808:b0:37f:b0a9:1a55 with SMTP id 98e67ed59e1d1-380525651b9mr1245645a91.11.1782787837638; Mon, 29 Jun 2026 19:50:37 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v10 06/12] target/riscv: tt-ascalon: Enable Zkr extension Date: Tue, 30 Jun 2026 12:19:44 +0930 Message-ID: <20260630024952.1520546-7-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102a; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x102a.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787979751158500 Content-Type: text/plain; charset="utf-8" From: Nicholas Piggin Ascalon supports Zkr and the SEED CSR. Reviewed-by: Chao Liu Reviewed-by: Alistair Francis Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley --- target/riscv/cpu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index bff3ed5de142..1b4061b2c7d0 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -3240,6 +3240,7 @@ static const TypeInfo riscv_cpu_type_infos[] =3D { .cfg.ext_zba =3D true, .cfg.ext_zbb =3D true, .cfg.ext_zbs =3D true, + .cfg.ext_zkr =3D true, .cfg.ext_zkt =3D true, .cfg.ext_zvbb =3D true, .cfg.ext_zvbc =3D true, --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787886508468.6392203853055; Mon, 29 Jun 2026 19:51:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOYi-0004Lx-K3; Mon, 29 Jun 2026 22:50:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOYh-0004KH-Qr for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:47 -0400 Received: from mail-pj1-x102a.google.com ([2607:f8b0:4864:20::102a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOYe-0002We-RW for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:47 -0400 Received: by mail-pj1-x102a.google.com with SMTP id 98e67ed59e1d1-37dedd62b90so95655a91.1 for ; Mon, 29 Jun 2026 19:50:44 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:50:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787843; x=1783392643; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=0ulS4xGD+HdAOcdls1yd5oo2G+xv75Rb/XAwPAIO9Fo=; b=RgrsI1tt7R3bceVCD9JbtIbJi9kfD408P7HWXVUUK3yDRrnRiS9K+dpCWvihHipGMP uTVcKSNv9naLTNfnN8mm5Yy7cQPsarOqElotNx/LqBKiABhTLyp83XZCwsFiT9frEbRj VJVP2qxzXcoKh9l/p6+lx767G4PQXTOccCBICNDYCIeozDyWaxn89xYPcpw9m04ahmJZ /YBMD9eA5ll+24c3ozQ3JdbOGf2nX8IHgZdzyrL/7LDc5GKO/YO9zxMgzgYgOdRVO4RJ qrBbJdrIf6evj8unNb/2pWcy9dunfeceEX1qm3p0UAX957boTEnoSOnooWPIg32lSDhZ KRyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787843; x=1783392643; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=0ulS4xGD+HdAOcdls1yd5oo2G+xv75Rb/XAwPAIO9Fo=; b=cET/jg+XtMacoouXQpCzoc4gjIq0Jtpf++vhsATRlr2ze/v+8eZn5O1yJAd87JqMbL 0HmauBrtnszziZxm2dU4YJ5UOkWVQO9bCIL2t8Z2zdKcYcW8hyG8aMT6JPCrx32doMWT FQk8+SDO8oSTnBzLBFo3uEeZpEM1Qf6jmXbhDqcKIvLgrW0bvk3JmVqBCKhC/q1pu8Fm 17aL9qXwBb73wDLQYRO8U/d/8UAC8AwQR40rDIZ4CojxhmlJU3qDcv3Ri5xWvY3yJTiT fb7RcoL3ko+DXy6ufqVnHDq1ZurWeH/a4+0SwxXQOlcdjOwpMaYqcxO4Ia+npGJG/Xqt W2SA== X-Forwarded-Encrypted: i=1; AHgh+RradFn8VY7LXvFJRwoaMQAbU4guMmS+63GVIPJwplUfzzoVPPHa5N1fS49qsiGP1tvVKaSvtDeyA7cC@nongnu.org X-Gm-Message-State: AOJu0YyE6FJJ5lntS5yD1q0f3gt1H+tLY1Zg0KwIAGsKXo8r7zXh1WaE neEkBZEql92nvAz6o090ptSNzfUmOVp0pTISxamt3tVzFks4XzcXwuYr X-Gm-Gg: AfdE7ckaAI7BKPz1IYSdRyD7j7thyVaoHjDMHoKJhsXZIY98DwN5S4vf1Q63VecNS8W Rbfxo9re4HebKT7190gYv0tjwFi4JR7bCA8ejhKj/D598Toj4f109IuKQ18uwkjTXrDWON0himh oQu2Ww5us1EqojfON7v7WT4vKGo5DhJfwXGx257or7Tfq7YADEpO9frzN59RO8vyt7/dnGrbpsC hWYZV4XKb7I/lJcnY6C1ZIaB1tHxUhrpFs6LTkOS6+YS7EH+nGyBddw2u3qVEyBXDjOqpd/Clfn 9Pfag76Xf/x0BDDUpJ+U6tqHCdrgSbRUgzP6snXZ+iHZmhIWS1xVbMeUk1QFSoXHSBOq6rA7fM8 2sc/UDYIq+6GmHWBSb5199X2yf+LHcsX2D80cl34UcIINmFpvXc+3YXpp3Zz5QSa2LQivR4cdHF 9dWEcO0pnzHkuN014Jf2DcvO9FTeAnfWLE1okoNm/qS/r31/x6xIdlI1++nJMxCl4Ms/WxAEfEl rOyvHa6OiTu+5rCxLlzPHFV0Dnj116k4OOA4tcpzVU= X-Received: by 2002:a17:90b:4b0d:b0:37f:9e21:91d7 with SMTP id 98e67ed59e1d1-380690b7028mr4665a91.14.1782787843250; Mon, 29 Jun 2026 19:50:43 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v10 07/12] hw/riscv: Add Tenstorrent Atlantis machine Date: Tue, 30 Jun 2026 12:19:45 +0930 Message-ID: <20260630024952.1520546-8-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102a; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x102a.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787890215158500 The Tenstorrent Atlantis platform is a collaboration between Tenstorrent and CoreLab Technology. It is based on the Atlantis SoC, which includes the Ascalon-X CPU and other IP from Tenstorrent and CoreLab Technology. The Tenstorrent Ascalon-X is a high performance 64-bit RVA23 compliant RISC-V CPU. Add the tt-atlantis machine containing serial console, interrupt controllers, and device tree support. The Atlantis boot images loaded from include OpenSBI and an initial DTB that is passed to OpenSBI. This is approximated in the model by having QEMU build the device tree rather than load a DTB image directly. Subsequent stages may use the modified DTB provided by OpenSBI or opt to supply their own. qemu-system-riscv64 -M tt-atlantis -m 512M \ -kernel Image -initrd rootfs.cpio -nographic Co-Developed-by: Nicholas Piggin Signed-off-by: Nicholas Piggin Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Chao Liu Signed-off-by: Joel Stanley Reviewed-by: Alistair Francis --- MAINTAINERS | 12 + docs/system/riscv/tt_atlantis.rst | 41 +++ docs/system/target-riscv.rst | 1 + include/hw/riscv/tt_atlantis.h | 50 +++ hw/riscv/tt_atlantis.c | 523 ++++++++++++++++++++++++++++++ hw/riscv/Kconfig | 10 + hw/riscv/meson.build | 1 + 7 files changed, 638 insertions(+) create mode 100644 docs/system/riscv/tt_atlantis.rst create mode 100644 include/hw/riscv/tt_atlantis.h create mode 100644 hw/riscv/tt_atlantis.c diff --git a/MAINTAINERS b/MAINTAINERS index 72357df7c4b7..0d7c7720d9f2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1774,6 +1774,18 @@ F: hw/*/*sifive*.c F: include/hw/*/*sifive*.h F: tests/functional/riscv64/test_sifive_u.py =20 +Tenstorrent Machines +M: Joel Stanley +M: Nicholas Piggin +R: Anirudh Srinivasan +R: Michael Ellerman +R: Portia Stephens +L: qemu-riscv@nongnu.org +S: Supported +F: docs/system/riscv/tt_*.rst +F: hw/riscv/tt_*.c +F: include/hw/riscv/tt_*.h + AMD Microblaze-V Generic Board M: Sai Pavan Boddu S: Maintained diff --git a/docs/system/riscv/tt_atlantis.rst b/docs/system/riscv/tt_atlan= tis.rst new file mode 100644 index 000000000000..1f2880d61773 --- /dev/null +++ b/docs/system/riscv/tt_atlantis.rst @@ -0,0 +1,41 @@ +Tenstorrent Atlantis (``tt-atlantis``) +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The Tenstorrent Atlantis platform is a collaboration between Tenstorrent +and CoreLab Technology. It is based on the Atlantis SoC, which includes +the Ascalon-X CPU and other IP from Tenstorrent and CoreLab Technology. + +The Tenstorrent Ascalon-X is a high performance 64-bit RVA23 compliant +RISC-V CPU. + +tt-atlantis QEMU model features +------------------------------- + +* 8-core Ascalon-X CPU Cluster +* RISC-V compliant Advanced Interrupt Architecture +* 16550A compatible UART + +Known limitations +----------------- + +The QEMU tt-atlantis machine does not yet model every device on the +real platform. Notably: + +* There is no PCI host bridge, so virtio-pci devices cannot be + attached. Boots that need block storage must use ``-initrd`` with + an initramfs. +* The DesignWare UART is modelled with QEMU's ns16550-compatible + ``serial_mm`` device; DesignWare-specific registers beyond that + set return 0. + +Supported software +------------------ + +The Tenstorrent Ascalon CPUs avoid proprietary or non-standard +extensions, so compatibility with existing software is generally +good. The QEMU tt-atlantis machine works with upstream OpenSBI +and Linux with default configurations. + +The development board hardware will require some implementation +specific setup in firmware which is being developed and may +become a requirement or option for the tt-atlantis machine. diff --git a/docs/system/target-riscv.rst b/docs/system/target-riscv.rst index 896f14e78bd0..2639866a3e8a 100644 --- a/docs/system/target-riscv.rst +++ b/docs/system/target-riscv.rst @@ -72,6 +72,7 @@ undocumented; you can get a complete list by running riscv/mips riscv/shakti-c riscv/sifive_u + riscv/tt_atlantis riscv/virt riscv/xiangshan-kunminghu =20 diff --git a/include/hw/riscv/tt_atlantis.h b/include/hw/riscv/tt_atlantis.h new file mode 100644 index 000000000000..a17732ce8114 --- /dev/null +++ b/include/hw/riscv/tt_atlantis.h @@ -0,0 +1,50 @@ +/* + * Tenstorrent Atlantis RISC-V System on Chip + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright 2025 Tenstorrent, Joel Stanley + */ + +#ifndef HW_RISCV_TT_ATLANTIS_H +#define HW_RISCV_TT_ATLANTIS_H + +#include "hw/core/boards.h" +#include "hw/core/sysbus.h" +#include "hw/intc/riscv_imsic.h" +#include "hw/riscv/riscv_hart.h" + +#define TYPE_TT_ATLANTIS_MACHINE MACHINE_TYPE_NAME("tt-atlantis") +OBJECT_DECLARE_SIMPLE_TYPE(TTAtlantisState, TT_ATLANTIS_MACHINE) + +struct TTAtlantisState { + /*< private >*/ + MachineState parent; + + /*< public >*/ + Notifier machine_done; + const MemMapEntry *memmap; + + RISCVHartArrayState soc; + DeviceState *irqchip; + + int fdt_size; +}; + +enum { + TT_ATL_UART1_IRQ =3D 39, +}; + +enum { + TT_ATL_ACLINT, + TT_ATL_BOOTROM, + TT_ATL_DDR_LO, + TT_ATL_DDR_HI, + TT_ATL_MAPLIC, + TT_ATL_MIMSIC, + TT_ATL_SAPLIC, + TT_ATL_SIMSIC, + TT_ATL_UART1, +}; + +#endif diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c new file mode 100644 index 000000000000..1f0cd08ac959 --- /dev/null +++ b/hw/riscv/tt_atlantis.c @@ -0,0 +1,523 @@ +/* + * Tenstorrent Atlantis RISC-V System on Chip + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright 2025 Tenstorrent, Joel Stanley + */ + +#include "qemu/osdep.h" +#include "qemu/cutils.h" +#include "qemu/error-report.h" +#include "qemu/guest-random.h" +#include "qemu/units.h" + +#include "hw/core/boards.h" +#include "hw/core/loader.h" +#include "hw/core/sysbus.h" + +#include "target/riscv/cpu.h" +#include "target/riscv/pmu.h" + +#include "hw/riscv/boot.h" +#include "hw/riscv/fdt-common.h" +#include "hw/riscv/machines-qom.h" +#include "hw/riscv/riscv_hart.h" + +#include "hw/char/serial-mm.h" +#include "hw/intc/riscv_aclint.h" +#include "hw/misc/unimp.h" + +#include "system/system.h" +#include "system/device_tree.h" + +#include "hw/riscv/tt_atlantis.h" + +#include "aia.h" + +#define TT_IRQCHIP_NUM_MSIS 255 +#define TT_IRQCHIP_NUM_SOURCES 128 +#define TT_IRQCHIP_NUM_PRIO_BITS 3 +#define TT_IRQCHIP_GUESTS 63 /* aia_guests, gives guest_index_bits= =3D6 */ +#define TT_IRQCHIP_MIMSIC_STRIDE 0x40000 + +#define TT_ACLINT_MTIME_SIZE 0x8050 +#define TT_ACLINT_MTIME 0x0 +#define TT_ACLINT_MTIMECMP 0x8000 +#define TT_ACLINT_TIMEBASE_FREQ 1000000000 + +static const MemMapEntry tt_atlantis_memmap[] =3D { + /* Keep sorted with :'<,'>!sort -g -k 4 */ + [TT_ATL_DDR_LO] =3D { 0x00000000, 0x80000000 }, + [TT_ATL_BOOTROM] =3D { 0x80000000, 0x2000 }, + [TT_ATL_MIMSIC] =3D { 0xa0000000, 0x200000 }, + [TT_ATL_ACLINT] =3D { 0xa2180000, 0x10000 }, + [TT_ATL_SIMSIC] =3D { 0xa4000000, 0x200000 }, + [TT_ATL_MAPLIC] =3D { 0xcc000000, 0x4000000 }, + [TT_ATL_UART1] =3D { 0xd4110000, 0x10000 }, + [TT_ATL_SAPLIC] =3D { 0xe8000000, 0x4000000 }, + [TT_ATL_DDR_HI] =3D { 0x100000000, 0x1000000000 }, +}; + +static uint32_t fdt_phandle =3D 1; +static uint32_t next_phandle(void) +{ + return fdt_phandle++; +} + +static void create_fdt_memory(TTAtlantisState *s) +{ + void *fdt =3D MACHINE(s)->fdt; + hwaddr size_lo =3D MACHINE(s)->ram_size; + hwaddr size_hi =3D 0; + + if (size_lo > s->memmap[TT_ATL_DDR_LO].size) { + size_lo =3D s->memmap[TT_ATL_DDR_LO].size; + size_hi =3D MACHINE(s)->ram_size - size_lo; + } + + create_fdt_socket_memory(fdt, s->memmap[TT_ATL_DDR_LO].base, size_lo, + 0, false); + if (size_hi) { + /* + * The first part of the HI address is aliased at the LO address + * so do not include that as usable memory. Is there any way + * (or good reason) to describe that aliasing 2GB with DT? + */ + create_fdt_socket_memory(fdt, s->memmap[TT_ATL_DDR_HI].base + size= _lo, + size_hi, 0, false); + } +} + +static void create_fdt_aclint(TTAtlantisState *s, uint32_t *intc_phandles) +{ + void *fdt =3D MACHINE(s)->fdt; + g_autofree char *name =3D NULL; + g_autofree uint32_t *aclint_mtimer_cells =3D NULL; + uint32_t aclint_cells_size; + hwaddr addr; + + aclint_mtimer_cells =3D g_new0(uint32_t, s->soc.num_harts * 2); + + for (int cpu =3D 0; cpu < s->soc.num_harts; cpu++) { + aclint_mtimer_cells[cpu * 2 + 0] =3D cpu_to_be32(intc_phandles[cpu= ]); + aclint_mtimer_cells[cpu * 2 + 1] =3D cpu_to_be32(IRQ_M_TIMER); + } + aclint_cells_size =3D s->soc.num_harts * sizeof(uint32_t) * 2; + + addr =3D s->memmap[TT_ATL_ACLINT].base; + + name =3D g_strdup_printf("/soc/mtimer@%"HWADDR_PRIX, addr); + qemu_fdt_add_subnode(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", "riscv,aclint-mtimer"= ); + qemu_fdt_setprop_sized_cells(fdt, name, "reg", + 2, addr + TT_ACLINT_MTIME, + 2, 0x1000, + 2, addr + TT_ACLINT_MTIMECMP, + 2, 0x1000); + qemu_fdt_setprop(fdt, name, "interrupts-extended", + aclint_mtimer_cells, aclint_cells_size); +} + +static void create_fdt_one_imsic(void *fdt, const MemMapEntry *mem, int cp= us, + uint32_t *intc_phandles, uint32_t msi_pha= ndle, + int irq_line, uint32_t imsic_guest_bits) +{ + g_autofree char *name =3D NULL; + g_autofree uint32_t *imsic_cells =3D g_new0(uint32_t, cpus * 2); + + for (int cpu =3D 0; cpu < cpus; cpu++) { + imsic_cells[cpu * 2 + 0] =3D cpu_to_be32(intc_phandles[cpu]); + imsic_cells[cpu * 2 + 1] =3D cpu_to_be32(irq_line); + } + + name =3D g_strdup_printf("/soc/interrupt-controller@%"HWADDR_PRIX, mem= ->base); + qemu_fdt_add_subnode(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", "riscv,imsics"); + + qemu_fdt_setprop_cell(fdt, name, "#interrupt-cells", 0); + qemu_fdt_setprop(fdt, name, "interrupt-controller", NULL, 0); + qemu_fdt_setprop(fdt, name, "msi-controller", NULL, 0); + qemu_fdt_setprop(fdt, name, "interrupts-extended", + imsic_cells, sizeof(uint32_t) * cpus * 2); + qemu_fdt_setprop_sized_cells(fdt, name, "reg", 2, mem->base, 2, mem->s= ize); + qemu_fdt_setprop_cell(fdt, name, "riscv,num-ids", TT_IRQCHIP_NUM_MSIS); + + if (imsic_guest_bits) { + qemu_fdt_setprop_cell(fdt, name, "riscv,guest-index-bits", + imsic_guest_bits); + } + qemu_fdt_setprop_cell(fdt, name, "phandle", msi_phandle); +} + +static void create_fdt_one_aplic(void *fdt, + const MemMapEntry *mem, + uint32_t msi_phandle, + uint32_t *intc_phandles, + uint32_t aplic_phandle, + uint32_t aplic_child_phandle, + int irq_line, int num_harts) +{ + g_autofree char *name =3D + g_strdup_printf("/soc/interrupt-controller@%"HWADDR_PRIX, mem->bas= e); + g_autofree uint32_t *aplic_cells =3D g_new0(uint32_t, num_harts * 2); + + for (int cpu =3D 0; cpu < num_harts; cpu++) { + aplic_cells[cpu * 2 + 0] =3D cpu_to_be32(intc_phandles[cpu]); + aplic_cells[cpu * 2 + 1] =3D cpu_to_be32(irq_line); + } + + qemu_fdt_add_subnode(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", "riscv,aplic"); + qemu_fdt_setprop_cell(fdt, name, "#address-cells", 0); + qemu_fdt_setprop_cell(fdt, name, "#interrupt-cells", 2); + qemu_fdt_setprop(fdt, name, "interrupt-controller", NULL, 0); + + qemu_fdt_setprop(fdt, name, "interrupts-extended", + aplic_cells, num_harts * sizeof(uint32_t) * 2); + qemu_fdt_setprop_cell(fdt, name, "msi-parent", msi_phandle); + + qemu_fdt_setprop_sized_cells(fdt, name, "reg", 2, mem->base, 2, mem->s= ize); + qemu_fdt_setprop_cell(fdt, name, "riscv,num-sources", + TT_IRQCHIP_NUM_SOURCES); + + if (aplic_child_phandle) { + qemu_fdt_setprop_cell(fdt, name, "riscv,children", + aplic_child_phandle); + qemu_fdt_setprop_cells(fdt, name, "riscv,delegation", + aplic_child_phandle, 1, TT_IRQCHIP_NUM_SOUR= CES); + } + + qemu_fdt_setprop_cell(fdt, name, "phandle", aplic_phandle); +} + +static void create_fdt_pmu(TTAtlantisState *s) +{ + char pmu_name[] =3D "/pmu"; + void *fdt =3D MACHINE(s)->fdt; + RISCVCPU *hart =3D &s->soc.harts[0]; + + qemu_fdt_add_subnode(fdt, pmu_name); + qemu_fdt_setprop_string(fdt, pmu_name, "compatible", "riscv,pmu"); + riscv_pmu_generate_fdt_node(fdt, hart->pmu_avail_ctrs, pmu_name); +} + +static void create_fdt_cpu(TTAtlantisState *s, const MemMapEntry *memmap, + uint32_t aplic_s_phandle, + uint32_t imsic_s_phandle) +{ + MachineState *ms =3D MACHINE(s); + void *fdt =3D MACHINE(s)->fdt; + g_autofree uint32_t *intc_phandles =3D g_new0(uint32_t, ms->smp.cpus); + + fdt_create_cpu_socket_subnode(fdt, TT_ACLINT_TIMEBASE_FREQ); + + create_fdt_socket_cpus(fdt, s->soc.harts, 0, s->soc.num_harts, + s->soc.hartid_base, &fdt_phandle, intc_phandles, + false, false); + + create_fdt_memory(s); + + create_fdt_aclint(s, intc_phandles); + + uint32_t imsic_guest_bits =3D imsic_num_bits(TT_IRQCHIP_GUESTS + 1); + + /* M-level IMSIC node */ + uint32_t msi_m_phandle =3D next_phandle(); + create_fdt_one_imsic(fdt, &s->memmap[TT_ATL_MIMSIC], ms->smp.cpus, + intc_phandles, msi_m_phandle, + IRQ_M_EXT, imsic_guest_bits); + + /* S-level IMSIC node */ + create_fdt_one_imsic(fdt, &s->memmap[TT_ATL_SIMSIC], ms->smp.cpus, + intc_phandles, imsic_s_phandle, + IRQ_S_EXT, imsic_guest_bits); + + uint32_t aplic_m_phandle =3D next_phandle(); + + /* M-level APLIC node */ + create_fdt_one_aplic(fdt, &s->memmap[TT_ATL_MAPLIC], + msi_m_phandle, intc_phandles, + aplic_m_phandle, aplic_s_phandle, + IRQ_M_EXT, s->soc.num_harts); + + /* S-level APLIC node */ + create_fdt_one_aplic(fdt, &s->memmap[TT_ATL_SAPLIC], + imsic_s_phandle, intc_phandles, + aplic_s_phandle, 0, + IRQ_S_EXT, s->soc.num_harts); +} + +static void create_fdt_uart(void *fdt, const MemMapEntry *mem, int irq, + int irqchip_phandle) +{ + g_autofree char *name =3D g_strdup_printf("/soc/serial@%"HWADDR_PRIX, + mem->base); + + qemu_fdt_add_subnode(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", "ns16550a"); + qemu_fdt_setprop_sized_cells(fdt, name, "reg", 2, mem->base, 2, mem->s= ize); + qemu_fdt_setprop_cell(fdt, name, "reg-shift", 2); + qemu_fdt_setprop_cell(fdt, name, "reg-io-width", 4); + qemu_fdt_setprop_cell(fdt, name, "clock-frequency", 3686400); + qemu_fdt_setprop_cell(fdt, name, "interrupt-parent", irqchip_phandle); + qemu_fdt_setprop_cells(fdt, name, "interrupts", irq, 0x4); + + qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", name); + qemu_fdt_setprop_string(fdt, "/aliases", "serial0", name); +} + +static void create_fdt_rng(void *fdt) +{ + uint8_t rng_seed[32]; + + qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed)); + qemu_fdt_setprop(fdt, "/chosen", "rng-seed", rng_seed, sizeof(rng_seed= )); +} + +static void finalize_fdt(TTAtlantisState *s) +{ + uint32_t aplic_s_phandle =3D next_phandle(); + uint32_t imsic_s_phandle =3D next_phandle(); + void *fdt =3D MACHINE(s)->fdt; + + create_fdt_cpu(s, s->memmap, aplic_s_phandle, imsic_s_phandle); + + /* + * We want to do this, but the Linux aplic driver was broken before v6= .16 + * + * qemu_fdt_setprop_cell(MACHINE(s)->fdt, "/soc", "interrupt-parent", + * aplic_s_phandle); + */ + + create_fdt_uart(fdt, &s->memmap[TT_ATL_UART1], TT_ATL_UART1_IRQ, + aplic_s_phandle); +} + +static void create_fdt(TTAtlantisState *s) +{ + MachineState *ms =3D MACHINE(s); + + ms->fdt =3D create_board_device_tree("Tenstorrent Atlantis RISC-V Mach= ine", + "tenstorrent,atlantis", &s->fdt_siz= e); + + qemu_fdt_add_subnode(ms->fdt, "/chosen"); + + create_fdt_rng(ms->fdt); + + qemu_fdt_add_subnode(ms->fdt, "/aliases"); + + create_fdt_pmu(s); +} + +static void load_fdt(TTAtlantisState *s) +{ + MachineState *ms =3D MACHINE(s); + char **node_path; + Error *err =3D NULL; + + ms->fdt =3D load_device_tree(ms->dtb, &s->fdt_size); + if (!ms->fdt) { + error_report("load_device_tree() failed"); + exit(1); + } + + qemu_fdt_add_path(ms->fdt, "/chosen"); + + /* Clear memory nodes and update with the specified RAM size */ + node_path =3D qemu_fdt_node_unit_path(ms->fdt, "memory", &err); + if (err) { + warn_report_err(err); + } else { + for (int i =3D 0; node_path[i]; i++) { + warn_report("Replacing device tree %s with the requested RAM s= ize", + node_path[i]); + qemu_fdt_nop_node(ms->fdt, node_path[i]); + } + g_strfreev(node_path); + } + + create_fdt_memory(s); +} + +static void tt_atlantis_machine_done(Notifier *notifier, void *data) +{ + TTAtlantisState *s =3D container_of(notifier, TTAtlantisState, machine= _done); + MachineState *machine =3D MACHINE(s); + hwaddr start_addr =3D s->memmap[TT_ATL_DDR_LO].base; + hwaddr mem_size; + target_ulong firmware_end_addr, kernel_start_addr; + const char *firmware_name =3D riscv_default_firmware_name(&s->soc); + uint64_t fdt_load_addr; + uint64_t kernel_entry; + RISCVBootInfo boot_info; + + /* + * A user provided dtb must include everything, including + * dynamic sysbus devices. Our FDT needs to be finalized. + */ + if (machine->dtb =3D=3D NULL) { + finalize_fdt(s); + } + + mem_size =3D machine->ram_size; + if (mem_size > s->memmap[TT_ATL_DDR_LO].size) { + mem_size =3D s->memmap[TT_ATL_DDR_LO].size; + } + riscv_boot_info_init_discontig_mem(&boot_info, &s->soc, + s->memmap[TT_ATL_DDR_LO].base, + mem_size); + + firmware_end_addr =3D riscv_find_and_load_firmware(machine, &boot_info, + firmware_name, + &start_addr, NULL); + + kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_info, + firmware_end_addr); + if (machine->kernel_filename) { + riscv_load_kernel(machine, &boot_info, kernel_start_addr, + true, NULL); + } + kernel_entry =3D boot_info.image_low_addr; + + fdt_load_addr =3D riscv_compute_fdt_addr(s->memmap[TT_ATL_DDR_LO].base, + s->memmap[TT_ATL_DDR_LO].size, + machine, &boot_info); + riscv_load_fdt(fdt_load_addr, machine->fdt); + + /* load the reset vector */ + riscv_setup_rom_reset_vec(machine, &s->soc, start_addr, + s->memmap[TT_ATL_BOOTROM].base, + s->memmap[TT_ATL_BOOTROM].size, + kernel_entry, + fdt_load_addr); +} + +static void tt_atlantis_machine_init(MachineState *machine) +{ + TTAtlantisState *s =3D TT_ATLANTIS_MACHINE(machine); + + MemoryRegion *system_memory =3D get_system_memory(); + MemoryRegion *ram_hi =3D g_new(MemoryRegion, 1); + MemoryRegion *ram_lo =3D g_new(MemoryRegion, 1); + MemoryRegion *bootrom =3D g_new(MemoryRegion, 1); + ram_addr_t lo_ram_size; + int hart_count =3D machine->smp.cpus; + + s->memmap =3D tt_atlantis_memmap; + + object_initialize_child(OBJECT(machine), "soc", &s->soc, + TYPE_RISCV_HART_ARRAY); + object_property_set_str(OBJECT(&s->soc), "cpu-type", machine->cpu_type, + &error_abort); + object_property_set_int(OBJECT(&s->soc), "hartid-base", 0, + &error_abort); + object_property_set_int(OBJECT(&s->soc), "num-harts", hart_count, + &error_abort); + object_property_set_int(OBJECT(&s->soc), "resetvec", + s->memmap[TT_ATL_BOOTROM].base, + &error_abort); + sysbus_realize(SYS_BUS_DEVICE(&s->soc), &error_fatal); + + s->irqchip =3D riscv_create_aia(true, TT_IRQCHIP_GUESTS, + TT_IRQCHIP_MIMSIC_STRIDE, + TT_IRQCHIP_NUM_SOURCES, + &s->memmap[TT_ATL_MAPLIC], + &s->memmap[TT_ATL_SAPLIC], + &s->memmap[TT_ATL_MIMSIC], + &s->memmap[TT_ATL_SIMSIC], + 0, 0, hart_count, + TT_IRQCHIP_NUM_MSIS, + TT_IRQCHIP_NUM_PRIO_BITS); + + riscv_aclint_mtimer_create(s->memmap[TT_ATL_ACLINT].base, + TT_ACLINT_MTIME_SIZE, + 0, hart_count, + TT_ACLINT_MTIMECMP, + TT_ACLINT_MTIME, + TT_ACLINT_TIMEBASE_FREQ, true); + + /* + * DDR + * + * The high address is where RAM lives. It is always present and may be + * up to 64GB. The low address is an alias of the first 2GB of that RA= M. + */ + if (machine->ram_size > s->memmap[TT_ATL_DDR_HI].size) { + char *sz =3D size_to_str(s->memmap[TT_ATL_DDR_HI].size); + error_report("RAM size is too large, maximum is %s", sz); + g_free(sz); + exit(EXIT_FAILURE); + } + + memory_region_init_alias(ram_hi, OBJECT(machine), "ram.high", machine-= >ram, + 0, machine->ram_size); + memory_region_add_subregion(system_memory, + s->memmap[TT_ATL_DDR_HI].base, ram_hi); + + lo_ram_size =3D MIN(machine->ram_size, s->memmap[TT_ATL_DDR_LO].size); + memory_region_init_alias(ram_lo, OBJECT(machine), "ram.low", machine->= ram, + 0, lo_ram_size); + memory_region_add_subregion(system_memory, + s->memmap[TT_ATL_DDR_LO].base, ram_lo); + + /* Boot ROM */ + memory_region_init_rom(bootrom, NULL, "tt-atlantis.bootrom", + s->memmap[TT_ATL_BOOTROM].size, &error_fatal); + memory_region_add_subregion(system_memory, s->memmap[TT_ATL_BOOTROM].b= ase, + bootrom); + + /* UART1, the soc console (UART0 is for the boot microcontroller) */ + serial_mm_init(system_memory, s->memmap[TT_ATL_UART1].base, 2, + qdev_get_gpio_in(s->irqchip, TT_ATL_UART1_IRQ), + 115200, serial_hd(0), DEVICE_LITTLE_ENDIAN); + /* + * Atlantis contains a DesignWare uart while the QEMU machine + * uses the serial_mm model with the base ns16550 register set. + * Linux's dw driver writes outside of serial_mm's 0x20 sized + * mapping and faults. + * + * Create an unimplemented device region so writes don't fault + * and reads return zero, which keeps Linux happy. + */ + create_unimplemented_device("tt-atlantis.uart0", + s->memmap[TT_ATL_UART1].base, + s->memmap[TT_ATL_UART1].size); + + /* Load or create device tree */ + if (machine->dtb) { + load_fdt(s); + } else { + create_fdt(s); + } + + s->machine_done.notify =3D tt_atlantis_machine_done; + qemu_add_machine_init_done_notifier(&s->machine_done); +} + +static void tt_atlantis_machine_class_init(ObjectClass *oc, const void *da= ta) +{ + MachineClass *mc =3D MACHINE_CLASS(oc); + + mc->desc =3D "Tenstorrent Atlantis RISC-V SoC (Experimental)"; + mc->init =3D tt_atlantis_machine_init; + mc->max_cpus =3D 8; + mc->default_cpus =3D 8; + mc->default_ram_size =3D 4 * GiB; + mc->default_cpu_type =3D TYPE_RISCV_CPU_TT_ASCALON; + mc->block_default_type =3D IF_VIRTIO; + mc->no_cdrom =3D 1; + mc->default_ram_id =3D "tt_atlantis.ram"; +} + +static const TypeInfo tt_atlantis_types[] =3D { + { + .name =3D MACHINE_TYPE_NAME("tt-atlantis"), + .parent =3D TYPE_MACHINE, + .class_init =3D tt_atlantis_machine_class_init, + .instance_size =3D sizeof(TTAtlantisState), + .interfaces =3D riscv64_machine_interfaces, + }, +}; + +DEFINE_TYPES(tt_atlantis_types) diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index 54e41a6afc90..5033415440d4 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -120,6 +120,16 @@ config SPIKE select RISCV_ACLINT select SIFIVE_PLIC =20 +config TENSTORRENT + bool + default y + depends on RISCV64 + select RISCV_ACLINT + select RISCV_APLIC + select RISCV_IMSIC + select SERIAL_MM + select DEVICE_TREE + config XIANGSHAN_KUNMINGHU bool default y diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index 798477b7882a..0d82ceacc430 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -11,6 +11,7 @@ riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sif= ive_e.c')) riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c')) riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('spike.c')) riscv_ss.add(when: 'CONFIG_MICROCHIP_PFSOC', if_true: files('microchip_pfs= oc.c')) +riscv_ss.add(when: 'CONFIG_TENSTORRENT', if_true: files('tt_atlantis.c')) riscv_ss.add(when: 'CONFIG_ACPI', if_true: files('virt-acpi-build.c')) riscv_ss.add(when: 'CONFIG_RISCV_IOMMU', if_true: files( 'riscv-iommu.c', 'riscv-iommu-pci.c', 'riscv-iommu-sys.c', 'riscv-iommu-h= pm.c')) --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787987171155.42135344956478; Mon, 29 Jun 2026 19:53:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOYm-0004Ql-1S; Mon, 29 Jun 2026 22:50:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOYl-0004QJ-4N for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:51 -0400 Received: from mail-pj1-x102f.google.com ([2607:f8b0:4864:20::102f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOYj-0002Yu-JX for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:50 -0400 Received: by mail-pj1-x102f.google.com with SMTP id 98e67ed59e1d1-37fdee9276fso1767563a91.3 for ; Mon, 29 Jun 2026 19:50:49 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:50:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787848; x=1783392648; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=lwF06D+I4bZjzRk++w+Ob4Vd+Sjoyc0NQBk/zUwQ/OU=; b=awoUGpwj/oVW6NnmIyQ/oP2p+gpU/mAWCGGGoWCGwCO5HIYKCXIh3bXJSE9cfgu5iY 8YgRx6qx3y8nEBnbhdXEo8IJ20Z0+HOabLcOJbZqnJRVxvaUl3bZiFd0Rt6hk2rWoC70 WJfkb9hbf65o+POoHQw1gVKxIoCp/URQuUyb01rFcyu9fvALSE5oe9/Ym34weVr8El6/ 0ARuLrFsc+pba87QHnrAAjthk//v4a5Ue0W/jdXRY5iTZU0T5Lr9wXXKeZmGGpYQGiq5 Sgj3fjkb7jEPa4mT7DvNxjvgKUOjHwG2BEzTboGSw/UzQ0VdbYhad7I1DPW8WBwUWisC ChZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787848; x=1783392648; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lwF06D+I4bZjzRk++w+Ob4Vd+Sjoyc0NQBk/zUwQ/OU=; b=nVXi4Jr2zEi+jKvuJzCfs4P99Agn2ZAchlcZ66eYWb385kdGJqWgL3lbhtFsH3tl6F qqMW9du3cvpC4Nztx4X98QrrE2ovOV+ROISb6TwPgxzLfWlHEvzlmWbW2ut1BIqbb8Mb jVAxsp5c61Ju9na8KmapuaGYbsuC5ra/QEnb/lRrbKkchyyoWS6K5Ysyqnm9iiX60HFA qv3zWS5uZvR2hwY9ZakNdould+iUTiTDONQhK33tuSJHhd5l1xdocnK458MkK37Jcvex I3YEuVNrQprNLvJn1BcEwvYNpv6bOEds1PCvueYbehr8nF0cOEl+27gfMcNk2QYNtKId 4agA== X-Forwarded-Encrypted: i=1; AHgh+RpMstSbywVO5ljRiruCGPg0U5lYeFFk7j4bafrX8/OcJbEi5a55QXszoXLhQWO3wlw4jkmDZ0E3CcrB@nongnu.org X-Gm-Message-State: AOJu0YwMw0JrWVsKIekKS2uU2DCSirqFt33oBnpjalpK3OQbiYRDrGP5 SWyqLp3jIs9HeLs/OdgwDIcGAHyO2YZC+hFj32tyn+wACGBBC59Dcknh X-Gm-Gg: AfdE7cmWuoZUIQ03TpAnya64rDMntCYA3c0f4W9l15WHSsayCMqw007q5bh6iHbNBaG GEnbIfkhncRXcF5cQcS/jKcByzRIES34AFmtwSQ9x2mCZRTUddPspTCP+OPN1CP7zPsQqBfYjMO g/ZypcqmV4Bo6zGFopceX9/olHQc4sKTTQBl8D1R20wVcJBZTw5kYGJQp7hOqu4qreRekbEYQcu Gb7wtBOlS6g0uJI6bkzInisAoMfO1TU06bi2SOWonxrHYUbSXWXqSI2K0dc3ty6w/Jf57JOefbN 3xHVdtbYE360gfQ40+ztct1kuqbuvuHaOD7ziTG7rGxrO1s+mmxX0v2Xj5qzcaDwFK9AO+njJPF ySQJ3jsetMGowY/W7RkfXKE503PkjJuHx1OGVZ0wwcnZxXWYz3D4ELslaOulxUD7ubt56DQW88t S71gxHhQ2iwBOuC5N+0S5mXilkpSuNiYnFGuoOKTP+z2muLUmt316qGiZNohmp7X9NuTT17wD+h OjYGJZlMN0J4g9aU9B5DU+JLtx1Lh4sxz9su7s96yA= X-Received: by 2002:a17:90a:ec87:b0:37f:b91d:89c5 with SMTP id 98e67ed59e1d1-38052757198mr1212122a91.19.1782787848331; Mon, 29 Jun 2026 19:50:48 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v10 08/12] hw/riscv/atlantis: Ensure OpenSBI has a non-zero next_addr Date: Tue, 30 Jun 2026 12:19:46 +0930 Message-ID: <20260630024952.1520546-9-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102f; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x102f.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787987863158500 Content-Type: text/plain; charset="utf-8" From: Alistair Francis When using OpenSBI fw_dynamic on the Atlantis board OpenSBI fails to print any output, as it hits an error early on in the boot process and gets stuck in `sbi_hart_hang()`. The error occurs in the `sanitize_domain()` function inside OpenSBI. `sanitize_domain()` is called after a M-Mode OpenSBI Firmware and a generic coverall S-Mode RWX memory region are created. `sanitize_domain()` is checking that the next address is executable. If no next address is provided (which occurs on QEMU with an empty payload), then `dom->next_addr` will be 0. On most RISC-V boards address 0 will fall inside the coverall S-Mode RWX memory region and pass this check. On Atlantis the OpenSBI firmware is running at address 0, so this address falls inside the M-Mode only OpenSBI firmware region and fails the check. Once the check has failed OpenSBI aborts and the user doesn't see any messages. This can be fixed by either supplying a payload, or just manually forcing a non-zero address (actually just any address that isn't the OpenSBI firmware) for next_addr. This patch ensures that if no kernel is loaded we still specify a default kernel_entry so that OpenSBI happily boots and jumps to the first address in memory. Signed-off-by: Alistair Francis Signed-off-by: Joel Stanley Reviewed-by: Alistair Francis --- hw/riscv/tt_atlantis.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c index 1f0cd08ac959..d4fa9c251d3b 100644 --- a/hw/riscv/tt_atlantis.c +++ b/hw/riscv/tt_atlantis.c @@ -377,8 +377,16 @@ static void tt_atlantis_machine_done(Notifier *notifie= r, void *data) if (machine->kernel_filename) { riscv_load_kernel(machine, &boot_info, kernel_start_addr, true, NULL); + kernel_entry =3D boot_info.image_low_addr; + } else { + /* If we aren't loading a payload, OpenSBI thinks we are trying to= boot + * address 0, which fails `sbi_domain_check_addr()` as that is whe= re + * OpenSBI is running. Instead point OpenSBI to the end of the reg= ion + * where it was loaded, which avoids the early hang, allowing the + * system to proceed with the OpenSBI boot output. + */ + kernel_entry =3D kernel_start_addr; } - kernel_entry =3D boot_info.image_low_addr; =20 fdt_load_addr =3D riscv_compute_fdt_addr(s->memmap[TT_ATL_DDR_LO].base, s->memmap[TT_ATL_DDR_LO].size, --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787948287938.0911639616115; Mon, 29 Jun 2026 19:52:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOYs-0004Sa-CZ; Mon, 29 Jun 2026 22:50:58 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOYr-0004SE-4Q for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:57 -0400 Received: from mail-pj1-x1033.google.com ([2607:f8b0:4864:20::1033]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOYp-0002gN-AW for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:50:56 -0400 Received: by mail-pj1-x1033.google.com with SMTP id 98e67ed59e1d1-37e0fb87b75so3354337a91.3 for ; Mon, 29 Jun 2026 19:50:54 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:50:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787854; x=1783392654; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=QZW0MGxO3u9JtylivZid1F62SQcZH4r7kly/+L2VaSk=; b=Swml6c44kav1V5vdKGbI1/Toz2X1oSHkz8dZa1Vhm17zuziZKIf4RKv8Ziq7FP2ZuC 8rk7uKzHnI4GHSp1Fwk9GZZPL99MRJwDyc2SEVSc78E+hzfaCVaAhBzu5CBTysUh7Hsg B6mxN1mSgcEU3KHUP/dyD3I6XbPPe6Jl2UllFSuMz0s+LbLfruvw1XpjY3sclIfkA7DH cOtElIHUwj/9jp29nXD+49GKzwlyw2Ukmd2d2QGE+8WdBHKAcP6SIfGqU+OpR5dz1s2m JRGVJTdzUnYXg1FPSiDBZka0t6IeLVGsShzIvJd1ZUthqR15QfqTLQdGG2QGjPJmkqE1 lGOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787854; x=1783392654; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=QZW0MGxO3u9JtylivZid1F62SQcZH4r7kly/+L2VaSk=; b=GYawpBwmrjoW3gSVpFjgb4UUAAOMSjYZVE74e/Z73UfhNjZKsTAhnVYMVX8y0WlepH HBfrAnzSy6vXUH4EvWrh1dJUDb2K2+rBpG7YBumi4U2mS2T4dg0VHHj4/0BaoauaURhJ 3co3LQGru1LOH193XsBY3O0DJ2IxK+kqHvjMm6egOGUZNJykCUuZpGNHSxDjWqBgtwo5 ewol6FJ2bzptinxm1ASIN7Iaw8AOp3Spm00nRajwhnSoGChuk0PYJfZVNFBT1le0P7wB FbaIQmtF4FmBFZfldGmSCR0Xi6791brPhidwOT5SyChTpW1J5oM2UrfP4ZokBJLdOkHW 8RJQ== X-Forwarded-Encrypted: i=1; AHgh+RoFgl9phoiSazaiQAd7LHyi9PG42xfZ7C7PrvD1OctH6MnX67Dziu/U2xoK4/0UKk4f0y+CCmVHMuhb@nongnu.org X-Gm-Message-State: AOJu0YyMyC+YEzAK1qsn6YsuvrPS2vUyc+GXPQU35QqmBUc9eU/bFbIJ riptGMXjXrD39RM1p0eZX+4nfeSc3Xg+Ag/MeWCdU7CZ1s8oBbEQPG3G X-Gm-Gg: AfdE7ckFNBA+mVLFp13G+igyIyXLcrH8RTi5sMZR4SobgOvbrxbzR4CcFThL/5Zawgf 2iZRbkXl6eM2xQtqrCe/lxfJFO/Rko+XaM7nF0eq5d4GYHNqSTIRy+jduI2KL41I+AKrwliA1QV Jq1pwH9wzkYosWN4EJI6tZFpvI1cxyQBT6+g+Gq5rEMTwoNJvAegAgUmXwOZUalUevmG2rSx6K4 RORgftnCWHPvM/D6CSkHudknwkxuev5hls4QsK54od6iGL+Cr04XOAasD8oFTlw1cABtNbQN7KC 0vyjUAuwTLplrqiGVRunbABc4HLlGqtStXKuWFbVFrVaUyS+xqPKp1J5xDG4xQR/UM681w2ltdh Ov4YUyfeje42pILpV7xr5MbXvmZJ9vYourAwNdFVkRhHOS1x/WYRxZATwG73QBELUp62IDEcNDU UV9mCbjnt0NHpNyo+V8PxrG+C8LlBSF6DmS8uZp6DmzF9VoCms633NFog6CylrnGD30NOUV2rT4 TnWP6QffEd4bm2sdLf1dswqWRb3Qvz8Q9wmWclOaHNWt76eRaBmew== X-Received: by 2002:a17:90b:4f4d:b0:37f:ee23:e44d with SMTP id 98e67ed59e1d1-38052519921mr1626586a91.3.1782787853930; Mon, 29 Jun 2026 19:50:53 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v10 09/12] tests/functional/riscv64: Add tt-atlantis tests Date: Tue, 30 Jun 2026 12:19:47 +0930 Message-ID: <20260630024952.1520546-10-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1033; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x1033.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787950172158500 From: Nicholas Piggin Add OpenSBI and Linux boot tests for the tt-atlantis machine. Based on tests/functional/riscv64/test_sifive_u.py. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Alistair Francis Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley --- MAINTAINERS | 1 + tests/functional/riscv64/meson.build | 1 + tests/functional/riscv64/test_opensbi.py | 4 ++ tests/functional/riscv64/test_tt_atlantis.py | 57 ++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100755 tests/functional/riscv64/test_tt_atlantis.py diff --git a/MAINTAINERS b/MAINTAINERS index 0d7c7720d9f2..a65a13fc5cbb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1785,6 +1785,7 @@ S: Supported F: docs/system/riscv/tt_*.rst F: hw/riscv/tt_*.c F: include/hw/riscv/tt_*.h +F: tests/functional/riscv64/test_tt_*.py =20 AMD Microblaze-V Generic Board M: Sai Pavan Boddu diff --git a/tests/functional/riscv64/meson.build b/tests/functional/riscv6= 4/meson.build index 5871211e8998..c9d4c090fb52 100644 --- a/tests/functional/riscv64/meson.build +++ b/tests/functional/riscv64/meson.build @@ -14,5 +14,6 @@ tests_riscv64_system_thorough =3D [ 'endianness', 'boston', 'sifive_u', + 'tt_atlantis', 'tuxrun', ] diff --git a/tests/functional/riscv64/test_opensbi.py b/tests/functional/ri= scv64/test_opensbi.py index d077e40f4278..0f8beb7e7a8c 100755 --- a/tests/functional/riscv64/test_opensbi.py +++ b/tests/functional/riscv64/test_opensbi.py @@ -28,6 +28,10 @@ def test_riscv_sifive_u(self): self.set_machine('sifive_u') self.boot_opensbi() =20 + def test_riscv_tt_atlantis(self): + self.set_machine('tt-atlantis') + self.boot_opensbi() + def test_riscv_virt(self): self.set_machine('virt') self.boot_opensbi() diff --git a/tests/functional/riscv64/test_tt_atlantis.py b/tests/functiona= l/riscv64/test_tt_atlantis.py new file mode 100755 index 000000000000..48abd5cd27c2 --- /dev/null +++ b/tests/functional/riscv64/test_tt_atlantis.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +# +# Functional test that boots a Linux kernel on a Tenstorrent Atlantis mach= ine +# and checks the console +# +# Copyright (c) Linaro Ltd. +# Copyright 2026 Tenstorrent +# +# SPDX-License-Identifier: GPL-2.0-or-later + +from qemu_test import Asset, LinuxKernelTest + + +class TTAtlantis(LinuxKernelTest): + + ASSET_KERNEL =3D Asset( + 'https://storage.tuxboot.com/kernels/6.11.9/riscv64/Image', + '174f8bb87f08961e54fa3fcd954a8e31f4645f6d6af4dd43983d5e9841490fb0') + ASSET_ROOTFS =3D Asset( + ('https://github.com/groeck/linux-build-test/raw/' + '9819da19e6eef291686fdd7b029ea00e764dc62f/rootfs/riscv64/' + 'rootfs.ext2.gz'), + 'b6ed95610310b7956f9bf20c4c9c0c05fea647900df441da9dfe767d24e8b28b') + + def do_test_riscv64_tt_atlantis(self, connect_disk): + self.set_machine('tt-atlantis') + kernel_path =3D self.ASSET_KERNEL.fetch() + rootfs_path =3D self.uncompress(self.ASSET_ROOTFS) + + self.vm.set_console() + kernel_command_line =3D self.KERNEL_COMMON_COMMAND_LINE + 'earlyco= n=3Dsbi ' + + if connect_disk: + kernel_command_line +=3D 'root=3D/dev/vda panic=3D-1 noreboot = rootwait ' + self.vm.add_args('-device', + 'virtio-blk,drive=3Ddrive0,serial=3D0x1234,bu= s=3Dpcie.0') + self.vm.add_args('-drive', + f'file=3D{rootfs_path},if=3Dnone,id=3Ddrive0,= format=3Draw') + pattern =3D 'Boot successful.' + else: + kernel_command_line +=3D 'panic=3D0 noreboot ' + pattern =3D 'Cannot open root device' + + self.vm.add_args('-kernel', kernel_path, + '-append', kernel_command_line, + '-no-reboot') + + self.vm.launch() + self.wait_for_console_pattern(pattern) + + def test_riscv64_tt_atlantis(self): + # tt-atlantis machine has no PCI host yet, so no disk + self.do_test_riscv64_tt_atlantis(False) + + +if __name__ =3D=3D '__main__': + LinuxKernelTest.main() --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787975034918.3223295530414; Mon, 29 Jun 2026 19:52:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOZ2-0004ZM-A9; Mon, 29 Jun 2026 22:51:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOYz-0004UM-S3 for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:51:05 -0400 Received: from mail-pj1-x102c.google.com ([2607:f8b0:4864:20::102c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOYw-0002iW-61 for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:51:05 -0400 Received: by mail-pj1-x102c.google.com with SMTP id 98e67ed59e1d1-36b9d265355so1923926a91.2 for ; Mon, 29 Jun 2026 19:51:01 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.50.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:51:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787861; x=1783392661; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=tUqp+bRhdB8SgWdPBhwIrZ8MfSkpFAwpbIpXJuAaWm4=; b=iCeaQLpz3VtsLvE/dZlK6pQQ+inr+Eaip4MiDlNEuXqQ+fNT0UpKnE0S5kFaaZikwX N9soEa3R604D6uaQsVyg7c+5QfyFGSrB5J3c4JvuTk/atOdx3vCA/4lszG4B4BfnduIO xt6tcmKqF6Pg1UGy1C9bM0Xw9NBnEQnxshpy7wVkeKnJ0D/VfJZ0H0t/CaSXsRoAYqAx padQma1VHJ6pAgyDhUTG0IdEm2KZgWaPRR2IK4g88jjM+nEdd8BOBqlZJa/vDnVvh9UW G2Gx8psINQMB1+O5orLyfz/EFfx+vhhrcMEGysbnnWxPnv0yl9NbNk0cw8gCmhvuzO+V i/MA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787861; x=1783392661; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tUqp+bRhdB8SgWdPBhwIrZ8MfSkpFAwpbIpXJuAaWm4=; b=SJwPSnfDTY2OqQUqv9mjZWbx7x8Run+XMlDIFFLIbfQguUNG4G0kZchopgSUX7cubG nvGXhqUUjVG+u9MwwDIG8Pr22apJ/Dr+WUBM0cN28zzXHH4gCIUxKnL033Djp4AhQwk/ 84giW0rgr5ZIOQcY76aWRr0wp98MMpG8/toiRVqC3jC+INNl2KUsLBpwztqFQ/iU4FA5 kxg9aXOHCfwUxKnraXGJf9/8qHvvk172RA9xS/qEZUqjEDGK7lpbQaS2Hht4JSAVjExu fJBK+uh7uolXtvMnNTst+D/qu2zdFzQPn5XCD0ca7R7LRX/a7A9tL4M1+cLyBMJCd1SV IDqg== X-Forwarded-Encrypted: i=1; AHgh+Rp1BoAsZEJG+uMd0KLAXyDyZ560vV13ORZGGUVg+R5GAagTfOmgXY7fC9olG1/3/9eozQdn+7PuAAzI@nongnu.org X-Gm-Message-State: AOJu0Yyn95SVhtrOk/v5n+jQvN8I0Q9sf5Heec7H+GiAtyK/j7q5lHnP eFNjSq1lUB3eZPA7N0PKAYMBffse1OgOuMhrHQ4e4L1vbW0zHwt+/EqJ X-Gm-Gg: AfdE7cnBI+9G12PESrlf/PQdLw3ldH7al0TI2uSvkpiqAGp5iPzoBHAxkpdBVAuidNu jtm5NCWJmwXgkdg2jR4qHJTkGderiA7Ps6MPUSKcxLgz9IkM8NyJYGvYgH9HWwxtPEVXRwWVnPL Jb9JNQK0T+raco3YxeJiyaUd+j/+HLH0jxzynURBoABa79xLkgSQBHaiDXhbTvvhyjdJ20F0lAO p/QjfTMlHr90cGO9cRBPHgyW8o6qNY/WiPCpZa6fsTVU+ogRybPbOVE5qy3CMVXELztkdZ6lgzr Qx4PBlNtwAylIcAjVtR3S03x8Bq/+7mA9dvQLUHRG1FY3lSds5CrVBypVTiQHaX7nwaGLG3HOcL DVy2j2X5pHAyWBNDEY630ZwjcNRNz73w+Qe1Ozwb+yNuBYQSrvnY03W0VTyMaRV7K6A6d9D/0aO xGBMbofQHV9Cu60WkYH5Qdg4O361iH4T3cvvDAWxRBM4mjyywtWJHEgKA12IYpbFHcVC6GsrECI NNtGwWH8hVwdPIoRIy9JnS4E5OQQt4wA/CQyg3DnF0= X-Received: by 2002:a17:90b:5108:b0:37f:9ce1:735f with SMTP id 98e67ed59e1d1-380527aba72mr1163767a91.32.1782787860641; Mon, 29 Jun 2026 19:51:00 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Chris Rauer , Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Hao Wu , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Corey Minyard , Alano Song Subject: [PATCH v10 10/12] hw/i2c: Add DesignWare I2C Controller Date: Tue, 30 Jun 2026 12:19:48 +0930 Message-ID: <20260630024952.1520546-11-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102c; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x102c.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787976127158500 From: Chris Rauer Add a model for the Synopsys DesignWare Advanced I2C/SMBus Controller with sufficient functionality to be used by the Linux Designware I2C platform driver. This IP is used in the Tenstorrent Atlantis RISC-V SoC and will be added to the QEMU tt-atlantis machine. [npiggin: changelog, code cleanups and fixes as-per below link] Reviewed-by: Hao Wu Signed-off-by: Chris Rauer Link: https://lore.kernel.org/qemu-devel/20220110214755.810343-2-venture@go= ogle.com [jms: rebase and minor build fixes for class_init and reset callback] Link: https://lore.kernel.org/qemu-devel/20260507120524.111056-1-npiggin@gm= ail.com Signed-off-by: Nicholas Piggin Acked-by: Alistair Francis Reviewed-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Corey Minyard Tested-by: Alano Song Signed-off-by: Joel Stanley --- MAINTAINERS | 8 + include/hw/i2c/designware_i2c.h | 56 +++ hw/i2c/designware_i2c.c | 745 ++++++++++++++++++++++++++++++++ hw/i2c/Kconfig | 5 + hw/i2c/meson.build | 1 + 5 files changed, 815 insertions(+) create mode 100644 include/hw/i2c/designware_i2c.h create mode 100644 hw/i2c/designware_i2c.c diff --git a/MAINTAINERS b/MAINTAINERS index a65a13fc5cbb..14d0c1b88758 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2750,6 +2750,14 @@ S: Orphan F: hw/gpio/pcf8574.c F: include/hw/gpio/pcf8574.h =20 +DesignWare I2C +M: Chris Rauer +R: Alano Song +R: Joel Stanley +S: Maintained +F: hw/i2c/designware_i2c.c +F: include/hw/i2c/designware_i2c.h + Generic Loader M: Alistair Francis S: Maintained diff --git a/include/hw/i2c/designware_i2c.h b/include/hw/i2c/designware_i2= c.h new file mode 100644 index 000000000000..4d5ff5d973d8 --- /dev/null +++ b/include/hw/i2c/designware_i2c.h @@ -0,0 +1,56 @@ +/* + * DesignWare I2C Module. + * + * Copyright 2021 Google LLC + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef DESIGNWARE_I2C_H +#define DESIGNWARE_I2C_H + +#include "qemu/fifo8.h" +#include "hw/i2c/i2c.h" +#include "hw/core/irq.h" +#include "hw/core/register.h" +#include "hw/core/sysbus.h" +#include "qom/object.h" + +#define DESIGNWARE_I2C_R_MAX (0x100 / 4) + +#define DESIGNWARE_I2C_RX_FIFO_SIZE 16 +#define DESIGNWARE_I2C_TX_FIFO_SIZE 16 + +typedef enum DesignWareI2CStatus { + DW_I2C_STATUS_IDLE, + DW_I2C_STATUS_SENDING_ADDRESS, + DW_I2C_STATUS_SENDING, + DW_I2C_STATUS_RECEIVING, +} DesignWareI2CStatus; + +#define TYPE_DESIGNWARE_I2C "designware-i2c" +OBJECT_DECLARE_SIMPLE_TYPE(DesignWareI2CState, DESIGNWARE_I2C) + +/* + * struct DesignWareI2CState - DesignWare I2C device state. + * @bus: The underlying I2C Bus + * @irq: Interrupt line fired on transaction events. + * @rx_fifo: The FIFO buffer for receiving in FIFO mode. + */ +struct DesignWareI2CState { + SysBusDevice parent_obj; + + MemoryRegion iomem; + + I2CBus *bus; + qemu_irq irq; + + uint32_t regs[DESIGNWARE_I2C_R_MAX]; + RegisterInfo regs_info[DESIGNWARE_I2C_R_MAX]; + + /* fifo8_num_used(rx_fifo) should always equal DW_IC_RXFLR */ + Fifo8 rx_fifo; + + DesignWareI2CStatus status; +}; + +#endif /* DESIGNWARE_I2C_H */ diff --git a/hw/i2c/designware_i2c.c b/hw/i2c/designware_i2c.c new file mode 100644 index 000000000000..daa9714cb7b2 --- /dev/null +++ b/hw/i2c/designware_i2c.c @@ -0,0 +1,745 @@ +/* + * DesignWare I2C Module. + * + * Copyright 2021 Google LLC + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" + +#include "hw/i2c/designware_i2c.h" +#include "migration/vmstate.h" +#include "qemu/log.h" +#include "qemu/module.h" +#include "qemu/units.h" + +#ifndef DESIGNWARE_I2C_ERR_DEBUG +#define DESIGNWARE_I2C_ERR_DEBUG 0 +#endif + +REG32(DW_IC_CON, 0x00) /* I2C control */ + FIELD(DW_IC_CON, STOP_DET_IF_MASTER_ACTIV, 10, 1) + FIELD(DW_IC_CON, RX_FIFO_FULL_HLD_CTRL, 9, 1) + FIELD(DW_IC_CON, TX_EMPTY_CTRL, 8, 1) + FIELD(DW_IC_CON, STOP_IF_ADDRESSED, 7, 1) + FIELD(DW_IC_CON, SLAVE_DISABLE, 6, 1) + FIELD(DW_IC_CON, IC_RESTART_EN, 5, 1) + FIELD(DW_IC_CON, 10BITADDR_MASTER, 4, 1) + FIELD(DW_IC_CON, 10BITADDR_SLAVE, 3, 1) + FIELD(DW_IC_CON, SPEED, 1, 2) + FIELD(DW_IC_CON, MASTER_MODE, 0, 1) +REG32(DW_IC_TAR, 0x04) /* I2C target address */ + FIELD(DW_IC_TAR, IC_10BITADDR_MASTER, 12, 1) + FIELD(DW_IC_TAR, SPECIAL, 11, 1) + FIELD(DW_IC_TAR, GC_OR_START, 10, 1) + FIELD(DW_IC_TAR, ADDRESS, 0, 10) +REG32(DW_IC_SAR, 0x08) /* I2C slave address */ +REG32(DW_IC_DATA_CMD, 0x10) + FIELD(DW_IC_DATA_CMD, RESTART, 10, 1) + FIELD(DW_IC_DATA_CMD, STOP, 9, 1) + FIELD(DW_IC_DATA_CMD, CMD, 8, 1) + FIELD(DW_IC_DATA_CMD, DAT, 0, 8) +REG32(DW_IC_SS_SCL_HCNT, 0x14) /* Standard speed i2c clock scl high= count */ +REG32(DW_IC_SS_SCL_LCNT, 0x18) /* Standard speed i2c clock scl low = count */ +REG32(DW_IC_FS_SCL_HCNT, 0x1c) /* Fast or fast plus i2c clock scl h= igh count */ +REG32(DW_IC_FS_SCL_LCNT, 0x20) /* Fast or fast plus i2c clock scl l= ow count */ +REG32(DW_IC_INTR_STAT, 0x2c) +REG32(DW_IC_INTR_MASK, 0x30) /* I2C Interrupt Mask */ +REG32(DW_IC_RAW_INTR_STAT, 0x34) /* I2C raw interrupt status */ + /* DW_IC_INTR_STAT/INTR_MASK/RAW_INTR_STAT fields */ + SHARED_FIELD(DW_IC_INTR_RESTART_DET, 12, 1) + SHARED_FIELD(DW_IC_INTR_GEN_CALL, 11, 1) + SHARED_FIELD(DW_IC_INTR_START_DET, 10, 1) + SHARED_FIELD(DW_IC_INTR_STOP_DET, 9, 1) + SHARED_FIELD(DW_IC_INTR_ACTIVITY, 8, 1) + SHARED_FIELD(DW_IC_INTR_RX_DONE, 7, 1) + SHARED_FIELD(DW_IC_INTR_TX_ABRT, 6, 1) + SHARED_FIELD(DW_IC_INTR_RD_REQ, 5, 1) + SHARED_FIELD(DW_IC_INTR_TX_EMPTY, 4, 1) /* Hardware clear only. */ + SHARED_FIELD(DW_IC_INTR_TX_OVER, 3, 1) + SHARED_FIELD(DW_IC_INTR_RX_FULL, 2, 1) /* Hardware clear only. */ + SHARED_FIELD(DW_IC_INTR_RX_OVER, 1, 1) + SHARED_FIELD(DW_IC_INTR_RX_UNDER, 0, 1) + +#define DW_IC_INTR_ANY_MASK \ + (DW_IC_INTR_RESTART_DET_MASK | \ + DW_IC_INTR_GEN_CALL_MASK | \ + DW_IC_INTR_START_DET_MASK | \ + DW_IC_INTR_STOP_DET_MASK | \ + DW_IC_INTR_ACTIVITY_MASK | \ + DW_IC_INTR_RX_DONE_MASK | \ + DW_IC_INTR_TX_ABRT_MASK | \ + DW_IC_INTR_RD_REQ_MASK | \ + DW_IC_INTR_TX_EMPTY_MASK | \ + DW_IC_INTR_TX_OVER_MASK | \ + DW_IC_INTR_RX_FULL_MASK | \ + DW_IC_INTR_RX_OVER_MASK | \ + DW_IC_INTR_RX_UNDER_MASK) + +#define DW_IC_INTR_ANY_SW_CLEAR_MASK \ + (DW_IC_INTR_ANY_MASK & \ + ~(DW_IC_INTR_TX_EMPTY_MASK | \ + DW_IC_INTR_RX_FULL_MASK)) + +REG32(DW_IC_RX_TL, 0x38) /* I2C receive FIFO threshold */ +REG32(DW_IC_TX_TL, 0x3c) /* I2C transmit FIFO threshold */ +REG32(DW_IC_CLR_INTR, 0x40) +REG32(DW_IC_CLR_RX_UNDER, 0x44) +REG32(DW_IC_CLR_RX_OVER, 0x48) +REG32(DW_IC_CLR_TX_OVER, 0x4c) +REG32(DW_IC_CLR_RD_REQ, 0x50) +REG32(DW_IC_CLR_TX_ABRT, 0x54) +REG32(DW_IC_CLR_RX_DONE, 0x58) +REG32(DW_IC_CLR_ACTIVITY, 0x5c) +REG32(DW_IC_CLR_STOP_DET, 0x60) +REG32(DW_IC_CLR_START_DET, 0x64) +REG32(DW_IC_CLR_GEN_CALL, 0x68) +REG32(DW_IC_ENABLE, 0x6c) /* I2C enable */ + FIELD(DW_IC_ENABLE, TX_CMD_BLOCK, 2, 1) + FIELD(DW_IC_ENABLE, ABORT, 1, 1) + FIELD(DW_IC_ENABLE, ENABLE, 0, 1) +REG32(DW_IC_STATUS, 0x70) /* I2C status */ + FIELD(DW_IC_STATUS, SLV_ACTIVITY, 6, 1) + FIELD(DW_IC_STATUS, MST_ACTIVITY, 5, 1) + FIELD(DW_IC_STATUS, RFF, 4, 1) + FIELD(DW_IC_STATUS, RFNE, 3, 1) + FIELD(DW_IC_STATUS, TFE, 2, 1) + FIELD(DW_IC_STATUS, TFNF, 1, 1) + FIELD(DW_IC_STATUS, ACTIVITY, 0, 1) +REG32(DW_IC_TXFLR, 0x74) /* I2C transmit fifo level */ +REG32(DW_IC_RXFLR, 0x78) /* I2C receive fifo level */ +REG32(DW_IC_SDA_HOLD, 0x7c) /* I2C SDA hold time length */ +REG32(DW_IC_TX_ABRT_SOURCE, 0x80) /* The I2C transmit abort source */ + FIELD(DW_IC_TX_ABRT_SOURCE, USER_ABRT, 16, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, SLVRD_INTX, 15, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, SLV_ARBLOST, 14, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, SLVFLUSH_TXFIFO, 13, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, ARB_LOST, 12, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, MASTER_DIS, 11, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, 10B_RD_NORSTRT, 10, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, SBYTE_NORSTRT, 9, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, HS_NORSTRT, 8, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, SBYTE_ACKDET, 7, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, HS_ACKDET, 6, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, GCALL_READ, 5, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, GCALL_NOACK, 4, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, TXDATA_NOACK, 3, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, 10ADDR2_NOACK, 2, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, 10ADDR1_NOACK, 1, 1) + FIELD(DW_IC_TX_ABRT_SOURCE, 7B_ADDR_NOACK, 0, 1) +REG32(DW_IC_SLV_DATA_NACK_ONLY, 0x84) +REG32(DW_IC_DMA_CR, 0x88) +REG32(DW_IC_DMA_TDLR, 0x8c) +REG32(DW_IC_DMA_RDLR, 0x90) +REG32(DW_IC_SDA_SETUP, 0x94) /* I2C SDA setup */ +REG32(DW_IC_ACK_GENERAL_CALL, 0x98) +REG32(DW_IC_ENABLE_STATUS, 0x9c) /* I2C enable status */ + FIELD(DW_IC_ENABLE_STATUS, SLV_RX_DATA_LOST, 2, 1) + FIELD(DW_IC_ENABLE_STATUS, SLV_DISABLED_WHILE_BUSY, 1, 1) + FIELD(DW_IC_ENABLE_STATUS, IC_EN, 0, 1) +REG32(DW_IC_FS_SPKLEN, 0xa0) /* I2C SS, FS or FM+ spike suppressi= on limit */ +REG32(DW_IC_CLR_RESTART_DET, 0xa8) +REG32(DW_IC_SMBUS_INTR_MASK, 0xcc) /* SMBus Interrupt Mask */ +REG32(DW_IC_COMP_PARAM_1, 0xf4) /* Component parameter */ + FIELD(DW_IC_COMP_PARAM_1, TX_FIFO_SIZE, 16, 8) + FIELD(DW_IC_COMP_PARAM_1, RX_FIFO_SIZE, 8, 8) + FIELD(DW_IC_COMP_PARAM_1, HAS_ENCODED_PARAMS, 7, 1) + FIELD(DW_IC_COMP_PARAM_1, HAS_DMA, 6, 1) + FIELD(DW_IC_COMP_PARAM_1, INTR_IO, 5, 1) + FIELD(DW_IC_COMP_PARAM_1, HC_COUNT_VAL, 4, 1) + FIELD(DW_IC_COMP_PARAM_1, HIGH_SPEED_MODE, 2, 2) + FIELD(DW_IC_COMP_PARAM_1, APB_DATA_WIDTH_32, 0, 2) +REG32(DW_IC_COMP_VERSION, 0xf8) /* I2C component version */ +REG32(DW_IC_COMP_TYPE, 0xfc) /* I2C component type */ + +static void dw_i2c_update_irq(DesignWareI2CState *s) +{ + uint32_t intr =3D s->regs[R_DW_IC_RAW_INTR_STAT] & s->regs[R_DW_IC_INT= R_MASK]; + + qemu_set_irq(s->irq, !!(intr & DW_IC_INTR_ANY_MASK)); +} + +static uint64_t dw_ic_data_cmd_reg_post_read(RegisterInfo *reg, uint64_t v= alue) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + g_assert(value =3D=3D 0); + + if (s->status !=3D DW_I2C_STATUS_RECEIVING) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Attempted to read from RX fifo when not in rece= ive " + "state.\n", DEVICE(s)->canonical_path); + if (s->status !=3D DW_I2C_STATUS_IDLE) { + SHARED_ARRAY_FIELD_DP32(s->regs, R_DW_IC_RAW_INTR_STAT, + DW_IC_INTR_RX_UNDER, 1); + dw_i2c_update_irq(s); + } + return 0; + } + + g_assert(s->regs[R_DW_IC_RXFLR] =3D=3D fifo8_num_used(&s->rx_fifo)); + + if (fifo8_is_empty(&s->rx_fifo)) { + SHARED_ARRAY_FIELD_DP32(s->regs, R_DW_IC_RAW_INTR_STAT, DW_IC_INTR= _RX_UNDER, 1); + dw_i2c_update_irq(s); + return 0; + } + + s->regs[R_DW_IC_RXFLR]--; + if (s->regs[R_DW_IC_RXFLR] <=3D s->regs[R_DW_IC_RX_TL]) { + SHARED_ARRAY_FIELD_DP32(s->regs, R_DW_IC_RAW_INTR_STAT, DW_IC_INTR= _RX_FULL, 0); + dw_i2c_update_irq(s); + } + + return fifo8_pop(&s->rx_fifo); +} + +static uint64_t dw_ic_clr_intr_reg_post_read(RegisterInfo *reg, uint64_t v= alue) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + g_assert(value =3D=3D 0); + + switch (reg->access->addr) { + case A_DW_IC_CLR_INTR: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_ANY_SW_CLEAR_MASK; + break; + case A_DW_IC_CLR_RX_UNDER: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_RX_UNDER_MASK; + break; + case A_DW_IC_CLR_RX_OVER: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_RX_OVER_MASK; + break; + case A_DW_IC_CLR_TX_OVER: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_TX_OVER_MASK; + break; + case A_DW_IC_CLR_RD_REQ: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_RD_REQ_MASK; + break; + case A_DW_IC_CLR_TX_ABRT: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_TX_ABRT_MASK; + break; + case A_DW_IC_CLR_RX_DONE: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_RX_DONE_MASK; + break; + case A_DW_IC_CLR_ACTIVITY: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_ACTIVITY_MASK; + break; + case A_DW_IC_CLR_STOP_DET: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_STOP_DET_MASK; + break; + case A_DW_IC_CLR_START_DET: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_START_DET_MASK; + break; + case A_DW_IC_CLR_GEN_CALL: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_GEN_CALL_MASK; + break; + case A_DW_IC_CLR_RESTART_DET: + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_RESTART_DET_MASK; + break; + default: + g_assert_not_reached(); + } + + dw_i2c_update_irq(s); + + return 0; +} + +static uint64_t dw_ic_intr_stat_reg_post_read(RegisterInfo *reg, uint64_t = value) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + g_assert(value =3D=3D 0); + + return s->regs[R_DW_IC_RAW_INTR_STAT] & s->regs[R_DW_IC_INTR_MASK]; +} + +static uint64_t dw_ic_unsupported_reg_post_read(RegisterInfo *reg, uint64_= t value) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + qemu_log_mask(LOG_UNIMP, "%s: unsupported read - %s\n", + DEVICE(s)->canonical_path, reg->access->name); + + return 0; +} + +static uint64_t dw_ic_unsupported_reg_pre_write(RegisterInfo *reg, uint64_= t value) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + qemu_log_mask(LOG_UNIMP, "%s: unsupported write - %s\n", + DEVICE(s)->canonical_path, reg->access->name); + + return 0; +} + +static uint64_t dw_ic_con_reg_pre_write(RegisterInfo *reg, uint64_t value) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + if (s->regs[R_DW_IC_ENABLE] & R_DW_IC_ENABLE_ENABLE_MASK) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: invalid setting to ic_con %d when ic_enable[0]= =3D=3D1\n", + DEVICE(s)->canonical_path, (int)value); + return s->regs[R_DW_IC_CON]; /* keep old value */ + } + + return value; +} + +static void dw_i2c_reset_to_idle(DesignWareI2CState *s) +{ + s->regs[R_DW_IC_ENABLE_STATUS] &=3D ~R_DW_IC_ENABLE_STATUS_IC_EN_MASK; + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_TX_EMPTY_MASK; + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_RX_FULL_MASK; + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_RX_UNDER_MASK; + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_RX_OVER_MASK; + s->regs[R_DW_IC_RXFLR] =3D 0; + fifo8_reset(&s->rx_fifo); + s->regs[R_DW_IC_STATUS] &=3D ~R_DW_IC_STATUS_ACTIVITY_MASK; + s->status =3D DW_I2C_STATUS_IDLE; + dw_i2c_update_irq(s); +} + +static void dw_ic_tx_abort(DesignWareI2CState *s, uint32_t src) +{ + s->regs[R_DW_IC_TX_ABRT_SOURCE] |=3D src; + s->regs[R_DW_IC_RAW_INTR_STAT] |=3D DW_IC_INTR_TX_ABRT_MASK; + dw_i2c_reset_to_idle(s); + dw_i2c_update_irq(s); +} + +static void dw_ic_data_cmd_reg_post_write(RegisterInfo *reg, uint64_t valu= e) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + int recv =3D !!(value & R_DW_IC_DATA_CMD_CMD_MASK); + + s->regs[R_DW_IC_DATA_CMD] =3D 0; /* Register has no storage */ + + if (!(s->regs[R_DW_IC_ENABLE] & R_DW_IC_ENABLE_ENABLE_MASK)) { + /* + * Controller is not enabled. The register_reset() path also lands + * here with value =3D=3D 0, so silently ignore rather than report= ing + * a spurious guest error. + */ + return; + } + + if (s->status =3D=3D DW_I2C_STATUS_IDLE || + s->regs[R_DW_IC_RAW_INTR_STAT] & DW_IC_INTR_TX_ABRT_MASK) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Attempted to write to TX fifo when it is held i= n " + "reset\n", DEVICE(s)->canonical_path); + return; + } + + /* Send the address if it hasn't been sent yet. */ + if (s->status =3D=3D DW_I2C_STATUS_SENDING_ADDRESS) { + int rv =3D i2c_start_transfer(s->bus, + ARRAY_FIELD_EX32(s->regs, DW_IC_TAR, ADDRESS), recv); + if (rv) { + dw_ic_tx_abort(s, R_DW_IC_TX_ABRT_SOURCE_7B_ADDR_NOACK_MASK); + return; + } + s->status =3D recv ? DW_I2C_STATUS_RECEIVING : DW_I2C_STATUS_SENDI= NG; + } + + /* Send data */ + if (!recv) { + int rv =3D i2c_send(s->bus, FIELD_EX32(value, DW_IC_DATA_CMD, DAT)= ); + if (rv) { + i2c_end_transfer(s->bus); + dw_ic_tx_abort(s, R_DW_IC_TX_ABRT_SOURCE_TXDATA_NOACK_MASK); + return; + } + dw_i2c_update_irq(s); + } + + /* Restart command */ + if (value & R_DW_IC_DATA_CMD_RESTART_MASK && + s->regs[R_DW_IC_CON] & R_DW_IC_CON_IC_RESTART_EN_MASK) { + s->regs[R_DW_IC_RAW_INTR_STAT] |=3D DW_IC_INTR_RESTART_DET_MASK | + DW_IC_INTR_START_DET_MASK | + DW_IC_INTR_ACTIVITY_MASK; + s->regs[R_DW_IC_STATUS] |=3D R_DW_IC_STATUS_ACTIVITY_MASK; + dw_i2c_update_irq(s); + + if (i2c_start_transfer(s->bus, + ARRAY_FIELD_EX32(s->regs, DW_IC_TAR, ADDRESS), recv)) { + dw_ic_tx_abort(s, R_DW_IC_TX_ABRT_SOURCE_7B_ADDR_NOACK_MASK); + return; + } + + s->status =3D recv ? DW_I2C_STATUS_RECEIVING : DW_I2C_STATUS_SENDI= NG; + } + + /* Receive data */ + if (recv) { + g_assert(s->regs[R_DW_IC_RXFLR] =3D=3D fifo8_num_used(&s->rx_fifo)= ); + + if (!fifo8_is_full(&s->rx_fifo)) { + fifo8_push(&s->rx_fifo, i2c_recv(s->bus)); + s->regs[R_DW_IC_RXFLR]++; + } else { + s->regs[R_DW_IC_RAW_INTR_STAT] |=3D DW_IC_INTR_RX_OVER_MASK; + dw_i2c_update_irq(s); + } + + if (s->regs[R_DW_IC_RXFLR] > s->regs[R_DW_IC_RX_TL]) { + s->regs[R_DW_IC_RAW_INTR_STAT] |=3D DW_IC_INTR_RX_FULL_MASK; + dw_i2c_update_irq(s); + } + if (value & R_DW_IC_DATA_CMD_STOP_MASK) { + i2c_nack(s->bus); + } + } + + /* Stop command */ + if (value & R_DW_IC_DATA_CMD_STOP_MASK) { + s->regs[R_DW_IC_RAW_INTR_STAT] |=3D DW_IC_INTR_STOP_DET_MASK; + s->regs[R_DW_IC_STATUS] &=3D ~R_DW_IC_STATUS_ACTIVITY_MASK; + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_TX_EMPTY_MASK; + i2c_end_transfer(s->bus); + dw_i2c_update_irq(s); + } +} + +static void dw_ic_intr_mask_reg_post_write(RegisterInfo *reg, uint64_t val= ue) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + dw_i2c_update_irq(s); +} + +static uint64_t dw_ic_enable_reg_pre_write(RegisterInfo *reg, uint64_t val= ue) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + if (value & R_DW_IC_ENABLE_ENABLE_MASK && + !(s->regs[R_DW_IC_CON] & R_DW_IC_CON_SLAVE_DISABLE_MASK)) { + qemu_log_mask(LOG_UNIMP, + "%s: Designware I2C slave mode is not supported.\n", + DEVICE(s)->canonical_path); + return s->regs[R_DW_IC_ENABLE]; /* keep old value */ + } + + return value; +} + +static void dw_ic_enable_reg_post_write(RegisterInfo *reg, uint64_t value) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + s->regs[R_DW_IC_ENABLE] =3D value & R_DW_IC_ENABLE_ENABLE_MASK; + + if (value & R_DW_IC_ENABLE_ABORT_MASK || value & R_DW_IC_ENABLE_TX_CMD= _BLOCK_MASK) { + dw_ic_tx_abort(s, R_DW_IC_TX_ABRT_SOURCE_USER_ABRT_MASK); + return; + } + + if (value & R_DW_IC_ENABLE_ENABLE_MASK) { + s->regs[R_DW_IC_ENABLE_STATUS] |=3D R_DW_IC_ENABLE_STATUS_IC_EN_MA= SK; + s->regs[R_DW_IC_STATUS] |=3D R_DW_IC_STATUS_ACTIVITY_MASK; + s->regs[R_DW_IC_RAW_INTR_STAT] |=3D DW_IC_INTR_ACTIVITY_MASK | + DW_IC_INTR_START_DET_MASK | + DW_IC_INTR_TX_EMPTY_MASK; + s->status =3D DW_I2C_STATUS_SENDING_ADDRESS; + dw_i2c_update_irq(s); + } else if ((value & R_DW_IC_ENABLE_ENABLE_MASK) =3D=3D 0) { + dw_i2c_reset_to_idle(s); + } +} + +static uint64_t dw_ic_rx_tl_reg_pre_write(RegisterInfo *reg, uint64_t valu= e) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + /* Note that a value of 0 for ic_rx_tl indicates a threshold of 1. */ + if (value > DESIGNWARE_I2C_RX_FIFO_SIZE - 1) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: invalid setting to ic_rx_tl %d\n", + DEVICE(s)->canonical_path, (int)value); + return DESIGNWARE_I2C_RX_FIFO_SIZE - 1; + } + + return value; +} + +static void dw_ic_rx_tl_reg_post_write(RegisterInfo *reg, uint64_t value) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + if (s->regs[R_DW_IC_RXFLR] > s->regs[R_DW_IC_RX_TL] && + s->regs[R_DW_IC_ENABLE] & R_DW_IC_ENABLE_ENABLE_MASK) { + s->regs[R_DW_IC_RAW_INTR_STAT] |=3D DW_IC_INTR_RX_FULL_MASK; + } else { + s->regs[R_DW_IC_RAW_INTR_STAT] &=3D ~DW_IC_INTR_RX_FULL_MASK; + } + dw_i2c_update_irq(s); +} + +static uint64_t dw_ic_tx_tl_reg_pre_write(RegisterInfo *reg, uint64_t valu= e) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(reg->opaque); + + /* + * Note that a value of 0 for ic_tx_tl indicates a threshold of 1. + * However, the tx threshold is not used in the model because commands= are + * always sent out as soon as they are written. + */ + if (value > DESIGNWARE_I2C_TX_FIFO_SIZE - 1) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: invalid setting to ic_tx_tl %d\n", + DEVICE(s)->canonical_path, (int)value); + return DESIGNWARE_I2C_TX_FIFO_SIZE - 1; + } + + return value; +} + +static const RegisterAccessInfo designware_i2c_regs_info[] =3D { + { .name =3D "DW_IC_CON", .addr =3D A_DW_IC_CON, + .reset =3D 0x7d, + .unimp =3D 0xfffffc00, + .pre_write =3D dw_ic_con_reg_pre_write, + },{ .name =3D "DW_IC_TAR", .addr =3D A_DW_IC_TAR, + .reset =3D 0x1055, + .unimp =3D 0xfffff000, + },{ .name =3D "DW_IC_SAR", .addr =3D A_DW_IC_SAR, + .reset =3D 0x55, + .unimp =3D 0xfffffc00, + .post_read =3D dw_ic_unsupported_reg_post_read, + .pre_write =3D dw_ic_unsupported_reg_pre_write, + },{ .name =3D "DW_IC_DATA_CMD", .addr =3D A_DW_IC_DATA_CMD, + .post_read =3D dw_ic_data_cmd_reg_post_read, + .post_write =3D dw_ic_data_cmd_reg_post_write, + },{ .name =3D "DW_IC_SS_SCL_HCNT", .addr =3D A_DW_IC_SS_SCL_HCNT, + .reset =3D 0x190, + .unimp =3D 0xffff0000, + },{ .name =3D "DW_IC_SS_SCL_LCNT", .addr =3D A_DW_IC_SS_SCL_LCNT, + .reset =3D 0x1d6, + .unimp =3D 0xffff0000, + },{ .name =3D "DW_IC_FS_SCL_HCNT", .addr =3D A_DW_IC_FS_SCL_HCNT, + .reset =3D 0x3c, + .unimp =3D 0xffff0000, + },{ .name =3D "DW_IC_FS_SCL_LCNT", .addr =3D A_DW_IC_FS_SCL_LCNT, + .reset =3D 0x82, + .unimp =3D 0xffff0000, + },{ .name =3D "DW_IC_INTR_STAT", .addr =3D A_DW_IC_INTR_STAT, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_intr_stat_reg_post_read, + },{ .name =3D "DW_IC_INTR_MASK", .addr =3D A_DW_IC_INTR_MASK, + .reset =3D 0x8ff, + .unimp =3D 0xffff8000, + .post_write =3D dw_ic_intr_mask_reg_post_write, + },{ .name =3D "DW_IC_RAW_INTR_STAT", .addr =3D A_DW_IC_RAW_INTR_STAT, + .ro =3D 0xffffffff, + },{ .name =3D "DW_IC_RX_TL", .addr =3D A_DW_IC_RX_TL, + .pre_write =3D dw_ic_rx_tl_reg_pre_write, + .post_write =3D dw_ic_rx_tl_reg_post_write, + },{ .name =3D "DW_IC_TX_TL", .addr =3D A_DW_IC_TX_TL, + .pre_write =3D dw_ic_tx_tl_reg_pre_write, + },{ .name =3D "DW_IC_CLR_INTR", .addr =3D A_DW_IC_CLR_INTR, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_RX_UNDER", .addr =3D A_DW_IC_CLR_RX_UNDER, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_RX_OVER", .addr =3D A_DW_IC_CLR_RX_OVER, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_TX_OVER", .addr =3D A_DW_IC_CLR_TX_OVER, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_RD_REQ", .addr =3D A_DW_IC_CLR_RD_REQ, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_TX_ABRT", .addr =3D A_DW_IC_CLR_TX_ABRT, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_RX_DONE", .addr =3D A_DW_IC_CLR_RX_DONE, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_ACTIVITY", .addr =3D A_DW_IC_CLR_ACTIVITY, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_STOP_DET", .addr =3D A_DW_IC_CLR_STOP_DET, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_START_DET", .addr =3D A_DW_IC_CLR_START_DET, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_CLR_GEN_CALL", .addr =3D A_DW_IC_CLR_GEN_CALL, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_ENABLE", .addr =3D A_DW_IC_ENABLE, + .unimp =3D 0xfffffff8, + .pre_write =3D dw_ic_enable_reg_pre_write, + .post_write =3D dw_ic_enable_reg_post_write, + },{ .name =3D "DW_IC_STATUS", .addr =3D A_DW_IC_STATUS, + .reset =3D 0x6, + .ro =3D 0xffffffff, + },{ .name =3D "DW_IC_TXFLR", .addr =3D A_DW_IC_TXFLR, + .ro =3D 0xffffffff, + },{ .name =3D "DW_IC_RXFLR", .addr =3D A_DW_IC_RXFLR, + .ro =3D 0xffffffff, + },{ .name =3D "DW_IC_SDA_HOLD", .addr =3D A_DW_IC_SDA_HOLD, + .reset =3D 0x1, + .unimp =3D 0xff000000, + },{ .name =3D "DW_IC_TX_ABRT_SOURCE", .addr =3D A_DW_IC_TX_ABRT_SOURC= E, + .ro =3D 0xffffffff, + },{ .name =3D "DW_IC_SLV_DATA_NACK_ONLY", .addr =3D A_DW_IC_SLV_DATA_= NACK_ONLY, + .post_read =3D dw_ic_unsupported_reg_post_read, + .pre_write =3D dw_ic_unsupported_reg_pre_write, + },{ .name =3D "DW_IC_DMA_CR", .addr =3D A_DW_IC_DMA_CR, + .post_read =3D dw_ic_unsupported_reg_post_read, + .pre_write =3D dw_ic_unsupported_reg_pre_write, + },{ .name =3D "DW_IC_DMA_TDLR", .addr =3D A_DW_IC_DMA_TDLR, + .post_read =3D dw_ic_unsupported_reg_post_read, + .pre_write =3D dw_ic_unsupported_reg_pre_write, + },{ .name =3D "DW_IC_DMA_RDLR", .addr =3D A_DW_IC_DMA_RDLR, + .post_read =3D dw_ic_unsupported_reg_post_read, + .pre_write =3D dw_ic_unsupported_reg_pre_write, + },{ .name =3D "DW_IC_SDA_SETUP", .addr =3D A_DW_IC_SDA_SETUP, + .reset =3D 0x64, + .unimp =3D 0xffffff00, + },{ .name =3D "DW_IC_ACK_GENERAL_CALL", .addr =3D A_DW_IC_ACK_GENERAL= _CALL, + .post_read =3D dw_ic_unsupported_reg_post_read, + .pre_write =3D dw_ic_unsupported_reg_pre_write, + },{ .name =3D "DW_IC_ENABLE_STATUS", .addr =3D A_DW_IC_ENABLE_STATUS, + .ro =3D 0xffffffff, + },{ .name =3D "DW_IC_FS_SPKLEN", .addr =3D A_DW_IC_FS_SPKLEN, + .reset =3D 0x2, + .ro =3D 0xffffff00, + },{ .name =3D "DW_IC_CLR_RESTART_DET", .addr =3D A_DW_IC_CLR_RESTART_= DET, + .ro =3D 0xffffffff, + .post_read =3D dw_ic_clr_intr_reg_post_read, + },{ .name =3D "DW_IC_SMBUS_INTR_MASK", .addr =3D A_DW_IC_SMBUS_INTR_M= ASK, + /* No SMBus interrupts are implemented, Linux updates the mask */ + .reset =3D 0x7ff, + .unimp =3D 0xfffff800, + },{ .name =3D "DW_IC_COMP_PARAM_1", .addr =3D A_DW_IC_COMP_PARAM_1, + .reset =3D /* HAS_DMA and HC_COUNT_VAL are disabled */ + ((2 << R_DW_IC_COMP_PARAM_1_APB_DATA_WIDTH_32_SHIFT) | + R_DW_IC_COMP_PARAM_1_HIGH_SPEED_MODE_MASK | + R_DW_IC_COMP_PARAM_1_INTR_IO_MASK | + R_DW_IC_COMP_PARAM_1_HAS_ENCODED_PARAMS_MASK | + ((DESIGNWARE_I2C_RX_FIFO_SIZE - 1) + << R_DW_IC_COMP_PARAM_1_RX_FIFO_SIZE_SHIFT) | + ((DESIGNWARE_I2C_TX_FIFO_SIZE - 1) + << R_DW_IC_COMP_PARAM_1_TX_FIFO_SIZE_SHIFT)), + .ro =3D 0xffffffff, + },{ .name =3D "DW_IC_COMP_VERSION", .addr =3D A_DW_IC_COMP_VERSION, + .reset =3D 0x3132302a, + .ro =3D 0xffffffff, + },{ .name =3D "DW_IC_COMP_TYPE", .addr =3D A_DW_IC_COMP_TYPE, + .reset =3D 0x44570140, + .ro =3D 0xffffffff, + } +}; + +static const MemoryRegionOps designware_i2c_ops =3D { + .read =3D register_read_memory, + .write =3D register_write_memory, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .impl =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, + .valid =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + .unaligned =3D false, + }, +}; + +static void designware_i2c_enter_reset(Object *obj, ResetType type) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(obj); + unsigned int i; + + for (i =3D 0; i < ARRAY_SIZE(s->regs); ++i) { + register_reset(&s->regs_info[i]); + } + + fifo8_reset(&s->rx_fifo); + + s->status =3D DW_I2C_STATUS_IDLE; +} + +static void designware_i2c_hold_reset(Object *obj, ResetType type) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(obj); + + qemu_irq_lower(s->irq); +} + +static const VMStateDescription vmstate_designware_i2c =3D { + .name =3D TYPE_DESIGNWARE_I2C, + .version_id =3D 0, + .minimum_version_id =3D 0, + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32_ARRAY(regs, DesignWareI2CState, DESIGNWARE_I2C_R_MA= X), + VMSTATE_FIFO8(rx_fifo, DesignWareI2CState), + VMSTATE_UINT32(status, DesignWareI2CState), + VMSTATE_END_OF_LIST(), + }, +}; + +static void designware_i2c_instance_init(Object *obj) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(obj); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); + RegisterInfoArray *reg_array; + + fifo8_create(&s->rx_fifo, DESIGNWARE_I2C_RX_FIFO_SIZE); + + s->bus =3D i2c_init_bus(DEVICE(s), "i2c-bus"); + + memory_region_init(&s->iomem, obj, TYPE_DESIGNWARE_I2C, 4 * KiB); + reg_array =3D register_init_block32(DEVICE(obj), designware_i2c_regs_i= nfo, + ARRAY_SIZE(designware_i2c_regs_info), + s->regs_info, s->regs, + &designware_i2c_ops, + DESIGNWARE_I2C_ERR_DEBUG, + DESIGNWARE_I2C_R_MAX * 4); + memory_region_add_subregion(&s->iomem, 0, ®_array->mem); + + sysbus_init_mmio(sbd, &s->iomem); + sysbus_init_irq(sbd, &s->irq); +} + +static void designware_i2c_finalize(Object *obj) +{ + DesignWareI2CState *s =3D DESIGNWARE_I2C(obj); + + fifo8_destroy(&s->rx_fifo); +} + +static void designware_i2c_class_init(ObjectClass *klass, const void *data) +{ + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->desc =3D "Designware I2C"; + dc->vmsd =3D &vmstate_designware_i2c; + rc->phases.enter =3D designware_i2c_enter_reset; + rc->phases.hold =3D designware_i2c_hold_reset; + + set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); +} + +static const TypeInfo designware_i2c_types[] =3D { + { + .name =3D TYPE_DESIGNWARE_I2C, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(DesignWareI2CState), + .class_init =3D designware_i2c_class_init, + .instance_init =3D designware_i2c_instance_init, + .instance_finalize =3D designware_i2c_finalize, + }, +}; +DEFINE_TYPES(designware_i2c_types); diff --git a/hw/i2c/Kconfig b/hw/i2c/Kconfig index 596a7a3165ad..0766130b5963 100644 --- a/hw/i2c/Kconfig +++ b/hw/i2c/Kconfig @@ -18,6 +18,11 @@ config ARM_SBCON_I2C bool select BITBANG_I2C =20 +config DESIGNWARE_I2C + bool + select REGISTER + select I2C + config ACPI_SMBUS bool select SMBUS diff --git a/hw/i2c/meson.build b/hw/i2c/meson.build index c459adcb596c..88aea35662dd 100644 --- a/hw/i2c/meson.build +++ b/hw/i2c/meson.build @@ -11,6 +11,7 @@ i2c_ss.add(when: 'CONFIG_MPC_I2C', if_true: files('mpc_i2= c.c')) i2c_ss.add(when: 'CONFIG_ALLWINNER_I2C', if_true: files('allwinner-i2c.c')) i2c_ss.add(when: 'CONFIG_NRF51_SOC', if_true: files('microbit_i2c.c')) i2c_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx_smbus.c')) +i2c_ss.add(when: 'CONFIG_DESIGNWARE_I2C', if_true: files('designware_i2c.c= ')) i2c_ss.add(when: 'CONFIG_SMBUS_EEPROM', if_true: files('smbus_eeprom.c')) i2c_ss.add(when: 'CONFIG_ARM_SBCON_I2C', if_true: files('arm_sbcon_i2c.c')) i2c_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_i2c.c')) --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787923761999.5506553343604; Mon, 29 Jun 2026 19:52:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOZ5-0004ai-8S; Mon, 29 Jun 2026 22:51:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOZ3-0004aA-CS for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:51:09 -0400 Received: from mail-pj1-x1036.google.com ([2607:f8b0:4864:20::1036]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOZ1-0002l3-NP for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:51:09 -0400 Received: by mail-pj1-x1036.google.com with SMTP id 98e67ed59e1d1-37e0a189b0bso2112363a91.1 for ; Mon, 29 Jun 2026 19:51:07 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.51.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:51:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787866; x=1783392666; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=YgLh4IJHtjVfvl3RAAnDUdV/xqs9X9E4b/mYRuZaDCw=; b=cAeV7MXvDfD4p9pAr+sqQQ9zMDbLwzWBlrWPt4UIx59KTvV2FzgxscUfPu17WcNwa0 A9cFOUjwXquZobU9bDpL2WPH2aGbB/kLI8Aqr1InTy3mjH2a/dftkOjBMz+lk6E0rEBf kLHKSIiMCzzRCPy4DhcJWbAnguHnaOGwEPFmKQYBe09wY4dKHnruIfWNseYpyHtIp6Lv U/RQ/QoUBQiacSj1GlJrxoyhcTK9zd0ybugQvkOWvv3OaQsubyaYPBFmBhevcZ2fUwvP Vkx7tblbCLV1RVhcuiAFHWt5YruZ1YyBmmwnv5pjPUhvJpZvA2rSqrOGl/uzz2srq3/U fOZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787866; x=1783392666; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YgLh4IJHtjVfvl3RAAnDUdV/xqs9X9E4b/mYRuZaDCw=; b=XTy7/yYAuByKI2IdJHqeOPUwJQH+6WHjU591OBGVSShyd0Rd5UHtAC39IrXAJ/cM4W vfCSKKeT9nvMiUCB4O3KnAmBCkl0sUCUOnueTCCb/Mw3GwU+K24TZvtMcFxBR55ABCyM EJCmTbAwUFtAaFIVvU9e7cpWFg3uYqW7pgWhxx7yvdAUomu0YSGKAJjPmNFK98Sho3/J qdRUWdkG2yGCpS068hD+Vheb5HGCQRUVJpKi0H3Uczi5I0eB/f3Q9X/vp6MKXfzAvuEV oW1VVwDIXLJXnoVcqpR+pT84zLOkZUY3ujezBANrdFDO1Gjax1AJUp762EC7w6j+on/x o1KQ== X-Forwarded-Encrypted: i=1; AHgh+RqstwWUijRy40n7yVXWawTURNqCont7iDHZ5p2rGJ+Xv8nNsaoNRRu4ibbZ5MblCpixLyiLmXigzzqM@nongnu.org X-Gm-Message-State: AOJu0YxeDWHzwHnwRhFWaSUFY0i0ffHyv74pUEwNvAKluBJ6oWg4PRNV 4+AFHPjyDAJ3qqk8Xe4J185jxysLcIty3D+tJVWhb+ANv1MyB2URZgys X-Gm-Gg: AfdE7cl6HiOc4JAEOFZTbMkK1MfnqyDtvjJpCh+ittgZydpYy62TKbl1YKxZdRjFxTU A5F3Ws3Jg86no7qQH5Gag/oYof9Rd4ds3qWQ/T25MbVKyGaZoJZz/6Mc2MPuDgbxCWk1dzjwy+r lsTVhcIa+s7VCC5RIQaB+aUwNXjKElGDN5GSqjm562rjaStZNa7iX+9IYC2cz5MG/0BIeLxmSNS Hf/SMbFMn+4ON6VNtnP/9SXo9+tGRI7sXakJiOsQw7rXhMRICudfn6ROamCAFgXWz9Z56rD4It/ 9VbOArxidJIZtXWOM+95FRLdc+nOpsuUAt+gf4j1YfMg9Rts3JnhxO31i7XCz0cfblYAf2WToAb jwSF8/hrPNzDyRw5W0ypm/h6W73bHcn9iTw918wcEml6O9FqTnidRV7cgALR+D1mNkgeAxUbsFc EQH+C2E5Hly69rKJsU/Mp16M+0f2j6wnuVCiZmERlZDaPccWTkB21n57Ka9OFhM4oU8NBWm54Hk ktvLbuX920SIs2dj6K/HBRG3fsGI1HoBAXihVMn/DQ= X-Received: by 2002:a17:90b:224f:b0:368:83e6:ca95 with SMTP id 98e67ed59e1d1-38052388689mr1449580a91.0.1782787866138; Mon, 29 Jun 2026 19:51:06 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v10 11/12] hw/riscv/atlantis: Integrate i2c controllers Date: Tue, 30 Jun 2026 12:19:49 +0930 Message-ID: <20260630024952.1520546-12-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1036; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x1036.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787925906158500 Add DesignWare I2C controllers to the tt-atlantis machine. Provide a fixed clock in the device tree so that the Linux driver probes without WARNing. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Alistair Francis Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley --- include/hw/riscv/tt_atlantis.h | 14 ++++++++ hw/riscv/tt_atlantis.c | 59 ++++++++++++++++++++++++++++++++++ hw/riscv/Kconfig | 1 + 3 files changed, 74 insertions(+) diff --git a/include/hw/riscv/tt_atlantis.h b/include/hw/riscv/tt_atlantis.h index a17732ce8114..7f7d4a5a5905 100644 --- a/include/hw/riscv/tt_atlantis.h +++ b/include/hw/riscv/tt_atlantis.h @@ -11,12 +11,15 @@ =20 #include "hw/core/boards.h" #include "hw/core/sysbus.h" +#include "hw/i2c/designware_i2c.h" #include "hw/intc/riscv_imsic.h" #include "hw/riscv/riscv_hart.h" =20 #define TYPE_TT_ATLANTIS_MACHINE MACHINE_TYPE_NAME("tt-atlantis") OBJECT_DECLARE_SIMPLE_TYPE(TTAtlantisState, TT_ATLANTIS_MACHINE) =20 +#define TT_ATL_NUM_I2C 5 + struct TTAtlantisState { /*< private >*/ MachineState parent; @@ -27,11 +30,17 @@ struct TTAtlantisState { =20 RISCVHartArrayState soc; DeviceState *irqchip; + DesignWareI2CState i2c[TT_ATL_NUM_I2C]; =20 int fdt_size; }; =20 enum { + TT_ATL_I2C0_IRQ =3D 33, + TT_ATL_I2C1_IRQ =3D 34, + TT_ATL_I2C2_IRQ =3D 35, + TT_ATL_I2C3_IRQ =3D 36, + TT_ATL_I2C4_IRQ =3D 37, TT_ATL_UART1_IRQ =3D 39, }; =20 @@ -40,6 +49,11 @@ enum { TT_ATL_BOOTROM, TT_ATL_DDR_LO, TT_ATL_DDR_HI, + TT_ATL_I2C0, + TT_ATL_I2C1, + TT_ATL_I2C2, + TT_ATL_I2C3, + TT_ATL_I2C4, TT_ATL_MAPLIC, TT_ATL_MIMSIC, TT_ATL_SAPLIC, diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c index d4fa9c251d3b..5ce150fff7e9 100644 --- a/hw/riscv/tt_atlantis.c +++ b/hw/riscv/tt_atlantis.c @@ -54,6 +54,11 @@ static const MemMapEntry tt_atlantis_memmap[] =3D { [TT_ATL_ACLINT] =3D { 0xa2180000, 0x10000 }, [TT_ATL_SIMSIC] =3D { 0xa4000000, 0x200000 }, [TT_ATL_MAPLIC] =3D { 0xcc000000, 0x4000000 }, + [TT_ATL_I2C0] =3D { 0xd4040000, 0x10000 }, + [TT_ATL_I2C1] =3D { 0xd4050000, 0x10000 }, + [TT_ATL_I2C2] =3D { 0xd4060000, 0x10000 }, + [TT_ATL_I2C3] =3D { 0xd4070000, 0x10000 }, + [TT_ATL_I2C4] =3D { 0xd4080000, 0x10000 }, [TT_ATL_UART1] =3D { 0xd4110000, 0x10000 }, [TT_ATL_SAPLIC] =3D { 0xe8000000, 0x4000000 }, [TT_ATL_DDR_HI] =3D { 0x100000000, 0x1000000000 }, @@ -275,10 +280,40 @@ static void create_fdt_rng(void *fdt) qemu_fdt_setprop(fdt, "/chosen", "rng-seed", rng_seed, sizeof(rng_seed= )); } =20 +static void create_fdt_clk(void *fdt, const char *clock_name, + uint32_t freq, uint32_t phandle) +{ + g_autofree char *name =3D g_strdup_printf("/clocks/%s", clock_name); + + qemu_fdt_add_path(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", "fixed-clock"); + qemu_fdt_setprop_string(fdt, name, "clock-output-names", clock_name); + qemu_fdt_setprop_cell(fdt, name, "#clock-cells", 0); + qemu_fdt_setprop_cell(fdt, name, "clock-frequency", freq); + qemu_fdt_setprop_cell(fdt, name, "phandle", phandle); +} + +static void create_fdt_i2c(void *fdt, const MemMapEntry *mem, uint32_t irq, + uint32_t irqchip_phandle, uint32_t clk_phandle) +{ + g_autofree char *name =3D g_strdup_printf("/soc/i2c@%"HWADDR_PRIX, mem= ->base); + + qemu_fdt_add_subnode(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", "snps,designware-i2c"= ); + qemu_fdt_setprop_sized_cells(fdt, name, "reg", 2, mem->base, 2, mem->s= ize); + qemu_fdt_setprop_cell(fdt, name, "interrupt-parent", irqchip_phandle); + qemu_fdt_setprop_cells(fdt, name, "interrupts", irq, 0x4); + qemu_fdt_setprop_cell(fdt, name, "clocks", clk_phandle); + qemu_fdt_setprop_cell(fdt, name, "clock-frequency", 100000); + qemu_fdt_setprop_cell(fdt, name, "#address-cells", 1); + qemu_fdt_setprop_cell(fdt, name, "#size-cells", 0); +} + static void finalize_fdt(TTAtlantisState *s) { uint32_t aplic_s_phandle =3D next_phandle(); uint32_t imsic_s_phandle =3D next_phandle(); + uint32_t periph_clk_phandle =3D next_phandle(); void *fdt =3D MACHINE(s)->fdt; =20 create_fdt_cpu(s, s->memmap, aplic_s_phandle, imsic_s_phandle); @@ -292,6 +327,15 @@ static void finalize_fdt(TTAtlantisState *s) =20 create_fdt_uart(fdt, &s->memmap[TT_ATL_UART1], TT_ATL_UART1_IRQ, aplic_s_phandle); + + create_fdt_clk(fdt, "periph-clk", 100000000, periph_clk_phandle); + + for (int i =3D 0; i < TT_ATL_NUM_I2C; i++) { + create_fdt_i2c(fdt, + &s->memmap[TT_ATL_I2C0 + i], + TT_ATL_I2C0_IRQ + i, + aplic_s_phandle, periph_clk_phandle); + } } =20 static void create_fdt(TTAtlantisState *s) @@ -492,6 +536,21 @@ static void tt_atlantis_machine_init(MachineState *mac= hine) s->memmap[TT_ATL_UART1].base, s->memmap[TT_ATL_UART1].size); =20 + /* I2C */ + for (int i =3D 0; i < TT_ATL_NUM_I2C; i++) { + SysBusDevice *sbd; + + object_initialize_child(OBJECT(s), "i2c[*]", &s->i2c[i], + TYPE_DESIGNWARE_I2C); + sbd =3D SYS_BUS_DEVICE(&s->i2c[i]); + sysbus_realize(sbd, &error_fatal); + memory_region_add_subregion(system_memory, + s->memmap[TT_ATL_I2C0 + i].base, + sysbus_mmio_get_region(sbd, 0)); + sysbus_connect_irq(sbd, 0, + qdev_get_gpio_in(s->irqchip, TT_ATL_I2C0_IRQ + = i)); + } + /* Load or create device tree */ if (machine->dtb) { load_fdt(s); diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index 5033415440d4..dcce819bf6e9 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -129,6 +129,7 @@ config TENSTORRENT select RISCV_IMSIC select SERIAL_MM select DEVICE_TREE + select DESIGNWARE_I2C =20 config XIANGSHAN_KUNMINGHU bool --=20 2.47.3 From nobody Sat Jul 25 23:42:38 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782787932194600.1278473483735; Mon, 29 Jun 2026 19:52:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weOZG-0004cO-0c; Mon, 29 Jun 2026 22:51:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weOZA-0004bu-61 for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:51:16 -0400 Received: from mail-pj1-x102c.google.com ([2607:f8b0:4864:20::102c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weOZ7-0002lt-2f for qemu-devel@nongnu.org; Mon, 29 Jun 2026 22:51:15 -0400 Received: by mail-pj1-x102c.google.com with SMTP id 98e67ed59e1d1-37e11438c66so1587051a91.3 for ; Mon, 29 Jun 2026 19:51:12 -0700 (PDT) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38052f32661sm704545a91.9.2026.06.29.19.51.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2026 19:51:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782787871; x=1783392671; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=5i2HJZAo+KK0Z/zDUj9Z8Rbai8WnFXe2qEi9yRXKlcw=; b=RlaGfpm06ZBJVi49yg6XafXXJQ2s9Qy0N/1JjfxoWciFPyTqj6NO2Ohu+mKn9x7tQw SuBOzb5w+PgdZGU7H6WpFKnB/JJJ7+dKePoh70a0XEKuzds/yuA60BmnGgzAeFt3Jmut GDayNadL9dXNA1sCel/oCLvy6iH8flcsQgVwPZTm7awMrFsVLWsk6fgmpnGNdsbmRoy3 uAKdtIdAk+trTsJ5nGKZpzyYKxu/iU+QsY/nDWQ08siOswdMmzLbQQ2TqrHDG5WJSo9j DDkrfZJwxspWF4RirDETWxCQYVs7itFQRwYqiI2m8Ih6v3iT3BDZYFVF6YDf8P33QXGL 9rbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782787871; x=1783392671; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5i2HJZAo+KK0Z/zDUj9Z8Rbai8WnFXe2qEi9yRXKlcw=; b=Em1gKxIYEj6vitK6U5QGH4tJszjUzwxUOJs63O7xBfWMPxpEz0tdy+gRsPNOaywgeN V6KMHlrCSn553WQUri5NE+1NxBa+cvlZGpIJBs+dNi/MWQPeDE2rQzvqdzgpGwjyML2F F2GnjrctXBV7E/icHPe5LShZLs+PMDg121pGxinsldtt7IXPcvzIEF2I0yklyzNq138J WpG/Za5hKKcBlfQhDJnAjr9IWvvpc9GUH9hVHcqzHawLCUoCC3U7+p3t77s7RqjDHbZ9 33zQy8W/Ym+vSC1lHiXksbEjMF1Cu+l9GX3tv8fFp24iimzBZ3AKfJfoBDF6wjyH2QAO 50CQ== X-Forwarded-Encrypted: i=1; AHgh+Rq7Twn9mNfBzciZ7NEbrj/5OZPIYiHzhLL6XTVEZdv3XDnwd/lskiqBpnewXgVpGS7bkbLd4NeN8Btt@nongnu.org X-Gm-Message-State: AOJu0YySXLbreGDP2WuUpLPndrSOgaYmnqg0Dc9VmFLnnWvRVguWLJvX LCGPlQqs6yXzNwfMBAtsjiwphc6/l73W3socXnNKb8w50fhsPS53hax5Zf9kSuDB X-Gm-Gg: AfdE7clS91C0byinc1k9rZ4eM3ihJinWZeCnA0mV5zGJwtOb/DQZtmkPRXqW0qU24oi w+BZLv0c1VWAiNZ8N4d87hKRTtgxJmYC+glUeyJWzWH63ABKBuJ6X1ZDHxhzK93ENAoLq5Cc8Mc xTHJjixOtKsoO//Es8FzEZ088GL20l7RmpjOV33T6/7AtGruUgPMa3liVcEjXX7Fy2xgttBBExn uP5Am5YR7o6zyu9cgQp2rZRn49I2WQrcSLU0N+gxdXqzTEnsnFDFDhwmdVdBOC29PoWif1ndAHI dUAnY1oyZoHgqWvlwjBLvIiISlzzp/fDvu28ZzxmFER/j+7dUbB5kvHOhxaKJRbTZjCDjZYrDLS 4O6fjOb18/UzqkkiCWceNMPJk7tFQrT6mXh6zHehcJB/EdNGBbSmteiHNH/FhZEa9Bg/SFcAbMZ L0Dj90/UAE/t5iqJaNdvO1y6ZJjH7ikeVSWpGFaTuYCut/Vca+AxjuXVWzcn5e5o7cGxCJaQSD/ 7iCCHWSfyS5aGLxfMaS/s7I0i1AgFSxF6SJL83XPUQ= X-Received: by 2002:a17:90b:3e4d:b0:37f:9ce2:348b with SMTP id 98e67ed59e1d1-380527fcd46mr1221775a91.28.1782787871441; Mon, 29 Jun 2026 19:51:11 -0700 (PDT) From: Joel Stanley To: Alistair Francis Cc: Nicholas Piggin , Andrew Jones , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Chao Liu , Michael Ellerman , Joel Stanley , Anirudh Srinivasan , Portia Stephens , qemu-riscv@nongnu.org, qemu-devel@nongnu.org, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v10 12/12] hw/riscv/atlantis: Add some i2c peripherals Date: Tue, 30 Jun 2026 12:19:50 +0930 Message-ID: <20260630024952.1520546-13-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630024952.1520546-1-joel@jms.id.au> References: <20260630024952.1520546-1-joel@jms.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102c; envelope-from=joel.stan@gmail.com; helo=mail-pj1-x102c.google.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782787933951158500 Add an I2C RTC device and a temperature sensor. These are not present on the board but help for testing. The tmp105 is a lm75 compatible temperature sensor used by the SENSORS_LM75 Linux kernel driver. The ds1338 is a RTC device that is used by the RTC_DRV_DS1307 Linux kernel driver. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Alistair Francis Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley --- hw/riscv/tt_atlantis.c | 27 +++++++++++++++++++++++++++ hw/riscv/Kconfig | 2 ++ 2 files changed, 29 insertions(+) diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c index 5ce150fff7e9..beaf64e0c114 100644 --- a/hw/riscv/tt_atlantis.c +++ b/hw/riscv/tt_atlantis.c @@ -64,6 +64,13 @@ static const MemMapEntry tt_atlantis_memmap[] =3D { [TT_ATL_DDR_HI] =3D { 0x100000000, 0x1000000000 }, }; =20 +static I2CBus *i2c_get_bus(TTAtlantisState *s, unsigned busnr) +{ + assert(busnr < TT_ATL_NUM_I2C); + + return s->i2c[busnr].bus; +} + static uint32_t fdt_phandle =3D 1; static uint32_t next_phandle(void) { @@ -309,6 +316,19 @@ static void create_fdt_i2c(void *fdt, const MemMapEntr= y *mem, uint32_t irq, qemu_fdt_setprop_cell(fdt, name, "#size-cells", 0); } =20 +static void create_fdt_i2c_device(TTAtlantisState *s, int bus, + const char *compat, int addr) +{ + void *fdt =3D MACHINE(s)->fdt; + hwaddr base =3D s->memmap[TT_ATL_I2C0 + bus].base; + g_autofree char *name =3D g_strdup_printf("/soc/i2c@%"HWADDR_PRIX"/sen= sor@%x", + base, addr); + + qemu_fdt_add_subnode(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", compat); + qemu_fdt_setprop_cell(fdt, name, "reg", addr); +} + static void finalize_fdt(TTAtlantisState *s) { uint32_t aplic_s_phandle =3D next_phandle(); @@ -336,6 +356,9 @@ static void finalize_fdt(TTAtlantisState *s) TT_ATL_I2C0_IRQ + i, aplic_s_phandle, periph_clk_phandle); } + + create_fdt_i2c_device(s, 0, "dallas,ds1338", 0x6f); + create_fdt_i2c_device(s, 4, "ti,tmp105", 0x48); } =20 static void create_fdt(TTAtlantisState *s) @@ -551,6 +574,10 @@ static void tt_atlantis_machine_init(MachineState *mac= hine) qdev_get_gpio_in(s->irqchip, TT_ATL_I2C0_IRQ + = i)); } =20 + /* I2C peripherals: qemu specific */ + i2c_slave_create_simple(i2c_get_bus(s, 0), "ds1338", 0x6f); + i2c_slave_create_simple(i2c_get_bus(s, 4), "tmp105", 0x48); + /* Load or create device tree */ if (machine->dtb) { load_fdt(s); diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index dcce819bf6e9..de37c08caece 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -130,6 +130,8 @@ config TENSTORRENT select SERIAL_MM select DEVICE_TREE select DESIGNWARE_I2C + select DS1338 + select TMP105 =20 config XIANGSHAN_KUNMINGHU bool --=20 2.47.3