mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 05:38:26 +00:00 
			
		
		
		
	Signed-off-by: jljusten Reviewed-by: mdkinney git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11845 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			247 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
Private include file for IsaFloppyPei PEIM.
 | 
						|
 | 
						|
Copyright (c) 2006 - 2010, 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
 |