X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FBus%2FAta%2FAtaAtapiPassThru%2FAtaAtapiPassThru.c;h=09064dda18b70753d6a100ad21e9855c90291e78;hb=6fb8ddd36bde45614b0a069528cdc97077835a74;hp=a48b295d26aad4182641887eac68d5f74ebb1d3b;hpb=509daa658b79b21eb1ccd6230065867e22707a42;p=mirror_edk2.git diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c index a48b295d26..09064dda18 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c @@ -104,7 +104,8 @@ ATA_ATAPI_PASS_THRU_INSTANCE gAtaAtapiPassThruInstanceTemplate = { { // NonBlocking TaskList NULL, NULL - } + }, + NULL, // ExitBootEvent }; ATAPI_DEVICE_PATH mAtapiDevicePathTemplate = { @@ -478,6 +479,38 @@ InitializeAtaAtapiPassThru ( return Status; } +/** + Disable the device (especially Bus Master DMA) when exiting the boot + services. + + @param[in] Event Event for which this notification function is being + called. + @param[in] Context Pointer to the ATA_ATAPI_PASS_THRU_INSTANCE that + represents the HBA. +**/ +VOID +EFIAPI +AtaPassThruExitBootServices ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + ATA_ATAPI_PASS_THRU_INSTANCE *Instance; + EFI_PCI_IO_PROTOCOL *PciIo; + + DEBUG ((DEBUG_VERBOSE, "%a: Context=0x%p\n", __FUNCTION__, Context)); + + Instance = Context; + PciIo = Instance->PciIo; + + PciIo->Attributes ( + PciIo, + EfiPciIoAttributeOperationDisable, + Instance->EnabledPciAttributes, + NULL + ); +} + /** Tests to see if this driver supports a given controller. If a child device is provided, it further tests to see if this driver supports creating a handle for the specified child device. @@ -757,6 +790,17 @@ AtaAtapiPassThruStart ( InitializeListHead(&Instance->DeviceList); InitializeListHead(&Instance->NonBlockingTaskList); + Status = gBS->CreateEvent ( + EVT_SIGNAL_EXIT_BOOT_SERVICES, + TPL_CALLBACK, + AtaPassThruExitBootServices, + Instance, + &Instance->ExitBootEvent + ); + if (EFI_ERROR (Status)) { + goto ErrorExit; + } + Instance->TimerEvent = NULL; Status = gBS->CreateEvent ( @@ -810,6 +854,10 @@ ErrorExit: gBS->CloseEvent (Instance->TimerEvent); } + if ((Instance != NULL) && (Instance->ExitBootEvent != NULL)) { + gBS->CloseEvent (Instance->ExitBootEvent); + } + // // Remove all inserted ATA devices. // @@ -908,6 +956,15 @@ AtaAtapiPassThruStop ( Instance->TimerEvent = NULL; } DestroyAsynTaskList (Instance, FALSE); + + // + // Close event signaled at gBS->ExitBootServices(). + // + if (Instance->ExitBootEvent != NULL) { + gBS->CloseEvent (Instance->ExitBootEvent); + Instance->ExitBootEvent = NULL; + } + // // Free allocated resource //