2 * Copyright (c) 2004-2005 MARVELL SEMICONDUCTOR ISRAEL, LTD.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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
26 * $FreeBSD: src/sys/dev/hptmv/mvSata.h,v 1.4 2009/04/07 16:38:25 delphij Exp $
31 #ifndef SUPPORT_MV_SATA_GEN_1
32 #define SUPPORT_MV_SATA_GEN_1 1
35 #ifndef SUPPORT_MV_SATA_GEN_2
36 #define SUPPORT_MV_SATA_GEN_2 0
39 #ifndef SUPPORT_MV_SATA_GEN_2E
40 #define SUPPORT_MV_SATA_GEN_2E 0
43 #if (SUPPORT_MV_SATA_GEN_1 + SUPPORT_MV_SATA_GEN_2 + SUPPORT_MV_SATA_GEN_2E) > 1
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)
49 #elif SUPPORT_MV_SATA_GEN_1==1
51 #define MV_SATA_GEN_1(x) 1
52 #define MV_SATA_GEN_2(x) 0
53 #define MV_SATA_GEN_2E(x) 0
55 #elif SUPPORT_MV_SATA_GEN_2==1
57 #define MV_SATA_GEN_1(x) 0
58 #define MV_SATA_GEN_2(x) 1
59 #define MV_SATA_GEN_2E(x) 0
61 #elif SUPPORT_MV_SATA_GEN_2E==1
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
68 #error "Which IC do you support?"
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
79 #if defined(RR2310) || defined(RR1740) || defined(RR2210) || defined (RR2522)
80 #define MV_SATA_CHANNELS_NUM 4
81 #define MV_SATA_UNITS_NUM 1
83 #define MV_SATA_CHANNELS_NUM 8
84 #define MV_SATA_UNITS_NUM 2
87 #define MV_SATA_PCI_BAR0_SPACE_SIZE (1<<18) /* 256 Kb*/
89 #define CHANNEL_QUEUE_LENGTH 32
90 #define CHANNEL_QUEUE_MASK 0x1F
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 */
98 #define MV_EDMA_REQUEST_ENTRY_SIZE 32
99 #define MV_EDMA_RESPONSE_ENTRY_SIZE 8
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 */
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 */
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
119 typedef enum mvUdmaType
121 MV_UDMA_TYPE_READ
, MV_UDMA_TYPE_WRITE
124 typedef enum mvFlushType
126 MV_FLUSH_TYPE_CALLBACK
, MV_FLUSH_TYPE_NONE
129 typedef enum mvCompletionType
131 MV_COMPLETION_TYPE_NORMAL
, MV_COMPLETION_TYPE_ERROR
,
132 MV_COMPLETION_TYPE_ABORT
133 } MV_COMPLETION_TYPE
;
135 typedef enum mvEventType
137 MV_EVENT_TYPE_ADAPTER_ERROR
, MV_EVENT_TYPE_SATA_CABLE
140 typedef enum mvEdmaMode
143 MV_EDMA_MODE_NOT_QUEUED
,
144 MV_EDMA_MODE_NATIVE_QUEUING
147 typedef enum mvEdmaQueueResult
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
;
156 typedef enum mvQueueCommandResult
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
;
165 typedef enum mvNonUdmaProtocol
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
;
173 struct mvDmaRequestQueueEntry
;
174 struct mvDmaResponseQueueEntry
;
175 struct mvDmaCommandEntry
;
177 struct mvSataAdapter
;
178 struct mvStorageDevRegisters
;
180 typedef MV_BOOLEAN (* HPTLIBAPI mvSataCommandCompletionCallBack_t
)(struct mvSataAdapter
*,
185 struct mvStorageDevRegisters SS_SEG
*);
187 typedef enum mvQueuedCommandType
189 MV_QUEUED_COMMAND_TYPE_UDMA
,
190 MV_QUEUED_COMMAND_TYPE_NONE_UDMA
191 } MV_QUEUED_COMMAND_TYPE
;
193 typedef struct mvUdmaCommandParams
195 MV_UDMA_TYPE readWrite
;
197 MV_U32 lowLBAAddress
;
198 MV_U16 highLBAAddress
;
202 mvSataCommandCompletionCallBack_t callBack
;
203 MV_VOID_PTR commandId
;
204 } MV_UDMA_COMMAND_PARAMS
;
206 typedef struct mvNoneUdmaCommandParams
208 MV_NON_UDMA_PROTOCOL protocolType
;
219 mvSataCommandCompletionCallBack_t callBack
;
220 MV_VOID_PTR commandId
;
221 } MV_NONE_UDMA_COMMAND_PARAMS
;
223 typedef struct mvQueueCommandInfo
225 MV_QUEUED_COMMAND_TYPE type
;
228 MV_UDMA_COMMAND_PARAMS udmaCommand
;
229 MV_NONE_UDMA_COMMAND_PARAMS NoneUdmaCommand
;
231 } MV_QUEUE_COMMAND_INFO
;
233 /* The following structure is for the Core Driver internal usage */
234 typedef struct mvQueuedCommandEntry
236 MV_BOOLEAN isFreeEntry
;
238 struct mvQueuedCommandEntry
*next
;
239 struct mvQueuedCommandEntry
*prev
;
240 MV_QUEUE_COMMAND_INFO commandInfo
;
241 } MV_QUEUED_COMMAND_ENTRY
;
243 /* The following structures are part of the Core Driver API */
244 typedef struct mvSataChannel
246 /* Fields set by Intermediate Application Layer */
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
];
278 typedef struct mvSataAdapter
280 /* Fields set by Intermediate Application Layer */
283 MV_U8 pciConfigRevisionId
;
284 MV_U16 pciConfigDeviceId
;
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
*,
292 MV_SATA_CHANNEL
*sataChannel
[MV_SATA_CHANNELS_NUM
];
295 MV_U32 pciInterruptMask
;
297 /* Fields set by CORE driver */
298 MV_OS_SEMAPHORE semaphore
;
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
;
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 */
318 typedef struct mvSataAdapterStatus
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
;
332 typedef struct mvSataChannelStatus
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
;
351 /* this structure used by the IAL defines the PRD entries used by the EDMA HW */
352 typedef struct mvSataEdmaPRDEntry
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
;
363 /* CORE driver Adapter Management */
364 MV_BOOLEAN HPTLIBAPI
mvSataInitAdapter(MV_SATA_ADAPTER
*pAdapter
);
366 MV_BOOLEAN HPTLIBAPI
mvSataShutdownAdapter(MV_SATA_ADAPTER
*pAdapter
);
368 MV_BOOLEAN HPTLIBAPI
mvSataGetAdapterStatus(MV_SATA_ADAPTER
*pAdapter
,
369 MV_SATA_ADAPTER_STATUS
*pAdapterStatus
);
371 MV_U32 HPTLIBAPI
mvSataReadReg(MV_SATA_ADAPTER
*pAdapter
, MV_U32 regOffset
);
373 MV_VOID HPTLIBAPI
mvSataWriteReg(MV_SATA_ADAPTER
*pAdapter
, MV_U32 regOffset
,
376 MV_VOID HPTLIBAPI
mvEnableAutoFlush(MV_VOID
);
377 MV_VOID HPTLIBAPI
mvDisableAutoFlush(MV_VOID
);
380 /* CORE driver SATA Channel Management */
381 MV_BOOLEAN HPTLIBAPI
mvSataConfigureChannel(MV_SATA_ADAPTER
*pAdapter
,
384 MV_BOOLEAN HPTLIBAPI
mvSataRemoveChannel(MV_SATA_ADAPTER
*pAdapter
, MV_U8 channelIndex
);
386 MV_BOOLEAN HPTLIBAPI
mvSataIsStorageDeviceConnected(MV_SATA_ADAPTER
*pAdapter
,
389 MV_BOOLEAN HPTLIBAPI
mvSataChannelHardReset(MV_SATA_ADAPTER
*pAdapter
,
392 MV_BOOLEAN HPTLIBAPI
mvSataConfigEdmaMode(MV_SATA_ADAPTER
*pAdapter
, MV_U8 channelIndex
,
393 MV_EDMA_MODE eDmaMode
, MV_U8 maxQueueDepth
);
395 MV_BOOLEAN HPTLIBAPI
mvSataEnableChannelDma(MV_SATA_ADAPTER
*pAdapter
,
398 MV_BOOLEAN HPTLIBAPI
mvSataDisableChannelDma(MV_SATA_ADAPTER
*pAdapter
,
401 MV_BOOLEAN HPTLIBAPI
mvSataFlushDmaQueue(MV_SATA_ADAPTER
*pAdapter
, MV_U8 channelIndex
,
402 MV_FLUSH_TYPE flushType
);
404 MV_U8 HPTLIBAPI
mvSataNumOfDmaCommands(MV_SATA_ADAPTER
*pAdapter
, MV_U8 channelIndex
);
406 MV_BOOLEAN HPTLIBAPI
mvSataSetIntCoalParams (MV_SATA_ADAPTER
*pAdapter
, MV_U8 sataUnit
,
407 MV_U32 intCoalThre
, MV_U32 intTimeThre
);
409 MV_BOOLEAN HPTLIBAPI
mvSataSetChannelPhyParams(MV_SATA_ADAPTER
*pAdapter
,
411 MV_U8 signalAmps
, MV_U8 pre
);
413 MV_BOOLEAN HPTLIBAPI
mvSataChannelPhyShutdown(MV_SATA_ADAPTER
*pAdapter
,
416 MV_BOOLEAN HPTLIBAPI
mvSataChannelPhyPowerOn(MV_SATA_ADAPTER
*pAdapter
,
419 MV_BOOLEAN HPTLIBAPI
mvSataChannelSetEdmaLoopBackMode(MV_SATA_ADAPTER
*pAdapter
,
421 MV_BOOLEAN loopBackOn
);
423 MV_BOOLEAN HPTLIBAPI
mvSataGetChannelStatus(MV_SATA_ADAPTER
*pAdapter
, MV_U8 channelIndex
,
424 MV_SATA_CHANNEL_STATUS
*pChannelStatus
);
426 MV_QUEUE_COMMAND_RESULT HPTLIBAPI
mvSataQueueCommand(MV_SATA_ADAPTER
*pAdapter
,
428 MV_QUEUE_COMMAND_INFO SS_SEG
*pCommandParams
);
430 /* Interrupt Service Routine */
431 MV_BOOLEAN HPTLIBAPI
mvSataInterruptServiceRoutine(MV_SATA_ADAPTER
*pAdapter
);
433 MV_BOOLEAN HPTLIBAPI
mvSataMaskAdapterInterrupt(MV_SATA_ADAPTER
*pAdapter
);
435 MV_BOOLEAN HPTLIBAPI
mvSataUnmaskAdapterInterrupt(MV_SATA_ADAPTER
*pAdapter
);
437 /* Command Completion and Event Notification (user implemented) */
438 MV_BOOLEAN HPTLIBAPI
mvSataEventNotify(MV_SATA_ADAPTER
*, MV_EVENT_TYPE
,
442 * Staggered spin-ip support and SATA interface speed control
443 * (relevant for 60x1 adapters)
445 MV_BOOLEAN HPTLIBAPI
mvSataEnableStaggeredSpinUpAll (MV_SATA_ADAPTER
*pAdapter
);
446 MV_BOOLEAN HPTLIBAPI
mvSataDisableStaggeredSpinUpAll (MV_SATA_ADAPTER
*pAdapter
);