1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 3 #ifndef __COMMONLIB_STORAGE_H__ 4 #define __COMMONLIB_STORAGE_H__ 5 6 #include <commonlib/sd_mmc_ctrlr.h> 7 8 /* 9 * EXT_CSD fields 10 */ 11 #define EXT_CSD_GP_SIZE_MULT_GP0 143 /* RO */ 12 #define EXT_CSD_GP_SIZE_MULT_GP1 146 /* RO */ 13 #define EXT_CSD_GP_SIZE_MULT_GP2 149 /* RO */ 14 #define EXT_CSD_GP_SIZE_MULT_GP3 152 /* RO */ 15 #define EXT_CSD_PARTITIONING_SUPPORT 160 /* RO */ 16 #define EXT_CSD_RPMB_SIZE_MULT 168 /* RO */ 17 #define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */ 18 #define EXT_CSD_PART_CONF 179 /* R/W */ 19 #define EXT_CSD_BUS_WIDTH 183 /* R/W */ 20 #define EXT_CSD_STROBE_SUPPORT 184 /* RO */ 21 #define EXT_CSD_HS_TIMING 185 /* R/W */ 22 #define EXT_CSD_REV 192 /* RO */ 23 #define EXT_CSD_CARD_TYPE 196 /* RO */ 24 #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ 25 #define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */ 26 #define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */ 27 #define EXT_CSD_BOOT_SIZE_MULT 226 /* RO */ 28 #define EXT_CSD_TRIM_MULT 232 /* RO */ 29 30 /* 31 * EXT_CSD field definitions 32 */ 33 34 #define EXT_CSD_CMD_SET_NORMAL (1 << 0) 35 #define EXT_CSD_CMD_SET_SECURE (1 << 1) 36 #define EXT_CSD_CMD_SET_CPSECURE (1 << 2) 37 38 #define EXT_CSD_CARD_TYPE_26 (1 << 0) /* Card can run at 26MHz */ 39 #define EXT_CSD_CARD_TYPE_52 (1 << 1) /* Card can run at 52MHz */ 40 41 #define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */ 42 #define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */ 43 #define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */ 44 #define EXT_CSD_DDR_BUS_WIDTH_4 5 /* Card is in 4 bit DDR mode */ 45 #define EXT_CSD_DDR_BUS_WIDTH_8 6 /* Card is in 8 bit DDR mode */ 46 #define EXT_CSD_BUS_WIDTH_STROBE (1<<7) /* Enhanced strobe mode */ 47 48 #define EXT_CSD_TIMING_BC 0 /* Backwards compatibility */ 49 #define EXT_CSD_TIMING_HS 1 /* High speed */ 50 #define EXT_CSD_TIMING_HS200 2 /* HS200 */ 51 #define EXT_CSD_TIMING_HS400 3 /* HS400 */ 52 53 #define EXT_CSD_SIZE 512 54 55 /* 179: EXT_CSD_PART_CONF */ 56 #define EXT_CSD_PART_ACCESS_MASK 7 /* Partition access mask */ 57 58 /* 175: EXT_CSD_ERASE_GROUP_DEF */ 59 #define EXT_CSD_PARTITION_ENABLE 1 /* Enable partition access */ 60 61 struct storage_media { 62 uint64_t capacity[8]; /* Partition capacity in bytes */ 63 struct sd_mmc_ctrlr *ctrlr; 64 65 #define MMC_PARTITION_USER 0 66 #define MMC_PARTITION_BOOT_1 1 67 #define MMC_PARTITION_BOOT_2 2 68 #define MMC_PARTITION_RPMB 3 69 #define MMC_PARTITION_GP1 4 70 #define MMC_PARTITION_GP2 5 71 #define MMC_PARTITION_GP3 6 72 #define MMC_PARTITION_GP4 7 73 74 uint32_t caps; 75 uint32_t version; 76 77 #define SD_VERSION_SD 0x20000 78 #define SD_VERSION_2 (SD_VERSION_SD | 0x20) 79 #define SD_VERSION_1_0 (SD_VERSION_SD | 0x10) 80 #define SD_VERSION_1_10 (SD_VERSION_SD | 0x1a) 81 #define MMC_VERSION_MMC 0x10000 82 #define MMC_VERSION_UNKNOWN (MMC_VERSION_MMC) 83 #define MMC_VERSION_1_2 (MMC_VERSION_MMC | 0x12) 84 #define MMC_VERSION_1_4 (MMC_VERSION_MMC | 0x14) 85 #define MMC_VERSION_2_2 (MMC_VERSION_MMC | 0x22) 86 #define MMC_VERSION_3 (MMC_VERSION_MMC | 0x30) 87 #define MMC_VERSION_4 (MMC_VERSION_MMC | 0x40) 88 89 uint32_t read_bl_len; 90 uint32_t write_bl_len; 91 int high_capacity; 92 uint32_t tran_speed; 93 /* Erase size in terms of block length. */ 94 uint32_t erase_blocks; 95 /* Trim operation multiplier for determining timeout. */ 96 uint32_t trim_mult; 97 98 uint32_t ocr; 99 100 #define OCR_BUSY 0x80000000 101 #define OCR_HCS 0x40000000 102 #define OCR_VOLTAGE_MASK 0x00FFFF80 103 #define OCR_ACCESS_MODE 0x60000000 104 105 uint32_t op_cond_response; // The response byte from the last op_cond 106 107 uint32_t scr[2]; 108 uint32_t csd[4]; 109 uint32_t cid[4]; 110 uint16_t rca; 111 112 uint8_t partition_config; /* Duplicate of EXT_CSD_PART_CONF */ 113 }; 114 115 uint64_t storage_block_erase(struct storage_media *media, uint64_t start, 116 uint64_t count); 117 uint64_t storage_block_fill_write(struct storage_media *media, uint64_t start, 118 uint64_t count, uint32_t fill_pattern); 119 uint64_t storage_block_read(struct storage_media *media, uint64_t start, 120 uint64_t count, void *buffer); 121 uint64_t storage_block_write(struct storage_media *media, uint64_t start, 122 uint64_t count, const void *buffer); 123 124 unsigned int storage_get_current_partition(struct storage_media *media); 125 const char *storage_partition_name(struct storage_media *media, 126 unsigned int partition_number); 127 int storage_setup_media(struct storage_media *media, 128 struct sd_mmc_ctrlr *ctrlr); 129 130 int storage_set_partition(struct storage_media *media, 131 unsigned int partition_number); 132 133 void storage_display_setup(struct storage_media *media); 134 135 #endif /* __COMMONLIB_STORAGE_H__ */ 136