MdeModulePkg/AtaAtapiPassThru: enable/disable PUIS per policy

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
This commit is contained in:
Ruiyu Ni
2018-05-29 13:08:21 +08:00
parent f87a1e4158
commit 06766c0e19
4 changed files with 71 additions and 2 deletions

View File

@@ -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;
}
}
}
}