3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
26 #include <IndustryStandard/pci22.h>
31 #define bit(a) 1 << (a)
33 #define MAX_TARGET_ID 4
38 UINT16 Command
; /* when write */
39 UINT16 Status
; /* when read */
43 UINT16 Error
; /* when read */
44 UINT16 Feature
; /* when write */
45 } IDE_ERROR_OR_FEATURE
;
48 UINT16 AltStatus
; /* when read */
49 UINT16 DeviceControl
; /* when write */
50 } IDE_AltStatus_OR_DeviceControl
;
57 IDE_ERROR_OR_FEATURE Reg1
;
63 IDE_CMD_OR_STATUS Reg
;
65 IDE_AltStatus_OR_DeviceControl Alt
;
71 #define ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE EFI_SIGNATURE_32 ('a', 's', 'p', 't')
77 EFI_SCSI_PASS_THRU_PROTOCOL ScsiPassThru
;
78 EFI_SCSI_PASS_THRU_MODE ScsiPassThruMode
;
79 EFI_PCI_IO_PROTOCOL
*PciIo
;
82 // Local Data goes here
84 IDE_BASE_REGISTERS
*IoPort
;
86 CHAR16 ControllerName
[100];
87 CHAR16 ChannelName
[100];
89 UINT32 LatestTargetId
;
92 } ATAPI_SCSI_PASS_THRU_DEV
;
94 #define ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS(a) \
96 ATAPI_SCSI_PASS_THRU_DEV, \
98 ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE \
104 extern EFI_DRIVER_BINDING_PROTOCOL gAtapiScsiPassThruDriverBinding
;
105 extern EFI_COMPONENT_NAME_PROTOCOL gAtapiScsiPassThruComponentName
;
108 // ATAPI Command op code
110 #define OP_INQUIRY 0x12
111 #define OP_LOAD_UNLOAD_CD 0xa6
112 #define OP_MECHANISM_STATUS 0xbd
113 #define OP_MODE_SELECT_10 0x55
114 #define OP_MODE_SENSE_10 0x5a
115 #define OP_PAUSE_RESUME 0x4b
116 #define OP_PLAY_AUDIO_10 0x45
117 #define OP_PLAY_AUDIO_MSF 0x47
118 #define OP_PLAY_CD 0xbc
119 #define OP_PLAY_CD_MSF 0xb4
120 #define OP_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
121 #define OP_READ_10 0x28
122 #define OP_READ_12 0xa8
123 #define OP_READ_CAPACITY 0x25
124 #define OP_READ_CD 0xbe
125 #define OP_READ_CD_MSF 0xb9
126 #define OP_READ_HEADER 0x44
127 #define OP_READ_SUB_CHANNEL 0x42
128 #define OP_READ_TOC 0x43
129 #define OP_REQUEST_SENSE 0x03
131 #define OP_SEEK_10 0x2b
132 #define OP_SET_CD_SPEED 0xbb
133 #define OP_STOPPLAY_SCAN 0x4e
134 #define OP_START_STOP_UNIT 0x1b
135 #define OP_TEST_UNIT_READY 0x00
137 #define OP_FORMAT_UNIT 0x04
138 #define OP_READ_FORMAT_CAPACITIES 0x23
139 #define OP_VERIFY 0x2f
140 #define OP_WRITE_10 0x2a
141 #define OP_WRITE_12 0xaa
142 #define OP_WRITE_AND_VERIFY 0x2e
147 #define ATAPI_SOFT_RESET_CMD 0x08
158 DATA_DIRECTION Direction
;
161 #define MAX_CHANNEL 2
163 #define ValidCdbLength(Len) ((Len) == 6 || (Len) == 10 || (Len) == 12) ? 1 : 0
166 // IDE registers bit definitions
168 // ATA Err Reg bitmap
170 #define BBK_ERR bit (7) /* Bad block detected */
171 #define UNC_ERR bit (6) /* Uncorrectable Data */
172 #define MC_ERR bit (5) /* Media Change */
173 #define IDNF_ERR bit (4) /* ID Not Found */
174 #define MCR_ERR bit (3) /* Media Change Requested */
175 #define ABRT_ERR bit (2) /* Aborted Command */
176 #define TK0NF_ERR bit (1) /* Track 0 Not Found */
177 #define AMNF_ERR bit (0) /* Address Mark Not Found */
180 // ATAPI Err Reg bitmap
182 #define SENSE_KEY_ERR (bit (7) | bit (6) | bit (5) | bit (4))
183 #define EOM_ERR bit (1) /* End of Media Detected */
184 #define ILI_ERR bit (0) /* Illegal Length Indication */
189 #define LBA_MODE bit (6)
204 #define BSY bit (7) /* Controller Busy */
205 #define DRDY bit (6) /* Drive Ready */
206 #define DWF bit (5) /* Drive Write Fault */
207 #define DSC bit (4) /* Disk Seek Complete */
208 #define DRQ bit (3) /* Data Request */
209 #define CORR bit (2) /* Corrected Data */
210 #define IDX bit (1) /* Index */
211 #define ERR bit (0) /* Error */
212 #define CHECK bit (0) /* Check bit for ATAPI Status Reg */
215 // Device Control Reg
217 #define SRST bit (2) /* Software Reset */
218 #define IEN_L bit (1) /* Interrupt Enable #*/
221 // ATAPI Feature Register
223 #define OVERLAP bit (1)
227 // ATAPI Interrupt Reason Reson Reg (ATA Sector Count Register)
229 #define RELEASE bit (2)
233 #define PACKET_CMD 0xA0
235 #define DEFAULT_CMD (0xa0)
237 // default content of device control register, disable INT
239 #define DEFAULT_CTL (0x0a)
240 #define MAX_ATAPI_BYTE_COUNT (0xfffe)
243 // function prototype
247 AtapiScsiPassThruDriverEntryPoint (
248 IN EFI_HANDLE ImageHandle
,
249 IN EFI_SYSTEM_TABLE
*SystemTable
255 TODO: Add function description
259 ImageHandle - TODO: add argument description
260 SystemTable - TODO: add argument description
264 TODO: add return values
270 RegisterAtapiScsiPassThru (
271 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
272 IN EFI_HANDLE Controller
,
273 IN EFI_PCI_IO_PROTOCOL
*PciIo
279 TODO: Add function description
283 This - TODO: add argument description
284 Controller - TODO: add argument description
285 PciIo - TODO: add argument description
289 TODO: add return values
296 AtapiScsiPassThruFunction (
297 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
300 IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
,
301 IN EFI_EVENT Event OPTIONAL
307 TODO: Add function description
311 This - TODO: add argument description
312 Target - TODO: add argument description
313 Lun - TODO: add argument description
314 Packet - TODO: add argument description
315 Event - TODO: add argument description
319 TODO: add return values
326 AtapiScsiPassThruGetNextDevice (
327 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
328 IN OUT UINT32
*Target
,
335 TODO: Add function description
339 This - TODO: add argument description
340 Target - TODO: add argument description
341 Lun - TODO: add argument description
345 TODO: add return values
352 AtapiScsiPassThruBuildDevicePath (
353 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
356 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevicePath
362 TODO: Add function description
366 This - TODO: add argument description
367 Target - TODO: add argument description
368 Lun - TODO: add argument description
369 DevicePath - TODO: add argument description
373 TODO: add return values
380 AtapiScsiPassThruGetTargetLun (
381 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
382 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
390 TODO: Add function description
394 This - TODO: add argument description
395 DevicePath - TODO: add argument description
396 Target - TODO: add argument description
397 Lun - TODO: add argument description
401 TODO: add return values
408 AtapiScsiPassThruResetChannel (
409 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
415 TODO: Add function description
419 This - TODO: add argument description
423 TODO: add return values
430 AtapiScsiPassThruResetTarget (
431 IN EFI_SCSI_PASS_THRU_PROTOCOL
*This
,
439 TODO: Add function description
443 This - TODO: add argument description
444 Target - TODO: add argument description
445 Lun - TODO: add argument description
449 TODO: add return values
455 CheckSCSIRequestPacket (
456 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
462 TODO: Add function description
466 Packet - TODO: add argument description
470 TODO: add return values
476 SubmitBlockingIoCommand (
477 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
479 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
485 TODO: Add function description
489 AtapiScsiPrivate - TODO: add argument description
490 Target - TODO: add argument description
491 Packet - TODO: add argument description
495 TODO: add return values
502 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
508 TODO: Add function description
512 Packet - TODO: add argument description
516 TODO: add return values
522 RequestSenseCommand (
523 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
527 UINT8
*SenseDataLength
533 TODO: Add function description
537 AtapiScsiPrivate - TODO: add argument description
538 Target - TODO: add argument description
539 Timeout - TODO: add argument description
540 SenseData - TODO: add argument description
541 SenseDataLength - TODO: add argument description
545 TODO: add return values
552 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
554 UINT8
*PacketCommand
,
557 DATA_DIRECTION Direction
,
558 UINT64 TimeOutInMicroSeconds
564 TODO: Add function description
568 AtapiScsiPrivate - TODO: add argument description
569 Target - TODO: add argument description
570 PacketCommand - TODO: add argument description
571 Buffer - TODO: add argument description
572 ByteCount - TODO: add argument description
573 Direction - TODO: add argument description
574 TimeOutInMicroSeconds - TODO: add argument description
578 TODO: add return values
586 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
593 TODO: Add function description
597 PciIo - TODO: add argument description
598 Port - TODO: add argument description
602 TODO: add return values
610 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
617 TODO: Add function description
621 PciIo - TODO: add argument description
622 Port - TODO: add argument description
626 TODO: add return values
634 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
642 TODO: Add function description
646 PciIo - TODO: add argument description
647 Port - TODO: add argument description
648 Data - TODO: add argument description
652 TODO: add return values
660 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
668 TODO: Add function description
672 PciIo - TODO: add argument description
673 Port - TODO: add argument description
674 Data - TODO: add argument description
678 TODO: add return values
685 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
686 UINT64 TimeOutInMicroSeconds
692 TODO: Add function description
696 AtapiScsiPrivate - TODO: add argument description
697 TimeOutInMicroSeconds - TODO: add argument description
701 TODO: add return values
708 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
709 UINT64 TimeOutInMicroSeconds
715 TODO: Add function description
719 AtapiScsiPrivate - TODO: add argument description
720 TimeOutInMicroSeconds - TODO: add argument description
724 TODO: add return values
731 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
732 UINT64 TimeOutInMicroSeconds
738 TODO: Add function description
742 AtapiScsiPrivate - TODO: add argument description
743 TimeOutInMicroSeconds - TODO: add argument description
747 TODO: add return values
754 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
755 UINT64 TimeOutInMicroSeconds
761 TODO: Add function description
765 AtapiScsiPrivate - TODO: add argument description
766 TimeOutInMicroSeconds - TODO: add argument description
770 TODO: add return values
776 StatusWaitForBSYClear (
777 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
778 UINT64 TimeoutInMicroSeconds
784 TODO: Add function description
788 AtapiScsiPrivate - TODO: add argument description
789 TimeoutInMicroSeconds - TODO: add argument description
793 TODO: add return values
799 AltStatusWaitForBSYClear (
800 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
801 UINT64 TimeoutInMicroSeconds
807 TODO: Add function description
811 AtapiScsiPrivate - TODO: add argument description
812 TimeoutInMicroSeconds - TODO: add argument description
816 TODO: add return values
823 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
824 UINT64 TimeoutInMicroSeconds
830 TODO: Add function description
834 AtapiScsiPrivate - TODO: add argument description
835 TimeoutInMicroSeconds - TODO: add argument description
839 TODO: add return values
846 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
847 UINT64 TimeoutInMicroSeconds
853 TODO: Add function description
857 AtapiScsiPrivate - TODO: add argument description
858 TimeoutInMicroSeconds - TODO: add argument description
862 TODO: add return values
868 AtapiPassThruPioReadWriteData (
869 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
,
872 DATA_DIRECTION Direction
,
873 UINT64 TimeOutInMicroSeconds
879 TODO: Add function description
883 AtapiScsiPrivate - TODO: add argument description
884 Buffer - TODO: add argument description
885 ByteCount - TODO: add argument description
886 Direction - TODO: add argument description
887 TimeOutInMicroSeconds - TODO: add argument description
891 TODO: add return values
897 AtapiPassThruCheckErrorStatus (
898 ATAPI_SCSI_PASS_THRU_DEV
*AtapiScsiPrivate
904 TODO: Add function description
908 AtapiScsiPrivate - TODO: add argument description
912 TODO: add return values