mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 10:13:56 -06:00
hw/char/xilinx_uartlite: 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 for each machine using the device. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20250213122217.62654-6-philmd@linaro.org>
This commit is contained in:
parent
df1f35ab67
commit
8a8c92c8af
3 changed files with 25 additions and 11 deletions
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/log.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/char/xilinx_uartlite.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
|
@ -57,6 +58,7 @@
|
|||
struct XilinxUARTLite {
|
||||
SysBusDevice parent_obj;
|
||||
|
||||
EndianMode model_endianness;
|
||||
MemoryRegion mmio;
|
||||
CharBackend chr;
|
||||
qemu_irq irq;
|
||||
|
@ -166,17 +168,21 @@ uart_write(void *opaque, hwaddr addr,
|
|||
uart_update_irq(s);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps uart_ops = {
|
||||
.read = uart_read,
|
||||
.write = uart_write,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.valid = {
|
||||
.min_access_size = 1,
|
||||
.max_access_size = 4
|
||||
}
|
||||
static const MemoryRegionOps uart_ops[2] = {
|
||||
[0 ... 1] = {
|
||||
.read = uart_read,
|
||||
.write = uart_write,
|
||||
.valid = {
|
||||
.min_access_size = 1,
|
||||
.max_access_size = 4,
|
||||
},
|
||||
},
|
||||
[0].endianness = DEVICE_LITTLE_ENDIAN,
|
||||
[1].endianness = DEVICE_BIG_ENDIAN,
|
||||
};
|
||||
|
||||
static const Property xilinx_uartlite_properties[] = {
|
||||
DEFINE_PROP_ENDIAN_NODEFAULT("endianness", XilinxUARTLite, model_endianness),
|
||||
DEFINE_PROP_CHR("chardev", XilinxUARTLite, chr),
|
||||
};
|
||||
|
||||
|
@ -214,6 +220,15 @@ static void xilinx_uartlite_realize(DeviceState *dev, Error **errp)
|
|||
{
|
||||
XilinxUARTLite *s = XILINX_UARTLITE(dev);
|
||||
|
||||
if (s->model_endianness == ENDIAN_MODE_UNSPECIFIED) {
|
||||
error_setg(errp, TYPE_XILINX_UARTLITE " property 'endianness'"
|
||||
" must be set to 'big' or 'little'");
|
||||
return;
|
||||
}
|
||||
|
||||
memory_region_init_io(&s->mmio, OBJECT(dev),
|
||||
&uart_ops[s->model_endianness == ENDIAN_MODE_BIG],
|
||||
s, "xlnx.xps-uartlite", R_MAX * 4);
|
||||
qemu_chr_fe_set_handlers(&s->chr, uart_can_rx, uart_rx,
|
||||
uart_event, NULL, s, NULL, true);
|
||||
}
|
||||
|
@ -223,9 +238,6 @@ static void xilinx_uartlite_init(Object *obj)
|
|||
XilinxUARTLite *s = XILINX_UARTLITE(obj);
|
||||
|
||||
sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
|
||||
|
||||
memory_region_init_io(&s->mmio, obj, &uart_ops, s,
|
||||
"xlnx.xps-uartlite", R_MAX * 4);
|
||||
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue