mvSata.h revision 149871
1/*
2 * Copyright (c) 2004-2005 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 * $FreeBSD: head/sys/dev/hptmv/mvSata.h 149871 2005-09-07 23:33:26Z scottl $
27 */
28#ifndef __INCmvSatah
29#define __INCmvSatah
30
31#ifndef SUPPORT_MV_SATA_GEN_1
32#define SUPPORT_MV_SATA_GEN_1 1
33#endif
34
35#ifndef SUPPORT_MV_SATA_GEN_2
36#define SUPPORT_MV_SATA_GEN_2 0
37#endif
38
39#if SUPPORT_MV_SATA_GEN_1==1 && SUPPORT_MV_SATA_GEN_2==1
40#define MV_SATA_GEN_1(x) ((x)->sataAdapterGeneration==1)
41#define MV_SATA_GEN_2(x) ((x)->sataAdapterGeneration==2)
42#elif SUPPORT_MV_SATA_GEN_1==1
43#define MV_SATA_GEN_1(x) 1
44#define MV_SATA_GEN_2(x) 0
45#elif SUPPORT_MV_SATA_GEN_2==1
46#define MV_SATA_GEN_1(x) 0
47#define MV_SATA_GEN_2(x) 1
48#else
49#error "Which IC do you support?"
50#endif
51
52/* Definitions */
53/* MV88SX50XX specific defines */
54#define MV_SATA_VENDOR_ID		   				0x11AB
55#define MV_SATA_DEVICE_ID_5080			   		0x5080
56#define MV_SATA_DEVICE_ID_5081			   		0x5081
57#define MV_SATA_DEVICE_ID_6080			   		0x6080
58#define MV_SATA_DEVICE_ID_6081			   		0x6081
59#define MV_SATA_CHANNELS_NUM					8
60#define MV_SATA_UNITS_NUM						2
61#define MV_SATA_PCI_BAR0_SPACE_SIZE				(1<<18) /* 256 Kb*/
62
63#define CHANNEL_QUEUE_LENGTH					32
64#define CHANNEL_QUEUE_MASK					    0x1F
65
66#define MV_EDMA_QUEUE_LENGTH					32	/* Up to 32 outstanding	 */
67                        							/* commands per SATA channel*/
68#define MV_EDMA_QUEUE_MASK                      0x1F
69#define MV_EDMA_REQUEST_QUEUE_SIZE				1024 /* 32*32 = 1KBytes */
70#define MV_EDMA_RESPONSE_QUEUE_SIZE				256  /* 32*8 = 256 Bytes */
71
72#define MV_EDMA_REQUEST_ENTRY_SIZE				32
73#define MV_EDMA_RESPONSE_ENTRY_SIZE				8
74
75#define MV_EDMA_PRD_ENTRY_SIZE					16		/* 16Bytes*/
76#define MV_EDMA_PRD_NO_SNOOP_FLAG				0x00000001 /* MV_BIT0 */
77#define MV_EDMA_PRD_EOT_FLAG					0x00008000 /* MV_BIT15 */
78
79#define MV_ATA_IDENTIFY_DEV_DATA_LENGTH  		256	/* number of words(2 byte)*/
80#define MV_ATA_MODEL_NUMBER_LEN					40
81#define ATA_SECTOR_SIZE							512
82/* Log messages level defines */
83#define MV_DEBUG								0x1
84#define MV_DEBUG_INIT							0x2
85#define MV_DEBUG_INTERRUPTS						0x4
86#define MV_DEBUG_SATA_LINK						0x8
87#define MV_DEBUG_UDMA_COMMAND					0x10
88#define MV_DEBUG_NON_UDMA_COMMAND				0x20
89#define MV_DEBUG_ERROR							0x40
90
91
92/* Typedefs    */
93typedef enum mvUdmaType
94{
95	MV_UDMA_TYPE_READ, MV_UDMA_TYPE_WRITE
96} MV_UDMA_TYPE;
97
98typedef enum mvFlushType
99{
100	MV_FLUSH_TYPE_CALLBACK, MV_FLUSH_TYPE_NONE
101} MV_FLUSH_TYPE;
102
103typedef enum mvCompletionType
104{
105	MV_COMPLETION_TYPE_NORMAL, MV_COMPLETION_TYPE_ERROR,
106	MV_COMPLETION_TYPE_ABORT
107} MV_COMPLETION_TYPE;
108
109typedef enum mvEventType
110{
111	MV_EVENT_TYPE_ADAPTER_ERROR, MV_EVENT_TYPE_SATA_CABLE
112} MV_EVENT_TYPE;
113
114typedef enum mvEdmaMode
115{
116	MV_EDMA_MODE_QUEUED,
117	MV_EDMA_MODE_NOT_QUEUED,
118	MV_EDMA_MODE_NATIVE_QUEUING
119} MV_EDMA_MODE;
120
121typedef enum mvEdmaQueueResult
122{
123	MV_EDMA_QUEUE_RESULT_OK = 0,
124	MV_EDMA_QUEUE_RESULT_EDMA_DISABLED,
125	MV_EDMA_QUEUE_RESULT_FULL,
126	MV_EDMA_QUEUE_RESULT_BAD_LBA_ADDRESS,
127	MV_EDMA_QUEUE_RESULT_BAD_PARAMS
128} MV_EDMA_QUEUE_RESULT;
129
130typedef enum mvQueueCommandResult
131{
132	MV_QUEUE_COMMAND_RESULT_OK = 0,
133	MV_QUEUE_COMMAND_RESULT_QUEUED_MODE_DISABLED,
134	MV_QUEUE_COMMAND_RESULT_FULL,
135	MV_QUEUE_COMMAND_RESULT_BAD_LBA_ADDRESS,
136	MV_QUEUE_COMMAND_RESULT_BAD_PARAMS
137} MV_QUEUE_COMMAND_RESULT;
138
139typedef enum mvNonUdmaProtocol
140{
141    MV_NON_UDMA_PROTOCOL_NON_DATA,
142    MV_NON_UDMA_PROTOCOL_PIO_DATA_IN,
143    MV_NON_UDMA_PROTOCOL_PIO_DATA_OUT
144} MV_NON_UDMA_PROTOCOL;
145
146
147struct mvDmaRequestQueueEntry;
148struct mvDmaResponseQueueEntry;
149struct mvDmaCommandEntry;
150
151struct mvSataAdapter;
152struct mvStorageDevRegisters;
153
154typedef MV_BOOLEAN (* HPTLIBAPI mvSataCommandCompletionCallBack_t)(struct mvSataAdapter *,
155														 MV_U8,
156                                                         MV_COMPLETION_TYPE,
157														 MV_VOID_PTR, MV_U16,
158														 MV_U32,
159											    struct mvStorageDevRegisters FAR*);
160
161typedef enum mvQueuedCommandType
162{
163	MV_QUEUED_COMMAND_TYPE_UDMA,
164	MV_QUEUED_COMMAND_TYPE_NONE_UDMA
165} MV_QUEUED_COMMAND_TYPE;
166
167typedef struct mvUdmaCommandParams
168{
169	MV_UDMA_TYPE readWrite;
170	MV_BOOLEAN   isEXT;
171	MV_U32       lowLBAAddress;
172	MV_U16       highLBAAddress;
173	MV_U16       numOfSectors;
174	MV_U32       prdLowAddr;
175	MV_U32       prdHighAddr;
176	mvSataCommandCompletionCallBack_t callBack;
177	MV_VOID_PTR  commandId;
178} MV_UDMA_COMMAND_PARAMS;
179
180typedef struct mvNoneUdmaCommandParams
181{
182  	MV_NON_UDMA_PROTOCOL protocolType;
183	MV_BOOLEAN  isEXT;
184	MV_U16_PTR	bufPtr;
185	MV_U32		count;
186	MV_U16		features;
187	MV_U16		sectorCount;
188	MV_U16		lbaLow;
189	MV_U16		lbaMid;
190	MV_U16		lbaHigh;
191	MV_U8		device;
192	MV_U8		command;
193    mvSataCommandCompletionCallBack_t callBack;
194	MV_VOID_PTR  commandId;
195} MV_NONE_UDMA_COMMAND_PARAMS;
196
197typedef struct mvQueueCommandInfo
198{
199	MV_QUEUED_COMMAND_TYPE	type;
200	union
201	{
202		MV_UDMA_COMMAND_PARAMS		udmaCommand;
203		MV_NONE_UDMA_COMMAND_PARAMS	NoneUdmaCommand;
204    } commandParams;
205} MV_QUEUE_COMMAND_INFO;
206
207/* The following structure is for the Core Driver internal usage */
208typedef struct mvQueuedCommandEntry
209{
210    MV_BOOLEAN   isFreeEntry;
211    MV_U8        commandTag;
212	struct mvQueuedCommandEntry	*next;
213	struct mvQueuedCommandEntry	*prev;
214	MV_QUEUE_COMMAND_INFO	commandInfo;
215} MV_QUEUED_COMMAND_ENTRY;
216
217/* The following structures are part of the Core Driver API */
218typedef struct mvSataChannel
219{
220	/* Fields set by Intermediate Application Layer */
221	MV_U8                       channelNumber;
222	MV_BOOLEAN                  waitingForInterrupt;
223	MV_BOOLEAN                  lba48Address;
224	MV_BOOLEAN                  maxReadTransfer;
225	struct mvDmaRequestQueueEntry FAR *requestQueue;
226	struct mvDmaResponseQueueEntry FAR *responseQueue;
227	MV_U32                      requestQueuePciHiAddress;
228	MV_U32                      requestQueuePciLowAddress;
229	MV_U32                      responseQueuePciHiAddress;
230	MV_U32                      responseQueuePciLowAddress;
231	/* Fields set by CORE driver */
232	struct mvSataAdapter        *mvSataAdapter;
233	MV_OS_SEMAPHORE             semaphore;
234	MV_U32                      eDmaRegsOffset;
235	MV_U16                      identifyDevice[MV_ATA_IDENTIFY_DEV_DATA_LENGTH];
236	MV_BOOLEAN                  EdmaActive;
237	MV_EDMA_MODE                queuedDMA;
238	MV_U8                       outstandingCommands;
239	MV_BOOLEAN					workAroundDone;
240	struct mvQueuedCommandEntry	commandsQueue[CHANNEL_QUEUE_LENGTH];
241	struct mvQueuedCommandEntry	*commandsQueueHead;
242	struct mvQueuedCommandEntry	*commandsQueueTail;
243	MV_BOOLEAN					queueCommandsEnabled;
244	MV_U8                       noneUdmaOutstandingCommands;
245	MV_U8                       EdmaQueuedCommands;
246    MV_U32                      freeIDsStack[MV_EDMA_QUEUE_LENGTH];
247	MV_U32                      freeIDsNum;
248	MV_U32                      reqInPtr;
249	MV_U32                      rspOutPtr;
250} MV_SATA_CHANNEL;
251
252typedef struct mvSataAdapter
253{
254	/* Fields set by Intermediate Application Layer */
255	MV_U32            adapterId;
256	MV_U8             pcbVersion;
257    MV_U8             pciConfigRevisionId;
258    MV_U16            pciConfigDeviceId;
259	MV_VOID_PTR		  IALData;
260	MV_BUS_ADDR_T     adapterIoBaseAddress;
261	MV_U32            intCoalThre[MV_SATA_UNITS_NUM];
262	MV_U32            intTimeThre[MV_SATA_UNITS_NUM];
263	MV_BOOLEAN        (* HPTLIBAPI mvSataEventNotify)(struct mvSataAdapter *,
264										   MV_EVENT_TYPE,
265										   MV_U32, MV_U32);
266	MV_SATA_CHANNEL   *sataChannel[MV_SATA_CHANNELS_NUM];
267	MV_U32            pciCommand;
268	MV_U32            pciSerrMask;
269	MV_U32            pciInterruptMask;
270
271	/* Fields set by CORE driver */
272	MV_OS_SEMAPHORE   semaphore;
273	MV_U32			  mainMask;
274	MV_OS_SEMAPHORE	  interruptsMaskSem;
275    MV_BOOLEAN        implementA0Workarounds;
276    MV_BOOLEAN        implement50XXB0Workarounds;
277	MV_BOOLEAN        implement50XXB1Workarounds;
278	MV_BOOLEAN        implement50XXB2Workarounds;
279	MV_BOOLEAN        implement60X1A0Workarounds;
280	MV_BOOLEAN        implement60X1A1Workarounds;
281	MV_BOOLEAN        implement60X1B0Workarounds;
282	MV_U8			  sataAdapterGeneration;
283	MV_U8             failLEDMask;
284    MV_U8			  signalAmps[MV_SATA_CHANNELS_NUM];
285	MV_U8			  pre[MV_SATA_CHANNELS_NUM];
286    MV_BOOLEAN        staggaredSpinup[MV_SATA_CHANNELS_NUM]; /* For 60x1 only */
287} MV_SATA_ADAPTER;
288
289typedef struct mvSataAdapterStatus
290{
291	/* Fields set by CORE driver */
292	MV_BOOLEAN		channelConnected[MV_SATA_CHANNELS_NUM];
293	MV_U32			pciDLLStatusAndControlRegister;
294	MV_U32			pciCommandRegister;
295	MV_U32			pciModeRegister;
296	MV_U32			pciSERRMaskRegister;
297	MV_U32			intCoalThre[MV_SATA_UNITS_NUM];
298	MV_U32			intTimeThre[MV_SATA_UNITS_NUM];
299	MV_U32			R00StatusBridgePortRegister[MV_SATA_CHANNELS_NUM];
300}MV_SATA_ADAPTER_STATUS;
301
302
303typedef struct mvSataChannelStatus
304{
305	/* Fields set by CORE driver */
306	MV_BOOLEAN		isConnected;
307	MV_U8			modelNumber[MV_ATA_MODEL_NUMBER_LEN];
308	MV_BOOLEAN		DMAEnabled;
309	MV_EDMA_MODE	queuedDMA;
310	MV_U8			outstandingCommands;
311	MV_U32			EdmaConfigurationRegister;
312	MV_U32			EdmaRequestQueueBaseAddressHighRegister;
313	MV_U32			EdmaRequestQueueInPointerRegister;
314	MV_U32			EdmaRequestQueueOutPointerRegister;
315	MV_U32			EdmaResponseQueueBaseAddressHighRegister;
316	MV_U32			EdmaResponseQueueInPointerRegister;
317	MV_U32			EdmaResponseQueueOutPointerRegister;
318	MV_U32			EdmaCommandRegister;
319	MV_U32			PHYModeRegister;
320}MV_SATA_CHANNEL_STATUS;
321
322/* this structure used by the IAL defines the PRD entries used by the EDMA HW */
323typedef struct mvSataEdmaPRDEntry
324{
325	volatile MV_U32	lowBaseAddr;
326	volatile MV_U16	byteCount;
327	volatile MV_U16	flags;
328	volatile MV_U32 highBaseAddr;
329	volatile MV_U32 reserved;
330}MV_SATA_EDMA_PRD_ENTRY;
331
332/* API Functions */
333
334/* CORE driver Adapter Management */
335MV_BOOLEAN HPTLIBAPI mvSataInitAdapter(MV_SATA_ADAPTER *pAdapter);
336
337MV_BOOLEAN HPTLIBAPI mvSataShutdownAdapter(MV_SATA_ADAPTER *pAdapter);
338
339MV_BOOLEAN HPTLIBAPI mvSataGetAdapterStatus(MV_SATA_ADAPTER *pAdapter,
340								  MV_SATA_ADAPTER_STATUS *pAdapterStatus);
341
342MV_U32  HPTLIBAPI mvSataReadReg(MV_SATA_ADAPTER *pAdapter, MV_U32 regOffset);
343
344MV_VOID HPTLIBAPI mvSataWriteReg(MV_SATA_ADAPTER *pAdapter, MV_U32 regOffset,
345					   MV_U32 regValue);
346
347MV_VOID HPTLIBAPI mvEnableAutoFlush(MV_VOID);
348MV_VOID HPTLIBAPI mvDisableAutoFlush(MV_VOID);
349
350
351/* CORE driver SATA Channel Management */
352MV_BOOLEAN HPTLIBAPI mvSataConfigureChannel(MV_SATA_ADAPTER *pAdapter,
353								  MV_U8 channelIndex);
354
355MV_BOOLEAN HPTLIBAPI mvSataRemoveChannel(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
356
357MV_BOOLEAN HPTLIBAPI mvSataIsStorageDeviceConnected(MV_SATA_ADAPTER *pAdapter,
358										  MV_U8 channelIndex);
359
360MV_BOOLEAN HPTLIBAPI mvSataChannelHardReset(MV_SATA_ADAPTER *pAdapter,
361								  MV_U8 channelIndex);
362
363MV_BOOLEAN HPTLIBAPI mvSataConfigEdmaMode(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex,
364								MV_EDMA_MODE eDmaMode, MV_U8 maxQueueDepth);
365
366MV_BOOLEAN HPTLIBAPI mvSataEnableChannelDma(MV_SATA_ADAPTER *pAdapter,
367								  MV_U8 channelIndex);
368
369MV_BOOLEAN HPTLIBAPI mvSataDisableChannelDma(MV_SATA_ADAPTER *pAdapter,
370								   MV_U8 channelIndex);
371
372MV_BOOLEAN HPTLIBAPI mvSataFlushDmaQueue(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex,
373							   MV_FLUSH_TYPE flushType);
374
375MV_U8 HPTLIBAPI mvSataNumOfDmaCommands(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
376
377MV_BOOLEAN HPTLIBAPI mvSataSetIntCoalParams (MV_SATA_ADAPTER *pAdapter, MV_U8 sataUnit,
378								   MV_U32 intCoalThre, MV_U32 intTimeThre);
379
380MV_BOOLEAN HPTLIBAPI mvSataSetChannelPhyParams(MV_SATA_ADAPTER *pAdapter,
381									 MV_U8 channelIndex,
382									 MV_U8 signalAmps, MV_U8 pre);
383
384MV_BOOLEAN HPTLIBAPI mvSataChannelPhyShutdown(MV_SATA_ADAPTER *pAdapter,
385									MV_U8 channelIndex);
386
387MV_BOOLEAN HPTLIBAPI mvSataChannelPhyPowerOn(MV_SATA_ADAPTER *pAdapter,
388									MV_U8 channelIndex);
389
390MV_BOOLEAN HPTLIBAPI mvSataChannelSetEdmaLoopBackMode(MV_SATA_ADAPTER *pAdapter,
391											MV_U8 channelIndex,
392											MV_BOOLEAN loopBackOn);
393
394MV_BOOLEAN HPTLIBAPI mvSataGetChannelStatus(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex,
395								  MV_SATA_CHANNEL_STATUS *pChannelStatus);
396
397/* Execute UDMA ATA commands */
398MV_EDMA_QUEUE_RESULT HPTLIBAPI mvSataQueueUDmaCommand(MV_SATA_ADAPTER *pAdapter,
399											MV_U8 channelIndex,
400											MV_UDMA_TYPE readWrite,
401											MV_U32 lowLBAAddr,
402											MV_U16 highLBAAddr,
403											MV_U16 sectorCount,
404											MV_U32 prdLowAddr,
405											MV_U32 prdHighAddr,
406									mvSataCommandCompletionCallBack_t callBack,
407											MV_VOID_PTR commandId);
408
409MV_QUEUE_COMMAND_RESULT HPTLIBAPI mvSataQueueCommand(MV_SATA_ADAPTER *pAdapter,
410										   MV_U8 channelIndex,
411										   MV_QUEUE_COMMAND_INFO FAR *pCommandParams);
412
413/* Interrupt Service Routine */
414MV_BOOLEAN HPTLIBAPI mvSataInterruptServiceRoutine(MV_SATA_ADAPTER *pAdapter);
415
416MV_BOOLEAN HPTLIBAPI mvSataMaskAdapterInterrupt(MV_SATA_ADAPTER *pAdapter);
417
418MV_BOOLEAN HPTLIBAPI mvSataUnmaskAdapterInterrupt(MV_SATA_ADAPTER *pAdapter);
419
420/* Command Completion and Event Notification (user implemented) */
421MV_BOOLEAN HPTLIBAPI mvSataEventNotify(MV_SATA_ADAPTER *, MV_EVENT_TYPE ,
422							 MV_U32, MV_U32);
423
424/*
425 * Staggered spin-ip support and SATA interface speed control
426 * (relevant for 60x1 adapters)
427 */
428MV_BOOLEAN HPTLIBAPI mvSataEnableStaggeredSpinUpAll (MV_SATA_ADAPTER *pAdapter);
429MV_BOOLEAN HPTLIBAPI mvSataDisableStaggeredSpinUpAll (MV_SATA_ADAPTER *pAdapter);
430
431#endif
432