From 816e90b2149fece8cced535dc76ea9283709b7b6 Mon Sep 17 00:00:00 2001 From: Sarat Chand Savitala Date: Thu, 29 Oct 2015 19:06:10 +0530 Subject: [PATCH] sw_apps:zynqmp_fsbl: Fix for issue with SD1 boot when design has no SD0 This patch deduces correct drive number for SD based on which SD instance(s) are in design and the boot mode used. Signed-off-by: Sarat Chand Savitala Acked-by: Krishna Chaitanya Patakamuri --- lib/sw_apps/zynqmp_fsbl/src/xfsbl_hw.h | 5 +-- lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.c | 41 +++++++++++++++++++++--- lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.h | 5 ++- lib/sw_apps/zynqmp_fsbl/src/xfsbl_sd.c | 14 ++++---- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hw.h b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hw.h index 48bdb867..937b6012 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hw.h +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hw.h @@ -539,11 +539,12 @@ extern "C" { /** * Definitions for SD to be included */ -#if (!defined(FSBL_SD_EXCLUDE) && defined(XPAR_XSDPS_0_DEVICE_ID)) +#if (!defined(FSBL_SD_EXCLUDE) && (XPAR_XSDPS_0_BASEADDR == 0xFF160000)) #define XFSBL_SD_0 #endif -#if (!defined(FSBL_SD_EXCLUDE) && defined(XPAR_XSDPS_1_DEVICE_ID)) +#if (!defined(FSBL_SD_EXCLUDE) && (XPAR_XSDPS_0_BASEADDR == 0xFF170000) ||\ + (XPAR_XSDPS_1_BASEADDR == 0xFF170000)) #define XFSBL_SD_1 #endif diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.c b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.c index 15084148..7f2e6da0 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.c +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.c @@ -299,7 +299,7 @@ u32 XFsbl_Htonl(u32 Value1) * ******************************************************************************/ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, - u32 MultibootReg, u32 DeviceFlags) + u32 MultibootReg, u32 DrvNum) { u32 Index; @@ -309,8 +309,7 @@ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, if (0x0U == MultiBootNum) { /* SD file name is BOOT.BIN when Multiboot register value is 0 */ - if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) || - (DeviceFlags == XFSBL_EMMC_BOOT_MODE)) { + if (DrvNum == XFSBL_SD_DRV_NUM_0) { (void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "BOOT.BIN"); } else { @@ -321,8 +320,7 @@ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, else { /* set default SD file name as BOOT0000.BIN */ - if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) || - (DeviceFlags == XFSBL_EMMC_BOOT_MODE)) { + if (DrvNum == XFSBL_SD_DRV_NUM_0) { (void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "BOOT0000.BIN"); } else { @@ -349,6 +347,39 @@ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, "File name is %s\r\n",XFsbl_SdEmmcFileName); } +/*****************************************************************************/ +/** + * This function is used to obtain drive number based on design and boot mode + * + * @param DeviceFlags contain boot mode information + * + * @return Drive number (0 or 1) + * + *****************************************************************************/ +u32 XFsbl_GetDrvNumSD(u32 DeviceFlags) +{ + u32 DrvNum; + + /* + * If design has both SD0 and SD1, select drive number based on bootmode + * If design has ONLY SD0 or ONLY SD1, drive number should be "0" + */ +#ifdef XPAR_XSDPS_1_DEVICE_ID + if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) || + (DeviceFlags == XFSBL_EMMC_BOOT_MODE)) { + DrvNum = XFSBL_SD_DRV_NUM_0; + } + else { + /* For XFSBL_SD1_BOOT_MODE or XFSBL_SD1_LS_BOOT_MODE */ + DrvNum = XFSBL_SD_DRV_NUM_1; + } +#else + DrvNum = XFSBL_SD_DRV_NUM_0; +#endif + + return DrvNum; +} + /****************************************************************************/ /** * diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.h b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.h index cecc072e..05e9150b 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.h +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.h @@ -62,6 +62,8 @@ extern "C" { #include "xil_exception.h" /************************** Constant Definitions *****************************/ +#define XFSBL_SD_DRV_NUM_0 0 +#define XFSBL_SD_DRV_NUM_1 1 /**************************** Type Definitions *******************************/ @@ -75,7 +77,8 @@ int XFsbl_MemCmp(const void *Str1Ptr, const void *Str2Ptr, u32 Count); char *XFsbl_Strcpy(char *DestPtr, const char *SrcPtr); char * XFsbl_Strcat(char* Str1Ptr, const char* Str2Ptr); void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, - u32 MultibootReg, u32 DeviceFlags); + u32 MultibootReg, u32 DrvNum); +u32 XFsbl_GetDrvNumSD(u32 DeviceFlags); u32 XFsbl_Htonl(u32 Value1); u32 XFsbl_PowerUpIsland(u32 PwrIslandMask); diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_sd.c b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_sd.c index 17f17ae5..06cb4729 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_sd.c +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_sd.c @@ -66,8 +66,9 @@ /************************** Function Prototypes ******************************/ extern void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, - u32 MultibootReg, u32 DeviceFlags); + u32 MultibootReg, u32 DrvNum); +extern u32 XFsbl_GetDrvNumSD(u32 DeviceFlags); /************************** Variable Definitions *****************************/ @@ -91,14 +92,15 @@ u32 XFsbl_SdInit(u32 DeviceFlags) char *boot_file = buffer; u32 MultiBootOffset=0U; TCHAR *path; + u32 DrvNum; - /* Set logical drive number as 0 or 1 based on SD0 or SD1 */ - if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) || - (DeviceFlags == XFSBL_EMMC_BOOT_MODE)) { + DrvNum = XFsbl_GetDrvNumSD(DeviceFlags); + + /* Set logical drive number */ + if (DrvNum == XFSBL_SD_DRV_NUM_0) { path = "0:/"; } else { - /* For XFSBL_SD1_BOOT_MODE or XFSBL_SD1_LS_BOOT_MODE */ path = "1:/"; } @@ -120,7 +122,7 @@ u32 XFsbl_SdInit(u32 DeviceFlags) /** * Create boot image name */ - XFsbl_MakeSdFileName(boot_file, MultiBootOffset, DeviceFlags); + XFsbl_MakeSdFileName(boot_file, MultiBootOffset, DrvNum); rc = f_open(&fil, boot_file, FA_READ); if (rc) {