qemu/hw/i2c
Markus Armbruster 32c82f0eaf smbus: Fix spd_data_generate() for number of banks > 2
spd_data_generate() splits @ram_size bytes into @nbanks RAM banks of
1 << sz_log2 MiB each, like this:

    size = ram_size >> 20; /* work in terms of megabytes */
    [...]
    nbanks = 1;
    while (sz_log2 > max_log2 && nbanks < 8) {
        sz_log2--;
        nbanks++;
    }

Each iteration halves the size of a bank, and increments the number of
banks.  Wrong: it should double the number of banks.

The bug goes back all the way to commit b296b664ab "smbus: Add a
helper to generate SPD EEPROM data".

It can't bite because spd_data_generate()'s current users pass only
@ram_size that result in *zero* iterations:

    machine     RAM size    #banks  type    bank size
    fulong2e     256 MiB         1   DDR      256 MiB
    sam460ex    2048 MiB         1   DDR2    2048 MiB
                1024 MiB         1   DDR2    1024 MiB
                 512 MiB         1   DDR2     512 MiB
                 256 MiB         1   DDR2     256 MiB
                 128 MiB         1   SDR      128 MiB
                  64 MiB         1   SDR       64 MiB
                  32 MiB         1   SDR       32 MiB

Apply the obvious, minimal fix.  I admit I'm tempted to rip out the
unused (and obviously untested) feature instead, because YAGNI.

Note that this is not the final result, as spd_data_generate() next
increases #banks from 1 to 2 if possible.  This is done "to avoid a
bug in MIPS Malta firmware".  We don't even use this function with
machine type malta.  *Shrug*

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20200422134815.1584-5-armbru@redhat.com>
2020-04-29 08:01:52 +02:00
..
aspeed_i2c.c aspeed/i2c: Prevent uninitialized warning 2020-02-06 11:13:24 +01:00
bitbang_i2c.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
core.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
exynos4210_i2c.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
imx_i2c.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
Kconfig
Makefile.objs hw/*/Makefile.objs: Move many .o files to common-objs 2020-02-04 09:00:57 +01:00
microbit_i2c.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
mpc_i2c.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
omap_i2c.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
pm_smbus.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
ppc4xx_i2c.c hw/*/Makefile.objs: Move many .o files to common-objs 2020-02-04 09:00:57 +01:00
smbus_eeprom.c smbus: Fix spd_data_generate() for number of banks > 2 2020-04-29 08:01:52 +02:00
smbus_ich9.c hw/i2c/smbus_ich9: Include "qemu/range.h" 2020-03-09 15:59:31 +01:00
smbus_master.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
smbus_slave.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
trace-events aspeed/i2c: Add trace events 2019-12-16 10:46:34 +00:00
versatile_i2c.c