Lines Matching refs:req

108 typedef sd_rsp_type_t (*sd_cmd_handler)(SDState *sd, SDRequest req);
635 static uint16_t sd_req_get_rca(SDState *s, SDRequest req) in sd_req_get_rca() argument
637 switch (s->proto->cmd[req.cmd].type) { in sd_req_get_rca()
640 return req.arg >> 16; in sd_req_get_rca()
647 static bool sd_req_rca_same(SDState *s, SDRequest req) in sd_req_rca_same() argument
649 return sd_req_get_rca(s, req) == s->rca; in sd_req_rca_same()
731 static int sd_req_crc_validate(SDRequest *req) in sd_req_crc_validate() argument
734 buffer[0] = 0x40 | req->cmd; in sd_req_crc_validate()
735 stl_be_p(&buffer[1], req->arg); in sd_req_crc_validate()
737 return sd_crc7(buffer, 5) != req->crc; /* TODO */ in sd_req_crc_validate()
805 static uint64_t sd_req_get_address(SDState *sd, SDRequest req) in sd_req_get_address() argument
810 addr = (uint64_t) req.arg << HWBLOCK_SHIFT; in sd_req_get_address()
812 addr = req.arg; in sd_req_get_address()
814 trace_sdcard_req_addr(req.arg, addr); in sd_req_get_address()
1300 static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req) in sd_invalid_state_for_cmd() argument
1303 sd->proto->name, req.cmd, sd_state_name(sd->state), in sd_invalid_state_for_cmd()
1309 static sd_rsp_type_t sd_invalid_mode_for_cmd(SDState *sd, SDRequest req) in sd_invalid_mode_for_cmd() argument
1312 sd->proto->name, req.cmd, sd_mode_name(sd->mode), in sd_invalid_mode_for_cmd()
1318 static sd_rsp_type_t sd_cmd_illegal(SDState *sd, SDRequest req) in sd_cmd_illegal() argument
1321 sd->proto->name, req.cmd, in sd_cmd_illegal()
1328 static sd_rsp_type_t sd_cmd_unimplemented(SDState *sd, SDRequest req) in sd_cmd_unimplemented() argument
1331 sd->proto->name, req.cmd); in sd_cmd_unimplemented()
1336 static sd_rsp_type_t sd_cmd_optional(SDState *sd, SDRequest req) in sd_cmd_optional() argument
1339 sd->proto->name, req.cmd); in sd_cmd_optional()
1345 static sd_rsp_type_t sd_cmd_to_receivingdata(SDState *sd, SDRequest req, in sd_cmd_to_receivingdata() argument
1349 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_to_receivingdata()
1360 static sd_rsp_type_t sd_cmd_to_sendingdata(SDState *sd, SDRequest req, in sd_cmd_to_sendingdata() argument
1365 sd_invalid_state_for_cmd(sd, req); in sd_cmd_to_sendingdata()
1382 static sd_rsp_type_t sd_cmd_GO_IDLE_STATE(SDState *sd, SDRequest req) in sd_cmd_GO_IDLE_STATE() argument
1385 switch (req.arg) { in sd_cmd_GO_IDLE_STATE()
1402 static sd_rsp_type_t spi_cmd_SEND_OP_COND(SDState *sd, SDRequest req) in spi_cmd_SEND_OP_COND() argument
1410 static sd_rsp_type_t sd_cmd_ALL_SEND_CID(SDState *sd, SDRequest req) in sd_cmd_ALL_SEND_CID() argument
1417 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_ALL_SEND_CID()
1422 static sd_rsp_type_t sd_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req) in sd_cmd_SEND_RELATIVE_ADDR() argument
1435 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SEND_RELATIVE_ADDR()
1439 static sd_rsp_type_t emmc_cmd_SET_RELATIVE_ADDR(SDState *sd, SDRequest req) in emmc_cmd_SET_RELATIVE_ADDR() argument
1445 sd_set_rca(sd, req.arg >> 16); in emmc_cmd_SET_RELATIVE_ADDR()
1449 return sd_invalid_state_for_cmd(sd, req); in emmc_cmd_SET_RELATIVE_ADDR()
1454 static sd_rsp_type_t emmc_cmd_sleep_awake(SDState *sd, SDRequest req) in emmc_cmd_sleep_awake() argument
1456 bool do_sleep = extract32(req.arg, 15, 1); in emmc_cmd_sleep_awake()
1473 return sd_invalid_state_for_cmd(sd, req); in emmc_cmd_sleep_awake()
1478 static sd_rsp_type_t sd_cmd_SWITCH_FUNCTION(SDState *sd, SDRequest req) in sd_cmd_SWITCH_FUNCTION() argument
1481 return sd_invalid_mode_for_cmd(sd, req); in sd_cmd_SWITCH_FUNCTION()
1484 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SWITCH_FUNCTION()
1487 sd_function_switch(sd, req.arg); in sd_cmd_SWITCH_FUNCTION()
1488 return sd_cmd_to_sendingdata(sd, req, 0, NULL, 64); in sd_cmd_SWITCH_FUNCTION()
1491 static sd_rsp_type_t emmc_cmd_SWITCH(SDState *sd, SDRequest req) in emmc_cmd_SWITCH() argument
1496 emmc_function_switch(sd, req.arg); in emmc_cmd_SWITCH()
1500 return sd_invalid_state_for_cmd(sd, req); in emmc_cmd_SWITCH()
1505 static sd_rsp_type_t sd_cmd_DE_SELECT_CARD(SDState *sd, SDRequest req) in sd_cmd_DE_SELECT_CARD() argument
1507 bool same_rca = sd_req_rca_same(sd, req); in sd_cmd_DE_SELECT_CARD()
1542 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_DE_SELECT_CARD()
1546 static sd_rsp_type_t sd_cmd_SEND_IF_COND(SDState *sd, SDRequest req) in sd_cmd_SEND_IF_COND() argument
1549 return sd_cmd_illegal(sd, req); in sd_cmd_SEND_IF_COND()
1552 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SEND_IF_COND()
1557 if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) { in sd_cmd_SEND_IF_COND()
1562 sd->vhs = req.arg; in sd_cmd_SEND_IF_COND()
1567 static sd_rsp_type_t emmc_cmd_SEND_EXT_CSD(SDState *sd, SDRequest req) in emmc_cmd_SEND_EXT_CSD() argument
1570 return sd_invalid_state_for_cmd(sd, req); in emmc_cmd_SEND_EXT_CSD()
1573 return sd_cmd_to_sendingdata(sd, req, sd_req_get_address(sd, req), in emmc_cmd_SEND_EXT_CSD()
1578 static sd_rsp_type_t spi_cmd_SEND_CSD(SDState *sd, SDRequest req) in spi_cmd_SEND_CSD() argument
1581 return sd_invalid_state_for_cmd(sd, req); in spi_cmd_SEND_CSD()
1583 return sd_cmd_to_sendingdata(sd, req, sd_req_get_address(sd, req), in spi_cmd_SEND_CSD()
1587 static sd_rsp_type_t sd_cmd_SEND_CSD(SDState *sd, SDRequest req) in sd_cmd_SEND_CSD() argument
1590 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SEND_CSD()
1593 return sd_req_rca_same(sd, req) ? sd_r2_s : sd_r0; in sd_cmd_SEND_CSD()
1597 static sd_rsp_type_t spi_cmd_SEND_CID(SDState *sd, SDRequest req) in spi_cmd_SEND_CID() argument
1600 return sd_invalid_state_for_cmd(sd, req); in spi_cmd_SEND_CID()
1602 return sd_cmd_to_sendingdata(sd, req, sd_req_get_address(sd, req), in spi_cmd_SEND_CID()
1606 static sd_rsp_type_t sd_cmd_SEND_CID(SDState *sd, SDRequest req) in sd_cmd_SEND_CID() argument
1609 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SEND_CID()
1612 return sd_req_rca_same(sd, req) ? sd_r2_i : sd_r0; in sd_cmd_SEND_CID()
1616 static sd_rsp_type_t sd_cmd_STOP_TRANSMISSION(SDState *sd, SDRequest req) in sd_cmd_STOP_TRANSMISSION() argument
1628 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_STOP_TRANSMISSION()
1633 static sd_rsp_type_t sd_cmd_SEND_STATUS(SDState *sd, SDRequest req) in sd_cmd_SEND_STATUS() argument
1636 return sd_invalid_mode_for_cmd(sd, req); in sd_cmd_SEND_STATUS()
1648 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SEND_STATUS()
1655 return sd_req_rca_same(sd, req) ? sd_r1 : sd_r0; in sd_cmd_SEND_STATUS()
1659 static sd_rsp_type_t sd_cmd_GO_INACTIVE_STATE(SDState *sd, SDRequest req) in sd_cmd_GO_INACTIVE_STATE() argument
1662 return sd_invalid_mode_for_cmd(sd, req); in sd_cmd_GO_INACTIVE_STATE()
1673 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_GO_INACTIVE_STATE()
1675 if (sd_req_rca_same(sd, req)) { in sd_cmd_GO_INACTIVE_STATE()
1683 static sd_rsp_type_t sd_cmd_SET_BLOCKLEN(SDState *sd, SDRequest req) in sd_cmd_SET_BLOCKLEN() argument
1686 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SET_BLOCKLEN()
1688 if (req.arg > (1 << HWBLOCK_SHIFT)) { in sd_cmd_SET_BLOCKLEN()
1691 trace_sdcard_set_blocklen(req.arg); in sd_cmd_SET_BLOCKLEN()
1692 sd->blk_len = req.arg; in sd_cmd_SET_BLOCKLEN()
1699 static sd_rsp_type_t sd_cmd_READ_SINGLE_BLOCK(SDState *sd, SDRequest req) in sd_cmd_READ_SINGLE_BLOCK() argument
1704 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_READ_SINGLE_BLOCK()
1707 addr = sd_req_get_address(sd, req); in sd_cmd_READ_SINGLE_BLOCK()
1713 return sd_cmd_to_sendingdata(sd, req, addr, NULL, sd->blk_len); in sd_cmd_READ_SINGLE_BLOCK()
1717 static sd_rsp_type_t sd_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req) in sd_cmd_SEND_TUNING_BLOCK() argument
1720 return sd_cmd_illegal(sd, req); in sd_cmd_SEND_TUNING_BLOCK()
1723 return sd_cmd_to_sendingdata(sd, req, 0, in sd_cmd_SEND_TUNING_BLOCK()
1729 static sd_rsp_type_t sd_cmd_SET_BLOCK_COUNT(SDState *sd, SDRequest req) in sd_cmd_SET_BLOCK_COUNT() argument
1732 return sd_cmd_illegal(sd, req); in sd_cmd_SET_BLOCK_COUNT()
1736 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SET_BLOCK_COUNT()
1739 sd->multi_blk_cnt = req.arg; in sd_cmd_SET_BLOCK_COUNT()
1749 static sd_rsp_type_t sd_cmd_WRITE_SINGLE_BLOCK(SDState *sd, SDRequest req) in sd_cmd_WRITE_SINGLE_BLOCK() argument
1754 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_WRITE_SINGLE_BLOCK()
1757 addr = sd_req_get_address(sd, req); in sd_cmd_WRITE_SINGLE_BLOCK()
1772 return sd_cmd_to_receivingdata(sd, req, addr, sd->blk_len); in sd_cmd_WRITE_SINGLE_BLOCK()
1776 static sd_rsp_type_t emmc_cmd_PROGRAM_CID(SDState *sd, SDRequest req) in emmc_cmd_PROGRAM_CID() argument
1778 return sd_cmd_to_receivingdata(sd, req, 0, sizeof(sd->cid)); in emmc_cmd_PROGRAM_CID()
1782 static sd_rsp_type_t sd_cmd_PROGRAM_CSD(SDState *sd, SDRequest req) in sd_cmd_PROGRAM_CSD() argument
1784 return sd_cmd_to_receivingdata(sd, req, 0, sizeof(sd->csd)); in sd_cmd_PROGRAM_CSD()
1787 static sd_rsp_type_t sd_cmd_SET_CLR_WRITE_PROT(SDState *sd, SDRequest req, in sd_cmd_SET_CLR_WRITE_PROT() argument
1797 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SET_CLR_WRITE_PROT()
1800 addr = sd_req_get_address(sd, req); in sd_cmd_SET_CLR_WRITE_PROT()
1818 static sd_rsp_type_t sd_cmd_SET_WRITE_PROT(SDState *sd, SDRequest req) in sd_cmd_SET_WRITE_PROT() argument
1820 return sd_cmd_SET_CLR_WRITE_PROT(sd, req, true); in sd_cmd_SET_WRITE_PROT()
1824 static sd_rsp_type_t sd_cmd_CLR_WRITE_PROT(SDState *sd, SDRequest req) in sd_cmd_CLR_WRITE_PROT() argument
1826 return sd_cmd_SET_CLR_WRITE_PROT(sd, req, false); in sd_cmd_CLR_WRITE_PROT()
1830 static sd_rsp_type_t sd_cmd_SEND_WRITE_PROT(SDState *sd, SDRequest req) in sd_cmd_SEND_WRITE_PROT() argument
1840 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SEND_WRITE_PROT()
1843 addr = sd_req_get_address(sd, req); in sd_cmd_SEND_WRITE_PROT()
1848 data = sd_wpbits(sd, req.arg); in sd_cmd_SEND_WRITE_PROT()
1849 return sd_cmd_to_sendingdata(sd, req, addr, &data, sizeof(data)); in sd_cmd_SEND_WRITE_PROT()
1853 static sd_rsp_type_t sd_cmd_ERASE_WR_BLK_START(SDState *sd, SDRequest req) in sd_cmd_ERASE_WR_BLK_START() argument
1856 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_ERASE_WR_BLK_START()
1858 sd->erase_start = req.arg; in sd_cmd_ERASE_WR_BLK_START()
1863 static sd_rsp_type_t sd_cmd_ERASE_WR_BLK_END(SDState *sd, SDRequest req) in sd_cmd_ERASE_WR_BLK_END() argument
1866 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_ERASE_WR_BLK_END()
1868 sd->erase_end = req.arg; in sd_cmd_ERASE_WR_BLK_END()
1873 static sd_rsp_type_t sd_cmd_ERASE(SDState *sd, SDRequest req) in sd_cmd_ERASE() argument
1876 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_ERASE()
1891 static sd_rsp_type_t sd_cmd_LOCK_UNLOCK(SDState *sd, SDRequest req) in sd_cmd_LOCK_UNLOCK() argument
1893 return sd_cmd_to_receivingdata(sd, req, 0, 0); in sd_cmd_LOCK_UNLOCK()
1897 static sd_rsp_type_t sd_cmd_APP_CMD(SDState *sd, SDRequest req) in sd_cmd_APP_CMD() argument
1904 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_APP_CMD()
1906 if (!sd_is_spi(sd) && sd_req_get_rca(sd, req) != 0x0000) { in sd_cmd_APP_CMD()
1908 "SD: illegal RCA 0x%04x for APP_CMD\n", req.cmd); in sd_cmd_APP_CMD()
1914 if (!sd_is_spi(sd) && !sd_req_rca_same(sd, req)) { in sd_cmd_APP_CMD()
1924 static sd_rsp_type_t sd_cmd_GEN_CMD(SDState *sd, SDRequest req) in sd_cmd_GEN_CMD() argument
1927 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_GEN_CMD()
1931 if (req.arg & 1) { in sd_cmd_GEN_CMD()
1933 return sd_cmd_to_sendingdata(sd, req, 0, NULL, 0); in sd_cmd_GEN_CMD()
1935 return sd_cmd_to_receivingdata(sd, req, 0, 0); in sd_cmd_GEN_CMD()
1940 static sd_rsp_type_t spi_cmd_READ_OCR(SDState *sd, SDRequest req) in spi_cmd_READ_OCR() argument
1946 static sd_rsp_type_t spi_cmd_CRC_ON_OFF(SDState *sd, SDRequest req) in spi_cmd_CRC_ON_OFF() argument
1952 static sd_rsp_type_t sd_acmd_SET_BUS_WIDTH(SDState *sd, SDRequest req) in sd_acmd_SET_BUS_WIDTH() argument
1955 return sd_invalid_state_for_cmd(sd, req); in sd_acmd_SET_BUS_WIDTH()
1959 sd->sd_status[0] |= (req.arg & 0x03) << 6; in sd_acmd_SET_BUS_WIDTH()
1964 static sd_rsp_type_t sd_acmd_SD_STATUS(SDState *sd, SDRequest req) in sd_acmd_SD_STATUS() argument
1966 return sd_cmd_to_sendingdata(sd, req, 0, in sd_acmd_SD_STATUS()
1971 static sd_rsp_type_t sd_acmd_SEND_NUM_WR_BLOCKS(SDState *sd, SDRequest req) in sd_acmd_SEND_NUM_WR_BLOCKS() argument
1973 return sd_cmd_to_sendingdata(sd, req, 0, in sd_acmd_SEND_NUM_WR_BLOCKS()
1978 static sd_rsp_type_t sd_acmd_SET_WR_BLK_ERASE_COUNT(SDState *sd, SDRequest req) in sd_acmd_SET_WR_BLK_ERASE_COUNT() argument
1981 return sd_invalid_state_for_cmd(sd, req); in sd_acmd_SET_WR_BLK_ERASE_COUNT()
1987 static sd_rsp_type_t sd_cmd_SEND_OP_COND(SDState *sd, SDRequest req) in sd_cmd_SEND_OP_COND() argument
1990 return sd_invalid_state_for_cmd(sd, req); in sd_cmd_SEND_OP_COND()
2004 if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) { in sd_cmd_SEND_OP_COND()
2017 if (FIELD_EX32(sd->ocr & req.arg, OCR, VDD_VOLTAGE_WINDOW)) { in sd_cmd_SEND_OP_COND()
2031 static sd_rsp_type_t sd_acmd_SET_CLR_CARD_DETECT(SDState *sd, SDRequest req) in sd_acmd_SET_CLR_CARD_DETECT() argument
2034 return sd_invalid_state_for_cmd(sd, req); in sd_acmd_SET_CLR_CARD_DETECT()
2042 static sd_rsp_type_t sd_acmd_SEND_SCR(SDState *sd, SDRequest req) in sd_acmd_SEND_SCR() argument
2044 return sd_cmd_to_sendingdata(sd, req, 0, sd->scr, sizeof(sd->scr)); in sd_acmd_SEND_SCR()
2047 static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) in sd_normal_command() argument
2051 sd->last_cmd_name = sd_cmd_name(sd, req.cmd); in sd_normal_command()
2055 if (req.cmd != 55 || sd->expecting_acmd) { in sd_normal_command()
2057 sd->last_cmd_name, req.cmd, in sd_normal_command()
2058 req.arg, sd_state_name(sd->state)); in sd_normal_command()
2066 if (sd->multi_blk_cnt != 0 && !(req.cmd == 18 || req.cmd == 25)) { in sd_normal_command()
2070 if (sd->proto->cmd[req.cmd].class == 6 && FIELD_EX32(sd->ocr, OCR, in sd_normal_command()
2076 if (sd->proto->cmd[req.cmd].handler) { in sd_normal_command()
2077 return sd->proto->cmd[req.cmd].handler(sd, req); in sd_normal_command()
2080 switch (req.cmd) { in sd_normal_command()
2083 addr = sd_req_get_address(sd, req); in sd_normal_command()
2103 addr = sd_req_get_address(sd, req); in sd_normal_command()
2132 qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd); in sd_normal_command()
2136 return sd_invalid_state_for_cmd(sd, req); in sd_normal_command()
2140 SDRequest req) in sd_app_command() argument
2142 sd->last_cmd_name = sd_acmd_name(sd, req.cmd); in sd_app_command()
2144 req.cmd, req.arg, sd_state_name(sd->state)); in sd_app_command()
2147 if (sd->proto->acmd[req.cmd].handler) { in sd_app_command()
2148 return sd->proto->acmd[req.cmd].handler(sd, req); in sd_app_command()
2151 switch (req.cmd) { in sd_app_command()
2161 req.cmd); in sd_app_command()
2166 return sd_normal_command(sd, req); in sd_app_command()
2169 qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd); in sd_app_command()
2199 int sd_do_command(SDState *sd, SDRequest *req, in sd_do_command() argument
2214 if (sd_req_crc_validate(req)) { in sd_do_command()
2220 if (req->cmd >= SDMMC_CMD_MAX) { in sd_do_command()
2222 req->cmd); in sd_do_command()
2223 req->cmd &= 0x3f; in sd_do_command()
2226 if (sd->state == sd_sleep_state && req->cmd) { in sd_do_command()
2233 if (!cmd_valid_while_locked(sd, req->cmd)) { in sd_do_command()
2247 rtype = sd_app_command(sd, *req); in sd_do_command()
2249 rtype = sd_normal_command(sd, *req); in sd_do_command()
2322 sd->current_cmd = rtype == sd_illegal ? 0 : req->cmd; in sd_do_command()