diff options
Diffstat (limited to 'common/cmd_ide.c')
| -rw-r--r-- | common/cmd_ide.c | 85 | 
1 files changed, 85 insertions, 0 deletions
| diff --git a/common/cmd_ide.c b/common/cmd_ide.c index 331041c16..668d838af 100644 --- a/common/cmd_ide.c +++ b/common/cmd_ide.c @@ -835,6 +835,7 @@ output_data_short(int dev, ulong *sect_buf, int words)  static void  input_swap_data(int dev, ulong *sect_buf, int words)  { +#ifndef CONFIG_BMS2003  	volatile ushort	*pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);  	ushort	*dbuf = (ushort *)sect_buf; @@ -842,6 +843,20 @@ input_swap_data(int dev, ulong *sect_buf, int words)  		*dbuf++ = ld_le16(pbuf);  		*dbuf++ = ld_le16(pbuf);  	} +#else	/* CONFIG_BMS2003 */ +	uchar i; +	volatile uchar *pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN); +	volatile uchar *pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD); +	ushort  *dbuf = (ushort *)sect_buf; + +	while (words--) { +		for (i=0; i<2; i++) { +			*(((uchar *)(dbuf)) + 1) = *pbuf_even; +			*(uchar *)dbuf = *pbuf_odd; +			dbuf+=1; +		} +	} +#endif	/* CONFIG_BMS2003 */  }  #endif	/* __LITTLE_ENDIAN || CONFIG_AU1X00 */ @@ -850,6 +865,7 @@ input_swap_data(int dev, ulong *sect_buf, int words)  static void  output_data(int dev, ulong *sect_buf, int words)  { +#ifndef CONFIG_BMS2003  	ushort	*dbuf;  	volatile ushort	*pbuf; @@ -861,6 +877,25 @@ output_data(int dev, ulong *sect_buf, int words)  		__asm__ volatile ("eieio");  		*pbuf = *dbuf++;  	} +#else	/* CONFIG_BMS2003 */ +	uchar	*dbuf; +	volatile uchar	*pbuf_even; +	volatile uchar	*pbuf_odd; + +	pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN); +	pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD); +	dbuf = (uchar *)sect_buf; +	while (words--) { +		__asm__ volatile ("eieio"); +		*pbuf_even = *dbuf++; +		__asm__ volatile ("eieio"); +		*pbuf_odd = *dbuf++; +		__asm__ volatile ("eieio"); +		*pbuf_even = *dbuf++; +		__asm__ volatile ("eieio"); +		*pbuf_odd = *dbuf++; +	} +#endif	/* CONFIG_BMS2003 */  }  #else	/* ! __PPC__ */  static void @@ -874,6 +909,7 @@ output_data(int dev, ulong *sect_buf, int words)  static void  input_data(int dev, ulong *sect_buf, int words)  { +#ifndef CONFIG_BMS2003  	ushort	*dbuf;  	volatile ushort	*pbuf; @@ -885,6 +921,25 @@ input_data(int dev, ulong *sect_buf, int words)  		__asm__ volatile ("eieio");  		*dbuf++ = *pbuf;  	} +#else	/* CONFIG_BMS2003 */ +	uchar	*dbuf; +	volatile uchar	*pbuf_even; +	volatile uchar	*pbuf_odd; + +	pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN); +	pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD); +	dbuf = (uchar *)sect_buf; +	while (words--) { +		__asm__ volatile ("eieio"); +		*dbuf++ = *pbuf_even; +		__asm__ volatile ("eieio"); +		*dbuf++ = *pbuf_odd; +		__asm__ volatile ("eieio"); +		*dbuf++ = *pbuf_even; +		__asm__ volatile ("eieio"); +		*dbuf++ = *pbuf_odd; +	} +#endif	/* CONFIG_BMS2003 */  }  #else	/* ! __PPC__ */  static void @@ -1409,6 +1464,7 @@ static void ide_led (uchar led, uchar status)  static void  output_data_shorts(int dev, ushort *sect_buf, int shorts)  { +#ifndef CONFIG_BMS2003  	ushort	*dbuf;  	volatile ushort	*pbuf; @@ -1418,11 +1474,26 @@ output_data_shorts(int dev, ushort *sect_buf, int shorts)  		__asm__ volatile ("eieio");  		*pbuf = *dbuf++;  	} +#else	/* CONFIG_BMS2003 */ +	uchar	*dbuf; +	volatile uchar	*pbuf_even; +	volatile uchar	*pbuf_odd; + +	pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN); +	pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD); +	while (shorts--) { +		__asm__ volatile ("eieio"); +		*pbuf_even = *dbuf++; +		__asm__ volatile ("eieio"); +		*pbuf_odd = *dbuf++; +	} +#endif	/* CONFIG_BMS2003 */  }  static void  input_data_shorts(int dev, ushort *sect_buf, int shorts)  { +#ifndef CONFIG_BMS2003  	ushort	*dbuf;  	volatile ushort	*pbuf; @@ -1432,6 +1503,20 @@ input_data_shorts(int dev, ushort *sect_buf, int shorts)  		__asm__ volatile ("eieio");  		*dbuf++ = *pbuf;  	} +#else	/* CONFIG_BMS2003 */ +	uchar	*dbuf; +	volatile uchar	*pbuf_even; +	volatile uchar	*pbuf_odd; + +	pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN); +	pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD); +	while (shorts--) { +		__asm__ volatile ("eieio"); +		*dbuf++ = *pbuf_even; +		__asm__ volatile ("eieio"); +		*dbuf++ = *pbuf_odd; +	} +#endif	/* CONFIG_BMS2003 */  }  #else	/* ! __PPC__ */ |