diff mbox

[v47,00/19] hw/sd/sdcard: Add eMMC support

Message ID 20240709152556.52896-1-philmd@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Philippe Mathieu-Daudé July 9, 2024, 3:25 p.m. UTC
Since v42:
- Stick to spec v4.3 (re-simplified EXT_CSD register & migrate)
- Fill CID register
- Few changes to CSD register
- Implement 'boot-mode' reset timing
- Add 'boot-size' property

Change required for aspeed branch:
-- >8 --
(I'm still reluctant to merge patches 16-18)...
---

Cédric Le Goater (2):
  hw/sd/sdcard: Add emmc_cmd_SET_RELATIVE_ADDR handler (CMD3)
  hw/sd/sdcard: Fix SET_BLOCK_COUNT command argument on eMMC (CMD23)

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

Luc Michel (1):
  hw/sd/sdcard: Implement eMMC sleep state (CMD5)

Philippe Mathieu-Daudé (11):
  hw/sd/sdcard: Basis for eMMC support
  hw/sd/sdcard: Register generic command handlers
  hw/sd/sdcard: Register unimplemented command handlers
  hw/sd/sdcard: Implement emmc_set_cid()
  hw/sd/sdcard: Implement emmc_set_csd()
  hw/sd/sdcard: Add mmc_cmd_PROGRAM_CID handler (CMD26)
  hw/sd/sdcard: Add eMMC 'boot-size' property
  hw/sd/sdcard: Simplify EXT_CSD values for spec v4.3
  hw/sd/sdcard: Migrate ExtCSD 'modes' register
  hw/sd/sdcard: Implement eMMC 'boot-mode'
  hw/sd/sdcard: Enable TYPE_EMMC card model

Sai Pavan Boddu (1):
  hw/sd/sdcard: Add mmc SWITCH function support (CMD6)

Vincent Palatin (1):
  hw/sd/sdcard: Add emmc_cmd_SEND_EXT_CSD handler (CMD8)

 include/hw/sd/sd.h |   4 +
 hw/sd/sd.c         | 424 ++++++++++++++++++++++++++++++++++++++++++++-
 hw/sd/trace-events |   3 +
 3 files changed, 425 insertions(+), 6 deletions(-)

Comments

Cédric Le Goater July 9, 2024, 3:58 p.m. UTC | #1
On 7/9/24 5:25 PM, Philippe Mathieu-Daudé wrote:
> Since v42:
> - Stick to spec v4.3 (re-simplified EXT_CSD register & migrate)
> - Fill CID register
> - Few changes to CSD register
> - Implement 'boot-mode' reset timing
> - Add 'boot-size' property
> 
> Change required for aspeed branch:
> -- >8 --
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 8c0e36badd..563816b710 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -344,3 +344,3 @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
>           if (emmc) {
> -            qdev_prop_set_uint8(card, "boot-config", boot_emmc ? 0x48 : 0x0);
> +            qdev_prop_set_uint64(card, "boot-size", 1 * MiB);
>           }
> (I'm still reluctant to merge patches 16-18)...

Then, please drop all changes related to the boot partitions. I will keep
the original patches in my tree and address the feature when I have time.
TYPE_EMMC is already great to have.

Thanks,

C.



> ---
> 
> Cédric Le Goater (2):
>    hw/sd/sdcard: Add emmc_cmd_SET_RELATIVE_ADDR handler (CMD3)
>    hw/sd/sdcard: Fix SET_BLOCK_COUNT command argument on eMMC (CMD23)
> 
> Joel Stanley (3):
>    hw/sd/sdcard: Support boot area in emmc image
>    hw/sd/sdcard: Subtract bootarea size from blk
>    hw/sd/sdcard: Add boot config support
> 
> Luc Michel (1):
>    hw/sd/sdcard: Implement eMMC sleep state (CMD5)
> 
> Philippe Mathieu-Daudé (11):
>    hw/sd/sdcard: Basis for eMMC support
>    hw/sd/sdcard: Register generic command handlers
>    hw/sd/sdcard: Register unimplemented command handlers
>    hw/sd/sdcard: Implement emmc_set_cid()
>    hw/sd/sdcard: Implement emmc_set_csd()
>    hw/sd/sdcard: Add mmc_cmd_PROGRAM_CID handler (CMD26)
>    hw/sd/sdcard: Add eMMC 'boot-size' property
>    hw/sd/sdcard: Simplify EXT_CSD values for spec v4.3
>    hw/sd/sdcard: Migrate ExtCSD 'modes' register
>    hw/sd/sdcard: Implement eMMC 'boot-mode'
>    hw/sd/sdcard: Enable TYPE_EMMC card model
> 
> Sai Pavan Boddu (1):
>    hw/sd/sdcard: Add mmc SWITCH function support (CMD6)
> 
> Vincent Palatin (1):
>    hw/sd/sdcard: Add emmc_cmd_SEND_EXT_CSD handler (CMD8)
> 
>   include/hw/sd/sd.h |   4 +
>   hw/sd/sd.c         | 424 ++++++++++++++++++++++++++++++++++++++++++++-
>   hw/sd/trace-events |   3 +
>   3 files changed, 425 insertions(+), 6 deletions(-)
>
Philippe Mathieu-Daudé July 9, 2024, 9:39 p.m. UTC | #2
On 9/7/24 17:58, Cédric Le Goater wrote:
> On 7/9/24 5:25 PM, Philippe Mathieu-Daudé wrote:
>> Since v42:
>> - Stick to spec v4.3 (re-simplified EXT_CSD register & migrate)
>> - Fill CID register
>> - Few changes to CSD register
>> - Implement 'boot-mode' reset timing
>> - Add 'boot-size' property
>>
>> Change required for aspeed branch:
>> -- >8 --
>> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
>> index 8c0e36badd..563816b710 100644
>> --- a/hw/arm/aspeed.c
>> +++ b/hw/arm/aspeed.c
>> @@ -344,3 +344,3 @@ static void sdhci_attach_drive(SDHCIState *sdhci, 
>> DriveInfo *dinfo, bool emmc,
>>           if (emmc) {
>> -            qdev_prop_set_uint8(card, "boot-config", boot_emmc ? 0x48 
>> : 0x0);
>> +            qdev_prop_set_uint64(card, "boot-size", 1 * MiB);
>>           }
>> (I'm still reluctant to merge patches 16-18)...
> 
> Then, please drop all changes related to the boot partitions. I will keep
> the original patches in my tree and address the feature when I have time.
> TYPE_EMMC is already great to have.

As you mentioned on today's community call, eMMC is a chipset soldered
on a board, so our boards exactly knows what size to expect on the card,
and whether boot partitions are present or not. I find the way of
building the drive image described in patch #16 cumbersome, but I'm OK
to make some concession on it, since "it works" as it. If necessary
we'll improve and deprecate the current properties. I'll repost and
plan to merge as-is (modulo review comments).

Regards,

Phil.
Cédric Le Goater July 10, 2024, 4:58 a.m. UTC | #3
On 7/9/24 11:39 PM, Philippe Mathieu-Daudé wrote:
> On 9/7/24 17:58, Cédric Le Goater wrote:
>> On 7/9/24 5:25 PM, Philippe Mathieu-Daudé wrote:
>>> Since v42:
>>> - Stick to spec v4.3 (re-simplified EXT_CSD register & migrate)
>>> - Fill CID register
>>> - Few changes to CSD register
>>> - Implement 'boot-mode' reset timing
>>> - Add 'boot-size' property
>>>
>>> Change required for aspeed branch:
>>> -- >8 --
>>> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
>>> index 8c0e36badd..563816b710 100644
>>> --- a/hw/arm/aspeed.c
>>> +++ b/hw/arm/aspeed.c
>>> @@ -344,3 +344,3 @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
>>>           if (emmc) {
>>> -            qdev_prop_set_uint8(card, "boot-config", boot_emmc ? 0x48 : 0x0);
>>> +            qdev_prop_set_uint64(card, "boot-size", 1 * MiB);
>>>           }
>>> (I'm still reluctant to merge patches 16-18)...
>>
>> Then, please drop all changes related to the boot partitions. I will keep
>> the original patches in my tree and address the feature when I have time.
>> TYPE_EMMC is already great to have.
> 
> As you mentioned on today's community call, eMMC is a chipset soldered
> on a board, so our boards exactly knows what size to expect on the card,
> and whether boot partitions are present or not. 

My remark was on the use of 3 blockdevs to represent the eMMC contents.
1 should be enough.

Having a "boot-size" property to set the BOOT_SIZE_MULT register is fine.
The Aspeed model does some assumption today when installing the first
boot area as a boot ROM :

     aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);

The "boot-size" property will clarify the settings. Please keep it.

Other topic :

      ROMs need to be installed early and IIRC, user creatable devices
      are not available at that time. So, when the flash devices are be
      defined on the command line with :

         -blockdev node-name=fmc0,driver=file,filename=./flash.img \
         -device mx66u51235f,cs=0x0,bus=ssi.0,drive=fmc0 \

      the ROM can not be installed and the initial boot will execute
      in place, using SPI transactions to fetch instructions which is
      slower. To install a ROM, the -drive API is required.

> I find the way of building the drive image described in patch #16 cumbersome, 

I agree but that's the layout on real HW. The flash layouts are even more
complex.

> but I'm OK
> to make some concession on it, since "it works" as it. If necessary
> we'll improve and deprecate the current properties. 

I don't think we will need to. The properties make sense.

> I'll repost and plan to merge as-is (modulo review comments).

OK. I will rebase then.

Thanks,

C.
Cédric Le Goater July 10, 2024, 8:09 a.m. UTC | #4
On 7/10/24 6:58 AM, Cédric Le Goater wrote:
> On 7/9/24 11:39 PM, Philippe Mathieu-Daudé wrote:
>> On 9/7/24 17:58, Cédric Le Goater wrote:
>>> On 7/9/24 5:25 PM, Philippe Mathieu-Daudé wrote:
>>>> Since v42:
>>>> - Stick to spec v4.3 (re-simplified EXT_CSD register & migrate)
>>>> - Fill CID register
>>>> - Few changes to CSD register
>>>> - Implement 'boot-mode' reset timing
>>>> - Add 'boot-size' property
>>>>
>>>> Change required for aspeed branch:
>>>> -- >8 --
>>>> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
>>>> index 8c0e36badd..563816b710 100644
>>>> --- a/hw/arm/aspeed.c
>>>> +++ b/hw/arm/aspeed.c
>>>> @@ -344,3 +344,3 @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
>>>>           if (emmc) {
>>>> -            qdev_prop_set_uint8(card, "boot-config", boot_emmc ? 0x48 : 0x0);
>>>> +            qdev_prop_set_uint64(card, "boot-size", 1 * MiB);
>>>>           }
>>>> (I'm still reluctant to merge patches 16-18)...
>>>
>>> Then, please drop all changes related to the boot partitions. I will keep
>>> the original patches in my tree and address the feature when I have time.
>>> TYPE_EMMC is already great to have.
>>
>> As you mentioned on today's community call, eMMC is a chipset soldered
>> on a board, so our boards exactly knows what size to expect on the card,
>> and whether boot partitions are present or not. 
> 
> My remark was on the use of 3 blockdevs to represent the eMMC contents.
> 1 should be enough.
> 
> Having a "boot-size" property to set the BOOT_SIZE_MULT register is fine.
> The Aspeed model does some assumption today when installing the first
> boot area as a boot ROM :
> 
>      aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
> 
> The "boot-size" property will clarify the settings. Please keep it.

64 * KiB is not related to the eMMC partition size. It is a SRAM
limit in which the SoC loads the boot data.

Thanks,

C.
diff mbox

Patch

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 8c0e36badd..563816b710 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -344,3 +344,3 @@  static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
         if (emmc) {
-            qdev_prop_set_uint8(card, "boot-config", boot_emmc ? 0x48 : 0x0);
+            qdev_prop_set_uint64(card, "boot-size", 1 * MiB);
         }