diff mbox series

[v2,14/25] hw/sd: Basis for eMMC support

Message ID 20220530193816.45841-15-philippe.mathieu.daude@gmail.com
State New
Headers show
Series hw/sd: Rework models for eMMC support | expand

Commit Message

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

The initial eMMC support from Vincent Palatin was largely reworked to
match the current SD framework.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
TODO: Do not inherit TYPE_SD_CARD, duplicate sd_class_init()
---
 hw/sd/sd.c         | 42 ++++++++++++++++++++++++++++++++++++++++++
 include/hw/sd/sd.h |  3 +++
 2 files changed, 45 insertions(+)

Comments

Cédric Le Goater May 31, 2022, 8:50 a.m. UTC | #1
On 5/30/22 21:38, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
> 
> The initial eMMC support from Vincent Palatin was largely reworked to
> match the current SD framework.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> TODO: Do not inherit TYPE_SD_CARD, duplicate sd_class_init()
> ---
>   hw/sd/sd.c         | 42 ++++++++++++++++++++++++++++++++++++++++++
>   include/hw/sd/sd.h |  3 +++
>   2 files changed, 45 insertions(+)
> 
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index b2f16dbb73..8b178aa261 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -2166,6 +2166,19 @@ static const SDProto sd_proto_sd = {
>       },
>   };
>   
> +static const SDProto sd_proto_emmc = {
> +    .name = "eMMC",
> +    .cmd = {
> +        [0]         = sd_cmd_GO_IDLE_STATE,
> +        [5]         = sd_cmd_illegal,
> +        [19]        = sd_cmd_SEND_TUNING_BLOCK,
> +        [41]        = sd_cmd_illegal,
> +        [52 ... 54] = sd_cmd_illegal,
> +        [58]        = sd_cmd_illegal,
> +        [59]        = sd_cmd_illegal,
> +    },
> +};
> +
>   static void sd_instance_init(Object *obj)
>   {
>       SDState *sd = SD_CARD(obj);
> @@ -2284,9 +2297,38 @@ static const TypeInfo sd_info = {
>       .instance_finalize = sd_instance_finalize,
>   };
>   
> +static void emmc_realize(DeviceState *dev, Error **errp)
> +{
> +    SDState *sd = SD_CARD(dev);
> +
> +    if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
> +            error_setg(errp, "Minimum spec for eMMC is v3.01");
> +            return;
> +    }
> +
> +    sd_realize(dev, errp);

sd_realize overwrites sc->proto. We should not write to the class anyway.

C.

> +}
> +
> +static void emmc_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +    SDCardClass *sc = SD_CARD_CLASS(klass);
> +
> +    dc->desc = "eMMC";
> +    dc->realize = emmc_realize;
> +    sc->proto = &sd_proto_emmc;
> +}
> +
> +static const TypeInfo emmc_info = {
> +    .name = TYPE_EMMC,
> +    .parent = TYPE_SD_CARD,
> +    .class_init = emmc_class_init,
> + };
> +
>   static void sd_register_types(void)
>   {
>       type_register_static(&sd_info);
> +    type_register_static(&emmc_info);
>   }
>   
>   type_init(sd_register_types)
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index 0d94e1f346..e52436b7a5 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -93,6 +93,9 @@ typedef struct {
>   #define TYPE_SD_CARD "sd-card"
>   OBJECT_DECLARE_TYPE(SDState, SDCardClass, SD_CARD)
>   
> +#define TYPE_EMMC "emmc"
> +DECLARE_INSTANCE_CHECKER(SDState, EMMC, TYPE_EMMC)
> +
>   struct SDCardClass {
>       /*< private >*/
>       DeviceClass parent_class;
Cédric Le Goater May 31, 2022, 9:05 a.m. UTC | #2
On 5/30/22 21:38, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
> 
> The initial eMMC support from Vincent Palatin was largely reworked to
> match the current SD framework.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> TODO: Do not inherit TYPE_SD_CARD, duplicate sd_class_init()
> ---
>   hw/sd/sd.c         | 42 ++++++++++++++++++++++++++++++++++++++++++
>   include/hw/sd/sd.h |  3 +++
>   2 files changed, 45 insertions(+)
> 
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index b2f16dbb73..8b178aa261 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -2166,6 +2166,19 @@ static const SDProto sd_proto_sd = {
>       },
>   };
>   
> +static const SDProto sd_proto_emmc = {
> +    .name = "eMMC",
> +    .cmd = {
> +        [0]         = sd_cmd_GO_IDLE_STATE,
> +        [5]         = sd_cmd_illegal,


And this needed an extra :

+        [23]        = sd_cmd_SET_BLOCK_COUNT,


Thanks,

C.


> +        [19]        = sd_cmd_SEND_TUNING_BLOCK,
> +        [41]        = sd_cmd_illegal,
> +        [52 ... 54] = sd_cmd_illegal,
> +        [58]        = sd_cmd_illegal,
> +        [59]        = sd_cmd_illegal,
> +    },
> +};
> +
>   static void sd_instance_init(Object *obj)
>   {
>       SDState *sd = SD_CARD(obj);
> @@ -2284,9 +2297,38 @@ static const TypeInfo sd_info = {
>       .instance_finalize = sd_instance_finalize,
>   };
>   
> +static void emmc_realize(DeviceState *dev, Error **errp)
> +{
> +    SDState *sd = SD_CARD(dev);
> +
> +    if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
> +            error_setg(errp, "Minimum spec for eMMC is v3.01");
> +            return;
> +    }
> +
> +    sd_realize(dev, errp);
> +}
> +
> +static void emmc_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +    SDCardClass *sc = SD_CARD_CLASS(klass);
> +
> +    dc->desc = "eMMC";
> +    dc->realize = emmc_realize;
> +    sc->proto = &sd_proto_emmc;
> +}
> +
> +static const TypeInfo emmc_info = {
> +    .name = TYPE_EMMC,
> +    .parent = TYPE_SD_CARD,
> +    .class_init = emmc_class_init,
> + };
> +
>   static void sd_register_types(void)
>   {
>       type_register_static(&sd_info);
> +    type_register_static(&emmc_info);
>   }
>   
>   type_init(sd_register_types)
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index 0d94e1f346..e52436b7a5 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -93,6 +93,9 @@ typedef struct {
>   #define TYPE_SD_CARD "sd-card"
>   OBJECT_DECLARE_TYPE(SDState, SDCardClass, SD_CARD)
>   
> +#define TYPE_EMMC "emmc"
> +DECLARE_INSTANCE_CHECKER(SDState, EMMC, TYPE_EMMC)
> +
>   struct SDCardClass {
>       /*< private >*/
>       DeviceClass parent_class;
diff mbox series

Patch

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index b2f16dbb73..8b178aa261 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2166,6 +2166,19 @@  static const SDProto sd_proto_sd = {
     },
 };
 
+static const SDProto sd_proto_emmc = {
+    .name = "eMMC",
+    .cmd = {
+        [0]         = sd_cmd_GO_IDLE_STATE,
+        [5]         = sd_cmd_illegal,
+        [19]        = sd_cmd_SEND_TUNING_BLOCK,
+        [41]        = sd_cmd_illegal,
+        [52 ... 54] = sd_cmd_illegal,
+        [58]        = sd_cmd_illegal,
+        [59]        = sd_cmd_illegal,
+    },
+};
+
 static void sd_instance_init(Object *obj)
 {
     SDState *sd = SD_CARD(obj);
@@ -2284,9 +2297,38 @@  static const TypeInfo sd_info = {
     .instance_finalize = sd_instance_finalize,
 };
 
+static void emmc_realize(DeviceState *dev, Error **errp)
+{
+    SDState *sd = SD_CARD(dev);
+
+    if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
+            error_setg(errp, "Minimum spec for eMMC is v3.01");
+            return;
+    }
+
+    sd_realize(dev, errp);
+}
+
+static void emmc_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    SDCardClass *sc = SD_CARD_CLASS(klass);
+
+    dc->desc = "eMMC";
+    dc->realize = emmc_realize;
+    sc->proto = &sd_proto_emmc;
+}
+
+static const TypeInfo emmc_info = {
+    .name = TYPE_EMMC,
+    .parent = TYPE_SD_CARD,
+    .class_init = emmc_class_init,
+ };
+
 static void sd_register_types(void)
 {
     type_register_static(&sd_info);
+    type_register_static(&emmc_info);
 }
 
 type_init(sd_register_types)
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 0d94e1f346..e52436b7a5 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -93,6 +93,9 @@  typedef struct {
 #define TYPE_SD_CARD "sd-card"
 OBJECT_DECLARE_TYPE(SDState, SDCardClass, SD_CARD)
 
+#define TYPE_EMMC "emmc"
+DECLARE_INSTANCE_CHECKER(SDState, EMMC, TYPE_EMMC)
+
 struct SDCardClass {
     /*< private >*/
     DeviceClass parent_class;