mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 11:13:53 +01:00 
			
		
		
		
	Update ConPlatform driver to support GOP driver which creates multiple children.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10936 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		
							parent
							
								
									5dec0c688e
								
							
						
					
					
						commit
						5b7183efb1
					
				| @ -450,9 +450,11 @@ ConPlatformTextOutDriverBindingStart ( | |||||||
|     } |     } | ||||||
|   } else { |   } else { | ||||||
|     //
 |     //
 | ||||||
|     // If it is not a hot-plug device, first append the device path to the
 |     // If it is not a hot-plug device, append the device path to 
 | ||||||
|     // ConOutDev environment variable
 |     // the ConOutDev and ErrOutDev environment variable.
 | ||||||
|  |     // For GOP device path, append the sibling device path as well.
 | ||||||
|     //
 |     //
 | ||||||
|  |     if (!ConPlatformUpdateGopCandidate (DevicePath)) { | ||||||
|       ConPlatformUpdateDeviceVariable ( |       ConPlatformUpdateDeviceVariable ( | ||||||
|         L"ConOutDev", |         L"ConOutDev", | ||||||
|         DevicePath, |         DevicePath, | ||||||
| @ -466,6 +468,7 @@ ConPlatformTextOutDriverBindingStart ( | |||||||
|         DevicePath, |         DevicePath, | ||||||
|         Append |         Append | ||||||
|         ); |         ); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     //
 |     //
 | ||||||
|     // If the device path is an instance in the ConOut environment variable,
 |     // If the device path is an instance in the ConOut environment variable,
 | ||||||
| @ -1022,3 +1025,79 @@ IsHotPlugDevice ( | |||||||
|   return FALSE; |   return FALSE; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |   Update ConOutDev and ErrOutDev variables to add the device path of | ||||||
|  |   GOP controller itself and the sibling controllers. | ||||||
|  | 
 | ||||||
|  |   @param  DevicePath            Pointer to device's device path. | ||||||
|  | 
 | ||||||
|  |   @retval TRUE                  The devcie is a GOP device. | ||||||
|  |   @retval FALSE                 The devcie is not a GOP device. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | BOOLEAN | ||||||
|  | ConPlatformUpdateGopCandidate ( | ||||||
|  |   IN  EFI_DEVICE_PATH_PROTOCOL    *DevicePath | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   EFI_STATUS                           Status; | ||||||
|  |   EFI_HANDLE                           PciHandle; | ||||||
|  |   EFI_HANDLE                           GopHandle; | ||||||
|  |   EFI_OPEN_PROTOCOL_INFORMATION_ENTRY  *OpenInfoBuffer; | ||||||
|  |   UINTN                                EntryCount; | ||||||
|  |   UINTN                                Index; | ||||||
|  |   EFI_DEVICE_PATH_PROTOCOL             *ChildDevicePath; | ||||||
|  |   EFI_DEVICE_PATH_PROTOCOL             *TempDevicePath; | ||||||
|  | 
 | ||||||
|  |   //
 | ||||||
|  |   // Check whether it's a GOP device.
 | ||||||
|  |   //
 | ||||||
|  |   TempDevicePath = DevicePath; | ||||||
|  |   Status = gBS->LocateDevicePath (&gEfiGraphicsOutputProtocolGuid, &TempDevicePath, &GopHandle); | ||||||
|  |   if (EFI_ERROR (Status)) { | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  |   //
 | ||||||
|  |   // Get the parent PciIo handle in order to find all the children
 | ||||||
|  |   //
 | ||||||
|  |   Status = gBS->LocateDevicePath (&gEfiPciIoProtocolGuid, &DevicePath, &PciHandle); | ||||||
|  |   if (EFI_ERROR (Status)) { | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   Status = gBS->OpenProtocolInformation ( | ||||||
|  |                   PciHandle, | ||||||
|  |                   &gEfiPciIoProtocolGuid, | ||||||
|  |                   &OpenInfoBuffer, | ||||||
|  |                   &EntryCount | ||||||
|  |                   ); | ||||||
|  |   if (EFI_ERROR (Status)) { | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   for (Index = 0; Index < EntryCount; Index++) { | ||||||
|  |     //
 | ||||||
|  |     // Query all the children created by the GOP driver
 | ||||||
|  |     //
 | ||||||
|  |     if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { | ||||||
|  |       Status = gBS->OpenProtocol ( | ||||||
|  |                       OpenInfoBuffer[Index].ControllerHandle, | ||||||
|  |                       &gEfiDevicePathProtocolGuid, | ||||||
|  |                       (VOID **) &ChildDevicePath, | ||||||
|  |                       NULL, | ||||||
|  |                       NULL, | ||||||
|  |                       EFI_OPEN_PROTOCOL_GET_PROTOCOL | ||||||
|  |                       ); | ||||||
|  |       if (!EFI_ERROR (Status)) { | ||||||
|  |         //
 | ||||||
|  |         // Append the device path to ConOutDev and ErrOutDev
 | ||||||
|  |         //
 | ||||||
|  |         ConPlatformUpdateDeviceVariable (L"ConOutDev", ChildDevicePath, Append); | ||||||
|  |         ConPlatformUpdateDeviceVariable (L"ErrOutDev", ChildDevicePath, Append); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   FreePool (OpenInfoBuffer); | ||||||
|  | 
 | ||||||
|  |   return TRUE; | ||||||
|  | } | ||||||
|  | |||||||
| @ -20,6 +20,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |||||||
| #include <Protocol/SimpleTextOut.h> | #include <Protocol/SimpleTextOut.h> | ||||||
| #include <Protocol/DevicePath.h> | #include <Protocol/DevicePath.h> | ||||||
| #include <Protocol/SimpleTextIn.h> | #include <Protocol/SimpleTextIn.h> | ||||||
|  | #include <Protocol/PciIo.h> | ||||||
|  | #include <Protocol/GraphicsOutput.h> | ||||||
| 
 | 
 | ||||||
| #include <Guid/GlobalVariable.h> | #include <Guid/GlobalVariable.h> | ||||||
| #include <Guid/ConsoleInDevice.h> | #include <Guid/ConsoleInDevice.h> | ||||||
| @ -422,5 +424,19 @@ ConPlatformComponentNameGetControllerName ( | |||||||
|   OUT CHAR16                                          **ControllerName |   OUT CHAR16                                          **ControllerName | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |   Update ConOutDev and ErrOutDev variables to add the device path of | ||||||
|  |   GOP controller itself and the sibling controllers. | ||||||
|  | 
 | ||||||
|  |   @param  DevicePath            Pointer to device's device path. | ||||||
|  | 
 | ||||||
|  |   @retval TRUE                  The devcie is a GOP device. | ||||||
|  |   @retval FALSE                 The devcie is not a GOP device. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | BOOLEAN | ||||||
|  | ConPlatformUpdateGopCandidate ( | ||||||
|  |   IN  EFI_DEVICE_PATH_PROTOCOL    *DevicePath | ||||||
|  |   ); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -87,4 +87,5 @@ | |||||||
|   gEfiDevicePathProtocolGuid                    ## TO_START |   gEfiDevicePathProtocolGuid                    ## TO_START | ||||||
|   gEfiSimpleTextInProtocolGuid                  ## TO_START |   gEfiSimpleTextInProtocolGuid                  ## TO_START | ||||||
|   gEfiSimpleTextOutProtocolGuid                 ## TO_START |   gEfiSimpleTextOutProtocolGuid                 ## TO_START | ||||||
|    |   gEfiPciIoProtocolGuid                         ## TO_START | ||||||
|  |   gEfiGraphicsOutputProtocolGuid                ## TO_START | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user