X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FBus%2FAta%2FAtaAtapiPassThru%2FAhciMode.c;h=841b6a0e60634ab11dc3634088b39f1ad02532fc;hp=14578c0f948a6a0da44ce5c6a159fdd3b8012411;hb=06766c0e19092eed5563caeb94576f0d4ac65fd1;hpb=f87a1e4158994b4d16ae09ea0bc41831292dc94c diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c index 14578c0f94..841b6a0e60 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c @@ -2316,6 +2316,38 @@ AhciSpinUpDisk ( return EFI_SUCCESS; } +/** + Enable/disable/skip PUIS of the disk according to policy. + + @param PciIo The PCI IO protocol instance. + @param AhciRegisters The pointer to the EFI_AHCI_REGISTERS. + @param Port The number of port. + @param PortMultiplier The multiplier of port. + +**/ +EFI_STATUS +AhciPuisEnable ( + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN EFI_AHCI_REGISTERS *AhciRegisters, + IN UINT8 Port, + IN UINT8 PortMultiplier + ) +{ + EFI_STATUS Status; + + Status = EFI_SUCCESS; + if (mAtaAtapiPolicy->PuisEnable == 0) { + Status = AhciDeviceSetFeature (PciIo, AhciRegisters, Port, PortMultiplier, ATA_SUB_CMD_DISABLE_PUIS, 0x00, ATA_ATAPI_TIMEOUT); + } else if (mAtaAtapiPolicy->PuisEnable == 1) { + Status = AhciDeviceSetFeature (PciIo, AhciRegisters, Port, PortMultiplier, ATA_SUB_CMD_ENABLE_PUIS, 0x00, ATA_ATAPI_TIMEOUT); + } + DEBUG ((DEBUG_INFO, "%a PUIS feature at port [%d] PortMultiplier [%d] - %r!\n", + (mAtaAtapiPolicy->PuisEnable == 0) ? "Disable" : ( + (mAtaAtapiPolicy->PuisEnable == 1) ? "Enable" : "Skip" + ), Port, PortMultiplier, Status)); + return Status; +} + /** Initialize ATA host controller at AHCI mode. @@ -2658,6 +2690,22 @@ AhciModeInitialization ( if (DeviceType == EfiIdeHarddisk) { REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_ENABLE)); } + + // + // Enable/disable PUIS according to policy setting if PUIS is capable (Word[83].BIT5 is set). + // + if ((Buffer.AtaData.command_set_supported_83 & BIT5) != 0) { + Status = AhciPuisEnable ( + PciIo, + AhciRegisters, + Port, + 0 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "PUIS enable/disable failed, Status = %r\n", Status)); + continue; + } + } } }