From nobody Mon Sep 28 07:26:20 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=1790540109; cv=none; d=zohomail.com; s=zohoarc; b=BOuiwPQF78ztpIvwstwfS3aP5m8y5QhP/aqT2R52fEv3D90Fl2e+OpZvXpJVmkNw92bxhONS6vFMQ/TKH5C2BkDL0uW9kBNySwYCQ5l8L12bYEGUUPQf7Zt/K1LgcQKwrUAXIEmdfFh2n4tetw+mHfKRRbpBOAOMubWXg5U9Phc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790540109; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Bf3vR6iy7Q7v1q8bV5ZxQj6Bf/iMYhH2zfM2TdxLg7Y=; b=Nyu5gm+5lrvgX+dC7+YzyoCcMorbFiw78V6Y8bukXsd8NnDscrQby/q2VWL5Mf8JpuxwWgJ2aSPZWSYNVQoR5oHhZfIU4kAuct7cjawi5t1BJ/Z/QYaA64lQ7W1JpWSsbfE0HC5hjJB2Y1lg6NMNHBWODyhAFt9TdQQw4dZOmHc= 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 1790540109036357.5973986943857; Sun, 27 Sep 2026 13:15:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xAvFx-0008Iz-JN; Sun, 27 Sep 2026 16:13:53 -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 1xAvFv-0008Hu-2X for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:13:51 -0400 Received: from mail-pz2-x2b.google.com ([2607:f8b0:4864:3b::2b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xAvFt-0003Xl-4N for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:13:50 -0400 Received: by mail-pz2-x2b.google.com with SMTP id 41be03b00d2f7-cc78e1a94b8so1267749a12.0 for ; Sun, 27 Sep 2026 13:13:48 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (33.223.194.35.bc.googleusercontent.com. [35.194.223.33]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a0c719f86fsm13932737a91.7.2026.09.27.13.13.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2026 13:13:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790540027; x=1791144827; 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:content-type; bh=Bf3vR6iy7Q7v1q8bV5ZxQj6Bf/iMYhH2zfM2TdxLg7Y=; b=JHYg8mvf9lmlxMzdTibvA9xKn6Wb6zx2lgDdl9ml+ISvO+/efStlrrPG0CHeDramnf sdF5P/21ZWiGutZqo+1D9dtFFaVOC3VLT0FfHiK8DN+fykoMDmnUhzuxWgItDmM1vqzV ZUMJFOegUMCKqklgGS+/gGw0TpbSmpjKpN35Roh3mD/5woGlVmJm+D36if/3t2Piipjo tfeR4pZYSqu+1BW8JZuuQwT0ynZFaAZHoDDMnKioub0cp8Tl1safKQmTsFmNO3Qpp/lt UCe6/eZsvP3x4PJqpNQW1DbgKJRR6YTGr8xyXDtn94oRAWnAGfdKdBs2WsymKt6comot lnpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790540027; x=1791144827; 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:content-type; bh=Bf3vR6iy7Q7v1q8bV5ZxQj6Bf/iMYhH2zfM2TdxLg7Y=; b=FR1r08mknR2Cd4D3pOEh/OByRiKoaGKsqEM9/JmzAgLZt5GbkPUvkHsTABRfpZj/Ho PeLPARyZJDBnht4Vmmens0x2xvLrGcuXRJLCSPss2PxS4TiarQT/TBnRO6PdHQuITuZa +JBtHqww9a3XdLW24wWvFC9mtdt6dJGCol3ksYVCwuX5Zr4ba0XfviBHecKUVOuZoU2c UkAB4DEjT+DlFRqfLfjF69Uv+ELz4Kj8lmXUQE2Ynf+GWi3ZXUuH8IBzKG647s/Z5uZ2 7/n3RpV9rnIQiGvXauwuBu+PNyTKVLOAmW2oaG8dPlm2igdyBTbW/49ppoeeSml2PWh8 uL2g== X-Forwarded-Encrypted: i=1; AKwUvBx4PhRSOFjhGWJEtr44KYH2HaaJ+CBqpXqZEz7AnZc3HIQ8BrbNgSlSqg0iM6vop10COYJ0aj24OG4y@nongnu.org X-Gm-Message-State: AFq9FYIy9HnwQ+XSkXL3gTNkwDUV2PfhY/d9Aa5b+PrWPPNafvOZu5Yl 3ZTsWK9nwktFim0HLwCRqPWPOQ52ZYaaV/8SEAmj613dgGiP0JbhKuwd X-Gm-Gg: AYBFou3iNSUBU19jTYEQgouVfzuGiofBuYegI9G6iixjeecRXH9MXIzo/HMoE48i4Qe bWXeb4cwckXq1mriyXy9cnISRm7vwpMfxzaXq867EkIedIwiWAkeREuOfyuPtFjVgURf7fEPlj6 8Qi+Jq04rRpWwGZKCKfI7u3AP7iNEiE2l1oOeB7kKWjE7YqWjY8CIfPvtZFlauGS1seC44lU7W0 N5bDN8ZOOUf9dUgOPcquIPEVCCvMPagQJ5oyrm6Ecj5Nzi/Y7Hy4jGW6nFNnLC+gdk0BpmKoDzp wFu0YwHb1F01Z9VpzAcZINIr+rWkmQQ1lfEObVysvAU7WK3LulvbXD9c7M9gGbq/5B0IWEwmJA5 1TrcLwr/eb3EUOzYN58I3xbPZPmO2/Fd8AMRzGG0WhjHzUS2vpHg6K+ifKPQnmXNt5VQAfOig6s pfCGL5kZXIxE9ww8vdKCLRNNSQNzFDZDQbgVoUCOjdWmftbtGc8Pycfi0V2Uw9xe21KHVzjBBlj ri2bfDa6YftvP7LQ1l+RZc4rk0ZPytj6Jt2oHG2ppd5aL6YtpgkpaRmqZf6oSUcarNrwRXTqA== X-Received: by 2002:a17:90b:4d0f:b0:39b:61f1:8032 with SMTP id 98e67ed59e1d1-3a098b49032mr9577065a91.16.1790540027496; Sun, 27 Sep 2026 13:13:47 -0700 (PDT) From: Kuan-Wei Chiu To: pierrick.bouvier@oss.qualcomm.com, palmer@dabbelt.com, alistair.francis@wdc.com, pbonzini@redhat.com, marcandre.lureau@redhat.com, farosas@suse.de, lvivier@redhat.com Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu@processmission.com, portias@oss.tenstorrent.com, wxchen0913@gmail.com, jserv@ccns.ncku.edu.tw, marscheng@google.com, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu , Chao Liu Subject: [PATCH v5 1/7] hw/char: Add dw8250 UART Date: Sun, 27 Sep 2026 20:13:20 +0000 Message-ID: <20260927201326.650943-2-visitorckw@gmail.com> X-Mailer: git-send-email 2.56.0.rc1.315.gc6ed9934b7-goog In-Reply-To: <20260927201326.650943-1-visitorckw@gmail.com> References: <20260927201326.650943-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:3b::2b; envelope-from=visitorckw@gmail.com; helo=mail-pz2-x2b.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, 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: 1790540111482158500 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. Signed-off-by: Kuan-Wei Chiu Reviewed-by: Chao Liu Reviewed-by: Alistair Francis --- MAINTAINERS | 6 ++ hw/char/Kconfig | 4 ++ hw/char/dw8250.c | 131 +++++++++++++++++++++++++++++++++++++++ hw/char/meson.build | 1 + include/hw/char/dw8250.h | 27 ++++++++ 5 files changed, 169 insertions(+) create mode 100644 hw/char/dw8250.c create mode 100644 include/hw/char/dw8250.h diff --git a/MAINTAINERS b/MAINTAINERS index 6be9c5725b..d4e9cf61ea 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2848,6 +2848,12 @@ S: Maintained F: hw/i2c/designware_i2c.c F: include/hw/i2c/designware_i2c.h =20 +DesignWare 8250 UART +M: Kuan-Wei Chiu +S: Maintained +F: hw/char/dw8250.c +F: include/hw/char/dw8250.h + Generic Loader M: Alistair Francis S: Maintained 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..ccf05dd9ad --- /dev/null +++ b/hw/char/dw8250.c @@ -0,0 +1,131 @@ +/* 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 "qemu/log.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 >> 2) /* Receiver Output Enable Register */ +#define DW_UART_DLF (0xC0 >> 2) /* Divisor Latch Fraction Register */ +#define DW_UART_CPR (0xF4 >> 2) /* Component Parameter Register */ +#define DW_UART_UCV (0xF8 >> 2) /* UART Component Version */ +#define DW_UART_CTR (0xFC >> 2) /* 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) +{ + DW8250State *s =3D opaque; + + switch (addr >> s->regshift) { + 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) +{ + qemu_log_mask(LOG_UNIMP, "%s: Unimplemented write to address 0x%" HWAD= DR_PRIx "\n", + __func__, addr); +} + +static const MemoryRegionOps dw8250_ext_ops =3D { + .read =3D dw8250_ext_read, + .write =3D dw8250_ext_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .impl =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, + .valid =3D { + .min_access_size =3D 1, + .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); + if (!sysbus_realize(serial_sbd, errp)) { + return; + } + + 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.56.0.rc1.315.gc6ed9934b7-goog From nobody Mon Sep 28 07:26:20 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=1790540064; cv=none; d=zohomail.com; s=zohoarc; b=UndNCti1ZPyDC2B052YP7rPgGrogw1S3KA+SjdfhYd/B3EALHa/X/iNxNzze6IiIqVEMapvE0A6+MtTVjYvjZYGnHZXIWgjc4CJpfuvmzX/GZs/Tp9GftK6J7khJaHUIQWBXZZa6BlrKQ7xqEZMQGSqsrA8KZYZxRyN4Ov3MLzQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790540064; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=O+o0QDQs82pEiMq4tWdLNS83nyp2jAr6qiX3oWOkdxY=; b=Hsfqx0EkSaoOap8KvTU91b/ZbDi70e2mVei1I/a45vI5S/Oiz9CH4ababOgUuX7JYOmMB003YaujmoiXqttnHv2U21PDlAX/7SDuzZ1IXEEkRXf2DUZAQ6DTyGXqCJ2kAvcK2bGBmpdO4S+lI1a4ecLXkSQk+QrCml2bO7iwm48= 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 179054006490749.53042244950268; Sun, 27 Sep 2026 13:14:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xAvG1-0008Jb-V1; Sun, 27 Sep 2026 16:13:57 -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 1xAvG0-0008JG-NK for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:13:56 -0400 Received: from mail-pz2-x2b.google.com ([2607:f8b0:4864:3b::2b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xAvFy-0003YE-Vv for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:13:56 -0400 Received: by mail-pz2-x2b.google.com with SMTP id 41be03b00d2f7-cc78e1a94b8so1267772a12.0 for ; Sun, 27 Sep 2026 13:13:54 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (33.223.194.35.bc.googleusercontent.com. [35.194.223.33]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a0c719f86fsm13932737a91.7.2026.09.27.13.13.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2026 13:13:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790540033; x=1791144833; 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:content-type; bh=O+o0QDQs82pEiMq4tWdLNS83nyp2jAr6qiX3oWOkdxY=; b=se43B9EDe3arP/sn+QmFP0Yc2y2cAmf2wQXTmA/uXDm+uXhuKEcSDHTgTSKOmdAHKh r/Z6SzDH4I4RG453DOxq3xFNhN8Sfx95bdNZ2Mryk/vQ5s1kI52l5x/rOg06FJNV7Z1p TXlYpJoGbFgD1mzwAAn4ExcM/yUvloc1ElyQ16yGcxy06l4SG5wcXgOiNnmnyS0cs14d vcYbmmWIGWJxeRPzOsNShQTrem3/w2XU1T7IZLzAtWsGiNZQT+u0Ip91uXoOR5svYh4K SKdfT2TkTcq5TuB6wPXAP3O4yN6rAiPaNiYrRxpjzCxxsPGr9AEQnZTbLwQpY6/WGHKY 2Bqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790540033; x=1791144833; 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:content-type; bh=O+o0QDQs82pEiMq4tWdLNS83nyp2jAr6qiX3oWOkdxY=; b=hailVzQmHry7RJSJQnc1TICa3Cefm9dHLxPZzgSmCLPeLb2RDCh2yB0ipNU6lUpM++ HVbAMECGS8RhG1wlirLWVBf5OZNRSyUrKgf5ajK5zy9K5BmxnQIoMutwWdzm/2fVGC/i Ol54o7mZo5K65CDIruixm1k9m5tAtUWsZO/quAa4agryAx8WcxO1a0qntJZBns6T0AkR XFKAcBFOJIPjK9ltY2sff4DqBM9U3pMTHeXCkCGP76PZwF/BP+bS/J7qP84S4fFbKbDR RXjJb49DML7O+YJY0j/SgOIblPbLtMOsEhXgy7Py+9cV4r5HaThw5FdB4gfmKsI6KU83 qBYA== X-Forwarded-Encrypted: i=1; AKwUvByuoglgbXna9EuNlj2OSKdiwTPD/4lgnIQlZjQ+CPAsQ9csXbCIJikSo76/tHC8NtessadNfH8FEXM/@nongnu.org X-Gm-Message-State: AFq9FYIGVQcVHOOG5lhERhf3YFfZfJJG0YkhrVgfyryO0I8BlcJ9XN/A e9Dj4RoHoxsH7fWYVLQXXjsiaego6xfTVOlS7ddnbqwLSfqsj6fFJN16 X-Gm-Gg: AYBFou3PtZIkUha4xARX5cMVqKrTHLiqXRsrFQ3YdjBjF6phCGHRMB0SakTG9wRe8sB VvmIhjH9DAAOdNnKMkfst60uQf6AAZu8MQ+9vfWdSJ45vOyM7S3R+pNo6r9onQHCBmw3gB66A00 LycZijjaFrq/EXR7dDcjGVm4t9OEOkRWInw8eLapvlH0nVbX4t7gfVNRXozFGzjODx4YjCRZuMY bM9+H8r/BrYDj4+LLZLgya8Q9/ca34d35tqQ9frZpitATJXREl7QjB2bSX1fiGj6wNWPAWQlfO2 LHM7mlIC5YxMHtp9yPEye84wWnLB+uHdx3jZGkpGGdyWfPHedXMJ6FyL8TdiBJs2DFUxzrDV5H7 eBnLILvYkpswNVskwU7c1xE4AGzL62OEiQP91ciAR/zcjtVzDvkag/8fuqffGN5EVU1IPEWbHLQ RX65gjmTymKaOfI4Km0Uy4XG7I1dKwRhcLowaWI2Z3kBpdIyia6Rcavy/Td/duUe7k9sED/GVMl 0Z0MKc4bc4zzZ1SyKIGQvs1wnSGLviL3HSKZKiW3gPZCADjYlQHPAsoWV0v0r7bKzRN9jzNiw== X-Received: by 2002:a17:90b:4a45:b0:39e:6c68:c77c with SMTP id 98e67ed59e1d1-3a098e07a64mr9844412a91.50.1790540033490; Sun, 27 Sep 2026 13:13:53 -0700 (PDT) From: Kuan-Wei Chiu To: pierrick.bouvier@oss.qualcomm.com, palmer@dabbelt.com, alistair.francis@wdc.com, pbonzini@redhat.com, marcandre.lureau@redhat.com, farosas@suse.de, lvivier@redhat.com Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu@processmission.com, portias@oss.tenstorrent.com, wxchen0913@gmail.com, jserv@ccns.ncku.edu.tw, marscheng@google.com, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v5 2/7] hw/misc: Add Sophgo CV1800B clock controller Date: Sun, 27 Sep 2026 20:13:21 +0000 Message-ID: <20260927201326.650943-3-visitorckw@gmail.com> X-Mailer: git-send-email 2.56.0.rc1.315.gc6ed9934b7-goog In-Reply-To: <20260927201326.650943-1-visitorckw@gmail.com> References: <20260927201326.650943-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:3b::2b; envelope-from=visitorckw@gmail.com; helo=mail-pz2-x2b.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, 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: 1790540067440158500 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. Signed-off-by: Kuan-Wei Chiu Acked-by: Alistair Francis --- hw/misc/Kconfig | 3 ++ hw/misc/cv1800b_clk.c | 98 +++++++++++++++++++++++++++++++++++ hw/misc/meson.build | 1 + include/hw/misc/cv1800b_clk.h | 26 ++++++++++ 4 files changed, 128 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 46e3c03cc8..7abd22869a 100644 --- a/hw/misc/Kconfig +++ b/hw/misc/Kconfig @@ -263,4 +263,7 @@ config AXIADO_CLK config K230_DECOMP_GZIP 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..38807995ac --- /dev/null +++ b/hw/misc/cv1800b_clk.c @@ -0,0 +1,98 @@ +/* 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_BYTE_WIDTH (sizeof(uint32_t)) +#define REG_CLK_BYP_0 (0x030 / REG_BYTE_WIDTH) +#define REG_CLK_BYP_1 (0x034 / REG_BYTE_WIDTH) + +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 < CV1800B_CLK_IOSIZE) { + val =3D s->regs[addr / REG_BYTE_WIDTH]; + } else { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "= \n", + __func__, addr); + } + + return val; +} + +static void cv1800b_clk_write(void *opaque, hwaddr addr, uint64_t val, uns= igned int size) +{ + CV1800BClkState *s =3D opaque; + + if (addr < CV1800B_CLK_IOSIZE) { + s->regs[addr / REG_BYTE_WIDTH] =3D val; + } else { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx = "\n", + __func__, addr); + } +} + +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, CV1800B_CLK_IOSIZE); + 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 9790afa104..244bf278a9 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_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..4d03d887c6 --- /dev/null +++ b/include/hw/misc/cv1800b_clk.h @@ -0,0 +1,26 @@ +/* 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) + +#define CV1800B_CLK_IOSIZE 0x1000 + +struct CV1800BClkState { + SysBusDevice parent_obj; + + MemoryRegion iomem; + uint32_t regs[CV1800B_CLK_IOSIZE / sizeof(uint32_t)]; +}; + +#endif --=20 2.56.0.rc1.315.gc6ed9934b7-goog From nobody Mon Sep 28 07:26:20 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=1790540082; cv=none; d=zohomail.com; s=zohoarc; b=LF79vsgnvB6g9gKMsw1mgVR4g0DTb+2ZyFeZUerlfR7lpFVsjECFqXJH5BbRfFknwIJJAmBHG5YBVOpUKw85cUbI6ejEDJ5TCNnVoFw2EGNPDxrZejbYcTv31rvrYv5/5EIKH9MR/yANatxTFQ3MINMYerAGvq8wjyJK4Zlhiaw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790540082; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=MDFf3IWahPTWa14J2uR2N8Pogf4wEqs7mJpzR2c7Kpc=; b=EfI+E1mdPmDkB3Tkucq8Xh3GVE6YxLxYWGmnzMIwiDEPJ/FRbhXM5PHDFxo+WHemF17ZY6+y0clVItrKccKQ3wLPRjiO289GF4H7Q8sH7t0L9yOO8MNH2K6V30ldez83H4PgTXUCm7Np08Yj4NHCvEgLar7458ImDcPF5OynlMU= 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 179054008215355.006968844709604; Sun, 27 Sep 2026 13:14:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xAvG8-0008KX-GK; Sun, 27 Sep 2026 16:14: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 1xAvG6-0008KI-Ny for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:03 -0400 Received: from mail-pj2-x0c.google.com ([2607:f8b0:4864:39::c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xAvG4-0003Yc-Mb for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:02 -0400 Received: by mail-pj2-x0c.google.com with SMTP id 98e67ed59e1d1-3a0df0bb2d6so769579a91.3 for ; Sun, 27 Sep 2026 13:14:00 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (33.223.194.35.bc.googleusercontent.com. [35.194.223.33]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a0c719f86fsm13932737a91.7.2026.09.27.13.13.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2026 13:13:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790540039; x=1791144839; 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:content-type; bh=MDFf3IWahPTWa14J2uR2N8Pogf4wEqs7mJpzR2c7Kpc=; b=CPeY6/Jks2BEuHt8SWWxcdr5cZQnlbTxaD9mtUhJLYBNe7bgMJ/v5037YwWPyY8d3M Kfi5SiO1Rgr0ZPmh4QAWovAluU5lf4Tf2ImDl4l+unpcfYI0YfS52u5uqX8XuXsjfRaz pe8hLYelCTRUw1Ed4jFzZVX2VAFp1q+DlESLNRLY/OrX56pajamu57miA7y4JTfgg9gX zEnVIie/TBRaY7FXRD8tFErg9fzJ7YAd/7GhlhvN+OEbboVphlw2zTROKKsuchaMKZk2 2NWc+Y5tWZdR32rFgsokknhocmNiRbU0qr/48yG47m6DBCxsjsIIsh8bG82kM78SjrpF SIag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790540039; x=1791144839; 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:content-type; bh=MDFf3IWahPTWa14J2uR2N8Pogf4wEqs7mJpzR2c7Kpc=; b=l8XN/SdmobYBgM4/RLvPVIvUwGQMz1kAQALtZdVnmZNYRnmeZCD0TsiGnp57JCr+zJ qPsDNwO4/0v21d/3qapgPUG6H0R+OzwhClkLjtS/ZbGGz1BqL9hE1ulT8DVbcGPDpmnQ oaNcKRcNW/Ak6YZ918PwqYB2TcM8/hltqDG6+Um3wY6TkTAoggVa2lsajy8c+4tNv6mn ZP8zS4HHF3SsmT0lE+SJkhs6dO+itb/DtvdTQk48m3VGYcJKAtFWpKbYcWrxKjpGQre+ cTgKdTlCWotaaH8lC2flJbgXGvaykpVGG2OQbaQhiE4VPsD4yDjcD0LK7tt5JrmvkmAZ Q/8Q== X-Forwarded-Encrypted: i=1; AKwUvBzyHS3HOFt8A/eoKDs5u2suTRz77+g/2kC2mXcha0SiyS+TM3jrH/wnu4KOExXGeju+XY9tmbbjcrGY@nongnu.org X-Gm-Message-State: AFq9FYI8/HgH7guDawccUrcqYZ+X6iZvFBBODmWkq75nmYlWTxWWYxLH Pq0SCMmsvMfzMlAwdn5R7LF7nPvJsaesTKHmAwmsd/q93l7hjDYKYD6Q X-Gm-Gg: AYBFou2pmwJeJYSbLHQcXKQbcxRdd9oy76tGzIja5+SFzwlgxbky5AnOKmSpiWBpbma 2opsscGgRKaPL2fT5kz1CGSCWQMijMlYhhbzIhCxmfkGIP2tctndhsT8ih6QgCrWn08YC9vYBAG YAvEknH0HQmp/BHozdekbvh+meJ5z5xrLG69guSFXnjFlks59LeYOCv6mk33api18NckjVE4uEQ hg6C6515cby05fVMpu8t+sIMZ1P5A8hfuy533xaV3UTdCC4othStDQBSQVkJE1uRIyEI+gsCBpc DSmOEKKKYeKOLsfshlDtCNhIKwpKAVCaqWR4XdnUg/aW/bKoJggcayOL1RMqIsknsbABFx/FpvN c8BaVdCp1DpOr81bfE8Sasp/ScvoT5QKuWiFUNWUcFRlQxgwoq55OT0HEWvMnUdXpkT6xG8iVf2 2PH0+xqMrhX8aQ7MqezJEGljN0dSsb+LkCTUysrKKOgoDuOzAXy+h0lE2OtwPdOJOyu2nQy+J9R r8XIDztHz0PVJ2RqW8nfbS1ZkWd8MTcJ1aC1UPRQiw/u6/gAQ+Y3/oKd8akPioCdAWCAHYR1V0B 1ENJEn2RRg== X-Received: by 2002:a17:90a:bc9:b0:3a0:a515:c477 with SMTP id 98e67ed59e1d1-3a0a515c8a1mr5063412a91.16.1790540039193; Sun, 27 Sep 2026 13:13:59 -0700 (PDT) From: Kuan-Wei Chiu To: pierrick.bouvier@oss.qualcomm.com, palmer@dabbelt.com, alistair.francis@wdc.com, pbonzini@redhat.com, marcandre.lureau@redhat.com, farosas@suse.de, lvivier@redhat.com Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu@processmission.com, portias@oss.tenstorrent.com, wxchen0913@gmail.com, jserv@ccns.ncku.edu.tw, marscheng@google.com, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v5 3/7] hw/riscv: Add Sophgo CV1800B SoC support Date: Sun, 27 Sep 2026 20:13:22 +0000 Message-ID: <20260927201326.650943-4-visitorckw@gmail.com> X-Mailer: git-send-email 2.56.0.rc1.315.gc6ed9934b7-goog In-Reply-To: <20260927201326.650943-1-visitorckw@gmail.com> References: <20260927201326.650943-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:39::c; envelope-from=visitorckw@gmail.com; helo=mail-pj2-x0c.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, 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: 1790540084531158500 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 Acked-by: Alistair Francis --- hw/riscv/Kconfig | 8 ++ hw/riscv/cv1800b.c | 177 +++++++++++++++++++++++++++++++++++++ hw/riscv/meson.build | 2 + include/hw/riscv/cv1800b.h | 56 ++++++++++++ 4 files changed, 243 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 d06ac26648..b7c0871c67 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -164,3 +164,11 @@ config K230 select K230_WDT select K230_GSDMA select K230_DECOMP_GZIP + +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..9386c40de8 --- /dev/null +++ b/hw/riscv/cv1800b.c @@ -0,0 +1,177 @@ +/* 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/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); + 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); + + object_initialize_child(obj, "clk", &s->clk, TYPE_CV1800B_CLK); + object_initialize_child(obj, "uart", &s->uart, TYPE_DW8250); + object_initialize_child(obj, "sdhci", &s->sdhci, TYPE_SYSBUS_SDHCI); +} + +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; + + qdev_prop_set_uint32(DEVICE(&s->cpus), "num-harts", num_harts); + + if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpus), errp)) { + return; + } + + 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(system_memory, + cv1800b_memmap[CV1800B_DEV_CLINT].base, + 0, num_harts, false); + riscv_aclint_mtimer_create(system_memory, + 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( + system_memory, + 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); + + qdev_prop_set_uint8(DEVICE(&s->uart), "regshift", 2); + qdev_prop_set_chr(DEVICE(&s->uart), "chardev", serial_hd(0)); + if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) { + return; + } + sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart), 0, cv1800b_memmap[CV1800B_DE= V_UART0].base); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart), 0, + qdev_get_gpio_in(DEVICE(s->plic), CV1800B_UART0_IRQ)); + + qdev_prop_set_uint8(DEVICE(&s->sdhci), "sd-spec-version", 3); + qdev_prop_set_uint64(DEVICE(&s->sdhci), "capareg", 0x056900b9); + if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) { + return; + } + sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0, cv1800b_memmap[CV1800B_D= EV_SD0].base); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0, + qdev_get_gpio_in(DEVICE(s->plic), CV1800B_SD0_IRQ)); + + if (!sysbus_realize(SYS_BUS_DEVICE(&s->clk), errp)) { + return; + } + 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 7aa3c1578d..45895486d4 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -22,4 +22,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'= )) riscv_ss.add(when: 'CONFIG_K230', if_true: files('k230.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..bde5eff96b --- /dev/null +++ b/include/hw/riscv/cv1800b.h @@ -0,0 +1,56 @@ +/* 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" +#include "hw/char/dw8250.h" +#include "hw/sd/sdhci.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; + DW8250State uart; + SDHCIState sdhci; +}; + +#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.56.0.rc1.315.gc6ed9934b7-goog From nobody Mon Sep 28 07:26:20 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=1790540096; cv=none; d=zohomail.com; s=zohoarc; b=JpMv3DzDpPHcwoAqUN9YYNaUucMRdM2vUcgmGqIhqt7mHrTldln0WIsNpUyO9gAVndYc91kxhvKbh0dyh/yO+ibNe+IWKO7CYfipY/clc+N3NjRNliQWRI1vLT//g8b9XqEVEE0JTcCEAyNn80KCLNj07gaSNk4Zq8UPWYxCkS0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790540096; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=tkNWi6bqLSlvCJO/5RICW4jPtEBQA0a/asEIW2oEfZE=; b=lGI4TRtfB415O8v2/ItqCrkFpVrpQeQfgHRwiiH/meTCtNmZ6e3eskZOI+E3mT9WRqVfupTCLsqbzMTsSW33SPyK/fzHG1/e3ZiKNqlIC7II22/mWLgvEEbk84k+yIwfThzRn5LnGbed5Hgips+A2+xWIOvwA/x+13E1xLlaaZ8= 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 179054009654127.26278312400575; Sun, 27 Sep 2026 13:14:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xAvGE-0008Ln-U5; Sun, 27 Sep 2026 16:14:10 -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 1xAvGC-0008LC-OR for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:08 -0400 Received: from mail-pj2-x0f.google.com ([2607:f8b0:4864:39::f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xAvGA-0003Z0-Px for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:08 -0400 Received: by mail-pj2-x0f.google.com with SMTP id 98e67ed59e1d1-396ccb1a98fso1777786a91.1 for ; Sun, 27 Sep 2026 13:14:06 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (33.223.194.35.bc.googleusercontent.com. [35.194.223.33]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a0c719f86fsm13932737a91.7.2026.09.27.13.13.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2026 13:14:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790540045; x=1791144845; 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:content-type; bh=tkNWi6bqLSlvCJO/5RICW4jPtEBQA0a/asEIW2oEfZE=; b=FuT8pnt4EQWqwrLdxtYvlzDe5pdVuV/n51TpXpk/0dnc9W4S0uvkfyF1BnY//a/v0R B6vRuPP4G4Yq5ppeHDO8IRGkNe5JsheqZToxMsCtNKMNwe+XN1Di7ld5GiQjBbbeGHjO LHFHZ40kDPdpNQ8rvNK5B+m4VNvz17wO2hRlTlCRXYkFvHR9w3AH1been3jGVlKGZ9cT JmeKXXBQ8+mmyBB7QVxdYQt6Do3I7GE+oSPuHuByBgWZRE3IzobUor0YhEjyAT+uliXw wMr80n/Q2YbCbxZ+Izgb/sKX0iysB0xwyKELFME0aFT14GvkMii+HjFXqR9JLX16ZqB9 tXLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790540045; x=1791144845; 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:content-type; bh=tkNWi6bqLSlvCJO/5RICW4jPtEBQA0a/asEIW2oEfZE=; b=1fD5gV3OF453dQrS9ROGqh6Ov31reLdV4g+CRPajlQeqEGVMRJKLFg9qGO3lwBB+AI M0cjexp5q3N32IthlV8Ojl3/SePG3s1FsjziBapD9V5621T9MTjQtO2kYvGSidz+L13S CWOFb6er3d1dFO/qbXQZv8gPKQPyddxGDOZYqeXHXg5VB9SmVXT9AkFL8fOFGyz3AmWH nHSHbOCZ9bLV5sw/S+DBRtMAZkZmVs/6IsGP9fwaxs2eU9ccMTwAwlXxWg9N5MN53/Nc 0qxWzTWR4B5yDVXHLcque9uVd1rOmZRNHeV9tlJHYFuwzRilBSFBig3cN1UPlZPHPrNm ZqcA== X-Forwarded-Encrypted: i=1; AKwUvBypO9cCfhHtFD9seCbo1chMgn8qW8elkH7JWB8EC+4o+WP673QFdl7a0f1TUXpgTiDBKA0EI6h3gE8B@nongnu.org X-Gm-Message-State: AFq9FYJny+W+7qFMGY0S45zMG8cPqc51LMymTp3/6JsJnzI7Pvedjchk yYd9GI/ITyO5TpBtzOTCtvZhaI7v+51ivciEdjx2ihNYTZnm5qKZjdle X-Gm-Gg: AYBFou2HfMY23ETgmMjNbq9m2wuYS9AQVSlZ6fdqcKad0EHlWVGo68u9ZmcVazTZkO0 e+qOOLUiZQXxkmr6i1iXXCh19w9BK1p5sPO9adtmP/+MxNXvUADF+KNvc9A4orC2zDk8deCmEA3 AylJLqirBR4eiJ3wWW1lqTcuwvcOOVB8gpuI6Pn7CaPjJFwL980zEfUS2FFvuHtOfQU1HQB7ebb +5nVI1f4AxbUewkKLxwWjospoRhHcoxiXTw1IvWKvk+DvScwErFAFkCsxXs1JLetPYt9ThqZHzQ Xi9cnNliNRXuQ2Z4XidVjeZ8PanAdp3Sex59qY8cmLfwTyT9AH/60WHmcU4/P0xT6uDiEKgcDWV GziZqMZjzBbe4/g01JJ4gLh1Qnf4Ls28iSdU6b7QgH4hcGrt9P8kHrMhL5Ha9nzvpgmzL9U+/Y3 fxjN6759WsIMA3l2F57v0XvVCBTKs3Nn51CQ6oJrJ9CwnKXsN3O4v/aG7h7Cp55xH6DQ8eEMiy2 kSV2avUjlD5RarlN1zr/zMioAA4zUMV1s6lc8qALtMcVP4G/lh/jkO3rbXR7ZCBUccdvbgyYg== X-Received: by 2002:a17:90b:3a08:b0:3a0:7d5b:8d56 with SMTP id 98e67ed59e1d1-3a0bb599f07mr6087169a91.28.1790540045445; Sun, 27 Sep 2026 13:14:05 -0700 (PDT) From: Kuan-Wei Chiu To: pierrick.bouvier@oss.qualcomm.com, palmer@dabbelt.com, alistair.francis@wdc.com, pbonzini@redhat.com, marcandre.lureau@redhat.com, farosas@suse.de, lvivier@redhat.com Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu@processmission.com, portias@oss.tenstorrent.com, wxchen0913@gmail.com, jserv@ccns.ncku.edu.tw, marscheng@google.com, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu , Chao Liu Subject: [PATCH v5 4/7] hw/riscv: Add Milk-V Duo board support Date: Sun, 27 Sep 2026 20:13:23 +0000 Message-ID: <20260927201326.650943-5-visitorckw@gmail.com> X-Mailer: git-send-email 2.56.0.rc1.315.gc6ed9934b7-goog In-Reply-To: <20260927201326.650943-1-visitorckw@gmail.com> References: <20260927201326.650943-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:39::f; envelope-from=visitorckw@gmail.com; helo=mail-pj2-x0f.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, 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: 1790540098421158500 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 Acked-by: Alistair Francis Reviewed-by: Chao Liu --- MAINTAINERS | 9 ++ configs/devices/riscv64-softmmu/default.mak | 1 + hw/riscv/Kconfig | 6 + hw/riscv/meson.build | 1 + hw/riscv/milkv_duo.c | 118 ++++++++++++++++++++ 5 files changed, 135 insertions(+) create mode 100644 hw/riscv/milkv_duo.c diff --git a/MAINTAINERS b/MAINTAINERS index d4e9cf61ea..bef8c2f3b0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1872,6 +1872,15 @@ F: tests/qtest/k230-wdt-test.c F: tests/qtest/k230-gsdma-test.c F: tests/qtest/k230-decomp-gzip-test.c =20 +Milk-V Duo +M: Kuan-Wei Chiu +S: Maintained +F: hw/misc/cv1800b_clk.c +F: hw/riscv/cv1800b.c +F: hw/riscv/milkv_duo.c +F: include/hw/misc/cv1800b_clk.h +F: include/hw/riscv/cv1800b.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 b7c0871c67..70a331f7ae 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -172,3 +172,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 45895486d4..a40e80645b 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -23,5 +23,6 @@ riscv_ss.add(when: 'CONFIG_MIPS_BOSTON_AIA', if_true: fil= es('boston-aia.c')) riscv_ss.add(when: 'CONFIG_K230', if_true: files('k230.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..1285c8d34f --- /dev/null +++ b/hw/riscv/milkv_duo.c @@ -0,0 +1,118 @@ +/* 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; + const char *firmware_name; + 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_name =3D riscv_default_firmware_name(&s->soc.cpus); + firmware_load_addr =3D cv1800b_memmap[CV1800B_DEV_DRAM].base; + firmware_end_addr =3D riscv_find_and_load_firmware(machine, &boot_info, + firmware_name, + &firmware_load_addr, = 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); + riscv_load_fdt(fdt_load_addr, machine->fdt); + } + + 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_infos[] =3D { + { + .name =3D TYPE_MILK_V_DUO, + .parent =3D TYPE_MACHINE, + .instance_size =3D sizeof(MilkVDuoState), + .class_init =3D milkv_duo_machine_class_init, + }, +}; + +DEFINE_TYPES(milkv_duo_machine_type_infos) --=20 2.56.0.rc1.315.gc6ed9934b7-goog From nobody Mon Sep 28 07:26:20 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=1790540095; cv=none; d=zohomail.com; s=zohoarc; b=PtZPa/IEq8xxfxSl0tTE/3C2DZCNPltOTA/yor5M3MpLCLnD5wcyCf6uzTinzob/zRIDtd3g6GTOZ9aIM83aLo9cxFcCBF4e07j2+QMAhDF/Av6TlLF3IAznsM+3HINSxnmp6gGs+0QJ/O4pXstwwEXSkPTrkkGnt9bl8SbkBmQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790540095; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Hi9URHHfgyd+sJWR4czUDLlcUHgZe4owe8AVysAk9CA=; b=SulXna59VA5HszVWaQuI92RLUZ4zqNgPigJppyi2MkthklyImuUHwcXB2IJcR3OYQnFsXh3OD3Zt5+a/3WS0nnq76/49qJZ5wgihXH07SlTCsDZixK4dd0YHzILbxuyB0bh28oGYyvJa9xHHWjuMUWM8B2yWLntdBRbUbXbFS1E= 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 1790540095085737.7012378242624; Sun, 27 Sep 2026 13:14:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xAvGK-0008Nb-HR; Sun, 27 Sep 2026 16:14:16 -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 1xAvGI-0008Mi-B4 for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:14 -0400 Received: from mail-pj2-x0c.google.com ([2607:f8b0:4864:39::c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xAvGG-0003ZV-Dj for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:13 -0400 Received: by mail-pj2-x0c.google.com with SMTP id 98e67ed59e1d1-3a0d31bda43so1054363a91.1 for ; Sun, 27 Sep 2026 13:14:12 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (33.223.194.35.bc.googleusercontent.com. [35.194.223.33]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a0c719f86fsm13932737a91.7.2026.09.27.13.14.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2026 13:14:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790540051; x=1791144851; 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:content-type; bh=Hi9URHHfgyd+sJWR4czUDLlcUHgZe4owe8AVysAk9CA=; b=GSlBdGfpB68JPFLdPNPsP/RfvzHCcFd17IvCi9i9N7RJFmLDE2Er1XW78e2A5GveyO skju3fxuZOR/pNWgxi/EFFq7zHbL6r8OM9F8Ypu4Ml2hQVqj7KLQzWMQE/HdZgE1fZFp UX4qA6lPdj9//A7C+eHv3NUI/kqPVDvE+CPHe+UOkXHquVy8yR5R8pkH7bCd5yPvcfKa OhODhg/V2akna9RbcsNegp0fJp8zmYntO9IPAKOXfuF/BEGuRbzlFjKZjNY18JlJciUW mbUCmRTo1ki7WIHpyxg8D6sg2RXiBQV68F52U8ona/3UQpbj6A3T3QQW9COzJkzmalpe ipBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790540051; x=1791144851; 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:content-type; bh=Hi9URHHfgyd+sJWR4czUDLlcUHgZe4owe8AVysAk9CA=; b=antq1iophrV+mzXD5DvzWzbwXK2wZ8KUFfJe3AAtUu29Z8LffOlSKN00En2ik+xgbV IWK4oZMtM386r5i1dJfc/+RYUB7fzzIUsnpQKizx0BHMm/UA8DRpq5GYz/vmvYNmTSUX vK9ZUGLdpQXHQh7LEnt8y/i/rGcrx/RWge5m82iXCgSHbc+nIUStjNKNSjcW8thgMlIh JKSL+c2pt4j1o6DnSZcwJ8WbJIu51jRRMof1quzT9cYi034qLV/ThWhStpiG7HrKLsV3 Z3lhK4UZGfvH/ccoNNXJG5PVNOKlbI0wuHFf72ZDBIszcnm81En53DyrHLv1e/A9gLM/ /k/Q== X-Forwarded-Encrypted: i=1; AKwUvBwg+KXM24sX+Ccd4+rPsgl9gd2fMgpo4ybQFvRq+YzvGWICk9Gk1bHy9i/hD8jn6RvMqhpZXtFgKkjT@nongnu.org X-Gm-Message-State: AFq9FYLiUf/kjgkJxPPFalQXrr95r9S+DtlXqEXKD7Usr2i80h1DtGh/ RRfgbWaA5g7VwyTePWuTUzSnXOiMavOSYYKbnDQ/J3XMSMGhbfGal8JQ X-Gm-Gg: AYBFou1w/0FRnXPK+3ugUgfIiH4JUIl9dQSEIiN6LNB9jXgJnHnKRv8p5lLYYxNE+0I RZ8nQP5Lfz/cc0xOgGPyePteOZa/dACujfpR5RCAUhwaZvZ0/rex3e04WjnkjEsB9c47HyEBgJM Jup+L8fsgQR7+Cu5QHi7JOxkzzpoActfPDPj/3J5AHRmAnYDE8NJAkxwKf3wapgDf/PZis5o2N8 noVCvHc2YAPWXzfh9AbvM+ynfrks4AxqPUhxsRNaH2aKF7B+oTBjxx6rWVKKGjxn3vvvyK5v7aA H35zIVRrKUDG3OOzXHwFpFSE7wi83yRaVGr87SP81dmer/BV332r265jlVnJOl97lsqaJb+STJB i9JQ7nqGvUGi5F1rSozJREP3dzARzNOtuzfu0za9kY3rmFRtDiXYF90FqAOqbO+gqBKoQkoJo3P VIaXLTymT1QywY0IH/WnyaBHxkAjrPLmkuFDAUncp3/rhm/yYzWNw59uMlSbsIAsbFS+7IwY1RC cp8mBlnLnKW+1KlSRlsULQzzZBTpHyaOliUEEGj1y/QtOmbEOoojXOPypa0z9rdTyQvhr72qw== X-Received: by 2002:a17:90b:2d8a:b0:3a0:b959:4472 with SMTP id 98e67ed59e1d1-3a0b95947cdmr6881537a91.41.1790540051145; Sun, 27 Sep 2026 13:14:11 -0700 (PDT) From: Kuan-Wei Chiu To: pierrick.bouvier@oss.qualcomm.com, palmer@dabbelt.com, alistair.francis@wdc.com, pbonzini@redhat.com, marcandre.lureau@redhat.com, farosas@suse.de, lvivier@redhat.com Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu@processmission.com, portias@oss.tenstorrent.com, wxchen0913@gmail.com, jserv@ccns.ncku.edu.tw, marscheng@google.com, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v5 5/7] tests/qtest: Add qtest for Milk-V Duo board Date: Sun, 27 Sep 2026 20:13:24 +0000 Message-ID: <20260927201326.650943-6-visitorckw@gmail.com> X-Mailer: git-send-email 2.56.0.rc1.315.gc6ed9934b7-goog In-Reply-To: <20260927201326.650943-1-visitorckw@gmail.com> References: <20260927201326.650943-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:39::c; envelope-from=visitorckw@gmail.com; helo=mail-pj2-x0c.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, 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: 1790540096626158500 Content-Type: text/plain; charset="utf-8" Add minimal qtest coverage for the Milk-V Duo machine to validate basic MMIO mapping and register access. Currently tested: - Verify DW8250 UART component version and type signatures. - Test read/write access to CV1800B clock bypass register. Tested with: $ meson test -C build -v qemu:qtest-riscv64/milkv-duo-test [...] Ok: 1 Fail: 0 Signed-off-by: Kuan-Wei Chiu Acked-by: Alistair Francis --- MAINTAINERS | 1 + tests/qtest/meson.build | 3 +- tests/qtest/milkv-duo-test.c | 70 ++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 tests/qtest/milkv-duo-test.c diff --git a/MAINTAINERS b/MAINTAINERS index bef8c2f3b0..f7e4159679 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1880,6 +1880,7 @@ F: hw/riscv/cv1800b.c F: hw/riscv/milkv_duo.c F: include/hw/misc/cv1800b_clk.h F: include/hw/riscv/cv1800b.h +F: tests/qtest/milkv-duo-test.c =20 RX Machines ----------- diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index 33f58b0e95..dc76093e24 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -309,7 +309,8 @@ qtests_riscv64 =3D ['riscv-csr-test'] + \ config_all_devices.has_key('CONFIG_RISCV_IOMMU') ? ['iommu-riscv-test'] : []) + \ (config_all_devices.has_key('CONFIG_K230') ? - ['k230-ddr-test', 'k230-wdt-test', 'k230-gsdma-test', 'k230-decomp-gzip= -test'] : []) + ['k230-ddr-test', 'k230-wdt-test', 'k230-gsdma-test', 'k230-decomp-gzip= -test'] : []) + \ + ['milkv-duo-test'] =20 qtests_hexagon =3D ['boot-serial-test', 'l2vic-test', 'qct-qtimer-test'] =20 diff --git a/tests/qtest/milkv-duo-test.c b/tests/qtest/milkv-duo-test.c new file mode 100644 index 0000000000..06064b8733 --- /dev/null +++ b/tests/qtest/milkv-duo-test.c @@ -0,0 +1,70 @@ +/* + * QTest for Milk-V Duo Board + * + * Copyright (c) 2026 Kuan-Wei Chiu + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "libqtest.h" + +#define CV1800B_CLK_BASE 0x03002000 +#define CV1800B_CLK_BYPASS 0x030 +#define CV1800B_CLK_BYPASS_RESET 0xFFFFFFFF +#define TEST_PATTERN_5A 0x5A5A5A5A +#define TEST_PATTERN_A5 0xA5A5A5A5 + +#define CV1800B_UART0_BASE 0x04140000 +#define DW_UART_UCV 0xF8 +#define DW_UART_CTR 0xFC +#define DW_UART_VERSION_3_23A 0x3332332A +#define DW_UART_TYPE_SIGNATURE 0x44570110 + +static void test_milkv_duo_uart(void) +{ + QTestState *qts; + uint32_t component_version; + uint32_t component_type; + + qts =3D qtest_init("-M milkv-duo"); + + component_version =3D qtest_readl(qts, CV1800B_UART0_BASE + DW_UART_UC= V); + g_assert_cmphex(component_version, =3D=3D, DW_UART_VERSION_3_23A); + + component_type =3D qtest_readl(qts, CV1800B_UART0_BASE + DW_UART_CTR); + g_assert_cmphex(component_type, =3D=3D, DW_UART_TYPE_SIGNATURE); + + qtest_quit(qts); +} + +static void test_milkv_duo_clk(void) +{ + QTestState *qts; + uint32_t clk_bypass_val; + + qts =3D qtest_init("-M milkv-duo"); + + clk_bypass_val =3D qtest_readl(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYP= ASS); + g_assert_cmphex(clk_bypass_val, =3D=3D, CV1800B_CLK_BYPASS_RESET); + + qtest_writel(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYPASS, TEST_PATTERN_= 5A); + clk_bypass_val =3D qtest_readl(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYP= ASS); + g_assert_cmphex(clk_bypass_val, =3D=3D, TEST_PATTERN_5A); + + qtest_writel(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYPASS, TEST_PATTERN_= A5); + clk_bypass_val =3D qtest_readl(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYP= ASS); + g_assert_cmphex(clk_bypass_val, =3D=3D, TEST_PATTERN_A5); + + qtest_quit(qts); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + + qtest_add_func("/riscv/milkv-duo/uart", test_milkv_duo_uart); + qtest_add_func("/riscv/milkv-duo/clk", test_milkv_duo_clk); + + return g_test_run(); +} --=20 2.56.0.rc1.315.gc6ed9934b7-goog From nobody Mon Sep 28 07:26:20 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=1790540110; cv=none; d=zohomail.com; s=zohoarc; b=A2xwlHbdHVz/BWOSHdIIrNBCVTUKor96uuiA76PdKA6n/J/Igh4VOAM2tEf69oklcfj0JLS140+kumGGt944i0V2mlw9ZThAQMxEyL53ZP/MkRQwz5ZTpY7X/mcOvMMmlslDC3GkUNTIFChT/62mtY6PHHQ3UTMyPojkQPw9p3U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790540110; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=YE9SXqkXYYCp6VqxqB8fdiOqNVXMFbewvhAgf9jvcl0=; b=bjAMrlO718XfV6EVfSYo4u+/jaEGQVpn+xJeAL18A7WwSDnPKVbfrbM8wbT2V6sBF93ej/n48Q+GM04tVA6SAzUjuiB/XeOfS7v+WUaziRRWBUfFptDeEJbKNJUZVBJcvpEZ5sjo3neF9Y/z90T2YP2uS5L0m7NE66A77Hpi7z0= 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 1790540110773351.02139455042857; Sun, 27 Sep 2026 13:15:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xAvGP-0008SL-65; Sun, 27 Sep 2026 16:14:21 -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 1xAvGN-0008QE-SM for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:19 -0400 Received: from mail-pj2-x10.google.com ([2607:f8b0:4864:39::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xAvGM-0003Zq-2j for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:19 -0400 Received: by mail-pj2-x10.google.com with SMTP id 98e67ed59e1d1-39b5b07ec78so1252483a91.3 for ; Sun, 27 Sep 2026 13:14:17 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (33.223.194.35.bc.googleusercontent.com. [35.194.223.33]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a0c719f86fsm13932737a91.7.2026.09.27.13.14.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2026 13:14:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790540057; x=1791144857; 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:content-type; bh=YE9SXqkXYYCp6VqxqB8fdiOqNVXMFbewvhAgf9jvcl0=; b=n+kHiRqn4yn/YKk9m44c47+IxBjCb0NdS6j15OutBKGXcZjn1VTNVzIn1Lt/otoFLE XWvt2Effxuxje9r4lShngQyuw5T/REl59fXldn9UMALMD9ayNFV4gjndnZGx31BbCDCo 7iwrEZ6yE43i0NA2dsWtTHpiPYJblu0/Y4NupaxwSB8utN16/ZpK9SDXHkLhU5jKLvZk JJbIc+vGdSrHUhBqjqunqK1CMJuiyGbdu6GJi7mDbEsxUcEMdrt4EKLb2cd9puvGeJXz pVPAtwacAJP5/jn9mAoN7STyJfyJDlheS8GfOlZC/0S7s5XnRP9GaJ/hTUG9QKCfPxyR EScQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790540057; x=1791144857; 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:content-type; bh=YE9SXqkXYYCp6VqxqB8fdiOqNVXMFbewvhAgf9jvcl0=; b=kb9FbLw0HL8KPykcwRJMwRTqofzCz6zZda2cj1XkJahq3KmxhNJHo4kLBAe2XLRWY4 WCc61fFMM396XlkrDnU3QekkWZ6sI+ErFiap/aGuGtw6WvLcxVTir+ern698JdeNQUNt DOrlEOJqMQY33Ch5DB4eLln79czwLSex1xNpGdki0YHWr04/NcNm29M4U9XbBM03o0uj v+Fy0ijlXJ76eTMiao0LlNiP0RX2DUpDX7LoPNNCDG2hIN93chksNfOkrpkOyKY7OI/o 7rwWlFmSzVyxgdC6z0+kIkr6MAkRCSxq5kGJJwJKwuJQOP2EQ/ijRvR9fCoze8XYB2RR Zx3w== X-Forwarded-Encrypted: i=1; AKwUvBxzeGQng+yVj+hYfH38j8+ck6N/VWrY9G3MvF0zCOkmLrHktDCRm0P9l11m6VQoosxCLn4/DA0KlwZc@nongnu.org X-Gm-Message-State: AFq9FYJErxMQNRLWugvtzWJCa5jauyNt6c+Io5n5TpqA7YEddSFXHA6m bgbxkmxZlRL23mfX2FZPkcGfbXnMmqBcKiUkRsPDpF5tPmcAeoUqv9J51DRDndMD X-Gm-Gg: AYBFou3s0fA1BZYtfGpnKiY7/DrXFHjzP7tXcaolBZ8UOPK7OHZ3u15N8sBef2XtQxQ KzUEn8HPW5X0dkLaF1Smx9khKwB0wWBe+OkcBkz96APNkmAgt5x0t2jxLAe/dXJmK1Cyc+tON35 HzOtO+i4x7gd2dt5Xov22rJcOqrPhTA+ZyZGl5Xlcu4rBK/Wha7YVvHTMD+aOKkPCC9hBJBggDR bC1uUtxi3RZV4+rkrmetPWFrwAhaGydaENpnjVJIHnFnyFKqfvd3fKGDW7VgTwSF+ncm54BWkUI 1oZ278bnIQXLS4ZbtFG0SacsTlBMiCGHT3rPPOllzePR6twSuKqGVC9f5AiWqhoQVNs+FQ7LyLm SaoS9oqujaQctoZaMeeiiD7pULiyJ3nn4WJi6wFlruOQA0zwtxM/LocsN9HrrZ/M3N62eW/1pmS qHzhHXsIV6D11FNYIcQIJOtUkdCc2Mj9Erj8q7gdrtblbZGRjmJf8FH1r2uvmgFFmyT2O7wbP7H gF3AO8WdzfI51fWk51rSqzxhZAiYi7hLYTHJUvnpyfRltNNly9enpLyW5s8ZGtAMz7AVkO/xSuj zDP4kgLj X-Received: by 2002:a17:90b:3b4b:b0:3a0:e320:d1d4 with SMTP id 98e67ed59e1d1-3a0e320d3b5mr3758332a91.16.1790540056791; Sun, 27 Sep 2026 13:14:16 -0700 (PDT) From: Kuan-Wei Chiu To: pierrick.bouvier@oss.qualcomm.com, palmer@dabbelt.com, alistair.francis@wdc.com, pbonzini@redhat.com, marcandre.lureau@redhat.com, farosas@suse.de, lvivier@redhat.com Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu@processmission.com, portias@oss.tenstorrent.com, wxchen0913@gmail.com, jserv@ccns.ncku.edu.tw, marscheng@google.com, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v5 6/7] tests/functional/riscv64: Add boot test for Milk-V Duo board Date: Sun, 27 Sep 2026 20:13:25 +0000 Message-ID: <20260927201326.650943-7-visitorckw@gmail.com> X-Mailer: git-send-email 2.56.0.rc1.315.gc6ed9934b7-goog In-Reply-To: <20260927201326.650943-1-visitorckw@gmail.com> References: <20260927201326.650943-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:39::10; envelope-from=visitorckw@gmail.com; helo=mail-pj2-x10.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: 1790540112460158500 Content-Type: text/plain; charset="utf-8" Add a functional boot test for the Milk-V Duo board to validate the end-to-end boot flow. $ ./build/run ./tests/functional/riscv64/test_milkv_duo.py TAP version 13 ok 1 test_milkv_duo.MilkvDuoMachine.test_riscv64_milkv_duo 1..1 Signed-off-by: Kuan-Wei Chiu --- MAINTAINERS | 1 + tests/functional/riscv64/meson.build | 1 + tests/functional/riscv64/test_milkv_duo.py | 53 ++++++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100755 tests/functional/riscv64/test_milkv_duo.py diff --git a/MAINTAINERS b/MAINTAINERS index f7e4159679..689424fd1c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1880,6 +1880,7 @@ F: hw/riscv/cv1800b.c F: hw/riscv/milkv_duo.c F: include/hw/misc/cv1800b_clk.h F: include/hw/riscv/cv1800b.h +F: tests/functional/riscv64/test_milkv_duo.py F: tests/qtest/milkv-duo-test.c =20 RX Machines diff --git a/tests/functional/riscv64/meson.build b/tests/functional/riscv6= 4/meson.build index d1a3e6c2bf..8a4f1d00f9 100644 --- a/tests/functional/riscv64/meson.build +++ b/tests/functional/riscv64/meson.build @@ -18,4 +18,5 @@ tests_riscv64_system_thorough =3D [ 'sifive_u', 'tt_atlantis', 'tuxrun', + 'milkv_duo', ] diff --git a/tests/functional/riscv64/test_milkv_duo.py b/tests/functional/= riscv64/test_milkv_duo.py new file mode 100755 index 0000000000..6a7e2a5d19 --- /dev/null +++ b/tests/functional/riscv64/test_milkv_duo.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# +# Functional test that boots a Linux kernel on a Milk-V Duo machine +# +# Copyright (c) 2026 Kuan-Wei Chiu +# +# SPDX-License-Identifier: GPL-2.0-or-later + +from qemu_test import LinuxKernelTest, Asset +from qemu_test import skipIfMissingCommands, wait_for_console_pattern + +class MilkvDuoMachine(LinuxKernelTest): + + timeout =3D 120 + + ASSET_KERNEL =3D Asset( + 'https://storage.tuxboot.com/kernels/6.11.9/riscv64/Image', + '174f8bb87f08961e54fa3fcd954a8e31f4645f6d6af4dd43983d5e9841490fb0' + ) + ASSET_DTBS =3D Asset( + 'https://storage.tuxboot.com/kernels/6.11.9/riscv64/dtbs.tar.xz', + '97e5e65a7e6c68303e53486af120c0846ee8df572e9c15f0c4dccb831d0cef4b' + ) + ASSET_ROOTFS =3D Asset( + 'https://storage.tuxboot.com/buildroot/20241119/riscv64/rootfs.ext= 4.zst', + 'aa4736a9872651dfc0d95e709465eedf1134fd19d42b8cb305bfd776f9801004' + ) + + @skipIfMissingCommands('zstd') + def test_riscv64_milkv_duo(self): + self.set_machine('milkv-duo') + + kernel_path =3D self.ASSET_KERNEL.fetch() + dtb_path =3D self.archive_extract( + self.ASSET_DTBS, member=3D'dtbs/sophgo/cv1800b-milkv-duo.dtb') + rootfs_path =3D self.uncompress(self.ASSET_ROOTFS) + + self.vm.set_console() + self.vm.add_args('-bios', 'default', + '-kernel', kernel_path, + '-dtb', dtb_path, + '-drive', f'file=3D{rootfs_path},format=3Draw,id= =3Dsd-card,snapshot=3Don', + '-device', 'sd-card,drive=3Dsd-card', + '-append', 'console=3DttyS0,115200 root=3D/dev/mm= cblk0 rootwait earlycon') + + self.vm.launch() + + wait_for_console_pattern(self, 'Machine model: Milk-V Duo') + wait_for_console_pattern(self, 'Welcome to TuxTest') + wait_for_console_pattern(self, 'tuxtest login:') + +if __name__ =3D=3D '__main__': + LinuxKernelTest.main() --=20 2.56.0.rc1.315.gc6ed9934b7-goog From nobody Mon Sep 28 07:26:20 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=1790540095; cv=none; d=zohomail.com; s=zohoarc; b=LEcNqc7g4onG8aJuVOojK7CP6BldDg1NNqzNBwGg15WSHPggVtfo+M0gZDyEkHVPug2R+6FLHC6bxuXkRMzlTsBGxvsQgEOTiTWT31F6ctRwNTpxalntC38/RbaDXeiMmUfxLQ1kIUePoci8yz2Hlsurhl2GCgDVxKGNIKcnoBU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790540095; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=96SiFbVYD8apnRQj28w96i7aN7o9LA5MwEa3NqgqTVA=; b=mUjZcxqDe4SRQYDm9ZinyJ/l97Ogf/iL25oc7xA7lox73fi2pqAjqw3xrvZQN9YY3iVIbBOaNCiKGWhpkyHU5dnZsYNEO05jijbjbvDmREDHmqg/v/itVQIamUA9vnJTjUUyzj4N8cCpOuTCWF0ESQlMHTDd3IWdMR450KwoU+I= 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 1790540095435290.14426583082707; Sun, 27 Sep 2026 13:14:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xAvGW-0000JM-Fs; Sun, 27 Sep 2026 16:14:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xAvGT-0000I0-Qg for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:25 -0400 Received: from mail-pz2-x10.google.com ([2607:f8b0:4864:3b::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xAvGR-0003aF-Qg for qemu-devel@nongnu.org; Sun, 27 Sep 2026 16:14:25 -0400 Received: by mail-pz2-x10.google.com with SMTP id 41be03b00d2f7-cc4c08393b0so933821a12.0 for ; Sun, 27 Sep 2026 13:14:23 -0700 (PDT) Received: from visitorckw-work01.c.googlers.com.com (33.223.194.35.bc.googleusercontent.com. [35.194.223.33]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a0c719f86fsm13932737a91.7.2026.09.27.13.14.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2026 13:14:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790540062; x=1791144862; 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:content-type; bh=96SiFbVYD8apnRQj28w96i7aN7o9LA5MwEa3NqgqTVA=; b=kevtGqM10yk2zu2pFBDS88B/d11d0Mg6lRDc74SP4RRB5WXFk0sZof85PmgkDLdrsv FZ44+UiLfCgvT+ywcqskZ4eUO/UlTz7EobP7NZpgJd37QoH5mjFC0EFl+KHExCI6mO5S nUCoe9TFDTmL7Fxn/x45kcjzY0AJpUzGFnZdnBkf+oeMrnJ2RToQgSRPrY5ijN0yPeJ0 A5B04cy9artN7j5HHZAXXiS/04JTC1JPGphNDzrhRLyXP+1VLSYT0KvtjQ8ZoY8ylx/x niAUSM29Hvvx6HZThnzL/vpNzBrJGgTs9tpDsnFFgDQTVcG8FCpWN7zZa1Nl4pDmePnk nEtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790540062; x=1791144862; 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:content-type; bh=96SiFbVYD8apnRQj28w96i7aN7o9LA5MwEa3NqgqTVA=; b=Kfjs+x+JWLThlAhYNEeBSxLtSa99Bi/tbYxiSnS3K6p7+ai4ULTzTlflqaGVBzuTLK 9bgzI1azLZMznk2Vsf3h1yDFfbenk/lpjIg488EJV/LAXjpLF3HpC3jRqmLaNROJ6ToT vPWlhMJ3oEX5bkcSR0DAGh3iLq6ZQw+qLC4/E5Twi0DyddKQyyTh4fXtQWPJga9HnV/3 Iyfxz4AAVg8eHTYdHboVge+VIogQtGc0abF8CtP8/Ools5GvsNQtGrDk/rhkHZ7WtSKx dZgd/dUFvANeb9JODUDRDZ1/Vx2YMcet6NM4wn0U/ZTRg5VaN3zIZgfgPL6lTkgl7QLS evuQ== X-Forwarded-Encrypted: i=1; AKwUvByjtLdyh7HTL32B1z1f+/G7PrR2yg6a+5D6m5qt7AdzoqAoopA++KvtkYlYWo9xWXot0uU1lUI0SWR8@nongnu.org X-Gm-Message-State: AFq9FYJ7pzCndCbduThvsdoN0sn1JqtT3y0zQPn2G/y+0LE5lKOFjStO g68YltOEORhpPCiatc+c6hlPlzp8SamOCs5gifRmOH0+AN5IgOxaB6Hg X-Gm-Gg: AYBFou2Xif/V7T6FKu8NPkY7BH9UQ+T5g82D4Lz7q05GmyIGarc4ka400NbC3rptT6j nBbq2ByloKdx4z17akzLnOWNLCZrj180pKzsvTOS/VQhIBPvElBodyv2XbfWZMAmQvPNliOrXB5 Cc66S+LfQ+S34DDRAgd4dOteaT7GyeHvTng/5pu1rxqerLSKqtbVWi2tE1jaog339mO8OCCOQqR eQEU/U+bZrABAsDUDlCbaECyLfNviAFA25+jYsOczCUAh0K9/tRA/0SK5awWaqGHoU4C7HANz32 Rirp+krARncfHqoxD/76rFpWQ+Zgy/z4UPZF7L1l47Pa+yoWJKVdtzXfh6POu/WpIvcIpaWo+9d ACirfXhUfmbJePDDVierSvQ4lrBbgHCy/6ZI4qkfattEXVtYX7Q6L0iHiQS0ZcB4/+g97Vk21y0 AH66IuSGRZOabZTIvWpK1qWBm+L8RuCaQyoRq65jJL3esmNzrfh+jcb1IrK2s/dPBAepSVXE05N VQwechdzHq49EqKLyaQy41qEjlWXgSR56X4T9eN7U5CGBr3yFn0HjLwMO4+FYVUkfSkj+HS0dVP t63J5U03 X-Received: by 2002:a17:90a:e7cf:b0:3a4:6e84:e7ee with SMTP id 98e67ed59e1d1-3a46e84e9f0mr404430a91.16.1790540062457; Sun, 27 Sep 2026 13:14:22 -0700 (PDT) From: Kuan-Wei Chiu To: pierrick.bouvier@oss.qualcomm.com, palmer@dabbelt.com, alistair.francis@wdc.com, pbonzini@redhat.com, marcandre.lureau@redhat.com, farosas@suse.de, lvivier@redhat.com Cc: liwei1518@gmail.com, daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com, chao.liu@processmission.com, portias@oss.tenstorrent.com, wxchen0913@gmail.com, jserv@ccns.ncku.edu.tw, marscheng@google.com, eleanor15x@gmail.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v5 7/7] docs/system/riscv: Add Milk-V Duo board documentation Date: Sun, 27 Sep 2026 20:13:26 +0000 Message-ID: <20260927201326.650943-8-visitorckw@gmail.com> X-Mailer: git-send-email 2.56.0.rc1.315.gc6ed9934b7-goog In-Reply-To: <20260927201326.650943-1-visitorckw@gmail.com> References: <20260927201326.650943-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:3b::10; envelope-from=visitorckw@gmail.com; helo=mail-pz2-x10.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: 1790540096662158500 Content-Type: text/plain; charset="utf-8" Add documentation for the Milk-V Duo board. This includes a brief overview of the hardware, a list of supported devices, and practical instructions on how to boot the machine using OpenSBI and a Linux kernel with an emulated SD card. Signed-off-by: Kuan-Wei Chiu Acked-by: Alistair Francis --- MAINTAINERS | 1 + docs/system/riscv/milkv-duo.rst | 49 +++++++++++++++++++++++++++++++++ docs/system/target-riscv.rst | 1 + 3 files changed, 51 insertions(+) create mode 100644 docs/system/riscv/milkv-duo.rst diff --git a/MAINTAINERS b/MAINTAINERS index 689424fd1c..027139bde2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1875,6 +1875,7 @@ F: tests/qtest/k230-decomp-gzip-test.c Milk-V Duo M: Kuan-Wei Chiu S: Maintained +F: docs/system/riscv/milkv-duo.rst F: hw/misc/cv1800b_clk.c F: hw/riscv/cv1800b.c F: hw/riscv/milkv_duo.c diff --git a/docs/system/riscv/milkv-duo.rst b/docs/system/riscv/milkv-duo.= rst new file mode 100644 index 0000000000..1758db2c1e --- /dev/null +++ b/docs/system/riscv/milkv-duo.rst @@ -0,0 +1,49 @@ +Milk-V Duo board (``milkv-duo``) +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D + +The ``milkv-duo`` machine is compatible with the Milk-V Duo development bo= ard. + +The Milk-V Duo is an ultra-compact embedded development platform based on = the +Sophgo CV1800B SoC. The CV1800B features T-Head C906 RISC-V processing cor= es +along with integrated peripherals. + +For more information, see + +Supported devices +----------------- +The ``milkv-duo`` machine supports the following devices: + +* T-Head C906 cores +* Core Local Interruptor (CLINT) +* Platform-Level Interrupt Controller (PLIC) +* DesignWare APB UART (dw8250) +* SDHCI controller +* CV1800B clock controller + +Boot options +------------ +The ``milkv-duo`` machine supports direct boot using a generic RISC-V Open= SBI +firmware and a Linux kernel. The root filesystem can be provided via the +emulated SD card. + +Running +------- +To boot the machine, you need a Linux kernel (built with CV1800B support),= a +device tree blob (DTB), and a root filesystem image (e.g., built via BusyB= ox +or Buildroot). + +Use the following command to boot the system directly to the Linux shell: + +.. code-block:: bash + + $ qemu-system-riscv64 -M milkv-duo -nographic \ + -bios pc-bios/opensbi-riscv64-generic-fw_dynamic.bin \ + -dtb /path/to/linux/arch/riscv/boot/dts/sophgo/cv1800b-milkv-duo.dtb= \ + -kernel /path/to/linux/arch/riscv/boot/Image \ + -drive file=3D/path/to/rootfs.ext4,format=3Draw,id=3Dsd-card \ + -device sd-card,drive=3Dsd-card \ + -append "console=3DttyS0,115200 root=3D/dev/mmcblk0 rootwait earlyco= n" + +This command boots the generic OpenSBI firmware, loads the Linux Image and= the +specified DTB, and mounts the ext4 root filesystem from the emulated SD ca= rd. +The console output is routed to the ``ttyS0`` serial port. diff --git a/docs/system/target-riscv.rst b/docs/system/target-riscv.rst index 2639866a3e..1e49055e29 100644 --- a/docs/system/target-riscv.rst +++ b/docs/system/target-riscv.rst @@ -69,6 +69,7 @@ undocumented; you can get a complete list by running riscv/k230 riscv/microblaze-v-generic riscv/microchip-icicle-kit + riscv/milkv-duo riscv/mips riscv/shakti-c riscv/sifive_u --=20 2.56.0.rc1.315.gc6ed9934b7-goog