diff mbox series

[v2,07/18] aspeed: Fix hardcode attach flash model of spi controllers

Message ID 20241022094110.1574011-8-jamin_lin@aspeedtech.com (mailing list archive)
State New
Headers show
Series Fix write incorrect data into flash in user mode | expand

Commit Message

Jamin Lin Oct. 22, 2024, 9:40 a.m. UTC
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.

Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
---
 hw/arm/aspeed.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

Comments

Cédric Le Goater Oct. 22, 2024, 10:48 a.m. UTC | #1
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.
> 
> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>


Reviewed-by: Cédric Le Goater <clg@redhat.com>

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);
Cédric Le Goater Oct. 22, 2024, 2:10 p.m. UTC | #2
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);
>
Jamin Lin Oct. 23, 2024, 2:46 a.m. UTC | #3
Hi Cedric,

> Subject: Re: [PATCH v2 07/18] aspeed: Fix hardcode attach flash model of spi
> controllers
> 
> 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
> 
Thanks for notify me this solution.
I can successfully attach the default image to supported SPI controllers with different flash model.
It seems we need to add "defaults_enabled()" if-statement in aspeed_minibmc_machine_init
to support this solution for AST1030. Otherwise, I will get this error.

qemu-system-arm: -device w25q80bl,bus=ssi.0,cs=0x0,drive=fmc0: CS index '0x0' in use by a w25q80bl device

https://github.com/qemu/qemu/blob/master/hw/arm/aspeed.c 
 if (defaults_enabled()) {
  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,
                              amc->num_cs, amc->num_cs);

    aspeed_board_init_flashes(&bmc->soc->spi[1],
                              bmc->spi_model ? bmc->spi_model : amc->spi_model,
                              amc->num_cs, (amc->num_cs * 2));
  }

Do I need to send this patch in v3 patch series?
Or individually send this patch in the new patch series? 

AST1030:
-blockdev node-name=fmc0,driver=file,filename=./fmc_cs0_img \
-device w25q80bl,bus=ssi.0,cs=0x0,drive=fmc0 \
-blockdev node-name=fmc1,driver=file,filename=./fmc_cs1_img \
-device w25q80bl,bus=ssi.0,cs=0x1,drive=fmc1 \
-blockdev node-name=spi1c0,driver=file,filename=./spi1_cs0_img \
-device w25q256,bus=ssi.1,cs=0x0,drive=spi1c0 \
-blockdev node-name=spi1c1,driver=file,filename=./spi1_cs1_img \
-device w25q256,bus=ssi.1,cs=0x1,drive=spi1c1 \
-blockdev node-name=spi2c0,driver=file,filename=./spi2_cs0_img \
-device w25q256,bus=ssi.2,cs=0x0,drive=spi2c0 \
-blockdev node-name=spi2c1,driver=file,filename=./spi2_cs1_img \
-device w25q256,bus=ssi.2,cs=0x1,drive=spi2c1 \
-nodefaults

AST2600:
-blockdev node-name=fmc0,driver=file,filename=$1 \
-device mx66u51235f,cs=0x0,bus=ssi.0,drive=fmc0 \
-blockdev node-name=fmc1,driver=file,filename=./fmc_cs1_img \
-device mx66u51235f,cs=0x1,bus=ssi.0,drive=fmc1 \
-blockdev node-name=spi1,driver=file,filename=./spi1_cs0_img \
-device mx66u51235f,cs=0x0,bus=ssi.1,drive=spi1 \
-blockdev node-name=spi2,driver=file,filename=./spi2_cs0_img \
-device mx66u51235f,cs=0x0,bus=ssi.2,drive=spi2 \
-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.
> 
Understand and thanks for suggestion.
Jamin
> 
> 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);
> >
diff mbox series

Patch

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);