mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 17:09:09 +00:00 
			
		
		
		
	 bcecde140a
			
		
	
	
		bcecde140a
		
	
	
	
	
		
			
			Added these drivers: * LegacyBiosDxe * BlockIoDxe * KeyboardDxe * Snp16Dxe * VideoDxe Signed-off-by: jljusten Reviewed-by: mdkinney Reviewed-by: geekboy15a git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11905 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			235 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Collect Sio information from Native EFI Drivers.
 | |
|   Sio is floppy, parallel, serial, ... hardware
 | |
| 
 | |
| 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.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "LegacyBiosInterface.h"
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Collect EFI Info about legacy devices.
 | |
| 
 | |
|   @param  Private      Legacy BIOS Instance data
 | |
| 
 | |
|   @retval EFI_SUCCESS  It should always work.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosBuildSioData (
 | |
|   IN  LEGACY_BIOS_INSTANCE      *Private
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                          Status;
 | |
|   DEVICE_PRODUCER_DATA_HEADER         *SioPtr;
 | |
|   DEVICE_PRODUCER_SERIAL              *Sio1Ptr;
 | |
|   DEVICE_PRODUCER_PARALLEL            *Sio2Ptr;
 | |
|   DEVICE_PRODUCER_FLOPPY              *Sio3Ptr;
 | |
|   EFI_HANDLE                          IsaBusController;
 | |
|   UINTN                               HandleCount;
 | |
|   EFI_HANDLE                          *HandleBuffer;
 | |
|   UINTN                               Index;
 | |
|   UINTN                               ResourceIndex;
 | |
|   UINTN                               ChildIndex;
 | |
|   EFI_ISA_IO_PROTOCOL                 *IsaIo;
 | |
|   EFI_ISA_ACPI_RESOURCE_LIST          *ResourceList;
 | |
|   EFI_ISA_ACPI_RESOURCE               *IoResource;
 | |
|   EFI_ISA_ACPI_RESOURCE               *DmaResource;
 | |
|   EFI_ISA_ACPI_RESOURCE               *InterruptResource;
 | |
|   UINTN                               EntryCount;
 | |
|   EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
 | |
|   EFI_BLOCK_IO_PROTOCOL               *BlockIo;
 | |
| 
 | |
|   //
 | |
|   // Get the pointer to the SIO data structure
 | |
|   //
 | |
|   SioPtr = &Private->IntThunk->EfiToLegacy16BootTable.SioData;
 | |
| 
 | |
|   //
 | |
|   // Zero the data in the SIO data structure
 | |
|   //
 | |
|   gBS->SetMem (SioPtr, sizeof (DEVICE_PRODUCER_DATA_HEADER), 0);
 | |
| 
 | |
|   //
 | |
|   // Find the ISA Bus Controller used for legacy
 | |
|   //
 | |
|   Status = Private->LegacyBiosPlatform->GetPlatformHandle (
 | |
|                                           Private->LegacyBiosPlatform,
 | |
|                                           EfiGetPlatformIsaBusHandle,
 | |
|                                           0,
 | |
|                                           &HandleBuffer,
 | |
|                                           &HandleCount,
 | |
|                                           NULL
 | |
|                                           );
 | |
|   IsaBusController = HandleBuffer[0];
 | |
|   if (!EFI_ERROR (Status)) {
 | |
|     //
 | |
|     // Force ISA Bus Controller to produce all ISA devices
 | |
|     //
 | |
|     gBS->ConnectController (IsaBusController, NULL, NULL, TRUE);
 | |
|   }
 | |
|   //
 | |
|   // Get the list of ISA controllers in the system
 | |
|   //
 | |
|   Status = gBS->LocateHandleBuffer (
 | |
|                   ByProtocol,
 | |
|                   &gEfiIsaIoProtocolGuid,
 | |
|                   NULL,
 | |
|                   &HandleCount,
 | |
|                   &HandleBuffer
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return EFI_SUCCESS;
 | |
|   }
 | |
|   //
 | |
|   // Collect legacy information from each of the ISA controllers in the system
 | |
|   //
 | |
|   for (Index = 0; Index < HandleCount; Index++) {
 | |
| 
 | |
|     Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiIsaIoProtocolGuid, (VOID **) &IsaIo);
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       continue;
 | |
|     }
 | |
| 
 | |
|     ResourceList = IsaIo->ResourceList;
 | |
| 
 | |
|     if (ResourceList == NULL) {
 | |
|       continue;
 | |
|     }
 | |
|     //
 | |
|     // Collect the resource types neededto fill in the SIO data structure
 | |
|     //
 | |
|     IoResource        = NULL;
 | |
|     DmaResource       = NULL;
 | |
|     InterruptResource = NULL;
 | |
|     for (ResourceIndex = 0;
 | |
|          ResourceList->ResourceItem[ResourceIndex].Type != EfiIsaAcpiResourceEndOfList;
 | |
|          ResourceIndex++
 | |
|         ) {
 | |
|       switch (ResourceList->ResourceItem[ResourceIndex].Type) {
 | |
|       case EfiIsaAcpiResourceIo:
 | |
|         IoResource = &ResourceList->ResourceItem[ResourceIndex];
 | |
|         break;
 | |
| 
 | |
|       case EfiIsaAcpiResourceMemory:
 | |
|         break;
 | |
| 
 | |
|       case EfiIsaAcpiResourceDma:
 | |
|         DmaResource = &ResourceList->ResourceItem[ResourceIndex];
 | |
|         break;
 | |
| 
 | |
|       case EfiIsaAcpiResourceInterrupt:
 | |
|         InterruptResource = &ResourceList->ResourceItem[ResourceIndex];
 | |
|         break;
 | |
| 
 | |
|       default:
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|     //
 | |
|     // See if this is an ISA serial port
 | |
|     //
 | |
|     // Ignore DMA resource since it is always returned NULL
 | |
|     //
 | |
|     if (ResourceList->Device.HID == EISA_PNP_ID (0x500) || ResourceList->Device.HID == EISA_PNP_ID (0x501)) {
 | |
| 
 | |
|       if (ResourceList->Device.UID <= 3 &&
 | |
|           IoResource != NULL &&
 | |
|           InterruptResource != NULL
 | |
|           ) {
 | |
|         //
 | |
|         // Get the handle of the child device that has opened the ISA I/O Protocol
 | |
|         //
 | |
|         Status = gBS->OpenProtocolInformation (
 | |
|                         HandleBuffer[Index],
 | |
|                         &gEfiIsaIoProtocolGuid,
 | |
|                         &OpenInfoBuffer,
 | |
|                         &EntryCount
 | |
|                         );
 | |
|         if (EFI_ERROR (Status)) {
 | |
|           continue;
 | |
|         }
 | |
|         //
 | |
|         // We want resource for legacy even if no 32-bit driver installed
 | |
|         //
 | |
|         for (ChildIndex = 0; ChildIndex < EntryCount; ChildIndex++) {
 | |
|           Sio1Ptr           = &SioPtr->Serial[ResourceList->Device.UID];
 | |
|           Sio1Ptr->Address  = (UINT16) IoResource->StartRange;
 | |
|           Sio1Ptr->Irq      = (UINT8) InterruptResource->StartRange;
 | |
|           Sio1Ptr->Mode     = DEVICE_SERIAL_MODE_NORMAL | DEVICE_SERIAL_MODE_DUPLEX_HALF;
 | |
|         }
 | |
| 
 | |
|         FreePool (OpenInfoBuffer);
 | |
|       }
 | |
|     }
 | |
|     //
 | |
|     // See if this is an ISA parallel port
 | |
|     //
 | |
|     // Ignore DMA resource since it is always returned NULL, port
 | |
|     // only used in output mode.
 | |
|     //
 | |
|     if (ResourceList->Device.HID == EISA_PNP_ID (0x400) || ResourceList->Device.HID == EISA_PNP_ID (0x401)) {
 | |
|       if (ResourceList->Device.UID <= 2 &&
 | |
|           IoResource != NULL &&
 | |
|           InterruptResource != NULL &&
 | |
|           DmaResource != NULL
 | |
|           ) {
 | |
|         Sio2Ptr           = &SioPtr->Parallel[ResourceList->Device.UID];
 | |
|         Sio2Ptr->Address  = (UINT16) IoResource->StartRange;
 | |
|         Sio2Ptr->Irq      = (UINT8) InterruptResource->StartRange;
 | |
|         Sio2Ptr->Dma      = (UINT8) DmaResource->StartRange;
 | |
|         Sio2Ptr->Mode     = DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY;
 | |
|       }
 | |
|     }
 | |
|     //
 | |
|     // See if this is an ISA floppy controller
 | |
|     //
 | |
|     if (ResourceList->Device.HID == EISA_PNP_ID (0x604)) {
 | |
|       if (IoResource != NULL && InterruptResource != NULL && DmaResource != NULL) {
 | |
|         Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiBlockIoProtocolGuid, (VOID **) &BlockIo);
 | |
|         if (!EFI_ERROR (Status)) {
 | |
|           Sio3Ptr           = &SioPtr->Floppy;
 | |
|           Sio3Ptr->Address  = (UINT16) IoResource->StartRange;
 | |
|           Sio3Ptr->Irq      = (UINT8) InterruptResource->StartRange;
 | |
|           Sio3Ptr->Dma      = (UINT8) DmaResource->StartRange;
 | |
|           Sio3Ptr->NumberOfFloppy++;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     //
 | |
|     // See if this is a mouse
 | |
|     // Always set mouse found so USB hot plug will work
 | |
|     //
 | |
|     // Ignore lower byte of HID. Pnp0fxx is any type of mouse.
 | |
|     //
 | |
|     //    Hid = ResourceList->Device.HID & 0xff00ffff;
 | |
|     //    PnpId = EISA_PNP_ID(0x0f00);
 | |
|     //    if (Hid == PnpId) {
 | |
|     //      if (ResourceList->Device.UID == 1) {
 | |
|     //        Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSimplePointerProtocolGuid, &SimplePointer);
 | |
|     //      if (!EFI_ERROR (Status)) {
 | |
|     //
 | |
|     SioPtr->MousePresent = 0x01;
 | |
|     //
 | |
|     //        }
 | |
|     //      }
 | |
|     //    }
 | |
|     //
 | |
|   }
 | |
| 
 | |
|   FreePool (HandleBuffer);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 |