1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
|
/** @file
Private include file for IsaFloppyPei PEIM.
Copyright (c) 2006 - 2018, 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
|