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