Message ID | 20220530193816.45841-15-philippe.mathieu.daude@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/sd: Rework models for eMMC support | expand |
On 30/5/22 21:38, Philippe Mathieu-Daudé wrote: > From: Philippe Mathieu-Daudé <f4bug@amsat.org> I missed something during the cherry-pick, this should be: From: Cédric Le Goater <clg@kaod.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); > +} > + > +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;
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;
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 --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;