From 4374c2e535edad27d8c4c6516d2f1bb68403afca Mon Sep 17 00:00:00 2001 From: Chris Ruffin Date: Sun, 15 Dec 2013 20:47:39 +0000 Subject: OvmfPkg/QemuVideoDxe: child handles should have open parent protocol BY_CHILD_CONTROLLER The QemuVideoDxe driver creates child controller handles, so it is acting as a hybrid bus driver. The child handles should open the parent's bus protocol BY_CHILD_CONTROLLER to properly maintain the protocol usage count. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chris Ruffin Reviewed-by: Laszlo Ersek Reviewed-by: Jordan Justen git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14987 6f19259b-4bc3-4df7-8a09-765794883524 --- OvmfPkg/QemuVideoDxe/Driver.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/QemuVideoDxe/Driver.c b/OvmfPkg/QemuVideoDxe/Driver.c index 53718e1aea..b253ec734e 100644 --- a/OvmfPkg/QemuVideoDxe/Driver.c +++ b/OvmfPkg/QemuVideoDxe/Driver.c @@ -209,6 +209,7 @@ QemuVideoControllerDriverStart ( PCI_TYPE00 Pci; QEMU_VIDEO_CARD *Card; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *MmioDesc; + EFI_PCI_IO_PROTOCOL *ChildPciIo; PciAttributesSaved = FALSE; // @@ -419,6 +420,22 @@ QemuVideoControllerDriverStart ( &Private->GraphicsOutput, NULL ); + if (EFI_ERROR (Status)) { + goto Error; + } + + Status = gBS->OpenProtocol ( + Controller, + &gEfiPciIoProtocolGuid, + (VOID **) &ChildPciIo, + This->DriverBindingHandle, + Private->Handle, + EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER + ); + + if (EFI_ERROR (Status)) { + goto Error; + } } Error: @@ -440,7 +457,14 @@ Error: // Close the PCI I/O Protocol // gBS->CloseProtocol ( - Private->Handle, + Controller, + &gEfiPciIoProtocolGuid, + This->DriverBindingHandle, + Controller + ); + + gBS->CloseProtocol ( + Controller, &gEfiPciIoProtocolGuid, This->DriverBindingHandle, Private->Handle @@ -533,6 +557,13 @@ QemuVideoControllerDriverStop ( Controller ); + gBS->CloseProtocol ( + Controller, + &gEfiPciIoProtocolGuid, + This->DriverBindingHandle, + Private->Handle + ); + // // Free our instance data // -- cgit v1.2.3