On 18/3/22 14:28, Cédric Le Goater wrote:
The initial eMMC support from Vincent Palatin was largely reworked to
match the current SD framework. The parameters mimick a real 4GB eMMC,
but it can be set to various sizes.
This adds a new QOM object class for EMMC devices.
Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
Link:
https://lore.kernel.org/r/1311635951-11047-5-git-send-email-vpalatin@chromium.org
[ jms: - Forward ported to QEMU 5.2 ]
Signed-off-by: Joel Stanley <joel@jms.id.au>
[ clg: - ported on aspeed-7.0 patchset
- HPI activation ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sdmmc-internal.h | 97 +++++++++++++++++++
include/hw/sd/sd.h | 9 ++
hw/sd/sd.c | 205 ++++++++++++++++++++++++++++++++++++++++-
hw/sd/sdmmc-internal.c | 2 +-
4 files changed, 311 insertions(+), 2 deletions(-)
static void sd_instance_init(Object *obj)
{
SDState *sd = SD_CARD(obj);
@@ -2162,10 +2338,19 @@ static void sd_instance_finalize(Object *obj)
static void sd_realize(DeviceState *dev, Error **errp)
{
SDState *sd = SD_CARD(dev);
+ SDCardClass *sc = SD_CARD_GET_CLASS(sd);
int ret;
sd->proto = sd->spi ? &sd_proto_spi : &sd_proto_sd;
+ if (sc->proto) {
+ sd->proto = sc->proto;
+ }
+
+ if (sc->spec_version) {
+ sd->spec_version = sc->spec_version;
+ }
+
switch (sd->spec_version) {
case SD_PHY_SPECv1_10_VERS
... SD_PHY_SPECv3_01_VERS:
Instead I'd use:
-- >8 --
@@ -2301,14 +2297,26 @@ 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;
}
---