|
@@ -25,6 +25,7 @@
|
|
|
*/
|
|
|
|
|
|
#include "qemu/osdep.h"
|
|
|
+#include "qapi/error.h"
|
|
|
#include "hw/sysbus.h"
|
|
|
#include "migration/vmstate.h"
|
|
|
#include "qemu/module.h"
|
|
@@ -32,6 +33,7 @@
|
|
|
|
|
|
#include "hw/irq.h"
|
|
|
#include "hw/qdev-properties.h"
|
|
|
+#include "hw/qdev-properties-system.h"
|
|
|
#include "hw/ssi/ssi.h"
|
|
|
#include "qom/object.h"
|
|
|
|
|
@@ -83,6 +85,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(XilinxSPI, XILINX_SPI)
|
|
|
struct XilinxSPI {
|
|
|
SysBusDevice parent_obj;
|
|
|
|
|
|
+ EndianMode model_endianness;
|
|
|
MemoryRegion mmio;
|
|
|
|
|
|
qemu_irq irq;
|
|
@@ -313,14 +316,17 @@ done:
|
|
|
xlx_spi_update_irq(s);
|
|
|
}
|
|
|
|
|
|
-static const MemoryRegionOps spi_ops = {
|
|
|
- .read = spi_read,
|
|
|
- .write = spi_write,
|
|
|
- .endianness = DEVICE_NATIVE_ENDIAN,
|
|
|
- .valid = {
|
|
|
- .min_access_size = 4,
|
|
|
- .max_access_size = 4
|
|
|
- }
|
|
|
+static const MemoryRegionOps spi_ops[2] = {
|
|
|
+ [0 ... 1] = {
|
|
|
+ .read = spi_read,
|
|
|
+ .write = spi_write,
|
|
|
+ .valid = {
|
|
|
+ .min_access_size = 4,
|
|
|
+ .max_access_size = 4,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ [0].endianness = DEVICE_LITTLE_ENDIAN,
|
|
|
+ [1].endianness = DEVICE_BIG_ENDIAN,
|
|
|
};
|
|
|
|
|
|
static void xilinx_spi_realize(DeviceState *dev, Error **errp)
|
|
@@ -329,6 +335,12 @@ static void xilinx_spi_realize(DeviceState *dev, Error **errp)
|
|
|
XilinxSPI *s = XILINX_SPI(dev);
|
|
|
int i;
|
|
|
|
|
|
+ if (s->model_endianness == ENDIAN_MODE_UNSPECIFIED) {
|
|
|
+ error_setg(errp, TYPE_XILINX_SPI " property 'endianness'"
|
|
|
+ " must be set to 'big' or 'little'");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
DB_PRINT("\n");
|
|
|
|
|
|
s->spi = ssi_create_bus(dev, "spi");
|
|
@@ -339,7 +351,8 @@ static void xilinx_spi_realize(DeviceState *dev, Error **errp)
|
|
|
sysbus_init_irq(sbd, &s->cs_lines[i]);
|
|
|
}
|
|
|
|
|
|
- memory_region_init_io(&s->mmio, OBJECT(s), &spi_ops, s,
|
|
|
+ memory_region_init_io(&s->mmio, OBJECT(s),
|
|
|
+ &spi_ops[s->model_endianness == ENDIAN_MODE_BIG], s,
|
|
|
"xilinx-spi", R_MAX * 4);
|
|
|
sysbus_init_mmio(sbd, &s->mmio);
|
|
|
|
|
@@ -362,6 +375,7 @@ static const VMStateDescription vmstate_xilinx_spi = {
|
|
|
};
|
|
|
|
|
|
static const Property xilinx_spi_properties[] = {
|
|
|
+ DEFINE_PROP_ENDIAN_NODEFAULT("endianness", XilinxSPI, model_endianness),
|
|
|
DEFINE_PROP_UINT8("num-ss-bits", XilinxSPI, num_cs, 1),
|
|
|
};
|
|
|
|