From nobody Sat May 30 17:43:29 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778579241; cv=none; d=zohomail.com; s=zohoarc; b=WlWiD/9n72nyqzzGzR17h6rIteyQNOBxGcuGhBG+teqG8xDGH7i1JIziEa8dpRFXiNqReDAoVYodadEreCdj3lWsAttJvF63EJS6Ht1C5Wxb449szhe+prV4Wv9pGgjvuSaX6vEV86xCIFnA/dPZgOr13l/OaWRkMGOoxG+UFdE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778579241; h=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=Ie/CRX9HgxQJIe7EyQji6JVrxvq1hEXjzqYVVL6RmW8=; b=QzrKYj24RiFaKfXhJ9/DHwqf0grwm1rvQMoli4bN5Y8GAPbIK+8j5itYU/3yG2ZLPVJebd3I8wkP2/1qu6iit9rt6bahzKf/qLd17uuOvOnUcTZ5MiYaDzjsaJg3VNuzgLgAySXzQ+T1C9w9nZpKrnM9EUfKsRMNmKY378Z9b2s= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778579241813247.29477764580713; Tue, 12 May 2026 02:47:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMjhO-0004Nv-KZ; Tue, 12 May 2026 05:46:46 -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 1wMjhC-0004Mq-Kv for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:34 -0400 Received: from mail-pf1-x430.google.com ([2607:f8b0:4864:20::430]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMjhB-00010V-4b for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:34 -0400 Received: by mail-pf1-x430.google.com with SMTP id d2e1a72fcca58-82f8b60e54dso4203594b3a.2 for ; Tue, 12 May 2026 02:46:32 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (32.237.80.34.bc.googleusercontent.com. [34.80.237.32]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-839682aba01sm22960593b3a.55.2026.05.12.02.46.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 May 2026 02:46:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778579192; x=1779183992; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ie/CRX9HgxQJIe7EyQji6JVrxvq1hEXjzqYVVL6RmW8=; b=UMyugTcTFzpVGiGvpAdvx4ri21gSyahhPwJ/mR4EznoPReXjY6QxRHlzz+XweLIEtG EjF/8+N1n4aB4kaGC8nEF7CrOxDYm6ft0RKvbLiTUr85Xe6WrFUPZyYem6xWhw72Zm5Z 1M1rr6Gjo2tmvJ/ei4GWWqDOoOucRwT9UVj0/LdjN6gbzdvj16HIcr9bLRjoLrrVzwDD +eYuPwcAmsBZQ+BI42O/zspcf+43OlE7Q4FuHcSVLqmV0+dcoql5Hz3B4X3wbsjQJ+Kt Z1BgO1UZJC9Ttmuvtl6sd9rscX8q5ucAY09a4/ZwTdAU11FY+ES3JiCHwjs8w6giA7AZ ziug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778579192; x=1779183992; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Ie/CRX9HgxQJIe7EyQji6JVrxvq1hEXjzqYVVL6RmW8=; b=Dd9p9UWpgyvogwd4O2/x+UnFFs6iaa9fwKJ/lsj86iv7kZCxZSn38350dVDN1d7fm9 moYBcA1NzIkTBXGhwsm02Wil0x4exMV8jg9LEJQe52soJTBLLnbjUceE66lqbotPydGD rvdZxDS3ATpIK5Jh78mX+0/gFvRIfNZnDuIjbYzBrbJPqAZvckN/ABSFhhojBkciSTE9 GqyGaxfSda1DU1BJ/+HGlPPAVjEeCXgRDN5dVjLYFGUsbFu5g+xfhfyx0UvadVQxJycj 638QPzUeDZgVHhS1KeRRqSRZDwlIbJDxdgUS43eZjxFi50upzxbiaMe4ZpUein02Pn3w Yfbg== X-Forwarded-Encrypted: i=1; AFNElJ/ZXcbTbg6vyNOK37meGdxjUWkEwxf21L1J5Yu9vgp45CHh56bHlPmfInH8R7vYJSGCfJdxrF/BZ46J@nongnu.org X-Gm-Message-State: AOJu0YxWXYU3DFL/QSoqppTV65fNZ+kqmxJbgmSHKUIQrogFpKs1mege vlCzHB/RaLnoFzMOG9gX5i0/TYoLCtb6f28uhs1p7/dSaL1PQ3DdkiEG X-Gm-Gg: Acq92OFPf75ckn5M0qID2iQXuoiGXrcEBFptg5uRmqdWeWelCAI8kcLZxPxfUHwo/SO SQb/SKm/kntfaodhzP1+dBHpPdB0tDwS4XHjmEsKB0Tpvcsph/2pEQAfhbUUpgWwwtPENH1ePNu 3WDbQgkynqGL3wd/vYM4hRWau406IMYAnGngkQ+lleN+Z3H6rp2NTlw16KnPgEmKzn9PKm7sOOT Gyz2qSeUBRJ7it+4l/mz5AGTMYQrqSD8E2xFXR6QW8cq2dn6wDlW96x3vSVlH+ZKoDX77o4xQZ+ 7+vDo8lHuDU5RQaNvLMbmK1nxDSY1oiFJ2knZJwS4MwydViLvyezJp1M+aozCnB8LvyNF+ANvHj jbMCfFNcQ7tQ7PoCfwqp4cQX0AdvBwxZfavJWrP3BmXWk+1t8QkBHYpe7OgtyDaFWT0VUgmZlC1 yO2ITU+mJFm2AEYmN5UV5Znd7vim0zQH7Du07GMbtj8p7XMsp0aRgjVd8lbCmI+r9z1jifXDOCQ 6Q7B9uFQXBCKvbQ6/k7pS05/OAIrZTSsg== X-Received: by 2002:a05:6a00:bb8d:b0:82c:6683:b866 with SMTP id d2e1a72fcca58-83e39150f30mr13472303b3a.4.1778579191725; Tue, 12 May 2026 02:46:31 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, palmer@dabbelt.com, alistair.francis@wdc.com, christoph.muellner@vrull.eu Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, jserv@ccns.ncku.edu.tw, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH RFC 1/5] target/riscv: Add stubs for T-Head PMU CSRs Date: Tue, 12 May 2026 09:46:09 +0000 Message-ID: <20260512094614.3464388-2-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog In-Reply-To: <20260512094614.3464388-1-visitorckw@gmail.com> References: <20260512094614.3464388-1-visitorckw@gmail.com> 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::430; envelope-from=visitorckw@gmail.com; helo=mail-pf1-x430.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1778579243099158500 Content-Type: text/plain; charset="utf-8" T-Head CPUs use custom CSRs for performance monitoring, specifically mcounterinten (0x7ca) and mcounterof (0x7cb). Since we don't implement these custom PMU registers yet, the system crashes with an illegal instruction trap when OpenSBI like this: system_opcode_insn: Failed to access CSR 0x7ca from M-mode sbi_trap_error: hart0: trap1: illegal instruction handler failed (error -1) Add simple read/write stubs for these two CSRs. By silently ignoring writes and returning 0 on reads, we prevent the fatal exceptions and allow to continue normally. Signed-off-by: Kuan-Wei Chiu --- target/riscv/th_csr.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/target/riscv/th_csr.c b/target/riscv/th_csr.c index 49eb7bbab5..b095364c31 100644 --- a/target/riscv/th_csr.c +++ b/target/riscv/th_csr.c @@ -21,12 +21,19 @@ #include "cpu_vendorid.h" =20 #define CSR_TH_SXSTATUS 0x5c0 +#define CSR_TH_MCOUNTERINTEN 0x7ca +#define CSR_TH_MCOUNTEROF 0x7cb =20 /* TH_SXSTATUS bits */ #define TH_SXSTATUS_UCME BIT(16) #define TH_SXSTATUS_MAEE BIT(21) #define TH_SXSTATUS_THEADISAEE BIT(22) =20 +static RISCVException mmode(CPURISCVState *env, int csrno) +{ + return RISCV_EXCP_NONE; +} + static RISCVException smode(CPURISCVState *env, int csrno) { if (riscv_has_ext(env, RVS)) { @@ -49,11 +56,34 @@ static RISCVException read_th_sxstatus(CPURISCVState *e= nv, int csrno, return RISCV_EXCP_NONE; } =20 +static RISCVException read_th_pmu(CPURISCVState *env, int csrno, + target_ulong *val) +{ + *val =3D 0; + return RISCV_EXCP_NONE; +} + +static RISCVException write_th_pmu(CPURISCVState *env, int csrno, + target_ulong val, uintptr_t retaddr) +{ + return RISCV_EXCP_NONE; +} + const RISCVCSR th_csr_list[] =3D { { .csrno =3D CSR_TH_SXSTATUS, .insertion_test =3D test_thead_mvendorid, .csr_ops =3D { "th.sxstatus", smode, read_th_sxstatus } }, + { + .csrno =3D CSR_TH_MCOUNTERINTEN, + .insertion_test =3D test_thead_mvendorid, + .csr_ops =3D { "th.mcounterinten", mmode, read_th_pmu, write_th_pm= u } + }, + { + .csrno =3D CSR_TH_MCOUNTEROF, + .insertion_test =3D test_thead_mvendorid, + .csr_ops =3D { "th.mcounterof", mmode, read_th_pmu, write_th_pmu } + }, { } }; --=20 2.54.0.563.g4f69b47b94-goog From nobody Sat May 30 17:43:29 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778579237; cv=none; d=zohomail.com; s=zohoarc; b=EyUtWiTie8J0VwjPwwzS6FZOx4A8GtJFd3IBLD9+jkNhgHfBpy4ljkAPxXGBzqoS8RMoCuKQYV7OV0tdPCAmvmW61P6b/aP3Yp9uZFBjr3qTS4JtxT0mfDw2/G7iCzlJmrMjOnHeZ5JFa/k5wg71N7glbQHls65abpWERwnKze8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778579237; h=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=Z5BzUMBXjy8xyRUea0sn7GSJCN51E1yGbpBU/KilmCU=; b=Kub7rbwD+saH4X5efBhvHRaQ7/C6Ya+WN5qUD8kw6TwvDQmOCFtBKQL4o1E98DU8u7xjhurY+N+WMPGDFDu7Z48tdNyWFxSSTt0Cs7Asog3nvLboCDyeX+uy1UaQNI3XVWcwUPml06xw2fjvaBN4L6S7QeU0lZZ7yiqGNVXQxbE= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778579237218198.45569643870192; Tue, 12 May 2026 02:47:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMjhb-0004QD-LJ; Tue, 12 May 2026 05:47:00 -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 1wMjhH-0004NO-V5 for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:43 -0400 Received: from mail-pf1-x435.google.com ([2607:f8b0:4864:20::435]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMjhF-00013i-SM for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:39 -0400 Received: by mail-pf1-x435.google.com with SMTP id d2e1a72fcca58-8353fd1cb5fso2552028b3a.0 for ; Tue, 12 May 2026 02:46:37 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (32.237.80.34.bc.googleusercontent.com. [34.80.237.32]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-839682aba01sm22960593b3a.55.2026.05.12.02.46.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 May 2026 02:46:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778579196; x=1779183996; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Z5BzUMBXjy8xyRUea0sn7GSJCN51E1yGbpBU/KilmCU=; b=TrOH+gRUhGeV80LSGSULExAdKEu02ENVtf0KtwFpIUj1M/909rYD9A3IeXPGb720Cx xyPBDIBaeyOW6ltnsqUnmk0XXTa3A+kski9TMREW1rmIgfU6W58CxG7LL3dw/irznJbT ZgqK9QYxnj2NcS5/h7lxmz2IQ6uelaM327UdVfn39RpB7GIePUrxc887MJl6JFQ6Ganu RcRobtCb9quVbxkMWG5Vy9o5mHiOufx3K5Cv5ujBsWiuArninOCd01/I6uitihqXM0eI Rp8TW+lLFfhskYAVIhqC9lkAeDyEIvTMaZ3hFMrnX6r8J8l50Etxuh7d7VhqHAjdjzTc tkqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778579196; x=1779183996; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Z5BzUMBXjy8xyRUea0sn7GSJCN51E1yGbpBU/KilmCU=; b=INjTAMJDj9LRE3UMKq4iQ0RWsbaBLgmkwbkhXwO9elIr5OqxKs0HwtjWdzwdwS5jTz VWz9Ahs6xhYGUte1gHlemyCsv3ZTCG/782lsKoFs6GXyXG4BOGz3OEbUyh18+oor9IuP IiJ9rjOJZJml8QozvLZs7DvC0X2OOAcrn0xSLjm8sAmlV0bdofd46b7VBnXvtxaV2xst sO0qBlBw+G0t6fA6+4MxjPwjH0pLdwfEH2fnBHyY7rIzBfBLgBIm62k3SERJI9stNsDV /5Sv3XZFrOVw+gGRQvv/9kx6I16XEVN6Y36pPiL1+DyByyE5BbQgiVasPlVSdmsAI5e6 owmw== X-Forwarded-Encrypted: i=1; AFNElJ/7CbN2YxuoRiVC4Hsj0vPJPHVbFo+7SbQAI9xY6b73y8L5TP1naRh3tFXMVXB7gWt8YCRFS2zDrg5C@nongnu.org X-Gm-Message-State: AOJu0YymRMEiFieEgO9lMi7msirlEbpgN6TNjzbf9nmYsYygysguynKB UzXM//R8jmw9lRP7cDH7WvRQL361sCQmgzcQGhEqMp7Z1nczRvRCfTajxWKk4g== X-Gm-Gg: Acq92OHGt1YrijwQQqgChRk2xmBLoPNwm/4XLNCV+4pZC92WkOUC1GCqDk4Tg8qOaFR DTQrEm4Nw4Z9XuTkN1TsjuPJQkENC5ysZ7dk8HDAMz+MzLER0fByVHI6v9yPXqD9YfXOjKYWgu9 jD8f9//I15HXVRgwsWixoh4tpOg875TeThCU92mUzI0OrVPF0xIec12RpQbuk3M4IMNsy84Lgix Y6iLsUEi/dK6nYjTYhB1qHMH8Z5hpKvLgwEwH0gb8bFBF2+NOzslIQarc/dIaABk2Yz7nU50ahh MFnZ7SJ2npJE5fWE7cO1J98abZpg4R2fpltyRyP/C6HUZNL9+P32hsC4IjOprxUw9C9o+napMZy 5OZcV1nP9EX1Kjxmllm5yPUs/ta3WnraRbeLYiHkkydADIFJWPZgbVsdC+haRIxDMge9UtDWazB r7aCyNI7moFqoaxQjvNkjdkoygbRnym1tXxssdzyV7osJiBhrdVBTOOJ2uj/V01g94SDJ1jyQFI 6yaj+noLayTv+1Fh2njXliZCwDXSAAXtQ== X-Received: by 2002:aa7:8896:0:b0:827:33cb:c7a3 with SMTP id d2e1a72fcca58-83ee8308f84mr2797004b3a.10.1778579196418; Tue, 12 May 2026 02:46:36 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, palmer@dabbelt.com, alistair.francis@wdc.com, christoph.muellner@vrull.eu Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, jserv@ccns.ncku.edu.tw, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH RFC 2/5] hw/char: Add dw8250 UART Date: Tue, 12 May 2026 09:46:10 +0000 Message-ID: <20260512094614.3464388-3-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog In-Reply-To: <20260512094614.3464388-1-visitorckw@gmail.com> References: <20260512094614.3464388-1-visitorckw@gmail.com> 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::435; envelope-from=visitorckw@gmail.com; helo=mail-pf1-x435.google.com X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FORGED_GMAIL_RCVD=1, FREEMAIL_FROM=0.001, 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: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778579241691154100 Content-Type: text/plain; charset="utf-8" Add the dw8250 uart support. This hardware is a widely used 16550A derivative that includes additional registers. Without this specific device support, the Linux 8250_dw driver fails to probe the extended registers (UCV, CPR, etc.), which are essential for correct feature detection: [ 0.293566] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled [ 0.306929] Oops - store (or AMO) access fault [#1] [ 0.307020] Modules linked in: [ 0.307192] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 7.0.0 #1 PR= EEMPTLAZY [ 0.307250] Hardware name: Milk-V Duo (DT) [ 0.307294] epc : dw8250_setup_port+0x22/0x520 [ 0.307504] ra : dw8250_probe+0x57e/0x5b8 [ 0.307518] epc : ffffffff80708dd6 ra : ffffffff8070a49e sp : ffffffc600= 00b820 [ 0.307525] gp : ffffffff81a32ba8 tp : ffffffd602180cc0 t0 : 0000000000= 000073 [ 0.307533] t1 : 000000000000006c t2 : 0000000000000000 s0 : ffffffc600= 00b830 [ 0.307539] s1 : ffffffd6028c8640 a0 : ffffffc60000b848 a1 : ffffffff81= 3162c1 [ 0.307546] a2 : ffffffff813162c0 a3 : ffffffd6028c8640 a4 : ffffffc600= 02d0b4 [ 0.307552] a5 : 0000000000000001 a6 : 0000000000000094 a7 : 0000000000= 000060 [ 0.307558] s2 : ffffffd60225d410 s3 : ffffffd60225d400 s4 : 0000000000= 000000 [ 0.307573] s5 : ffffffff80e31a48 s6 : 0000000000000008 s7 : 0000000000= 000000 [ 0.307584] s8 : 0000000000000149 s9 : 0000000000000000 s10: 0000000000= 000000 [ 0.307590] s11: 0000000000000000 t3 : ffffffd602007c00 t4 : ffffffff81= 601540 [ 0.307604] t5 : 0000000000000003 t6 : ffffffd602a42f82 ssp : 000000000= 0000000 [ 0.307611] status: 0000000200000120 badaddr: ffffffc60002d0b4 cause: 00= 00000000000007 [ 0.307652] [] dw8250_setup_port+0x22/0x520 [ 0.307695] [] dw8250_probe+0x57e/0x5b8 [ 0.307702] [] platform_probe+0x46/0x80 [ 0.307708] [] really_probe+0x84/0x22c [ 0.307715] [] __driver_probe_device+0x5c/0xd4 [ 0.307721] [] driver_probe_device+0x2e/0xf4 [ 0.307727] [] __driver_attach+0x6e/0x14c [ 0.307734] [] bus_for_each_dev+0x60/0xb0 [ 0.307740] [] driver_attach+0x1a/0x24 [ 0.307746] [] bus_add_driver+0xca/0x1d8 [ 0.307752] [] driver_register+0x3e/0xdc [ 0.307757] [] __platform_driver_register+0x1c/0x24 [ 0.307779] [] dw8250_platform_driver_init+0x1a/0x24 [ 0.307793] [] do_one_initcall+0x4e/0x2a4 [ 0.307800] [] kernel_init_freeable+0x226/0x2b0 [ 0.307807] [] kernel_init+0x1c/0x144 [ 0.307813] [] ret_from_fork_kernel+0x18/0x164 [ 0.307820] [] ret_from_fork_kernel_asm+0x16/0x18 [ 0.307914] Code: 3683 2085 0b63 32f7 000f 0140 6918 4785 0713 0b47 (c31= c) 2583 [ 0.308041] ---[ end trace 0000000000000000 ]--- [ 0.308180] Kernel panic - not syncing: Fatal exception in interrupt [ 0.315760] ---[ end Kernel panic - not syncing: Fatal exception in inte= rrupt ]--- Signed-off-by: Kuan-Wei Chiu --- hw/char/Kconfig | 4 ++ hw/char/dw8250.c | 118 +++++++++++++++++++++++++++++++++++++++ hw/char/meson.build | 1 + include/hw/char/dw8250.h | 27 +++++++++ 4 files changed, 150 insertions(+) create mode 100644 hw/char/dw8250.c create mode 100644 include/hw/char/dw8250.h diff --git a/hw/char/Kconfig b/hw/char/Kconfig index 020c0a84bb..418d99b757 100644 --- a/hw/char/Kconfig +++ b/hw/char/Kconfig @@ -95,3 +95,7 @@ config IP_OCTAL_232 bool default y depends on IPACK + +config DW8250 + bool + select SERIAL diff --git a/hw/char/dw8250.c b/hw/char/dw8250.c new file mode 100644 index 0000000000..4ec829ceaf --- /dev/null +++ b/hw/char/dw8250.c @@ -0,0 +1,118 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Synopsys DesignWare APB UART (DW 8250) + * + * Copyright (c) 2026 Kuan-Wei Chiu + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/char/dw8250.h" +#include "hw/core/qdev-properties.h" +#include "hw/core/qdev-properties-system.h" + +#define DW_UART_REGION_SIZE 0x100 + +#define DW_UART_RE_EN 0xB4 /* Receiver Output Enable Register */ +#define DW_UART_DLF 0xC0 /* Divisor Latch Fraction Register */ +#define DW_UART_CPR 0xF4 /* Component Parameter Register */ +#define DW_UART_UCV 0xF8 /* UART Component Version */ +#define DW_UART_CTR 0xFC /* Component Type Register */ + +#define DW_UART_UCV_VALUE 0x3332332A /* "323*" -> v3.23a */ +#define DW_UART_CTR_VALUE 0x44570110 /* "DW" */ + +static uint64_t dw8250_ext_read(void *opaque, hwaddr addr, unsigned int si= ze) +{ + switch (addr) { + case DW_UART_UCV: + return DW_UART_UCV_VALUE; + case DW_UART_CPR: + return 0x00000000; /* No advanced features (DMA, extra FIFOs) */ + case DW_UART_CTR: + return DW_UART_CTR_VALUE; + + case DW_UART_RE_EN: + case DW_UART_DLF: + /* + * Return 0 to indicate these optional features + * (RS485 and Fractional Divisor) are not implemented. + */ + return 0x00000000; + + default: + return 0; + } +} + +static void dw8250_ext_write(void *opaque, hwaddr addr, uint64_t val, unsi= gned int size) +{ +} + +static const MemoryRegionOps dw8250_ext_ops =3D { + .read =3D dw8250_ext_read, + .write =3D dw8250_ext_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, +}; + +static void dw8250_instance_init(Object *obj) +{ + DW8250State *s =3D DW8250(obj); + + s->serial_mm =3D qdev_new("serial-mm"); + object_property_add_child(obj, "serial-mm", OBJECT(s->serial_mm)); + object_property_add_alias(obj, "chardev", OBJECT(s->serial_mm), "chard= ev"); +} + +static void dw8250_realize(DeviceState *dev, Error **errp) +{ + DW8250State *s =3D DW8250(dev); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + SysBusDevice *serial_sbd =3D SYS_BUS_DEVICE(s->serial_mm); + + memory_region_init(&s->container, OBJECT(dev), "dw8250-container", + DW_UART_REGION_SIZE); + sysbus_init_mmio(sbd, &s->container); + + qdev_prop_set_uint8(s->serial_mm, "regshift", s->regshift); + qdev_prop_set_uint8(s->serial_mm, "endianness", DEVICE_LITTLE_ENDIAN); + sysbus_realize(serial_sbd, errp); + + memory_region_init_io(&s->ext_iomem, OBJECT(dev), &dw8250_ext_ops, s, + "dw8250-ext", DW_UART_REGION_SIZE); + memory_region_add_subregion(&s->container, 0, &s->ext_iomem); + + memory_region_add_subregion_overlap(&s->container, 0, + sysbus_mmio_get_region(serial_sbd,= 0), 1); + + sysbus_pass_irq(sbd, serial_sbd); +} + +static const Property dw8250_properties[] =3D { + DEFINE_PROP_UINT8("regshift", DW8250State, regshift, 2), +}; + +static void dw8250_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->realize =3D dw8250_realize; + device_class_set_props(dc, dw8250_properties); +} + +static const TypeInfo dw8250_info =3D { + .name =3D TYPE_DW8250, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(DW8250State), + .instance_init =3D dw8250_instance_init, + .class_init =3D dw8250_class_init, +}; + +static void dw8250_register_types(void) +{ + type_register_static(&dw8250_info); +} + +type_init(dw8250_register_types) diff --git a/hw/char/meson.build b/hw/char/meson.build index fc3d7ee506..b2250ee6ae 100644 --- a/hw/char/meson.build +++ b/hw/char/meson.build @@ -38,6 +38,7 @@ system_ss.add(when: 'CONFIG_STM32L4X5_USART', if_true: fi= les('stm32l4x5_usart.c' system_ss.add(when: 'CONFIG_MCHP_PFSOC_MMUART', if_true: files('mchp_pfsoc= _mmuart.c')) system_ss.add(when: 'CONFIG_HTIF', if_true: files('riscv_htif.c')) system_ss.add(when: 'CONFIG_GOLDFISH_TTY', if_true: files('goldfish_tty.c'= )) +system_ss.add(when: 'CONFIG_DW8250', if_true: files('dw8250.c')) =20 specific_ss.add(when: 'CONFIG_TERMINAL3270', if_true: files('terminal3270.= c')) specific_ss.add(when: 'CONFIG_PSERIES', if_true: files('spapr_vty.c')) diff --git a/include/hw/char/dw8250.h b/include/hw/char/dw8250.h new file mode 100644 index 0000000000..59396ad202 --- /dev/null +++ b/include/hw/char/dw8250.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Synopsys DesignWare APB UART (DW 8250) + * + * Copyright (c) 2026 Kuan-Wei Chiu + */ + +#ifndef HW_CHAR_DW8250_H +#define HW_CHAR_DW8250_H + +#include "hw/core/sysbus.h" +#include "qom/object.h" + +#define TYPE_DW8250 "dw8250" +OBJECT_DECLARE_SIMPLE_TYPE(DW8250State, DW8250) + +struct DW8250State { + SysBusDevice parent_obj; + + MemoryRegion container; + MemoryRegion ext_iomem; + DeviceState *serial_mm; + + uint8_t regshift; +}; + +#endif --=20 2.54.0.563.g4f69b47b94-goog From nobody Sat May 30 17:43:29 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778579253; cv=none; d=zohomail.com; s=zohoarc; b=QIhvK6GqLLTp9yGC8xk3k+sg5x7lxqND2CK5PEwxOCZnGzoYnhN/Sl4VlH7yrufY+xFDAE4rG3SfND3pVd7aaKOrwXc8cfkpA/CQhjECeABVuuYc65izLQJfEe3A1++IJbMnypjROR+xhiJyxMVyLfDopQ+/7ndZyetl/NwFXPE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778579253; h=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=mLC10TUX2AfE6MDdbm1gzs+WcsKVviC2Px435/4TdUU=; b=KDWx3IwOUKNAIXLlCWTlF+OcBVgs0229+cUgz/shWeRkjN+9pWwrJojSK55DuFlAcKrgKc7ioBNh816oDPNDFT2Xk+V6Wx9rYNRX1lv+23E5VxE7RLy7UFBy+7eHJv5kwDkfNf/16EcD12nWr6BLVwsGMxew8OoZ7kRKpjALz08= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778579253041119.50035254558009; Tue, 12 May 2026 02:47:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMjhd-0004Qk-H5; Tue, 12 May 2026 05:47:01 -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 1wMjhM-0004Ni-Eo for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:45 -0400 Received: from mail-pf1-x432.google.com ([2607:f8b0:4864:20::432]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMjhK-000155-M9 for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:44 -0400 Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-8353ca0f1f1so2707201b3a.1 for ; Tue, 12 May 2026 02:46:42 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (32.237.80.34.bc.googleusercontent.com. [34.80.237.32]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-839682aba01sm22960593b3a.55.2026.05.12.02.46.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 May 2026 02:46:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778579201; x=1779184001; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mLC10TUX2AfE6MDdbm1gzs+WcsKVviC2Px435/4TdUU=; b=CfL6p6GSnP6FBHtrj+qz2XZ9NgH4ajqIq8wFwI33r6QEALIlXPryKsLvthVXLQI6eK 8Tt1PGfp72zftOOs30Ia/Pu+YCaPi7nwm4wY7gml+WoqA2hkTiIggkBkz7zpEH/t8zYm bJWwfRmjgsnk4o4ItmoQy1itwrcRg0OwrTk0BcUZCHq6WLa6zQEyxtCcAOVEHwxP+Rj7 FSceuP+E7DqwMlJShOfyWruv5yx3jOVduY9sNzuy5CbhQOfkGUOMADw+2c/t6p4m+Fca IsfgWEZJIwiPK7SMjUFi0TI/DUaDSZ9Vq7hSgYe5/R6pSud64KmsXUe4hQEFCGQ8IkXj /jOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778579201; x=1779184001; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=mLC10TUX2AfE6MDdbm1gzs+WcsKVviC2Px435/4TdUU=; b=S0tMve2Ae3ykjwYM/GYBCY2aBn7dBBbIpFTER2uXIqePevm6f2Hl2xhkMugMVjBXrf Dnnbrm+EdIHH8MH/74I/IznCNAVQM9owtLknbDN6LZJTJfJiahe14uCEbxoHx7L3kr0L BoCwTNvOL39BtLA3std31uxYULENIQCy/pjDqpARIGjkgFmjqM3Xfd7wr0vJqqvc5LLr LlCzGZwSUoAHjloH1T09/i4E/Hm7+UKEkxj28uWRdz2mLgaqyIvYkgY1h6kIJN9VN0f3 VP4cY+WGcWb62XEkRyaP2+l2m2yths7JzqWwG8HN+EKiXhfA5hBEfc2pHg03/ukrK1tv c1sA== X-Forwarded-Encrypted: i=1; AFNElJ9jty3iAZgoQ99BPl7dMx8H2DSCp8fWOL+4AzMBtm9hPdzQ0SaHxULTZ0BVqaoEP8bZ/1dGKGIfR8iU@nongnu.org X-Gm-Message-State: AOJu0YwkMLZ5bFvUXcEu3WEwezzx7RqamKjKo9pj3HEy39xOhn8+oJLY t9kRNw7KtW/1kBJhhRaHr0dfmbyCsIshY6jL7Q9xrIOvl/6+t15KFhao X-Gm-Gg: Acq92OH0vdUpBkT5i/iQI0RiTOD9ZVR5Bax7WKolM50+cqnk5Cj8V0m3bzkv17HI/NQ FnI3a0G3uw9sc+YFYVJT9pP9xCP2TbJAE6alGXQrulHtllYsVsfqfQNBZxrVvsgkOfywdziqqO4 n2kr1ljaTkJpNKlLWx6Y93fLROuCOZz47gwNmV4F5m0UF13EJxttR3+WX0+l3QkFbHhwmUE92JS SPSXSdasmteL2k10ONGx/Psp+8zx+G9CN+yDO/zD7RWh6fsUOsP6EoMtTN0nWBs6vh54B8A96To 51oWQ+0BsemaCHns+1+Yto0EW70oRVykwBuyK5uxASz6QwvvNmOjK43nFEb1iwKPqSDXEWtp8Co you8JXI1ERbSjHJBm1VWHONU8cpDOq3sVI2mOBmIFb73fqcfpd5yvCntoIgPAcNaGXOgaFk/HAE cI3PiLmWKo0erY3Aa4XqLPeOMPG34+RWFw0WAxVSox48kSZ99C6u5+KxC0AR2Ba9x9Aj0mnF9VF XHX2uLSJbh4oy/79bKhaFypFer43yoDvw== X-Received: by 2002:a05:6a00:4484:b0:82f:6cb3:645a with SMTP id d2e1a72fcca58-83ee840bc04mr3308773b3a.31.1778579201282; Tue, 12 May 2026 02:46:41 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, palmer@dabbelt.com, alistair.francis@wdc.com, christoph.muellner@vrull.eu Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, jserv@ccns.ncku.edu.tw, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH RFC 3/5] hw/misc: Add Sophgo CV1800B clock controller Date: Tue, 12 May 2026 09:46:11 +0000 Message-ID: <20260512094614.3464388-4-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog In-Reply-To: <20260512094614.3464388-1-visitorckw@gmail.com> References: <20260512094614.3464388-1-visitorckw@gmail.com> 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::432; envelope-from=visitorckw@gmail.com; helo=mail-pf1-x432.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1778579255758154100 Content-Type: text/plain; charset="utf-8" Add a stub for the CV1800B clock controller. This is specifically required for the SDHCI controller to function correctly under Linux. The Linux 'sophgo,cv1800-clk' driver probes this device to determine the clock tree configuration. This implementation sets the bypass registers (CLK_BYP_0 and CLK_BYP_1) to 0xFFFFFFFF during reset, matching the POR default state. This bypasses the PLLs and allows the SDHCI and other peripherals to operate using the 25MHz reference clock. Without this device, the SD card driver fails to initialize, preventing the system from mounting the root filesystem from the SD card: [ 0.888739] Waiting for root device /dev/mmcblk0... [ 10.727739] mmc0: Timeout waiting for hardware cmd interrupt. [ 10.728042] mmc0: sdhci: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D SDHCI REGI= STER DUMP =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [ 10.728356] mmc0: sdhci: Sys addr: 0x00000002 | Version: 0x00002402 [ 10.728618] mmc0: sdhci: Blk size: 0x00000000 | Blk cnt: 0x00000000 [ 10.728919] mmc0: sdhci: Argument: 0x00000000 | Trn mode: 0x00000000 [ 10.729271] mmc0: sdhci: Present: 0x01ff0000 | Host ctl: 0x00000001 [ 10.729591] mmc0: sdhci: Power: 0x0000000f | Blk gap: 0x00000000 [ 10.729903] mmc0: sdhci: Wake-up: 0x00000000 | Clock: 0x00000000 [ 10.730223] mmc0: sdhci: Timeout: 0x00000000 | Int stat: 0x00000000 [ 10.730537] mmc0: sdhci: Int enab: 0x00ff0083 | Sig enab: 0x00ff0083 [ 10.730795] mmc0: sdhci: ACmd stat: 0x00000000 | Slot int: 0x00000000 [ 10.731005] mmc0: sdhci: Caps: 0x056900b9 | Caps_1: 0x00000000 [ 10.731211] mmc0: sdhci: Cmd: 0x00000000 | Max curr: 0x00000000 [ 10.731415] mmc0: sdhci: Resp[0]: 0x00000000 | Resp[1]: 0x00000000 [ 10.731636] mmc0: sdhci: Resp[2]: 0x00000000 | Resp[3]: 0x00000000 [ 10.731851] mmc0: sdhci: Host ctl2: 0x00000000 [ 10.732018] mmc0: sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x00000000 [ 10.732229] mmc0: sdhci: =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=3D=3D= =3D=3D=3D=3D Signed-off-by: Kuan-Wei Chiu --- hw/misc/Kconfig | 3 ++ hw/misc/cv1800b_clk.c | 89 +++++++++++++++++++++++++++++++++++ hw/misc/meson.build | 1 + include/hw/misc/cv1800b_clk.h | 24 ++++++++++ 4 files changed, 117 insertions(+) create mode 100644 hw/misc/cv1800b_clk.c create mode 100644 include/hw/misc/cv1800b_clk.h diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig index 99bdf09219..42cdf771a4 100644 --- a/hw/misc/Kconfig +++ b/hw/misc/Kconfig @@ -254,4 +254,7 @@ config IOSB config XLNX_VERSAL_TRNG bool =20 +config SOPHGO_CV1800B_CLK + bool + source macio/Kconfig diff --git a/hw/misc/cv1800b_clk.c b/hw/misc/cv1800b_clk.c new file mode 100644 index 0000000000..738f0910db --- /dev/null +++ b/hw/misc/cv1800b_clk.c @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Sophgo CV1800B Clock Controller + * + * Copyright (c) 2026 Kuan-Wei Chiu + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "hw/misc/cv1800b_clk.h" + +#define REG_CLK_BYP_0 (0x030 / 4) +#define REG_CLK_BYP_1 (0x034 / 4) + +static uint64_t cv1800b_clk_read(void *opaque, hwaddr addr, unsigned int s= ize) +{ + CV1800BClkState *s =3D opaque; + uint32_t val =3D 0; + + if ((addr / 4) < ARRAY_SIZE(s->regs)) { + val =3D s->regs[addr / 4]; + } + + return val; +} + +static void cv1800b_clk_write(void *opaque, hwaddr addr, uint64_t val, uns= igned int size) +{ + CV1800BClkState *s =3D opaque; + + if ((addr / 4) < ARRAY_SIZE(s->regs)) { + s->regs[addr / 4] =3D val; + } +} + +static const MemoryRegionOps cv1800b_clk_ops =3D { + .read =3D cv1800b_clk_read, + .write =3D cv1800b_clk_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, +}; + +static void cv1800b_clk_reset_hold(Object *obj, ResetType type) +{ + CV1800BClkState *s =3D CV1800B_CLK(obj); + + memset(s->regs, 0, sizeof(s->regs)); + + /* + * TODO: Implement proper PLL state machines. + * For now, use POR default to bypass PLLs and boot via 25MHz XTAL. + */ + s->regs[REG_CLK_BYP_0] =3D 0xFFFFFFFF; + s->regs[REG_CLK_BYP_1] =3D 0xFFFFFFFF; +} + +static void cv1800b_clk_init(Object *obj) +{ + CV1800BClkState *s =3D CV1800B_CLK(obj); + + memory_region_init_io(&s->iomem, obj, &cv1800b_clk_ops, s, + TYPE_CV1800B_CLK, 0x1000); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem); +} + +static void cv1800b_clk_class_init(ObjectClass *klass, const void *data) +{ + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + + rc->phases.hold =3D cv1800b_clk_reset_hold; +} + +static const TypeInfo cv1800b_clk_info =3D { + .name =3D TYPE_CV1800B_CLK, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(CV1800BClkState), + .instance_init =3D cv1800b_clk_init, + .class_init =3D cv1800b_clk_class_init, +}; + +static void cv1800b_clk_register_types(void) +{ + type_register_static(&cv1800b_clk_info); +} + +type_init(cv1800b_clk_register_types) diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 245ab9b98c..a4c5f90cd8 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -35,6 +35,7 @@ system_ss.add(when: 'CONFIG_SIFIVE_E_PRCI', if_true: file= s('sifive_e_prci.c')) 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_SOPHGO_CV1800B_CLK', if_true: files('cv1800b_c= lk.c')) =20 subdir('macio') =20 diff --git a/include/hw/misc/cv1800b_clk.h b/include/hw/misc/cv1800b_clk.h new file mode 100644 index 0000000000..05c0d1ca1b --- /dev/null +++ b/include/hw/misc/cv1800b_clk.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Sophgo CV1800B Clock Controller + * + * Copyright (c) 2026 Kuan-Wei Chiu + */ + +#ifndef HW_MISC_CV1800B_CLK_H +#define HW_MISC_CV1800B_CLK_H + +#include "hw/core/sysbus.h" +#include "qom/object.h" + +#define TYPE_CV1800B_CLK "cv1800b-clk" +OBJECT_DECLARE_SIMPLE_TYPE(CV1800BClkState, CV1800B_CLK) + +struct CV1800BClkState { + SysBusDevice parent_obj; + + MemoryRegion iomem; + uint32_t regs[0x1000 / 4]; +}; + +#endif --=20 2.54.0.563.g4f69b47b94-goog From nobody Sat May 30 17:43:29 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778579240; cv=none; d=zohomail.com; s=zohoarc; b=cA9GrrzVbrW3SdYx4CbBfBdy6RIF/lNFfJ+W7ZeKP8XBtjM/Q9BvgFpb5JJB8/YIQiCHn28IUG0jTuNk3nx+hjuXpk9jzWuuVwjtiAOqadZPrJX9A2uYSDPA1D11uHkpFq72w6hHAwKIO36qAwxwhTM2qHK+gvpjN3CGNxvG/T8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778579240; h=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=glcjIMxZZysIE7r/mnimuPjUh4Szz2MUKvKWN/XEWCQ=; b=MclMo+geSm9ZXqMUP1EPYQ3bsEBK5vDige+Hu9s7i2+LzqdyO7P80GQaJll7xPro87PHktWoEFNKW52lJvx8l1sju+nsG3wTi1z4ZV0N/wvMmDDuseVZD7GbqGwwtioaKyJFRbbVNya0GwdvzZGlTCSScXXyuigwDOCqndt4hJc= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778579240088354.915325575024; Tue, 12 May 2026 02:47:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMjhe-0004RW-Ue; Tue, 12 May 2026 05:47:02 -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 1wMjhS-0004Om-7J for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:50 -0400 Received: from mail-pf1-x433.google.com ([2607:f8b0:4864:20::433]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMjhP-00015o-NB for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:49 -0400 Received: by mail-pf1-x433.google.com with SMTP id d2e1a72fcca58-82fbf5d4dc2so3738724b3a.1 for ; Tue, 12 May 2026 02:46:47 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (32.237.80.34.bc.googleusercontent.com. [34.80.237.32]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-839682aba01sm22960593b3a.55.2026.05.12.02.46.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 May 2026 02:46:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778579206; x=1779184006; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=glcjIMxZZysIE7r/mnimuPjUh4Szz2MUKvKWN/XEWCQ=; b=EmNSFPl8807NL3m6wqGzsAzndcganR6c65p9xYmDrAuJKKmvtm35S9c9z0VcAHemYN Y9GqrpXq7mgx3wCW2LrWos1m//3s7Df4t+73HkY+KDH7ARTfGBgu+iV8ui+GdPvLxnZA yHuA3JvAMXP5gHTEmalX0SXXvFGDt09Lw5CFCpDuJbfanOF+N85TfE4411+0R13uLGu2 38okbwxqcKVIKC09y1UhzD1KeO5dmBKYpdim9eNz8ksepwRe93P1qQJ8Va3sH8mLU6Yd q5lQFdjbetol83anyIaHVXnf5mKGg2HAQwk2YGhyV6H4lGOHGJ2xy1/19jNMaIs4P0a7 k4Eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778579206; x=1779184006; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=glcjIMxZZysIE7r/mnimuPjUh4Szz2MUKvKWN/XEWCQ=; b=c+GdKITOByotVsECDVBUCPB34jZenIq7xBIcV9TsFltmHWAZZR7KTkF8TbllcNfThF 7q1VrlWTr0eJo3vNTx6E6Aj15sNFgjr7kWUAykmgOo3hHBNP7bOLpTDgnJx5KZ5gklmX sKEK6alMN+e39qjily0Jumdm1q2Hp+xvHdBedDXMTxpZtNP8Gq3ia0nRcqx3ifuL3VMp e8G9zxlNP9f41InusMyaZDqWepVG8JN0XxLAoSaLj4QjKdRGN7JwhHhbdgeO3PZge7Ad bpzVWgiCKZ+JXv4VPjDNSuIlcOiy3IG9I1BOX980qHmHSAGVWkhzPJDIJx7C5o4TZksS xl4Q== X-Forwarded-Encrypted: i=1; AFNElJ916phX9JrlVM7XXo7Jv4aIKPdkzKcn2orRh/SgwfWed8IMOZlApM2rj1Cj1rOo9f+Z5kYS5ezqWYHG@nongnu.org X-Gm-Message-State: AOJu0Ywda3Mfzfkl3qDengM4U02hsESB8HLPxsmmlvVnXHIjSxNnMDYo SIO2GwX0o+FIMfp6IwVH7nehbuV9mm5NnlzrM2dCfttGLVK8sJ9Ne6kv X-Gm-Gg: Acq92OGfYwVp89fJHxQIh6sBxb8XHjNICVWodzJoB7QO/KJOzQ+klAmnwWNO9/1WjqJ CRZ4pOWRQAyAC3N4xwrSx22GMbgs9m6EKGYvYqv0FsbanQS4gO6wKmYbRJnzAZ5TxEfJLG421UR itq8MVI65H2WntdgI6xQw7BMHnRp4XIT3Bzc5oWy3CPSmE7v7ICYvu/chmsp++sRY8HXaXVeNJR MIFVw7jRymhz/bPAfBHRjjf8nldFxYLyVC6dcqKAfZPvH73jHxIAaEazyadCpy183HDv1dnQcvS gQxl4ZJDg8y/cAwAShcu5Ia9zfS9LbkyThGhtIo773jdAoewmFwFXNnSDPgCD2wvHPYbQTlKgWx tIZJPzq+hBIvY4NAHv4n1aNle4e6PDBJhduF5Gmp6WPDi9IUywug46KikHrfBvwnLI76BbSSl2F apCZsNIakKIU0QuPlQfpLKjyT45GKZ8QnhKsBoqCO3hrmpdS92YmICKnh1Sq7TYLTGJF240+s1M m9Lc1VG8RBYFD6cScvfXzxg2VZVWLAYGS6h2BDe2W+s X-Received: by 2002:a05:6a00:3e13:b0:82d:603f:f3a with SMTP id d2e1a72fcca58-83eebc3bef4mr2640556b3a.24.1778579206070; Tue, 12 May 2026 02:46:46 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, palmer@dabbelt.com, alistair.francis@wdc.com, christoph.muellner@vrull.eu Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, jserv@ccns.ncku.edu.tw, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH RFC 4/5] hw/riscv: Add Sophgo CV1800B SoC support Date: Tue, 12 May 2026 09:46:12 +0000 Message-ID: <20260512094614.3464388-5-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog In-Reply-To: <20260512094614.3464388-1-visitorckw@gmail.com> References: <20260512094614.3464388-1-visitorckw@gmail.com> 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::433; envelope-from=visitorckw@gmail.com; helo=mail-pf1-x433.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1778579241653158500 Content-Type: text/plain; charset="utf-8" Add the Sophgo CV1800B SoC, which is the heart of the Milk-V Duo board. The SoC features a T-Head C906 CPU along with integrated PLIC, CLINT, and dw8250 UART. The memory map and interrupts are configured according to the CV1800B datasheet. [1] Several peripheral blocks are included as unimplemented devices to ensure that drivers can probe successfully without causing errors during boot. Link: https://github.com/milkv-duo/duo-files/tree/main/duo/datasheet [1] Signed-off-by: Kuan-Wei Chiu --- hw/riscv/Kconfig | 8 ++ hw/riscv/cv1800b.c | 168 +++++++++++++++++++++++++++++++++++++ hw/riscv/meson.build | 2 + include/hw/riscv/cv1800b.h | 52 ++++++++++++ 4 files changed, 230 insertions(+) create mode 100644 hw/riscv/cv1800b.c create mode 100644 include/hw/riscv/cv1800b.h diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index 2518b04175..5b68991edb 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -138,3 +138,11 @@ config MIPS_BOSTON_AIA select RISCV_MIPS_CMGCR select RISCV_MIPS_CPC select RISCV_MIPS_CPS + +config SOPHGO_CV1800B + bool + depends on RISCV64 + select RISCV_ACLINT + select SIFIVE_PLIC + select SOPHGO_CV1800B_CLK + select DW8250 diff --git a/hw/riscv/cv1800b.c b/hw/riscv/cv1800b.c new file mode 100644 index 0000000000..c6749e1202 --- /dev/null +++ b/hw/riscv/cv1800b.c @@ -0,0 +1,168 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Sophgo CV1800B SoC + * + * Copyright (c) 2026 Kuan-Wei Chiu + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/riscv/cv1800b.h" +#include "hw/core/qdev-properties.h" +#include "target/riscv/cpu-qom.h" +#include "system/system.h" +#include "hw/char/serial.h" +#include "hw/intc/riscv_aclint.h" +#include "system/address-spaces.h" +#include "hw/intc/sifive_plic.h" +#include "target/riscv/cpu.h" +#include "hw/riscv/boot.h" +#include "hw/sd/sdhci.h" +#include "hw/misc/unimp.h" + +const MemMapEntry cv1800b_memmap[] =3D { + [CV1800B_DEV_TOP_MISC] =3D { 0x03000000, 0x1000 }, + [CV1800B_DEV_PINMUX] =3D { 0x03001000, 0x1000 }, + [CV1800B_DEV_CLK] =3D { 0x03002000, 0x1000 }, + [CV1800B_DEV_RST] =3D { 0x03003000, 0x1000 }, + [CV1800B_DEV_WDT] =3D { 0x03010000, 0x1000 }, + [CV1800B_DEV_GPIO] =3D { 0x03020000, 0x4000 }, + [CV1800B_DEV_UART0] =3D { 0x04140000, 0x10000 }, + [CV1800B_DEV_SD0] =3D { 0x04310000, 0x10000 }, + [CV1800B_DEV_ROM] =3D { 0x04400000, 0x10000 }, + [CV1800B_DEV_RTC_GPIO] =3D { 0x05021000, 0x1000 }, + [CV1800B_DEV_RTC_IO] =3D { 0x05027000, 0x1000 }, + [CV1800B_DEV_PLIC] =3D { 0x70000000, 0x4000000 }, + [CV1800B_DEV_CLINT] =3D { 0x74000000, 0x10000 }, + [CV1800B_DEV_DRAM] =3D { 0x80000000, 0x0 }, +}; + +static void cv1800b_soc_instance_init(Object *obj) +{ + CV1800BSoCState *s =3D CV1800B_SOC(obj); + + object_initialize_child(obj, "cpus", &s->cpus, TYPE_RISCV_HART_ARRAY); + object_initialize_child(obj, "clk", &s->clk, TYPE_CV1800B_CLK); +} + +static void cv1800b_soc_realize(DeviceState *dev, Error **errp) +{ + CV1800BSoCState *s =3D CV1800B_SOC(dev); + MachineState *ms =3D MACHINE(qdev_get_machine()); + uint32_t num_harts =3D ms->smp.cpus; + MemoryRegion *system_memory =3D get_system_memory(); + char *plic_hart_config; + DeviceState *uart, *sdhci; + + qdev_prop_set_uint32(DEVICE(&s->cpus), "num-harts", num_harts); + qdev_prop_set_uint32(DEVICE(&s->cpus), "hartid-base", 0); + qdev_prop_set_string(DEVICE(&s->cpus), "cpu-type", TYPE_RISCV_CPU_THEA= D_C906); + + qdev_prop_set_uint64(DEVICE(&s->cpus), "resetvec", + cv1800b_memmap[CV1800B_DEV_ROM].base); + + sysbus_realize(SYS_BUS_DEVICE(&s->cpus), &error_fatal); + + memory_region_init_rom(&s->rom, OBJECT(dev), "cv1800b.rom", + cv1800b_memmap[CV1800B_DEV_ROM].size, &error_fa= tal); + memory_region_add_subregion(system_memory, + cv1800b_memmap[CV1800B_DEV_ROM].base, &s->= rom); + + riscv_aclint_swi_create(cv1800b_memmap[CV1800B_DEV_CLINT].base, + 0, num_harts, false); + riscv_aclint_mtimer_create(cv1800b_memmap[CV1800B_DEV_CLINT].base + + RISCV_ACLINT_SWI_SIZE, + RISCV_ACLINT_DEFAULT_MTIMER_SIZE, + 0, num_harts, RISCV_ACLINT_DEFAULT_MTIMECMP, + RISCV_ACLINT_DEFAULT_MTIME, + RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true); + + plic_hart_config =3D riscv_plic_hart_config_string(num_harts); + s->plic =3D sifive_plic_create( + cv1800b_memmap[CV1800B_DEV_PLIC].base, + plic_hart_config, + num_harts, + 0, + CV1800B_PLIC_NUM_SOURCES, + CV1800B_PLIC_NUM_PRIORITIES, + 0x0, + 0x1000, + 0x2000, + 0x80, + 0x200000, + 0x1000, + cv1800b_memmap[CV1800B_DEV_PLIC].size); + + g_free(plic_hart_config); + + uart =3D qdev_new("dw8250"); + qdev_prop_set_uint8(uart, "regshift", 2); + qdev_prop_set_chr(uart, "chardev", serial_hd(0)); + sysbus_realize(SYS_BUS_DEVICE(uart), errp); + sysbus_mmio_map(SYS_BUS_DEVICE(uart), 0, cv1800b_memmap[CV1800B_DEV_UA= RT0].base); + sysbus_connect_irq(SYS_BUS_DEVICE(uart), 0, + qdev_get_gpio_in(DEVICE(s->plic), CV1800B_UART0_IRQ= )); + + sdhci =3D qdev_new(TYPE_SYSBUS_SDHCI); + qdev_prop_set_uint8(sdhci, "sd-spec-version", 3); + qdev_prop_set_uint64(sdhci, "capareg", 0x056900b9); + sysbus_realize(SYS_BUS_DEVICE(sdhci), &error_fatal); + sysbus_mmio_map(SYS_BUS_DEVICE(sdhci), 0, cv1800b_memmap[CV1800B_DEV_S= D0].base); + sysbus_connect_irq(SYS_BUS_DEVICE(sdhci), 0, + qdev_get_gpio_in(DEVICE(s->plic), CV1800B_SD0_IRQ)); + + sysbus_realize(SYS_BUS_DEVICE(&s->clk), &error_fatal); + sysbus_mmio_map(SYS_BUS_DEVICE(&s->clk), 0, + cv1800b_memmap[CV1800B_DEV_CLK].base); + + create_unimplemented_device("cv1800b.top_misc", + cv1800b_memmap[CV1800B_DEV_TOP_MISC].base, + cv1800b_memmap[CV1800B_DEV_TOP_MISC].size); + + create_unimplemented_device("cv1800b.pinmux", + cv1800b_memmap[CV1800B_DEV_PINMUX].base, + cv1800b_memmap[CV1800B_DEV_PINMUX].size); + + create_unimplemented_device("cv1800b.rst", + cv1800b_memmap[CV1800B_DEV_RST].base, + cv1800b_memmap[CV1800B_DEV_RST].size); + + create_unimplemented_device("cv1800b.wdt", + cv1800b_memmap[CV1800B_DEV_WDT].base, + cv1800b_memmap[CV1800B_DEV_WDT].size); + + create_unimplemented_device("cv1800b.gpio0_3", + cv1800b_memmap[CV1800B_DEV_GPIO].base, + cv1800b_memmap[CV1800B_DEV_GPIO].size); + + create_unimplemented_device("cv1800b.rtc_gpio", + cv1800b_memmap[CV1800B_DEV_RTC_GPIO].base, + cv1800b_memmap[CV1800B_DEV_RTC_GPIO].size); + + create_unimplemented_device("cv1800b.rtc_io", + cv1800b_memmap[CV1800B_DEV_RTC_IO].base, + cv1800b_memmap[CV1800B_DEV_RTC_IO].size); +} + +static void cv1800b_soc_class_init(ObjectClass *oc, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + + dc->realize =3D cv1800b_soc_realize; + dc->user_creatable =3D false; +} + +static const TypeInfo cv1800b_soc_type_info =3D { + .name =3D TYPE_CV1800B_SOC, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(CV1800BSoCState), + .instance_init =3D cv1800b_soc_instance_init, + .class_init =3D cv1800b_soc_class_init, +}; + +static void cv1800b_soc_register_types(void) +{ + type_register_static(&cv1800b_soc_type_info); +} + +type_init(cv1800b_soc_register_types) diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index 533472e22a..04e25eeece 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -18,4 +18,6 @@ riscv_ss.add(when: 'CONFIG_XIANGSHAN_KUNMINGHU', if_true:= files('xiangshan_kmh.c riscv_ss.add(when: 'CONFIG_RISCV_MIPS_CPS', if_true: files('cps.c')) riscv_ss.add(when: 'CONFIG_MIPS_BOSTON_AIA', if_true: files('boston-aia.c'= )) =20 +riscv_ss.add(when: 'CONFIG_SOPHGO_CV1800B', if_true: files('cv1800b.c')) + hw_arch +=3D {'riscv': riscv_ss} diff --git a/include/hw/riscv/cv1800b.h b/include/hw/riscv/cv1800b.h new file mode 100644 index 0000000000..a214f7a9f6 --- /dev/null +++ b/include/hw/riscv/cv1800b.h @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Sophgo CV1800B SoC + * + * Copyright (c) 2026 Kuan-Wei Chiu + */ + +#ifndef HW_RISCV_CV1800B_H +#define HW_RISCV_CV1800B_H + +#include "hw/core/boards.h" +#include "hw/riscv/riscv_hart.h" +#include "hw/misc/cv1800b_clk.h" + +#define TYPE_CV1800B_SOC "cv1800b-soc" +OBJECT_DECLARE_SIMPLE_TYPE(CV1800BSoCState, CV1800B_SOC) + +struct CV1800BSoCState { + DeviceState parent_obj; + + RISCVHartArrayState cpus; + MemoryRegion rom; + DeviceState *plic; + CV1800BClkState clk; +}; + +#define CV1800B_PLIC_NUM_SOURCES 136 +#define CV1800B_PLIC_NUM_PRIORITIES 31 + +#define CV1800B_UART0_IRQ 44 +#define CV1800B_SD0_IRQ 36 + +enum { + CV1800B_DEV_TOP_MISC, + CV1800B_DEV_PINMUX, + CV1800B_DEV_CLK, + CV1800B_DEV_RST, + CV1800B_DEV_WDT, + CV1800B_DEV_GPIO, + CV1800B_DEV_UART0, + CV1800B_DEV_SD0, + CV1800B_DEV_ROM, + CV1800B_DEV_RTC_GPIO, + CV1800B_DEV_RTC_IO, + CV1800B_DEV_PLIC, + CV1800B_DEV_CLINT, + CV1800B_DEV_DRAM, +}; + +extern const MemMapEntry cv1800b_memmap[]; + +#endif --=20 2.54.0.563.g4f69b47b94-goog From nobody Sat May 30 17:43:29 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778579268; cv=none; d=zohomail.com; s=zohoarc; b=cDNoXx1Io+EE3in25IhNaJFMh2lCL7kVFENznzrgilEqtYzWDVr8gM62ogRMfEEuxo0ZP+x5E10NcOlPGTOrXzsk80PmoIWfhW0WvpECc6//UaUbU/uU84oG8JR4wFPDyRIWlEpu/6TiSE733Sgqz50KbhVm2priYyhpPx2x+tM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778579268; h=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=/No9fktPmi4K24uACzlU+WQCPk8PaeGoxEtfXZykuS8=; b=KgMwkvnqbMevDQf7NxPHkE+EeFCUrxvbq2PxpiUeYSQVDK24p7hr+e1gE+02t240ALpdTKvNdGaP028Yv2JIcG4PkSB9tEFgyS4zpt9CBvdIy7Y9g5i5vR8DrMUeefG8lwm1JyB59Wf93CPdQVwQYnONBXE2AhG34ER6+ezFM28= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177857926835423.025450955762608; Tue, 12 May 2026 02:47:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMjhj-0004Rg-HE; Tue, 12 May 2026 05:47:07 -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 1wMjhW-0004Pe-2z for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:56 -0400 Received: from mail-pf1-x42b.google.com ([2607:f8b0:4864:20::42b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMjhU-00016l-5g for qemu-devel@nongnu.org; Tue, 12 May 2026 05:46:53 -0400 Received: by mail-pf1-x42b.google.com with SMTP id d2e1a72fcca58-83d5bbef760so1755961b3a.1 for ; Tue, 12 May 2026 02:46:51 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (32.237.80.34.bc.googleusercontent.com. [34.80.237.32]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-839682aba01sm22960593b3a.55.2026.05.12.02.46.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 May 2026 02:46:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778579211; x=1779184011; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/No9fktPmi4K24uACzlU+WQCPk8PaeGoxEtfXZykuS8=; b=IqljklCoEboltC0tgA2Q9VnearZSqt0xfK0SqtrO7r3D8S8gpgTFE/mwd+ysTrSd2R 285mg3xNLKFzx+i3RQ3zT+UETEbIeGzzP8n2blhhFfJCCgzYBnsw+2ZpGoytPjn6RIM1 tO2DM7I+H4UyDgpBtGxGlX77z3uC7Cx04gw7gLLtUIRkaxk4EN+y/zeARoKQSGEIIiNf HXh5TyclbZHxS22CKb90DFB6Wxx6TH7t529nGuMlENx4ea7kpWlUaFcmBx+K7zbefFEa pyCLg+SQbNd4NcZkbPFiiuDW1MHs83wgEtQ2dRXFA2BOcwTU/ba+91kPMN8Ov7641w+f KW0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778579211; x=1779184011; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=/No9fktPmi4K24uACzlU+WQCPk8PaeGoxEtfXZykuS8=; b=RB75lsy1qNUyKdZ8GyepDVmRM4+3IMIgehq+yqLCr01SQsjUFJaE9ubDERfZL0klWh 867U9g9URcyeIuy3H8KhoUU0Mi6W6B4yG3RGdUZmATmKeOIrEO1WrfydYXvt/M5oB8i3 cMTWVJLoWYKv9jMR69extbDR1/5DPwSESpJAG+YwNB4wX3NFRzSN9ddiwb0D7piKbr8X 01i+zRw/8iN34prRsZTZejE2O35ztZG81luxr8956SG6w2RJWXQPZTY1/QT6jKvpl0wG rtPnrx0NF3FXSHkBouIELUVIkMTwapInhwtYaFNKXJ28OCk7gbK+UuyIN9HlDNyB9nCM h7IA== X-Forwarded-Encrypted: i=1; AFNElJ+JXrYgmus5QFMvzTJW7KTAEvWYzu0ODRm1qTl59Ci6Ip/NJiFa+y6YmyMERNbujKrQJETZZQNmEQq0@nongnu.org X-Gm-Message-State: AOJu0YwjmB4+hzb+NgWmRgCg/cuLy2wpgb08JVbd8szk+vxJG59BrcSZ OC5/+E2cMNysMklutExB4jJceGJ+npyE7R9O/2ExbI7X3QJtE2Pq1hna X-Gm-Gg: Acq92OFf3t5B0hN4M7fJhHKCceINDSHzgZLu2e4S1PKqk1QAYNdpIR/H0BtEo28r8VL sTra/SBqiB2Kd/ERR5AslUAfWcpfhpaYWbYJQJ0pUwRxcZt/4ttTyPHunoy5oVdNs6sV/bRZkwl UKN6oV5Ce/NdhPHMDa/2Grdz2OkHYsHtMmbDqmfe2Yoa7N7yat3cMf8Xt2ZSvHGDxQfV1KiAvQx Cxphc4gQA/M9szPBl6L2X322n2vFLEQ8FJlbGKjJCLka2OZLkmlZNipCsPhej//2SwXYPQQAGtp hkjJwV9o4yBbMnfbEi1x48KrJSk5YsY4zrDE3jF+EfgF58iYRHZL1DaBswSN7Ydg5Kqj8Xw0nOt GwNZhRDL1ODyAfaX6EG2fW1SHw8JPS3rQ1RTh+DCX5xOIY/46IzPAu+xRjgWf2+H/p8sRRz66Ty XrZW8bR6ZQ9JETkgWVtMLj/a3X8Y+dWZtK9HtAeDAqStkdFwDv6yK53JLxfJKhaZ26Ka+ibpFRK FdMBsfJZKLqGARGPtaJNuImKOuD23wcbA== X-Received: by 2002:a05:6a00:4088:b0:838:af72:fb1f with SMTP id d2e1a72fcca58-83a5afe1f08mr30226095b3a.2.1778579210648; Tue, 12 May 2026 02:46:50 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, palmer@dabbelt.com, alistair.francis@wdc.com, christoph.muellner@vrull.eu Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, jserv@ccns.ncku.edu.tw, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH RFC 5/5] hw/riscv: Add Milk-V Duo board support Date: Tue, 12 May 2026 09:46:13 +0000 Message-ID: <20260512094614.3464388-6-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog In-Reply-To: <20260512094614.3464388-1-visitorckw@gmail.com> References: <20260512094614.3464388-1-visitorckw@gmail.com> 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::42b; envelope-from=visitorckw@gmail.com; helo=mail-pf1-x42b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1778579270056154100 Content-Type: text/plain; charset="utf-8" Add support for the Milk-V Duo development board, which is powered by the Sophgo CV1800B SoC. The implementation includes: - Board-level machine initialization with 64mb of default ram. - Integration of the CV1800B SoC. - Support for loading external FDT, kernel, and initrd images. - Proper setup of the reset vector to match the CV1800B's boot flow. Signed-off-by: Kuan-Wei Chiu --- MAINTAINERS | 11 ++ configs/devices/riscv64-softmmu/default.mak | 1 + hw/riscv/Kconfig | 6 + hw/riscv/meson.build | 1 + hw/riscv/milkv_duo.c | 122 ++++++++++++++++++++ 5 files changed, 141 insertions(+) create mode 100644 hw/riscv/milkv_duo.c diff --git a/MAINTAINERS b/MAINTAINERS index afa178c5cc..2e729098d0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1780,6 +1780,17 @@ F: docs/system/riscv/xiangshan-kunminghu.rst F: hw/riscv/xiangshan_kmh.c F: include/hw/riscv/xiangshan_kmh.h =20 +Milk-V Duo +M: Kuan-Wei Chiu +S: Maintained +F: hw/riscv/cv1800b.c +F: hw/riscv/milkv_duo.c +F: include/hw/riscv/cv1800b.h +F: hw/misc/cv1800b_clk.c +F: include/hw/misc/cv1800b_clk.h +F: hw/char/dw8250.c +F: include/hw/char/dw8250.h + RX Machines ----------- rx-gdbsim diff --git a/configs/devices/riscv64-softmmu/default.mak b/configs/devices/= riscv64-softmmu/default.mak index a8e4d0ab33..2ba91b14d4 100644 --- a/configs/devices/riscv64-softmmu/default.mak +++ b/configs/devices/riscv64-softmmu/default.mak @@ -13,3 +13,4 @@ # CONFIG_SHAKTI_C=3Dn # CONFIG_XIANGSHAN_KUNMINGHU=3Dn # CONFIG_MIPS_BOSTON_AIA=3Dn +# CONFIG_MILKV_DUO=3Dn diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index 5b68991edb..8615b1cc3e 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -146,3 +146,9 @@ config SOPHGO_CV1800B select SIFIVE_PLIC select SOPHGO_CV1800B_CLK select DW8250 + +config MILKV_DUO + bool + depends on RISCV64 + default y + select SOPHGO_CV1800B diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index 04e25eeece..19a0bf8e5b 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -19,5 +19,6 @@ riscv_ss.add(when: 'CONFIG_RISCV_MIPS_CPS', if_true: file= s('cps.c')) riscv_ss.add(when: 'CONFIG_MIPS_BOSTON_AIA', if_true: files('boston-aia.c'= )) =20 riscv_ss.add(when: 'CONFIG_SOPHGO_CV1800B', if_true: files('cv1800b.c')) +riscv_ss.add(when: 'CONFIG_MILKV_DUO', if_true: files('milkv_duo.c')) =20 hw_arch +=3D {'riscv': riscv_ss} diff --git a/hw/riscv/milkv_duo.c b/hw/riscv/milkv_duo.c new file mode 100644 index 0000000000..5e8d5ea009 --- /dev/null +++ b/hw/riscv/milkv_duo.c @@ -0,0 +1,122 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Milk-V Duo board + * + * Copyright (c) 2026 Kuan-Wei Chiu + */ + +#include "qemu/osdep.h" +#include "qemu/units.h" +#include "qapi/error.h" +#include "hw/core/boards.h" +#include "hw/riscv/cv1800b.h" +#include "hw/riscv/boot.h" +#include "target/riscv/cpu-qom.h" +#include "system/system.h" +#include "system/device_tree.h" +#include "qemu/error-report.h" +#include "hw/core/loader.h" +#include + +struct MilkVDuoState { + MachineState parent_obj; + CV1800BSoCState soc; +}; + +#define TYPE_MILK_V_DUO MACHINE_TYPE_NAME("milkv-duo") +OBJECT_DECLARE_SIMPLE_TYPE(MilkVDuoState, MILK_V_DUO) + +static void milkv_duo_init(MachineState *machine) +{ + MilkVDuoState *s =3D MILK_V_DUO(machine); + MemoryRegion *system_memory =3D get_system_memory(); + RISCVBootInfo boot_info; + hwaddr firmware_load_addr, firmware_end_addr; + hwaddr fdt_load_addr =3D 0; + int fdt_size =3D 0; + uint64_t kernel_entry =3D 0; + + object_initialize_child(OBJECT(machine), "soc", &s->soc, TYPE_CV1800B_= SOC); + qdev_realize(DEVICE(&s->soc), NULL, &error_fatal); + + memory_region_add_subregion(system_memory, + cv1800b_memmap[CV1800B_DEV_DRAM].base, + machine->ram); + + riscv_boot_info_init(&boot_info, &s->soc.cpus); + + firmware_load_addr =3D cv1800b_memmap[CV1800B_DEV_DRAM].base; + firmware_end_addr =3D firmware_load_addr; + if (machine->firmware) { + firmware_end_addr =3D riscv_find_and_load_firmware(machine, machin= e->firmware, + &firmware_load_ad= dr, NULL); + } + + if (machine->dtb) { + machine->fdt =3D load_device_tree(machine->dtb, &fdt_size); + if (!machine->fdt) { + error_report("Failed to load device tree"); + exit(1); + } + + if (machine->kernel_cmdline && *machine->kernel_cmdline) { + if (fdt_path_offset(machine->fdt, "/chosen") < 0) { + qemu_fdt_add_subnode(machine->fdt, "/chosen"); + } + qemu_fdt_setprop_string(machine->fdt, "/chosen", "bootargs", + machine->kernel_cmdline); + } + } + + if (machine->kernel_filename) { + hwaddr kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_in= fo, + firmware_e= nd_addr); + riscv_load_kernel(machine, &boot_info, kernel_start_addr, true, NU= LL); + kernel_entry =3D boot_info.image_low_addr; + } + + if (machine->dtb) { + fdt_load_addr =3D riscv_compute_fdt_addr(cv1800b_memmap[CV1800B_DE= V_DRAM].base, + machine->ram_size, machine,= &boot_info); + rom_add_blob_fixed_as("fdt", machine->fdt, fdt_size, fdt_load_addr, + &address_space_memory); + } + + riscv_setup_rom_reset_vec(machine, &s->soc.cpus, + firmware_load_addr, + cv1800b_memmap[CV1800B_DEV_ROM].base, + cv1800b_memmap[CV1800B_DEV_ROM].size, + kernel_entry, + fdt_load_addr); +} + +static void milkv_duo_machine_class_init(ObjectClass *oc, const void *data) +{ + MachineClass *mc =3D MACHINE_CLASS(oc); + static const char *const valid_cpu_types[] =3D { + TYPE_RISCV_CPU_THEAD_C906, + NULL + }; + + mc->desc =3D "Milk-V Duo Board (CV1800B)"; + mc->init =3D milkv_duo_init; + mc->max_cpus =3D 2; + mc->default_cpu_type =3D TYPE_RISCV_CPU_THEAD_C906; + mc->valid_cpu_types =3D valid_cpu_types; + mc->default_ram_size =3D 64 * MiB; + mc->default_ram_id =3D "riscv.milkv_duo.ram"; +} + +static const TypeInfo milkv_duo_machine_type_info =3D { + .name =3D TYPE_MILK_V_DUO, + .parent =3D TYPE_MACHINE, + .instance_size =3D sizeof(MilkVDuoState), + .class_init =3D milkv_duo_machine_class_init, +}; + +static void milkv_duo_machine_register_types(void) +{ + type_register_static(&milkv_duo_machine_type_info); +} + +type_init(milkv_duo_machine_register_types) --=20 2.54.0.563.g4f69b47b94-goog