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:
commit
a7ddb48bd1
@ -123,6 +123,8 @@ To boot the machine from the flash image, use an MTD drive :
|
||||
|
||||
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
|
||||
device by using the FMC controller to load the instructions, and
|
||||
not simply from RAM. This takes a little longer.
|
||||
|
@ -398,6 +398,15 @@ static void aspeed_1030_adc_class_init(ObjectClass *klass, void *data)
|
||||
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 = {
|
||||
.name = TYPE_ASPEED_ADC,
|
||||
.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 */
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
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_2600_adc_info);
|
||||
type_register_static(&aspeed_1030_adc_info);
|
||||
type_register_static(&aspeed_2700_adc_info);
|
||||
}
|
||||
|
||||
type_init(aspeed_adc_register_types);
|
||||
|
@ -46,6 +46,7 @@ struct AspeedMachineState {
|
||||
uint32_t uart_chosen;
|
||||
char *fmc_model;
|
||||
char *spi_model;
|
||||
uint32_t hw_strap1;
|
||||
};
|
||||
|
||||
/* 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
|
||||
|
||||
/* 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
|
||||
|
||||
/* 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;
|
||||
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.
|
||||
*/
|
||||
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;
|
||||
|
||||
if (!dinfo) {
|
||||
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),
|
||||
&error_fatal);
|
||||
qdev_realize_and_unref(card,
|
||||
@ -364,6 +372,8 @@ static void aspeed_machine_init(MachineState *machine)
|
||||
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
|
||||
AspeedSoCClass *sc;
|
||||
int i;
|
||||
DriveInfo *emmc0 = NULL;
|
||||
bool boot_emmc;
|
||||
|
||||
bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
|
||||
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);
|
||||
object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
|
||||
&error_abort);
|
||||
@ -436,21 +446,25 @@ static void aspeed_machine_init(MachineState *machine)
|
||||
|
||||
for (i = 0; i < bmc->soc->sdhci.num_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) {
|
||||
sdhci_attach_drive(&bmc->soc->emmc.slots[0],
|
||||
drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots));
|
||||
emmc0 = 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) {
|
||||
DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
|
||||
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);
|
||||
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;
|
||||
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);
|
||||
|
||||
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;
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
@ -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,
|
||||
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);
|
||||
|
||||
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)
|
||||
{
|
||||
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
|
||||
|
||||
ASPEED_MACHINE(obj)->mmio_exec = false;
|
||||
ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
mc->default_ram_size = 1 * GiB;
|
||||
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)
|
||||
@ -1433,6 +1485,7 @@ static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
|
||||
amc->i2c_init = rainier_bmc_i2c_init;
|
||||
mc->default_ram_size = 1 * GiB;
|
||||
aspeed_machine_class_init_cpus_defaults(mc);
|
||||
aspeed_machine_ast2600_class_emmc_init(oc);
|
||||
};
|
||||
|
||||
#define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
|
||||
|
@ -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 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->num_cpus = 2;
|
||||
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[] = {
|
||||
|
@ -60,6 +60,7 @@ static const hwaddr aspeed_soc_ast2700_memmap[] = {
|
||||
[ASPEED_DEV_SLIIO] = 0x14C1E000,
|
||||
[ASPEED_GIC_DIST] = 0x12200000,
|
||||
[ASPEED_GIC_REDIST] = 0x12280000,
|
||||
[ASPEED_DEV_ADC] = 0x14C00000,
|
||||
};
|
||||
|
||||
#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, "sliio", &s->sliio, TYPE_ASPEED_2700_SLIIO);
|
||||
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,
|
||||
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.iomem0", 0x12000000, 0x01000000);
|
||||
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
|
||||
|
@ -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[] = {
|
||||
DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION,
|
||||
MemoryRegion *),
|
||||
@ -145,9 +150,11 @@ static Property aspeed_soc_properties[] = {
|
||||
static void aspeed_soc_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
|
||||
|
||||
dc->realize = aspeed_soc_realize;
|
||||
device_class_set_props(dc, aspeed_soc_properties);
|
||||
sc->boot_from_emmc = aspeed_soc_boot_from_emmc;
|
||||
}
|
||||
|
||||
static const TypeInfo aspeed_soc_types[] = {
|
||||
|
@ -906,7 +906,7 @@ static const MemoryRegionOps aspeed_i2c_ctrl_ops = {
|
||||
.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)
|
||||
{
|
||||
AspeedI2CState *s = opaque;
|
||||
@ -914,26 +914,26 @@ static uint64_t aspeed_i2c_pool_read(void *opaque, hwaddr offset,
|
||||
int 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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
AspeedI2CState *s = opaque;
|
||||
int 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 = {
|
||||
.read = aspeed_i2c_pool_read,
|
||||
.write = aspeed_i2c_pool_write,
|
||||
static const MemoryRegionOps aspeed_i2c_share_pool_ops = {
|
||||
.read = aspeed_i2c_share_pool_read,
|
||||
.write = aspeed_i2c_share_pool_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
.valid = {
|
||||
.min_access_size = 1,
|
||||
@ -953,14 +953,15 @@ static const VMStateDescription aspeed_i2c_bus_vmstate = {
|
||||
|
||||
static const VMStateDescription aspeed_i2c_vmstate = {
|
||||
.name = TYPE_ASPEED_I2C,
|
||||
.version_id = 2,
|
||||
.minimum_version_id = 2,
|
||||
.version_id = 3,
|
||||
.minimum_version_id = 3,
|
||||
.fields = (const VMStateField[]) {
|
||||
VMSTATE_UINT32(intr_status, AspeedI2CState),
|
||||
VMSTATE_STRUCT_ARRAY(busses, AspeedI2CState,
|
||||
ASPEED_I2C_NR_BUSSES, 1, aspeed_i2c_bus_vmstate,
|
||||
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()
|
||||
}
|
||||
};
|
||||
@ -995,7 +996,7 @@ static void aspeed_i2c_instance_init(Object *obj)
|
||||
* 0x140 ... 0x17F: Device 5
|
||||
* 0x180 ... 0x1BF: Device 6
|
||||
* 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
|
||||
* 0x340 ... 0x37F: Device 9
|
||||
* 0x380 ... 0x3BF: Device 10
|
||||
@ -1003,7 +1004,7 @@ static void aspeed_i2c_instance_init(Object *obj)
|
||||
* 0x400 ... 0x43F: Device 12
|
||||
* 0x440 ... 0x47F: Device 13
|
||||
* 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)
|
||||
{
|
||||
@ -1014,7 +1015,7 @@ static void aspeed_i2c_realize(DeviceState *dev, Error **errp)
|
||||
|
||||
sysbus_init_irq(sbd, &s->irq);
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
memory_region_init_io(&s->pool_iomem, OBJECT(s), &aspeed_i2c_pool_ops, s,
|
||||
"aspeed.i2c-pool", aic->pool_size);
|
||||
memory_region_init_io(&s->pool_iomem, OBJECT(s),
|
||||
&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);
|
||||
|
||||
if (aic->has_dma) {
|
||||
@ -1266,8 +1268,9 @@ static qemu_irq aspeed_2400_i2c_bus_get_irq(AspeedI2CBus *bus)
|
||||
static uint8_t *aspeed_2400_i2c_bus_pool_base(AspeedI2CBus *bus)
|
||||
{
|
||||
uint8_t *pool_page =
|
||||
&bus->controller->pool[ARRAY_FIELD_EX32(bus->regs, I2CD_FUN_CTRL,
|
||||
POOL_PAGE_SEL) * 0x100];
|
||||
&bus->controller->share_pool[ARRAY_FIELD_EX32(bus->regs,
|
||||
I2CD_FUN_CTRL,
|
||||
POOL_PAGE_SEL) * 0x100];
|
||||
|
||||
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_base = 0x800;
|
||||
aic->bus_pool_base = aspeed_2400_i2c_bus_pool_base;
|
||||
aic->mem_size = 0x1000;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
@ -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->check_sram = true;
|
||||
aic->has_dma = true;
|
||||
aic->mem_size = 0x1000;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
@ -1353,6 +1358,7 @@ static void aspeed_2600_i2c_class_init(ObjectClass *klass, void *data)
|
||||
aic->pool_base = 0xC00;
|
||||
aic->bus_pool_base = aspeed_2600_i2c_bus_pool_base;
|
||||
aic->has_dma = true;
|
||||
aic->mem_size = 0x1000;
|
||||
}
|
||||
|
||||
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->bus_pool_base = aspeed_2600_i2c_bus_pool_base;
|
||||
aic->has_dma = true;
|
||||
aic->mem_size = 0x10000;
|
||||
}
|
||||
|
||||
static const TypeInfo aspeed_1030_i2c_info = {
|
||||
|
@ -789,8 +789,7 @@ static uint8_t aspeed_smc_hclk_divisor(uint8_t hclk_mask)
|
||||
}
|
||||
}
|
||||
|
||||
aspeed_smc_error("invalid HCLK mask %x", hclk_mask);
|
||||
return 0;
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -18,6 +18,7 @@
|
||||
#define TYPE_ASPEED_2500_ADC TYPE_ASPEED_ADC "-ast2500"
|
||||
#define TYPE_ASPEED_2600_ADC TYPE_ASPEED_ADC "-ast2600"
|
||||
#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)
|
||||
|
||||
#define TYPE_ASPEED_ADC_ENGINE "aspeed.adc.engine"
|
||||
|
@ -164,6 +164,7 @@ struct AspeedSoCClass {
|
||||
const hwaddr *memmap;
|
||||
uint32_t num_cpus;
|
||||
qemu_irq (*get_irq)(AspeedSoCState *s, int dev);
|
||||
bool (*boot_from_emmc)(AspeedSoCState *s);
|
||||
};
|
||||
|
||||
const char *aspeed_soc_cpu_type(AspeedSoCClass *sc);
|
||||
|
@ -34,7 +34,7 @@
|
||||
OBJECT_DECLARE_TYPE(AspeedI2CState, AspeedI2CClass, ASPEED_I2C)
|
||||
|
||||
#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_NEW_NUM_REG 22
|
||||
|
||||
@ -257,7 +257,7 @@ struct AspeedI2CState {
|
||||
uint32_t ctrl_global;
|
||||
uint32_t new_clk_divider;
|
||||
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];
|
||||
MemoryRegion *dram_mr;
|
||||
@ -283,7 +283,7 @@ struct AspeedI2CClass {
|
||||
uint8_t *(*bus_pool_base)(AspeedI2CBus *);
|
||||
bool check_sram;
|
||||
bool has_dma;
|
||||
|
||||
uint64_t mem_size;
|
||||
};
|
||||
|
||||
static inline bool aspeed_i2c_is_new_mode(AspeedI2CState *s)
|
||||
|
@ -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_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)
|
||||
*
|
||||
|
@ -439,3 +439,42 @@ class AST2x00MachineSDK(QemuSystemTest, LinuxSSHMixIn):
|
||||
self.wait_for_console_pattern('nodistro.0 ast2700-default ttyS12')
|
||||
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')
|
||||
|
Loading…
x
Reference in New Issue
Block a user