@@ -56,6 +56,9 @@
#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B 269 /* RO */
#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A 268 /* RO */
#define EXT_CSD_PRE_EOL_INFO 267 /* RO */
+#define EXT_CSD_OPTIMAL_READ_SIZE 266 /* RO */
+#define EXT_CSD_OPTIMAL_WRITE_SIZE 265 /* RO */
+#define EXT_CSD_OPTIMAL_TRIM_UNIT_SIZE 264 /* RO */
#define EXT_CSD_FIRMWARE_VERSION 254 /* RO */
#define EXT_CSD_CACHE_SIZE_3 252
#define EXT_CSD_CACHE_SIZE_2 251
@@ -1766,6 +1766,24 @@ int do_read_extcsd(int nargs, char **argv)
ext_csd[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]);
printf("eMMC Pre EOL information [EXT_CSD_PRE_EOL_INFO]: 0x%02x\n",
ext_csd[EXT_CSD_PRE_EOL_INFO]);
+
+ reg = ext_csd[EXT_CSD_OPTIMAL_READ_SIZE];
+ printf("Minimum optimal read unit size (for the device) "
+ "[OPTIMAL_READ_SIZE]: 0x%02x\n", reg);
+ printf(" i.e. %lu KiB\n", reg * 4UL);
+
+ reg = ext_csd[EXT_CSD_OPTIMAL_WRITE_SIZE];
+ printf("Minimum optimal write unit size (for the device) "
+ "[OPTIMAL_WRITE_SIZE]: 0x%02x\n", reg);
+ printf(" i.e. %lu KiB\n", reg * 4UL);
+
+ reg = ext_csd[EXT_CSD_OPTIMAL_TRIM_UNIT_SIZE];
+ printf("Minimum optimal trim unit size (for the device) "
+ "[OPTIMAL_TRIM_UNIT_SIZE]: 0x%02x\n", reg);
+ if (reg == 0 || reg > 21)
+ printf("error: invalid OPTIMAL_TRIM_UNIT_SIZE\n");
+ else
+ printf(" i.e. %lu KiB\n", (1UL << (reg - 1)) * 4);
}
if (ext_csd_rev >= 8) {
eMMC 5.0 introduced OPTIMAL_READ_SIZE, OPTIMAL_WRITE_SIZE and OPTIMAL TRIM_UNIT_SIZE fields in the extcsd Interpret these fields when reading out the extcsd with human-readable results Signed-off-by: James Nuss <jamesnuss@nanometrics.ca> --- mmc.h | 3 +++ mmc_cmds.c | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+)