[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 6/9] hw/ssi: xilinx_spips: Fix generic fifo dummy cycle handling
From: |
Bin Meng |
Subject: |
[PATCH 6/9] hw/ssi: xilinx_spips: Fix generic fifo dummy cycle handling |
Date: |
Thu, 14 Jan 2021 23:08:59 +0800 |
From: Bin Meng <bin.meng@windriver.com>
The description of the genenic command fifo register says:
When [receive, transmit, data_xfer] = [0,0,1], the [immediate_data]
field represents the number of dummy cycle sent on the SPI interface.
However we should not simply use the programmed value to determine
how many times ssi_transfer() needs to be called to send the dummy
bytes. ssi_transfer() is used to transfer a byte on the line, not
a sigle bit. Previously the m25p80 flash model wronly implemented
the dummy cycles for fast read command on some flashes. Now this
mess is corrected and SPI flash controllers need to be updated to
do the right thing.
According to the example in the ZynqMP manual (ug1085, v2.2 [1])
we need to convert the number of dummy cycles to bytes according to
the SPI mode being used, and transfer the bytes via ssi_transfer().
[1]
https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf
table 24‐22, an example of Generic FIFO Contents for Quad I/O Read Command
(EBh)
Fixes: c95997a39de6 ("xilinx_spips: Add support for the ZynqMP Generic QSPI")
Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com>
Signed-off-by: Bin Meng <bin.meng@windriver.com>
---
hw/ssi/xilinx_spips.c | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
index a897034601..787de60f24 100644
--- a/hw/ssi/xilinx_spips.c
+++ b/hw/ssi/xilinx_spips.c
@@ -191,6 +191,10 @@
FIELD(GQSPI_GF_SNAPSHOT, EXPONENT, 9, 1)
FIELD(GQSPI_GF_SNAPSHOT, DATA_XFER, 8, 1)
FIELD(GQSPI_GF_SNAPSHOT, IMMEDIATE_DATA, 0, 8)
+#define GQSPI_GF_MODE_SPI 1
+#define GQSPI_GF_MODE_DSPI 2
+#define GQSPI_GF_MODE_QSPI 3
+
#define R_GQSPI_MOD_ID (0x1fc / 4)
#define R_GQSPI_MOD_ID_RESET (0x10a0000)
@@ -492,7 +496,30 @@ static void
xlnx_zynqmp_qspips_flush_fifo_g(XlnxZynqMPQSPIPS *s)
}
s->regs[R_GQSPI_DATA_STS] = 1ul << imm;
} else {
- s->regs[R_GQSPI_DATA_STS] = imm;
+ /*
+ * When [receive, transmit, data_xfer] = [0,0,1], it represents
+ * the number of dummy cycle sent on the SPI interface. We need
+ * to convert the number of dummy cycles to bytes according to
+ * the SPI mode being used.
+ *
+ * Ref: ug1085 v2.2 (December 2020) table 24‐22, an example of
+ * Generic FIFO Contents for Quad I/O Read Command (EBh)
+ */
+ if (!ARRAY_FIELD_EX32(s->regs, GQSPI_GF_SNAPSHOT, TRANSMIT) &&
+ !ARRAY_FIELD_EX32(s->regs, GQSPI_GF_SNAPSHOT, RECIEVE)) {
+ uint8_t spi_mode = ARRAY_FIELD_EX32(s->regs,
GQSPI_GF_SNAPSHOT, SPI_MODE);
+ if (spi_mode == GQSPI_GF_MODE_QSPI) {
+ s->regs[R_GQSPI_DATA_STS] = ROUND_UP(imm * 4, 8) / 8;
+ } else if (spi_mode == GQSPI_GF_MODE_DSPI) {
+ s->regs[R_GQSPI_DATA_STS] = ROUND_UP(imm * 2, 8) / 8;
+ } else if (spi_mode == GQSPI_GF_MODE_SPI) {
+ s->regs[R_GQSPI_DATA_STS] = ROUND_UP(imm * 1, 8) / 8;
+ } else {
+ qemu_log_mask(LOG_GUEST_ERROR, "Unknown SPI MODE: 0x%x
", spi_mode);
+ }
+ } else {
+ s->regs[R_GQSPI_DATA_STS] = imm;
+ }
}
}
/* Zero length transfer check */
--
2.25.1
- [PATCH 0/9] hw/block: m25p80: Fix the mess of dummy bytes needed for fast read commands, Bin Meng, 2021/01/14
- [PATCH 1/9] hw/block: m25p80: Fix the number of dummy bytes needed for Windbond flashes, Bin Meng, 2021/01/14
- [PATCH 2/9] hw/block: m25p80: Fix the number of dummy bytes needed for Numonyx/Micron flashes, Bin Meng, 2021/01/14
- [PATCH 3/9] hw/block: m25p80: Fix the number of dummy bytes needed for Macronix flashes, Bin Meng, 2021/01/14
- [PATCH 4/9] hw/block: m25p80: Fix the number of dummy bytes needed for Spansion flashes, Bin Meng, 2021/01/14
- [PATCH 5/9] hw/block: m25p80: Support fast read for SST flashes, Bin Meng, 2021/01/14
- [PATCH 6/9] hw/ssi: xilinx_spips: Fix generic fifo dummy cycle handling,
Bin Meng <=
- [PATCH 7/9] Revert "aspeed/smc: Fix number of dummy cycles for FAST_READ_4 command", Bin Meng, 2021/01/14
- [PATCH 8/9] Revert "aspeed/smc: snoop SPI transfers to fake dummy cycles", Bin Meng, 2021/01/14
- [PATCH 9/9] hw/ssi: npcm7xx_fiu: Correct the dummy cycle emulation logic, Bin Meng, 2021/01/14
- Re: [PATCH 0/9] hw/block: m25p80: Fix the mess of dummy bytes needed for fast read commands, Cédric Le Goater, 2021/01/14
- Re: [PATCH 0/9] hw/block: m25p80: Fix the mess of dummy bytes needed for fast read commands, no-reply, 2021/01/14
- Re: [PATCH 0/9] hw/block: m25p80: Fix the mess of dummy bytes needed for fast read commands, Francisco Iglesias, 2021/01/14