mbox series

[v2,00/25] hw/sd: Rework models for eMMC support

Message ID 20220530193816.45841-1-philippe.mathieu.daude@gmail.com (mailing list archive)
Headers show
Series hw/sd: Rework models for eMMC support | expand

Message

Philippe Mathieu-Daudé May 30, 2022, 7:37 p.m. UTC
From: Philippe Mathieu-Daudé <f4bug@amsat.org>

Rebase/respin of Cédric RFC:
https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
(sorry it took me so long guys...)

Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2

I plan to queue patches 1-12 via sdmmc-next later this week.

Cédric, if you are happy with this series, it should be easy to rebase
your other patches on top and address the comments I left on the RFC :)

Regards,

Phil.

Cédric Le Goater (6):
  hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler
  hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler
  hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler
  hw/sd: Add sd_emmc_cmd_APP_CMD() handler
  hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler
  hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler

Joel Stanley (4):
  hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler
  hw/sd: Support boot area in emmc image
  hw/sd: Subtract bootarea size from blk
  hw/sd: Add boot config support

Philippe Mathieu-Daudé (13):
  hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01
  hw/sd: When card is in wrong state, log which state it is
  hw/sd: When card is in wrong state, log which spec version is used
  hw/sd: Move proto_name to SDProto structure
  hw/sd: Introduce sd_cmd_handler type
  hw/sd: Add sd_cmd_illegal() handler
  hw/sd: Add sd_cmd_unimplemented() handler
  hw/sd: Add sd_cmd_GO_IDLE_STATE() handler
  hw/sd: Add sd_cmd_SEND_OP_CMD() handler
  hw/sd: Add sd_cmd_ALL_SEND_CID() handler
  hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler
  hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler
  hw/sd: Basis for eMMC support

Sai Pavan Boddu (2):
  hw/sd: Add CMD21 tuning sequence
  hw/sd: Add mmc switch function support

 hw/sd/sd.c             | 645 +++++++++++++++++++++++++++++++++--------
 hw/sd/sdmmc-internal.c |   2 +-
 hw/sd/sdmmc-internal.h |  97 +++++++
 include/hw/sd/sd.h     |   7 +
 4 files changed, 627 insertions(+), 124 deletions(-)

Comments

Cédric Le Goater May 31, 2022, 6:31 a.m. UTC | #1
On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
> 
> Rebase/respin of Cédric RFC:
> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
> (sorry it took me so long guys...)
> 
> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
> 
> I plan to queue patches 1-12 via sdmmc-next later this week.
> 
> Cédric, if you are happy with this series, it should be easy to rebase
> your other patches on top and address the comments I left on the RFC :)

Sure. I will for the first patches to be merged and I might introduce
a base class.

Thanks,

C.

> 
> Regards,
> 
> Phil.
> 
> Cédric Le Goater (6):
>    hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler
>    hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler
>    hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler
>    hw/sd: Add sd_emmc_cmd_APP_CMD() handler
>    hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler
>    hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler
> 
> Joel Stanley (4):
>    hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler
>    hw/sd: Support boot area in emmc image
>    hw/sd: Subtract bootarea size from blk
>    hw/sd: Add boot config support
> 
> Philippe Mathieu-Daudé (13):
>    hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01
>    hw/sd: When card is in wrong state, log which state it is
>    hw/sd: When card is in wrong state, log which spec version is used
>    hw/sd: Move proto_name to SDProto structure
>    hw/sd: Introduce sd_cmd_handler type
>    hw/sd: Add sd_cmd_illegal() handler
>    hw/sd: Add sd_cmd_unimplemented() handler
>    hw/sd: Add sd_cmd_GO_IDLE_STATE() handler
>    hw/sd: Add sd_cmd_SEND_OP_CMD() handler
>    hw/sd: Add sd_cmd_ALL_SEND_CID() handler
>    hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler
>    hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler
>    hw/sd: Basis for eMMC support
> 
> Sai Pavan Boddu (2):
>    hw/sd: Add CMD21 tuning sequence
>    hw/sd: Add mmc switch function support
> 
>   hw/sd/sd.c             | 645 +++++++++++++++++++++++++++++++++--------
>   hw/sd/sdmmc-internal.c |   2 +-
>   hw/sd/sdmmc-internal.h |  97 +++++++
>   include/hw/sd/sd.h     |   7 +
>   4 files changed, 627 insertions(+), 124 deletions(-)
>
Philippe Mathieu-Daudé May 31, 2022, 7:56 a.m. UTC | #2
On 31/5/22 08:31, Cédric Le Goater wrote:
> On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>
>> Rebase/respin of Cédric RFC:
>> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
>> (sorry it took me so long guys...)
>>
>> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
>>
>> I plan to queue patches 1-12 via sdmmc-next later this week.
>>
>> Cédric, if you are happy with this series, it should be easy to rebase
>> your other patches on top and address the comments I left on the RFC :)
> 
> Sure. I will for the first patches to be merged and I might introduce
> a base class.

Then consider patches 1-13 queued.

> Thanks,
> 
> C.
> 
>>
>> Regards,
>>
>> Phil.
Philippe Mathieu-Daudé May 31, 2022, 7:58 a.m. UTC | #3
On Tue, May 31, 2022 at 9:56 AM Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> On 31/5/22 08:31, Cédric Le Goater wrote:
> > On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:

> >> I plan to queue patches 1-12 via sdmmc-next later this week.
> >>
> >> Cédric, if you are happy with this series, it should be easy to rebase
> >> your other patches on top and address the comments I left on the RFC :)
> >
> > Sure. I will for the first patches to be merged and I might introduce
> > a base class.
>
> Then consider patches 1-13 queued.

Oops too fast, new patches 3 & 13 are not reviewed.
Cédric Le Goater May 31, 2022, 9:19 a.m. UTC | #4
On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
> 
> Rebase/respin of Cédric RFC:
> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
> (sorry it took me so long guys...)
> 
> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
> 
> I plan to queue patches 1-12 via sdmmc-next later this week.
> 
> Cédric, if you are happy with this series, it should be easy to rebase
> your other patches on top and address the comments I left on the RFC :)

I pushed an update on :

   https://github.com/legoater/qemu/commits/aspeed-7.1

Here is an image :

   https://www.kaod.org/qemu/aspeed/mmc-p10bmc.qcow2

run with :

  qemu-system-arm -M rainier-bmc -net nic -net user -drive file=./mmc-p10bmc.qcow2,format=qcow2,if=sd,id=sd0,index=2 -nographic -nodefaults -snapshot -serial mon:stdio

Thanks,

C.

> Regards,
> 
> Phil.
> 
> Cédric Le Goater (6):
>    hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler
>    hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler
>    hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler
>    hw/sd: Add sd_emmc_cmd_APP_CMD() handler
>    hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler
>    hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler
> 
> Joel Stanley (4):
>    hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler
>    hw/sd: Support boot area in emmc image
>    hw/sd: Subtract bootarea size from blk
>    hw/sd: Add boot config support
> 
> Philippe Mathieu-Daudé (13):
>    hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01
>    hw/sd: When card is in wrong state, log which state it is
>    hw/sd: When card is in wrong state, log which spec version is used
>    hw/sd: Move proto_name to SDProto structure
>    hw/sd: Introduce sd_cmd_handler type
>    hw/sd: Add sd_cmd_illegal() handler
>    hw/sd: Add sd_cmd_unimplemented() handler
>    hw/sd: Add sd_cmd_GO_IDLE_STATE() handler
>    hw/sd: Add sd_cmd_SEND_OP_CMD() handler
>    hw/sd: Add sd_cmd_ALL_SEND_CID() handler
>    hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler
>    hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler
>    hw/sd: Basis for eMMC support
> 
> Sai Pavan Boddu (2):
>    hw/sd: Add CMD21 tuning sequence
>    hw/sd: Add mmc switch function support
> 
>   hw/sd/sd.c             | 645 +++++++++++++++++++++++++++++++++--------
>   hw/sd/sdmmc-internal.c |   2 +-
>   hw/sd/sdmmc-internal.h |  97 +++++++
>   include/hw/sd/sd.h     |   7 +
>   4 files changed, 627 insertions(+), 124 deletions(-)
>
Philippe Mathieu-Daudé May 31, 2022, 7:07 p.m. UTC | #5
On 31/5/22 11:19, Cédric Le Goater wrote:
> On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>
>> Rebase/respin of Cédric RFC:
>> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
>> (sorry it took me so long guys...)
>>
>> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
>>
>> I plan to queue patches 1-12 via sdmmc-next later this week.
>>
>> Cédric, if you are happy with this series, it should be easy to rebase
>> your other patches on top and address the comments I left on the RFC :)
> 
> I pushed an update on :
> 
>    https://github.com/legoater/qemu/commits/aspeed-7.1
> 
> Here is an image :
> 
>    https://www.kaod.org/qemu/aspeed/mmc-p10bmc.qcow2
> 
> run with :
> 
>   qemu-system-arm -M rainier-bmc -net nic -net user -drive 
> file=./mmc-p10bmc.qcow2,format=qcow2,if=sd,id=sd0,index=2 -nographic 
> -nodefaults -snapshot -serial mon:stdio

Useful, thanks.

I see in hw/arm/aspeed_ast2600.c:

     /* Init sd card slot class here so that they're under the correct 
parent */
     for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
         object_initialize_child(obj, "sd-controller.sdhci[*]",
                                 &s->sdhci.slots[i], TYPE_SYSBUS_SDHCI);
     }

     object_initialize_child(obj, "emmc-controller.sdhci", 
&s->emmc.slots[0],
                             TYPE_SYSBUS_SDHCI);

     /* eMMC Boot Controller stub */
     create_unimplemented_device("aspeed.emmc-boot-controller",
                                 sc->memmap[ASPEED_DEV_EMMC_BC],
                                 0x1000);

     /* eMMC */
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->emmc), 0, 
sc->memmap[ASPEED_DEV_EMMC]);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->emmc), 0,
                        aspeed_soc_get_irq(s, ASPEED_DEV_EMMC));

Where is 'emmc-controller.sdhci' realized?

In aspeed_sdhci_realize() you set sd-spec-version" = 2, is that OK
with eMMC?

What expects the real hw?

Thanks,

Phil.
Cédric Le Goater June 1, 2022, 5:50 a.m. UTC | #6
On 5/31/22 21:07, Philippe Mathieu-Daudé wrote:
> On 31/5/22 11:19, Cédric Le Goater wrote:
>> On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
>>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>>
>>> Rebase/respin of Cédric RFC:
>>> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
>>> (sorry it took me so long guys...)
>>>
>>> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
>>>
>>> I plan to queue patches 1-12 via sdmmc-next later this week.
>>>
>>> Cédric, if you are happy with this series, it should be easy to rebase
>>> your other patches on top and address the comments I left on the RFC :)
>>
>> I pushed an update on :
>>
>>    https://github.com/legoater/qemu/commits/aspeed-7.1
>>
>> Here is an image :
>>
>>    https://www.kaod.org/qemu/aspeed/mmc-p10bmc.qcow2
>>
>> run with :
>>
>>   qemu-system-arm -M rainier-bmc -net nic -net user -drive file=./mmc-p10bmc.qcow2,format=qcow2,if=sd,id=sd0,index=2 -nographic -nodefaults -snapshot -serial mon:stdio
> 
> Useful, thanks.
> 
> I see in hw/arm/aspeed_ast2600.c:
> 
>      /* Init sd card slot class here so that they're under the correct parent */
>      for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
>          object_initialize_child(obj, "sd-controller.sdhci[*]",
>                                  &s->sdhci.slots[i], TYPE_SYSBUS_SDHCI);
>      }
> 
>      object_initialize_child(obj, "emmc-controller.sdhci", &s->emmc.slots[0],
>                              TYPE_SYSBUS_SDHCI);
> 
>      /* eMMC Boot Controller stub */
>      create_unimplemented_device("aspeed.emmc-boot-controller",
>                                  sc->memmap[ASPEED_DEV_EMMC_BC],
>                                  0x1000);
> 
>      /* eMMC */
>      if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->emmc), 0, sc->memmap[ASPEED_DEV_EMMC]);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->emmc), 0,
>                         aspeed_soc_get_irq(s, ASPEED_DEV_EMMC));
> 
> Where is 'emmc-controller.sdhci' realized?

the slots are realized in aspeed_sdhci_realize(). It's not very
symmetric and the names are confusing.

I think that one of the problems is that the instance_init routine
of TYPE_ASPEED_SDHCI object doesn't know on how much slots
object_initialize_child() should be called since it depends on
its flavor : SD/eMMC.

> In aspeed_sdhci_realize() you set sd-spec-version" = 2, is that OK
> with eMMC?

ah yes. it boots anyhow.

> What expects the real hw?
               ast2400     ast2500     ast2600
  
SDHC card    v2.0/v3.0   v2.0/v3.0   v2.0/v3.0	
SDIO Host      v2.0        v2.0        v2.0	
SD slots        2           2           2	
eMMC            x         v4.51       v5.1
eMMC slots      x           1           1

on the ast2500, the SDIO and eMMC logics are combined in one controller
but since it is not used, QEMU does not model the eMMC part.

Thanks,

C.