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
19 #include <IndustryStandard/pci22.h>
24 #define bit(a) (1 << (a))
26 #define MAX_TARGET_ID 4
32 UINT16 Command
; /* when write */
33 UINT16 Status
; /* when read */
37 UINT16 Error
; /* when read */
38 UINT16 Feature
; /* when write */
39 } IDE_ERROR_OR_FEATURE
;
42 UINT16 AltStatus
; /* when read */
43 UINT16 DeviceControl
; /* when write */
44 } IDE_AltStatus_OR_DeviceControl
;
51 IDE_ERROR_OR_FEATURE Reg1
;
57 IDE_CMD_OR_STATUS Reg
;
59 IDE_AltStatus_OR_DeviceControl Alt
;
65 #define ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE EFI_SIGNATURE_32 ('a', 's', 'p', 't')
71 EFI_SCSI_PASS_THRU_PROTOCOL ScsiPassThru
;
72 EFI_SCSI_PASS_THRU_MODE ScsiPassThruMode
;
73 EFI_PCI_IO_PROTOCOL
*PciIo
;
76 // Local Data goes here
78 IDE_BASE_REGISTERS
*IoPort
;
80 CHAR16 ControllerName
[100];
81 CHAR16 ChannelName
[100];
83 UINT32 LatestTargetId
;
86 } ATAPI_SCSI_PASS_THRU_DEV
;
88 #define ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS(a) \
90 ATAPI_SCSI_PASS_THRU_DEV, \
92 ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE \
98 extern EFI_DRIVER_BINDING_PROTOCOL gAtapiScsiPassThruDriverBinding
;
99 extern EFI_COMPONENT_NAME_PROTOCOL gAtapiScsiPassThruComponentName
;
102 // ATAPI Command op code
104 #define OP_INQUIRY 0x12
105 #define OP_LOAD_UNLOAD_CD 0xa6
106 #define OP_MECHANISM_STATUS 0xbd
107 #define OP_MODE_SELECT_10 0x55
108 #define OP_MODE_SENSE_10 0x5a
109 #define OP_PAUSE_RESUME 0x4b
110 #define OP_PLAY_AUDIO_10 0x45
111 #define OP_PLAY_AUDIO_MSF 0x47
112 #define OP_PLAY_CD 0xbc
113 #define OP_PLAY_CD_MSF 0xb4
114 #define OP_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
115 #define OP_READ_10 0x28
116 #define OP_READ_12 0xa8
117 #define OP_READ_CAPACITY 0x25
118 #define OP_READ_CD 0xbe
119 #define OP_READ_CD_MSF 0xb9
120 #define OP_READ_HEADER 0x44
121 #define OP_READ_SUB_CHANNEL 0x42
122 #define OP_READ_TOC 0x43
123 #define OP_REQUEST_SENSE 0x03
125 #define OP_SEEK_10 0x2b
126 #define OP_SET_CD_SPEED 0xbb
127 #define OP_STOPPLAY_SCAN 0x4e
128 #define OP_START_STOP_UNIT 0x1b
129 #define OP_TEST_UNIT_READY 0x00
131 #define OP_FORMAT_UNIT 0x04
132 #define OP_READ_FORMAT_CAPACITIES 0x23
133 #define OP_VERIFY 0x2f
134 #define OP_WRITE_10 0x2a
135 #define OP_WRITE_12 0xaa
136 #define OP_WRITE_AND_VERIFY 0x2e
141 #define ATAPI_SOFT_RESET_CMD 0x08
152 DATA_DIRECTION Direction
;
155 #define MAX_CHANNEL 2
157 #define ValidCdbLength(Len) ((Len) == 6 || (Len) == 10 || (Len) == 12) ? 1 : 0
160 // IDE registers bit definitions
162 // ATA Err Reg bitmap
164 #define BBK_ERR bit (7) ///< Bad block detected
165 #define UNC_ERR bit (6) ///< Uncorrectable Data
166 #define MC_ERR bit (5) ///< Media Change
167 #define IDNF_ERR bit (4) ///< ID Not Found
168 #define MCR_ERR bit (3) ///< Media Change Requested
169 #define ABRT_ERR bit (2) ///< Aborted Command
170 #define TK0NF_ERR bit (1) ///< Track 0 Not Found
171 #define AMNF_ERR bit (0) ///< Address Mark Not Found
174 // ATAPI Err Reg bitmap
176 #define SENSE_KEY_ERR (bit (7) | bit (6) | bit (5) | bit (4))
177 #define EOM_ERR bit (1) ///< End of Media Detected
178 #define ILI_ERR bit (0) ///< Illegal Length Indication
183 #define LBA_MODE bit (6)
198 #define BSY bit (7) ///< Controller Busy
199 #define DRDY bit (6) ///< Drive Ready
200 #define DWF bit (5) ///< Drive Write Fault
201 #define DSC bit (4) ///< Disk Seek Complete
202 #define DRQ bit (3) ///< Data Request
203 #define CORR bit (2) ///< Corrected Data
204 #define IDX bit (1) ///< Index
205 #define ERR bit (0) ///< Error
206 #define CHECK bit (0) ///< Check bit for ATAPI Status Reg
209 // Device Control Reg
211 #define SRST bit (2) ///< Software Reset
212 #define IEN_L bit (1) ///< Interrupt Enable
215 // ATAPI Feature Register
217 #define OVERLAP bit (1)
221 // ATAPI Interrupt Reason Reson Reg (ATA Sector Count Register)
223 #define RELEASE bit (2)
227 #define PACKET_CMD 0xA0
229 #define DEFAULT_CMD (0xa0)
231 // default content of device control register, disable INT
233 #define DEFAULT_CTL (0x0a)
234 #define MAX_ATAPI_BYTE_COUNT (0xfffe)
237 // function prototype
242 AtapiScsiPassThruDriverBindingSupported (
243 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
244 IN EFI_HANDLE Controller
,
245 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
250 AtapiScsiPassThruDriverBindingStart (
251 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
252 IN EFI_HANDLE Controller
,
253 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
258 AtapiScsiPassThruDriverBindingStop (
259 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
260 IN EFI_HANDLE Controller
,
261 IN UINTN NumberOfChildren
,
262 IN EFI_HANDLE
*ChildHandleBuffer
266 // EFI Component Name Functions
270 AtapiScsiPassThruComponentNameGetDriverName (
271 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
273 OUT CHAR16
**DriverName
278 AtapiScsiPassThruComponentNameGetControllerName (
279 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
280 IN EFI_HANDLE ControllerHandle
,
281 IN EFI_HANDLE ChildHandle OPTIONAL
,
283 OUT CHAR16
**ControllerName
287 AtapiScsiPassThruDriverEntryPoint
292 @todo Add function description
293 @todo ImageHandle - add argument description
294 @todo SystemTable - add argument description
295 @todo add return values
299 AtapiScsiPassThruDriverEntryPoint (
300 IN EFI_HANDLE ImageHandle
,
301 IN EFI_SYSTEM_TABLE
*SystemTable
306 RegisterAtapiScsiPassThru
312 @todo Add function description
313 @todo This add argument description
314 @todo Controller add argument description
315 @todo PciIo add argument description
316 @todo add return values
319 RegisterAtapiScsiPassThru (
320 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
321 IN EFI_HANDLE Controller
,
322 IN EFI_PCI_IO_PROTOCOL
*PciIo
327 AtapiScsiPassThruFunction
335 @todo Add function description
336 @todo This - add argument description
337 @todo Target - add argument description
338 @todo Lun - add argument description
339 @todo Packet - add argument description
340 @todo Event - add argument description
341 @todo add return values
345 AtapiScsiPassThruFunction (
346 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
349 IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
,
350 IN EFI_EVENT Event OPTIONAL
355 AtapiScsiPassThruGetNextDevice
357 TODO: Add function description
359 @param This TODO: add argument description
360 @param Target TODO: add argument description
361 @param Lun TODO: add argument description
363 TODO: add return values
368 AtapiScsiPassThruGetNextDevice (
369 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
370 IN OUT UINT32
*Target
,
376 AtapiScsiPassThruBuildDevicePath
378 TODO: Add function description
380 @param This TODO: add argument description
381 @param Target TODO: add argument description
382 @param Lun TODO: add argument description
383 @param DevicePath TODO: add argument description
385 TODO: add return values
390 AtapiScsiPassThruBuildDevicePath (
391 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
394 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevicePath
399 AtapiScsiPassThruGetTargetLun
401 TODO: Add function description
403 @param This TODO: add argument description
404 @param DevicePath TODO: add argument description
405 @param Target TODO: add argument description
406 @param Lun TODO: add argument description
408 TODO: add return values
413 AtapiScsiPassThruGetTargetLun (
414 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
415 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
422 AtapiScsiPassThruResetChannel
424 TODO: Add function description
426 @param This TODO: add argument description
428 TODO: add return values
433 AtapiScsiPassThruResetChannel (
434 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
439 AtapiScsiPassThruResetTarget
441 TODO: Add function description
443 @param This TODO: add argument description
444 @param Target TODO: add argument description
445 @param Lun TODO: add argument description
447 TODO: add return values
452 AtapiScsiPassThruResetTarget (
453 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
460 CheckSCSIRequestPacket
462 TODO: Add function description
464 @param Packet TODO: add argument description
466 TODO: add return values
470 CheckSCSIRequestPacket (
471 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
476 SubmitBlockingIoCommand
478 TODO: Add function description
480 @param AtapiScsiPrivate TODO: add argument description
481 @param Target TODO: add argument description
482 @param Packet TODO: add argument description
484 TODO: add return values
488 SubmitBlockingIoCommand (
489 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
491 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
498 TODO: Add function description
500 @param Packet - TODO: add argument description
502 @return TODO: add return values
507 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
514 TODO: Add function description
516 @param AtapiScsiPrivate TODO: add argument description
517 @param Target TODO: add argument description
518 @param Timeout TODO: add argument description
519 @param SenseData TODO: add argument description
520 @param SenseDataLength TODO: add argument description
522 TODO: add return values
526 RequestSenseCommand (
527 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
531 UINT8
*SenseDataLength
538 TODO: Add function description
540 @param AtapiScsiPrivate TODO: add argument description
541 @param Target TODO: add argument description
542 @param PacketCommand TODO: add argument description
543 @param Buffer TODO: add argument description
544 @param ByteCount TODO: add argument description
545 @param Direction TODO: add argument description
546 @param TimeOutInMicroSeconds TODO: add argument description
548 TODO: add return values
553 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
555 UINT8
*PacketCommand
,
558 DATA_DIRECTION Direction
,
559 UINT64 TimeOutInMicroSeconds
567 TODO: Add function description
569 @param PciIo TODO: add argument description
570 @param Port TODO: add argument description
572 TODO: add return values
577 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
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
609 @param Data TODO: add argument description
611 TODO: add return values
616 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
626 TODO: Add function description
628 @param PciIo TODO: add argument description
629 @param Port TODO: add argument description
630 @param Data TODO: add argument description
632 TODO: add return values
637 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
646 TODO: Add function description
648 @param AtapiScsiPrivate TODO: add argument description
649 @param TimeOutInMicroSeconds TODO: add argument description
651 TODO: add return values
656 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
657 UINT64 TimeOutInMicroSeconds
664 TODO: Add function description
666 @param AtapiScsiPrivate TODO: add argument description
667 @param TimeOutInMicroSeconds TODO: add argument description
669 TODO: add return values
674 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
675 UINT64 TimeOutInMicroSeconds
682 TODO: Add function description
684 @param AtapiScsiPrivate TODO: add argument description
685 @param TimeOutInMicroSeconds TODO: add argument description
687 TODO: add return values
692 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
693 UINT64 TimeOutInMicroSeconds
700 TODO: Add function description
702 @param AtapiScsiPrivate TODO: add argument description
703 @param TimeOutInMicroSeconds TODO: add argument description
705 TODO: add return values
710 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
711 UINT64 TimeOutInMicroSeconds
716 TODO: Add function description
718 @param AtapiScsiPrivate TODO: add argument description
719 @param TimeoutInMicroSeconds TODO: add argument description
721 TODO: add return values
725 StatusWaitForBSYClear (
726 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
727 UINT64 TimeoutInMicroSeconds
732 TODO: Add function description
734 @param AtapiScsiPrivate TODO: add argument description
735 @param TimeoutInMicroSeconds TODO: add argument description
737 TODO: add return values
741 AltStatusWaitForBSYClear (
742 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
743 UINT64 TimeoutInMicroSeconds
748 TODO: Add function description
750 @param AtapiScsiPrivate TODO: add argument description
751 @param TimeoutInMicroSeconds TODO: add argument description
753 TODO: add return values
758 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
759 UINT64 TimeoutInMicroSeconds
764 TODO: Add function description
766 @param AtapiScsiPrivate TODO: add argument description
767 @param TimeoutInMicroSeconds TODO: add argument description
769 TODO: add return values
774 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
775 UINT64 TimeoutInMicroSeconds
780 TODO: Add function description
782 @param AtapiScsiPrivate TODO: add argument description
783 @param Buffer TODO: add argument description
784 @param ByteCount TODO: add argument description
785 @param Direction TODO: add argument description
786 @param TimeOutInMicroSeconds TODO: add argument description
788 TODO: add return values
792 AtapiPassThruPioReadWriteData (
793 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
796 DATA_DIRECTION Direction
,
797 UINT64 TimeOutInMicroSeconds
802 TODO: Add function description
804 @param AtapiScsiPrivate TODO: add argument description
806 TODO: add return values
810 AtapiPassThruCheckErrorStatus (
811 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate