30a2d7bf0c3c74f1770f1812d1c80e3f1307b674
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / IsaFloppyDxe / IsaFloppy.h
1 /** @file
2 Include file for ISA Floppy Driver
3
4 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #ifndef _ISA_FLOPPY_H_
16 #define _ISA_FLOPPY_H_
17
18 #include <Uefi.h>
19
20 #include <Protocol/BlockIo.h>
21 #include <Protocol/IsaIo.h>
22 #include <Protocol/DevicePath.h>
23 #include <Guid/StatusCodeDataTypeId.h>
24
25 #include <Library/TimerLib.h>
26 #include <Library/DebugLib.h>
27 #include <Library/UefiDriverEntryPoint.h>
28 #include <Library/BaseLib.h>
29 #include <Library/UefiLib.h>
30 #include <Library/BaseMemoryLib.h>
31 #include <Library/MemoryAllocationLib.h>
32 #include <Library/UefiBootServicesTableLib.h>
33 #include <Library/ReportStatusCodeLib.h>
34 #include <Library/PcdLib.h>
35
36 extern EFI_DRIVER_BINDING_PROTOCOL gFdcControllerDriver;
37
38 #define STALL_1_SECOND 1000000
39 #define STALL_1_MSECOND 1000
40
41 #define DATA_IN 1
42 #define DATA_OUT 0
43 #define READ 0
44 #define WRITE 1
45
46 //
47 // Internal Data Structures
48 //
49 #define FDC_BLK_IO_DEV_SIGNATURE SIGNATURE_32 ('F', 'B', 'I', 'O')
50 #define FLOPPY_CONTROLLER_CONTEXT_SIGNATURE SIGNATURE_32 ('F', 'D', 'C', 'C')
51
52 typedef enum {
53 FdcDisk0 = 0,
54 FdcDisk1 = 1,
55 FdcMaxDisk = 2
56 } EFI_FDC_DISK;
57
58 typedef struct {
59 UINT32 Signature;
60 LIST_ENTRY Link;
61 BOOLEAN FddResetPerformed;
62 EFI_STATUS FddResetStatus;
63 BOOLEAN NeedRecalibrate;
64 UINT8 NumberOfDrive;
65 UINT16 BaseAddress;
66 } FLOPPY_CONTROLLER_CONTEXT;
67
68 typedef struct {
69 UINTN Signature;
70 EFI_HANDLE Handle;
71 EFI_BLOCK_IO_PROTOCOL BlkIo;
72 EFI_BLOCK_IO_MEDIA BlkMedia;
73
74 EFI_ISA_IO_PROTOCOL *IsaIo;
75
76 UINT16 BaseAddress;
77
78 EFI_FDC_DISK Disk;
79 UINT8 PresentCylinderNumber;
80 UINT8 *Cache;
81
82 EFI_EVENT Event;
83 EFI_UNICODE_STRING_TABLE *ControllerNameTable;
84 FLOPPY_CONTROLLER_CONTEXT *ControllerState;
85
86 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
87 } FDC_BLK_IO_DEV;
88
89 #include "ComponentName.h"
90
91 #define FDD_BLK_IO_FROM_THIS(a) CR (a, FDC_BLK_IO_DEV, BlkIo, FDC_BLK_IO_DEV_SIGNATURE)
92 #define FLOPPY_CONTROLLER_FROM_LIST_ENTRY(a) \
93 CR (a, \
94 FLOPPY_CONTROLLER_CONTEXT, \
95 Link, \
96 FLOPPY_CONTROLLER_CONTEXT_SIGNATURE \
97 )
98
99 #define DISK_1440K_EOT 0x12
100 #define DISK_1440K_GPL 0x1b
101 #define DISK_1440K_DTL 0xff
102 #define DISK_1440K_NUMBER 0x02
103 #define DISK_1440K_MAXTRACKNUM 0x4f
104 #define DISK_1440K_BYTEPERSECTOR 512
105
106 typedef struct {
107 UINT8 CommandCode;
108 UINT8 DiskHeadSel;
109 UINT8 Cylinder;
110 UINT8 Head;
111 UINT8 Sector;
112 UINT8 Number;
113 UINT8 EndOfTrack;
114 UINT8 GapLength;
115 UINT8 DataLength;
116 } FDD_COMMAND_PACKET1;
117
118 typedef struct {
119 UINT8 CommandCode;
120 UINT8 DiskHeadSel;
121 } FDD_COMMAND_PACKET2;
122
123 typedef struct {
124 UINT8 CommandCode;
125 UINT8 SrtHut;
126 UINT8 HltNd;
127 } FDD_SPECIFY_CMD;
128
129 typedef struct {
130 UINT8 CommandCode;
131 UINT8 DiskHeadSel;
132 UINT8 NewCylinder;
133 } FDD_SEEK_CMD;
134
135 typedef struct {
136 UINT8 CommandCode;
137 UINT8 DiskHeadSel;
138 UINT8 Cylinder;
139 UINT8 Head;
140 UINT8 Sector;
141 UINT8 EndOfTrack;
142 UINT8 GapLength;
143 UINT8 ScanTestPause;
144 } FDD_SCAN_CMD;
145
146 typedef struct {
147 UINT8 Status0;
148 UINT8 Status1;
149 UINT8 Status2;
150 UINT8 Cylinder;
151 UINT8 Head;
152 UINT8 Sector;
153 UINT8 Number;
154 } FDD_RESULT_PACKET;
155
156 //
157 // FDC Registers
158 //
159 //
160 // Digital Output Register address offset
161 //
162 #define FDC_REGISTER_DOR 2
163
164 //
165 // Main Status Register address offset
166 //
167 #define FDC_REGISTER_MSR 4
168
169 //
170 // Data Register address offset
171 //
172 #define FDC_REGISTER_DTR 5
173
174 //
175 // Configuration Control Register(data rate select) address offset
176 //
177 #define FDC_REGISTER_CCR 7
178
179 //
180 // Digital Input Register(diskchange) address offset
181 //
182 #define FDC_REGISTER_DIR 7
183
184
185 //
186 // FDC Register Bit Definitions
187 //
188 //
189 // Digital Out Register(WO)
190 //
191 //
192 // Select Drive: 0=A 1=B
193 //
194 #define SELECT_DRV BIT0
195
196 //
197 // Reset FDC
198 //
199 #define RESET_FDC BIT2
200
201 //
202 // Enable Int & DMA
203 //
204 #define INT_DMA_ENABLE BIT3
205
206 //
207 // Turn On Drive A Motor
208 //
209 #define DRVA_MOTOR_ON BIT4
210
211 //
212 // Turn On Drive B Motor
213 //
214 #define DRVB_MOTOR_ON BIT5
215
216 //
217 // Main Status Register(RO)
218 //
219 //
220 // Drive A Busy
221 //
222 #define MSR_DAB BIT0
223
224 //
225 // Drive B Busy
226 //
227 #define MSR_DBB BIT1
228
229 //
230 // FDC Busy
231 //
232 #define MSR_CB BIT4
233
234 //
235 // Non-DMA Mode
236 //
237 #define MSR_NDM BIT5
238
239 //
240 // Data Input/Output
241 //
242 #define MSR_DIO BIT6
243
244 //
245 // Request For Master
246 //
247 #define MSR_RQM BIT7
248
249 //
250 // Configuration Control Register(WO)
251 //
252 //
253 // Data Rate select
254 //
255 #define CCR_DRC (BIT0 | BIT1)
256
257 //
258 // Digital Input Register(RO)
259 //
260 //
261 // Disk change line
262 //
263 #define DIR_DCL BIT7
264 //
265 // #define CCR_DCL BIT7 // Diskette change
266 //
267 // 500K
268 //
269 #define DRC_500KBS 0x0
270
271 //
272 // 300K
273 //
274 #define DRC_300KBS 0x01
275
276 //
277 // 250K
278 //
279 #define DRC_250KBS 0x02
280
281 //
282 // FDC Command Code
283 //
284 #define READ_DATA_CMD 0x06
285 #define WRITE_DATA_CMD 0x05
286 #define WRITE_DEL_DATA_CMD 0x09
287 #define READ_DEL_DATA_CMD 0x0C
288 #define READ_TRACK_CMD 0x02
289 #define READ_ID_CMD 0x0A
290 #define FORMAT_TRACK_CMD 0x0D
291 #define SCAN_EQU_CMD 0x11
292 #define SCAN_LOW_EQU_CMD 0x19
293 #define SCAN_HIGH_EQU_CMD 0x1D
294 #define SEEK_CMD 0x0F
295 #define RECALIBRATE_CMD 0x07
296 #define SENSE_INT_STATUS_CMD 0x08
297 #define SPECIFY_CMD 0x03
298 #define SENSE_DRV_STATUS_CMD 0x04
299
300 //
301 // CMD_MT: Multi_Track Selector
302 // when set , this flag selects the multi-track operating mode.
303 // In this mode, the FDC treats a complete cylinder under head0 and 1
304 // as a single track
305 //
306 #define CMD_MT BIT7
307
308 //
309 // CMD_MFM: MFM/FM Mode Selector
310 // A one selects the double density(MFM) mode
311 // A zero selects single density (FM) mode
312 //
313 #define CMD_MFM BIT6
314
315 //
316 // CMD_SK: Skip Flag
317 // When set to 1, sectors containing a deleted data address mark will
318 // automatically be skipped during the execution of Read Data.
319 // When set to 0, the sector is read or written the same as the read and
320 // write commands.
321 //
322 #define CMD_SK BIT5
323
324 //
325 // FDC Status Register Bit Definitions
326 //
327 //
328 // Status Register 0
329 //
330 //
331 // Interrupt Code
332 //
333 #define STS0_IC (BIT7 | BIT6)
334
335 //
336 // Seek End: the FDC completed a seek or recalibrate command
337 //
338 #define STS0_SE BIT5
339
340 //
341 // Equipment Check
342 //
343 #define STS0_EC BIT4
344
345 //
346 // Not Ready(unused), this bit is always 0
347 //
348 #define STS0_NR BIT3
349
350 //
351 // Head Address: the current head address
352 //
353 #define STS0_HA BIT2
354
355 //
356 // STS0_US1 & STS0_US0: Drive Select(the current selected drive)
357 //
358 //
359 // Unit Select1
360 //
361 #define STS0_US1 BIT1
362
363 //
364 // Unit Select0
365 //
366 #define STS0_US0 BIT0
367
368 //
369 // Status Register 1
370 //
371 //
372 // End of Cylinder
373 //
374 #define STS1_EN BIT7
375
376 //
377 // BIT6 is unused
378 //
379 //
380 // Data Error: The FDC detected a CRC error in either the ID field or
381 // data field of a sector
382 //
383 #define STS1_DE BIT5
384
385 //
386 // Overrun/Underrun: Becomes set if FDC does not receive CPU or DMA service
387 // within the required time interval
388 //
389 #define STS1_OR BIT4
390
391 //
392 // BIT3 is unused
393 //
394 //
395 // No data
396 //
397 #define STS1_ND BIT2
398
399 //
400 // Not Writable
401 //
402 #define STS1_NW BIT1
403
404 //
405 // Missing Address Mark
406 //
407 #define STS1_MA BIT0
408
409 //
410 // Control Mark
411 //
412 #define STS2_CM BIT6
413
414 //
415 // Data Error in Data Field: The FDC detected a CRC error in the data field
416 //
417 #define STS2_DD BIT5
418
419 //
420 // Wrong Cylinder: The track address from sector ID field is different from
421 // the track address maintained inside FDC
422 //
423 #define STS2_WC BIT4
424
425 //
426 // Bad Cylinder
427 //
428 #define STS2_BC BIT1
429
430 //
431 // Missing Address Mark in Data Field
432 //
433 #define STS2_MD BIT0
434
435 //
436 // Write Protected
437 //
438 #define STS3_WP BIT6
439
440 //
441 // Track 0
442 //
443 #define STS3_T0 BIT4
444
445 //
446 // Head Address
447 //
448 #define STS3_HD BIT2
449
450 //
451 // STS3_US1 & STS3_US0 : Drive Select
452 //
453 #define STS3_US1 BIT1
454 #define STS3_US0 BIT0
455
456 //
457 // Status Register 0 Interrupt Code Description
458 //
459 //
460 // Normal Termination of Command
461 //
462 #define IC_NT 0x0
463
464 //
465 // Abnormal Termination of Command
466 //
467 #define IC_AT 0x40
468
469 //
470 // Invalid Command
471 //
472 #define IC_IC 0x80
473
474 //
475 // Abnormal Termination caused by Polling
476 //
477 #define IC_ATRC 0xC0
478
479 //
480 // EFI Driver Binding Protocol Functions
481 //
482
483 /**
484 Test controller is a floppy disk drive device
485
486 @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
487 @param[in] Controller The handle of the controller to test.
488 @param[in] RemainingDevicePath A pointer to the remaining portion of a device path.
489
490 @retval EFI_SUCCESS The device is supported by this driver.
491 @retval EFI_ALREADY_STARTED The device is already being managed by this driver.
492 @retval EFI_ACCESS_DENIED The device is already being managed by a different driver
493 or an application that requires exclusive access.
494 **/
495 EFI_STATUS
496 EFIAPI
497 FdcControllerDriverSupported (
498 IN EFI_DRIVER_BINDING_PROTOCOL *This,
499 IN EFI_HANDLE Controller,
500 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
501 );
502
503 /**
504 Start this driver on Controller.
505
506 @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
507 @param[in] ControllerHandle The handle of the controller to start. This handle
508 must support a protocol interface that supplies
509 an I/O abstraction to the driver.
510 @param[in] RemainingDevicePath A pointer to the remaining portion of a device path.
511 This parameter is ignored by device drivers, and is optional for bus drivers.
512
513 @retval EFI_SUCCESS The device was started.
514 @retval EFI_DEVICE_ERROR The device could not be started due to a device error.
515 Currently not implemented.
516 @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
517 @retval Others The driver failded to start the device.
518 **/
519 EFI_STATUS
520 EFIAPI
521 FdcControllerDriverStart (
522 IN EFI_DRIVER_BINDING_PROTOCOL *This,
523 IN EFI_HANDLE Controller,
524 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
525 );
526
527 /**
528 Stop this driver on ControllerHandle.
529
530 @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
531 @param[in] ControllerHandle A handle to the device being stopped. The handle must
532 support a bus specific I/O protocol for the driver
533 to use to stop the device.
534 @param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.
535 @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL
536 if NumberOfChildren is 0.
537
538 @retval EFI_SUCCESS The device was stopped.
539 @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
540 **/
541 EFI_STATUS
542 EFIAPI
543 FdcControllerDriverStop (
544 IN EFI_DRIVER_BINDING_PROTOCOL *This,
545 IN EFI_HANDLE Controller,
546 IN UINTN NumberOfChildren,
547 IN EFI_HANDLE *ChildHandleBuffer
548 );
549
550 //
551 // EFI Block I/O Protocol Functions
552 //
553
554 /**
555 Reset the Floppy Logic Drive, call the FddReset function.
556
557 @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface
558 @param ExtendedVerification BOOLEAN: Indicate that the driver may perform a more
559 exhaustive verification operation of the device during
560 reset, now this par is ignored in this driver
561 @retval EFI_SUCCESS: The Floppy Logic Drive is reset
562 @retval EFI_DEVICE_ERROR: The Floppy Logic Drive is not functioning correctly
563 and can not be reset
564
565 **/
566 EFI_STATUS
567 EFIAPI
568 FdcReset (
569 IN EFI_BLOCK_IO_PROTOCOL *This,
570 IN BOOLEAN ExtendedVerification
571 );
572
573 /**
574 Flush block via fdd controller.
575
576 @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface
577 @return EFI_SUCCESS
578
579 **/
580 EFI_STATUS
581 EFIAPI
582 FddFlushBlocks (
583 IN EFI_BLOCK_IO_PROTOCOL *This
584 );
585
586 /**
587 Read the requested number of blocks from the device.
588
589 @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface
590 @param MediaId UINT32: The media id that the read request is for
591 @param Lba EFI_LBA: The starting logic block address to read from on the device
592 @param BufferSize UINTN: The size of the Buffer in bytes
593 @param Buffer VOID *: A pointer to the destination buffer for the data
594
595 @retval EFI_SUCCESS: The data was read correctly from the device
596 @retval EFI_DEVICE_ERROR:The device reported an error while attempting to perform
597 the read operation
598 @retval EFI_NO_MEDIA: There is no media in the device
599 @retval EFI_MEDIA_CHANGED: The MediaId is not for the current media
600 @retval EFI_BAD_BUFFER_SIZE: The BufferSize parameter is not a multiple of the
601 intrinsic block size of the device
602 @retval EFI_INVALID_PARAMETER:The read request contains LBAs that are not valid,
603 or the buffer is not on proper alignment
604
605 **/
606 EFI_STATUS
607 EFIAPI
608 FddReadBlocks (
609 IN EFI_BLOCK_IO_PROTOCOL *This,
610 IN UINT32 MediaId,
611 IN EFI_LBA Lba,
612 IN UINTN BufferSize,
613 OUT VOID *Buffer
614 );
615
616 /**
617 Write a specified number of blocks to the device.
618
619 @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface
620 @param MediaId UINT32: The media id that the write request is for
621 @param Lba EFI_LBA: The starting logic block address to be written
622 @param BufferSize UINTN: The size in bytes in Buffer
623 @param Buffer VOID *: A pointer to the source buffer for the data
624
625 @retval EFI_SUCCESS: The data were written correctly to the device
626 @retval EFI_WRITE_PROTECTED: The device can not be written to
627 @retval EFI_NO_MEDIA: There is no media in the device
628 @retval EFI_MEDIA_CHANGED: The MediaId is not for the current media
629 @retval EFI_DEVICE_ERROR: The device reported an error while attempting to perform
630 the write operation
631 @retval EFI_BAD_BUFFER_SIZE: The BufferSize parameter is not a multiple of the
632 intrinsic block size of the device
633 @retval EFI_INVALID_PARAMETER:The write request contains LBAs that are not valid,
634 or the buffer is not on proper alignment
635 **/
636 EFI_STATUS
637 EFIAPI
638 FddWriteBlocks (
639 IN EFI_BLOCK_IO_PROTOCOL *This,
640 IN UINT32 MediaId,
641 IN EFI_LBA Lba,
642 IN UINTN BufferSize,
643 IN VOID *Buffer
644 );
645
646 //
647 // Prototypes of internal functions
648 //
649 /**
650
651 Detect the floppy drive is presented or not.
652
653 @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV
654 @retval EFI_SUCCESS Drive is presented
655 @retval EFI_NOT_FOUND Drive is not presented
656
657 **/
658 EFI_STATUS
659 DiscoverFddDevice (
660 IN FDC_BLK_IO_DEV *FdcDev
661 );
662
663 /**
664
665 Do recalibrate and see the drive is presented or not.
666 Set the media parameters.
667
668 @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV
669 @return the drive is presented or not
670
671 **/
672 EFI_STATUS
673 FddIdentify (
674 IN FDC_BLK_IO_DEV *FdcDev
675 );
676
677 /**
678
679 Reset the Floppy Logic Drive.
680
681 @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV
682
683 @retval EFI_SUCCESS: The Floppy Logic Drive is reset
684 @retval EFI_DEVICE_ERROR: The Floppy Logic Drive is not functioning correctly and
685 can not be reset
686
687 **/
688 EFI_STATUS
689 FddReset (
690 IN FDC_BLK_IO_DEV *FdcDev
691 );
692
693 /**
694
695 Turn the drive's motor on.
696 The drive's motor must be on before any command can be executed.
697
698 @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV
699
700 @retval EFI_SUCCESS: Turn the drive's motor on successfully
701 @retval EFI_DEVICE_ERROR: The drive is busy, so can not turn motor on
702 @retval EFI_INVALID_PARAMETER: Fail to Set timer(Cancel timer)
703
704 **/
705 EFI_STATUS
706 MotorOn (
707 IN FDC_BLK_IO_DEV *FdcDev
708 );
709
710 /**
711
712 Set a Timer and when Timer goes off, turn the motor off.
713
714
715 @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV
716
717 @retval EFI_SUCCESS: Set the Timer successfully
718 @retval EFI_INVALID_PARAMETER: Fail to Set the timer
719
720 **/
721 EFI_STATUS
722 MotorOff (
723 IN FDC_BLK_IO_DEV *FdcDev
724 );
725
726 /**
727 Detect the disk in the drive is changed or not.
728
729
730 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
731
732 @retval EFI_SUCCESS: No disk media change
733 @retval EFI_DEVICE_ERROR: Fail to do the recalibrate or seek operation
734 @retval EFI_NO_MEDIA: No disk in the drive
735 @retval EFI_MEDIA_CHANGED: There is a new disk in the drive
736 **/
737 EFI_STATUS
738 DisketChanged (
739 IN FDC_BLK_IO_DEV *FdcDev
740 );
741
742 /**
743 Do the Specify command, this command sets DMA operation
744 and the initial values for each of the three internal
745 times: HUT, SRT and HLT.
746
747 @param FdcDev Pointer to instance of FDC_BLK_IO_DEV
748
749 @retval EFI_SUCCESS: Execute the Specify command successfully
750 @retval EFI_DEVICE_ERROR: Fail to execute the command
751
752 **/
753 EFI_STATUS
754 Specify (
755 IN FDC_BLK_IO_DEV *FdcDev
756 );
757
758 /**
759 Set the head of floppy drive to track 0.
760
761 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
762 @retval EFI_SUCCESS: Execute the Recalibrate operation successfully
763 @retval EFI_DEVICE_ERROR: Fail to execute the Recalibrate operation
764
765 **/
766 EFI_STATUS
767 Recalibrate (
768 IN FDC_BLK_IO_DEV *FdcDev
769 );
770
771 /**
772 Set the head of floppy drive to the new cylinder.
773
774 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
775 @param Lba EFI_LBA : The logic block address want to seek
776
777 @retval EFI_SUCCESS: Execute the Seek operation successfully
778 @retval EFI_DEVICE_ERROR: Fail to execute the Seek operation
779
780 **/
781 EFI_STATUS
782 Seek (
783 IN FDC_BLK_IO_DEV *FdcDev,
784 IN EFI_LBA Lba
785 );
786
787 /**
788 Do the Sense Interrupt Status command, this command resets the interrupt signal.
789
790 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
791 @param StatusRegister0 UINT8 *: Be used to save Status Register 0 read from FDC
792 @param PresentCylinderNumber UINT8 *: Be used to save present cylinder number
793 read from FDC
794
795 @retval EFI_SUCCESS: Execute the Sense Interrupt Status command successfully
796 @retval EFI_DEVICE_ERROR: Fail to execute the command
797
798 **/
799 EFI_STATUS
800 SenseIntStatus (
801 IN FDC_BLK_IO_DEV *FdcDev,
802 IN OUT UINT8 *StatusRegister0,
803 IN OUT UINT8 *PresentCylinderNumber
804 );
805
806 /**
807 Do the Sense Drive Status command.
808
809 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
810 @param Lba EFI_LBA : Logic block address
811
812 @retval EFI_SUCCESS: Execute the Sense Drive Status command successfully
813 @retval EFI_DEVICE_ERROR: Fail to execute the command
814 @retval EFI_WRITE_PROTECTED:The disk is write protected
815
816 **/
817 EFI_STATUS
818 SenseDrvStatus (
819 IN FDC_BLK_IO_DEV *FdcDev,
820 IN EFI_LBA Lba
821 );
822
823 /**
824 Update the disk media properties and if necessary reinstall Block I/O interface.
825
826 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
827
828 @retval EFI_SUCCESS: Do the operation successfully
829 @retval EFI_DEVICE_ERROR: Fail to the operation
830
831 **/
832 EFI_STATUS
833 DetectMedia (
834 IN FDC_BLK_IO_DEV *FdcDev
835 );
836
837 /**
838 Set the data rate and so on.
839
840 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
841
842 @retval EFI_SUCCESS success to set the data rate
843 **/
844 EFI_STATUS
845 Setup (
846 IN FDC_BLK_IO_DEV *FdcDev
847 );
848
849 /**
850 Read or Write a number of blocks in the same cylinder.
851
852 @param FdcDev A pointer to Data Structure FDC_BLK_IO_DEV
853 @param HostAddress device address
854 @param Lba The starting logic block address to read from on the device
855 @param NumberOfBlocks The number of block wanted to be read or write
856 @param Read Operation type: read or write
857
858 @retval EFI_SUCCESS Success operate
859
860 **/
861 EFI_STATUS
862 ReadWriteDataSector (
863 IN FDC_BLK_IO_DEV *FdcDev,
864 IN VOID *HostAddress,
865 IN EFI_LBA Lba,
866 IN UINTN NumberOfBlocks,
867 IN BOOLEAN Read
868 );
869
870 /**
871 Fill in FDD command's parameter.
872
873 @param FdcDev Pointer to instance of FDC_BLK_IO_DEV
874 @param Lba The starting logic block address to read from on the device
875 @param Command FDD command
876
877 **/
878 VOID
879 FillPara (
880 IN FDC_BLK_IO_DEV *FdcDev,
881 IN EFI_LBA Lba,
882 IN FDD_COMMAND_PACKET1 *Command
883 );
884
885 /**
886 Read result byte from Data Register of FDC.
887
888 @param FdcDev Pointer to instance of FDC_BLK_IO_DEV
889 @param Pointer Buffer to store the byte read from FDC
890
891 @retval EFI_SUCCESS Read result byte from FDC successfully
892 @retval EFI_DEVICE_ERROR The FDC is not ready to be read
893
894 **/
895 EFI_STATUS
896 DataInByte (
897 IN FDC_BLK_IO_DEV *FdcDev,
898 OUT UINT8 *Pointer
899 );
900
901 /**
902 Write command byte to Data Register of FDC.
903
904 @param FdcDev Pointer to instance of FDC_BLK_IO_DEV
905 @param Pointer Be used to save command byte written to FDC
906
907 @retval EFI_SUCCESS: Write command byte to FDC successfully
908 @retval EFI_DEVICE_ERROR: The FDC is not ready to be written
909
910 **/
911 EFI_STATUS
912 DataOutByte (
913 IN FDC_BLK_IO_DEV *FdcDev,
914 IN UINT8 *Pointer
915 );
916
917 /**
918 Detect the specified floppy logic drive is busy or not within a period of time.
919
920 @param FdcDev Indicate it is drive A or drive B
921 @param Timeout The time period for waiting
922
923 @retval EFI_SUCCESS: The drive and command are not busy
924 @retval EFI_TIMEOUT: The drive or command is still busy after a period time that
925 set by Timeout
926
927 **/
928 EFI_STATUS
929 FddWaitForBSYClear (
930 IN FDC_BLK_IO_DEV *FdcDev,
931 IN UINTN Timeout
932 );
933
934 /**
935 Determine whether FDC is ready to write or read.
936
937 @param FdcDev Pointer to instance of FDC_BLK_IO_DEV
938 @param Dio BOOLEAN: Indicate the FDC is waiting to write or read
939 @param Timeout The time period for waiting
940
941 @retval EFI_SUCCESS: FDC is ready to write or read
942 @retval EFI_NOT_READY: FDC is not ready within the specified time period
943
944 **/
945 EFI_STATUS
946 FddDRQReady (
947 IN FDC_BLK_IO_DEV *FdcDev,
948 IN BOOLEAN Dio,
949 IN UINTN Timeout
950 );
951
952 /**
953 Set FDC control structure's attribute according to result.
954
955 @param Result Point to result structure
956 @param FdcDev FDC control structure
957
958 @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value
959 @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value
960 @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value
961 @retval EFI_SUCCESS - GC_TODO: Add description for return value
962
963 **/
964 EFI_STATUS
965 CheckResult (
966 IN FDD_RESULT_PACKET *Result,
967 IN OUT FDC_BLK_IO_DEV *FdcDev
968 );
969
970 /**
971 Check the drive status information.
972
973 @param StatusRegister3 the value of Status Register 3
974
975 @retval EFI_SUCCESS The disk is not write protected
976 @retval EFI_WRITE_PROTECTED: The disk is write protected
977
978 **/
979 EFI_STATUS
980 CheckStatus3 (
981 IN UINT8 StatusRegister3
982 );
983
984 /**
985 Calculate the number of block in the same cylinder according to Lba.
986
987 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
988 @param Lba EFI_LBA: The starting logic block address
989 @param NumberOfBlocks UINTN: The number of blocks
990
991 @return The number of blocks in the same cylinder which the starting
992 logic block address is Lba
993
994 **/
995 UINTN
996 GetTransferBlockCount (
997 IN FDC_BLK_IO_DEV *FdcDev,
998 IN EFI_LBA Lba,
999 IN UINTN NumberOfBlocks
1000 );
1001
1002 /**
1003 When the Timer(2s) off, turn the drive's motor off.
1004
1005 @param Event EFI_EVENT: Event(the timer) whose notification function is being
1006 invoked
1007 @param Context VOID *: Pointer to the notification function's context
1008
1009 **/
1010 VOID
1011 EFIAPI
1012 FddTimerProc (
1013 IN EFI_EVENT Event,
1014 IN VOID *Context
1015 );
1016
1017 /**
1018 Read I/O port for FDC.
1019
1020 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
1021 @param Offset The offset address of port
1022
1023 **/
1024 UINT8
1025 FdcReadPort (
1026 IN FDC_BLK_IO_DEV *FdcDev,
1027 IN UINT32 Offset
1028 );
1029
1030 /**
1031 Write I/O port for FDC.
1032
1033 @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV
1034 @param Offset The offset address of port
1035 @param Data Value written to port
1036
1037 **/
1038 VOID
1039 FdcWritePort (
1040 IN FDC_BLK_IO_DEV *FdcDev,
1041 IN UINT32 Offset,
1042 IN UINT8 Data
1043 );
1044
1045 /**
1046 Read or Write a number of blocks to floppy device.
1047
1048 @param This Pointer to instance of EFI_BLOCK_IO_PROTOCOL
1049 @param MediaId The media id of read/write request
1050 @param Lba The starting logic block address to read from on the device
1051 @param BufferSize The size of the Buffer in bytes
1052 @param Operation - GC_TODO: add argument description
1053 @param Buffer - GC_TODO: add argument description
1054
1055 @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value
1056 @retval EFI_SUCCESS - GC_TODO: Add description for return value
1057 @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value
1058 @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value
1059 @retval EFI_NO_MEDIA - GC_TODO: Add description for return value
1060 @retval EFI_MEDIA_CHANGED - GC_TODO: Add description for return value
1061 @retval EFI_WRITE_PROTECTED - GC_TODO: Add description for return value
1062 @retval EFI_BAD_BUFFER_SIZE - GC_TODO: Add description for return value
1063 @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value
1064 @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value
1065 @retval EFI_SUCCESS - GC_TODO: Add description for return value
1066 @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value
1067 @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value
1068 @retval EFI_SUCCESS - GC_TODO: Add description for return value
1069
1070 **/
1071 EFI_STATUS
1072 FddReadWriteBlocks (
1073 IN EFI_BLOCK_IO_PROTOCOL *This,
1074 IN UINT32 MediaId,
1075 IN EFI_LBA Lba,
1076 IN UINTN BufferSize,
1077 IN BOOLEAN Operation,
1078 OUT VOID *Buffer
1079 );
1080
1081 /**
1082 Common interface for free cache.
1083
1084 @param FdcDev Pointer of FDC_BLK_IO_DEV instance
1085
1086 **/
1087 VOID
1088 FdcFreeCache (
1089 IN FDC_BLK_IO_DEV *FdcDev
1090 );
1091
1092 #endif
1093