Statistics
| Branch: | Revision:

root / hw / sd.c @ 1de7afc9

History | View | Annotate | Download (48.5 kB)

1 5fafdf24 ths
/*
2 a1bb27b1 pbrook
 * SD Memory Card emulation as defined in the "SD Memory Card Physical
3 a1bb27b1 pbrook
 * layer specification, Version 1.10."
4 a1bb27b1 pbrook
 *
5 a1bb27b1 pbrook
 * Copyright (c) 2006 Andrzej Zaborowski  <balrog@zabor.org>
6 a1bb27b1 pbrook
 * Copyright (c) 2007 CodeSourcery
7 a1bb27b1 pbrook
 *
8 a1bb27b1 pbrook
 * Redistribution and use in source and binary forms, with or without
9 a1bb27b1 pbrook
 * modification, are permitted provided that the following conditions
10 a1bb27b1 pbrook
 * are met:
11 a1bb27b1 pbrook
 *
12 a1bb27b1 pbrook
 * 1. Redistributions of source code must retain the above copyright
13 a1bb27b1 pbrook
 *    notice, this list of conditions and the following disclaimer.
14 a1bb27b1 pbrook
 * 2. Redistributions in binary form must reproduce the above copyright
15 a1bb27b1 pbrook
 *    notice, this list of conditions and the following disclaimer in
16 a1bb27b1 pbrook
 *    the documentation and/or other materials provided with the
17 a1bb27b1 pbrook
 *    distribution.
18 a1bb27b1 pbrook
 *
19 a1bb27b1 pbrook
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
20 a1bb27b1 pbrook
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 a1bb27b1 pbrook
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 a1bb27b1 pbrook
 * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR
23 a1bb27b1 pbrook
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 a1bb27b1 pbrook
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 a1bb27b1 pbrook
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 a1bb27b1 pbrook
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
27 a1bb27b1 pbrook
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 a1bb27b1 pbrook
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 a1bb27b1 pbrook
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 a1bb27b1 pbrook
 */
31 a1bb27b1 pbrook
32 87ecb68b pbrook
#include "hw.h"
33 737e150e Paolo Bonzini
#include "block/block.h"
34 a1bb27b1 pbrook
#include "sd.h"
35 1de7afc9 Paolo Bonzini
#include "qemu/bitmap.h"
36 a1bb27b1 pbrook
37 a1bb27b1 pbrook
//#define DEBUG_SD 1
38 a1bb27b1 pbrook
39 a1bb27b1 pbrook
#ifdef DEBUG_SD
40 001faf32 Blue Swirl
#define DPRINTF(fmt, ...) \
41 001faf32 Blue Swirl
do { fprintf(stderr, "SD: " fmt , ## __VA_ARGS__); } while (0)
42 a1bb27b1 pbrook
#else
43 001faf32 Blue Swirl
#define DPRINTF(fmt, ...) do {} while(0)
44 a1bb27b1 pbrook
#endif
45 a1bb27b1 pbrook
46 a1bb27b1 pbrook
typedef enum {
47 a1bb27b1 pbrook
    sd_r0 = 0,    /* no response */
48 a1bb27b1 pbrook
    sd_r1,        /* normal response command */
49 a1bb27b1 pbrook
    sd_r2_i,      /* CID register */
50 a1bb27b1 pbrook
    sd_r2_s,      /* CSD register */
51 a1bb27b1 pbrook
    sd_r3,        /* OCR register */
52 a1bb27b1 pbrook
    sd_r6 = 6,    /* Published RCA response */
53 1b088995 balrog
    sd_r7,        /* Operating voltage */
54 a1bb27b1 pbrook
    sd_r1b = -1,
55 53bb8cc4 Peter Maydell
    sd_illegal = -2,
56 c227f099 Anthony Liguori
} sd_rsp_type_t;
57 a1bb27b1 pbrook
58 50a5be6c Igor Mitsyanko
enum SDCardModes {
59 50a5be6c Igor Mitsyanko
    sd_inactive,
60 50a5be6c Igor Mitsyanko
    sd_card_identification_mode,
61 50a5be6c Igor Mitsyanko
    sd_data_transfer_mode,
62 50a5be6c Igor Mitsyanko
};
63 50a5be6c Igor Mitsyanko
64 50a5be6c Igor Mitsyanko
enum SDCardStates {
65 50a5be6c Igor Mitsyanko
    sd_inactive_state = -1,
66 50a5be6c Igor Mitsyanko
    sd_idle_state = 0,
67 50a5be6c Igor Mitsyanko
    sd_ready_state,
68 50a5be6c Igor Mitsyanko
    sd_identification_state,
69 50a5be6c Igor Mitsyanko
    sd_standby_state,
70 50a5be6c Igor Mitsyanko
    sd_transfer_state,
71 50a5be6c Igor Mitsyanko
    sd_sendingdata_state,
72 50a5be6c Igor Mitsyanko
    sd_receivingdata_state,
73 50a5be6c Igor Mitsyanko
    sd_programming_state,
74 50a5be6c Igor Mitsyanko
    sd_disconnect_state,
75 50a5be6c Igor Mitsyanko
};
76 50a5be6c Igor Mitsyanko
77 a1bb27b1 pbrook
struct SDState {
78 50a5be6c Igor Mitsyanko
    uint32_t mode;    /* current card mode, one of SDCardModes */
79 50a5be6c Igor Mitsyanko
    int32_t state;    /* current card state, one of SDCardStates */
80 a1bb27b1 pbrook
    uint32_t ocr;
81 a1bb27b1 pbrook
    uint8_t scr[8];
82 a1bb27b1 pbrook
    uint8_t cid[16];
83 a1bb27b1 pbrook
    uint8_t csd[16];
84 a1bb27b1 pbrook
    uint16_t rca;
85 a1bb27b1 pbrook
    uint32_t card_status;
86 a1bb27b1 pbrook
    uint8_t sd_status[64];
87 1b088995 balrog
    uint32_t vhs;
88 bebd1271 Mitsyanko Igor
    bool wp_switch;
89 a9c01830 Mitsyanko Igor
    unsigned long *wp_groups;
90 50a5be6c Igor Mitsyanko
    int32_t wpgrps_size;
91 2d7adea4 Andrzej Zaborowski
    uint64_t size;
92 50a5be6c Igor Mitsyanko
    uint32_t blk_len;
93 a1bb27b1 pbrook
    uint32_t erase_start;
94 a1bb27b1 pbrook
    uint32_t erase_end;
95 a1bb27b1 pbrook
    uint8_t pwd[16];
96 50a5be6c Igor Mitsyanko
    uint32_t pwd_len;
97 50a5be6c Igor Mitsyanko
    uint8_t function_group[6];
98 a1bb27b1 pbrook
99 bebd1271 Mitsyanko Igor
    bool spi;
100 50a5be6c Igor Mitsyanko
    uint8_t current_cmd;
101 1d06cb7a Peter Maydell
    /* True if we will handle the next command as an ACMD. Note that this does
102 1d06cb7a Peter Maydell
     * *not* track the APP_CMD status bit!
103 1d06cb7a Peter Maydell
     */
104 bebd1271 Mitsyanko Igor
    bool expecting_acmd;
105 50a5be6c Igor Mitsyanko
    uint32_t blk_written;
106 2d7adea4 Andrzej Zaborowski
    uint64_t data_start;
107 a1bb27b1 pbrook
    uint32_t data_offset;
108 a1bb27b1 pbrook
    uint8_t data[512];
109 02ce600c balrog
    qemu_irq readonly_cb;
110 02ce600c balrog
    qemu_irq inserted_cb;
111 a1bb27b1 pbrook
    BlockDriverState *bdrv;
112 33f00271 balrog
    uint8_t *buf;
113 827df9f3 balrog
114 bebd1271 Mitsyanko Igor
    bool enable;
115 a1bb27b1 pbrook
};
116 a1bb27b1 pbrook
117 10a412da Peter Maydell
static void sd_set_mode(SDState *sd)
118 a1bb27b1 pbrook
{
119 a1bb27b1 pbrook
    switch (sd->state) {
120 a1bb27b1 pbrook
    case sd_inactive_state:
121 a1bb27b1 pbrook
        sd->mode = sd_inactive;
122 a1bb27b1 pbrook
        break;
123 a1bb27b1 pbrook
124 a1bb27b1 pbrook
    case sd_idle_state:
125 a1bb27b1 pbrook
    case sd_ready_state:
126 a1bb27b1 pbrook
    case sd_identification_state:
127 a1bb27b1 pbrook
        sd->mode = sd_card_identification_mode;
128 a1bb27b1 pbrook
        break;
129 a1bb27b1 pbrook
130 a1bb27b1 pbrook
    case sd_standby_state:
131 a1bb27b1 pbrook
    case sd_transfer_state:
132 a1bb27b1 pbrook
    case sd_sendingdata_state:
133 a1bb27b1 pbrook
    case sd_receivingdata_state:
134 a1bb27b1 pbrook
    case sd_programming_state:
135 a1bb27b1 pbrook
    case sd_disconnect_state:
136 a1bb27b1 pbrook
        sd->mode = sd_data_transfer_mode;
137 a1bb27b1 pbrook
        break;
138 a1bb27b1 pbrook
    }
139 a1bb27b1 pbrook
}
140 a1bb27b1 pbrook
141 c227f099 Anthony Liguori
static const sd_cmd_type_t sd_cmd_type[64] = {
142 a1bb27b1 pbrook
    sd_bc,   sd_none, sd_bcr,  sd_bcr,  sd_none, sd_none, sd_none, sd_ac,
143 1b088995 balrog
    sd_bcr,  sd_ac,   sd_ac,   sd_adtc, sd_ac,   sd_ac,   sd_none, sd_ac,
144 a1bb27b1 pbrook
    sd_ac,   sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
145 a1bb27b1 pbrook
    sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac,   sd_ac,   sd_adtc, sd_none,
146 a1bb27b1 pbrook
    sd_ac,   sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
147 a1bb27b1 pbrook
    sd_none, sd_none, sd_bc,   sd_none, sd_none, sd_none, sd_none, sd_none,
148 a1bb27b1 pbrook
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
149 a1bb27b1 pbrook
    sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
150 a1bb27b1 pbrook
};
151 a1bb27b1 pbrook
152 c227f099 Anthony Liguori
static const sd_cmd_type_t sd_acmd_type[64] = {
153 a1bb27b1 pbrook
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
154 a1bb27b1 pbrook
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none,
155 a1bb27b1 pbrook
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_ac,
156 a1bb27b1 pbrook
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
157 a1bb27b1 pbrook
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
158 a1bb27b1 pbrook
    sd_none, sd_bcr,  sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_none,
159 a1bb27b1 pbrook
    sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none, sd_none, sd_none,
160 a1bb27b1 pbrook
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
161 a1bb27b1 pbrook
};
162 a1bb27b1 pbrook
163 a1bb27b1 pbrook
static const int sd_cmd_class[64] = {
164 a1bb27b1 pbrook
    0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  1,  0,  0,  0,  0,
165 a1bb27b1 pbrook
    2,  2,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  6,  6,  6,  6,
166 a1bb27b1 pbrook
    5,  5, 10, 10, 10, 10,  5,  9,  9,  9,  7,  7,  7,  7,  7,  7,
167 a1bb27b1 pbrook
    7,  7, 10,  7,  9,  9,  9,  8,  8, 10,  8,  8,  8,  8,  8,  8,
168 a1bb27b1 pbrook
};
169 a1bb27b1 pbrook
170 a1bb27b1 pbrook
static uint8_t sd_crc7(void *message, size_t width)
171 a1bb27b1 pbrook
{
172 a1bb27b1 pbrook
    int i, bit;
173 a1bb27b1 pbrook
    uint8_t shift_reg = 0x00;
174 a1bb27b1 pbrook
    uint8_t *msg = (uint8_t *) message;
175 a1bb27b1 pbrook
176 a1bb27b1 pbrook
    for (i = 0; i < width; i ++, msg ++)
177 a1bb27b1 pbrook
        for (bit = 7; bit >= 0; bit --) {
178 a1bb27b1 pbrook
            shift_reg <<= 1;
179 a1bb27b1 pbrook
            if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
180 a1bb27b1 pbrook
                shift_reg ^= 0x89;
181 a1bb27b1 pbrook
        }
182 a1bb27b1 pbrook
183 a1bb27b1 pbrook
    return shift_reg;
184 a1bb27b1 pbrook
}
185 a1bb27b1 pbrook
186 a1bb27b1 pbrook
static uint16_t sd_crc16(void *message, size_t width)
187 a1bb27b1 pbrook
{
188 a1bb27b1 pbrook
    int i, bit;
189 a1bb27b1 pbrook
    uint16_t shift_reg = 0x0000;
190 a1bb27b1 pbrook
    uint16_t *msg = (uint16_t *) message;
191 a1bb27b1 pbrook
    width <<= 1;
192 a1bb27b1 pbrook
193 a1bb27b1 pbrook
    for (i = 0; i < width; i ++, msg ++)
194 a1bb27b1 pbrook
        for (bit = 15; bit >= 0; bit --) {
195 a1bb27b1 pbrook
            shift_reg <<= 1;
196 a1bb27b1 pbrook
            if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
197 a1bb27b1 pbrook
                shift_reg ^= 0x1011;
198 a1bb27b1 pbrook
        }
199 a1bb27b1 pbrook
200 a1bb27b1 pbrook
    return shift_reg;
201 a1bb27b1 pbrook
}
202 a1bb27b1 pbrook
203 a1bb27b1 pbrook
static void sd_set_ocr(SDState *sd)
204 a1bb27b1 pbrook
{
205 1b088995 balrog
    /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
206 829ef7b0 aurel32
    sd->ocr = 0x80ffff00;
207 a1bb27b1 pbrook
}
208 a1bb27b1 pbrook
209 a1bb27b1 pbrook
static void sd_set_scr(SDState *sd)
210 a1bb27b1 pbrook
{
211 a1bb27b1 pbrook
    sd->scr[0] = 0x00;                /* SCR Structure */
212 a1bb27b1 pbrook
    sd->scr[1] = 0x2f;                /* SD Security Support */
213 a1bb27b1 pbrook
    sd->scr[2] = 0x00;
214 a1bb27b1 pbrook
    sd->scr[3] = 0x00;
215 a1bb27b1 pbrook
    sd->scr[4] = 0x00;
216 a1bb27b1 pbrook
    sd->scr[5] = 0x00;
217 a1bb27b1 pbrook
    sd->scr[6] = 0x00;
218 a1bb27b1 pbrook
    sd->scr[7] = 0x00;
219 a1bb27b1 pbrook
}
220 a1bb27b1 pbrook
221 a1bb27b1 pbrook
#define MID        0xaa
222 a1bb27b1 pbrook
#define OID        "XY"
223 a1bb27b1 pbrook
#define PNM        "QEMU!"
224 a1bb27b1 pbrook
#define PRV        0x01
225 a1bb27b1 pbrook
#define MDT_YR        2006
226 a1bb27b1 pbrook
#define MDT_MON        2
227 a1bb27b1 pbrook
228 a1bb27b1 pbrook
static void sd_set_cid(SDState *sd)
229 a1bb27b1 pbrook
{
230 a1bb27b1 pbrook
    sd->cid[0] = MID;                /* Fake card manufacturer ID (MID) */
231 a1bb27b1 pbrook
    sd->cid[1] = OID[0];        /* OEM/Application ID (OID) */
232 a1bb27b1 pbrook
    sd->cid[2] = OID[1];
233 a1bb27b1 pbrook
    sd->cid[3] = PNM[0];        /* Fake product name (PNM) */
234 a1bb27b1 pbrook
    sd->cid[4] = PNM[1];
235 a1bb27b1 pbrook
    sd->cid[5] = PNM[2];
236 a1bb27b1 pbrook
    sd->cid[6] = PNM[3];
237 a1bb27b1 pbrook
    sd->cid[7] = PNM[4];
238 a1bb27b1 pbrook
    sd->cid[8] = PRV;                /* Fake product revision (PRV) */
239 a1bb27b1 pbrook
    sd->cid[9] = 0xde;                /* Fake serial number (PSN) */
240 a1bb27b1 pbrook
    sd->cid[10] = 0xad;
241 a1bb27b1 pbrook
    sd->cid[11] = 0xbe;
242 a1bb27b1 pbrook
    sd->cid[12] = 0xef;
243 a1bb27b1 pbrook
    sd->cid[13] = 0x00 |        /* Manufacture date (MDT) */
244 a1bb27b1 pbrook
        ((MDT_YR - 2000) / 10);
245 a1bb27b1 pbrook
    sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
246 a1bb27b1 pbrook
    sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
247 a1bb27b1 pbrook
}
248 a1bb27b1 pbrook
249 a1bb27b1 pbrook
#define HWBLOCK_SHIFT        9                        /* 512 bytes */
250 a1bb27b1 pbrook
#define SECTOR_SHIFT        5                        /* 16 kilobytes */
251 a1bb27b1 pbrook
#define WPGROUP_SHIFT        7                        /* 2 megs */
252 a1bb27b1 pbrook
#define CMULT_SHIFT        9                        /* 512 times HWBLOCK_SIZE */
253 a1bb27b1 pbrook
#define WPGROUP_SIZE        (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT))
254 a1bb27b1 pbrook
255 a1bb27b1 pbrook
static const uint8_t sd_csd_rw_mask[16] = {
256 a1bb27b1 pbrook
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 a1bb27b1 pbrook
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
258 a1bb27b1 pbrook
};
259 a1bb27b1 pbrook
260 2d7adea4 Andrzej Zaborowski
static void sd_set_csd(SDState *sd, uint64_t size)
261 a1bb27b1 pbrook
{
262 a1bb27b1 pbrook
    uint32_t csize = (size >> (CMULT_SHIFT + HWBLOCK_SHIFT)) - 1;
263 a1bb27b1 pbrook
    uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
264 a1bb27b1 pbrook
    uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
265 a1bb27b1 pbrook
266 2d7adea4 Andrzej Zaborowski
    if (size <= 0x40000000) {        /* Standard Capacity SD */
267 2d7adea4 Andrzej Zaborowski
        sd->csd[0] = 0x00;        /* CSD structure */
268 2d7adea4 Andrzej Zaborowski
        sd->csd[1] = 0x26;        /* Data read access-time-1 */
269 2d7adea4 Andrzej Zaborowski
        sd->csd[2] = 0x00;        /* Data read access-time-2 */
270 2d7adea4 Andrzej Zaborowski
        sd->csd[3] = 0x5a;        /* Max. data transfer rate */
271 2d7adea4 Andrzej Zaborowski
        sd->csd[4] = 0x5f;        /* Card Command Classes */
272 2d7adea4 Andrzej Zaborowski
        sd->csd[5] = 0x50 |        /* Max. read data block length */
273 2d7adea4 Andrzej Zaborowski
            HWBLOCK_SHIFT;
274 2d7adea4 Andrzej Zaborowski
        sd->csd[6] = 0xe0 |        /* Partial block for read allowed */
275 2d7adea4 Andrzej Zaborowski
            ((csize >> 10) & 0x03);
276 2d7adea4 Andrzej Zaborowski
        sd->csd[7] = 0x00 |        /* Device size */
277 2d7adea4 Andrzej Zaborowski
            ((csize >> 2) & 0xff);
278 2d7adea4 Andrzej Zaborowski
        sd->csd[8] = 0x3f |        /* Max. read current */
279 2d7adea4 Andrzej Zaborowski
            ((csize << 6) & 0xc0);
280 2d7adea4 Andrzej Zaborowski
        sd->csd[9] = 0xfc |        /* Max. write current */
281 2d7adea4 Andrzej Zaborowski
            ((CMULT_SHIFT - 2) >> 1);
282 2d7adea4 Andrzej Zaborowski
        sd->csd[10] = 0x40 |        /* Erase sector size */
283 2d7adea4 Andrzej Zaborowski
            (((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1);
284 2d7adea4 Andrzej Zaborowski
        sd->csd[11] = 0x00 |        /* Write protect group size */
285 2d7adea4 Andrzej Zaborowski
            ((sectsize << 7) & 0x80) | wpsize;
286 2d7adea4 Andrzej Zaborowski
        sd->csd[12] = 0x90 |        /* Write speed factor */
287 2d7adea4 Andrzej Zaborowski
            (HWBLOCK_SHIFT >> 2);
288 2d7adea4 Andrzej Zaborowski
        sd->csd[13] = 0x20 |        /* Max. write data block length */
289 2d7adea4 Andrzej Zaborowski
            ((HWBLOCK_SHIFT << 6) & 0xc0);
290 2d7adea4 Andrzej Zaborowski
        sd->csd[14] = 0x00;        /* File format group */
291 2d7adea4 Andrzej Zaborowski
        sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
292 2d7adea4 Andrzej Zaborowski
    } else {                        /* SDHC */
293 2d7adea4 Andrzej Zaborowski
        size /= 512 * 1024;
294 2d7adea4 Andrzej Zaborowski
        size -= 1;
295 2d7adea4 Andrzej Zaborowski
        sd->csd[0] = 0x40;
296 2d7adea4 Andrzej Zaborowski
        sd->csd[1] = 0x0e;
297 2d7adea4 Andrzej Zaborowski
        sd->csd[2] = 0x00;
298 2d7adea4 Andrzej Zaborowski
        sd->csd[3] = 0x32;
299 2d7adea4 Andrzej Zaborowski
        sd->csd[4] = 0x5b;
300 2d7adea4 Andrzej Zaborowski
        sd->csd[5] = 0x59;
301 2d7adea4 Andrzej Zaborowski
        sd->csd[6] = 0x00;
302 2d7adea4 Andrzej Zaborowski
        sd->csd[7] = (size >> 16) & 0xff;
303 2d7adea4 Andrzej Zaborowski
        sd->csd[8] = (size >> 8) & 0xff;
304 2d7adea4 Andrzej Zaborowski
        sd->csd[9] = (size & 0xff);
305 2d7adea4 Andrzej Zaborowski
        sd->csd[10] = 0x7f;
306 2d7adea4 Andrzej Zaborowski
        sd->csd[11] = 0x80;
307 2d7adea4 Andrzej Zaborowski
        sd->csd[12] = 0x0a;
308 2d7adea4 Andrzej Zaborowski
        sd->csd[13] = 0x40;
309 2d7adea4 Andrzej Zaborowski
        sd->csd[14] = 0x00;
310 2d7adea4 Andrzej Zaborowski
        sd->csd[15] = 0x00;
311 2d7adea4 Andrzej Zaborowski
        sd->ocr |= 1 << 30;        /* High Capacity SD Memort Card */
312 2d7adea4 Andrzej Zaborowski
    }
313 a1bb27b1 pbrook
}
314 a1bb27b1 pbrook
315 a1bb27b1 pbrook
static void sd_set_rca(SDState *sd)
316 a1bb27b1 pbrook
{
317 a1bb27b1 pbrook
    sd->rca += 0x4567;
318 a1bb27b1 pbrook
}
319 a1bb27b1 pbrook
320 b8d334c8 Peter Maydell
/* Card status bits, split by clear condition:
321 b8d334c8 Peter Maydell
 * A : According to the card current state
322 b8d334c8 Peter Maydell
 * B : Always related to the previous command
323 b8d334c8 Peter Maydell
 * C : Cleared by read
324 b8d334c8 Peter Maydell
 */
325 a1bb27b1 pbrook
#define CARD_STATUS_A        0x02004100
326 a1bb27b1 pbrook
#define CARD_STATUS_B        0x00c01e00
327 a1bb27b1 pbrook
#define CARD_STATUS_C        0xfd39a028
328 a1bb27b1 pbrook
329 a1bb27b1 pbrook
static void sd_set_cardstatus(SDState *sd)
330 a1bb27b1 pbrook
{
331 a1bb27b1 pbrook
    sd->card_status = 0x00000100;
332 a1bb27b1 pbrook
}
333 a1bb27b1 pbrook
334 a1bb27b1 pbrook
static void sd_set_sdstatus(SDState *sd)
335 a1bb27b1 pbrook
{
336 a1bb27b1 pbrook
    memset(sd->sd_status, 0, 64);
337 a1bb27b1 pbrook
}
338 a1bb27b1 pbrook
339 bc24a225 Paul Brook
static int sd_req_crc_validate(SDRequest *req)
340 a1bb27b1 pbrook
{
341 a1bb27b1 pbrook
    uint8_t buffer[5];
342 a1bb27b1 pbrook
    buffer[0] = 0x40 | req->cmd;
343 a1bb27b1 pbrook
    buffer[1] = (req->arg >> 24) & 0xff;
344 a1bb27b1 pbrook
    buffer[2] = (req->arg >> 16) & 0xff;
345 a1bb27b1 pbrook
    buffer[3] = (req->arg >> 8) & 0xff;
346 a1bb27b1 pbrook
    buffer[4] = (req->arg >> 0) & 0xff;
347 a1bb27b1 pbrook
    return 0;
348 a1bb27b1 pbrook
    return sd_crc7(buffer, 5) != req->crc;        /* TODO */
349 a1bb27b1 pbrook
}
350 a1bb27b1 pbrook
351 10a412da Peter Maydell
static void sd_response_r1_make(SDState *sd, uint8_t *response)
352 a1bb27b1 pbrook
{
353 10a412da Peter Maydell
    uint32_t status = sd->card_status;
354 1d06cb7a Peter Maydell
    /* Clear the "clear on read" status bits */
355 1d06cb7a Peter Maydell
    sd->card_status &= ~CARD_STATUS_C;
356 a1bb27b1 pbrook
357 a1bb27b1 pbrook
    response[0] = (status >> 24) & 0xff;
358 a1bb27b1 pbrook
    response[1] = (status >> 16) & 0xff;
359 a1bb27b1 pbrook
    response[2] = (status >> 8) & 0xff;
360 a1bb27b1 pbrook
    response[3] = (status >> 0) & 0xff;
361 a1bb27b1 pbrook
}
362 a1bb27b1 pbrook
363 9596ebb7 pbrook
static void sd_response_r3_make(SDState *sd, uint8_t *response)
364 a1bb27b1 pbrook
{
365 a1bb27b1 pbrook
    response[0] = (sd->ocr >> 24) & 0xff;
366 a1bb27b1 pbrook
    response[1] = (sd->ocr >> 16) & 0xff;
367 a1bb27b1 pbrook
    response[2] = (sd->ocr >> 8) & 0xff;
368 a1bb27b1 pbrook
    response[3] = (sd->ocr >> 0) & 0xff;
369 a1bb27b1 pbrook
}
370 a1bb27b1 pbrook
371 9596ebb7 pbrook
static void sd_response_r6_make(SDState *sd, uint8_t *response)
372 a1bb27b1 pbrook
{
373 a1bb27b1 pbrook
    uint16_t arg;
374 a1bb27b1 pbrook
    uint16_t status;
375 a1bb27b1 pbrook
376 a1bb27b1 pbrook
    arg = sd->rca;
377 a1bb27b1 pbrook
    status = ((sd->card_status >> 8) & 0xc000) |
378 a1bb27b1 pbrook
             ((sd->card_status >> 6) & 0x2000) |
379 a1bb27b1 pbrook
              (sd->card_status & 0x1fff);
380 fcfa9351 Peter Maydell
    sd->card_status &= ~(CARD_STATUS_C & 0xc81fff);
381 a1bb27b1 pbrook
382 a1bb27b1 pbrook
    response[0] = (arg >> 8) & 0xff;
383 a1bb27b1 pbrook
    response[1] = arg & 0xff;
384 a1bb27b1 pbrook
    response[2] = (status >> 8) & 0xff;
385 a1bb27b1 pbrook
    response[3] = status & 0xff;
386 a1bb27b1 pbrook
}
387 a1bb27b1 pbrook
388 1b088995 balrog
static void sd_response_r7_make(SDState *sd, uint8_t *response)
389 1b088995 balrog
{
390 1b088995 balrog
    response[0] = (sd->vhs >> 24) & 0xff;
391 1b088995 balrog
    response[1] = (sd->vhs >> 16) & 0xff;
392 1b088995 balrog
    response[2] = (sd->vhs >>  8) & 0xff;
393 1b088995 balrog
    response[3] = (sd->vhs >>  0) & 0xff;
394 1b088995 balrog
}
395 1b088995 balrog
396 b7202b88 Mitsyanko Igor
static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
397 b7202b88 Mitsyanko Igor
{
398 b7202b88 Mitsyanko Igor
    return addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
399 b7202b88 Mitsyanko Igor
}
400 b7202b88 Mitsyanko Igor
401 a1bb27b1 pbrook
static void sd_reset(SDState *sd, BlockDriverState *bdrv)
402 a1bb27b1 pbrook
{
403 2d7adea4 Andrzej Zaborowski
    uint64_t size;
404 a1bb27b1 pbrook
    uint64_t sect;
405 a1bb27b1 pbrook
406 03f311ed Paul Brook
    if (bdrv) {
407 03f311ed Paul Brook
        bdrv_get_geometry(bdrv, &sect);
408 03f311ed Paul Brook
    } else {
409 03f311ed Paul Brook
        sect = 0;
410 03f311ed Paul Brook
    }
411 5e37141b Vincent Palatin
    size = sect << 9;
412 a1bb27b1 pbrook
413 b7202b88 Mitsyanko Igor
    sect = sd_addr_to_wpnum(size) + 1;
414 a1bb27b1 pbrook
415 a1bb27b1 pbrook
    sd->state = sd_idle_state;
416 a1bb27b1 pbrook
    sd->rca = 0x0000;
417 a1bb27b1 pbrook
    sd_set_ocr(sd);
418 a1bb27b1 pbrook
    sd_set_scr(sd);
419 a1bb27b1 pbrook
    sd_set_cid(sd);
420 a1bb27b1 pbrook
    sd_set_csd(sd, size);
421 a1bb27b1 pbrook
    sd_set_cardstatus(sd);
422 a1bb27b1 pbrook
    sd_set_sdstatus(sd);
423 a1bb27b1 pbrook
424 a1bb27b1 pbrook
    sd->bdrv = bdrv;
425 a1bb27b1 pbrook
426 257514dd pbrook
    if (sd->wp_groups)
427 7267c094 Anthony Liguori
        g_free(sd->wp_groups);
428 bebd1271 Mitsyanko Igor
    sd->wp_switch = bdrv ? bdrv_is_read_only(bdrv) : false;
429 50a5be6c Igor Mitsyanko
    sd->wpgrps_size = sect;
430 50a5be6c Igor Mitsyanko
    sd->wp_groups = bitmap_new(sd->wpgrps_size);
431 50a5be6c Igor Mitsyanko
    memset(sd->function_group, 0, sizeof(sd->function_group));
432 a1bb27b1 pbrook
    sd->erase_start = 0;
433 a1bb27b1 pbrook
    sd->erase_end = 0;
434 a1bb27b1 pbrook
    sd->size = size;
435 a1bb27b1 pbrook
    sd->blk_len = 0x200;
436 a1bb27b1 pbrook
    sd->pwd_len = 0;
437 bebd1271 Mitsyanko Igor
    sd->expecting_acmd = false;
438 a1bb27b1 pbrook
}
439 a1bb27b1 pbrook
440 7d4b4ba5 Markus Armbruster
static void sd_cardchange(void *opaque, bool load)
441 a1bb27b1 pbrook
{
442 a1bb27b1 pbrook
    SDState *sd = opaque;
443 db97ee6a Christoph Hellwig
444 02ce600c balrog
    qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
445 a1bb27b1 pbrook
    if (bdrv_is_inserted(sd->bdrv)) {
446 a1bb27b1 pbrook
        sd_reset(sd, sd->bdrv);
447 257514dd pbrook
        qemu_set_irq(sd->readonly_cb, sd->wp_switch);
448 a1bb27b1 pbrook
    }
449 a1bb27b1 pbrook
}
450 a1bb27b1 pbrook
451 0e49de52 Markus Armbruster
static const BlockDevOps sd_block_ops = {
452 145feb17 Markus Armbruster
    .change_media_cb = sd_cardchange,
453 0e49de52 Markus Armbruster
};
454 0e49de52 Markus Armbruster
455 50a5be6c Igor Mitsyanko
static const VMStateDescription sd_vmstate = {
456 50a5be6c Igor Mitsyanko
    .name = "sd-card",
457 50a5be6c Igor Mitsyanko
    .version_id = 1,
458 50a5be6c Igor Mitsyanko
    .minimum_version_id = 1,
459 50a5be6c Igor Mitsyanko
    .fields = (VMStateField[]) {
460 50a5be6c Igor Mitsyanko
        VMSTATE_UINT32(mode, SDState),
461 50a5be6c Igor Mitsyanko
        VMSTATE_INT32(state, SDState),
462 50a5be6c Igor Mitsyanko
        VMSTATE_UINT8_ARRAY(cid, SDState, 16),
463 50a5be6c Igor Mitsyanko
        VMSTATE_UINT8_ARRAY(csd, SDState, 16),
464 50a5be6c Igor Mitsyanko
        VMSTATE_UINT16(rca, SDState),
465 50a5be6c Igor Mitsyanko
        VMSTATE_UINT32(card_status, SDState),
466 50a5be6c Igor Mitsyanko
        VMSTATE_PARTIAL_BUFFER(sd_status, SDState, 1),
467 50a5be6c Igor Mitsyanko
        VMSTATE_UINT32(vhs, SDState),
468 50a5be6c Igor Mitsyanko
        VMSTATE_BITMAP(wp_groups, SDState, 0, wpgrps_size),
469 50a5be6c Igor Mitsyanko
        VMSTATE_UINT32(blk_len, SDState),
470 50a5be6c Igor Mitsyanko
        VMSTATE_UINT32(erase_start, SDState),
471 50a5be6c Igor Mitsyanko
        VMSTATE_UINT32(erase_end, SDState),
472 50a5be6c Igor Mitsyanko
        VMSTATE_UINT8_ARRAY(pwd, SDState, 16),
473 50a5be6c Igor Mitsyanko
        VMSTATE_UINT32(pwd_len, SDState),
474 50a5be6c Igor Mitsyanko
        VMSTATE_UINT8_ARRAY(function_group, SDState, 6),
475 50a5be6c Igor Mitsyanko
        VMSTATE_UINT8(current_cmd, SDState),
476 50a5be6c Igor Mitsyanko
        VMSTATE_BOOL(expecting_acmd, SDState),
477 50a5be6c Igor Mitsyanko
        VMSTATE_UINT32(blk_written, SDState),
478 50a5be6c Igor Mitsyanko
        VMSTATE_UINT64(data_start, SDState),
479 50a5be6c Igor Mitsyanko
        VMSTATE_UINT32(data_offset, SDState),
480 50a5be6c Igor Mitsyanko
        VMSTATE_UINT8_ARRAY(data, SDState, 512),
481 50a5be6c Igor Mitsyanko
        VMSTATE_BUFFER_UNSAFE(buf, SDState, 1, 512),
482 50a5be6c Igor Mitsyanko
        VMSTATE_BOOL(enable, SDState),
483 50a5be6c Igor Mitsyanko
        VMSTATE_END_OF_LIST()
484 50a5be6c Igor Mitsyanko
    }
485 50a5be6c Igor Mitsyanko
};
486 50a5be6c Igor Mitsyanko
487 775616c3 pbrook
/* We do not model the chip select pin, so allow the board to select
488 8ef6367e balrog
   whether card should be in SSI or MMC/SD mode.  It is also up to the
489 775616c3 pbrook
   board to ensure that ssi transfers only occur when the chip select
490 775616c3 pbrook
   is asserted.  */
491 bebd1271 Mitsyanko Igor
SDState *sd_init(BlockDriverState *bs, bool is_spi)
492 a1bb27b1 pbrook
{
493 a1bb27b1 pbrook
    SDState *sd;
494 a1bb27b1 pbrook
495 7267c094 Anthony Liguori
    sd = (SDState *) g_malloc0(sizeof(SDState));
496 72aef731 Christoph Hellwig
    sd->buf = qemu_blockalign(bs, 512);
497 775616c3 pbrook
    sd->spi = is_spi;
498 bebd1271 Mitsyanko Igor
    sd->enable = true;
499 a1bb27b1 pbrook
    sd_reset(sd, bs);
500 03f311ed Paul Brook
    if (sd->bdrv) {
501 fa879d62 Markus Armbruster
        bdrv_attach_dev_nofail(sd->bdrv, sd);
502 0e49de52 Markus Armbruster
        bdrv_set_dev_ops(sd->bdrv, &sd_block_ops, sd);
503 03f311ed Paul Brook
    }
504 50a5be6c Igor Mitsyanko
    vmstate_register(NULL, -1, &sd_vmstate, sd);
505 a1bb27b1 pbrook
    return sd;
506 a1bb27b1 pbrook
}
507 a1bb27b1 pbrook
508 02ce600c balrog
void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
509 a1bb27b1 pbrook
{
510 02ce600c balrog
    sd->readonly_cb = readonly;
511 02ce600c balrog
    sd->inserted_cb = insert;
512 0d2e91c1 Aurelien Jarno
    qemu_set_irq(readonly, sd->bdrv ? bdrv_is_read_only(sd->bdrv) : 0);
513 0d2e91c1 Aurelien Jarno
    qemu_set_irq(insert, sd->bdrv ? bdrv_is_inserted(sd->bdrv) : 0);
514 a1bb27b1 pbrook
}
515 a1bb27b1 pbrook
516 a1bb27b1 pbrook
static void sd_erase(SDState *sd)
517 a1bb27b1 pbrook
{
518 f2d189d3 Igor Mitsyanko
    int i;
519 f2d189d3 Igor Mitsyanko
    uint64_t erase_start = sd->erase_start;
520 f2d189d3 Igor Mitsyanko
    uint64_t erase_end = sd->erase_end;
521 f2d189d3 Igor Mitsyanko
522 a1bb27b1 pbrook
    if (!sd->erase_start || !sd->erase_end) {
523 a1bb27b1 pbrook
        sd->card_status |= ERASE_SEQ_ERROR;
524 a1bb27b1 pbrook
        return;
525 a1bb27b1 pbrook
    }
526 a1bb27b1 pbrook
527 f2d189d3 Igor Mitsyanko
    if (extract32(sd->ocr, OCR_CCS_BITN, 1)) {
528 f2d189d3 Igor Mitsyanko
        /* High capacity memory card: erase units are 512 byte blocks */
529 f2d189d3 Igor Mitsyanko
        erase_start *= 512;
530 f2d189d3 Igor Mitsyanko
        erase_end *= 512;
531 f2d189d3 Igor Mitsyanko
    }
532 f2d189d3 Igor Mitsyanko
533 f2d189d3 Igor Mitsyanko
    erase_start = sd_addr_to_wpnum(erase_start);
534 f2d189d3 Igor Mitsyanko
    erase_end = sd_addr_to_wpnum(erase_end);
535 a1bb27b1 pbrook
    sd->erase_start = 0;
536 a1bb27b1 pbrook
    sd->erase_end = 0;
537 a1bb27b1 pbrook
    sd->csd[14] |= 0x40;
538 a1bb27b1 pbrook
539 f2d189d3 Igor Mitsyanko
    for (i = erase_start; i <= erase_end; i++) {
540 a9c01830 Mitsyanko Igor
        if (test_bit(i, sd->wp_groups)) {
541 a1bb27b1 pbrook
            sd->card_status |= WP_ERASE_SKIP;
542 a9c01830 Mitsyanko Igor
        }
543 a9c01830 Mitsyanko Igor
    }
544 a1bb27b1 pbrook
}
545 a1bb27b1 pbrook
546 2d7adea4 Andrzej Zaborowski
static uint32_t sd_wpbits(SDState *sd, uint64_t addr)
547 a1bb27b1 pbrook
{
548 a1bb27b1 pbrook
    uint32_t i, wpnum;
549 a1bb27b1 pbrook
    uint32_t ret = 0;
550 a1bb27b1 pbrook
551 b7202b88 Mitsyanko Igor
    wpnum = sd_addr_to_wpnum(addr);
552 a1bb27b1 pbrook
553 a9c01830 Mitsyanko Igor
    for (i = 0; i < 32; i++, wpnum++, addr += WPGROUP_SIZE) {
554 a9c01830 Mitsyanko Igor
        if (addr < sd->size && test_bit(wpnum, sd->wp_groups)) {
555 a1bb27b1 pbrook
            ret |= (1 << i);
556 a9c01830 Mitsyanko Igor
        }
557 a9c01830 Mitsyanko Igor
    }
558 a1bb27b1 pbrook
559 a1bb27b1 pbrook
    return ret;
560 a1bb27b1 pbrook
}
561 a1bb27b1 pbrook
562 a1bb27b1 pbrook
static void sd_function_switch(SDState *sd, uint32_t arg)
563 a1bb27b1 pbrook
{
564 a1bb27b1 pbrook
    int i, mode, new_func, crc;
565 a1bb27b1 pbrook
    mode = !!(arg & 0x80000000);
566 a1bb27b1 pbrook
567 a1bb27b1 pbrook
    sd->data[0] = 0x00;                /* Maximum current consumption */
568 a1bb27b1 pbrook
    sd->data[1] = 0x01;
569 a1bb27b1 pbrook
    sd->data[2] = 0x80;                /* Supported group 6 functions */
570 a1bb27b1 pbrook
    sd->data[3] = 0x01;
571 a1bb27b1 pbrook
    sd->data[4] = 0x80;                /* Supported group 5 functions */
572 a1bb27b1 pbrook
    sd->data[5] = 0x01;
573 a1bb27b1 pbrook
    sd->data[6] = 0x80;                /* Supported group 4 functions */
574 a1bb27b1 pbrook
    sd->data[7] = 0x01;
575 a1bb27b1 pbrook
    sd->data[8] = 0x80;                /* Supported group 3 functions */
576 a1bb27b1 pbrook
    sd->data[9] = 0x01;
577 a1bb27b1 pbrook
    sd->data[10] = 0x80;        /* Supported group 2 functions */
578 a1bb27b1 pbrook
    sd->data[11] = 0x43;
579 a1bb27b1 pbrook
    sd->data[12] = 0x80;        /* Supported group 1 functions */
580 a1bb27b1 pbrook
    sd->data[13] = 0x03;
581 a1bb27b1 pbrook
    for (i = 0; i < 6; i ++) {
582 a1bb27b1 pbrook
        new_func = (arg >> (i * 4)) & 0x0f;
583 a1bb27b1 pbrook
        if (mode && new_func != 0x0f)
584 a1bb27b1 pbrook
            sd->function_group[i] = new_func;
585 a1bb27b1 pbrook
        sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
586 a1bb27b1 pbrook
    }
587 a1bb27b1 pbrook
    memset(&sd->data[17], 0, 47);
588 a1bb27b1 pbrook
    crc = sd_crc16(sd->data, 64);
589 a1bb27b1 pbrook
    sd->data[65] = crc >> 8;
590 a1bb27b1 pbrook
    sd->data[66] = crc & 0xff;
591 a1bb27b1 pbrook
}
592 a1bb27b1 pbrook
593 4e8f1be2 Mitsyanko Igor
static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
594 a1bb27b1 pbrook
{
595 b7202b88 Mitsyanko Igor
    return test_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
596 a1bb27b1 pbrook
}
597 a1bb27b1 pbrook
598 a1bb27b1 pbrook
static void sd_lock_command(SDState *sd)
599 a1bb27b1 pbrook
{
600 a1bb27b1 pbrook
    int erase, lock, clr_pwd, set_pwd, pwd_len;
601 a1bb27b1 pbrook
    erase = !!(sd->data[0] & 0x08);
602 a1bb27b1 pbrook
    lock = sd->data[0] & 0x04;
603 a1bb27b1 pbrook
    clr_pwd = sd->data[0] & 0x02;
604 a1bb27b1 pbrook
    set_pwd = sd->data[0] & 0x01;
605 a1bb27b1 pbrook
606 a1bb27b1 pbrook
    if (sd->blk_len > 1)
607 a1bb27b1 pbrook
        pwd_len = sd->data[1];
608 a1bb27b1 pbrook
    else
609 a1bb27b1 pbrook
        pwd_len = 0;
610 a1bb27b1 pbrook
611 a1bb27b1 pbrook
    if (erase) {
612 a1bb27b1 pbrook
        if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 ||
613 a1bb27b1 pbrook
                        set_pwd || clr_pwd || lock || sd->wp_switch ||
614 a1bb27b1 pbrook
                        (sd->csd[14] & 0x20)) {
615 a1bb27b1 pbrook
            sd->card_status |= LOCK_UNLOCK_FAILED;
616 a1bb27b1 pbrook
            return;
617 a1bb27b1 pbrook
        }
618 50a5be6c Igor Mitsyanko
        bitmap_zero(sd->wp_groups, sd->wpgrps_size);
619 a1bb27b1 pbrook
        sd->csd[14] &= ~0x10;
620 a1bb27b1 pbrook
        sd->card_status &= ~CARD_IS_LOCKED;
621 a1bb27b1 pbrook
        sd->pwd_len = 0;
622 a1bb27b1 pbrook
        /* Erasing the entire card here! */
623 827df9f3 balrog
        fprintf(stderr, "SD: Card force-erased by CMD42\n");
624 a1bb27b1 pbrook
        return;
625 a1bb27b1 pbrook
    }
626 a1bb27b1 pbrook
627 a1bb27b1 pbrook
    if (sd->blk_len < 2 + pwd_len ||
628 a1bb27b1 pbrook
                    pwd_len <= sd->pwd_len ||
629 a1bb27b1 pbrook
                    pwd_len > sd->pwd_len + 16) {
630 a1bb27b1 pbrook
        sd->card_status |= LOCK_UNLOCK_FAILED;
631 a1bb27b1 pbrook
        return;
632 a1bb27b1 pbrook
    }
633 a1bb27b1 pbrook
634 a1bb27b1 pbrook
    if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) {
635 a1bb27b1 pbrook
        sd->card_status |= LOCK_UNLOCK_FAILED;
636 a1bb27b1 pbrook
        return;
637 a1bb27b1 pbrook
    }
638 a1bb27b1 pbrook
639 a1bb27b1 pbrook
    pwd_len -= sd->pwd_len;
640 a1bb27b1 pbrook
    if ((pwd_len && !set_pwd) ||
641 a1bb27b1 pbrook
                    (clr_pwd && (set_pwd || lock)) ||
642 a1bb27b1 pbrook
                    (lock && !sd->pwd_len && !set_pwd) ||
643 a1bb27b1 pbrook
                    (!set_pwd && !clr_pwd &&
644 a1bb27b1 pbrook
                     (((sd->card_status & CARD_IS_LOCKED) && lock) ||
645 a1bb27b1 pbrook
                      (!(sd->card_status & CARD_IS_LOCKED) && !lock)))) {
646 a1bb27b1 pbrook
        sd->card_status |= LOCK_UNLOCK_FAILED;
647 a1bb27b1 pbrook
        return;
648 a1bb27b1 pbrook
    }
649 a1bb27b1 pbrook
650 a1bb27b1 pbrook
    if (set_pwd) {
651 a1bb27b1 pbrook
        memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len);
652 a1bb27b1 pbrook
        sd->pwd_len = pwd_len;
653 a1bb27b1 pbrook
    }
654 a1bb27b1 pbrook
655 a1bb27b1 pbrook
    if (clr_pwd) {
656 a1bb27b1 pbrook
        sd->pwd_len = 0;
657 a1bb27b1 pbrook
    }
658 a1bb27b1 pbrook
659 a1bb27b1 pbrook
    if (lock)
660 a1bb27b1 pbrook
        sd->card_status |= CARD_IS_LOCKED;
661 a1bb27b1 pbrook
    else
662 a1bb27b1 pbrook
        sd->card_status &= ~CARD_IS_LOCKED;
663 a1bb27b1 pbrook
}
664 a1bb27b1 pbrook
665 c227f099 Anthony Liguori
static sd_rsp_type_t sd_normal_command(SDState *sd,
666 bc24a225 Paul Brook
                                       SDRequest req)
667 a1bb27b1 pbrook
{
668 a1bb27b1 pbrook
    uint32_t rca = 0x0000;
669 2d7adea4 Andrzej Zaborowski
    uint64_t addr = (sd->ocr & (1 << 30)) ? (uint64_t) req.arg << 9 : req.arg;
670 a1bb27b1 pbrook
671 1d06cb7a Peter Maydell
    /* Not interpreting this as an app command */
672 1d06cb7a Peter Maydell
    sd->card_status &= ~APP_CMD;
673 1d06cb7a Peter Maydell
674 a1bb27b1 pbrook
    if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
675 a1bb27b1 pbrook
        rca = req.arg >> 16;
676 a1bb27b1 pbrook
677 a1bb27b1 pbrook
    DPRINTF("CMD%d 0x%08x state %d\n", req.cmd, req.arg, sd->state);
678 a1bb27b1 pbrook
    switch (req.cmd) {
679 a1bb27b1 pbrook
    /* Basic commands (Class 0 and Class 1) */
680 a1bb27b1 pbrook
    case 0:        /* CMD0:   GO_IDLE_STATE */
681 a1bb27b1 pbrook
        switch (sd->state) {
682 a1bb27b1 pbrook
        case sd_inactive_state:
683 775616c3 pbrook
            return sd->spi ? sd_r1 : sd_r0;
684 a1bb27b1 pbrook
685 a1bb27b1 pbrook
        default:
686 a1bb27b1 pbrook
            sd->state = sd_idle_state;
687 a1bb27b1 pbrook
            sd_reset(sd, sd->bdrv);
688 775616c3 pbrook
            return sd->spi ? sd_r1 : sd_r0;
689 a1bb27b1 pbrook
        }
690 a1bb27b1 pbrook
        break;
691 a1bb27b1 pbrook
692 775616c3 pbrook
    case 1:        /* CMD1:   SEND_OP_CMD */
693 775616c3 pbrook
        if (!sd->spi)
694 775616c3 pbrook
            goto bad_cmd;
695 775616c3 pbrook
696 775616c3 pbrook
        sd->state = sd_transfer_state;
697 775616c3 pbrook
        return sd_r1;
698 775616c3 pbrook
699 a1bb27b1 pbrook
    case 2:        /* CMD2:   ALL_SEND_CID */
700 775616c3 pbrook
        if (sd->spi)
701 775616c3 pbrook
            goto bad_cmd;
702 a1bb27b1 pbrook
        switch (sd->state) {
703 a1bb27b1 pbrook
        case sd_ready_state:
704 a1bb27b1 pbrook
            sd->state = sd_identification_state;
705 a1bb27b1 pbrook
            return sd_r2_i;
706 a1bb27b1 pbrook
707 a1bb27b1 pbrook
        default:
708 a1bb27b1 pbrook
            break;
709 a1bb27b1 pbrook
        }
710 a1bb27b1 pbrook
        break;
711 a1bb27b1 pbrook
712 a1bb27b1 pbrook
    case 3:        /* CMD3:   SEND_RELATIVE_ADDR */
713 775616c3 pbrook
        if (sd->spi)
714 775616c3 pbrook
            goto bad_cmd;
715 a1bb27b1 pbrook
        switch (sd->state) {
716 a1bb27b1 pbrook
        case sd_identification_state:
717 a1bb27b1 pbrook
        case sd_standby_state:
718 a1bb27b1 pbrook
            sd->state = sd_standby_state;
719 a1bb27b1 pbrook
            sd_set_rca(sd);
720 a1bb27b1 pbrook
            return sd_r6;
721 a1bb27b1 pbrook
722 a1bb27b1 pbrook
        default:
723 a1bb27b1 pbrook
            break;
724 a1bb27b1 pbrook
        }
725 a1bb27b1 pbrook
        break;
726 a1bb27b1 pbrook
727 a1bb27b1 pbrook
    case 4:        /* CMD4:   SEND_DSR */
728 775616c3 pbrook
        if (sd->spi)
729 775616c3 pbrook
            goto bad_cmd;
730 a1bb27b1 pbrook
        switch (sd->state) {
731 a1bb27b1 pbrook
        case sd_standby_state:
732 a1bb27b1 pbrook
            break;
733 a1bb27b1 pbrook
734 a1bb27b1 pbrook
        default:
735 a1bb27b1 pbrook
            break;
736 a1bb27b1 pbrook
        }
737 a1bb27b1 pbrook
        break;
738 a1bb27b1 pbrook
739 109ac32f Juha Riihimรคki
    case 5: /* CMD5: reserved for SDIO cards */
740 53bb8cc4 Peter Maydell
        return sd_illegal;
741 109ac32f Juha Riihimรคki
742 a1bb27b1 pbrook
    case 6:        /* CMD6:   SWITCH_FUNCTION */
743 775616c3 pbrook
        if (sd->spi)
744 775616c3 pbrook
            goto bad_cmd;
745 a1bb27b1 pbrook
        switch (sd->mode) {
746 a1bb27b1 pbrook
        case sd_data_transfer_mode:
747 a1bb27b1 pbrook
            sd_function_switch(sd, req.arg);
748 a1bb27b1 pbrook
            sd->state = sd_sendingdata_state;
749 a1bb27b1 pbrook
            sd->data_start = 0;
750 a1bb27b1 pbrook
            sd->data_offset = 0;
751 a1bb27b1 pbrook
            return sd_r1;
752 a1bb27b1 pbrook
753 a1bb27b1 pbrook
        default:
754 a1bb27b1 pbrook
            break;
755 a1bb27b1 pbrook
        }
756 a1bb27b1 pbrook
        break;
757 a1bb27b1 pbrook
758 a1bb27b1 pbrook
    case 7:        /* CMD7:   SELECT/DESELECT_CARD */
759 775616c3 pbrook
        if (sd->spi)
760 775616c3 pbrook
            goto bad_cmd;
761 a1bb27b1 pbrook
        switch (sd->state) {
762 a1bb27b1 pbrook
        case sd_standby_state:
763 a1bb27b1 pbrook
            if (sd->rca != rca)
764 a1bb27b1 pbrook
                return sd_r0;
765 a1bb27b1 pbrook
766 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
767 a1bb27b1 pbrook
            return sd_r1b;
768 a1bb27b1 pbrook
769 a1bb27b1 pbrook
        case sd_transfer_state:
770 a1bb27b1 pbrook
        case sd_sendingdata_state:
771 a1bb27b1 pbrook
            if (sd->rca == rca)
772 a1bb27b1 pbrook
                break;
773 a1bb27b1 pbrook
774 a1bb27b1 pbrook
            sd->state = sd_standby_state;
775 a1bb27b1 pbrook
            return sd_r1b;
776 a1bb27b1 pbrook
777 a1bb27b1 pbrook
        case sd_disconnect_state:
778 a1bb27b1 pbrook
            if (sd->rca != rca)
779 a1bb27b1 pbrook
                return sd_r0;
780 a1bb27b1 pbrook
781 a1bb27b1 pbrook
            sd->state = sd_programming_state;
782 a1bb27b1 pbrook
            return sd_r1b;
783 a1bb27b1 pbrook
784 a1bb27b1 pbrook
        case sd_programming_state:
785 a1bb27b1 pbrook
            if (sd->rca == rca)
786 a1bb27b1 pbrook
                break;
787 a1bb27b1 pbrook
788 a1bb27b1 pbrook
            sd->state = sd_disconnect_state;
789 a1bb27b1 pbrook
            return sd_r1b;
790 a1bb27b1 pbrook
791 a1bb27b1 pbrook
        default:
792 a1bb27b1 pbrook
            break;
793 a1bb27b1 pbrook
        }
794 a1bb27b1 pbrook
        break;
795 a1bb27b1 pbrook
796 1b088995 balrog
    case 8:        /* CMD8:   SEND_IF_COND */
797 1b088995 balrog
        /* Physical Layer Specification Version 2.00 command */
798 1b088995 balrog
        switch (sd->state) {
799 1b088995 balrog
        case sd_idle_state:
800 1b088995 balrog
            sd->vhs = 0;
801 1b088995 balrog
802 1b088995 balrog
            /* No response if not exactly one VHS bit is set.  */
803 1b088995 balrog
            if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
804 1b088995 balrog
                return sd->spi ? sd_r7 : sd_r0;
805 1b088995 balrog
806 1b088995 balrog
            /* Accept.  */
807 1b088995 balrog
            sd->vhs = req.arg;
808 1b088995 balrog
            return sd_r7;
809 1b088995 balrog
810 1b088995 balrog
        default:
811 1b088995 balrog
            break;
812 1b088995 balrog
        }
813 1b088995 balrog
        break;
814 1b088995 balrog
815 a1bb27b1 pbrook
    case 9:        /* CMD9:   SEND_CSD */
816 a1bb27b1 pbrook
        switch (sd->state) {
817 a1bb27b1 pbrook
        case sd_standby_state:
818 a1bb27b1 pbrook
            if (sd->rca != rca)
819 a1bb27b1 pbrook
                return sd_r0;
820 a1bb27b1 pbrook
821 a1bb27b1 pbrook
            return sd_r2_s;
822 a1bb27b1 pbrook
823 775616c3 pbrook
        case sd_transfer_state:
824 775616c3 pbrook
            if (!sd->spi)
825 775616c3 pbrook
                break;
826 775616c3 pbrook
            sd->state = sd_sendingdata_state;
827 775616c3 pbrook
            memcpy(sd->data, sd->csd, 16);
828 2d7adea4 Andrzej Zaborowski
            sd->data_start = addr;
829 775616c3 pbrook
            sd->data_offset = 0;
830 775616c3 pbrook
            return sd_r1;
831 775616c3 pbrook
832 a1bb27b1 pbrook
        default:
833 a1bb27b1 pbrook
            break;
834 a1bb27b1 pbrook
        }
835 a1bb27b1 pbrook
        break;
836 a1bb27b1 pbrook
837 a1bb27b1 pbrook
    case 10:        /* CMD10:  SEND_CID */
838 a1bb27b1 pbrook
        switch (sd->state) {
839 a1bb27b1 pbrook
        case sd_standby_state:
840 a1bb27b1 pbrook
            if (sd->rca != rca)
841 a1bb27b1 pbrook
                return sd_r0;
842 a1bb27b1 pbrook
843 a1bb27b1 pbrook
            return sd_r2_i;
844 a1bb27b1 pbrook
845 775616c3 pbrook
        case sd_transfer_state:
846 775616c3 pbrook
            if (!sd->spi)
847 775616c3 pbrook
                break;
848 775616c3 pbrook
            sd->state = sd_sendingdata_state;
849 775616c3 pbrook
            memcpy(sd->data, sd->cid, 16);
850 2d7adea4 Andrzej Zaborowski
            sd->data_start = addr;
851 775616c3 pbrook
            sd->data_offset = 0;
852 775616c3 pbrook
            return sd_r1;
853 775616c3 pbrook
854 a1bb27b1 pbrook
        default:
855 a1bb27b1 pbrook
            break;
856 a1bb27b1 pbrook
        }
857 a1bb27b1 pbrook
        break;
858 a1bb27b1 pbrook
859 a1bb27b1 pbrook
    case 11:        /* CMD11:  READ_DAT_UNTIL_STOP */
860 775616c3 pbrook
        if (sd->spi)
861 775616c3 pbrook
            goto bad_cmd;
862 a1bb27b1 pbrook
        switch (sd->state) {
863 a1bb27b1 pbrook
        case sd_transfer_state:
864 a1bb27b1 pbrook
            sd->state = sd_sendingdata_state;
865 a1bb27b1 pbrook
            sd->data_start = req.arg;
866 a1bb27b1 pbrook
            sd->data_offset = 0;
867 a1bb27b1 pbrook
868 a1bb27b1 pbrook
            if (sd->data_start + sd->blk_len > sd->size)
869 a1bb27b1 pbrook
                sd->card_status |= ADDRESS_ERROR;
870 a1bb27b1 pbrook
            return sd_r0;
871 a1bb27b1 pbrook
872 a1bb27b1 pbrook
        default:
873 a1bb27b1 pbrook
            break;
874 a1bb27b1 pbrook
        }
875 a1bb27b1 pbrook
        break;
876 a1bb27b1 pbrook
877 a1bb27b1 pbrook
    case 12:        /* CMD12:  STOP_TRANSMISSION */
878 a1bb27b1 pbrook
        switch (sd->state) {
879 a1bb27b1 pbrook
        case sd_sendingdata_state:
880 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
881 a1bb27b1 pbrook
            return sd_r1b;
882 a1bb27b1 pbrook
883 a1bb27b1 pbrook
        case sd_receivingdata_state:
884 a1bb27b1 pbrook
            sd->state = sd_programming_state;
885 a1bb27b1 pbrook
            /* Bzzzzzzztt .... Operation complete.  */
886 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
887 a1bb27b1 pbrook
            return sd_r1b;
888 a1bb27b1 pbrook
889 a1bb27b1 pbrook
        default:
890 a1bb27b1 pbrook
            break;
891 a1bb27b1 pbrook
        }
892 a1bb27b1 pbrook
        break;
893 a1bb27b1 pbrook
894 a1bb27b1 pbrook
    case 13:        /* CMD13:  SEND_STATUS */
895 a1bb27b1 pbrook
        switch (sd->mode) {
896 a1bb27b1 pbrook
        case sd_data_transfer_mode:
897 a1bb27b1 pbrook
            if (sd->rca != rca)
898 a1bb27b1 pbrook
                return sd_r0;
899 a1bb27b1 pbrook
900 a1bb27b1 pbrook
            return sd_r1;
901 a1bb27b1 pbrook
902 a1bb27b1 pbrook
        default:
903 a1bb27b1 pbrook
            break;
904 a1bb27b1 pbrook
        }
905 a1bb27b1 pbrook
        break;
906 a1bb27b1 pbrook
907 a1bb27b1 pbrook
    case 15:        /* CMD15:  GO_INACTIVE_STATE */
908 775616c3 pbrook
        if (sd->spi)
909 775616c3 pbrook
            goto bad_cmd;
910 a1bb27b1 pbrook
        switch (sd->mode) {
911 a1bb27b1 pbrook
        case sd_data_transfer_mode:
912 a1bb27b1 pbrook
            if (sd->rca != rca)
913 a1bb27b1 pbrook
                return sd_r0;
914 a1bb27b1 pbrook
915 a1bb27b1 pbrook
            sd->state = sd_inactive_state;
916 a1bb27b1 pbrook
            return sd_r0;
917 a1bb27b1 pbrook
918 a1bb27b1 pbrook
        default:
919 a1bb27b1 pbrook
            break;
920 a1bb27b1 pbrook
        }
921 a1bb27b1 pbrook
        break;
922 a1bb27b1 pbrook
923 a1bb27b1 pbrook
    /* Block read commands (Classs 2) */
924 a1bb27b1 pbrook
    case 16:        /* CMD16:  SET_BLOCKLEN */
925 a1bb27b1 pbrook
        switch (sd->state) {
926 a1bb27b1 pbrook
        case sd_transfer_state:
927 a1bb27b1 pbrook
            if (req.arg > (1 << HWBLOCK_SHIFT))
928 a1bb27b1 pbrook
                sd->card_status |= BLOCK_LEN_ERROR;
929 a1bb27b1 pbrook
            else
930 a1bb27b1 pbrook
                sd->blk_len = req.arg;
931 a1bb27b1 pbrook
932 a1bb27b1 pbrook
            return sd_r1;
933 a1bb27b1 pbrook
934 a1bb27b1 pbrook
        default:
935 a1bb27b1 pbrook
            break;
936 a1bb27b1 pbrook
        }
937 a1bb27b1 pbrook
        break;
938 a1bb27b1 pbrook
939 a1bb27b1 pbrook
    case 17:        /* CMD17:  READ_SINGLE_BLOCK */
940 a1bb27b1 pbrook
        switch (sd->state) {
941 a1bb27b1 pbrook
        case sd_transfer_state:
942 a1bb27b1 pbrook
            sd->state = sd_sendingdata_state;
943 2d7adea4 Andrzej Zaborowski
            sd->data_start = addr;
944 a1bb27b1 pbrook
            sd->data_offset = 0;
945 a1bb27b1 pbrook
946 a1bb27b1 pbrook
            if (sd->data_start + sd->blk_len > sd->size)
947 a1bb27b1 pbrook
                sd->card_status |= ADDRESS_ERROR;
948 a1bb27b1 pbrook
            return sd_r1;
949 a1bb27b1 pbrook
950 a1bb27b1 pbrook
        default:
951 a1bb27b1 pbrook
            break;
952 a1bb27b1 pbrook
        }
953 a1bb27b1 pbrook
        break;
954 a1bb27b1 pbrook
955 a1bb27b1 pbrook
    case 18:        /* CMD18:  READ_MULTIPLE_BLOCK */
956 a1bb27b1 pbrook
        switch (sd->state) {
957 a1bb27b1 pbrook
        case sd_transfer_state:
958 a1bb27b1 pbrook
            sd->state = sd_sendingdata_state;
959 2d7adea4 Andrzej Zaborowski
            sd->data_start = addr;
960 a1bb27b1 pbrook
            sd->data_offset = 0;
961 a1bb27b1 pbrook
962 a1bb27b1 pbrook
            if (sd->data_start + sd->blk_len > sd->size)
963 a1bb27b1 pbrook
                sd->card_status |= ADDRESS_ERROR;
964 a1bb27b1 pbrook
            return sd_r1;
965 a1bb27b1 pbrook
966 a1bb27b1 pbrook
        default:
967 a1bb27b1 pbrook
            break;
968 a1bb27b1 pbrook
        }
969 a1bb27b1 pbrook
        break;
970 a1bb27b1 pbrook
971 a1bb27b1 pbrook
    /* Block write commands (Class 4) */
972 a1bb27b1 pbrook
    case 24:        /* CMD24:  WRITE_SINGLE_BLOCK */
973 775616c3 pbrook
        if (sd->spi)
974 775616c3 pbrook
            goto unimplemented_cmd;
975 a1bb27b1 pbrook
        switch (sd->state) {
976 a1bb27b1 pbrook
        case sd_transfer_state:
977 775616c3 pbrook
            /* Writing in SPI mode not implemented.  */
978 775616c3 pbrook
            if (sd->spi)
979 775616c3 pbrook
                break;
980 a1bb27b1 pbrook
            sd->state = sd_receivingdata_state;
981 2d7adea4 Andrzej Zaborowski
            sd->data_start = addr;
982 a1bb27b1 pbrook
            sd->data_offset = 0;
983 a1bb27b1 pbrook
            sd->blk_written = 0;
984 a1bb27b1 pbrook
985 a1bb27b1 pbrook
            if (sd->data_start + sd->blk_len > sd->size)
986 a1bb27b1 pbrook
                sd->card_status |= ADDRESS_ERROR;
987 a1bb27b1 pbrook
            if (sd_wp_addr(sd, sd->data_start))
988 a1bb27b1 pbrook
                sd->card_status |= WP_VIOLATION;
989 a1bb27b1 pbrook
            if (sd->csd[14] & 0x30)
990 a1bb27b1 pbrook
                sd->card_status |= WP_VIOLATION;
991 a1bb27b1 pbrook
            return sd_r1;
992 a1bb27b1 pbrook
993 a1bb27b1 pbrook
        default:
994 a1bb27b1 pbrook
            break;
995 a1bb27b1 pbrook
        }
996 a1bb27b1 pbrook
        break;
997 a1bb27b1 pbrook
998 a1bb27b1 pbrook
    case 25:        /* CMD25:  WRITE_MULTIPLE_BLOCK */
999 775616c3 pbrook
        if (sd->spi)
1000 775616c3 pbrook
            goto unimplemented_cmd;
1001 a1bb27b1 pbrook
        switch (sd->state) {
1002 a1bb27b1 pbrook
        case sd_transfer_state:
1003 775616c3 pbrook
            /* Writing in SPI mode not implemented.  */
1004 775616c3 pbrook
            if (sd->spi)
1005 775616c3 pbrook
                break;
1006 a1bb27b1 pbrook
            sd->state = sd_receivingdata_state;
1007 2d7adea4 Andrzej Zaborowski
            sd->data_start = addr;
1008 a1bb27b1 pbrook
            sd->data_offset = 0;
1009 a1bb27b1 pbrook
            sd->blk_written = 0;
1010 a1bb27b1 pbrook
1011 a1bb27b1 pbrook
            if (sd->data_start + sd->blk_len > sd->size)
1012 a1bb27b1 pbrook
                sd->card_status |= ADDRESS_ERROR;
1013 a1bb27b1 pbrook
            if (sd_wp_addr(sd, sd->data_start))
1014 a1bb27b1 pbrook
                sd->card_status |= WP_VIOLATION;
1015 a1bb27b1 pbrook
            if (sd->csd[14] & 0x30)
1016 a1bb27b1 pbrook
                sd->card_status |= WP_VIOLATION;
1017 a1bb27b1 pbrook
            return sd_r1;
1018 a1bb27b1 pbrook
1019 a1bb27b1 pbrook
        default:
1020 a1bb27b1 pbrook
            break;
1021 a1bb27b1 pbrook
        }
1022 a1bb27b1 pbrook
        break;
1023 a1bb27b1 pbrook
1024 a1bb27b1 pbrook
    case 26:        /* CMD26:  PROGRAM_CID */
1025 775616c3 pbrook
        if (sd->spi)
1026 775616c3 pbrook
            goto bad_cmd;
1027 a1bb27b1 pbrook
        switch (sd->state) {
1028 a1bb27b1 pbrook
        case sd_transfer_state:
1029 a1bb27b1 pbrook
            sd->state = sd_receivingdata_state;
1030 a1bb27b1 pbrook
            sd->data_start = 0;
1031 a1bb27b1 pbrook
            sd->data_offset = 0;
1032 a1bb27b1 pbrook
            return sd_r1;
1033 a1bb27b1 pbrook
1034 a1bb27b1 pbrook
        default:
1035 a1bb27b1 pbrook
            break;
1036 a1bb27b1 pbrook
        }
1037 a1bb27b1 pbrook
        break;
1038 a1bb27b1 pbrook
1039 a1bb27b1 pbrook
    case 27:        /* CMD27:  PROGRAM_CSD */
1040 775616c3 pbrook
        if (sd->spi)
1041 775616c3 pbrook
            goto unimplemented_cmd;
1042 a1bb27b1 pbrook
        switch (sd->state) {
1043 a1bb27b1 pbrook
        case sd_transfer_state:
1044 a1bb27b1 pbrook
            sd->state = sd_receivingdata_state;
1045 a1bb27b1 pbrook
            sd->data_start = 0;
1046 a1bb27b1 pbrook
            sd->data_offset = 0;
1047 a1bb27b1 pbrook
            return sd_r1;
1048 a1bb27b1 pbrook
1049 a1bb27b1 pbrook
        default:
1050 a1bb27b1 pbrook
            break;
1051 a1bb27b1 pbrook
        }
1052 a1bb27b1 pbrook
        break;
1053 a1bb27b1 pbrook
1054 a1bb27b1 pbrook
    /* Write protection (Class 6) */
1055 a1bb27b1 pbrook
    case 28:        /* CMD28:  SET_WRITE_PROT */
1056 a1bb27b1 pbrook
        switch (sd->state) {
1057 a1bb27b1 pbrook
        case sd_transfer_state:
1058 2d7adea4 Andrzej Zaborowski
            if (addr >= sd->size) {
1059 e30d5938 Peter Maydell
                sd->card_status |= ADDRESS_ERROR;
1060 a1bb27b1 pbrook
                return sd_r1b;
1061 a1bb27b1 pbrook
            }
1062 a1bb27b1 pbrook
1063 a1bb27b1 pbrook
            sd->state = sd_programming_state;
1064 b7202b88 Mitsyanko Igor
            set_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
1065 a1bb27b1 pbrook
            /* Bzzzzzzztt .... Operation complete.  */
1066 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1067 a1bb27b1 pbrook
            return sd_r1b;
1068 a1bb27b1 pbrook
1069 a1bb27b1 pbrook
        default:
1070 a1bb27b1 pbrook
            break;
1071 a1bb27b1 pbrook
        }
1072 a1bb27b1 pbrook
        break;
1073 a1bb27b1 pbrook
1074 a1bb27b1 pbrook
    case 29:        /* CMD29:  CLR_WRITE_PROT */
1075 a1bb27b1 pbrook
        switch (sd->state) {
1076 a1bb27b1 pbrook
        case sd_transfer_state:
1077 2d7adea4 Andrzej Zaborowski
            if (addr >= sd->size) {
1078 e30d5938 Peter Maydell
                sd->card_status |= ADDRESS_ERROR;
1079 a1bb27b1 pbrook
                return sd_r1b;
1080 a1bb27b1 pbrook
            }
1081 a1bb27b1 pbrook
1082 a1bb27b1 pbrook
            sd->state = sd_programming_state;
1083 b7202b88 Mitsyanko Igor
            clear_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
1084 a1bb27b1 pbrook
            /* Bzzzzzzztt .... Operation complete.  */
1085 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1086 a1bb27b1 pbrook
            return sd_r1b;
1087 a1bb27b1 pbrook
1088 a1bb27b1 pbrook
        default:
1089 a1bb27b1 pbrook
            break;
1090 a1bb27b1 pbrook
        }
1091 a1bb27b1 pbrook
        break;
1092 a1bb27b1 pbrook
1093 a1bb27b1 pbrook
    case 30:        /* CMD30:  SEND_WRITE_PROT */
1094 a1bb27b1 pbrook
        switch (sd->state) {
1095 a1bb27b1 pbrook
        case sd_transfer_state:
1096 a1bb27b1 pbrook
            sd->state = sd_sendingdata_state;
1097 a1bb27b1 pbrook
            *(uint32_t *) sd->data = sd_wpbits(sd, req.arg);
1098 2d7adea4 Andrzej Zaborowski
            sd->data_start = addr;
1099 a1bb27b1 pbrook
            sd->data_offset = 0;
1100 a1bb27b1 pbrook
            return sd_r1b;
1101 a1bb27b1 pbrook
1102 a1bb27b1 pbrook
        default:
1103 a1bb27b1 pbrook
            break;
1104 a1bb27b1 pbrook
        }
1105 a1bb27b1 pbrook
        break;
1106 a1bb27b1 pbrook
1107 a1bb27b1 pbrook
    /* Erase commands (Class 5) */
1108 a1bb27b1 pbrook
    case 32:        /* CMD32:  ERASE_WR_BLK_START */
1109 a1bb27b1 pbrook
        switch (sd->state) {
1110 a1bb27b1 pbrook
        case sd_transfer_state:
1111 a1bb27b1 pbrook
            sd->erase_start = req.arg;
1112 a1bb27b1 pbrook
            return sd_r1;
1113 a1bb27b1 pbrook
1114 a1bb27b1 pbrook
        default:
1115 a1bb27b1 pbrook
            break;
1116 a1bb27b1 pbrook
        }
1117 a1bb27b1 pbrook
        break;
1118 a1bb27b1 pbrook
1119 a1bb27b1 pbrook
    case 33:        /* CMD33:  ERASE_WR_BLK_END */
1120 a1bb27b1 pbrook
        switch (sd->state) {
1121 a1bb27b1 pbrook
        case sd_transfer_state:
1122 a1bb27b1 pbrook
            sd->erase_end = req.arg;
1123 a1bb27b1 pbrook
            return sd_r1;
1124 a1bb27b1 pbrook
1125 a1bb27b1 pbrook
        default:
1126 a1bb27b1 pbrook
            break;
1127 a1bb27b1 pbrook
        }
1128 a1bb27b1 pbrook
        break;
1129 a1bb27b1 pbrook
1130 a1bb27b1 pbrook
    case 38:        /* CMD38:  ERASE */
1131 a1bb27b1 pbrook
        switch (sd->state) {
1132 a1bb27b1 pbrook
        case sd_transfer_state:
1133 a1bb27b1 pbrook
            if (sd->csd[14] & 0x30) {
1134 a1bb27b1 pbrook
                sd->card_status |= WP_VIOLATION;
1135 a1bb27b1 pbrook
                return sd_r1b;
1136 a1bb27b1 pbrook
            }
1137 a1bb27b1 pbrook
1138 a1bb27b1 pbrook
            sd->state = sd_programming_state;
1139 a1bb27b1 pbrook
            sd_erase(sd);
1140 a1bb27b1 pbrook
            /* Bzzzzzzztt .... Operation complete.  */
1141 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1142 a1bb27b1 pbrook
            return sd_r1b;
1143 a1bb27b1 pbrook
1144 a1bb27b1 pbrook
        default:
1145 a1bb27b1 pbrook
            break;
1146 a1bb27b1 pbrook
        }
1147 a1bb27b1 pbrook
        break;
1148 a1bb27b1 pbrook
1149 a1bb27b1 pbrook
    /* Lock card commands (Class 7) */
1150 a1bb27b1 pbrook
    case 42:        /* CMD42:  LOCK_UNLOCK */
1151 775616c3 pbrook
        if (sd->spi)
1152 775616c3 pbrook
            goto unimplemented_cmd;
1153 a1bb27b1 pbrook
        switch (sd->state) {
1154 a1bb27b1 pbrook
        case sd_transfer_state:
1155 a1bb27b1 pbrook
            sd->state = sd_receivingdata_state;
1156 a1bb27b1 pbrook
            sd->data_start = 0;
1157 a1bb27b1 pbrook
            sd->data_offset = 0;
1158 a1bb27b1 pbrook
            return sd_r1;
1159 a1bb27b1 pbrook
1160 a1bb27b1 pbrook
        default:
1161 a1bb27b1 pbrook
            break;
1162 a1bb27b1 pbrook
        }
1163 a1bb27b1 pbrook
        break;
1164 a1bb27b1 pbrook
1165 39e594db Peter Maydell
    case 52:
1166 39e594db Peter Maydell
    case 53:
1167 39e594db Peter Maydell
        /* CMD52, CMD53: reserved for SDIO cards
1168 39e594db Peter Maydell
         * (see the SDIO Simplified Specification V2.0)
1169 39e594db Peter Maydell
         * Handle as illegal command but do not complain
1170 39e594db Peter Maydell
         * on stderr, as some OSes may use these in their
1171 39e594db Peter Maydell
         * probing for presence of an SDIO card.
1172 39e594db Peter Maydell
         */
1173 53bb8cc4 Peter Maydell
        return sd_illegal;
1174 39e594db Peter Maydell
1175 a1bb27b1 pbrook
    /* Application specific commands (Class 8) */
1176 a1bb27b1 pbrook
    case 55:        /* CMD55:  APP_CMD */
1177 a1bb27b1 pbrook
        if (sd->rca != rca)
1178 a1bb27b1 pbrook
            return sd_r0;
1179 a1bb27b1 pbrook
1180 bebd1271 Mitsyanko Igor
        sd->expecting_acmd = true;
1181 a1bb27b1 pbrook
        sd->card_status |= APP_CMD;
1182 a1bb27b1 pbrook
        return sd_r1;
1183 a1bb27b1 pbrook
1184 a1bb27b1 pbrook
    case 56:        /* CMD56:  GEN_CMD */
1185 827df9f3 balrog
        fprintf(stderr, "SD: GEN_CMD 0x%08x\n", req.arg);
1186 a1bb27b1 pbrook
1187 a1bb27b1 pbrook
        switch (sd->state) {
1188 a1bb27b1 pbrook
        case sd_transfer_state:
1189 a1bb27b1 pbrook
            sd->data_offset = 0;
1190 a1bb27b1 pbrook
            if (req.arg & 1)
1191 a1bb27b1 pbrook
                sd->state = sd_sendingdata_state;
1192 a1bb27b1 pbrook
            else
1193 a1bb27b1 pbrook
                sd->state = sd_receivingdata_state;
1194 a1bb27b1 pbrook
            return sd_r1;
1195 a1bb27b1 pbrook
1196 a1bb27b1 pbrook
        default:
1197 a1bb27b1 pbrook
            break;
1198 a1bb27b1 pbrook
        }
1199 a1bb27b1 pbrook
        break;
1200 a1bb27b1 pbrook
1201 a1bb27b1 pbrook
    default:
1202 775616c3 pbrook
    bad_cmd:
1203 827df9f3 balrog
        fprintf(stderr, "SD: Unknown CMD%i\n", req.cmd);
1204 53bb8cc4 Peter Maydell
        return sd_illegal;
1205 775616c3 pbrook
1206 775616c3 pbrook
    unimplemented_cmd:
1207 775616c3 pbrook
        /* Commands that are recognised but not yet implemented in SPI mode.  */
1208 827df9f3 balrog
        fprintf(stderr, "SD: CMD%i not implemented in SPI mode\n", req.cmd);
1209 53bb8cc4 Peter Maydell
        return sd_illegal;
1210 a1bb27b1 pbrook
    }
1211 a1bb27b1 pbrook
1212 827df9f3 balrog
    fprintf(stderr, "SD: CMD%i in a wrong state\n", req.cmd);
1213 53bb8cc4 Peter Maydell
    return sd_illegal;
1214 a1bb27b1 pbrook
}
1215 a1bb27b1 pbrook
1216 c227f099 Anthony Liguori
static sd_rsp_type_t sd_app_command(SDState *sd,
1217 22ed1d34 Blue Swirl
                                    SDRequest req)
1218 22ed1d34 Blue Swirl
{
1219 a1bb27b1 pbrook
    DPRINTF("ACMD%d 0x%08x\n", req.cmd, req.arg);
1220 1d06cb7a Peter Maydell
    sd->card_status |= APP_CMD;
1221 a1bb27b1 pbrook
    switch (req.cmd) {
1222 a1bb27b1 pbrook
    case 6:        /* ACMD6:  SET_BUS_WIDTH */
1223 a1bb27b1 pbrook
        switch (sd->state) {
1224 a1bb27b1 pbrook
        case sd_transfer_state:
1225 a1bb27b1 pbrook
            sd->sd_status[0] &= 0x3f;
1226 a1bb27b1 pbrook
            sd->sd_status[0] |= (req.arg & 0x03) << 6;
1227 a1bb27b1 pbrook
            return sd_r1;
1228 a1bb27b1 pbrook
1229 a1bb27b1 pbrook
        default:
1230 a1bb27b1 pbrook
            break;
1231 a1bb27b1 pbrook
        }
1232 a1bb27b1 pbrook
        break;
1233 a1bb27b1 pbrook
1234 a1bb27b1 pbrook
    case 13:        /* ACMD13: SD_STATUS */
1235 a1bb27b1 pbrook
        switch (sd->state) {
1236 a1bb27b1 pbrook
        case sd_transfer_state:
1237 fb1ba03a Peter Maydell
            sd->state = sd_sendingdata_state;
1238 a1bb27b1 pbrook
            sd->data_start = 0;
1239 a1bb27b1 pbrook
            sd->data_offset = 0;
1240 a1bb27b1 pbrook
            return sd_r1;
1241 a1bb27b1 pbrook
1242 a1bb27b1 pbrook
        default:
1243 a1bb27b1 pbrook
            break;
1244 a1bb27b1 pbrook
        }
1245 a1bb27b1 pbrook
        break;
1246 a1bb27b1 pbrook
1247 a1bb27b1 pbrook
    case 22:        /* ACMD22: SEND_NUM_WR_BLOCKS */
1248 a1bb27b1 pbrook
        switch (sd->state) {
1249 a1bb27b1 pbrook
        case sd_transfer_state:
1250 a1bb27b1 pbrook
            *(uint32_t *) sd->data = sd->blk_written;
1251 a1bb27b1 pbrook
1252 fb1ba03a Peter Maydell
            sd->state = sd_sendingdata_state;
1253 a1bb27b1 pbrook
            sd->data_start = 0;
1254 a1bb27b1 pbrook
            sd->data_offset = 0;
1255 a1bb27b1 pbrook
            return sd_r1;
1256 a1bb27b1 pbrook
1257 a1bb27b1 pbrook
        default:
1258 a1bb27b1 pbrook
            break;
1259 a1bb27b1 pbrook
        }
1260 a1bb27b1 pbrook
        break;
1261 a1bb27b1 pbrook
1262 a1bb27b1 pbrook
    case 23:        /* ACMD23: SET_WR_BLK_ERASE_COUNT */
1263 a1bb27b1 pbrook
        switch (sd->state) {
1264 a1bb27b1 pbrook
        case sd_transfer_state:
1265 a1bb27b1 pbrook
            return sd_r1;
1266 a1bb27b1 pbrook
1267 a1bb27b1 pbrook
        default:
1268 a1bb27b1 pbrook
            break;
1269 a1bb27b1 pbrook
        }
1270 a1bb27b1 pbrook
        break;
1271 a1bb27b1 pbrook
1272 a1bb27b1 pbrook
    case 41:        /* ACMD41: SD_APP_OP_COND */
1273 775616c3 pbrook
        if (sd->spi) {
1274 775616c3 pbrook
            /* SEND_OP_CMD */
1275 775616c3 pbrook
            sd->state = sd_transfer_state;
1276 775616c3 pbrook
            return sd_r1;
1277 775616c3 pbrook
        }
1278 a1bb27b1 pbrook
        switch (sd->state) {
1279 a1bb27b1 pbrook
        case sd_idle_state:
1280 a1bb27b1 pbrook
            /* We accept any voltage.  10000 V is nothing.  */
1281 a1bb27b1 pbrook
            if (req.arg)
1282 a1bb27b1 pbrook
                sd->state = sd_ready_state;
1283 a1bb27b1 pbrook
1284 a1bb27b1 pbrook
            return sd_r3;
1285 a1bb27b1 pbrook
1286 a1bb27b1 pbrook
        default:
1287 a1bb27b1 pbrook
            break;
1288 a1bb27b1 pbrook
        }
1289 a1bb27b1 pbrook
        break;
1290 a1bb27b1 pbrook
1291 a1bb27b1 pbrook
    case 42:        /* ACMD42: SET_CLR_CARD_DETECT */
1292 a1bb27b1 pbrook
        switch (sd->state) {
1293 a1bb27b1 pbrook
        case sd_transfer_state:
1294 a1bb27b1 pbrook
            /* Bringing in the 50KOhm pull-up resistor... Done.  */
1295 a1bb27b1 pbrook
            return sd_r1;
1296 a1bb27b1 pbrook
1297 a1bb27b1 pbrook
        default:
1298 a1bb27b1 pbrook
            break;
1299 a1bb27b1 pbrook
        }
1300 a1bb27b1 pbrook
        break;
1301 a1bb27b1 pbrook
1302 a1bb27b1 pbrook
    case 51:        /* ACMD51: SEND_SCR */
1303 a1bb27b1 pbrook
        switch (sd->state) {
1304 a1bb27b1 pbrook
        case sd_transfer_state:
1305 a1bb27b1 pbrook
            sd->state = sd_sendingdata_state;
1306 a1bb27b1 pbrook
            sd->data_start = 0;
1307 a1bb27b1 pbrook
            sd->data_offset = 0;
1308 a1bb27b1 pbrook
            return sd_r1;
1309 a1bb27b1 pbrook
1310 a1bb27b1 pbrook
        default:
1311 a1bb27b1 pbrook
            break;
1312 a1bb27b1 pbrook
        }
1313 a1bb27b1 pbrook
        break;
1314 a1bb27b1 pbrook
1315 a1bb27b1 pbrook
    default:
1316 a1bb27b1 pbrook
        /* Fall back to standard commands.  */
1317 a1bb27b1 pbrook
        return sd_normal_command(sd, req);
1318 a1bb27b1 pbrook
    }
1319 a1bb27b1 pbrook
1320 827df9f3 balrog
    fprintf(stderr, "SD: ACMD%i in a wrong state\n", req.cmd);
1321 5b08bfe2 Peter Maydell
    return sd_illegal;
1322 a1bb27b1 pbrook
}
1323 a1bb27b1 pbrook
1324 25881d33 Peter Maydell
static int cmd_valid_while_locked(SDState *sd, SDRequest *req)
1325 25881d33 Peter Maydell
{
1326 25881d33 Peter Maydell
    /* Valid commands in locked state:
1327 25881d33 Peter Maydell
     * basic class (0)
1328 25881d33 Peter Maydell
     * lock card class (7)
1329 25881d33 Peter Maydell
     * CMD16
1330 25881d33 Peter Maydell
     * implicitly, the ACMD prefix CMD55
1331 25881d33 Peter Maydell
     * ACMD41 and ACMD42
1332 25881d33 Peter Maydell
     * Anything else provokes an "illegal command" response.
1333 25881d33 Peter Maydell
     */
1334 1d06cb7a Peter Maydell
    if (sd->expecting_acmd) {
1335 25881d33 Peter Maydell
        return req->cmd == 41 || req->cmd == 42;
1336 25881d33 Peter Maydell
    }
1337 25881d33 Peter Maydell
    if (req->cmd == 16 || req->cmd == 55) {
1338 25881d33 Peter Maydell
        return 1;
1339 25881d33 Peter Maydell
    }
1340 25881d33 Peter Maydell
    return sd_cmd_class[req->cmd] == 0 || sd_cmd_class[req->cmd] == 7;
1341 25881d33 Peter Maydell
}
1342 25881d33 Peter Maydell
1343 bc24a225 Paul Brook
int sd_do_command(SDState *sd, SDRequest *req,
1344 a1bb27b1 pbrook
                  uint8_t *response) {
1345 10a412da Peter Maydell
    int last_state;
1346 c227f099 Anthony Liguori
    sd_rsp_type_t rtype;
1347 a1bb27b1 pbrook
    int rsplen;
1348 a1bb27b1 pbrook
1349 03f311ed Paul Brook
    if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable) {
1350 a1bb27b1 pbrook
        return 0;
1351 a1bb27b1 pbrook
    }
1352 a1bb27b1 pbrook
1353 a1bb27b1 pbrook
    if (sd_req_crc_validate(req)) {
1354 abda1f37 Peter Maydell
        sd->card_status |= COM_CRC_ERROR;
1355 b1f517ed Peter Maydell
        rtype = sd_illegal;
1356 b1f517ed Peter Maydell
        goto send_response;
1357 a1bb27b1 pbrook
    }
1358 a1bb27b1 pbrook
1359 10a412da Peter Maydell
    if (sd->card_status & CARD_IS_LOCKED) {
1360 25881d33 Peter Maydell
        if (!cmd_valid_while_locked(sd, req)) {
1361 a1bb27b1 pbrook
            sd->card_status |= ILLEGAL_COMMAND;
1362 bebd1271 Mitsyanko Igor
            sd->expecting_acmd = false;
1363 827df9f3 balrog
            fprintf(stderr, "SD: Card is locked\n");
1364 b1f517ed Peter Maydell
            rtype = sd_illegal;
1365 b1f517ed Peter Maydell
            goto send_response;
1366 a1bb27b1 pbrook
        }
1367 25881d33 Peter Maydell
    }
1368 a1bb27b1 pbrook
1369 10a412da Peter Maydell
    last_state = sd->state;
1370 10a412da Peter Maydell
    sd_set_mode(sd);
1371 10a412da Peter Maydell
1372 1d06cb7a Peter Maydell
    if (sd->expecting_acmd) {
1373 bebd1271 Mitsyanko Igor
        sd->expecting_acmd = false;
1374 a1bb27b1 pbrook
        rtype = sd_app_command(sd, *req);
1375 1d06cb7a Peter Maydell
    } else {
1376 a1bb27b1 pbrook
        rtype = sd_normal_command(sd, *req);
1377 1d06cb7a Peter Maydell
    }
1378 a1bb27b1 pbrook
1379 53bb8cc4 Peter Maydell
    if (rtype == sd_illegal) {
1380 53bb8cc4 Peter Maydell
        sd->card_status |= ILLEGAL_COMMAND;
1381 10a412da Peter Maydell
    } else {
1382 10a412da Peter Maydell
        /* Valid command, we can update the 'state before command' bits.
1383 10a412da Peter Maydell
         * (Do this now so they appear in r1 responses.)
1384 10a412da Peter Maydell
         */
1385 10a412da Peter Maydell
        sd->current_cmd = req->cmd;
1386 10a412da Peter Maydell
        sd->card_status &= ~CURRENT_STATE;
1387 10a412da Peter Maydell
        sd->card_status |= (last_state << 9);
1388 53bb8cc4 Peter Maydell
    }
1389 53bb8cc4 Peter Maydell
1390 b1f517ed Peter Maydell
send_response:
1391 a1bb27b1 pbrook
    switch (rtype) {
1392 a1bb27b1 pbrook
    case sd_r1:
1393 a1bb27b1 pbrook
    case sd_r1b:
1394 10a412da Peter Maydell
        sd_response_r1_make(sd, response);
1395 a1bb27b1 pbrook
        rsplen = 4;
1396 a1bb27b1 pbrook
        break;
1397 a1bb27b1 pbrook
1398 a1bb27b1 pbrook
    case sd_r2_i:
1399 a1bb27b1 pbrook
        memcpy(response, sd->cid, sizeof(sd->cid));
1400 a1bb27b1 pbrook
        rsplen = 16;
1401 a1bb27b1 pbrook
        break;
1402 a1bb27b1 pbrook
1403 a1bb27b1 pbrook
    case sd_r2_s:
1404 a1bb27b1 pbrook
        memcpy(response, sd->csd, sizeof(sd->csd));
1405 a1bb27b1 pbrook
        rsplen = 16;
1406 a1bb27b1 pbrook
        break;
1407 a1bb27b1 pbrook
1408 a1bb27b1 pbrook
    case sd_r3:
1409 a1bb27b1 pbrook
        sd_response_r3_make(sd, response);
1410 a1bb27b1 pbrook
        rsplen = 4;
1411 a1bb27b1 pbrook
        break;
1412 a1bb27b1 pbrook
1413 a1bb27b1 pbrook
    case sd_r6:
1414 a1bb27b1 pbrook
        sd_response_r6_make(sd, response);
1415 a1bb27b1 pbrook
        rsplen = 4;
1416 a1bb27b1 pbrook
        break;
1417 a1bb27b1 pbrook
1418 1b088995 balrog
    case sd_r7:
1419 1b088995 balrog
        sd_response_r7_make(sd, response);
1420 1b088995 balrog
        rsplen = 4;
1421 1b088995 balrog
        break;
1422 1b088995 balrog
1423 a1bb27b1 pbrook
    case sd_r0:
1424 53bb8cc4 Peter Maydell
    case sd_illegal:
1425 a1bb27b1 pbrook
    default:
1426 a1bb27b1 pbrook
        rsplen = 0;
1427 a1bb27b1 pbrook
        break;
1428 a1bb27b1 pbrook
    }
1429 a1bb27b1 pbrook
1430 10a412da Peter Maydell
    if (rtype != sd_illegal) {
1431 10a412da Peter Maydell
        /* Clear the "clear on valid command" status bits now we've
1432 10a412da Peter Maydell
         * sent any response
1433 10a412da Peter Maydell
         */
1434 10a412da Peter Maydell
        sd->card_status &= ~CARD_STATUS_B;
1435 10a412da Peter Maydell
    }
1436 10a412da Peter Maydell
1437 a1bb27b1 pbrook
#ifdef DEBUG_SD
1438 a1bb27b1 pbrook
    if (rsplen) {
1439 a1bb27b1 pbrook
        int i;
1440 a1bb27b1 pbrook
        DPRINTF("Response:");
1441 a1bb27b1 pbrook
        for (i = 0; i < rsplen; i++)
1442 038d3d44 Peter Crosthwaite
            fprintf(stderr, " %02x", response[i]);
1443 038d3d44 Peter Crosthwaite
        fprintf(stderr, " state %d\n", sd->state);
1444 a1bb27b1 pbrook
    } else {
1445 a1bb27b1 pbrook
        DPRINTF("No response %d\n", sd->state);
1446 a1bb27b1 pbrook
    }
1447 a1bb27b1 pbrook
#endif
1448 a1bb27b1 pbrook
1449 a1bb27b1 pbrook
    return rsplen;
1450 a1bb27b1 pbrook
}
1451 a1bb27b1 pbrook
1452 2d7adea4 Andrzej Zaborowski
static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
1453 a1bb27b1 pbrook
{
1454 2d7adea4 Andrzej Zaborowski
    uint64_t end = addr + len;
1455 a1bb27b1 pbrook
1456 2d7adea4 Andrzej Zaborowski
    DPRINTF("sd_blk_read: addr = 0x%08llx, len = %d\n",
1457 2d7adea4 Andrzej Zaborowski
            (unsigned long long) addr, len);
1458 7a608f56 Stefan Weil
    if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) < 0) {
1459 827df9f3 balrog
        fprintf(stderr, "sd_blk_read: read error on host side\n");
1460 a1bb27b1 pbrook
        return;
1461 a1bb27b1 pbrook
    }
1462 a1bb27b1 pbrook
1463 a1bb27b1 pbrook
    if (end > (addr & ~511) + 512) {
1464 33f00271 balrog
        memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511));
1465 a1bb27b1 pbrook
1466 7a608f56 Stefan Weil
        if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) < 0) {
1467 827df9f3 balrog
            fprintf(stderr, "sd_blk_read: read error on host side\n");
1468 a1bb27b1 pbrook
            return;
1469 a1bb27b1 pbrook
        }
1470 33f00271 balrog
        memcpy(sd->data + 512 - (addr & 511), sd->buf, end & 511);
1471 a1bb27b1 pbrook
    } else
1472 33f00271 balrog
        memcpy(sd->data, sd->buf + (addr & 511), len);
1473 a1bb27b1 pbrook
}
1474 a1bb27b1 pbrook
1475 2d7adea4 Andrzej Zaborowski
static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
1476 a1bb27b1 pbrook
{
1477 2d7adea4 Andrzej Zaborowski
    uint64_t end = addr + len;
1478 a1bb27b1 pbrook
1479 a1bb27b1 pbrook
    if ((addr & 511) || len < 512)
1480 7a608f56 Stefan Weil
        if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) < 0) {
1481 827df9f3 balrog
            fprintf(stderr, "sd_blk_write: read error on host side\n");
1482 a1bb27b1 pbrook
            return;
1483 a1bb27b1 pbrook
        }
1484 a1bb27b1 pbrook
1485 a1bb27b1 pbrook
    if (end > (addr & ~511) + 512) {
1486 33f00271 balrog
        memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511));
1487 7a608f56 Stefan Weil
        if (bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) < 0) {
1488 827df9f3 balrog
            fprintf(stderr, "sd_blk_write: write error on host side\n");
1489 a1bb27b1 pbrook
            return;
1490 a1bb27b1 pbrook
        }
1491 a1bb27b1 pbrook
1492 7a608f56 Stefan Weil
        if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) < 0) {
1493 827df9f3 balrog
            fprintf(stderr, "sd_blk_write: read error on host side\n");
1494 a1bb27b1 pbrook
            return;
1495 a1bb27b1 pbrook
        }
1496 33f00271 balrog
        memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511);
1497 7a608f56 Stefan Weil
        if (bdrv_write(sd->bdrv, end >> 9, sd->buf, 1) < 0) {
1498 827df9f3 balrog
            fprintf(stderr, "sd_blk_write: write error on host side\n");
1499 7a608f56 Stefan Weil
        }
1500 a1bb27b1 pbrook
    } else {
1501 33f00271 balrog
        memcpy(sd->buf + (addr & 511), sd->data, len);
1502 7a608f56 Stefan Weil
        if (!sd->bdrv || bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) < 0) {
1503 827df9f3 balrog
            fprintf(stderr, "sd_blk_write: write error on host side\n");
1504 7a608f56 Stefan Weil
        }
1505 a1bb27b1 pbrook
    }
1506 a1bb27b1 pbrook
}
1507 a1bb27b1 pbrook
1508 33f00271 balrog
#define BLK_READ_BLOCK(a, len)        sd_blk_read(sd, a, len)
1509 33f00271 balrog
#define BLK_WRITE_BLOCK(a, len)        sd_blk_write(sd, a, len)
1510 a1bb27b1 pbrook
#define APP_READ_BLOCK(a, len)        memset(sd->data, 0xec, len)
1511 a1bb27b1 pbrook
#define APP_WRITE_BLOCK(a, len)
1512 a1bb27b1 pbrook
1513 a1bb27b1 pbrook
void sd_write_data(SDState *sd, uint8_t value)
1514 a1bb27b1 pbrook
{
1515 a1bb27b1 pbrook
    int i;
1516 a1bb27b1 pbrook
1517 827df9f3 balrog
    if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
1518 a1bb27b1 pbrook
        return;
1519 a1bb27b1 pbrook
1520 a1bb27b1 pbrook
    if (sd->state != sd_receivingdata_state) {
1521 827df9f3 balrog
        fprintf(stderr, "sd_write_data: not in Receiving-Data state\n");
1522 a1bb27b1 pbrook
        return;
1523 a1bb27b1 pbrook
    }
1524 a1bb27b1 pbrook
1525 a1bb27b1 pbrook
    if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1526 a1bb27b1 pbrook
        return;
1527 a1bb27b1 pbrook
1528 a1bb27b1 pbrook
    switch (sd->current_cmd) {
1529 a1bb27b1 pbrook
    case 24:        /* CMD24:  WRITE_SINGLE_BLOCK */
1530 a1bb27b1 pbrook
        sd->data[sd->data_offset ++] = value;
1531 a1bb27b1 pbrook
        if (sd->data_offset >= sd->blk_len) {
1532 a1bb27b1 pbrook
            /* TODO: Check CRC before committing */
1533 a1bb27b1 pbrook
            sd->state = sd_programming_state;
1534 a1bb27b1 pbrook
            BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1535 a1bb27b1 pbrook
            sd->blk_written ++;
1536 a1bb27b1 pbrook
            sd->csd[14] |= 0x40;
1537 a1bb27b1 pbrook
            /* Bzzzzzzztt .... Operation complete.  */
1538 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1539 a1bb27b1 pbrook
        }
1540 a1bb27b1 pbrook
        break;
1541 a1bb27b1 pbrook
1542 a1bb27b1 pbrook
    case 25:        /* CMD25:  WRITE_MULTIPLE_BLOCK */
1543 33fa8234 Dr. David Alan Gilbert
        if (sd->data_offset == 0) {
1544 33fa8234 Dr. David Alan Gilbert
            /* Start of the block - lets check the address is valid */
1545 a1bb27b1 pbrook
            if (sd->data_start + sd->blk_len > sd->size) {
1546 a1bb27b1 pbrook
                sd->card_status |= ADDRESS_ERROR;
1547 a1bb27b1 pbrook
                break;
1548 a1bb27b1 pbrook
            }
1549 a1bb27b1 pbrook
            if (sd_wp_addr(sd, sd->data_start)) {
1550 a1bb27b1 pbrook
                sd->card_status |= WP_VIOLATION;
1551 a1bb27b1 pbrook
                break;
1552 a1bb27b1 pbrook
            }
1553 33fa8234 Dr. David Alan Gilbert
        }
1554 33fa8234 Dr. David Alan Gilbert
        sd->data[sd->data_offset++] = value;
1555 33fa8234 Dr. David Alan Gilbert
        if (sd->data_offset >= sd->blk_len) {
1556 33fa8234 Dr. David Alan Gilbert
            /* TODO: Check CRC before committing */
1557 33fa8234 Dr. David Alan Gilbert
            sd->state = sd_programming_state;
1558 33fa8234 Dr. David Alan Gilbert
            BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1559 33fa8234 Dr. David Alan Gilbert
            sd->blk_written++;
1560 33fa8234 Dr. David Alan Gilbert
            sd->data_start += sd->blk_len;
1561 33fa8234 Dr. David Alan Gilbert
            sd->data_offset = 0;
1562 a1bb27b1 pbrook
            sd->csd[14] |= 0x40;
1563 a1bb27b1 pbrook
1564 a1bb27b1 pbrook
            /* Bzzzzzzztt .... Operation complete.  */
1565 a1bb27b1 pbrook
            sd->state = sd_receivingdata_state;
1566 a1bb27b1 pbrook
        }
1567 a1bb27b1 pbrook
        break;
1568 a1bb27b1 pbrook
1569 a1bb27b1 pbrook
    case 26:        /* CMD26:  PROGRAM_CID */
1570 a1bb27b1 pbrook
        sd->data[sd->data_offset ++] = value;
1571 a1bb27b1 pbrook
        if (sd->data_offset >= sizeof(sd->cid)) {
1572 a1bb27b1 pbrook
            /* TODO: Check CRC before committing */
1573 a1bb27b1 pbrook
            sd->state = sd_programming_state;
1574 a1bb27b1 pbrook
            for (i = 0; i < sizeof(sd->cid); i ++)
1575 a1bb27b1 pbrook
                if ((sd->cid[i] | 0x00) != sd->data[i])
1576 a1bb27b1 pbrook
                    sd->card_status |= CID_CSD_OVERWRITE;
1577 a1bb27b1 pbrook
1578 a1bb27b1 pbrook
            if (!(sd->card_status & CID_CSD_OVERWRITE))
1579 a1bb27b1 pbrook
                for (i = 0; i < sizeof(sd->cid); i ++) {
1580 a1bb27b1 pbrook
                    sd->cid[i] |= 0x00;
1581 a1bb27b1 pbrook
                    sd->cid[i] &= sd->data[i];
1582 a1bb27b1 pbrook
                }
1583 a1bb27b1 pbrook
            /* Bzzzzzzztt .... Operation complete.  */
1584 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1585 a1bb27b1 pbrook
        }
1586 a1bb27b1 pbrook
        break;
1587 a1bb27b1 pbrook
1588 a1bb27b1 pbrook
    case 27:        /* CMD27:  PROGRAM_CSD */
1589 a1bb27b1 pbrook
        sd->data[sd->data_offset ++] = value;
1590 a1bb27b1 pbrook
        if (sd->data_offset >= sizeof(sd->csd)) {
1591 a1bb27b1 pbrook
            /* TODO: Check CRC before committing */
1592 a1bb27b1 pbrook
            sd->state = sd_programming_state;
1593 a1bb27b1 pbrook
            for (i = 0; i < sizeof(sd->csd); i ++)
1594 a1bb27b1 pbrook
                if ((sd->csd[i] | sd_csd_rw_mask[i]) !=
1595 a1bb27b1 pbrook
                    (sd->data[i] | sd_csd_rw_mask[i]))
1596 a1bb27b1 pbrook
                    sd->card_status |= CID_CSD_OVERWRITE;
1597 a1bb27b1 pbrook
1598 a1bb27b1 pbrook
            /* Copy flag (OTP) & Permanent write protect */
1599 a1bb27b1 pbrook
            if (sd->csd[14] & ~sd->data[14] & 0x60)
1600 a1bb27b1 pbrook
                sd->card_status |= CID_CSD_OVERWRITE;
1601 a1bb27b1 pbrook
1602 a1bb27b1 pbrook
            if (!(sd->card_status & CID_CSD_OVERWRITE))
1603 a1bb27b1 pbrook
                for (i = 0; i < sizeof(sd->csd); i ++) {
1604 a1bb27b1 pbrook
                    sd->csd[i] |= sd_csd_rw_mask[i];
1605 a1bb27b1 pbrook
                    sd->csd[i] &= sd->data[i];
1606 a1bb27b1 pbrook
                }
1607 a1bb27b1 pbrook
            /* Bzzzzzzztt .... Operation complete.  */
1608 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1609 a1bb27b1 pbrook
        }
1610 a1bb27b1 pbrook
        break;
1611 a1bb27b1 pbrook
1612 a1bb27b1 pbrook
    case 42:        /* CMD42:  LOCK_UNLOCK */
1613 a1bb27b1 pbrook
        sd->data[sd->data_offset ++] = value;
1614 a1bb27b1 pbrook
        if (sd->data_offset >= sd->blk_len) {
1615 a1bb27b1 pbrook
            /* TODO: Check CRC before committing */
1616 a1bb27b1 pbrook
            sd->state = sd_programming_state;
1617 a1bb27b1 pbrook
            sd_lock_command(sd);
1618 a1bb27b1 pbrook
            /* Bzzzzzzztt .... Operation complete.  */
1619 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1620 a1bb27b1 pbrook
        }
1621 a1bb27b1 pbrook
        break;
1622 a1bb27b1 pbrook
1623 a1bb27b1 pbrook
    case 56:        /* CMD56:  GEN_CMD */
1624 a1bb27b1 pbrook
        sd->data[sd->data_offset ++] = value;
1625 a1bb27b1 pbrook
        if (sd->data_offset >= sd->blk_len) {
1626 a1bb27b1 pbrook
            APP_WRITE_BLOCK(sd->data_start, sd->data_offset);
1627 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1628 a1bb27b1 pbrook
        }
1629 a1bb27b1 pbrook
        break;
1630 a1bb27b1 pbrook
1631 a1bb27b1 pbrook
    default:
1632 827df9f3 balrog
        fprintf(stderr, "sd_write_data: unknown command\n");
1633 a1bb27b1 pbrook
        break;
1634 a1bb27b1 pbrook
    }
1635 a1bb27b1 pbrook
}
1636 a1bb27b1 pbrook
1637 a1bb27b1 pbrook
uint8_t sd_read_data(SDState *sd)
1638 a1bb27b1 pbrook
{
1639 a1bb27b1 pbrook
    /* TODO: Append CRCs */
1640 a1bb27b1 pbrook
    uint8_t ret;
1641 2d7adea4 Andrzej Zaborowski
    int io_len;
1642 a1bb27b1 pbrook
1643 827df9f3 balrog
    if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
1644 a1bb27b1 pbrook
        return 0x00;
1645 a1bb27b1 pbrook
1646 a1bb27b1 pbrook
    if (sd->state != sd_sendingdata_state) {
1647 827df9f3 balrog
        fprintf(stderr, "sd_read_data: not in Sending-Data state\n");
1648 a1bb27b1 pbrook
        return 0x00;
1649 a1bb27b1 pbrook
    }
1650 a1bb27b1 pbrook
1651 a1bb27b1 pbrook
    if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1652 a1bb27b1 pbrook
        return 0x00;
1653 a1bb27b1 pbrook
1654 2d7adea4 Andrzej Zaborowski
    io_len = (sd->ocr & (1 << 30)) ? 512 : sd->blk_len;
1655 2d7adea4 Andrzej Zaborowski
1656 a1bb27b1 pbrook
    switch (sd->current_cmd) {
1657 a1bb27b1 pbrook
    case 6:        /* CMD6:   SWITCH_FUNCTION */
1658 a1bb27b1 pbrook
        ret = sd->data[sd->data_offset ++];
1659 a1bb27b1 pbrook
1660 a1bb27b1 pbrook
        if (sd->data_offset >= 64)
1661 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1662 a1bb27b1 pbrook
        break;
1663 a1bb27b1 pbrook
1664 775616c3 pbrook
    case 9:        /* CMD9:   SEND_CSD */
1665 775616c3 pbrook
    case 10:        /* CMD10:  SEND_CID */
1666 775616c3 pbrook
        ret = sd->data[sd->data_offset ++];
1667 775616c3 pbrook
1668 775616c3 pbrook
        if (sd->data_offset >= 16)
1669 775616c3 pbrook
            sd->state = sd_transfer_state;
1670 775616c3 pbrook
        break;
1671 775616c3 pbrook
1672 a1bb27b1 pbrook
    case 11:        /* CMD11:  READ_DAT_UNTIL_STOP */
1673 a1bb27b1 pbrook
        if (sd->data_offset == 0)
1674 2d7adea4 Andrzej Zaborowski
            BLK_READ_BLOCK(sd->data_start, io_len);
1675 a1bb27b1 pbrook
        ret = sd->data[sd->data_offset ++];
1676 a1bb27b1 pbrook
1677 2d7adea4 Andrzej Zaborowski
        if (sd->data_offset >= io_len) {
1678 2d7adea4 Andrzej Zaborowski
            sd->data_start += io_len;
1679 a1bb27b1 pbrook
            sd->data_offset = 0;
1680 2d7adea4 Andrzej Zaborowski
            if (sd->data_start + io_len > sd->size) {
1681 a1bb27b1 pbrook
                sd->card_status |= ADDRESS_ERROR;
1682 a1bb27b1 pbrook
                break;
1683 a1bb27b1 pbrook
            }
1684 a1bb27b1 pbrook
        }
1685 a1bb27b1 pbrook
        break;
1686 a1bb27b1 pbrook
1687 a1bb27b1 pbrook
    case 13:        /* ACMD13: SD_STATUS */
1688 a1bb27b1 pbrook
        ret = sd->sd_status[sd->data_offset ++];
1689 a1bb27b1 pbrook
1690 a1bb27b1 pbrook
        if (sd->data_offset >= sizeof(sd->sd_status))
1691 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1692 a1bb27b1 pbrook
        break;
1693 a1bb27b1 pbrook
1694 a1bb27b1 pbrook
    case 17:        /* CMD17:  READ_SINGLE_BLOCK */
1695 a1bb27b1 pbrook
        if (sd->data_offset == 0)
1696 2d7adea4 Andrzej Zaborowski
            BLK_READ_BLOCK(sd->data_start, io_len);
1697 a1bb27b1 pbrook
        ret = sd->data[sd->data_offset ++];
1698 a1bb27b1 pbrook
1699 2d7adea4 Andrzej Zaborowski
        if (sd->data_offset >= io_len)
1700 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1701 a1bb27b1 pbrook
        break;
1702 a1bb27b1 pbrook
1703 a1bb27b1 pbrook
    case 18:        /* CMD18:  READ_MULTIPLE_BLOCK */
1704 a1bb27b1 pbrook
        if (sd->data_offset == 0)
1705 2d7adea4 Andrzej Zaborowski
            BLK_READ_BLOCK(sd->data_start, io_len);
1706 a1bb27b1 pbrook
        ret = sd->data[sd->data_offset ++];
1707 a1bb27b1 pbrook
1708 2d7adea4 Andrzej Zaborowski
        if (sd->data_offset >= io_len) {
1709 2d7adea4 Andrzej Zaborowski
            sd->data_start += io_len;
1710 a1bb27b1 pbrook
            sd->data_offset = 0;
1711 2d7adea4 Andrzej Zaborowski
            if (sd->data_start + io_len > sd->size) {
1712 a1bb27b1 pbrook
                sd->card_status |= ADDRESS_ERROR;
1713 a1bb27b1 pbrook
                break;
1714 a1bb27b1 pbrook
            }
1715 a1bb27b1 pbrook
        }
1716 a1bb27b1 pbrook
        break;
1717 a1bb27b1 pbrook
1718 a1bb27b1 pbrook
    case 22:        /* ACMD22: SEND_NUM_WR_BLOCKS */
1719 a1bb27b1 pbrook
        ret = sd->data[sd->data_offset ++];
1720 a1bb27b1 pbrook
1721 a1bb27b1 pbrook
        if (sd->data_offset >= 4)
1722 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1723 a1bb27b1 pbrook
        break;
1724 a1bb27b1 pbrook
1725 a1bb27b1 pbrook
    case 30:        /* CMD30:  SEND_WRITE_PROT */
1726 a1bb27b1 pbrook
        ret = sd->data[sd->data_offset ++];
1727 a1bb27b1 pbrook
1728 a1bb27b1 pbrook
        if (sd->data_offset >= 4)
1729 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1730 a1bb27b1 pbrook
        break;
1731 a1bb27b1 pbrook
1732 a1bb27b1 pbrook
    case 51:        /* ACMD51: SEND_SCR */
1733 a1bb27b1 pbrook
        ret = sd->scr[sd->data_offset ++];
1734 a1bb27b1 pbrook
1735 a1bb27b1 pbrook
        if (sd->data_offset >= sizeof(sd->scr))
1736 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1737 a1bb27b1 pbrook
        break;
1738 a1bb27b1 pbrook
1739 a1bb27b1 pbrook
    case 56:        /* CMD56:  GEN_CMD */
1740 a1bb27b1 pbrook
        if (sd->data_offset == 0)
1741 a1bb27b1 pbrook
            APP_READ_BLOCK(sd->data_start, sd->blk_len);
1742 a1bb27b1 pbrook
        ret = sd->data[sd->data_offset ++];
1743 a1bb27b1 pbrook
1744 a1bb27b1 pbrook
        if (sd->data_offset >= sd->blk_len)
1745 a1bb27b1 pbrook
            sd->state = sd_transfer_state;
1746 a1bb27b1 pbrook
        break;
1747 a1bb27b1 pbrook
1748 a1bb27b1 pbrook
    default:
1749 827df9f3 balrog
        fprintf(stderr, "sd_read_data: unknown command\n");
1750 a1bb27b1 pbrook
        return 0x00;
1751 a1bb27b1 pbrook
    }
1752 a1bb27b1 pbrook
1753 a1bb27b1 pbrook
    return ret;
1754 a1bb27b1 pbrook
}
1755 a1bb27b1 pbrook
1756 879bf4a7 Mitsyanko Igor
bool sd_data_ready(SDState *sd)
1757 a1bb27b1 pbrook
{
1758 a1bb27b1 pbrook
    return sd->state == sd_sendingdata_state;
1759 a1bb27b1 pbrook
}
1760 827df9f3 balrog
1761 bebd1271 Mitsyanko Igor
void sd_enable(SDState *sd, bool enable)
1762 827df9f3 balrog
{
1763 827df9f3 balrog
    sd->enable = enable;
1764 827df9f3 balrog
}