Home | History | Annotate | Download | only in IsaFloppyPei
      1 /** @file
      2 Private include file for IsaFloppyPei PEIM.
      3 
      4 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions
      8 of the BSD License which accompanies this distribution.  The
      9 full text of the license may be found at
     10 http://opensource.org/licenses/bsd-license.php
     11 
     12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 #ifndef _RECOVERY_FLOPPY_H_
     18 #define _RECOVERY_FLOPPY_H_
     19 
     20 #include <Ppi/BlockIo.h>
     21 
     22 #include <Library/DebugLib.h>
     23 #include <Library/PeimEntryPoint.h>
     24 #include <Library/PeiServicesLib.h>
     25 #include <Library/BaseMemoryLib.h>
     26 #include <Library/ReportStatusCodeLib.h>
     27 #include <Library/TimerLib.h>
     28 #include <Library/IoLib.h>
     29 #include <Library/MemoryAllocationLib.h>
     30 #include <Library/PcdLib.h>
     31 
     32 #include "Fdc.h"
     33 
     34 
     35 //
     36 // Some PC AT Compatible Device definitions
     37 //
     38 //
     39 // 8237 DMA registers
     40 //
     41 #define R_8237_DMA_BASE_CA_CH0                    0x00
     42 #define R_8237_DMA_BASE_CA_CH1                    0x02
     43 #define R_8237_DMA_BASE_CA_CH2                    0x04
     44 #define R_8237_DMA_BASE_CA_CH3                    0xd6
     45 #define R_8237_DMA_BASE_CA_CH5                    0xc4
     46 #define R_8237_DMA_BASE_CA_CH6                    0xc8
     47 #define R_8237_DMA_BASE_CA_CH7                    0xcc
     48 
     49 #define R_8237_DMA_BASE_CC_CH0                    0x01
     50 #define R_8237_DMA_BASE_CC_CH1                    0x03
     51 #define R_8237_DMA_BASE_CC_CH2                    0x05
     52 #define R_8237_DMA_BASE_CC_CH3                    0xd7
     53 #define R_8237_DMA_BASE_CC_CH5                    0xc6
     54 #define R_8237_DMA_BASE_CC_CH6                    0xca
     55 #define R_8237_DMA_BASE_CC_CH7                    0xce
     56 
     57 #define R_8237_DMA_MEM_LP_CH0                     0x87
     58 #define R_8237_DMA_MEM_LP_CH1                     0x83
     59 #define R_8237_DMA_MEM_LP_CH2                     0x81
     60 #define R_8237_DMA_MEM_LP_CH3                     0x82
     61 #define R_8237_DMA_MEM_LP_CH5                     0x8B
     62 #define R_8237_DMA_MEM_LP_CH6                     0x89
     63 #define R_8237_DMA_MEM_LP_CH7                     0x8A
     64 
     65 
     66 #define R_8237_DMA_COMMAND_CH0_3                  0x08
     67 #define R_8237_DMA_COMMAND_CH4_7                  0xd0
     68 #define   B_8237_DMA_COMMAND_GAP                  0x10
     69 #define   B_8237_DMA_COMMAND_CGE                  0x04
     70 
     71 
     72 #define R_8237_DMA_STA_CH0_3                      0x09
     73 #define R_8237_DMA_STA_CH4_7                      0xd2
     74 
     75 #define R_8237_DMA_WRSMSK_CH0_3                   0x0a
     76 #define R_8237_DMA_WRSMSK_CH4_7                   0xd4
     77 #define   B_8237_DMA_WRSMSK_CMS                   0x04
     78 
     79 
     80 #define R_8237_DMA_CHMODE_CH0_3                   0x0b
     81 #define R_8237_DMA_CHMODE_CH4_7                   0xd6
     82 #define   V_8237_DMA_CHMODE_DEMAND                0x00
     83 #define   V_8237_DMA_CHMODE_SINGLE                0x40
     84 #define   V_8237_DMA_CHMODE_CASCADE               0xc0
     85 #define   B_8237_DMA_CHMODE_DECREMENT             0x20
     86 #define   B_8237_DMA_CHMODE_INCREMENT             0x00
     87 #define   B_8237_DMA_CHMODE_AE                    0x10
     88 #define   V_8237_DMA_CHMODE_VERIFY                0
     89 #define   V_8237_DMA_CHMODE_IO2MEM                0x04
     90 #define   V_8237_DMA_CHMODE_MEM2IO                0x08
     91 
     92 #define R_8237_DMA_CBPR_CH0_3                     0x0c
     93 #define R_8237_DMA_CBPR_CH4_7                     0xd8
     94 
     95 #define R_8237_DMA_MCR_CH0_3                      0x0d
     96 #define R_8237_DMA_MCR_CH4_7                      0xda
     97 
     98 #define R_8237_DMA_CLMSK_CH0_3                    0x0e
     99 #define R_8237_DMA_CLMSK_CH4_7                    0xdc
    100 
    101 #define R_8237_DMA_WRMSK_CH0_3                    0x0f
    102 #define R_8237_DMA_WRMSK_CH4_7                    0xde
    103 
    104 ///
    105 /// ISA memory range
    106 ///
    107 #define ISA_MAX_MEMORY_ADDRESS  0x1000000
    108 
    109 //
    110 // Macro for time delay & interval
    111 //
    112 #define STALL_1_SECOND           1000000
    113 #define STALL_1_MSECOND          1000
    114 #define FDC_CHECK_INTERVAL       50
    115 
    116 #define FDC_SHORT_DELAY          50
    117 #define FDC_MEDIUM_DELAY         100
    118 #define FDC_LONG_DELAY           4000
    119 #define FDC_RESET_DELAY          2000
    120 #define FDC_RECALIBRATE_DELAY    250000
    121 
    122 typedef enum {
    123   FdcType360K360K  = 0,
    124   FdcType360K1200K,
    125   FdcType1200K1200K,
    126   FdcType720K720K,
    127   FdcType720K1440K,
    128   FdcType1440K1440K,
    129   FdcType720K2880K,
    130   FdcType1440K2880K,
    131   FdcType2880K2880K
    132 } FDC_DISKET_TYPE;
    133 
    134 typedef struct {
    135   UINT8 Register;
    136   UINT8 Value;
    137 } PEI_DMA_TABLE;
    138 
    139 typedef struct {
    140   UINT8                      DevPos;
    141   UINT8                      Pcn;
    142   BOOLEAN                    MotorOn;
    143   BOOLEAN                    NeedRecalibrate;
    144   FDC_DISKET_TYPE            Type;
    145   EFI_PEI_BLOCK_IO_MEDIA     MediaInfo;
    146 } PEI_FLOPPY_DEVICE_INFO;
    147 
    148 #define FDC_BLK_IO_DEV_SIGNATURE  SIGNATURE_32 ('F', 'b', 'i', 'o')
    149 
    150 typedef struct {
    151   UINTN                           Signature;
    152   EFI_PEI_RECOVERY_BLOCK_IO_PPI   FdcBlkIo;
    153   EFI_PEI_PPI_DESCRIPTOR          PpiDescriptor;
    154   UINTN                           DeviceCount;
    155   PEI_FLOPPY_DEVICE_INFO          DeviceInfo[2];
    156 } FDC_BLK_IO_DEV;
    157 
    158 #define PEI_RECOVERY_FDC_FROM_BLKIO_THIS(a) CR (a, FDC_BLK_IO_DEV, FdcBlkIo, FDC_BLK_IO_DEV_SIGNATURE)
    159 
    160 //
    161 // PEI Recovery Block I/O PPI
    162 //
    163 
    164 /**
    165   Get the number of FDC devices.
    166 
    167   This function implements EFI_PEI_RECOVERY_BLOCK_IO_PPI.GetNumberOfBlockDevices.
    168   It get the number of FDC devices in the system.
    169 
    170   @param  PeiServices           An indirect pointer to the PEI Services Table published by the PEI Foundation.
    171   @param  This                  Pointer to this PPI instance.
    172   @param  NumberBlockDevices    Pointer to the the number of FDC devices for output.
    173 
    174   @retval EFI_SUCCESS           Number of FDC devices is retrieved successfully.
    175   @retval EFI_INVALID_PARAMETER Parameter This is NULL.
    176 
    177 **/
    178 EFI_STATUS
    179 EFIAPI
    180 FdcGetNumberOfBlockDevices (
    181   IN   EFI_PEI_SERVICES                  **PeiServices,
    182   IN   EFI_PEI_RECOVERY_BLOCK_IO_PPI     *This,
    183   OUT  UINTN                             *NumberBlockDevices
    184   );
    185 
    186 /**
    187   Get the specified media information.
    188 
    189   This function implements EFI_PEI_RECOVERY_BLOCK_IO_PPI.GetBlockDeviceMediaInfo.
    190   It gets the specified media information.
    191 
    192   @param  PeiServices           An indirect pointer to the PEI Services Table published by the PEI Foundation.
    193   @param  This                  Pointer to this PPI instance.
    194   @param  DeviceIndex           Index of FDC device to get information.
    195   @param  MediaInfo             Pointer to the media info buffer for output.
    196 
    197   @retval EFI_SUCCESS           Number of FDC devices is retrieved successfully.
    198   @retval EFI_INVALID_PARAMETER Parameter This is NULL.
    199   @retval EFI_INVALID_PARAMETER Parameter MediaInfo is NULL.
    200   @retval EFI_INVALID_PARAMETER DeviceIndex is not valid.
    201   @retval EFI_DEVICE_ERROR      FDC device does not exist or has errors.
    202 
    203 **/
    204 EFI_STATUS
    205 EFIAPI
    206 FdcGetBlockDeviceMediaInfo (
    207   IN   EFI_PEI_SERVICES                     **PeiServices,
    208   IN   EFI_PEI_RECOVERY_BLOCK_IO_PPI        *This,
    209   IN   UINTN                                DeviceIndex,
    210   OUT  EFI_PEI_BLOCK_IO_MEDIA               *MediaInfo
    211   );
    212 
    213 /**
    214   Get the requested number of blocks from the specified FDC device.
    215 
    216   This function implements EFI_PEI_RECOVERY_BLOCK_IO_PPI.ReadBlocks.
    217   It reads the requested number of blocks from the specified FDC device.
    218 
    219   @param  PeiServices           An indirect pointer to the PEI Services Table published by the PEI Foundation.
    220   @param  This                  Pointer to this PPI instance.
    221   @param  DeviceIndex           Index of FDC device to get information.
    222   @param  StartLba              The start LBA to read from.
    223   @param  BufferSize            The size of range to read.
    224   @param  Buffer                Buffer to hold the data read from FDC.
    225 
    226   @retval EFI_SUCCESS           Number of FDC devices is retrieved successfully.
    227   @retval EFI_INVALID_PARAMETER Parameter This is NULL.
    228   @retval EFI_INVALID_PARAMETER Parameter Buffer is NULL.
    229   @retval EFI_INVALID_PARAMETER Parameter BufferSize cannot be divided by block size of FDC device.
    230   @retval EFI_NO_MEDIA          No media present.
    231   @retval EFI_DEVICE_ERROR      FDC device has error.
    232   @retval Others                Fail to read blocks.
    233 
    234 **/
    235 EFI_STATUS
    236 EFIAPI
    237 FdcReadBlocks (
    238   IN   EFI_PEI_SERVICES                  **PeiServices,
    239   IN   EFI_PEI_RECOVERY_BLOCK_IO_PPI     *This,
    240   IN   UINTN                             DeviceIndex,
    241   IN   EFI_PEI_LBA                       StartLba,
    242   IN   UINTN                             BufferSize,
    243   OUT  VOID                              *Buffer
    244   );
    245 
    246 #endif
    247