xref: /freebsd/sys/dev/hptmv/mvStorageDev.h (revision 6af83ee0d2941d18880b6aaa2b4facd1d30c6106)
1 /*
2  * Copyright (c) 2003-2004 MARVELL SEMICONDUCTOR ISRAEL, LTD.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 #ifndef __INCmvStorageDevh
27 #define __INCmvStorageDevh
28 
29 /* Definitions */
30 
31 /* ATA register on the ATA drive*/
32 
33 #define MV_EDMA_ATA_FEATURES_ADDR				0x11
34 #define MV_EDMA_ATA_SECTOR_COUNT_ADDR			0x12
35 #define MV_EDMA_ATA_LBA_LOW_ADDR				0x13
36 #define MV_EDMA_ATA_LBA_MID_ADDR				0x14
37 #define MV_EDMA_ATA_LBA_HIGH_ADDR				0x15
38 #define MV_EDMA_ATA_DEVICE_ADDR					0x16
39 #define MV_EDMA_ATA_COMMAND_ADDR				0x17
40 
41 #define MV_ATA_ERROR_STATUS						0x00000001 /* MV_BIT0 */
42 #define MV_ATA_DATA_REQUEST_STATUS				0x00000008 /* MV_BIT3 */
43 #define MV_ATA_SERVICE_STATUS					0x00000010 /* MV_BIT4 */
44 #define MV_ATA_DEVICE_FAULT_STATUS				0x00000020 /* MV_BIT5 */
45 #define MV_ATA_READY_STATUS						0x00000040 /* MV_BIT6 */
46 #define MV_ATA_BUSY_STATUS						0x00000080 /* MV_BIT7 */
47 
48 
49 #define MV_ATA_COMMAND_READ_SECTORS				0x20
50 #define MV_ATA_COMMAND_READ_SECTORS_EXT         0x24
51 #define MV_ATA_COMMAND_READ_VERIFY_SECTORS		0x40
52 #define MV_ATA_COMMAND_READ_VERIFY_SECTORS_EXT	0x42
53 #define MV_ATA_COMMAND_READ_BUFFER				0xE4
54 #define MV_ATA_COMMAND_WRITE_BUFFER             0xE8
55 #define MV_ATA_COMMAND_WRITE_SECTORS			0x30
56 #define MV_ATA_COMMAND_WRITE_SECTORS_EXT        0x34
57 #define MV_ATA_COMMAND_DIAGNOSTIC				0x90
58 #define MV_ATA_COMMAND_SMART                    0xb0
59 #define MV_ATA_COMMAND_READ_MULTIPLE            0xc4
60 #define MV_ATA_COMMAND_WRITE_MULTIPLE           0xc5
61 #define MV_ATA_COMMAND_STANDBY_IMMEDIATE		0xe0
62 #define MV_ATA_COMMAND_IDLE_IMMEDIATE			0xe1
63 #define MV_ATA_COMMAND_STANDBY					0xe2
64 #define MV_ATA_COMMAND_IDLE						0xe3
65 #define MV_ATA_COMMAND_SLEEP					0xe6
66 #define MV_ATA_COMMAND_IDENTIFY					0xec
67 #define MV_ATA_COMMAND_DEVICE_CONFIG            0xb1
68 #define MV_ATA_COMMAND_SET_FEATURES				0xef
69 #define MV_ATA_COMMAND_WRITE_DMA				0xca
70 #define MV_ATA_COMMAND_WRITE_DMA_EXT			0x35
71 #define MV_ATA_COMMAND_WRITE_DMA_QUEUED			0xcc
72 #define MV_ATA_COMMAND_WRITE_DMA_QUEUED_EXT		0x36
73 #define MV_ATA_COMMAND_WRITE_FPDMA_QUEUED_EXT   0x61
74 #define MV_ATA_COMMAND_READ_DMA					0xc8
75 #define MV_ATA_COMMAND_READ_DMA_EXT				0x25
76 #define MV_ATA_COMMAND_READ_DMA_QUEUED			0xc7
77 #define MV_ATA_COMMAND_READ_DMA_QUEUED_EXT		0x26
78 #define MV_ATA_COMMAND_READ_FPDMA_QUEUED_EXT    0x60
79 #define MV_ATA_COMMAND_FLUSH_CACHE              0xe7
80 #define MV_ATA_COMMAND_FLUSH_CACHE_EXT          0xea
81 
82 
83 #define MV_ATA_SET_FEATURES_DISABLE_8_BIT_PIO	0x01
84 #define MV_ATA_SET_FEATURES_ENABLE_WCACHE		0x02  /* Enable write cache */
85 #define MV_ATA_SET_FEATURES_TRANSFER        	0x03  /* Set transfer mode	*/
86 #define MV_ATA_TRANSFER_UDMA_0     		        0x40
87 #define MV_ATA_TRANSFER_UDMA_1     		        0x41
88 #define MV_ATA_TRANSFER_UDMA_2     		        0x42
89 #define MV_ATA_TRANSFER_UDMA_3     		        0x43
90 #define MV_ATA_TRANSFER_UDMA_4     		        0x44
91 #define MV_ATA_TRANSFER_UDMA_5     		        0x45
92 #define MV_ATA_TRANSFER_UDMA_6     		        0x46
93 #define MV_ATA_TRANSFER_UDMA_7     		        0x47
94 #define MV_ATA_TRANSFER_PIO_SLOW           		0x00
95 #define MV_ATA_TRANSFER_PIO_0              		0x08
96 #define MV_ATA_TRANSFER_PIO_1              		0x09
97 #define MV_ATA_TRANSFER_PIO_2              		0x0A
98 #define MV_ATA_TRANSFER_PIO_3              		0x0B
99 #define MV_ATA_TRANSFER_PIO_4              		0x0C
100 /* Enable advanced power management */
101 #define MV_ATA_SET_FEATURES_ENABLE_APM			0x05
102 /* Disable media status notification*/
103 #define MV_ATA_SET_FEATURES_DISABLE_MSN			0x31
104 /* Disable read look-ahead		    */
105 #define MV_ATA_SET_FEATURES_DISABLE_RLA			0x55
106 /* Enable release interrupt		    */
107 #define MV_ATA_SET_FEATURES_ENABLE_RI			0x5D
108 /* Enable SERVICE interrupt		    */
109 #define MV_ATA_SET_FEATURES_ENABLE_SI			0x5E
110 /* Disable revert power-on defaults */
111 #define MV_ATA_SET_FEATURES_DISABLE_RPOD		0x66
112 /* Disable write cache			    */
113 #define MV_ATA_SET_FEATURES_DISABLE_WCACHE		0x82
114 /* Disable advanced power management*/
115 #define MV_ATA_SET_FEATURES_DISABLE_APM			0x85
116 /* Enable media status notification */
117 #define MV_ATA_SET_FEATURES_ENABLE_MSN			0x95
118 /* Enable read look-ahead		    */
119 #define MV_ATA_SET_FEATURES_ENABLE_RLA			0xAA
120 /* Enable revert power-on defaults  */
121 #define MV_ATA_SET_FEATURES_ENABLE_RPOD			0xCC
122 /* Disable release interrupt	    */
123 #define MV_ATA_SET_FEATURES_DISABLE_RI			0xDD
124 /* Disable SERVICE interrupt	    */
125 #define MV_ATA_SET_FEATURES_DISABLE_SI			0xDE
126 
127 /* Defines for parsing the IDENTIFY command results*/
128 #define IDEN_SERIAL_NUM_OFFSET 					10
129 #define IDEN_SERIAL_NUM_SIZE   					19-10
130 #define IDEN_FIRMWARE_OFFSET 					23
131 #define IDEN_FIRMWARE_SIZE  					26-23
132 #define IDEN_MODEL_OFFSET   					27
133 #define IDEN_MODEL_SIZE     					46-27
134 #define IDEN_CAPACITY_1_OFFSET  				49
135 #define IDEN_VALID								53
136 #define IDEN_NUM_OF_ADDRESSABLE_SECTORS			60
137 #define	IDEN_PIO_MODE_SPPORTED					64
138 #define IDEN_QUEUE_DEPTH						75
139 #define IDEN_SATA_CAPABILITIES                  76
140 #define IDEN_SATA_FEATURES_SUPPORTED            78
141 #define IDEN_SATA_FEATURES_ENABLED              79
142 #define IDEN_ATA_VERSION						80
143 #define IDEN_SUPPORTED_COMMANDS1				82
144 #define IDEN_SUPPORTED_COMMANDS2				83
145 #define IDEN_ENABLED_COMMANDS1					85
146 #define IDEN_ENABLED_COMMANDS2					86
147 #define IDEN_UDMA_MODE							88
148 #define IDEN_SATA_CAPABILITY					76
149 
150 
151 /* Typedefs    */
152 
153 /* Structures  */
154 typedef struct mvStorageDevRegisters
155 {
156     /* Fields set by CORE driver */
157     MV_U8    errorRegister;
158     MV_U16   sectorCountRegister;
159     MV_U16   lbaLowRegister;
160     MV_U16   lbaMidRegister;
161     MV_U16   lbaHighRegister;
162     MV_U8    deviceRegister;
163     MV_U8    statusRegister;
164 } MV_STORAGE_DEVICE_REGISTERS;
165 
166 /* Bits for HD_ERROR */
167 #define NM_ERR			0x02	/* media present */
168 #define ABRT_ERR		0x04	/* Command aborted */
169 #define MCR_ERR         0x08	/* media change request */
170 #define IDNF_ERR        0x10	/* ID field not found */
171 #define MC_ERR          0x20	/* media changed */
172 #define UNC_ERR         0x40	/* Uncorrect data */
173 #define WP_ERR          0x40	/* write protect */
174 #define ICRC_ERR        0x80	/* new meaning:  CRC error during transfer */
175 
176 /* Function */
177 
178 MV_BOOLEAN HPTLIBAPI mvStorageDevATAExecuteNonUDMACommand(MV_SATA_ADAPTER *pAdapter,
179 												MV_U8 channelIndex,
180 											MV_NON_UDMA_PROTOCOL protocolType,
181 												MV_BOOLEAN  isEXT,
182 												MV_U16 FAR *bufPtr, MV_U32 count,
183 												MV_U16 features,
184 												MV_U16 sectorCount,
185 												MV_U16 lbaLow, MV_U16 lbaMid,
186 												MV_U16 lbaHigh, MV_U8 device,
187 												MV_U8 command);
188 
189 MV_BOOLEAN HPTLIBAPI mvStorageDevATAIdentifyDevice(MV_SATA_ADAPTER *pAdapter,
190 										 MV_U8 channelIndex);
191 
192 MV_BOOLEAN HPTLIBAPI mvStorageDevATASetFeatures(MV_SATA_ADAPTER *pAdapter,
193 									  MV_U8 channelIndex, MV_U8 subCommand,
194 									  MV_U8 subCommandSpecific1,
195 									  MV_U8 subCommandSpecific2,
196 									  MV_U8 subCommandSpecific3,
197 									  MV_U8 subCommandSpecific4);
198 
199 MV_BOOLEAN HPTLIBAPI mvStorageDevATAIdleImmediate(MV_SATA_ADAPTER *pAdapter,
200 										MV_U8 channelIndex);
201 
202 MV_BOOLEAN HPTLIBAPI mvStorageDevATAFlushWriteCache(MV_SATA_ADAPTER *pAdapter,
203 										  MV_U8 channelIndex);
204 
205 MV_BOOLEAN HPTLIBAPI mvStorageDevATASoftResetDevice(MV_SATA_ADAPTER *pAdapter,
206 										  MV_U8 channelIndex);
207 
208 MV_BOOLEAN HPTLIBAPI mvReadWrite(MV_SATA_CHANNEL *pSataChannel, LBA_T Lba, UCHAR Cmd, void *tmpBuffer);
209 
210 #endif
211