Re: [PATCH v2 1/5] hw/ssi: Add Synopsys DesignWare SSI standard PIO controller
Anirudh Srinivasan <[email protected]> Tue, 4 Aug 2026 13:38:47 -0500
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <itp7xmctqnac4c7kytqyrrs3xbfnbjprem6ezlltc6b5ncdpdn@6pypq3e7lbog> |
On Sun, Aug 02, 2026 at 03:28:44AM +0800, Kangjie Huang wrote: > Add a reusable SysBus model for the Synopsys DesignWare SSI controller. > > Implement the Standard SPI register subset, configurable chip-select and > FIFO resources, the four Standard PIO transfer modes, reset handling, > chip-select GPIOs, and RAZ/WI handling for unsupported enhanced, DMA, > and XIP registers. > > Add num-cs, fifo-depth, and imr-reset properties. Save only Standard PIO > state in VMState and reject migration between devices with different > resource profiles. > > The controller is not instantiated by this patch. > > Signed-off-by: Kangjie Huang <[email protected]> <snip> > --- > hw/ssi/Kconfig | 4 + > hw/ssi/dw_ssi.c | 956 ++++++++++++++++++++++++++++++++++++++++ > hw/ssi/meson.build | 1 + > include/hw/ssi/dw_ssi.h | 62 +++ > 4 files changed, 1023 insertions(+) > create mode 100644 hw/ssi/dw_ssi.c > create mode 100644 include/hw/ssi/dw_ssi.h > > diff --git a/hw/ssi/Kconfig b/hw/ssi/Kconfig > index 1bd56463c1..c48cd2ff6d 100644 > --- a/hw/ssi/Kconfig > +++ b/hw/ssi/Kconfig > @@ -6,6 +6,10 @@ config SIFIVE_SPI > bool > select SSI > > +config DW_SSI > + bool > + select SSI > + > config SSI > bool > > diff --git a/hw/ssi/dw_ssi.c b/hw/ssi/dw_ssi.c > new file mode 100644 > index 0000000000..f9f0e23730 > --- /dev/null > +++ b/hw/ssi/dw_ssi.c > @@ -0,0 +1,956 @@ > +/* > + * Synopsys DesignWare SSI > + * > + * Copyright (c) 2026 Kangjie Huang <[email protected]> > + * > + * SPDX-License-Identifier: GPL-2.0-or-later > + * > + * Emulates the DesignWare SSI controller in Standard SPI mode, > + * covering the PIO/FIFO data path and chip selects. > + */ > + > +#include "qemu/osdep.h" > +#include "hw/core/registerfields.h" > +#include "hw/core/qdev-properties.h" > +#include "hw/core/irq.h" > +#include "hw/ssi/dw_ssi.h" > +#include "migration/vmstate.h" > +#include "qapi/error.h" > +#include "qemu/bitops.h" > +#include "qemu/log.h" > +#include "qemu/module.h" > + > +/* DWC SSI 1.03 derivative (TRM v0.3.1 section 12.3). */ > +#define DW_SSI_CTRLR0_RESET 0x00004007 > +#define DW_SSI_SR_RESET 0x00000006 > +#define DW_SSI_IDR_RESET 0xa1b2c3d5 > +#define DW_SSI_VERSION 0x3130332a > +#define DW_SSI_PIO_TX_BATCH 64 > + > +enum { > + DW_SSI_TMOD_TR, > + DW_SSI_TMOD_TO, > + DW_SSI_TMOD_RO, > + DW_SSI_TMOD_EEPROM_READ, > +}; > + > +REG32(CTRLR0, 0x000) > + FIELD(CTRLR0, DFS, 0, 5) > + FIELD(CTRLR0, FRF, 6, 2) > + FIELD(CTRLR0, SCPH, 8, 1) > + FIELD(CTRLR0, SCPOL, 9, 1) > + FIELD(CTRLR0, TMOD, 10, 2) There are 2 variants of designware spi, one is called dw-apb-ssi and another is called dwc-ssi. If you look at their u-boot drivers, you can see that they differ in the location of the TMOD bits in the CTRLR0. dw-apb-ssi has it at bits 8 and 9, while dwc-ssi has it at 10/11. This implementation is for the dwc-ssi version (which is the newer one). Would it be possible to have the naming be consistent (DWC_SSI, dwc_ssi.c) everywhere? There are some places throught the series where the file names/Kconfig symbols/function names are named dw_ssi. One could argue that this model could retain the generic designware spi name and support both versions, but I don't think that's necessary. Regards Anirudh Srinivasan