From nobody Tue Oct 28 12:35:07 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1515015797536482.55454903160535; Wed, 3 Jan 2018 13:43:17 -0800 (PST) Received: from localhost ([::1]:37873 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eWqob-0000b9-Hp for importer@patchew.org; Wed, 03 Jan 2018 16:43:13 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53044) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eWqYX-0003X0-QI for qemu-devel@nongnu.org; Wed, 03 Jan 2018 16:26:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eWqYV-0000gq-Vz for qemu-devel@nongnu.org; Wed, 03 Jan 2018 16:26:37 -0500 Received: from mail-qk0-x241.google.com ([2607:f8b0:400d:c09::241]:35195) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eWqYV-0000gS-QD for qemu-devel@nongnu.org; Wed, 03 Jan 2018 16:26:35 -0500 Received: by mail-qk0-x241.google.com with SMTP id 143so3245463qki.2 for ; Wed, 03 Jan 2018 13:26:35 -0800 (PST) Received: from x1.lan ([138.117.48.219]) by smtp.gmail.com with ESMTPSA id a19sm1104402qtj.74.2018.01.03.13.26.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 Jan 2018 13:26:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WoQr3yTmE9N/rxMw8bAyxae+YxSOBF291sjqsp7Wbrg=; b=dK/PaxhMxkO8fiEK3WC9pPaDwaF4tkWFAzt36dgH6qJRMFSANzq9LLCtu3C6b2M/6c fOu+ov0RlUn/H/Evhxq/WB9nNrVzApB8peliQPWNXvdnQoIz0JFDAth5rbiK0AVhgYik 6vR1buiFPi2wNDKFuQDxQke73synkueWNxIuA0RYS1dFyErd9sbpvh7/F1sn5lb0updG 8zC0GhR4Abz196g8tQjr7h40g1bqZaEMLrRdlyS4oGxx8Ionh1c1YiYUrSZT3JAAQeV0 pTJ3SrilYvD2SFGdaPfc2H4ZWVnfLOA6Dm7j0elortidsi7Rvt+SMMNttqs5/KZGK8UN NLhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=WoQr3yTmE9N/rxMw8bAyxae+YxSOBF291sjqsp7Wbrg=; b=uEH6EwseH5bpI8k91rZCSMEcHtr3JeFm1/4NaVKXDoGPzya1E80+VbLwTkjzng8n0h TZHdhQkKO//uwvrll1vzfZbU6Erz+23RyeIZpcyxZPNivm+9oTd1yzhal5o+82KJOJRs ZNKFChJ7Ey9Y7UA3z1SomjpWtERZUVRqEygflb0Yawx+3AiM108/o4skycGb31IVtMrs HmDtIlJyx9uW8sk5D3+Ph9Hxbk/3Pc/tinPGDm00owpm/9uSefnFBqEEmEk27JQr1HOA LkwzWpXuF9+gfvNq4zdIRxYGRaF7aCTTDTCnlUSZj+shr9ESlAQK8cc2D3W5om/xm6bE V85g== X-Gm-Message-State: AKGB3mJeE9ouCnWMGqbbkoN7wt+6Yin+Fq96VK4eUSlV6DrXWqV8O66Q B16TXeNfVk2I5qoIRXNtaW+Z6IIv X-Google-Smtp-Source: ACJfBosBlw5X5BgPubNbtB+I6mCDNSY3TL0+639fa/11Ajxz5boeSlQAos8Sjr9wtGDe5TI9Hun0GQ== X-Received: by 10.55.147.68 with SMTP id v65mr1428170qkd.70.1515014795240; Wed, 03 Jan 2018 13:26:35 -0800 (PST) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Alistair Francis , Peter Maydell , Igor Mitsyanko , Andrew Baumann , Olbrich , Andrzej Zaborowski Date: Wed, 3 Jan 2018 18:24:36 -0300 Message-Id: <20180103212436.15762-26-f4bug@amsat.org> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180103212436.15762-1-f4bug@amsat.org> References: <20180103212436.15762-1-f4bug@amsat.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c09::241 Subject: [Qemu-devel] [PATCH v2 25/25] sdcard: introduce Spec v4.51 & v5.1 MMC commands X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Edgar E . Iglesias" , Prasad J Pandit , Peter Crosthwaite , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, Paul Brook , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- include/hw/sd/sd.h | 1 + hw/sd/sd.c | 181 ++++++++++++++++++++++++++++++++-----------------= ---- 2 files changed, 112 insertions(+), 70 deletions(-) diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h index 6874696ff7..1f1ec2a042 100644 --- a/include/hw/sd/sd.h +++ b/include/hw/sd/sd.h @@ -58,6 +58,7 @@ typedef enum { PROTO_SD =3D 0, PROTO_SPI =3D 1 << 1, + PROTO_MMC =3D 1 << 2, } sd_bus_protocol_t; =20 typedef enum { diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 6fbc640d2e..c4701f9c7c 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -63,6 +63,13 @@ typedef enum { SD_PHY_SPEC_VER_3_01 =3D 301, /* not yet supported */ } sd_phy_spec_ver_t; =20 +typedef enum { + MMC_SPEC_VER_2_2 =3D 202, /* not well supported */ + /* e.MMC */ + MMC_SPEC_VER_4_51 =3D 451, + MMC_SPEC_VER_5_1 =3D 501, /* not supported */ +} mmc_phy_spec_ver_t; + typedef enum { sd_capacity_unknown, sd_capacity_sdsc, /* not well supported */ @@ -157,6 +164,8 @@ static const char *sd_protocol_name(sd_bus_protocol_t p= rotocol) return "SD"; case PROTO_SPI: return "SPI"; + case PROTO_MMC: + return "MMC"; default: g_assert_not_reached(); } @@ -299,78 +308,90 @@ typedef struct { struct { uint16_t version; uint32_t ccc_mask; - } sd, spi; + } sd, spi, mmc; } sd_cmd_supported_t; =20 static const sd_cmd_supported_t cmd_supported[SDCARD_CMD_MAX] =3D { - /* SD SPI */ - [0] =3D {{200, BIT(0)}, {200, BIT(0)}, }, - [1] =3D {{301, BIT(0)}, {200, BIT(0)}, }, - [2] =3D {{200, BIT(0)}, {}, }, - [3] =3D {{200, BIT(0)}, {}, }, - [4] =3D {{200, BIT(0)}, {}, }, - [5] =3D {{200, BIT(9)}, {200, BIT(9)}, }, - [6] =3D {{200, BIT(10)}, {200, BIT(10)}, }, - [7] =3D {{200, BIT(0)}, {}, }, - [8] =3D {{200, BIT(0)}, {200, BIT(0)}, }, - [9] =3D {{200, BIT(0)}, {200, BIT(0)}, }, - [10] =3D {{200, BIT(0)}, {200, BIT(0)}, }, - [12] =3D {{200, BIT(0)}, {200, BIT(0)}, }, - [13] =3D {{200, BIT(0)}, {200, BIT(0)}, }, - [14] =3D {{200, BIT(0)}, {}, }, - [15] =3D {{200, BIT(0)}, {}, }, - [16] =3D {{200, BIT_2_4_7}, {200, BIT_2_4_7}, }, - [17] =3D {{200, BIT(2)}, {200, BIT(2)}, }, - [18] =3D {{200, BIT(2)}, {200, BIT(2)}, }, - [23] =3D {{301, BIT_2_4}, {}, }, - [24] =3D {{200, BIT(4)}, {200, BIT(4)}, }, - [25] =3D {{200, BIT(4)}, {200, BIT(4)}, }, - [26] =3D {{200, BIT_MANUF}, {/*?*/}, }, - [27] =3D {{200, BIT(4)}, {200, BIT(4)}, }, - [28] =3D {{200, BIT(6)}, {200, BIT(6)}, }, - [29] =3D {{200, BIT(6)}, {200, BIT(6)}, }, - [30] =3D {{200, BIT(6)}, {200, BIT(6)}, }, - [32] =3D {{200, BIT(5)}, {200, BIT(5)}, }, - [33] =3D {{200, BIT(5)}, {200, BIT(5)}, }, - [34] =3D {{200, BIT(10)}, {200, BIT(10)}, }, - [35] =3D {{200, BIT(10)}, {200, BIT(10)}, }, - [36] =3D {{200, BIT(10)}, {200, BIT(10)}, }, - [37] =3D {{200, BIT(10)}, {200, BIT(10)}, }, - [38] =3D {{200, BIT(5)}, {200, BIT(5)}, }, - [42] =3D {{200, BIT(7)}, {200, BIT(7)}, }, - [50] =3D {{200, BIT(10)}, {200, BIT(10)}, }, - [52] =3D {{200, BIT(9)}, {200, BIT(9)}, }, - [53] =3D {{200, BIT(9)}, {200, BIT(9)}, }, - [54] =3D {{/* 2.00 SDIO */}, {/* 2.00 SDIO */}, }, - [55] =3D {{200, BIT(8)}, {200, BIT(8)}, }, - [56] =3D {{200, BIT(8)}, {200, BIT(8)}, }, - [57] =3D {{200, BIT(10)}, {200, BIT(10)}, }, - [58] =3D {{301, BIT(0)}, {200, BIT(0)}, }, - [59] =3D {{301, BIT(0)}, {200, BIT(0)}, }, - [60] =3D {{200, BIT_MANUF}, {/*?*/}, }, - [61] =3D {{200, BIT_MANUF}, {/*?*/}, }, - [62] =3D {{200, BIT_MANUF}, {/*?*/}, }, - [63] =3D {{200, BIT_MANUF}, {/*?*/}, }, + /* SD SPI eMMC */ + [0] =3D {{200, BIT(0)}, {200, BIT(0)}, {451, BIT(0)} = }, + [1] =3D {{301, BIT(0)}, {200, BIT(0)}, {451, BIT(0)} = }, + [2] =3D {{200, BIT(0)}, {}, {451, BIT(0)} = }, + [3] =3D {{200, BIT(0)}, {}, {451, BIT(0)} = }, + [4] =3D {{200, BIT(0)}, {}, {451, BIT(0)} = }, + [5] =3D {{200, BIT(9)}, {200, BIT(9)}, {451, BIT(0)} = }, + [6] =3D {{200, BIT(10)}, {200, BIT(10)}, {451, BIT(0)} = }, + [7] =3D {{200, BIT(0)}, {}, {451, BIT(0)} = }, + [8] =3D {{200, BIT(0)}, {200, BIT(0)}, {451, BIT(0)} = }, + [9] =3D {{200, BIT(0)}, {200, BIT(0)}, {451, BIT(0)} = }, + [10] =3D {{200, BIT(0)}, {200, BIT(0)}, {451, BIT(0)} = }, + [12] =3D {{200, BIT(0)}, {200, BIT(0)}, {451, BIT(0)} = }, + [13] =3D {{200, BIT(0)}, {200, BIT(0)}, {451, BIT(0)} = }, + [14] =3D {{200, BIT(0)}, {}, {451, BIT(0)} = }, + [15] =3D {{200, BIT(0)}, {}, {451, BIT(0)} = }, + [16] =3D {{200, BIT_2_4_7}, {200, BIT_2_4_7}, {451, BIT_2_4_7} = }, + [17] =3D {{200, BIT(2)}, {200, BIT(2)}, {451, BIT(2)} = }, + [18] =3D {{200, BIT(2)}, {200, BIT(2)}, {451, BIT(2)} = }, + [19] =3D {{}, {}, {451, BIT(0)} = }, + [21] =3D {{}, {}, {/* HS200 */} = }, + [23] =3D {{301, BIT_2_4}, {}, {/*BIT_2_4 ?*/} = }, + [24] =3D {{200, BIT(4)}, {200, BIT(4)}, {451, BIT(4)} = }, + [25] =3D {{200, BIT(4)}, {200, BIT(4)}, {451, BIT(4)} = }, + [26] =3D {{200, BIT_MANUF}, {/*?*/}, {/*?*/} = }, + [27] =3D {{200, BIT(4)}, {200, BIT(4)}, {451, BIT(4)} = }, + [28] =3D {{200, BIT(6)}, {200, BIT(6)}, {451, BIT(6)} = }, + [29] =3D {{200, BIT(6)}, {200, BIT(6)}, {451, BIT(6)} = }, + [30] =3D {{200, BIT(6)}, {200, BIT(6)}, {451, BIT(6)} = }, + [31] =3D {{}, {}, {451, BIT(6)} = }, + [32] =3D {{200, BIT(5)}, {200, BIT(5)}, {} = }, + [33] =3D {{200, BIT(5)}, {200, BIT(5)}, {} = }, + [34] =3D {{200, BIT(10)}, {200, BIT(10)}, {} = }, + [35] =3D {{200, BIT(10)}, {200, BIT(10)}, {451, BIT(5)} = }, + [36] =3D {{200, BIT(10)}, {200, BIT(10)}, {451, BIT(5)} = }, + [37] =3D {{200, BIT(10)}, {200, BIT(10)}, {}, = }, + [38] =3D {{200, BIT(5)}, {200, BIT(5)}, {451, BIT(5)} = }, + [39] =3D {{}, {}, {451, BIT(9)} = }, + [40] =3D {{}, {}, {451, BIT(9)} = }, + [41] =3D {{}, {}, {/*451, BIT(7)*/} = }, + [42] =3D {{200, BIT(7)}, {200, BIT(7)}, {451, BIT(4)} = }, + [44] =3D {{}, {}, {501, BIT(10)} = }, + [45] =3D {{}, {}, {501, BIT(10)} = }, + [46] =3D {{}, {}, {501, BIT(10)} = }, + [47] =3D {{}, {}, {501, BIT(10)} = }, + [48] =3D {{}, {}, {501, BIT(10)} = }, + [49] =3D {{}, {}, {451, BIT(4)} = }, + [50] =3D {{200, BIT(10)}, {200, BIT(10)}, {} = }, + [52] =3D {{200, BIT(9)}, {200, BIT(9)}, {} = }, + [53] =3D {{200, BIT(9)}, {200, BIT(9)}, {451, BIT(10)} = }, + [54] =3D {{/* 2.00 SDIO */}, {/* 2.00 SDIO */}, {451, BIT(10)} = }, + [55] =3D {{200, BIT(8)}, {200, BIT(8)}, {451, BIT(8)} = }, + [56] =3D {{200, BIT(8)}, {200, BIT(8)}, {451, BIT(8)} = }, + [57] =3D {{200, BIT(10)}, {200, BIT(10)}, {} = }, + [58] =3D {{301, BIT(0)}, {200, BIT(0)}, {} = }, + [59] =3D {{301, BIT(0)}, {200, BIT(0)}, {} = }, + [60] =3D {{200, BIT_MANUF}, {/*?*/}, {/*?*/} = }, + [61] =3D {{200, BIT_MANUF}, {/*?*/}, {/*?*/} = }, + [62] =3D {{200, BIT_MANUF}, {/*?*/}, {/*?*/} = }, + [63] =3D {{200, BIT_MANUF}, {/*?*/}, {/*?*/} = }, }, acmd_supported[SDCARD_CMD_MAX] =3D { - /* SD SPI */ - [6] =3D {{200, BIT(8)}, {}, }, - [13] =3D {{200, BIT(8)}, {200, BIT(8)}, }, - [18] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [22] =3D {{200, BIT(8)}, {200, BIT(8)}, }, - [23] =3D {{200, BIT(8)}, {200, BIT(8)}, }, - [25] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [26] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [38] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [41] =3D {{200, BIT(8)}, {200, BIT(8)}, }, - [42] =3D {{200, BIT(8)}, {200, BIT(8)}, }, - [43] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [44] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [45] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [46] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [47] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [48] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [49] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, - [51] =3D {{200, BIT(8)}, {200, BIT(8)}, }, + /* SD SPI eMMC */ + [6] =3D {{200, BIT(8)}, {}, {451, BIT(0)} = }, + [13] =3D {{200, BIT(8)}, {200, BIT(8)}, {451, BIT(0)} = }, + [18] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [22] =3D {{200, BIT(8)}, {200, BIT(8)}, {451, BIT(4)} = }, + [23] =3D {{200, BIT(8)}, {200, BIT(8)}, {451, BIT(4)} = }, + [25] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [26] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [38] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [41] =3D {{200, BIT(8)}, {200, BIT(8)}, {451, BIT(8)} = }, + [42] =3D {{200, BIT(8)}, {200, BIT(8)}, {451, BIT(0)} = }, + [43] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [44] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [45] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [46] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [47] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [48] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [49] =3D {{200, BIT_SECU}, {200, BIT_SECU}, {451, BIT(0)} = }, + [51] =3D {{200, BIT(8)}, {200, BIT(8)}, {451, BIT(8)} = }, }; =20 static const char *spec_version_name(uint16_t spec_version) @@ -378,8 +399,14 @@ static const char *spec_version_name(uint16_t spec_ver= sion) switch (spec_version) { case SD_PHY_SPEC_VER_2_00: return "v2.00"; + case MMC_SPEC_VER_2_2: + return "v2.2"; case SD_PHY_SPEC_VER_3_01: return "v3.01"; + case MMC_SPEC_VER_4_51: + return "v4.51"; + case MMC_SPEC_VER_5_1: + return "v5.1"; default: g_assert_not_reached(); } @@ -397,6 +424,9 @@ static bool cmd_version_supported(SDState *sd, uint8_t = cmd, bool is_acmd) case PROTO_SPI: cmd_version =3D cmdset[cmd].spi.version; break; + case PROTO_MMC: + cmd_version =3D cmdset[cmd].mmc.version; + break; default: g_assert_not_reached(); } @@ -424,6 +454,9 @@ static bool cmd_class_supported(SDState *sd, uint8_t cm= d, uint8_t class, /* class 1, 3 and 9 are not supported in SPI mode */ cmd_ccc_mask =3D cmdset[cmd].spi.ccc_mask; break; + case PROTO_MMC: + cmd_ccc_mask =3D cmdset[cmd].mmc.ccc_mask; + break; default: g_assert_not_reached(); } @@ -602,7 +635,7 @@ static void sd_reset_csd(SDState *sd, uint64_t size) =20 static void sd_reset_rca(SDState *sd) { - sd->rca =3D 0; + sd->rca =3D sd->bus_protocol =3D=3D PROTO_MMC; } =20 static void sd_set_rca(SDState *sd) @@ -907,6 +940,9 @@ static SDState *sdcard_init(BlockBackend *blk, sd_bus_p= rotocol_t bus_protocol) case PROTO_SPI: qdev_prop_set_bit(dev, "spi", true); break; + case PROTO_MMC: + qdev_prop_set_bit(dev, "mmc", true); + break; default: break; } @@ -2163,7 +2199,11 @@ static void sd_realize(DeviceState *dev, Error **err= p) int ret; =20 sd->proto_name =3D sd_protocol_name(sd->bus_protocol); - sd->spec_version =3D SD_PHY_SPEC_VER_2_00; + if (sd->bus_protocol =3D=3D PROTO_MMC) { + sd->spec_version =3D MMC_SPEC_VER_4_51; + } else { + sd->spec_version =3D SD_PHY_SPEC_VER_2_00; + } =20 if (sd->blk && blk_is_read_only(sd->blk)) { error_setg(errp, "Cannot use read-only drive as SD card"); @@ -2209,6 +2249,7 @@ static Property sd_properties[] =3D { * board to ensure that ssi transfers only occur when the chip select * is asserted. */ DEFINE_PROP_BIT("spi", SDState, bus_protocol, 1, false), + DEFINE_PROP_BIT("mmc", SDState, bus_protocol, 2, false), DEFINE_PROP_END_OF_LIST() }; =20 --=20 2.15.1