From patchwork Mon Feb 8 03:35:19 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Baumann X-Patchwork-Id: 8246611 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 8FB71BEEE5 for ; Mon, 8 Feb 2016 03:35:55 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 67992201D3 for ; Mon, 8 Feb 2016 03:35:54 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 60687201C8 for ; Mon, 8 Feb 2016 03:35:53 +0000 (UTC) Received: from localhost ([::1]:40770 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aSccC-0001xp-Db for patchwork-qemu-devel@patchwork.kernel.org; Sun, 07 Feb 2016 22:35:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39441) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aScc0-0001wY-7j for qemu-devel@nongnu.org; Sun, 07 Feb 2016 22:35:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aScbx-00074J-8a for qemu-devel@nongnu.org; Sun, 07 Feb 2016 22:35:40 -0500 Received: from mail-by2on0125.outbound.protection.outlook.com ([207.46.100.125]:46544 helo=na01-by2-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aScbx-00072q-2b for qemu-devel@nongnu.org; Sun, 07 Feb 2016 22:35:37 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector1; h=From:To:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=pcHLPe+5nmj7l9uNSFW6Std1fSrGajk3WdlyMFG8zzA=; b=k8YWsGkIgLvAdbyqJNLVybyKqq5H5aWOPmVuE2bivQJuyQ6IBuRv5OMIX9BWgteqTg42sJgM2sBYTYVaS77ewMorJFmKq6ib7FTyPHt9r9gSQbZ/9je1HMLArzSUQhv2bSudENZc6RTsQKJzh4kPtsstRx9scl65w8ycHkYj1AI= Authentication-Results: nongnu.org; dkim=none (message not signed) header.d=none; nongnu.org; dmarc=none action=none header.from=microsoft.com; Received: from baumann-desk.redmond.corp.microsoft.com (2001:4898:80e8:e::724) by BY2PR0301MB2040.namprd03.prod.outlook.com (10.163.196.154) with Microsoft SMTP Server (TLS) id 15.1.403.16; Mon, 8 Feb 2016 03:35:34 +0000 From: Andrew Baumann To: Date: Sun, 7 Feb 2016 19:35:19 -0800 Message-ID: <1454902521-21164-2-git-send-email-Andrew.Baumann@microsoft.com> X-Mailer: git-send-email 2.5.1 In-Reply-To: <1454902521-21164-1-git-send-email-Andrew.Baumann@microsoft.com> References: <1454902521-21164-1-git-send-email-Andrew.Baumann@microsoft.com> MIME-Version: 1.0 X-Originating-IP: [2001:4898:80e8:e::724] X-ClientProxiedBy: BY2PR02CA0031.namprd02.prod.outlook.com (10.141.216.21) To BY2PR0301MB2040.namprd03.prod.outlook.com (25.163.196.154) X-MS-Office365-Filtering-Correlation-Id: a733be51-3b0b-4fb8-ea8a-08d33038e78a X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB2040; 2:CPPmQFdho1OQP7X+az0fLxNzxGhNECCj+PuvFZZEBeTZTCwpLVpvaehwU0/sFhr1G7KNarLI/fvtcz1kPfFP68vGuXfk9Lssc4P3RLWLIx+whL0gyyLypx0zdb06BirudAv5/SNngphfYQh2HolqKqUYsgf45/zR3kXHFci2DoohmJ1l62jSZW1qCs8OmU4u; 3:1HOGDC2OZMKrBtl4cy1npjvgOks2rKdCRzbzQ9+RW4xBa7/QTEpKB3m6aGIO6XIIOgRNd0MALQp6WEWbNft+sSJ1uuVQq9qpe0aewMmA6z3+gGTlLqbp3toOGcCf+SzB; 25:UVOxyjWnsCNU1h/1wLL9fqrqEkdLLaj3bRSRMP1hNvoh8pTORaGNyYi7Fm3/i381CsKT4zcSF5LEXaJeRvt1TSD11Pk5l4HCfdzMq0jT2NSmnSEDZFf6+95+WllxfRPOu9LWUnuPIACw6YHHep5kpkNR+vEyZX2GSTlaVBjnxgGs3oWCBj+2p1ktI69PQdhy7R0+V2FyeORboD/SJ8j9sqcvnBevEXgVwuYY9mv6tBuN0CHT9Iy8uFij92JFmTX/4kiEKeUEDitCWhW+OxnRFaE12vmkUHiq9HC4i90Kdw1x0OF/ojGOxK7TanQCzw8VcSzASIeFEmLwWhtzPvEdhxGjXnIX/g0r18MT6rSBazY= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR0301MB2040; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB2040; 20:feCbv0zGUYNcUsP6vTstA5MwQ0UwabHOgVuByFVhHr6j8sGxo6qo/1bVGir4xSiAcAOWlIkjzn3oeSuInx1dKPDKZmYEMi3sPsHaaED9K4btg6alrwHhvV8rE6Qep1fk2Mg+iwS70HE8I3jps/63sVdqlbkfpynkpROYJWc/OtJUyDu/DNJudxZjBAwwWIes2v3vmoq+13oQwsOX/rCPhfauc3KlTqQ3awVBrXhG2VgLjWg+7SpxKOknBHkXz8MRDqEoxfu5uVaC3vm77yJNfev0WRAso8122wtcy3fOiRoxOZ6/4XT1n9symYtjcRYpz6ssOz78b8pk2asnMUr3WOvkqwUbRUgLjZUBvI2ggjjc77A+rScujqDdPlBf1rEzPpE/3S+mxf9q4mqhZRJ2EkD3OcuBeQathhJd6pNE9Jus8eAye7ECOxCESOPhqdne8/ldRrU+ZuQcyFdPUv/FqM7Luj9W4G6iY/7W5cMhLMWbO9baLIJVX3eJKsS5d9jO; 4:lzc+o3ne4PrcLfPRANic9Ze05Wtb6OwEt9Fpv42faPKCrb2BopCwOEdcy9zOvM3HFVU5K4OJg1RJHsMD8dfFpcNUFoQxFhTVqpPjq/Pp9Ya5sI8vrhXTlplAWpx2VPFXmXVtuKxAX5yxDWSBghf/QkuV03YR9TqQ6APCNxr4BsiOAeI3CTKDj7D8LJYEZ91UevUA4GkiEfemNYl1BWhuGZFkDg7TORsmLCT0vuVaXNikY067v+mEstruI7cAanQ+4R4FroqiDqybnkkKBi1ULVwUqtyWzak+gZquFlOI9Wnfr2s7mKrFprW8FN+zTBKgCBRNXKV2IhrQsUtsaQANVSiSwgU6dVIm49DGDwtoBtAepJoDTfp3pBZQDmYrcP0f X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046); SRVR:BY2PR0301MB2040; BCL:0; PCL:0; RULEID:; SRVR:BY2PR0301MB2040; X-Forefront-PRVS: 084674B2CF X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(5003940100001)(5005710100001)(4001430100002)(77096005)(10090500001)(19580395003)(36756003)(92566002)(50986999)(19580405001)(189998001)(110136002)(50466002)(76176999)(2906002)(4326007)(48376002)(586003)(1096002)(5001960100002)(107886002)(86612001)(86362001)(50226001)(2950100001)(47776003)(5004730100002)(2351001)(229853001)(40100003)(42186005)(5008740100001)(122386002)(10290500002)(87976001)(7059030)(3826002); DIR:OUT; SFP:1102; SCL:1; SRVR:BY2PR0301MB2040; H:baumann-desk.redmond.corp.microsoft.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR0301MB2040; 23:f0MVxGwm3vjGxofrMNPfOgyEnsbVBLflmshfpYO?= =?us-ascii?Q?n88KwggKNw918/ITIvITIAh6IkDD19BjEq8ZeDcdqYA6GgUlcHrzW+HfiZsL?= =?us-ascii?Q?wwekDHoSjhiSEyemGUJssNUCCsrdTmKzQCVZBS2WpWll07x4zapt0uCVbNMs?= =?us-ascii?Q?4VaWaoB1HHdBihBWAiSY9/7VE4Ogw67zaMCq3JoNsRfRsukjhY1QKMXiY/5Y?= =?us-ascii?Q?AO4VSohTX+1b5kv1gGTPvQqyfMLBqwN+UikM7g0lKIKrd/K4/9RvNcHboexl?= =?us-ascii?Q?TT2vCHNP5VyHc6X87z1FxR7r8l3K4LurEANvNqAJnF8npWPdRf69vJAOD7TQ?= =?us-ascii?Q?ey3jqpCTVBJBA4MU+pXAFzAGD5DNu4po8QNctvMydv7021WNwGLeqwy+qjyh?= =?us-ascii?Q?TLSuxWEnlxog3XDjwayK5C3EyfxPH/rq/v1vHV0q6G2CDsc+NMK4OP5DiNbh?= =?us-ascii?Q?7/SWvP5f0ACkLbnS3qSD3rvDVs9pghtcbzFBsccxE1WNSm6Z4fgtMojt9hkJ?= =?us-ascii?Q?0bWIKKPA9SDWa+ij3GaME+pu0vZ0is+3txQuj3BtgZZ61kU3xn3OZenNSQrp?= =?us-ascii?Q?pdfPoxOH7wJQx3ZWfZFGeXzgZNnS49PG3Y2BSRQuzCCeTXgy8LLo0nwSgLCU?= =?us-ascii?Q?No6iqIXnPh4JGBLUibPzfYIyKw/WnZ6m0WL4Xn9R4C4myLPu0HVSA93UlQK2?= =?us-ascii?Q?Ma8EEO7PxmyZg1SeXGqzTcCt80Rj9aTha+2eFvwQ02JbKTo+/2r+wb2rrQ+c?= =?us-ascii?Q?/dzMI4+RPqCbnBHBPzM4K37HIrkhOBJ4irQRri5iZTtlNy+NX9Eet5lTrQ5G?= =?us-ascii?Q?oDEUeB5CnPzkfvlWh3gIrLNT9IRd7J/sbKDwklqFQv1rlkgIePc2zmL5fEov?= =?us-ascii?Q?Ich0TM8Apk4dN3uWG7ZA5Klac/XECYqvZvcfe7sjizaR0wya/84//FAsxbNN?= =?us-ascii?Q?EUZ7YC0vb1mUlGtgfs2aRuC3PjCnjP8Nlw0O/EXseHYMGFuWgWh6BPt0v67O?= =?us-ascii?Q?4f85WpRxe3ltnr20nEEuXII3amoNz/g4/Zn+IHXZXM1kBQWpSvM+KCcwA+GL?= =?us-ascii?Q?BDtw693M=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB2040; 5:KdKJbQlpiAiKUGsI5bxHc2H2oIpCqkXq/m7wdjtYneNA7YpSDt4oIsmldt9KdLbkLRzSQddIFJVsVjK1X/ScywF2BLJXrp7+uWhS1Si051gGG1pCA0QT5H3ZXpXmjw/qHBRHMTMetABubrgSp9Jcvg==; 24:pk5gy09ZTWYptNKf7KXBrzOS1mIG4mrvQFFlbrY/6FHH3VMVaEoI05wKgB2NvQ36VvBYZMdhn4Bu4KHdfcnsn+hzVePPu25ABcXOPk01kvM= X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Feb 2016 03:35:34.8127 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR0301MB2040 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 X-Received-From: 207.46.100.125 Cc: Peter Maydell , Juan Quintela , Igor Mitsyanko , Andrew Baumann , Sai Pavan Boddu , Peter Crosthwaite , Stefan Hajnoczi Subject: [Qemu-devel] [PATCH v4 1/3] hw/sd: implement CMD23 (SET_BLOCK_COUNT) for MMC compatibility X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP CMD23 is optional for SD but required for MMC, and the UEFI bootloader used for Windows on Raspberry Pi 2 issues it. Reviewed-by: Peter Crosthwaite Signed-off-by: Andrew Baumann --- hw/sd/sd.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 9e3be2c..8514ac7 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -97,6 +97,7 @@ struct SDState { int32_t wpgrps_size; uint64_t size; uint32_t blk_len; + uint32_t multi_blk_cnt; uint32_t erase_start; uint32_t erase_end; uint8_t pwd[16]; @@ -429,6 +430,7 @@ static void sd_reset(DeviceState *dev) sd->blk_len = 0x200; sd->pwd_len = 0; sd->expecting_acmd = false; + sd->multi_blk_cnt = 0; } static bool sd_get_inserted(SDState *sd) @@ -488,6 +490,7 @@ static const VMStateDescription sd_vmstate = { VMSTATE_UINT32(vhs, SDState), VMSTATE_BITMAP(wp_groups, SDState, 0, wpgrps_size), VMSTATE_UINT32(blk_len, SDState), + VMSTATE_UINT32(multi_blk_cnt, SDState), VMSTATE_UINT32(erase_start, SDState), VMSTATE_UINT32(erase_end, SDState), VMSTATE_UINT8_ARRAY(pwd, SDState, 16), @@ -696,6 +699,12 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc) rca = req.arg >> 16; + /* CMD23 (set block count) must be immediately followed by CMD18 or CMD25 + * if not, its effects are cancelled */ + if (sd->multi_blk_cnt != 0 && !(req.cmd == 18 || req.cmd == 25)) { + sd->multi_blk_cnt = 0; + } + DPRINTF("CMD%d 0x%08x state %d\n", req.cmd, req.arg, sd->state); switch (req.cmd) { /* Basic commands (Class 0 and Class 1) */ @@ -991,6 +1000,17 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, } break; + case 23: /* CMD23: SET_BLOCK_COUNT */ + switch (sd->state) { + case sd_transfer_state: + sd->multi_blk_cnt = req.arg; + return sd_r1; + + default: + break; + } + break; + /* Block write commands (Class 4) */ case 24: /* CMD24: WRITE_SINGLE_BLOCK */ if (sd->spi) @@ -1590,6 +1610,14 @@ void sd_write_data(SDState *sd, uint8_t value) sd->csd[14] |= 0x40; /* Bzzzzzzztt .... Operation complete. */ + if (sd->multi_blk_cnt != 0) { + if (--sd->multi_blk_cnt == 0) { + /* Stop! */ + sd->state = sd_transfer_state; + break; + } + } + sd->state = sd_receivingdata_state; } break; @@ -1736,6 +1764,15 @@ uint8_t sd_read_data(SDState *sd) if (sd->data_offset >= io_len) { sd->data_start += io_len; sd->data_offset = 0; + + if (sd->multi_blk_cnt != 0) { + if (--sd->multi_blk_cnt == 0) { + /* Stop! */ + sd->state = sd_transfer_state; + break; + } + } + if (sd->data_start + io_len > sd->size) { sd->card_status |= ADDRESS_ERROR; break;