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