soc/mediatek/mt8186: add early initialization for eMMC

Some eMMCs need 80+ms for CMD1 to complete. And the payload may need to
access eMMC in the very early stage (for example, depthcharge needs it
20ms after started) so we have to start initialization in coreboot.

TEST=boot kernel from eMMC ok
BUG=b:202871018

Signed-off-by: Rex-BC Chen <rex-bc.chen@mediatek.com>
Change-Id: I3bc06b1fc506b1d6f54f7f456117d22477a87e29
Reviewed-on: https://review.coreboot.org/c/coreboot/+/59294
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Yu-Ping Wu <yupingso@google.com>
This commit is contained in:
Rex-BC Chen 2021-10-26 13:17:43 +08:00 committed by Hung-Te Lin
parent 966b502d35
commit 4ab77addc5
3 changed files with 6 additions and 3 deletions

View File

@ -6,7 +6,7 @@
static void mainboard_init(struct device *dev) static void mainboard_init(struct device *dev)
{ {
mtk_msdc_configure_emmc(); mtk_msdc_configure_emmc(true);
mtk_msdc_configure_sdcard(); mtk_msdc_configure_sdcard();
setup_usb_host(); setup_usb_host();
} }

View File

@ -165,7 +165,7 @@ struct msdc_ctrlr {
#define msdc_error(format...) printk(BIOS_ERR, "ERROR: " format) #define msdc_error(format...) printk(BIOS_ERR, "ERROR: " format)
int mtk_emmc_early_init(void *base, void *top_base); int mtk_emmc_early_init(void *base, void *top_base);
void mtk_msdc_configure_emmc(void); void mtk_msdc_configure_emmc(bool is_early_init);
void mtk_msdc_configure_sdcard(void); void mtk_msdc_configure_sdcard(void);
#endif /* SOC_MEDIATEK_COMMON_MSDC_H */ #endif /* SOC_MEDIATEK_COMMON_MSDC_H */

View File

@ -33,7 +33,7 @@ enum {
MSDC1_GPIO_MODE1_BASE = 0x100053b0, MSDC1_GPIO_MODE1_BASE = 0x100053b0,
}; };
void mtk_msdc_configure_emmc(void) void mtk_msdc_configure_emmc(bool is_early_init)
{ {
void *gpio_base = (void *)IOCFG_LT_BASE; void *gpio_base = (void *)IOCFG_LT_BASE;
int i; int i;
@ -58,6 +58,9 @@ void mtk_msdc_configure_emmc(void)
/* set eMMC cmd/dat/clk pins driving to 8mA */ /* set eMMC cmd/dat/clk pins driving to 8mA */
SET32_BITFIELDS(gpio_base, MSDC0_DRV, MSDC0_DRV_VALUE); SET32_BITFIELDS(gpio_base, MSDC0_DRV, MSDC0_DRV_VALUE);
if (is_early_init)
mtk_emmc_early_init((void *)MSDC0_BASE, (void *)MSDC0_TOP_BASE);
} }
void mtk_msdc_configure_sdcard(void) void mtk_msdc_configure_sdcard(void)