[sherlock] 14.20230831.4.72 u-boot source GitOrigin-RevId: 982bcd1283ee050f224f0ce8dd59d919cf638f07 Change-Id: I3a7dcb7d1076fbab289308e556dd7aae821d8cd0 Reviewed-on: https://turquoise-internal-review.googlesource.com/c/third_party/u-boot/+/801590 Reviewed-by: David Pursell <dpursell@google.com>
diff --git a/common/ta_helper.c b/common/ta_helper.c index d1b0eb1..b4886f6 100644 --- a/common/ta_helper.c +++ b/common/ta_helper.c
@@ -6,6 +6,9 @@ #include <tee/ta_helper.h> +/* Log TA client API error codes. */ +#define LOCAL_DEBUG 1 + #ifdef LOCAL_DEBUG #define TA_HELPER_DEBUG(...) fprintf(stderr, __VA_ARGS__) #else
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index ef8b348..d8bb0f0 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c
@@ -672,6 +672,82 @@ return getvar_response_buffer; } +static const char *get_emmc_wear_eol(const char *arg) +{ + struct mmc *mmc = find_mmc_device(CONFIG_FASTBOOT_FLASH_MMC_DEV); + if (!mmc || !mmc->ext_csd) { + return "no eMMC info"; + } + + const uint8_t value = mmc->ext_csd[EXT_CSD_PRE_EOL_INFO]; + + // Convert raw value into something human-readable. + // See eMMC spec v5.1 section 7.4.24. + const char *readable; + switch (value) { + case 0x00: + readable = "undefined"; + break; + case 0x01: + readable = "normal"; + break; + case 0x02: + readable = "warning"; + break; + case 0x03: + readable = "urgent"; + break; + default: + readable = "unknown"; + break; + } + + snprintf(getvar_response_buffer, GETVAR_RESPONSE_BUFFER_LEN, "%s (%d)", + readable, value); + return getvar_response_buffer; +} + +static const char *s_emmc_wear_level_list[] = { "A", "B", NULL }; +static const char *get_emmc_wear_level(const char *arg) +{ + if (!arg) { + return NULL; + } + + struct mmc *mmc = find_mmc_device(CONFIG_FASTBOOT_FLASH_MMC_DEV); + if (!mmc || !mmc->ext_csd) { + return "no eMMC info"; + } + + uint value = 0; + if (strcmp(arg, "A") == 0) { + value = mmc->dev_lifetime_est_typ_a; + } else if (strcmp(arg, "B") == 0) { + value = mmc->dev_lifetime_est_typ_b; + } else { + return NULL; + } + + // Convert raw value into something human-readable. + // See eMMC spec v5.1 sections 7.4.22 and 7.4.23. + char readable[16]; + if (value == 0x00) { + strncpy(readable, "undefined", sizeof(readable)); + } else if (value <= 0x0A) { + uint low = value * 10; + uint high = low + 10; + snprintf(readable, sizeof(readable), "%d%%-%d%%", low, high); + } else if (value == 0x0B) { + strncpy(readable, "EOL", sizeof(readable)); + } else { + strncpy(readable, "unknown", sizeof(readable)); + } + + snprintf(getvar_response_buffer, GETVAR_RESPONSE_BUFFER_LEN, "%s (%d)", + readable, value); + return getvar_response_buffer; +} + // Returns the board that the bootloader was compiled for. static const char *get_bootloader_board(const char *arg) { @@ -1021,6 +1097,15 @@ .func = get_emmc_vendor, }, { + .name = "emmc-wear-eol", + .func = get_emmc_wear_eol, + }, + { + .name = "emmc-wear-level", + .func = get_emmc_wear_level, + .default_args = s_emmc_wear_level_list, + }, + { .name = "hw-revision", .func = get_hw_revision, },
diff --git a/include/mmc.h b/include/mmc.h index 90a6803..1e3bc66 100644 --- a/include/mmc.h +++ b/include/mmc.h
@@ -236,6 +236,7 @@ #define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */ #define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */ #define EXT_CSD_BOOT_MULT 226 /* RO */ +#define EXT_CSD_PRE_EOL_INFO 267 /* RO */ #define EXT_CSD_DEV_LIFETIME_EST_TYP_A 268 /* RO */ #define EXT_CSD_DEV_LIFETIME_EST_TYP_B 269 /* RO */ #define EXT_CSD_BKOPS_SUPPORT 502 /* RO */