/** @file | |
Private include file for IsaFloppyPei PEIM. | |
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions | |
of the BSD License which accompanies this distribution. The | |
full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#ifndef _RECOVERY_FLOPPY_H_ | |
#define _RECOVERY_FLOPPY_H_ | |
#include <Ppi/BlockIo.h> | |
#include <Library/DebugLib.h> | |
#include <Library/PeimEntryPoint.h> | |
#include <Library/PeiServicesLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/ReportStatusCodeLib.h> | |
#include <Library/TimerLib.h> | |
#include <Library/IoLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/PcdLib.h> | |
#include "Fdc.h" | |
// | |
// Some PC AT Compatible Device definitions | |
// | |
// | |
// 8237 DMA registers | |
// | |
#define R_8237_DMA_BASE_CA_CH0 0x00 | |
#define R_8237_DMA_BASE_CA_CH1 0x02 | |
#define R_8237_DMA_BASE_CA_CH2 0x04 | |
#define R_8237_DMA_BASE_CA_CH3 0xd6 | |
#define R_8237_DMA_BASE_CA_CH5 0xc4 | |
#define R_8237_DMA_BASE_CA_CH6 0xc8 | |
#define R_8237_DMA_BASE_CA_CH7 0xcc | |
#define R_8237_DMA_BASE_CC_CH0 0x01 | |
#define R_8237_DMA_BASE_CC_CH1 0x03 | |
#define R_8237_DMA_BASE_CC_CH2 0x05 | |
#define R_8237_DMA_BASE_CC_CH3 0xd7 | |
#define R_8237_DMA_BASE_CC_CH5 0xc6 | |
#define R_8237_DMA_BASE_CC_CH6 0xca | |
#define R_8237_DMA_BASE_CC_CH7 0xce | |
#define R_8237_DMA_MEM_LP_CH0 0x87 | |
#define R_8237_DMA_MEM_LP_CH1 0x83 | |
#define R_8237_DMA_MEM_LP_CH2 0x81 | |
#define R_8237_DMA_MEM_LP_CH3 0x82 | |
#define R_8237_DMA_MEM_LP_CH5 0x8B | |
#define R_8237_DMA_MEM_LP_CH6 0x89 | |
#define R_8237_DMA_MEM_LP_CH7 0x8A | |
#define R_8237_DMA_COMMAND_CH0_3 0x08 | |
#define R_8237_DMA_COMMAND_CH4_7 0xd0 | |
#define B_8237_DMA_COMMAND_GAP 0x10 | |
#define B_8237_DMA_COMMAND_CGE 0x04 | |
#define R_8237_DMA_STA_CH0_3 0x09 | |
#define R_8237_DMA_STA_CH4_7 0xd2 | |
#define R_8237_DMA_WRSMSK_CH0_3 0x0a | |
#define R_8237_DMA_WRSMSK_CH4_7 0xd4 | |
#define B_8237_DMA_WRSMSK_CMS 0x04 | |
#define R_8237_DMA_CHMODE_CH0_3 0x0b | |
#define R_8237_DMA_CHMODE_CH4_7 0xd6 | |
#define V_8237_DMA_CHMODE_DEMAND 0x00 | |
#define V_8237_DMA_CHMODE_SINGLE 0x40 | |
#define V_8237_DMA_CHMODE_CASCADE 0xc0 | |
#define B_8237_DMA_CHMODE_DECREMENT 0x20 | |
#define B_8237_DMA_CHMODE_INCREMENT 0x00 | |
#define B_8237_DMA_CHMODE_AE 0x10 | |
#define V_8237_DMA_CHMODE_VERIFY 0 | |
#define V_8237_DMA_CHMODE_IO2MEM 0x04 | |
#define V_8237_DMA_CHMODE_MEM2IO 0x08 | |
#define R_8237_DMA_CBPR_CH0_3 0x0c | |
#define R_8237_DMA_CBPR_CH4_7 0xd8 | |
#define R_8237_DMA_MCR_CH0_3 0x0d | |
#define R_8237_DMA_MCR_CH4_7 0xda | |
#define R_8237_DMA_CLMSK_CH0_3 0x0e | |
#define R_8237_DMA_CLMSK_CH4_7 0xdc | |
#define R_8237_DMA_WRMSK_CH0_3 0x0f | |
#define R_8237_DMA_WRMSK_CH4_7 0xde | |
/// | |
/// ISA memory range | |
/// | |
#define ISA_MAX_MEMORY_ADDRESS 0x1000000 | |
// | |
// Macro for time delay & interval | |
// | |
#define STALL_1_SECOND 1000000 | |
#define STALL_1_MSECOND 1000 | |
#define FDC_CHECK_INTERVAL 50 | |
#define FDC_SHORT_DELAY 50 | |
#define FDC_MEDIUM_DELAY 100 | |
#define FDC_LONG_DELAY 4000 | |
#define FDC_RESET_DELAY 2000 | |
#define FDC_RECALIBRATE_DELAY 250000 | |
typedef enum { | |
FdcType360K360K = 0, | |
FdcType360K1200K, | |
FdcType1200K1200K, | |
FdcType720K720K, | |
FdcType720K1440K, | |
FdcType1440K1440K, | |
FdcType720K2880K, | |
FdcType1440K2880K, | |
FdcType2880K2880K | |
} FDC_DISKET_TYPE; | |
typedef struct { | |
UINT8 Register; | |
UINT8 Value; | |
} PEI_DMA_TABLE; | |
typedef struct { | |
UINT8 DevPos; | |
UINT8 Pcn; | |
BOOLEAN MotorOn; | |
BOOLEAN NeedRecalibrate; | |
FDC_DISKET_TYPE Type; | |
EFI_PEI_BLOCK_IO_MEDIA MediaInfo; | |
} PEI_FLOPPY_DEVICE_INFO; | |
#define FDC_BLK_IO_DEV_SIGNATURE SIGNATURE_32 ('F', 'b', 'i', 'o') | |
typedef struct { | |
UINTN Signature; | |
EFI_PEI_RECOVERY_BLOCK_IO_PPI FdcBlkIo; | |
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor; | |
UINTN DeviceCount; | |
PEI_FLOPPY_DEVICE_INFO DeviceInfo[2]; | |
} FDC_BLK_IO_DEV; | |
#define PEI_RECOVERY_FDC_FROM_BLKIO_THIS(a) CR (a, FDC_BLK_IO_DEV, FdcBlkIo, FDC_BLK_IO_DEV_SIGNATURE) | |
// | |
// PEI Recovery Block I/O PPI | |
// | |
/** | |
Get the number of FDC devices. | |
This function implements EFI_PEI_RECOVERY_BLOCK_IO_PPI.GetNumberOfBlockDevices. | |
It get the number of FDC devices in the system. | |
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. | |
@param This Pointer to this PPI instance. | |
@param NumberBlockDevices Pointer to the the number of FDC devices for output. | |
@retval EFI_SUCCESS Number of FDC devices is retrieved successfully. | |
@retval EFI_INVALID_PARAMETER Parameter This is NULL. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
FdcGetNumberOfBlockDevices ( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, | |
OUT UINTN *NumberBlockDevices | |
); | |
/** | |
Get the specified media information. | |
This function implements EFI_PEI_RECOVERY_BLOCK_IO_PPI.GetBlockDeviceMediaInfo. | |
It gets the specified media information. | |
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. | |
@param This Pointer to this PPI instance. | |
@param DeviceIndex Index of FDC device to get information. | |
@param MediaInfo Pointer to the media info buffer for output. | |
@retval EFI_SUCCESS Number of FDC devices is retrieved successfully. | |
@retval EFI_INVALID_PARAMETER Parameter This is NULL. | |
@retval EFI_INVALID_PARAMETER Parameter MediaInfo is NULL. | |
@retval EFI_INVALID_PARAMETER DeviceIndex is not valid. | |
@retval EFI_DEVICE_ERROR FDC device does not exist or has errors. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
FdcGetBlockDeviceMediaInfo ( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, | |
IN UINTN DeviceIndex, | |
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo | |
); | |
/** | |
Get the requested number of blocks from the specified FDC device. | |
This function implements EFI_PEI_RECOVERY_BLOCK_IO_PPI.ReadBlocks. | |
It reads the requested number of blocks from the specified FDC device. | |
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. | |
@param This Pointer to this PPI instance. | |
@param DeviceIndex Index of FDC device to get information. | |
@param StartLba The start LBA to read from. | |
@param BufferSize The size of range to read. | |
@param Buffer Buffer to hold the data read from FDC. | |
@retval EFI_SUCCESS Number of FDC devices is retrieved successfully. | |
@retval EFI_INVALID_PARAMETER Parameter This is NULL. | |
@retval EFI_INVALID_PARAMETER Parameter Buffer is NULL. | |
@retval EFI_INVALID_PARAMETER Parameter BufferSize cannot be divided by block size of FDC device. | |
@retval EFI_NO_MEDIA No media present. | |
@retval EFI_DEVICE_ERROR FDC device has error. | |
@retval Others Fail to read blocks. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
FdcReadBlocks ( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, | |
IN UINTN DeviceIndex, | |
IN EFI_PEI_LBA StartLba, | |
IN UINTN BufferSize, | |
OUT VOID *Buffer | |
); | |
#endif |