sd.c 55.9 KB
Newer Older
1
/*
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 * SD Memory Card emulation as defined in the "SD Memory Card Physical
 * layer specification, Version 1.10."
 *
 * Copyright (c) 2006 Andrzej Zaborowski  <balrog@zabor.org>
 * Copyright (c) 2007 CodeSourcery
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

P
Peter Maydell 已提交
32
#include "qemu/osdep.h"
33
#include "hw/qdev.h"
34
#include "hw/hw.h"
35
#include "hw/registerfields.h"
36
#include "sysemu/block-backend.h"
37
#include "hw/sd/sd.h"
38
#include "qapi/error.h"
39
#include "qemu/bitmap.h"
40
#include "qemu/cutils.h"
P
Peter Maydell 已提交
41 42
#include "hw/qdev-properties.h"
#include "qemu/error-report.h"
43
#include "qemu/timer.h"
44
#include "qemu/log.h"
45
#include "sdmmc-internal.h"
46
#include "trace.h"
47 48 49

//#define DEBUG_SD 1

50
#define ACMD41_ENQUIRY_MASK     0x00ffffff
51

52 53 54 55 56 57 58
typedef enum {
    sd_r0 = 0,    /* no response */
    sd_r1,        /* normal response command */
    sd_r2_i,      /* CID register */
    sd_r2_s,      /* CSD register */
    sd_r3,        /* OCR register */
    sd_r6 = 6,    /* Published RCA response */
59
    sd_r7,        /* Operating voltage */
60
    sd_r1b = -1,
61
    sd_illegal = -2,
A
Anthony Liguori 已提交
62
} sd_rsp_type_t;
63

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
enum SDCardModes {
    sd_inactive,
    sd_card_identification_mode,
    sd_data_transfer_mode,
};

enum SDCardStates {
    sd_inactive_state = -1,
    sd_idle_state = 0,
    sd_ready_state,
    sd_identification_state,
    sd_standby_state,
    sd_transfer_state,
    sd_sendingdata_state,
    sd_receivingdata_state,
    sd_programming_state,
    sd_disconnect_state,
};

83
struct SDState {
P
Peter Maydell 已提交
84 85
    DeviceState parent_obj;

86
    /* SD Memory Card Registers */
87 88 89 90 91 92 93
    uint32_t ocr;
    uint8_t scr[8];
    uint8_t cid[16];
    uint8_t csd[16];
    uint16_t rca;
    uint32_t card_status;
    uint8_t sd_status[64];
94 95 96 97 98 99 100

    /* Configurable properties */
    BlockBackend *blk;
    bool spi;

    uint32_t mode;    /* current card mode, one of SDCardModes */
    int32_t state;    /* current card state, one of SDCardStates */
101
    uint32_t vhs;
102
    bool wp_switch;
103
    unsigned long *wp_groups;
104
    int32_t wpgrps_size;
105
    uint64_t size;
106
    uint32_t blk_len;
107
    uint32_t multi_blk_cnt;
108 109 110
    uint32_t erase_start;
    uint32_t erase_end;
    uint8_t pwd[16];
111 112 113
    uint32_t pwd_len;
    uint8_t function_group[6];
    uint8_t current_cmd;
114 115 116
    /* True if we will handle the next command as an ACMD. Note that this does
     * *not* track the APP_CMD status bit!
     */
117
    bool expecting_acmd;
118
    uint32_t blk_written;
119
    uint64_t data_start;
120 121
    uint32_t data_offset;
    uint8_t data[512];
122 123
    qemu_irq readonly_cb;
    qemu_irq inserted_cb;
124
    QEMUTimer *ocr_power_timer;
125
    bool enable;
126 127
    uint8_t dat_lines;
    bool cmd_line;
128 129
};

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
static const char *sd_state_name(enum SDCardStates state)
{
    static const char *state_name[] = {
        [sd_idle_state]             = "idle",
        [sd_ready_state]            = "ready",
        [sd_identification_state]   = "identification",
        [sd_standby_state]          = "standby",
        [sd_transfer_state]         = "transfer",
        [sd_sendingdata_state]      = "sendingdata",
        [sd_receivingdata_state]    = "receivingdata",
        [sd_programming_state]      = "programming",
        [sd_disconnect_state]       = "disconnect",
    };
    if (state == sd_inactive_state) {
        return "inactive";
    }
    assert(state <= ARRAY_SIZE(state_name));
    return state_name[state];
}

150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
static const char *sd_response_name(sd_rsp_type_t rsp)
{
    static const char *response_name[] = {
        [sd_r0]     = "RESP#0 (no response)",
        [sd_r1]     = "RESP#1 (normal cmd)",
        [sd_r2_i]   = "RESP#2 (CID reg)",
        [sd_r2_s]   = "RESP#2 (CSD reg)",
        [sd_r3]     = "RESP#3 (OCR reg)",
        [sd_r6]     = "RESP#6 (RCA)",
        [sd_r7]     = "RESP#7 (operating voltage)",
    };
    if (rsp == sd_illegal) {
        return "ILLEGAL RESP";
    }
    if (rsp == sd_r1b) {
        rsp = sd_r1;
    }
    assert(rsp <= ARRAY_SIZE(response_name));
    return response_name[rsp];
}

171 172 173 174 175 176 177 178 179 180
static uint8_t sd_get_dat_lines(SDState *sd)
{
    return sd->enable ? sd->dat_lines : 0;
}

static bool sd_get_cmd_line(SDState *sd)
{
    return sd->enable ? sd->cmd_line : false;
}

181 182
static void sd_set_voltage(SDState *sd, uint16_t millivolts)
{
183 184
    trace_sdcard_set_voltage(millivolts);

185 186 187 188 189 190 191 192 193 194
    switch (millivolts) {
    case 3001 ... 3600: /* SD_VOLTAGE_3_3V */
    case 2001 ... 3000: /* SD_VOLTAGE_3_0V */
        break;
    default:
        qemu_log_mask(LOG_GUEST_ERROR, "SD card voltage not supported: %.3fV",
                      millivolts / 1000.f);
    }
}

195
static void sd_set_mode(SDState *sd)
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
{
    switch (sd->state) {
    case sd_inactive_state:
        sd->mode = sd_inactive;
        break;

    case sd_idle_state:
    case sd_ready_state:
    case sd_identification_state:
        sd->mode = sd_card_identification_mode;
        break;

    case sd_standby_state:
    case sd_transfer_state:
    case sd_sendingdata_state:
    case sd_receivingdata_state:
    case sd_programming_state:
    case sd_disconnect_state:
        sd->mode = sd_data_transfer_mode;
        break;
    }
}

219
static const sd_cmd_type_t sd_cmd_type[SDMMC_CMD_MAX] = {
220
    sd_bc,   sd_none, sd_bcr,  sd_bcr,  sd_none, sd_none, sd_none, sd_ac,
221
    sd_bcr,  sd_ac,   sd_ac,   sd_adtc, sd_ac,   sd_ac,   sd_none, sd_ac,
222
    /* 16 */
223 224
    sd_ac,   sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
    sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac,   sd_ac,   sd_adtc, sd_none,
225
    /* 32 */
226 227
    sd_ac,   sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
    sd_none, sd_none, sd_bc,   sd_none, sd_none, sd_none, sd_none, sd_none,
228
    /* 48 */
229 230 231 232
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
    sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
};

233
static const int sd_cmd_class[SDMMC_CMD_MAX] = {
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
    0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  1,  0,  0,  0,  0,
    2,  2,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  6,  6,  6,  6,
    5,  5, 10, 10, 10, 10,  5,  9,  9,  9,  7,  7,  7,  7,  7,  7,
    7,  7, 10,  7,  9,  9,  9,  8,  8, 10,  8,  8,  8,  8,  8,  8,
};

static uint8_t sd_crc7(void *message, size_t width)
{
    int i, bit;
    uint8_t shift_reg = 0x00;
    uint8_t *msg = (uint8_t *) message;

    for (i = 0; i < width; i ++, msg ++)
        for (bit = 7; bit >= 0; bit --) {
            shift_reg <<= 1;
            if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
                shift_reg ^= 0x89;
        }

    return shift_reg;
}

static uint16_t sd_crc16(void *message, size_t width)
{
    int i, bit;
    uint16_t shift_reg = 0x0000;
    uint16_t *msg = (uint16_t *) message;
    width <<= 1;

    for (i = 0; i < width; i ++, msg ++)
        for (bit = 15; bit >= 0; bit --) {
            shift_reg <<= 1;
            if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
                shift_reg ^= 0x1011;
        }

    return shift_reg;
}

273 274 275 276 277
#define OCR_POWER_DELAY_NS      500000 /* 0.5ms */

FIELD(OCR, CARD_CAPACITY,              30,  1) /* 0:SDSC, 1:SDHC/SDXC */
FIELD(OCR, CARD_POWER_UP,              31,  1)

278 279
static void sd_set_ocr(SDState *sd)
{
280 281 282 283 284 285 286 287
    /* All voltages OK, Standard Capacity SD Memory Card, not yet powered up */
    sd->ocr = 0x00ffff00;
}

static void sd_ocr_powerup(void *opaque)
{
    SDState *sd = opaque;

288
    trace_sdcard_powerup();
289 290 291 292
    assert(!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP));

    /* card power-up OK */
    sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_POWER_UP, 1);
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
}

static void sd_set_scr(SDState *sd)
{
    sd->scr[0] = 0x00;		/* SCR Structure */
    sd->scr[1] = 0x2f;		/* SD Security Support */
    sd->scr[2] = 0x00;
    sd->scr[3] = 0x00;
    sd->scr[4] = 0x00;
    sd->scr[5] = 0x00;
    sd->scr[6] = 0x00;
    sd->scr[7] = 0x00;
}

#define MID	0xaa
#define OID	"XY"
#define PNM	"QEMU!"
#define PRV	0x01
#define MDT_YR	2006
#define MDT_MON	2

static void sd_set_cid(SDState *sd)
{
    sd->cid[0] = MID;		/* Fake card manufacturer ID (MID) */
    sd->cid[1] = OID[0];	/* OEM/Application ID (OID) */
    sd->cid[2] = OID[1];
    sd->cid[3] = PNM[0];	/* Fake product name (PNM) */
    sd->cid[4] = PNM[1];
    sd->cid[5] = PNM[2];
    sd->cid[6] = PNM[3];
    sd->cid[7] = PNM[4];
    sd->cid[8] = PRV;		/* Fake product revision (PRV) */
    sd->cid[9] = 0xde;		/* Fake serial number (PSN) */
    sd->cid[10] = 0xad;
    sd->cid[11] = 0xbe;
    sd->cid[12] = 0xef;
    sd->cid[13] = 0x00 |	/* Manufacture date (MDT) */
        ((MDT_YR - 2000) / 10);
    sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
    sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
}

#define HWBLOCK_SHIFT	9			/* 512 bytes */
#define SECTOR_SHIFT	5			/* 16 kilobytes */
#define WPGROUP_SHIFT	7			/* 2 megs */
#define CMULT_SHIFT	9			/* 512 times HWBLOCK_SIZE */
#define WPGROUP_SIZE	(1 << (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT))

static const uint8_t sd_csd_rw_mask[16] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
};

346
static void sd_set_csd(SDState *sd, uint64_t size)
347 348 349 350 351
{
    uint32_t csize = (size >> (CMULT_SHIFT + HWBLOCK_SHIFT)) - 1;
    uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
    uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;

352
    if (size <= 1 * G_BYTE) { /* Standard Capacity SD */
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
        sd->csd[0] = 0x00;	/* CSD structure */
        sd->csd[1] = 0x26;	/* Data read access-time-1 */
        sd->csd[2] = 0x00;	/* Data read access-time-2 */
        sd->csd[3] = 0x5a;	/* Max. data transfer rate */
        sd->csd[4] = 0x5f;	/* Card Command Classes */
        sd->csd[5] = 0x50 |	/* Max. read data block length */
            HWBLOCK_SHIFT;
        sd->csd[6] = 0xe0 |	/* Partial block for read allowed */
            ((csize >> 10) & 0x03);
        sd->csd[7] = 0x00 |	/* Device size */
            ((csize >> 2) & 0xff);
        sd->csd[8] = 0x3f |	/* Max. read current */
            ((csize << 6) & 0xc0);
        sd->csd[9] = 0xfc |	/* Max. write current */
            ((CMULT_SHIFT - 2) >> 1);
        sd->csd[10] = 0x40 |	/* Erase sector size */
            (((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1);
        sd->csd[11] = 0x00 |	/* Write protect group size */
            ((sectsize << 7) & 0x80) | wpsize;
        sd->csd[12] = 0x90 |	/* Write speed factor */
            (HWBLOCK_SHIFT >> 2);
        sd->csd[13] = 0x20 |	/* Max. write data block length */
            ((HWBLOCK_SHIFT << 6) & 0xc0);
        sd->csd[14] = 0x00;	/* File format group */
        sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
    } else {			/* SDHC */
        size /= 512 * 1024;
        size -= 1;
        sd->csd[0] = 0x40;
        sd->csd[1] = 0x0e;
        sd->csd[2] = 0x00;
        sd->csd[3] = 0x32;
        sd->csd[4] = 0x5b;
        sd->csd[5] = 0x59;
        sd->csd[6] = 0x00;
        sd->csd[7] = (size >> 16) & 0xff;
        sd->csd[8] = (size >> 8) & 0xff;
        sd->csd[9] = (size & 0xff);
        sd->csd[10] = 0x7f;
        sd->csd[11] = 0x80;
        sd->csd[12] = 0x0a;
        sd->csd[13] = 0x40;
        sd->csd[14] = 0x00;
        sd->csd[15] = 0x00;
397
        sd->ocr |= 1 << 30;     /* High Capacity SD Memory Card */
398
    }
399 400 401 402 403 404 405
}

static void sd_set_rca(SDState *sd)
{
    sd->rca += 0x4567;
}

406 407 408 409 410
/* Card status bits, split by clear condition:
 * A : According to the card current state
 * B : Always related to the previous command
 * C : Cleared by read
 */
411 412 413 414 415 416 417 418 419 420 421 422 423 424
#define CARD_STATUS_A	0x02004100
#define CARD_STATUS_B	0x00c01e00
#define CARD_STATUS_C	0xfd39a028

static void sd_set_cardstatus(SDState *sd)
{
    sd->card_status = 0x00000100;
}

static void sd_set_sdstatus(SDState *sd)
{
    memset(sd->sd_status, 0, 64);
}

P
Paul Brook 已提交
425
static int sd_req_crc_validate(SDRequest *req)
426 427 428 429 430 431 432 433 434 435 436
{
    uint8_t buffer[5];
    buffer[0] = 0x40 | req->cmd;
    buffer[1] = (req->arg >> 24) & 0xff;
    buffer[2] = (req->arg >> 16) & 0xff;
    buffer[3] = (req->arg >> 8) & 0xff;
    buffer[4] = (req->arg >> 0) & 0xff;
    return 0;
    return sd_crc7(buffer, 5) != req->crc;	/* TODO */
}

437
static void sd_response_r1_make(SDState *sd, uint8_t *response)
438
{
439
    uint32_t status = sd->card_status;
440 441
    /* Clear the "clear on read" status bits */
    sd->card_status &= ~CARD_STATUS_C;
442 443 444 445 446 447 448

    response[0] = (status >> 24) & 0xff;
    response[1] = (status >> 16) & 0xff;
    response[2] = (status >> 8) & 0xff;
    response[3] = (status >> 0) & 0xff;
}

449
static void sd_response_r3_make(SDState *sd, uint8_t *response)
450 451 452 453 454 455 456
{
    response[0] = (sd->ocr >> 24) & 0xff;
    response[1] = (sd->ocr >> 16) & 0xff;
    response[2] = (sd->ocr >> 8) & 0xff;
    response[3] = (sd->ocr >> 0) & 0xff;
}

457
static void sd_response_r6_make(SDState *sd, uint8_t *response)
458 459 460 461 462 463 464 465
{
    uint16_t arg;
    uint16_t status;

    arg = sd->rca;
    status = ((sd->card_status >> 8) & 0xc000) |
             ((sd->card_status >> 6) & 0x2000) |
              (sd->card_status & 0x1fff);
466
    sd->card_status &= ~(CARD_STATUS_C & 0xc81fff);
467 468 469 470 471 472 473

    response[0] = (arg >> 8) & 0xff;
    response[1] = arg & 0xff;
    response[2] = (status >> 8) & 0xff;
    response[3] = status & 0xff;
}

474 475 476 477 478 479 480 481
static void sd_response_r7_make(SDState *sd, uint8_t *response)
{
    response[0] = (sd->vhs >> 24) & 0xff;
    response[1] = (sd->vhs >> 16) & 0xff;
    response[2] = (sd->vhs >>  8) & 0xff;
    response[3] = (sd->vhs >>  0) & 0xff;
}

482 483 484 485 486
static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
{
    return addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
}

487
static void sd_reset(DeviceState *dev)
488
{
489
    SDState *sd = SD_CARD(dev);
490
    uint64_t size;
491 492
    uint64_t sect;

493
    trace_sdcard_reset();
494 495
    if (sd->blk) {
        blk_get_geometry(sd->blk, &sect);
P
Paul Brook 已提交
496 497 498
    } else {
        sect = 0;
    }
499
    size = sect << 9;
500

501
    sect = sd_addr_to_wpnum(size) + 1;
502 503 504 505 506 507 508 509 510 511

    sd->state = sd_idle_state;
    sd->rca = 0x0000;
    sd_set_ocr(sd);
    sd_set_scr(sd);
    sd_set_cid(sd);
    sd_set_csd(sd, size);
    sd_set_cardstatus(sd);
    sd_set_sdstatus(sd);

512
    g_free(sd->wp_groups);
513
    sd->wp_switch = sd->blk ? blk_is_read_only(sd->blk) : false;
514 515 516
    sd->wpgrps_size = sect;
    sd->wp_groups = bitmap_new(sd->wpgrps_size);
    memset(sd->function_group, 0, sizeof(sd->function_group));
517 518 519 520 521
    sd->erase_start = 0;
    sd->erase_end = 0;
    sd->size = size;
    sd->blk_len = 0x200;
    sd->pwd_len = 0;
522
    sd->expecting_acmd = false;
523 524
    sd->dat_lines = 0xf;
    sd->cmd_line = true;
525
    sd->multi_blk_cnt = 0;
526 527
}

528 529
static bool sd_get_inserted(SDState *sd)
{
530
    return sd->blk && blk_is_inserted(sd->blk);
531 532 533 534 535 536 537
}

static bool sd_get_readonly(SDState *sd)
{
    return sd->wp_switch;
}

538
static void sd_cardchange(void *opaque, bool load, Error **errp)
539 540
{
    SDState *sd = opaque;
541 542 543 544
    DeviceState *dev = DEVICE(sd);
    SDBus *sdbus = SD_BUS(qdev_get_parent_bus(dev));
    bool inserted = sd_get_inserted(sd);
    bool readonly = sd_get_readonly(sd);
545

546
    if (inserted) {
547
        trace_sdcard_inserted(readonly);
548
        sd_reset(dev);
549 550
    } else {
        trace_sdcard_ejected();
551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
    }

    /* The IRQ notification is for legacy non-QOM SD controller devices;
     * QOMified controllers use the SDBus APIs.
     */
    if (sdbus) {
        sdbus_set_inserted(sdbus, inserted);
        if (inserted) {
            sdbus_set_readonly(sdbus, readonly);
        }
    } else {
        qemu_set_irq(sd->inserted_cb, inserted);
        if (inserted) {
            qemu_set_irq(sd->readonly_cb, readonly);
        }
566 567 568
    }
}

569
static const BlockDevOps sd_block_ops = {
570
    .change_media_cb = sd_cardchange,
571 572
};

573 574 575 576 577
static bool sd_ocr_vmstate_needed(void *opaque)
{
    SDState *sd = opaque;

    /* Include the OCR state (and timer) if it is not yet powered up */
578
    return !FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP);
579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605
}

static const VMStateDescription sd_ocr_vmstate = {
    .name = "sd-card/ocr-state",
    .version_id = 1,
    .minimum_version_id = 1,
    .needed = sd_ocr_vmstate_needed,
    .fields = (VMStateField[]) {
        VMSTATE_UINT32(ocr, SDState),
        VMSTATE_TIMER_PTR(ocr_power_timer, SDState),
        VMSTATE_END_OF_LIST()
    },
};

static int sd_vmstate_pre_load(void *opaque)
{
    SDState *sd = opaque;

    /* If the OCR state is not included (prior versions, or not
     * needed), then the OCR must be set as powered up. If the OCR state
     * is included, this will be replaced by the state restore.
     */
    sd_ocr_powerup(sd);

    return 0;
}

606 607 608 609
static const VMStateDescription sd_vmstate = {
    .name = "sd-card",
    .version_id = 1,
    .minimum_version_id = 1,
610
    .pre_load = sd_vmstate_pre_load,
611 612 613 614 615 616 617 618 619 620 621
    .fields = (VMStateField[]) {
        VMSTATE_UINT32(mode, SDState),
        VMSTATE_INT32(state, SDState),
        VMSTATE_UINT8_ARRAY(cid, SDState, 16),
        VMSTATE_UINT8_ARRAY(csd, SDState, 16),
        VMSTATE_UINT16(rca, SDState),
        VMSTATE_UINT32(card_status, SDState),
        VMSTATE_PARTIAL_BUFFER(sd_status, SDState, 1),
        VMSTATE_UINT32(vhs, SDState),
        VMSTATE_BITMAP(wp_groups, SDState, 0, wpgrps_size),
        VMSTATE_UINT32(blk_len, SDState),
622
        VMSTATE_UINT32(multi_blk_cnt, SDState),
623 624 625 626 627 628 629 630 631 632 633
        VMSTATE_UINT32(erase_start, SDState),
        VMSTATE_UINT32(erase_end, SDState),
        VMSTATE_UINT8_ARRAY(pwd, SDState, 16),
        VMSTATE_UINT32(pwd_len, SDState),
        VMSTATE_UINT8_ARRAY(function_group, SDState, 6),
        VMSTATE_UINT8(current_cmd, SDState),
        VMSTATE_BOOL(expecting_acmd, SDState),
        VMSTATE_UINT32(blk_written, SDState),
        VMSTATE_UINT64(data_start, SDState),
        VMSTATE_UINT32(data_offset, SDState),
        VMSTATE_UINT8_ARRAY(data, SDState, 512),
634
        VMSTATE_UNUSED_V(1, 512),
635 636
        VMSTATE_BOOL(enable, SDState),
        VMSTATE_END_OF_LIST()
637 638 639 640 641
    },
    .subsections = (const VMStateDescription*[]) {
        &sd_ocr_vmstate,
        NULL
    },
642 643
};

P
Peter Maydell 已提交
644
/* Legacy initialization function for use by non-qdevified callers */
645
SDState *sd_init(BlockBackend *blk, bool is_spi)
646
{
647
    Object *obj;
P
Peter Maydell 已提交
648 649
    DeviceState *dev;
    Error *err = NULL;
650

651 652
    obj = object_new(TYPE_SD_CARD);
    dev = DEVICE(obj);
P
Peter Maydell 已提交
653 654 655
    qdev_prop_set_drive(dev, "drive", blk, &err);
    if (err) {
        error_report("sd_init failed: %s", error_get_pretty(err));
656 657
        return NULL;
    }
P
Peter Maydell 已提交
658
    qdev_prop_set_bit(dev, "spi", is_spi);
659
    object_property_set_bool(obj, true, "realized", &err);
P
Peter Maydell 已提交
660 661 662
    if (err) {
        error_report("sd_init failed: %s", error_get_pretty(err));
        return NULL;
P
Paul Brook 已提交
663
    }
P
Peter Maydell 已提交
664 665

    return SD_CARD(dev);
666 667
}

668
void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
669
{
670 671
    sd->readonly_cb = readonly;
    sd->inserted_cb = insert;
672 673
    qemu_set_irq(readonly, sd->blk ? blk_is_read_only(sd->blk) : 0);
    qemu_set_irq(insert, sd->blk ? blk_is_inserted(sd->blk) : 0);
674 675 676 677
}

static void sd_erase(SDState *sd)
{
678 679 680 681
    int i;
    uint64_t erase_start = sd->erase_start;
    uint64_t erase_end = sd->erase_end;

682
    trace_sdcard_erase();
683 684 685 686 687
    if (!sd->erase_start || !sd->erase_end) {
        sd->card_status |= ERASE_SEQ_ERROR;
        return;
    }

688
    if (FIELD_EX32(sd->ocr, OCR, CARD_CAPACITY)) {
689 690 691 692 693 694 695
        /* High capacity memory card: erase units are 512 byte blocks */
        erase_start *= 512;
        erase_end *= 512;
    }

    erase_start = sd_addr_to_wpnum(erase_start);
    erase_end = sd_addr_to_wpnum(erase_end);
696 697 698 699
    sd->erase_start = 0;
    sd->erase_end = 0;
    sd->csd[14] |= 0x40;

700
    for (i = erase_start; i <= erase_end; i++) {
701
        if (test_bit(i, sd->wp_groups)) {
702
            sd->card_status |= WP_ERASE_SKIP;
703 704
        }
    }
705 706
}

707
static uint32_t sd_wpbits(SDState *sd, uint64_t addr)
708 709 710 711
{
    uint32_t i, wpnum;
    uint32_t ret = 0;

712
    wpnum = sd_addr_to_wpnum(addr);
713

714 715
    for (i = 0; i < 32; i++, wpnum++, addr += WPGROUP_SIZE) {
        if (addr < sd->size && test_bit(wpnum, sd->wp_groups)) {
716
            ret |= (1 << i);
717 718
        }
    }
719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753

    return ret;
}

static void sd_function_switch(SDState *sd, uint32_t arg)
{
    int i, mode, new_func, crc;
    mode = !!(arg & 0x80000000);

    sd->data[0] = 0x00;		/* Maximum current consumption */
    sd->data[1] = 0x01;
    sd->data[2] = 0x80;		/* Supported group 6 functions */
    sd->data[3] = 0x01;
    sd->data[4] = 0x80;		/* Supported group 5 functions */
    sd->data[5] = 0x01;
    sd->data[6] = 0x80;		/* Supported group 4 functions */
    sd->data[7] = 0x01;
    sd->data[8] = 0x80;		/* Supported group 3 functions */
    sd->data[9] = 0x01;
    sd->data[10] = 0x80;	/* Supported group 2 functions */
    sd->data[11] = 0x43;
    sd->data[12] = 0x80;	/* Supported group 1 functions */
    sd->data[13] = 0x03;
    for (i = 0; i < 6; i ++) {
        new_func = (arg >> (i * 4)) & 0x0f;
        if (mode && new_func != 0x0f)
            sd->function_group[i] = new_func;
        sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
    }
    memset(&sd->data[17], 0, 47);
    crc = sd_crc16(sd->data, 64);
    sd->data[65] = crc >> 8;
    sd->data[66] = crc & 0xff;
}

754
static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
755
{
756
    return test_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771
}

static void sd_lock_command(SDState *sd)
{
    int erase, lock, clr_pwd, set_pwd, pwd_len;
    erase = !!(sd->data[0] & 0x08);
    lock = sd->data[0] & 0x04;
    clr_pwd = sd->data[0] & 0x02;
    set_pwd = sd->data[0] & 0x01;

    if (sd->blk_len > 1)
        pwd_len = sd->data[1];
    else
        pwd_len = 0;

772 773 774 775 776
    if (lock) {
        trace_sdcard_lock();
    } else {
        trace_sdcard_unlock();
    }
777 778 779 780 781 782 783
    if (erase) {
        if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 ||
                        set_pwd || clr_pwd || lock || sd->wp_switch ||
                        (sd->csd[14] & 0x20)) {
            sd->card_status |= LOCK_UNLOCK_FAILED;
            return;
        }
784
        bitmap_zero(sd->wp_groups, sd->wpgrps_size);
785 786 787 788
        sd->csd[14] &= ~0x10;
        sd->card_status &= ~CARD_IS_LOCKED;
        sd->pwd_len = 0;
        /* Erasing the entire card here! */
B
balrog 已提交
789
        fprintf(stderr, "SD: Card force-erased by CMD42\n");
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830
        return;
    }

    if (sd->blk_len < 2 + pwd_len ||
                    pwd_len <= sd->pwd_len ||
                    pwd_len > sd->pwd_len + 16) {
        sd->card_status |= LOCK_UNLOCK_FAILED;
        return;
    }

    if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) {
        sd->card_status |= LOCK_UNLOCK_FAILED;
        return;
    }

    pwd_len -= sd->pwd_len;
    if ((pwd_len && !set_pwd) ||
                    (clr_pwd && (set_pwd || lock)) ||
                    (lock && !sd->pwd_len && !set_pwd) ||
                    (!set_pwd && !clr_pwd &&
                     (((sd->card_status & CARD_IS_LOCKED) && lock) ||
                      (!(sd->card_status & CARD_IS_LOCKED) && !lock)))) {
        sd->card_status |= LOCK_UNLOCK_FAILED;
        return;
    }

    if (set_pwd) {
        memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len);
        sd->pwd_len = pwd_len;
    }

    if (clr_pwd) {
        sd->pwd_len = 0;
    }

    if (lock)
        sd->card_status |= CARD_IS_LOCKED;
    else
        sd->card_status &= ~CARD_IS_LOCKED;
}

A
Anthony Liguori 已提交
831
static sd_rsp_type_t sd_normal_command(SDState *sd,
P
Paul Brook 已提交
832
                                       SDRequest req)
833 834
{
    uint32_t rca = 0x0000;
835
    uint64_t addr = (sd->ocr & (1 << 30)) ? (uint64_t) req.arg << 9 : req.arg;
836

837 838
    trace_sdcard_normal_command(req.cmd, req.arg, sd_state_name(sd->state));

839 840 841
    /* Not interpreting this as an app command */
    sd->card_status &= ~APP_CMD;

842 843
    if (sd_cmd_type[req.cmd] == sd_ac
        || sd_cmd_type[req.cmd] == sd_adtc) {
844
        rca = req.arg >> 16;
845
    }
846

847 848 849 850 851 852
    /* CMD23 (set block count) must be immediately followed by CMD18 or CMD25
     * if not, its effects are cancelled */
    if (sd->multi_blk_cnt != 0 && !(req.cmd == 18 || req.cmd == 25)) {
        sd->multi_blk_cnt = 0;
    }

853 854 855 856 857
    switch (req.cmd) {
    /* Basic commands (Class 0 and Class 1) */
    case 0:	/* CMD0:   GO_IDLE_STATE */
        switch (sd->state) {
        case sd_inactive_state:
P
pbrook 已提交
858
            return sd->spi ? sd_r1 : sd_r0;
859 860 861

        default:
            sd->state = sd_idle_state;
862
            sd_reset(DEVICE(sd));
P
pbrook 已提交
863
            return sd->spi ? sd_r1 : sd_r0;
864 865 866
        }
        break;

P
pbrook 已提交
867 868 869 870 871 872 873
    case 1:	/* CMD1:   SEND_OP_CMD */
        if (!sd->spi)
            goto bad_cmd;

        sd->state = sd_transfer_state;
        return sd_r1;

874
    case 2:	/* CMD2:   ALL_SEND_CID */
P
pbrook 已提交
875 876
        if (sd->spi)
            goto bad_cmd;
877 878 879 880 881 882 883 884 885 886 887
        switch (sd->state) {
        case sd_ready_state:
            sd->state = sd_identification_state;
            return sd_r2_i;

        default:
            break;
        }
        break;

    case 3:	/* CMD3:   SEND_RELATIVE_ADDR */
P
pbrook 已提交
888 889
        if (sd->spi)
            goto bad_cmd;
890 891 892 893 894 895 896 897 898 899 900 901 902
        switch (sd->state) {
        case sd_identification_state:
        case sd_standby_state:
            sd->state = sd_standby_state;
            sd_set_rca(sd);
            return sd_r6;

        default:
            break;
        }
        break;

    case 4:	/* CMD4:   SEND_DSR */
P
pbrook 已提交
903 904
        if (sd->spi)
            goto bad_cmd;
905 906 907 908 909 910 911 912 913
        switch (sd->state) {
        case sd_standby_state:
            break;

        default:
            break;
        }
        break;

914
    case 5: /* CMD5: reserved for SDIO cards */
915
        return sd_illegal;
916

917
    case 6:	/* CMD6:   SWITCH_FUNCTION */
P
pbrook 已提交
918 919
        if (sd->spi)
            goto bad_cmd;
920 921 922 923 924 925 926 927 928 929 930 931 932 933
        switch (sd->mode) {
        case sd_data_transfer_mode:
            sd_function_switch(sd, req.arg);
            sd->state = sd_sendingdata_state;
            sd->data_start = 0;
            sd->data_offset = 0;
            return sd_r1;

        default:
            break;
        }
        break;

    case 7:	/* CMD7:   SELECT/DESELECT_CARD */
P
pbrook 已提交
934 935
        if (sd->spi)
            goto bad_cmd;
936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
        switch (sd->state) {
        case sd_standby_state:
            if (sd->rca != rca)
                return sd_r0;

            sd->state = sd_transfer_state;
            return sd_r1b;

        case sd_transfer_state:
        case sd_sendingdata_state:
            if (sd->rca == rca)
                break;

            sd->state = sd_standby_state;
            return sd_r1b;

        case sd_disconnect_state:
            if (sd->rca != rca)
                return sd_r0;

            sd->state = sd_programming_state;
            return sd_r1b;

        case sd_programming_state:
            if (sd->rca == rca)
                break;

            sd->state = sd_disconnect_state;
            return sd_r1b;

        default:
            break;
        }
        break;

971 972 973 974 975 976 977
    case 8:	/* CMD8:   SEND_IF_COND */
        /* Physical Layer Specification Version 2.00 command */
        switch (sd->state) {
        case sd_idle_state:
            sd->vhs = 0;

            /* No response if not exactly one VHS bit is set.  */
978
            if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) {
979
                return sd->spi ? sd_r7 : sd_r0;
980
            }
981 982 983 984 985 986 987 988 989 990

            /* Accept.  */
            sd->vhs = req.arg;
            return sd_r7;

        default:
            break;
        }
        break;

991 992 993 994 995 996 997 998
    case 9:	/* CMD9:   SEND_CSD */
        switch (sd->state) {
        case sd_standby_state:
            if (sd->rca != rca)
                return sd_r0;

            return sd_r2_s;

P
pbrook 已提交
999 1000 1001 1002 1003
        case sd_transfer_state:
            if (!sd->spi)
                break;
            sd->state = sd_sendingdata_state;
            memcpy(sd->data, sd->csd, 16);
1004
            sd->data_start = addr;
P
pbrook 已提交
1005 1006 1007
            sd->data_offset = 0;
            return sd_r1;

1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
        default:
            break;
        }
        break;

    case 10:	/* CMD10:  SEND_CID */
        switch (sd->state) {
        case sd_standby_state:
            if (sd->rca != rca)
                return sd_r0;

            return sd_r2_i;

P
pbrook 已提交
1021 1022 1023 1024 1025
        case sd_transfer_state:
            if (!sd->spi)
                break;
            sd->state = sd_sendingdata_state;
            memcpy(sd->data, sd->cid, 16);
1026
            sd->data_start = addr;
P
pbrook 已提交
1027 1028 1029
            sd->data_offset = 0;
            return sd_r1;

1030 1031 1032 1033 1034 1035
        default:
            break;
        }
        break;

    case 11:	/* CMD11:  READ_DAT_UNTIL_STOP */
P
pbrook 已提交
1036 1037
        if (sd->spi)
            goto bad_cmd;
1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
        switch (sd->state) {
        case sd_transfer_state:
            sd->state = sd_sendingdata_state;
            sd->data_start = req.arg;
            sd->data_offset = 0;

            if (sd->data_start + sd->blk_len > sd->size)
                sd->card_status |= ADDRESS_ERROR;
            return sd_r0;

        default:
            break;
        }
        break;

    case 12:	/* CMD12:  STOP_TRANSMISSION */
        switch (sd->state) {
        case sd_sendingdata_state:
            sd->state = sd_transfer_state;
            return sd_r1b;

        case sd_receivingdata_state:
            sd->state = sd_programming_state;
            /* Bzzzzzzztt .... Operation complete.  */
            sd->state = sd_transfer_state;
            return sd_r1b;

        default:
            break;
        }
        break;

    case 13:	/* CMD13:  SEND_STATUS */
        switch (sd->mode) {
        case sd_data_transfer_mode:
            if (sd->rca != rca)
                return sd_r0;

            return sd_r1;

        default:
            break;
        }
        break;

    case 15:	/* CMD15:  GO_INACTIVE_STATE */
P
pbrook 已提交
1084 1085
        if (sd->spi)
            goto bad_cmd;
1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102
        switch (sd->mode) {
        case sd_data_transfer_mode:
            if (sd->rca != rca)
                return sd_r0;

            sd->state = sd_inactive_state;
            return sd_r0;

        default:
            break;
        }
        break;

    /* Block read commands (Classs 2) */
    case 16:	/* CMD16:  SET_BLOCKLEN */
        switch (sd->state) {
        case sd_transfer_state:
1103
            if (req.arg > (1 << HWBLOCK_SHIFT)) {
1104
                sd->card_status |= BLOCK_LEN_ERROR;
1105 1106
            } else {
                trace_sdcard_set_blocklen(req.arg);
1107
                sd->blk_len = req.arg;
1108
            }
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120

            return sd_r1;

        default:
            break;
        }
        break;

    case 17:	/* CMD17:  READ_SINGLE_BLOCK */
        switch (sd->state) {
        case sd_transfer_state:
            sd->state = sd_sendingdata_state;
1121
            sd->data_start = addr;
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136
            sd->data_offset = 0;

            if (sd->data_start + sd->blk_len > sd->size)
                sd->card_status |= ADDRESS_ERROR;
            return sd_r1;

        default:
            break;
        }
        break;

    case 18:	/* CMD18:  READ_MULTIPLE_BLOCK */
        switch (sd->state) {
        case sd_transfer_state:
            sd->state = sd_sendingdata_state;
1137
            sd->data_start = addr;
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
            sd->data_offset = 0;

            if (sd->data_start + sd->blk_len > sd->size)
                sd->card_status |= ADDRESS_ERROR;
            return sd_r1;

        default:
            break;
        }
        break;

1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
    case 23:    /* CMD23: SET_BLOCK_COUNT */
        switch (sd->state) {
        case sd_transfer_state:
            sd->multi_blk_cnt = req.arg;
            return sd_r1;

        default:
            break;
        }
        break;

1160 1161
    /* Block write commands (Class 4) */
    case 24:	/* CMD24:  WRITE_SINGLE_BLOCK */
P
pbrook 已提交
1162 1163
        if (sd->spi)
            goto unimplemented_cmd;
1164 1165
        switch (sd->state) {
        case sd_transfer_state:
P
pbrook 已提交
1166 1167 1168
            /* Writing in SPI mode not implemented.  */
            if (sd->spi)
                break;
1169
            sd->state = sd_receivingdata_state;
1170
            sd->data_start = addr;
1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187
            sd->data_offset = 0;
            sd->blk_written = 0;

            if (sd->data_start + sd->blk_len > sd->size)
                sd->card_status |= ADDRESS_ERROR;
            if (sd_wp_addr(sd, sd->data_start))
                sd->card_status |= WP_VIOLATION;
            if (sd->csd[14] & 0x30)
                sd->card_status |= WP_VIOLATION;
            return sd_r1;

        default:
            break;
        }
        break;

    case 25:	/* CMD25:  WRITE_MULTIPLE_BLOCK */
P
pbrook 已提交
1188 1189
        if (sd->spi)
            goto unimplemented_cmd;
1190 1191
        switch (sd->state) {
        case sd_transfer_state:
P
pbrook 已提交
1192 1193 1194
            /* Writing in SPI mode not implemented.  */
            if (sd->spi)
                break;
1195
            sd->state = sd_receivingdata_state;
1196
            sd->data_start = addr;
1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
            sd->data_offset = 0;
            sd->blk_written = 0;

            if (sd->data_start + sd->blk_len > sd->size)
                sd->card_status |= ADDRESS_ERROR;
            if (sd_wp_addr(sd, sd->data_start))
                sd->card_status |= WP_VIOLATION;
            if (sd->csd[14] & 0x30)
                sd->card_status |= WP_VIOLATION;
            return sd_r1;

        default:
            break;
        }
        break;

    case 26:	/* CMD26:  PROGRAM_CID */
P
pbrook 已提交
1214 1215
        if (sd->spi)
            goto bad_cmd;
1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228
        switch (sd->state) {
        case sd_transfer_state:
            sd->state = sd_receivingdata_state;
            sd->data_start = 0;
            sd->data_offset = 0;
            return sd_r1;

        default:
            break;
        }
        break;

    case 27:	/* CMD27:  PROGRAM_CSD */
P
pbrook 已提交
1229 1230
        if (sd->spi)
            goto unimplemented_cmd;
1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246
        switch (sd->state) {
        case sd_transfer_state:
            sd->state = sd_receivingdata_state;
            sd->data_start = 0;
            sd->data_offset = 0;
            return sd_r1;

        default:
            break;
        }
        break;

    /* Write protection (Class 6) */
    case 28:	/* CMD28:  SET_WRITE_PROT */
        switch (sd->state) {
        case sd_transfer_state:
1247
            if (addr >= sd->size) {
1248
                sd->card_status |= ADDRESS_ERROR;
1249 1250 1251 1252
                return sd_r1b;
            }

            sd->state = sd_programming_state;
1253
            set_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265
            /* Bzzzzzzztt .... Operation complete.  */
            sd->state = sd_transfer_state;
            return sd_r1b;

        default:
            break;
        }
        break;

    case 29:	/* CMD29:  CLR_WRITE_PROT */
        switch (sd->state) {
        case sd_transfer_state:
1266
            if (addr >= sd->size) {
1267
                sd->card_status |= ADDRESS_ERROR;
1268 1269 1270 1271
                return sd_r1b;
            }

            sd->state = sd_programming_state;
1272
            clear_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286
            /* Bzzzzzzztt .... Operation complete.  */
            sd->state = sd_transfer_state;
            return sd_r1b;

        default:
            break;
        }
        break;

    case 30:	/* CMD30:  SEND_WRITE_PROT */
        switch (sd->state) {
        case sd_transfer_state:
            sd->state = sd_sendingdata_state;
            *(uint32_t *) sd->data = sd_wpbits(sd, req.arg);
1287
            sd->data_start = addr;
1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
            sd->data_offset = 0;
            return sd_r1b;

        default:
            break;
        }
        break;

    /* Erase commands (Class 5) */
    case 32:	/* CMD32:  ERASE_WR_BLK_START */
        switch (sd->state) {
        case sd_transfer_state:
            sd->erase_start = req.arg;
            return sd_r1;

        default:
            break;
        }
        break;

    case 33:	/* CMD33:  ERASE_WR_BLK_END */
        switch (sd->state) {
        case sd_transfer_state:
            sd->erase_end = req.arg;
            return sd_r1;

        default:
            break;
        }
        break;

    case 38:	/* CMD38:  ERASE */
        switch (sd->state) {
        case sd_transfer_state:
            if (sd->csd[14] & 0x30) {
                sd->card_status |= WP_VIOLATION;
                return sd_r1b;
            }

            sd->state = sd_programming_state;
            sd_erase(sd);
            /* Bzzzzzzztt .... Operation complete.  */
            sd->state = sd_transfer_state;
            return sd_r1b;

        default:
            break;
        }
        break;

    /* Lock card commands (Class 7) */
    case 42:	/* CMD42:  LOCK_UNLOCK */
P
pbrook 已提交
1340 1341
        if (sd->spi)
            goto unimplemented_cmd;
1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353
        switch (sd->state) {
        case sd_transfer_state:
            sd->state = sd_receivingdata_state;
            sd->data_start = 0;
            sd->data_offset = 0;
            return sd_r1;

        default:
            break;
        }
        break;

1354 1355 1356 1357 1358 1359 1360 1361
    case 52:
    case 53:
        /* CMD52, CMD53: reserved for SDIO cards
         * (see the SDIO Simplified Specification V2.0)
         * Handle as illegal command but do not complain
         * on stderr, as some OSes may use these in their
         * probing for presence of an SDIO card.
         */
1362
        return sd_illegal;
1363

1364 1365 1366 1367 1368
    /* Application specific commands (Class 8) */
    case 55:	/* CMD55:  APP_CMD */
        if (sd->rca != rca)
            return sd_r0;

1369
        sd->expecting_acmd = true;
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388
        sd->card_status |= APP_CMD;
        return sd_r1;

    case 56:	/* CMD56:  GEN_CMD */
        switch (sd->state) {
        case sd_transfer_state:
            sd->data_offset = 0;
            if (req.arg & 1)
                sd->state = sd_sendingdata_state;
            else
                sd->state = sd_receivingdata_state;
            return sd_r1;

        default:
            break;
        }
        break;

    default:
P
pbrook 已提交
1389
    bad_cmd:
1390
        qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
1391
        return sd_illegal;
P
pbrook 已提交
1392 1393 1394

    unimplemented_cmd:
        /* Commands that are recognised but not yet implemented in SPI mode.  */
1395 1396
        qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
                      req.cmd);
1397
        return sd_illegal;
1398 1399
    }

1400
    qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state\n", req.cmd);
1401
    return sd_illegal;
1402 1403
}

A
Anthony Liguori 已提交
1404
static sd_rsp_type_t sd_app_command(SDState *sd,
1405 1406
                                    SDRequest req)
{
1407
    trace_sdcard_app_command(req.cmd, req.arg);
1408
    sd->card_status |= APP_CMD;
1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424
    switch (req.cmd) {
    case 6:	/* ACMD6:  SET_BUS_WIDTH */
        switch (sd->state) {
        case sd_transfer_state:
            sd->sd_status[0] &= 0x3f;
            sd->sd_status[0] |= (req.arg & 0x03) << 6;
            return sd_r1;

        default:
            break;
        }
        break;

    case 13:	/* ACMD13: SD_STATUS */
        switch (sd->state) {
        case sd_transfer_state:
1425
            sd->state = sd_sendingdata_state;
1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439
            sd->data_start = 0;
            sd->data_offset = 0;
            return sd_r1;

        default:
            break;
        }
        break;

    case 22:	/* ACMD22: SEND_NUM_WR_BLOCKS */
        switch (sd->state) {
        case sd_transfer_state:
            *(uint32_t *) sd->data = sd->blk_written;

1440
            sd->state = sd_sendingdata_state;
1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
            sd->data_start = 0;
            sd->data_offset = 0;
            return sd_r1;

        default:
            break;
        }
        break;

    case 23:	/* ACMD23: SET_WR_BLK_ERASE_COUNT */
        switch (sd->state) {
        case sd_transfer_state:
            return sd_r1;

        default:
            break;
        }
        break;

    case 41:	/* ACMD41: SD_APP_OP_COND */
P
pbrook 已提交
1461 1462 1463 1464 1465
        if (sd->spi) {
            /* SEND_OP_CMD */
            sd->state = sd_transfer_state;
            return sd_r1;
        }
1466 1467
        switch (sd->state) {
        case sd_idle_state:
1468 1469 1470 1471 1472 1473 1474 1475
            /* If it's the first ACMD41 since reset, we need to decide
             * whether to power up. If this is not an enquiry ACMD41,
             * we immediately report power on and proceed below to the
             * ready state, but if it is, we set a timer to model a
             * delay for power up. This works around a bug in EDK2
             * UEFI, which sends an initial enquiry ACMD41, but
             * assumes that the card is in ready state as soon as it
             * sees the power up bit set. */
1476
            if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) {
1477 1478 1479
                if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
                    timer_del(sd->ocr_power_timer);
                    sd_ocr_powerup(sd);
1480 1481 1482 1483 1484 1485 1486
                } else {
                    trace_sdcard_inquiry_cmd41();
                    if (!timer_pending(sd->ocr_power_timer)) {
                        timer_mod_ns(sd->ocr_power_timer,
                                     (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
                                      + OCR_POWER_DELAY_NS));
                    }
1487 1488 1489
                }
            }

1490 1491
            /* We accept any voltage.  10000 V is nothing.
             *
1492
             * Once we're powered up, we advance straight to ready state
1493 1494 1495
             * unless it's an enquiry ACMD41 (bits 23:0 == 0).
             */
            if (req.arg & ACMD41_ENQUIRY_MASK) {
1496
                sd->state = sd_ready_state;
1497
            }
1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534

            return sd_r3;

        default:
            break;
        }
        break;

    case 42:	/* ACMD42: SET_CLR_CARD_DETECT */
        switch (sd->state) {
        case sd_transfer_state:
            /* Bringing in the 50KOhm pull-up resistor... Done.  */
            return sd_r1;

        default:
            break;
        }
        break;

    case 51:	/* ACMD51: SEND_SCR */
        switch (sd->state) {
        case sd_transfer_state:
            sd->state = sd_sendingdata_state;
            sd->data_start = 0;
            sd->data_offset = 0;
            return sd_r1;

        default:
            break;
        }
        break;

    default:
        /* Fall back to standard commands.  */
        return sd_normal_command(sd, req);
    }

1535
    qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
1536
    return sd_illegal;
1537 1538
}

1539 1540 1541 1542 1543 1544 1545 1546 1547 1548
static int cmd_valid_while_locked(SDState *sd, SDRequest *req)
{
    /* Valid commands in locked state:
     * basic class (0)
     * lock card class (7)
     * CMD16
     * implicitly, the ACMD prefix CMD55
     * ACMD41 and ACMD42
     * Anything else provokes an "illegal command" response.
     */
1549
    if (sd->expecting_acmd) {
1550 1551 1552 1553 1554
        return req->cmd == 41 || req->cmd == 42;
    }
    if (req->cmd == 16 || req->cmd == 55) {
        return 1;
    }
1555 1556
    return sd_cmd_class[req->cmd] == 0
            || sd_cmd_class[req->cmd] == 7;
1557 1558
}

P
Paul Brook 已提交
1559
int sd_do_command(SDState *sd, SDRequest *req,
1560
                  uint8_t *response) {
1561
    int last_state;
A
Anthony Liguori 已提交
1562
    sd_rsp_type_t rtype;
1563 1564
    int rsplen;

1565
    if (!sd->blk || !blk_is_inserted(sd->blk) || !sd->enable) {
1566 1567 1568 1569
        return 0;
    }

    if (sd_req_crc_validate(req)) {
1570
        sd->card_status |= COM_CRC_ERROR;
1571 1572
        rtype = sd_illegal;
        goto send_response;
1573 1574
    }

1575 1576 1577 1578 1579 1580
    if (req->cmd >= SDMMC_CMD_MAX) {
        qemu_log_mask(LOG_GUEST_ERROR, "SD: incorrect command 0x%02x\n",
                      req->cmd);
        req->cmd &= 0x3f;
    }

1581
    if (sd->card_status & CARD_IS_LOCKED) {
1582
        if (!cmd_valid_while_locked(sd, req)) {
1583
            sd->card_status |= ILLEGAL_COMMAND;
1584
            sd->expecting_acmd = false;
1585
            qemu_log_mask(LOG_GUEST_ERROR, "SD: Card is locked\n");
1586 1587
            rtype = sd_illegal;
            goto send_response;
1588
        }
1589
    }
1590

1591 1592 1593
    last_state = sd->state;
    sd_set_mode(sd);

1594
    if (sd->expecting_acmd) {
1595
        sd->expecting_acmd = false;
1596
        rtype = sd_app_command(sd, *req);
1597
    } else {
1598
        rtype = sd_normal_command(sd, *req);
1599
    }
1600

1601 1602
    if (rtype == sd_illegal) {
        sd->card_status |= ILLEGAL_COMMAND;
1603 1604 1605 1606 1607 1608 1609
    } else {
        /* Valid command, we can update the 'state before command' bits.
         * (Do this now so they appear in r1 responses.)
         */
        sd->current_cmd = req->cmd;
        sd->card_status &= ~CURRENT_STATE;
        sd->card_status |= (last_state << 9);
1610 1611
    }

1612
send_response:
1613 1614 1615
    switch (rtype) {
    case sd_r1:
    case sd_r1b:
1616
        sd_response_r1_make(sd, response);
1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639
        rsplen = 4;
        break;

    case sd_r2_i:
        memcpy(response, sd->cid, sizeof(sd->cid));
        rsplen = 16;
        break;

    case sd_r2_s:
        memcpy(response, sd->csd, sizeof(sd->csd));
        rsplen = 16;
        break;

    case sd_r3:
        sd_response_r3_make(sd, response);
        rsplen = 4;
        break;

    case sd_r6:
        sd_response_r6_make(sd, response);
        rsplen = 4;
        break;

1640 1641 1642 1643 1644
    case sd_r7:
        sd_response_r7_make(sd, response);
        rsplen = 4;
        break;

1645
    case sd_r0:
1646
    case sd_illegal:
1647 1648
        rsplen = 0;
        break;
1649 1650
    default:
        g_assert_not_reached();
1651
    }
1652
    trace_sdcard_response(sd_response_name(rtype), rsplen);
1653

1654 1655 1656 1657 1658 1659 1660
    if (rtype != sd_illegal) {
        /* Clear the "clear on valid command" status bits now we've
         * sent any response
         */
        sd->card_status &= ~CARD_STATUS_B;
    }

1661
#ifdef DEBUG_SD
1662
    qemu_hexdump((const char *)response, stderr, "Response", rsplen);
1663 1664 1665 1666 1667
#endif

    return rsplen;
}

1668
static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
1669
{
1670
    trace_sdcard_read_block(addr, len);
1671
    if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
B
balrog 已提交
1672
        fprintf(stderr, "sd_blk_read: read error on host side\n");
1673 1674 1675
    }
}

1676
static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
1677
{
1678
    trace_sdcard_write_block(addr, len);
1679 1680
    if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
        fprintf(stderr, "sd_blk_write: write error on host side\n");
1681 1682 1683
    }
}

1684 1685
#define BLK_READ_BLOCK(a, len)	sd_blk_read(sd, a, len)
#define BLK_WRITE_BLOCK(a, len)	sd_blk_write(sd, a, len)
1686 1687 1688 1689 1690 1691 1692
#define APP_READ_BLOCK(a, len)	memset(sd->data, 0xec, len)
#define APP_WRITE_BLOCK(a, len)

void sd_write_data(SDState *sd, uint8_t value)
{
    int i;

1693
    if (!sd->blk || !blk_is_inserted(sd->blk) || !sd->enable)
1694 1695 1696
        return;

    if (sd->state != sd_receivingdata_state) {
1697 1698
        qemu_log_mask(LOG_GUEST_ERROR,
                      "sd_write_data: not in Receiving-Data state\n");
1699 1700 1701 1702 1703 1704
        return;
    }

    if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
        return;

1705
    trace_sdcard_write_data(sd->current_cmd, value);
1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720
    switch (sd->current_cmd) {
    case 24:	/* CMD24:  WRITE_SINGLE_BLOCK */
        sd->data[sd->data_offset ++] = value;
        if (sd->data_offset >= sd->blk_len) {
            /* TODO: Check CRC before committing */
            sd->state = sd_programming_state;
            BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
            sd->blk_written ++;
            sd->csd[14] |= 0x40;
            /* Bzzzzzzztt .... Operation complete.  */
            sd->state = sd_transfer_state;
        }
        break;

    case 25:	/* CMD25:  WRITE_MULTIPLE_BLOCK */
1721
        if (sd->data_offset == 0) {
1722
            /* Start of the block - let's check the address is valid */
1723 1724 1725 1726 1727 1728 1729 1730
            if (sd->data_start + sd->blk_len > sd->size) {
                sd->card_status |= ADDRESS_ERROR;
                break;
            }
            if (sd_wp_addr(sd, sd->data_start)) {
                sd->card_status |= WP_VIOLATION;
                break;
            }
1731 1732 1733 1734 1735 1736 1737 1738 1739
        }
        sd->data[sd->data_offset++] = value;
        if (sd->data_offset >= sd->blk_len) {
            /* TODO: Check CRC before committing */
            sd->state = sd_programming_state;
            BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
            sd->blk_written++;
            sd->data_start += sd->blk_len;
            sd->data_offset = 0;
1740 1741 1742
            sd->csd[14] |= 0x40;

            /* Bzzzzzzztt .... Operation complete.  */
1743 1744 1745 1746 1747 1748 1749 1750
            if (sd->multi_blk_cnt != 0) {
                if (--sd->multi_blk_cnt == 0) {
                    /* Stop! */
                    sd->state = sd_transfer_state;
                    break;
                }
            }

1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817
            sd->state = sd_receivingdata_state;
        }
        break;

    case 26:	/* CMD26:  PROGRAM_CID */
        sd->data[sd->data_offset ++] = value;
        if (sd->data_offset >= sizeof(sd->cid)) {
            /* TODO: Check CRC before committing */
            sd->state = sd_programming_state;
            for (i = 0; i < sizeof(sd->cid); i ++)
                if ((sd->cid[i] | 0x00) != sd->data[i])
                    sd->card_status |= CID_CSD_OVERWRITE;

            if (!(sd->card_status & CID_CSD_OVERWRITE))
                for (i = 0; i < sizeof(sd->cid); i ++) {
                    sd->cid[i] |= 0x00;
                    sd->cid[i] &= sd->data[i];
                }
            /* Bzzzzzzztt .... Operation complete.  */
            sd->state = sd_transfer_state;
        }
        break;

    case 27:	/* CMD27:  PROGRAM_CSD */
        sd->data[sd->data_offset ++] = value;
        if (sd->data_offset >= sizeof(sd->csd)) {
            /* TODO: Check CRC before committing */
            sd->state = sd_programming_state;
            for (i = 0; i < sizeof(sd->csd); i ++)
                if ((sd->csd[i] | sd_csd_rw_mask[i]) !=
                    (sd->data[i] | sd_csd_rw_mask[i]))
                    sd->card_status |= CID_CSD_OVERWRITE;

            /* Copy flag (OTP) & Permanent write protect */
            if (sd->csd[14] & ~sd->data[14] & 0x60)
                sd->card_status |= CID_CSD_OVERWRITE;

            if (!(sd->card_status & CID_CSD_OVERWRITE))
                for (i = 0; i < sizeof(sd->csd); i ++) {
                    sd->csd[i] |= sd_csd_rw_mask[i];
                    sd->csd[i] &= sd->data[i];
                }
            /* Bzzzzzzztt .... Operation complete.  */
            sd->state = sd_transfer_state;
        }
        break;

    case 42:	/* CMD42:  LOCK_UNLOCK */
        sd->data[sd->data_offset ++] = value;
        if (sd->data_offset >= sd->blk_len) {
            /* TODO: Check CRC before committing */
            sd->state = sd_programming_state;
            sd_lock_command(sd);
            /* Bzzzzzzztt .... Operation complete.  */
            sd->state = sd_transfer_state;
        }
        break;

    case 56:	/* CMD56:  GEN_CMD */
        sd->data[sd->data_offset ++] = value;
        if (sd->data_offset >= sd->blk_len) {
            APP_WRITE_BLOCK(sd->data_start, sd->data_offset);
            sd->state = sd_transfer_state;
        }
        break;

    default:
1818
        qemu_log_mask(LOG_GUEST_ERROR, "sd_write_data: unknown command\n");
1819 1820 1821 1822 1823 1824 1825 1826
        break;
    }
}

uint8_t sd_read_data(SDState *sd)
{
    /* TODO: Append CRCs */
    uint8_t ret;
1827
    int io_len;
1828

1829
    if (!sd->blk || !blk_is_inserted(sd->blk) || !sd->enable)
1830 1831 1832
        return 0x00;

    if (sd->state != sd_sendingdata_state) {
1833 1834
        qemu_log_mask(LOG_GUEST_ERROR,
                      "sd_read_data: not in Sending-Data state\n");
1835 1836 1837 1838 1839 1840
        return 0x00;
    }

    if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
        return 0x00;

1841 1842
    io_len = (sd->ocr & (1 << 30)) ? 512 : sd->blk_len;

1843
    trace_sdcard_read_data(sd->current_cmd, io_len);
1844 1845 1846 1847 1848 1849 1850 1851
    switch (sd->current_cmd) {
    case 6:	/* CMD6:   SWITCH_FUNCTION */
        ret = sd->data[sd->data_offset ++];

        if (sd->data_offset >= 64)
            sd->state = sd_transfer_state;
        break;

P
pbrook 已提交
1852 1853 1854 1855 1856 1857 1858 1859
    case 9:	/* CMD9:   SEND_CSD */
    case 10:	/* CMD10:  SEND_CID */
        ret = sd->data[sd->data_offset ++];

        if (sd->data_offset >= 16)
            sd->state = sd_transfer_state;
        break;

1860 1861
    case 11:	/* CMD11:  READ_DAT_UNTIL_STOP */
        if (sd->data_offset == 0)
1862
            BLK_READ_BLOCK(sd->data_start, io_len);
1863 1864
        ret = sd->data[sd->data_offset ++];

1865 1866
        if (sd->data_offset >= io_len) {
            sd->data_start += io_len;
1867
            sd->data_offset = 0;
1868
            if (sd->data_start + io_len > sd->size) {
1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883
                sd->card_status |= ADDRESS_ERROR;
                break;
            }
        }
        break;

    case 13:	/* ACMD13: SD_STATUS */
        ret = sd->sd_status[sd->data_offset ++];

        if (sd->data_offset >= sizeof(sd->sd_status))
            sd->state = sd_transfer_state;
        break;

    case 17:	/* CMD17:  READ_SINGLE_BLOCK */
        if (sd->data_offset == 0)
1884
            BLK_READ_BLOCK(sd->data_start, io_len);
1885 1886
        ret = sd->data[sd->data_offset ++];

1887
        if (sd->data_offset >= io_len)
1888 1889 1890 1891
            sd->state = sd_transfer_state;
        break;

    case 18:	/* CMD18:  READ_MULTIPLE_BLOCK */
1892 1893 1894 1895 1896
        if (sd->data_offset == 0) {
            if (sd->data_start + io_len > sd->size) {
                sd->card_status |= ADDRESS_ERROR;
                return 0x00;
            }
1897
            BLK_READ_BLOCK(sd->data_start, io_len);
1898
        }
1899 1900
        ret = sd->data[sd->data_offset ++];

1901 1902
        if (sd->data_offset >= io_len) {
            sd->data_start += io_len;
1903
            sd->data_offset = 0;
1904 1905 1906 1907 1908 1909 1910 1911

            if (sd->multi_blk_cnt != 0) {
                if (--sd->multi_blk_cnt == 0) {
                    /* Stop! */
                    sd->state = sd_transfer_state;
                    break;
                }
            }
1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945
        }
        break;

    case 22:	/* ACMD22: SEND_NUM_WR_BLOCKS */
        ret = sd->data[sd->data_offset ++];

        if (sd->data_offset >= 4)
            sd->state = sd_transfer_state;
        break;

    case 30:	/* CMD30:  SEND_WRITE_PROT */
        ret = sd->data[sd->data_offset ++];

        if (sd->data_offset >= 4)
            sd->state = sd_transfer_state;
        break;

    case 51:	/* ACMD51: SEND_SCR */
        ret = sd->scr[sd->data_offset ++];

        if (sd->data_offset >= sizeof(sd->scr))
            sd->state = sd_transfer_state;
        break;

    case 56:	/* CMD56:  GEN_CMD */
        if (sd->data_offset == 0)
            APP_READ_BLOCK(sd->data_start, sd->blk_len);
        ret = sd->data[sd->data_offset ++];

        if (sd->data_offset >= sd->blk_len)
            sd->state = sd_transfer_state;
        break;

    default:
1946
        qemu_log_mask(LOG_GUEST_ERROR, "sd_read_data: unknown command\n");
1947 1948 1949 1950 1951 1952
        return 0x00;
    }

    return ret;
}

1953
bool sd_data_ready(SDState *sd)
1954 1955 1956
{
    return sd->state == sd_sendingdata_state;
}
B
balrog 已提交
1957

1958
void sd_enable(SDState *sd, bool enable)
B
balrog 已提交
1959 1960 1961
{
    sd->enable = enable;
}
P
Peter Maydell 已提交
1962 1963 1964 1965 1966 1967

static void sd_instance_init(Object *obj)
{
    SDState *sd = SD_CARD(obj);

    sd->enable = true;
1968
    sd->ocr_power_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sd_ocr_powerup, sd);
P
Peter Maydell 已提交
1969 1970
}

M
Marc-André Lureau 已提交
1971 1972 1973 1974 1975 1976 1977 1978
static void sd_instance_finalize(Object *obj)
{
    SDState *sd = SD_CARD(obj);

    timer_del(sd->ocr_power_timer);
    timer_free(sd->ocr_power_timer);
}

P
Peter Maydell 已提交
1979 1980 1981
static void sd_realize(DeviceState *dev, Error **errp)
{
    SDState *sd = SD_CARD(dev);
K
Kevin Wolf 已提交
1982
    int ret;
P
Peter Maydell 已提交
1983 1984 1985 1986 1987 1988 1989

    if (sd->blk && blk_is_read_only(sd->blk)) {
        error_setg(errp, "Cannot use read-only drive as SD card");
        return;
    }

    if (sd->blk) {
K
Kevin Wolf 已提交
1990 1991 1992 1993 1994
        ret = blk_set_perm(sd->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE,
                           BLK_PERM_ALL, errp);
        if (ret < 0) {
            return;
        }
P
Peter Maydell 已提交
1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011
        blk_set_dev_ops(sd->blk, &sd_block_ops, sd);
    }
}

static Property sd_properties[] = {
    DEFINE_PROP_DRIVE("drive", SDState, blk),
    /* We do not model the chip select pin, so allow the board to select
     * whether card should be in SSI or MMC/SD mode.  It is also up to the
     * board to ensure that ssi transfers only occur when the chip select
     * is asserted.  */
    DEFINE_PROP_BOOL("spi", SDState, spi, false),
    DEFINE_PROP_END_OF_LIST()
};

static void sd_class_init(ObjectClass *klass, void *data)
{
    DeviceClass *dc = DEVICE_CLASS(klass);
2012
    SDCardClass *sc = SD_CARD_CLASS(klass);
P
Peter Maydell 已提交
2013 2014 2015 2016

    dc->realize = sd_realize;
    dc->props = sd_properties;
    dc->vmsd = &sd_vmstate;
2017
    dc->reset = sd_reset;
2018 2019
    dc->bus_type = TYPE_SD_BUS;

2020
    sc->set_voltage = sd_set_voltage;
2021 2022
    sc->get_dat_lines = sd_get_dat_lines;
    sc->get_cmd_line = sd_get_cmd_line;
2023 2024 2025 2026 2027 2028 2029
    sc->do_command = sd_do_command;
    sc->write_data = sd_write_data;
    sc->read_data = sd_read_data;
    sc->data_ready = sd_data_ready;
    sc->enable = sd_enable;
    sc->get_inserted = sd_get_inserted;
    sc->get_readonly = sd_get_readonly;
P
Peter Maydell 已提交
2030 2031 2032 2033 2034 2035
}

static const TypeInfo sd_info = {
    .name = TYPE_SD_CARD,
    .parent = TYPE_DEVICE,
    .instance_size = sizeof(SDState),
2036
    .class_size = sizeof(SDCardClass),
P
Peter Maydell 已提交
2037 2038
    .class_init = sd_class_init,
    .instance_init = sd_instance_init,
M
Marc-André Lureau 已提交
2039
    .instance_finalize = sd_instance_finalize,
P
Peter Maydell 已提交
2040 2041 2042 2043 2044 2045 2046 2047
};

static void sd_register_types(void)
{
    type_register_static(&sd_info);
}

type_init(sd_register_types)