@@ -118,6 +118,7 @@ struct SDHCIClass {
};
uint32_t quirks;
+ uint64_t iomem_size;
};
/*
@@ -1444,6 +1444,8 @@ void sdhci_uninitfn(SDHCIState *s)
void sdhci_common_realize(SDHCIState *s, Error **errp)
{
ERRP_GUARD();
+ SDHCIClass *sc = s->sc;
+ const char *class_name = object_get_typename(OBJECT(s));
switch (s->endianness) {
case DEVICE_LITTLE_ENDIAN:
@@ -1469,8 +1471,9 @@ void sdhci_common_realize(SDHCIState *s, Error **errp)
s->buf_maxsz = sdhci_get_fifolen(s);
s->fifo_buffer = g_malloc0(s->buf_maxsz);
- memory_region_init_io(&s->iomem, OBJECT(s), s->io_ops, s, "sdhci",
- SDHC_REGISTERS_MAP_SIZE);
+ assert(sc->iomem_size >= SDHC_REGISTERS_MAP_SIZE);
+ memory_region_init_io(&s->iomem, OBJECT(s), s->io_ops, s, class_name,
+ sc->iomem_size);
}
void sdhci_common_unrealize(SDHCIState *s)
@@ -1548,10 +1551,13 @@ const VMStateDescription sdhci_vmstate = {
void sdhci_common_class_init(ObjectClass *klass, const void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
+ SDHCIClass *sc = (SDHCIClass *)klass; /* No QOM cast check due to union */
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
dc->vmsd = &sdhci_vmstate;
device_class_set_legacy_reset(dc, sdhci_poweron_reset);
+
+ sc->iomem_size = SDHC_REGISTERS_MAP_SIZE;
}
/* --- qdev SysBus --- */