hw/intc/aspeed: Introduce dynamic allocation for regs array
Currently, the size of the "regs" array is 0x2000, which is too large. To save code size and avoid mapping large unused gaps, will update it to only map the useful set of registers. This update will support multiple sub-regions with different sizes. To address the redundant size issue, replace the static "regs" array with a dynamically allocated "regs" memory. Introduce a new "aspeed_intc_unrealize" function to free the allocated "regs" memory. Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Link: https://lore.kernel.org/qemu-devel/20250307035945.3698802-4-jamin_lin@aspeedtech.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
0cffaace05
commit
563afea0ae
@ -289,7 +289,7 @@ static void aspeed_intc_reset(DeviceState *dev)
|
|||||||
{
|
{
|
||||||
AspeedINTCState *s = ASPEED_INTC(dev);
|
AspeedINTCState *s = ASPEED_INTC(dev);
|
||||||
|
|
||||||
memset(s->regs, 0, sizeof(s->regs));
|
memset(s->regs, 0, ASPEED_INTC_NR_REGS << 2);
|
||||||
memset(s->enable, 0, sizeof(s->enable));
|
memset(s->enable, 0, sizeof(s->enable));
|
||||||
memset(s->mask, 0, sizeof(s->mask));
|
memset(s->mask, 0, sizeof(s->mask));
|
||||||
memset(s->pending, 0, sizeof(s->pending));
|
memset(s->pending, 0, sizeof(s->pending));
|
||||||
@ -307,6 +307,7 @@ static void aspeed_intc_realize(DeviceState *dev, Error **errp)
|
|||||||
|
|
||||||
sysbus_init_mmio(sbd, &s->iomem_container);
|
sysbus_init_mmio(sbd, &s->iomem_container);
|
||||||
|
|
||||||
|
s->regs = g_new(uint32_t, ASPEED_INTC_NR_REGS);
|
||||||
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_intc_ops, s,
|
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_intc_ops, s,
|
||||||
TYPE_ASPEED_INTC ".regs", ASPEED_INTC_NR_REGS << 2);
|
TYPE_ASPEED_INTC ".regs", ASPEED_INTC_NR_REGS << 2);
|
||||||
|
|
||||||
@ -322,12 +323,21 @@ static void aspeed_intc_realize(DeviceState *dev, Error **errp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void aspeed_intc_unrealize(DeviceState *dev)
|
||||||
|
{
|
||||||
|
AspeedINTCState *s = ASPEED_INTC(dev);
|
||||||
|
|
||||||
|
g_free(s->regs);
|
||||||
|
s->regs = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void aspeed_intc_class_init(ObjectClass *klass, void *data)
|
static void aspeed_intc_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
|
||||||
dc->desc = "ASPEED INTC Controller";
|
dc->desc = "ASPEED INTC Controller";
|
||||||
dc->realize = aspeed_intc_realize;
|
dc->realize = aspeed_intc_realize;
|
||||||
|
dc->unrealize = aspeed_intc_unrealize;
|
||||||
device_class_set_legacy_reset(dc, aspeed_intc_reset);
|
device_class_set_legacy_reset(dc, aspeed_intc_reset);
|
||||||
dc->vmsd = NULL;
|
dc->vmsd = NULL;
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ struct AspeedINTCState {
|
|||||||
MemoryRegion iomem;
|
MemoryRegion iomem;
|
||||||
MemoryRegion iomem_container;
|
MemoryRegion iomem_container;
|
||||||
|
|
||||||
uint32_t regs[ASPEED_INTC_NR_REGS];
|
uint32_t *regs;
|
||||||
OrIRQState orgates[ASPEED_INTC_NR_INTS];
|
OrIRQState orgates[ASPEED_INTC_NR_INTS];
|
||||||
qemu_irq output_pins[ASPEED_INTC_NR_INTS];
|
qemu_irq output_pins[ASPEED_INTC_NR_INTS];
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user