On Tue, May 19, 2026 at 05:15:45PM +0200, Cédric Le Goater wrote:
> On 5/19/26 12:36, William de Abreu Pinho wrote:
> > Add the Facebook Anacapa BMC machine. The I2C topology is based on the
> > Linux kernel device tree [1]. Hardware strap register values are taken
> > from real hardware.
> >
> > A functional test is included using the OpenBMC image built from [2],
> > similar to the tests for bletchley-bmc and catalina-bmc.
> >
> > [1]:
> > https://github.com/torvalds/linux/blob/76b4ec8efdc3887cdbf730da2e55881fc1a18770/arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-anacapa.dts
> > [2]:
> > https://github.com/openbmc/openbmc/commit/8e22df918eaaa5d83143471d24ef0eeb1c1e3c7c
> >
> > Signed-off-by: William de Abreu Pinho <[email protected]>
> > ---
> > hw/arm/aspeed_ast2600_anacapa.c | 153
> > ++++++++++++++++++++++++++++
> > hw/arm/meson.build | 1 +
> > tests/functional/arm/meson.build | 2 +
> > tests/functional/arm/test_aspeed_anacapa.py | 25 +++++
> > 4 files changed, 181 insertions(+)
>
> I forgot to tell you to update docs/system/arm/aspeed.rst too.
>
> With that,
>
> Reviewed-by: Cédric Le Goater <[email protected]>
>
> >
> > diff --git a/hw/arm/aspeed_ast2600_anacapa.c
> > b/hw/arm/aspeed_ast2600_anacapa.c
> > new file mode 100644
> > index 0000000000..c24f00d44c
> > --- /dev/null
> > +++ b/hw/arm/aspeed_ast2600_anacapa.c
> > @@ -0,0 +1,153 @@
> > +/*
> > + * Facebook Anacapa
> > + *
> > + * Copyright (c) Meta Platforms, Inc. and affiliates.
> > + *
> > + * SPDX-License-Identifier: GPL-2.0-or-later
> > + */
> > +
> > +#include "qemu/osdep.h"
> > +#include "qapi/error.h"
> > +#include "hw/arm/machines-qom.h"
> > +#include "hw/arm/aspeed.h"
> > +#include "hw/arm/aspeed_soc.h"
> > +#include "hw/i2c/i2c_mux_pca954x.h"
> > +#include "hw/gpio/pca9552.h"
> > +#include "hw/nvram/eeprom_at24c.h"
> > +
> > +/* Anacapa hardware value */
> > +#define ANACAPA_BMC_HW_STRAP1 0x00002002
> > +#define ANACAPA_BMC_HW_STRAP2 0x00000000
> > +#define ANACAPA_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
> > +
> > +static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
> > +{
> > + /* Reference: aspeed-bmc-facebook-anacapa.dts */
> > +
> > + AspeedSoCState *soc = bmc->soc;
> > + I2CBus *i2c[16] = {};
> > + I2CSlave *i2c_mux;
> > +
> > + for (int i = 0; i < ARRAY_SIZE(i2c); i++) {
> > + i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
> > + }
>
Thanks for the suggestion. I will introduce a helper in a
hw/arm/aspeed.c in a separate patch.
>
> This seems to be a common pattern in the Aspeed machines to initialize
> an array of I2C. We could introduce an helper for it.
>
>
> Thanks,
>
> C.
>
> > + /* &i2c0 */
> > + /* eeprom@50 */
> > + at24c_eeprom_init(i2c[0], 0x50, 256 * KiB);
> > + /* i2c-mux@70 */
> > + i2c_slave_create_simple(i2c[0], TYPE_PCA9546, 0x70);
> > +
> > + /* &i2c1 */
> > + /* eeprom@50 */
> > + at24c_eeprom_init(i2c[1], 0x50, 256 * KiB);
> > + /* i2c-mux@70 (PCA9546) — 4 channels, empty */
> > + i2c_slave_create_simple(i2c[1], TYPE_PCA9546, 0x70);
> > +
> > + /* &i2c4 */
> > + /* i2c-mux@70 (PCA9548) */
> > + i2c_slave_create_simple(i2c[4], TYPE_PCA9548, 0x70);
> > +
> > + /* &i2c6 */
> > + /* eeprom@50 */
> > + at24c_eeprom_init(i2c[6], 0x50, 32 * KiB);
> > +
> > + /* &i2c8 */
> > + /* i2c-mux@72 (PCA9546) */
> > + i2c_mux = i2c_slave_create_simple(i2c[8], TYPE_PCA9546, 0x72);
> > +
> > + /* i2c8mux ch0 */
> > + /* adc128d818@1f — no model */
> > + /* pca9555@22 */
> > + i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0),
> > + TYPE_PCA9552, 0x22);
> > + /* pca9555@24 */
> > + i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0),
> > + TYPE_PCA9552, 0x24);
> > + /* eeprom@50 */
> > + at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 16 * KiB);
> > +
> > + /* i2c8mux ch1 */
> > + /* pca9555@22 */
> > + i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 1),
> > + TYPE_PCA9552, 0x22);
> > + /* pca9555@24 */
> > + i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 1),
> > + TYPE_PCA9552, 0x24);
> > + /* eeprom@50 */
> > + at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 16 * KiB);
> > +
> > + /* &i2c9 */
> > + /* eeprom@50 */
> > + at24c_eeprom_init(i2c[9], 0x50, 16 * KiB);
> > + /* eeprom@56 */
> > + at24c_eeprom_init(i2c[9], 0x56, 8 * KiB);
> > +
> > + /* &i2c10 */
> > + /* i2c-mux@71 (PCA9548) */
> > + i2c_mux = i2c_slave_create_simple(i2c[10], TYPE_PCA9548, 0x71);
> > +
> > + /* i2c10mux ch5 */
> > + /* pca9555@22*/
> > + i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5),
> > + TYPE_PCA9552, 0x22);
> > + /* eeprom@52 */
> > + at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB);
> > +
> > + /* &i2c11 */
> > + /* i2c-mux@71 (PCA9548) */
> > + i2c_mux = i2c_slave_create_simple(i2c[11], TYPE_PCA9548, 0x71);
> > +
> > + /* i2c11mux ch0-ch4 — empty */
> > +
> > + /* i2c11mux ch5 */
> > + /* pca9555@22 */
> > + i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5),
> > + TYPE_PCA9552, 0x22);
> > + /* eeprom@52 */
> > + at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB);
> > +
> > + /* &i2c13 */
> > + /* i2c-mux@70 (PCA9548) */
> > + i2c_mux = i2c_slave_create_simple(i2c[13], TYPE_PCA9548, 0x70);
> > +
> > + /* i2c13mux ch3 */
> > + /* adc128d818@1f - no model */
> > +
> > + /* i2c13mux ch4 */
> > + /* eeprom@51 */
> > + at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 4), 0x51, 32 * KiB);
> > +
> > + /* i2c13mux ch7 */
> > + /* nfc@28 — no model */
> > +}
> > +
> > +static void aspeed_machine_anacapa_class_init(ObjectClass *oc,
> > + const void *data)
> > +{
> > + MachineClass *mc = MACHINE_CLASS(oc);
> > + AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
> > +
> > + mc->desc = "Facebook Anacapa BMC (Cortex-A7)";
> > + amc->soc_name = "ast2600-a3";
> > + amc->hw_strap1 = ANACAPA_BMC_HW_STRAP1;
> > + amc->hw_strap2 = ANACAPA_BMC_HW_STRAP2;
> > + amc->fmc_model = "mx66l1g45g";
> > + amc->spi_model = NULL;
> > + amc->num_cs = 2;
> > + amc->macs_mask = ASPEED_MAC2_ON;
> > + amc->i2c_init = anacapa_bmc_i2c_init;
> > + mc->default_ram_size = ANACAPA_BMC_RAM_SIZE;
> > + aspeed_machine_class_init_cpus_defaults(mc);
> > +}
> > +
> > +static const TypeInfo aspeed_ast2600_anacapa_types[] = {
> > + {
> > + .name = MACHINE_TYPE_NAME("anacapa-bmc"),
> > + .parent = TYPE_ASPEED_MACHINE,
> > + .class_init = aspeed_machine_anacapa_class_init,
> > + .interfaces = arm_machine_interfaces,
> > + }
> > +};
> > +
> > +DEFINE_TYPES(aspeed_ast2600_anacapa_types)
> > diff --git a/hw/arm/meson.build b/hw/arm/meson.build
> > index 84b8ec5fb5..3de3dca8a9 100644
> > --- a/hw/arm/meson.build
> > +++ b/hw/arm/meson.build
> > @@ -56,6 +56,7 @@ arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
> > 'aspeed_ast2500_witherspoon.c',
> > 'aspeed_ast2500_yosemitev2.c',
> > 'aspeed_ast2600.c',
> > + 'aspeed_ast2600_anacapa.c',
> > 'aspeed_ast2600_bletchley.c',
> > 'aspeed_ast2600_catalina.c',
> > 'aspeed_ast2600_evb.c',
> > diff --git a/tests/functional/arm/meson.build
> > b/tests/functional/arm/meson.build
> > index 2f538f29a2..959179a56f 100644
> > --- a/tests/functional/arm/meson.build
> > +++ b/tests/functional/arm/meson.build
> > @@ -12,6 +12,7 @@ test_arm_timeouts = {
> > 'aspeed_ast2600_sdk' : 720,
> > 'aspeed_ast2600_sdk_515' : 720,
> > 'aspeed_ast2600_sdk_otp' : 720,
> > + 'aspeed_anacapa' : 480,
> > 'aspeed_bletchley' : 480,
> > 'aspeed_catalina' : 480,
> > 'aspeed_gb200nvl_bmc' : 480,
> > @@ -45,6 +46,7 @@ tests_arm_system_thorough = [
> > 'aspeed_ast2600_sdk',
> > 'aspeed_ast2600_sdk_515',
> > 'aspeed_ast2600_sdk_otp',
> > + 'aspeed_anacapa',
> > 'aspeed_bletchley',
> > 'aspeed_catalina',
> > 'aspeed_gb200nvl_bmc',
> > diff --git a/tests/functional/arm/test_aspeed_anacapa.py
> > b/tests/functional/arm/test_aspeed_anacapa.py
> > new file mode 100755
> > index 0000000000..27f8bd8b56
> > --- /dev/null
> > +++ b/tests/functional/arm/test_aspeed_anacapa.py
> > @@ -0,0 +1,25 @@
> > +#!/usr/bin/env python3
> > +#
> > +# Functional test that boots the ASPEED machines
> > +#
> > +# SPDX-License-Identifier: GPL-2.0-or-later
> > +
> > +from qemu_test import Asset
> > +from aspeed import FacebookAspeedTest
> > +
> > +
> > +class AnacapaMachine(FacebookAspeedTest):
> > +
> > + ASSET_ANACAPA_FLASH = Asset(
> > +
> > 'https://github.com/legoater/qemu-aspeed-boot/raw/3fa3212827b04be4034d43b5adeef57c27d6ab18/images/anacapa-bmc/openbmc-20260512025228/obmc-phosphor-image-anacapa-20260512025228.static.mtd.xz',
> > + '2232e241abcfb6d4f6b82cb6c378ce5ce05e364aac6d118785c2b6cc33fe43f3')
> > +
> > + def test_arm_ast2600_anacapa_openbmc(self):
> > + image_path = self.uncompress(self.ASSET_ANACAPA_FLASH)
> > +
> > + self.do_test_arm_aspeed_openbmc('anacapa-bmc', image=image_path,
> > + uboot='2019.04', cpu_id='0xf00',
> > + soc='AST2600 rev A3')
> > +
> > +if __name__ == '__main__':
> > + FacebookAspeedTest.main()
> >
>
>