diff options
| author | mushtaq khan <mushtaq_k@procsys.com> | 2007-04-20 14:23:02 +0530 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2007-05-15 23:25:37 +0200 | 
| commit | 66d9dbec1cc27d6398ee6cf84639dbe14971251e (patch) | |
| tree | 55c162c1992cf22fb7a94cb71009e5a9e87f36f9 /include/sata.h | |
| parent | 644e6fb4eb8be90ea04ba34b643a8bf019d680e0 (diff) | |
| download | olio-uboot-2014.01-66d9dbec1cc27d6398ee6cf84639dbe14971251e.tar.xz olio-uboot-2014.01-66d9dbec1cc27d6398ee6cf84639dbe14971251e.zip | |
Add driver for S-ATA-controller on Intel processors with South
Bridge, ICH-5, ICH-6 and ICH-7. 
Implementation:
1. Code is divided in to two files. All functions, which are
   controller specific are kept in "drivers/ata_piix.c" file and
   functions, which are not controller specific, are kept in
   "common/cmd_sata.c" file.
2. Reading and Writing from the S-ATA drive is done using PIO method.
3. Driver can be configured for 48-bit addressing by defining macro
   CONFIG_LBA48, if this macro is not defined driver uses the 28-bit
   addressing.
4. S-ATA read function is hooked to the File system, commands like
   ext2ls and ext2load file can be used. This has been tested.
5. U-Boot command "SATA_init" is added, which initializes the S-ATA
   controller and identifies the S-ATA drives connected to it.
6. U-Boot command "sata" is added, which is used to read/write, print
   partition table and get info about the drives present. This I have
   implemented in same way as "ide" command is implemented in U-Boot.
7. This driver is for S-ATA in native mode.
8. This driver does not support the Native command queuing and
   Hot-plugging.
Signed-off-by: Mushtaq Khan <mushtaq_k@procsys.com>
Diffstat (limited to 'include/sata.h')
| -rw-r--r-- | include/sata.h | 108 | 
1 files changed, 108 insertions, 0 deletions
| diff --git a/include/sata.h b/include/sata.h new file mode 100644 index 000000000..c6fa2ab5b --- /dev/null +++ b/include/sata.h @@ -0,0 +1,108 @@ + +#if (DEBUG_SATA) +#define PRINTF(fmt,args...)	printf (fmt ,##args) +#else +#define PRINTF(fmt,args...) +#endif + +struct sata_ioports { +	unsigned long cmd_addr; +	unsigned long data_addr; +	unsigned long error_addr; +	unsigned long feature_addr; +	unsigned long nsect_addr; +	unsigned long lbal_addr; +	unsigned long lbam_addr; +	unsigned long lbah_addr; +	unsigned long device_addr; +	unsigned long status_addr; +	unsigned long command_addr; +	unsigned long altstatus_addr; +	unsigned long ctl_addr; +	unsigned long bmdma_addr; +	unsigned long scr_addr; +}; + +struct sata_port { +	unsigned char port_no;	/*primary-0, secondary=1 */ +	struct sata_ioports ioaddr;	/*ATA cmd/ctl/dma reg blks */ +	unsigned char ctl_reg; +	unsigned char last_ctl; +	unsigned char port_state;	/*1-port is present and  +					   0-port is not available */ +	unsigned char dev_mask; +}; + +/***********SATA LIBRARY SPECIFIC DEFINITIONS AND DECLARATIONS**************/ +#ifdef SATA_DECL		/*SATA library specific declarations */ +#define ata_id_has_lba48(id)    ((id)[83] & (1 << 10)) +#define ata_id_has_lba(id)      ((id)[49] & (1 << 9)) +#define ata_id_has_dma(id)      ((id)[49] & (1 << 8)) +#define ata_id_u32(id,n)        \ +	(((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)])) +#define ata_id_u64(id,n)        \ +	(((u64) (id)[(n) + 3] << 48) | \ +	((u64) (id)[(n) + 2] << 32) | \ +	((u64) (id)[(n) + 1] << 16) | \ +	((u64) (id)[(n) + 0]) ) +#endif + +#ifdef SATA_DECL		/*SATA library specific declarations */ +static inline void +ata_dump_id (u16 * id) +{ +	PRINTF ("49==0x%04x  " +		"53==0x%04x  " +		"63==0x%04x  " +		"64==0x%04x  " +		"75==0x%04x  \n", id[49], id[53], id[63], id[64], id[75]); +	PRINTF ("80==0x%04x  " +		"81==0x%04x  " +		"82==0x%04x  " +		"83==0x%04x  " +		"84==0x%04x  \n", id[80], id[81], id[82], id[83], id[84]); +	PRINTF ("88==0x%04x  " "93==0x%04x\n", id[88], id[93]); +} +#endif + +#ifdef SATA_DECL		/*SATA library specific declarations */ +int sata_bus_softreset (int num); +void sata_identify (int num, int dev); +void sata_port (struct sata_ioports *ioport); +void set_Feature_cmd (int num, int dev); +int sata_devchk (struct sata_ioports *ioaddr, int dev); +void dev_select (struct sata_ioports *ioaddr, int dev); +u8 sata_busy_wait (struct sata_ioports *ioaddr, int bits, unsigned int max); +u8 sata_chk_status (struct sata_ioports *ioaddr); +ulong sata_read (int device, lbaint_t blknr, ulong blkcnt, ulong * buffer); +ulong sata_write (int device, lbaint_t blknr, ulong blkcnt, ulong * buffer); +void msleep (int count); +#else +extern int sata_bus_softreset (int num); +extern void sata_identify (int num, int dev); +extern void sata_port (struct sata_ioports *ioport); +extern void set_Feature_cmd (int num, int dev); +extern ulong sata_read (int device, lbaint_t blknr, +			ulong blkcnt, ulong * buffer); +extern ulong sata_write (int device, lbaint_t blknr, +			 ulong blkcnt, ulong * buffer); +extern void msleep (int count); +#endif + +/************DRIVER SPECIFIC DEFINITIONS AND DECLARATIONS**************/ + +#ifdef DRV_DECL			/*Driver specific declaration */ +int init_sata (void); +#else +extern int init_sata (void); +#endif + +#ifdef DRV_DECL			/*Defines Driver Specific variables */ +struct sata_port port[CFG_SATA_MAXBUS]; +block_dev_desc_t sata_dev_desc[CFG_SATA_MAXDEVICES]; +int curr_dev = -1; +#else +extern struct sata_port port[CFG_SATA_MAXBUS]; +extern block_dev_desc_t sata_dev_desc[CFG_SATA_MAXDEVICES]; +extern int curr_dev; +#endif |