cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

aspeed.c (49869B)


      1/*
      2 * OpenPOWER Palmetto BMC
      3 *
      4 * Andrew Jeffery <andrew@aj.id.au>
      5 *
      6 * Copyright 2016 IBM Corp.
      7 *
      8 * This code is licensed under the GPL version 2 or later.  See
      9 * the COPYING file in the top-level directory.
     10 */
     11
     12#include "qemu/osdep.h"
     13#include "qapi/error.h"
     14#include "hw/arm/boot.h"
     15#include "hw/arm/aspeed.h"
     16#include "hw/arm/aspeed_soc.h"
     17#include "hw/i2c/i2c_mux_pca954x.h"
     18#include "hw/i2c/smbus_eeprom.h"
     19#include "hw/misc/pca9552.h"
     20#include "hw/sensor/tmp105.h"
     21#include "hw/misc/led.h"
     22#include "hw/qdev-properties.h"
     23#include "sysemu/block-backend.h"
     24#include "hw/loader.h"
     25#include "qemu/error-report.h"
     26#include "qemu/units.h"
     27
     28static struct arm_boot_info aspeed_board_binfo = {
     29    .board_id = -1, /* device-tree-only board */
     30};
     31
     32struct AspeedMachineState {
     33    /* Private */
     34    MachineState parent_obj;
     35    /* Public */
     36
     37    AspeedSoCState soc;
     38    MemoryRegion ram_container;
     39    MemoryRegion max_ram;
     40    bool mmio_exec;
     41    char *fmc_model;
     42    char *spi_model;
     43};
     44
     45/* Palmetto hardware value: 0x120CE416 */
     46#define PALMETTO_BMC_HW_STRAP1 (                                        \
     47        SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
     48        SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
     49        SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
     50        SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
     51        SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
     52        SCU_HW_STRAP_LPC_RESET_PIN |                                    \
     53        SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
     54        SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
     55        SCU_HW_STRAP_SPI_WIDTH |                                        \
     56        SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
     57        SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
     58
     59/* TODO: Find the actual hardware value */
     60#define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
     61        SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
     62        SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
     63        SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
     64        SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
     65        SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
     66        SCU_HW_STRAP_LPC_RESET_PIN |                                    \
     67        SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
     68        SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
     69        SCU_HW_STRAP_SPI_WIDTH |                                        \
     70        SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
     71        SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
     72
     73/* AST2500 evb hardware value: 0xF100C2E6 */
     74#define AST2500_EVB_HW_STRAP1 ((                                        \
     75        AST2500_HW_STRAP1_DEFAULTS |                                    \
     76        SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
     77        SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
     78        SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
     79        SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
     80        SCU_HW_STRAP_MAC1_RGMII |                                       \
     81        SCU_HW_STRAP_MAC0_RGMII) &                                      \
     82        ~SCU_HW_STRAP_2ND_BOOT_WDT)
     83
     84/* Romulus hardware value: 0xF10AD206 */
     85#define ROMULUS_BMC_HW_STRAP1 (                                         \
     86        AST2500_HW_STRAP1_DEFAULTS |                                    \
     87        SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
     88        SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
     89        SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
     90        SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
     91        SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
     92        SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
     93
     94/* Sonorapass hardware value: 0xF100D216 */
     95#define SONORAPASS_BMC_HW_STRAP1 (                                      \
     96        SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
     97        SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
     98        SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
     99        SCU_AST2500_HW_STRAP_RESERVED28 |                               \
    100        SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
    101        SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
    102        SCU_HW_STRAP_LPC_RESET_PIN |                                    \
    103        SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
    104        SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
    105        SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
    106        SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
    107        SCU_AST2500_HW_STRAP_RESERVED1)
    108
    109/* Swift hardware value: 0xF11AD206 */
    110#define SWIFT_BMC_HW_STRAP1 (                                           \
    111        AST2500_HW_STRAP1_DEFAULTS |                                    \
    112        SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
    113        SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
    114        SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
    115        SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
    116        SCU_H_PLL_BYPASS_EN |                                           \
    117        SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
    118        SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
    119
    120#define G220A_BMC_HW_STRAP1 (                                      \
    121        SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
    122        SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
    123        SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
    124        SCU_AST2500_HW_STRAP_RESERVED28 |                               \
    125        SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
    126        SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
    127        SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
    128        SCU_HW_STRAP_LPC_RESET_PIN |                                    \
    129        SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
    130        SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
    131        SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
    132        SCU_AST2500_HW_STRAP_RESERVED1)
    133
    134/* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
    135#define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
    136
    137/* Quanta-Q71l hardware value */
    138#define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
    139        SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
    140        SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
    141        SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
    142        SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
    143        SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
    144        SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
    145        SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
    146        SCU_HW_STRAP_SPI_WIDTH |                                        \
    147        SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
    148        SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
    149
    150/* AST2600 evb hardware value */
    151#define AST2600_EVB_HW_STRAP1 0x000000C0
    152#define AST2600_EVB_HW_STRAP2 0x00000003
    153
    154/* Tacoma hardware value */
    155#define TACOMA_BMC_HW_STRAP1  0x00000000
    156#define TACOMA_BMC_HW_STRAP2  0x00000040
    157
    158/* Rainier hardware value: (QEMU prototype) */
    159#define RAINIER_BMC_HW_STRAP1 0x00000000
    160#define RAINIER_BMC_HW_STRAP2 0x00000000
    161
    162/* Fuji hardware value */
    163#define FUJI_BMC_HW_STRAP1    0x00000000
    164#define FUJI_BMC_HW_STRAP2    0x00000000
    165
    166/*
    167 * The max ram region is for firmwares that scan the address space
    168 * with load/store to guess how much RAM the SoC has.
    169 */
    170static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size)
    171{
    172    return 0;
    173}
    174
    175static void max_ram_write(void *opaque, hwaddr offset, uint64_t value,
    176                           unsigned size)
    177{
    178    /* Discard writes */
    179}
    180
    181static const MemoryRegionOps max_ram_ops = {
    182    .read = max_ram_read,
    183    .write = max_ram_write,
    184    .endianness = DEVICE_NATIVE_ENDIAN,
    185};
    186
    187#define AST_SMP_MAILBOX_BASE            0x1e6e2180
    188#define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
    189#define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
    190#define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
    191#define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
    192#define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
    193#define AST_SMP_MBOX_GOSIGN             0xabbaab00
    194
    195static void aspeed_write_smpboot(ARMCPU *cpu,
    196                                 const struct arm_boot_info *info)
    197{
    198    static const uint32_t poll_mailbox_ready[] = {
    199        /*
    200         * r2 = per-cpu go sign value
    201         * r1 = AST_SMP_MBOX_FIELD_ENTRY
    202         * r0 = AST_SMP_MBOX_FIELD_GOSIGN
    203         */
    204        0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
    205        0xe21000ff,  /* ands    r0, r0, #255          */
    206        0xe59f201c,  /* ldr     r2, [pc, #28]         */
    207        0xe1822000,  /* orr     r2, r2, r0            */
    208
    209        0xe59f1018,  /* ldr     r1, [pc, #24]         */
    210        0xe59f0018,  /* ldr     r0, [pc, #24]         */
    211
    212        0xe320f002,  /* wfe                           */
    213        0xe5904000,  /* ldr     r4, [r0]              */
    214        0xe1520004,  /* cmp     r2, r4                */
    215        0x1afffffb,  /* bne     <wfe>                 */
    216        0xe591f000,  /* ldr     pc, [r1]              */
    217        AST_SMP_MBOX_GOSIGN,
    218        AST_SMP_MBOX_FIELD_ENTRY,
    219        AST_SMP_MBOX_FIELD_GOSIGN,
    220    };
    221
    222    rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
    223                       sizeof(poll_mailbox_ready),
    224                       info->smp_loader_start);
    225}
    226
    227static void aspeed_reset_secondary(ARMCPU *cpu,
    228                                   const struct arm_boot_info *info)
    229{
    230    AddressSpace *as = arm_boot_address_space(cpu, info);
    231    CPUState *cs = CPU(cpu);
    232
    233    /* info->smp_bootreg_addr */
    234    address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
    235                               MEMTXATTRS_UNSPECIFIED, NULL);
    236    cpu_set_pc(cs, info->smp_loader_start);
    237}
    238
    239#define FIRMWARE_ADDR 0x0
    240
    241static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
    242                           Error **errp)
    243{
    244    BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
    245    uint8_t *storage;
    246    int64_t size;
    247
    248    /* The block backend size should have already been 'validated' by
    249     * the creation of the m25p80 object.
    250     */
    251    size = blk_getlength(blk);
    252    if (size <= 0) {
    253        error_setg(errp, "failed to get flash size");
    254        return;
    255    }
    256
    257    if (rom_size > size) {
    258        rom_size = size;
    259    }
    260
    261    storage = g_new0(uint8_t, rom_size);
    262    if (blk_pread(blk, 0, storage, rom_size) < 0) {
    263        error_setg(errp, "failed to read the initial flash content");
    264        return;
    265    }
    266
    267    rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
    268    g_free(storage);
    269}
    270
    271static void aspeed_board_init_flashes(AspeedSMCState *s,
    272                                      const char *flashtype)
    273{
    274    int i ;
    275
    276    for (i = 0; i < s->num_cs; ++i) {
    277        DriveInfo *dinfo = drive_get_next(IF_MTD);
    278        qemu_irq cs_line;
    279        DeviceState *dev;
    280
    281        dev = qdev_new(flashtype);
    282        if (dinfo) {
    283            qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
    284        }
    285        qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
    286
    287        cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
    288        sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
    289    }
    290}
    291
    292static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
    293{
    294        DeviceState *card;
    295
    296        if (!dinfo) {
    297            return;
    298        }
    299        card = qdev_new(TYPE_SD_CARD);
    300        qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
    301                                &error_fatal);
    302        qdev_realize_and_unref(card,
    303                               qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
    304                               &error_fatal);
    305}
    306
    307static void aspeed_machine_init(MachineState *machine)
    308{
    309    AspeedMachineState *bmc = ASPEED_MACHINE(machine);
    310    AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
    311    AspeedSoCClass *sc;
    312    DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
    313    ram_addr_t max_ram_size;
    314    int i;
    315    NICInfo *nd = &nd_table[0];
    316
    317    memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
    318                       4 * GiB);
    319    memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
    320
    321    object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
    322
    323    sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
    324
    325    /*
    326     * This will error out if isize is not supported by memory controller.
    327     */
    328    object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
    329                             &error_fatal);
    330
    331    for (i = 0; i < sc->macs_num; i++) {
    332        if ((amc->macs_mask & (1 << i)) && nd->used) {
    333            qemu_check_nic_model(nd, TYPE_FTGMAC100);
    334            qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
    335            nd++;
    336        }
    337    }
    338
    339    object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
    340                            &error_abort);
    341    object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
    342                            &error_abort);
    343    object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs,
    344                            &error_abort);
    345    object_property_set_link(OBJECT(&bmc->soc), "dram",
    346                             OBJECT(machine->ram), &error_abort);
    347    if (machine->kernel_filename) {
    348        /*
    349         * When booting with a -kernel command line there is no u-boot
    350         * that runs to unlock the SCU. In this case set the default to
    351         * be unlocked as the kernel expects
    352         */
    353        object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
    354                                ASPEED_SCU_PROT_KEY, &error_abort);
    355    }
    356    qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
    357                         amc->uart_default);
    358    qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
    359
    360    memory_region_add_subregion(get_system_memory(),
    361                                sc->memmap[ASPEED_DEV_SDRAM],
    362                                &bmc->ram_container);
    363
    364    max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
    365                                            &error_abort);
    366    memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL,
    367                          "max_ram", max_ram_size  - machine->ram_size);
    368    memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram);
    369
    370    aspeed_board_init_flashes(&bmc->soc.fmc, bmc->fmc_model ?
    371                              bmc->fmc_model : amc->fmc_model);
    372    aspeed_board_init_flashes(&bmc->soc.spi[0], bmc->spi_model ?
    373                              bmc->spi_model : amc->spi_model);
    374
    375    /* Install first FMC flash content as a boot rom. */
    376    if (drive0) {
    377        AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
    378        MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
    379        uint64_t size = memory_region_size(&fl->mmio);
    380
    381        /*
    382         * create a ROM region using the default mapping window size of
    383         * the flash module. The window size is 64MB for the AST2400
    384         * SoC and 128MB for the AST2500 SoC, which is twice as big as
    385         * needed by the flash modules of the Aspeed machines.
    386         */
    387        if (ASPEED_MACHINE(machine)->mmio_exec) {
    388            memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
    389                                     &fl->mmio, 0, size);
    390            memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
    391                                        boot_rom);
    392        } else {
    393            memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
    394                                   size, &error_abort);
    395            memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
    396                                        boot_rom);
    397            write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
    398        }
    399    }
    400
    401    if (machine->kernel_filename && sc->num_cpus > 1) {
    402        /* With no u-boot we must set up a boot stub for the secondary CPU */
    403        MemoryRegion *smpboot = g_new(MemoryRegion, 1);
    404        memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
    405                               0x80, &error_abort);
    406        memory_region_add_subregion(get_system_memory(),
    407                                    AST_SMP_MAILBOX_BASE, smpboot);
    408
    409        aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
    410        aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
    411        aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
    412    }
    413
    414    aspeed_board_binfo.ram_size = machine->ram_size;
    415    aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
    416    aspeed_board_binfo.nb_cpus = sc->num_cpus;
    417
    418    if (amc->i2c_init) {
    419        amc->i2c_init(bmc);
    420    }
    421
    422    for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
    423        sdhci_attach_drive(&bmc->soc.sdhci.slots[i], drive_get_next(IF_SD));
    424    }
    425
    426    if (bmc->soc.emmc.num_slots) {
    427        sdhci_attach_drive(&bmc->soc.emmc.slots[0], drive_get_next(IF_SD));
    428    }
    429
    430    arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
    431}
    432
    433static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
    434{
    435    AspeedSoCState *soc = &bmc->soc;
    436    DeviceState *dev;
    437    uint8_t *eeprom_buf = g_malloc0(32 * 1024);
    438
    439    /* The palmetto platform expects a ds3231 RTC but a ds1338 is
    440     * enough to provide basic RTC features. Alarms will be missing */
    441    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
    442
    443    smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
    444                          eeprom_buf);
    445
    446    /* add a TMP423 temperature sensor */
    447    dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
    448                                         "tmp423", 0x4c));
    449    object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
    450    object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
    451    object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
    452    object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
    453}
    454
    455static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
    456{
    457    AspeedSoCState *soc = &bmc->soc;
    458
    459    /*
    460     * The quanta-q71l platform expects tmp75s which are compatible with
    461     * tmp105s.
    462     */
    463    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
    464    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
    465    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
    466
    467    /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
    468    /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
    469    /* TODO: Add Memory Riser i2c mux and eeproms. */
    470
    471    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
    472    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
    473
    474    /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
    475
    476    /* i2c-7 */
    477    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
    478    /*        - i2c@0: pmbus@59 */
    479    /*        - i2c@1: pmbus@58 */
    480    /*        - i2c@2: pmbus@58 */
    481    /*        - i2c@3: pmbus@59 */
    482
    483    /* TODO: i2c-7: Add PDB FRU eeprom@52 */
    484    /* TODO: i2c-8: Add BMC FRU eeprom@50 */
    485}
    486
    487static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
    488{
    489    AspeedSoCState *soc = &bmc->soc;
    490    uint8_t *eeprom_buf = g_malloc0(8 * 1024);
    491
    492    smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
    493                          eeprom_buf);
    494
    495    /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
    496    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
    497                     TYPE_TMP105, 0x4d);
    498
    499    /* The AST2500 EVB does not have an RTC. Let's pretend that one is
    500     * plugged on the I2C bus header */
    501    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
    502}
    503
    504static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
    505{
    506    /* Start with some devices on our I2C busses */
    507    ast2500_evb_i2c_init(bmc);
    508}
    509
    510static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
    511{
    512    AspeedSoCState *soc = &bmc->soc;
    513
    514    /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
    515     * good enough */
    516    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
    517}
    518
    519static void swift_bmc_i2c_init(AspeedMachineState *bmc)
    520{
    521    AspeedSoCState *soc = &bmc->soc;
    522
    523    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x60);
    524
    525    /* The swift board expects a TMP275 but a TMP105 is compatible */
    526    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "tmp105", 0x48);
    527    /* The swift board expects a pca9551 but a pca9552 is compatible */
    528    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60);
    529
    530    /* The swift board expects an Epson RX8900 RTC but a ds1338 is compatible */
    531    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "ds1338", 0x32);
    532    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
    533
    534    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
    535    /* The swift board expects a pca9539 but a pca9552 is compatible */
    536    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "pca9552", 0x74);
    537
    538    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
    539    /* The swift board expects a pca9539 but a pca9552 is compatible */
    540    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "pca9552",
    541                     0x74);
    542
    543    /* The swift board expects a TMP275 but a TMP105 is compatible */
    544    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x48);
    545    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x4a);
    546}
    547
    548static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
    549{
    550    AspeedSoCState *soc = &bmc->soc;
    551
    552    /* bus 2 : */
    553    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
    554    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
    555    /* bus 2 : pca9546 @ 0x73 */
    556
    557    /* bus 3 : pca9548 @ 0x70 */
    558
    559    /* bus 4 : */
    560    uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
    561    smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
    562                          eeprom4_54);
    563    /* PCA9539 @ 0x76, but PCA9552 is compatible */
    564    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76);
    565    /* PCA9539 @ 0x77, but PCA9552 is compatible */
    566    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77);
    567
    568    /* bus 6 : */
    569    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
    570    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
    571    /* bus 6 : pca9546 @ 0x73 */
    572
    573    /* bus 8 : */
    574    uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
    575    smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
    576                          eeprom8_56);
    577    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
    578    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
    579    /* bus 8 : adc128d818 @ 0x1d */
    580    /* bus 8 : adc128d818 @ 0x1f */
    581
    582    /*
    583     * bus 13 : pca9548 @ 0x71
    584     *      - channel 3:
    585     *          - tmm421 @ 0x4c
    586     *          - tmp421 @ 0x4e
    587     *          - tmp421 @ 0x4f
    588     */
    589
    590}
    591
    592static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
    593{
    594    static const struct {
    595        unsigned gpio_id;
    596        LEDColor color;
    597        const char *description;
    598        bool gpio_polarity;
    599    } pca1_leds[] = {
    600        {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
    601        {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
    602        {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
    603    };
    604    AspeedSoCState *soc = &bmc->soc;
    605    uint8_t *eeprom_buf = g_malloc0(8 * 1024);
    606    DeviceState *dev;
    607    LEDState *led;
    608
    609    /* Bus 3: TODO bmp280@77 */
    610    /* Bus 3: TODO max31785@52 */
    611    dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
    612    qdev_prop_set_string(dev, "description", "pca1");
    613    i2c_slave_realize_and_unref(I2C_SLAVE(dev),
    614                                aspeed_i2c_get_bus(&soc->i2c, 3),
    615                                &error_fatal);
    616
    617    for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
    618        led = led_create_simple(OBJECT(bmc),
    619                                pca1_leds[i].gpio_polarity,
    620                                pca1_leds[i].color,
    621                                pca1_leds[i].description);
    622        qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
    623                              qdev_get_gpio_in(DEVICE(led), 0));
    624    }
    625    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
    626    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
    627    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
    628
    629    /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
    630    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
    631                     0x4a);
    632
    633    /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
    634     * good enough */
    635    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
    636
    637    smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
    638                          eeprom_buf);
    639    dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
    640    qdev_prop_set_string(dev, "description", "pca0");
    641    i2c_slave_realize_and_unref(I2C_SLAVE(dev),
    642                                aspeed_i2c_get_bus(&soc->i2c, 11),
    643                                &error_fatal);
    644    /* Bus 11: TODO ucd90160@64 */
    645}
    646
    647static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
    648{
    649    AspeedSoCState *soc = &bmc->soc;
    650    DeviceState *dev;
    651
    652    dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
    653                                         "emc1413", 0x4c));
    654    object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
    655    object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
    656    object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
    657
    658    dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
    659                                         "emc1413", 0x4c));
    660    object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
    661    object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
    662    object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
    663
    664    dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
    665                                         "emc1413", 0x4c));
    666    object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
    667    object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
    668    object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
    669
    670    static uint8_t eeprom_buf[2 * 1024] = {
    671            0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
    672            0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
    673            0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
    674            0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
    675            0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
    676            0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
    677            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
    678    };
    679    smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
    680                          eeprom_buf);
    681}
    682
    683static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
    684{
    685    I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
    686    DeviceState *dev = DEVICE(i2c_dev);
    687
    688    qdev_prop_set_uint32(dev, "rom-size", rsize);
    689    i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
    690}
    691
    692static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
    693{
    694    AspeedSoCState *soc = &bmc->soc;
    695    I2CSlave *i2c_mux;
    696
    697    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
    698
    699    /* The rainier expects a TMP275 but a TMP105 is compatible */
    700    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
    701                     0x48);
    702    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
    703                     0x49);
    704    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
    705                     0x4a);
    706    i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
    707                                      "pca9546", 0x70);
    708    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
    709    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
    710    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
    711
    712    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
    713                     0x48);
    714    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
    715                     0x49);
    716    i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
    717                                      "pca9546", 0x70);
    718    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
    719    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
    720
    721    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
    722                     0x48);
    723    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
    724                     0x4a);
    725    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
    726                     0x4b);
    727    i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
    728                                      "pca9546", 0x70);
    729    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
    730    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
    731    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
    732    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
    733
    734    /* Bus 7: TODO max31785@52 */
    735    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x61);
    736    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
    737    /* Bus 7: TODO si7021-a20@20 */
    738    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
    739                     0x48);
    740    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
    741    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
    742
    743    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
    744                     0x48);
    745    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
    746                     0x4a);
    747    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
    748    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
    749    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
    750    /* Bus 8: ucd90320@11 */
    751    /* Bus 8: ucd90320@b */
    752    /* Bus 8: ucd90320@c */
    753
    754    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
    755    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
    756    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
    757
    758    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
    759    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
    760    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
    761
    762    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
    763                     0x48);
    764    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
    765                     0x49);
    766    i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
    767                                      "pca9546", 0x70);
    768    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
    769    aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
    770
    771
    772    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
    773
    774    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
    775
    776    aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
    777}
    778
    779static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
    780                                 I2CBus **channels)
    781{
    782    I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
    783    for (int i = 0; i < 8; i++) {
    784        channels[i] = pca954x_i2c_get_bus(mux, i);
    785    }
    786}
    787
    788#define TYPE_LM75 TYPE_TMP105
    789#define TYPE_TMP75 TYPE_TMP105
    790#define TYPE_TMP422 "tmp422"
    791
    792static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
    793{
    794    AspeedSoCState *soc = &bmc->soc;
    795    I2CBus *i2c[144] = {};
    796
    797    for (int i = 0; i < 16; i++) {
    798        i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
    799    }
    800    I2CBus *i2c180 = i2c[2];
    801    I2CBus *i2c480 = i2c[8];
    802    I2CBus *i2c600 = i2c[11];
    803
    804    get_pca9548_channels(i2c180, 0x70, &i2c[16]);
    805    get_pca9548_channels(i2c480, 0x70, &i2c[24]);
    806    /* NOTE: The device tree skips [32, 40) in the alias numbering */
    807    get_pca9548_channels(i2c600, 0x77, &i2c[40]);
    808    get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
    809    get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
    810    get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
    811    get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
    812    for (int i = 0; i < 8; i++) {
    813        get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
    814    }
    815
    816    i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
    817    i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
    818
    819    aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB);
    820    aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB);
    821    aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB);
    822
    823    i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
    824    i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
    825    i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
    826    i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
    827
    828    aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB);
    829    i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
    830
    831    i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
    832    aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB);
    833    i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
    834    i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
    835
    836    i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
    837    i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
    838
    839    aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB);
    840    i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
    841    i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
    842    aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB);
    843    aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB);
    844    aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB);
    845    aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB);
    846
    847    aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB);
    848    i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
    849    i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
    850    aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB);
    851    aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB);
    852    aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB);
    853    aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB);
    854    aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB);
    855
    856    for (int i = 0; i < 8; i++) {
    857        aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
    858        i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
    859        i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
    860        i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
    861    }
    862}
    863
    864static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
    865{
    866    return ASPEED_MACHINE(obj)->mmio_exec;
    867}
    868
    869static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
    870{
    871    ASPEED_MACHINE(obj)->mmio_exec = value;
    872}
    873
    874static void aspeed_machine_instance_init(Object *obj)
    875{
    876    ASPEED_MACHINE(obj)->mmio_exec = false;
    877}
    878
    879static char *aspeed_get_fmc_model(Object *obj, Error **errp)
    880{
    881    AspeedMachineState *bmc = ASPEED_MACHINE(obj);
    882    return g_strdup(bmc->fmc_model);
    883}
    884
    885static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
    886{
    887    AspeedMachineState *bmc = ASPEED_MACHINE(obj);
    888
    889    g_free(bmc->fmc_model);
    890    bmc->fmc_model = g_strdup(value);
    891}
    892
    893static char *aspeed_get_spi_model(Object *obj, Error **errp)
    894{
    895    AspeedMachineState *bmc = ASPEED_MACHINE(obj);
    896    return g_strdup(bmc->spi_model);
    897}
    898
    899static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
    900{
    901    AspeedMachineState *bmc = ASPEED_MACHINE(obj);
    902
    903    g_free(bmc->spi_model);
    904    bmc->spi_model = g_strdup(value);
    905}
    906
    907static void aspeed_machine_class_props_init(ObjectClass *oc)
    908{
    909    object_class_property_add_bool(oc, "execute-in-place",
    910                                   aspeed_get_mmio_exec,
    911                                   aspeed_set_mmio_exec);
    912    object_class_property_set_description(oc, "execute-in-place",
    913                           "boot directly from CE0 flash device");
    914
    915    object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
    916                                   aspeed_set_fmc_model);
    917    object_class_property_set_description(oc, "fmc-model",
    918                                          "Change the FMC Flash model");
    919    object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
    920                                   aspeed_set_spi_model);
    921    object_class_property_set_description(oc, "spi-model",
    922                                          "Change the SPI Flash model");
    923}
    924
    925static int aspeed_soc_num_cpus(const char *soc_name)
    926{
    927   AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
    928   return sc->num_cpus;
    929}
    930
    931static void aspeed_machine_class_init(ObjectClass *oc, void *data)
    932{
    933    MachineClass *mc = MACHINE_CLASS(oc);
    934    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
    935
    936    mc->init = aspeed_machine_init;
    937    mc->no_floppy = 1;
    938    mc->no_cdrom = 1;
    939    mc->no_parallel = 1;
    940    mc->default_ram_id = "ram";
    941    amc->macs_mask = ASPEED_MAC0_ON;
    942    amc->uart_default = ASPEED_DEV_UART5;
    943
    944    aspeed_machine_class_props_init(oc);
    945}
    946
    947static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
    948{
    949    MachineClass *mc = MACHINE_CLASS(oc);
    950    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
    951
    952    mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
    953    amc->soc_name  = "ast2400-a1";
    954    amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
    955    amc->fmc_model = "n25q256a";
    956    amc->spi_model = "mx25l25635e";
    957    amc->num_cs    = 1;
    958    amc->i2c_init  = palmetto_bmc_i2c_init;
    959    mc->default_ram_size       = 256 * MiB;
    960    mc->default_cpus = mc->min_cpus = mc->max_cpus =
    961        aspeed_soc_num_cpus(amc->soc_name);
    962};
    963
    964static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
    965{
    966    MachineClass *mc = MACHINE_CLASS(oc);
    967    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
    968
    969    mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
    970    amc->soc_name  = "ast2400-a1";
    971    amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
    972    amc->fmc_model = "n25q256a";
    973    amc->spi_model = "mx25l25635e";
    974    amc->num_cs    = 1;
    975    amc->i2c_init  = quanta_q71l_bmc_i2c_init;
    976    mc->default_ram_size       = 128 * MiB;
    977    mc->default_cpus = mc->min_cpus = mc->max_cpus =
    978        aspeed_soc_num_cpus(amc->soc_name);
    979}
    980
    981static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
    982                                                        void *data)
    983{
    984    MachineClass *mc = MACHINE_CLASS(oc);
    985    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
    986
    987    mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
    988    amc->soc_name  = "ast2400-a1";
    989    amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
    990    amc->fmc_model = "mx25l25635e";
    991    amc->spi_model = "mx25l25635e";
    992    amc->num_cs    = 1;
    993    amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
    994    amc->i2c_init  = palmetto_bmc_i2c_init;
    995    mc->default_ram_size = 256 * MiB;
    996}
    997
    998static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
    999{
   1000    MachineClass *mc = MACHINE_CLASS(oc);
   1001    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1002
   1003    mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
   1004    amc->soc_name  = "ast2500-a1";
   1005    amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
   1006    amc->fmc_model = "w25q256";
   1007    amc->spi_model = "mx25l25635e";
   1008    amc->num_cs    = 1;
   1009    amc->i2c_init  = ast2500_evb_i2c_init;
   1010    mc->default_ram_size       = 512 * MiB;
   1011    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1012        aspeed_soc_num_cpus(amc->soc_name);
   1013};
   1014
   1015static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
   1016{
   1017    MachineClass *mc = MACHINE_CLASS(oc);
   1018    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1019
   1020    mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
   1021    amc->soc_name  = "ast2500-a1";
   1022    amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
   1023    amc->fmc_model = "n25q256a";
   1024    amc->spi_model = "mx66l1g45g";
   1025    amc->num_cs    = 2;
   1026    amc->i2c_init  = romulus_bmc_i2c_init;
   1027    mc->default_ram_size       = 512 * MiB;
   1028    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1029        aspeed_soc_num_cpus(amc->soc_name);
   1030};
   1031
   1032static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
   1033{
   1034    MachineClass *mc = MACHINE_CLASS(oc);
   1035    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1036
   1037    mc->desc       = "OCP SonoraPass BMC (ARM1176)";
   1038    amc->soc_name  = "ast2500-a1";
   1039    amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
   1040    amc->fmc_model = "mx66l1g45g";
   1041    amc->spi_model = "mx66l1g45g";
   1042    amc->num_cs    = 2;
   1043    amc->i2c_init  = sonorapass_bmc_i2c_init;
   1044    mc->default_ram_size       = 512 * MiB;
   1045    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1046        aspeed_soc_num_cpus(amc->soc_name);
   1047};
   1048
   1049static void aspeed_machine_swift_class_init(ObjectClass *oc, void *data)
   1050{
   1051    MachineClass *mc = MACHINE_CLASS(oc);
   1052    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1053
   1054    mc->desc       = "OpenPOWER Swift BMC (ARM1176)";
   1055    amc->soc_name  = "ast2500-a1";
   1056    amc->hw_strap1 = SWIFT_BMC_HW_STRAP1;
   1057    amc->fmc_model = "mx66l1g45g";
   1058    amc->spi_model = "mx66l1g45g";
   1059    amc->num_cs    = 2;
   1060    amc->i2c_init  = swift_bmc_i2c_init;
   1061    mc->default_ram_size       = 512 * MiB;
   1062    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1063        aspeed_soc_num_cpus(amc->soc_name);
   1064
   1065    mc->deprecation_reason = "redundant system. Please use a similar "
   1066        "OpenPOWER BMC, Witherspoon or Romulus.";
   1067};
   1068
   1069static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
   1070{
   1071    MachineClass *mc = MACHINE_CLASS(oc);
   1072    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1073
   1074    mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
   1075    amc->soc_name  = "ast2500-a1";
   1076    amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
   1077    amc->fmc_model = "mx25l25635e";
   1078    amc->spi_model = "mx66l1g45g";
   1079    amc->num_cs    = 2;
   1080    amc->i2c_init  = witherspoon_bmc_i2c_init;
   1081    mc->default_ram_size = 512 * MiB;
   1082    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1083        aspeed_soc_num_cpus(amc->soc_name);
   1084};
   1085
   1086static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
   1087{
   1088    MachineClass *mc = MACHINE_CLASS(oc);
   1089    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1090
   1091    mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
   1092    amc->soc_name  = "ast2600-a3";
   1093    amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
   1094    amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
   1095    amc->fmc_model = "w25q512jv";
   1096    amc->spi_model = "mx66u51235f";
   1097    amc->num_cs    = 1;
   1098    amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
   1099                     ASPEED_MAC3_ON;
   1100    amc->i2c_init  = ast2600_evb_i2c_init;
   1101    mc->default_ram_size = 1 * GiB;
   1102    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1103        aspeed_soc_num_cpus(amc->soc_name);
   1104};
   1105
   1106static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
   1107{
   1108    MachineClass *mc = MACHINE_CLASS(oc);
   1109    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1110
   1111    mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
   1112    amc->soc_name  = "ast2600-a3";
   1113    amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
   1114    amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
   1115    amc->fmc_model = "mx66l1g45g";
   1116    amc->spi_model = "mx66l1g45g";
   1117    amc->num_cs    = 2;
   1118    amc->macs_mask  = ASPEED_MAC2_ON;
   1119    amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
   1120    mc->default_ram_size = 1 * GiB;
   1121    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1122        aspeed_soc_num_cpus(amc->soc_name);
   1123};
   1124
   1125static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
   1126{
   1127    MachineClass *mc = MACHINE_CLASS(oc);
   1128    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1129
   1130    mc->desc       = "Bytedance G220A BMC (ARM1176)";
   1131    amc->soc_name  = "ast2500-a1";
   1132    amc->hw_strap1 = G220A_BMC_HW_STRAP1;
   1133    amc->fmc_model = "n25q512a";
   1134    amc->spi_model = "mx25l25635e";
   1135    amc->num_cs    = 2;
   1136    amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
   1137    amc->i2c_init  = g220a_bmc_i2c_init;
   1138    mc->default_ram_size = 1024 * MiB;
   1139    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1140        aspeed_soc_num_cpus(amc->soc_name);
   1141};
   1142
   1143static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
   1144{
   1145    MachineClass *mc = MACHINE_CLASS(oc);
   1146    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1147
   1148    mc->desc       = "IBM Rainier BMC (Cortex-A7)";
   1149    amc->soc_name  = "ast2600-a3";
   1150    amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
   1151    amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
   1152    amc->fmc_model = "mx66l1g45g";
   1153    amc->spi_model = "mx66l1g45g";
   1154    amc->num_cs    = 2;
   1155    amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
   1156    amc->i2c_init  = rainier_bmc_i2c_init;
   1157    mc->default_ram_size = 1 * GiB;
   1158    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1159        aspeed_soc_num_cpus(amc->soc_name);
   1160};
   1161
   1162/* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
   1163#if HOST_LONG_BITS == 32
   1164#define FUJI_BMC_RAM_SIZE (1 * GiB)
   1165#else
   1166#define FUJI_BMC_RAM_SIZE (2 * GiB)
   1167#endif
   1168
   1169static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
   1170{
   1171    MachineClass *mc = MACHINE_CLASS(oc);
   1172    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
   1173
   1174    mc->desc = "Facebook Fuji BMC (Cortex-A7)";
   1175    amc->soc_name = "ast2600-a3";
   1176    amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
   1177    amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
   1178    amc->fmc_model = "mx66l1g45g";
   1179    amc->spi_model = "mx66l1g45g";
   1180    amc->num_cs = 2;
   1181    amc->macs_mask = ASPEED_MAC3_ON;
   1182    amc->i2c_init = fuji_bmc_i2c_init;
   1183    amc->uart_default = ASPEED_DEV_UART1;
   1184    mc->default_ram_size = FUJI_BMC_RAM_SIZE;
   1185    mc->default_cpus = mc->min_cpus = mc->max_cpus =
   1186        aspeed_soc_num_cpus(amc->soc_name);
   1187};
   1188
   1189static const TypeInfo aspeed_machine_types[] = {
   1190    {
   1191        .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
   1192        .parent        = TYPE_ASPEED_MACHINE,
   1193        .class_init    = aspeed_machine_palmetto_class_init,
   1194    }, {
   1195        .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
   1196        .parent        = TYPE_ASPEED_MACHINE,
   1197        .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
   1198    }, {
   1199        .name          = MACHINE_TYPE_NAME("ast2500-evb"),
   1200        .parent        = TYPE_ASPEED_MACHINE,
   1201        .class_init    = aspeed_machine_ast2500_evb_class_init,
   1202    }, {
   1203        .name          = MACHINE_TYPE_NAME("romulus-bmc"),
   1204        .parent        = TYPE_ASPEED_MACHINE,
   1205        .class_init    = aspeed_machine_romulus_class_init,
   1206    }, {
   1207        .name          = MACHINE_TYPE_NAME("swift-bmc"),
   1208        .parent        = TYPE_ASPEED_MACHINE,
   1209        .class_init    = aspeed_machine_swift_class_init,
   1210    }, {
   1211        .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
   1212        .parent        = TYPE_ASPEED_MACHINE,
   1213        .class_init    = aspeed_machine_sonorapass_class_init,
   1214    }, {
   1215        .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
   1216        .parent        = TYPE_ASPEED_MACHINE,
   1217        .class_init    = aspeed_machine_witherspoon_class_init,
   1218    }, {
   1219        .name          = MACHINE_TYPE_NAME("ast2600-evb"),
   1220        .parent        = TYPE_ASPEED_MACHINE,
   1221        .class_init    = aspeed_machine_ast2600_evb_class_init,
   1222    }, {
   1223        .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
   1224        .parent        = TYPE_ASPEED_MACHINE,
   1225        .class_init    = aspeed_machine_tacoma_class_init,
   1226    }, {
   1227        .name          = MACHINE_TYPE_NAME("g220a-bmc"),
   1228        .parent        = TYPE_ASPEED_MACHINE,
   1229        .class_init    = aspeed_machine_g220a_class_init,
   1230    }, {
   1231        .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
   1232        .parent        = TYPE_ASPEED_MACHINE,
   1233        .class_init    = aspeed_machine_quanta_q71l_class_init,
   1234    }, {
   1235        .name          = MACHINE_TYPE_NAME("rainier-bmc"),
   1236        .parent        = TYPE_ASPEED_MACHINE,
   1237        .class_init    = aspeed_machine_rainier_class_init,
   1238    }, {
   1239        .name          = MACHINE_TYPE_NAME("fuji-bmc"),
   1240        .parent        = TYPE_ASPEED_MACHINE,
   1241        .class_init    = aspeed_machine_fuji_class_init,
   1242    }, {
   1243        .name          = TYPE_ASPEED_MACHINE,
   1244        .parent        = TYPE_MACHINE,
   1245        .instance_size = sizeof(AspeedMachineState),
   1246        .instance_init = aspeed_machine_instance_init,
   1247        .class_size    = sizeof(AspeedMachineClass),
   1248        .class_init    = aspeed_machine_class_init,
   1249        .abstract      = true,
   1250    }
   1251};
   1252
   1253DEFINE_TYPES(aspeed_machine_types)