soc/mediatek: pass access mode to the payload

Some eMMCs (for example, Kingston-EMMC64G-TX29-HP) may enter the ready
state by sending CMD1 twice. If it is in the ready state, then the
payload (for example, depthcharge) will not send CMD1, but the access
mode is only available from the response of CMD1.

Therefore, we need to pass the access mode to the payload by defining
the following types:

- MMC_STATUS_CMD1_READY: in ready state and access mode is byte mode.
- MMC_STATUS_CMD1_READY_HCS: in ready state and access mode is sector
  mode.

BUG=b:234672726
BRANCH=cherry
TEST=boot ok

Signed-off-by: Wenbin Mei <wenbin.mei@mediatek.com>
Change-Id: Iad905781d8ba0105911cf87a6b845cd8df57521e
Reviewed-on: https://review.coreboot.org/c/coreboot/+/65054
Reviewed-by: Yidi Lin <yidilin@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Yu-Ping Wu <yupingso@google.com>
This commit is contained in:
Wenbin Mei 2022-06-08 16:37:00 +08:00 committed by Martin L Roth
parent f32a533931
commit a49460c6b6
2 changed files with 10 additions and 5 deletions

View File

@ -17,8 +17,9 @@
enum {
MMC_STATUS_NEED_RESET = 0,
MMC_STATUS_CMD1_READY_OR_IN_PROGRESS,
MMC_STATUS_CMD1_READY,
MMC_STATUS_CMD1_READY, /* Byte mode */
MMC_STATUS_CMD1_IN_PROGRESS,
MMC_STATUS_CMD1_READY_HCS, /* Sector mode (High capacity support) */
};
struct mmc_command {

View File

@ -474,12 +474,16 @@ int mtk_emmc_early_init(void *base, void *top_base)
/* Send CMD1 */
err = mmc_send_op_cond(&media);
if (err == 0)
set_early_mmc_wake_status(MMC_STATUS_CMD1_READY);
else if (err == CARD_IN_PROGRESS)
if (err == 0) {
if (media.op_cond_response & OCR_HCS)
set_early_mmc_wake_status(MMC_STATUS_CMD1_READY_HCS);
else
set_early_mmc_wake_status(MMC_STATUS_CMD1_READY);
} else if (err == CARD_IN_PROGRESS) {
set_early_mmc_wake_status(MMC_STATUS_CMD1_IN_PROGRESS);
else
} else {
goto out_err;
}
return 0;