hw/audio/intel-hda: Use memory region alias to reduce .rodata by 4.34MB

The intel-hda model uses an array of register indexed by the
register address. This array also contains a pair of aliased
registers at offset 0x2000. This creates a huge hole in the
array, which ends up eating 4.6MiB of .rodata (size reported
on x86_64 host, building with --extra-cflags=-Os).

By using a memory region alias, we reduce this array to 132kB.

Before:

  (qemu) info mtree
    00000000febd4000-00000000febd7fff (prio 1, i/o): intel-hda

After:

  (qemu) info mtree
    00000000febd4000-00000000febd7fff (prio 1, i/o): intel-hda
    00000000febd4000-00000000febd7fff (prio 1, i/o): intel-hda-container
      00000000febd4000-00000000febd5fff (prio 0, i/o): intel-hda
      00000000febd6000-00000000febd7fff (prio 0, i/o): alias intel-hda-alias @intel-hda 0000000000000000-0000000000001fff

Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Philippe Mathieu-Daudé 2020-03-05 13:45:19 +01:00 committed by Paolo Bonzini
parent 2eea51bd01
commit a9d8ba2be5

View File

@ -181,7 +181,9 @@ struct IntelHDAState {
IntelHDAStream st[8]; IntelHDAStream st[8];
/* state */ /* state */
MemoryRegion container;
MemoryRegion mmio; MemoryRegion mmio;
MemoryRegion alias;
uint32_t rirb_count; uint32_t rirb_count;
int64_t wall_base_ns; int64_t wall_base_ns;
@ -670,12 +672,6 @@ static const struct IntelHDAReg regtab[] = {
.offset = offsetof(IntelHDAState, wall_clk), .offset = offsetof(IntelHDAState, wall_clk),
.rhandler = intel_hda_get_wall_clk, .rhandler = intel_hda_get_wall_clk,
}, },
[ ICH6_REG_WALLCLK + 0x2000 ] = {
.name = "WALLCLK(alias)",
.size = 4,
.offset = offsetof(IntelHDAState, wall_clk),
.rhandler = intel_hda_get_wall_clk,
},
/* dma engine */ /* dma engine */
[ ICH6_REG_CORBLBASE ] = { [ ICH6_REG_CORBLBASE ] = {
@ -837,12 +833,6 @@ static const struct IntelHDAReg regtab[] = {
.size = 4, \ .size = 4, \
.offset = offsetof(IntelHDAState, st[_i].lpib), \ .offset = offsetof(IntelHDAState, st[_i].lpib), \
}, \ }, \
[ ST_REG(_i, ICH6_REG_SD_LPIB) + 0x2000 ] = { \
.stream = _i, \
.name = _t stringify(_i) " LPIB(alias)", \
.size = 4, \
.offset = offsetof(IntelHDAState, st[_i].lpib), \
}, \
[ ST_REG(_i, ICH6_REG_SD_CBL) ] = { \ [ ST_REG(_i, ICH6_REG_SD_CBL) ] = { \
.stream = _i, \ .stream = _i, \
.name = _t stringify(_i) " CBL", \ .name = _t stringify(_i) " CBL", \
@ -1125,9 +1115,15 @@ static void intel_hda_realize(PCIDevice *pci, Error **errp)
error_free(err); error_free(err);
} }
memory_region_init(&d->container, OBJECT(d),
"intel-hda-container", 0x4000);
memory_region_init_io(&d->mmio, OBJECT(d), &intel_hda_mmio_ops, d, memory_region_init_io(&d->mmio, OBJECT(d), &intel_hda_mmio_ops, d,
"intel-hda", 0x4000); "intel-hda", 0x2000);
pci_register_bar(&d->pci, 0, 0, &d->mmio); memory_region_add_subregion(&d->container, 0x0000, &d->mmio);
memory_region_init_alias(&d->alias, OBJECT(d), "intel-hda-alias",
&d->mmio, 0, 0x2000);
memory_region_add_subregion(&d->container, 0x2000, &d->alias);
pci_register_bar(&d->pci, 0, 0, &d->container);
hda_codec_bus_init(DEVICE(pci), &d->codecs, sizeof(d->codecs), hda_codec_bus_init(DEVICE(pci), &d->codecs, sizeof(d->codecs),
intel_hda_response, intel_hda_xfer); intel_hda_response, intel_hda_xfer);