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