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
;
70 // Bit definitions in Programming Interface byte of the Class Code field
71 // in PCI IDE controller's Configuration Space
73 #define IDE_PRIMARY_OPERATING_MODE BIT0
74 #define IDE_PRIMARY_PROGRAMMABLE_INDICATOR BIT1
75 #define IDE_SECONDARY_OPERATING_MODE BIT2
76 #define IDE_SECONDARY_PROGRAMMABLE_INDICATOR BIT3
79 #define ATAPI_MAX_CHANNEL 2
86 IDE_ERROR_OR_FEATURE Reg1
;
92 IDE_CMD_OR_STATUS Reg
;
93 IDE_AltStatus_OR_DeviceControl Alt
;
97 #define ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE EFI_SIGNATURE_32 ('a', 's', 'p', 't')
102 EFI_SCSI_PASS_THRU_PROTOCOL ScsiPassThru
;
103 EFI_SCSI_PASS_THRU_MODE ScsiPassThruMode
;
104 EFI_PCI_IO_PROTOCOL
*PciIo
;
106 // Local Data goes here
108 IDE_BASE_REGISTERS
*IoPort
;
109 IDE_BASE_REGISTERS AtapiIoPortRegisters
[2];
110 CHAR16 ControllerName
[100];
111 CHAR16 ChannelName
[100];
112 UINT32 LatestTargetId
;
114 } ATAPI_SCSI_PASS_THRU_DEV
;
117 // IDE registers' base addresses
120 UINT16 CommandBlockBaseAddr
;
121 UINT16 ControlBlockBaseAddr
;
122 } IDE_REGISTERS_BASE_ADDR
;
124 #define ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS(a) \
126 ATAPI_SCSI_PASS_THRU_DEV, \
128 ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE \
134 extern EFI_DRIVER_BINDING_PROTOCOL gAtapiScsiPassThruDriverBinding
;
135 extern EFI_COMPONENT_NAME_PROTOCOL gAtapiScsiPassThruComponentName
;
138 // ATAPI Command op code
140 #define OP_INQUIRY 0x12
141 #define OP_LOAD_UNLOAD_CD 0xa6
142 #define OP_MECHANISM_STATUS 0xbd
143 #define OP_MODE_SELECT_10 0x55
144 #define OP_MODE_SENSE_10 0x5a
145 #define OP_PAUSE_RESUME 0x4b
146 #define OP_PLAY_AUDIO_10 0x45
147 #define OP_PLAY_AUDIO_MSF 0x47
148 #define OP_PLAY_CD 0xbc
149 #define OP_PLAY_CD_MSF 0xb4
150 #define OP_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
151 #define OP_READ_10 0x28
152 #define OP_READ_12 0xa8
153 #define OP_READ_CAPACITY 0x25
154 #define OP_READ_CD 0xbe
155 #define OP_READ_CD_MSF 0xb9
156 #define OP_READ_HEADER 0x44
157 #define OP_READ_SUB_CHANNEL 0x42
158 #define OP_READ_TOC 0x43
159 #define OP_REQUEST_SENSE 0x03
161 #define OP_SEEK_10 0x2b
162 #define OP_SET_CD_SPEED 0xbb
163 #define OP_STOPPLAY_SCAN 0x4e
164 #define OP_START_STOP_UNIT 0x1b
165 #define OP_TEST_UNIT_READY 0x00
167 #define OP_FORMAT_UNIT 0x04
168 #define OP_READ_FORMAT_CAPACITIES 0x23
169 #define OP_VERIFY 0x2f
170 #define OP_WRITE_10 0x2a
171 #define OP_WRITE_12 0xaa
172 #define OP_WRITE_AND_VERIFY 0x2e
177 #define ATAPI_SOFT_RESET_CMD 0x08
188 DATA_DIRECTION Direction
;
191 #define MAX_CHANNEL 2
193 #define ValidCdbLength(Len) ((Len) == 6 || (Len) == 10 || (Len) == 12) ? 1 : 0
196 // IDE registers bit definitions
198 // ATA Err Reg bitmap
200 #define BBK_ERR bit (7) ///< Bad block detected
201 #define UNC_ERR bit (6) ///< Uncorrectable Data
202 #define MC_ERR bit (5) ///< Media Change
203 #define IDNF_ERR bit (4) ///< ID Not Found
204 #define MCR_ERR bit (3) ///< Media Change Requested
205 #define ABRT_ERR bit (2) ///< Aborted Command
206 #define TK0NF_ERR bit (1) ///< Track 0 Not Found
207 #define AMNF_ERR bit (0) ///< Address Mark Not Found
210 // ATAPI Err Reg bitmap
212 #define SENSE_KEY_ERR (bit (7) | bit (6) | bit (5) | bit (4))
213 #define EOM_ERR bit (1) ///< End of Media Detected
214 #define ILI_ERR bit (0) ///< Illegal Length Indication
219 #define LBA_MODE bit (6)
234 #define BSY bit (7) ///< Controller Busy
235 #define DRDY bit (6) ///< Drive Ready
236 #define DWF bit (5) ///< Drive Write Fault
237 #define DSC bit (4) ///< Disk Seek Complete
238 #define DRQ bit (3) ///< Data Request
239 #define CORR bit (2) ///< Corrected Data
240 #define IDX bit (1) ///< Index
241 #define ERR bit (0) ///< Error
242 #define CHECK bit (0) ///< Check bit for ATAPI Status Reg
245 // Device Control Reg
247 #define SRST bit (2) ///< Software Reset
248 #define IEN_L bit (1) ///< Interrupt Enable
251 // ATAPI Feature Register
253 #define OVERLAP bit (1)
257 // ATAPI Interrupt Reason Reson Reg (ATA Sector Count Register)
259 #define RELEASE bit (2)
263 #define PACKET_CMD 0xA0
265 #define DEFAULT_CMD (0xa0)
267 // default content of device control register, disable INT
269 #define DEFAULT_CTL (0x0a)
270 #define MAX_ATAPI_BYTE_COUNT (0xfffe)
273 // function prototype
278 AtapiScsiPassThruDriverBindingSupported (
279 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
280 IN EFI_HANDLE Controller
,
281 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
286 AtapiScsiPassThruDriverBindingStart (
287 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
288 IN EFI_HANDLE Controller
,
289 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
294 AtapiScsiPassThruDriverBindingStop (
295 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
296 IN EFI_HANDLE Controller
,
297 IN UINTN NumberOfChildren
,
298 IN EFI_HANDLE
*ChildHandleBuffer
302 // EFI Component Name Functions
306 AtapiScsiPassThruComponentNameGetDriverName (
307 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
309 OUT CHAR16
**DriverName
314 AtapiScsiPassThruComponentNameGetControllerName (
315 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
316 IN EFI_HANDLE ControllerHandle
,
317 IN EFI_HANDLE ChildHandle OPTIONAL
,
319 OUT CHAR16
**ControllerName
323 AtapiScsiPassThruDriverEntryPoint
328 @todo Add function description
329 @todo ImageHandle - add argument description
330 @todo SystemTable - add argument description
331 @todo add return values
335 AtapiScsiPassThruDriverEntryPoint (
336 IN EFI_HANDLE ImageHandle
,
337 IN EFI_SYSTEM_TABLE
*SystemTable
342 RegisterAtapiScsiPassThru
348 @todo Add function description
349 @todo This add argument description
350 @todo Controller add argument description
351 @todo PciIo add argument description
352 @todo add return values
355 RegisterAtapiScsiPassThru (
356 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
357 IN EFI_HANDLE Controller
,
358 IN EFI_PCI_IO_PROTOCOL
*PciIo
363 AtapiScsiPassThruFunction
371 @todo Add function description
372 @todo This - add argument description
373 @todo Target - add argument description
374 @todo Lun - add argument description
375 @todo Packet - add argument description
376 @todo Event - add argument description
377 @todo add return values
381 AtapiScsiPassThruFunction (
382 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
385 IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
,
386 IN EFI_EVENT Event OPTIONAL
391 AtapiScsiPassThruGetNextDevice
393 TODO: Add function description
395 @param This TODO: add argument description
396 @param Target TODO: add argument description
397 @param Lun TODO: add argument description
399 TODO: add return values
404 AtapiScsiPassThruGetNextDevice (
405 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
406 IN OUT UINT32
*Target
,
412 AtapiScsiPassThruBuildDevicePath
414 TODO: Add function description
416 @param This TODO: add argument description
417 @param Target TODO: add argument description
418 @param Lun TODO: add argument description
419 @param DevicePath TODO: add argument description
421 TODO: add return values
426 AtapiScsiPassThruBuildDevicePath (
427 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
430 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevicePath
435 AtapiScsiPassThruGetTargetLun
437 TODO: Add function description
439 @param This TODO: add argument description
440 @param DevicePath TODO: add argument description
441 @param Target TODO: add argument description
442 @param Lun TODO: add argument description
444 TODO: add return values
449 AtapiScsiPassThruGetTargetLun (
450 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
451 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
458 AtapiScsiPassThruResetChannel
460 TODO: Add function description
462 @param This TODO: add argument description
464 TODO: add return values
469 AtapiScsiPassThruResetChannel (
470 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
475 AtapiScsiPassThruResetTarget
477 TODO: Add function description
479 @param This TODO: add argument description
480 @param Target TODO: add argument description
481 @param Lun TODO: add argument description
483 TODO: add return values
488 AtapiScsiPassThruResetTarget (
489 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
496 CheckSCSIRequestPacket
498 TODO: Add function description
500 @param Packet TODO: add argument description
502 TODO: add return values
506 CheckSCSIRequestPacket (
507 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
512 SubmitBlockingIoCommand
514 TODO: Add function description
516 @param AtapiScsiPrivate TODO: add argument description
517 @param Target TODO: add argument description
518 @param Packet TODO: add argument description
520 TODO: add return values
524 SubmitBlockingIoCommand (
525 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
527 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
534 TODO: Add function description
536 @param Packet - TODO: add argument description
538 @return TODO: add return values
543 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
550 TODO: Add function description
552 @param AtapiScsiPrivate TODO: add argument description
553 @param Target TODO: add argument description
554 @param Timeout TODO: add argument description
555 @param SenseData TODO: add argument description
556 @param SenseDataLength TODO: add argument description
558 TODO: add return values
562 RequestSenseCommand (
563 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
567 UINT8
*SenseDataLength
574 TODO: Add function description
576 @param AtapiScsiPrivate TODO: add argument description
577 @param Target TODO: add argument description
578 @param PacketCommand TODO: add argument description
579 @param Buffer TODO: add argument description
580 @param ByteCount TODO: add argument description
581 @param Direction TODO: add argument description
582 @param TimeOutInMicroSeconds TODO: add argument description
584 TODO: add return values
589 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
591 UINT8
*PacketCommand
,
594 DATA_DIRECTION Direction
,
595 UINT64 TimeOutInMicroSeconds
603 TODO: Add function description
605 @param PciIo TODO: add argument description
606 @param Port TODO: add argument description
608 TODO: add return values
613 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
622 TODO: Add function description
624 @param PciIo TODO: add argument description
625 @param Port TODO: add argument description
627 TODO: add return values
632 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
641 TODO: Add function description
643 @param PciIo TODO: add argument description
644 @param Port TODO: add argument description
645 @param Data TODO: add argument description
647 TODO: add return values
652 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
662 TODO: Add function description
664 @param PciIo TODO: add argument description
665 @param Port TODO: add argument description
666 @param Data TODO: add argument description
668 TODO: add return values
673 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
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
718 TODO: Add function description
720 @param AtapiScsiPrivate TODO: add argument description
721 @param TimeOutInMicroSeconds TODO: add argument description
723 TODO: add return values
728 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
729 UINT64 TimeOutInMicroSeconds
736 TODO: Add function description
738 @param AtapiScsiPrivate TODO: add argument description
739 @param TimeOutInMicroSeconds TODO: add argument description
741 TODO: add return values
746 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
747 UINT64 TimeOutInMicroSeconds
752 TODO: Add function description
754 @param AtapiScsiPrivate TODO: add argument description
755 @param TimeoutInMicroSeconds TODO: add argument description
757 TODO: add return values
761 StatusWaitForBSYClear (
762 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
763 UINT64 TimeoutInMicroSeconds
768 TODO: Add function description
770 @param AtapiScsiPrivate TODO: add argument description
771 @param TimeoutInMicroSeconds TODO: add argument description
773 TODO: add return values
777 AltStatusWaitForBSYClear (
778 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
779 UINT64 TimeoutInMicroSeconds
784 TODO: Add function description
786 @param AtapiScsiPrivate TODO: add argument description
787 @param TimeoutInMicroSeconds TODO: add argument description
789 TODO: add return values
794 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
795 UINT64 TimeoutInMicroSeconds
800 TODO: Add function description
802 @param AtapiScsiPrivate TODO: add argument description
803 @param TimeoutInMicroSeconds TODO: add argument description
805 TODO: add return values
810 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
811 UINT64 TimeoutInMicroSeconds
816 TODO: Add function description
818 @param AtapiScsiPrivate TODO: add argument description
819 @param Buffer TODO: add argument description
820 @param ByteCount TODO: add argument description
821 @param Direction TODO: add argument description
822 @param TimeOutInMicroSeconds TODO: add argument description
824 TODO: add return values
828 AtapiPassThruPioReadWriteData (
829 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
832 DATA_DIRECTION Direction
,
833 UINT64 TimeOutInMicroSeconds
838 TODO: Add function description
840 @param AtapiScsiPrivate TODO: add argument description
842 TODO: add return values
846 AtapiPassThruCheckErrorStatus (
847 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
851 GetIdeRegistersBaseAddr (
852 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
853 OUT IDE_REGISTERS_BASE_ADDR
*IdeRegsBaseAddr
858 Get IDE IO port registers' base addresses by mode. In 'Compatibility' mode,
859 use fixed addresses. In Native-PCI mode, get base addresses from BARs in
860 the PCI IDE controller's Configuration Space.
863 PciIo - Pointer to the EFI_PCI_IO_PROTOCOL instance
864 IdeRegsBaseAddr - Pointer to IDE_REGISTERS_BASE_ADDR to
865 receive IDE IO port registers' base addresses
875 InitAtapiIoPortRegisters (
876 IN ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
877 IN IDE_REGISTERS_BASE_ADDR
*IdeRegsBaseAddr
883 Initialize each Channel's Base Address of CommandBlock and ControlBlock.
887 AtapiScsiPrivate - The pointer of ATAPI_SCSI_PASS_THRU_DEV
888 IdeRegsBaseAddr - The pointer of IDE_REGISTERS_BASE_ADDR