mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
hw/ssi/xilinx_spi: Make device endianness configurable
Replace the DEVICE_NATIVE_ENDIAN MemoryRegionOps by a pair of DEVICE_LITTLE_ENDIAN / DEVICE_BIG_ENDIAN. Add the "endianness" property to select the device endianness. This property is unspecified by default, and machines need to set it explicitly. Set the proper endianness on the single machine using the device. Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20250213122217.62654-7-philmd@linaro.org>
This commit is contained in:
parent
8a8c92c8af
commit
e87c93df11
2 changed files with 24 additions and 9 deletions
|
@ -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),
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue