mirror of https://github.com/acidanthera/audk.git
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
|