1327d8e4eSAndrew Jeffery /*
2327d8e4eSAndrew Jeffery * OpenPOWER Palmetto BMC
3327d8e4eSAndrew Jeffery *
4327d8e4eSAndrew Jeffery * Andrew Jeffery <andrew@aj.id.au>
5327d8e4eSAndrew Jeffery *
6327d8e4eSAndrew Jeffery * Copyright 2016 IBM Corp.
7327d8e4eSAndrew Jeffery *
8327d8e4eSAndrew Jeffery * This code is licensed under the GPL version 2 or later. See
9327d8e4eSAndrew Jeffery * the COPYING file in the top-level directory.
10327d8e4eSAndrew Jeffery */
11327d8e4eSAndrew Jeffery
12327d8e4eSAndrew Jeffery #include "qemu/osdep.h"
13da34e65cSMarkus Armbruster #include "qapi/error.h"
1412ec8bd5SPeter Maydell #include "hw/arm/boot.h"
15fca9ca1bSCédric Le Goater #include "hw/arm/aspeed.h"
1600442402SCédric Le Goater #include "hw/arm/aspeed_soc.h"
17c0216b94SPeter Delevoryas #include "hw/arm/aspeed_eeprom.h"
188285490bSCédric Le Goater #include "hw/block/flash.h"
193ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h"
2093198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h"
216328d8ffSCédric Le Goater #include "hw/gpio/pca9552.h"
229618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h"
235e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h"
247cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h"
25a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
2632cad1ffSPhilippe Mathieu-Daudé #include "system/block-backend.h"
2732cad1ffSPhilippe Mathieu-Daudé #include "system/reset.h"
28d769a1daSCédric Le Goater #include "hw/loader.h"
29d769a1daSCédric Le Goater #include "qemu/error-report.h"
30*ee447054SJamin Lin #include "qemu/datadir.h"
31a9df9622SJoel Stanley #include "qemu/units.h"
3266c895b8SJamin Lin #include "hw/qdev-clock.h"
3332cad1ffSPhilippe Mathieu-Daudé #include "system/system.h"
34327d8e4eSAndrew Jeffery
3574fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
36b033271fSCédric Le Goater .board_id = -1, /* device-tree-only board */
37327d8e4eSAndrew Jeffery };
38327d8e4eSAndrew Jeffery
39612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
40888b2b03SPhilippe Mathieu-Daudé /* Private */
41888b2b03SPhilippe Mathieu-Daudé MachineState parent_obj;
42888b2b03SPhilippe Mathieu-Daudé /* Public */
43888b2b03SPhilippe Mathieu-Daudé
443c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc;
45262259eaSCédric Le Goater MemoryRegion boot_rom;
46888b2b03SPhilippe Mathieu-Daudé bool mmio_exec;
47f65f6ad5SCédric Le Goater uint32_t uart_chosen;
489820e52fSCédric Le Goater char *fmc_model;
499820e52fSCédric Le Goater char *spi_model;
50621845a9SCédric Le Goater uint32_t hw_strap1;
51ea066d39SThomas Huth };
52327d8e4eSAndrew Jeffery
531e2c22c9SCédric Le Goater /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
541e2c22c9SCédric Le Goater #if HOST_LONG_BITS == 32
551e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB)
561e2c22c9SCédric Le Goater #else
571e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) (sz)
581e2c22c9SCédric Le Goater #endif
591e2c22c9SCédric Le Goater
60ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
618da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 ( \
628da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \
638da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
648da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_ACPI_DIS | \
658da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
668da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_CLASS_CODE | \
678da33ef7SCédric Le Goater SCU_HW_STRAP_LPC_RESET_PIN | \
688da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
698da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
708da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_WIDTH | \
718da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
728da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
738da33ef7SCédric Le Goater
7440a38df5SErik Smit /* TODO: Find the actual hardware value */
7540a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 ( \
7640a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
7740a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \
7840a38df5SErik Smit SCU_AST2400_HW_STRAP_ACPI_DIS | \
7940a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
8040a38df5SErik Smit SCU_HW_STRAP_VGA_CLASS_CODE | \
8140a38df5SErik Smit SCU_HW_STRAP_LPC_RESET_PIN | \
8240a38df5SErik Smit SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
8340a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
8440a38df5SErik Smit SCU_HW_STRAP_SPI_WIDTH | \
8540a38df5SErik Smit SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
8640a38df5SErik Smit SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
8740a38df5SErik Smit
8847936597SGuenter Roeck /* TODO: Find the actual hardware value */
8947936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \
9047936597SGuenter Roeck AST2500_HW_STRAP1_DEFAULTS | \
9147936597SGuenter Roeck SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
9247936597SGuenter Roeck SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
9347936597SGuenter Roeck SCU_AST2500_HW_STRAP_UART_DEBUG | \
9447936597SGuenter Roeck SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
9547936597SGuenter Roeck SCU_HW_STRAP_SPI_WIDTH | \
9647936597SGuenter Roeck SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
9747936597SGuenter Roeck
98ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
999a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 (( \
1009a7c1750SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \
1019a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
1029a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
1039a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \
1049a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
1059a7c1750SCédric Le Goater SCU_HW_STRAP_MAC1_RGMII | \
1069a7c1750SCédric Le Goater SCU_HW_STRAP_MAC0_RGMII) & \
1079a7c1750SCédric Le Goater ~SCU_HW_STRAP_2ND_BOOT_WDT)
1089a7c1750SCédric Le Goater
109ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
110ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 ( \
111ef17f836SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \
112ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
113ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
114ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \
115ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
116ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
117ef17f836SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
118ef17f836SCédric Le Goater
119143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
120143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 ( \
121143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
122143b040fSPatrick Williams SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
123143b040fSPatrick Williams SCU_AST2500_HW_STRAP_UART_DEBUG | \
124143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED28 | \
125143b040fSPatrick Williams SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
126143b040fSPatrick Williams SCU_HW_STRAP_VGA_CLASS_CODE | \
127143b040fSPatrick Williams SCU_HW_STRAP_LPC_RESET_PIN | \
128143b040fSPatrick Williams SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
129143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
130143b040fSPatrick Williams SCU_HW_STRAP_VGA_BIOS_ROM | \
131143b040fSPatrick Williams SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
132143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED1)
133143b040fSPatrick Williams
13495f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 ( \
13595f068c8SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
13695f068c8SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
13795f068c8SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \
13895f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \
13995f068c8SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
14095f068c8SJohn Wang SCU_HW_STRAP_2ND_BOOT_WDT | \
14195f068c8SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \
14295f068c8SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \
14395f068c8SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
14495f068c8SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
14595f068c8SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \
14695f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1)
14795f068c8SJohn Wang
14882b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
14982b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 ( \
15082b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
15182b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
15282b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \
15382b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \
15482b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
15582b6a3f6SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \
15682b6a3f6SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \
15782b6a3f6SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
15882b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
15982b6a3f6SJohn Wang SCU_HW_STRAP_MAC1_RGMII | \
16082b6a3f6SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
16182b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1)
16282b6a3f6SJohn Wang
16362c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
16462c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
16562c2c2ebSCédric Le Goater
1669cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1679cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 ( \
1689cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
1699cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1709cccb912SPatrick Venture SCU_AST2400_HW_STRAP_ACPI_DIS | \
1719cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \
1729cccb912SPatrick Venture SCU_HW_STRAP_VGA_CLASS_CODE | \
1739cccb912SPatrick Venture SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \
1749cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1759cccb912SPatrick Venture SCU_HW_STRAP_SPI_WIDTH | \
1769cccb912SPatrick Venture SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \
1779cccb912SPatrick Venture SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1789cccb912SPatrick Venture
179ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
180ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
181ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
182ccc2c418SCédric Le Goater
18392707992SJamin Lin #ifdef TARGET_AARCH64
18492707992SJamin Lin /* AST2700 evb hardware value */
185172329c6SJamin Lin /* SCU HW Strap1 */
186172329c6SJamin Lin #define AST2700_EVB_HW_STRAP1 0x00000800
187172329c6SJamin Lin /* SCUIO HW Strap1 */
188172329c6SJamin Lin #define AST2700_EVB_HW_STRAP2 0x00000700
18992707992SJamin Lin #endif
19092707992SJamin Lin
19158e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
19201ea09ebSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
193b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
19458e52bdbSCédric Le Goater
195febbe308SPeter Delevoryas /* Fuji hardware value */
196febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000
197febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000
198febbe308SPeter Delevoryas
199a20c54b1SPatrick Williams /* Bletchley hardware value */
200a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
201a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
202a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
203a20c54b1SPatrick Williams
204fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
205fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000
206fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041
207fb6b3c8dSJae Hyun Yoo
2089bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180
2099bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0)
2109bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4)
2119bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8)
2129bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc)
2139bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10)
2149bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00
2159bb6d140SJoel Stanley
aspeed_write_smpboot(ARMCPU * cpu,const struct arm_boot_info * info)2169bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2179bb6d140SJoel Stanley const struct arm_boot_info *info)
2189bb6d140SJoel Stanley {
219902bba54SCédric Le Goater AddressSpace *as = arm_boot_address_space(cpu, info);
220902bba54SCédric Le Goater static const ARMInsnFixup poll_mailbox_ready[] = {
2219bb6d140SJoel Stanley /*
2229bb6d140SJoel Stanley * r2 = per-cpu go sign value
2239bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY
2249bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2259bb6d140SJoel Stanley */
226902bba54SCédric Le Goater { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */
227902bba54SCédric Le Goater { 0xe21000ff }, /* ands r0, r0, #255 */
228902bba54SCédric Le Goater { 0xe59f201c }, /* ldr r2, [pc, #28] */
229902bba54SCédric Le Goater { 0xe1822000 }, /* orr r2, r2, r0 */
2309bb6d140SJoel Stanley
231902bba54SCédric Le Goater { 0xe59f1018 }, /* ldr r1, [pc, #24] */
232902bba54SCédric Le Goater { 0xe59f0018 }, /* ldr r0, [pc, #24] */
2339bb6d140SJoel Stanley
234902bba54SCédric Le Goater { 0xe320f002 }, /* wfe */
235902bba54SCédric Le Goater { 0xe5904000 }, /* ldr r4, [r0] */
236902bba54SCédric Le Goater { 0xe1520004 }, /* cmp r2, r4 */
237902bba54SCédric Le Goater { 0x1afffffb }, /* bne <wfe> */
238902bba54SCédric Le Goater { 0xe591f000 }, /* ldr pc, [r1] */
239902bba54SCédric Le Goater { AST_SMP_MBOX_GOSIGN },
240902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_ENTRY },
241902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_GOSIGN },
242902bba54SCédric Le Goater { 0, FIXUP_TERMINATOR }
2439bb6d140SJoel Stanley };
244902bba54SCédric Le Goater static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2459bb6d140SJoel Stanley
246902bba54SCédric Le Goater arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
247902bba54SCédric Le Goater poll_mailbox_ready, fixupcontext);
2489bb6d140SJoel Stanley }
2499bb6d140SJoel Stanley
aspeed_reset_secondary(ARMCPU * cpu,const struct arm_boot_info * info)2509bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2519bb6d140SJoel Stanley const struct arm_boot_info *info)
2529bb6d140SJoel Stanley {
2539bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info);
2549bb6d140SJoel Stanley CPUState *cs = CPU(cpu);
2559bb6d140SJoel Stanley
2569bb6d140SJoel Stanley /* info->smp_bootreg_addr */
2579bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2589bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL);
2599bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start);
2609bb6d140SJoel Stanley }
2619bb6d140SJoel Stanley
write_boot_rom(BlockBackend * blk,hwaddr addr,size_t rom_size,Error ** errp)2628b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
263d769a1daSCédric Le Goater Error **errp)
264d769a1daSCédric Le Goater {
26505e6e40aSWentao_Liang g_autofree void *storage = NULL;
2660c7209beSCédric Le Goater int64_t size;
267d769a1daSCédric Le Goater
2684db1c164SJamin Lin /*
2694db1c164SJamin Lin * The block backend size should have already been 'validated' by
2700c7209beSCédric Le Goater * the creation of the m25p80 object.
2710c7209beSCédric Le Goater */
2720c7209beSCédric Le Goater size = blk_getlength(blk);
2730c7209beSCédric Le Goater if (size <= 0) {
2740c7209beSCédric Le Goater error_setg(errp, "failed to get flash size");
2750c7209beSCédric Le Goater return;
2760c7209beSCédric Le Goater }
2770c7209beSCédric Le Goater
2780c7209beSCédric Le Goater if (rom_size > size) {
2790c7209beSCédric Le Goater rom_size = size;
280d769a1daSCédric Le Goater }
281d769a1daSCédric Le Goater
28205e6e40aSWentao_Liang storage = g_malloc0(rom_size);
283a9262f55SAlberto Faria if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
284d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content");
285d769a1daSCédric Le Goater return;
286d769a1daSCédric Le Goater }
287d769a1daSCédric Le Goater
288d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
289d769a1daSCédric Le Goater }
290d769a1daSCédric Le Goater
2918b744a6aSCédric Le Goater /*
2928b744a6aSCédric Le Goater * Create a ROM and copy the flash contents at the expected address
2938b744a6aSCédric Le Goater * (0x0). Boots faster than execute-in-place.
2948b744a6aSCédric Le Goater */
aspeed_install_boot_rom(AspeedMachineState * bmc,BlockBackend * blk,uint64_t rom_size)295262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2968b744a6aSCédric Le Goater uint64_t rom_size)
2978b744a6aSCédric Le Goater {
2983c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
299db052d0eSJamin Lin AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
3008b744a6aSCédric Le Goater
301262259eaSCédric Le Goater memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
3028b744a6aSCédric Le Goater &error_abort);
3038b744a6aSCédric Le Goater memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
304262259eaSCédric Le Goater &bmc->boot_rom, 1);
305db052d0eSJamin Lin write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
306db052d0eSJamin Lin rom_size, &error_abort);
3078b744a6aSCédric Le Goater }
3088b744a6aSCédric Le Goater
309*ee447054SJamin Lin #define VBOOTROM_FILE_NAME "ast27x0_bootrom.bin"
310*ee447054SJamin Lin
311*ee447054SJamin Lin /*
312*ee447054SJamin Lin * This function locates the vbootrom image file specified via the command line
313*ee447054SJamin Lin * using the -bios option. It loads the specified image into the vbootrom
314*ee447054SJamin Lin * memory region and handles errors if the file cannot be found or loaded.
315*ee447054SJamin Lin */
aspeed_load_vbootrom(AspeedMachineState * bmc,const char * bios_name,Error ** errp)316*ee447054SJamin Lin static void aspeed_load_vbootrom(AspeedMachineState *bmc, const char *bios_name,
317*ee447054SJamin Lin Error **errp)
318*ee447054SJamin Lin {
319*ee447054SJamin Lin g_autofree char *filename = NULL;
320*ee447054SJamin Lin AspeedSoCState *soc = bmc->soc;
321*ee447054SJamin Lin int ret;
322*ee447054SJamin Lin
323*ee447054SJamin Lin filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
324*ee447054SJamin Lin if (!filename) {
325*ee447054SJamin Lin error_setg(errp, "Could not find vbootrom image '%s'", bios_name);
326*ee447054SJamin Lin return;
327*ee447054SJamin Lin }
328*ee447054SJamin Lin
329*ee447054SJamin Lin ret = load_image_mr(filename, &soc->vbootrom);
330*ee447054SJamin Lin if (ret < 0) {
331*ee447054SJamin Lin error_setg(errp, "Failed to load vbootrom image '%s'", bios_name);
332*ee447054SJamin Lin return;
333*ee447054SJamin Lin }
334*ee447054SJamin Lin }
335*ee447054SJamin Lin
aspeed_board_init_flashes(AspeedSMCState * s,const char * flashtype,unsigned int count,int unit0)3361099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
3379bd4ac61SCédric Le Goater unsigned int count, int unit0)
338e1ad9bc4SCédric Le Goater {
339e1ad9bc4SCédric Le Goater int i;
340179b2058SPatrick Williams
341179b2058SPatrick Williams if (!flashtype) {
342179b2058SPatrick Williams return;
343179b2058SPatrick Williams }
344e1ad9bc4SCédric Le Goater
3459bd4ac61SCédric Le Goater for (i = 0; i < count; ++i) {
3468ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
347a7d78befSCédric Le Goater DeviceState *dev;
348e1ad9bc4SCédric Le Goater
349a7d78befSCédric Le Goater dev = qdev_new(flashtype);
350e1ad9bc4SCédric Le Goater if (dinfo) {
351a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
352e1ad9bc4SCédric Le Goater }
35327a2c66cSCédric Le Goater qdev_prop_set_uint8(dev, "cs", i);
354a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
355e1ad9bc4SCédric Le Goater }
356e1ad9bc4SCédric Le Goater }
357e1ad9bc4SCédric Le Goater
sdhci_attach_drive(SDHCIState * sdhci,DriveInfo * dinfo,bool emmc,bool boot_emmc)358e554e45bSCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
359e554e45bSCédric Le Goater bool boot_emmc)
360a29e3e12SAndrew Jeffery {
361a29e3e12SAndrew Jeffery DeviceState *card;
362a29e3e12SAndrew Jeffery
363756f739bSPhilippe Mathieu-Daudé if (!dinfo) {
364756f739bSPhilippe Mathieu-Daudé return;
365756f739bSPhilippe Mathieu-Daudé }
366dddfc771SCédric Le Goater card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
367e8f3acdbSCédric Le Goater
368e8f3acdbSCédric Le Goater /*
369e8f3acdbSCédric Le Goater * Force the boot properties of the eMMC device only when the
370e8f3acdbSCédric Le Goater * machine is strapped to boot from eMMC. Without these
371e8f3acdbSCédric Le Goater * settings, the machine would not boot.
372e8f3acdbSCédric Le Goater *
373e8f3acdbSCédric Le Goater * This also allows the machine to use an eMMC device without
374e8f3acdbSCédric Le Goater * boot areas when booting from the flash device (or -kernel)
375e8f3acdbSCédric Le Goater * Ideally, the device and its properties should be defined on
376e8f3acdbSCédric Le Goater * the command line.
377e8f3acdbSCédric Le Goater */
378e8f3acdbSCédric Le Goater if (emmc && boot_emmc) {
379e554e45bSCédric Le Goater qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB);
380e8f3acdbSCédric Le Goater qdev_prop_set_uint8(card, "boot-config", 0x1 << 3);
381e554e45bSCédric Le Goater }
382934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
383a29e3e12SAndrew Jeffery &error_fatal);
3843e80f690SMarkus Armbruster qdev_realize_and_unref(card,
3853e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3863e80f690SMarkus Armbruster &error_fatal);
387a29e3e12SAndrew Jeffery }
388a29e3e12SAndrew Jeffery
connect_serial_hds_to_uarts(AspeedMachineState * bmc)389d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
390d2b3eaefSPeter Delevoryas {
391d2b3eaefSPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
3923c392e87SPhilippe Mathieu-Daudé AspeedSoCState *s = bmc->soc;
393d2b3eaefSPeter Delevoryas AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
394f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
395d2b3eaefSPeter Delevoryas
396f65f6ad5SCédric Le Goater aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
3978a139ae7SKenneth Jia for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; uart++) {
398f65f6ad5SCédric Le Goater if (uart == uart_chosen) {
399d2b3eaefSPeter Delevoryas continue;
400d2b3eaefSPeter Delevoryas }
4018a139ae7SKenneth Jia aspeed_soc_uart_set_chr(s, uart, serial_hd(i++));
402d2b3eaefSPeter Delevoryas }
403d2b3eaefSPeter Delevoryas }
404d2b3eaefSPeter Delevoryas
aspeed_machine_init(MachineState * machine)405baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
406327d8e4eSAndrew Jeffery {
407888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine);
408baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
409b033271fSCédric Le Goater AspeedSoCClass *sc;
4102bea128cSEddie James int i;
411*ee447054SJamin Lin const char *bios_name = NULL;
412255aed81SCédric Le Goater DriveInfo *emmc0 = NULL;
413e554e45bSCédric Le Goater bool boot_emmc;
414327d8e4eSAndrew Jeffery
4153c392e87SPhilippe Mathieu-Daudé bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
4163c392e87SPhilippe Mathieu-Daudé object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
4173c392e87SPhilippe Mathieu-Daudé object_unref(OBJECT(bmc->soc));
4183c392e87SPhilippe Mathieu-Daudé sc = ASPEED_SOC_GET_CLASS(bmc->soc);
419b033271fSCédric Le Goater
420533eb415SIgor Mammedov /*
421346160cbSCédric Le Goater * This will error out if the RAM size is not supported by the
422346160cbSCédric Le Goater * memory controller of the SoC.
423533eb415SIgor Mammedov */
4243c392e87SPhilippe Mathieu-Daudé object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
425533eb415SIgor Mammedov &error_fatal);
426533eb415SIgor Mammedov
427d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) {
428b3cfec5bSDavid Woodhouse if ((amc->macs_mask & (1 << i)) &&
429b3cfec5bSDavid Woodhouse !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]),
430b3cfec5bSDavid Woodhouse true, NULL)) {
431b3cfec5bSDavid Woodhouse break; /* No configs left; stop asking */
432d3bad7e7SCédric Le Goater }
433d3bad7e7SCédric Le Goater }
434d3bad7e7SCédric Le Goater
435621845a9SCédric Le Goater object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1,
43687e79af0SAndrew Jeffery &error_abort);
4373c392e87SPhilippe Mathieu-Daudé object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
438ccc2c418SCédric Le Goater &error_abort);
4393c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "memory",
4404dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort);
4413c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "dram",
4420df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort);
443bf8a471aSJamin Lin if (amc->sdhci_wp_inverted) {
444bf8a471aSJamin Lin for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
445bf8a471aSJamin Lin object_property_set_bool(OBJECT(&bmc->soc->sdhci.slots[i]),
446bf8a471aSJamin Lin "wp-inverted", true, &error_abort);
447bf8a471aSJamin Lin }
448bf8a471aSJamin Lin }
449b6e70d1dSJoel Stanley if (machine->kernel_filename) {
450b6e70d1dSJoel Stanley /*
451b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot
452b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to
453b6e70d1dSJoel Stanley * be unlocked as the kernel expects
454b6e70d1dSJoel Stanley */
4553c392e87SPhilippe Mathieu-Daudé object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
4565325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort);
457b6e70d1dSJoel Stanley }
458d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc);
4593c392e87SPhilippe Mathieu-Daudé qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
460327d8e4eSAndrew Jeffery
461c7e313aeSCédric Le Goater if (defaults_enabled()) {
4623c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->fmc,
4638ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4649bd4ac61SCédric Le Goater amc->num_cs, 0);
4653c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[0],
4668ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model,
4679bd4ac61SCédric Le Goater 1, amc->num_cs);
468c7e313aeSCédric Le Goater }
469e1ad9bc4SCédric Le Goater
470b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) {
4719bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */
4729bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1);
473f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4749bb6d140SJoel Stanley 0x80, &error_abort);
4759bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(),
4769bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot);
4779bb6d140SJoel Stanley
4789bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4799bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4809bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4819bb6d140SJoel Stanley }
4829bb6d140SJoel Stanley
4836e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size;
484347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
485b033271fSCédric Le Goater
486baa4732bSCédric Le Goater if (amc->i2c_init) {
487baa4732bSCédric Le Goater amc->i2c_init(bmc);
4882cf6cb50SCédric Le Goater }
4892cf6cb50SCédric Le Goater
490e9085846SCédric Le Goater for (i = 0; i < bmc->soc->sdhci.num_slots && defaults_enabled(); i++) {
4913c392e87SPhilippe Mathieu-Daudé sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
492e554e45bSCédric Le Goater drive_get(IF_SD, 0, i), false, false);
493a29e3e12SAndrew Jeffery }
4942bea128cSEddie James
495e554e45bSCédric Le Goater boot_emmc = sc->boot_from_emmc(bmc->soc);
496e554e45bSCédric Le Goater
497e9085846SCédric Le Goater if (bmc->soc->emmc.num_slots && defaults_enabled()) {
498255aed81SCédric Le Goater emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
499e554e45bSCédric Le Goater sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
5002bea128cSEddie James }
5012bea128cSEddie James
5028b744a6aSCédric Le Goater if (!bmc->mmio_exec) {
5033c392e87SPhilippe Mathieu-Daudé DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
5048285490bSCédric Le Goater BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
5058b744a6aSCédric Le Goater
506e554e45bSCédric Le Goater if (fmc0 && !boot_emmc) {
5073c392e87SPhilippe Mathieu-Daudé uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
5088285490bSCédric Le Goater aspeed_install_boot_rom(bmc, fmc0, rom_size);
509255aed81SCédric Le Goater } else if (emmc0) {
510255aed81SCédric Le Goater aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
5118b744a6aSCédric Le Goater }
5128b744a6aSCédric Le Goater }
5138b744a6aSCédric Le Goater
514*ee447054SJamin Lin if (amc->vbootrom) {
515*ee447054SJamin Lin bios_name = machine->firmware ?: VBOOTROM_FILE_NAME;
516*ee447054SJamin Lin aspeed_load_vbootrom(bmc, bios_name, &error_abort);
517*ee447054SJamin Lin }
518*ee447054SJamin Lin
5192744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
520327d8e4eSAndrew Jeffery }
521327d8e4eSAndrew Jeffery
palmetto_bmc_i2c_init(AspeedMachineState * bmc)522612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
5232cf6cb50SCédric Le Goater {
5243c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
525a87e81b9SCédric Le Goater DeviceState *dev;
5263d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024);
5272cf6cb50SCédric Le Goater
5284db1c164SJamin Lin /*
5294db1c164SJamin Lin * The palmetto platform expects a ds3231 RTC but a ds1338 is
5304db1c164SJamin Lin * enough to provide basic RTC features. Alarms will be missing
5314db1c164SJamin Lin */
5321373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
533a87e81b9SCédric Le Goater
5347a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
5353d165f12SCédric Le Goater eeprom_buf);
5363d165f12SCédric Le Goater
537a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */
5381373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
5391373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c));
5405325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
5415325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
5425325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
5435325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
5442cf6cb50SCédric Le Goater }
5452cf6cb50SCédric Le Goater
quanta_q71l_bmc_i2c_init(AspeedMachineState * bmc)5469cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
5479cccb912SPatrick Venture {
5483c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
5499cccb912SPatrick Venture
5509cccb912SPatrick Venture /*
5519cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with
5529cccb912SPatrick Venture * tmp105s.
5539cccb912SPatrick Venture */
5549cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
5559cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
5569cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
5579cccb912SPatrick Venture
5589cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
5599cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
5609cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */
5619cccb912SPatrick Venture
5623ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
5633ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
5643ec75e39SPatrick Venture
5659cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
5663ec75e39SPatrick Venture
5673ec75e39SPatrick Venture /* i2c-7 */
5683ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
5699cccb912SPatrick Venture /* - i2c@0: pmbus@59 */
5709cccb912SPatrick Venture /* - i2c@1: pmbus@58 */
5719cccb912SPatrick Venture /* - i2c@2: pmbus@58 */
5729cccb912SPatrick Venture /* - i2c@3: pmbus@59 */
5733ec75e39SPatrick Venture
5749cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5759cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5769cccb912SPatrick Venture }
5779cccb912SPatrick Venture
ast2500_evb_i2c_init(AspeedMachineState * bmc)578612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5792cf6cb50SCédric Le Goater {
5803c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
5813d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5823d165f12SCédric Le Goater
5837a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5843d165f12SCédric Le Goater eeprom_buf);
5852cf6cb50SCédric Le Goater
5862cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5871373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
588044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d);
5892cf6cb50SCédric Le Goater }
5902cf6cb50SCédric Le Goater
ast2600_evb_i2c_init(AspeedMachineState * bmc)591612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
592ccc2c418SCédric Le Goater {
5933c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
59452bcd997SHoward Chiu uint8_t *eeprom_buf = g_malloc0(8 * 1024);
59552bcd997SHoward Chiu
59652bcd997SHoward Chiu smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
59752bcd997SHoward Chiu eeprom_buf);
59852bcd997SHoward Chiu
59952bcd997SHoward Chiu /* LM75 is compatible with TMP105 driver */
60052bcd997SHoward Chiu i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
60152bcd997SHoward Chiu TYPE_TMP105, 0x4d);
602ccc2c418SCédric Le Goater }
603ccc2c418SCédric Le Goater
yosemitev2_bmc_i2c_init(AspeedMachineState * bmc)60434f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
60534f73a81SKarthikeyan Pasupathi {
6063c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
60734f73a81SKarthikeyan Pasupathi
60834f73a81SKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
60934f73a81SKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
61034f73a81SKarthikeyan Pasupathi yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
6110a1f86baSKarthikeyan Pasupathi /* TMP421 */
6120a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
6130a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
6140a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
6150a1f86baSKarthikeyan Pasupathi
61634f73a81SKarthikeyan Pasupathi }
61734f73a81SKarthikeyan Pasupathi
romulus_bmc_i2c_init(AspeedMachineState * bmc)618612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
6196c4567c7SCédric Le Goater {
6203c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
6216c4567c7SCédric Le Goater
6224db1c164SJamin Lin /*
6234db1c164SJamin Lin * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
6244db1c164SJamin Lin * good enough
6254db1c164SJamin Lin */
6261373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6276c4567c7SCédric Le Goater }
6286c4567c7SCédric Le Goater
tiogapass_bmc_i2c_init(AspeedMachineState * bmc)6296c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
6306c323abaSKarthikeyan Pasupathi {
6313c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
6326c323abaSKarthikeyan Pasupathi
6336c323abaSKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
6346c323abaSKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
6356c323abaSKarthikeyan Pasupathi tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
636a09d357dSKarthikeyan Pasupathi /* TMP421 */
637a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
638a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
639a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
6406c323abaSKarthikeyan Pasupathi }
6416c323abaSKarthikeyan Pasupathi
create_pca9552(AspeedSoCState * soc,int bus_id,int addr)642f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
643f4aec252SCédric Le Goater {
644f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
645f4aec252SCédric Le Goater TYPE_PCA9552, addr);
646f4aec252SCédric Le Goater }
647f4aec252SCédric Le Goater
sonorapass_bmc_i2c_init(AspeedMachineState * bmc)648612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
649143b040fSPatrick Williams {
6503c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
651143b040fSPatrick Williams
652143b040fSPatrick Williams /* bus 2 : */
6531373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
6541373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
655143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */
656143b040fSPatrick Williams
657143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */
658143b040fSPatrick Williams
659143b040fSPatrick Williams /* bus 4 : */
660143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
6617a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
662143b040fSPatrick Williams eeprom4_54);
663143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */
664f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76);
665143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */
666f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77);
667143b040fSPatrick Williams
668143b040fSPatrick Williams /* bus 6 : */
6691373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
6701373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
671143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */
672143b040fSPatrick Williams
673143b040fSPatrick Williams /* bus 8 : */
674143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6757a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
676143b040fSPatrick Williams eeprom8_56);
677f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60);
678f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61);
679143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */
680143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */
681143b040fSPatrick Williams
682143b040fSPatrick Williams /*
683143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71
684143b040fSPatrick Williams * - channel 3:
685143b040fSPatrick Williams * - tmm421 @ 0x4c
686143b040fSPatrick Williams * - tmp421 @ 0x4e
687143b040fSPatrick Williams * - tmp421 @ 0x4f
688143b040fSPatrick Williams */
689143b040fSPatrick Williams
690143b040fSPatrick Williams }
691143b040fSPatrick Williams
witherspoon_bmc_i2c_init(AspeedMachineState * bmc)692612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
69362c2c2ebSCédric Le Goater {
6947cfbde5eSPhilippe Mathieu-Daudé static const struct {
6957cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id;
6967cfbde5eSPhilippe Mathieu-Daudé LEDColor color;
6977cfbde5eSPhilippe Mathieu-Daudé const char *description;
6987cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity;
6997cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = {
7007cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW},
7017cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW},
7027cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW},
7037cfbde5eSPhilippe Mathieu-Daudé };
7043c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
7053d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024);
70615ce12cfSPhilippe Mathieu-Daudé DeviceState *dev;
7077cfbde5eSPhilippe Mathieu-Daudé LEDState *led;
70862c2c2ebSCédric Le Goater
70963ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */
710db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
71115ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1");
7122616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev),
7132616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3),
71415ce12cfSPhilippe Mathieu-Daudé &error_fatal);
7158c9a61d7SCédric Le Goater
7167cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
7177cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc),
7187cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity,
7197cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color,
7207cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description);
7217cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
7227cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0));
7237cfbde5eSPhilippe Mathieu-Daudé }
724b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
7252a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
7261373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
7271373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
72862c2c2ebSCédric Le Goater
72962c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
7301373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
731044475f3SPhilippe Mathieu-Daudé 0x4a);
7326c4567c7SCédric Le Goater
7334db1c164SJamin Lin /*
7344db1c164SJamin Lin * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
7354db1c164SJamin Lin * good enough
7364db1c164SJamin Lin */
7371373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
7383d165f12SCédric Le Goater
7397a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
7403d165f12SCédric Le Goater eeprom_buf);
741db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
74215ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0");
7432616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev),
7442616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11),
74515ce12cfSPhilippe Mathieu-Daudé &error_fatal);
74663ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */
74762c2c2ebSCédric Le Goater }
74862c2c2ebSCédric Le Goater
g220a_bmc_i2c_init(AspeedMachineState * bmc)74995f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
75095f068c8SJohn Wang {
7513c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
75295f068c8SJohn Wang DeviceState *dev;
75395f068c8SJohn Wang
75495f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
75595f068c8SJohn Wang "emc1413", 0x4c));
75695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
75795f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
75895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
75995f068c8SJohn Wang
76095f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
76195f068c8SJohn Wang "emc1413", 0x4c));
76295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
76395f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
76495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
76595f068c8SJohn Wang
76695f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
76795f068c8SJohn Wang "emc1413", 0x4c));
76895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
76995f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
77095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
7716f5f6507SJohn Wang
7726f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = {
7736f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
7746f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7756f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7766f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7776f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7786f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7796f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7806f5f6507SJohn Wang };
7816f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7826f5f6507SJohn Wang eeprom_buf);
78395f068c8SJohn Wang }
78495f068c8SJohn Wang
fp5280g2_bmc_i2c_init(AspeedMachineState * bmc)78582b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
78682b6a3f6SJohn Wang {
7873c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
78882b6a3f6SJohn Wang I2CSlave *i2c_mux;
78982b6a3f6SJohn Wang
79082b6a3f6SJohn Wang /* The at24c256 */
79182b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
79282b6a3f6SJohn Wang
79382b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
79482b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
79582b6a3f6SJohn Wang 0x48);
79682b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
79782b6a3f6SJohn Wang 0x49);
79882b6a3f6SJohn Wang
79982b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
80082b6a3f6SJohn Wang "pca9546", 0x70);
80182b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */
80282b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
80382b6a3f6SJohn Wang 0x4a);
80482b6a3f6SJohn Wang
80582b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */
80682b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
80782b6a3f6SJohn Wang
80882b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */
809f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30);
81082b6a3f6SJohn Wang }
81182b6a3f6SJohn Wang
rainier_bmc_i2c_init(AspeedMachineState * bmc)81258e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
81358e52bdbSCédric Le Goater {
8143c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
815fa6d98c0SJoel Stanley I2CSlave *i2c_mux;
816fa6d98c0SJoel Stanley
8179077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
81858e52bdbSCédric Le Goater
819f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61);
820bcb122f8SJoel Stanley
82158e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */
82258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
82358e52bdbSCédric Le Goater 0x48);
82458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
82558e52bdbSCédric Le Goater 0x49);
82658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
82758e52bdbSCédric Le Goater 0x4a);
828fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
829fa6d98c0SJoel Stanley "pca9546", 0x70);
8309077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8319077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
8329077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
833f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60);
83458e52bdbSCédric Le Goater
83558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
83658e52bdbSCédric Le Goater 0x48);
83758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
83858e52bdbSCédric Le Goater 0x49);
839f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60);
840f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61);
841fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
842fa6d98c0SJoel Stanley "pca9546", 0x70);
8439077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8449077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
84558e52bdbSCédric Le Goater
84658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
84758e52bdbSCédric Le Goater 0x48);
84858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
84958e52bdbSCédric Le Goater 0x4a);
85058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
85158e52bdbSCédric Le Goater 0x4b);
852fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
853fa6d98c0SJoel Stanley "pca9546", 0x70);
8549077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8559077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
8569077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
8579077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
85858e52bdbSCédric Le Goater
859f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30);
860f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31);
861f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32);
862f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33);
863f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60);
864f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61);
865b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
86658e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */
86758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
86858e52bdbSCédric Le Goater 0x48);
8692a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
8709077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
8719077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
87258e52bdbSCédric Le Goater
87358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
87458e52bdbSCédric Le Goater 0x48);
87558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
87658e52bdbSCédric Le Goater 0x4a);
877be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
878be85508fSNinad Palsule 64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
879be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
880be85508fSNinad Palsule 64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
881f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60);
882f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61);
88358e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */
88458e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */
88558e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */
88658e52bdbSCédric Le Goater
88758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
88858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8899077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
89058e52bdbSCédric Le Goater
89158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
89258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8939077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
89458e52bdbSCédric Le Goater
89558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
89658e52bdbSCédric Le Goater 0x48);
89758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
89858e52bdbSCédric Le Goater 0x49);
899fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
900fa6d98c0SJoel Stanley "pca9546", 0x70);
9019077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
9029077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
903f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60);
904fa6d98c0SJoel Stanley
905fa6d98c0SJoel Stanley
9069077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
907f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60);
908fa6d98c0SJoel Stanley
9099077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
910f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60);
911fa6d98c0SJoel Stanley
9129077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
913f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60);
91458e52bdbSCédric Le Goater }
91558e52bdbSCédric Le Goater
get_pca9548_channels(I2CBus * bus,uint8_t mux_addr,I2CBus ** channels)916febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
917febbe308SPeter Delevoryas I2CBus **channels)
918febbe308SPeter Delevoryas {
919febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
920febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) {
921febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i);
922febbe308SPeter Delevoryas }
923febbe308SPeter Delevoryas }
924febbe308SPeter Delevoryas
925febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
926febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
927febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
928febbe308SPeter Delevoryas
fuji_bmc_i2c_init(AspeedMachineState * bmc)929febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
930febbe308SPeter Delevoryas {
9313c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
932febbe308SPeter Delevoryas I2CBus *i2c[144] = {};
933febbe308SPeter Delevoryas
934febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) {
935febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
936febbe308SPeter Delevoryas }
937febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2];
938febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8];
939febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11];
940febbe308SPeter Delevoryas
941febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]);
942febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]);
943febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */
944febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]);
945febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
946febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
947febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
948febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
949febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) {
950febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
951febbe308SPeter Delevoryas }
952febbe308SPeter Delevoryas
953febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
954febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
955febbe308SPeter Delevoryas
956ef0eb67eSSittisak Sinprem /*
957ef0eb67eSSittisak Sinprem * EEPROM 24c64 size is 64Kbits or 8 Kbytes
958ef0eb67eSSittisak Sinprem * 24c02 size is 2Kbits or 256 bytes
959ef0eb67eSSittisak Sinprem */
960ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
961ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[20], 0x50, 256);
962ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[22], 0x52, 256);
963febbe308SPeter Delevoryas
964febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
965febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
966febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
967febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
968febbe308SPeter Delevoryas
969ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
970febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
971febbe308SPeter Delevoryas
972febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
973ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
974febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
975febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
976febbe308SPeter Delevoryas
977febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
978febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
979febbe308SPeter Delevoryas
980ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
981febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
982febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
983ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
984ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
985ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
986ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
987febbe308SPeter Delevoryas
988ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
989febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
990febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
991ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
992ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
993ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
994ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
995ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[28], 0x50, 256);
996febbe308SPeter Delevoryas
997febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) {
9989077e09aSPeter Delevoryas at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
999febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
1000febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
1001febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
1002febbe308SPeter Delevoryas }
1003febbe308SPeter Delevoryas }
1004febbe308SPeter Delevoryas
1005a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
1006a20c54b1SPatrick Williams
bletchley_bmc_i2c_init(AspeedMachineState * bmc)1007a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
1008a20c54b1SPatrick Williams {
10093c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
1010a20c54b1SPatrick Williams I2CBus *i2c[13] = {};
1011a20c54b1SPatrick Williams for (int i = 0; i < 13; i++) {
1012a20c54b1SPatrick Williams if ((i == 8) || (i == 11)) {
1013a20c54b1SPatrick Williams continue;
1014a20c54b1SPatrick Williams }
1015a20c54b1SPatrick Williams i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
1016a20c54b1SPatrick Williams }
1017a20c54b1SPatrick Williams
1018a20c54b1SPatrick Williams /* Bus 0 - 5 all have the same config. */
1019a20c54b1SPatrick Williams for (int i = 0; i < 6; i++) {
1020a20c54b1SPatrick Williams /* Missing model: ti,ina230 @ 0x45 */
1021a20c54b1SPatrick Williams /* Missing model: mps,mp5023 @ 0x40 */
1022a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
1023a20c54b1SPatrick Williams /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
1024a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
1025a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
1026a20c54b1SPatrick Williams /* Missing model: fsc,fusb302 @ 0x22 */
1027a20c54b1SPatrick Williams }
1028a20c54b1SPatrick Williams
1029a20c54b1SPatrick Williams /* Bus 6 */
1030a20c54b1SPatrick Williams at24c_eeprom_init(i2c[6], 0x56, 65536);
1031a20c54b1SPatrick Williams /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
1032a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
1033a20c54b1SPatrick Williams
1034a20c54b1SPatrick Williams
1035a20c54b1SPatrick Williams /* Bus 7 */
1036a20c54b1SPatrick Williams at24c_eeprom_init(i2c[7], 0x54, 65536);
1037a20c54b1SPatrick Williams
1038a20c54b1SPatrick Williams /* Bus 9 */
1039a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
1040a20c54b1SPatrick Williams
1041a20c54b1SPatrick Williams /* Bus 10 */
1042a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
1043a20c54b1SPatrick Williams /* Missing model: ti,hdc1080 @ 0x40 */
1044a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
1045a20c54b1SPatrick Williams
1046a20c54b1SPatrick Williams /* Bus 12 */
1047a20c54b1SPatrick Williams /* Missing model: adi,adm1278 @ 0x11 */
1048a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
1049a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
1050a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
1051a20c54b1SPatrick Williams }
1052a20c54b1SPatrick Williams
fby35_i2c_init(AspeedMachineState * bmc)1053fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
1054fa699e80SPeter Delevoryas {
10553c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
1056fa699e80SPeter Delevoryas I2CBus *i2c[16];
1057fa699e80SPeter Delevoryas
1058fa699e80SPeter Delevoryas for (int i = 0; i < 16; i++) {
1059fa699e80SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
1060fa699e80SPeter Delevoryas }
1061fa699e80SPeter Delevoryas
1062fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
1063fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
1064fa699e80SPeter Delevoryas /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
1065fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
1066fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
1067fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
1068fa699e80SPeter Delevoryas
10699077e09aSPeter Delevoryas at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
10709077e09aSPeter Delevoryas at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
1071c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
1072c0216b94SPeter Delevoryas fby35_nic_fruid_len);
1073c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
1074c0216b94SPeter Delevoryas fby35_bb_fruid_len);
1075c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1076c0216b94SPeter Delevoryas fby35_bmc_fruid_len);
1077fa699e80SPeter Delevoryas
1078fa699e80SPeter Delevoryas /*
1079fa699e80SPeter Delevoryas * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1080fa699e80SPeter Delevoryas * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1081fa699e80SPeter Delevoryas * each.
1082fa699e80SPeter Delevoryas */
1083fa699e80SPeter Delevoryas }
1084fa699e80SPeter Delevoryas
qcom_dc_scm_bmc_i2c_init(AspeedMachineState * bmc)1085fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1086fb6b3c8dSJae Hyun Yoo {
10873c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
1088fb6b3c8dSJae Hyun Yoo
1089fb6b3c8dSJae Hyun Yoo i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1090fb6b3c8dSJae Hyun Yoo }
1091fb6b3c8dSJae Hyun Yoo
qcom_dc_scm_firework_i2c_init(AspeedMachineState * bmc)1092ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1093ece4cccdSGraeme Gregory {
10943c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
10952a7a5d5cSJae Hyun Yoo I2CSlave *therm_mux, *cpuvr_mux;
1096ece4cccdSGraeme Gregory
1097ece4cccdSGraeme Gregory /* Create the generic DC-SCM hardware */
1098ece4cccdSGraeme Gregory qcom_dc_scm_bmc_i2c_init(bmc);
1099ece4cccdSGraeme Gregory
1100ece4cccdSGraeme Gregory /* Now create the Firework specific hardware */
11012a75e8c3SMaheswara Kurapati
11022a7a5d5cSJae Hyun Yoo /* I2C7 CPUVR MUX */
11032a7a5d5cSJae Hyun Yoo cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
11042a7a5d5cSJae Hyun Yoo "pca9546", 0x70);
11052a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
11062a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
11072a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
11082a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
11092a7a5d5cSJae Hyun Yoo
1110cfc68f16SMaheswara Kurapati /* I2C8 Thermal Diodes*/
1111cfc68f16SMaheswara Kurapati therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1112cfc68f16SMaheswara Kurapati "pca9548", 0x70);
1113cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1114cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1115cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1116cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1117cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1118cfc68f16SMaheswara Kurapati
11192a75e8c3SMaheswara Kurapati /* I2C9 Fan Controller (MAX31785) */
11202a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
11212a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1122ece4cccdSGraeme Gregory }
1123ece4cccdSGraeme Gregory
aspeed_get_mmio_exec(Object * obj,Error ** errp)11241a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
11251a15311aSCédric Le Goater {
11261a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec;
11271a15311aSCédric Le Goater }
11281a15311aSCédric Le Goater
aspeed_set_mmio_exec(Object * obj,bool value,Error ** errp)11291a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
11301a15311aSCédric Le Goater {
11311a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value;
11321a15311aSCédric Le Goater }
11331a15311aSCédric Le Goater
aspeed_machine_instance_init(Object * obj)11341a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
11351a15311aSCédric Le Goater {
1136621845a9SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
1137621845a9SCédric Le Goater
11381a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false;
1139621845a9SCédric Le Goater ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
11401a15311aSCédric Le Goater }
11411a15311aSCédric Le Goater
aspeed_get_fmc_model(Object * obj,Error ** errp)11429820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
11439820e52fSCédric Le Goater {
11449820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11459820e52fSCédric Le Goater return g_strdup(bmc->fmc_model);
11469820e52fSCédric Le Goater }
11479820e52fSCédric Le Goater
aspeed_set_fmc_model(Object * obj,const char * value,Error ** errp)11489820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
11499820e52fSCédric Le Goater {
11509820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11519820e52fSCédric Le Goater
11529820e52fSCédric Le Goater g_free(bmc->fmc_model);
11539820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value);
11549820e52fSCédric Le Goater }
11559820e52fSCédric Le Goater
aspeed_get_spi_model(Object * obj,Error ** errp)11569820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
11579820e52fSCédric Le Goater {
11589820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11599820e52fSCédric Le Goater return g_strdup(bmc->spi_model);
11609820e52fSCédric Le Goater }
11619820e52fSCédric Le Goater
aspeed_set_spi_model(Object * obj,const char * value,Error ** errp)11629820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
11639820e52fSCédric Le Goater {
11649820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11659820e52fSCédric Le Goater
11669820e52fSCédric Le Goater g_free(bmc->spi_model);
11679820e52fSCédric Le Goater bmc->spi_model = g_strdup(value);
11689820e52fSCédric Le Goater }
11699820e52fSCédric Le Goater
aspeed_get_bmc_console(Object * obj,Error ** errp)1170f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1171f65f6ad5SCédric Le Goater {
1172f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1173f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1174f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1175f65f6ad5SCédric Le Goater
1176944128eeSJamin Lin return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
1177f65f6ad5SCédric Le Goater }
1178f65f6ad5SCédric Le Goater
aspeed_set_bmc_console(Object * obj,const char * value,Error ** errp)1179f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1180f65f6ad5SCédric Le Goater {
1181f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1182f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1183f65f6ad5SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1184f65f6ad5SCédric Le Goater int val;
1185944128eeSJamin Lin int uart_first = aspeed_uart_first(sc);
1186944128eeSJamin Lin int uart_last = aspeed_uart_last(sc);
1187f65f6ad5SCédric Le Goater
1188f65f6ad5SCédric Le Goater if (sscanf(value, "uart%u", &val) != 1) {
1189f65f6ad5SCédric Le Goater error_setg(errp, "Bad value for \"uart\" property");
1190f65f6ad5SCédric Le Goater return;
1191f65f6ad5SCédric Le Goater }
1192f65f6ad5SCédric Le Goater
1193f65f6ad5SCédric Le Goater /* The number of UART depends on the SoC */
1194944128eeSJamin Lin if (val < uart_first || val > uart_last) {
1195944128eeSJamin Lin error_setg(errp, "\"uart\" should be in range [%d - %d]",
1196944128eeSJamin Lin uart_first, uart_last);
1197f65f6ad5SCédric Le Goater return;
1198f65f6ad5SCédric Le Goater }
1199944128eeSJamin Lin bmc->uart_chosen = val + ASPEED_DEV_UART0;
1200f65f6ad5SCédric Le Goater }
1201f65f6ad5SCédric Le Goater
aspeed_machine_class_props_init(ObjectClass * oc)12021a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
12031a15311aSCédric Le Goater {
12041a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place",
12051a15311aSCédric Le Goater aspeed_get_mmio_exec,
1206d2623129SMarkus Armbruster aspeed_set_mmio_exec);
12071a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place",
12087eecec7dSMarkus Armbruster "boot directly from CE0 flash device");
12099820e52fSCédric Le Goater
1210f65f6ad5SCédric Le Goater object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1211f65f6ad5SCédric Le Goater aspeed_set_bmc_console);
1212f65f6ad5SCédric Le Goater object_class_property_set_description(oc, "bmc-console",
1213f65f6ad5SCédric Le Goater "Change the default UART to \"uartX\"");
1214f65f6ad5SCédric Le Goater
12159820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
12169820e52fSCédric Le Goater aspeed_set_fmc_model);
12179820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model",
12189820e52fSCédric Le Goater "Change the FMC Flash model");
12199820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
12209820e52fSCédric Le Goater aspeed_set_spi_model);
12219820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model",
12229820e52fSCédric Le Goater "Change the SPI Flash model");
12231a15311aSCédric Le Goater }
12241a15311aSCédric Le Goater
aspeed_machine_class_init_cpus_defaults(MachineClass * mc)122543a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
1226b7f1a0cbSCédric Le Goater {
122743a0a5c9SPhilippe Mathieu-Daudé AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
122843a0a5c9SPhilippe Mathieu-Daudé AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
122943a0a5c9SPhilippe Mathieu-Daudé
123043a0a5c9SPhilippe Mathieu-Daudé mc->default_cpus = sc->num_cpus;
123143a0a5c9SPhilippe Mathieu-Daudé mc->min_cpus = sc->num_cpus;
123243a0a5c9SPhilippe Mathieu-Daudé mc->max_cpus = sc->num_cpus;
1233dc13909eSPhilippe Mathieu-Daudé mc->valid_cpu_types = sc->valid_cpu_types;
1234b7f1a0cbSCédric Le Goater }
1235b7f1a0cbSCédric Le Goater
aspeed_machine_ast2600_get_boot_from_emmc(Object * obj,Error ** errp)1236056b779eSCédric Le Goater static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp)
1237056b779eSCédric Le Goater {
1238056b779eSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1239056b779eSCédric Le Goater
1240056b779eSCédric Le Goater return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
1241056b779eSCédric Le Goater }
1242056b779eSCédric Le Goater
aspeed_machine_ast2600_set_boot_from_emmc(Object * obj,bool value,Error ** errp)1243056b779eSCédric Le Goater static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value,
1244056b779eSCédric Le Goater Error **errp)
1245056b779eSCédric Le Goater {
1246056b779eSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1247056b779eSCédric Le Goater
1248056b779eSCédric Le Goater if (value) {
1249056b779eSCédric Le Goater bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1250056b779eSCédric Le Goater } else {
1251056b779eSCédric Le Goater bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1252056b779eSCédric Le Goater }
1253056b779eSCédric Le Goater }
1254056b779eSCédric Le Goater
aspeed_machine_ast2600_class_emmc_init(ObjectClass * oc)1255056b779eSCédric Le Goater static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc)
1256056b779eSCédric Le Goater {
1257056b779eSCédric Le Goater object_class_property_add_bool(oc, "boot-emmc",
1258056b779eSCédric Le Goater aspeed_machine_ast2600_get_boot_from_emmc,
1259056b779eSCédric Le Goater aspeed_machine_ast2600_set_boot_from_emmc);
1260056b779eSCédric Le Goater object_class_property_set_description(oc, "boot-emmc",
1261056b779eSCédric Le Goater "Set or unset boot from EMMC");
1262056b779eSCédric Le Goater }
1263056b779eSCédric Le Goater
aspeed_machine_class_init(ObjectClass * oc,const void * data)126412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_class_init(ObjectClass *oc, const void *data)
126562c2c2ebSCédric Le Goater {
126662c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc);
1267d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
126862c2c2ebSCédric Le Goater
1269fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init;
127062c2c2ebSCédric Le Goater mc->no_floppy = 1;
127162c2c2ebSCédric Le Goater mc->no_cdrom = 1;
127262c2c2ebSCédric Le Goater mc->no_parallel = 1;
1273afcbaed6SIgor Mammedov mc->default_ram_id = "ram";
1274d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON;
12755d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5;
12761a15311aSCédric Le Goater
12771a15311aSCédric Le Goater aspeed_machine_class_props_init(oc);
127862c2c2ebSCédric Le Goater }
127962c2c2ebSCédric Le Goater
aspeed_machine_palmetto_class_init(ObjectClass * oc,const void * data)128012d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_palmetto_class_init(ObjectClass *oc,
128112d1a768SPhilippe Mathieu-Daudé const void *data)
1282baa4732bSCédric Le Goater {
1283baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc);
1284baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1285baa4732bSCédric Le Goater
1286baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1287baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1";
1288baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1289baa4732bSCédric Le Goater amc->fmc_model = "n25q256a";
129070322913SCédric Le Goater amc->spi_model = "mx25l25635f";
1291baa4732bSCédric Le Goater amc->num_cs = 1;
1292baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init;
1293cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1294baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB;
129543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1296baa4732bSCédric Le Goater };
1297baa4732bSCédric Le Goater
aspeed_machine_quanta_q71l_class_init(ObjectClass * oc,const void * data)129812d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc,
129912d1a768SPhilippe Mathieu-Daudé const void *data)
13009cccb912SPatrick Venture {
13019cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc);
13029cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
13039cccb912SPatrick Venture
13049cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)";
13059cccb912SPatrick Venture amc->soc_name = "ast2400-a1";
13069cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
13079cccb912SPatrick Venture amc->fmc_model = "n25q256a";
13089cccb912SPatrick Venture amc->spi_model = "mx25l25635e";
13099cccb912SPatrick Venture amc->num_cs = 1;
13109cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init;
1311cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
13129cccb912SPatrick Venture mc->default_ram_size = 128 * MiB;
131343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
13149cccb912SPatrick Venture }
13159cccb912SPatrick Venture
aspeed_machine_supermicrox11_bmc_class_init(ObjectClass * oc,const void * data)131640a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
131712d1a768SPhilippe Mathieu-Daudé const void *data)
131840a38df5SErik Smit {
131940a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc);
132040a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
132140a38df5SErik Smit
132240a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)";
132340a38df5SErik Smit amc->soc_name = "ast2400-a1";
132440a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
132540a38df5SErik Smit amc->fmc_model = "mx25l25635e";
132640a38df5SErik Smit amc->spi_model = "mx25l25635e";
132740a38df5SErik Smit amc->num_cs = 1;
132840a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
132940a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init;
1330cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
133140a38df5SErik Smit mc->default_ram_size = 256 * MiB;
133243a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
133340a38df5SErik Smit }
133440a38df5SErik Smit
aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass * oc,const void * data)133547936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
133612d1a768SPhilippe Mathieu-Daudé const void *data)
133747936597SGuenter Roeck {
133847936597SGuenter Roeck MachineClass *mc = MACHINE_CLASS(oc);
133947936597SGuenter Roeck AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
134047936597SGuenter Roeck
134147936597SGuenter Roeck mc->desc = "Supermicro X11 SPI BMC (ARM1176)";
134247936597SGuenter Roeck amc->soc_name = "ast2500-a1";
134347936597SGuenter Roeck amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
134447936597SGuenter Roeck amc->fmc_model = "mx25l25635e";
134547936597SGuenter Roeck amc->spi_model = "mx25l25635e";
134647936597SGuenter Roeck amc->num_cs = 1;
134747936597SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
134847936597SGuenter Roeck amc->i2c_init = palmetto_bmc_i2c_init;
1349cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
135047936597SGuenter Roeck mc->default_ram_size = 512 * MiB;
135143a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
135247936597SGuenter Roeck }
135347936597SGuenter Roeck
aspeed_machine_ast2500_evb_class_init(ObjectClass * oc,const void * data)135412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc,
135512d1a768SPhilippe Mathieu-Daudé const void *data)
1356baa4732bSCédric Le Goater {
1357baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc);
1358baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1359baa4732bSCédric Le Goater
1360baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)";
1361baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1";
1362baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1363753abfc4SJae Hyun Yoo amc->fmc_model = "mx25l25635e";
136470322913SCédric Le Goater amc->spi_model = "mx25l25635f";
1365baa4732bSCédric Le Goater amc->num_cs = 1;
1366baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init;
1367cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1368baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB;
136943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1370baa4732bSCédric Le Goater };
1371baa4732bSCédric Le Goater
aspeed_machine_yosemitev2_class_init(ObjectClass * oc,const void * data)137212d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc,
137312d1a768SPhilippe Mathieu-Daudé const void *data)
137434f73a81SKarthikeyan Pasupathi {
137534f73a81SKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc);
137634f73a81SKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
137734f73a81SKarthikeyan Pasupathi
137834f73a81SKarthikeyan Pasupathi mc->desc = "Facebook YosemiteV2 BMC (ARM1176)";
137934f73a81SKarthikeyan Pasupathi amc->soc_name = "ast2500-a1";
138034f73a81SKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
138134f73a81SKarthikeyan Pasupathi amc->hw_strap2 = 0;
138234f73a81SKarthikeyan Pasupathi amc->fmc_model = "n25q256a";
138334f73a81SKarthikeyan Pasupathi amc->spi_model = "mx25l25635e";
138434f73a81SKarthikeyan Pasupathi amc->num_cs = 2;
138534f73a81SKarthikeyan Pasupathi amc->i2c_init = yosemitev2_bmc_i2c_init;
1386cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
138734f73a81SKarthikeyan Pasupathi mc->default_ram_size = 512 * MiB;
138843a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
138934f73a81SKarthikeyan Pasupathi };
139034f73a81SKarthikeyan Pasupathi
aspeed_machine_romulus_class_init(ObjectClass * oc,const void * data)139112d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_romulus_class_init(ObjectClass *oc,
139212d1a768SPhilippe Mathieu-Daudé const void *data)
1393baa4732bSCédric Le Goater {
1394baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc);
1395baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1396baa4732bSCédric Le Goater
1397baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)";
1398baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1";
1399baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1400baa4732bSCédric Le Goater amc->fmc_model = "n25q256a";
1401baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g";
1402baa4732bSCédric Le Goater amc->num_cs = 2;
1403baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init;
1404cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1405baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB;
140643a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1407baa4732bSCédric Le Goater };
1408baa4732bSCédric Le Goater
aspeed_machine_tiogapass_class_init(ObjectClass * oc,const void * data)140912d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_tiogapass_class_init(ObjectClass *oc,
141012d1a768SPhilippe Mathieu-Daudé const void *data)
14116c323abaSKarthikeyan Pasupathi {
14126c323abaSKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc);
14136c323abaSKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
14146c323abaSKarthikeyan Pasupathi
14156c323abaSKarthikeyan Pasupathi mc->desc = "Facebook Tiogapass BMC (ARM1176)";
14166c323abaSKarthikeyan Pasupathi amc->soc_name = "ast2500-a1";
14176c323abaSKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
14186c323abaSKarthikeyan Pasupathi amc->hw_strap2 = 0;
14196c323abaSKarthikeyan Pasupathi amc->fmc_model = "n25q256a";
14206c323abaSKarthikeyan Pasupathi amc->spi_model = "mx25l25635e";
14216c323abaSKarthikeyan Pasupathi amc->num_cs = 2;
14226c323abaSKarthikeyan Pasupathi amc->i2c_init = tiogapass_bmc_i2c_init;
1423cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
14246c323abaSKarthikeyan Pasupathi mc->default_ram_size = 1 * GiB;
142543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
14266c323abaSKarthikeyan Pasupathi };
14276c323abaSKarthikeyan Pasupathi
aspeed_machine_sonorapass_class_init(ObjectClass * oc,const void * data)142812d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_sonorapass_class_init(ObjectClass *oc,
142912d1a768SPhilippe Mathieu-Daudé const void *data)
1430143b040fSPatrick Williams {
1431143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc);
1432143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1433143b040fSPatrick Williams
1434143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)";
1435143b040fSPatrick Williams amc->soc_name = "ast2500-a1";
1436143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1437143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g";
1438143b040fSPatrick Williams amc->spi_model = "mx66l1g45g";
1439143b040fSPatrick Williams amc->num_cs = 2;
1440143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init;
1441cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1442143b040fSPatrick Williams mc->default_ram_size = 512 * MiB;
144343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1444143b040fSPatrick Williams };
1445143b040fSPatrick Williams
aspeed_machine_witherspoon_class_init(ObjectClass * oc,const void * data)144612d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_witherspoon_class_init(ObjectClass *oc,
144712d1a768SPhilippe Mathieu-Daudé const void *data)
1448baa4732bSCédric Le Goater {
1449baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc);
1450baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1451baa4732bSCédric Le Goater
1452baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
1453baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1";
1454baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
145570322913SCédric Le Goater amc->fmc_model = "mx25l25635f";
1456baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g";
1457baa4732bSCédric Le Goater amc->num_cs = 2;
1458baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init;
1459cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1460baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB;
146143a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1462baa4732bSCédric Le Goater };
1463baa4732bSCédric Le Goater
aspeed_machine_ast2600_evb_class_init(ObjectClass * oc,const void * data)146412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc,
146512d1a768SPhilippe Mathieu-Daudé const void *data)
1466baa4732bSCédric Le Goater {
1467baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc);
1468baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1469baa4732bSCédric Le Goater
1470f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)";
1471c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3";
1472baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1473baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1474753abfc4SJae Hyun Yoo amc->fmc_model = "mx66u51235f";
1475baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f";
1476baa4732bSCédric Le Goater amc->num_cs = 1;
147729193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
147829193286SGuenter Roeck ASPEED_MAC3_ON;
1479bf8a471aSJamin Lin amc->sdhci_wp_inverted = true;
1480baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init;
1481cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1482baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB;
148343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1484056b779eSCédric Le Goater aspeed_machine_ast2600_class_emmc_init(oc);
1485baa4732bSCédric Le Goater };
1486baa4732bSCédric Le Goater
aspeed_machine_g220a_class_init(ObjectClass * oc,const void * data)148712d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_g220a_class_init(ObjectClass *oc, const void *data)
148895f068c8SJohn Wang {
148995f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc);
149095f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
149195f068c8SJohn Wang
149295f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)";
149395f068c8SJohn Wang amc->soc_name = "ast2500-a1";
149495f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1;
149595f068c8SJohn Wang amc->fmc_model = "n25q512a";
149695f068c8SJohn Wang amc->spi_model = "mx25l25635e";
149795f068c8SJohn Wang amc->num_cs = 2;
14985bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
149995f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init;
1500cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
150195f068c8SJohn Wang mc->default_ram_size = 1024 * MiB;
150243a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
150395f068c8SJohn Wang };
150495f068c8SJohn Wang
aspeed_machine_fp5280g2_class_init(ObjectClass * oc,const void * data)150512d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc,
150612d1a768SPhilippe Mathieu-Daudé const void *data)
150782b6a3f6SJohn Wang {
150882b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc);
150982b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
151082b6a3f6SJohn Wang
151182b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)";
151282b6a3f6SJohn Wang amc->soc_name = "ast2500-a1";
151382b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
151482b6a3f6SJohn Wang amc->fmc_model = "n25q512a";
151582b6a3f6SJohn Wang amc->spi_model = "mx25l25635e";
151682b6a3f6SJohn Wang amc->num_cs = 2;
151782b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
151882b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init;
1519cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
152082b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB;
152143a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
152282b6a3f6SJohn Wang };
152382b6a3f6SJohn Wang
aspeed_machine_rainier_class_init(ObjectClass * oc,const void * data)152412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_rainier_class_init(ObjectClass *oc, const void *data)
152558e52bdbSCédric Le Goater {
152658e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc);
152758e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
152858e52bdbSCédric Le Goater
1529f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)";
1530c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3";
153158e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
153258e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
153358e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g";
153458e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g";
153558e52bdbSCédric Le Goater amc->num_cs = 2;
153658e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
153758e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init;
1538cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
153958e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB;
154043a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1541056b779eSCédric Le Goater aspeed_machine_ast2600_class_emmc_init(oc);
154258e52bdbSCédric Le Goater };
154358e52bdbSCédric Le Goater
15441e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1545febbe308SPeter Delevoryas
aspeed_machine_fuji_class_init(ObjectClass * oc,const void * data)154612d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_fuji_class_init(ObjectClass *oc, const void *data)
1547febbe308SPeter Delevoryas {
1548febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc);
1549febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1550febbe308SPeter Delevoryas
1551febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1552febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3";
1553febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1554febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1555febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g";
1556febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g";
1557febbe308SPeter Delevoryas amc->num_cs = 2;
1558febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON;
1559febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init;
1560febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1;
1561cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1562febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE;
156343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1564febbe308SPeter Delevoryas };
1565febbe308SPeter Delevoryas
15661e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1567104bdaffSPatrick Williams
aspeed_machine_bletchley_class_init(ObjectClass * oc,const void * data)156812d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_bletchley_class_init(ObjectClass *oc,
156912d1a768SPhilippe Mathieu-Daudé const void *data)
1570a20c54b1SPatrick Williams {
1571a20c54b1SPatrick Williams MachineClass *mc = MACHINE_CLASS(oc);
1572a20c54b1SPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1573a20c54b1SPatrick Williams
1574a20c54b1SPatrick Williams mc->desc = "Facebook Bletchley BMC (Cortex-A7)";
1575a20c54b1SPatrick Williams amc->soc_name = "ast2600-a3";
1576a20c54b1SPatrick Williams amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1577a20c54b1SPatrick Williams amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1578a20c54b1SPatrick Williams amc->fmc_model = "w25q01jvq";
1579a20c54b1SPatrick Williams amc->spi_model = NULL;
1580a20c54b1SPatrick Williams amc->num_cs = 2;
1581a20c54b1SPatrick Williams amc->macs_mask = ASPEED_MAC2_ON;
1582a20c54b1SPatrick Williams amc->i2c_init = bletchley_bmc_i2c_init;
1583cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1584104bdaffSPatrick Williams mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
158543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1586a20c54b1SPatrick Williams }
1587a20c54b1SPatrick Williams
fby35_reset(MachineState * state,ResetType type)15881b063fe2SJuraj Marcin static void fby35_reset(MachineState *state, ResetType type)
1589fa699e80SPeter Delevoryas {
1590fa699e80SPeter Delevoryas AspeedMachineState *bmc = ASPEED_MACHINE(state);
15913c392e87SPhilippe Mathieu-Daudé AspeedGPIOState *gpio = &bmc->soc->gpio;
1592fa699e80SPeter Delevoryas
15931b063fe2SJuraj Marcin qemu_devices_reset(type);
1594fa699e80SPeter Delevoryas
1595f0418558SPeter Delevoryas /* Board ID: 7 (Class-1, 4 slots) */
1596fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1597fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1598fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1599fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1600f0418558SPeter Delevoryas
1601f0418558SPeter Delevoryas /* Slot presence pins, inverse polarity. (False means present) */
1602f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1603f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1604f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1605f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1606f0418558SPeter Delevoryas
1607f0418558SPeter Delevoryas /* Slot 12v power pins, normal polarity. (True means powered-on) */
1608f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1609f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1610f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1611f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1612fa699e80SPeter Delevoryas }
1613fa699e80SPeter Delevoryas
aspeed_machine_fby35_class_init(ObjectClass * oc,const void * data)161412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_fby35_class_init(ObjectClass *oc, const void *data)
1615fa699e80SPeter Delevoryas {
1616fa699e80SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc);
1617fa699e80SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1618fa699e80SPeter Delevoryas
1619fa699e80SPeter Delevoryas mc->desc = "Facebook fby35 BMC (Cortex-A7)";
1620fa699e80SPeter Delevoryas mc->reset = fby35_reset;
1621fa699e80SPeter Delevoryas amc->fmc_model = "mx66l1g45g";
1622fa699e80SPeter Delevoryas amc->num_cs = 2;
1623fa699e80SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON;
1624fa699e80SPeter Delevoryas amc->i2c_init = fby35_i2c_init;
1625cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1626fa699e80SPeter Delevoryas /* FIXME: Replace this macro with something more general */
1627fa699e80SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE;
162843a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1629fa699e80SPeter Delevoryas }
1630fa699e80SPeter Delevoryas
163166c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
163266c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
163366c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
163466c895b8SJamin Lin
aspeed_minibmc_machine_init(MachineState * machine)163566c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
163666c895b8SJamin Lin {
163766c895b8SJamin Lin AspeedMachineState *bmc = ASPEED_MACHINE(machine);
163866c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
163966c895b8SJamin Lin Clock *sysclk;
164066c895b8SJamin Lin
164166c895b8SJamin Lin sysclk = clock_new(OBJECT(machine), "SYSCLK");
164266c895b8SJamin Lin clock_set_hz(sysclk, SYSCLK_FRQ);
164366c895b8SJamin Lin
16443c392e87SPhilippe Mathieu-Daudé bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
16453c392e87SPhilippe Mathieu-Daudé object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
16463c392e87SPhilippe Mathieu-Daudé object_unref(OBJECT(bmc->soc));
16473c392e87SPhilippe Mathieu-Daudé qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
164866c895b8SJamin Lin
16493c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "memory",
16504dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort);
1651d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc);
16523c392e87SPhilippe Mathieu-Daudé qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
165366c895b8SJamin Lin
165422b3c557SJamin Lin if (defaults_enabled()) {
16553c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->fmc,
165666c895b8SJamin Lin bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
165766c895b8SJamin Lin amc->num_cs,
165866c895b8SJamin Lin 0);
165966c895b8SJamin Lin
16603c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[0],
166166c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model,
166266c895b8SJamin Lin amc->num_cs, amc->num_cs);
166366c895b8SJamin Lin
16643c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[1],
166566c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model,
166666c895b8SJamin Lin amc->num_cs, (amc->num_cs * 2));
166722b3c557SJamin Lin }
166866c895b8SJamin Lin
166966c895b8SJamin Lin if (amc->i2c_init) {
167066c895b8SJamin Lin amc->i2c_init(bmc);
167166c895b8SJamin Lin }
167266c895b8SJamin Lin
167366c895b8SJamin Lin armv7m_load_kernel(ARM_CPU(first_cpu),
167466c895b8SJamin Lin machine->kernel_filename,
1675761c532aSPeter Maydell 0,
167666c895b8SJamin Lin AST1030_INTERNAL_FLASH_SIZE);
167766c895b8SJamin Lin }
167866c895b8SJamin Lin
ast1030_evb_i2c_init(AspeedMachineState * bmc)16794c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
16804c70ab16STroy Lee {
16813c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc;
16824c70ab16STroy Lee
1683673d8215SMichael Tokarev /* U10 24C08 connects to SDA/SCL Group 1 by default */
16844c70ab16STroy Lee uint8_t *eeprom_buf = g_malloc0(32 * 1024);
16854c70ab16STroy Lee smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
16864c70ab16STroy Lee
16874c70ab16STroy Lee /* U11 LM75 connects to SDA/SCL Group 2 by default */
16884c70ab16STroy Lee i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
16894c70ab16STroy Lee }
16904c70ab16STroy Lee
aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass * oc,const void * data)169166c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
169212d1a768SPhilippe Mathieu-Daudé const void *data)
169366c895b8SJamin Lin {
169466c895b8SJamin Lin MachineClass *mc = MACHINE_CLASS(oc);
169566c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
169666c895b8SJamin Lin
169766c895b8SJamin Lin mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
169866c895b8SJamin Lin amc->soc_name = "ast1030-a1";
169966c895b8SJamin Lin amc->hw_strap1 = 0;
170066c895b8SJamin Lin amc->hw_strap2 = 0;
170166c895b8SJamin Lin mc->init = aspeed_minibmc_machine_init;
17024c70ab16STroy Lee amc->i2c_init = ast1030_evb_i2c_init;
170366c895b8SJamin Lin mc->default_ram_size = 0;
1704e15001bcSJamin Lin amc->fmc_model = "w25q80bl";
1705a37bbfbbSJamin Lin amc->spi_model = "w25q256";
170666c895b8SJamin Lin amc->num_cs = 2;
170766c895b8SJamin Lin amc->macs_mask = 0;
170843a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
170966c895b8SJamin Lin }
171066c895b8SJamin Lin
171192707992SJamin Lin #ifdef TARGET_AARCH64
ast2700_evb_i2c_init(AspeedMachineState * bmc)17122c075ff3SJamin Lin static void ast2700_evb_i2c_init(AspeedMachineState *bmc)
17132c075ff3SJamin Lin {
17142c075ff3SJamin Lin AspeedSoCState *soc = bmc->soc;
17152c075ff3SJamin Lin
17162c075ff3SJamin Lin /* LM75 is compatible with TMP105 driver */
17172c075ff3SJamin Lin i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0),
17182c075ff3SJamin Lin TYPE_TMP105, 0x4d);
17192c075ff3SJamin Lin }
17202c075ff3SJamin Lin
aspeed_machine_ast2700a0_evb_class_init(ObjectClass * oc,const void * data)172112d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_ast2700a0_evb_class_init(ObjectClass *oc,
172212d1a768SPhilippe Mathieu-Daudé const void *data)
172392707992SJamin Lin {
172492707992SJamin Lin MachineClass *mc = MACHINE_CLASS(oc);
172592707992SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
172692707992SJamin Lin
1727de4e9799SJamin Lin mc->alias = "ast2700-evb";
1728de4e9799SJamin Lin mc->desc = "Aspeed AST2700 A0 EVB (Cortex-A35)";
172992707992SJamin Lin amc->soc_name = "ast2700-a0";
173092707992SJamin Lin amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
173192707992SJamin Lin amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
173292707992SJamin Lin amc->fmc_model = "w25q01jvq";
173392707992SJamin Lin amc->spi_model = "w25q512jv";
173492707992SJamin Lin amc->num_cs = 2;
173592707992SJamin Lin amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
173692707992SJamin Lin amc->uart_default = ASPEED_DEV_UART12;
17372c075ff3SJamin Lin amc->i2c_init = ast2700_evb_i2c_init;
1738*ee447054SJamin Lin amc->vbootrom = true;
1739cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
174092707992SJamin Lin mc->default_ram_size = 1 * GiB;
174192707992SJamin Lin aspeed_machine_class_init_cpus_defaults(mc);
174292707992SJamin Lin }
1743498c519eSJamin Lin
aspeed_machine_ast2700a1_evb_class_init(ObjectClass * oc,const void * data)174412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_ast2700a1_evb_class_init(ObjectClass *oc,
174512d1a768SPhilippe Mathieu-Daudé const void *data)
1746498c519eSJamin Lin {
1747498c519eSJamin Lin MachineClass *mc = MACHINE_CLASS(oc);
1748498c519eSJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1749498c519eSJamin Lin
1750498c519eSJamin Lin mc->desc = "Aspeed AST2700 A1 EVB (Cortex-A35)";
1751498c519eSJamin Lin amc->soc_name = "ast2700-a1";
1752498c519eSJamin Lin amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
1753498c519eSJamin Lin amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
1754498c519eSJamin Lin amc->fmc_model = "w25q01jvq";
1755498c519eSJamin Lin amc->spi_model = "w25q512jv";
1756498c519eSJamin Lin amc->num_cs = 2;
1757498c519eSJamin Lin amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
1758498c519eSJamin Lin amc->uart_default = ASPEED_DEV_UART12;
1759498c519eSJamin Lin amc->i2c_init = ast2700_evb_i2c_init;
1760*ee447054SJamin Lin amc->vbootrom = true;
1761498c519eSJamin Lin mc->auto_create_sdcard = true;
1762498c519eSJamin Lin mc->default_ram_size = 1 * GiB;
1763498c519eSJamin Lin aspeed_machine_class_init_cpus_defaults(mc);
1764498c519eSJamin Lin }
176592707992SJamin Lin #endif
176692707992SJamin Lin
aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass * oc,const void * data)1767fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
176812d1a768SPhilippe Mathieu-Daudé const void *data)
1769fb6b3c8dSJae Hyun Yoo {
1770fb6b3c8dSJae Hyun Yoo MachineClass *mc = MACHINE_CLASS(oc);
1771fb6b3c8dSJae Hyun Yoo AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1772fb6b3c8dSJae Hyun Yoo
1773fb6b3c8dSJae Hyun Yoo mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1774fb6b3c8dSJae Hyun Yoo amc->soc_name = "ast2600-a3";
1775fb6b3c8dSJae Hyun Yoo amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1776fb6b3c8dSJae Hyun Yoo amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1777fb6b3c8dSJae Hyun Yoo amc->fmc_model = "n25q512a";
1778fb6b3c8dSJae Hyun Yoo amc->spi_model = "n25q512a";
1779fb6b3c8dSJae Hyun Yoo amc->num_cs = 2;
1780fb6b3c8dSJae Hyun Yoo amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1781fb6b3c8dSJae Hyun Yoo amc->i2c_init = qcom_dc_scm_bmc_i2c_init;
1782cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1783fb6b3c8dSJae Hyun Yoo mc->default_ram_size = 1 * GiB;
178443a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1785fb6b3c8dSJae Hyun Yoo };
1786fb6b3c8dSJae Hyun Yoo
aspeed_machine_qcom_firework_class_init(ObjectClass * oc,const void * data)1787ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
178812d1a768SPhilippe Mathieu-Daudé const void *data)
1789ece4cccdSGraeme Gregory {
1790ece4cccdSGraeme Gregory MachineClass *mc = MACHINE_CLASS(oc);
1791ece4cccdSGraeme Gregory AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1792ece4cccdSGraeme Gregory
1793ece4cccdSGraeme Gregory mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1794ece4cccdSGraeme Gregory amc->soc_name = "ast2600-a3";
1795ece4cccdSGraeme Gregory amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1796ece4cccdSGraeme Gregory amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1797ece4cccdSGraeme Gregory amc->fmc_model = "n25q512a";
1798ece4cccdSGraeme Gregory amc->spi_model = "n25q512a";
1799ece4cccdSGraeme Gregory amc->num_cs = 2;
1800ece4cccdSGraeme Gregory amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1801ece4cccdSGraeme Gregory amc->i2c_init = qcom_dc_scm_firework_i2c_init;
1802cdc8d7caSPhilippe Mathieu-Daudé mc->auto_create_sdcard = true;
1803ece4cccdSGraeme Gregory mc->default_ram_size = 1 * GiB;
180443a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc);
1805ece4cccdSGraeme Gregory };
1806ece4cccdSGraeme Gregory
1807baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1808baa4732bSCédric Le Goater {
1809baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"),
1810baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE,
1811baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init,
1812baa4732bSCédric Le Goater }, {
181340a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"),
181440a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE,
181540a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init,
181640a38df5SErik Smit }, {
181747936597SGuenter Roeck .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
181847936597SGuenter Roeck .parent = TYPE_ASPEED_MACHINE,
181947936597SGuenter Roeck .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init,
182047936597SGuenter Roeck }, {
1821baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"),
1822baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE,
1823baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init,
1824baa4732bSCédric Le Goater }, {
1825baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"),
1826baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE,
1827baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init,
1828baa4732bSCédric Le Goater }, {
1829143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"),
1830143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE,
1831143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init,
1832143b040fSPatrick Williams }, {
1833baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
1834baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE,
1835baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init,
1836baa4732bSCédric Le Goater }, {
1837baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"),
1838baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE,
1839baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init,
1840baa4732bSCédric Le Goater }, {
184134f73a81SKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("yosemitev2-bmc"),
184234f73a81SKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE,
184334f73a81SKarthikeyan Pasupathi .class_init = aspeed_machine_yosemitev2_class_init,
184434f73a81SKarthikeyan Pasupathi }, {
18456c323abaSKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("tiogapass-bmc"),
18466c323abaSKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE,
18476c323abaSKarthikeyan Pasupathi .class_init = aspeed_machine_tiogapass_class_init,
18486c323abaSKarthikeyan Pasupathi }, {
184995f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"),
185095f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE,
185195f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init,
185295f068c8SJohn Wang }, {
1853fb6b3c8dSJae Hyun Yoo .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1854fb6b3c8dSJae Hyun Yoo .parent = TYPE_ASPEED_MACHINE,
1855fb6b3c8dSJae Hyun Yoo .class_init = aspeed_machine_qcom_dc_scm_v1_class_init,
1856fb6b3c8dSJae Hyun Yoo }, {
1857ece4cccdSGraeme Gregory .name = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1858ece4cccdSGraeme Gregory .parent = TYPE_ASPEED_MACHINE,
1859ece4cccdSGraeme Gregory .class_init = aspeed_machine_qcom_firework_class_init,
1860ece4cccdSGraeme Gregory }, {
186182b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"),
186282b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE,
186382b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init,
186482b6a3f6SJohn Wang }, {
18659cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
18669cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE,
18679cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init,
18689cccb912SPatrick Venture }, {
186958e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"),
187058e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE,
187158e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init,
187258e52bdbSCédric Le Goater }, {
1873febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"),
1874febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE,
1875febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init,
1876febbe308SPeter Delevoryas }, {
1877a20c54b1SPatrick Williams .name = MACHINE_TYPE_NAME("bletchley-bmc"),
1878a20c54b1SPatrick Williams .parent = TYPE_ASPEED_MACHINE,
1879a20c54b1SPatrick Williams .class_init = aspeed_machine_bletchley_class_init,
1880a20c54b1SPatrick Williams }, {
1881fa699e80SPeter Delevoryas .name = MACHINE_TYPE_NAME("fby35-bmc"),
1882fa699e80SPeter Delevoryas .parent = MACHINE_TYPE_NAME("ast2600-evb"),
1883fa699e80SPeter Delevoryas .class_init = aspeed_machine_fby35_class_init,
1884fa699e80SPeter Delevoryas }, {
188566c895b8SJamin Lin .name = MACHINE_TYPE_NAME("ast1030-evb"),
188666c895b8SJamin Lin .parent = TYPE_ASPEED_MACHINE,
188766c895b8SJamin Lin .class_init = aspeed_minibmc_machine_ast1030_evb_class_init,
188892707992SJamin Lin #ifdef TARGET_AARCH64
188992707992SJamin Lin }, {
1890de4e9799SJamin Lin .name = MACHINE_TYPE_NAME("ast2700a0-evb"),
189192707992SJamin Lin .parent = TYPE_ASPEED_MACHINE,
1892de4e9799SJamin Lin .class_init = aspeed_machine_ast2700a0_evb_class_init,
1893498c519eSJamin Lin }, {
1894498c519eSJamin Lin .name = MACHINE_TYPE_NAME("ast2700a1-evb"),
1895498c519eSJamin Lin .parent = TYPE_ASPEED_MACHINE,
1896498c519eSJamin Lin .class_init = aspeed_machine_ast2700a1_evb_class_init,
189792707992SJamin Lin #endif
189866c895b8SJamin Lin }, {
1899fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE,
190062c2c2ebSCédric Le Goater .parent = TYPE_MACHINE,
1901888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState),
19021a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init,
1903fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass),
1904fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init,
1905baa4732bSCédric Le Goater .abstract = true,
1906baa4732bSCédric Le Goater }
1907fca9ca1bSCédric Le Goater };
190874fb1f38SCédric Le Goater
1909baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1910