/******************************************************************************* Copyright (C) Marvell International Ltd. and its affiliates ******************************************************************************** Marvell GPL License Option If you received this File from Marvell, you may opt to use, redistribute and/or modify this File in accordance with the terms and conditions of the General Public License Version 2, June 1991 (the "GPL License"), a copy of which is available along with the File in the license.txt file or by writing to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or on the worldwide web at http://www.gnu.org/licenses/gpl.txt. THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY DISCLAIMED. The GPL License provides additional details about this warranty disclaimer. *******************************************************************************/ #include #include #include #include #include #include #include #include "xor/mvXor.h" #if ((CONFIG_COMMANDS & CFG_CMD_IDE ) && (CONFIG_COMMANDS & CFG_CMD_EXT2)) #define DOS_PART_MAGIC_OFFSET 0x1fe #define PARTITION_CRC_OFF 0x0 #ifdef CONFIG_ISO_PARTITION /* Make the buffers bigger if ISO partition support is enabled -- CD-ROMS have 2048 byte blocks */ #define DEFAULT_SECTOR_SIZE 2048 #else #define DEFAULT_SECTOR_SIZE 512 #endif #define MAX_BOOT_PART 2 extern block_dev_desc_t * ide_get_dev(int dev); static char tmp_string[100]; static char tmp_string1[100]; int do_bootext2 (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { int dev,part,active_part= -1 ; ulong addr; volatile disk_partition_t info[2]; volatile char *env,*env2; block_dev_desc_t *dev_desc; ulong boot_part[MAX_BOOT_PART]; char *ep; if (argc != 5) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } dev = simple_strtoul(argv[1], &ep, 16); if (*ep) { if (*ep != ':') { printf ("Usage:\n%s\n", cmdtp->usage); return(1); } for (part=0 ; part < MAX_BOOT_PART-1 ; part++) { ep++; boot_part[part] = (ulong)simple_strtoul(ep, &ep, 16); if (*ep != ',') { printf ("Usage:\n%s\n", cmdtp->usage); return(1); } } boot_part[part] = (ulong)simple_strtoul(++ep, NULL, 16); } else { puts ("\n** Invalid boot device, use `dev:boot_part1,boot_part2' **\n"); return(1); } addr = simple_strtoul(argv[2], NULL, 16); dev_desc = (dev >= CFG_IDE_MAXDEVICE) ? NULL : ide_get_dev(dev); if (dev_desc == NULL) { printf("Non valid dev number %x\n",dev); return 1; } /* Initialize IDE */ sprintf(tmp_string,"ide reset"); run_command(tmp_string,0); /* Search for Active partition in partition #1 and partition #2*/ for (part = 0; part < MAX_BOOT_PART ;part++ ) { if (get_partition_info (dev_desc, boot_part[part], (disk_partition_t*)&info[part])) { continue; } if (info[part].boot_ind ) { active_part = part; break; } } /* If no active partition then return */ if (active_part == -1) { printf("No active partition on %d and %d\n", boot_part[0],boot_part[1]); return 1; } /* Load /boot/uImage from active_part to addr */ sprintf(tmp_string,"ext2load ide %x:%x %x %s", dev, boot_part[active_part], addr,argv[3]); printf("%s\n",tmp_string); run_command(tmp_string,0); sprintf(tmp_string,"root=%s%d ro",argv[4],boot_part[active_part]); setenv("bootargs_root",tmp_string); env = getenv("bootargs"); env2 = getenv("bootargs_root"); /* Save bootargs for secondary boot option if boot from active partition will fail */ sprintf(tmp_string1,"%s",env); sprintf(tmp_string,"%s %s",env,env2); setenv("bootargs",tmp_string); sprintf(tmp_string,"bootm %x", addr); printf("%s\n",tmp_string); run_command(tmp_string,0); /* If we get here then first boot fail */ active_part = (active_part + 1)%MAX_BOOT_PART; sprintf(tmp_string,"ext2load ide %x:%x %x %s", dev, boot_part[active_part], addr,argv[3]); printf("%s\n",tmp_string); run_command(tmp_string,0); sprintf(tmp_string,"root=%s%d ro",argv[4],boot_part[active_part]); setenv("bootargs_root",tmp_string); env2 = getenv("bootargs_root"); sprintf(tmp_string,"%s %s %s",tmp_string1,env2, "boot_failure"); setenv("bootargs",tmp_string); sprintf(tmp_string,"bootm %x", addr); printf("Starting secondary boot...\n"); printf("%s\n",tmp_string); run_command(tmp_string,0); printf("Secondary boot fail...\n"); return 1; } U_BOOT_CMD( bootext2, 5, 0, do_bootext2, "bootext2 dev:boot_part1,boot_part2 addr boot_image linux_dev_name \n", "dev:boot_part1,boot_part2 addr boot_image linux_dev_name\n" "- boot boot_image from active ext2 partition\n" ); #endif /* #if (CONFIG_COMMANDS & CFG_CMD_EXT2 & CFG_CMD_IDE) */