On Wed, 22 Jan 2025 07:56:24 +0100 Philippe Mathieu-Daudé <[email protected]> wrote:
> Map the component I/O region as UnimplementedDevice > to be able to trace guest I/O accesses with '-d unimp'. > > Signed-off-by: Philippe Mathieu-Daudé <[email protected]> I'm not that familiar with this infrastructure but seems fine to me. I'd definitely be curious if anything is touching this space so tracing may be helpful for that! Reviewed-by: Jonathan Cameron <[email protected]> > --- > include/hw/cxl/cxl_component.h | 3 ++- > hw/cxl/cxl-component-utils.c | 14 +++++++++++--- > hw/cxl/Kconfig | 1 + > 3 files changed, 14 insertions(+), 4 deletions(-) > > diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h > index ac61c3f33a5..54fd369a838 100644 > --- a/include/hw/cxl/cxl_component.h > +++ b/include/hw/cxl/cxl_component.h > @@ -18,6 +18,7 @@ > #include "qemu/range.h" > #include "hw/cxl/cxl_cdat.h" > #include "hw/register.h" > +#include "hw/misc/unimp.h" > #include "qapi/error.h" > > enum reg_type { > @@ -218,7 +219,7 @@ typedef struct component_registers { > * 0xe000 - 0xe3ff CXL ARB/MUX registers > * 0xe400 - 0xffff RSVD > */ > - MemoryRegion io; > + UnimplementedDeviceState io; > > uint32_t cache_mem_registers[CXL2_COMPONENT_CM_REGION_SIZE >> 2]; > uint32_t cache_mem_regs_write_mask[CXL2_COMPONENT_CM_REGION_SIZE >> 2]; > diff --git a/hw/cxl/cxl-component-utils.c b/hw/cxl/cxl-component-utils.c > index cd116c04012..6d593475d00 100644 > --- a/hw/cxl/cxl-component-utils.c > +++ b/hw/cxl/cxl-component-utils.c > @@ -192,17 +192,25 @@ void cxl_component_register_block_init(Object *obj, > const char *type) > { > ComponentRegisters *cregs = &cxl_cstate->crb; > + DeviceState *io_dev; > + SysBusDevice *io_sbd; > > memory_region_init(&cregs->component_registers, obj, type, > CXL2_COMPONENT_BLOCK_SIZE); > > /* io registers controls link which we don't care about in QEMU */ > - memory_region_init_io(&cregs->io, obj, NULL, NULL, ".io", > - CXL2_COMPONENT_IO_REGION_SIZE); > + object_initialize_child(obj, "io", &cregs->io, > TYPE_UNIMPLEMENTED_DEVICE); > + io_dev = DEVICE(&cregs->io); > + io_sbd = SYS_BUS_DEVICE(&cregs->io); > + qdev_prop_set_string(io_dev, "name", ".io"); > + qdev_prop_set_uint64(io_dev, "size", CXL2_COMPONENT_IO_REGION_SIZE); > + sysbus_realize(io_sbd, &error_fatal); > + > memory_region_init_io(&cregs->cache_mem, obj, &cache_mem_ops, cxl_cstate, > ".cache_mem", CXL2_COMPONENT_CM_REGION_SIZE); > > - memory_region_add_subregion(&cregs->component_registers, 0, &cregs->io); > + memory_region_add_subregion(&cregs->component_registers, 0, > + sysbus_mmio_get_region(io_sbd, 0)); > memory_region_add_subregion(&cregs->component_registers, > CXL2_COMPONENT_IO_REGION_SIZE, > &cregs->cache_mem); > diff --git a/hw/cxl/Kconfig b/hw/cxl/Kconfig > index 8e67519b161..d6c7536001e 100644 > --- a/hw/cxl/Kconfig > +++ b/hw/cxl/Kconfig > @@ -1,3 +1,4 @@ > config CXL > bool > default y if PCI_EXPRESS > + select UNIMP
