]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Bus/Isa/IsaFloppyPei/FloppyPeim.h
IntelFrameworkModulePkg: Add IsaFloppyPei driver
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / IsaFloppyPei / FloppyPeim.h
diff --git a/IntelFrameworkModulePkg/Bus/Isa/IsaFloppyPei/FloppyPeim.h b/IntelFrameworkModulePkg/Bus/Isa/IsaFloppyPei/FloppyPeim.h
new file mode 100644 (file)
index 0000000..6477394
--- /dev/null
@@ -0,0 +1,246 @@
+/** @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