From a468e756377ebe73920eb83f4a4425cabab66ebc Mon Sep 17 00:00:00 2001 From: "Tien Hock, Loh" Date: Thu, 7 Mar 2019 11:34:20 +0800 Subject: [PATCH 1/2] drivers: mmc: Fix some issues with MMC stack Some bugs in MMC stack needs to be fixed: - scr cannot be local as this will cause cache issue when invalidating after the read DMA transfer is completed - ACMD41 needs to send voltage information in initialization, otherwise the command is a query, thus will not initialize the controller - when checking device state, retry until the retries counter goes to zero before failing Signed-off-by: Tien Hock, Loh --- drivers/mmc/mmc.c | 10 ++++++---- include/drivers/mmc.h | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 77d683c45..db6f3f9e4 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -29,6 +29,7 @@ static unsigned char mmc_ext_csd[512] __aligned(16); static unsigned int mmc_flags; static struct mmc_device_info *mmc_dev_info; static unsigned int rca; +static unsigned int scr[2]__aligned(16) = { 0 }; static const unsigned char tran_speed_base[16] = { 0, 10, 12, 13, 15, 20, 26, 30, 35, 40, 45, 52, 55, 60, 70, 80 @@ -90,7 +91,8 @@ static int mmc_device_state(void) ret = mmc_send_cmd(MMC_CMD(13), rca << RCA_SHIFT_OFFSET, MMC_RESPONSE_R1, &resp_data[0]); if (ret != 0) { - return ret; + retries--; + continue; } if ((resp_data[0] & STATUS_SWITCH_ERROR) != 0U) { @@ -129,7 +131,6 @@ static int mmc_sd_switch(unsigned int bus_width) { int ret; int retries = MMC_DEFAULT_MAX_RETRIES; - unsigned int scr[2] = { 0 }; unsigned int bus_width_arg = 0; ret = ops->prepare(0, (uintptr_t)&scr, sizeof(scr)); @@ -341,8 +342,9 @@ static int sd_send_op_cond(void) } /* ACMD41: SD_SEND_OP_COND */ - ret = mmc_send_cmd(MMC_ACMD(41), OCR_HCS, MMC_RESPONSE_R3, - &resp_data[0]); + ret = mmc_send_cmd(MMC_ACMD(41), OCR_HCS | + mmc_dev_info->ocr_voltage, MMC_RESPONSE_R3, + &resp_data[0]); if (ret != 0) { return ret; } diff --git a/include/drivers/mmc.h b/include/drivers/mmc.h index 2aaa28d68..7611f019a 100644 --- a/include/drivers/mmc.h +++ b/include/drivers/mmc.h @@ -220,6 +220,7 @@ struct mmc_device_info { unsigned long long device_size; /* Size of device in bytes */ unsigned int block_size; /* Block size in bytes */ unsigned int max_bus_freq; /* Max bus freq in Hz */ + unsigned int ocr_voltage; /* OCR voltage */ enum mmc_device_type mmc_dev_type; /* Type of MMC */ }; From dd8c03b6bf16739f979ddc5aa20279b06ea5ea3e Mon Sep 17 00:00:00 2001 From: "Tien Hock, Loh" Date: Fri, 8 Mar 2019 09:26:24 +0800 Subject: [PATCH 2/2] plat: intel: Add MMC OCR voltage information for initialization MMC stack needs OCR voltage information for the platform to initialize MMC controller correctly. Signed-off-by: Tien Hock, Loh --- plat/intel/soc/stratix10/bl2_plat_setup.c | 1 + 1 file changed, 1 insertion(+) diff --git a/plat/intel/soc/stratix10/bl2_plat_setup.c b/plat/intel/soc/stratix10/bl2_plat_setup.c index 91e3b0ac5..aa68906da 100644 --- a/plat/intel/soc/stratix10/bl2_plat_setup.c +++ b/plat/intel/soc/stratix10/bl2_plat_setup.c @@ -99,6 +99,7 @@ void bl2_el3_plat_arch_setup(void) dw_mmc_params_t params = EMMC_INIT_PARAMS(0x100000); info.mmc_dev_type = MMC_IS_SD; + info.ocr_voltage = OCR_3_3_3_4 | OCR_3_2_3_3; switch (boot_source) { case BOOT_SOURCE_SDMMC: