cmd_ide: enhance new feature "CONFIG_IDE_AHB"
Although most IDE controller is designed to be connected to PCI bridge, there are still some IDE controller support AHB interface for SoC design. The driver implementation of these IDE-AHB controllers differ from other IDE-PCI controller, some additional registers and commands access is required during CMD/DATA I/O. Hence a configuration "CONFIG_IDE_AHB" in cmd_ide.c is required to be defined to support these kinds of SoC controllers. Such as Faraday's FTIDE020 series and Global Unichip's UINF-0301. Signed-off-by: Macpaul Lin <macpaul@andestech.com>
This commit is contained in:
		
							parent
							
								
									dea6386b71
								
							
						
					
					
						commit
						0abddf82d5
					
				
							
								
								
									
										8
									
								
								README
								
								
								
								
							
							
						
						
									
										8
									
								
								README
								
								
								
								
							|  | @ -2751,6 +2751,14 @@ Low Level (hardware related) configuration options: | ||||||
| 		source code. It is used to make hardware dependant | 		source code. It is used to make hardware dependant | ||||||
| 		initializations. | 		initializations. | ||||||
| 
 | 
 | ||||||
|  | - CONFIG_IDE_AHB: | ||||||
|  | 		Most IDE controllers were designed to be connected with PCI | ||||||
|  | 		interface. Only few of them were designed for AHB interface. | ||||||
|  | 		When software is doing ATA command and data transfer to | ||||||
|  | 		IDE devices through IDE-AHB controller, some additional | ||||||
|  | 		registers accessing to these kind of IDE-AHB controller | ||||||
|  | 		is requierd. | ||||||
|  | 
 | ||||||
| - CONFIG_SYS_IMMR:	Physical address of the Internal Memory. | - CONFIG_SYS_IMMR:	Physical address of the Internal Memory. | ||||||
| 		DO NOT CHANGE unless you know exactly what you're | 		DO NOT CHANGE unless you know exactly what you're | ||||||
| 		doing! (11-4) [MPC8xx/82xx systems only] | 		doing! (11-4) [MPC8xx/82xx systems only] | ||||||
|  |  | ||||||
|  | @ -517,8 +517,20 @@ __ide_outb(int dev, int port, unsigned char val) | ||||||
| { | { | ||||||
| 	debug ("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n", | 	debug ("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n", | ||||||
| 		dev, port, val, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port))); | 		dev, port, val, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port))); | ||||||
| 	outb(val, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port))); | 
 | ||||||
|  | #if defined(CONFIG_IDE_AHB) | ||||||
|  | 	if (port) { | ||||||
|  | 		/* write command */ | ||||||
|  | 		ide_write_register(dev, port, val); | ||||||
|  | 	} else { | ||||||
|  | 		/* write data */ | ||||||
|  | 		outb(val, (ATA_CURR_BASE(dev))); | ||||||
| 	} | 	} | ||||||
|  | #else | ||||||
|  | 	outb(val, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port))); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void ide_outb (int dev, int port, unsigned char val) | void ide_outb (int dev, int port, unsigned char val) | ||||||
| 		__attribute__((weak, alias("__ide_outb"))); | 		__attribute__((weak, alias("__ide_outb"))); | ||||||
| 
 | 
 | ||||||
|  | @ -526,7 +538,13 @@ unsigned char inline | ||||||
| __ide_inb(int dev, int port) | __ide_inb(int dev, int port) | ||||||
| { | { | ||||||
| 	uchar val; | 	uchar val; | ||||||
|  | 
 | ||||||
|  | #if defined(CONFIG_IDE_AHB) | ||||||
|  | 	val = ide_read_register(dev, port); | ||||||
|  | #else | ||||||
| 	val = inb((ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port))); | 	val = inb((ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port))); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| 	debug ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n", | 	debug ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n", | ||||||
| 		dev, port, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port)), val); | 		dev, port, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port)), val); | ||||||
| 	return val; | 	return val; | ||||||
|  | @ -695,6 +713,7 @@ void ide_init (void) | ||||||
| 		ide_dev_desc[i].blksz=0; | 		ide_dev_desc[i].blksz=0; | ||||||
| 		ide_dev_desc[i].lba=0; | 		ide_dev_desc[i].lba=0; | ||||||
| 		ide_dev_desc[i].block_read=ide_read; | 		ide_dev_desc[i].block_read=ide_read; | ||||||
|  | 		ide_dev_desc[i].block_write = ide_write; | ||||||
| 		if (!ide_bus_ok[IDE_BUS(i)]) | 		if (!ide_bus_ok[IDE_BUS(i)]) | ||||||
| 			continue; | 			continue; | ||||||
| 		ide_led (led, 1);		/* LED on	*/ | 		ide_led (led, 1);		/* LED on	*/ | ||||||
|  | @ -902,7 +921,11 @@ output_data(int dev, ulong *sect_buf, int words) | ||||||
| static void | static void | ||||||
| output_data(int dev, ulong *sect_buf, int words) | output_data(int dev, ulong *sect_buf, int words) | ||||||
| { | { | ||||||
|  | #if defined(CONFIG_IDE_AHB) | ||||||
|  | 	ide_write_data(dev, sect_buf, words); | ||||||
|  | #else | ||||||
| 	outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1); | 	outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1); | ||||||
|  | #endif | ||||||
| } | } | ||||||
| #endif	/* CONFIG_IDE_SWAP_IO */ | #endif	/* CONFIG_IDE_SWAP_IO */ | ||||||
| 
 | 
 | ||||||
|  | @ -960,7 +983,11 @@ input_data(int dev, ulong *sect_buf, int words) | ||||||
| static void | static void | ||||||
| input_data(int dev, ulong *sect_buf, int words) | input_data(int dev, ulong *sect_buf, int words) | ||||||
| { | { | ||||||
|  | #if defined(CONFIG_IDE_AHB) | ||||||
|  | 	ide_read_data(dev, sect_buf, words); | ||||||
|  | #else | ||||||
| 	insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1); | 	insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1); | ||||||
|  | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif	/* CONFIG_IDE_SWAP_IO */ | #endif	/* CONFIG_IDE_SWAP_IO */ | ||||||
|  |  | ||||||
|  | @ -57,4 +57,11 @@ ulong ide_write(int device, lbaint_t blknr, ulong blkcnt, void *buffer); | ||||||
| #if defined(CONFIG_OF_IDE_FIXUP) | #if defined(CONFIG_OF_IDE_FIXUP) | ||||||
| int ide_device_present(int dev); | int ide_device_present(int dev); | ||||||
| #endif | #endif | ||||||
|  | 
 | ||||||
|  | #if defined(CONFIG_IDE_AHB) | ||||||
|  | unsigned char ide_read_register(int dev, unsigned int port); | ||||||
|  | void ide_write_register(int dev, unsigned int port, unsigned char val); | ||||||
|  | void ide_read_data(int dev, ulong *sect_buf, int words); | ||||||
|  | void ide_write_data(int dev, ulong *sect_buf, int words); | ||||||
|  | #endif | ||||||
| #endif /* _IDE_H */ | #endif /* _IDE_H */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue