From nobody Sat Sep 26 20:52:57 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=reject dis=none) header.from=oss.tenstorrent.com ARC-Seal: i=1; a=rsa-sha256; t=1788533340; cv=none; d=zohomail.com; s=zohoarc; b=TffJ6HMXLqDg3XMnhi+bYF9IVKXSk/Fo9rlqANvTshZfvRqSzFN4DRfmHw725f25XOnBP1xzV7zmPhQc8vlGLMkzb4ZtDWdpPWUNK9ghcwubQi5doECGpeaCk2AQgqRjaxWWxCkDF6NvEWC9U/xhawIPzpxKXTtPIxLT9zeyd5Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788533340; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=SM+c0cnIvb5LQUN7VGkNy8kRUZs+dR2DbPx/QxsCklE=; b=eqYjSZSxkW+kWY+yGtrVRQujz7cnYrtdYFLMltoH7jTv3sg4vDtkiHmdh+N2a5HWOFnIZOBrwMXq05BdiwR+GqX1DVS81F+MN+8CaaRzoQOx2ZMLa/XyDDhA2kXCLiURvkxpvcsOvpgN3eu9WhilVwBLDI0UX83zyrFaLnwI9yM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1788533336333291.2805991178177; Fri, 4 Sep 2026 07:48:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x2VD1-00038d-T9; Fri, 04 Sep 2026 10:48:03 -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 1x2VCz-00034q-MQ for qemu-devel@nongnu.org; Fri, 04 Sep 2026 10:48:01 -0400 Received: from mail-yw1-x112f.google.com ([2607:f8b0:4864:20::112f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x2VCw-0004VE-5v for qemu-devel@nongnu.org; Fri, 04 Sep 2026 10:48:01 -0400 Received: by mail-yw1-x112f.google.com with SMTP id 00721157ae682-867a943b149so19552447b3.1 for ; Fri, 04 Sep 2026 07:47:57 -0700 (PDT) Received: from [192.168.2.129] ([2600:1700:220:59e0:6f99:bae4:e245:b362]) by smtp.gmail.com with ESMTPSA id 00721157ae682-8714ab73f23sm19274597b3.33.2026.09.04.07.47.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Sep 2026 07:47:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tenstorrent.com; s=google; t=1788533277; x=1789138077; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=SM+c0cnIvb5LQUN7VGkNy8kRUZs+dR2DbPx/QxsCklE=; b=eyd81mo6HckrGc8wPO6sGCQY/YbMvudErK/3tj8tJ4jk4q2ugH0e2D4F87JR6JAjRy llMadyWjXF2I07HDirR4pvrT76HhpYBp1IbPGaf8nVMN8Q9WmXhXQB8yogsFYbntfEzj KWrHUdS34VINuhUwUDQpnq9ifs8aJAb0aAWGiTwXynK6rjoArvchCFNhGMsOi34dfxw8 MC1stQIHsvne3z8P6Xv9NeG4WIzxBj7cRrxXXRGH5cN4AkLRlOaUILLa/4iBl0sEnEIU gPn/hudOraJyK8QLEO2pLRx8V3Mm8cqfNPs/DcUG9luSFw7MPtcxuH3JVSOysvqLd4g8 IJSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788533277; x=1789138077; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=SM+c0cnIvb5LQUN7VGkNy8kRUZs+dR2DbPx/QxsCklE=; b=bLP5Dh86cOrzEroLVwU/jSn/62OabE+25ZiW2ZLyRowmnG14ccguwYMtFLhby8x8K2 e4rpIwawLi1EqxemSlznQDopayKmXFG7+n5m7WYDq6WoG8ASvVCP7RJMYUooCT0SnM4B gRqTTGRGZMy6MHwmiJ/YdCzadhnqN7N/rf2aLoyzhHUdofp0vpXUys2Ejoax9y4q7U52 zF/ZZqJ8WNNwHZm2gINtkbJvkCh8kBGFB2Rzot/KwfbG9KT4zAMCntePgsmAAKTILliK DGf+nFJGNKU9eD3VJQSAxh6mtxB7b6dxzhuUJJV/r62787tvCAsyseeWgdFYGN5gkrMd r02g== X-Gm-Message-State: AFuF++ncgiYGo73Kuzx27UBFFNWedeNLIqiADTQ27Fbi1a32H+k82qmS VYu8/cuARSl9D/5uXBXgXUU9cvO7WHWPKi4gc06oNTMp9KMA1ZuorkPJsxGqfr1VVfg= X-Gm-Gg: AYBFou2wq7TxgelfRqeOMfdHueJpogTVEujtGBYWEFibV0ihDiBV/QfPiZeib7KvkZj 53Gpu8Y7lkWeL+NzLmtBFf1Li98BXtCXMd09vcyV/qmpRo7C6rrUbXdDp1BHydoacNPbWciwDJk 3jjFjni2EuOa5CvuKT2bI2UhdX0/UD9ii2eS0SYt6Wy1Sa39wduJlnAmKRNFNhE53SxGW27nFIF tjR8m+YKe2jKAcjoHXbx8dAvN3Kv0b/UKLemO6tvBJPmLk4QWS5GOoBehCl4skKY5uM5JlSE1XV brjyYS7wQ2scp298Ys0DyI2gL3BVlXvkxc8or16dJB9qs0d8L36Hu/LJuJyyme80CQVUEm4fedg smhGaWCXesNRELC5bpoOYJw1p571oPaUTU2AIKJYcW9yGoCxIsYB15KICSK5hVDa/Ep5wt4DaFO Np4OqSfD029D3w3HI0Gmc6uijXL/aBJyW7BCw5w+Hnt3+eFkcQwha+4caPKHjqjecDjYFDTw/Fh 8fJBJlb18mGBAC3nZ6aVCGUZwUN4Wh19Fq5g+tiKHGc X-Received: by 2002:a05:690c:d85:b0:873:5bd1:98bb with SMTP id 00721157ae682-8735bd19fadmr6039107b3.45.1788533276748; Fri, 04 Sep 2026 07:47:56 -0700 (PDT) From: Anirudh Srinivasan Date: Fri, 04 Sep 2026 09:47:28 -0500 Subject: [PATCH v3 1/3] hw/misc: Add Tenstorrent Atlantis PRCM model MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260904-atlantis_prcm-v3-1-8bf20795a381@oss.tenstorrent.com> References: <20260904-atlantis_prcm-v3-0-8bf20795a381@oss.tenstorrent.com> In-Reply-To: <20260904-atlantis_prcm-v3-0-8bf20795a381@oss.tenstorrent.com> To: qemu-devel@nongnu.org Cc: Joel Stanley , Nicholas Piggin , Michael Ellerman , Portia Stephens , qemu-riscv@nongnu.org, Pierrick Bouvier , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Chao Liu , Anirudh Srinivasan X-Mailer: b4 0.15.1 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::112f; envelope-from=asrinivasan@tenstorrent.com; helo=mail-yw1-x112f.google.com X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham 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: pass (identity @tenstorrent.com) X-ZM-MESSAGEID: 1788533350344154100 This device present in Tenstorrent Atlantis has registers that control clocks, reset and other misc functionality in the SoC. This commit adds models for the RCPU, HSIO, PCIE, MM and 2 DDR PRCMs. Co-developed-by: Portia Stephens Signed-off-by: Portia Stephens Signed-off-by: Anirudh Srinivasan --- MAINTAINERS | 2 + hw/misc/meson.build | 1 + hw/misc/trace-events | 4 + hw/misc/tt_atlantis_prcm.c | 446 +++++++++++++++++++++++++++++++++= ++++ include/hw/misc/tt_atlantis_prcm.h | 51 +++++ 5 files changed, 504 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index f524d90523..b6cc077602 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1830,7 +1830,9 @@ R: Portia Stephens L: qemu-riscv@nongnu.org S: Supported F: docs/system/riscv/tt_*.rst +F: hw/misc/tt_*.c F: hw/riscv/tt_*.c +F: include/hw/misc/tt_*.h F: include/hw/riscv/tt_*.h F: tests/functional/riscv64/test_tt_*.py =20 diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 54e07aacda..11b9593e03 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -39,6 +39,7 @@ system_ss.add(when: 'CONFIG_SIFIVE_E_AON', if_true: files= ('sifive_e_aon.c')) system_ss.add(when: 'CONFIG_SIFIVE_U_OTP', if_true: files('sifive_u_otp.c'= )) system_ss.add(when: 'CONFIG_SIFIVE_U_PRCI', if_true: files('sifive_u_prci.= c')) system_ss.add(when: 'CONFIG_K230_DECOMP_GZIP', if_true: files('k230_decomp= _gzip.c')) +system_ss.add(when: 'CONFIG_TENSTORRENT', if_true: files('tt_atlantis_prcm= .c')) =20 subdir('macio') =20 diff --git a/hw/misc/trace-events b/hw/misc/trace-events index 0b8be3d0f2..8b80b71107 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -452,3 +452,7 @@ launch_update_write(void) "" vmlaunch_reset_enter(void) "" vm_launchupdate_finalize(void) "" restore_host_x86_igvm(void) "" + +# tt_atlantis_prcm.c +tt_atlantis_prcm_read(uint32_t domain, uint64_t offset, uint64_t data) "do= main 0x%02x offset 0x%" PRIx64 " data 0x%" PRIx64 +tt_atlantis_prcm_write(uint32_t domain, uint64_t offset, uint64_t data) "d= omain 0x%02x offset 0x%" PRIx64 " data 0x%" PRIx64 diff --git a/hw/misc/tt_atlantis_prcm.c b/hw/misc/tt_atlantis_prcm.c new file mode 100644 index 0000000000..392d7da7f4 --- /dev/null +++ b/hw/misc/tt_atlantis_prcm.c @@ -0,0 +1,446 @@ +/* + * PRCM (Clock and Reset Controller) in Tenstorrent Atlantis SoC + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright 2026 Tenstorrent + */ + +#include "qemu/osdep.h" +#include "qemu/bitops.h" +#include "qapi/error.h" +#include "qemu/log.h" +#include "hw/misc/tt_atlantis_prcm.h" +#include "hw/core/qdev-properties.h" +#include "hw/core/registerfields.h" +#include "hw/core/irq.h" +#include "trace.h" + +#define TO_REG(offset) ((offset) >> 2) + +#define PLL_LOCK_BIT 31 +#define PLL_FBDIV_LSB 14 +#define PLL_POSTDIV2_LSB 11 +#define PLL_POSTDIV1_LSB 8 +#define PLL_REFDIV_LSB 2 +#define PLL_BYPASS_BIT 1 + +#define PLL_RESET_VAL(BYPASS, REFDIV, POSTDIV1, POSTDIV2, FBDIV, LOCK) = \ + ((LOCK << PLL_LOCK_BIT) | (FBDIV << PLL_FBDIV_LSB) | = \ + (POSTDIV2 << PLL_POSTDIV2_LSB) | (POSTDIV1 << PLL_POSTDIV1_LSB) | = \ + (REFDIV << PLL_REFDIV_LSB) | (BYPASS << PLL_BYPASS_BIT)) + +#define RCPU_PLL_RCPU_CFG TO_REG(0) +#define RCPU_PLL_NOCC_CFG TO_REG(0x4) +#define RCPU_NOCC_CLK_CFG TO_REG(0x8) +#define RCPU_RCPU_DIV_CFG TO_REG(0xc) +#define RCPU_RCPU_BLK_CG TO_REG(0x14) +#define RCPU_LSIO_BLK_CG TO_REG(0x18) +#define RCPU_RCPU_BLK_RST TO_REG(0x1c) +#define RCPU_LSIO_BLK_RST TO_REG(0x20) +#define RCPU_PLL_RCPU_EN TO_REG(0x11c) +#define RCPU_PLL_NOCC_EN TO_REG(0x120) +#define RCPU_PLL_MM_EN TO_REG(0x0124) +#define RCPU_PLL1_MM_EN TO_REG(0x0128) +#define RCPU_PLL_HSIO_EN TO_REG(0x12c) +#define RCPU_PLL_PCIE_EN TO_REG(0x138) +#define RCPU_PLL_I2S_EN TO_REG(0x13C) +#define RCPU_PLL_MM_CFG TO_REG(0x19c) +#define RCPU_PLL_HSIO_CFG TO_REG(0x1a0) +#define RCPU_PLL_PCIE_CFG TO_REG(0x1ac) +#define RCPU_BOOT_MODE_CFG TO_REG(0x1b0) +#define RCPU_PLL_I2S_CFG TO_REG(0x1f4) +#define RCPU_I2S_DIV_CFG TO_REG(0x1f8) +#define RCPU_BUS_CFG TO_REG(0x1fc) +#define RCPU_PLL1_MM_CFG TO_REG(0x2a4) + +#define HSIO_HSIO_DIV_CFG TO_REG(0x0) +#define HSIO_HSIO_DIV_CFG1 TO_REG(0x4) +#define HSIO_HSIO_BLK_CG TO_REG(0x8) +#define HSIO_HSIO_BLK_RST TO_REG(0xc) +#define HSIO_HSIO_GMAC_DIV_CFG TO_REG(0x10) + +#define PCIE_SUBS_RST_CTL TO_REG(0x0) +#define PCIE_SUBS_CG_CTL TO_REG(0x4) +#define PCIE_SUBS_CK_CTL TO_REG(0x8) + +#define MM_MM_CLK_GATE_CFG TO_REG(0x8) +#define MM_MM_CLK_DIV_CFG TO_REG(0xC) +#define MM_MM_CLK_SEL_CFG TO_REG(0x10) +#define MM_MM_RSTN TO_REG(0x14) +#define MM_MM_CLK_DIV_CFG1 TO_REG(0x130) + +#define DDRC_STAT TO_REG(0x10014) +#define DDRC_DFISTAT TO_REG(0x10514) +#define DDRC_SWSTAT TO_REG(0x10c84) + +#define PLL_EN BIT(0) +#define RCPU_PLL_BUS_CG_EN BIT(7) +#define HSIO_PLL_BUS_CG_EN BIT(3) +#define PCIE_PLL_BUS_CG_EN BIT(1) +#define NOCC_PLL_BUS_CG_EN BIT(0) + +#define RCPU_BOOT_MODE_UART (0x0 << 4) +#define RCPU_BOOT_MODE_NOR (0x1 << 4) +#define RCPU_BOOT_MODE_SD (0x2 << 4) + +#define RCPU_DOMAIN_SIZE 0x10000 +#define HSIO_DOMAIN_SIZE 0x510 +#define PCIE_DOMAIN_SIZE 0x100 +#define MM_DOMAIN_SIZE 0x1000 +#define DDRC0_DOMAIN_SIZE 0x101000 +#define DDRC1_DOMAIN_SIZE 0x101000 + +static uint64_t tt_atlantis_prcm_read(void *opaque, hwaddr offset, + unsigned size) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(opaque); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_GET_CLASS(s); + uint32_t data; + + if (offset >=3D c->regs_size) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "= \n", + __func__, offset); + return 0; + } + data =3D s->regs[TO_REG(offset)]; + + trace_tt_atlantis_prcm_read(c->domain, offset, data); + return data; +} + +static void tt_atlantis_prcm_write(void *opaque, hwaddr offset, + uint64_t data, unsigned size) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(opaque); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_GET_CLASS(s); + + if (offset >=3D c->regs_size) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx = "\n", + __func__, offset); + return; + } + + trace_tt_atlantis_prcm_write(c->domain, offset, data); + + s->regs[TO_REG(offset)] =3D data; +} + +static void tt_atlantis_prcm_rcpu_write(void *opaque, hwaddr offset, + uint64_t data, unsigned size) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(opaque); + uint32_t pll_reg_offset; + + tt_atlantis_prcm_write(opaque, offset, data, size); + + switch (TO_REG(offset)) { + case RCPU_PLL_RCPU_EN: + pll_reg_offset =3D RCPU_PLL_RCPU_CFG; + break; + case RCPU_PLL_NOCC_EN: + pll_reg_offset =3D RCPU_PLL_NOCC_CFG; + break; + case RCPU_PLL_HSIO_EN: + pll_reg_offset =3D RCPU_PLL_HSIO_CFG; + break; + case RCPU_PLL_PCIE_EN: + pll_reg_offset =3D RCPU_PLL_PCIE_CFG; + break; + case RCPU_PLL_MM_EN: + pll_reg_offset =3D RCPU_PLL_MM_CFG; + break; + case RCPU_PLL1_MM_EN: + pll_reg_offset =3D RCPU_PLL1_MM_CFG; + break; + case RCPU_PLL_I2S_EN: + pll_reg_offset =3D RCPU_PLL_I2S_CFG; + break; + default: + return; + } + + if (data & PLL_EN) { + s->regs[pll_reg_offset] |=3D BIT(PLL_LOCK_BIT); + } else { + s->regs[pll_reg_offset] &=3D ~BIT(PLL_LOCK_BIT); + } +} + +static const MemoryRegionOps tt_atlantis_prcm_ops =3D { + .read =3D tt_atlantis_prcm_read, + .write =3D tt_atlantis_prcm_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, +}; + +static const MemoryRegionOps tt_atlantis_prcm_rcpu_ops =3D { + .read =3D tt_atlantis_prcm_read, + .write =3D tt_atlantis_prcm_rcpu_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, +}; + +static void tt_atlantis_prcm_realize(DeviceState *dev, Error **errp) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(dev); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_GET_CLASS(s); + + if (c->domain >=3D PRCM_DOMAIN_COUNT) { + error_setg(errp, + "domain %d is larger than max number of possible domain= s %d", + c->domain, PRCM_DOMAIN_COUNT); + return; + } + s->regs =3D g_new0(uint32_t, TO_REG(c->regs_size)); + + memory_region_init_io(&s->mmio, OBJECT(s), c->ops, s, + TYPE_TT_ATLANTIS_PRCM, c->regs_size); + sysbus_init_mmio(sbd, &s->mmio); +} + +static void tt_atlantis_prcm_reset_hold(Object *obj, ResetType type) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(obj); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_GET_CLASS(s); + + memset(s->regs, 0, c->regs_size); +} + +static void tt_atlantis_prcm_rcpu_reset_hold(Object *obj, ResetType type) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(obj); + tt_atlantis_prcm_reset_hold(obj, type); + + /* Reset values come from Datasheet */ + s->regs[RCPU_PLL_RCPU_CFG] =3D PLL_RESET_VAL(1, 0, 4, 0, 100, 1); + s->regs[RCPU_PLL_NOCC_CFG] =3D PLL_RESET_VAL(0, 2, 2, 2, 267, 1); + s->regs[RCPU_NOCC_CLK_CFG] =3D (0x25f31 << 1) | BIT(0); + s->regs[RCPU_RCPU_DIV_CFG] =3D (0xb8c2 << 1); + s->regs[RCPU_RCPU_BLK_CG] =3D 0; + s->regs[RCPU_LSIO_BLK_CG] =3D 0; + s->regs[RCPU_RCPU_BLK_RST] =3D 0xffffffff; + s->regs[RCPU_LSIO_BLK_RST] =3D 0xffffffff; + s->regs[RCPU_PLL_RCPU_EN] =3D PLL_EN; + s->regs[RCPU_PLL_NOCC_EN] =3D PLL_EN; + s->regs[RCPU_PLL_HSIO_EN] =3D 0; + s->regs[RCPU_PLL_MM_EN] =3D 0; + s->regs[RCPU_PLL1_MM_EN] =3D 0; + s->regs[RCPU_PLL_I2S_EN] =3D 0; + s->regs[RCPU_PLL_PCIE_EN] =3D 0; + s->regs[RCPU_PLL_HSIO_CFG] =3D PLL_RESET_VAL(0, 1, 2, 1, 50, 0); + s->regs[RCPU_PLL_PCIE_CFG] =3D PLL_RESET_VAL(0, 2, 3, 1, 250, 0); + s->regs[RCPU_BOOT_MODE_CFG] =3D RCPU_BOOT_MODE_SD; + s->regs[RCPU_PLL_MM_CFG] =3D PLL_RESET_VAL(0, 1, 2, 1, 50, 1); + s->regs[RCPU_PLL1_MM_CFG] =3D PLL_RESET_VAL(0, 1, 2, 1, 50, 1); + s->regs[RCPU_PLL_I2S_CFG] =3D PLL_RESET_VAL(0, 1, 6, 6, 33, 0); + s->regs[RCPU_I2S_DIV_CFG] =3D 0xde69ad31; + s->regs[RCPU_BUS_CFG] =3D NOCC_PLL_BUS_CG_EN | HSIO_PLL_BUS_CG_EN; +} + +static void tt_atlantis_prcm_ddrc_reset_hold(Object *obj, ResetType type) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(obj); + tt_atlantis_prcm_reset_hold(obj, type); + + /* Reset values come from Datasheet */ + s->regs[DDRC_STAT] =3D 0x1; + s->regs[DDRC_DFISTAT] =3D 0x1; + s->regs[DDRC_SWSTAT] =3D 0x1; +} + +static void tt_atlantis_prcm_hsio_reset_hold(Object *obj, ResetType type) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(obj); + tt_atlantis_prcm_reset_hold(obj, type); + + /* Reset values come from Datasheet */ + s->regs[HSIO_HSIO_DIV_CFG] =3D 0x20821731; + s->regs[HSIO_HSIO_DIV_CFG1] =3D 0x8; + s->regs[HSIO_HSIO_BLK_CG] =3D 0; + s->regs[HSIO_HSIO_BLK_RST] =3D 0; + s->regs[HSIO_HSIO_GMAC_DIV_CFG] =3D 0; +} + +static void tt_atlantis_prcm_pcie_reset_hold(Object *obj, ResetType type) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(obj); + tt_atlantis_prcm_reset_hold(obj, type); + + /* Reset values come from Datasheet */ + s->regs[PCIE_SUBS_RST_CTL] =3D 0; + s->regs[PCIE_SUBS_CG_CTL] =3D 0; + s->regs[PCIE_SUBS_CK_CTL] =3D 0x44908; +} + +static void tt_atlantis_prcm_mm_reset_hold(Object *obj, ResetType type) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(obj); + tt_atlantis_prcm_reset_hold(obj, type); + + /* Reset values come from Datasheet */ + s->regs[MM_MM_CLK_GATE_CFG] =3D 0; + s->regs[MM_MM_CLK_DIV_CFG] =3D 0xddc8312; + s->regs[MM_MM_CLK_SEL_CFG] =3D 0; + s->regs[MM_MM_RSTN] =3D 0; + s->regs[MM_MM_CLK_DIV_CFG1] =3D 0x333; +} + +static void tt_atlantis_prcm_unrealize(DeviceState *dev) +{ + TTAtlantisPRCMState *s =3D TT_ATLANTIS_PRCM(dev); + + g_free(s->regs); +} + +static void tt_atlantis_prcm_class_init(ObjectClass *klass, + const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_CLASS(klass); + + dc->realize =3D tt_atlantis_prcm_realize; + dc->unrealize =3D tt_atlantis_prcm_unrealize; + dc->desc =3D "Tenstorrent Atlantis PRCM Controller"; + rc->phases.hold =3D tt_atlantis_prcm_reset_hold; + c->ops =3D &tt_atlantis_prcm_ops; +} + +static void tt_atlantis_prcm_rcpu_class_init(ObjectClass *klass, + const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_CLASS(klass); + + dc->realize =3D tt_atlantis_prcm_realize; + dc->desc =3D "Tenstorrent Atlantis RCPU PRCM Controller"; + rc->phases.hold =3D tt_atlantis_prcm_rcpu_reset_hold; + c->domain =3D PRCM_DOMAIN_RCPU; + c->regs_size =3D RCPU_DOMAIN_SIZE; + c->ops =3D &tt_atlantis_prcm_rcpu_ops; +} + +static void tt_atlantis_prcm_hsio_class_init(ObjectClass *klass, + const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_CLASS(klass); + + dc->realize =3D tt_atlantis_prcm_realize; + dc->desc =3D "Tenstorrent Atlantis HSIO PRCM Controller"; + rc->phases.hold =3D tt_atlantis_prcm_hsio_reset_hold; + c->domain =3D PRCM_DOMAIN_HSIO; + c->regs_size =3D HSIO_DOMAIN_SIZE; + c->ops =3D &tt_atlantis_prcm_ops; +} + +static void tt_atlantis_prcm_pcie_class_init(ObjectClass *klass, + const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_CLASS(klass); + + dc->realize =3D tt_atlantis_prcm_realize; + dc->desc =3D "Tenstorrent Atlantis PCIE PRCM Controller"; + rc->phases.hold =3D tt_atlantis_prcm_pcie_reset_hold; + c->domain =3D PRCM_DOMAIN_PCIE; + c->regs_size =3D PCIE_DOMAIN_SIZE; + c->ops =3D &tt_atlantis_prcm_ops; +} + +static void tt_atlantis_prcm_mm_class_init(ObjectClass *klass, + const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_CLASS(klass); + + dc->realize =3D tt_atlantis_prcm_realize; + dc->desc =3D "Tenstorrent Atlantis MM PRCM Controller"; + rc->phases.hold =3D tt_atlantis_prcm_mm_reset_hold; + c->domain =3D PRCM_DOMAIN_MM; + c->regs_size =3D MM_DOMAIN_SIZE; + c->ops =3D &tt_atlantis_prcm_ops; +} + +static void tt_atlantis_prcm_ddrc0_class_init(ObjectClass *klass, + const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_CLASS(klass); + + dc->realize =3D tt_atlantis_prcm_realize; + dc->desc =3D "Tenstorrent Atlantis DDR Memory Controller 0 PRCM"; + rc->phases.hold =3D tt_atlantis_prcm_ddrc_reset_hold; + c->domain =3D PRCM_DOMAIN_DDRC0; + c->regs_size =3D DDRC0_DOMAIN_SIZE; + c->ops =3D &tt_atlantis_prcm_ops; +} + +static void tt_atlantis_prcm_ddrc1_class_init(ObjectClass *klass, + const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + TTAtlantisPRCMClass *c =3D TT_ATLANTIS_PRCM_CLASS(klass); + + dc->realize =3D tt_atlantis_prcm_realize; + dc->desc =3D "Tenstorrent Atlantis DDR Memory Controller 1 PRCM"; + rc->phases.hold =3D tt_atlantis_prcm_ddrc_reset_hold; + c->domain =3D PRCM_DOMAIN_DDRC1; + c->regs_size =3D DDRC1_DOMAIN_SIZE; + c->ops =3D &tt_atlantis_prcm_ops; +} + +static const TypeInfo tt_atlantis_prcm_types[] =3D { + { + .name =3D TYPE_TT_ATLANTIS_PRCM, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(TTAtlantisPRCMState), + .class_init =3D tt_atlantis_prcm_class_init, + .class_size =3D sizeof(TTAtlantisPRCMClass), + .abstract =3D true, + }, + { + .name =3D TYPE_TT_ATLANTIS_PRCM_RCPU, + .parent =3D TYPE_TT_ATLANTIS_PRCM, + .class_init =3D tt_atlantis_prcm_rcpu_class_init, + }, + { + .name =3D TYPE_TT_ATLANTIS_PRCM_HSIO, + .parent =3D TYPE_TT_ATLANTIS_PRCM, + .class_init =3D tt_atlantis_prcm_hsio_class_init, + }, + { + .name =3D TYPE_TT_ATLANTIS_PRCM_PCIE, + .parent =3D TYPE_TT_ATLANTIS_PRCM, + .class_init =3D tt_atlantis_prcm_pcie_class_init, + }, + { + .name =3D TYPE_TT_ATLANTIS_PRCM_MM, + .parent =3D TYPE_TT_ATLANTIS_PRCM, + .class_init =3D tt_atlantis_prcm_mm_class_init, + }, + { + .name =3D TYPE_TT_ATLANTIS_PRCM_DDRC0, + .parent =3D TYPE_TT_ATLANTIS_PRCM, + .class_init =3D tt_atlantis_prcm_ddrc0_class_init, + }, + { + .name =3D TYPE_TT_ATLANTIS_PRCM_DDRC1, + .parent =3D TYPE_TT_ATLANTIS_PRCM, + .class_init =3D tt_atlantis_prcm_ddrc1_class_init, + }, +}; + +DEFINE_TYPES(tt_atlantis_prcm_types); diff --git a/include/hw/misc/tt_atlantis_prcm.h b/include/hw/misc/tt_atlant= is_prcm.h new file mode 100644 index 0000000000..dc7938433a --- /dev/null +++ b/include/hw/misc/tt_atlantis_prcm.h @@ -0,0 +1,51 @@ +/* + * PRCM (Clock and Reset Controller) in Tenstorrent Atlantis SoC + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright 2026 Tenstorrent + */ + +#ifndef TT_ATLANTIS_PRCM_H +#define TT_ATLANTIS_PRCM_H + +#include "hw/core/sysbus.h" + +#define TYPE_TT_ATLANTIS_PRCM "tt.atlantis.prcm" +#define TYPE_TT_ATLANTIS_PRCM_RCPU "tt.atlantis.prcm.rcpu" +#define TYPE_TT_ATLANTIS_PRCM_HSIO "tt.atlantis.prcm.hsio" +#define TYPE_TT_ATLANTIS_PRCM_PCIE "tt.atlantis.prcm.pcie" +#define TYPE_TT_ATLANTIS_PRCM_MM "tt.atlantis.prcm.mm" +#define TYPE_TT_ATLANTIS_PRCM_DDRC0 "tt.atlantis.prcm.ddrc0" +#define TYPE_TT_ATLANTIS_PRCM_DDRC1 "tt.atlantis.prcm.ddrc1" +OBJECT_DECLARE_TYPE(TTAtlantisPRCMState, TTAtlantisPRCMClass, + TT_ATLANTIS_PRCM); + + +enum { + PRCM_DOMAIN_RCPU =3D 0, + PRCM_DOMAIN_HSIO =3D 1, + PRCM_DOMAIN_PCIE =3D 2, + PRCM_DOMAIN_MM =3D 3, + PRCM_DOMAIN_DDRC0 =3D 4, + PRCM_DOMAIN_DDRC1 =3D 5, + PRCM_DOMAIN_COUNT =3D 6 +}; + +struct TTAtlantisPRCMState { + SysBusDevice parent; + + MemoryRegion mmio; + + uint32_t *regs; +}; + +struct TTAtlantisPRCMClass { + SysBusDeviceClass parent_class; + + uint32_t domain; + uint32_t regs_size; + const MemoryRegionOps *ops; +}; + +#endif --=20 2.43.0 From nobody Sat Sep 26 20:52:57 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=reject dis=none) header.from=oss.tenstorrent.com ARC-Seal: i=1; a=rsa-sha256; t=1788533342; cv=none; d=zohomail.com; s=zohoarc; b=BRTUTJkAS7Nr1Z2HieahLwVc05B57UOEwngFqanbBeAHH8BjlmSwSlHwnUYfsEJLouWL/Gdwusp+OexaW4phSYEfA6QmQdjDPhCCCW2olVV2l9xfQVZCHKpMOI9NO8q8FLgughqi0cmh0+wgYgcLWOzbXbkUS/9WyPG095xrcDs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788533342; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=XCclJD14e1dhn5+WjJeOdDkpX8FrnlxuNas3n5cM4X0=; b=gjkO6SJN2sqzCgn2mV2RfZ0AdGkM6Imb+KDPQUvr8UHEzgyGxhM5TWcFupB2i9hVzCLBpJWfda1hrEmkqQLDt40OBYEtCcPCtGcjShAYvDULb7H5v1qKFm3UmO4djT4W1nwTe89GyZvawohWZ8fSGsf7hFuH3rm3iFTKXfHFi88= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1788533342126795.4555205409555; Fri, 4 Sep 2026 07:49:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x2VD2-00039I-BC; Fri, 04 Sep 2026 10:48:04 -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 1x2VCz-00034y-R2 for qemu-devel@nongnu.org; Fri, 04 Sep 2026 10:48:01 -0400 Received: from mail-yw1-x112f.google.com ([2607:f8b0:4864:20::112f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x2VCw-0004W4-VN for qemu-devel@nongnu.org; Fri, 04 Sep 2026 10:48:01 -0400 Received: by mail-yw1-x112f.google.com with SMTP id 00721157ae682-86d43cdee51so14117557b3.2 for ; Fri, 04 Sep 2026 07:47:58 -0700 (PDT) Received: from [192.168.2.129] ([2600:1700:220:59e0:6f99:bae4:e245:b362]) by smtp.gmail.com with ESMTPSA id 00721157ae682-8714ab73f23sm19274597b3.33.2026.09.04.07.47.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Sep 2026 07:47:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tenstorrent.com; s=google; t=1788533278; x=1789138078; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=XCclJD14e1dhn5+WjJeOdDkpX8FrnlxuNas3n5cM4X0=; b=DSm3gqPGN2r8+6XTWbRNboSa9tbLRP+37SpPe3v7j/3OP9bbC1xaT/+QlTY0lMLJdo xzievP4wgLQd+AtVqQTU1LEMRwra+pdy+BTyJz50fjM21vu/GqdTIrqD5bUCdB0AY8vI vaV4qV+1TGoa4rTtf+0+kOhKvIPCIrrsI2VY1elT1f03iiDCx78Ds1IcWkMjwO++sRwE I8RMkvc0CkMpg/Tm3/Y/bKwm6qiRPIFkp4r5Lvi/vTqUy17+P07vhZZ19BH08A50pOFQ BkkPvo9+jz2FHZbF0VJcL+MRXbRPXrWfIO82uNtu2H/kTWjYz5mNq669tqfAdnNq95jX Skcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788533278; x=1789138078; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=XCclJD14e1dhn5+WjJeOdDkpX8FrnlxuNas3n5cM4X0=; b=Qr6bsecWN9eUyA9C1bPZIiffPO/tVr3thjKHn+IHvdtT0oAFyR29CFZx2TFoJRVOry AJ33hItmgJi3NsqKNqaGb9MQU67eshloCO84u0q35JX0czOaMd6r5YEghDslNdBncULH t/YXqzEnUpfPp2YXtPZ8PAxpmLkqFncN2NMhHHzOzLh19yOgUWxjeEhpfIZzt+rf0rqg HPwLqne/u290I3uj0p0quxDkmF5qzFjSxHCVufxvaoO3TR3stSWGDrTAcouF9bavNc/g 9m1TXtUaeJqEER7Gjwio4tiZlq4hLdtu1eHwvkpmucJsVADXcB4ICMqvluM/pL64qnJ8 LuVw== X-Gm-Message-State: AFuF++lesRTCSwcdCe1QLspwMd5x0SDn3ho0hTuYHA9YQYxPyxGdC4/P AtNE8M1ojJO13ezBCi2yCWhgYGFXMvYO8aCT9AqsYjGvaOpZNZDFGUYodPqe8PjduDw= X-Gm-Gg: AYBFou3TT1F6J4gA5lA+jyl/5EwDngw6Zr3A9AlGk0cWHnMR4XxtXY9guTeUj1EPRc8 17pzN5EFdRFfvx7qOykl5yXXzLMzX88JX0JzjU0W4Pbwn9UkJu9qvo2tjfZlpevwtNwMbIaZBxn I7i4Q5KcfkVgDhL24CmLpxX2q/3iRyJHG8XqkK9sNxGyRa65uSn/2OTkayhXJL473NmuH+6Q2/X E73IV4m3gwd//YWi62bYTH5x27W3kGIT1evdIBoiKBMze5J4BcrGZxH8WIPkTJWBhyh0DIEfkN9 M6wg/aabyeiaD436kQjO1MyAiaR99d7HXsj7GM3ctXtfTqSsgxLT9yk7ImL7aO0QUsWjXxIGAfb 0FC/ZTvZcLmQcrEr+pPXs05/lhgJcdmzr7jfJyXFA4R6iZDR937n31h5ocvmiOFHHgJEGB9yLf0 NHSRvIZXhD/Be2OybSkevNO82MuKu4Eb3kpRZ8/BcQtRdGezPz/qJA+cVH1nqzQaMI2N24b1IP1 eA33FbBPp0TQcs1U/cIDgzq6s81ysIYnoAydKZzqcgk X-Received: by 2002:a05:690c:c507:b0:873:17c9:afca with SMTP id 00721157ae682-87317c9eb9cmr10124357b3.29.1788533277709; Fri, 04 Sep 2026 07:47:57 -0700 (PDT) From: Anirudh Srinivasan Date: Fri, 04 Sep 2026 09:47:29 -0500 Subject: [PATCH v3 2/3] hw/riscv/tt-atlantis: Add PRCMs to tt-atlantis model MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260904-atlantis_prcm-v3-2-8bf20795a381@oss.tenstorrent.com> References: <20260904-atlantis_prcm-v3-0-8bf20795a381@oss.tenstorrent.com> In-Reply-To: <20260904-atlantis_prcm-v3-0-8bf20795a381@oss.tenstorrent.com> To: qemu-devel@nongnu.org Cc: Joel Stanley , Nicholas Piggin , Michael Ellerman , Portia Stephens , qemu-riscv@nongnu.org, Pierrick Bouvier , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Chao Liu , Anirudh Srinivasan X-Mailer: b4 0.15.1 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::112f; envelope-from=asrinivasan@tenstorrent.com; helo=mail-yw1-x112f.google.com X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham 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: pass (identity @tenstorrent.com) X-ZM-MESSAGEID: 1788533350303154100 Atlantis has 4 PRCMs that are visible from S mode by the Ascalon Core (RCPU, HSIO, PCIe and MM). The remaining 2 are only accessed by the boot cpu which isn't modelled yet. This commit adds these 4 PRCM blocks to the tt-atlantis model, along with necessary device tree nodes for them. Reviewed-by: Chao Liu Signed-off-by: Anirudh Srinivasan --- docs/system/riscv/tt_atlantis.rst | 1 + hw/riscv/tt_atlantis.c | 86 +++++++++++++++++++++++++++++++++++= ++++ include/hw/riscv/tt_atlantis.h | 22 ++++++++++ 3 files changed, 109 insertions(+) diff --git a/docs/system/riscv/tt_atlantis.rst b/docs/system/riscv/tt_atlan= tis.rst index 1f2880d617..539c22354f 100644 --- a/docs/system/riscv/tt_atlantis.rst +++ b/docs/system/riscv/tt_atlantis.rst @@ -14,6 +14,7 @@ tt-atlantis QEMU model features * 8-core Ascalon-X CPU Cluster * RISC-V compliant Advanced Interrupt Architecture * 16550A compatible UART +* 4 PRCMs (Clock and Reset Controllers) =20 Known limitations ----------------- diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c index 8a219afef7..15b4192f4d 100644 --- a/hw/riscv/tt_atlantis.c +++ b/hw/riscv/tt_atlantis.c @@ -27,6 +27,7 @@ #include "hw/char/serial-mm.h" #include "hw/intc/riscv_aclint.h" #include "hw/misc/unimp.h" +#include "hw/misc/tt_atlantis_prcm.h" =20 #include "system/system.h" #include "system/device_tree.h" @@ -58,12 +59,16 @@ 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_PRCM_RCPU] =3D { 0xd0000000, 0x10000 }, [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_PRCM_PCIE] =3D { 0xd8000000, 0x100 }, + [TT_ATL_PRCM_MM] =3D { 0xdc000000, 0x1000 }, + [TT_ATL_PRCM_HSIO] =3D { 0xe00c0000, 0x510 }, [TT_ATL_SAPLIC] =3D { 0xe8000000, 0x4000000 }, [TT_ATL_DDR_HI] =3D { 0x100000000, 0x1000000000 }, }; @@ -327,11 +332,36 @@ static void create_fdt_i2c_device(void *fdt, TTAtlant= isSoCState *s, int bus, qemu_fdt_setprop_cell(fdt, name, "reg", addr); } =20 +static char *create_fdt_prcm(void *fdt, const MemMapEntry *mem, + const char *prcm_name) +{ + hwaddr base =3D mem->base; + hwaddr size =3D mem->size; + char *name =3D g_strdup_printf("/soc/prcm_%s@%" PRIx64, + prcm_name, base); + g_autofree char *compatible =3D + g_strdup_printf("tenstorrent,atlantis-prcm-%s", prcm_name); + + qemu_fdt_add_subnode(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", compatible); + qemu_fdt_setprop_sized_cells(fdt, name, "reg", 2, base, 2, size); + qemu_fdt_setprop_cell(fdt, name, "#address-cells", 1); + qemu_fdt_setprop_cell(fdt, name, "#size-cells", 0); + qemu_fdt_setprop_cell(fdt, name, "#clock-cells", 1); + qemu_fdt_setprop_cell(fdt, name, "#reset-cells", 1); + qemu_fdt_setprop_cell(fdt, name, "phandle", next_phandle()); + + return name; +} + static void finalize_fdt(void *fdt, TTAtlantisSoCState *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(); + uint32_t osc_24m_phandle =3D next_phandle(); + uint32_t prcm_rcpu_phandle; + g_autofree char *rcpu_name, *hsio_name, *pcie_name, *mm_name; =20 create_fdt_cpu(fdt, s, aplic_s_phandle, imsic_s_phandle); =20 @@ -348,6 +378,30 @@ static void finalize_fdt(void *fdt, TTAtlantisSoCState= *s) aplic_s_phandle); =20 create_fdt_clk(fdt, "periph-clk", 100000000, periph_clk_phandle); + create_fdt_clk(fdt, "osc_24m", 24000000, osc_24m_phandle); + + rcpu_name =3D create_fdt_prcm(fdt, &s->memmap[TT_ATL_PRCM_RCPU], "rcpu= "); + prcm_rcpu_phandle =3D qemu_fdt_get_phandle(fdt, rcpu_name); + qemu_fdt_setprop_cells(fdt, rcpu_name, "clocks", osc_24m_phandle); + qemu_fdt_setprop_cells(fdt, rcpu_name, "assigned-clocks", + prcm_rcpu_phandle, TT_ATL_CLK_RCPU_ROOT, + prcm_rcpu_phandle, TT_ATL_CLK_NOCC_CLK); + qemu_fdt_setprop_cells(fdt, rcpu_name, "assigned-clock-parents", + prcm_rcpu_phandle, TT_ATL_CLK_RCPU_PLL, + prcm_rcpu_phandle, TT_ATL_CLK_NOC_PLL); + + hsio_name =3D create_fdt_prcm(fdt, &s->memmap[TT_ATL_PRCM_HSIO], "hsio= "); + qemu_fdt_setprop_cells(fdt, hsio_name, "clocks", osc_24m_phandle, + prcm_rcpu_phandle, TT_ATL_CLK_HSIO_PLL); + + pcie_name =3D create_fdt_prcm(fdt, &s->memmap[TT_ATL_PRCM_PCIE], "pcie= "); + qemu_fdt_setprop_cells(fdt, pcie_name, "clocks", osc_24m_phandle, + prcm_rcpu_phandle, TT_ATL_CLK_PCIE_PLL); + + mm_name =3D create_fdt_prcm(fdt, &s->memmap[TT_ATL_PRCM_MM], "mm"); + qemu_fdt_setprop_cells(fdt, mm_name, "clocks", osc_24m_phandle, + prcm_rcpu_phandle, TT_ATL_CLK_MM_PLL0, + prcm_rcpu_phandle, TT_ATL_CLK_MM_PLL1); =20 for (int i =3D 0; i < TT_ATL_NUM_I2C; i++) { create_fdt_i2c(fdt, @@ -491,6 +545,15 @@ static void tt_atlantis_soc_init(Object *obj) object_initialize_child(obj, "uart1", &s->uart1, TYPE_UNIMPLEMENTED_DEVICE); =20 + object_initialize_child(obj, "prcm-rcpu", &s->prcm[PRCM_DOMAIN_RCPU], + TYPE_TT_ATLANTIS_PRCM_RCPU); + object_initialize_child(obj, "prcm-hsio", &s->prcm[PRCM_DOMAIN_HSIO], + TYPE_TT_ATLANTIS_PRCM_HSIO); + object_initialize_child(obj, "prcm-pcie", &s->prcm[PRCM_DOMAIN_PCIE], + TYPE_TT_ATLANTIS_PRCM_PCIE); + object_initialize_child(obj, "prcm-mm", &s->prcm[PRCM_DOMAIN_MM], + TYPE_TT_ATLANTIS_PRCM_MM); + for (int i =3D 0; i < TT_ATL_NUM_I2C; i++) { object_initialize_child(obj, "i2c[*]", &s->i2c[i], TYPE_DESIGNWARE_I2C); @@ -587,6 +650,28 @@ static void tt_atlantis_soc_realize(DeviceState *dev, = Error **errp) serial_mm_init(s->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); + + /* 4 PRCM blocks */ + sysbus_realize(SYS_BUS_DEVICE(&s->prcm[PRCM_DOMAIN_RCPU]), errp); + memory_region_add_subregion( + s->memory, s->memmap[TT_ATL_PRCM_RCPU].base, + sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->prcm[PRCM_DOMAIN_RCPU]),= 0)); + + sysbus_realize(SYS_BUS_DEVICE(&s->prcm[PRCM_DOMAIN_HSIO]), errp); + memory_region_add_subregion( + s->memory, s->memmap[TT_ATL_PRCM_HSIO].base, + sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->prcm[PRCM_DOMAIN_HSIO]),= 0)); + + sysbus_realize(SYS_BUS_DEVICE(&s->prcm[PRCM_DOMAIN_PCIE]), errp); + memory_region_add_subregion( + s->memory, s->memmap[TT_ATL_PRCM_PCIE].base, + sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->prcm[PRCM_DOMAIN_PCIE]),= 0)); + + sysbus_realize(SYS_BUS_DEVICE(&s->prcm[PRCM_DOMAIN_MM]), errp); + memory_region_add_subregion( + s->memory, s->memmap[TT_ATL_PRCM_MM].base, + sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->prcm[PRCM_DOMAIN_MM]), 0= )); + /* * Atlantis contains a DesignWare uart while the QEMU machine * uses the serial_mm model with the base ns16550 register set. @@ -654,6 +739,7 @@ static void tt_atlantis_machine_init(MachineState *mach= ine) OBJECT(&ams->soc_memory), &error_abort); object_property_set_link(OBJECT(&ams->soc), "dram", OBJECT(machine->ra= m), &error_abort); + qdev_realize(DEVICE(&ams->soc), NULL, &error_fatal); =20 /* I2C peripherals: qemu specific */ diff --git a/include/hw/riscv/tt_atlantis.h b/include/hw/riscv/tt_atlantis.h index 3923308b7c..db1dfed157 100644 --- a/include/hw/riscv/tt_atlantis.h +++ b/include/hw/riscv/tt_atlantis.h @@ -14,6 +14,7 @@ #include "hw/i2c/designware_i2c.h" #include "hw/intc/riscv_imsic.h" #include "hw/misc/unimp.h" +#include "hw/misc/tt_atlantis_prcm.h" #include "hw/riscv/riscv_hart.h" =20 #define TYPE_TT_ATLANTIS_MACHINE MACHINE_TYPE_NAME("tt-atlantis") @@ -23,6 +24,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(TTAtlantisState, TT_ATLANTIS_M= ACHINE) OBJECT_DECLARE_SIMPLE_TYPE(TTAtlantisSoCState, TT_ATLANTIS_SOC) =20 #define TT_ATL_NUM_I2C 5 +#define TT_ATL_NUM_PRCM 4 =20 struct TTAtlantisSoCState { /*< private >*/ @@ -41,6 +43,7 @@ struct TTAtlantisSoCState { DesignWareI2CState i2c[TT_ATL_NUM_I2C]; UnimplementedDeviceState uart1; MemoryRegion bootrom; + TTAtlantisPRCMState prcm[TT_ATL_NUM_PRCM]; =20 uint32_t num_harts; char *cpu_type; @@ -81,6 +84,25 @@ enum { TT_ATL_SAPLIC, TT_ATL_SIMSIC, TT_ATL_UART1, + TT_ATL_PRCM_RCPU, + TT_ATL_PRCM_HSIO, + TT_ATL_PRCM_PCIE, + TT_ATL_PRCM_MM, +}; + +/* + * RCPU PRCM Clock IDs, sourced from linux dt-bindings + * include/dt-bindings/clock/tenstorrent,atlantis-prcm-rcpu.h + */ +enum { + TT_ATL_CLK_RCPU_PLL =3D 0, + TT_ATL_CLK_RCPU_ROOT =3D 1, + TT_ATL_CLK_NOC_PLL =3D 25, + TT_ATL_CLK_NOCC_CLK =3D 26, + TT_ATL_CLK_HSIO_PLL =3D 54, + TT_ATL_CLK_PCIE_PLL =3D 55, + TT_ATL_CLK_MM_PLL0 =3D 56, + TT_ATL_CLK_MM_PLL1 =3D 57, }; =20 #endif --=20 2.43.0 From nobody Sat Sep 26 20:52:57 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=reject dis=none) header.from=oss.tenstorrent.com ARC-Seal: i=1; a=rsa-sha256; t=1788533468; cv=none; d=zohomail.com; s=zohoarc; b=Qe88uAgNAkRRl8dcuqUhbgS5OsWqKRGeNuE8pmYljml5zuf6pLWhvgYkGLoMy/Zqn9Wf2NK+O61EwVkUVEPFLf+kcKO/O4hh5nSHkaux4vPtUbqzVmm16bKFN5pND56SRzacxE7ve/W44LnHD1uN94ifv0TKt5JX/fvWDUd16Xw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788533468; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=biRWN0Vn6reTvQrPILLrlJnEjUgjTnAxX3bLorKSI6Y=; b=d7wLjIUSaukCtcAQM9Boq3oAPOoMz39UP7eyi1Ot2gevpw/wvHuF72sUnCFi5MbOOxoDhpzSaBN+9LvNpe4HsGy8OM13tFb0QPVGB1rZGUr/3xd45rLy6CWRLJlwgwFbitmKNTgHcQeuqWbKanve1wciPZ9G3+ClxBHNlVJpXT4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1788533468648477.5858866376793; Fri, 4 Sep 2026 07:51:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x2VD2-00039Q-Mv; Fri, 04 Sep 2026 10:48:04 -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 1x2VD1-00037n-6g for qemu-devel@nongnu.org; Fri, 04 Sep 2026 10:48:03 -0400 Received: from mail-yw1-x1136.google.com ([2607:f8b0:4864:20::1136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x2VCy-0004Wq-64 for qemu-devel@nongnu.org; Fri, 04 Sep 2026 10:48:02 -0400 Received: by mail-yw1-x1136.google.com with SMTP id 00721157ae682-861145fc841so10544777b3.3 for ; Fri, 04 Sep 2026 07:47:59 -0700 (PDT) Received: from [192.168.2.129] ([2600:1700:220:59e0:6f99:bae4:e245:b362]) by smtp.gmail.com with ESMTPSA id 00721157ae682-8714ab73f23sm19274597b3.33.2026.09.04.07.47.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Sep 2026 07:47:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tenstorrent.com; s=google; t=1788533279; x=1789138079; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=biRWN0Vn6reTvQrPILLrlJnEjUgjTnAxX3bLorKSI6Y=; b=PyO8d/Q51yVrmK/nIH7y90Gg42biRCXqplE9DFsEbnyLmhNmdRx4YqvCalA7QgFZ9P AhpCilJ6U47pBAWn3+i2jzSY5+1lDbF71YTn0jhzkTNXUSoD6FEomFC5WOerHnWdCbcQ ncrztELj5EOAJPu0VKELHHC1fX+VkA5hW7yqyUUnu2ogf7cLYfoO/rjFwVlgsfrMlh5Z Mi3x/6BrH0uus9aTyHL74yv/yeUpP8wZ59M6jMiWFjxs2FCff7JOfh7JNUqQt9o27rZL M/tmcFB9XN/UwokjKhUVgLQsoWsiuSmui3DtUjTv88wl49b2RzlVa24YvcYeakBnbMAj zr1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788533279; x=1789138079; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=biRWN0Vn6reTvQrPILLrlJnEjUgjTnAxX3bLorKSI6Y=; b=s8CW/M+4iWDGIme5gjbeFHpvGDvdIetZKRnTsKY0JY0e52ntn/kV3U1Hr+HvVM7n3B wjQ+rWS2vhWI9EyKNF437LZYzdCli5YMTI7A7vVEZ16MBl7X+VoACZF6lbf71sdGieCH IiLgIEeIJBgZlDqdXmYWMCt9prcXi/gvohb1CFI0VXealqdkBUezA0YgWU3d5LXyMq6w BaLDxNy/iOhsKwGdr14+xJmTLD6K8vXO7M5X3U/f685qwm+jWabfILFRPGLr4fzGdEX9 AHHMIX9/cKfWa+LnzNtz4+VRtYOg4XbJviDqOUwLrKNjU1FpuLLDduR7BuP+s0o2Qs7E KS/Q== X-Gm-Message-State: AFuF++lxCgD9JCOwGsiebOqgcVuBwnpWTTGMa4f0Lc/tCF2GTRGMZkFz q3lo3yRz3jG2mvbXsi6/hLr++8rLrRZ8g84XPRxg5FstDI4Re3g5j94ApZ+ENsYCAvk= X-Gm-Gg: AYBFou0n+rQlnFB4VA9gRV3i6q3mIMQgvFDZBNWmyC8+BjxofNJDAe3K7pbDUf7JX2H 2iHFbVJnHxhX0rjdsLi8KgWmrMtgymcKa/NIsKQl4VWdyfcLHiOq70t7XbCzYdIrCnr/SYuw2ir JPTwlJyEDjPPY+Wr9aIhpbcDQfkEZyQA3gr6cvMAL7ic0IwsqZNXjIWkxQMNxP5knMwlsjmylnT WadH7JbmYF2kuywBuJbL5DmL69m4PbpP3wTdrr+ix51elP90PJ8zqFCfJEDMl6+vCrPqYDw4qwA yt7OvN4JYHyknJMBLWLvAWTjt5KkivG1bEsDVpMLyfKFWjvDiEYAN1ORAz6WGx6QBs/fehSmLI8 +vXPAdBMmt9tHmyQfpy3B+Ad87dfZUKtvQmwNdNDc42z8A18W8Z1w/Xh3Kruqlyc3AfT0l4x8ru +sZQTVIBbjUx//d5jag1FHWGStDwe5F3WUNAVV1NUYlWjFnPqqNajrRRSBfOAP2x2S7UHWP2aaH 0ZVD7UMi1zI6Ye6nkXJ3AjKodw1fFNEnBsQWo9iZSoz X-Received: by 2002:a05:690c:c4fa:b0:866:e57f:58db with SMTP id 00721157ae682-8711ec239e9mr32273627b3.0.1788533278633; Fri, 04 Sep 2026 07:47:58 -0700 (PDT) From: Anirudh Srinivasan Date: Fri, 04 Sep 2026 09:47:30 -0500 Subject: [PATCH v3 3/3] hw/riscv/tt-atlantis: Update UART and I2C to use clk from PRCM MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260904-atlantis_prcm-v3-3-8bf20795a381@oss.tenstorrent.com> References: <20260904-atlantis_prcm-v3-0-8bf20795a381@oss.tenstorrent.com> In-Reply-To: <20260904-atlantis_prcm-v3-0-8bf20795a381@oss.tenstorrent.com> To: qemu-devel@nongnu.org Cc: Joel Stanley , Nicholas Piggin , Michael Ellerman , Portia Stephens , qemu-riscv@nongnu.org, Pierrick Bouvier , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Chao Liu , Anirudh Srinivasan X-Mailer: b4 0.15.1 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::1136; envelope-from=asrinivasan@tenstorrent.com; helo=mail-yw1-x1136.google.com X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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: pass (identity @tenstorrent.com) X-ZM-MESSAGEID: 1788533469393158500 Now that we have the PRCM modelled, update the DT nodes for UART1 and the 5 I2C controllers to use the rcpu_prcm as a clock provider. This also allows us to eliminate the periph_clk that was added to the DT previously. Signed-off-by: Anirudh Srinivasan --- hw/riscv/tt_atlantis.c | 25 ++++++++++++++----------- include/hw/riscv/tt_atlantis.h | 6 ++++++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c index 15b4192f4d..8455329861 100644 --- a/hw/riscv/tt_atlantis.c +++ b/hw/riscv/tt_atlantis.c @@ -265,7 +265,8 @@ static void create_fdt_cpu(void *fdt, TTAtlantisSoCStat= e *s, } =20 static void create_fdt_uart(void *fdt, const MemMapEntry *mem, int irq, - int irqchip_phandle) + int irqchip_phandle, uint32_t clk_parent_phand= le, + uint32_t clk_phandle) { g_autofree char *name =3D g_strdup_printf("/soc/serial@%"HWADDR_PRIX, mem->base); @@ -275,7 +276,8 @@ static void create_fdt_uart(void *fdt, const MemMapEntr= y *mem, int irq, 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_cells(fdt, name, "clocks", clk_parent_phandle, + clk_phandle); qemu_fdt_setprop_cell(fdt, name, "interrupt-parent", irqchip_phandle); qemu_fdt_setprop_cells(fdt, name, "interrupts", irq, 0x4); =20 @@ -305,7 +307,9 @@ static void create_fdt_clk(void *fdt, const char *clock= _name, } =20 static void create_fdt_i2c(void *fdt, const MemMapEntry *mem, uint32_t irq, - uint32_t irqchip_phandle, uint32_t clk_phandle) + uint32_t irqchip_phandle, + uint32_t clk_parent_phandle, + uint32_t clk_phandle) { g_autofree char *name =3D g_strdup_printf("/soc/i2c@%"HWADDR_PRIX, mem= ->base); =20 @@ -314,8 +318,8 @@ static void create_fdt_i2c(void *fdt, const MemMapEntry= *mem, uint32_t irq, 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_cells(fdt, name, "clocks", clk_parent_phandle, + clk_phandle); qemu_fdt_setprop_cell(fdt, name, "#address-cells", 1); qemu_fdt_setprop_cell(fdt, name, "#size-cells", 0); } @@ -358,7 +362,6 @@ static void finalize_fdt(void *fdt, TTAtlantisSoCState = *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(); uint32_t osc_24m_phandle =3D next_phandle(); uint32_t prcm_rcpu_phandle; g_autofree char *rcpu_name, *hsio_name, *pcie_name, *mm_name; @@ -374,10 +377,6 @@ static void finalize_fdt(void *fdt, TTAtlantisSoCState= *s) * aplic_s_phandle); */ =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); create_fdt_clk(fdt, "osc_24m", 24000000, osc_24m_phandle); =20 rcpu_name =3D create_fdt_prcm(fdt, &s->memmap[TT_ATL_PRCM_RCPU], "rcpu= "); @@ -403,11 +402,15 @@ static void finalize_fdt(void *fdt, TTAtlantisSoCStat= e *s) prcm_rcpu_phandle, TT_ATL_CLK_MM_PLL0, prcm_rcpu_phandle, TT_ATL_CLK_MM_PLL1); =20 + create_fdt_uart(fdt, &s->memmap[TT_ATL_UART1], TT_ATL_UART1_IRQ, + aplic_s_phandle, prcm_rcpu_phandle, TT_ATL_CLK_UART1_P= CLK); + 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); + aplic_s_phandle, prcm_rcpu_phandle, + TT_ATL_CLK_I2C0_PCLK + i); } =20 /* I2C peripherals: qemu specific */ diff --git a/include/hw/riscv/tt_atlantis.h b/include/hw/riscv/tt_atlantis.h index db1dfed157..577c867d71 100644 --- a/include/hw/riscv/tt_atlantis.h +++ b/include/hw/riscv/tt_atlantis.h @@ -99,6 +99,12 @@ enum { TT_ATL_CLK_RCPU_ROOT =3D 1, TT_ATL_CLK_NOC_PLL =3D 25, TT_ATL_CLK_NOCC_CLK =3D 26, + TT_ATL_CLK_I2C0_PCLK =3D 33, + TT_ATL_CLK_I2C1_PCLK =3D 34, + TT_ATL_CLK_I2C2_PCLK =3D 35, + TT_ATL_CLK_I2C3_PCLK =3D 36, + TT_ATL_CLK_I2C4_PCLK =3D 37, + TT_ATL_CLK_UART1_PCLK =3D 39, TT_ATL_CLK_HSIO_PLL =3D 54, TT_ATL_CLK_PCIE_PLL =3D 55, TT_ATL_CLK_MM_PLL0 =3D 56, --=20 2.43.0