]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Bus/Pci/AtapiPassThruDxe/AtapiPassThru.h
d61c27bd11417fd522f0f6783349b8862b39d4ea
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / AtapiPassThruDxe / AtapiPassThru.h
1 /** @file
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
7
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.
10
11 Module Name: AtapiPassThru.h
12
13 **/
14
15 #ifndef _APT_H
16 #define _APT_H
17
18
19
20 #include <Uefi.h>
21
22 #include <Protocol/ScsiPassThru.h>
23 #include <Protocol/PciIo.h>
24
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>
33
34 ///
35 /// bit definition
36 ///
37 #define bit(a) (1 << (a))
38
39 #define MAX_TARGET_ID 4
40
41 //
42 // IDE Registers
43 //
44 typedef union {
45 UINT16 Command; /* when write */
46 UINT16 Status; /* when read */
47 } IDE_CMD_OR_STATUS;
48
49 typedef union {
50 UINT16 Error; /* when read */
51 UINT16 Feature; /* when write */
52 } IDE_ERROR_OR_FEATURE;
53
54 typedef union {
55 UINT16 AltStatus; /* when read */
56 UINT16 DeviceControl; /* when write */
57 } IDE_AltStatus_OR_DeviceControl;
58
59 ///
60 /// IDE registers set
61 ///
62 typedef struct {
63 UINT16 Data;
64 IDE_ERROR_OR_FEATURE Reg1;
65 UINT16 SectorCount;
66 UINT16 SectorNumber;
67 UINT16 CylinderLsb;
68 UINT16 CylinderMsb;
69 UINT16 Head;
70 IDE_CMD_OR_STATUS Reg;
71
72 IDE_AltStatus_OR_DeviceControl Alt;
73 UINT16 DriveAddress;
74
75 UINT16 MasterSlave;
76 } IDE_BASE_REGISTERS;
77
78 #define ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE EFI_SIGNATURE_32 ('a', 's', 'p', 't')
79
80 typedef struct {
81 UINTN Signature;
82
83 EFI_HANDLE Handle;
84 EFI_SCSI_PASS_THRU_PROTOCOL ScsiPassThru;
85 EFI_SCSI_PASS_THRU_MODE ScsiPassThruMode;
86 EFI_PCI_IO_PROTOCOL *PciIo;
87
88 //
89 // Local Data goes here
90 //
91 IDE_BASE_REGISTERS *IoPort;
92
93 CHAR16 ControllerName[100];
94 CHAR16 ChannelName[100];
95
96 UINT32 LatestTargetId;
97 UINT64 LatestLun;
98
99 } ATAPI_SCSI_PASS_THRU_DEV;
100
101 #define ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS(a) \
102 CR (a, \
103 ATAPI_SCSI_PASS_THRU_DEV, \
104 ScsiPassThru, \
105 ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE \
106 )
107
108 //
109 // Global Variables
110 //
111 extern EFI_DRIVER_BINDING_PROTOCOL gAtapiScsiPassThruDriverBinding;
112 extern EFI_COMPONENT_NAME_PROTOCOL gAtapiScsiPassThruComponentName;
113
114 //
115 // ATAPI Command op code
116 //
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
137 #define OP_SCAN 0xba
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
143
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
150
151 //
152 // ATA Command
153 //
154 #define ATAPI_SOFT_RESET_CMD 0x08
155
156 typedef enum {
157 DataIn = 0,
158 DataOut = 1,
159 NoData = 2,
160 End = 0xff
161 } DATA_DIRECTION;
162
163 typedef struct {
164 UINT8 OpCode;
165 DATA_DIRECTION Direction;
166 } SCSI_COMMAND_SET;
167
168 #define MAX_CHANNEL 2
169
170 #define ValidCdbLength(Len) ((Len) == 6 || (Len) == 10 || (Len) == 12) ? 1 : 0
171
172 //
173 // IDE registers bit definitions
174 //
175 // ATA Err Reg bitmap
176 //
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
185
186 //
187 // ATAPI Err Reg bitmap
188 //
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
192
193 //
194 // Device/Head Reg
195 //
196 #define LBA_MODE bit (6)
197 #define DEV bit (4)
198 #define HS3 bit (3)
199 #define HS2 bit (2)
200 #define HS1 bit (1)
201 #define HS0 bit (0)
202 #define CHS_MODE (0)
203 #define DRV0 (0)
204 #define DRV1 (1)
205 #define MST_DRV DRV0
206 #define SLV_DRV DRV1
207
208 //
209 // Status Reg
210 //
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
220
221 //
222 // Device Control Reg
223 //
224 #define SRST bit (2) ///< Software Reset
225 #define IEN_L bit (1) ///< Interrupt Enable
226
227 //
228 // ATAPI Feature Register
229 //
230 #define OVERLAP bit (1)
231 #define DMA bit (0)
232
233 //
234 // ATAPI Interrupt Reason Reson Reg (ATA Sector Count Register)
235 //
236 #define RELEASE bit (2)
237 #define IO bit (1)
238 #define CoD bit (0)
239
240 #define PACKET_CMD 0xA0
241
242 #define DEFAULT_CMD (0xa0)
243 //
244 // default content of device control register, disable INT
245 //
246 #define DEFAULT_CTL (0x0a)
247 #define MAX_ATAPI_BYTE_COUNT (0xfffe)
248
249 //
250 // function prototype
251 //
252
253 EFI_STATUS
254 EFIAPI
255 AtapiScsiPassThruDriverBindingSupported (
256 IN EFI_DRIVER_BINDING_PROTOCOL *This,
257 IN EFI_HANDLE Controller,
258 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
259 );
260
261 EFI_STATUS
262 EFIAPI
263 AtapiScsiPassThruDriverBindingStart (
264 IN EFI_DRIVER_BINDING_PROTOCOL *This,
265 IN EFI_HANDLE Controller,
266 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
267 );
268
269 EFI_STATUS
270 EFIAPI
271 AtapiScsiPassThruDriverBindingStop (
272 IN EFI_DRIVER_BINDING_PROTOCOL *This,
273 IN EFI_HANDLE Controller,
274 IN UINTN NumberOfChildren,
275 IN EFI_HANDLE *ChildHandleBuffer
276 );
277
278 //
279 // EFI Component Name Functions
280 //
281 EFI_STATUS
282 EFIAPI
283 AtapiScsiPassThruComponentNameGetDriverName (
284 IN EFI_COMPONENT_NAME_PROTOCOL *This,
285 IN CHAR8 *Language,
286 OUT CHAR16 **DriverName
287 );
288
289 EFI_STATUS
290 EFIAPI
291 AtapiScsiPassThruComponentNameGetControllerName (
292 IN EFI_COMPONENT_NAME_PROTOCOL *This,
293 IN EFI_HANDLE ControllerHandle,
294 IN EFI_HANDLE ChildHandle OPTIONAL,
295 IN CHAR8 *Language,
296 OUT CHAR16 **ControllerName
297 );
298
299 /**
300 AtapiScsiPassThruDriverEntryPoint
301
302 @param ImageHandle
303 @param SystemTable
304
305 @todo Add function description
306 @todo ImageHandle - add argument description
307 @todo SystemTable - add argument description
308 @todo add return values
309 --*/
310 EFI_STATUS
311 EFIAPI
312 AtapiScsiPassThruDriverEntryPoint (
313 IN EFI_HANDLE ImageHandle,
314 IN EFI_SYSTEM_TABLE *SystemTable
315 )
316 ;
317
318 /**
319 RegisterAtapiScsiPassThru
320
321 @param This
322 @param Controller
323 @param PciIo
324
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
330 **/
331 EFI_STATUS
332 RegisterAtapiScsiPassThru (
333 IN EFI_DRIVER_BINDING_PROTOCOL *This,
334 IN EFI_HANDLE Controller,
335 IN EFI_PCI_IO_PROTOCOL *PciIo
336 )
337 ;
338
339 /**
340 AtapiScsiPassThruFunction
341
342 @param This
343 @param Target
344 @param Lun
345 @param Packet
346 @param Event
347
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
355 **/
356 EFI_STATUS
357 EFIAPI
358 AtapiScsiPassThruFunction (
359 IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
360 IN UINT32 Target,
361 IN UINT64 Lun,
362 IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
363 IN EFI_EVENT Event OPTIONAL
364 )
365 ;
366
367 /**
368 AtapiScsiPassThruGetNextDevice
369
370 TODO: Add function description
371
372 @param This TODO: add argument description
373 @param Target TODO: add argument description
374 @param Lun TODO: add argument description
375
376 TODO: add return values
377
378 **/
379 EFI_STATUS
380 EFIAPI
381 AtapiScsiPassThruGetNextDevice (
382 IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
383 IN OUT UINT32 *Target,
384 IN OUT UINT64 *Lun
385 )
386 ;
387
388 /**
389 AtapiScsiPassThruBuildDevicePath
390
391 TODO: Add function description
392
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
397
398 TODO: add return values
399
400 **/
401 EFI_STATUS
402 EFIAPI
403 AtapiScsiPassThruBuildDevicePath (
404 IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
405 IN UINT32 Target,
406 IN UINT64 Lun,
407 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
408 )
409 ;
410
411 /**
412 AtapiScsiPassThruGetTargetLun
413
414 TODO: Add function description
415
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
420
421 TODO: add return values
422
423 **/
424 EFI_STATUS
425 EFIAPI
426 AtapiScsiPassThruGetTargetLun (
427 IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
428 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
429 OUT UINT32 *Target,
430 OUT UINT64 *Lun
431 )
432 ;
433
434 /**
435 AtapiScsiPassThruResetChannel
436
437 TODO: Add function description
438
439 @param This TODO: add argument description
440
441 TODO: add return values
442
443 **/
444 EFI_STATUS
445 EFIAPI
446 AtapiScsiPassThruResetChannel (
447 IN EFI_SCSI_PASS_THRU_PROTOCOL *This
448 )
449 ;
450
451 /**
452 AtapiScsiPassThruResetTarget
453
454 TODO: Add function description
455
456 @param This TODO: add argument description
457 @param Target TODO: add argument description
458 @param Lun TODO: add argument description
459
460 TODO: add return values
461
462 **/
463 EFI_STATUS
464 EFIAPI
465 AtapiScsiPassThruResetTarget (
466 IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
467 IN UINT32 Target,
468 IN UINT64 Lun
469 )
470 ;
471
472 /**
473 CheckSCSIRequestPacket
474
475 TODO: Add function description
476
477 @param Packet TODO: add argument description
478
479 TODO: add return values
480
481 **/
482 EFI_STATUS
483 CheckSCSIRequestPacket (
484 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
485 )
486 ;
487
488 /**
489 SubmitBlockingIoCommand
490
491 TODO: Add function description
492
493 @param AtapiScsiPrivate TODO: add argument description
494 @param Target TODO: add argument description
495 @param Packet TODO: add argument description
496
497 TODO: add return values
498
499 **/
500 EFI_STATUS
501 SubmitBlockingIoCommand (
502 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
503 UINT32 Target,
504 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
505 )
506 ;
507
508 /**
509 IsCommandValid
510
511 TODO: Add function description
512
513 @param Packet - TODO: add argument description
514
515 @return TODO: add return values
516
517 --*/
518 BOOLEAN
519 IsCommandValid (
520 EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
521 )
522 ;
523
524 /**
525 RequestSenseCommand
526
527 TODO: Add function description
528
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
534
535 TODO: add return values
536
537 **/
538 EFI_STATUS
539 RequestSenseCommand (
540 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
541 UINT32 Target,
542 UINT64 Timeout,
543 VOID *SenseData,
544 UINT8 *SenseDataLength
545 )
546 ;
547
548 /**
549 AtapiPacketCommand
550
551 TODO: Add function description
552
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
560
561 TODO: add return values
562
563 **/
564 EFI_STATUS
565 AtapiPacketCommand (
566 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
567 UINT32 Target,
568 UINT8 *PacketCommand,
569 VOID *Buffer,
570 UINT32 *ByteCount,
571 DATA_DIRECTION Direction,
572 UINT64 TimeOutInMicroSeconds
573 )
574 ;
575
576
577 /**
578 ReadPortB
579
580 TODO: Add function description
581
582 @param PciIo TODO: add argument description
583 @param Port TODO: add argument description
584
585 TODO: add return values
586
587 **/
588 UINT8
589 ReadPortB (
590 IN EFI_PCI_IO_PROTOCOL *PciIo,
591 IN UINT16 Port
592 )
593 ;
594
595
596 /**
597 ReadPortW
598
599 TODO: Add function description
600
601 @param PciIo TODO: add argument description
602 @param Port TODO: add argument description
603
604 TODO: add return values
605
606 **/
607 UINT16
608 ReadPortW (
609 IN EFI_PCI_IO_PROTOCOL *PciIo,
610 IN UINT16 Port
611 )
612 ;
613
614
615 /**
616 WritePortB
617
618 TODO: Add function description
619
620 @param PciIo TODO: add argument description
621 @param Port TODO: add argument description
622 @param Data TODO: add argument description
623
624 TODO: add return values
625
626 **/
627 VOID
628 WritePortB (
629 IN EFI_PCI_IO_PROTOCOL *PciIo,
630 IN UINT16 Port,
631 IN UINT8 Data
632 )
633 ;
634
635
636 /**
637 WritePortW
638
639 TODO: Add function description
640
641 @param PciIo TODO: add argument description
642 @param Port TODO: add argument description
643 @param Data TODO: add argument description
644
645 TODO: add return values
646
647 **/
648 VOID
649 WritePortW (
650 IN EFI_PCI_IO_PROTOCOL *PciIo,
651 IN UINT16 Port,
652 IN UINT16 Data
653 )
654 ;
655
656 /**
657 StatusDRQClear
658
659 TODO: Add function description
660
661 @param AtapiScsiPrivate TODO: add argument description
662 @param TimeOutInMicroSeconds TODO: add argument description
663
664 TODO: add return values
665
666 **/
667 EFI_STATUS
668 StatusDRQClear (
669 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
670 UINT64 TimeOutInMicroSeconds
671 )
672 ;
673
674 /**
675 AltStatusDRQClear
676
677 TODO: Add function description
678
679 @param AtapiScsiPrivate TODO: add argument description
680 @param TimeOutInMicroSeconds TODO: add argument description
681
682 TODO: add return values
683
684 **/
685 EFI_STATUS
686 AltStatusDRQClear (
687 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
688 UINT64 TimeOutInMicroSeconds
689 )
690 ;
691
692 /**
693 StatusDRQReady
694
695 TODO: Add function description
696
697 @param AtapiScsiPrivate TODO: add argument description
698 @param TimeOutInMicroSeconds TODO: add argument description
699
700 TODO: add return values
701
702 **/
703 EFI_STATUS
704 StatusDRQReady (
705 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
706 UINT64 TimeOutInMicroSeconds
707 )
708 ;
709
710 /**
711 AltStatusDRQReady
712
713 TODO: Add function description
714
715 @param AtapiScsiPrivate TODO: add argument description
716 @param TimeOutInMicroSeconds TODO: add argument description
717
718 TODO: add return values
719
720 **/
721 EFI_STATUS
722 AltStatusDRQReady (
723 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
724 UINT64 TimeOutInMicroSeconds
725 )
726 ;
727
728 /**
729 TODO: Add function description
730
731 @param AtapiScsiPrivate TODO: add argument description
732 @param TimeoutInMicroSeconds TODO: add argument description
733
734 TODO: add return values
735
736 **/
737 EFI_STATUS
738 StatusWaitForBSYClear (
739 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
740 UINT64 TimeoutInMicroSeconds
741 )
742 ;
743
744 /**
745 TODO: Add function description
746
747 @param AtapiScsiPrivate TODO: add argument description
748 @param TimeoutInMicroSeconds TODO: add argument description
749
750 TODO: add return values
751
752 **/
753 EFI_STATUS
754 AltStatusWaitForBSYClear (
755 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
756 UINT64 TimeoutInMicroSeconds
757 )
758 ;
759
760 /**
761 TODO: Add function description
762
763 @param AtapiScsiPrivate TODO: add argument description
764 @param TimeoutInMicroSeconds TODO: add argument description
765
766 TODO: add return values
767
768 **/
769 EFI_STATUS
770 StatusDRDYReady (
771 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
772 UINT64 TimeoutInMicroSeconds
773 )
774 ;
775
776 /**
777 TODO: Add function description
778
779 @param AtapiScsiPrivate TODO: add argument description
780 @param TimeoutInMicroSeconds TODO: add argument description
781
782 TODO: add return values
783
784 **/
785 EFI_STATUS
786 AltStatusDRDYReady (
787 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
788 UINT64 TimeoutInMicroSeconds
789 )
790 ;
791
792 /**
793 TODO: Add function description
794
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
800
801 TODO: add return values
802
803 **/
804 EFI_STATUS
805 AtapiPassThruPioReadWriteData (
806 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
807 UINT16 *Buffer,
808 UINT32 *ByteCount,
809 DATA_DIRECTION Direction,
810 UINT64 TimeOutInMicroSeconds
811 )
812 ;
813
814 /**
815 TODO: Add function description
816
817 @param AtapiScsiPrivate TODO: add argument description
818
819 TODO: add return values
820
821 **/
822 EFI_STATUS
823 AtapiPassThruCheckErrorStatus (
824 ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate
825 )
826 ;
827 #endif