From nobody Fri Aug 28 00:12:48 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=1786629568; cv=none; d=zohomail.com; s=zohoarc; b=ZZiaOwjkdeBqlSX5+plh0pEEfaCuFTJl2nhAJRt27PRIivRethL8FKFesVLpscU36pTIeuOY9SPpdzymdgH5bc8xS3y/Bn9iTctOPMGNWRx2sFSCMz7EF979+nJDxQvhrDOTsCEUJeLz4AC7sBGVFAh/3miA2e5XhGT0Ct4TFg0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786629568; 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=kImMqM9I7Obc8QnqaPPg9PomF+UcCTs/QXeVwz4lXlw=; b=R2vyVm9D8I0XlOmYq9+g0VBbafnQF/o1+JcLwVuUT77xrHKEwFzwhotdDQ3SbsRZKsvQBlLbNH1QT3OELDl0ivQ7R6LxqW0Mai31fSCm7j4BpwU6UCcmgSXBnFx1lIc3z0nivEbcG/9yRmPCUIR8aWk8deM9EA6BjBv2De2Wdpo= 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 1786629568569262.79919579830744; Thu, 13 Aug 2026 06:59:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuVwe-0002xV-Ln; Thu, 13 Aug 2026 09:58:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wuVwc-0002x8-Eb for qemu-devel@nongnu.org; Thu, 13 Aug 2026 09:58:06 -0400 Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wuVwa-00020P-8P for qemu-devel@nongnu.org; Thu, 13 Aug 2026 09:58:06 -0400 Received: by mail-pl1-x629.google.com with SMTP id d9443c01a7336-2ceb096e675so9579475ad.0 for ; Thu, 13 Aug 2026 06:58:03 -0700 (PDT) Received: from localhost.localdomain ([111.198.227.173]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d37c486531sm10024395ad.57.2026.08.13.06.57.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 06:58:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786629483; x=1787234283; 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=kImMqM9I7Obc8QnqaPPg9PomF+UcCTs/QXeVwz4lXlw=; b=h4xBWmc8ins2Z76q9BH1+YIUdV34dG7BtYFM8+8CdSnEfkmy1WubM8TMQg+w7SaLrN etbPQZ44Xtjci8BIBMZ1GoTqFDP3oDVSiUAR5CJ5lAlb3Ht75ZWh4LsCEnTqzgWbU6n5 K+5nyG7TTqtsjnGNbOc0yxdxibQCjFa3St8hmBBoqF13b72zpvY6pS3kZcO6MCMtQtY7 Wm94s30S7V2zoNDdFgR1JfkLZnaEQS/rylrF4mZz7CJU4I4bvIBjrJs19c3oXC1FjKu0 FrMmhjXO8BKhU5UAb0yua1WMl+9fAasdQbTBZ4kDtG82HgPmZ/PlFkF42GevMYCwHiWQ txZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786629483; x=1787234283; 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=kImMqM9I7Obc8QnqaPPg9PomF+UcCTs/QXeVwz4lXlw=; b=FyWmCrwsOu5q5M22HOq8v+RtQX+9LeukkkrGuH1LDwvve4U1hyI/84XGmMO3svsKsT u/nT2HUFGTrAAjmxD5WyXww7zWuM+SRFWIx1NPONq37qeiDlLi46A/hWnSXQfd/+ZEEU RPKWT9SzdniC1ipH+DTcyxX3HjrbRwmowOzQYhi+fJJZI0CjFMkfCmYq59eRUefP20jR N3Q5CfCiNJ+RhMMc3NomJe8oWoWntJFfvYIj9e5Ch2vf2O732vdNlmotxPHjUFXhyJv5 SrqQQ/DGN7JMFOLysD8gIWvLVwTX94WB3C3v1VUlXmm37SdPfe2IA23TcF85tbFcscrg 3tKw== X-Gm-Message-State: AOJu0Yz039k6mreSYW+wcgIcb3yewu/31i9viSqtC3zySUCIiM2FM08N G/hxAxz6nBPybkTYk3InCg7cuo53dC7ydp3aUJNT5pGVfqAxnSKAqmDvzKr6TCpxMoM= X-Gm-Gg: AR+sD12Z2YEG0DoA5/VHJF9t0KCXwPgue0lWAg/Uc4YFiCQYR9xI4pcaI+yIUonX7po OfUUOUdzo+WdEd1Djar2KlpWLXG1wJ/uaeKdXbPLrnfJoNwFIlTOTFS5thcFgCmGr+e8p/O5ih6 3xwoKkAf4CV28BcURE0vSh9/j0oqc65B7mOHrRN8O/dwfBibpl5ji+n7xSnNcvQF4gHN67IY+Ps 9m1Y9Q/KmS1ETmfG9gVjFsbr+5xy0Ml0pDx32Yme4QFZGEaUrBAbkkfrGpqKHFkVz6WTiqUGjrr RPxvPScsubfmd5rF07Flng2r9N1Q8VOHMy0qlwsib18yNRnK04LT0CXbF7JNycupo9EJcNuu0o8 uubGx+hbCY3+wUZo+Rf0N/DfR6R4nMGy/MUaw1KMRddz0iE0o73WMfmVa8W499hhvWC+WdDSQSG W5JpJP0lWootX/SEY+mGUXyADQ1Z0Z9Vl0PhCGacRPxpZj6G5uHrEwCzy7yRa6h5cNonAJonub6 Kq2Dm0pDg== X-Received: by 2002:a17:902:d2cc:b0:2ca:d172:7228 with SMTP id d9443c01a7336-2d37e855129mr61764005ad.11.1786629482726; Thu, 13 Aug 2026 06:58:02 -0700 (PDT) From: Kangjie Huang To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Chao Liu , Junze Cao , Alistair Francis , Paolo Bonzini , Pierrick Bouvier , Palmer Dabbelt , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Fabiano Rosas , Laurent Vivier , Kangjie Huang Subject: [PATCH v3 1/3] hw/misc/k230_iomux: add Kendryte K230 IOMUX model Date: Thu, 13 Aug 2026 21:57:15 +0800 Message-ID: <20260813135717.2758-2-flamboyant.h.01@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260813135717.2758-1-flamboyant.h.01@gmail.com> References: <20260813135717.2758-1-flamboyant.h.01@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::629; envelope-from=flamboyant.h.01@gmail.com; helo=mail-pl1-x629.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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_ENVFROM_END_DIGIT=0.25, 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: 1786629571044158500 Content-Type: text/plain; charset="utf-8" Add a SysBus model for the 64 K230 Function IO configuration registers documented by the K230 Technical Reference Manual. Preserve the writable configuration fields across aligned 32-bit accesses, apply the documented reset values, and ignore writes to read-only and reserved fields. Offsets outside the documented register list read as zero and ignore writes. This provides the register behavior used by the Kendryte SDK U-Boot pinctrl-single driver and Linux IOMUX configuration code. Suggested-by: Alistair Francis Suggested-by: Chao Liu Suggested-by: Junze Cao Signed-off-by: Kangjie Huang Reviewed-by: Junze Cao --- MAINTAINERS | 2 + hw/misc/Kconfig | 3 + hw/misc/k230_iomux.c | 125 +++++++++++++++++++++++++++++++++++ hw/misc/meson.build | 1 + hw/misc/trace-events | 4 ++ include/hw/misc/k230_iomux.h | 43 ++++++++++++ 6 files changed, 178 insertions(+) create mode 100644 hw/misc/k230_iomux.c create mode 100644 include/hw/misc/k230_iomux.h diff --git a/MAINTAINERS b/MAINTAINERS index f249be744e..adcff4bbdb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1845,8 +1845,10 @@ S: Maintained F: docs/system/riscv/k230.rst F: hw/riscv/k230.c F: hw/watchdog/k230_wdt.c +F: hw/misc/k230_iomux.c F: include/hw/riscv/k230.h F: include/hw/watchdog/k230_wdt.h +F: include/hw/misc/k230_iomux.h F: tests/functional/riscv64/test_k230.py F: tests/qtest/k230-wdt-test.c =20 diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig index b8860dd3e7..5011c10c53 100644 --- a/hw/misc/Kconfig +++ b/hw/misc/Kconfig @@ -260,4 +260,7 @@ config XLNX_ZYNQ_DDRC config AXIADO_CLK bool =20 +config K230_IOMUX + bool + source macio/Kconfig diff --git a/hw/misc/k230_iomux.c b/hw/misc/k230_iomux.c new file mode 100644 index 0000000000..11fcc22a09 --- /dev/null +++ b/hw/misc/k230_iomux.c @@ -0,0 +1,125 @@ +/* + * Kendryte K230 IOMUX + * + * Copyright (c) 2026 Kangjie Huang + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Provides the Function IO configuration registers documented by the K230 + * Technical Reference Manual. + * + * K230 Technical Reference Manual V0.3.1 (2024-11-18): + * https://github.com/revyos/external-docs/blob/master/K230/en-us/K230_Tec= hnical_Reference_Manual_V0.3.1_20241118.pdf + * + * For more information, see + */ + +#include "qemu/osdep.h" +#include "hw/misc/k230_iomux.h" +#include "migration/vmstate.h" +#include "qemu/module.h" +#include "trace.h" + +/* TRM V0.3.1 section 12.9.2.1 Function IO register list. */ +static const uint32_t k230_iomux_reset_values[K230_IOMUX_NUM_REGS] =3D { + 0x944, 0x944, 0x929, 0x908, 0x888, 0x908, 0x948, 0x890, + 0x890, 0x890, 0x910, 0x890, 0x890, 0x8a9, 0xa9e, 0xabf, + 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, + 0xb1e, 0xa90, 0xabf, 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, + 0xbd0, 0xbd0, 0xbd0, 0xbd0, 0xbd0, 0xbd0, 0x890, 0x910, + 0x890, 0x910, 0x890, 0x910, 0x890, 0x910, 0x890, 0x910, + 0x890, 0x910, 0x890, 0x910, 0x890, 0x910, 0x89e, 0x89f, + 0x99e, 0x99e, 0x99e, 0x99e, 0x890, 0x890, 0x8a9, 0x8a9, +}; + +static uint64_t k230_iomux_read(void *opaque, hwaddr offset, unsigned size) +{ + K230IomuxState *s =3D K230_IOMUX(opaque); + uint32_t value =3D 0; + + if (offset < K230_IOMUX_REGS_SIZE) { + value =3D s->regs[offset >> 2]; + } + + trace_k230_iomux_read(offset, value); + return value; +} + +static void k230_iomux_write(void *opaque, hwaddr offset, + uint64_t value, unsigned size) +{ + K230IomuxState *s =3D K230_IOMUX(opaque); + + trace_k230_iomux_write(offset, value); + if (offset < K230_IOMUX_REGS_SIZE) { + s->regs[offset >> 2] =3D value & K230_IOMUX_WRITABLE_MASK; + } +} + +static const MemoryRegionOps k230_iomux_ops =3D { + .read =3D k230_iomux_read, + .write =3D k230_iomux_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + .unaligned =3D false, + }, + .impl =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + .unaligned =3D false, + }, +}; + +static void k230_iomux_enter_reset(Object *obj, ResetType type) +{ + K230IomuxState *s =3D K230_IOMUX(obj); + + memcpy(s->regs, k230_iomux_reset_values, + sizeof(k230_iomux_reset_values)); +} + +static void k230_iomux_init(Object *obj) +{ + K230IomuxState *s =3D K230_IOMUX(obj); + + memory_region_init_io(&s->mmio, obj, &k230_iomux_ops, s, + TYPE_K230_IOMUX, K230_IOMUX_MMIO_SIZE); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static const VMStateDescription vmstate_k230_iomux =3D { + .name =3D "k230.iomux", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32_ARRAY(regs, K230IomuxState, K230_IOMUX_NUM_REGS), + VMSTATE_END_OF_LIST() + } +}; + +static void k230_iomux_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + + dc->desc =3D "Kendryte K230 IOMUX"; + dc->vmsd =3D &vmstate_k230_iomux; + rc->phases.enter =3D k230_iomux_enter_reset; +} + +static const TypeInfo k230_iomux_info =3D { + .name =3D TYPE_K230_IOMUX, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(K230IomuxState), + .instance_init =3D k230_iomux_init, + .class_init =3D k230_iomux_class_init, +}; + +static void k230_iomux_register_types(void) +{ + type_register_static(&k230_iomux_info); +} + +type_init(k230_iomux_register_types) diff --git a/hw/misc/meson.build b/hw/misc/meson.build index e86d9ad6b3..fab6336c91 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -171,3 +171,4 @@ system_ss.add(when: 'CONFIG_SBSA_REF', if_true: files('= sbsa_ec.c')) system_ss.add(when: 'CONFIG_LASI', if_true: files('lasi.c')) =20 system_ss.add(when: 'CONFIG_AXIADO_CLK', if_true: files('axiado_clk.c')) +system_ss.add(when: 'CONFIG_K230_IOMUX', if_true: files('k230_iomux.c')) diff --git a/hw/misc/trace-events b/hw/misc/trace-events index c9a868b3ef..388967c9e1 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -405,6 +405,10 @@ djmemc_write(int reg, uint64_t value, unsigned int siz= e) "reg=3D0x%x value=3D0x%"PRI iosb_read(int reg, uint64_t value, unsigned int size) "reg=3D0x%x value=3D= 0x%"PRIx64" size=3D%u" iosb_write(int reg, uint64_t value, unsigned int size) "reg=3D0x%x value= =3D0x%"PRIx64" size=3D%u" =20 +# k230_iomux.c +k230_iomux_read(uint64_t offset, uint32_t value) "offset=3D0x%" PRIx64 " v= alue=3D0x%" PRIx32 +k230_iomux_write(uint64_t offset, uint64_t value) "offset=3D0x%" PRIx64 " = value=3D0x%" PRIx64 + # aspeed_sli.c aspeed_sli_write(uint64_t offset, unsigned int size, uint32_t data) "To 0x= %" PRIx64 " of size %u: 0x%" PRIx32 aspeed_sli_read(uint64_t offset, unsigned int size, uint32_t data) "To 0x%= " PRIx64 " of size %u: 0x%" PRIx32 diff --git a/include/hw/misc/k230_iomux.h b/include/hw/misc/k230_iomux.h new file mode 100644 index 0000000000..0a637c6292 --- /dev/null +++ b/include/hw/misc/k230_iomux.h @@ -0,0 +1,43 @@ +/* + * Kendryte K230 IOMUX + * + * K230 Technical Reference Manual V0.3.1 (2024-11-18): + * https://github.com/revyos/external-docs/blob/master/K230/en-us/K230_Tec= hnical_Reference_Manual_V0.3.1_20241118.pdf + * + * Copyright (c) 2026 Kangjie Huang + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_MISC_K230_IOMUX_H +#define HW_MISC_K230_IOMUX_H + +#include "hw/core/sysbus.h" +#include "qom/object.h" + +#define TYPE_K230_IOMUX "riscv.k230.iomux" +OBJECT_DECLARE_SIMPLE_TYPE(K230IomuxState, K230_IOMUX) + +#define K230_IOMUX_MMIO_SIZE 0x800 +#define K230_IOMUX_NUM_REGS 64 +#define K230_IOMUX_REGS_SIZE \ + (K230_IOMUX_NUM_REGS * sizeof(uint32_t)) + +/* + * Register layout (TRM V0.3.1, section 12.9.2.2): + * bit 31 DI: RO, input data from outside the chip to the PAD, + * reads as zero; the model does not simulate external + * pin input + * bits 30-14 RSV: RO, reserved + * bits 13-0 RW configuration fields + */ +#define K230_IOMUX_WRITABLE_MASK 0x00003fff + +struct K230IomuxState { + SysBusDevice parent_obj; + + MemoryRegion mmio; + uint32_t regs[K230_IOMUX_NUM_REGS]; +}; + +#endif /* HW_MISC_K230_IOMUX_H */ --=20 2.43.0 From nobody Fri Aug 28 00:12:48 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=1786629543; cv=none; d=zohomail.com; s=zohoarc; b=m9G7CqPkGSpq2K88MYMgWagRTX5Ihy1QZTTpyVFzkV7OSpbMWALZQhBBEHDdH2D9FqCChtBAgYKp9BYDZbKdKhdDOVyRD5eZNwRMYjNSs54GyZcTU1U80vE9HQicneYABivX7Ui77E7MeQEdrCbgt+2LZxzHzBwrLkj7ScjhFsc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786629543; 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=k5Phay0AGTCvZKUkw7glNgeUzFefh4pDgge7EAdtJaM=; b=ao9nvPPCNT5jXm55O2O5dDlVbaFuATDexoK8At8c3pe4phkppXDMgwU87A+LggjlyYwswt8d/1+KvfSolLuK7q9t76wKOa9as8sUXAF7pIrTmH8jdzHr6ZSw1wWbXTWnJyyvnC8p7ciqvULGie1O8LDpNJ8Mx5331aC+8Gfw548= 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 1786629543491323.9590014115171; Thu, 13 Aug 2026 06:59:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuVwi-0002ys-4j; Thu, 13 Aug 2026 09:58:12 -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 1wuVwf-0002y7-Ly for qemu-devel@nongnu.org; Thu, 13 Aug 2026 09:58:09 -0400 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wuVwe-00020u-0o for qemu-devel@nongnu.org; Thu, 13 Aug 2026 09:58:09 -0400 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-2d004f135b1so31841715ad.3 for ; Thu, 13 Aug 2026 06:58:07 -0700 (PDT) Received: from localhost.localdomain ([111.198.227.173]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d37c486531sm10024395ad.57.2026.08.13.06.58.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 06:58:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786629487; x=1787234287; 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=k5Phay0AGTCvZKUkw7glNgeUzFefh4pDgge7EAdtJaM=; b=UYpKeTsml3LGnE1Vx/FzWBlsgceINJ7tnZDsj5hQECYyQQLFNKPMqnnX1ufBmTuv/6 1O+LoG8geft4nl7FOTciDqMdKOaBLFir++fPL4fGFw4iSH3cRRnNo8OrPtz/LyB3BASS bpYke3dDJJX12j/Rvq4xBCku/KLUkxfFELFMdP31TMi1GMTj+5SQdRr+Mk9Lkoiyy8dD gLIn4599cATpHD9uIrn3yhKx6TWPaKscx8L+oek6++0MGuwgtCxeovR0t7IWGevEnNGw pJHSzPF5sDcjVoHVxNsYklMc7aGL0kuZ0oqy4nLvRthXZRwBs9R8TaWzS7gdi5WEOR1K HZ6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786629487; x=1787234287; 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=k5Phay0AGTCvZKUkw7glNgeUzFefh4pDgge7EAdtJaM=; b=e4KqNakzTVPFln4IN/pMT88EtQZnZ5p0Z/jl1WT6hqyZ2PYqzUrT8CdM1Rzblu5OHM fu82HNwsxKi/VS7qYqWPYtf7F2qaULXagx/DLuLghSPLPubZeQyEV+J5ETBZsHP+Q78Q PkVy1sxd8QCobfjwoA1cgW9W5qQyNQ7Od3pn8uSTk6dpJy4/FTLWBxiVEnkQb/RwUXN2 tS9oZOagcBjmfPRnG1cKHxyy3XV51tOHyN27nbixdyWosUZbfSTqDlbxrReT6Cq8rQXC X1kO4DasRuI+ScpEgNrZCAdbZb1vOK0nfp3K9IpBTwzTj54zaj8d4EFPRMgQ2iAcQnck UIwA== X-Gm-Message-State: AOJu0YzruoDUaztWABNS4m6Q5JClsqaT7rrGKEN5rLhGzSV5rpSPAvkk 3fhp0///tV1Njhlpc2EdbJV+pFbovDkZz5GwL8EXvBs2q8Dn14bqe0vDBXhdoOL0+Q4= X-Gm-Gg: AR+sD12OtomffrMby3ne+LACL0DtfHBM27WdOe6oKSz+5vkInY/taaWEV0E/ySr0Jas sT5ySXKhpHUiQITOgiIKTIyur66Dy58uoWGDjlklkZNXDdQ0lKV90wQt3ADuTxgqm/8wtofQdCd fMnMpvZVL384YUrbJwmNGoDtV6rE3SjpOWXWAYWZcBOvemi4XRWSjidXU4HjtwTPi2+GyLpGyTn QxCj3nG4hxzEVe6x1Fgx/Ttvn2lGJpTBOvNa3roLA6eh9CSFIqBcJROhU2oVueSR0eUFMt5QwPP /6B76nVv2HoyHr9d/wGdt3cI5L0AGOGBrk7J8Iw4FA1KugyLhHIM7dmKB8eqbQzfJcpE+fZuWld b2K5Rj6DBrIvWhPL2UqcgB+wsWFVa1oiKLlBALDAjHDcBa205MfCJcBhXWpnPITx0MuSHig12qa pnc3dPNdkMxDqsBCJrRs/LUJNwsvvQuGLUbzU5i8bpn12iu+Gt45STRrZN8T+C1hyExr4b0EVD1 W3MCpI3jg== X-Received: by 2002:a17:903:1b04:b0:2d0:cc92:f7a3 with SMTP id d9443c01a7336-2d37d5417fdmr75868095ad.2.1786629486648; Thu, 13 Aug 2026 06:58:06 -0700 (PDT) From: Kangjie Huang To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Chao Liu , Junze Cao , Alistair Francis , Paolo Bonzini , Pierrick Bouvier , Palmer Dabbelt , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Fabiano Rosas , Laurent Vivier , Kangjie Huang Subject: [PATCH v3 2/3] hw/riscv/k230: wire up the IOMUX device Date: Thu, 13 Aug 2026 21:57:16 +0800 Message-ID: <20260813135717.2758-3-flamboyant.h.01@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260813135717.2758-1-flamboyant.h.01@gmail.com> References: <20260813135717.2758-1-flamboyant.h.01@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::62d; envelope-from=flamboyant.h.01@gmail.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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_ENVFROM_END_DIGIT=0.25, 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: 1786629544680158500 Content-Type: text/plain; charset="utf-8" Instantiate the K230 IOMUX device and map its MMIO region at 0x91105000, replacing the unimplemented device covering the same SoC address window. Select the model from the K230 machine configuration and document the newly modeled device. Suggested-by: Chao Liu Reviewed-by: Chao Liu Signed-off-by: Kangjie Huang Reviewed-by: Junze Cao --- docs/system/riscv/k230.rst | 1 + hw/riscv/Kconfig | 1 + hw/riscv/k230.c | 11 ++++++++--- include/hw/riscv/k230.h | 2 ++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/system/riscv/k230.rst b/docs/system/riscv/k230.rst index cea8202e55..b160c401fd 100644 --- a/docs/system/riscv/k230.rst +++ b/docs/system/riscv/k230.rst @@ -20,6 +20,7 @@ The ``k230`` machine supports the following devices: * Platform-Level Interrupt Controller (PLIC) * 2 K230 Watchdog Timer * 5 UART +* K230 IOMUX register block =20 Boot options ------------ diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index de37c08cae..4c9fc3e7ad 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -162,3 +162,4 @@ config K230 select SERIAL_MM select UNIMP select K230_WDT + select K230_IOMUX diff --git a/hw/riscv/k230.c b/hw/riscv/k230.c index 656f28190c..430c1646b5 100644 --- a/hw/riscv/k230.c +++ b/hw/riscv/k230.c @@ -110,6 +110,7 @@ static void k230_soc_init(Object *obj) object_initialize_child(obj, "c908-cpu", cpu0, TYPE_RISCV_HART_ARRAY); object_initialize_child(obj, "k230-wdt0", &s->wdt[0], TYPE_K230_WDT); object_initialize_child(obj, "k230-wdt1", &s->wdt[1], TYPE_K230_WDT); + object_initialize_child(obj, "k230-iomux", &s->iomux, TYPE_K230_IOMUX); =20 qdev_prop_set_uint32(DEVICE(cpu0), "hartid-base", 0); qdev_prop_set_string(DEVICE(cpu0), "cpu-type", TYPE_RISCV_CPU_THEAD_C9= 08); @@ -198,6 +199,11 @@ static void k230_soc_realize(DeviceState *dev, Error *= *errp) } } =20 + /* IOMUX */ + if (!sysbus_realize(SYS_BUS_DEVICE(&s->iomux), errp)) { + return; + } + sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[0]), 0, memmap[K230_DEV_WDT0].b= ase); sysbus_connect_irq(SYS_BUS_DEVICE(&s->wdt[0]), 0, qdev_get_gpio_in(DEVICE(s->c908_plic), K230_WDT0_IR= Q)); @@ -206,6 +212,8 @@ static void k230_soc_realize(DeviceState *dev, Error **= errp) sysbus_connect_irq(SYS_BUS_DEVICE(&s->wdt[1]), 0, qdev_get_gpio_in(DEVICE(s->c908_plic), K230_WDT1_IR= Q)); =20 + sysbus_mmio_map(SYS_BUS_DEVICE(&s->iomux), 0, memmap[K230_DEV_IOMUX].b= ase); + /* unimplemented devices */ create_unimplemented_device("kpu.l2-cache", memmap[K230_DEV_KPU_L2_CACHE].base, @@ -280,9 +288,6 @@ static void k230_soc_realize(DeviceState *dev, Error **= errp) create_unimplemented_device("ipcm", memmap[K230_DEV_MAILBOX].base, memmap[K230_DEV_MAILBOX].size); =20 - create_unimplemented_device("iomux", memmap[K230_DEV_IOMUX].base, - memmap[K230_DEV_IOMUX].size); - create_unimplemented_device("timer", memmap[K230_DEV_TIMER].base, memmap[K230_DEV_TIMER].size); =20 diff --git a/include/hw/riscv/k230.h b/include/hw/riscv/k230.h index 592e1c26bf..223e76b420 100644 --- a/include/hw/riscv/k230.h +++ b/include/hw/riscv/k230.h @@ -18,6 +18,7 @@ #include "hw/core/boards.h" #include "hw/riscv/riscv_hart.h" #include "hw/watchdog/k230_wdt.h" +#include "hw/misc/k230_iomux.h" =20 #define C908_CPU_HARTID (0) =20 @@ -33,6 +34,7 @@ typedef struct K230SoCState { RISCVHartArrayState c908_cpu; /* Small core */ =20 K230WdtState wdt[2]; + K230IomuxState iomux; MemoryRegion sram; MemoryRegion bootrom; =20 --=20 2.43.0 From nobody Fri Aug 28 00:12:48 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=1786629542; cv=none; d=zohomail.com; s=zohoarc; b=lypNBrFdJoJb6vuqL5BTtCPtNxMgGGIAeNZ5RJt+XKi/rqqYl4WafpTjMzCE5UlB3axtD5uHCP0jnDGcS5YpMU8vnFHVAxnoxfDjR8spoJ45D8BeNw8Wo5wkpriAMqs9CanACE8rwzNMYniaMRuupHxpZu9JYhnMGvxBl3TS5ak= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786629542; 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=3XsgUtsIrl2lrehlBIj4BnvIKNwiejGxZ2nf5LhF9fM=; b=koaUGyUk2QKvm55kC50r/ViA/0UqB4U9UbBSVRjmvElZ0FkbETL1F5oHpB/ufpI4OlBqHZ3Gn13RzqACzHFvleIu7oYTxcV6rOPJhBaOyDHgdZByJX13juu/cZjPZGiE0GBQsOKWzEc2a5BVEUebS3VNs/hYk4y+OPggNw1sHbw= 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 1786629542032107.23594652336021; Thu, 13 Aug 2026 06:59:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuVwo-0002zc-MU; Thu, 13 Aug 2026 09:58:18 -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 1wuVwk-0002z5-Ky for qemu-devel@nongnu.org; Thu, 13 Aug 2026 09:58:14 -0400 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wuVwi-00021X-NE for qemu-devel@nongnu.org; Thu, 13 Aug 2026 09:58:14 -0400 Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-2caf228a910so6365405ad.2 for ; Thu, 13 Aug 2026 06:58:12 -0700 (PDT) Received: from localhost.localdomain ([111.198.227.173]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d37c486531sm10024395ad.57.2026.08.13.06.58.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 06:58:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786629491; x=1787234291; 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=3XsgUtsIrl2lrehlBIj4BnvIKNwiejGxZ2nf5LhF9fM=; b=YuGXzSuqK3J/oBtbVnNLb/loB+D1N/TW724XfKntVx/Ow70W+Ou/LK2RS0XOvmnbcf nQu3CC9rSXLOwV9LQ/gNOJ2HEmcQtvSsWqJLn6WpeLnEmEtK2GeM7gX4HZ+utf8KJVoI WrvZh5uyIj6Q5dOKK4ArKsnhbacsgnKVyA9HaAs1EQxTc8VurmY+6kRxuCXNl4cI+DRJ WoS0M/bK9mM0Uqv3LhcYaB5HOC6eGjVsmsCXHKMlDKUlQ/iTpA5kvH1DMZNshgL6dRGF ZYSyMh5KKnoPU24Uh27urzPm9syYRS1soUvQoElLHkvm4c3vJD9G2iTQdnMfh1FyN6bK NQpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786629491; x=1787234291; 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=3XsgUtsIrl2lrehlBIj4BnvIKNwiejGxZ2nf5LhF9fM=; b=qtumPym+YqRAmNXa+KJiUdV6C9vKxse4E/yzPbp3CqXooy5Sfo3ETbnVUNvTEFbbm9 Tn+wlj+BTQVYw3bKX+S0hB/IikTUknG2wKvkKcEHbEmcQqEjR8QCfYqktMqns9UcM3rc 4yIfDwrkB5n+mS0AUqvPKSfU3G0dBNJ8fjq2IfBJhU2VBTj+XUwZEQHk+ue8z5UyxZTZ pWu4UP+BWdK7pcTbeSbsnRkmaXkD3pC3BxT+kYG/+IyvmOwLoKfXmQdT0QZLEk0asx3D y711EJm8SjWcQR1ubjOXyxMOOP36pE4Pq1JXdx8cGy2OgY9XPuoeDW9HNBehLBPDk4VU R7IQ== X-Gm-Message-State: AOJu0YxnsRmUGo1H3SqphpJSx04hK6MY75hEubte1gzMbW2i7GALWvwH PNCSI2xHDCDLSrGx5UPkyAyvEDpFmyEKzDiAiyBHYj7LT8VS/eT0gscgrVjK9YcJ3Hw= X-Gm-Gg: AR+sD13viqD6ytP5CUUXLKUoVWGsLzcI8F+YQShpgLQFiaplOIP8ctbgufVWUhA7tdM IEzzb0/tVYUg/M+7R0UMa+1NZCd7F/zKRZrDjtCwjiCq1X5WrAvqi/BfFGRNUwVWC7DWqKBJMTG UmFaovLuQ3ufzNpgCuk9jOzQ8Qri+uazfIYRq3ts72ysOYI/b89/OS75zdfl8xqk3LRlXY7/MMN 9p99fZoFkWvi9GIB+GwYmebpZ1PaJgZvnSL15ijgnF2c1FFPd7DTUalP4TRQBSa5RbmIODOwLMp fft9bjr1sGuak6L8tfa/pgeQm9vK2uIXPqtfD/frxhXQEX+CIM7fO8nZEmULxVVruoCI0aV9dWv FxwqE2zRHf3MJp+KdQ4OUOuSpYDd3uymPADrax1jFFi6BNW+ARrZKBPbwUqJBlS2qNpuonVYwZH Yn3/ZLEsqp/9IEJ85y6mUr3ACx7OXH3LaNOOg2KD+SSg4JUS357rTo7+FW5/6S0t6a/cHjC0YRr K0QtWghI2V9cXTzkr2m X-Received: by 2002:a17:903:4b30:b0:2c9:cb1b:64d6 with SMTP id d9443c01a7336-2d37ebc3947mr73344075ad.19.1786629491427; Thu, 13 Aug 2026 06:58:11 -0700 (PDT) From: Kangjie Huang To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Chao Liu , Junze Cao , Alistair Francis , Paolo Bonzini , Pierrick Bouvier , Palmer Dabbelt , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Fabiano Rosas , Laurent Vivier , Kangjie Huang Subject: [PATCH v3 3/3] tests/qtest: add test for K230 IOMUX Date: Thu, 13 Aug 2026 21:57:17 +0800 Message-ID: <20260813135717.2758-4-flamboyant.h.01@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260813135717.2758-1-flamboyant.h.01@gmail.com> References: <20260813135717.2758-1-flamboyant.h.01@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::631; envelope-from=flamboyant.h.01@gmail.com; helo=mail-pl1-x631.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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_ENVFROM_END_DIGIT=0.25, 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: 1786629542916158500 Content-Type: text/plain; charset="utf-8" Cover the 64 documented reset values, writable field storage and masking, read-modify-write accesses, the final IO63 register, reserved offsets, and system reset. Suggested-by: Chao Liu Signed-off-by: Kangjie Huang Reviewed-by: Junze Cao --- MAINTAINERS | 1 + tests/qtest/k230-iomux-test.c | 160 ++++++++++++++++++++++++++++++++++ tests/qtest/meson.build | 5 +- 3 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 tests/qtest/k230-iomux-test.c diff --git a/MAINTAINERS b/MAINTAINERS index adcff4bbdb..7fe147917c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1851,6 +1851,7 @@ F: include/hw/watchdog/k230_wdt.h F: include/hw/misc/k230_iomux.h F: tests/functional/riscv64/test_k230.py F: tests/qtest/k230-wdt-test.c +F: tests/qtest/k230-iomux-test.c =20 RX Machines ----------- diff --git a/tests/qtest/k230-iomux-test.c b/tests/qtest/k230-iomux-test.c new file mode 100644 index 0000000000..956656aa49 --- /dev/null +++ b/tests/qtest/k230-iomux-test.c @@ -0,0 +1,160 @@ +/* + * QTest testcase for Kendryte K230 IOMUX + * + * Copyright (c) 2026 Kangjie Huang + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Provides test coverage for the Function IO configuration registers. + * + * K230 Technical Reference Manual V0.3.1 (2024-11-18): + * https://github.com/revyos/external-docs/blob/master/K230/en-us/K230_Tec= hnical_Reference_Manual_V0.3.1_20241118.pdf + * + * For more information, see + */ + +#include "qemu/osdep.h" +#include "libqtest.h" + +#define K230_IOMUX_BASE 0x91105000 +#define K230_IOMUX_IO0 (K230_IOMUX_BASE + 0x00) +#define K230_IOMUX_IO1 (K230_IOMUX_BASE + 0x04) +#define K230_IOMUX_IO63 (K230_IOMUX_BASE + 0xfc) +#define K230_IOMUX_RESERVED_FIRST (K230_IOMUX_BASE + 0x100) +#define K230_IOMUX_MMIO_SIZE 0x800 +#define K230_IOMUX_NUM_REGS 64 +#define K230_IOMUX_RESERVED_LAST \ + (K230_IOMUX_BASE + K230_IOMUX_MMIO_SIZE - 4) + +#define K230_IOMUX_IO_SEL_MASK (0x7 << 11) +#define K230_IOMUX_IO_SEL(value) ((value) << 11) + +/* Bits 13:0 are RW; bits 30:14 are reserved; bit 31 (DI) is RO. */ +#define K230_IOMUX_EXPECTED_WRITABLE_MASK 0x00003fff + +static const uint32_t k230_iomux_reset_values[K230_IOMUX_NUM_REGS] =3D { + 0x944, 0x944, 0x929, 0x908, 0x888, 0x908, 0x948, 0x890, + 0x890, 0x890, 0x910, 0x890, 0x890, 0x8a9, 0xa9e, 0xabf, + 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, + 0xb1e, 0xa90, 0xabf, 0xb9e, 0xb9e, 0xb9e, 0xb9e, 0xb9e, + 0xbd0, 0xbd0, 0xbd0, 0xbd0, 0xbd0, 0xbd0, 0x890, 0x910, + 0x890, 0x910, 0x890, 0x910, 0x890, 0x910, 0x890, 0x910, + 0x890, 0x910, 0x890, 0x910, 0x890, 0x910, 0x89e, 0x89f, + 0x99e, 0x99e, 0x99e, 0x99e, 0x890, 0x890, 0x8a9, 0x8a9, +}; + +static void test_reset_values(void) +{ + QTestState *qts =3D qtest_init("-machine k230"); + + for (size_t i =3D 0; i < G_N_ELEMENTS(k230_iomux_reset_values); i++) { + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_BASE + + i * sizeof(uint32_t)), =3D=3D, + k230_iomux_reset_values[i]); + } + + qtest_quit(qts); +} + +static void test_rw(void) +{ + QTestState *qts =3D qtest_init("-machine k230"); + + qtest_writel(qts, K230_IOMUX_IO0, 0x00001234); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO0), =3D=3D, 0x00001234); + + qtest_writel(qts, K230_IOMUX_IO1, 0x00002abc); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO1), =3D=3D, 0x00002abc); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO0), =3D=3D, 0x00001234); + + qtest_quit(qts); +} + +static void test_write_mask(void) +{ + QTestState *qts =3D qtest_init("-machine k230"); + + qtest_writel(qts, K230_IOMUX_IO0, UINT32_MAX); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO0), =3D=3D, + K230_IOMUX_EXPECTED_WRITABLE_MASK); + + qtest_quit(qts); +} + +static void test_rmw(void) +{ + QTestState *qts =3D qtest_init("-machine k230"); + uint32_t value; + + value =3D qtest_readl(qts, K230_IOMUX_IO0); + value =3D (value & ~K230_IOMUX_IO_SEL_MASK) | K230_IOMUX_IO_SEL(3); + qtest_writel(qts, K230_IOMUX_IO0, value); + + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO0), =3D=3D, + (k230_iomux_reset_values[0] & + ~K230_IOMUX_IO_SEL_MASK) | K230_IOMUX_IO_SEL(3)); + + qtest_quit(qts); +} + +static void test_io63_rw(void) +{ + QTestState *qts =3D qtest_init("-machine k230"); + + qtest_writel(qts, K230_IOMUX_IO63, 0x00000abc); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO63), =3D=3D, 0x00000abc); + + qtest_quit(qts); +} + +static void test_reserved_offsets(void) +{ + QTestState *qts =3D qtest_init("-machine k230"); + + qtest_writel(qts, K230_IOMUX_RESERVED_FIRST, 0x00001234); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_RESERVED_FIRST), =3D=3D, 0= ); + + qtest_writel(qts, K230_IOMUX_RESERVED_LAST, 0x00002abc); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_RESERVED_LAST), =3D=3D, 0); + + qtest_quit(qts); +} + +static void test_reset_after_write(void) +{ + QTestState *qts =3D qtest_init("-machine k230"); + + qtest_writel(qts, K230_IOMUX_IO0, 0x00001234); + qtest_writel(qts, K230_IOMUX_IO1, 0x00002abc); + qtest_writel(qts, K230_IOMUX_IO63, 0x00000abc); + + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO0), =3D=3D, 0x00001234); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO1), =3D=3D, 0x00002abc); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO63), =3D=3D, 0x00000abc); + + qtest_system_reset(qts); + + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO0), =3D=3D, + k230_iomux_reset_values[0]); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO1), =3D=3D, + k230_iomux_reset_values[1]); + g_assert_cmphex(qtest_readl(qts, K230_IOMUX_IO63), =3D=3D, + k230_iomux_reset_values[63]); + + qtest_quit(qts); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + + qtest_add_func("/k230-iomux/reset", test_reset_values); + qtest_add_func("/k230-iomux/rw", test_rw); + qtest_add_func("/k230-iomux/write-mask", test_write_mask); + qtest_add_func("/k230-iomux/rmw", test_rmw); + qtest_add_func("/k230-iomux/io63-rw", test_io63_rw); + qtest_add_func("/k230-iomux/reserved-offsets", test_reserved_offsets); + qtest_add_func("/k230-iomux/reset-after-write", test_reset_after_write= ); + + return g_test_run(); +} diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index f7c7d06620..27378421bb 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -297,7 +297,10 @@ 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', + 'k230-iomux-test', + ] : []) =20 qtests_hexagon =3D ['boot-serial-test', 'l2vic-test', 'qct-qtimer-test'] =20 --=20 2.43.0