2 Copyright (c) 2006, Intel Corporation
3 All rights reserved. This program and the accompanying materials
4 are licensed and made available under the terms and conditions of the BSD License
5 which accompanies this distribution. The full text of the license may be found at
6 http://opensource.org/licenses/bsd-license.php
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 Module Name: AtapiPassThru.h
20 // The package level header files this module uses
24 // The protocols, PPI and GUID defintions for this module
26 #include <Protocol/ScsiPassThru.h>
27 #include <Protocol/PciIo.h>
29 // The Library classes this module consumes
31 #include <Library/DebugLib.h>
32 #include <Library/UefiDriverEntryPoint.h>
33 #include <Library/BaseLib.h>
34 #include <Library/UefiLib.h>
35 #include <Library/BaseMemoryLib.h>
36 #include <Library/MemoryAllocationLib.h>
37 #include <Library/UefiBootServicesTableLib.h>
38 #include <IndustryStandard/pci22.h>
43 #define bit(a) (1 << (a))
45 #define MAX_TARGET_ID 4
51 UINT16 Command
; /* when write */
52 UINT16 Status
; /* when read */
56 UINT16 Error
; /* when read */
57 UINT16 Feature
; /* when write */
58 } IDE_ERROR_OR_FEATURE
;
61 UINT16 AltStatus
; /* when read */
62 UINT16 DeviceControl
; /* when write */
63 } IDE_AltStatus_OR_DeviceControl
;
70 IDE_ERROR_OR_FEATURE Reg1
;
76 IDE_CMD_OR_STATUS Reg
;
78 IDE_AltStatus_OR_DeviceControl Alt
;
84 #define ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE EFI_SIGNATURE_32 ('a', 's', 'p', 't')
90 EFI_SCSI_PASS_THRU_PROTOCOL ScsiPassThru
;
91 EFI_SCSI_PASS_THRU_MODE ScsiPassThruMode
;
92 EFI_PCI_IO_PROTOCOL
*PciIo
;
95 // Local Data goes here
97 IDE_BASE_REGISTERS
*IoPort
;
99 CHAR16 ControllerName
[100];
100 CHAR16 ChannelName
[100];
102 UINT32 LatestTargetId
;
105 } ATAPI_SCSI_PASS_THRU_DEV
;
107 #define ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS(a) \
109 ATAPI_SCSI_PASS_THRU_DEV, \
111 ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE \
117 extern EFI_DRIVER_BINDING_PROTOCOL gAtapiScsiPassThruDriverBinding
;
118 extern EFI_COMPONENT_NAME_PROTOCOL gAtapiScsiPassThruComponentName
;
121 // ATAPI Command op code
123 #define OP_INQUIRY 0x12
124 #define OP_LOAD_UNLOAD_CD 0xa6
125 #define OP_MECHANISM_STATUS 0xbd
126 #define OP_MODE_SELECT_10 0x55
127 #define OP_MODE_SENSE_10 0x5a
128 #define OP_PAUSE_RESUME 0x4b
129 #define OP_PLAY_AUDIO_10 0x45
130 #define OP_PLAY_AUDIO_MSF 0x47
131 #define OP_PLAY_CD 0xbc
132 #define OP_PLAY_CD_MSF 0xb4
133 #define OP_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
134 #define OP_READ_10 0x28
135 #define OP_READ_12 0xa8
136 #define OP_READ_CAPACITY 0x25
137 #define OP_READ_CD 0xbe
138 #define OP_READ_CD_MSF 0xb9
139 #define OP_READ_HEADER 0x44
140 #define OP_READ_SUB_CHANNEL 0x42
141 #define OP_READ_TOC 0x43
142 #define OP_REQUEST_SENSE 0x03
144 #define OP_SEEK_10 0x2b
145 #define OP_SET_CD_SPEED 0xbb
146 #define OP_STOPPLAY_SCAN 0x4e
147 #define OP_START_STOP_UNIT 0x1b
148 #define OP_TEST_UNIT_READY 0x00
150 #define OP_FORMAT_UNIT 0x04
151 #define OP_READ_FORMAT_CAPACITIES 0x23
152 #define OP_VERIFY 0x2f
153 #define OP_WRITE_10 0x2a
154 #define OP_WRITE_12 0xaa
155 #define OP_WRITE_AND_VERIFY 0x2e
160 #define ATAPI_SOFT_RESET_CMD 0x08
171 DATA_DIRECTION Direction
;
174 #define MAX_CHANNEL 2
176 #define ValidCdbLength(Len) ((Len) == 6 || (Len) == 10 || (Len) == 12) ? 1 : 0
179 // IDE registers bit definitions
181 // ATA Err Reg bitmap
183 #define BBK_ERR bit (7) ///< Bad block detected
184 #define UNC_ERR bit (6) ///< Uncorrectable Data
185 #define MC_ERR bit (5) ///< Media Change
186 #define IDNF_ERR bit (4) ///< ID Not Found
187 #define MCR_ERR bit (3) ///< Media Change Requested
188 #define ABRT_ERR bit (2) ///< Aborted Command
189 #define TK0NF_ERR bit (1) ///< Track 0 Not Found
190 #define AMNF_ERR bit (0) ///< Address Mark Not Found
193 // ATAPI Err Reg bitmap
195 #define SENSE_KEY_ERR (bit (7) | bit (6) | bit (5) | bit (4))
196 #define EOM_ERR bit (1) ///< End of Media Detected
197 #define ILI_ERR bit (0) ///< Illegal Length Indication
202 #define LBA_MODE bit (6)
217 #define BSY bit (7) ///< Controller Busy
218 #define DRDY bit (6) ///< Drive Ready
219 #define DWF bit (5) ///< Drive Write Fault
220 #define DSC bit (4) ///< Disk Seek Complete
221 #define DRQ bit (3) ///< Data Request
222 #define CORR bit (2) ///< Corrected Data
223 #define IDX bit (1) ///< Index
224 #define ERR bit (0) ///< Error
225 #define CHECK bit (0) ///< Check bit for ATAPI Status Reg
228 // Device Control Reg
230 #define SRST bit (2) ///< Software Reset
231 #define IEN_L bit (1) ///< Interrupt Enable
234 // ATAPI Feature Register
236 #define OVERLAP bit (1)
240 // ATAPI Interrupt Reason Reson Reg (ATA Sector Count Register)
242 #define RELEASE bit (2)
246 #define PACKET_CMD 0xA0
248 #define DEFAULT_CMD (0xa0)
250 // default content of device control register, disable INT
252 #define DEFAULT_CTL (0x0a)
253 #define MAX_ATAPI_BYTE_COUNT (0xfffe)
256 // function prototype
261 AtapiScsiPassThruDriverBindingSupported (
262 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
263 IN EFI_HANDLE Controller
,
264 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
269 AtapiScsiPassThruDriverBindingStart (
270 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
271 IN EFI_HANDLE Controller
,
272 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
277 AtapiScsiPassThruDriverBindingStop (
278 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
279 IN EFI_HANDLE Controller
,
280 IN UINTN NumberOfChildren
,
281 IN EFI_HANDLE
*ChildHandleBuffer
285 // EFI Component Name Functions
289 AtapiScsiPassThruComponentNameGetDriverName (
290 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
292 OUT CHAR16
**DriverName
297 AtapiScsiPassThruComponentNameGetControllerName (
298 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
299 IN EFI_HANDLE ControllerHandle
,
300 IN EFI_HANDLE ChildHandle OPTIONAL
,
302 OUT CHAR16
**ControllerName
306 AtapiScsiPassThruDriverEntryPoint
311 @todo Add function description
312 @todo ImageHandle - add argument description
313 @todo SystemTable - add argument description
314 @todo add return values
318 AtapiScsiPassThruDriverEntryPoint (
319 IN EFI_HANDLE ImageHandle
,
320 IN EFI_SYSTEM_TABLE
*SystemTable
325 RegisterAtapiScsiPassThru
331 @todo Add function description
332 @todo This add argument description
333 @todo Controller add argument description
334 @todo PciIo add argument description
335 @todo add return values
338 RegisterAtapiScsiPassThru (
339 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
340 IN EFI_HANDLE Controller
,
341 IN EFI_PCI_IO_PROTOCOL
*PciIo
346 AtapiScsiPassThruFunction
354 @todo Add function description
355 @todo This - add argument description
356 @todo Target - add argument description
357 @todo Lun - add argument description
358 @todo Packet - add argument description
359 @todo Event - add argument description
360 @todo add return values
364 AtapiScsiPassThruFunction (
365 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
368 IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
,
369 IN EFI_EVENT Event OPTIONAL
374 AtapiScsiPassThruGetNextDevice
376 TODO: Add function description
378 @param This TODO: add argument description
379 @param Target TODO: add argument description
380 @param Lun TODO: add argument description
382 TODO: add return values
387 AtapiScsiPassThruGetNextDevice (
388 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
389 IN OUT UINT32
*Target
,
395 AtapiScsiPassThruBuildDevicePath
397 TODO: Add function description
399 @param This TODO: add argument description
400 @param Target TODO: add argument description
401 @param Lun TODO: add argument description
402 @param DevicePath TODO: add argument description
404 TODO: add return values
409 AtapiScsiPassThruBuildDevicePath (
410 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
413 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevicePath
418 AtapiScsiPassThruGetTargetLun
420 TODO: Add function description
422 @param This TODO: add argument description
423 @param DevicePath TODO: add argument description
424 @param Target TODO: add argument description
425 @param Lun TODO: add argument description
427 TODO: add return values
432 AtapiScsiPassThruGetTargetLun (
433 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
434 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
441 AtapiScsiPassThruResetChannel
443 TODO: Add function description
445 @param This TODO: add argument description
447 TODO: add return values
452 AtapiScsiPassThruResetChannel (
453 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
458 AtapiScsiPassThruResetTarget
460 TODO: Add function description
462 @param This TODO: add argument description
463 @param Target TODO: add argument description
464 @param Lun TODO: add argument description
466 TODO: add return values
471 AtapiScsiPassThruResetTarget (
472 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
479 CheckSCSIRequestPacket
481 TODO: Add function description
483 @param Packet TODO: add argument description
485 TODO: add return values
489 CheckSCSIRequestPacket (
490 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
495 SubmitBlockingIoCommand
497 TODO: Add function description
499 @param AtapiScsiPrivate TODO: add argument description
500 @param Target TODO: add argument description
501 @param Packet TODO: add argument description
503 TODO: add return values
507 SubmitBlockingIoCommand (
508 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
510 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
517 TODO: Add function description
519 @param Packet - TODO: add argument description
521 @return TODO: add return values
526 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
533 TODO: Add function description
535 @param AtapiScsiPrivate TODO: add argument description
536 @param Target TODO: add argument description
537 @param Timeout TODO: add argument description
538 @param SenseData TODO: add argument description
539 @param SenseDataLength TODO: add argument description
541 TODO: add return values
545 RequestSenseCommand (
546 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
550 UINT8
*SenseDataLength
557 TODO: Add function description
559 @param AtapiScsiPrivate TODO: add argument description
560 @param Target TODO: add argument description
561 @param PacketCommand TODO: add argument description
562 @param Buffer TODO: add argument description
563 @param ByteCount TODO: add argument description
564 @param Direction TODO: add argument description
565 @param TimeOutInMicroSeconds TODO: add argument description
567 TODO: add return values
572 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
574 UINT8
*PacketCommand
,
577 DATA_DIRECTION Direction
,
578 UINT64 TimeOutInMicroSeconds
586 TODO: Add function description
588 @param PciIo TODO: add argument description
589 @param Port TODO: add argument description
591 TODO: add return values
596 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
605 TODO: Add function description
607 @param PciIo TODO: add argument description
608 @param Port TODO: add argument description
610 TODO: add return values
615 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
624 TODO: Add function description
626 @param PciIo TODO: add argument description
627 @param Port TODO: add argument description
628 @param Data TODO: add argument description
630 TODO: add return values
635 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
645 TODO: Add function description
647 @param PciIo TODO: add argument description
648 @param Port TODO: add argument description
649 @param Data TODO: add argument description
651 TODO: add return values
656 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
665 TODO: Add function description
667 @param AtapiScsiPrivate TODO: add argument description
668 @param TimeOutInMicroSeconds TODO: add argument description
670 TODO: add return values
675 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
676 UINT64 TimeOutInMicroSeconds
683 TODO: Add function description
685 @param AtapiScsiPrivate TODO: add argument description
686 @param TimeOutInMicroSeconds TODO: add argument description
688 TODO: add return values
693 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
694 UINT64 TimeOutInMicroSeconds
701 TODO: Add function description
703 @param AtapiScsiPrivate TODO: add argument description
704 @param TimeOutInMicroSeconds TODO: add argument description
706 TODO: add return values
711 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
712 UINT64 TimeOutInMicroSeconds
719 TODO: Add function description
721 @param AtapiScsiPrivate TODO: add argument description
722 @param TimeOutInMicroSeconds TODO: add argument description
724 TODO: add return values
729 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
730 UINT64 TimeOutInMicroSeconds
735 TODO: Add function description
737 @param AtapiScsiPrivate TODO: add argument description
738 @param TimeoutInMicroSeconds TODO: add argument description
740 TODO: add return values
744 StatusWaitForBSYClear (
745 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
746 UINT64 TimeoutInMicroSeconds
751 TODO: Add function description
753 @param AtapiScsiPrivate TODO: add argument description
754 @param TimeoutInMicroSeconds TODO: add argument description
756 TODO: add return values
760 AltStatusWaitForBSYClear (
761 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
762 UINT64 TimeoutInMicroSeconds
767 TODO: Add function description
769 @param AtapiScsiPrivate TODO: add argument description
770 @param TimeoutInMicroSeconds TODO: add argument description
772 TODO: add return values
777 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
778 UINT64 TimeoutInMicroSeconds
783 TODO: Add function description
785 @param AtapiScsiPrivate TODO: add argument description
786 @param TimeoutInMicroSeconds TODO: add argument description
788 TODO: add return values
793 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
794 UINT64 TimeoutInMicroSeconds
799 TODO: Add function description
801 @param AtapiScsiPrivate TODO: add argument description
802 @param Buffer TODO: add argument description
803 @param ByteCount TODO: add argument description
804 @param Direction TODO: add argument description
805 @param TimeOutInMicroSeconds TODO: add argument description
807 TODO: add return values
811 AtapiPassThruPioReadWriteData (
812 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
815 DATA_DIRECTION Direction
,
816 UINT64 TimeOutInMicroSeconds
821 TODO: Add function description
823 @param AtapiScsiPrivate TODO: add argument description
825 TODO: add return values
829 AtapiPassThruCheckErrorStatus (
830 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate