Collect Sio information from Native EFI Drivers.\r
Sio is floppy, parallel, serial, ... hardware\r
\r
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions\r
\r
\r
/**\r
- Collect EFI Info about legacy devices.\r
+ Collect EFI Info about legacy devices through ISA IO interface.\r
\r
- @param Private Legacy BIOS Instance data\r
+ @param SioPtr Pointer to SIO data.\r
\r
- @retval EFI_SUCCESS It should always work.\r
+ @retval EFI_SUCCESS When SIO data is got successfully.\r
+ @retval EFI_NOT_FOUND When ISA IO interface is absent.\r
\r
**/\r
EFI_STATUS\r
-LegacyBiosBuildSioData (\r
- IN LEGACY_BIOS_INSTANCE *Private\r
+LegacyBiosBuildSioDataFromIsaIo (\r
+ IN DEVICE_PRODUCER_DATA_HEADER *SioPtr\r
)\r
{\r
EFI_STATUS Status;\r
- DEVICE_PRODUCER_DATA_HEADER *SioPtr;\r
- DEVICE_PRODUCER_SERIAL *Sio1Ptr;\r
- DEVICE_PRODUCER_PARALLEL *Sio2Ptr;\r
- DEVICE_PRODUCER_FLOPPY *Sio3Ptr;\r
- EFI_HANDLE IsaBusController;\r
+ DEVICE_PRODUCER_SERIAL *SioSerial;\r
+ DEVICE_PRODUCER_PARALLEL *SioParallel;\r
+ DEVICE_PRODUCER_FLOPPY *SioFloppy;\r
UINTN HandleCount;\r
EFI_HANDLE *HandleBuffer;\r
UINTN Index;\r
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
\r
- //\r
- // Get the pointer to the SIO data structure\r
- //\r
- SioPtr = &Private->IntThunk->EfiToLegacy16BootTable.SioData;\r
\r
- //\r
- // Zero the data in the SIO data structure\r
- //\r
- gBS->SetMem (SioPtr, sizeof (DEVICE_PRODUCER_DATA_HEADER), 0);\r
\r
- //\r
- // Find the ISA Bus Controller used for legacy\r
- //\r
- Status = Private->LegacyBiosPlatform->GetPlatformHandle (\r
- Private->LegacyBiosPlatform,\r
- EfiGetPlatformIsaBusHandle,\r
- 0,\r
- &HandleBuffer,\r
- &HandleCount,\r
- NULL\r
- );\r
- IsaBusController = HandleBuffer[0];\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Force ISA Bus Controller to produce all ISA devices\r
- //\r
- gBS->ConnectController (IsaBusController, NULL, NULL, TRUE);\r
- }\r
//\r
// Get the list of ISA controllers in the system\r
//\r
&HandleBuffer\r
);\r
if (EFI_ERROR (Status)) {\r
- return EFI_SUCCESS;\r
+ return EFI_NOT_FOUND;\r
}\r
//\r
// Collect legacy information from each of the ISA controllers in the system\r
// We want resource for legacy even if no 32-bit driver installed\r
//\r
for (ChildIndex = 0; ChildIndex < EntryCount; ChildIndex++) {\r
- Sio1Ptr = &SioPtr->Serial[ResourceList->Device.UID];\r
- Sio1Ptr->Address = (UINT16) IoResource->StartRange;\r
- Sio1Ptr->Irq = (UINT8) InterruptResource->StartRange;\r
- Sio1Ptr->Mode = DEVICE_SERIAL_MODE_NORMAL | DEVICE_SERIAL_MODE_DUPLEX_HALF;\r
+ SioSerial = &SioPtr->Serial[ResourceList->Device.UID];\r
+ SioSerial->Address = (UINT16) IoResource->StartRange;\r
+ SioSerial->Irq = (UINT8) InterruptResource->StartRange;\r
+ SioSerial->Mode = DEVICE_SERIAL_MODE_NORMAL | DEVICE_SERIAL_MODE_DUPLEX_HALF;\r
}\r
\r
FreePool (OpenInfoBuffer);\r
InterruptResource != NULL &&\r
DmaResource != NULL\r
) {\r
- Sio2Ptr = &SioPtr->Parallel[ResourceList->Device.UID];\r
- Sio2Ptr->Address = (UINT16) IoResource->StartRange;\r
- Sio2Ptr->Irq = (UINT8) InterruptResource->StartRange;\r
- Sio2Ptr->Dma = (UINT8) DmaResource->StartRange;\r
- Sio2Ptr->Mode = DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY;\r
+ SioParallel = &SioPtr->Parallel[ResourceList->Device.UID];\r
+ SioParallel->Address = (UINT16) IoResource->StartRange;\r
+ SioParallel->Irq = (UINT8) InterruptResource->StartRange;\r
+ SioParallel->Dma = (UINT8) DmaResource->StartRange;\r
+ SioParallel->Mode = DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY;\r
}\r
}\r
//\r
if (IoResource != NULL && InterruptResource != NULL && DmaResource != NULL) {\r
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiBlockIoProtocolGuid, (VOID **) &BlockIo);\r
if (!EFI_ERROR (Status)) {\r
- Sio3Ptr = &SioPtr->Floppy;\r
- Sio3Ptr->Address = (UINT16) IoResource->StartRange;\r
- Sio3Ptr->Irq = (UINT8) InterruptResource->StartRange;\r
- Sio3Ptr->Dma = (UINT8) DmaResource->StartRange;\r
- Sio3Ptr->NumberOfFloppy++;\r
+ SioFloppy = &SioPtr->Floppy;\r
+ SioFloppy->Address = (UINT16) IoResource->StartRange;\r
+ SioFloppy->Irq = (UINT8) InterruptResource->StartRange;\r
+ SioFloppy->Dma = (UINT8) DmaResource->StartRange;\r
+ SioFloppy->NumberOfFloppy++;\r
}\r
}\r
}\r
}\r
\r
FreePool (HandleBuffer);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Collect EFI Info about legacy devices.\r
+\r
+ @param Private Legacy BIOS Instance data\r
+\r
+ @retval EFI_SUCCESS It should always work.\r
+\r
+**/\r
+EFI_STATUS\r
+LegacyBiosBuildSioData (\r
+ IN LEGACY_BIOS_INSTANCE *Private\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ DEVICE_PRODUCER_DATA_HEADER *SioPtr;\r
+ EFI_HANDLE IsaBusController;\r
+ UINTN HandleCount;\r
+ EFI_HANDLE *HandleBuffer;\r
+\r
+ //\r
+ // Get the pointer to the SIO data structure\r
+ //\r
+ SioPtr = &Private->IntThunk->EfiToLegacy16BootTable.SioData;\r
+\r
+ //\r
+ // Zero the data in the SIO data structure\r
+ //\r
+ gBS->SetMem (SioPtr, sizeof (DEVICE_PRODUCER_DATA_HEADER), 0);\r
+\r
+ //\r
+ // Find the ISA Bus Controller used for legacy\r
+ //\r
+ Status = Private->LegacyBiosPlatform->GetPlatformHandle (\r
+ Private->LegacyBiosPlatform,\r
+ EfiGetPlatformIsaBusHandle,\r
+ 0,\r
+ &HandleBuffer,\r
+ &HandleCount,\r
+ NULL\r
+ );\r
+ IsaBusController = HandleBuffer[0];\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Force ISA Bus Controller to produce all ISA devices\r
+ //\r
+ gBS->ConnectController (IsaBusController, NULL, NULL, TRUE);\r
+ }\r
+\r
+ LegacyBiosBuildSioDataFromIsaIo (SioPtr);\r
\r
return EFI_SUCCESS;\r
}\r