[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 3/8] fw_cfg: introduce the "data_memwidth" proper
From: |
Laszlo Ersek |
Subject: |
[Qemu-devel] [PATCH v4 3/8] fw_cfg: introduce the "data_memwidth" property |
Date: |
Fri, 12 Dec 2014 16:58:47 +0100 |
The "data_memwidth" property is capable of changing the maximum valid
access size to the MMIO data register, and (corresponding to the previous
patch) resizes the memory region similarly, at device realization time.
(Because "data_iomem" is configured and installed dynamically now, we must
delay those steps to the realize callback.)
The default value of "data_memwidth" is set so that we don't yet diverge
from "fw_cfg_data_mem_ops".
Most of the fw_cfg users will stick with the default, and for them we
should continue using the statically allocated "fw_cfg_data_mem_ops". This
is beneficial for debugging because gdb can resolve pointers referencing
static objects to the names of those objects.
Signed-off-by: Laszlo Ersek <address@hidden>
---
Notes:
v4:
- reject I/O port combining if data register is wider than 1 byte
[Peter]
v3:
- new in v3 [Drew Jones]
hw/nvram/fw_cfg.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index eb0ad83..0947136 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -50,8 +50,9 @@ struct FWCfgState {
/*< public >*/
MemoryRegion ctl_iomem, data_iomem, comb_iomem;
uint32_t ctl_iobase, data_iobase;
+ uint32_t data_memwidth;
FWCfgEntry entries[2][FW_CFG_MAX_ENTRY];
FWCfgFiles *files;
uint16_t cur_entry;
uint32_t cur_offset;
@@ -569,8 +570,10 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t
data_port,
dev = qdev_create(NULL, TYPE_FW_CFG);
qdev_prop_set_uint32(dev, "ctl_iobase", ctl_port);
qdev_prop_set_uint32(dev, "data_iobase", data_port);
+ qdev_prop_set_uint32(dev, "data_memwidth",
+ fw_cfg_data_mem_ops.valid.max_access_size);
d = SYS_BUS_DEVICE(dev);
s = FW_CFG(dev);
@@ -607,12 +610,8 @@ static void fw_cfg_initfn(Object *obj)
memory_region_init_io(&s->ctl_iomem, OBJECT(s), &fw_cfg_ctl_mem_ops, s,
"fwcfg.ctl", FW_CFG_SIZE);
sysbus_init_mmio(sbd, &s->ctl_iomem);
- memory_region_init_io(&s->data_iomem, OBJECT(s), &fw_cfg_data_mem_ops, s,
- "fwcfg.data",
- fw_cfg_data_mem_ops.valid.max_access_size);
- sysbus_init_mmio(sbd, &s->data_iomem);
/* In case ctl and data overlap: */
memory_region_init_io(&s->comb_iomem, OBJECT(s), &fw_cfg_comb_mem_ops, s,
"fwcfg", FW_CFG_SIZE);
}
@@ -620,19 +619,31 @@ static void fw_cfg_initfn(Object *obj)
static void fw_cfg_realize(DeviceState *dev, Error **errp)
{
FWCfgState *s = FW_CFG(dev);
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+ const MemoryRegionOps *data_mem_ops = &fw_cfg_data_mem_ops;
uint32_t ctl_io_last;
uint32_t data_io_end;
+ if (s->data_memwidth > data_mem_ops->valid.max_access_size) {
+ MemoryRegionOps *ops;
+
+ ops = g_memdup(data_mem_ops, sizeof(*data_mem_ops));
+ ops->valid.max_access_size = s->data_memwidth;
+ data_mem_ops = ops;
+ }
+ memory_region_init_io(&s->data_iomem, OBJECT(s), data_mem_ops, s,
+ "fwcfg.data", data_mem_ops->valid.max_access_size);
+ sysbus_init_mmio(sbd, &s->data_iomem);
+
if (s->ctl_iobase == 0 && s->data_iobase == 0) {
return;
}
ctl_io_last = s->ctl_iobase + FW_CFG_SIZE - 1;
- data_io_end = s->data_iobase + fw_cfg_data_mem_ops.valid.max_access_size;
+ data_io_end = s->data_iobase + data_mem_ops->valid.max_access_size;
if (ctl_io_last >= s->data_iobase && ctl_io_last < data_io_end) {
- if (fw_cfg_data_mem_ops.valid.max_access_size == 1) {
+ if (data_mem_ops->valid.max_access_size == 1) {
sysbus_add_io(sbd, s->ctl_iobase, &s->comb_iomem);
} else {
error_setg(errp, "only a byte-wide data I/O port can be combined");
return;
@@ -649,8 +660,9 @@ static void fw_cfg_realize(DeviceState *dev, Error **errp)
static Property fw_cfg_properties[] = {
DEFINE_PROP_UINT32("ctl_iobase", FWCfgState, ctl_iobase, -1),
DEFINE_PROP_UINT32("data_iobase", FWCfgState, data_iobase, -1),
+ DEFINE_PROP_UINT32("data_memwidth", FWCfgState, data_memwidth, -1),
DEFINE_PROP_END_OF_LIST(),
};
FWCfgState *fw_cfg_find(void)
--
1.8.3.1
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, (continued)
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Laszlo Ersek, 2014/12/16
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Paolo Bonzini, 2014/12/16
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Peter Maydell, 2014/12/16
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Laszlo Ersek, 2014/12/17
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Paolo Bonzini, 2014/12/17
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Alexander Graf, 2014/12/17
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Peter Maydell, 2014/12/16
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Laszlo Ersek, 2014/12/17
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Alexander Graf, 2014/12/17
- Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg, Laszlo Ersek, 2014/12/17
[Qemu-devel] [PATCH v4 3/8] fw_cfg: introduce the "data_memwidth" property,
Laszlo Ersek <=
- Re: [Qemu-devel] [PATCH v4 3/8] fw_cfg: introduce the "data_memwidth" property, Alexander Graf, 2014/12/16
- Re: [Qemu-devel] [PATCH v4 3/8] fw_cfg: introduce the "data_memwidth" property, Laszlo Ersek, 2014/12/16
- Re: [Qemu-devel] [PATCH v4 3/8] fw_cfg: introduce the "data_memwidth" property, Laszlo Ersek, 2014/12/16
- Re: [Qemu-devel] [PATCH v4 3/8] fw_cfg: introduce the "data_memwidth" property, Peter Maydell, 2014/12/16
- Re: [Qemu-devel] [PATCH v4 3/8] fw_cfg: introduce the "data_memwidth" property, Alexander Graf, 2014/12/16
- Re: [Qemu-devel] [PATCH v4 3/8] fw_cfg: introduce the "data_memwidth" property, Laszlo Ersek, 2014/12/16
[Qemu-devel] [PATCH v4 2/8] fw_cfg: generalize overlap check for combining control and data I/O ports, Laszlo Ersek, 2014/12/12
[Qemu-devel] [PATCH v4 4/8] fw_cfg: expose the "data_memwidth" prop with fw_cfg_init_data_memwidth(), Laszlo Ersek, 2014/12/12
[Qemu-devel] [PATCH v4 5/8] arm: add fw_cfg to "virt" board, Laszlo Ersek, 2014/12/12
[Qemu-devel] [PATCH v4 6/8] hw/loader: split out load_image_gzipped_buffer(), Laszlo Ersek, 2014/12/12