oops. R-b sent on the wrong patch.
On 10/22/24 12:48, Cédric Le Goater wrote:
> On 10/22/24 11:40, Jamin Lin wrote:
>> It only attached flash model of fmc and spi[0] in aspeed_machine_init function.
>> However, AST2500 and AST2600 have one fmc and two spi(spi1 and spi2)
>> controllers; AST2700 have one fmc and 3 spi(spi0, spi1 and spi2) controllers.
>>
>> Besides, it used hardcode to attach flash model of fmc, spi[0] and spi[1] in
>> aspeed_minibmc_machine_init for AST1030.
>>
>> To make both functions more flexible and support all ASPEED SOCs spi
>> controllers, adds a for loop with sc->spis_num to attach flash model of
>> all supported spi controllers. The sc->spis_num is from AspeedSoCClass.
To be honest, I am not a big fan of the aspeed_board_init_flashes()
routine. See commit 27a2c66c92ec for the reason.
I prefer the more flexible approach :
$ qemu-system-arm -M ast2600-evb \
-blockdev node-name=fmc0,driver=file,filename=/path/to/fmc0.img \
-device mx66u51235f,bus=ssi.0,cs=0x0,drive=fmc0 \
-blockdev node-name=fmc1,driver=file,filename=/path/to/fmc1.img \
-device mx66u51235f,bus=ssi.0,cs=0x1,drive=fmc1 \
-blockdev node-name=spi1,driver=file,filename=/path/to/spi1.img \
-device mx66u51235f,cs=0x0,bus=ssi.1,drive=spi1 \
-nographic -nodefaults
which doesn't use the drive_get() interface and so, doesn't make
assumption on the order of the drives defined on the QEMU command
line.
Also, the number of availabe flash devices is a machine definition,
not a SoC definition. Not all CS are wired.
I will drop that patch for now.
Thanks,
C.
>> ---
>> hw/arm/aspeed.c | 21 ++++++++++++---------
>> 1 file changed, 12 insertions(+), 9 deletions(-)
>>
>> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
>> index b4b1ce9efb..7ac01a3562 100644
>> --- a/hw/arm/aspeed.c
>> +++ b/hw/arm/aspeed.c
>> @@ -419,9 +419,11 @@ static void aspeed_machine_init(MachineState *machine)
>> aspeed_board_init_flashes(&bmc->soc->fmc,
>> bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
>> amc->num_cs, 0);
>> - aspeed_board_init_flashes(&bmc->soc->spi[0],
>> - bmc->spi_model ? bmc->spi_model : amc->spi_model,
>> - 1, amc->num_cs);
>> + for (i = 0; i < sc->spis_num; i++) {
>> + aspeed_board_init_flashes(&bmc->soc->spi[i],
>> + bmc->spi_model ? bmc->spi_model : amc->spi_model,
>> + amc->num_cs, amc->num_cs + (amc->num_cs * i));
>> + }
>> }
>> if (machine->kernel_filename && sc->num_cpus > 1) {
>> @@ -1579,7 +1581,9 @@ static void aspeed_minibmc_machine_init(MachineState *machine)
>> {
>> AspeedMachineState *bmc = ASPEED_MACHINE(machine);
>> AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
>> + AspeedSoCClass *sc;
>> Clock *sysclk;
>> + int i;
>> sysclk = clock_new(OBJECT(machine), "SYSCLK");
>> clock_set_hz(sysclk, SYSCLK_FRQ);
>> @@ -1587,6 +1591,7 @@ static void aspeed_minibmc_machine_init(MachineState *machine)
>> bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
>> object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
>> object_unref(OBJECT(bmc->soc));
>> + sc = ASPEED_SOC_GET_CLASS(bmc->soc);
>> qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
>> object_property_set_link(OBJECT(bmc->soc), "memory",
>> @@ -1599,13 +1604,11 @@ static void aspeed_minibmc_machine_init(MachineState *machine)
>> amc->num_cs,
>> 0);
>> - aspeed_board_init_flashes(&bmc->soc->spi[0],
>> - bmc->spi_model ? bmc->spi_model : amc->spi_model,
>> - amc->num_cs, amc->num_cs);
>> -
>> - aspeed_board_init_flashes(&bmc->soc->spi[1],
>> + for (i = 0; i < sc->spis_num; i++) {
>> + aspeed_board_init_flashes(&bmc->soc->spi[i],
>> bmc->spi_model ? bmc->spi_model : amc->spi_model,
>> - amc->num_cs, (amc->num_cs * 2));
>> + amc->num_cs, amc->num_cs + (amc->num_cs * i));
>> + }
>> if (amc->i2c_init) {
>> amc->i2c_init(bmc);
>