From patchwork Mon Feb 1 22:15:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Baumann X-Patchwork-Id: 576720 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id DF4AE140C1F for ; Tue, 2 Feb 2016 09:16:39 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=microsoft.com header.i=@microsoft.com header.b=bKyos1HT; dkim-atps=neutral Received: from localhost ([::1]:54265 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aQMlx-0001OV-6G for incoming@patchwork.ozlabs.org; Mon, 01 Feb 2016 17:16:37 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60614) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aQMlJ-0000Lq-4q for qemu-devel@nongnu.org; Mon, 01 Feb 2016 17:15:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aQMlG-0002pK-8W for qemu-devel@nongnu.org; Mon, 01 Feb 2016 17:15:57 -0500 Received: from mail-bn1bn0102.outbound.protection.outlook.com ([157.56.110.102]:62736 helo=na01-bn1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aQMlG-0002ob-21 for qemu-devel@nongnu.org; Mon, 01 Feb 2016 17:15:54 -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=bKyos1HTK3K6FXcKi/8oYqCfAwoO1xxeqKYFlUK4p56KYm5OwgNn/pIGXEZ8BP7PCa8icjrtP0fKdvflijSjCOhoyHglqhdOToq2kdZ5aa/mvzC5ivHLfFoOj3RXHfjCTDapWiJIe+TKqIVs/osT1rw6BrN+w5vbGVOaq+x0blk= 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:4::724) by CY1PR0301MB2041.namprd03.prod.outlook.com (10.164.2.23) with Microsoft SMTP Server (TLS) id 15.1.396.15; Mon, 1 Feb 2016 22:15:51 +0000 From: Andrew Baumann To: Date: Mon, 1 Feb 2016 14:15:34 -0800 Message-ID: <1454364936-18940-2-git-send-email-Andrew.Baumann@microsoft.com> X-Mailer: git-send-email 2.5.1 In-Reply-To: <1454364936-18940-1-git-send-email-Andrew.Baumann@microsoft.com> References: <1454364936-18940-1-git-send-email-Andrew.Baumann@microsoft.com> MIME-Version: 1.0 X-Originating-IP: [2001:4898:80e8:4::724] X-ClientProxiedBy: CO1PR06CA059.namprd06.prod.outlook.com (10.242.160.49) To CY1PR0301MB2041.namprd03.prod.outlook.com (25.164.2.23) X-MS-Office365-Filtering-Correlation-Id: 25a3da22-8aaa-49c5-b21e-08d32b553f35 X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB2041; 2:GXae2T/irCNPRQ7/EGYep6ZWVOEFnisAKjCP2Kr649cxCXP7D5777KPJC0M8CYUkAxdcgDksJzQcxeF7IERkE4ejfNCh2txAO5gg0pV+j9qQ+HJPJifuLO8+WjzC61I+e32WkTCXw1C7MB8LQRU4A+j9lOMnOmnGXA0D5G/thdL5QHHZ2zvTZR9To3zx209P; 3:uWAmZMHdEDknotfpnrWobJw1PPge6uFMWiOycbesfnstHe2j8GjZMl+uLVW4efltIfnsW0DmXuCPnlOSf6oqCDcrWQfVnsXgwTaQkuOKhj8nbsMJjnIjJlq0AN7a2GNM; 25:YFp3GW5MhRymSbLcZWtR9sDeb8ELXzfn8ENdt5oFhyL0t2Bqpyy2b6EI0LY6kVCItBjVnKE/evHtJ38H5KAMrTBt9leGL7D+vrh5LB1K4opHTmWVH+xvzphvcXVZSBUxK11Dn9mQUaLfSpGsGhSj73tiQQ/ZV3JqLaUoUMWIRVqBfTh+bnQRo8uDirj+qRjrl1KQFggSId25c2ZkU7a9zQbYd9iU64aRUz/28uDzXvao8ii4V3abeOwSytyQBUjqgc0iZTPHgQqtBDrx7CrI8q1ABsk+648vtKe59Apwr2E= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB2041; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB2041; 20:rR/63cmNCUfWB/o0IbjaDybNPgRKHJXSZehHS6udti1ECzv77rNUgDuO4j/j6u0jAjMV43tGXrMxA5CO5ljQNlAE9hdgNA5z8i6cGVRbFtZeDGjK/Odxi0gNmZmteb4q13fPHMnABJGIluk2lll6FQXtXvshu1wBkINGfd99g7fz6rFCFHa7kDImI4XQ0HMlxnEzIEYGB0/8wL9ZxlRgutGlnAlrSiLGH2JlBlPsYwwGnWDSyfvmQJRyIA3Y+VajBlYZxndO1FCy2uorzDZCC7YfsJWsm/wd+PwCAPhyB0QDneyY6hb9xkSyQIonsWwvyNDiQeG1hM1XktdIP3ZprtdjTMsqcRA6p4QE9shR9SDD+2qLq145TZvxMCcjz37yfkJo+o+HBLKhSKSrJvGT6RLapqm8Ue+lk2dJUN4JkL27lMinywz8Tx7NS8M8+YelBMofCZArAvBlIn61IctVpi26x3OVQ3Seh4mhb8ll7yv/du/y0QdT6ZUH+wZKLaFI; 4:iY9B2vtOkGQVMV+YIqGeas5egn3EWTH14uNb8Diu9D7f3yxQUB2XAVJDMFMAP+tqQs6KKZfsX4s1MiSTPbM3cv3efaM7pvbNHI66YlsG0lq5nTHAfe3M94SiPD9/oTzpeF1RJ2UvBJAVc943q079BKJIA42vyru6aO8OFjj983lg1YvwUsxIqSqHjrWjnxGbnmlv9VvreNLoySU5n5CWbpeng5dOQh0+CvX4o+nyymjSBgL8qHQ0yBbjDXNzX7Q7tmxCg9VSUzYutxMc+hfVIZ4N7x0RACdinmjnlehdOaoXQIHs9vYw8ytW3DUs23lWpohjNPn/hwjPsSKG4cKaPF9SLo2owssWqRvPfx7d/cMMJ3iwkvQyqRqeMe3hEMJI 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:CY1PR0301MB2041; BCL:0; PCL:0; RULEID:; SRVR:CY1PR0301MB2041; X-Forefront-PRVS: 0839D067E7 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(36756003)(122386002)(77096005)(6116002)(50466002)(40100003)(10290500002)(4001430100002)(50986999)(92566002)(5004730100002)(5008740100001)(107886002)(87976001)(2950100001)(5005710100001)(110136002)(5001960100002)(1096002)(76176999)(586003)(2906002)(3470700001)(4326007)(189998001)(2351001)(42186005)(47776003)(86362001)(19580395003)(19580405001)(50226001)(48376002)(5003940100001)(86612001)(229853001)(10090500001)(7059030)(3826002); DIR:OUT; SFP:1102; SCL:1; SRVR:CY1PR0301MB2041; H:baumann-desk.redmond.corp.microsoft.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0301MB2041; 23:KOb9EA9Zet/ta62J4G5D6/4h5zByXKgLfUZ/TlB?= =?us-ascii?Q?JsDspbItCg3tyez0I0UxnOBDCsde0IzAkSwpWrpX1x+shKSBKLsWj6KsfDUm?= =?us-ascii?Q?dihaRzVH5RWVUmtRU1s0ntnPsYJPI77vUeJZgYyK0wVIjUz0J4fuV1a6oist?= =?us-ascii?Q?hlL/vK/YPlys7MjbvzREuXjU+Nd3y4U71j2WVt2p3JlpnSg26yNR8w+bY324?= =?us-ascii?Q?w2idX37PswxuVAllDMAVsB2kM/GzZ3OcuDpEv2HrCVwWg8KufE+0YpkvIQ4R?= =?us-ascii?Q?4wBmhnNi/BEAtl/SaVPsdu3T63arb34omVzP6r4QGPMW1Difzs91cg8WGwQg?= =?us-ascii?Q?6eHEgmoOSOC1R6Ers+xHkpXA7//y3UXlIFMD2AI0q/s3XLf+vZraSngvkGUd?= =?us-ascii?Q?WLll/1xjouAMoOOF7HfM3DylTIPPh7JxqK47/gbtjs8x776Y6wUG2+cFhw64?= =?us-ascii?Q?i0c4U5tnT/xnNUFgHZz0XXtVDaO2iVofyUKwtR42H7jNjJcogk/x5adT/vIN?= =?us-ascii?Q?o+Bv3qwo6mirm7Flk745rQp+Jf+tY8LFtRCy9cZmPlXglGjRxJY/jVfmVpAF?= =?us-ascii?Q?0YRPNbnA++sHUUTwzAVpf8t/M6F0XwHym7OW/hFSsHQuJh8Gie5ymbrFa9Hl?= =?us-ascii?Q?zWoIPluQipKAkG/UnpsFCUC8tq+zCXqQIuvGGzlXS9DFjS8C7a/CnOP1lfRL?= =?us-ascii?Q?7Q15OpTCJqhET97sFZ/r8oJD9MubHOLRcvRyVfn34Hn+6APMxkOzp/Cgiev/?= =?us-ascii?Q?+PwEJSGja7EvC58NYfK20PaK2Pad6I7ZvwcVyl+fYvZSFuksiHnxR5Luv0oK?= =?us-ascii?Q?7ypZKVS9kQ08RswfLSnjS0XprA3G/Iucu4+mhb8jfxF8muOcgH+StDg/SDSH?= =?us-ascii?Q?UFHGlKSRBf0Q/L/S7mOC6vChsW2eCtLTcxVyqvFPNRYz6vvFMnMy35BiAE3i?= =?us-ascii?Q?Gv10BANALjJSTVYMaDIkVuAWW29vNUjuJlWeDGbVuq2xX6vHv6dvDyfAUrZs?= =?us-ascii?Q?Iqf7X0dG0BvlBggJQlPUPKQyfqO4xNvQ1lZumW20TN0gB4DXHX1xHGfhFloU?= =?us-ascii?Q?ll+npeCb8e3RzQGWFJkH9cIdb5e0bB3OVgD5n21oQbK8y33M7nw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB2041; 5:ESS+FVkLUeE6GmDK6WiVwmqHgU972iS/htvN0iocVrbJvCp7hDDVBroIPVIzILrelE8hcgiT9PbXrkNratpIcqhZKZykt6RTLTXhL9mR60PWJLZwL4IwDnTXotLS0ExDee0RkYWCW6WrYtr2W1zUzg==; 24:WBhB7P5aDYNpabOOeaKe8PbnqwkgfdueoGa+gE5g845Rdp1rX622GOC8A9LZjb0aH/Oz7xxPY9bGC+Z6thPz4LHo5iYKDEmUX84SwdDeNAE= X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Feb 2016 22:15:51.9137 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB2041 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 X-Received-From: 157.56.110.102 Cc: Peter Maydell , Juan Quintela , Igor Mitsyanko , Andrew Baumann , Sai Pavan Boddu , Peter Crosthwaite , Stefan Hajnoczi Subject: [Qemu-devel] [PATCH v3 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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;