blob: 309138261455dcedf8077d29de37632959e30192 [file] [log] [blame]
ths5fafdf22007-09-16 21:08:06 +00001/*
pbrooka1bb27b2007-04-06 16:49:48 +00002 * SD Memory Card emulation as defined in the "SD Memory Card Physical
Philippe Mathieu-Daudé2f0939c2018-06-08 13:15:33 +01003 * layer specification, Version 2.00."
pbrooka1bb27b2007-04-06 16:49:48 +00004 *
5 * Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
6 * Copyright (c) 2007 CodeSourcery
Philippe Mathieu-Daudé2f0939c2018-06-08 13:15:33 +01007 * Copyright (c) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
pbrooka1bb27b2007-04-06 16:49:48 +00008 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
23 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
Peter Maydell04308912016-01-26 18:17:30 +000033#include "qemu/osdep.h"
Philippe Mathieu-Daudé4c8f9732018-06-25 09:42:28 -030034#include "qemu/units.h"
Philippe Mathieu-Daudéa9bcedd2020-07-07 13:02:34 +020035#include "qemu/cutils.h"
Markus Armbruster64552b62019-08-12 07:23:42 +020036#include "hw/irq.h"
Philippe Mathieu-Daudé6f296422018-02-22 15:12:52 +000037#include "hw/registerfields.h"
Markus Armbruster4be74632014-10-07 13:59:18 +020038#include "sysemu/block-backend.h"
Sai Pavan Boddue3382ef2015-10-08 18:51:01 +053039#include "hw/sd/sd.h"
Philippe Mathieu-Daudé9006f1e2017-12-23 17:29:33 -030040#include "hw/sd/sdcard_legacy.h"
Markus Armbrusterd6454272019-08-12 07:23:45 +020041#include "migration/vmstate.h"
Markus Armbrusterda34e652016-03-14 09:01:28 +010042#include "qapi/error.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010043#include "qemu/bitmap.h"
Peter Maydell260bc9d2016-02-18 14:16:18 +000044#include "hw/qdev-properties.h"
45#include "qemu/error-report.h"
Andrew Baumanndd26eb42016-02-18 14:16:20 +000046#include "qemu/timer.h"
Paolo Bonzini03dd0242015-12-15 13:16:16 +010047#include "qemu/log.h"
Markus Armbruster0b8fa322019-05-23 16:35:07 +020048#include "qemu/module.h"
Philippe Mathieu-Daudéf2500152018-02-22 15:12:52 +000049#include "sdmmc-internal.h"
Philippe Mathieu-Daudé1b640aa2018-02-22 15:12:52 +000050#include "trace.h"
pbrooka1bb27b2007-04-06 16:49:48 +000051
52//#define DEBUG_SD 1
53
Bin Meng6d2d4062020-08-21 22:45:36 +080054#define SDSC_MAX_CAPACITY (2 * GiB)
55
Philippe Mathieu-Daudé7dae0a12020-09-18 19:06:41 +020056#define INVALID_ADDRESS UINT32_MAX
Philippe Mathieu-Daudé872b8fd2020-09-18 19:05:20 +020057
pbrooka1bb27b2007-04-06 16:49:48 +000058typedef enum {
59 sd_r0 = 0, /* no response */
60 sd_r1, /* normal response command */
61 sd_r2_i, /* CID register */
62 sd_r2_s, /* CSD register */
63 sd_r3, /* OCR register */
64 sd_r6 = 6, /* Published RCA response */
balrog1b088992007-12-24 14:41:39 +000065 sd_r7, /* Operating voltage */
pbrooka1bb27b2007-04-06 16:49:48 +000066 sd_r1b = -1,
Peter Maydell53bb8cc2011-12-18 21:37:55 +010067 sd_illegal = -2,
Anthony Liguoric227f092009-10-01 16:12:16 -050068} sd_rsp_type_t;
pbrooka1bb27b2007-04-06 16:49:48 +000069
Igor Mitsyanko50a5be62012-10-30 07:45:12 +000070enum SDCardModes {
71 sd_inactive,
72 sd_card_identification_mode,
73 sd_data_transfer_mode,
74};
75
76enum SDCardStates {
77 sd_inactive_state = -1,
78 sd_idle_state = 0,
79 sd_ready_state,
80 sd_identification_state,
81 sd_standby_state,
82 sd_transfer_state,
83 sd_sendingdata_state,
84 sd_receivingdata_state,
85 sd_programming_state,
86 sd_disconnect_state,
87};
88
pbrooka1bb27b2007-04-06 16:49:48 +000089struct SDState {
Peter Maydell260bc9d2016-02-18 14:16:18 +000090 DeviceState parent_obj;
91
Markus Armbruster007d1db2020-06-09 14:23:38 +020092 /* If true, created by sd_init() for a non-qdevified caller */
93 /* TODO purge them with fire */
94 bool me_no_qdev_me_kill_mammoth_with_rocks;
95
Philippe Mathieu-Daudéd49b1ce2018-02-22 15:12:52 +000096 /* SD Memory Card Registers */
pbrooka1bb27b2007-04-06 16:49:48 +000097 uint32_t ocr;
98 uint8_t scr[8];
99 uint8_t cid[16];
100 uint8_t csd[16];
101 uint16_t rca;
102 uint32_t card_status;
103 uint8_t sd_status[64];
Philippe Mathieu-Daudéd49b1ce2018-02-22 15:12:52 +0000104
Philippe Mathieu-Daudé98205022018-05-09 02:19:41 -0300105 /* Static properties */
106
Philippe Mathieu-Daudé2f0939c2018-06-08 13:15:33 +0100107 uint8_t spec_version;
Philippe Mathieu-Daudéd49b1ce2018-02-22 15:12:52 +0000108 BlockBackend *blk;
109 bool spi;
110
Philippe Mathieu-Daudé98205022018-05-09 02:19:41 -0300111 /* Runtime changeables */
112
Philippe Mathieu-Daudéd49b1ce2018-02-22 15:12:52 +0000113 uint32_t mode; /* current card mode, one of SDCardModes */
114 int32_t state; /* current card state, one of SDCardStates */
balrog1b088992007-12-24 14:41:39 +0000115 uint32_t vhs;
Mitsyanko Igorbebd1272012-08-13 11:04:06 +0100116 bool wp_switch;
Mitsyanko Igora9c01832012-08-13 11:04:06 +0100117 unsigned long *wp_groups;
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000118 int32_t wpgrps_size;
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100119 uint64_t size;
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000120 uint32_t blk_len;
Andrew Baumann4481bbc2016-02-18 14:16:19 +0000121 uint32_t multi_blk_cnt;
pbrooka1bb27b2007-04-06 16:49:48 +0000122 uint32_t erase_start;
123 uint32_t erase_end;
124 uint8_t pwd[16];
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000125 uint32_t pwd_len;
126 uint8_t function_group[6];
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000127 uint8_t current_cmd;
Peter Maydell1d06cb72011-12-18 21:37:59 +0100128 /* True if we will handle the next command as an ACMD. Note that this does
129 * *not* track the APP_CMD status bit!
130 */
Mitsyanko Igorbebd1272012-08-13 11:04:06 +0100131 bool expecting_acmd;
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000132 uint32_t blk_written;
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100133 uint64_t data_start;
pbrooka1bb27b2007-04-06 16:49:48 +0000134 uint32_t data_offset;
135 uint8_t data[512];
balrog02ce6002007-11-17 14:34:44 +0000136 qemu_irq readonly_cb;
137 qemu_irq inserted_cb;
Philippe Mathieu-Daudéd49b1ce2018-02-22 15:12:52 +0000138 QEMUTimer *ocr_power_timer;
Philippe Mathieu-Daudé75a96f52018-03-09 17:09:44 +0000139 const char *proto_name;
Mitsyanko Igorbebd1272012-08-13 11:04:06 +0100140 bool enable;
Philippe Mathieu-Daudéda346922018-02-08 13:48:10 -0300141 uint8_t dat_lines;
142 bool cmd_line;
pbrooka1bb27b2007-04-06 16:49:48 +0000143};
144
Markus Armbruster007d1db2020-06-09 14:23:38 +0200145static void sd_realize(DeviceState *dev, Error **errp);
146
Philippe Mathieu-Daudé1b640aa2018-02-22 15:12:52 +0000147static const char *sd_state_name(enum SDCardStates state)
148{
149 static const char *state_name[] = {
150 [sd_idle_state] = "idle",
151 [sd_ready_state] = "ready",
152 [sd_identification_state] = "identification",
153 [sd_standby_state] = "standby",
154 [sd_transfer_state] = "transfer",
155 [sd_sendingdata_state] = "sendingdata",
156 [sd_receivingdata_state] = "receivingdata",
157 [sd_programming_state] = "programming",
158 [sd_disconnect_state] = "disconnect",
159 };
160 if (state == sd_inactive_state) {
161 return "inactive";
162 }
Lidong Chen1c598ab2019-06-19 15:14:46 -0400163 assert(state < ARRAY_SIZE(state_name));
Philippe Mathieu-Daudé1b640aa2018-02-22 15:12:52 +0000164 return state_name[state];
165}
166
Philippe Mathieu-Daudé55921932018-02-22 15:12:52 +0000167static const char *sd_response_name(sd_rsp_type_t rsp)
168{
169 static const char *response_name[] = {
170 [sd_r0] = "RESP#0 (no response)",
171 [sd_r1] = "RESP#1 (normal cmd)",
172 [sd_r2_i] = "RESP#2 (CID reg)",
173 [sd_r2_s] = "RESP#2 (CSD reg)",
174 [sd_r3] = "RESP#3 (OCR reg)",
175 [sd_r6] = "RESP#6 (RCA)",
176 [sd_r7] = "RESP#7 (operating voltage)",
177 };
178 if (rsp == sd_illegal) {
179 return "ILLEGAL RESP";
180 }
181 if (rsp == sd_r1b) {
182 rsp = sd_r1;
183 }
Lidong Chen1c598ab2019-06-19 15:14:46 -0400184 assert(rsp < ARRAY_SIZE(response_name));
Philippe Mathieu-Daudé55921932018-02-22 15:12:52 +0000185 return response_name[rsp];
186}
187
Philippe Mathieu-Daudéda346922018-02-08 13:48:10 -0300188static uint8_t sd_get_dat_lines(SDState *sd)
189{
190 return sd->enable ? sd->dat_lines : 0;
191}
192
193static bool sd_get_cmd_line(SDState *sd)
194{
195 return sd->enable ? sd->cmd_line : false;
196}
197
Philippe Mathieu-Daudé0034ebe2018-02-08 13:48:09 -0300198static void sd_set_voltage(SDState *sd, uint16_t millivolts)
199{
Philippe Mathieu-Daudé814b2ad2018-02-22 15:12:52 +0000200 trace_sdcard_set_voltage(millivolts);
201
Philippe Mathieu-Daudé0034ebe2018-02-08 13:48:09 -0300202 switch (millivolts) {
203 case 3001 ... 3600: /* SD_VOLTAGE_3_3V */
204 case 2001 ... 3000: /* SD_VOLTAGE_3_0V */
205 break;
206 default:
207 qemu_log_mask(LOG_GUEST_ERROR, "SD card voltage not supported: %.3fV",
208 millivolts / 1000.f);
209 }
210}
211
Peter Maydell10a412d2011-12-18 21:37:58 +0100212static void sd_set_mode(SDState *sd)
pbrooka1bb27b2007-04-06 16:49:48 +0000213{
214 switch (sd->state) {
215 case sd_inactive_state:
216 sd->mode = sd_inactive;
217 break;
218
219 case sd_idle_state:
220 case sd_ready_state:
221 case sd_identification_state:
222 sd->mode = sd_card_identification_mode;
223 break;
224
225 case sd_standby_state:
226 case sd_transfer_state:
227 case sd_sendingdata_state:
228 case sd_receivingdata_state:
229 case sd_programming_state:
230 case sd_disconnect_state:
231 sd->mode = sd_data_transfer_mode;
232 break;
233 }
pbrooka1bb27b2007-04-06 16:49:48 +0000234}
235
Philippe Mathieu-Daudéf2500152018-02-22 15:12:52 +0000236static const sd_cmd_type_t sd_cmd_type[SDMMC_CMD_MAX] = {
pbrooka1bb27b2007-04-06 16:49:48 +0000237 sd_bc, sd_none, sd_bcr, sd_bcr, sd_none, sd_none, sd_none, sd_ac,
balrog1b088992007-12-24 14:41:39 +0000238 sd_bcr, sd_ac, sd_ac, sd_adtc, sd_ac, sd_ac, sd_none, sd_ac,
Philippe Mathieu-Daudéf2500152018-02-22 15:12:52 +0000239 /* 16 */
pbrooka1bb27b2007-04-06 16:49:48 +0000240 sd_ac, sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
241 sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac, sd_ac, sd_adtc, sd_none,
Philippe Mathieu-Daudéf2500152018-02-22 15:12:52 +0000242 /* 32 */
pbrooka1bb27b2007-04-06 16:49:48 +0000243 sd_ac, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
244 sd_none, sd_none, sd_bc, sd_none, sd_none, sd_none, sd_none, sd_none,
Philippe Mathieu-Daudéf2500152018-02-22 15:12:52 +0000245 /* 48 */
pbrooka1bb27b2007-04-06 16:49:48 +0000246 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
247 sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
248};
249
Philippe Mathieu-Daudéf2500152018-02-22 15:12:52 +0000250static const int sd_cmd_class[SDMMC_CMD_MAX] = {
pbrooka1bb27b2007-04-06 16:49:48 +0000251 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0,
252 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6,
253 5, 5, 10, 10, 10, 10, 5, 9, 9, 9, 7, 7, 7, 7, 7, 7,
254 7, 7, 10, 7, 9, 9, 9, 8, 8, 10, 8, 8, 8, 8, 8, 8,
255};
256
Philippe Mathieu-Daudéaecaa052018-05-02 16:45:37 -0300257static uint8_t sd_crc7(const void *message, size_t width)
pbrooka1bb27b2007-04-06 16:49:48 +0000258{
259 int i, bit;
260 uint8_t shift_reg = 0x00;
Philippe Mathieu-Daudéaecaa052018-05-02 16:45:37 -0300261 const uint8_t *msg = (const uint8_t *)message;
pbrooka1bb27b2007-04-06 16:49:48 +0000262
263 for (i = 0; i < width; i ++, msg ++)
264 for (bit = 7; bit >= 0; bit --) {
265 shift_reg <<= 1;
266 if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
267 shift_reg ^= 0x89;
268 }
269
270 return shift_reg;
271}
272
Philippe Mathieu-Daudéaecaa052018-05-02 16:45:37 -0300273static uint16_t sd_crc16(const void *message, size_t width)
pbrooka1bb27b2007-04-06 16:49:48 +0000274{
275 int i, bit;
276 uint16_t shift_reg = 0x0000;
Philippe Mathieu-Daudéaecaa052018-05-02 16:45:37 -0300277 const uint16_t *msg = (const uint16_t *)message;
pbrooka1bb27b2007-04-06 16:49:48 +0000278 width <<= 1;
279
280 for (i = 0; i < width; i ++, msg ++)
281 for (bit = 15; bit >= 0; bit --) {
282 shift_reg <<= 1;
283 if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
284 shift_reg ^= 0x1011;
285 }
286
287 return shift_reg;
288}
289
Philippe Mathieu-Daudé6f296422018-02-22 15:12:52 +0000290#define OCR_POWER_DELAY_NS 500000 /* 0.5ms */
291
Philippe Mathieu-Daudé3d42fb52018-02-22 15:12:53 +0000292FIELD(OCR, VDD_VOLTAGE_WINDOW, 0, 24)
293FIELD(OCR, VDD_VOLTAGE_WIN_LO, 0, 8)
294FIELD(OCR, DUAL_VOLTAGE_CARD, 7, 1)
295FIELD(OCR, VDD_VOLTAGE_WIN_HI, 8, 16)
296FIELD(OCR, ACCEPT_SWITCH_1V8, 24, 1) /* Only UHS-I */
297FIELD(OCR, UHS_II_CARD, 29, 1) /* Only UHS-II */
Philippe Mathieu-Daudé6f296422018-02-22 15:12:52 +0000298FIELD(OCR, CARD_CAPACITY, 30, 1) /* 0:SDSC, 1:SDHC/SDXC */
299FIELD(OCR, CARD_POWER_UP, 31, 1)
300
Philippe Mathieu-Daudé3d42fb52018-02-22 15:12:53 +0000301#define ACMD41_ENQUIRY_MASK 0x00ffffff
302#define ACMD41_R3_MASK (R_OCR_VDD_VOLTAGE_WIN_HI_MASK \
303 | R_OCR_ACCEPT_SWITCH_1V8_MASK \
304 | R_OCR_UHS_II_CARD_MASK \
305 | R_OCR_CARD_CAPACITY_MASK \
306 | R_OCR_CARD_POWER_UP_MASK)
307
pbrooka1bb27b2007-04-06 16:49:48 +0000308static void sd_set_ocr(SDState *sd)
309{
Philippe Mathieu-Daudé3d42fb52018-02-22 15:12:53 +0000310 /* All voltages OK */
311 sd->ocr = R_OCR_VDD_VOLTAGE_WIN_HI_MASK;
Andrew Baumanndd26eb42016-02-18 14:16:20 +0000312}
313
314static void sd_ocr_powerup(void *opaque)
315{
316 SDState *sd = opaque;
317
Philippe Mathieu-Daudé814b2ad2018-02-22 15:12:52 +0000318 trace_sdcard_powerup();
Philippe Mathieu-Daudé6f296422018-02-22 15:12:52 +0000319 assert(!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP));
320
321 /* card power-up OK */
322 sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_POWER_UP, 1);
Philippe Mathieu-Daudé9273ea612018-02-22 15:12:52 +0000323
Bin Meng6d2d4062020-08-21 22:45:36 +0800324 if (sd->size > SDSC_MAX_CAPACITY) {
Philippe Mathieu-Daudé9273ea612018-02-22 15:12:52 +0000325 sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_CAPACITY, 1);
326 }
pbrooka1bb27b2007-04-06 16:49:48 +0000327}
328
329static void sd_set_scr(SDState *sd)
330{
Philippe Mathieu-Daudé2f0939c2018-06-08 13:15:33 +0100331 sd->scr[0] = 0 << 4; /* SCR structure version 1.0 */
332 if (sd->spec_version == SD_PHY_SPECv1_10_VERS) {
333 sd->scr[0] |= 1; /* Spec Version 1.10 */
334 } else {
Philippe Mathieu-Daudé2c511372018-06-08 13:15:34 +0100335 sd->scr[0] |= 2; /* Spec Version 2.00 or Version 3.0X */
Philippe Mathieu-Daudé2f0939c2018-06-08 13:15:33 +0100336 }
Philippe Mathieu-Daudé9b7ec552018-02-22 15:12:53 +0000337 sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
338 | 0b0101; /* 1-bit or 4-bit width bus modes */
339 sd->scr[2] = 0x00; /* Extended Security is not supported. */
Philippe Mathieu-Daudé2c511372018-06-08 13:15:34 +0100340 if (sd->spec_version >= SD_PHY_SPECv3_01_VERS) {
341 sd->scr[2] |= 1 << 7; /* Spec Version 3.0X */
342 }
pbrooka1bb27b2007-04-06 16:49:48 +0000343 sd->scr[3] = 0x00;
Philippe Mathieu-Daudé9b7ec552018-02-22 15:12:53 +0000344 /* reserved for manufacturer usage */
pbrooka1bb27b2007-04-06 16:49:48 +0000345 sd->scr[4] = 0x00;
346 sd->scr[5] = 0x00;
347 sd->scr[6] = 0x00;
348 sd->scr[7] = 0x00;
349}
350
351#define MID 0xaa
352#define OID "XY"
353#define PNM "QEMU!"
354#define PRV 0x01
355#define MDT_YR 2006
356#define MDT_MON 2
357
358static void sd_set_cid(SDState *sd)
359{
360 sd->cid[0] = MID; /* Fake card manufacturer ID (MID) */
361 sd->cid[1] = OID[0]; /* OEM/Application ID (OID) */
362 sd->cid[2] = OID[1];
363 sd->cid[3] = PNM[0]; /* Fake product name (PNM) */
364 sd->cid[4] = PNM[1];
365 sd->cid[5] = PNM[2];
366 sd->cid[6] = PNM[3];
367 sd->cid[7] = PNM[4];
368 sd->cid[8] = PRV; /* Fake product revision (PRV) */
369 sd->cid[9] = 0xde; /* Fake serial number (PSN) */
370 sd->cid[10] = 0xad;
371 sd->cid[11] = 0xbe;
372 sd->cid[12] = 0xef;
373 sd->cid[13] = 0x00 | /* Manufacture date (MDT) */
374 ((MDT_YR - 2000) / 10);
375 sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
376 sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
377}
378
379#define HWBLOCK_SHIFT 9 /* 512 bytes */
380#define SECTOR_SHIFT 5 /* 16 kilobytes */
381#define WPGROUP_SHIFT 7 /* 2 megs */
382#define CMULT_SHIFT 9 /* 512 times HWBLOCK_SIZE */
pbrooka1bb27b2007-04-06 16:49:48 +0000383#define WPGROUP_SIZE (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT))
384
385static const uint8_t sd_csd_rw_mask[16] = {
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
388};
389
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100390static void sd_set_csd(SDState *sd, uint64_t size)
pbrooka1bb27b2007-04-06 16:49:48 +0000391{
392 uint32_t csize = (size >> (CMULT_SHIFT + HWBLOCK_SHIFT)) - 1;
393 uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
394 uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
395
Bin Meng6d2d4062020-08-21 22:45:36 +0800396 if (size <= SDSC_MAX_CAPACITY) { /* Standard Capacity SD */
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100397 sd->csd[0] = 0x00; /* CSD structure */
398 sd->csd[1] = 0x26; /* Data read access-time-1 */
399 sd->csd[2] = 0x00; /* Data read access-time-2 */
Philippe Mathieu-Daudéd7ecb862018-02-22 15:12:53 +0000400 sd->csd[3] = 0x32; /* Max. data transfer rate: 25 MHz */
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100401 sd->csd[4] = 0x5f; /* Card Command Classes */
402 sd->csd[5] = 0x50 | /* Max. read data block length */
403 HWBLOCK_SHIFT;
404 sd->csd[6] = 0xe0 | /* Partial block for read allowed */
405 ((csize >> 10) & 0x03);
406 sd->csd[7] = 0x00 | /* Device size */
407 ((csize >> 2) & 0xff);
408 sd->csd[8] = 0x3f | /* Max. read current */
409 ((csize << 6) & 0xc0);
410 sd->csd[9] = 0xfc | /* Max. write current */
411 ((CMULT_SHIFT - 2) >> 1);
412 sd->csd[10] = 0x40 | /* Erase sector size */
413 (((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1);
414 sd->csd[11] = 0x00 | /* Write protect group size */
415 ((sectsize << 7) & 0x80) | wpsize;
416 sd->csd[12] = 0x90 | /* Write speed factor */
417 (HWBLOCK_SHIFT >> 2);
418 sd->csd[13] = 0x20 | /* Max. write data block length */
419 ((HWBLOCK_SHIFT << 6) & 0xc0);
420 sd->csd[14] = 0x00; /* File format group */
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100421 } else { /* SDHC */
Philippe Mathieu-Daudé4c8f9732018-06-25 09:42:28 -0300422 size /= 512 * KiB;
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100423 size -= 1;
424 sd->csd[0] = 0x40;
425 sd->csd[1] = 0x0e;
426 sd->csd[2] = 0x00;
427 sd->csd[3] = 0x32;
428 sd->csd[4] = 0x5b;
429 sd->csd[5] = 0x59;
430 sd->csd[6] = 0x00;
431 sd->csd[7] = (size >> 16) & 0xff;
432 sd->csd[8] = (size >> 8) & 0xff;
433 sd->csd[9] = (size & 0xff);
434 sd->csd[10] = 0x7f;
435 sd->csd[11] = 0x80;
436 sd->csd[12] = 0x0a;
437 sd->csd[13] = 0x40;
438 sd->csd[14] = 0x00;
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100439 }
Philippe Mathieu-Daudée8feec82018-02-22 15:12:53 +0000440 sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
pbrooka1bb27b2007-04-06 16:49:48 +0000441}
442
443static void sd_set_rca(SDState *sd)
444{
445 sd->rca += 0x4567;
446}
447
Philippe Mathieu-Daudéda26e3f2018-02-22 15:12:53 +0000448FIELD(CSR, AKE_SEQ_ERROR, 3, 1)
449FIELD(CSR, APP_CMD, 5, 1)
450FIELD(CSR, FX_EVENT, 6, 1)
451FIELD(CSR, READY_FOR_DATA, 8, 1)
452FIELD(CSR, CURRENT_STATE, 9, 4)
453FIELD(CSR, ERASE_RESET, 13, 1)
454FIELD(CSR, CARD_ECC_DISABLED, 14, 1)
455FIELD(CSR, WP_ERASE_SKIP, 15, 1)
456FIELD(CSR, CSD_OVERWRITE, 16, 1)
457FIELD(CSR, DEFERRED_RESPONSE, 17, 1)
458FIELD(CSR, ERROR, 19, 1)
459FIELD(CSR, CC_ERROR, 20, 1)
460FIELD(CSR, CARD_ECC_FAILED, 21, 1)
461FIELD(CSR, ILLEGAL_COMMAND, 22, 1)
462FIELD(CSR, COM_CRC_ERROR, 23, 1)
463FIELD(CSR, LOCK_UNLOCK_FAILED, 24, 1)
464FIELD(CSR, CARD_IS_LOCKED, 25, 1)
465FIELD(CSR, WP_VIOLATION, 26, 1)
466FIELD(CSR, ERASE_PARAM, 27, 1)
467FIELD(CSR, ERASE_SEQ_ERROR, 28, 1)
468FIELD(CSR, BLOCK_LEN_ERROR, 29, 1)
469FIELD(CSR, ADDRESS_ERROR, 30, 1)
470FIELD(CSR, OUT_OF_RANGE, 31, 1)
471
Peter Maydellb8d334c2011-12-18 21:37:52 +0100472/* Card status bits, split by clear condition:
473 * A : According to the card current state
474 * B : Always related to the previous command
475 * C : Cleared by read
476 */
Philippe Mathieu-Daudéda26e3f2018-02-22 15:12:53 +0000477#define CARD_STATUS_A (R_CSR_READY_FOR_DATA_MASK \
478 | R_CSR_CARD_ECC_DISABLED_MASK \
479 | R_CSR_CARD_IS_LOCKED_MASK)
480#define CARD_STATUS_B (R_CSR_CURRENT_STATE_MASK \
481 | R_CSR_ILLEGAL_COMMAND_MASK \
482 | R_CSR_COM_CRC_ERROR_MASK)
483#define CARD_STATUS_C (R_CSR_AKE_SEQ_ERROR_MASK \
484 | R_CSR_APP_CMD_MASK \
485 | R_CSR_ERASE_RESET_MASK \
486 | R_CSR_WP_ERASE_SKIP_MASK \
487 | R_CSR_CSD_OVERWRITE_MASK \
488 | R_CSR_ERROR_MASK \
489 | R_CSR_CC_ERROR_MASK \
490 | R_CSR_CARD_ECC_FAILED_MASK \
491 | R_CSR_LOCK_UNLOCK_FAILED_MASK \
492 | R_CSR_WP_VIOLATION_MASK \
493 | R_CSR_ERASE_PARAM_MASK \
494 | R_CSR_ERASE_SEQ_ERROR_MASK \
495 | R_CSR_BLOCK_LEN_ERROR_MASK \
496 | R_CSR_ADDRESS_ERROR_MASK \
497 | R_CSR_OUT_OF_RANGE_MASK)
pbrooka1bb27b2007-04-06 16:49:48 +0000498
499static void sd_set_cardstatus(SDState *sd)
500{
501 sd->card_status = 0x00000100;
502}
503
504static void sd_set_sdstatus(SDState *sd)
505{
506 memset(sd->sd_status, 0, 64);
507}
508
Paul Brookbc24a222009-05-10 01:44:56 +0100509static int sd_req_crc_validate(SDRequest *req)
pbrooka1bb27b2007-04-06 16:49:48 +0000510{
511 uint8_t buffer[5];
512 buffer[0] = 0x40 | req->cmd;
Philippe Mathieu-Daudé67bfddd2018-02-22 15:12:53 +0000513 stl_be_p(&buffer[1], req->arg);
pbrooka1bb27b2007-04-06 16:49:48 +0000514 return 0;
515 return sd_crc7(buffer, 5) != req->crc; /* TODO */
516}
517
Peter Maydell10a412d2011-12-18 21:37:58 +0100518static void sd_response_r1_make(SDState *sd, uint8_t *response)
pbrooka1bb27b2007-04-06 16:49:48 +0000519{
Philippe Mathieu-Daudé67bfddd2018-02-22 15:12:53 +0000520 stl_be_p(response, sd->card_status);
521
Peter Maydell1d06cb72011-12-18 21:37:59 +0100522 /* Clear the "clear on read" status bits */
523 sd->card_status &= ~CARD_STATUS_C;
pbrooka1bb27b2007-04-06 16:49:48 +0000524}
525
pbrook9596ebb2007-11-18 01:44:38 +0000526static void sd_response_r3_make(SDState *sd, uint8_t *response)
pbrooka1bb27b2007-04-06 16:49:48 +0000527{
Philippe Mathieu-Daudé3d42fb52018-02-22 15:12:53 +0000528 stl_be_p(response, sd->ocr & ACMD41_R3_MASK);
pbrooka1bb27b2007-04-06 16:49:48 +0000529}
530
pbrook9596ebb2007-11-18 01:44:38 +0000531static void sd_response_r6_make(SDState *sd, uint8_t *response)
pbrooka1bb27b2007-04-06 16:49:48 +0000532{
pbrooka1bb27b2007-04-06 16:49:48 +0000533 uint16_t status;
534
pbrooka1bb27b2007-04-06 16:49:48 +0000535 status = ((sd->card_status >> 8) & 0xc000) |
536 ((sd->card_status >> 6) & 0x2000) |
537 (sd->card_status & 0x1fff);
Peter Maydellfcfa9352011-12-18 21:38:00 +0100538 sd->card_status &= ~(CARD_STATUS_C & 0xc81fff);
Philippe Mathieu-Daudé67bfddd2018-02-22 15:12:53 +0000539 stw_be_p(response + 0, sd->rca);
540 stw_be_p(response + 2, status);
pbrooka1bb27b2007-04-06 16:49:48 +0000541}
542
balrog1b088992007-12-24 14:41:39 +0000543static void sd_response_r7_make(SDState *sd, uint8_t *response)
544{
Philippe Mathieu-Daudé67bfddd2018-02-22 15:12:53 +0000545 stl_be_p(response, sd->vhs);
balrog1b088992007-12-24 14:41:39 +0000546}
547
Mitsyanko Igorb7202b82012-08-13 11:04:06 +0100548static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
549{
550 return addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
551}
552
Peter Maydellba3ed0f2016-02-18 14:16:18 +0000553static void sd_reset(DeviceState *dev)
pbrooka1bb27b2007-04-06 16:49:48 +0000554{
Peter Maydellba3ed0f2016-02-18 14:16:18 +0000555 SDState *sd = SD_CARD(dev);
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100556 uint64_t size;
pbrooka1bb27b2007-04-06 16:49:48 +0000557 uint64_t sect;
558
Philippe Mathieu-Daudé814b2ad2018-02-22 15:12:52 +0000559 trace_sdcard_reset();
Peter Maydell16b781a2015-05-12 11:57:16 +0100560 if (sd->blk) {
561 blk_get_geometry(sd->blk, &sect);
Paul Brook03f311e2009-05-03 16:52:16 +0100562 } else {
563 sect = 0;
564 }
Vincent Palatin5e371412011-07-25 16:19:05 -0700565 size = sect << 9;
pbrooka1bb27b2007-04-06 16:49:48 +0000566
Mitsyanko Igorb7202b82012-08-13 11:04:06 +0100567 sect = sd_addr_to_wpnum(size) + 1;
pbrooka1bb27b2007-04-06 16:49:48 +0000568
569 sd->state = sd_idle_state;
570 sd->rca = 0x0000;
571 sd_set_ocr(sd);
572 sd_set_scr(sd);
573 sd_set_cid(sd);
574 sd_set_csd(sd, size);
575 sd_set_cardstatus(sd);
576 sd_set_sdstatus(sd);
577
Daniel P. Berrangeef1e1e02015-08-26 12:17:18 +0100578 g_free(sd->wp_groups);
Peter Maydell16b781a2015-05-12 11:57:16 +0100579 sd->wp_switch = sd->blk ? blk_is_read_only(sd->blk) : false;
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000580 sd->wpgrps_size = sect;
581 sd->wp_groups = bitmap_new(sd->wpgrps_size);
582 memset(sd->function_group, 0, sizeof(sd->function_group));
Philippe Mathieu-Daudé872b8fd2020-09-18 19:05:20 +0200583 sd->erase_start = INVALID_ADDRESS;
584 sd->erase_end = INVALID_ADDRESS;
pbrooka1bb27b2007-04-06 16:49:48 +0000585 sd->size = size;
586 sd->blk_len = 0x200;
587 sd->pwd_len = 0;
Mitsyanko Igorbebd1272012-08-13 11:04:06 +0100588 sd->expecting_acmd = false;
Philippe Mathieu-Daudéda346922018-02-08 13:48:10 -0300589 sd->dat_lines = 0xf;
590 sd->cmd_line = true;
Andrew Baumann4481bbc2016-02-18 14:16:19 +0000591 sd->multi_blk_cnt = 0;
pbrooka1bb27b2007-04-06 16:49:48 +0000592}
593
Peter Maydellc759a792016-02-18 14:16:18 +0000594static bool sd_get_inserted(SDState *sd)
595{
Peter Maydell0719e712016-03-04 11:30:17 +0000596 return sd->blk && blk_is_inserted(sd->blk);
Peter Maydellc759a792016-02-18 14:16:18 +0000597}
598
599static bool sd_get_readonly(SDState *sd)
600{
601 return sd->wp_switch;
602}
603
Kevin Wolf39829a02017-01-24 14:21:41 +0100604static void sd_cardchange(void *opaque, bool load, Error **errp)
pbrooka1bb27b2007-04-06 16:49:48 +0000605{
606 SDState *sd = opaque;
Peter Maydellc759a792016-02-18 14:16:18 +0000607 DeviceState *dev = DEVICE(sd);
Markus Armbruster007d1db2020-06-09 14:23:38 +0200608 SDBus *sdbus;
Peter Maydellc759a792016-02-18 14:16:18 +0000609 bool inserted = sd_get_inserted(sd);
610 bool readonly = sd_get_readonly(sd);
Christoph Hellwigdb97ee62011-01-24 13:32:41 +0100611
Peter Maydellc759a792016-02-18 14:16:18 +0000612 if (inserted) {
Philippe Mathieu-Daudé814b2ad2018-02-22 15:12:52 +0000613 trace_sdcard_inserted(readonly);
Peter Maydellc759a792016-02-18 14:16:18 +0000614 sd_reset(dev);
Philippe Mathieu-Daudé814b2ad2018-02-22 15:12:52 +0000615 } else {
616 trace_sdcard_ejected();
Peter Maydellc759a792016-02-18 14:16:18 +0000617 }
618
Markus Armbruster007d1db2020-06-09 14:23:38 +0200619 if (sd->me_no_qdev_me_kill_mammoth_with_rocks) {
Peter Maydellc759a792016-02-18 14:16:18 +0000620 qemu_set_irq(sd->inserted_cb, inserted);
621 if (inserted) {
622 qemu_set_irq(sd->readonly_cb, readonly);
623 }
Markus Armbruster007d1db2020-06-09 14:23:38 +0200624 } else {
625 sdbus = SD_BUS(qdev_get_parent_bus(dev));
626 sdbus_set_inserted(sdbus, inserted);
627 if (inserted) {
628 sdbus_set_readonly(sdbus, readonly);
629 }
pbrooka1bb27b2007-04-06 16:49:48 +0000630 }
631}
632
Markus Armbruster0e49de52011-08-03 15:07:41 +0200633static const BlockDevOps sd_block_ops = {
Markus Armbruster145feb12011-08-03 15:07:42 +0200634 .change_media_cb = sd_cardchange,
Markus Armbruster0e49de52011-08-03 15:07:41 +0200635};
636
Andrew Baumanndd26eb42016-02-18 14:16:20 +0000637static bool sd_ocr_vmstate_needed(void *opaque)
638{
639 SDState *sd = opaque;
640
641 /* Include the OCR state (and timer) if it is not yet powered up */
Philippe Mathieu-Daudé6f296422018-02-22 15:12:52 +0000642 return !FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP);
Andrew Baumanndd26eb42016-02-18 14:16:20 +0000643}
644
645static const VMStateDescription sd_ocr_vmstate = {
646 .name = "sd-card/ocr-state",
647 .version_id = 1,
648 .minimum_version_id = 1,
649 .needed = sd_ocr_vmstate_needed,
650 .fields = (VMStateField[]) {
651 VMSTATE_UINT32(ocr, SDState),
652 VMSTATE_TIMER_PTR(ocr_power_timer, SDState),
653 VMSTATE_END_OF_LIST()
654 },
655};
656
657static int sd_vmstate_pre_load(void *opaque)
658{
659 SDState *sd = opaque;
660
661 /* If the OCR state is not included (prior versions, or not
662 * needed), then the OCR must be set as powered up. If the OCR state
663 * is included, this will be replaced by the state restore.
664 */
665 sd_ocr_powerup(sd);
666
667 return 0;
668}
669
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000670static const VMStateDescription sd_vmstate = {
671 .name = "sd-card",
Philippe Mathieu-Daudé7dae0a12020-09-18 19:06:41 +0200672 .version_id = 2,
673 .minimum_version_id = 2,
Andrew Baumanndd26eb42016-02-18 14:16:20 +0000674 .pre_load = sd_vmstate_pre_load,
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000675 .fields = (VMStateField[]) {
676 VMSTATE_UINT32(mode, SDState),
677 VMSTATE_INT32(state, SDState),
678 VMSTATE_UINT8_ARRAY(cid, SDState, 16),
679 VMSTATE_UINT8_ARRAY(csd, SDState, 16),
680 VMSTATE_UINT16(rca, SDState),
681 VMSTATE_UINT32(card_status, SDState),
682 VMSTATE_PARTIAL_BUFFER(sd_status, SDState, 1),
683 VMSTATE_UINT32(vhs, SDState),
684 VMSTATE_BITMAP(wp_groups, SDState, 0, wpgrps_size),
685 VMSTATE_UINT32(blk_len, SDState),
Andrew Baumann4481bbc2016-02-18 14:16:19 +0000686 VMSTATE_UINT32(multi_blk_cnt, SDState),
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000687 VMSTATE_UINT32(erase_start, SDState),
688 VMSTATE_UINT32(erase_end, SDState),
689 VMSTATE_UINT8_ARRAY(pwd, SDState, 16),
690 VMSTATE_UINT32(pwd_len, SDState),
691 VMSTATE_UINT8_ARRAY(function_group, SDState, 6),
692 VMSTATE_UINT8(current_cmd, SDState),
693 VMSTATE_BOOL(expecting_acmd, SDState),
694 VMSTATE_UINT32(blk_written, SDState),
695 VMSTATE_UINT64(data_start, SDState),
696 VMSTATE_UINT32(data_offset, SDState),
697 VMSTATE_UINT8_ARRAY(data, SDState, 512),
Eric Blake12c125c2016-05-06 10:26:39 -0600698 VMSTATE_UNUSED_V(1, 512),
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000699 VMSTATE_BOOL(enable, SDState),
700 VMSTATE_END_OF_LIST()
Andrew Baumanndd26eb42016-02-18 14:16:20 +0000701 },
702 .subsections = (const VMStateDescription*[]) {
703 &sd_ocr_vmstate,
704 NULL
705 },
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000706};
707
Peter Maydell260bc9d2016-02-18 14:16:18 +0000708/* Legacy initialization function for use by non-qdevified callers */
Markus Armbruster4be74632014-10-07 13:59:18 +0200709SDState *sd_init(BlockBackend *blk, bool is_spi)
pbrooka1bb27b2007-04-06 16:49:48 +0000710{
Peter Maydellfec44a82016-03-16 17:06:02 +0000711 Object *obj;
Peter Maydell260bc9d2016-02-18 14:16:18 +0000712 DeviceState *dev;
Markus Armbruster007d1db2020-06-09 14:23:38 +0200713 SDState *sd;
Peter Maydell260bc9d2016-02-18 14:16:18 +0000714 Error *err = NULL;
pbrooka1bb27b2007-04-06 16:49:48 +0000715
Peter Maydellfec44a82016-03-16 17:06:02 +0000716 obj = object_new(TYPE_SD_CARD);
717 dev = DEVICE(obj);
Markus Armbruster0c0e6182020-07-07 18:06:00 +0200718 if (!qdev_prop_set_drive_err(dev, "drive", blk, &err)) {
Markus Armbruster5217f182020-05-05 12:19:03 +0200719 error_reportf_err(err, "sd_init failed: ");
Peter Maydell260bc9d2016-02-18 14:16:18 +0000720 return NULL;
721 }
722 qdev_prop_set_bit(dev, "spi", is_spi);
Markus Armbruster007d1db2020-06-09 14:23:38 +0200723
724 /*
725 * Realizing the device properly would put it into the QOM
726 * composition tree even though it is not plugged into an
727 * appropriate bus. That's a no-no. Hide the device from
728 * QOM/qdev, and call its qdev realize callback directly.
729 */
730 object_ref(obj);
731 object_unparent(obj);
732 sd_realize(dev, &err);
Peter Maydell260bc9d2016-02-18 14:16:18 +0000733 if (err) {
Markus Armbruster5217f182020-05-05 12:19:03 +0200734 error_reportf_err(err, "sd_init failed: ");
Kevin Wolf4f8a0662013-09-13 15:51:47 +0200735 return NULL;
736 }
737
Markus Armbruster007d1db2020-06-09 14:23:38 +0200738 sd = SD_CARD(dev);
739 sd->me_no_qdev_me_kill_mammoth_with_rocks = true;
740 return sd;
pbrooka1bb27b2007-04-06 16:49:48 +0000741}
742
balrog02ce6002007-11-17 14:34:44 +0000743void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
pbrooka1bb27b2007-04-06 16:49:48 +0000744{
balrog02ce6002007-11-17 14:34:44 +0000745 sd->readonly_cb = readonly;
746 sd->inserted_cb = insert;
Markus Armbruster4be74632014-10-07 13:59:18 +0200747 qemu_set_irq(readonly, sd->blk ? blk_is_read_only(sd->blk) : 0);
748 qemu_set_irq(insert, sd->blk ? blk_is_inserted(sd->blk) : 0);
pbrooka1bb27b2007-04-06 16:49:48 +0000749}
750
751static void sd_erase(SDState *sd)
752{
Igor Mitsyankof2d189d2012-10-30 07:45:12 +0000753 int i;
754 uint64_t erase_start = sd->erase_start;
755 uint64_t erase_end = sd->erase_end;
756
Philippe Mathieu-Daudéaafe6c52020-09-13 13:18:19 +0200757 trace_sdcard_erase(sd->erase_start, sd->erase_end);
Philippe Mathieu-Daudé872b8fd2020-09-18 19:05:20 +0200758 if (sd->erase_start == INVALID_ADDRESS
759 || sd->erase_end == INVALID_ADDRESS) {
pbrooka1bb27b2007-04-06 16:49:48 +0000760 sd->card_status |= ERASE_SEQ_ERROR;
Philippe Mathieu-Daudéc8c8b3f2020-09-13 13:18:31 +0200761 sd->erase_start = INVALID_ADDRESS;
762 sd->erase_end = INVALID_ADDRESS;
pbrooka1bb27b2007-04-06 16:49:48 +0000763 return;
764 }
765
Philippe Mathieu-Daudé6f296422018-02-22 15:12:52 +0000766 if (FIELD_EX32(sd->ocr, OCR, CARD_CAPACITY)) {
Igor Mitsyankof2d189d2012-10-30 07:45:12 +0000767 /* High capacity memory card: erase units are 512 byte blocks */
768 erase_start *= 512;
769 erase_end *= 512;
770 }
771
Philippe Mathieu-Daudé1bd6fd82020-09-13 13:18:52 +0200772 if (sd->erase_start > sd->size || sd->erase_end > sd->size) {
773 sd->card_status |= OUT_OF_RANGE;
774 sd->erase_start = INVALID_ADDRESS;
775 sd->erase_end = INVALID_ADDRESS;
776 return;
777 }
778
Igor Mitsyankof2d189d2012-10-30 07:45:12 +0000779 erase_start = sd_addr_to_wpnum(erase_start);
780 erase_end = sd_addr_to_wpnum(erase_end);
Philippe Mathieu-Daudé872b8fd2020-09-18 19:05:20 +0200781 sd->erase_start = INVALID_ADDRESS;
782 sd->erase_end = INVALID_ADDRESS;
pbrooka1bb27b2007-04-06 16:49:48 +0000783 sd->csd[14] |= 0x40;
784
Igor Mitsyankof2d189d2012-10-30 07:45:12 +0000785 for (i = erase_start; i <= erase_end; i++) {
Philippe Mathieu-Daudé84816fb2020-09-18 19:14:52 +0200786 assert(i < sd->wpgrps_size);
Mitsyanko Igora9c01832012-08-13 11:04:06 +0100787 if (test_bit(i, sd->wp_groups)) {
pbrooka1bb27b2007-04-06 16:49:48 +0000788 sd->card_status |= WP_ERASE_SKIP;
Mitsyanko Igora9c01832012-08-13 11:04:06 +0100789 }
790 }
pbrooka1bb27b2007-04-06 16:49:48 +0000791}
792
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100793static uint32_t sd_wpbits(SDState *sd, uint64_t addr)
pbrooka1bb27b2007-04-06 16:49:48 +0000794{
795 uint32_t i, wpnum;
796 uint32_t ret = 0;
797
Mitsyanko Igorb7202b82012-08-13 11:04:06 +0100798 wpnum = sd_addr_to_wpnum(addr);
pbrooka1bb27b2007-04-06 16:49:48 +0000799
Mitsyanko Igora9c01832012-08-13 11:04:06 +0100800 for (i = 0; i < 32; i++, wpnum++, addr += WPGROUP_SIZE) {
Philippe Mathieu-Daudé84816fb2020-09-18 19:14:52 +0200801 assert(wpnum < sd->wpgrps_size);
Mitsyanko Igora9c01832012-08-13 11:04:06 +0100802 if (addr < sd->size && test_bit(wpnum, sd->wp_groups)) {
pbrooka1bb27b2007-04-06 16:49:48 +0000803 ret |= (1 << i);
Mitsyanko Igora9c01832012-08-13 11:04:06 +0100804 }
805 }
pbrooka1bb27b2007-04-06 16:49:48 +0000806
807 return ret;
808}
809
810static void sd_function_switch(SDState *sd, uint32_t arg)
811{
Philippe Mathieu-Daudé67bfddd2018-02-22 15:12:53 +0000812 int i, mode, new_func;
pbrooka1bb27b2007-04-06 16:49:48 +0000813 mode = !!(arg & 0x80000000);
814
815 sd->data[0] = 0x00; /* Maximum current consumption */
816 sd->data[1] = 0x01;
817 sd->data[2] = 0x80; /* Supported group 6 functions */
818 sd->data[3] = 0x01;
819 sd->data[4] = 0x80; /* Supported group 5 functions */
820 sd->data[5] = 0x01;
821 sd->data[6] = 0x80; /* Supported group 4 functions */
822 sd->data[7] = 0x01;
823 sd->data[8] = 0x80; /* Supported group 3 functions */
824 sd->data[9] = 0x01;
825 sd->data[10] = 0x80; /* Supported group 2 functions */
826 sd->data[11] = 0x43;
827 sd->data[12] = 0x80; /* Supported group 1 functions */
828 sd->data[13] = 0x03;
Bin Mengb6386272020-08-21 22:45:35 +0800829
Bin Meng89c67002020-10-24 09:49:54 +0800830 memset(&sd->data[14], 0, 3);
pbrooka1bb27b2007-04-06 16:49:48 +0000831 for (i = 0; i < 6; i ++) {
832 new_func = (arg >> (i * 4)) & 0x0f;
833 if (mode && new_func != 0x0f)
834 sd->function_group[i] = new_func;
Bin Mengb6386272020-08-21 22:45:35 +0800835 sd->data[16 - (i >> 1)] |= new_func << ((i % 2) * 4);
pbrooka1bb27b2007-04-06 16:49:48 +0000836 }
837 memset(&sd->data[17], 0, 47);
Philippe Mathieu-Daudéf6fb1f92018-05-15 14:58:44 +0100838 stw_be_p(sd->data + 64, sd_crc16(sd->data, 64));
pbrooka1bb27b2007-04-06 16:49:48 +0000839}
840
Mitsyanko Igor4e8f1be2012-08-13 11:04:07 +0100841static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
pbrooka1bb27b2007-04-06 16:49:48 +0000842{
Mitsyanko Igorb7202b82012-08-13 11:04:06 +0100843 return test_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
pbrooka1bb27b2007-04-06 16:49:48 +0000844}
845
846static void sd_lock_command(SDState *sd)
847{
848 int erase, lock, clr_pwd, set_pwd, pwd_len;
849 erase = !!(sd->data[0] & 0x08);
850 lock = sd->data[0] & 0x04;
851 clr_pwd = sd->data[0] & 0x02;
852 set_pwd = sd->data[0] & 0x01;
853
854 if (sd->blk_len > 1)
855 pwd_len = sd->data[1];
856 else
857 pwd_len = 0;
858
Philippe Mathieu-Daudé814b2ad2018-02-22 15:12:52 +0000859 if (lock) {
860 trace_sdcard_lock();
861 } else {
862 trace_sdcard_unlock();
863 }
pbrooka1bb27b2007-04-06 16:49:48 +0000864 if (erase) {
865 if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 ||
866 set_pwd || clr_pwd || lock || sd->wp_switch ||
867 (sd->csd[14] & 0x20)) {
868 sd->card_status |= LOCK_UNLOCK_FAILED;
869 return;
870 }
Igor Mitsyanko50a5be62012-10-30 07:45:12 +0000871 bitmap_zero(sd->wp_groups, sd->wpgrps_size);
pbrooka1bb27b2007-04-06 16:49:48 +0000872 sd->csd[14] &= ~0x10;
873 sd->card_status &= ~CARD_IS_LOCKED;
874 sd->pwd_len = 0;
875 /* Erasing the entire card here! */
balrog827df9f2008-04-14 21:05:22 +0000876 fprintf(stderr, "SD: Card force-erased by CMD42\n");
pbrooka1bb27b2007-04-06 16:49:48 +0000877 return;
878 }
879
880 if (sd->blk_len < 2 + pwd_len ||
881 pwd_len <= sd->pwd_len ||
882 pwd_len > sd->pwd_len + 16) {
883 sd->card_status |= LOCK_UNLOCK_FAILED;
884 return;
885 }
886
887 if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) {
888 sd->card_status |= LOCK_UNLOCK_FAILED;
889 return;
890 }
891
892 pwd_len -= sd->pwd_len;
893 if ((pwd_len && !set_pwd) ||
894 (clr_pwd && (set_pwd || lock)) ||
895 (lock && !sd->pwd_len && !set_pwd) ||
896 (!set_pwd && !clr_pwd &&
897 (((sd->card_status & CARD_IS_LOCKED) && lock) ||
898 (!(sd->card_status & CARD_IS_LOCKED) && !lock)))) {
899 sd->card_status |= LOCK_UNLOCK_FAILED;
900 return;
901 }
902
903 if (set_pwd) {
904 memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len);
905 sd->pwd_len = pwd_len;
906 }
907
908 if (clr_pwd) {
909 sd->pwd_len = 0;
910 }
911
912 if (lock)
913 sd->card_status |= CARD_IS_LOCKED;
914 else
915 sd->card_status &= ~CARD_IS_LOCKED;
916}
917
Philippe Mathieu-Daudé586634b2018-03-09 17:09:44 +0000918static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
pbrooka1bb27b2007-04-06 16:49:48 +0000919{
920 uint32_t rca = 0x0000;
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +0100921 uint64_t addr = (sd->ocr & (1 << 30)) ? (uint64_t) req.arg << 9 : req.arg;
pbrooka1bb27b2007-04-06 16:49:48 +0000922
Philippe Mathieu-Daudé586634b2018-03-09 17:09:44 +0000923 /* CMD55 precedes an ACMD, so we are not interested in tracing it.
924 * However there is no ACMD55, so we want to trace this particular case.
925 */
926 if (req.cmd != 55 || sd->expecting_acmd) {
Philippe Mathieu-Daudé75a96f52018-03-09 17:09:44 +0000927 trace_sdcard_normal_command(sd->proto_name,
928 sd_cmd_name(req.cmd), req.cmd,
Philippe Mathieu-Daudé2ed61fb2018-03-09 17:09:44 +0000929 req.arg, sd_state_name(sd->state));
Philippe Mathieu-Daudé586634b2018-03-09 17:09:44 +0000930 }
Philippe Mathieu-Daudé1b640aa2018-02-22 15:12:52 +0000931
Peter Maydell1d06cb72011-12-18 21:37:59 +0100932 /* Not interpreting this as an app command */
933 sd->card_status &= ~APP_CMD;
934
Philippe Mathieu-Daudéf2500152018-02-22 15:12:52 +0000935 if (sd_cmd_type[req.cmd] == sd_ac
936 || sd_cmd_type[req.cmd] == sd_adtc) {
pbrooka1bb27b2007-04-06 16:49:48 +0000937 rca = req.arg >> 16;
Prasad J Pandit97f4ed32016-02-11 11:17:32 +0000938 }
pbrooka1bb27b2007-04-06 16:49:48 +0000939
Andrew Baumann4481bbc2016-02-18 14:16:19 +0000940 /* CMD23 (set block count) must be immediately followed by CMD18 or CMD25
941 * if not, its effects are cancelled */
942 if (sd->multi_blk_cnt != 0 && !(req.cmd == 18 || req.cmd == 25)) {
943 sd->multi_blk_cnt = 0;
944 }
945
Philippe Mathieu-Daudé9157dd52020-06-03 19:59:16 +0200946 if (sd_cmd_class[req.cmd] == 6 && FIELD_EX32(sd->ocr, OCR, CARD_CAPACITY)) {
947 /* Only Standard Capacity cards support class 6 commands */
948 return sd_illegal;
949 }
950
pbrooka1bb27b2007-04-06 16:49:48 +0000951 switch (req.cmd) {
952 /* Basic commands (Class 0 and Class 1) */
953 case 0: /* CMD0: GO_IDLE_STATE */
954 switch (sd->state) {
955 case sd_inactive_state:
pbrook775616c2007-11-24 23:35:08 +0000956 return sd->spi ? sd_r1 : sd_r0;
pbrooka1bb27b2007-04-06 16:49:48 +0000957
958 default:
959 sd->state = sd_idle_state;
Peter Maydellba3ed0f2016-02-18 14:16:18 +0000960 sd_reset(DEVICE(sd));
pbrook775616c2007-11-24 23:35:08 +0000961 return sd->spi ? sd_r1 : sd_r0;
pbrooka1bb27b2007-04-06 16:49:48 +0000962 }
963 break;
964
pbrook775616c2007-11-24 23:35:08 +0000965 case 1: /* CMD1: SEND_OP_CMD */
966 if (!sd->spi)
967 goto bad_cmd;
968
969 sd->state = sd_transfer_state;
970 return sd_r1;
971
pbrooka1bb27b2007-04-06 16:49:48 +0000972 case 2: /* CMD2: ALL_SEND_CID */
pbrook775616c2007-11-24 23:35:08 +0000973 if (sd->spi)
974 goto bad_cmd;
pbrooka1bb27b2007-04-06 16:49:48 +0000975 switch (sd->state) {
976 case sd_ready_state:
977 sd->state = sd_identification_state;
978 return sd_r2_i;
979
980 default:
981 break;
982 }
983 break;
984
985 case 3: /* CMD3: SEND_RELATIVE_ADDR */
pbrook775616c2007-11-24 23:35:08 +0000986 if (sd->spi)
987 goto bad_cmd;
pbrooka1bb27b2007-04-06 16:49:48 +0000988 switch (sd->state) {
989 case sd_identification_state:
990 case sd_standby_state:
991 sd->state = sd_standby_state;
992 sd_set_rca(sd);
993 return sd_r6;
994
995 default:
996 break;
997 }
998 break;
999
1000 case 4: /* CMD4: SEND_DSR */
pbrook775616c2007-11-24 23:35:08 +00001001 if (sd->spi)
1002 goto bad_cmd;
pbrooka1bb27b2007-04-06 16:49:48 +00001003 switch (sd->state) {
1004 case sd_standby_state:
1005 break;
1006
1007 default:
1008 break;
1009 }
1010 break;
1011
Juha Riihimäki109ac322009-12-03 15:56:07 +02001012 case 5: /* CMD5: reserved for SDIO cards */
Peter Maydell53bb8cc2011-12-18 21:37:55 +01001013 return sd_illegal;
Juha Riihimäki109ac322009-12-03 15:56:07 +02001014
pbrooka1bb27b2007-04-06 16:49:48 +00001015 case 6: /* CMD6: SWITCH_FUNCTION */
1016 switch (sd->mode) {
1017 case sd_data_transfer_mode:
1018 sd_function_switch(sd, req.arg);
1019 sd->state = sd_sendingdata_state;
1020 sd->data_start = 0;
1021 sd->data_offset = 0;
1022 return sd_r1;
1023
1024 default:
1025 break;
1026 }
1027 break;
1028
1029 case 7: /* CMD7: SELECT/DESELECT_CARD */
pbrook775616c2007-11-24 23:35:08 +00001030 if (sd->spi)
1031 goto bad_cmd;
pbrooka1bb27b2007-04-06 16:49:48 +00001032 switch (sd->state) {
1033 case sd_standby_state:
1034 if (sd->rca != rca)
1035 return sd_r0;
1036
1037 sd->state = sd_transfer_state;
1038 return sd_r1b;
1039
1040 case sd_transfer_state:
1041 case sd_sendingdata_state:
1042 if (sd->rca == rca)
1043 break;
1044
1045 sd->state = sd_standby_state;
1046 return sd_r1b;
1047
1048 case sd_disconnect_state:
1049 if (sd->rca != rca)
1050 return sd_r0;
1051
1052 sd->state = sd_programming_state;
1053 return sd_r1b;
1054
1055 case sd_programming_state:
1056 if (sd->rca == rca)
1057 break;
1058
1059 sd->state = sd_disconnect_state;
1060 return sd_r1b;
1061
1062 default:
1063 break;
1064 }
1065 break;
1066
balrog1b088992007-12-24 14:41:39 +00001067 case 8: /* CMD8: SEND_IF_COND */
Philippe Mathieu-Daudéd1b32212018-06-08 13:15:34 +01001068 if (sd->spec_version < SD_PHY_SPECv2_00_VERS) {
1069 break;
1070 }
Philippe Mathieu-Daudéad0ade52018-02-22 15:12:54 +00001071 if (sd->state != sd_idle_state) {
balrog1b088992007-12-24 14:41:39 +00001072 break;
1073 }
Philippe Mathieu-Daudéad0ade52018-02-22 15:12:54 +00001074 sd->vhs = 0;
1075
1076 /* No response if not exactly one VHS bit is set. */
1077 if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) {
1078 return sd->spi ? sd_r7 : sd_r0;
1079 }
1080
1081 /* Accept. */
1082 sd->vhs = req.arg;
1083 return sd_r7;
balrog1b088992007-12-24 14:41:39 +00001084
pbrooka1bb27b2007-04-06 16:49:48 +00001085 case 9: /* CMD9: SEND_CSD */
1086 switch (sd->state) {
1087 case sd_standby_state:
1088 if (sd->rca != rca)
1089 return sd_r0;
1090
1091 return sd_r2_s;
1092
pbrook775616c2007-11-24 23:35:08 +00001093 case sd_transfer_state:
1094 if (!sd->spi)
1095 break;
1096 sd->state = sd_sendingdata_state;
1097 memcpy(sd->data, sd->csd, 16);
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001098 sd->data_start = addr;
pbrook775616c2007-11-24 23:35:08 +00001099 sd->data_offset = 0;
1100 return sd_r1;
1101
pbrooka1bb27b2007-04-06 16:49:48 +00001102 default:
1103 break;
1104 }
1105 break;
1106
1107 case 10: /* CMD10: SEND_CID */
1108 switch (sd->state) {
1109 case sd_standby_state:
1110 if (sd->rca != rca)
1111 return sd_r0;
1112
1113 return sd_r2_i;
1114
pbrook775616c2007-11-24 23:35:08 +00001115 case sd_transfer_state:
1116 if (!sd->spi)
1117 break;
1118 sd->state = sd_sendingdata_state;
1119 memcpy(sd->data, sd->cid, 16);
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001120 sd->data_start = addr;
pbrook775616c2007-11-24 23:35:08 +00001121 sd->data_offset = 0;
1122 return sd_r1;
1123
pbrooka1bb27b2007-04-06 16:49:48 +00001124 default:
1125 break;
1126 }
1127 break;
1128
pbrooka1bb27b2007-04-06 16:49:48 +00001129 case 12: /* CMD12: STOP_TRANSMISSION */
1130 switch (sd->state) {
1131 case sd_sendingdata_state:
1132 sd->state = sd_transfer_state;
1133 return sd_r1b;
1134
1135 case sd_receivingdata_state:
1136 sd->state = sd_programming_state;
1137 /* Bzzzzzzztt .... Operation complete. */
1138 sd->state = sd_transfer_state;
1139 return sd_r1b;
1140
1141 default:
1142 break;
1143 }
1144 break;
1145
1146 case 13: /* CMD13: SEND_STATUS */
1147 switch (sd->mode) {
1148 case sd_data_transfer_mode:
1149 if (sd->rca != rca)
1150 return sd_r0;
1151
1152 return sd_r1;
1153
1154 default:
1155 break;
1156 }
1157 break;
1158
1159 case 15: /* CMD15: GO_INACTIVE_STATE */
pbrook775616c2007-11-24 23:35:08 +00001160 if (sd->spi)
1161 goto bad_cmd;
pbrooka1bb27b2007-04-06 16:49:48 +00001162 switch (sd->mode) {
1163 case sd_data_transfer_mode:
1164 if (sd->rca != rca)
1165 return sd_r0;
1166
1167 sd->state = sd_inactive_state;
1168 return sd_r0;
1169
1170 default:
1171 break;
1172 }
1173 break;
1174
1175 /* Block read commands (Classs 2) */
1176 case 16: /* CMD16: SET_BLOCKLEN */
1177 switch (sd->state) {
1178 case sd_transfer_state:
Philippe Mathieu-Daudé814b2ad2018-02-22 15:12:52 +00001179 if (req.arg > (1 << HWBLOCK_SHIFT)) {
pbrooka1bb27b2007-04-06 16:49:48 +00001180 sd->card_status |= BLOCK_LEN_ERROR;
Philippe Mathieu-Daudé814b2ad2018-02-22 15:12:52 +00001181 } else {
1182 trace_sdcard_set_blocklen(req.arg);
pbrooka1bb27b2007-04-06 16:49:48 +00001183 sd->blk_len = req.arg;
Philippe Mathieu-Daudé814b2ad2018-02-22 15:12:52 +00001184 }
pbrooka1bb27b2007-04-06 16:49:48 +00001185
1186 return sd_r1;
1187
1188 default:
1189 break;
1190 }
1191 break;
1192
1193 case 17: /* CMD17: READ_SINGLE_BLOCK */
1194 switch (sd->state) {
1195 case sd_transfer_state:
Philippe Mathieu-Daudé790762e2020-06-04 19:22:29 +02001196
1197 if (addr + sd->blk_len > sd->size) {
1198 sd->card_status |= ADDRESS_ERROR;
1199 return sd_r1;
1200 }
1201
pbrooka1bb27b2007-04-06 16:49:48 +00001202 sd->state = sd_sendingdata_state;
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001203 sd->data_start = addr;
pbrooka1bb27b2007-04-06 16:49:48 +00001204 sd->data_offset = 0;
pbrooka1bb27b2007-04-06 16:49:48 +00001205 return sd_r1;
1206
1207 default:
1208 break;
1209 }
1210 break;
1211
1212 case 18: /* CMD18: READ_MULTIPLE_BLOCK */
1213 switch (sd->state) {
1214 case sd_transfer_state:
Philippe Mathieu-Daudé790762e2020-06-04 19:22:29 +02001215
1216 if (addr + sd->blk_len > sd->size) {
1217 sd->card_status |= ADDRESS_ERROR;
1218 return sd_r1;
1219 }
1220
pbrooka1bb27b2007-04-06 16:49:48 +00001221 sd->state = sd_sendingdata_state;
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001222 sd->data_start = addr;
pbrooka1bb27b2007-04-06 16:49:48 +00001223 sd->data_offset = 0;
pbrooka1bb27b2007-04-06 16:49:48 +00001224 return sd_r1;
1225
1226 default:
1227 break;
1228 }
1229 break;
1230
Philippe Mathieu-Daudé0c3fb032018-03-09 17:09:44 +00001231 case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
Philippe Mathieu-Daudé113f31c2018-06-08 13:15:34 +01001232 if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
1233 break;
1234 }
Philippe Mathieu-Daudé0c3fb032018-03-09 17:09:44 +00001235 if (sd->state == sd_transfer_state) {
1236 sd->state = sd_sendingdata_state;
1237 sd->data_offset = 0;
1238 return sd_r1;
1239 }
1240 break;
1241
Andrew Baumann4481bbc2016-02-18 14:16:19 +00001242 case 23: /* CMD23: SET_BLOCK_COUNT */
Philippe Mathieu-Daudé113f31c2018-06-08 13:15:34 +01001243 if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
1244 break;
1245 }
Andrew Baumann4481bbc2016-02-18 14:16:19 +00001246 switch (sd->state) {
1247 case sd_transfer_state:
1248 sd->multi_blk_cnt = req.arg;
1249 return sd_r1;
1250
1251 default:
1252 break;
1253 }
1254 break;
1255
pbrooka1bb27b2007-04-06 16:49:48 +00001256 /* Block write commands (Class 4) */
1257 case 24: /* CMD24: WRITE_SINGLE_BLOCK */
1258 switch (sd->state) {
1259 case sd_transfer_state:
pbrook775616c2007-11-24 23:35:08 +00001260 /* Writing in SPI mode not implemented. */
1261 if (sd->spi)
1262 break;
Philippe Mathieu-Daudé790762e2020-06-04 19:22:29 +02001263
1264 if (addr + sd->blk_len > sd->size) {
1265 sd->card_status |= ADDRESS_ERROR;
1266 return sd_r1;
1267 }
1268
pbrooka1bb27b2007-04-06 16:49:48 +00001269 sd->state = sd_receivingdata_state;
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001270 sd->data_start = addr;
pbrooka1bb27b2007-04-06 16:49:48 +00001271 sd->data_offset = 0;
1272 sd->blk_written = 0;
1273
Philippe Mathieu-Daudé794d68d2020-07-13 09:27:35 +02001274 if (sd_wp_addr(sd, sd->data_start)) {
pbrooka1bb27b2007-04-06 16:49:48 +00001275 sd->card_status |= WP_VIOLATION;
Philippe Mathieu-Daudé794d68d2020-07-13 09:27:35 +02001276 }
1277 if (sd->csd[14] & 0x30) {
pbrooka1bb27b2007-04-06 16:49:48 +00001278 sd->card_status |= WP_VIOLATION;
Philippe Mathieu-Daudé794d68d2020-07-13 09:27:35 +02001279 }
pbrooka1bb27b2007-04-06 16:49:48 +00001280 return sd_r1;
1281
1282 default:
1283 break;
1284 }
1285 break;
1286
1287 case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
1288 switch (sd->state) {
1289 case sd_transfer_state:
pbrook775616c2007-11-24 23:35:08 +00001290 /* Writing in SPI mode not implemented. */
1291 if (sd->spi)
1292 break;
Philippe Mathieu-Daudé790762e2020-06-04 19:22:29 +02001293
1294 if (addr + sd->blk_len > sd->size) {
1295 sd->card_status |= ADDRESS_ERROR;
1296 return sd_r1;
1297 }
1298
pbrooka1bb27b2007-04-06 16:49:48 +00001299 sd->state = sd_receivingdata_state;
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001300 sd->data_start = addr;
pbrooka1bb27b2007-04-06 16:49:48 +00001301 sd->data_offset = 0;
1302 sd->blk_written = 0;
1303
Philippe Mathieu-Daudé794d68d2020-07-13 09:27:35 +02001304 if (sd_wp_addr(sd, sd->data_start)) {
pbrooka1bb27b2007-04-06 16:49:48 +00001305 sd->card_status |= WP_VIOLATION;
Philippe Mathieu-Daudé794d68d2020-07-13 09:27:35 +02001306 }
1307 if (sd->csd[14] & 0x30) {
pbrooka1bb27b2007-04-06 16:49:48 +00001308 sd->card_status |= WP_VIOLATION;
Philippe Mathieu-Daudé794d68d2020-07-13 09:27:35 +02001309 }
pbrooka1bb27b2007-04-06 16:49:48 +00001310 return sd_r1;
1311
1312 default:
1313 break;
1314 }
1315 break;
1316
1317 case 26: /* CMD26: PROGRAM_CID */
pbrook775616c2007-11-24 23:35:08 +00001318 if (sd->spi)
1319 goto bad_cmd;
pbrooka1bb27b2007-04-06 16:49:48 +00001320 switch (sd->state) {
1321 case sd_transfer_state:
1322 sd->state = sd_receivingdata_state;
1323 sd->data_start = 0;
1324 sd->data_offset = 0;
1325 return sd_r1;
1326
1327 default:
1328 break;
1329 }
1330 break;
1331
1332 case 27: /* CMD27: PROGRAM_CSD */
1333 switch (sd->state) {
1334 case sd_transfer_state:
1335 sd->state = sd_receivingdata_state;
1336 sd->data_start = 0;
1337 sd->data_offset = 0;
1338 return sd_r1;
1339
1340 default:
1341 break;
1342 }
1343 break;
1344
1345 /* Write protection (Class 6) */
1346 case 28: /* CMD28: SET_WRITE_PROT */
1347 switch (sd->state) {
1348 case sd_transfer_state:
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001349 if (addr >= sd->size) {
Peter Maydelle30d5932011-12-18 21:37:54 +01001350 sd->card_status |= ADDRESS_ERROR;
pbrooka1bb27b2007-04-06 16:49:48 +00001351 return sd_r1b;
1352 }
1353
1354 sd->state = sd_programming_state;
Mitsyanko Igorb7202b82012-08-13 11:04:06 +01001355 set_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
pbrooka1bb27b2007-04-06 16:49:48 +00001356 /* Bzzzzzzztt .... Operation complete. */
1357 sd->state = sd_transfer_state;
1358 return sd_r1b;
1359
1360 default:
1361 break;
1362 }
1363 break;
1364
1365 case 29: /* CMD29: CLR_WRITE_PROT */
1366 switch (sd->state) {
1367 case sd_transfer_state:
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001368 if (addr >= sd->size) {
Peter Maydelle30d5932011-12-18 21:37:54 +01001369 sd->card_status |= ADDRESS_ERROR;
pbrooka1bb27b2007-04-06 16:49:48 +00001370 return sd_r1b;
1371 }
1372
1373 sd->state = sd_programming_state;
Mitsyanko Igorb7202b82012-08-13 11:04:06 +01001374 clear_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
pbrooka1bb27b2007-04-06 16:49:48 +00001375 /* Bzzzzzzztt .... Operation complete. */
1376 sd->state = sd_transfer_state;
1377 return sd_r1b;
1378
1379 default:
1380 break;
1381 }
1382 break;
1383
1384 case 30: /* CMD30: SEND_WRITE_PROT */
1385 switch (sd->state) {
1386 case sd_transfer_state:
1387 sd->state = sd_sendingdata_state;
1388 *(uint32_t *) sd->data = sd_wpbits(sd, req.arg);
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001389 sd->data_start = addr;
pbrooka1bb27b2007-04-06 16:49:48 +00001390 sd->data_offset = 0;
1391 return sd_r1b;
1392
1393 default:
1394 break;
1395 }
1396 break;
1397
1398 /* Erase commands (Class 5) */
1399 case 32: /* CMD32: ERASE_WR_BLK_START */
1400 switch (sd->state) {
1401 case sd_transfer_state:
1402 sd->erase_start = req.arg;
1403 return sd_r1;
1404
1405 default:
1406 break;
1407 }
1408 break;
1409
1410 case 33: /* CMD33: ERASE_WR_BLK_END */
1411 switch (sd->state) {
1412 case sd_transfer_state:
1413 sd->erase_end = req.arg;
1414 return sd_r1;
1415
1416 default:
1417 break;
1418 }
1419 break;
1420
1421 case 38: /* CMD38: ERASE */
1422 switch (sd->state) {
1423 case sd_transfer_state:
1424 if (sd->csd[14] & 0x30) {
1425 sd->card_status |= WP_VIOLATION;
1426 return sd_r1b;
1427 }
1428
1429 sd->state = sd_programming_state;
1430 sd_erase(sd);
1431 /* Bzzzzzzztt .... Operation complete. */
1432 sd->state = sd_transfer_state;
1433 return sd_r1b;
1434
1435 default:
1436 break;
1437 }
1438 break;
1439
1440 /* Lock card commands (Class 7) */
1441 case 42: /* CMD42: LOCK_UNLOCK */
1442 switch (sd->state) {
1443 case sd_transfer_state:
1444 sd->state = sd_receivingdata_state;
1445 sd->data_start = 0;
1446 sd->data_offset = 0;
1447 return sd_r1;
1448
1449 default:
1450 break;
1451 }
1452 break;
1453
Philippe Mathieu-Daudé49fb7382018-02-22 15:12:53 +00001454 case 52 ... 54:
1455 /* CMD52, CMD53, CMD54: reserved for SDIO cards
Peter Maydell39e594d2011-05-20 10:11:53 +01001456 * (see the SDIO Simplified Specification V2.0)
1457 * Handle as illegal command but do not complain
1458 * on stderr, as some OSes may use these in their
1459 * probing for presence of an SDIO card.
1460 */
Peter Maydell53bb8cc2011-12-18 21:37:55 +01001461 return sd_illegal;
Peter Maydell39e594d2011-05-20 10:11:53 +01001462
pbrooka1bb27b2007-04-06 16:49:48 +00001463 /* Application specific commands (Class 8) */
1464 case 55: /* CMD55: APP_CMD */
Philippe Mathieu-Daudéd6911482018-02-22 15:12:54 +00001465 switch (sd->state) {
1466 case sd_ready_state:
1467 case sd_identification_state:
1468 case sd_inactive_state:
1469 return sd_illegal;
Philippe Mathieu-Daudé31162802018-02-22 15:12:54 +00001470 case sd_idle_state:
1471 if (rca) {
1472 qemu_log_mask(LOG_GUEST_ERROR,
1473 "SD: illegal RCA 0x%04x for APP_CMD\n", req.cmd);
1474 }
Philippe Mathieu-Daudéd6911482018-02-22 15:12:54 +00001475 default:
1476 break;
1477 }
Philippe Mathieu-Daudé946897c2018-02-22 15:12:53 +00001478 if (!sd->spi) {
1479 if (sd->rca != rca) {
1480 return sd_r0;
1481 }
1482 }
Mitsyanko Igorbebd1272012-08-13 11:04:06 +01001483 sd->expecting_acmd = true;
pbrooka1bb27b2007-04-06 16:49:48 +00001484 sd->card_status |= APP_CMD;
1485 return sd_r1;
1486
1487 case 56: /* CMD56: GEN_CMD */
pbrooka1bb27b2007-04-06 16:49:48 +00001488 switch (sd->state) {
1489 case sd_transfer_state:
1490 sd->data_offset = 0;
1491 if (req.arg & 1)
1492 sd->state = sd_sendingdata_state;
1493 else
1494 sd->state = sd_receivingdata_state;
1495 return sd_r1;
1496
1497 default:
1498 break;
1499 }
1500 break;
1501
Philippe Mathieu-Daudé946897c2018-02-22 15:12:53 +00001502 case 58: /* CMD58: READ_OCR (SPI) */
1503 if (!sd->spi) {
1504 goto bad_cmd;
1505 }
1506 return sd_r3;
1507
1508 case 59: /* CMD59: CRC_ON_OFF (SPI) */
1509 if (!sd->spi) {
1510 goto bad_cmd;
1511 }
1512 goto unimplemented_spi_cmd;
1513
pbrooka1bb27b2007-04-06 16:49:48 +00001514 default:
pbrook775616c2007-11-24 23:35:08 +00001515 bad_cmd:
Andrew Baumann9800ad82016-02-18 14:16:20 +00001516 qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
Peter Maydell53bb8cc2011-12-18 21:37:55 +01001517 return sd_illegal;
pbrook775616c2007-11-24 23:35:08 +00001518
Philippe Mathieu-Daudéa2120862018-02-22 15:12:53 +00001519 unimplemented_spi_cmd:
pbrook775616c2007-11-24 23:35:08 +00001520 /* Commands that are recognised but not yet implemented in SPI mode. */
Andrew Baumann9800ad82016-02-18 14:16:20 +00001521 qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
1522 req.cmd);
Peter Maydell53bb8cc2011-12-18 21:37:55 +01001523 return sd_illegal;
pbrooka1bb27b2007-04-06 16:49:48 +00001524 }
1525
Andrew Baumann9800ad82016-02-18 14:16:20 +00001526 qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state\n", req.cmd);
Peter Maydell53bb8cc2011-12-18 21:37:55 +01001527 return sd_illegal;
pbrooka1bb27b2007-04-06 16:49:48 +00001528}
1529
Anthony Liguoric227f092009-10-01 16:12:16 -05001530static sd_rsp_type_t sd_app_command(SDState *sd,
Blue Swirl22ed1d342010-04-25 19:31:06 +00001531 SDRequest req)
1532{
Philippe Mathieu-Daudé75a96f52018-03-09 17:09:44 +00001533 trace_sdcard_app_command(sd->proto_name, sd_acmd_name(req.cmd),
Philippe Mathieu-Daudé2ed61fb2018-03-09 17:09:44 +00001534 req.cmd, req.arg, sd_state_name(sd->state));
Peter Maydell1d06cb72011-12-18 21:37:59 +01001535 sd->card_status |= APP_CMD;
pbrooka1bb27b2007-04-06 16:49:48 +00001536 switch (req.cmd) {
1537 case 6: /* ACMD6: SET_BUS_WIDTH */
Philippe Mathieu-Daudé946897c2018-02-22 15:12:53 +00001538 if (sd->spi) {
1539 goto unimplemented_spi_cmd;
1540 }
pbrooka1bb27b2007-04-06 16:49:48 +00001541 switch (sd->state) {
1542 case sd_transfer_state:
1543 sd->sd_status[0] &= 0x3f;
1544 sd->sd_status[0] |= (req.arg & 0x03) << 6;
1545 return sd_r1;
1546
1547 default:
1548 break;
1549 }
1550 break;
1551
1552 case 13: /* ACMD13: SD_STATUS */
1553 switch (sd->state) {
1554 case sd_transfer_state:
Peter Maydellfb1ba032011-02-18 13:39:00 +00001555 sd->state = sd_sendingdata_state;
pbrooka1bb27b2007-04-06 16:49:48 +00001556 sd->data_start = 0;
1557 sd->data_offset = 0;
1558 return sd_r1;
1559
1560 default:
1561 break;
1562 }
1563 break;
1564
1565 case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */
1566 switch (sd->state) {
1567 case sd_transfer_state:
1568 *(uint32_t *) sd->data = sd->blk_written;
1569
Peter Maydellfb1ba032011-02-18 13:39:00 +00001570 sd->state = sd_sendingdata_state;
pbrooka1bb27b2007-04-06 16:49:48 +00001571 sd->data_start = 0;
1572 sd->data_offset = 0;
1573 return sd_r1;
1574
1575 default:
1576 break;
1577 }
1578 break;
1579
1580 case 23: /* ACMD23: SET_WR_BLK_ERASE_COUNT */
1581 switch (sd->state) {
1582 case sd_transfer_state:
1583 return sd_r1;
1584
1585 default:
1586 break;
1587 }
1588 break;
1589
1590 case 41: /* ACMD41: SD_APP_OP_COND */
pbrook775616c2007-11-24 23:35:08 +00001591 if (sd->spi) {
1592 /* SEND_OP_CMD */
1593 sd->state = sd_transfer_state;
1594 return sd_r1;
1595 }
Philippe Mathieu-Daudé4e5cc672018-02-22 15:12:54 +00001596 if (sd->state != sd_idle_state) {
1597 break;
1598 }
1599 /* If it's the first ACMD41 since reset, we need to decide
1600 * whether to power up. If this is not an enquiry ACMD41,
1601 * we immediately report power on and proceed below to the
1602 * ready state, but if it is, we set a timer to model a
1603 * delay for power up. This works around a bug in EDK2
1604 * UEFI, which sends an initial enquiry ACMD41, but
1605 * assumes that the card is in ready state as soon as it
1606 * sees the power up bit set. */
1607 if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) {
1608 if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
1609 timer_del(sd->ocr_power_timer);
1610 sd_ocr_powerup(sd);
1611 } else {
1612 trace_sdcard_inquiry_cmd41();
1613 if (!timer_pending(sd->ocr_power_timer)) {
1614 timer_mod_ns(sd->ocr_power_timer,
1615 (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
1616 + OCR_POWER_DELAY_NS));
Andrew Baumanndd26eb42016-02-18 14:16:20 +00001617 }
1618 }
Philippe Mathieu-Daudé4e5cc672018-02-22 15:12:54 +00001619 }
Andrew Baumanndd26eb42016-02-18 14:16:20 +00001620
Philippe Mathieu-Daudé4e5cc672018-02-22 15:12:54 +00001621 if (FIELD_EX32(sd->ocr & req.arg, OCR, VDD_VOLTAGE_WINDOW)) {
Peter Crosthwaite37ab4a52013-06-03 17:17:45 +01001622 /* We accept any voltage. 10000 V is nothing.
1623 *
Andrew Baumanndd26eb42016-02-18 14:16:20 +00001624 * Once we're powered up, we advance straight to ready state
Peter Crosthwaite37ab4a52013-06-03 17:17:45 +01001625 * unless it's an enquiry ACMD41 (bits 23:0 == 0).
1626 */
Philippe Mathieu-Daudé4e5cc672018-02-22 15:12:54 +00001627 sd->state = sd_ready_state;
pbrooka1bb27b2007-04-06 16:49:48 +00001628 }
Philippe Mathieu-Daudé4e5cc672018-02-22 15:12:54 +00001629
1630 return sd_r3;
pbrooka1bb27b2007-04-06 16:49:48 +00001631
1632 case 42: /* ACMD42: SET_CLR_CARD_DETECT */
1633 switch (sd->state) {
1634 case sd_transfer_state:
1635 /* Bringing in the 50KOhm pull-up resistor... Done. */
1636 return sd_r1;
1637
1638 default:
1639 break;
1640 }
1641 break;
1642
1643 case 51: /* ACMD51: SEND_SCR */
1644 switch (sd->state) {
1645 case sd_transfer_state:
1646 sd->state = sd_sendingdata_state;
1647 sd->data_start = 0;
1648 sd->data_offset = 0;
1649 return sd_r1;
1650
1651 default:
1652 break;
1653 }
1654 break;
1655
Philippe Mathieu-Daudé688491c2018-02-22 15:12:53 +00001656 case 18: /* Reserved for SD security applications */
1657 case 25:
1658 case 26:
1659 case 38:
1660 case 43 ... 49:
1661 /* Refer to the "SD Specifications Part3 Security Specification" for
1662 * information about the SD Security Features.
1663 */
1664 qemu_log_mask(LOG_UNIMP, "SD: CMD%i Security not implemented\n",
1665 req.cmd);
1666 return sd_illegal;
1667
pbrooka1bb27b2007-04-06 16:49:48 +00001668 default:
1669 /* Fall back to standard commands. */
pbrooka1bb27b2007-04-06 16:49:48 +00001670 return sd_normal_command(sd, req);
Philippe Mathieu-Daudé946897c2018-02-22 15:12:53 +00001671
1672 unimplemented_spi_cmd:
1673 /* Commands that are recognised but not yet implemented in SPI mode. */
1674 qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
1675 req.cmd);
1676 return sd_illegal;
pbrooka1bb27b2007-04-06 16:49:48 +00001677 }
1678
Andrew Baumann9800ad82016-02-18 14:16:20 +00001679 qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
Peter Maydell5b08bfe2011-12-18 21:37:57 +01001680 return sd_illegal;
pbrooka1bb27b2007-04-06 16:49:48 +00001681}
1682
Philippe Mathieu-Daudéef6dd5f2018-06-26 14:46:44 -03001683static int cmd_valid_while_locked(SDState *sd, const uint8_t cmd)
Peter Maydell25881d32011-12-18 21:37:51 +01001684{
1685 /* Valid commands in locked state:
1686 * basic class (0)
1687 * lock card class (7)
1688 * CMD16
1689 * implicitly, the ACMD prefix CMD55
1690 * ACMD41 and ACMD42
1691 * Anything else provokes an "illegal command" response.
1692 */
Peter Maydell1d06cb72011-12-18 21:37:59 +01001693 if (sd->expecting_acmd) {
Philippe Mathieu-Daudéef6dd5f2018-06-26 14:46:44 -03001694 return cmd == 41 || cmd == 42;
Peter Maydell25881d32011-12-18 21:37:51 +01001695 }
Philippe Mathieu-Daudéef6dd5f2018-06-26 14:46:44 -03001696 if (cmd == 16 || cmd == 55) {
Peter Maydell25881d32011-12-18 21:37:51 +01001697 return 1;
1698 }
Philippe Mathieu-Daudéef6dd5f2018-06-26 14:46:44 -03001699 return sd_cmd_class[cmd] == 0 || sd_cmd_class[cmd] == 7;
Peter Maydell25881d32011-12-18 21:37:51 +01001700}
1701
Paul Brookbc24a222009-05-10 01:44:56 +01001702int sd_do_command(SDState *sd, SDRequest *req,
pbrooka1bb27b2007-04-06 16:49:48 +00001703 uint8_t *response) {
Peter Maydell10a412d2011-12-18 21:37:58 +01001704 int last_state;
Anthony Liguoric227f092009-10-01 16:12:16 -05001705 sd_rsp_type_t rtype;
pbrooka1bb27b2007-04-06 16:49:48 +00001706 int rsplen;
1707
Markus Armbruster4be74632014-10-07 13:59:18 +02001708 if (!sd->blk || !blk_is_inserted(sd->blk) || !sd->enable) {
pbrooka1bb27b2007-04-06 16:49:48 +00001709 return 0;
1710 }
1711
1712 if (sd_req_crc_validate(req)) {
Peter Maydellabda1f32011-12-18 21:37:53 +01001713 sd->card_status |= COM_CRC_ERROR;
Peter Maydellb1f517e2011-12-18 21:37:56 +01001714 rtype = sd_illegal;
1715 goto send_response;
pbrooka1bb27b2007-04-06 16:49:48 +00001716 }
1717
Philippe Mathieu-Daudéf2500152018-02-22 15:12:52 +00001718 if (req->cmd >= SDMMC_CMD_MAX) {
1719 qemu_log_mask(LOG_GUEST_ERROR, "SD: incorrect command 0x%02x\n",
1720 req->cmd);
1721 req->cmd &= 0x3f;
1722 }
1723
Peter Maydell10a412d2011-12-18 21:37:58 +01001724 if (sd->card_status & CARD_IS_LOCKED) {
Philippe Mathieu-Daudéef6dd5f2018-06-26 14:46:44 -03001725 if (!cmd_valid_while_locked(sd, req->cmd)) {
pbrooka1bb27b2007-04-06 16:49:48 +00001726 sd->card_status |= ILLEGAL_COMMAND;
Mitsyanko Igorbebd1272012-08-13 11:04:06 +01001727 sd->expecting_acmd = false;
Andrew Baumann9800ad82016-02-18 14:16:20 +00001728 qemu_log_mask(LOG_GUEST_ERROR, "SD: Card is locked\n");
Peter Maydellb1f517e2011-12-18 21:37:56 +01001729 rtype = sd_illegal;
1730 goto send_response;
pbrooka1bb27b2007-04-06 16:49:48 +00001731 }
Peter Maydell25881d32011-12-18 21:37:51 +01001732 }
pbrooka1bb27b2007-04-06 16:49:48 +00001733
Peter Maydell10a412d2011-12-18 21:37:58 +01001734 last_state = sd->state;
1735 sd_set_mode(sd);
1736
Peter Maydell1d06cb72011-12-18 21:37:59 +01001737 if (sd->expecting_acmd) {
Mitsyanko Igorbebd1272012-08-13 11:04:06 +01001738 sd->expecting_acmd = false;
pbrooka1bb27b2007-04-06 16:49:48 +00001739 rtype = sd_app_command(sd, *req);
Peter Maydell1d06cb72011-12-18 21:37:59 +01001740 } else {
pbrooka1bb27b2007-04-06 16:49:48 +00001741 rtype = sd_normal_command(sd, *req);
Peter Maydell1d06cb72011-12-18 21:37:59 +01001742 }
pbrooka1bb27b2007-04-06 16:49:48 +00001743
Peter Maydell53bb8cc2011-12-18 21:37:55 +01001744 if (rtype == sd_illegal) {
1745 sd->card_status |= ILLEGAL_COMMAND;
Peter Maydell10a412d2011-12-18 21:37:58 +01001746 } else {
1747 /* Valid command, we can update the 'state before command' bits.
1748 * (Do this now so they appear in r1 responses.)
1749 */
1750 sd->current_cmd = req->cmd;
1751 sd->card_status &= ~CURRENT_STATE;
1752 sd->card_status |= (last_state << 9);
Peter Maydell53bb8cc2011-12-18 21:37:55 +01001753 }
1754
Peter Maydellb1f517e2011-12-18 21:37:56 +01001755send_response:
pbrooka1bb27b2007-04-06 16:49:48 +00001756 switch (rtype) {
1757 case sd_r1:
1758 case sd_r1b:
Peter Maydell10a412d2011-12-18 21:37:58 +01001759 sd_response_r1_make(sd, response);
pbrooka1bb27b2007-04-06 16:49:48 +00001760 rsplen = 4;
1761 break;
1762
1763 case sd_r2_i:
1764 memcpy(response, sd->cid, sizeof(sd->cid));
pbrooka1bb27b2007-04-06 16:49:48 +00001765 rsplen = 16;
1766 break;
1767
1768 case sd_r2_s:
1769 memcpy(response, sd->csd, sizeof(sd->csd));
pbrooka1bb27b2007-04-06 16:49:48 +00001770 rsplen = 16;
1771 break;
1772
1773 case sd_r3:
1774 sd_response_r3_make(sd, response);
1775 rsplen = 4;
1776 break;
1777
1778 case sd_r6:
1779 sd_response_r6_make(sd, response);
1780 rsplen = 4;
1781 break;
1782
balrog1b088992007-12-24 14:41:39 +00001783 case sd_r7:
1784 sd_response_r7_make(sd, response);
1785 rsplen = 4;
1786 break;
1787
pbrooka1bb27b2007-04-06 16:49:48 +00001788 case sd_r0:
Peter Maydell53bb8cc2011-12-18 21:37:55 +01001789 case sd_illegal:
pbrooka1bb27b2007-04-06 16:49:48 +00001790 rsplen = 0;
1791 break;
Philippe Mathieu-Daudé55921932018-02-22 15:12:52 +00001792 default:
1793 g_assert_not_reached();
pbrooka1bb27b2007-04-06 16:49:48 +00001794 }
Philippe Mathieu-Daudé55921932018-02-22 15:12:52 +00001795 trace_sdcard_response(sd_response_name(rtype), rsplen);
pbrooka1bb27b2007-04-06 16:49:48 +00001796
Peter Maydell10a412d2011-12-18 21:37:58 +01001797 if (rtype != sd_illegal) {
1798 /* Clear the "clear on valid command" status bits now we've
1799 * sent any response
1800 */
1801 sd->card_status &= ~CARD_STATUS_B;
1802 }
1803
pbrooka1bb27b2007-04-06 16:49:48 +00001804#ifdef DEBUG_SD
Philippe Mathieu-Daudéb42581f2020-08-22 20:09:50 +02001805 qemu_hexdump(stderr, "Response", response, rsplen);
pbrooka1bb27b2007-04-06 16:49:48 +00001806#endif
1807
1808 return rsplen;
1809}
1810
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001811static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
pbrooka1bb27b2007-04-06 16:49:48 +00001812{
Philippe Mathieu-Daudé1b640aa2018-02-22 15:12:52 +00001813 trace_sdcard_read_block(addr, len);
Eric Blake12c125c2016-05-06 10:26:39 -06001814 if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
balrog827df9f2008-04-14 21:05:22 +00001815 fprintf(stderr, "sd_blk_read: read error on host side\n");
pbrooka1bb27b2007-04-06 16:49:48 +00001816 }
pbrooka1bb27b2007-04-06 16:49:48 +00001817}
1818
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01001819static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
pbrooka1bb27b2007-04-06 16:49:48 +00001820{
Philippe Mathieu-Daudé1b640aa2018-02-22 15:12:52 +00001821 trace_sdcard_write_block(addr, len);
Eric Blake12c125c2016-05-06 10:26:39 -06001822 if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
1823 fprintf(stderr, "sd_blk_write: write error on host side\n");
pbrooka1bb27b2007-04-06 16:49:48 +00001824 }
1825}
1826
balrog33f00272007-12-24 14:33:24 +00001827#define BLK_READ_BLOCK(a, len) sd_blk_read(sd, a, len)
1828#define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd, a, len)
pbrooka1bb27b2007-04-06 16:49:48 +00001829#define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
1830#define APP_WRITE_BLOCK(a, len)
1831
Philippe Mathieu-Daudéc769a882020-08-14 11:23:40 +02001832void sd_write_byte(SDState *sd, uint8_t value)
pbrooka1bb27b2007-04-06 16:49:48 +00001833{
1834 int i;
1835
Markus Armbruster4be74632014-10-07 13:59:18 +02001836 if (!sd->blk || !blk_is_inserted(sd->blk) || !sd->enable)
pbrooka1bb27b2007-04-06 16:49:48 +00001837 return;
1838
1839 if (sd->state != sd_receivingdata_state) {
Andrew Baumann9800ad82016-02-18 14:16:20 +00001840 qemu_log_mask(LOG_GUEST_ERROR,
Philippe Mathieu-Daudéc769a882020-08-14 11:23:40 +02001841 "%s: not in Receiving-Data state\n", __func__);
pbrooka1bb27b2007-04-06 16:49:48 +00001842 return;
1843 }
1844
1845 if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1846 return;
1847
Philippe Mathieu-Daudé75a96f52018-03-09 17:09:44 +00001848 trace_sdcard_write_data(sd->proto_name,
1849 sd_acmd_name(sd->current_cmd),
Philippe Mathieu-Daudé2ed61fb2018-03-09 17:09:44 +00001850 sd->current_cmd, value);
pbrooka1bb27b2007-04-06 16:49:48 +00001851 switch (sd->current_cmd) {
1852 case 24: /* CMD24: WRITE_SINGLE_BLOCK */
1853 sd->data[sd->data_offset ++] = value;
1854 if (sd->data_offset >= sd->blk_len) {
1855 /* TODO: Check CRC before committing */
1856 sd->state = sd_programming_state;
1857 BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1858 sd->blk_written ++;
1859 sd->csd[14] |= 0x40;
1860 /* Bzzzzzzztt .... Operation complete. */
1861 sd->state = sd_transfer_state;
1862 }
1863 break;
1864
1865 case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
Dr. David Alan Gilbert33fa8232011-07-25 13:21:30 +01001866 if (sd->data_offset == 0) {
Peter Maydelle03ba132013-04-09 12:48:19 +01001867 /* Start of the block - let's check the address is valid */
pbrooka1bb27b2007-04-06 16:49:48 +00001868 if (sd->data_start + sd->blk_len > sd->size) {
1869 sd->card_status |= ADDRESS_ERROR;
1870 break;
1871 }
1872 if (sd_wp_addr(sd, sd->data_start)) {
1873 sd->card_status |= WP_VIOLATION;
1874 break;
1875 }
Dr. David Alan Gilbert33fa8232011-07-25 13:21:30 +01001876 }
1877 sd->data[sd->data_offset++] = value;
1878 if (sd->data_offset >= sd->blk_len) {
1879 /* TODO: Check CRC before committing */
1880 sd->state = sd_programming_state;
1881 BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1882 sd->blk_written++;
1883 sd->data_start += sd->blk_len;
1884 sd->data_offset = 0;
pbrooka1bb27b2007-04-06 16:49:48 +00001885 sd->csd[14] |= 0x40;
1886
1887 /* Bzzzzzzztt .... Operation complete. */
Andrew Baumann4481bbc2016-02-18 14:16:19 +00001888 if (sd->multi_blk_cnt != 0) {
1889 if (--sd->multi_blk_cnt == 0) {
1890 /* Stop! */
1891 sd->state = sd_transfer_state;
1892 break;
1893 }
1894 }
1895
pbrooka1bb27b2007-04-06 16:49:48 +00001896 sd->state = sd_receivingdata_state;
1897 }
1898 break;
1899
1900 case 26: /* CMD26: PROGRAM_CID */
1901 sd->data[sd->data_offset ++] = value;
1902 if (sd->data_offset >= sizeof(sd->cid)) {
1903 /* TODO: Check CRC before committing */
1904 sd->state = sd_programming_state;
1905 for (i = 0; i < sizeof(sd->cid); i ++)
1906 if ((sd->cid[i] | 0x00) != sd->data[i])
1907 sd->card_status |= CID_CSD_OVERWRITE;
1908
1909 if (!(sd->card_status & CID_CSD_OVERWRITE))
1910 for (i = 0; i < sizeof(sd->cid); i ++) {
1911 sd->cid[i] |= 0x00;
1912 sd->cid[i] &= sd->data[i];
1913 }
1914 /* Bzzzzzzztt .... Operation complete. */
1915 sd->state = sd_transfer_state;
1916 }
1917 break;
1918
1919 case 27: /* CMD27: PROGRAM_CSD */
1920 sd->data[sd->data_offset ++] = value;
1921 if (sd->data_offset >= sizeof(sd->csd)) {
1922 /* TODO: Check CRC before committing */
1923 sd->state = sd_programming_state;
1924 for (i = 0; i < sizeof(sd->csd); i ++)
1925 if ((sd->csd[i] | sd_csd_rw_mask[i]) !=
1926 (sd->data[i] | sd_csd_rw_mask[i]))
1927 sd->card_status |= CID_CSD_OVERWRITE;
1928
1929 /* Copy flag (OTP) & Permanent write protect */
1930 if (sd->csd[14] & ~sd->data[14] & 0x60)
1931 sd->card_status |= CID_CSD_OVERWRITE;
1932
1933 if (!(sd->card_status & CID_CSD_OVERWRITE))
1934 for (i = 0; i < sizeof(sd->csd); i ++) {
1935 sd->csd[i] |= sd_csd_rw_mask[i];
1936 sd->csd[i] &= sd->data[i];
1937 }
1938 /* Bzzzzzzztt .... Operation complete. */
1939 sd->state = sd_transfer_state;
1940 }
1941 break;
1942
1943 case 42: /* CMD42: LOCK_UNLOCK */
1944 sd->data[sd->data_offset ++] = value;
1945 if (sd->data_offset >= sd->blk_len) {
1946 /* TODO: Check CRC before committing */
1947 sd->state = sd_programming_state;
1948 sd_lock_command(sd);
1949 /* Bzzzzzzztt .... Operation complete. */
1950 sd->state = sd_transfer_state;
1951 }
1952 break;
1953
1954 case 56: /* CMD56: GEN_CMD */
1955 sd->data[sd->data_offset ++] = value;
1956 if (sd->data_offset >= sd->blk_len) {
1957 APP_WRITE_BLOCK(sd->data_start, sd->data_offset);
1958 sd->state = sd_transfer_state;
1959 }
1960 break;
1961
1962 default:
Philippe Mathieu-Daudéc769a882020-08-14 11:23:40 +02001963 qemu_log_mask(LOG_GUEST_ERROR, "%s: unknown command\n", __func__);
pbrooka1bb27b2007-04-06 16:49:48 +00001964 break;
1965 }
1966}
1967
Philippe Mathieu-Daudé0c3fb032018-03-09 17:09:44 +00001968#define SD_TUNING_BLOCK_SIZE 64
1969
1970static const uint8_t sd_tuning_block_pattern[SD_TUNING_BLOCK_SIZE] = {
1971 /* See: Physical Layer Simplified Specification Version 3.01, Table 4-2 */
1972 0xff, 0x0f, 0xff, 0x00, 0x0f, 0xfc, 0xc3, 0xcc,
1973 0xc3, 0x3c, 0xcc, 0xff, 0xfe, 0xff, 0xfe, 0xef,
1974 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xfb, 0xff, 0xfb,
1975 0xbf, 0xff, 0x7f, 0xff, 0x77, 0xf7, 0xbd, 0xef,
1976 0xff, 0xf0, 0xff, 0xf0, 0x0f, 0xfc, 0xcc, 0x3c,
1977 0xcc, 0x33, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xee,
1978 0xff, 0xfd, 0xff, 0xfd, 0xdf, 0xff, 0xbf, 0xff,
1979 0xbb, 0xff, 0xf7, 0xff, 0xf7, 0x7f, 0x7b, 0xde,
1980};
1981
Philippe Mathieu-Daudéc769a882020-08-14 11:23:40 +02001982uint8_t sd_read_byte(SDState *sd)
pbrooka1bb27b2007-04-06 16:49:48 +00001983{
1984 /* TODO: Append CRCs */
1985 uint8_t ret;
Philippe Mathieu-Daudé692fb0e2020-07-07 06:12:58 +02001986 uint32_t io_len;
pbrooka1bb27b2007-04-06 16:49:48 +00001987
Markus Armbruster4be74632014-10-07 13:59:18 +02001988 if (!sd->blk || !blk_is_inserted(sd->blk) || !sd->enable)
pbrooka1bb27b2007-04-06 16:49:48 +00001989 return 0x00;
1990
1991 if (sd->state != sd_sendingdata_state) {
Andrew Baumann9800ad82016-02-18 14:16:20 +00001992 qemu_log_mask(LOG_GUEST_ERROR,
Philippe Mathieu-Daudéc769a882020-08-14 11:23:40 +02001993 "%s: not in Sending-Data state\n", __func__);
pbrooka1bb27b2007-04-06 16:49:48 +00001994 return 0x00;
1995 }
1996
1997 if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1998 return 0x00;
1999
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01002000 io_len = (sd->ocr & (1 << 30)) ? 512 : sd->blk_len;
2001
Philippe Mathieu-Daudé75a96f52018-03-09 17:09:44 +00002002 trace_sdcard_read_data(sd->proto_name,
2003 sd_acmd_name(sd->current_cmd),
Philippe Mathieu-Daudé2ed61fb2018-03-09 17:09:44 +00002004 sd->current_cmd, io_len);
pbrooka1bb27b2007-04-06 16:49:48 +00002005 switch (sd->current_cmd) {
2006 case 6: /* CMD6: SWITCH_FUNCTION */
2007 ret = sd->data[sd->data_offset ++];
2008
2009 if (sd->data_offset >= 64)
2010 sd->state = sd_transfer_state;
2011 break;
2012
pbrook775616c2007-11-24 23:35:08 +00002013 case 9: /* CMD9: SEND_CSD */
2014 case 10: /* CMD10: SEND_CID */
2015 ret = sd->data[sd->data_offset ++];
2016
2017 if (sd->data_offset >= 16)
2018 sd->state = sd_transfer_state;
2019 break;
2020
pbrooka1bb27b2007-04-06 16:49:48 +00002021 case 13: /* ACMD13: SD_STATUS */
2022 ret = sd->sd_status[sd->data_offset ++];
2023
2024 if (sd->data_offset >= sizeof(sd->sd_status))
2025 sd->state = sd_transfer_state;
2026 break;
2027
2028 case 17: /* CMD17: READ_SINGLE_BLOCK */
2029 if (sd->data_offset == 0)
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01002030 BLK_READ_BLOCK(sd->data_start, io_len);
pbrooka1bb27b2007-04-06 16:49:48 +00002031 ret = sd->data[sd->data_offset ++];
2032
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01002033 if (sd->data_offset >= io_len)
pbrooka1bb27b2007-04-06 16:49:48 +00002034 sd->state = sd_transfer_state;
2035 break;
2036
2037 case 18: /* CMD18: READ_MULTIPLE_BLOCK */
Michael Olbrich85733782017-10-06 16:46:47 +01002038 if (sd->data_offset == 0) {
2039 if (sd->data_start + io_len > sd->size) {
2040 sd->card_status |= ADDRESS_ERROR;
2041 return 0x00;
2042 }
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01002043 BLK_READ_BLOCK(sd->data_start, io_len);
Michael Olbrich85733782017-10-06 16:46:47 +01002044 }
pbrooka1bb27b2007-04-06 16:49:48 +00002045 ret = sd->data[sd->data_offset ++];
2046
Andrzej Zaborowski2d7adea2009-11-03 15:28:19 +01002047 if (sd->data_offset >= io_len) {
2048 sd->data_start += io_len;
pbrooka1bb27b2007-04-06 16:49:48 +00002049 sd->data_offset = 0;
Andrew Baumann4481bbc2016-02-18 14:16:19 +00002050
2051 if (sd->multi_blk_cnt != 0) {
2052 if (--sd->multi_blk_cnt == 0) {
2053 /* Stop! */
2054 sd->state = sd_transfer_state;
2055 break;
2056 }
2057 }
pbrooka1bb27b2007-04-06 16:49:48 +00002058 }
2059 break;
2060
Philippe Mathieu-Daudé0c3fb032018-03-09 17:09:44 +00002061 case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
2062 if (sd->data_offset >= SD_TUNING_BLOCK_SIZE - 1) {
2063 sd->state = sd_transfer_state;
2064 }
2065 ret = sd_tuning_block_pattern[sd->data_offset++];
2066 break;
2067
pbrooka1bb27b2007-04-06 16:49:48 +00002068 case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */
2069 ret = sd->data[sd->data_offset ++];
2070
2071 if (sd->data_offset >= 4)
2072 sd->state = sd_transfer_state;
2073 break;
2074
2075 case 30: /* CMD30: SEND_WRITE_PROT */
2076 ret = sd->data[sd->data_offset ++];
2077
2078 if (sd->data_offset >= 4)
2079 sd->state = sd_transfer_state;
2080 break;
2081
2082 case 51: /* ACMD51: SEND_SCR */
2083 ret = sd->scr[sd->data_offset ++];
2084
2085 if (sd->data_offset >= sizeof(sd->scr))
2086 sd->state = sd_transfer_state;
2087 break;
2088
2089 case 56: /* CMD56: GEN_CMD */
2090 if (sd->data_offset == 0)
2091 APP_READ_BLOCK(sd->data_start, sd->blk_len);
2092 ret = sd->data[sd->data_offset ++];
2093
2094 if (sd->data_offset >= sd->blk_len)
2095 sd->state = sd_transfer_state;
2096 break;
2097
2098 default:
Philippe Mathieu-Daudéc769a882020-08-14 11:23:40 +02002099 qemu_log_mask(LOG_GUEST_ERROR, "%s: unknown command\n", __func__);
pbrooka1bb27b2007-04-06 16:49:48 +00002100 return 0x00;
2101 }
2102
2103 return ret;
2104}
2105
Philippe Mathieu-Daudé38626a32018-02-15 23:01:26 -03002106static bool sd_data_ready(SDState *sd)
pbrooka1bb27b2007-04-06 16:49:48 +00002107{
2108 return sd->state == sd_sendingdata_state;
2109}
balrog827df9f2008-04-14 21:05:22 +00002110
Mitsyanko Igorbebd1272012-08-13 11:04:06 +01002111void sd_enable(SDState *sd, bool enable)
balrog827df9f2008-04-14 21:05:22 +00002112{
2113 sd->enable = enable;
2114}
Peter Maydell260bc9d2016-02-18 14:16:18 +00002115
2116static void sd_instance_init(Object *obj)
2117{
2118 SDState *sd = SD_CARD(obj);
2119
2120 sd->enable = true;
Andrew Baumanndd26eb42016-02-18 14:16:20 +00002121 sd->ocr_power_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sd_ocr_powerup, sd);
Peter Maydell260bc9d2016-02-18 14:16:18 +00002122}
2123
Marc-André Lureau5ba34402016-07-14 18:03:49 +02002124static void sd_instance_finalize(Object *obj)
2125{
2126 SDState *sd = SD_CARD(obj);
2127
2128 timer_del(sd->ocr_power_timer);
2129 timer_free(sd->ocr_power_timer);
2130}
2131
Peter Maydell260bc9d2016-02-18 14:16:18 +00002132static void sd_realize(DeviceState *dev, Error **errp)
2133{
2134 SDState *sd = SD_CARD(dev);
Kevin Wolfa17c17a2017-01-24 13:43:31 +01002135 int ret;
Peter Maydell260bc9d2016-02-18 14:16:18 +00002136
Philippe Mathieu-Daudé75a96f52018-03-09 17:09:44 +00002137 sd->proto_name = sd->spi ? "SPI" : "SD";
2138
Philippe Mathieu-Daudé2f0939c2018-06-08 13:15:33 +01002139 switch (sd->spec_version) {
2140 case SD_PHY_SPECv1_10_VERS
Philippe Mathieu-Daudé2c511372018-06-08 13:15:34 +01002141 ... SD_PHY_SPECv3_01_VERS:
Philippe Mathieu-Daudé2f0939c2018-06-08 13:15:33 +01002142 break;
2143 default:
2144 error_setg(errp, "Invalid SD card Spec version: %u", sd->spec_version);
2145 return;
2146 }
2147
Peter Maydell260bc9d2016-02-18 14:16:18 +00002148 if (sd->blk) {
Philippe Mathieu-Daudéa9bcedd2020-07-07 13:02:34 +02002149 int64_t blk_size;
2150
Philippe Mathieu-Daudé6dd3a162018-06-05 22:28:51 -03002151 if (blk_is_read_only(sd->blk)) {
2152 error_setg(errp, "Cannot use read-only drive as SD card");
2153 return;
2154 }
2155
Philippe Mathieu-Daudéa9bcedd2020-07-07 13:02:34 +02002156 blk_size = blk_getlength(sd->blk);
2157 if (blk_size > 0 && !is_power_of_2(blk_size)) {
2158 int64_t blk_size_aligned = pow2ceil(blk_size);
2159 char *blk_size_str;
2160
2161 blk_size_str = size_to_str(blk_size);
2162 error_setg(errp, "Invalid SD card size: %s", blk_size_str);
2163 g_free(blk_size_str);
2164
2165 blk_size_str = size_to_str(blk_size_aligned);
2166 error_append_hint(errp,
2167 "SD card size has to be a power of 2, e.g. %s.\n"
2168 "You can resize disk images with"
2169 " 'qemu-img resize <imagefile> <new-size>'\n"
2170 "(note that this will lose data if you make the"
2171 " image smaller than it currently is).\n",
2172 blk_size_str);
2173 g_free(blk_size_str);
2174
2175 return;
2176 }
2177
Kevin Wolfa17c17a2017-01-24 13:43:31 +01002178 ret = blk_set_perm(sd->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE,
2179 BLK_PERM_ALL, errp);
2180 if (ret < 0) {
2181 return;
2182 }
Peter Maydell260bc9d2016-02-18 14:16:18 +00002183 blk_set_dev_ops(sd->blk, &sd_block_ops, sd);
2184 }
Peter Maydell260bc9d2016-02-18 14:16:18 +00002185}
2186
2187static Property sd_properties[] = {
Philippe Mathieu-Daudé2f0939c2018-06-08 13:15:33 +01002188 DEFINE_PROP_UINT8("spec_version", SDState,
2189 spec_version, SD_PHY_SPECv2_00_VERS),
Peter Maydell260bc9d2016-02-18 14:16:18 +00002190 DEFINE_PROP_DRIVE("drive", SDState, blk),
2191 /* We do not model the chip select pin, so allow the board to select
2192 * whether card should be in SSI or MMC/SD mode. It is also up to the
2193 * board to ensure that ssi transfers only occur when the chip select
2194 * is asserted. */
2195 DEFINE_PROP_BOOL("spi", SDState, spi, false),
2196 DEFINE_PROP_END_OF_LIST()
2197};
2198
2199static void sd_class_init(ObjectClass *klass, void *data)
2200{
2201 DeviceClass *dc = DEVICE_CLASS(klass);
Peter Maydellc759a792016-02-18 14:16:18 +00002202 SDCardClass *sc = SD_CARD_CLASS(klass);
Peter Maydell260bc9d2016-02-18 14:16:18 +00002203
2204 dc->realize = sd_realize;
Marc-André Lureau4f67d302020-01-10 19:30:32 +04002205 device_class_set_props(dc, sd_properties);
Peter Maydell260bc9d2016-02-18 14:16:18 +00002206 dc->vmsd = &sd_vmstate;
Peter Maydellba3ed0f2016-02-18 14:16:18 +00002207 dc->reset = sd_reset;
Peter Maydellc759a792016-02-18 14:16:18 +00002208 dc->bus_type = TYPE_SD_BUS;
kumar sourav2bbf3a92019-01-24 21:50:45 +05302209 set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
Peter Maydellc759a792016-02-18 14:16:18 +00002210
Philippe Mathieu-Daudé0034ebe2018-02-08 13:48:09 -03002211 sc->set_voltage = sd_set_voltage;
Philippe Mathieu-Daudéda346922018-02-08 13:48:10 -03002212 sc->get_dat_lines = sd_get_dat_lines;
2213 sc->get_cmd_line = sd_get_cmd_line;
Peter Maydellc759a792016-02-18 14:16:18 +00002214 sc->do_command = sd_do_command;
Philippe Mathieu-Daudéc769a882020-08-14 11:23:40 +02002215 sc->write_byte = sd_write_byte;
2216 sc->read_byte = sd_read_byte;
Peter Maydellc759a792016-02-18 14:16:18 +00002217 sc->data_ready = sd_data_ready;
2218 sc->enable = sd_enable;
2219 sc->get_inserted = sd_get_inserted;
2220 sc->get_readonly = sd_get_readonly;
Peter Maydell260bc9d2016-02-18 14:16:18 +00002221}
2222
2223static const TypeInfo sd_info = {
2224 .name = TYPE_SD_CARD,
2225 .parent = TYPE_DEVICE,
2226 .instance_size = sizeof(SDState),
Peter Maydellc759a792016-02-18 14:16:18 +00002227 .class_size = sizeof(SDCardClass),
Peter Maydell260bc9d2016-02-18 14:16:18 +00002228 .class_init = sd_class_init,
2229 .instance_init = sd_instance_init,
Marc-André Lureau5ba34402016-07-14 18:03:49 +02002230 .instance_finalize = sd_instance_finalize,
Peter Maydell260bc9d2016-02-18 14:16:18 +00002231};
2232
2233static void sd_register_types(void)
2234{
2235 type_register_static(&sd_info);
2236}
2237
2238type_init(sd_register_types)