]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacySio.c
IntelFrameworkModulePkg/LegacyBios: return NotFound when IsaIo absent
[mirror_edk2.git] / IntelFrameworkModulePkg / Csm / LegacyBiosDxe / LegacySio.c
... / ...
CommitLineData
1/** @file\r
2 Collect Sio information from Native EFI Drivers.\r
3 Sio is floppy, parallel, serial, ... hardware\r
4\r
5Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
6\r
7This program and the accompanying materials\r
8are licensed and made available under the terms and conditions\r
9of the BSD License which accompanies this distribution. The\r
10full text of the license may be found at\r
11http://opensource.org/licenses/bsd-license.php\r
12\r
13THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
14WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
15\r
16**/\r
17\r
18#include "LegacyBiosInterface.h"\r
19\r
20\r
21/**\r
22 Collect EFI Info about legacy devices through ISA IO interface.\r
23\r
24 @param SioPtr Pointer to SIO data.\r
25\r
26 @retval EFI_SUCCESS When SIO data is got successfully.\r
27 @retval EFI_NOT_FOUND When ISA IO interface is absent.\r
28\r
29**/\r
30EFI_STATUS\r
31LegacyBiosBuildSioDataFromIsaIo (\r
32 IN DEVICE_PRODUCER_DATA_HEADER *SioPtr\r
33 )\r
34{\r
35 EFI_STATUS Status;\r
36 DEVICE_PRODUCER_SERIAL *Sio1Ptr;\r
37 DEVICE_PRODUCER_PARALLEL *Sio2Ptr;\r
38 DEVICE_PRODUCER_FLOPPY *Sio3Ptr;\r
39 UINTN HandleCount;\r
40 EFI_HANDLE *HandleBuffer;\r
41 UINTN Index;\r
42 UINTN ResourceIndex;\r
43 UINTN ChildIndex;\r
44 EFI_ISA_IO_PROTOCOL *IsaIo;\r
45 EFI_ISA_ACPI_RESOURCE_LIST *ResourceList;\r
46 EFI_ISA_ACPI_RESOURCE *IoResource;\r
47 EFI_ISA_ACPI_RESOURCE *DmaResource;\r
48 EFI_ISA_ACPI_RESOURCE *InterruptResource;\r
49 UINTN EntryCount;\r
50 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
51 EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
52\r
53\r
54\r
55 //\r
56 // Get the list of ISA controllers in the system\r
57 //\r
58 Status = gBS->LocateHandleBuffer (\r
59 ByProtocol,\r
60 &gEfiIsaIoProtocolGuid,\r
61 NULL,\r
62 &HandleCount,\r
63 &HandleBuffer\r
64 );\r
65 if (EFI_ERROR (Status)) {\r
66 return EFI_NOT_FOUND;\r
67 }\r
68 //\r
69 // Collect legacy information from each of the ISA controllers in the system\r
70 //\r
71 for (Index = 0; Index < HandleCount; Index++) {\r
72\r
73 Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiIsaIoProtocolGuid, (VOID **) &IsaIo);\r
74 if (EFI_ERROR (Status)) {\r
75 continue;\r
76 }\r
77\r
78 ResourceList = IsaIo->ResourceList;\r
79\r
80 if (ResourceList == NULL) {\r
81 continue;\r
82 }\r
83 //\r
84 // Collect the resource types neededto fill in the SIO data structure\r
85 //\r
86 IoResource = NULL;\r
87 DmaResource = NULL;\r
88 InterruptResource = NULL;\r
89 for (ResourceIndex = 0;\r
90 ResourceList->ResourceItem[ResourceIndex].Type != EfiIsaAcpiResourceEndOfList;\r
91 ResourceIndex++\r
92 ) {\r
93 switch (ResourceList->ResourceItem[ResourceIndex].Type) {\r
94 case EfiIsaAcpiResourceIo:\r
95 IoResource = &ResourceList->ResourceItem[ResourceIndex];\r
96 break;\r
97\r
98 case EfiIsaAcpiResourceMemory:\r
99 break;\r
100\r
101 case EfiIsaAcpiResourceDma:\r
102 DmaResource = &ResourceList->ResourceItem[ResourceIndex];\r
103 break;\r
104\r
105 case EfiIsaAcpiResourceInterrupt:\r
106 InterruptResource = &ResourceList->ResourceItem[ResourceIndex];\r
107 break;\r
108\r
109 default:\r
110 break;\r
111 }\r
112 }\r
113 //\r
114 // See if this is an ISA serial port\r
115 //\r
116 // Ignore DMA resource since it is always returned NULL\r
117 //\r
118 if (ResourceList->Device.HID == EISA_PNP_ID (0x500) || ResourceList->Device.HID == EISA_PNP_ID (0x501)) {\r
119\r
120 if (ResourceList->Device.UID <= 3 &&\r
121 IoResource != NULL &&\r
122 InterruptResource != NULL\r
123 ) {\r
124 //\r
125 // Get the handle of the child device that has opened the ISA I/O Protocol\r
126 //\r
127 Status = gBS->OpenProtocolInformation (\r
128 HandleBuffer[Index],\r
129 &gEfiIsaIoProtocolGuid,\r
130 &OpenInfoBuffer,\r
131 &EntryCount\r
132 );\r
133 if (EFI_ERROR (Status)) {\r
134 continue;\r
135 }\r
136 //\r
137 // We want resource for legacy even if no 32-bit driver installed\r
138 //\r
139 for (ChildIndex = 0; ChildIndex < EntryCount; ChildIndex++) {\r
140 Sio1Ptr = &SioPtr->Serial[ResourceList->Device.UID];\r
141 Sio1Ptr->Address = (UINT16) IoResource->StartRange;\r
142 Sio1Ptr->Irq = (UINT8) InterruptResource->StartRange;\r
143 Sio1Ptr->Mode = DEVICE_SERIAL_MODE_NORMAL | DEVICE_SERIAL_MODE_DUPLEX_HALF;\r
144 }\r
145\r
146 FreePool (OpenInfoBuffer);\r
147 }\r
148 }\r
149 //\r
150 // See if this is an ISA parallel port\r
151 //\r
152 // Ignore DMA resource since it is always returned NULL, port\r
153 // only used in output mode.\r
154 //\r
155 if (ResourceList->Device.HID == EISA_PNP_ID (0x400) || ResourceList->Device.HID == EISA_PNP_ID (0x401)) {\r
156 if (ResourceList->Device.UID <= 2 &&\r
157 IoResource != NULL &&\r
158 InterruptResource != NULL &&\r
159 DmaResource != NULL\r
160 ) {\r
161 Sio2Ptr = &SioPtr->Parallel[ResourceList->Device.UID];\r
162 Sio2Ptr->Address = (UINT16) IoResource->StartRange;\r
163 Sio2Ptr->Irq = (UINT8) InterruptResource->StartRange;\r
164 Sio2Ptr->Dma = (UINT8) DmaResource->StartRange;\r
165 Sio2Ptr->Mode = DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY;\r
166 }\r
167 }\r
168 //\r
169 // See if this is an ISA floppy controller\r
170 //\r
171 if (ResourceList->Device.HID == EISA_PNP_ID (0x604)) {\r
172 if (IoResource != NULL && InterruptResource != NULL && DmaResource != NULL) {\r
173 Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiBlockIoProtocolGuid, (VOID **) &BlockIo);\r
174 if (!EFI_ERROR (Status)) {\r
175 Sio3Ptr = &SioPtr->Floppy;\r
176 Sio3Ptr->Address = (UINT16) IoResource->StartRange;\r
177 Sio3Ptr->Irq = (UINT8) InterruptResource->StartRange;\r
178 Sio3Ptr->Dma = (UINT8) DmaResource->StartRange;\r
179 Sio3Ptr->NumberOfFloppy++;\r
180 }\r
181 }\r
182 }\r
183 //\r
184 // See if this is a mouse\r
185 // Always set mouse found so USB hot plug will work\r
186 //\r
187 // Ignore lower byte of HID. Pnp0fxx is any type of mouse.\r
188 //\r
189 // Hid = ResourceList->Device.HID & 0xff00ffff;\r
190 // PnpId = EISA_PNP_ID(0x0f00);\r
191 // if (Hid == PnpId) {\r
192 // if (ResourceList->Device.UID == 1) {\r
193 // Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSimplePointerProtocolGuid, &SimplePointer);\r
194 // if (!EFI_ERROR (Status)) {\r
195 //\r
196 SioPtr->MousePresent = 0x01;\r
197 //\r
198 // }\r
199 // }\r
200 // }\r
201 //\r
202 }\r
203\r
204 FreePool (HandleBuffer);\r
205 return EFI_SUCCESS;\r
206}\r
207\r
208/**\r
209 Collect EFI Info about legacy devices.\r
210\r
211 @param Private Legacy BIOS Instance data\r
212\r
213 @retval EFI_SUCCESS It should always work.\r
214\r
215**/\r
216EFI_STATUS\r
217LegacyBiosBuildSioData (\r
218 IN LEGACY_BIOS_INSTANCE *Private\r
219 )\r
220{\r
221 EFI_STATUS Status;\r
222 DEVICE_PRODUCER_DATA_HEADER *SioPtr;\r
223 EFI_HANDLE IsaBusController;\r
224 UINTN HandleCount;\r
225 EFI_HANDLE *HandleBuffer;\r
226\r
227 //\r
228 // Get the pointer to the SIO data structure\r
229 //\r
230 SioPtr = &Private->IntThunk->EfiToLegacy16BootTable.SioData;\r
231\r
232 //\r
233 // Zero the data in the SIO data structure\r
234 //\r
235 gBS->SetMem (SioPtr, sizeof (DEVICE_PRODUCER_DATA_HEADER), 0);\r
236\r
237 //\r
238 // Find the ISA Bus Controller used for legacy\r
239 //\r
240 Status = Private->LegacyBiosPlatform->GetPlatformHandle (\r
241 Private->LegacyBiosPlatform,\r
242 EfiGetPlatformIsaBusHandle,\r
243 0,\r
244 &HandleBuffer,\r
245 &HandleCount,\r
246 NULL\r
247 );\r
248 IsaBusController = HandleBuffer[0];\r
249 if (!EFI_ERROR (Status)) {\r
250 //\r
251 // Force ISA Bus Controller to produce all ISA devices\r
252 //\r
253 gBS->ConnectController (IsaBusController, NULL, NULL, TRUE);\r
254 }\r
255\r
256 LegacyBiosBuildSioDataFromIsaIo (SioPtr);\r
257\r
258 return EFI_SUCCESS;\r
259}\r