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 <saratcha@xilinx.com>
Acked-by: Krishna Chaitanya Patakamuri <kpataka@xilinx.com>
This commit is contained in:
Sarat Chand Savitala 2015-10-29 19:06:10 +05:30 committed by Nava kishore Manne
parent a83a191293
commit 816e90b214
4 changed files with 51 additions and 14 deletions

View file

@ -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

View file

@ -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;
}
/****************************************************************************/
/**
*

View file

@ -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);

View file

@ -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) {