actually sleep the vpu on arm init, added more stuff to sdhost, still broken though
[rpi-open-firmware.git] / arm_chainloader / drivers / sd2.hpp
index 27157ea..01bd117 100755 (executable)
-#pragma once\r
+/*     $NetBSD: sdmmcreg.h,v 1.21 2015/10/29 22:37:15 jmcneill Exp $   */\r
+/*     $OpenBSD: sdmmcreg.h,v 1.4 2009/01/09 10:55:22 jsg Exp $        */\r
 \r
-/* Error Code */\r
-#define        SD_NO_ERROR             0x0\r
-#define        SD_CRC_ERR              0x80\r
-#define        SD_TO_ERR               0x40\r
-#define        SD_NO_CARD              0x20\r
-#define SD_BUSY                        0x10\r
-#define        SD_STS_ERR              0x08\r
-#define SD_RSP_TIMEOUT         0x04\r
-#define SD_IO_ERR              0x02\r
-/* Return code for MMC switch bus */\r
-#define SWITCH_SUCCESS         0\r
-#define SWITCH_ERR             1\r
-#define SWITCH_FAIL            2\r
-/* MMC/SD Command Index */\r
-/* Basic command (class 0) */\r
-#define GO_IDLE_STATE          0\r
-#define        SEND_OP_COND            1\r
-#define        ALL_SEND_CID            2\r
-#define        SET_RELATIVE_ADDR       3\r
-#define        SEND_RELATIVE_ADDR      3\r
-#define        SET_DSR                 4\r
-#define IO_SEND_OP_COND                5\r
-#define        SWITCH                  6\r
-#define        SELECT_CARD             7\r
-#define        DESELECT_CARD           7\r
-/* CMD8 is "SEND_EXT_CSD" for MMC4.x Spec\r
- * while is "SEND_IF_COND" for SD 2.0\r
+/*\r
+ * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>\r
+ *\r
+ * Permission to use, copy, modify, and distribute this software for any\r
+ * purpose with or without fee is hereby granted, provided that the above\r
+ * copyright notice and this permission notice appear in all copies.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r
  */\r
-#define        SEND_EXT_CSD            8\r
-#define        SEND_IF_COND            8\r
-#define        SEND_CSD                9\r
-#define        SEND_CID                10\r
-#define        VOLTAGE_SWITCH          11\r
-#define        READ_DAT_UTIL_STOP      11\r
-#define        STOP_TRANSMISSION       12\r
-#define        SEND_STATUS             13\r
-#define        GO_INACTIVE_STATE       15\r
-#define        SET_BLOCKLEN            16\r
-#define        READ_SINGLE_BLOCK       17\r
-#define        READ_MULTIPLE_BLOCK     18\r
-#define        SEND_TUNING_PATTERN     19\r
-#define        BUSTEST_R               14\r
-#define        BUSTEST_W               19\r
-#define        WRITE_BLOCK             24\r
-#define        WRITE_MULTIPLE_BLOCK    25\r
-#define        PROGRAM_CSD             27\r
-#define        ERASE_WR_BLK_START      32\r
-#define        ERASE_WR_BLK_END        33\r
-#define        ERASE_CMD               38\r
-#define LOCK_UNLOCK            42\r
-#define        IO_RW_DIRECT            52\r
-#define        APP_CMD                 55\r
-#define        GEN_CMD                 56\r
-#define        SET_BUS_WIDTH           6\r
-#define        SD_STATUS               13\r
-#define        SEND_NUM_WR_BLOCKS      22\r
-#define        SET_WR_BLK_ERASE_COUNT  23\r
-#define        SD_APP_OP_COND          41\r
-#define        SET_CLR_CARD_DETECT     42\r
-#define        SEND_SCR                51\r
-#define        SD_READ_COMPLETE        0x00\r
-#define        SD_READ_TO              0x01\r
-#define        SD_READ_ADVENCE         0x02\r
-#define        SD_CHECK_MODE           0x00\r
-#define        SD_SWITCH_MODE          0x80\r
-#define        SD_FUNC_GROUP_1         0x01\r
-#define        SD_FUNC_GROUP_2         0x02\r
-#define        SD_FUNC_GROUP_3         0x03\r
-#define        SD_FUNC_GROUP_4         0x04\r
-#define        SD_CHECK_SPEC_V1_1      0xFF\r
-#define        NO_ARGUMENT                             0x00\r
-#define        CHECK_PATTERN                           0x000000AA\r
-#define        VOLTAGE_SUPPLY_RANGE                    0x00000100\r
-#define        SUPPORT_HIGH_AND_EXTENDED_CAPACITY      0x40000000\r
-#define        SUPPORT_MAX_POWER_PERMANCE              0x10000000\r
-#define        SUPPORT_1V8                             0x01000000\r
-#define        SWTICH_NO_ERR           0x00\r
-#define        CARD_NOT_EXIST          0x01\r
-#define        SPEC_NOT_SUPPORT        0x02\r
-#define        CHECK_MODE_ERR          0x03\r
-#define        CHECK_NOT_READY         0x04\r
-#define        SWITCH_CRC_ERR          0x05\r
-#define        SWITCH_MODE_ERR         0x06\r
-#define        SWITCH_PASS             0x07\r
+\r
+#pragma once\r
+\r
+/* MMC commands */                             /* response type */\r
+#define MMC_GO_IDLE_STATE              0       /* R0 */\r
+#define MMC_SEND_OP_COND               1       /* R3 */\r
+#define MMC_ALL_SEND_CID               2       /* R2 */\r
+#define MMC_SET_RELATIVE_ADDR          3       /* R1 */\r
+#define MMC_SWITCH                     6       /* R1b */\r
+#define MMC_SELECT_CARD                        7       /* R1 */\r
+#define MMC_SEND_EXT_CSD               8       /* R1 */\r
+#define MMC_SEND_CSD                   9       /* R2 */\r
+#define MMC_SEND_CID                   10      /* R2 */\r
+#define MMC_STOP_TRANSMISSION          12      /* R1b */\r
+#define MMC_SEND_STATUS                        13      /* R1 */\r
+#define MMC_INACTIVE_STATE             15      /* R0 */\r
+#define MMC_SET_BLOCKLEN               16      /* R1 */\r
+#define MMC_READ_BLOCK_SINGLE          17      /* R1 */\r
+#define MMC_READ_BLOCK_MULTIPLE                18      /* R1 */\r
+#define MMC_SEND_TUNING_BLOCK          19      /* R1 */\r
+#define MMC_SEND_TUNING_BLOCK_HS200    21      /* R1 */\r
+#define MMC_SET_BLOCK_COUNT            23      /* R1 */\r
+#define MMC_WRITE_BLOCK_SINGLE         24      /* R1 */\r
+#define MMC_WRITE_BLOCK_MULTIPLE       25      /* R1 */\r
+#define MMC_PROGRAM_CSD                        27      /* R1 */\r
+#define MMC_SET_WRITE_PROT             28      /* R1b */\r
+#define MMC_SET_CLR_WRITE_PROT         29      /* R1b */\r
+#define MMC_SET_SEND_WRITE_PROT                30      /* R1 */\r
+#define MMC_TAG_SECTOR_START           32      /* R1 */\r
+#define MMC_TAG_SECTOR_END             33      /* R1 */\r
+#define MMC_UNTAG_SECTOR               34      /* R1 */\r
+#define MMC_TAG_ERASE_GROUP_START      35      /* R1 */\r
+#define MMC_TAG_ERASE_GROUP_END                36      /* R1 */\r
+#define MMC_UNTAG_ERASE_GROUP          37      /* R1 */\r
+#define MMC_ERASE                      38      /* R1b */\r
+#define MMC_LOCK_UNLOCK                        42      /* R1b */\r
+#define MMC_APP_CMD                    55      /* R1 */\r
+#define MMC_READ_OCR                   58      /* R3 */\r
+\r
+/* SD commands */                      /* response type */\r
+#define SD_SEND_RELATIVE_ADDR          3       /* R6 */\r
+#define SD_SEND_SWITCH_FUNC            6       /* R1 */\r
+#define SD_SEND_IF_COND                        8       /* R7 */\r
+#define SD_VOLTAGE_SWITCH              11      /* R1 */\r
+\r
+/* SD application commands */                  /* response type */\r
+#define SD_APP_SET_BUS_WIDTH           6       /* R1 */\r
+#define SD_APP_SD_STATUS               13      /* R1 */\r
+#define SD_APP_OP_COND                 41      /* R3 */\r
+#define SD_APP_SEND_SCR                        51      /* R1 */\r
+\r
+/* OCR bits */\r
+#define MMC_OCR_MEM_READY              (1U<<31)/* memory power-up status bit */\r
+#define MMC_OCR_HCS                    (1<<30) /* SD only */\r
+#define MMC_OCR_ACCESS_MODE_MASK       (3<<29) /* MMC only */\r
+#define MMC_OCR_ACCESS_MODE_BYTE       (0<<29) /* MMC only */\r
+#define MMC_OCR_ACCESS_MODE_SECTOR     (2<<29) /* MMC only */\r
+#define MMC_OCR_S18A                   (1<<24)\r
+#define MMC_OCR_3_5V_3_6V              (1<<23)\r
+#define MMC_OCR_3_4V_3_5V              (1<<22)\r
+#define MMC_OCR_3_3V_3_4V              (1<<21)\r
+#define MMC_OCR_3_2V_3_3V              (1<<20)\r
+#define MMC_OCR_3_1V_3_2V              (1<<19)\r
+#define MMC_OCR_3_0V_3_1V              (1<<18)\r
+#define MMC_OCR_2_9V_3_0V              (1<<17)\r
+#define MMC_OCR_2_8V_2_9V              (1<<16)\r
+#define MMC_OCR_2_7V_2_8V              (1<<15)\r
+#define MMC_OCR_2_6V_2_7V              (1<<14)\r
+#define MMC_OCR_2_5V_2_6V              (1<<13)\r
+#define MMC_OCR_2_4V_2_5V              (1<<12)\r
+#define MMC_OCR_2_3V_2_4V              (1<<11)\r
+#define MMC_OCR_2_2V_2_3V              (1<<10)\r
+#define MMC_OCR_2_1V_2_2V              (1<<9)\r
+#define MMC_OCR_2_0V_2_1V              (1<<8)\r
+#define MMC_OCR_1_9V_2_0V              (1<<7)\r
+#define MMC_OCR_1_8V_1_9V              (1<<6)\r
+#define MMC_OCR_1_7V_1_8V              (1<<5)\r
+#define MMC_OCR_1_6V_1_7V              (1<<4)\r
+\r
+/* R1 response type bits */\r
+#define MMC_R1_READY_FOR_DATA          (1<<8)  /* ready for next transfer */\r
+#define MMC_R1_SWITCH_ERROR            (1<<7)  /* switch command failed */\r
+#define MMC_R1_APP_CMD                 (1<<5)  /* app. commands supported */\r
+\r
+/* 48-bit response decoding (32 bits w/o CRC) */\r
+#define MMC_R1(resp)                   ((resp)[0])\r
+#define MMC_R3(resp)                   ((resp)[0])\r
+#define SD_R6(resp)                    ((resp)[0])\r
+#define MMC_R7(resp)                   ((resp)[0])\r
+#define MMC_SPI_R1(resp)               ((resp)[0])\r
+#define MMC_SPI_R7(resp)               ((resp)[1])\r
+\r
+/* RCA argument and response */\r
+#define MMC_ARG_RCA(rca)               ((rca) << 16)\r
+#define SD_R6_RCA(resp)                        (SD_R6((resp)) >> 16)\r
+\r
+/* bus width argument */\r
+#define SD_ARG_BUS_WIDTH_1             0\r
+#define SD_ARG_BUS_WIDTH_4             2\r
+\r
+/* EXT_CSD fields */\r
+#define EXT_CSD_BUS_WIDTH              183     /* WO */\r
+#define EXT_CSD_HS_TIMING              185     /* R/W */\r
+#define EXT_CSD_REV                    192     /* RO */\r
+#define EXT_CSD_STRUCTURE              194     /* RO */\r
+#define EXT_CSD_CARD_TYPE              196     /* RO */\r
+#define EXT_CSD_SEC_COUNT              212     /* RO */\r
+\r
+/* EXT_CSD field definitions */\r
+#define EXT_CSD_CMD_SET_NORMAL         (1U << 0)\r
+#define EXT_CSD_CMD_SET_SECURE         (1U << 1)\r
+#define EXT_CSD_CMD_SET_CPSECURE       (1U << 2)\r
+\r
+/* EXT_CSD_BUS_WIDTH */\r
+#define EXT_CSD_BUS_WIDTH_1            0       /* 1 bit mode */\r
+#define EXT_CSD_BUS_WIDTH_4            1       /* 4 bit mode */\r
+#define EXT_CSD_BUS_WIDTH_8            2       /* 8 bit mode */\r
+\r
+/* EXT_CSD_STRUCTURE */\r
+#define EXT_CSD_STRUCTURE_VER_1_0      0       /* CSD Version No.1.0 */\r
+#define EXT_CSD_STRUCTURE_VER_1_1      1       /* CSD Version No.1.1 */\r
+#define EXT_CSD_STRUCTURE_VER_1_2      2       /* Version 4.1-4.2-4.3 */\r
+\r
+/* EXT_CSD_CARD_TYPE */\r
+#define EXT_CSD_CARD_TYPE_F_26M                (1 << 0)\r
+#define EXT_CSD_CARD_TYPE_F_52M                (1 << 1)\r
+#define EXT_CSD_CARD_TYPE_F_52M_1_8V   (1 << 2)\r
+#define EXT_CSD_CARD_TYPE_F_52M_1_2V   (1 << 3)\r
+#define EXT_CSD_CARD_TYPE_F_HS200_1_8V (1 << 4)\r
+#define EXT_CSD_CARD_TYPE_F_HS200_1_2V (1 << 5)\r
+#define EXT_CSD_CARD_TYPE_F_HS400_1_8V (1 << 6)\r
+#define EXT_CSD_CARD_TYPE_F_HS400_1_2V (1 << 7)\r
+#define EXT_CSD_CARD_TYPE_26M          0x01\r
+#define EXT_CSD_CARD_TYPE_52M          0x03\r
+#define EXT_CSD_CARD_TYPE_52M_V18      0x07\r
+#define EXT_CSD_CARD_TYPE_52M_V12      0x0b\r
+#define EXT_CSD_CARD_TYPE_52M_V12_18   0x0f\r
+\r
+/* MMC_SWITCH access mode */\r
+#define MMC_SWITCH_MODE_CMD_SET                0x00    /* Change the command set */\r
+#define MMC_SWITCH_MODE_SET_BITS       0x01    /* Set bits in value */\r
+#define MMC_SWITCH_MODE_CLEAR_BITS     0x02    /* Clear bits in value */\r
+#define MMC_SWITCH_MODE_WRITE_BYTE     0x03    /* Set target to value */\r
+\r
+/* SPI mode reports R1/R2(SEND_STATUS) status. */\r
+#define R1_SPI_IDLE            (1 << 0)\r
+#define R1_SPI_ERASE_RESET     (1 << 1)\r
+#define R1_SPI_ILLEGAL_COMMAND (1 << 2)\r
+#define R1_SPI_COM_CRC         (1 << 3)\r
+#define R1_SPI_ERASE_SEQ       (1 << 4)\r
+#define R1_SPI_ADDRESS         (1 << 5)\r
+#define R1_SPI_PARAMETER       (1 << 6)\r
+/* R1 bit 7 is always zero */\r
+#define R2_SPI_CARD_LOCKED     (1 << 8)\r
+#define R2_SPI_WP_ERASE_SKIP   (1 << 9)        /* or lock/unlock fail */\r
+#define R2_SPI_LOCK_UNLOCK_FAIL        R2_SPI_WP_ERASE_SKIP\r
+#define R2_SPI_ERROR           (1 << 10)\r
+#define R2_SPI_CC_ERROR                (1 << 11)\r
+#define R2_SPI_CARD_ECC_ERROR  (1 << 12)\r
+#define R2_SPI_WP_VIOLATION    (1 << 13)\r
+#define R2_SPI_ERASE_PARAM     (1 << 14)\r
+#define R2_SPI_OUT_OF_RANGE    (1 << 15)       /* or CSD overwrite */\r
+#define R2_SPI_CSD_OVERWRITE   R2_SPI_OUT_OF_RANGE\r
+\r
+/* MMC R2 response (CSD) */\r
+#define MMC_CSD_CSDVER(resp)           MMC_RSP_BITS((resp), 126, 2)\r
+#define  MMC_CSD_CSDVER_1_0            0\r
+#define  MMC_CSD_CSDVER_1_1            1\r
+#define  MMC_CSD_CSDVER_1_2            2 /* MMC 4.1 - 4.2 - 4.3 */\r
+#define  MMC_CSD_CSDVER_EXT_CSD                3 /* Version is coded in CSD_STRUCTURE in EXT_CSD */\r
+#define MMC_CSD_MMCVER(resp)           MMC_RSP_BITS((resp), 122, 4)\r
+#define  MMC_CSD_MMCVER_1_0            0 /* MMC 1.0 - 1.2 */\r
+#define  MMC_CSD_MMCVER_1_4            1 /* MMC 1.4 */\r
+#define  MMC_CSD_MMCVER_2_0            2 /* MMC 2.0 - 2.2 */\r
+#define  MMC_CSD_MMCVER_3_1            3 /* MMC 3.1 - 3.3 */\r
+#define  MMC_CSD_MMCVER_4_0            4 /* MMC 4.1 - 4.2 - 4.3 */\r
+#define MMC_CSD_TAAC(resp)             MMC_RSP_BITS((resp), 112, 8)\r
+#define MMC_CSD_TAAC_MANT(resp)                MMC_RSP_BITS((resp), 115, 4)\r
+#define MMC_CSD_TAAC_EXP(resp)         MMC_RSP_BITS((resp), 112, 3)\r
+#define MMC_CSD_NSAC(resp)             MMC_RSP_BITS((resp), 104, 8)\r
+#define MMC_CSD_TRAN_SPEED(resp)       MMC_RSP_BITS((resp), 96, 8)\r
+#define MMC_CSD_TRAN_SPEED_MANT(resp)  MMC_RSP_BITS((resp), 99, 4)\r
+#define MMC_CSD_TRAN_SPEED_EXP(resp)   MMC_RSP_BITS((resp), 96, 3)\r
+#define MMC_CSD_READ_BL_LEN(resp)      MMC_RSP_BITS((resp), 80, 4)\r
+#define MMC_CSD_C_SIZE(resp)           MMC_RSP_BITS((resp), 62, 12)\r
+#define MMC_CSD_CAPACITY(resp)         ((MMC_CSD_C_SIZE((resp))+1) << \\r
+                                        (MMC_CSD_C_SIZE_MULT((resp))+2))\r
+#define MMC_CSD_C_SIZE_MULT(resp)      MMC_RSP_BITS((resp), 47, 3)\r
+#define MMC_CSD_R2W_FACTOR(resp)       MMC_RSP_BITS((resp), 26, 3)\r
+#define MMC_CSD_WRITE_BL_LEN(resp)     MMC_RSP_BITS((resp), 22, 4)\r
+\r
+/* MMC v1 R2 response (CID) */\r
+#define MMC_CID_MID_V1(resp)           MMC_RSP_BITS((resp), 104, 24)\r
+#define MMC_CID_PNM_V1_CPY(resp, pnm)                                  \\r
+       do {                                                            \\r
+               (pnm)[0] = MMC_RSP_BITS((resp), 96, 8);                 \\r
+               (pnm)[1] = MMC_RSP_BITS((resp), 88, 8);                 \\r
+               (pnm)[2] = MMC_RSP_BITS((resp), 80, 8);                 \\r
+               (pnm)[3] = MMC_RSP_BITS((resp), 72, 8);                 \\r
+               (pnm)[4] = MMC_RSP_BITS((resp), 64, 8);                 \\r
+               (pnm)[5] = MMC_RSP_BITS((resp), 56, 8);                 \\r
+               (pnm)[6] = MMC_RSP_BITS((resp), 48, 8);                 \\r
+               (pnm)[7] = '\0';                                        \\r
+       } while (/*CONSTCOND*/0)\r
+#define MMC_CID_REV_V1(resp)           MMC_RSP_BITS((resp), 40, 8)\r
+#define MMC_CID_PSN_V1(resp)           MMC_RSP_BITS((resp), 16, 24)\r
+#define MMC_CID_MDT_V1(resp)           MMC_RSP_BITS((resp), 8, 8)\r
+\r
+/* MMC v2 R2 response (CID) */\r
+#define MMC_CID_MID_V2(resp)           MMC_RSP_BITS((resp), 120, 8)\r
+#define MMC_CID_OID_V2(resp)           MMC_RSP_BITS((resp), 104, 16)\r
+#define MMC_CID_PNM_V2_CPY(resp, pnm)                                  \\r
+       do {                                                            \\r
+               (pnm)[0] = MMC_RSP_BITS((resp), 96, 8);                 \\r
+               (pnm)[1] = MMC_RSP_BITS((resp), 88, 8);                 \\r
+               (pnm)[2] = MMC_RSP_BITS((resp), 80, 8);                 \\r
+               (pnm)[3] = MMC_RSP_BITS((resp), 72, 8);                 \\r
+               (pnm)[4] = MMC_RSP_BITS((resp), 64, 8);                 \\r
+               (pnm)[5] = MMC_RSP_BITS((resp), 56, 8);                 \\r
+               (pnm)[6] = '\0';                                        \\r
+       } while (/*CONSTCOND*/0)\r
+#define MMC_CID_PSN_V2(resp)           MMC_RSP_BITS((resp), 16, 32)\r
+\r
+/* SD R2 response (CSD) */\r
+#define SD_CSD_CSDVER(resp)            MMC_RSP_BITS((resp), 126, 2)\r
+#define  SD_CSD_CSDVER_1_0             0\r
+#define  SD_CSD_CSDVER_2_0             1\r
+#define SD_CSD_MMCVER(resp)            MMC_RSP_BITS((resp), 122, 4)\r
+#define SD_CSD_TAAC(resp)              MMC_RSP_BITS((resp), 112, 8)\r
+#define SD_CSD_TAAC_EXP(resp)          MMC_RSP_BITS((resp), 115, 4)\r
+#define SD_CSD_TAAC_MANT(resp)         MMC_RSP_BITS((resp), 112, 3)\r
+#define  SD_CSD_TAAC_1_5_MSEC          0x26\r
+#define SD_CSD_NSAC(resp)              MMC_RSP_BITS((resp), 104, 8)\r
+#define SD_CSD_SPEED(resp)             MMC_RSP_BITS((resp), 96, 8)\r
+#define SD_CSD_SPEED_MANT(resp)                MMC_RSP_BITS((resp), 99, 4)\r
+#define SD_CSD_SPEED_EXP(resp)         MMC_RSP_BITS((resp), 96, 3)\r
+#define  SD_CSD_SPEED_25_MHZ           0x32\r
+#define  SD_CSD_SPEED_50_MHZ           0x5a\r
+#define SD_CSD_CCC(resp)               MMC_RSP_BITS((resp), 84, 12)\r
+#define  SD_CSD_CCC_BASIC              (1 << 0)        /* basic */\r
+#define  SD_CSD_CCC_BR                 (1 << 2)        /* block read */\r
+#define  SD_CSD_CCC_BW                 (1 << 4)        /* block write */\r
+#define  SD_CSD_CCC_ERACE              (1 << 5)        /* erase */\r
+#define  SD_CSD_CCC_WP                 (1 << 6)        /* write protection */\r
+#define  SD_CSD_CCC_LC                 (1 << 7)        /* lock card */\r
+#define  SD_CSD_CCC_AS                 (1 << 8)        /*application specific*/\r
+#define  SD_CSD_CCC_IOM                        (1 << 9)        /* I/O mode */\r
+#define  SD_CSD_CCC_SWITCH             (1 << 10)       /* switch */\r
+#define SD_CSD_READ_BL_LEN(resp)       MMC_RSP_BITS((resp), 80, 4)\r
+#define SD_CSD_READ_BL_PARTIAL(resp)   MMC_RSP_BITS((resp), 79, 1)\r
+#define SD_CSD_WRITE_BLK_MISALIGN(resp)        MMC_RSP_BITS((resp), 78, 1)\r
+#define SD_CSD_READ_BLK_MISALIGN(resp) MMC_RSP_BITS((resp), 77, 1)\r
+#define SD_CSD_DSR_IMP(resp)           MMC_RSP_BITS((resp), 76, 1)\r
+#define SD_CSD_C_SIZE(resp)            MMC_RSP_BITS((resp), 62, 12)\r
+#define SD_CSD_CAPACITY(resp)          ((SD_CSD_C_SIZE((resp))+1) << \\r
+                                        (SD_CSD_C_SIZE_MULT((resp))+2))\r
+#define SD_CSD_VDD_R_CURR_MIN(resp)    MMC_RSP_BITS((resp), 59, 3)\r
+#define SD_CSD_VDD_R_CURR_MAX(resp)    MMC_RSP_BITS((resp), 56, 3)\r
+#define SD_CSD_VDD_W_CURR_MIN(resp)    MMC_RSP_BITS((resp), 53, 3)\r
+#define SD_CSD_VDD_W_CURR_MAX(resp)    MMC_RSP_BITS((resp), 50, 3)\r
+#define  SD_CSD_VDD_RW_CURR_100mA      0x7\r
+#define  SD_CSD_VDD_RW_CURR_80mA       0x6\r
+#define SD_CSD_V2_C_SIZE(resp)         MMC_RSP_BITS((resp), 48, 22)\r
+#define SD_CSD_V2_CAPACITY(resp)       ((SD_CSD_V2_C_SIZE((resp))+1) << 10)\r
+#define SD_CSD_V2_BL_LEN               0x9 /* 512 */\r
+#define SD_CSD_C_SIZE_MULT(resp)       MMC_RSP_BITS((resp), 47, 3)\r
+#define SD_CSD_ERASE_BLK_EN(resp)      MMC_RSP_BITS((resp), 46, 1)\r
+#define SD_CSD_SECTOR_SIZE(resp)       MMC_RSP_BITS((resp), 39, 7) /* +1 */\r
+#define SD_CSD_WP_GRP_SIZE(resp)       MMC_RSP_BITS((resp), 32, 7) /* +1 */\r
+#define SD_CSD_WP_GRP_ENABLE(resp)     MMC_RSP_BITS((resp), 31, 1)\r
+#define SD_CSD_R2W_FACTOR(resp)                MMC_RSP_BITS((resp), 26, 3)\r
+#define SD_CSD_WRITE_BL_LEN(resp)      MMC_RSP_BITS((resp), 22, 4)\r
+#define  SD_CSD_RW_BL_LEN_2G           0xa\r
+#define  SD_CSD_RW_BL_LEN_1G           0x9\r
+#define SD_CSD_WRITE_BL_PARTIAL(resp)  MMC_RSP_BITS((resp), 21, 1)\r
+#define SD_CSD_FILE_FORMAT_GRP(resp)   MMC_RSP_BITS((resp), 15, 1)\r
+#define SD_CSD_COPY(resp)              MMC_RSP_BITS((resp), 14, 1)\r
+#define SD_CSD_PERM_WRITE_PROTECT(resp)        MMC_RSP_BITS((resp), 13, 1)\r
+#define SD_CSD_TMP_WRITE_PROTECT(resp) MMC_RSP_BITS((resp), 12, 1)\r
+#define SD_CSD_FILE_FORMAT(resp)       MMC_RSP_BITS((resp), 10, 2)\r
+\r
+/* SD R2 response (CID) */\r
+#define SD_CID_MID(resp)               MMC_RSP_BITS((resp), 120, 8)\r
+#define SD_CID_OID(resp)               MMC_RSP_BITS((resp), 104, 16)\r
+#define SD_CID_PNM_CPY(resp, pnm)                                      \\r
+       do {                                                            \\r
+               (pnm)[0] = MMC_RSP_BITS((resp), 96, 8);                 \\r
+               (pnm)[1] = MMC_RSP_BITS((resp), 88, 8);                 \\r
+               (pnm)[2] = MMC_RSP_BITS((resp), 80, 8);                 \\r
+               (pnm)[3] = MMC_RSP_BITS((resp), 72, 8);                 \\r
+               (pnm)[4] = MMC_RSP_BITS((resp), 64, 8);                 \\r
+               (pnm)[5] = '\0';                                        \\r
+       } while (/*CONSTCOND*/0)\r
+#define SD_CID_REV(resp)               MMC_RSP_BITS((resp), 56, 8)\r
+#define SD_CID_PSN(resp)               MMC_RSP_BITS((resp), 24, 32)\r
+#define SD_CID_MDT(resp)               MMC_RSP_BITS((resp), 8, 12)\r
+\r
+/* SCR (SD Configuration Register) */\r
+#define SCR_STRUCTURE(scr)             MMC_RSP_BITS((scr), 60, 4)\r
+#define  SCR_STRUCTURE_VER_1_0         0 /* Version 1.0 */\r
+#define SCR_SD_SPEC(scr)               MMC_RSP_BITS((scr), 56, 4)\r
+#define  SCR_SD_SPEC_VER_1_0           0 /* Version 1.0 and 1.01 */\r
+#define  SCR_SD_SPEC_VER_1_10          1 /* Version 1.10 */\r
+#define  SCR_SD_SPEC_VER_2             2 /* Version 2.00 or Version 3.0X */\r
+#define SCR_DATA_STAT_AFTER_ERASE(scr) MMC_RSP_BITS((scr), 55, 1)\r
+#define SCR_SD_SECURITY(scr)           MMC_RSP_BITS((scr), 52, 3)\r
+#define  SCR_SD_SECURITY_NONE          0 /* no security */\r
+#define  SCR_SD_SECURITY_1_0           1 /* security protocol 1.0 */\r
+#define  SCR_SD_SECURITY_1_0_2         2 /* security protocol 1.0 */\r
+#define SCR_SD_BUS_WIDTHS(scr)         MMC_RSP_BITS((scr), 48, 4)\r
+#define  SCR_SD_BUS_WIDTHS_1BIT                (1 << 0) /* 1bit (DAT0) */\r
+#define  SCR_SD_BUS_WIDTHS_4BIT                (1 << 2) /* 4bit (DAT0-3) */\r
+#define SCR_SD_SPEC3(scr)              MMC_RSP_BITS((scr), 47, 1)\r
+#define SCR_EX_SECURITY(scr)           MMC_RSP_BITS((scr), 43, 4)\r
+#define SCR_RESERVED(scr)              MMC_RSP_BITS((scr), 34, 9)\r
+#define SCR_CMD_SUPPORT_CMD23(scr)     MMC_RSP_BITS((scr), 33, 1)\r
+#define SCR_CMD_SUPPORT_CMD20(scr)     MMC_RSP_BITS((scr), 32, 1)\r
+#define SCR_RESERVED2(scr)             MMC_RSP_BITS((scr), 0, 32)\r
+\r
+#define MMC_RSP_BITS(resp, start, len) __bitfield((resp), (start)-8, (len))\r
+static inline uint32_t\r
+__bitfield(const uint32_t *src, size_t start, size_t len)\r
+{\r
+       if (start + len > 512 || len == 0 || len > 32)\r
+               return 0;\r
+\r
+       src += start / 32;\r
+       start %= 32;\r
+\r
+       uint32_t dst = src[0] >> start;\r
+\r
+       if (((start + len - 1) / 32 != start / 32)) {\r
+               dst |= src[1] << (32 - start);\r
+       }\r
+\r
+       return dst & (__BIT(len) - 1);\r
+}
\ No newline at end of file
This page took 0.041562 seconds and 4 git commands to generate.