diff options
| author | Stefan Roese <sr@denx.de> | 2007-08-15 21:06:27 +0200 | 
|---|---|---|
| committer | Stefan Roese <sr@denx.de> | 2007-08-15 21:06:27 +0200 | 
| commit | b706d63559aeec352bc72dd86d7d5423c15f6a60 (patch) | |
| tree | fdeda4d61970fef239d9d66ecd851fa46cfe5ec0 /common/cmd_ide.c | |
| parent | c8603cfbd4573379a6076c9c208545ba2bbf019a (diff) | |
| parent | 594e79838ce5078a90d0c27abb2b2d61d5f8e8a7 (diff) | |
| download | olio-uboot-2014.01-b706d63559aeec352bc72dd86d7d5423c15f6a60.tar.xz olio-uboot-2014.01-b706d63559aeec352bc72dd86d7d5423c15f6a60.zip | |
Merge with git://www.denx.de/git/u-boot.git
Diffstat (limited to 'common/cmd_ide.c')
| -rw-r--r-- | common/cmd_ide.c | 71 | 
1 files changed, 48 insertions, 23 deletions
| diff --git a/common/cmd_ide.c b/common/cmd_ide.c index e308474af..89fefed33 100644 --- a/common/cmd_ide.c +++ b/common/cmd_ide.c @@ -59,13 +59,6 @@ unsigned long mips_io_port_base = 0;  #endif  #endif -#ifdef CONFIG_SHOW_BOOT_PROGRESS -# include <status_led.h> -# define SHOW_BOOT_PROGRESS(arg)	show_boot_progress(arg) -#else -# define SHOW_BOOT_PROGRESS(arg) -#endif -  #ifdef CONFIG_IDE_8xx_DIRECT  DECLARE_GLOBAL_DATA_PTR;  #endif @@ -78,7 +71,7 @@ DECLARE_GLOBAL_DATA_PTR;  # define SYNC		/* nothing */  #endif -#if (CONFIG_COMMANDS & CFG_CMD_IDE) +#if defined(CONFIG_CMD_IDE)  #ifdef CONFIG_IDE_8xx_DIRECT  /* Timings for IDE Interface @@ -185,6 +178,9 @@ static void input_data(int dev, ulong *sect_buf, int words);  static void output_data(int dev, ulong *sect_buf, int words);  static void ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len); +#ifndef CFG_ATA_PORT_ADDR +#define CFG_ATA_PORT_ADDR(port) (port) +#endif  #ifdef CONFIG_ATAPI  static void	atapi_inquiry(block_dev_desc_t *dev_desc); @@ -382,6 +378,7 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	image_header_t *hdr;  	int rcode = 0; +	show_boot_progress (41);  	switch (argc) {  	case 1:  		addr = CFG_LOAD_ADDR; @@ -397,44 +394,50 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		break;  	default:  		printf ("Usage:\n%s\n", cmdtp->usage); -		SHOW_BOOT_PROGRESS (-1); +		show_boot_progress (-42);  		return 1;  	} +	show_boot_progress (42);  	if (!boot_device) {  		puts ("\n** No boot device **\n"); -		SHOW_BOOT_PROGRESS (-1); +		show_boot_progress (-43);  		return 1;  	} +	show_boot_progress (43);  	dev = simple_strtoul(boot_device, &ep, 16);  	if (ide_dev_desc[dev].type==DEV_TYPE_UNKNOWN) {  		printf ("\n** Device %d not available\n", dev); -		SHOW_BOOT_PROGRESS (-1); +		show_boot_progress (-44);  		return 1;  	} +	show_boot_progress (44);  	if (*ep) {  		if (*ep != ':') {  			puts ("\n** Invalid boot device, use `dev[:part]' **\n"); -			SHOW_BOOT_PROGRESS (-1); +			show_boot_progress (-45);  			return 1;  		}  		part = simple_strtoul(++ep, NULL, 16);  	} +	show_boot_progress (45);  	if (get_partition_info (&ide_dev_desc[dev], part, &info)) { -		SHOW_BOOT_PROGRESS (-1); +		show_boot_progress (-46);  		return 1;  	} +	show_boot_progress (46);  	if ((strncmp((char *)info.type, BOOT_PART_TYPE, sizeof(info.type)) != 0) &&  	    (strncmp((char *)info.type, BOOT_PART_COMP, sizeof(info.type)) != 0)) {  		printf ("\n** Invalid partition type \"%.32s\""  			" (expect \"" BOOT_PART_TYPE "\")\n",  			info.type); -		SHOW_BOOT_PROGRESS (-1); +		show_boot_progress (-47);  		return 1;  	} +	show_boot_progress (47);  	printf ("\nLoading from IDE device %d, partition %d: "  		"Name: %.32s  Type: %.32s\n", @@ -445,26 +448,29 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	if (ide_dev_desc[dev].block_read (dev, info.start, 1, (ulong *)addr) != 1) {  		printf ("** Read error on %d:%d\n", dev, part); -		SHOW_BOOT_PROGRESS (-1); +		show_boot_progress (-48);  		return 1;  	} +	show_boot_progress (48);  	hdr = (image_header_t *)addr;  	if (ntohl(hdr->ih_magic) != IH_MAGIC) {  		printf("\n** Bad Magic Number **\n"); -		SHOW_BOOT_PROGRESS (-1); +		show_boot_progress (-49);  		return 1;  	} +	show_boot_progress (49);  	checksum = ntohl(hdr->ih_hcrc);  	hdr->ih_hcrc = 0;  	if (crc32 (0, (uchar *)hdr, sizeof(image_header_t)) != checksum) {  		puts ("\n** Bad Header Checksum **\n"); -		SHOW_BOOT_PROGRESS (-2); +		show_boot_progress (-50);  		return 1;  	} +	show_boot_progress (50);  	hdr->ih_hcrc = htonl(checksum); /* restore checksum for later use */  	print_image_hdr (hdr); @@ -477,9 +483,10 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	if (ide_dev_desc[dev].block_read (dev, info.start+1, cnt,  		      (ulong *)(addr+info.blksz)) != cnt) {  		printf ("** Read error on %d:%d\n", dev, part); -		SHOW_BOOT_PROGRESS (-1); +		show_boot_progress (-51);  		return 1;  	} +	show_boot_progress (51);  	/* Loading ok, update default load address */ @@ -807,13 +814,13 @@ ide_outb(int dev, int port, unsigned char val)  	/* Ensure I/O operations complete */  	EIEIO; -	*((uchar *)(ATA_CURR_BASE(dev)+port)) = val; +	*((u16 *)(ATA_CURR_BASE(dev)+CFG_ATA_PORT_ADDR(port))) = val;  }  #else	/* ! __PPC__ */  static void __inline__  ide_outb(int dev, int port, unsigned char val)  { -	outb(val, ATA_CURR_BASE(dev)+port); +	outb(val, ATA_CURR_BASE(dev)+CFG_ATA_PORT_ADDR(port));  }  #endif	/* __PPC__ */ @@ -825,7 +832,7 @@ ide_inb(int dev, int port)  	uchar val;  	/* Ensure I/O operations complete */  	EIEIO; -	val = *((uchar *)(ATA_CURR_BASE(dev)+port)); +	val = *((u16 *)(ATA_CURR_BASE(dev)+CFG_ATA_PORT_ADDR(port)));  	debug ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n",  		dev, port, (ATA_CURR_BASE(dev)+port), val);  	return (val); @@ -834,7 +841,7 @@ ide_inb(int dev, int port)  static unsigned char __inline__  ide_inb(int dev, int port)  { -  return inb(ATA_CURR_BASE(dev)+port); +  return inb(ATA_CURR_BASE(dev)+CFG_ATA_PORT_ADDR(port));  }  #endif	/* __PPC__ */ @@ -891,6 +898,9 @@ input_swap_data(int dev, ulong *sect_buf, int words)  #ifdef __MIPS__  		*dbuf++ = swab16p((u16*)pbuf);  		*dbuf++ = swab16p((u16*)pbuf); +#elif defined(CONFIG_PCS440EP) +		*dbuf++ = *pbuf; +		*dbuf++ = *pbuf;  #else  		*dbuf++ = ld_le16(pbuf);  		*dbuf++ = ld_le16(pbuf); @@ -930,10 +940,18 @@ output_data(int dev, ulong *sect_buf, int words)  	pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);  	dbuf = (ushort *)sect_buf;  	while (words--) { +#if defined(CONFIG_PCS440EP) +		/* not tested, because CF was write protected */ +		EIEIO; +		*pbuf = ld_le16(dbuf++); +		EIEIO; +		*pbuf = ld_le16(dbuf++); +#else  		EIEIO;  		*pbuf = *dbuf++;  		EIEIO;  		*pbuf = *dbuf++; +#endif  	}  #endif  } @@ -981,10 +999,17 @@ input_data(int dev, ulong *sect_buf, int words)  	debug("in input data base for read is %lx\n", (unsigned long) pbuf);  	while (words--) { +#if defined(CONFIG_PCS440EP) +		EIEIO; +		*dbuf++ = ld_le16(pbuf); +		EIEIO; +		*dbuf++ = ld_le16(pbuf); +#else  		EIEIO;  		*dbuf++ = *pbuf;  		EIEIO;  		*dbuf++ = *pbuf; +#endif  	}  #endif  } @@ -2080,4 +2105,4 @@ U_BOOT_CMD(  	"loadAddr dev:part\n"  ); -#endif	/* CONFIG_COMMANDS & CFG_CMD_IDE */ +#endif |