/** @file Include file for ISA Floppy Driver Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _ISA_FLOPPY_H_ #define _ISA_FLOPPY_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern EFI_DRIVER_BINDING_PROTOCOL gFdcControllerDriver; #define STALL_1_SECOND 1000000 #define STALL_1_MSECOND 1000 #define DATA_IN 1 #define DATA_OUT 0 #define READ 0 #define WRITE 1 // // Internal Data Structures // #define FDC_BLK_IO_DEV_SIGNATURE SIGNATURE_32 ('F', 'B', 'I', 'O') #define FLOPPY_CONTROLLER_CONTEXT_SIGNATURE SIGNATURE_32 ('F', 'D', 'C', 'C') typedef enum { FdcDisk0 = 0, FdcDisk1 = 1, FdcMaxDisk = 2 } EFI_FDC_DISK; typedef struct { UINT32 Signature; LIST_ENTRY Link; BOOLEAN FddResetPerformed; EFI_STATUS FddResetStatus; BOOLEAN NeedRecalibrate; UINT8 NumberOfDrive; UINT16 BaseAddress; } FLOPPY_CONTROLLER_CONTEXT; typedef struct { UINTN Signature; EFI_HANDLE Handle; EFI_BLOCK_IO_PROTOCOL BlkIo; EFI_BLOCK_IO_MEDIA BlkMedia; EFI_ISA_IO_PROTOCOL *IsaIo; UINT16 BaseAddress; EFI_FDC_DISK Disk; UINT8 PresentCylinderNumber; UINT8 *Cache; EFI_EVENT Event; EFI_UNICODE_STRING_TABLE *ControllerNameTable; FLOPPY_CONTROLLER_CONTEXT *ControllerState; EFI_DEVICE_PATH_PROTOCOL *DevicePath; } FDC_BLK_IO_DEV; #include "ComponentName.h" #define FDD_BLK_IO_FROM_THIS(a) CR (a, FDC_BLK_IO_DEV, BlkIo, FDC_BLK_IO_DEV_SIGNATURE) #define FLOPPY_CONTROLLER_FROM_LIST_ENTRY(a) \ CR (a, \ FLOPPY_CONTROLLER_CONTEXT, \ Link, \ FLOPPY_CONTROLLER_CONTEXT_SIGNATURE \ ) #define DISK_1440K_EOT 0x12 #define DISK_1440K_GPL 0x1b #define DISK_1440K_DTL 0xff #define DISK_1440K_NUMBER 0x02 #define DISK_1440K_MAXTRACKNUM 0x4f #define DISK_1440K_BYTEPERSECTOR 512 typedef struct { UINT8 CommandCode; UINT8 DiskHeadSel; UINT8 Cylinder; UINT8 Head; UINT8 Sector; UINT8 Number; UINT8 EndOfTrack; UINT8 GapLength; UINT8 DataLength; } FDD_COMMAND_PACKET1; typedef struct { UINT8 CommandCode; UINT8 DiskHeadSel; } FDD_COMMAND_PACKET2; typedef struct { UINT8 CommandCode; UINT8 SrtHut; UINT8 HltNd; } FDD_SPECIFY_CMD; typedef struct { UINT8 CommandCode; UINT8 DiskHeadSel; UINT8 NewCylinder; } FDD_SEEK_CMD; typedef struct { UINT8 CommandCode; UINT8 DiskHeadSel; UINT8 Cylinder; UINT8 Head; UINT8 Sector; UINT8 EndOfTrack; UINT8 GapLength; UINT8 ScanTestPause; } FDD_SCAN_CMD; typedef struct { UINT8 Status0; UINT8 Status1; UINT8 Status2; UINT8 Cylinder; UINT8 Head; UINT8 Sector; UINT8 Number; } FDD_RESULT_PACKET; // // FDC Registers // // // Digital Output Register address offset // #define FDC_REGISTER_DOR 2 // // Main Status Register address offset // #define FDC_REGISTER_MSR 4 // // Data Register address offset // #define FDC_REGISTER_DTR 5 // // Configuration Control Register(data rate select) address offset // #define FDC_REGISTER_CCR 7 // // Digital Input Register(diskchange) address offset // #define FDC_REGISTER_DIR 7 // // FDC Register Bit Definitions // // // Digital Out Register(WO) // // // Select Drive: 0=A 1=B // #define SELECT_DRV BIT0 // // Reset FDC // #define RESET_FDC BIT2 // // Enable Int & DMA // #define INT_DMA_ENABLE BIT3 // // Turn On Drive A Motor // #define DRVA_MOTOR_ON BIT4 // // Turn On Drive B Motor // #define DRVB_MOTOR_ON BIT5 // // Main Status Register(RO) // // // Drive A Busy // #define MSR_DAB BIT0 // // Drive B Busy // #define MSR_DBB BIT1 // // FDC Busy // #define MSR_CB BIT4 // // Non-DMA Mode // #define MSR_NDM BIT5 // // Data Input/Output // #define MSR_DIO BIT6 // // Request For Master // #define MSR_RQM BIT7 // // Configuration Control Register(WO) // // // Data Rate select // #define CCR_DRC (BIT0 | BIT1) // // Digital Input Register(RO) // // // Disk change line // #define DIR_DCL BIT7 // // #define CCR_DCL BIT7 // Diskette change // // 500K // #define DRC_500KBS 0x0 // // 300K // #define DRC_300KBS 0x01 // // 250K // #define DRC_250KBS 0x02 // // FDC Command Code // #define READ_DATA_CMD 0x06 #define WRITE_DATA_CMD 0x05 #define WRITE_DEL_DATA_CMD 0x09 #define READ_DEL_DATA_CMD 0x0C #define READ_TRACK_CMD 0x02 #define READ_ID_CMD 0x0A #define FORMAT_TRACK_CMD 0x0D #define SCAN_EQU_CMD 0x11 #define SCAN_LOW_EQU_CMD 0x19 #define SCAN_HIGH_EQU_CMD 0x1D #define SEEK_CMD 0x0F #define RECALIBRATE_CMD 0x07 #define SENSE_INT_STATUS_CMD 0x08 #define SPECIFY_CMD 0x03 #define SENSE_DRV_STATUS_CMD 0x04 // // CMD_MT: Multi_Track Selector // when set , this flag selects the multi-track operating mode. // In this mode, the FDC treats a complete cylinder under head0 and 1 // as a single track // #define CMD_MT BIT7 // // CMD_MFM: MFM/FM Mode Selector // A one selects the double density(MFM) mode // A zero selects single density (FM) mode // #define CMD_MFM BIT6 // // CMD_SK: Skip Flag // When set to 1, sectors containing a deleted data address mark will // automatically be skipped during the execution of Read Data. // When set to 0, the sector is read or written the same as the read and // write commands. // #define CMD_SK BIT5 // // FDC Status Register Bit Definitions // // // Status Register 0 // // // Interrupt Code // #define STS0_IC (BIT7 | BIT6) // // Seek End: the FDC completed a seek or recalibrate command // #define STS0_SE BIT5 // // Equipment Check // #define STS0_EC BIT4 // // Not Ready(unused), this bit is always 0 // #define STS0_NR BIT3 // // Head Address: the current head address // #define STS0_HA BIT2 // // STS0_US1 & STS0_US0: Drive Select(the current selected drive) // // // Unit Select1 // #define STS0_US1 BIT1 // // Unit Select0 // #define STS0_US0 BIT0 // // Status Register 1 // // // End of Cylinder // #define STS1_EN BIT7 // // BIT6 is unused // // // Data Error: The FDC detected a CRC error in either the ID field or // data field of a sector // #define STS1_DE BIT5 // // Overrun/Underrun: Becomes set if FDC does not receive CPU or DMA service // within the required time interval // #define STS1_OR BIT4 // // BIT3 is unused // // // No data // #define STS1_ND BIT2 // // Not Writable // #define STS1_NW BIT1 // // Missing Address Mark // #define STS1_MA BIT0 // // Control Mark // #define STS2_CM BIT6 // // Data Error in Data Field: The FDC detected a CRC error in the data field // #define STS2_DD BIT5 // // Wrong Cylinder: The track address from sector ID field is different from // the track address maintained inside FDC // #define STS2_WC BIT4 // // Bad Cylinder // #define STS2_BC BIT1 // // Missing Address Mark in Data Field // #define STS2_MD BIT0 // // Write Protected // #define STS3_WP BIT6 // // Track 0 // #define STS3_T0 BIT4 // // Head Address // #define STS3_HD BIT2 // // STS3_US1 & STS3_US0 : Drive Select // #define STS3_US1 BIT1 #define STS3_US0 BIT0 // // Status Register 0 Interrupt Code Description // // // Normal Termination of Command // #define IC_NT 0x0 // // Abnormal Termination of Command // #define IC_AT 0x40 // // Invalid Command // #define IC_IC 0x80 // // Abnormal Termination caused by Polling // #define IC_ATRC 0xC0 // // EFI Driver Binding Protocol Functions // /** Test controller is a floppy disk drive device @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. @param[in] Controller The handle of the controller to test. @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. @retval EFI_SUCCESS The device is supported by this driver. @retval EFI_ALREADY_STARTED The device is already being managed by this driver. @retval EFI_ACCESS_DENIED The device is already being managed by a different driver or an application that requires exclusive access. **/ EFI_STATUS EFIAPI FdcControllerDriverSupported ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ); /** Start this driver on Controller. @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. @param[in] ControllerHandle The handle of the controller to start. This handle must support a protocol interface that supplies an I/O abstraction to the driver. @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This parameter is ignored by device drivers, and is optional for bus drivers. @retval EFI_SUCCESS The device was started. @retval EFI_DEVICE_ERROR The device could not be started due to a device error. Currently not implemented. @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. @retval Others The driver failded to start the device. **/ EFI_STATUS EFIAPI FdcControllerDriverStart ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ); /** Stop this driver on ControllerHandle. @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. @param[in] ControllerHandle A handle to the device being stopped. The handle must support a bus specific I/O protocol for the driver to use to stop the device. @param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer. @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL if NumberOfChildren is 0. @retval EFI_SUCCESS The device was stopped. @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. **/ EFI_STATUS EFIAPI FdcControllerDriverStop ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer ); // // EFI Block I/O Protocol Functions // /** Reset the Floppy Logic Drive, call the FddReset function. @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface @param ExtendedVerification BOOLEAN: Indicate that the driver may perform a more exhaustive verification operation of the device during reset, now this par is ignored in this driver @retval EFI_SUCCESS: The Floppy Logic Drive is reset @retval EFI_DEVICE_ERROR: The Floppy Logic Drive is not functioning correctly and can not be reset **/ EFI_STATUS EFIAPI FdcReset ( IN EFI_BLOCK_IO_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); /** Flush block via fdd controller. @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface @return EFI_SUCCESS **/ EFI_STATUS EFIAPI FddFlushBlocks ( IN EFI_BLOCK_IO_PROTOCOL *This ); /** Read the requested number of blocks from the device. @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface @param MediaId UINT32: The media id that the read request is for @param Lba EFI_LBA: The starting logic block address to read from on the device @param BufferSize UINTN: The size of the Buffer in bytes @param Buffer VOID *: A pointer to the destination buffer for the data @retval EFI_SUCCESS: The data was read correctly from the device @retval EFI_DEVICE_ERROR:The device reported an error while attempting to perform the read operation @retval EFI_NO_MEDIA: There is no media in the device @retval EFI_MEDIA_CHANGED: The MediaId is not for the current media @retval EFI_BAD_BUFFER_SIZE: The BufferSize parameter is not a multiple of the intrinsic block size of the device @retval EFI_INVALID_PARAMETER:The read request contains LBAs that are not valid, or the buffer is not on proper alignment **/ EFI_STATUS EFIAPI FddReadBlocks ( IN EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSize, OUT VOID *Buffer ); /** Write a specified number of blocks to the device. @param This EFI_BLOCK_IO *: A pointer to the Block I/O protocol interface @param MediaId UINT32: The media id that the write request is for @param Lba EFI_LBA: The starting logic block address to be written @param BufferSize UINTN: The size in bytes in Buffer @param Buffer VOID *: A pointer to the source buffer for the data @retval EFI_SUCCESS: The data were written correctly to the device @retval EFI_WRITE_PROTECTED: The device can not be written to @retval EFI_NO_MEDIA: There is no media in the device @retval EFI_MEDIA_CHANGED: The MediaId is not for the current media @retval EFI_DEVICE_ERROR: The device reported an error while attempting to perform the write operation @retval EFI_BAD_BUFFER_SIZE: The BufferSize parameter is not a multiple of the intrinsic block size of the device @retval EFI_INVALID_PARAMETER:The write request contains LBAs that are not valid, or the buffer is not on proper alignment **/ EFI_STATUS EFIAPI FddWriteBlocks ( IN EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSize, IN VOID *Buffer ); // // Prototypes of internal functions // /** Detect the floppy drive is presented or not. @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV @retval EFI_SUCCESS Drive is presented @retval EFI_NOT_FOUND Drive is not presented **/ EFI_STATUS DiscoverFddDevice ( IN FDC_BLK_IO_DEV *FdcDev ); /** Do recalibrate and see the drive is presented or not. Set the media parameters. @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV @return the drive is presented or not **/ EFI_STATUS FddIdentify ( IN FDC_BLK_IO_DEV *FdcDev ); /** Reset the Floppy Logic Drive. @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV @retval EFI_SUCCESS: The Floppy Logic Drive is reset @retval EFI_DEVICE_ERROR: The Floppy Logic Drive is not functioning correctly and can not be reset **/ EFI_STATUS FddReset ( IN FDC_BLK_IO_DEV *FdcDev ); /** Turn the drive's motor on. The drive's motor must be on before any command can be executed. @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV @retval EFI_SUCCESS: Turn the drive's motor on successfully @retval EFI_DEVICE_ERROR: The drive is busy, so can not turn motor on @retval EFI_INVALID_PARAMETER: Fail to Set timer(Cancel timer) **/ EFI_STATUS MotorOn ( IN FDC_BLK_IO_DEV *FdcDev ); /** Set a Timer and when Timer goes off, turn the motor off. @param FdcDev FDC_BLK_IO_DEV * : A pointer to the Data Structure FDC_BLK_IO_DEV @retval EFI_SUCCESS: Set the Timer successfully @retval EFI_INVALID_PARAMETER: Fail to Set the timer **/ EFI_STATUS MotorOff ( IN FDC_BLK_IO_DEV *FdcDev ); /** Detect the disk in the drive is changed or not. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @retval EFI_SUCCESS: No disk media change @retval EFI_DEVICE_ERROR: Fail to do the recalibrate or seek operation @retval EFI_NO_MEDIA: No disk in the drive @retval EFI_MEDIA_CHANGED: There is a new disk in the drive **/ EFI_STATUS DisketChanged ( IN FDC_BLK_IO_DEV *FdcDev ); /** Do the Specify command, this command sets DMA operation and the initial values for each of the three internal times: HUT, SRT and HLT. @param FdcDev Pointer to instance of FDC_BLK_IO_DEV @retval EFI_SUCCESS: Execute the Specify command successfully @retval EFI_DEVICE_ERROR: Fail to execute the command **/ EFI_STATUS Specify ( IN FDC_BLK_IO_DEV *FdcDev ); /** Set the head of floppy drive to track 0. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @retval EFI_SUCCESS: Execute the Recalibrate operation successfully @retval EFI_DEVICE_ERROR: Fail to execute the Recalibrate operation **/ EFI_STATUS Recalibrate ( IN FDC_BLK_IO_DEV *FdcDev ); /** Set the head of floppy drive to the new cylinder. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @param Lba EFI_LBA : The logic block address want to seek @retval EFI_SUCCESS: Execute the Seek operation successfully @retval EFI_DEVICE_ERROR: Fail to execute the Seek operation **/ EFI_STATUS Seek ( IN FDC_BLK_IO_DEV *FdcDev, IN EFI_LBA Lba ); /** Do the Sense Interrupt Status command, this command resets the interrupt signal. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @param StatusRegister0 UINT8 *: Be used to save Status Register 0 read from FDC @param PresentCylinderNumber UINT8 *: Be used to save present cylinder number read from FDC @retval EFI_SUCCESS: Execute the Sense Interrupt Status command successfully @retval EFI_DEVICE_ERROR: Fail to execute the command **/ EFI_STATUS SenseIntStatus ( IN FDC_BLK_IO_DEV *FdcDev, IN OUT UINT8 *StatusRegister0, IN OUT UINT8 *PresentCylinderNumber ); /** Do the Sense Drive Status command. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @param Lba EFI_LBA : Logic block address @retval EFI_SUCCESS: Execute the Sense Drive Status command successfully @retval EFI_DEVICE_ERROR: Fail to execute the command @retval EFI_WRITE_PROTECTED:The disk is write protected **/ EFI_STATUS SenseDrvStatus ( IN FDC_BLK_IO_DEV *FdcDev, IN EFI_LBA Lba ); /** Update the disk media properties and if necessary reinstall Block I/O interface. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @retval EFI_SUCCESS: Do the operation successfully @retval EFI_DEVICE_ERROR: Fail to the operation **/ EFI_STATUS DetectMedia ( IN FDC_BLK_IO_DEV *FdcDev ); /** Set the data rate and so on. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @retval EFI_SUCCESS success to set the data rate **/ EFI_STATUS Setup ( IN FDC_BLK_IO_DEV *FdcDev ); /** Read or Write a number of blocks in the same cylinder. @param FdcDev A pointer to Data Structure FDC_BLK_IO_DEV @param HostAddress device address @param Lba The starting logic block address to read from on the device @param NumberOfBlocks The number of block wanted to be read or write @param Read Operation type: read or write @retval EFI_SUCCESS Success operate **/ EFI_STATUS ReadWriteDataSector ( IN FDC_BLK_IO_DEV *FdcDev, IN VOID *HostAddress, IN EFI_LBA Lba, IN UINTN NumberOfBlocks, IN BOOLEAN Read ); /** Fill in FDD command's parameter. @param FdcDev Pointer to instance of FDC_BLK_IO_DEV @param Lba The starting logic block address to read from on the device @param Command FDD command **/ VOID FillPara ( IN FDC_BLK_IO_DEV *FdcDev, IN EFI_LBA Lba, IN FDD_COMMAND_PACKET1 *Command ); /** Read result byte from Data Register of FDC. @param FdcDev Pointer to instance of FDC_BLK_IO_DEV @param Pointer Buffer to store the byte read from FDC @retval EFI_SUCCESS Read result byte from FDC successfully @retval EFI_DEVICE_ERROR The FDC is not ready to be read **/ EFI_STATUS DataInByte ( IN FDC_BLK_IO_DEV *FdcDev, OUT UINT8 *Pointer ); /** Write command byte to Data Register of FDC. @param FdcDev Pointer to instance of FDC_BLK_IO_DEV @param Pointer Be used to save command byte written to FDC @retval EFI_SUCCESS: Write command byte to FDC successfully @retval EFI_DEVICE_ERROR: The FDC is not ready to be written **/ EFI_STATUS DataOutByte ( IN FDC_BLK_IO_DEV *FdcDev, IN UINT8 *Pointer ); /** Detect the specified floppy logic drive is busy or not within a period of time. @param FdcDev Indicate it is drive A or drive B @param Timeout The time period for waiting @retval EFI_SUCCESS: The drive and command are not busy @retval EFI_TIMEOUT: The drive or command is still busy after a period time that set by Timeout **/ EFI_STATUS FddWaitForBSYClear ( IN FDC_BLK_IO_DEV *FdcDev, IN UINTN Timeout ); /** Determine whether FDC is ready to write or read. @param FdcDev Pointer to instance of FDC_BLK_IO_DEV @param Dio BOOLEAN: Indicate the FDC is waiting to write or read @param Timeout The time period for waiting @retval EFI_SUCCESS: FDC is ready to write or read @retval EFI_NOT_READY: FDC is not ready within the specified time period **/ EFI_STATUS FddDRQReady ( IN FDC_BLK_IO_DEV *FdcDev, IN BOOLEAN Dio, IN UINTN Timeout ); /** Set FDC control structure's attribute according to result. @param Result Point to result structure @param FdcDev FDC control structure @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value @retval EFI_SUCCESS - GC_TODO: Add description for return value **/ EFI_STATUS CheckResult ( IN FDD_RESULT_PACKET *Result, IN OUT FDC_BLK_IO_DEV *FdcDev ); /** Check the drive status information. @param StatusRegister3 the value of Status Register 3 @retval EFI_SUCCESS The disk is not write protected @retval EFI_WRITE_PROTECTED: The disk is write protected **/ EFI_STATUS CheckStatus3 ( IN UINT8 StatusRegister3 ); /** Calculate the number of block in the same cylinder according to Lba. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @param Lba EFI_LBA: The starting logic block address @param NumberOfBlocks UINTN: The number of blocks @return The number of blocks in the same cylinder which the starting logic block address is Lba **/ UINTN GetTransferBlockCount ( IN FDC_BLK_IO_DEV *FdcDev, IN EFI_LBA Lba, IN UINTN NumberOfBlocks ); /** When the Timer(2s) off, turn the drive's motor off. @param Event EFI_EVENT: Event(the timer) whose notification function is being invoked @param Context VOID *: Pointer to the notification function's context **/ VOID EFIAPI FddTimerProc ( IN EFI_EVENT Event, IN VOID *Context ); /** Read I/O port for FDC. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @param Offset The offset address of port **/ UINT8 FdcReadPort ( IN FDC_BLK_IO_DEV *FdcDev, IN UINT32 Offset ); /** Write I/O port for FDC. @param FdcDev FDC_BLK_IO_DEV *: A pointer to Data Structure FDC_BLK_IO_DEV @param Offset The offset address of port @param Data Value written to port **/ VOID FdcWritePort ( IN FDC_BLK_IO_DEV *FdcDev, IN UINT32 Offset, IN UINT8 Data ); /** Read or Write a number of blocks to floppy device. @param This Pointer to instance of EFI_BLOCK_IO_PROTOCOL @param MediaId The media id of read/write request @param Lba The starting logic block address to read from on the device @param BufferSize The size of the Buffer in bytes @param Operation - GC_TODO: add argument description @param Buffer - GC_TODO: add argument description @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value @retval EFI_SUCCESS - GC_TODO: Add description for return value @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value @retval EFI_NO_MEDIA - GC_TODO: Add description for return value @retval EFI_MEDIA_CHANGED - GC_TODO: Add description for return value @retval EFI_WRITE_PROTECTED - GC_TODO: Add description for return value @retval EFI_BAD_BUFFER_SIZE - GC_TODO: Add description for return value @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value @retval EFI_SUCCESS - GC_TODO: Add description for return value @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value @retval EFI_DEVICE_ERROR - GC_TODO: Add description for return value @retval EFI_SUCCESS - GC_TODO: Add description for return value **/ EFI_STATUS FddReadWriteBlocks ( IN EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSize, IN BOOLEAN Operation, OUT VOID *Buffer ); /** Common interface for free cache. @param FdcDev Pointer of FDC_BLK_IO_DEV instance **/ VOID FdcFreeCache ( IN FDC_BLK_IO_DEV *FdcDev ); #endif