From: Chao Liu <chao.liu@processmission.com>
To: Kangjie Huang <flamboyant.h.01@gmail.com>
Cc: qemu-devel@nongnu.org, qemu-riscv@nongnu.org,
Alistair Francis <alistair.francis@wdc.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Weiwei Li <liwei1518@gmail.com>,
Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>,
Liu Zhiwei <zhiwei_liu@linux.alibaba.com>,
Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Fabiano Rosas <farosas@suse.de>,
Laurent Vivier <lvivier@redhat.com>
Subject: Re: [PATCH v2 1/3] hw/misc/k230_iomux: add Kendryte K230 IOMUX model
Date: Fri, 17 Jul 2026 21:44:56 +0800 [thread overview]
Message-ID: <aloxy47qh79wHYr9@ChaodeMacBook-Pro.local> (raw)
In-Reply-To: <42d005d6e530e2cf2c7df8634e8b82c0f77d1702.1784022244.git.flamboyant.h.01@gmail.com>
On Tue, Jul 14, 2026 at 06:22:00PM +0800, Kangjie Huang wrote:
> 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.
>
> Signed-off-by: Kangjie Huang <flamboyant.h.01@gmail.com>
Suggested-by: Chao Liu <chao.liu@processmission.com>
Thanks,
Chao
> ---
> hw/misc/Kconfig | 3 +
> hw/misc/k230_iomux.c | 124 +++++++++++++++++++++++++++++++++++
> hw/misc/meson.build | 2 +
> hw/misc/trace-events | 4 ++
> include/hw/misc/k230_iomux.h | 34 ++++++++++
> 5 files changed, 167 insertions(+)
> create mode 100644 hw/misc/k230_iomux.c
> create mode 100644 include/hw/misc/k230_iomux.h
>
> diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
> index 1543ee6653..573d24a9df 100644
> --- a/hw/misc/Kconfig
> +++ b/hw/misc/Kconfig
> @@ -257,4 +257,7 @@ config XLNX_VERSAL_TRNG
> config XLNX_ZYNQ_DDRC
> bool
>
> +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..cc40dc8ae4
> --- /dev/null
> +++ b/hw/misc/k230_iomux.c
> @@ -0,0 +1,124 @@
> +/*
> + * Kendryte K230 IOMUX
> + *
> + * Copyright (c) 2026 Kangjie Huang <flamboyant.h.01@gmail.com>
> + *
> + * 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_Technical_Reference_Manual_V0.3.1_20241118.pdf
> + *
> + * For more information, see <https://www.kendryte.com/en/proDetail/230>
> + */
> +
> +#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] = {
> + 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 k230_iomux_reset(DeviceState *dev)
> +{
> + K230IomuxState *s = K230_IOMUX(dev);
> +
> + memcpy(s->regs, k230_iomux_reset_values,
> + sizeof(k230_iomux_reset_values));
> +}
> +
> +static uint64_t k230_iomux_read(void *opaque, hwaddr offset, unsigned size)
> +{
> + K230IomuxState *s = K230_IOMUX(opaque);
> + uint32_t value = 0;
> +
> + if (offset < K230_IOMUX_REGS_SIZE) {
> + value = 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 = K230_IOMUX(opaque);
> +
> + trace_k230_iomux_write(offset, value);
> + if (offset < K230_IOMUX_REGS_SIZE) {
> + s->regs[offset >> 2] = value & K230_IOMUX_WRITABLE_MASK;
> + }
> +}
> +
> +static const MemoryRegionOps k230_iomux_ops = {
> + .read = k230_iomux_read,
> + .write = k230_iomux_write,
> + .endianness = DEVICE_LITTLE_ENDIAN,
> + .valid = {
> + .min_access_size = 4,
> + .max_access_size = 4,
> + .unaligned = false,
> + },
> + .impl = {
> + .min_access_size = 4,
> + .max_access_size = 4,
> + .unaligned = false,
> + },
> +};
> +
> +static void k230_iomux_init(Object *obj)
> +{
> + K230IomuxState *s = 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 = {
> + .name = "k230.iomux",
> + .version_id = 1,
> + .minimum_version_id = 1,
> + .fields = (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 = DEVICE_CLASS(klass);
> +
> + dc->desc = "Kendryte K230 IOMUX";
> + dc->vmsd = &vmstate_k230_iomux;
> + device_class_set_legacy_reset(dc, k230_iomux_reset);
> +}
> +
> +static const TypeInfo k230_iomux_info = {
> + .name = TYPE_K230_IOMUX,
> + .parent = TYPE_SYS_BUS_DEVICE,
> + .instance_size = sizeof(K230IomuxState),
> + .instance_init = k230_iomux_init,
> + .class_init = 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 23265f6035..31e5145a35 100644
> --- a/hw/misc/meson.build
> +++ b/hw/misc/meson.build
> @@ -168,3 +168,5 @@ system_ss.add(when: 'CONFIG_SBSA_REF', if_true: files('sbsa_ec.c'))
>
> # HPPA devices
> system_ss.add(when: 'CONFIG_LASI', if_true: files('lasi.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 size) "reg=0x%x value=0x%"PRI
> iosb_read(int reg, uint64_t value, unsigned int size) "reg=0x%x value=0x%"PRIx64" size=%u"
> iosb_write(int reg, uint64_t value, unsigned int size) "reg=0x%x value=0x%"PRIx64" size=%u"
>
> +# k230_iomux.c
> +k230_iomux_read(uint64_t offset, uint32_t value) "offset=0x%" PRIx64 " value=0x%" PRIx32
> +k230_iomux_write(uint64_t offset, uint64_t value) "offset=0x%" PRIx64 " value=0x%" 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..15a16ef4de
> --- /dev/null
> +++ b/include/hw/misc/k230_iomux.h
> @@ -0,0 +1,34 @@
> +/*
> + * 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_Technical_Reference_Manual_V0.3.1_20241118.pdf
> + *
> + * Copyright (c) 2026 Kangjie Huang <flamboyant.h.01@gmail.com>
> + *
> + * 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))
> +#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 */
> --
> 2.43.0
>
next prev parent reply other threads:[~2026-07-17 13:45 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-14 10:21 [PATCH v2 0/3] hw/riscv/k230: add IOMUX register block model Kangjie Huang
2026-07-14 10:22 ` [PATCH v2 1/3] hw/misc/k230_iomux: add Kendryte K230 IOMUX model Kangjie Huang
2026-07-17 13:44 ` Chao Liu [this message]
2026-07-14 10:22 ` [PATCH v2 2/3] hw/riscv/k230: wire up the IOMUX device Kangjie Huang
2026-07-17 13:45 ` Chao Liu
2026-07-14 10:22 ` [PATCH v2 3/3] tests/qtest: add test for K230 IOMUX Kangjie Huang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aloxy47qh79wHYr9@ChaodeMacBook-Pro.local \
--to=chao.liu@processmission.com \
--cc=alistair.francis@wdc.com \
--cc=daniel.barboza@oss.qualcomm.com \
--cc=farosas@suse.de \
--cc=flamboyant.h.01@gmail.com \
--cc=liwei1518@gmail.com \
--cc=lvivier@redhat.com \
--cc=palmer@dabbelt.com \
--cc=pbonzini@redhat.com \
--cc=pierrick.bouvier@oss.qualcomm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=zhiwei_liu@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.