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