mirror of https://github.com/acidanthera/audk.git
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:
parent
f87a1e4158
commit
06766c0e19
|
@ -2316,6 +2316,38 @@ AhciSpinUpDisk (
|
||||||
return EFI_SUCCESS;
|
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.
|
Initialize ATA host controller at AHCI mode.
|
||||||
|
|
||||||
|
@ -2658,6 +2690,22 @@ AhciModeInitialization (
|
||||||
if (DeviceType == EfiIdeHarddisk) {
|
if (DeviceType == EfiIdeHarddisk) {
|
||||||
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_ENABLE));
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
This file implements ATA_PASSTHRU_PROCTOCOL and EXT_SCSI_PASSTHRU_PROTOCOL interfaces
|
This file implements ATA_PASSTHRU_PROCTOCOL and EXT_SCSI_PASSTHRU_PROTOCOL interfaces
|
||||||
for managed ATA controllers.
|
for managed ATA controllers.
|
||||||
|
|
||||||
Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -142,6 +142,15 @@ UINT8 mScsiId[TARGET_MAX_BYTES] = {
|
||||||
0xFF, 0xFF, 0xFF, 0xFF
|
0xFF, 0xFF, 0xFF, 0xFF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EDKII_ATA_ATAPI_POLICY_PROTOCOL *mAtaAtapiPolicy;
|
||||||
|
EDKII_ATA_ATAPI_POLICY_PROTOCOL mDefaultAtaAtapiPolicy = {
|
||||||
|
EDKII_ATA_ATAPI_POLICY_VERSION,
|
||||||
|
2, // PuisEnable
|
||||||
|
0, // DeviceSleepEnable
|
||||||
|
0, // AggressiveDeviceSleepEnable
|
||||||
|
0 // Reserved
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sends an ATA command to an ATA device that is attached to the ATA controller. This function
|
Sends an ATA command to an ATA device that is attached to the ATA controller. This function
|
||||||
supports both blocking I/O and non-blocking I/O. The blocking I/O functionality is required,
|
supports both blocking I/O and non-blocking I/O. The blocking I/O functionality is required,
|
||||||
|
@ -739,6 +748,14 @@ AtaAtapiPassThruStart (
|
||||||
goto ErrorExit;
|
goto ErrorExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Status = gBS->LocateProtocol (&gEdkiiAtaAtapiPolicyProtocolGuid, NULL, (VOID **)&mAtaAtapiPolicy);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
//
|
||||||
|
// If there is no AtaAtapiPolicy exposed, use the default policy.
|
||||||
|
//
|
||||||
|
mAtaAtapiPolicy = &mDefaultAtaAtapiPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Allocate a buffer to store the ATA_ATAPI_PASS_THRU_INSTANCE data structure
|
// Allocate a buffer to store the ATA_ATAPI_PASS_THRU_INSTANCE data structure
|
||||||
//
|
//
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <Protocol/IdeControllerInit.h>
|
#include <Protocol/IdeControllerInit.h>
|
||||||
#include <Protocol/AtaPassThru.h>
|
#include <Protocol/AtaPassThru.h>
|
||||||
#include <Protocol/ScsiPassThruExt.h>
|
#include <Protocol/ScsiPassThruExt.h>
|
||||||
|
#include <Protocol/AtaAtapiPolicy.h>
|
||||||
|
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
|
@ -45,6 +46,8 @@ extern EFI_DRIVER_BINDING_PROTOCOL gAtaAtapiPassThruDriverBinding;
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gAtaAtapiPassThruComponentName;
|
extern EFI_COMPONENT_NAME_PROTOCOL gAtaAtapiPassThruComponentName;
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2;
|
extern EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2;
|
||||||
|
|
||||||
|
extern EDKII_ATA_ATAPI_POLICY_PROTOCOL *mAtaAtapiPolicy;
|
||||||
|
|
||||||
#define ATA_ATAPI_PASS_THRU_SIGNATURE SIGNATURE_32 ('a', 'a', 'p', 't')
|
#define ATA_ATAPI_PASS_THRU_SIGNATURE SIGNATURE_32 ('a', 'a', 'p', 't')
|
||||||
#define ATA_ATAPI_DEVICE_SIGNATURE SIGNATURE_32 ('a', 'd', 'e', 'v')
|
#define ATA_ATAPI_DEVICE_SIGNATURE SIGNATURE_32 ('a', 'd', 'e', 'v')
|
||||||
#define ATA_NONBLOCKING_TASK_SIGNATURE SIGNATURE_32 ('a', 't', 's', 'k')
|
#define ATA_NONBLOCKING_TASK_SIGNATURE SIGNATURE_32 ('a', 't', 's', 'k')
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# This driver installs AtaPassThru and ExtScsiPassThru protocol in each ide/sata controller
|
# This driver installs AtaPassThru and ExtScsiPassThru protocol in each ide/sata controller
|
||||||
# to access to all attached Ata/Atapi devices.
|
# to access to all attached Ata/Atapi devices.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
#
|
#
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
@ -67,6 +67,7 @@
|
||||||
gEfiIdeControllerInitProtocolGuid ## TO_START
|
gEfiIdeControllerInitProtocolGuid ## TO_START
|
||||||
gEfiDevicePathProtocolGuid ## TO_START
|
gEfiDevicePathProtocolGuid ## TO_START
|
||||||
gEfiPciIoProtocolGuid ## TO_START
|
gEfiPciIoProtocolGuid ## TO_START
|
||||||
|
gEdkiiAtaAtapiPolicyProtocolGuid ## CONSUMES
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdAtaSmartEnable ## SOMETIMES_CONSUMES
|
gEfiMdeModulePkgTokenSpaceGuid.PcdAtaSmartEnable ## SOMETIMES_CONSUMES
|
||||||
|
|
Loading…
Reference in New Issue