| /* | 
 |  * sata_dwc.h | 
 |  * | 
 |  * Synopsys DesignWare Cores (DWC) SATA host driver | 
 |  * | 
 |  * Author: Mark Miesfeld <mmiesfeld@amcc.com> | 
 |  * | 
 |  * Ported from 2.6.19.2 to 2.6.25/26 by Stefan Roese <sr@denx.de> | 
 |  * Copyright 2008 DENX Software Engineering | 
 |  * | 
 |  * Based on versions provided by AMCC and Synopsys which are: | 
 |  *          Copyright 2006 Applied Micro Circuits Corporation | 
 |  *          COPYRIGHT (C) 2005  SYNOPSYS, INC.  ALL RIGHTS RESERVED | 
 |  * | 
 |  * SPDX-License-Identifier:	GPL-2.0+ | 
 |  */ | 
 | /* | 
 |  * SATA support based on the chip canyonlands. | 
 |  * | 
 |  * 04-17-2009 | 
 |  *		The local version of this driver for the canyonlands board | 
 |  *		does not use interrupts but polls the chip instead. | 
 |  */ | 
 |  | 
 |  | 
 | #ifndef _SATA_DWC_H_ | 
 | #define _SATA_DWC_H_ | 
 |  | 
 | #define __U_BOOT__ | 
 |  | 
 | #define HZ 100 | 
 | #define READ 0 | 
 | #define WRITE 1 | 
 |  | 
 | enum { | 
 | 	ATA_READID_POSTRESET	= (1 << 0), | 
 |  | 
 | 	ATA_DNXFER_PIO		= 0, | 
 | 	ATA_DNXFER_DMA		= 1, | 
 | 	ATA_DNXFER_40C		= 2, | 
 | 	ATA_DNXFER_FORCE_PIO	= 3, | 
 | 	ATA_DNXFER_FORCE_PIO0	= 4, | 
 |  | 
 | 	ATA_DNXFER_QUIET	= (1 << 31), | 
 | }; | 
 |  | 
 | enum hsm_task_states { | 
 | 	HSM_ST_IDLE, | 
 | 	HSM_ST_FIRST, | 
 | 	HSM_ST, | 
 | 	HSM_ST_LAST, | 
 | 	HSM_ST_ERR, | 
 | }; | 
 |  | 
 | #define	ATA_SHORT_PAUSE		((HZ >> 6) + 1) | 
 |  | 
 | struct ata_queued_cmd { | 
 | 	struct ata_port		*ap; | 
 | 	struct ata_device	*dev; | 
 |  | 
 | 	struct ata_taskfile	tf; | 
 | 	u8			cdb[ATAPI_CDB_LEN]; | 
 | 	unsigned long		flags; | 
 | 	unsigned int		tag; | 
 | 	unsigned int		n_elem; | 
 |  | 
 | 	int			dma_dir; | 
 | 	unsigned int		sect_size; | 
 |  | 
 | 	unsigned int		nbytes; | 
 | 	unsigned int		extrabytes; | 
 | 	unsigned int		curbytes; | 
 |  | 
 | 	unsigned int		err_mask; | 
 | 	struct ata_taskfile	result_tf; | 
 |  | 
 | 	void			*private_data; | 
 | #ifndef __U_BOOT__ | 
 | 	void			*lldd_task; | 
 | #endif | 
 | 	unsigned char		*pdata; | 
 | }; | 
 |  | 
 | typedef void (*ata_qc_cb_t) (struct ata_queued_cmd *qc); | 
 |  | 
 | #define ATA_TAG_POISON	0xfafbfcfdU | 
 |  | 
 | enum { | 
 | 	LIBATA_MAX_PRD		= ATA_MAX_PRD / 2, | 
 | 	LIBATA_DUMB_MAX_PRD	= ATA_MAX_PRD / 4, | 
 | 	ATA_MAX_PORTS		= 8, | 
 | 	ATA_DEF_QUEUE		= 1, | 
 | 	ATA_MAX_QUEUE		= 32, | 
 | 	ATA_TAG_INTERNAL	= ATA_MAX_QUEUE - 1, | 
 | 	ATA_MAX_BUS		= 2, | 
 | 	ATA_DEF_BUSY_WAIT	= 10000, | 
 |  | 
 | 	ATAPI_MAX_DRAIN		= 16 << 10, | 
 |  | 
 | 	ATA_SHT_EMULATED	= 1, | 
 | 	ATA_SHT_CMD_PER_LUN	= 1, | 
 | 	ATA_SHT_THIS_ID		= -1, | 
 | 	ATA_SHT_USE_CLUSTERING	= 1, | 
 |  | 
 | 	ATA_DFLAG_LBA		= (1 << 0), | 
 | 	ATA_DFLAG_LBA48		= (1 << 1), | 
 | 	ATA_DFLAG_CDB_INTR	= (1 << 2), | 
 | 	ATA_DFLAG_NCQ		= (1 << 3), | 
 | 	ATA_DFLAG_FLUSH_EXT	= (1 << 4), | 
 | 	ATA_DFLAG_ACPI_PENDING 	= (1 << 5), | 
 | 	ATA_DFLAG_ACPI_FAILED	= (1 << 6), | 
 | 	ATA_DFLAG_AN		= (1 << 7), | 
 | 	ATA_DFLAG_HIPM		= (1 << 8), | 
 | 	ATA_DFLAG_DIPM		= (1 << 9), | 
 | 	ATA_DFLAG_DMADIR	= (1 << 10), | 
 | 	ATA_DFLAG_CFG_MASK	= (1 << 12) - 1, | 
 |  | 
 | 	ATA_DFLAG_PIO		= (1 << 12), | 
 | 	ATA_DFLAG_NCQ_OFF	= (1 << 13), | 
 | 	ATA_DFLAG_SPUNDOWN	= (1 << 14), | 
 | 	ATA_DFLAG_SLEEPING	= (1 << 15), | 
 | 	ATA_DFLAG_DUBIOUS_XFER	= (1 << 16), | 
 | 	ATA_DFLAG_INIT_MASK	= (1 << 24) - 1, | 
 |  | 
 | 	ATA_DFLAG_DETACH	= (1 << 24), | 
 | 	ATA_DFLAG_DETACHED	= (1 << 25), | 
 |  | 
 | 	ATA_LFLAG_HRST_TO_RESUME	= (1 << 0), | 
 | 	ATA_LFLAG_SKIP_D2H_BSY		= (1 << 1), | 
 | 	ATA_LFLAG_NO_SRST		= (1 << 2), | 
 | 	ATA_LFLAG_ASSUME_ATA		= (1 << 3), | 
 | 	ATA_LFLAG_ASSUME_SEMB		= (1 << 4), | 
 | 	ATA_LFLAG_ASSUME_CLASS = ATA_LFLAG_ASSUME_ATA | ATA_LFLAG_ASSUME_SEMB, | 
 | 	ATA_LFLAG_NO_RETRY		= (1 << 5), | 
 | 	ATA_LFLAG_DISABLED		= (1 << 6), | 
 |  | 
 | 	ATA_FLAG_SLAVE_POSS	= (1 << 0), | 
 | 	ATA_FLAG_SATA		= (1 << 1), | 
 | 	ATA_FLAG_NO_LEGACY	= (1 << 2), | 
 | 	ATA_FLAG_MMIO		= (1 << 3), | 
 | 	ATA_FLAG_SRST		= (1 << 4), | 
 | 	ATA_FLAG_SATA_RESET	= (1 << 5), | 
 | 	ATA_FLAG_NO_ATAPI	= (1 << 6), | 
 | 	ATA_FLAG_PIO_DMA	= (1 << 7), | 
 | 	ATA_FLAG_PIO_LBA48	= (1 << 8), | 
 | 	ATA_FLAG_PIO_POLLING	= (1 << 9), | 
 | 	ATA_FLAG_NCQ		= (1 << 10), | 
 | 	ATA_FLAG_DEBUGMSG	= (1 << 13), | 
 | 	ATA_FLAG_IGN_SIMPLEX	= (1 << 15), | 
 | 	ATA_FLAG_NO_IORDY	= (1 << 16), | 
 | 	ATA_FLAG_ACPI_SATA	= (1 << 17), | 
 | 	ATA_FLAG_AN		= (1 << 18), | 
 | 	ATA_FLAG_PMP		= (1 << 19), | 
 | 	ATA_FLAG_IPM		= (1 << 20), | 
 |  | 
 | 	ATA_FLAG_DISABLED	= (1 << 23), | 
 |  | 
 | 	ATA_PFLAG_EH_PENDING		= (1 << 0), | 
 | 	ATA_PFLAG_EH_IN_PROGRESS	= (1 << 1), | 
 | 	ATA_PFLAG_FROZEN		= (1 << 2), | 
 | 	ATA_PFLAG_RECOVERED		= (1 << 3), | 
 | 	ATA_PFLAG_LOADING		= (1 << 4), | 
 | 	ATA_PFLAG_UNLOADING		= (1 << 5), | 
 | 	ATA_PFLAG_SCSI_HOTPLUG		= (1 << 6), | 
 | 	ATA_PFLAG_INITIALIZING		= (1 << 7), | 
 | 	ATA_PFLAG_RESETTING		= (1 << 8), | 
 | 	ATA_PFLAG_SUSPENDED		= (1 << 17), | 
 | 	ATA_PFLAG_PM_PENDING		= (1 << 18), | 
 |  | 
 | 	ATA_QCFLAG_ACTIVE	= (1 << 0), | 
 | 	ATA_QCFLAG_DMAMAP	= (1 << 1), | 
 | 	ATA_QCFLAG_IO		= (1 << 3), | 
 | 	ATA_QCFLAG_RESULT_TF	= (1 << 4), | 
 | 	ATA_QCFLAG_CLEAR_EXCL	= (1 << 5), | 
 | 	ATA_QCFLAG_QUIET	= (1 << 6), | 
 |  | 
 | 	ATA_QCFLAG_FAILED	= (1 << 16), | 
 | 	ATA_QCFLAG_SENSE_VALID	= (1 << 17), | 
 | 	ATA_QCFLAG_EH_SCHEDULED	= (1 << 18), | 
 |  | 
 | 	ATA_HOST_SIMPLEX	= (1 << 0), | 
 | 	ATA_HOST_STARTED	= (1 << 1), | 
 |  | 
 | 	ATA_TMOUT_BOOT			= 30 * 100, | 
 | 	ATA_TMOUT_BOOT_QUICK		= 7 * 100, | 
 | 	ATA_TMOUT_INTERNAL		= 30 * 100, | 
 | 	ATA_TMOUT_INTERNAL_QUICK	= 5 * 100, | 
 |  | 
 | 	/* FIXME: GoVault needs 2s but we can't afford that without | 
 | 	 * parallel probing.  800ms is enough for iVDR disk | 
 | 	 * HHD424020F7SV00.  Increase to 2secs when parallel probing | 
 | 	 * is in place. | 
 | 	 */ | 
 | 	ATA_TMOUT_FF_WAIT	= 4 * 100 / 5, | 
 |  | 
 | 	BUS_UNKNOWN		= 0, | 
 | 	BUS_DMA			= 1, | 
 | 	BUS_IDLE		= 2, | 
 | 	BUS_NOINTR		= 3, | 
 | 	BUS_NODATA		= 4, | 
 | 	BUS_TIMER		= 5, | 
 | 	BUS_PIO			= 6, | 
 | 	BUS_EDD			= 7, | 
 | 	BUS_IDENTIFY		= 8, | 
 | 	BUS_PACKET		= 9, | 
 |  | 
 | 	PORT_UNKNOWN		= 0, | 
 | 	PORT_ENABLED		= 1, | 
 | 	PORT_DISABLED		= 2, | 
 |  | 
 | 	/* encoding various smaller bitmaps into a single | 
 | 	 * unsigned long bitmap | 
 | 	 */ | 
 | 	ATA_NR_PIO_MODES	= 7, | 
 | 	ATA_NR_MWDMA_MODES	= 5, | 
 | 	ATA_NR_UDMA_MODES	= 8, | 
 |  | 
 | 	ATA_SHIFT_PIO		= 0, | 
 | 	ATA_SHIFT_MWDMA		= ATA_SHIFT_PIO + ATA_NR_PIO_MODES, | 
 | 	ATA_SHIFT_UDMA		= ATA_SHIFT_MWDMA + ATA_NR_MWDMA_MODES, | 
 |  | 
 | 	ATA_DMA_PAD_SZ		= 4, | 
 |  | 
 | 	ATA_ERING_SIZE		= 32, | 
 |  | 
 | 	ATA_DEFER_LINK		= 1, | 
 | 	ATA_DEFER_PORT		= 2, | 
 |  | 
 | 	ATA_EH_DESC_LEN		= 80, | 
 |  | 
 | 	ATA_EH_REVALIDATE	= (1 << 0), | 
 | 	ATA_EH_SOFTRESET	= (1 << 1), | 
 | 	ATA_EH_HARDRESET	= (1 << 2), | 
 | 	ATA_EH_ENABLE_LINK	= (1 << 3), | 
 | 	ATA_EH_LPM		= (1 << 4), | 
 |  | 
 | 	ATA_EH_RESET_MASK	= ATA_EH_SOFTRESET | ATA_EH_HARDRESET, | 
 | 	ATA_EH_PERDEV_MASK	= ATA_EH_REVALIDATE, | 
 |  | 
 | 	ATA_EHI_HOTPLUGGED	= (1 << 0), | 
 | 	ATA_EHI_RESUME_LINK	= (1 << 1), | 
 | 	ATA_EHI_NO_AUTOPSY	= (1 << 2), | 
 | 	ATA_EHI_QUIET		= (1 << 3), | 
 |  | 
 | 	ATA_EHI_DID_SOFTRESET	= (1 << 16), | 
 | 	ATA_EHI_DID_HARDRESET	= (1 << 17), | 
 | 	ATA_EHI_PRINTINFO	= (1 << 18), | 
 | 	ATA_EHI_SETMODE		= (1 << 19), | 
 | 	ATA_EHI_POST_SETMODE	= (1 << 20), | 
 |  | 
 | 	ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, | 
 | 	ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK, | 
 |  | 
 | 	ATA_EH_MAX_TRIES	= 5, | 
 |  | 
 | 	ATA_PROBE_MAX_TRIES	= 3, | 
 | 	ATA_EH_DEV_TRIES	= 3, | 
 | 	ATA_EH_PMP_TRIES	= 5, | 
 | 	ATA_EH_PMP_LINK_TRIES	= 3, | 
 |  | 
 | 	SATA_PMP_SCR_TIMEOUT	= 250, | 
 |  | 
 | 	/* Horkage types. May be set by libata or controller on drives | 
 | 	(some horkage may be drive/controller pair dependant */ | 
 |  | 
 | 	ATA_HORKAGE_DIAGNOSTIC	= (1 << 0), | 
 | 	ATA_HORKAGE_NODMA	= (1 << 1), | 
 | 	ATA_HORKAGE_NONCQ	= (1 << 2), | 
 | 	ATA_HORKAGE_MAX_SEC_128	= (1 << 3), | 
 | 	ATA_HORKAGE_BROKEN_HPA	= (1 << 4), | 
 | 	ATA_HORKAGE_SKIP_PM	= (1 << 5), | 
 | 	ATA_HORKAGE_HPA_SIZE	= (1 << 6), | 
 | 	ATA_HORKAGE_IPM		= (1 << 7), | 
 | 	ATA_HORKAGE_IVB		= (1 << 8), | 
 | 	ATA_HORKAGE_STUCK_ERR	= (1 << 9), | 
 |  | 
 | 	ATA_DMA_MASK_ATA	= (1 << 0), | 
 | 	ATA_DMA_MASK_ATAPI	= (1 << 1), | 
 | 	ATA_DMA_MASK_CFA	= (1 << 2), | 
 |  | 
 | 	ATAPI_READ		= 0, | 
 | 	ATAPI_WRITE		= 1, | 
 | 	ATAPI_READ_CD		= 2, | 
 | 	ATAPI_PASS_THRU		= 3, | 
 | 	ATAPI_MISC		= 4, | 
 | }; | 
 |  | 
 | enum ata_completion_errors { | 
 | 	AC_ERR_DEV		= (1 << 0), | 
 | 	AC_ERR_HSM		= (1 << 1), | 
 | 	AC_ERR_TIMEOUT		= (1 << 2), | 
 | 	AC_ERR_MEDIA		= (1 << 3), | 
 | 	AC_ERR_ATA_BUS		= (1 << 4), | 
 | 	AC_ERR_HOST_BUS		= (1 << 5), | 
 | 	AC_ERR_SYSTEM		= (1 << 6), | 
 | 	AC_ERR_INVALID		= (1 << 7), | 
 | 	AC_ERR_OTHER		= (1 << 8), | 
 | 	AC_ERR_NODEV_HINT	= (1 << 9), | 
 | 	AC_ERR_NCQ		= (1 << 10), | 
 | }; | 
 |  | 
 | enum ata_xfer_mask { | 
 | 	ATA_MASK_PIO	= ((1LU << ATA_NR_PIO_MODES) - 1) << ATA_SHIFT_PIO, | 
 | 	ATA_MASK_MWDMA	= ((1LU << ATA_NR_MWDMA_MODES) - 1) << ATA_SHIFT_MWDMA, | 
 | 	ATA_MASK_UDMA	= ((1LU << ATA_NR_UDMA_MODES) - 1) << ATA_SHIFT_UDMA, | 
 | }; | 
 |  | 
 | struct ata_port_info { | 
 | #ifndef __U_BOOT__ | 
 | 	struct scsi_host_template	*sht; | 
 | #endif | 
 | 	unsigned long			flags; | 
 | 	unsigned long			link_flags; | 
 | 	unsigned long			pio_mask; | 
 | 	unsigned long			mwdma_mask; | 
 | 	unsigned long			udma_mask; | 
 | #ifndef __U_BOOT__ | 
 | 	const struct ata_port_operations *port_ops; | 
 | 	void				*private_data; | 
 | #endif | 
 | }; | 
 |  | 
 | struct ata_ioports { | 
 | 	void __iomem		*cmd_addr; | 
 | 	void __iomem		*data_addr; | 
 | 	void __iomem		*error_addr; | 
 | 	void __iomem		*feature_addr; | 
 | 	void __iomem		*nsect_addr; | 
 | 	void __iomem		*lbal_addr; | 
 | 	void __iomem		*lbam_addr; | 
 | 	void __iomem		*lbah_addr; | 
 | 	void __iomem		*device_addr; | 
 | 	void __iomem		*status_addr; | 
 | 	void __iomem		*command_addr; | 
 | 	void __iomem		*altstatus_addr; | 
 | 	void __iomem		*ctl_addr; | 
 | #ifndef __U_BOOT__ | 
 | 	void __iomem		*bmdma_addr; | 
 | #endif | 
 | 	void __iomem		*scr_addr; | 
 | }; | 
 |  | 
 | struct ata_host { | 
 | #ifndef __U_BOOT__ | 
 | 	void __iomem * const	*iomap; | 
 | 	void			*private_data; | 
 | 	const struct ata_port_operations *ops; | 
 | 	unsigned long		flags; | 
 | 	struct ata_port		*simplex_claimed; | 
 | #endif | 
 | 	unsigned int		n_ports; | 
 | 	struct ata_port		*ports[0]; | 
 | }; | 
 |  | 
 | #ifndef __U_BOOT__ | 
 | struct ata_port_stats { | 
 | 	unsigned long		unhandled_irq; | 
 | 	unsigned long		idle_irq; | 
 | 	unsigned long		rw_reqbuf; | 
 | }; | 
 | #endif | 
 |  | 
 | struct ata_device { | 
 | 	struct ata_link		*link; | 
 | 	unsigned int		devno; | 
 | 	unsigned long		flags; | 
 | 	unsigned int		horkage; | 
 | #ifndef __U_BOOT__ | 
 | 	struct scsi_device	*sdev; | 
 | #ifdef CONFIG_ATA_ACPI | 
 | 	acpi_handle		acpi_handle; | 
 | 	union acpi_object	*gtf_cache; | 
 | #endif | 
 | #endif | 
 | 	u64			n_sectors; | 
 | 	unsigned int		class; | 
 |  | 
 | 	union { | 
 | 		u16		id[ATA_ID_WORDS]; | 
 | 		u32		gscr[SATA_PMP_GSCR_DWORDS]; | 
 | 	}; | 
 | #ifndef __U_BOOT__ | 
 | 	u8			pio_mode; | 
 | 	u8			dma_mode; | 
 | 	u8			xfer_mode; | 
 | 	unsigned int		xfer_shift; | 
 | #endif | 
 | 	unsigned int		multi_count; | 
 | 	unsigned int		max_sectors; | 
 | 	unsigned int		cdb_len; | 
 | #ifndef __U_BOOT__ | 
 | 	unsigned long		pio_mask; | 
 | 	unsigned long		mwdma_mask; | 
 | #endif | 
 | 	unsigned long		udma_mask; | 
 | 	u16			cylinders; | 
 | 	u16			heads; | 
 | 	u16			sectors; | 
 | #ifndef __U_BOOT__ | 
 | 	int			spdn_cnt; | 
 | #endif | 
 | }; | 
 |  | 
 | enum dma_data_direction { | 
 | 	DMA_BIDIRECTIONAL = 0, | 
 | 	DMA_TO_DEVICE = 1, | 
 | 	DMA_FROM_DEVICE = 2, | 
 | 	DMA_NONE = 3, | 
 | }; | 
 |  | 
 | struct ata_link { | 
 | 	struct ata_port		*ap; | 
 | 	int			pmp; | 
 | 	unsigned int		active_tag; | 
 | 	u32			sactive; | 
 | 	unsigned int		flags; | 
 | 	unsigned int		hw_sata_spd_limit; | 
 | #ifndef __U_BOOT__ | 
 | 	unsigned int		sata_spd_limit; | 
 | 	unsigned int		sata_spd; | 
 | 	struct ata_device	device[2]; | 
 | #endif | 
 | }; | 
 |  | 
 | struct ata_port { | 
 | 	unsigned long		flags; | 
 | 	unsigned int		pflags; | 
 | 	unsigned int		print_id; | 
 | 	unsigned int		port_no; | 
 |  | 
 | 	struct ata_ioports	ioaddr; | 
 |  | 
 | 	u8			ctl; | 
 | 	u8			last_ctl; | 
 | 	unsigned int		pio_mask; | 
 | 	unsigned int		mwdma_mask; | 
 | 	unsigned int		udma_mask; | 
 | 	unsigned int		cbl; | 
 |  | 
 | 	struct ata_queued_cmd	qcmd[ATA_MAX_QUEUE]; | 
 | 	unsigned long		qc_allocated; | 
 | 	unsigned int		qc_active; | 
 | 	int			nr_active_links; | 
 |  | 
 | 	struct ata_link		link; | 
 | #ifndef __U_BOOT__ | 
 | 	int			nr_pmp_links; | 
 | 	struct ata_link		*pmp_link; | 
 | #endif | 
 | 	struct ata_link		*excl_link; | 
 | 	int			nr_pmp_links; | 
 | #ifndef __U_BOOT__ | 
 | 	struct ata_port_stats	stats; | 
 | 	struct device		*dev; | 
 | 	u32			msg_enable; | 
 | #endif | 
 | 	struct ata_host		*host; | 
 | 	void			*port_task_data; | 
 |  | 
 | 	unsigned int		hsm_task_state; | 
 | 	void			*private_data; | 
 | 	unsigned char		*pdata; | 
 | }; | 
 |  | 
 | #endif |