From nobody Fri Jun 19 05:12:45 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=1781636653; cv=none; d=zohomail.com; s=zohoarc; b=YH5GIxUrzOFClT1am10skK5dVHRwpDemcmuzRl+ESVO6wAYoeEs0dikzOhRjf1c8lujFjzO3oHsO1pesK+dlvMk/LC2ONwMFRBSMHnHROvI1NnYJwc7VcaRVGIPqVkmwMEDtw0xYp0c1k7vWaCTwGAsVeX/rSr/KAZ1UN26PHKM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781636653; 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=JTCwpCF51RY4lRUcaJPa9zU/4fcfYbZj1EPKJSo44zo=; b=QGfWep9Y+0wMP/RgI0hH2dGZnSMmE8sQSgzZk3nOOC1ziZVyxhgi/7Ta2yb6FQ2xfVid0E0Y9BpJULwh/LSrHQpsoHl9/TA0secrR2JGqD1aii2HU03ODOOeMvIsHFzXyphho3qZHDfvh6zP5YULxAHv52nDtKUCLQxZBfxZmcU= 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 1781636653784144.0259195653116; Tue, 16 Jun 2026 12:04:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZZ3R-0001LX-KN; Tue, 16 Jun 2026 15:02:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wZZ39-0001Hq-DJ for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:16 -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 1wZZ36-0007US-Cw for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:14 -0400 Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-8423b08b293so2461804b3a.3 for ; Tue, 16 Jun 2026 12:02:12 -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-8434ac9c474sm12671540b3a.2.2026.06.16.12.02.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jun 2026 12:02:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781636531; x=1782241331; 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=JTCwpCF51RY4lRUcaJPa9zU/4fcfYbZj1EPKJSo44zo=; b=l4Q3ZnDxm8bMUGEUgs2CW1MxfI/0xFbwhs73c+TiD6sWAOStFyKuZku1Oy8dfzlT+t 04h8jNgFtnvdD75ucXkcydV/MDm/l3LK5NP900YXoxTj1ksKFXQzwxWH6OwTME5WLZCf 4T7yYN7CXj6EUzIgU/6c9ErBvNdTSuTFQuKsYKc/dYFNL55D9Lg+2PbTLBcGgDwee3m9 fKaLB7hLwAF6uNS7qJig45sNjkqZYNnjv8mnJoeMCcn0V7qErAffijBSD5xyNQDiTD9/ QCYcbEw5w2vZi8Agp5+Hk7dNl17Cu80wn9zoTbWI5I5nR9zkeaydkceCK75Iu+rIWlNC Rhlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781636531; x=1782241331; 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=JTCwpCF51RY4lRUcaJPa9zU/4fcfYbZj1EPKJSo44zo=; b=pDzaq9b50UcjBJiDtyjMmshaheF9KyyFoBgwslYO5FYa6NA22fVn+YMAngc06DzNyV PlN8/qxeDvl4/Jv63p8kx2meOYgMvvDSLjLNEunZKA2VgVeU9odNP5jsjtOXENSqnGNx Bgb/sR/jmmAeZjB+t60KjKbM9MM+8S5djODkIFlqO22Af5K1HDq2COHkGE5mhWRCkWGq KHVfte+/ggng6FwFs8ZCAJSpXJPE231VXtFRgPA1qM0AD+DkNiR5EaepP3XZnzAEKqrs P2k9z+XSHzE5jizerPMMp7JL16D+KqDiei++F+5SIBqYa0D8Lxcu4SieK9Of+BN9P+wW MTLA== X-Forwarded-Encrypted: i=1; AFNElJ81VBfQPLCcROGHbkCTzBdc/1aCstkd+ltpVrZWmW/8O48Umx8ha46WZN8NXmqG0aAIJz2JKIU3tXKm@nongnu.org X-Gm-Message-State: AOJu0Yz8K/03wMKWZXIkoa65WFdeEtyQN58P5ziTiUtujWRZjK8NQfV0 Khfr8swEqwWeo8N+OyRZaTtmXxYQoKT/AzK2U5TA1GJJB2P8ak6tgdtd X-Gm-Gg: Acq92OEeQxcHxI+SujQVf5XbIIgoJR0gGSXnNRdRix0RETRG5nJE/mcPgWVnk7qrAzb Nsc6m8dn6ccmtBMQFDwG3e5Zk/48Kx0yU0dJXrhXehKUuY32/KhA9E9GXeVH7YXAEZjceA2iPaJ fp218YIO+SIO+fimHIapR0+JLVbd2CZZmee4VGnAv0hIen/SCl6ZUo58U7usIzyaCwoIez0crAj BPKIGCsilvjUqtXbNYwsYk+wAR00Vg7/eG6UxNdxdn17OzEwCvjtdnTspUNz8FzXLzJrGNKVjdT mTvdJ0KRoD6dZoLyy5/KXHUI9zEYLx6ytBl93dCDdb5N73ZeGfQjtAItIhYg489LY3/60Qd4fe+ EQ0wk0MT7Sep3bWXZw9+OmO2uipGUvf9fMgUVneIs/1r9XyWrzKTOJbdqH703DtJ5bBIo9biMNa GmhU0wvVgMb0AIHJvn45bhLRt+v1az4kyIlSD3Kv5cmyJMFjq6/J+yB9NuSoo9IAE97BBMN8zuH +Ru+12PZ6gJnc43uwYdCar1vnJfGnBe1w== X-Received: by 2002:a05:6a00:a20b:b0:842:4982:82a with SMTP id d2e1a72fcca58-845247b90a2mr327776b3a.45.1781636530669; Tue, 16 Jun 2026 12:02:10 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, alistair.francis@wdc.com, farosas@suse.de, lvivier@redhat.com 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, marscheng@google.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v3 1/5] hw/char: Add dw8250 UART Date: Tue, 16 Jun 2026 19:01:43 +0000 Message-ID: <20260616190147.1286316-2-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog In-Reply-To: <20260616190147.1286316-1-visitorckw@gmail.com> References: <20260616190147.1286316-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: 1781636655839158500 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 Reviewed-by: Chao Liu --- 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.1136.gdb2ca164c4-goog From nobody Fri Jun 19 05:12:45 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=1781636579; cv=none; d=zohomail.com; s=zohoarc; b=HRT66sWHCt2LvFOlGcIXOgcrHOnvKyo+mQf3wFFZl39jdLT/lzAsXSUJLQoCpO3wZpbe06RuRTWcO2q7cfA6b1MSQNL8abU4falZUa6raFcGo0gIBTUkqIo20h18NQCsKdhYbdffhK2/Rq1GEnfOykrt6pgqz5GcKcJ19bIO5fg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781636579; 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=FtZHJYs4y8GGzzuEv2+NJvd5rh17mqoIqozIZanSFuA=; b=Iep2P0O72ZfO4Ru667Xdg5BTXLtyZGt9ikh9XJWInnvV+1rsu52inY7aZ5VijPL+tGSZqLKI3X8MqyCTTCXrRMPYSykit2R3YIlFT+dUFcXBt2zhI8QCX40qvZ4MwNODbuW1nrbu4qqWagHg9PH7XmBQy8HbH5dJSykzinpk3tQ= 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 1781636579072718.3694335235144; Tue, 16 Jun 2026 12:02:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZZ3b-0001N7-QR; Tue, 16 Jun 2026 15:02:43 -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 1wZZ3F-0001Ip-7W for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:23 -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 1wZZ3D-0007Xs-0A for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:20 -0400 Received: by mail-pf1-x430.google.com with SMTP id d2e1a72fcca58-8423efd76c8so3479678b3a.0 for ; Tue, 16 Jun 2026 12:02:18 -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-8434ac9c474sm12671540b3a.2.2026.06.16.12.02.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jun 2026 12:02:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781636537; x=1782241337; 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=FtZHJYs4y8GGzzuEv2+NJvd5rh17mqoIqozIZanSFuA=; b=V7Yi5ilB1vLACKgp13fiFnN23OsCvf0dVEfeus2zglEB8krlxK07KKGxB66wc821v1 KnjKdg6qnPJG/z1EJ8bByp6Z5xOkMeavbOcQVc86X90/KKrkS6NuvJSrRrvtVH994AxT QpAvBXisTOe45in8jqDDUVGxr3/FX/daASRNP7OJ7henpv6tmraCRIsQhBI79uHniEtc uin4CInMgdJ6mGkebAw1iopypgsFfuesDjla6E5tmsd6h2YAghf8MnSmX+IkHnPd2AZa kIuqXidFXdjeRs7MXy9PdiXErsvg1hAU9faxjy24ujU5GTenJpNfbAfwnM0+RQyA1WYJ eENg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781636537; x=1782241337; 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=FtZHJYs4y8GGzzuEv2+NJvd5rh17mqoIqozIZanSFuA=; b=GBpkTMHwjW43tQWfVOUVPp5HgZiEXBk62S0pCqFX7CfIHkFeqYolCyLnuck7p9Ai2/ ac5zAqxKYCMLuce5+++ZKzxaTNNFDqnTT2mKdJitI9E0t9XYVK2CnsWfcaZeWY3WeUCS iGH+zoGVbGZYjHTPmtydBnCgtFOq01GDANeum2X3rmUrKRvttZ0bth53Cd6ukm9PpaLU eAeUr2x/vpTADjKtofMbP/myZUFXop+U0EuojdFZE1CAW0b1XNKny6l0h4e3g9sUSw4J zIp/yboPQnMxoFeni2izfgj3c3XpCF4pOmi6VMQVBIKd6QeUKGYOkX3qejPzVaUlCMHs nUyw== X-Forwarded-Encrypted: i=1; AFNElJ9aME52JG5mP8593imxy5Ar4M8ZioB0YYgDPHddXE/a4ENWpAG5cF48wy0Ut8MMgpdWQRcYfWXXVdvy@nongnu.org X-Gm-Message-State: AOJu0YzrCdoptEfNXin+JAOFZ08rl8U2SMk6jSOTjKIphGkSFwz/YOtH ICZC2w+PEZ6k1Yzmnjbyx28AFJNRgq1fcBQqu3Wayhvd0sKkWvzSxr0f X-Gm-Gg: Acq92OEbrDwSz9brJETF6mnwQe9/bfY4MjQbVH6sNjK6wr4qZkcVmobo5OxbPtU8Ot/ mVoxGohFSjap6QB4CCLYaNXzkVFTu3cr0yuQ7fc5MZtgMCMu/c3nJnFx48tdKbqc2n+yUR+oZkP dmfBFcLrvl/rJpKNCI/TDfhB0pHJDa0c+Wd24nULP8uSq+eOBHd1WvVsj3FOkNKjCAFRIu/bhKX mF8+3UIwebTYkYGdVODfFMYJY7eWL9zvL0GQz5QDBP4RN81MbAARhKODhY6BYNTcRakfudxWmWk mHABULfH67kuHMzaAFasrpsD79srnJ0U40Uu5aCuRMDmIo83/8KaKL8tYiV6bBBtzS72gKu7ONm 8+BmHPuc6Jws7A8O6mL3T++LYX73YTLWkDkTVKCL5YzWqG1hneaI+rm8cvUMijBwXdD+YsGf5lO Svo4XSub8ciLRYmoWw47b0AJOgVQq3Ub8ktWqrssN2+guP5kMjYOaYH0D7Qd8uqEV0bga2j6nBs bKvxnnP0GQh2JQsx51QMAM= X-Received: by 2002:a05:6a00:138f:b0:842:7867:430b with SMTP id d2e1a72fcca58-84524556180mr406435b3a.29.1781636537461; Tue, 16 Jun 2026 12:02:17 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, alistair.francis@wdc.com, farosas@suse.de, lvivier@redhat.com 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, marscheng@google.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v3 2/5] hw/misc: Add Sophgo CV1800B clock controller Date: Tue, 16 Jun 2026 19:01:44 +0000 Message-ID: <20260616190147.1286316-3-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog In-Reply-To: <20260616190147.1286316-1-visitorckw@gmail.com> References: <20260616190147.1286316-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: 1781636581436158500 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 | 90 +++++++++++++++++++++++++++++++++++ hw/misc/meson.build | 1 + include/hw/misc/cv1800b_clk.h | 24 ++++++++++ 4 files changed, 118 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 1543ee6653..fd56f0a4c5 100644 --- a/hw/misc/Kconfig +++ b/hw/misc/Kconfig @@ -257,4 +257,7 @@ config XLNX_VERSAL_TRNG config XLNX_ZYNQ_DDRC 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..db7e626158 --- /dev/null +++ b/hw/misc/cv1800b_clk.c @@ -0,0 +1,90 @@ +/* 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 (4) +#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 / 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 23265f6035..692f290a87 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -36,6 +36,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.1136.gdb2ca164c4-goog From nobody Fri Jun 19 05:12:45 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=1781636589; cv=none; d=zohomail.com; s=zohoarc; b=WgPwE7svkQyrf7BT+GMEeSnMefGkjNC/KUPIAeLnDIb2Y5VBuJ21gmDxuNLL+jlAfbCqR5deBe6JWF4RIo1hld3oHeYDhrBoTvpzb6FxwE5S4oE8LDtSqZn+3p+DDCM4pcJjTnZzvkOY7+5S8fw4B3Fk3u5SQ93IfU94X/h+Wg8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781636589; 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=J37OOKy8I7OtViJC45dUhtotxxDTF76GzUCt9oKc+0w=; b=eJmyz4APyCnXlQKV3KKW/m6DmMzJf/go2fRr/IZsXCMhXFzXb51oNyGBklp7SflTsJnNOMNNrHoqz7u80wzYlO7PkjQuj68EjF/LE3l9nWKfxGO6iKqJMkN9xafUad0MS/RyHj2dK91Zy9hTYQX6ZrCyLBZ9emB82zl8acNq77Q= 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 1781636589791256.23900645017284; Tue, 16 Jun 2026 12:03:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZZ3X-0001Lc-7i; Tue, 16 Jun 2026 15:02:41 -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 1wZZ3M-0001KH-25 for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:29 -0400 Received: from mail-pf1-x42c.google.com ([2607:f8b0:4864:20::42c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wZZ3J-0007Zm-6H for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:27 -0400 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-84232e83ca9so2423440b3a.2 for ; Tue, 16 Jun 2026 12:02:24 -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-8434ac9c474sm12671540b3a.2.2026.06.16.12.02.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jun 2026 12:02:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781636544; x=1782241344; 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=J37OOKy8I7OtViJC45dUhtotxxDTF76GzUCt9oKc+0w=; b=Jmk8sujtBAXUpM6n4U7UkoF/ClInTGOZKuyOabUnMF7CubgdKAdQZQsz3n4yMWYwU7 PYA4Azgep9N6DkDz3bhDymNgSPJGoxxsXP5hl+SGl8b3YRKGPzF7scV7+Xxa1eSmgWfF pF+ohHRRGrMUIlTnqJEhM9qR2WoTGqsRqA0b16rSUXUyP9xm63ieiUuARAGIHQQTq5OG 5R4JrPAa4fwPP1XLrz9qk+uk7J8JXzvEAwxQciwJNwLJuNAumgxBNGHlTGRZ7yopb299 NQXhiSTlmOe5EIcVdAJO/mLmODxNeAn4sdRxniKXQs53pHANcb2zndMEp7p9iS9n5zVo t+gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781636544; x=1782241344; 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=J37OOKy8I7OtViJC45dUhtotxxDTF76GzUCt9oKc+0w=; b=FbyquOi3JPhI8vCS7fgBPYVJ8p+GcRKaCOtbgLcbsQPH4rDPc1zjQH2B6jORfKZ47w TGXwVUSHQD72fq3i09ae2IVelmnypnxRBAZFMcYc9Lf/TQDMgpDQW1LIEX8gQ9Zadnmb bBjQsn0yUxwKYIPPZjHQph59TIr7DNFBk1w5+vS4z9rylJxpcTRb4WvvcjdB6nSMk11b pGB1z03q3WKKZ+yisxHkWr83jalp5bvaQL8sipS+3EpptUqmf+UzSQjxj9XIzNH4zCx6 eHJAcJby31PPkUzwb1ISD6nqMuYSHkgEPrxEDxzslbfA86H8gY9PXgGjETQifDfswh8c 6m+Q== X-Forwarded-Encrypted: i=1; AFNElJ/zWxvgtxnVJsXOKb8Nb+3A+R20PfI2qKBTwZnbduaTpI5jRMWwt/EV2XR8963MNPFvZjQ4bYpFu2jU@nongnu.org X-Gm-Message-State: AOJu0YzO2BhsZJDElkrJaZa9co8v4YdJk30jNDXsRN+pAKANy6UTbBiJ QE3DBx6aLcavKczjBtNRAY3JXeWy4ZbpSl6OTipSXa862Nc65fmfmWnj X-Gm-Gg: Acq92OFQR7wpqf1s1gX+Qv6OgUAyFXfPdODbpDIedDmp6YoNeJBqVOpO0Oth7M1HCYf PxyGmCQAGbf1jvKO4iivhpmAAtOkXv9XASXUkQtuOLjEi5vGGHzi6G1w59BPNXsqI6OZOlpz1Wg lvnMsvC+vuEBvK5L81WagiNeHKC7bjqrf47SCXsyF3XFgtV96FwVbST2X+ptY0Rt9HkhLbjDPhZ 6crwcWjXUKWLktEeltvUVWyDa4tSMI0ha0oUPg7j7oBH884z0QpLS9AP+urSAsxp6WFkqqoy+bE R2VzpXxXotqe5R61vXH4AhlVoQfdf2+o+j+U1VB/+w0q1kry16T9dRl5VPSbO4VQmXb/6x6UMsJ kqA2yM4b7hHNSHnBA58z5z9GAvdGaLDt0nZp00vlxZ76vddhl9LvVn/1OwbKtxzufRaoVknnNy7 WM5lvPYegccpuSHQTNTVDH+ISebJTy+kMRwPfGsLt4MpdgR3BvBTz6kAOmEGp2W508nNLBTn1+U mPsS/aaseD7nL3sQeoZ8Hk= X-Received: by 2002:a05:6a00:4502:b0:82a:780f:a187 with SMTP id d2e1a72fcca58-8452459a041mr338860b3a.36.1781636543757; Tue, 16 Jun 2026 12:02:23 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, alistair.francis@wdc.com, farosas@suse.de, lvivier@redhat.com 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, marscheng@google.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v3 3/5] hw/riscv: Add Sophgo CV1800B SoC support Date: Tue, 16 Jun 2026 19:01:45 +0000 Message-ID: <20260616190147.1286316-4-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog In-Reply-To: <20260616190147.1286316-1-visitorckw@gmail.com> References: <20260616190147.1286316-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::42c; envelope-from=visitorckw@gmail.com; helo=mail-pf1-x42c.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: 1781636591177158500 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 54e41a6afc..299baed4a8 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -149,3 +149,11 @@ config K230 select SERIAL_MM select UNIMP select K230_WDT + +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 b70a054579..6c242d77da 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -19,4 +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'= )) 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..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.1136.gdb2ca164c4-goog From nobody Fri Jun 19 05:12:45 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=1781636655; cv=none; d=zohomail.com; s=zohoarc; b=A0NaRQh0ZmEXmB4Dv/qbZJgtsqPhH/kOmPQOUSzh0KGcGFkx7ucStfi5tAJePT/NwuSf9KoG81MsdyMUt1yk8pIBTqfSB6JcYynHiEO+Kiad4bGocchWy2O8e42yl9X86u2jkFK5LGgy9bGmVAH7z+t3Vuuy/zPmd4jmdVoEeOo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781636655; 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=c04pXZzv/xwq2ngiuhWFNtQ5L0WrFCf278WNjJZoPtc=; b=PFZSs4OFb44f/zW9VwTQ+ksvutM2QTIAqd6Chvg2vc1oU/ai/fapxY5rQ5HJr10bd4/zw7Jag0EsCSpkEVUO0LTWEdmG6U6YdobgaWfGE+6cz8P3+Z2iZ8DyUYqzJ3jVQyHiPlwU8GE2YRNRE2euNZO/6a//RBK/m4+QzVlwXAE= 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 1781636655576427.83485964388797; Tue, 16 Jun 2026 12:04:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZZ3c-0001N9-ES; Tue, 16 Jun 2026 15:02:44 -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 1wZZ3T-0001Lh-FR for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:38 -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 1wZZ3R-0007cS-2J for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:34 -0400 Received: by mail-pf1-x435.google.com with SMTP id d2e1a72fcca58-8423efad617so3080858b3a.0 for ; Tue, 16 Jun 2026 12:02:31 -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-8434ac9c474sm12671540b3a.2.2026.06.16.12.02.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jun 2026 12:02:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781636550; x=1782241350; 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=c04pXZzv/xwq2ngiuhWFNtQ5L0WrFCf278WNjJZoPtc=; b=NPj7mCnQZaYEKrRNJbmVyYPJUOhD0i4jGgugixUVLj4I99tE+SHLMKp1NBmhPklzA8 ywweL/0iLopLK71YvUmYWtQUiRluz8ceNP1WV8IYtNS7REbX2J4590tkM0FegKcM20DW H96Y6dB6fuAaFDoFgvxr+QacOQy0ut+T8zCrQDiEN8ry5RxE8HL+oKypz9OfpWtas6Tt tPh0+veOx8nbyAzi/QMGRZNV1UXbnHdn4iszX36//d1hJe4OaIL/PU8+fNmUC/vC64Jn XUl9QOBndSQrGWomcLhP31nHFyJt+q6V594D+YA6Pp0O4QSQ7DeX5SiaoSGBDk5JZKxi xeKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781636550; x=1782241350; 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=c04pXZzv/xwq2ngiuhWFNtQ5L0WrFCf278WNjJZoPtc=; b=YDdElwbJGeXBMF8VimI0e5K16u3LR5ZqjwlhW3NxADRTUe+s2N7Q9m1ihqJsGE/mbn 9umyMC3QuBcmmLzFcKzxSrUiGon+Ot1wiu/MCQmCauk56cy0siKndhvgN3x4rX3X5DBK dxxZdMGPp4mJudkkd2WWgd10QBvHO/mYt4EzExQVi+MQiylmuZvnWmDlVlfd9VtTuDAI TWnOcRBfS5dxuAEnlVfXbmyJylWF3U8vucuahV3SmbaH3mNC26tSREMoFnBerf432Aum eO/cBjXcKtkaEBDITcCNE+B4CFaWrdyQl+YI45Rdd0Amup2qIEm7zvqKDtHTdGetDa+x 4H/A== X-Forwarded-Encrypted: i=1; AFNElJ8QBHST6k+2ewIKsupZ4POZJvaf0ztpAH0s8DWKN4YyQvjU1/JepKudQT48PKLXHwHu5opyaoBTQrud@nongnu.org X-Gm-Message-State: AOJu0YywtIYiJn+WQAj8D5ZNAGBu1ePjMFkb6IKvO2PkFK2Pddz0Pffv ro0azYJRPVujdBRyj/5CDfat++gpakInq95A4R2KJnj5H1Qed9Z61Idx X-Gm-Gg: Acq92OEKmKV+KaRhv2UfKwICjVdvqETwQ9HV2ZUOcz9EKmoEPmuK+nO41bI0XF3cOId eClCia/jN80FuHFzVieniK/WbiG1/oqGIQFQQuXztWAMIdqfvUoDXiQ++lN3VarHY7kmGJ7Nefw wC/JzX52l7o3vc3eXeG6fYsG3Bo2ONueJmRB8Yr2pZie9GZroJsy/GcitzjWuf0gFIO8DMtBPgB c9Whxdg6C1Xs1VIySeMznsmO2djgfLWjB0tCYxsIgXuNp6dSLdjo6pIqZZnmzszwb4DpQfJBg0g /IZnojUG8wmlmMoIKIqexfdCR1xl/s05hJN+ESpsaAa9Z45gRR54XYVjHKe0GjEZBKjn9h9qZt3 uxj6rOg1cSX3Xe1dbuUqSn/2f4oK2gHPqbWQ6AeaH89gflJ5bVKjQuuyDpUa6aLE8aJ/cjZLvzs lZVOloHKPPAgdnXaDXXXoQFKbEszasohx5yGbhwJ+B8fwNb03vec4Uwv+E7MmsZ+gBcfJ7pDaHa tT3umMxhTOSaGd7vYnz6sZdXN0GajK3Sg== X-Received: by 2002:a05:6a00:1907:b0:843:4937:6d0e with SMTP id d2e1a72fcca58-8452448103fmr466979b3a.16.1781636550200; Tue, 16 Jun 2026 12:02:30 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, alistair.francis@wdc.com, farosas@suse.de, lvivier@redhat.com 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, marscheng@google.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v3 4/5] hw/riscv: Add Milk-V Duo board support Date: Tue, 16 Jun 2026 19:01:46 +0000 Message-ID: <20260616190147.1286316-5-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog In-Reply-To: <20260616190147.1286316-1-visitorckw@gmail.com> References: <20260616190147.1286316-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: -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: 1781636657054158500 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 | 124 ++++++++++++++++++++ 5 files changed, 143 insertions(+) create mode 100644 hw/riscv/milkv_duo.c diff --git a/MAINTAINERS b/MAINTAINERS index 93df53d87f..e197dcb5b2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1797,6 +1797,17 @@ F: include/hw/riscv/k230.h F: include/hw/watchdog/k230_wdt.h F: tests/qtest/k230-wdt-test.c =20 +Milk-V Duo +M: Kuan-Wei Chiu +S: Maintained +F: hw/char/dw8250.c +F: hw/misc/cv1800b_clk.c +F: hw/riscv/cv1800b.c +F: hw/riscv/milkv_duo.c +F: include/hw/char/dw8250.h +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 299baed4a8..42a0e78574 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -157,3 +157,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 6c242d77da..8c88f2bc25 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -20,5 +20,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..8e9a553a57 --- /dev/null +++ b/hw/riscv/milkv_duo.c @@ -0,0 +1,124 @@ +/* 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 +#include "hw/riscv/machines-qom.h" + +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, + .interfaces =3D riscv64_machine_interfaces, +}; + +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.1136.gdb2ca164c4-goog From nobody Fri Jun 19 05:12:45 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=1781636590; cv=none; d=zohomail.com; s=zohoarc; b=LVIPzsOX+B1iNkgtphcZL2lNJNSsc7aOGRr79udLLNEixyCeBEZqL3V3Pmk57pxolm9lA1t9BxhI6i6AIXvpAa87xshUQsXjp90wQwjjvNmGkF4rxKl+FYNQVezvMINz0TI7qdxjjkoI3TrrhH3lQ/qWF2oJkUxO+GYJwCdR7e8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781636590; 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=BwphlitC4oX8AgGTzJwdeXKuAewbvY6nCE2dpNNB1n0=; b=kgNB+Mapc5ZfRQdUMb7QqhFCxLP7wMgBaDlG1s6Hgy5fBraEvjbURxrVq8GkxR9vftTL0d8XgrLgeH15ZDF86QvwCk1knUVUPtKJXSIdNrAuTmJj6YPrVjWSGAGJf0QSIfKnSNGc5AYnkBj026cDY/LQ2ooYmIXy7KFfn15K1iY= 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 1781636590858100.55270576641806; Tue, 16 Jun 2026 12:03:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZZ3c-0001N8-8q; Tue, 16 Jun 2026 15:02:44 -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 1wZZ3a-0001Me-OB for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:43 -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 1wZZ3X-0007e4-Fk for qemu-devel@nongnu.org; Tue, 16 Jun 2026 15:02:42 -0400 Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-8422f148dfcso2916587b3a.3 for ; Tue, 16 Jun 2026 12:02: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-8434ac9c474sm12671540b3a.2.2026.06.16.12.02.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jun 2026 12:02:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781636557; x=1782241357; 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=BwphlitC4oX8AgGTzJwdeXKuAewbvY6nCE2dpNNB1n0=; b=dIB8DqUtlfp2Cv43uunI3shxxEYT7tnixzIEAJq3prHBVyFBqs8YKQLA+sH5FKVCEV gxcmkV+hLbp5dqIMjb9c7FXgbN8IIcfSe7nO/b+N8B6O22tca9S5ubJnGYCN+7oVlay8 pp+U7g/zL3Z9TrToccTQM2WsnCTSxfXN4sZgXZo74QBBq8a20xtb2hiW3ndxhzixuog3 qZh4NTRHjtVdDH7hWf1SvtY/XTeo72h0yPFXs3Ao/wTy/mgKSPpD0U8B8puMiIh3F5kw WQFcMvm+j5kP9jNa/TXBvUyjOz+EbDJll6jAfrbuZvV9Qbv+FmyByJlOKdTSAbiE5esJ w74g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781636557; x=1782241357; 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=BwphlitC4oX8AgGTzJwdeXKuAewbvY6nCE2dpNNB1n0=; b=phKKbnxs7V/0PnG9rnDVEtHD96gSEEv0JDNtwDEOp79rmpK450rZLLcIObz6qI7hvE ry5GDDvviWjzLWph/cR43FnoMwuWvLeo8qYKmmUbLeeoVc3B+D+loXWexaSRD6wjJWjI xTY/vM1m0sox+p76n1WOFY9w1XJrMEjF3/h/PQTh4PqR9UrN4Pv46iJHswd51sSjWQOF nnNuus2bZXYF2og9iQ/5xXuOKBtZ2PvPbbp6tgQg4MDhV7gyCdoo1Su2aKZU4rBvqDWz aSEmhkmkRhMSRl321XH61rf+UMUIz9uijVV9796Uf+yiopUmnCTIiF0DPi5mc/cIeejs sbiQ== X-Forwarded-Encrypted: i=1; AFNElJ9wpdG/3kQhJdL76B2cMrBBqEYnMQv4t9H+nWLksiXNLa0LVfi25e2QIERJlJLxciu9urFNu5NgEVXE@nongnu.org X-Gm-Message-State: AOJu0YzRzDFTzCc1kpf1DR6L0KE6Zjka1ehl9mWAx8sx83tFhxk1gAI+ z+hbVgFxMItquh2wZyrkJ9XAr/ATM5Nr4SvKBXL+CxXnibtI1ga1kKDD X-Gm-Gg: Acq92OGHEcGxDI7ub+bOgWjnVoKwd9tlJQWtQpXYsZ6+FOJtiSmko/Q/6Ta7wKXDGQR +IxCpFUq2Jv7to07Ac0RnP7OnV8P8H+m5cUbA7Rw/wKPIcLpTBVYSykcA5LlRMQxitdDrZTAphz LTvcjGzCd1bMbcpayt8cDTvmpqv5JGtmvfgZGduu6oacGkTThehuyhhZi4m9u05Jb92ihGaYItW X7zVB4J/pc5K1VxDJjtWGJdwaJFWOI8xVlplW/BkJkJI+8HXIW8j6HFmRWa5sctSOdsh9h/L3vW m7ma0hmvBXo+rSkAs/7LeEjwWBNnV9ThTN7NZy3GFAkqrQNB8L4JtIvRSi3SNGo8E1+t7Z+1ndR G45yQpcjULe25oVyIKESxAYq5JiJsaychoKSMujkbU7dWO/kWeTah0gg0OgxdvspYQos3vCTVKf gpVqmfjQIzLunEmjScZGH6qgfY0UXGBiFHiE57A4+XXuE8Mmyq8XLqaWOJt2dIFxgeNFQOssQzV mUp+4CDaJlhkdSxk2d3xiR0xGYLo/k57g== X-Received: by 2002:a05:6a00:2194:b0:842:7062:fb39 with SMTP id d2e1a72fcca58-845244407bdmr405858b3a.4.1781636556743; Tue, 16 Jun 2026 12:02:36 -0700 (PDT) From: Kuan-Wei Chiu To: pbonzini@redhat.com, marcandre.lureau@redhat.com, alistair.francis@wdc.com, farosas@suse.de, lvivier@redhat.com 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, marscheng@google.com, qemu-devel@nongnu.org, qemu-riscv@nongnu.org, Kuan-Wei Chiu Subject: [PATCH v3 5/5] tests/qtest: Add qtest for Milk-V Duo board Date: Tue, 16 Jun 2026 19:01:47 +0000 Message-ID: <20260616190147.1286316-6-visitorckw@gmail.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog In-Reply-To: <20260616190147.1286316-1-visitorckw@gmail.com> References: <20260616190147.1286316-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=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: 1781636592544158501 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 --- 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 e197dcb5b2..472513537f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1807,6 +1807,7 @@ F: hw/riscv/milkv_duo.c F: include/hw/char/dw8250.h 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 4897325d84..38acbdc0c8 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -293,7 +293,8 @@ qtests_riscv64 =3D ['riscv-csr-test'] + \ (config_all_devices.has_key('CONFIG_IOMMU_TESTDEV') and config_all_devices.has_key('CONFIG_RISCV_IOMMU') ? ['iommu-riscv-test'] : []) + \ - (config_all_devices.has_key('CONFIG_K230') ? ['k230-wdt-test'] : []) + (config_all_devices.has_key('CONFIG_K230') ? ['k230-wdt-test'] : []) + \ + ['milkv-duo-test'] =20 qos_test_ss =3D ss.source_set() qos_test_ss.add( 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.54.0.1136.gdb2ca164c4-goog