[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH for-1.5 v2 06/15] xilinx_spips: Trash LQ page cache
From: |
peter . crosthwaite |
Subject: |
[Qemu-devel] [PATCH for-1.5 v2 06/15] xilinx_spips: Trash LQ page cache on mode change |
Date: |
Fri, 19 Apr 2013 12:06:52 +1000 |
From: Peter Crosthwaite <address@hidden>
Invalidate the LQSPI cached page when transitioning into LQSPI mode.
Otherwise there is a possibility that the controller will return stale
data to the guest when transitioning back to LQ_MODE after a page
program.
Signed-off-by: Peter Crosthwaite <address@hidden>
---
changed from v1:
Re-implemented using separate SPI/QSPI write handlers.
hw/ssi/xilinx_spips.c | 26 +++++++++++++++++++++++++-
1 files changed, 25 insertions(+), 1 deletions(-)
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
index e351cb2..6d38111 100644
--- a/hw/ssi/xilinx_spips.c
+++ b/hw/ssi/xilinx_spips.c
@@ -165,6 +165,8 @@ typedef struct {
typedef struct XilinxSPIPSClass {
SysBusDeviceClass parent_class;
+ const MemoryRegionOps *reg_ops;
+
uint32_t rx_fifo_size;
uint32_t tx_fifo_size;
} XilinxSPIPSClass;
@@ -446,6 +448,7 @@ static void xilinx_spips_write(void *opaque, hwaddr addr,
case R_TXD3:
tx_data_bytes(s, (uint32_t)value, 3);
goto no_reg_update;
+ break;
}
s->regs[addr] = (s->regs[addr] & ~mask) | (value & mask);
no_reg_update:
@@ -462,6 +465,25 @@ static const MemoryRegionOps spips_ops = {
.endianness = DEVICE_LITTLE_ENDIAN,
};
+static void xilinx_qspips_write(void *opaque, hwaddr addr,
+ uint64_t value, unsigned size)
+{
+ XilinxQSPIPS *q = XILINX_QSPIPS(opaque);
+
+ xilinx_spips_write(opaque, addr, value, size);
+ addr >>= 2;
+
+ if (addr == R_LQSPI_CFG) {
+ q->lqspi_cached_addr = ~0ULL;
+ }
+}
+
+static const MemoryRegionOps qspips_ops = {
+ .read = xilinx_spips_read,
+ .write = xilinx_qspips_write,
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
#define LQSPI_CACHE_SIZE 1024
static uint64_t
@@ -565,7 +587,7 @@ static void xilinx_spips_realize(DeviceState *dev, Error
**errp)
sysbus_init_irq(sbd, &s->cs_lines[i]);
}
- memory_region_init_io(&s->iomem, &spips_ops, s, "spi", R_MAX*4);
+ memory_region_init_io(&s->iomem, xsc->reg_ops, s, "spi", R_MAX*4);
sysbus_init_mmio(sbd, &s->iomem);
s->irqline = -1;
@@ -629,6 +651,7 @@ static void xilinx_qspips_class_init(ObjectClass *klass,
void * data)
XilinxSPIPSClass *xsc = XILINX_SPIPS_CLASS(klass);
dc->realize = xilinx_qspips_realize;
+ xsc->reg_ops = &qspips_ops;
xsc->rx_fifo_size = RXFF_A_Q;
xsc->tx_fifo_size = TXFF_A_Q;
}
@@ -643,6 +666,7 @@ static void xilinx_spips_class_init(ObjectClass *klass,
void *data)
dc->props = xilinx_spips_properties;
dc->vmsd = &vmstate_xilinx_spips;
+ xsc->reg_ops = &spips_ops;
xsc->rx_fifo_size = RXFF_A;
xsc->tx_fifo_size = TXFF_A;
}
--
1.7.0.4
- [Qemu-devel] [PATCH for-1.5 v2 00/15] Xilinx SPIPS fixes round 2, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 01/15] xilinx_spips: seperate SPI and QSPI as two classes, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 02/15] xilinx_spips: Make interrupts clear on read, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 03/15] xilinx_spips: Inhibit interrupts in LQSPI mode, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 04/15] xilinx_spips: Add verbose LQSPI debug output, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 05/15] xilinx_spips: Fix QSPI FIFO size, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 06/15] xilinx_spips: Trash LQ page cache on mode change,
peter . crosthwaite <=
- [Qemu-devel] [PATCH for-1.5 v2 07/15] xilinx_spips: Add automatic start support, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 08/15] xilinx_spips: Implement automatic CS, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 09/15] xilinx_spips: lqspi: Dont touch config register, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 10/15] xilinx_spips: Fix CTRL register RW bits, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 11/15] xilinx_spips: Fix striping behaviour, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 12/15] xilinx_spips: Debug msgs for Snoop state, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 13/15] xilinx_spips: Multiple debug verbosity levels, peter . crosthwaite, 2013/04/18
- [Qemu-devel] [PATCH for-1.5 v2 14/15] xilinx_spips: lqspi: Push more data to tx-fifo, peter . crosthwaite, 2013/04/18