mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 17:09:09 +00:00 
			
		
		
		
	 d8387fa4af
			
		
	
	
		d8387fa4af
		
	
	
	
	
		
			
			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
 |