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
22 #include <Protocol/ScsiPassThru.h>
23 #include <Protocol/PciIo.h>
25 #include <Library/DebugLib.h>
26 #include <Library/UefiDriverEntryPoint.h>
27 #include <Library/BaseLib.h>
28 #include <Library/UefiLib.h>
29 #include <Library/BaseMemoryLib.h>
30 #include <Library/MemoryAllocationLib.h>
31 #include <Library/UefiBootServicesTableLib.h>
32 #include <IndustryStandard/pci22.h>
37 #define bit(a) (1 << (a))
39 #define MAX_TARGET_ID 4
45 UINT16 Command
; /* when write */
46 UINT16 Status
; /* when read */
50 UINT16 Error
; /* when read */
51 UINT16 Feature
; /* when write */
52 } IDE_ERROR_OR_FEATURE
;
55 UINT16 AltStatus
; /* when read */
56 UINT16 DeviceControl
; /* when write */
57 } IDE_AltStatus_OR_DeviceControl
;
64 IDE_ERROR_OR_FEATURE Reg1
;
70 IDE_CMD_OR_STATUS Reg
;
72 IDE_AltStatus_OR_DeviceControl Alt
;
78 #define ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE EFI_SIGNATURE_32 ('a', 's', 'p', 't')
84 EFI_SCSI_PASS_THRU_PROTOCOL ScsiPassThru
;
85 EFI_SCSI_PASS_THRU_MODE ScsiPassThruMode
;
86 EFI_PCI_IO_PROTOCOL
*PciIo
;
89 // Local Data goes here
91 IDE_BASE_REGISTERS
*IoPort
;
93 CHAR16 ControllerName
[100];
94 CHAR16 ChannelName
[100];
96 UINT32 LatestTargetId
;
99 } ATAPI_SCSI_PASS_THRU_DEV
;
101 #define ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS(a) \
103 ATAPI_SCSI_PASS_THRU_DEV, \
105 ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE \
111 extern EFI_DRIVER_BINDING_PROTOCOL gAtapiScsiPassThruDriverBinding
;
112 extern EFI_COMPONENT_NAME_PROTOCOL gAtapiScsiPassThruComponentName
;
115 // ATAPI Command op code
117 #define OP_INQUIRY 0x12
118 #define OP_LOAD_UNLOAD_CD 0xa6
119 #define OP_MECHANISM_STATUS 0xbd
120 #define OP_MODE_SELECT_10 0x55
121 #define OP_MODE_SENSE_10 0x5a
122 #define OP_PAUSE_RESUME 0x4b
123 #define OP_PLAY_AUDIO_10 0x45
124 #define OP_PLAY_AUDIO_MSF 0x47
125 #define OP_PLAY_CD 0xbc
126 #define OP_PLAY_CD_MSF 0xb4
127 #define OP_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
128 #define OP_READ_10 0x28
129 #define OP_READ_12 0xa8
130 #define OP_READ_CAPACITY 0x25
131 #define OP_READ_CD 0xbe
132 #define OP_READ_CD_MSF 0xb9
133 #define OP_READ_HEADER 0x44
134 #define OP_READ_SUB_CHANNEL 0x42
135 #define OP_READ_TOC 0x43
136 #define OP_REQUEST_SENSE 0x03
138 #define OP_SEEK_10 0x2b
139 #define OP_SET_CD_SPEED 0xbb
140 #define OP_STOPPLAY_SCAN 0x4e
141 #define OP_START_STOP_UNIT 0x1b
142 #define OP_TEST_UNIT_READY 0x00
144 #define OP_FORMAT_UNIT 0x04
145 #define OP_READ_FORMAT_CAPACITIES 0x23
146 #define OP_VERIFY 0x2f
147 #define OP_WRITE_10 0x2a
148 #define OP_WRITE_12 0xaa
149 #define OP_WRITE_AND_VERIFY 0x2e
154 #define ATAPI_SOFT_RESET_CMD 0x08
165 DATA_DIRECTION Direction
;
168 #define MAX_CHANNEL 2
170 #define ValidCdbLength(Len) ((Len) == 6 || (Len) == 10 || (Len) == 12) ? 1 : 0
173 // IDE registers bit definitions
175 // ATA Err Reg bitmap
177 #define BBK_ERR bit (7) ///< Bad block detected
178 #define UNC_ERR bit (6) ///< Uncorrectable Data
179 #define MC_ERR bit (5) ///< Media Change
180 #define IDNF_ERR bit (4) ///< ID Not Found
181 #define MCR_ERR bit (3) ///< Media Change Requested
182 #define ABRT_ERR bit (2) ///< Aborted Command
183 #define TK0NF_ERR bit (1) ///< Track 0 Not Found
184 #define AMNF_ERR bit (0) ///< Address Mark Not Found
187 // ATAPI Err Reg bitmap
189 #define SENSE_KEY_ERR (bit (7) | bit (6) | bit (5) | bit (4))
190 #define EOM_ERR bit (1) ///< End of Media Detected
191 #define ILI_ERR bit (0) ///< Illegal Length Indication
196 #define LBA_MODE bit (6)
211 #define BSY bit (7) ///< Controller Busy
212 #define DRDY bit (6) ///< Drive Ready
213 #define DWF bit (5) ///< Drive Write Fault
214 #define DSC bit (4) ///< Disk Seek Complete
215 #define DRQ bit (3) ///< Data Request
216 #define CORR bit (2) ///< Corrected Data
217 #define IDX bit (1) ///< Index
218 #define ERR bit (0) ///< Error
219 #define CHECK bit (0) ///< Check bit for ATAPI Status Reg
222 // Device Control Reg
224 #define SRST bit (2) ///< Software Reset
225 #define IEN_L bit (1) ///< Interrupt Enable
228 // ATAPI Feature Register
230 #define OVERLAP bit (1)
234 // ATAPI Interrupt Reason Reson Reg (ATA Sector Count Register)
236 #define RELEASE bit (2)
240 #define PACKET_CMD 0xA0
242 #define DEFAULT_CMD (0xa0)
244 // default content of device control register, disable INT
246 #define DEFAULT_CTL (0x0a)
247 #define MAX_ATAPI_BYTE_COUNT (0xfffe)
250 // function prototype
255 AtapiScsiPassThruDriverBindingSupported (
256 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
257 IN EFI_HANDLE Controller
,
258 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
263 AtapiScsiPassThruDriverBindingStart (
264 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
265 IN EFI_HANDLE Controller
,
266 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
271 AtapiScsiPassThruDriverBindingStop (
272 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
273 IN EFI_HANDLE Controller
,
274 IN UINTN NumberOfChildren
,
275 IN EFI_HANDLE
*ChildHandleBuffer
279 // EFI Component Name Functions
283 AtapiScsiPassThruComponentNameGetDriverName (
284 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
286 OUT CHAR16
**DriverName
291 AtapiScsiPassThruComponentNameGetControllerName (
292 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
293 IN EFI_HANDLE ControllerHandle
,
294 IN EFI_HANDLE ChildHandle OPTIONAL
,
296 OUT CHAR16
**ControllerName
300 AtapiScsiPassThruDriverEntryPoint
305 @todo Add function description
306 @todo ImageHandle - add argument description
307 @todo SystemTable - add argument description
308 @todo add return values
312 AtapiScsiPassThruDriverEntryPoint (
313 IN EFI_HANDLE ImageHandle
,
314 IN EFI_SYSTEM_TABLE
*SystemTable
319 RegisterAtapiScsiPassThru
325 @todo Add function description
326 @todo This add argument description
327 @todo Controller add argument description
328 @todo PciIo add argument description
329 @todo add return values
332 RegisterAtapiScsiPassThru (
333 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
334 IN EFI_HANDLE Controller
,
335 IN EFI_PCI_IO_PROTOCOL
*PciIo
340 AtapiScsiPassThruFunction
348 @todo Add function description
349 @todo This - add argument description
350 @todo Target - add argument description
351 @todo Lun - add argument description
352 @todo Packet - add argument description
353 @todo Event - add argument description
354 @todo add return values
358 AtapiScsiPassThruFunction (
359 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
362 IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
,
363 IN EFI_EVENT Event OPTIONAL
368 AtapiScsiPassThruGetNextDevice
370 TODO: Add function description
372 @param This TODO: add argument description
373 @param Target TODO: add argument description
374 @param Lun TODO: add argument description
376 TODO: add return values
381 AtapiScsiPassThruGetNextDevice (
382 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
383 IN OUT UINT32
*Target
,
389 AtapiScsiPassThruBuildDevicePath
391 TODO: Add function description
393 @param This TODO: add argument description
394 @param Target TODO: add argument description
395 @param Lun TODO: add argument description
396 @param DevicePath TODO: add argument description
398 TODO: add return values
403 AtapiScsiPassThruBuildDevicePath (
404 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
407 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevicePath
412 AtapiScsiPassThruGetTargetLun
414 TODO: Add function description
416 @param This TODO: add argument description
417 @param DevicePath TODO: add argument description
418 @param Target TODO: add argument description
419 @param Lun TODO: add argument description
421 TODO: add return values
426 AtapiScsiPassThruGetTargetLun (
427 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
428 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
435 AtapiScsiPassThruResetChannel
437 TODO: Add function description
439 @param This TODO: add argument description
441 TODO: add return values
446 AtapiScsiPassThruResetChannel (
447 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
452 AtapiScsiPassThruResetTarget
454 TODO: Add function description
456 @param This TODO: add argument description
457 @param Target TODO: add argument description
458 @param Lun TODO: add argument description
460 TODO: add return values
465 AtapiScsiPassThruResetTarget (
466 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
473 CheckSCSIRequestPacket
475 TODO: Add function description
477 @param Packet TODO: add argument description
479 TODO: add return values
483 CheckSCSIRequestPacket (
484 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
489 SubmitBlockingIoCommand
491 TODO: Add function description
493 @param AtapiScsiPrivate TODO: add argument description
494 @param Target TODO: add argument description
495 @param Packet TODO: add argument description
497 TODO: add return values
501 SubmitBlockingIoCommand (
502 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
504 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
511 TODO: Add function description
513 @param Packet - TODO: add argument description
515 @return TODO: add return values
520 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
527 TODO: Add function description
529 @param AtapiScsiPrivate TODO: add argument description
530 @param Target TODO: add argument description
531 @param Timeout TODO: add argument description
532 @param SenseData TODO: add argument description
533 @param SenseDataLength TODO: add argument description
535 TODO: add return values
539 RequestSenseCommand (
540 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
544 UINT8
*SenseDataLength
551 TODO: Add function description
553 @param AtapiScsiPrivate TODO: add argument description
554 @param Target TODO: add argument description
555 @param PacketCommand TODO: add argument description
556 @param Buffer TODO: add argument description
557 @param ByteCount TODO: add argument description
558 @param Direction TODO: add argument description
559 @param TimeOutInMicroSeconds TODO: add argument description
561 TODO: add return values
566 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
568 UINT8
*PacketCommand
,
571 DATA_DIRECTION Direction
,
572 UINT64 TimeOutInMicroSeconds
580 TODO: Add function description
582 @param PciIo TODO: add argument description
583 @param Port TODO: add argument description
585 TODO: add return values
590 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
599 TODO: Add function description
601 @param PciIo TODO: add argument description
602 @param Port TODO: add argument description
604 TODO: add return values
609 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
618 TODO: Add function description
620 @param PciIo TODO: add argument description
621 @param Port TODO: add argument description
622 @param Data TODO: add argument description
624 TODO: add return values
629 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
639 TODO: Add function description
641 @param PciIo TODO: add argument description
642 @param Port TODO: add argument description
643 @param Data TODO: add argument description
645 TODO: add return values
650 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
659 TODO: Add function description
661 @param AtapiScsiPrivate TODO: add argument description
662 @param TimeOutInMicroSeconds TODO: add argument description
664 TODO: add return values
669 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
670 UINT64 TimeOutInMicroSeconds
677 TODO: Add function description
679 @param AtapiScsiPrivate TODO: add argument description
680 @param TimeOutInMicroSeconds TODO: add argument description
682 TODO: add return values
687 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
688 UINT64 TimeOutInMicroSeconds
695 TODO: Add function description
697 @param AtapiScsiPrivate TODO: add argument description
698 @param TimeOutInMicroSeconds TODO: add argument description
700 TODO: add return values
705 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
706 UINT64 TimeOutInMicroSeconds
713 TODO: Add function description
715 @param AtapiScsiPrivate TODO: add argument description
716 @param TimeOutInMicroSeconds TODO: add argument description
718 TODO: add return values
723 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
724 UINT64 TimeOutInMicroSeconds
729 TODO: Add function description
731 @param AtapiScsiPrivate TODO: add argument description
732 @param TimeoutInMicroSeconds TODO: add argument description
734 TODO: add return values
738 StatusWaitForBSYClear (
739 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
740 UINT64 TimeoutInMicroSeconds
745 TODO: Add function description
747 @param AtapiScsiPrivate TODO: add argument description
748 @param TimeoutInMicroSeconds TODO: add argument description
750 TODO: add return values
754 AltStatusWaitForBSYClear (
755 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
756 UINT64 TimeoutInMicroSeconds
761 TODO: Add function description
763 @param AtapiScsiPrivate TODO: add argument description
764 @param TimeoutInMicroSeconds TODO: add argument description
766 TODO: add return values
771 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
772 UINT64 TimeoutInMicroSeconds
777 TODO: Add function description
779 @param AtapiScsiPrivate TODO: add argument description
780 @param TimeoutInMicroSeconds TODO: add argument description
782 TODO: add return values
787 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
788 UINT64 TimeoutInMicroSeconds
793 TODO: Add function description
795 @param AtapiScsiPrivate TODO: add argument description
796 @param Buffer TODO: add argument description
797 @param ByteCount TODO: add argument description
798 @param Direction TODO: add argument description
799 @param TimeOutInMicroSeconds TODO: add argument description
801 TODO: add return values
805 AtapiPassThruPioReadWriteData (
806 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
809 DATA_DIRECTION Direction
,
810 UINT64 TimeOutInMicroSeconds
815 TODO: Add function description
817 @param AtapiScsiPrivate TODO: add argument description
819 TODO: add return values
823 AtapiPassThruCheckErrorStatus (
824 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate