X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=OvmfPkg%2FSataControllerDxe%2FSataController.c;h=2a5c3ba9f1b2ee4a10e633a8503fb31f7de75b3c;hb=b24e99f7c4270e7c5e2df511a41ff70e46138612;hp=5e7e23b26164ea0ccf7e7a9f3ccd41a8a2676223;hpb=379b17965f0fc3fcf542c606ad628856c2504a2e;p=mirror_edk2.git diff --git a/OvmfPkg/SataControllerDxe/SataController.c b/OvmfPkg/SataControllerDxe/SataController.c index 5e7e23b261..2a5c3ba9f1 100644 --- a/OvmfPkg/SataControllerDxe/SataController.c +++ b/OvmfPkg/SataControllerDxe/SataController.c @@ -388,8 +388,10 @@ SataControllerStart ( IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { + UINTN BailLogMask; EFI_STATUS Status; EFI_PCI_IO_PROTOCOL *PciIo; + UINT64 OriginalPciAttributes; PCI_TYPE00 PciData; EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; UINT32 Data32; @@ -397,6 +399,7 @@ SataControllerStart ( DEBUG ((EFI_D_INFO, "SataControllerStart START\n")); + BailLogMask = DEBUG_ERROR; SataPrivateData = NULL; // @@ -411,16 +414,39 @@ SataControllerStart ( EFI_OPEN_PROTOCOL_BY_DRIVER ); if (EFI_ERROR (Status)) { + if (Status == EFI_ALREADY_STARTED) { + // + // This is an expected condition for OpenProtocol() / BY_DRIVER, in a + // DriverBindingStart() member function; degrade the log mask to + // DEBUG_INFO. + // + BailLogMask = DEBUG_INFO; + } goto Bail; } + // + // Save original PCI attributes, and enable IO space access, memory space + // access, and Bus Master (DMA). + // + Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationGet, 0, + &OriginalPciAttributes); + if (EFI_ERROR (Status)) { + goto ClosePciIo; + } + Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationEnable, + EFI_PCI_DEVICE_ENABLE, NULL); + if (EFI_ERROR (Status)) { + goto ClosePciIo; + } + // // Allocate Sata Private Data structure // SataPrivateData = AllocateZeroPool (sizeof (EFI_SATA_CONTROLLER_PRIVATE_DATA)); if (SataPrivateData == NULL) { Status = EFI_OUT_OF_RESOURCES; - goto ClosePciIo; + goto RestorePciAttributes; } // @@ -428,6 +454,7 @@ SataControllerStart ( // SataPrivateData->Signature = SATA_CONTROLLER_SIGNATURE; SataPrivateData->PciIo = PciIo; + SataPrivateData->OriginalPciAttributes = OriginalPciAttributes; SataPrivateData->IdeInit.GetChannelInfo = IdeInitGetChannelInfo; SataPrivateData->IdeInit.NotifyPhase = IdeInitNotifyPhase; SataPrivateData->IdeInit.SubmitData = IdeInitSubmitData; @@ -512,6 +539,10 @@ FreeDisqualifiedModes: FreeSataPrivateData: FreePool (SataPrivateData); +RestorePciAttributes: + PciIo->Attributes (PciIo, EfiPciIoAttributeOperationSet, + OriginalPciAttributes, NULL); + ClosePciIo: gBS->CloseProtocol ( Controller, @@ -521,7 +552,8 @@ ClosePciIo: ); Bail: - DEBUG ((EFI_D_ERROR, "SataControllerStart error return status = %r\n", Status)); + DEBUG ((BailLogMask, "SataControllerStart error return status = %r\n", + Status)); return Status; } @@ -549,6 +581,8 @@ SataControllerStop ( EFI_STATUS Status; EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeInit; EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; + EFI_PCI_IO_PROTOCOL *PciIo; + UINT64 OriginalPciAttributes; // // Open the produced protocol @@ -568,6 +602,9 @@ SataControllerStop ( SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (IdeInit); ASSERT (SataPrivateData != NULL); + PciIo = SataPrivateData->PciIo; + OriginalPciAttributes = SataPrivateData->OriginalPciAttributes; + // // Uninstall the IDE Controller Init Protocol from this instance // @@ -581,18 +618,26 @@ SataControllerStop ( return Status; } - if (SataPrivateData != NULL) { - if (SataPrivateData->DisqualifiedModes != NULL) { - FreePool (SataPrivateData->DisqualifiedModes); - } - if (SataPrivateData->IdentifyData != NULL) { - FreePool (SataPrivateData->IdentifyData); - } - if (SataPrivateData->IdentifyValid != NULL) { - FreePool (SataPrivateData->IdentifyValid); - } - FreePool (SataPrivateData); + if (SataPrivateData->DisqualifiedModes != NULL) { + FreePool (SataPrivateData->DisqualifiedModes); + } + if (SataPrivateData->IdentifyData != NULL) { + FreePool (SataPrivateData->IdentifyData); } + if (SataPrivateData->IdentifyValid != NULL) { + FreePool (SataPrivateData->IdentifyValid); + } + FreePool (SataPrivateData); + + // + // Restore original PCI attributes + // + PciIo->Attributes ( + PciIo, + EfiPciIoAttributeOperationSet, + OriginalPciAttributes, + NULL + ); // // Close protocols opened by Sata Controller driver