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