~ubuntu-branches/ubuntu/trusty/qemu/trusty

« back to all changes in this revision

Viewing changes to debian/patches/ubuntu/linaro/0004-hw-sd.c-Add-MMC-emulation-support.patch

  • Committer: Package Import Robot
  • Author(s): Serge Hallyn
  • Date: 2014-02-04 12:13:08 UTC
  • mfrom: (10.1.45 sid)
  • Revision ID: package-import@ubuntu.com-20140204121308-1xq92lrfs75agw2g
Tags: 1.7.0+dfsg-3ubuntu1~ppa1
* Merge 1.7.0+dfsg-3 from debian.  Remaining changes:
  - debian/patches/ubuntu:
    * expose-vmx_qemu64cpu.patch
    * linaro (omap3) and arm64 patches
    * ubuntu/target-ppc-add-stubs-for-kvm-breakpoints: fix FTBFS
      on ppc
    * ubuntu/CVE-2013-4377.patch: fix denial of service via virtio
  - debian/qemu-system-x86.modprobe: set kvm_intel nested=1 options
  - debian/control:
    * add arm64 to Architectures
    * add qemu-common and qemu-system-aarch64 packages
  - debian/qemu-system-common.install: add debian/tmp/usr/lib
  - debian/qemu-system-common.preinst: add kvm group
  - debian/qemu-system-common.postinst: remove acl placed by udev,
    and add udevadm trigger.
  - qemu-system-x86.links: add eepro100.rom, remove pxe-virtio,
    pxe-e1000 and pxe-rtl8139.
  - add qemu-system-x86.qemu-kvm.upstart and .default
  - qemu-user-static.postinst-in: remove arm64 binfmt
  - debian/rules:
    * allow parallel build
    * add aarch64 to system_targets and sys_systems
    * add qemu-kvm-spice links
    * install qemu-system-x86.modprobe
  - add debian/qemu-system-common.links for OVMF.fd link
* Remove kvm-img, kvm-nbd, kvm-ifup and kvm-ifdown symlinks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
From 5ab88d616886f4903bcd32857cc7fb5528286686 Mon Sep 17 00:00:00 2001
 
2
From: =?UTF-8?q?Juha=20Riihim=C3=A4ki?= <juha.riihimaki@nokia.com>
 
3
Date: Mon, 18 Feb 2013 16:58:23 +0000
 
4
Subject: [PATCH 04/70] hw/sd.c: Add MMC emulation support
 
5
 
 
6
This patch is basically just adding actual implementation
 
7
of the mmc flag. It also has a few minor cleanups like
 
8
printf->fprintf (but should be DPRINTF)
 
9
---
 
10
 hw/sd/sd.c      | 275 +++++++++++++++++++++++++++++++++++++++++++++++---------
 
11
 include/hw/sd.h |   1 +
 
12
 2 files changed, 233 insertions(+), 43 deletions(-)
 
13
 
 
14
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
 
15
index ce7f57f..3ec2c0d 100644
 
16
--- a/hw/sd/sd.c
 
17
+++ b/hw/sd/sd.c
 
18
@@ -4,6 +4,7 @@
 
19
  *
 
20
  * Copyright (c) 2006 Andrzej Zaborowski  <balrog@zabor.org>
 
21
  * Copyright (c) 2007 CodeSourcery
 
22
+ * Copyright (c) 2009 Nokia Corporation
 
23
  *
 
24
  * Redistribution and use in source and binary forms, with or without
 
25
  * modification, are permitted provided that the following conditions
 
26
@@ -83,6 +84,7 @@ struct SDState {
 
27
     uint8_t scr[8];
 
28
     uint8_t cid[16];
 
29
     uint8_t csd[16];
 
30
+    uint8_t ext_csd[512];
 
31
     uint16_t rca;
 
32
     uint32_t card_status;
 
33
     uint8_t sd_status[64];
 
34
@@ -98,7 +100,7 @@ struct SDState {
 
35
     uint32_t pwd_len;
 
36
     uint8_t function_group[6];
 
37
 
 
38
-    bool spi;
 
39
+    bool spi, mmc;
 
40
     uint8_t current_cmd;
 
41
     /* True if we will handle the next command as an ACMD. Note that this does
 
42
      * *not* track the APP_CMD status bit!
 
43
@@ -114,6 +116,7 @@ struct SDState {
 
44
     uint8_t *buf;
 
45
 
 
46
     bool enable;
 
47
+    int buswidth, highspeed;
 
48
 };
 
49
 
 
50
 static void sd_set_mode(SDState *sd)
 
51
@@ -141,9 +144,9 @@ static void sd_set_mode(SDState *sd)
 
52
 }
 
53
 
 
54
 static const sd_cmd_type_t sd_cmd_type[64] = {
 
55
-    sd_bc,   sd_none, sd_bcr,  sd_bcr,  sd_none, sd_none, sd_none, sd_ac,
 
56
+    sd_bc,   sd_none, sd_bcr,  sd_bcr,  sd_none, sd_ac,   sd_none, sd_ac,
 
57
     sd_bcr,  sd_ac,   sd_ac,   sd_adtc, sd_ac,   sd_ac,   sd_none, sd_ac,
 
58
-    sd_ac,   sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
 
59
+    sd_ac,   sd_adtc, sd_adtc, sd_none, sd_adtc, sd_none, sd_none, sd_adtc,
 
60
     sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac,   sd_ac,   sd_adtc, sd_none,
 
61
     sd_ac,   sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
 
62
     sd_none, sd_none, sd_bc,   sd_none, sd_none, sd_none, sd_none, sd_none,
 
63
@@ -210,8 +213,8 @@ static void sd_set_ocr(SDState *sd)
 
64
 
 
65
 static void sd_set_scr(SDState *sd)
 
66
 {
 
67
-    sd->scr[0] = 0x00;         /* SCR Structure */
 
68
-    sd->scr[1] = 0x2f;         /* SD Security Support */
 
69
+    sd->scr[0] = 0x00; /* SCR v1.0, SD spec v1.0/1.01 */
 
70
+    sd->scr[1] = 0x25; /* erase=0, SD security v1.01, 1bit/4bit bus width */
 
71
     sd->scr[2] = 0x00;
 
72
     sd->scr[3] = 0x00;
 
73
     sd->scr[4] = 0x00;
 
74
@@ -222,7 +225,7 @@ static void sd_set_scr(SDState *sd)
 
75
 
 
76
 #define MID    0xaa
 
77
 #define OID    "XY"
 
78
-#define PNM    "QEMU!"
 
79
+#define PNM    "QEMU!!"
 
80
 #define PRV    0x01
 
81
 #define MDT_YR 2006
 
82
 #define MDT_MON        2
 
83
@@ -237,14 +240,23 @@ static void sd_set_cid(SDState *sd)
 
84
     sd->cid[5] = PNM[2];
 
85
     sd->cid[6] = PNM[3];
 
86
     sd->cid[7] = PNM[4];
 
87
-    sd->cid[8] = PRV;          /* Fake product revision (PRV) */
 
88
+    if (sd->mmc) {
 
89
+        sd->cid[8] = PNM[5];
 
90
+    } else {
 
91
+        sd->cid[8] = PRV;              /* Fake product revision (PRV) */
 
92
+    }
 
93
     sd->cid[9] = 0xde;         /* Fake serial number (PSN) */
 
94
     sd->cid[10] = 0xad;
 
95
     sd->cid[11] = 0xbe;
 
96
     sd->cid[12] = 0xef;
 
97
-    sd->cid[13] = 0x00 |       /* Manufacture date (MDT) */
 
98
-        ((MDT_YR - 2000) / 10);
 
99
-    sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
 
100
+    if (sd->mmc) {
 
101
+        sd->cid[13] = 0x55;
 
102
+        sd->cid[14] = ((MDT_MON) << 4) | (MDT_YR - 1997);
 
103
+    } else {
 
104
+        sd->cid[13] = 0x00 |   /* Manufacture date (MDT) */
 
105
+            ((MDT_YR - 2000) / 10);
 
106
+        sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
 
107
+    }
 
108
     sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
 
109
 }
 
110
 
 
111
@@ -266,7 +278,12 @@ static void sd_set_csd(SDState *sd, uint64_t size)
 
112
     uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
 
113
 
 
114
     if (size <= 0x40000000) {  /* Standard Capacity SD */
 
115
-        sd->csd[0] = 0x00;     /* CSD structure */
 
116
+        if (sd->mmc) {
 
117
+            sd->csd[0] = 0x80 | /* CSD structure: v1.2 */
 
118
+                         0x0c;  /* MMC v3.x */
 
119
+        } else {
 
120
+            sd->csd[0] = 0x00;  /* CSD structure: v0 */
 
121
+        }
 
122
         sd->csd[1] = 0x26;     /* Data read access-time-1 */
 
123
         sd->csd[2] = 0x00;     /* Data read access-time-2 */
 
124
         sd->csd[3] = 0x5a;     /* Max. data transfer rate */
 
125
@@ -292,25 +309,52 @@ static void sd_set_csd(SDState *sd, uint64_t size)
 
126
         sd->csd[14] = 0x00;    /* File format group */
 
127
         sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
 
128
     } else {                   /* SDHC */
 
129
-        size /= 512 * 1024;
 
130
-        size -= 1;
 
131
-        sd->csd[0] = 0x40;
 
132
+        if (sd->mmc) {
 
133
+            sd->csd[0] = 0x90; /* CSD structure v1.2, MMC v4.0/4.1 */
 
134
+        } else {
 
135
+            sd->csd[0] = 0x40; /* CSD structure v1 */
 
136
+        }
 
137
         sd->csd[1] = 0x0e;
 
138
         sd->csd[2] = 0x00;
 
139
         sd->csd[3] = 0x32;
 
140
         sd->csd[4] = 0x5b;
 
141
         sd->csd[5] = 0x59;
 
142
-        sd->csd[6] = 0x00;
 
143
-        sd->csd[7] = (size >> 16) & 0xff;
 
144
-        sd->csd[8] = (size >> 8) & 0xff;
 
145
-        sd->csd[9] = (size & 0xff);
 
146
-        sd->csd[10] = 0x7f;
 
147
+        if (sd->mmc) {
 
148
+            sd->csd[6] = 0x03;
 
149
+            sd->csd[7] = 0xff;
 
150
+            sd->csd[8] = 0xff;
 
151
+            sd->csd[9] = 0xff;
 
152
+            sd->csd[10] = 0xff;
 
153
+        } else {
 
154
+            size /= 512 * 1024;
 
155
+            size -= 1;
 
156
+            sd->csd[6] = 0x00;
 
157
+            sd->csd[7] = (size >> 16) & 0xff;
 
158
+            sd->csd[8] = (size >> 8) & 0xff;
 
159
+            sd->csd[9] = (size & 0xff);
 
160
+            sd->csd[10] = 0x7f;
 
161
+        }
 
162
         sd->csd[11] = 0x80;
 
163
         sd->csd[12] = 0x0a;
 
164
         sd->csd[13] = 0x40;
 
165
         sd->csd[14] = 0x00;
 
166
         sd->csd[15] = 0x00;
 
167
         sd->ocr |= 1 << 30;     /* High Capacity SD Memory Card */
 
168
+        if (sd->mmc) {
 
169
+            size /= 512;
 
170
+            sd->buswidth = 1; /* 4bit mode */
 
171
+            sd->highspeed = 0;
 
172
+            memset(sd->ext_csd, 0, 512);
 
173
+            sd->ext_csd[183] = sd->buswidth;
 
174
+            sd->ext_csd[185] = sd->highspeed;
 
175
+            sd->ext_csd[192] = 0x03; /* EXT_CSD v3 */
 
176
+            sd->ext_csd[196] = 0x03; /* supports 26MHz and 52MHz */
 
177
+            sd->ext_csd[212] = (size & 0xff);
 
178
+            sd->ext_csd[213] = (size >> 8) & 0xff;
 
179
+            sd->ext_csd[214] = (size >> 16) & 0xff;
 
180
+            sd->ext_csd[215] = (size >> 24) & 0xff;
 
181
+            sd->ext_csd[217] = 0x00; /* sleep/awake timeout */
 
182
+        }
 
183
     }
 
184
 }
 
185
 
 
186
@@ -454,7 +498,7 @@ static const BlockDevOps sd_block_ops = {
 
187
 
 
188
 static const VMStateDescription sd_vmstate = {
 
189
     .name = "sd-card",
 
190
-    .version_id = 1,
 
191
+    .version_id = 2,
 
192
     .minimum_version_id = 1,
 
193
     .fields = (VMStateField[]) {
 
194
         VMSTATE_UINT32(mode, SDState),
 
195
@@ -480,6 +524,7 @@ static const VMStateDescription sd_vmstate = {
 
196
         VMSTATE_UINT8_ARRAY(data, SDState, 512),
 
197
         VMSTATE_BUFFER_POINTER_UNSAFE(buf, SDState, 1, 512),
 
198
         VMSTATE_BOOL(enable, SDState),
 
199
+        VMSTATE_UINT8_ARRAY_V(ext_csd, SDState, 512, 2),
 
200
         VMSTATE_END_OF_LIST()
 
201
     }
 
202
 };
 
203
@@ -500,6 +545,7 @@ SDState *sd_init(BlockDriverState *bs, bool is_spi, bool is_mmc)
 
204
     sd = (SDState *) g_malloc0(sizeof(SDState));
 
205
     sd->buf = qemu_blockalign(bs, 512);
 
206
     sd->spi = is_spi;
 
207
+    sd->mmc = is_mmc;
 
208
     sd->enable = true;
 
209
     sd->bdrv = bs;
 
210
     sd_reset(sd);
 
211
@@ -596,6 +642,46 @@ static void sd_function_switch(SDState *sd, uint32_t arg)
 
212
     sd->data[66] = crc & 0xff;
 
213
 }
 
214
 
 
215
+static void mmc_function_switch(SDState *sd, uint32_t arg)
 
216
+{
 
217
+    enum {
 
218
+        cmd_set = 0,
 
219
+        set_bits,
 
220
+        clear_bits,
 
221
+        write_byte,
 
222
+
 
223
+        unknown
 
224
+    } mode = (arg >> 24);
 
225
+    if (mode >= unknown) {
 
226
+        fprintf(stderr, "%s: unknown mode 0x%02x\n", __FUNCTION__, mode);
 
227
+    } else {
 
228
+        if (mode == cmd_set) {
 
229
+            fprintf(stderr, "%s: command set change not implemented!\n",
 
230
+                    __FUNCTION__);
 
231
+        } else {
 
232
+            uint8_t index = (arg >> 16) & 0xff;
 
233
+            /* ignore writes to read-only fields */
 
234
+            if (index != 192 && index != 196 &&
 
235
+                (index < 212 || index > 215)) {
 
236
+                uint8_t value = (arg >> 8) & 0xff;
 
237
+                switch (mode) {
 
238
+                    case set_bits:
 
239
+                        sd->ext_csd[index] |= value;
 
240
+                        break;
 
241
+                    case clear_bits:
 
242
+                        sd->ext_csd[index] &= ~value;
 
243
+                        break;
 
244
+                    case write_byte:
 
245
+                        sd->ext_csd[index] = value;
 
246
+                        break;
 
247
+                    default:
 
248
+                        break;
 
249
+                }
 
250
+            }
 
251
+        }
 
252
+    }
 
253
+}
 
254
+
 
255
 static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
 
256
 {
 
257
     return test_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
 
258
@@ -696,9 +782,15 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 
259
         break;
 
260
 
 
261
     case 1:    /* CMD1:   SEND_OP_CMD */
 
262
+        if (sd->mmc) {
 
263
+            if (sd->state == sd_idle_state) {
 
264
+                sd->state = sd_ready_state;
 
265
+                return sd_r3;
 
266
+            }
 
267
+            break;
 
268
+         }
 
269
         if (!sd->spi)
 
270
             goto bad_cmd;
 
271
-
 
272
         sd->state = sd_transfer_state;
 
273
         return sd_r1;
 
274
 
 
275
@@ -720,8 +812,12 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 
276
             goto bad_cmd;
 
277
         switch (sd->state) {
 
278
         case sd_identification_state:
 
279
-        case sd_standby_state:
 
280
             sd->state = sd_standby_state;
 
281
+        case sd_standby_state:
 
282
+            if (sd->mmc) {
 
283
+                sd->rca = req.arg >> 16;
 
284
+                return sd_r1;
 
285
+            }
 
286
             sd_set_rca(sd);
 
287
             return sd_r6;
 
288
 
 
289
@@ -735,14 +831,26 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 
290
             goto bad_cmd;
 
291
         switch (sd->state) {
 
292
         case sd_standby_state:
 
293
-            break;
 
294
+            return sd_r0;
 
295
 
 
296
         default:
 
297
             break;
 
298
         }
 
299
         break;
 
300
 
 
301
-    case 5: /* CMD5: reserved for SDIO cards */
 
302
+    case 5: /* CMD5: reserved for SDIO cards / SLEEP_AWAKE (MMC) */
 
303
+        if (sd->mmc) {
 
304
+            if (sd->rca != rca) {
 
305
+                return sd_r0;
 
306
+            }
 
307
+            if (req.arg & (1 << 15)) {
 
308
+                sd->state = sd_transfer_state;
 
309
+            } else {
 
310
+                sd->state = sd_standby_state;
 
311
+            }
 
312
+            return sd_r1b;
 
313
+        }
 
314
+        sd->card_status |= ILLEGAL_COMMAND;
 
315
         return sd_illegal;
 
316
 
 
317
     case 6:    /* CMD6:   SWITCH_FUNCTION */
 
318
@@ -750,11 +858,16 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 
319
             goto bad_cmd;
 
320
         switch (sd->mode) {
 
321
         case sd_data_transfer_mode:
 
322
-            sd_function_switch(sd, req.arg);
 
323
-            sd->state = sd_sendingdata_state;
 
324
-            sd->data_start = 0;
 
325
-            sd->data_offset = 0;
 
326
-            return sd_r1;
 
327
+            if (sd->mmc) {
 
328
+                mmc_function_switch(sd, req.arg);
 
329
+                return sd_r1b;
 
330
+            } else {
 
331
+                sd_function_switch(sd, req.arg);
 
332
+                sd->state = sd_sendingdata_state;
 
333
+                sd->data_start = 0;
 
334
+                sd->data_offset = 0;
 
335
+                return sd_r1;
 
336
+            }
 
337
 
 
338
         default:
 
339
             break;
 
340
@@ -799,22 +912,30 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 
341
         }
 
342
         break;
 
343
 
 
344
-    case 8:    /* CMD8:   SEND_IF_COND */
 
345
-        /* Physical Layer Specification Version 2.00 command */
 
346
-        switch (sd->state) {
 
347
-        case sd_idle_state:
 
348
-            sd->vhs = 0;
 
349
+    case 8:    /* CMD8:   SEND_IF_COND / SEND_EXT_CSD (MMC) */
 
350
+        if (sd->mmc) {
 
351
+            sd->state = sd_sendingdata_state;
 
352
+            memcpy(sd->data, sd->ext_csd, 512);
 
353
+            sd->data_start = addr;
 
354
+            sd->data_offset = 0;
 
355
+            return sd_r1;
 
356
+        } else {
 
357
+            /* Physical Layer Specification Version 2.00 command */
 
358
+            switch (sd->state) {
 
359
+            case sd_idle_state:
 
360
+                sd->vhs = 0;
 
361
 
 
362
-            /* No response if not exactly one VHS bit is set.  */
 
363
-            if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
 
364
-                return sd->spi ? sd_r7 : sd_r0;
 
365
+                /* No response if not exactly one VHS bit is set.  */
 
366
+                if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
 
367
+                    return sd->spi ? sd_r7 : sd_r0;
 
368
 
 
369
-            /* Accept.  */
 
370
-            sd->vhs = req.arg;
 
371
-            return sd_r7;
 
372
+                /* Accept.  */
 
373
+                sd->vhs = req.arg;
 
374
+                return sd_r7;
 
375
 
 
376
-        default:
 
377
-            break;
 
378
+            default:
 
379
+                break;
 
380
+            }
 
381
         }
 
382
         break;
 
383
 
 
384
@@ -974,7 +1095,32 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 
385
         }
 
386
         break;
 
387
 
 
388
+    /* Block write commands (Class 3) */
 
389
+    case 20: /* CMD20: WRITE_DAT_UNTIL_STOP */
 
390
+        if (sd->mmc) {
 
391
+            if (sd->state == sd_transfer_state) {
 
392
+                sd->state = sd_sendingdata_state;
 
393
+                sd->data_start = req.arg;
 
394
+                sd->data_offset = 0;
 
395
+
 
396
+                if (sd->data_start + sd->blk_len > sd->size) {
 
397
+                    sd->card_status |= ADDRESS_ERROR;
 
398
+                }
 
399
+                return sd_r0;
 
400
+            }
 
401
+            break;
 
402
+        }
 
403
+        goto bad_cmd;
 
404
+
 
405
     /* Block write commands (Class 4) */
 
406
+    case 23: /* CMD23: SET_BLOCK_COUNT */
 
407
+        if (sd->mmc) {
 
408
+            sd->card_status |= ILLEGAL_COMMAND;
 
409
+            fprintf(stderr, "%s: CMD23 not implemented\n", __FUNCTION__);
 
410
+            return sd_r0;
 
411
+        }
 
412
+        goto bad_cmd;
 
413
+
 
414
     case 24:   /* CMD24:  WRITE_SINGLE_BLOCK */
 
415
         if (sd->spi)
 
416
             goto unimplemented_cmd;
 
417
@@ -1112,6 +1258,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 
418
 
 
419
     /* Erase commands (Class 5) */
 
420
     case 32:   /* CMD32:  ERASE_WR_BLK_START */
 
421
+    case 35: /* CMD35: ERASE_GROUP_START */
 
422
+        if ((req.cmd == 35 && !sd->mmc) ||
 
423
+            (req.cmd == 32 && sd->mmc)) {
 
424
+            goto bad_cmd;
 
425
+        }
 
426
         switch (sd->state) {
 
427
         case sd_transfer_state:
 
428
             sd->erase_start = req.arg;
 
429
@@ -1123,6 +1274,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 
430
         break;
 
431
 
 
432
     case 33:   /* CMD33:  ERASE_WR_BLK_END */
 
433
+    case 36: /* CMD36: ERASE_GROUP_END */
 
434
+        if ((req.cmd == 36 && !sd->mmc) ||
 
435
+            (req.cmd == 33 && sd->mmc)) {
 
436
+            goto bad_cmd;
 
437
+        }
 
438
         switch (sd->state) {
 
439
         case sd_transfer_state:
 
440
             sd->erase_end = req.arg;
 
441
@@ -1152,6 +1308,17 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 
442
         }
 
443
         break;
 
444
 
 
445
+    /* Class 9 */
 
446
+    case 39: /* CMD39: FAST_IO */
 
447
+    case 40: /* CMD40: GO_IRQ_STATE */
 
448
+        if (sd->mmc) {
 
449
+            sd->card_status |= ILLEGAL_COMMAND;
 
450
+            fprintf(stderr, "%s: CMD%d not implemented\n",
 
451
+                    __FUNCTION__, req.cmd);
 
452
+            return sd_r0;
 
453
+        }
 
454
+        goto bad_cmd;
 
455
+
 
456
     /* Lock card commands (Class 7) */
 
457
     case 42:   /* CMD42:  LOCK_UNLOCK */
 
458
         if (sd->spi)
 
459
@@ -1550,6 +1717,11 @@ void sd_write_data(SDState *sd, uint8_t value)
 
460
         }
 
461
         break;
 
462
 
 
463
+    case 20: /* CMD20: WRITE_DAT_UNTIL_STOP */
 
464
+        if (!sd->mmc) {
 
465
+            goto unknown_command;
 
466
+        }
 
467
+        /* fall through */
 
468
     case 25:   /* CMD25:  WRITE_MULTIPLE_BLOCK */
 
469
         if (sd->data_offset == 0) {
 
470
             /* Start of the block - let's check the address is valid */
 
471
@@ -1640,6 +1812,7 @@ void sd_write_data(SDState *sd, uint8_t value)
 
472
         break;
 
473
 
 
474
     default:
 
475
+    unknown_command:
 
476
         fprintf(stderr, "sd_write_data: unknown command\n");
 
477
         break;
 
478
     }
 
479
@@ -1655,7 +1828,7 @@ uint8_t sd_read_data(SDState *sd)
 
480
         return 0x00;
 
481
 
 
482
     if (sd->state != sd_sendingdata_state) {
 
483
-        fprintf(stderr, "sd_read_data: not in Sending-Data state\n");
 
484
+        fprintf(stderr, "sd_read_data: not in Sending-Data state (state=%d)\n", sd->state);
 
485
         return 0x00;
 
486
     }
 
487
 
 
488
@@ -1672,6 +1845,16 @@ uint8_t sd_read_data(SDState *sd)
 
489
             sd->state = sd_transfer_state;
 
490
         break;
 
491
 
 
492
+    case 8: /* CMD8: SEND_EXT_CSD (MMC only) */
 
493
+        if (sd->mmc) {
 
494
+            ret = sd->data[sd->data_offset++];
 
495
+            if (sd->data_offset >= 512) {
 
496
+                sd->state = sd_transfer_state;
 
497
+            }
 
498
+        } else {
 
499
+            goto unknown_command;
 
500
+        }
 
501
+        break;
 
502
     case 9:    /* CMD9:   SEND_CSD */
 
503
     case 10:   /* CMD10:  SEND_CID */
 
504
         ret = sd->data[sd->data_offset ++];
 
505
@@ -1757,6 +1940,7 @@ uint8_t sd_read_data(SDState *sd)
 
506
         break;
 
507
 
 
508
     default:
 
509
+    unknown_command:
 
510
         fprintf(stderr, "sd_read_data: unknown command\n");
 
511
         return 0x00;
 
512
     }
 
513
@@ -1773,3 +1957,8 @@ void sd_enable(SDState *sd, bool enable)
 
514
 {
 
515
     sd->enable = enable;
 
516
 }
 
517
+
 
518
+bool sd_is_mmc(SDState *sd)
 
519
+{
 
520
+    return sd->mmc;
 
521
+}
 
522
diff --git a/include/hw/sd.h b/include/hw/sd.h
 
523
index 562eaa2..13ef5d3 100644
 
524
--- a/include/hw/sd.h
 
525
+++ b/include/hw/sd.h
 
526
@@ -77,5 +77,6 @@ uint8_t sd_read_data(SDState *sd);
 
527
 void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert);
 
528
 bool sd_data_ready(SDState *sd);
 
529
 void sd_enable(SDState *sd, bool enable);
 
530
+bool sd_is_mmc(SDState *sd);
 
531
 
 
532
 #endif /* __hw_sd_h */
 
533
-- 
 
534
1.8.5.2
 
535