aspeed queue:

* SMC model fix (Coverity)
 * AST2600 boot for eMMC support and test
 * AST2700 ADC model
 * I2C model changes preparing AST2700 I2C support
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEoPZlSPBIlev+awtgUaNDx8/77KEFAmacwdQACgkQUaNDx8/7
 7KFJGxAAyGLeAW8OJQgRMh0LygKyY6n4p+8LnImKwH19DkJy9KXsFmi2iCyg2Ufh
 FvNU1NUNjJopYZv+9sMtNXDlFbv53FkxotpmRnPQZxncH7VNUqZ/FyfVBItU7fdB
 pX4pU1x49InQDSL+ZwOYEDLirc8aTp/ZfyeayeFxmJvhtpVtAOGwH+R/Xx5o+Tfd
 fHTkAkJ69LVxK37fk6Bz6X4s3RnOCUpC7g8MuwN4FOSs1IorCq37tH72npPQ+lR+
 rFAaTY8/EDvn+mhCk61rTDo7fNB+/Oaks336cqKVWX8cg+qc0qOfqnG9f8H77b/P
 PLmCoXS+L83Ko6p8PMh2hzehYMW/NXJLHQm3YOFx20LicommM3Mg9wXd2FV4AcVi
 VbsL4+gNi4fPb4z6qCKUV/ir9IoL3x4OLfazKvj9wo88AvOkw06cyhZCfIBIy1Pe
 BQyI9Bg8ExjCsDX5MXhPOzHbqHSQDmGPpN7B4DkcCRSp61QoO4GR8XwsUMPOWt2H
 jwa0qEicdetu4Rop6HIQMdGCvpQEB4RW9l9hoePlg5FSv66M+wQoO5DTmUmTP/Go
 5NNEdFK1oaf2xgvgiWsexFyeinKoyC12OwzhHWxeZp7OORo44M1eYosFQ8L7o+Pk
 XKL+t9Om17/BKKEA4JQjjip8E4p7m9wNJ7HQNcb63lqh2sYH/rQ=
 =r9I0
 -----END PGP SIGNATURE-----

Merge tag 'pull-aspeed-20240721' of https://github.com/legoater/qemu into staging

aspeed queue:

* SMC model fix (Coverity)
* AST2600 boot for eMMC support and test
* AST2700 ADC model
* I2C model changes preparing AST2700 I2C support

# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCAAdFiEEoPZlSPBIlev+awtgUaNDx8/77KEFAmacwdQACgkQUaNDx8/7
# 7KFJGxAAyGLeAW8OJQgRMh0LygKyY6n4p+8LnImKwH19DkJy9KXsFmi2iCyg2Ufh
# FvNU1NUNjJopYZv+9sMtNXDlFbv53FkxotpmRnPQZxncH7VNUqZ/FyfVBItU7fdB
# pX4pU1x49InQDSL+ZwOYEDLirc8aTp/ZfyeayeFxmJvhtpVtAOGwH+R/Xx5o+Tfd
# fHTkAkJ69LVxK37fk6Bz6X4s3RnOCUpC7g8MuwN4FOSs1IorCq37tH72npPQ+lR+
# rFAaTY8/EDvn+mhCk61rTDo7fNB+/Oaks336cqKVWX8cg+qc0qOfqnG9f8H77b/P
# PLmCoXS+L83Ko6p8PMh2hzehYMW/NXJLHQm3YOFx20LicommM3Mg9wXd2FV4AcVi
# VbsL4+gNi4fPb4z6qCKUV/ir9IoL3x4OLfazKvj9wo88AvOkw06cyhZCfIBIy1Pe
# BQyI9Bg8ExjCsDX5MXhPOzHbqHSQDmGPpN7B4DkcCRSp61QoO4GR8XwsUMPOWt2H
# jwa0qEicdetu4Rop6HIQMdGCvpQEB4RW9l9hoePlg5FSv66M+wQoO5DTmUmTP/Go
# 5NNEdFK1oaf2xgvgiWsexFyeinKoyC12OwzhHWxeZp7OORo44M1eYosFQ8L7o+Pk
# XKL+t9Om17/BKKEA4JQjjip8E4p7m9wNJ7HQNcb63lqh2sYH/rQ=
# =r9I0
# -----END PGP SIGNATURE-----
# gpg: Signature made Sun 21 Jul 2024 06:07:48 PM AEST
# gpg:                using RSA key A0F66548F04895EBFE6B0B6051A343C7CFFBECA1
# gpg: Good signature from "Cédric Le Goater <clg@kaod.org>" [undefined]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: A0F6 6548 F048 95EB FE6B  0B60 51A3 43C7 CFFB ECA1

* tag 'pull-aspeed-20240721' of https://github.com/legoater/qemu:
  aspeed: fix coding style
  hw/i2c/aspeed: rename the I2C class pool attribute to share_pool
  hw/i2c/aspeed: support to set the different memory size
  aspeed/soc: support ADC for AST2700
  aspeed/adc: Add AST2700 support
  tests/avocado/machine_aspeed.py: Add eMMC boot tests
  aspeed: Introduce a 'boot-emmc' machine option
  aspeed: Introduce a 'hw_strap1' machine attribute
  aspeed: Add boot-from-eMMC HW strapping bit to rainier-bmc machine
  aspeed: Tune eMMC device properties to reflect HW strapping
  aspeed: Introduce a AspeedSoCClass 'boot_from_emmc' handler
  aspeed/scu: Add boot-from-eMMC HW strapping bit for AST2600 SoC
  aspeed: Load eMMC first boot area as a boot rom
  aspeed: Change type of eMMC device
  aspeed/smc: Fix possible integer overflow

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2024-07-22 07:52:05 +10:00
commit a7ddb48bd1
13 changed files with 188 additions and 39 deletions

View File

@ -123,6 +123,8 @@ To boot the machine from the flash image, use an MTD drive :
Options specific to Aspeed machines are : Options specific to Aspeed machines are :
* ``boot-emmc`` to set or unset boot from eMMC (AST2600).
* ``execute-in-place`` which emulates the boot from the CE0 flash * ``execute-in-place`` which emulates the boot from the CE0 flash
device by using the FMC controller to load the instructions, and device by using the FMC controller to load the instructions, and
not simply from RAM. This takes a little longer. not simply from RAM. This takes a little longer.

View File

@ -398,6 +398,15 @@ static void aspeed_1030_adc_class_init(ObjectClass *klass, void *data)
aac->nr_engines = 2; aac->nr_engines = 2;
} }
static void aspeed_2700_adc_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
AspeedADCClass *aac = ASPEED_ADC_CLASS(klass);
dc->desc = "ASPEED 2700 ADC Controller";
aac->nr_engines = 2;
}
static const TypeInfo aspeed_adc_info = { static const TypeInfo aspeed_adc_info = {
.name = TYPE_ASPEED_ADC, .name = TYPE_ASPEED_ADC,
.parent = TYPE_SYS_BUS_DEVICE, .parent = TYPE_SYS_BUS_DEVICE,
@ -430,6 +439,12 @@ static const TypeInfo aspeed_1030_adc_info = {
.class_init = aspeed_1030_adc_class_init, /* No change since AST2600 */ .class_init = aspeed_1030_adc_class_init, /* No change since AST2600 */
}; };
static const TypeInfo aspeed_2700_adc_info = {
.name = TYPE_ASPEED_2700_ADC,
.parent = TYPE_ASPEED_ADC,
.class_init = aspeed_2700_adc_class_init,
};
static void aspeed_adc_register_types(void) static void aspeed_adc_register_types(void)
{ {
type_register_static(&aspeed_adc_engine_info); type_register_static(&aspeed_adc_engine_info);
@ -438,6 +453,7 @@ static void aspeed_adc_register_types(void)
type_register_static(&aspeed_2500_adc_info); type_register_static(&aspeed_2500_adc_info);
type_register_static(&aspeed_2600_adc_info); type_register_static(&aspeed_2600_adc_info);
type_register_static(&aspeed_1030_adc_info); type_register_static(&aspeed_1030_adc_info);
type_register_static(&aspeed_2700_adc_info);
} }
type_init(aspeed_adc_register_types); type_init(aspeed_adc_register_types);

View File

@ -46,6 +46,7 @@ struct AspeedMachineState {
uint32_t uart_chosen; uint32_t uart_chosen;
char *fmc_model; char *fmc_model;
char *spi_model; char *spi_model;
uint32_t hw_strap1;
}; };
/* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
@ -189,7 +190,7 @@ struct AspeedMachineState {
#define TACOMA_BMC_HW_STRAP2 0x00000040 #define TACOMA_BMC_HW_STRAP2 0x00000040
/* Rainier hardware value: (QEMU prototype) */ /* Rainier hardware value: (QEMU prototype) */
#define RAINIER_BMC_HW_STRAP1 0x00422016 #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
#define RAINIER_BMC_HW_STRAP2 0x80000848 #define RAINIER_BMC_HW_STRAP2 0x80000848
/* Fuji hardware value */ /* Fuji hardware value */
@ -265,7 +266,8 @@ static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
g_autofree void *storage = NULL; g_autofree void *storage = NULL;
int64_t size; int64_t size;
/* The block backend size should have already been 'validated' by /*
* The block backend size should have already been 'validated' by
* the creation of the m25p80 object. * the creation of the m25p80 object.
*/ */
size = blk_getlength(blk); size = blk_getlength(blk);
@ -327,14 +329,20 @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
} }
} }
static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
bool boot_emmc)
{ {
DeviceState *card; DeviceState *card;
if (!dinfo) { if (!dinfo) {
return; return;
} }
card = qdev_new(TYPE_SD_CARD); card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
if (emmc) {
qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB);
qdev_prop_set_uint8(card, "boot-config",
boot_emmc ? 0x1 << 3 : 0x0);
}
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal); &error_fatal);
qdev_realize_and_unref(card, qdev_realize_and_unref(card,
@ -364,6 +372,8 @@ static void aspeed_machine_init(MachineState *machine)
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
AspeedSoCClass *sc; AspeedSoCClass *sc;
int i; int i;
DriveInfo *emmc0 = NULL;
bool boot_emmc;
bmc->soc = ASPEED_SOC(object_new(amc->soc_name)); bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc)); object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
@ -385,7 +395,7 @@ static void aspeed_machine_init(MachineState *machine)
} }
} }
object_property_set_int(OBJECT(bmc->soc), "hw-strap1", amc->hw_strap1, object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1,
&error_abort); &error_abort);
object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2, object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
&error_abort); &error_abort);
@ -436,21 +446,25 @@ static void aspeed_machine_init(MachineState *machine)
for (i = 0; i < bmc->soc->sdhci.num_slots; i++) { for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
sdhci_attach_drive(&bmc->soc->sdhci.slots[i], sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
drive_get(IF_SD, 0, i)); drive_get(IF_SD, 0, i), false, false);
} }
boot_emmc = sc->boot_from_emmc(bmc->soc);
if (bmc->soc->emmc.num_slots) { if (bmc->soc->emmc.num_slots) {
sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots)); sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
} }
if (!bmc->mmio_exec) { if (!bmc->mmio_exec) {
DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0); DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL; BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
if (fmc0) { if (fmc0 && !boot_emmc) {
uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot); uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
aspeed_install_boot_rom(bmc, fmc0, rom_size); aspeed_install_boot_rom(bmc, fmc0, rom_size);
} else if (emmc0) {
aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
} }
} }
@ -463,8 +477,10 @@ static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
DeviceState *dev; DeviceState *dev;
uint8_t *eeprom_buf = g_malloc0(32 * 1024); uint8_t *eeprom_buf = g_malloc0(32 * 1024);
/* The palmetto platform expects a ds3231 RTC but a ds1338 is /*
* enough to provide basic RTC features. Alarms will be missing */ * The palmetto platform expects a ds3231 RTC but a ds1338 is
* enough to provide basic RTC features. Alarms will be missing
*/
i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
@ -555,8 +571,10 @@ static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
{ {
AspeedSoCState *soc = bmc->soc; AspeedSoCState *soc = bmc->soc;
/* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is /*
* good enough */ * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
* good enough
*/
i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
} }
@ -664,8 +682,10 @@ static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
0x4a); 0x4a);
/* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is /*
* good enough */ * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
* good enough
*/
i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
@ -1065,7 +1085,10 @@ static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
static void aspeed_machine_instance_init(Object *obj) static void aspeed_machine_instance_init(Object *obj)
{ {
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
ASPEED_MACHINE(obj)->mmio_exec = false; ASPEED_MACHINE(obj)->mmio_exec = false;
ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
} }
static char *aspeed_get_fmc_model(Object *obj, Error **errp) static char *aspeed_get_fmc_model(Object *obj, Error **errp)
@ -1162,6 +1185,34 @@ static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
mc->valid_cpu_types = sc->valid_cpu_types; mc->valid_cpu_types = sc->valid_cpu_types;
} }
static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp)
{
AspeedMachineState *bmc = ASPEED_MACHINE(obj);
return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
}
static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value,
Error **errp)
{
AspeedMachineState *bmc = ASPEED_MACHINE(obj);
if (value) {
bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
} else {
bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
}
}
static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc)
{
object_class_property_add_bool(oc, "boot-emmc",
aspeed_machine_ast2600_get_boot_from_emmc,
aspeed_machine_ast2600_set_boot_from_emmc);
object_class_property_set_description(oc, "boot-emmc",
"Set or unset boot from EMMC");
}
static void aspeed_machine_class_init(ObjectClass *oc, void *data) static void aspeed_machine_class_init(ObjectClass *oc, void *data)
{ {
MachineClass *mc = MACHINE_CLASS(oc); MachineClass *mc = MACHINE_CLASS(oc);
@ -1361,6 +1412,7 @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
amc->i2c_init = ast2600_evb_i2c_init; amc->i2c_init = ast2600_evb_i2c_init;
mc->default_ram_size = 1 * GiB; mc->default_ram_size = 1 * GiB;
aspeed_machine_class_init_cpus_defaults(mc); aspeed_machine_class_init_cpus_defaults(mc);
aspeed_machine_ast2600_class_emmc_init(oc);
}; };
static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
@ -1433,6 +1485,7 @@ static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
amc->i2c_init = rainier_bmc_i2c_init; amc->i2c_init = rainier_bmc_i2c_init;
mc->default_ram_size = 1 * GiB; mc->default_ram_size = 1 * GiB;
aspeed_machine_class_init_cpus_defaults(mc); aspeed_machine_class_init_cpus_defaults(mc);
aspeed_machine_ast2600_class_emmc_init(oc);
}; };
#define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)

View File

@ -646,6 +646,13 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
} }
} }
static bool aspeed_soc_ast2600_boot_from_emmc(AspeedSoCState *s)
{
uint32_t hw_strap1 = object_property_get_uint(OBJECT(&s->scu),
"hw-strap1", &error_abort);
return !!(hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
}
static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data) static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
{ {
static const char * const valid_cpu_types[] = { static const char * const valid_cpu_types[] = {
@ -673,6 +680,7 @@ static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
sc->memmap = aspeed_soc_ast2600_memmap; sc->memmap = aspeed_soc_ast2600_memmap;
sc->num_cpus = 2; sc->num_cpus = 2;
sc->get_irq = aspeed_soc_ast2600_get_irq; sc->get_irq = aspeed_soc_ast2600_get_irq;
sc->boot_from_emmc = aspeed_soc_ast2600_boot_from_emmc;
} }
static const TypeInfo aspeed_soc_ast2600_types[] = { static const TypeInfo aspeed_soc_ast2600_types[] = {

View File

@ -60,6 +60,7 @@ static const hwaddr aspeed_soc_ast2700_memmap[] = {
[ASPEED_DEV_SLIIO] = 0x14C1E000, [ASPEED_DEV_SLIIO] = 0x14C1E000,
[ASPEED_GIC_DIST] = 0x12200000, [ASPEED_GIC_DIST] = 0x12200000,
[ASPEED_GIC_REDIST] = 0x12280000, [ASPEED_GIC_REDIST] = 0x12280000,
[ASPEED_DEV_ADC] = 0x14C00000,
}; };
#define AST2700_MAX_IRQ 288 #define AST2700_MAX_IRQ 288
@ -344,6 +345,9 @@ static void aspeed_soc_ast2700_init(Object *obj)
object_initialize_child(obj, "sli", &s->sli, TYPE_ASPEED_2700_SLI); object_initialize_child(obj, "sli", &s->sli, TYPE_ASPEED_2700_SLI);
object_initialize_child(obj, "sliio", &s->sliio, TYPE_ASPEED_2700_SLIIO); object_initialize_child(obj, "sliio", &s->sliio, TYPE_ASPEED_2700_SLIIO);
object_initialize_child(obj, "intc", &a->intc, TYPE_ASPEED_2700_INTC); object_initialize_child(obj, "intc", &a->intc, TYPE_ASPEED_2700_INTC);
snprintf(typename, sizeof(typename), "aspeed.adc-%s", socname);
object_initialize_child(obj, "adc", &s->adc, typename);
} }
/* /*
@ -601,6 +605,14 @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sliio), 0, aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sliio), 0,
sc->memmap[ASPEED_DEV_SLIIO]); sc->memmap[ASPEED_DEV_SLIIO]);
/* ADC */
if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc), errp)) {
return;
}
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->adc), 0, sc->memmap[ASPEED_DEV_ADC]);
sysbus_connect_irq(SYS_BUS_DEVICE(&s->adc), 0,
aspeed_soc_get_irq(s, ASPEED_DEV_ADC));
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000); create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000); create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000); create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);

View File

@ -134,6 +134,11 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
} }
} }
static bool aspeed_soc_boot_from_emmc(AspeedSoCState *s)
{
return false;
}
static Property aspeed_soc_properties[] = { static Property aspeed_soc_properties[] = {
DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION, DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION,
MemoryRegion *), MemoryRegion *),
@ -145,9 +150,11 @@ static Property aspeed_soc_properties[] = {
static void aspeed_soc_class_init(ObjectClass *oc, void *data) static void aspeed_soc_class_init(ObjectClass *oc, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(oc); DeviceClass *dc = DEVICE_CLASS(oc);
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
dc->realize = aspeed_soc_realize; dc->realize = aspeed_soc_realize;
device_class_set_props(dc, aspeed_soc_properties); device_class_set_props(dc, aspeed_soc_properties);
sc->boot_from_emmc = aspeed_soc_boot_from_emmc;
} }
static const TypeInfo aspeed_soc_types[] = { static const TypeInfo aspeed_soc_types[] = {

View File

@ -906,7 +906,7 @@ static const MemoryRegionOps aspeed_i2c_ctrl_ops = {
.endianness = DEVICE_LITTLE_ENDIAN, .endianness = DEVICE_LITTLE_ENDIAN,
}; };
static uint64_t aspeed_i2c_pool_read(void *opaque, hwaddr offset, static uint64_t aspeed_i2c_share_pool_read(void *opaque, hwaddr offset,
unsigned size) unsigned size)
{ {
AspeedI2CState *s = opaque; AspeedI2CState *s = opaque;
@ -914,26 +914,26 @@ static uint64_t aspeed_i2c_pool_read(void *opaque, hwaddr offset,
int i; int i;
for (i = 0; i < size; i++) { for (i = 0; i < size; i++) {
ret |= (uint64_t) s->pool[offset + i] << (8 * i); ret |= (uint64_t) s->share_pool[offset + i] << (8 * i);
} }
return ret; return ret;
} }
static void aspeed_i2c_pool_write(void *opaque, hwaddr offset, static void aspeed_i2c_share_pool_write(void *opaque, hwaddr offset,
uint64_t value, unsigned size) uint64_t value, unsigned size)
{ {
AspeedI2CState *s = opaque; AspeedI2CState *s = opaque;
int i; int i;
for (i = 0; i < size; i++) { for (i = 0; i < size; i++) {
s->pool[offset + i] = (value >> (8 * i)) & 0xFF; s->share_pool[offset + i] = (value >> (8 * i)) & 0xFF;
} }
} }
static const MemoryRegionOps aspeed_i2c_pool_ops = { static const MemoryRegionOps aspeed_i2c_share_pool_ops = {
.read = aspeed_i2c_pool_read, .read = aspeed_i2c_share_pool_read,
.write = aspeed_i2c_pool_write, .write = aspeed_i2c_share_pool_write,
.endianness = DEVICE_LITTLE_ENDIAN, .endianness = DEVICE_LITTLE_ENDIAN,
.valid = { .valid = {
.min_access_size = 1, .min_access_size = 1,
@ -953,14 +953,15 @@ static const VMStateDescription aspeed_i2c_bus_vmstate = {
static const VMStateDescription aspeed_i2c_vmstate = { static const VMStateDescription aspeed_i2c_vmstate = {
.name = TYPE_ASPEED_I2C, .name = TYPE_ASPEED_I2C,
.version_id = 2, .version_id = 3,
.minimum_version_id = 2, .minimum_version_id = 3,
.fields = (const VMStateField[]) { .fields = (const VMStateField[]) {
VMSTATE_UINT32(intr_status, AspeedI2CState), VMSTATE_UINT32(intr_status, AspeedI2CState),
VMSTATE_STRUCT_ARRAY(busses, AspeedI2CState, VMSTATE_STRUCT_ARRAY(busses, AspeedI2CState,
ASPEED_I2C_NR_BUSSES, 1, aspeed_i2c_bus_vmstate, ASPEED_I2C_NR_BUSSES, 1, aspeed_i2c_bus_vmstate,
AspeedI2CBus), AspeedI2CBus),
VMSTATE_UINT8_ARRAY(pool, AspeedI2CState, ASPEED_I2C_MAX_POOL_SIZE), VMSTATE_UINT8_ARRAY(share_pool, AspeedI2CState,
ASPEED_I2C_SHARE_POOL_SIZE),
VMSTATE_END_OF_LIST() VMSTATE_END_OF_LIST()
} }
}; };
@ -995,7 +996,7 @@ static void aspeed_i2c_instance_init(Object *obj)
* 0x140 ... 0x17F: Device 5 * 0x140 ... 0x17F: Device 5
* 0x180 ... 0x1BF: Device 6 * 0x180 ... 0x1BF: Device 6
* 0x1C0 ... 0x1FF: Device 7 * 0x1C0 ... 0x1FF: Device 7
* 0x200 ... 0x2FF: Buffer Pool (unused in linux driver) * 0x200 ... 0x2FF: Buffer Pool (AST2500 unused in linux driver)
* 0x300 ... 0x33F: Device 8 * 0x300 ... 0x33F: Device 8
* 0x340 ... 0x37F: Device 9 * 0x340 ... 0x37F: Device 9
* 0x380 ... 0x3BF: Device 10 * 0x380 ... 0x3BF: Device 10
@ -1003,7 +1004,7 @@ static void aspeed_i2c_instance_init(Object *obj)
* 0x400 ... 0x43F: Device 12 * 0x400 ... 0x43F: Device 12
* 0x440 ... 0x47F: Device 13 * 0x440 ... 0x47F: Device 13
* 0x480 ... 0x4BF: Device 14 * 0x480 ... 0x4BF: Device 14
* 0x800 ... 0xFFF: Buffer Pool (unused in linux driver) * 0x800 ... 0xFFF: Buffer Pool (AST2400 unused in linux driver)
*/ */
static void aspeed_i2c_realize(DeviceState *dev, Error **errp) static void aspeed_i2c_realize(DeviceState *dev, Error **errp)
{ {
@ -1014,7 +1015,7 @@ static void aspeed_i2c_realize(DeviceState *dev, Error **errp)
sysbus_init_irq(sbd, &s->irq); sysbus_init_irq(sbd, &s->irq);
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_i2c_ctrl_ops, s, memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_i2c_ctrl_ops, s,
"aspeed.i2c", 0x1000); "aspeed.i2c", aic->mem_size);
sysbus_init_mmio(sbd, &s->iomem); sysbus_init_mmio(sbd, &s->iomem);
for (i = 0; i < aic->num_busses; i++) { for (i = 0; i < aic->num_busses; i++) {
@ -1037,8 +1038,9 @@ static void aspeed_i2c_realize(DeviceState *dev, Error **errp)
&s->busses[i].mr); &s->busses[i].mr);
} }
memory_region_init_io(&s->pool_iomem, OBJECT(s), &aspeed_i2c_pool_ops, s, memory_region_init_io(&s->pool_iomem, OBJECT(s),
"aspeed.i2c-pool", aic->pool_size); &aspeed_i2c_share_pool_ops, s,
"aspeed.i2c-share-pool", aic->pool_size);
memory_region_add_subregion(&s->iomem, aic->pool_base, &s->pool_iomem); memory_region_add_subregion(&s->iomem, aic->pool_base, &s->pool_iomem);
if (aic->has_dma) { if (aic->has_dma) {
@ -1266,7 +1268,8 @@ static qemu_irq aspeed_2400_i2c_bus_get_irq(AspeedI2CBus *bus)
static uint8_t *aspeed_2400_i2c_bus_pool_base(AspeedI2CBus *bus) static uint8_t *aspeed_2400_i2c_bus_pool_base(AspeedI2CBus *bus)
{ {
uint8_t *pool_page = uint8_t *pool_page =
&bus->controller->pool[ARRAY_FIELD_EX32(bus->regs, I2CD_FUN_CTRL, &bus->controller->share_pool[ARRAY_FIELD_EX32(bus->regs,
I2CD_FUN_CTRL,
POOL_PAGE_SEL) * 0x100]; POOL_PAGE_SEL) * 0x100];
return &pool_page[ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, OFFSET)]; return &pool_page[ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, OFFSET)];
@ -1286,6 +1289,7 @@ static void aspeed_2400_i2c_class_init(ObjectClass *klass, void *data)
aic->pool_size = 0x800; aic->pool_size = 0x800;
aic->pool_base = 0x800; aic->pool_base = 0x800;
aic->bus_pool_base = aspeed_2400_i2c_bus_pool_base; aic->bus_pool_base = aspeed_2400_i2c_bus_pool_base;
aic->mem_size = 0x1000;
} }
static const TypeInfo aspeed_2400_i2c_info = { static const TypeInfo aspeed_2400_i2c_info = {
@ -1301,7 +1305,7 @@ static qemu_irq aspeed_2500_i2c_bus_get_irq(AspeedI2CBus *bus)
static uint8_t *aspeed_2500_i2c_bus_pool_base(AspeedI2CBus *bus) static uint8_t *aspeed_2500_i2c_bus_pool_base(AspeedI2CBus *bus)
{ {
return &bus->controller->pool[bus->id * 0x10]; return &bus->controller->share_pool[bus->id * 0x10];
} }
static void aspeed_2500_i2c_class_init(ObjectClass *klass, void *data) static void aspeed_2500_i2c_class_init(ObjectClass *klass, void *data)
@ -1320,6 +1324,7 @@ static void aspeed_2500_i2c_class_init(ObjectClass *klass, void *data)
aic->bus_pool_base = aspeed_2500_i2c_bus_pool_base; aic->bus_pool_base = aspeed_2500_i2c_bus_pool_base;
aic->check_sram = true; aic->check_sram = true;
aic->has_dma = true; aic->has_dma = true;
aic->mem_size = 0x1000;
} }
static const TypeInfo aspeed_2500_i2c_info = { static const TypeInfo aspeed_2500_i2c_info = {
@ -1335,7 +1340,7 @@ static qemu_irq aspeed_2600_i2c_bus_get_irq(AspeedI2CBus *bus)
static uint8_t *aspeed_2600_i2c_bus_pool_base(AspeedI2CBus *bus) static uint8_t *aspeed_2600_i2c_bus_pool_base(AspeedI2CBus *bus)
{ {
return &bus->controller->pool[bus->id * 0x20]; return &bus->controller->share_pool[bus->id * 0x20];
} }
static void aspeed_2600_i2c_class_init(ObjectClass *klass, void *data) static void aspeed_2600_i2c_class_init(ObjectClass *klass, void *data)
@ -1353,6 +1358,7 @@ static void aspeed_2600_i2c_class_init(ObjectClass *klass, void *data)
aic->pool_base = 0xC00; aic->pool_base = 0xC00;
aic->bus_pool_base = aspeed_2600_i2c_bus_pool_base; aic->bus_pool_base = aspeed_2600_i2c_bus_pool_base;
aic->has_dma = true; aic->has_dma = true;
aic->mem_size = 0x1000;
} }
static const TypeInfo aspeed_2600_i2c_info = { static const TypeInfo aspeed_2600_i2c_info = {
@ -1376,6 +1382,7 @@ static void aspeed_1030_i2c_class_init(ObjectClass *klass, void *data)
aic->pool_base = 0xC00; aic->pool_base = 0xC00;
aic->bus_pool_base = aspeed_2600_i2c_bus_pool_base; aic->bus_pool_base = aspeed_2600_i2c_bus_pool_base;
aic->has_dma = true; aic->has_dma = true;
aic->mem_size = 0x10000;
} }
static const TypeInfo aspeed_1030_i2c_info = { static const TypeInfo aspeed_1030_i2c_info = {

View File

@ -789,8 +789,7 @@ static uint8_t aspeed_smc_hclk_divisor(uint8_t hclk_mask)
} }
} }
aspeed_smc_error("invalid HCLK mask %x", hclk_mask); g_assert_not_reached();
return 0;
} }
/* /*

View File

@ -18,6 +18,7 @@
#define TYPE_ASPEED_2500_ADC TYPE_ASPEED_ADC "-ast2500" #define TYPE_ASPEED_2500_ADC TYPE_ASPEED_ADC "-ast2500"
#define TYPE_ASPEED_2600_ADC TYPE_ASPEED_ADC "-ast2600" #define TYPE_ASPEED_2600_ADC TYPE_ASPEED_ADC "-ast2600"
#define TYPE_ASPEED_1030_ADC TYPE_ASPEED_ADC "-ast1030" #define TYPE_ASPEED_1030_ADC TYPE_ASPEED_ADC "-ast1030"
#define TYPE_ASPEED_2700_ADC TYPE_ASPEED_ADC "-ast2700"
OBJECT_DECLARE_TYPE(AspeedADCState, AspeedADCClass, ASPEED_ADC) OBJECT_DECLARE_TYPE(AspeedADCState, AspeedADCClass, ASPEED_ADC)
#define TYPE_ASPEED_ADC_ENGINE "aspeed.adc.engine" #define TYPE_ASPEED_ADC_ENGINE "aspeed.adc.engine"

View File

@ -164,6 +164,7 @@ struct AspeedSoCClass {
const hwaddr *memmap; const hwaddr *memmap;
uint32_t num_cpus; uint32_t num_cpus;
qemu_irq (*get_irq)(AspeedSoCState *s, int dev); qemu_irq (*get_irq)(AspeedSoCState *s, int dev);
bool (*boot_from_emmc)(AspeedSoCState *s);
}; };
const char *aspeed_soc_cpu_type(AspeedSoCClass *sc); const char *aspeed_soc_cpu_type(AspeedSoCClass *sc);

View File

@ -34,7 +34,7 @@
OBJECT_DECLARE_TYPE(AspeedI2CState, AspeedI2CClass, ASPEED_I2C) OBJECT_DECLARE_TYPE(AspeedI2CState, AspeedI2CClass, ASPEED_I2C)
#define ASPEED_I2C_NR_BUSSES 16 #define ASPEED_I2C_NR_BUSSES 16
#define ASPEED_I2C_MAX_POOL_SIZE 0x800 #define ASPEED_I2C_SHARE_POOL_SIZE 0x800
#define ASPEED_I2C_OLD_NUM_REG 11 #define ASPEED_I2C_OLD_NUM_REG 11
#define ASPEED_I2C_NEW_NUM_REG 22 #define ASPEED_I2C_NEW_NUM_REG 22
@ -257,7 +257,7 @@ struct AspeedI2CState {
uint32_t ctrl_global; uint32_t ctrl_global;
uint32_t new_clk_divider; uint32_t new_clk_divider;
MemoryRegion pool_iomem; MemoryRegion pool_iomem;
uint8_t pool[ASPEED_I2C_MAX_POOL_SIZE]; uint8_t share_pool[ASPEED_I2C_SHARE_POOL_SIZE];
AspeedI2CBus busses[ASPEED_I2C_NR_BUSSES]; AspeedI2CBus busses[ASPEED_I2C_NR_BUSSES];
MemoryRegion *dram_mr; MemoryRegion *dram_mr;
@ -283,7 +283,7 @@ struct AspeedI2CClass {
uint8_t *(*bus_pool_base)(AspeedI2CBus *); uint8_t *(*bus_pool_base)(AspeedI2CBus *);
bool check_sram; bool check_sram;
bool has_dma; bool has_dma;
uint64_t mem_size;
}; };
static inline bool aspeed_i2c_is_new_mode(AspeedI2CState *s) static inline bool aspeed_i2c_is_new_mode(AspeedI2CState *s)

View File

@ -349,6 +349,10 @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
#define SCU_AST2600_H_PLL_BYPASS_EN (0x1 << 24) #define SCU_AST2600_H_PLL_BYPASS_EN (0x1 << 24)
#define SCU_AST2600_H_PLL_OFF (0x1 << 23) #define SCU_AST2600_H_PLL_OFF (0x1 << 23)
/* STRAP1 SCU500 */
#define SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC (0x1 << 2)
#define SCU_AST2600_HW_STRAP_BOOT_SRC_SPI (0x0 << 2)
/* /*
* SCU310 Clock Selection Register Set 4 (for Aspeed AST1030 SOC) * SCU310 Clock Selection Register Set 4 (for Aspeed AST1030 SOC)
* *

View File

@ -439,3 +439,42 @@ class AST2x00MachineSDK(QemuSystemTest, LinuxSSHMixIn):
self.wait_for_console_pattern('nodistro.0 ast2700-default ttyS12') self.wait_for_console_pattern('nodistro.0 ast2700-default ttyS12')
self.ssh_connect('root', '0penBmc', False) self.ssh_connect('root', '0penBmc', False)
class AST2x00MachineMMC(QemuSystemTest):
timeout = 240
def wait_for_console_pattern(self, success_message, vm=None):
wait_for_console_pattern(self, success_message,
failure_message='Kernel panic - not syncing',
vm=vm)
def test_arm_aspeed_emmc_boot(self):
"""
:avocado: tags=arch:arm
:avocado: tags=machine:rainier-bmc
:avocado: tags=device:emmc
"""
image_url = ('https://fileserver.linaro.org/s/B6pJTwWEkzSDi36/download/'
'mmc-p10bmc-20240617.qcow2')
image_hash = ('d523fb478d2b84d5adc5658d08502bc64b1486955683814f89c6137518acd90b')
image_path = self.fetch_asset(image_url, asset_hash=image_hash,
algorithm='sha256')
self.require_netdev('user')
self.vm.set_console()
self.vm.add_args('-drive',
'file=' + image_path + ',if=sd,id=sd2,index=2',
'-net', 'nic', '-net', 'user')
self.vm.launch()
self.wait_for_console_pattern('U-Boot SPL 2019.04')
self.wait_for_console_pattern('Trying to boot from MMC1')
self.wait_for_console_pattern('U-Boot 2019.04')
self.wait_for_console_pattern('eMMC 2nd Boot')
self.wait_for_console_pattern('## Loading kernel from FIT Image')
self.wait_for_console_pattern('Starting kernel ...')
self.wait_for_console_pattern('Booting Linux on physical CPU 0xf00')
self.wait_for_console_pattern('mmcblk0: p1 p2 p3 p4 p5 p6 p7')
self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')