From: "Wu, Hao A" <hao.a.wu@intel.com>
To: "Ni, Ruiyu" <ruiyu.ni@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: Re: [PATCH 1/4] MdeModulePkg/AtaAtapiPassThru: Spin up Power up in Standby devices
Date: Mon, 4 Jun 2018 05:53:59 +0000 [thread overview]
Message-ID: <B80AF82E9BFB8E4FBD8C89DA810C6A0931E05F62@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20180601053921.34724-2-ruiyu.ni@intel.com>
One minor comment below.
> -----Original Message-----
> From: Ni, Ruiyu
> Sent: Friday, June 01, 2018 1:39 PM
> To: edk2-devel@lists.01.org
> Cc: Chiu, Chasel; Wu, Hao A
> Subject: [PATCH 1/4] MdeModulePkg/AtaAtapiPassThru: Spin up Power up
> in Standby devices
>
> The patch adds support to certain devices that support PUIS (Power
> up in Standby).
> For those devices that supports SET_FEATURE spin up, SW needs to
> send SET_FEATURE subcommand to spin up the devices.
> For those devices that doesn't support SET_FEATURE spin up, SW needs
> to send read sectors command to spin up the devices.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> ---
> MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c | 129
> ++++++++++++++++++++-
> .../Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.h | 3 +-
> 2 files changed, 127 insertions(+), 5 deletions(-)
>
> diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
> b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
> index e6de5d65bc..6ab7870570 100644
> --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
> +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
> @@ -1,7 +1,7 @@
> /** @file
> The file for AHCI mode of ATA host controller.
>
> - Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
> (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
> This program and the accompanying materials
> are licensed and made available under the terms and conditions of the BSD
> License
> @@ -1841,7 +1841,8 @@ AhciDeviceSetFeature (
> IN UINT8 Port,
> IN UINT8 PortMultiplier,
> IN UINT16 Feature,
> - IN UINT32 FeatureSpecificData
> + IN UINT32 FeatureSpecificData,
> + IN UINT64 Timeout
> )
> {
> EFI_STATUS Status;
> @@ -1868,7 +1869,7 @@ AhciDeviceSetFeature (
> 0,
> &AtaCommandBlock,
> &AtaStatusBlock,
> - ATA_ATAPI_TIMEOUT,
> + Timeout,
> NULL
> );
>
> @@ -2216,6 +2217,104 @@ Error6:
> return Status;
> }
>
> +
> +/**
> + Spin-up disk if IDD was incomplete or PUIS feature is enabled
> +
> + @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.
> + @param IdentifyData A pointer to data buffer which is used to contain
> IDENTIFY data.
> +
> +**/
> +EFI_STATUS
> +AhciSpinUpDisk (
> + IN EFI_PCI_IO_PROTOCOL *PciIo,
> + IN EFI_AHCI_REGISTERS *AhciRegisters,
> + IN UINT8 Port,
> + IN UINT8 PortMultiplier,
> + IN OUT EFI_IDENTIFY_DATA *IdentifyData
> + )
> +{
> + EFI_STATUS Status;
> + EFI_ATA_COMMAND_BLOCK AtaCommandBlock;
> + EFI_ATA_STATUS_BLOCK AtaStatusBlock;
> + UINT8 Buffer[512];
> +
> + if (IdentifyData->AtaData.specific_config ==
> ATA_SPINUP_CFG_REQUIRED_IDD_INCOMPLETE) {
> + //
> + // Use SET_FEATURE subcommand to spin up the device.
> + //
> + Status = AhciDeviceSetFeature (
> + PciIo, AhciRegisters, Port, PortMultiplier,
> + ATA_SUB_CMD_PUIS_SET_DEVICE_SPINUP, 0x00,
> ATA_SPINUP_TIMEOUT
> + );
> + DEBUG ((DEBUG_INFO, "CMD_PUIS_SET_DEVICE_SPINUP for device at
> port [%d] PortMultiplier [%d] - %r!\n",
> + Port, PortMultiplier, Status));
> + if (EFI_ERROR (Status)) {
> + return Status;
> + }
> + } else {
> + ASSERT (IdentifyData->AtaData.specific_config ==
> ATA_SPINUP_CFG_NOT_REQUIRED_IDD_INCOMPLETE);
> +
> + //
> + // Use READ_SECTORS to spin up the device if SpinUp SET FEATURE
> subcommand is not supported
> + //
> + ZeroMem (&AtaCommandBlock, sizeof (EFI_ATA_COMMAND_BLOCK));
> + ZeroMem (&AtaStatusBlock, sizeof (EFI_ATA_STATUS_BLOCK));
> + //
> + // Perform READ SECTORS PIO Data-In command to Read LBA 0
> + //
> + AtaCommandBlock.AtaCommand = ATA_CMD_READ_SECTORS;
> + AtaCommandBlock.AtaSectorCount = 0x1;
> +
> + Status = AhciPioTransfer (
> + PciIo,
> + AhciRegisters,
> + Port,
> + PortMultiplier,
> + NULL,
> + 0,
> + TRUE,
> + &AtaCommandBlock,
> + &AtaStatusBlock,
> + &Buffer,
> + sizeof (Buffer),
> + ATA_SPINUP_TIMEOUT,
> + NULL
> + );
> + DEBUG ((DEBUG_INFO, "Read LBA 0 for device at port [%d] PortMultiplier
> [%d] - %r!\n",
> + Port, PortMultiplier, Status));
> + if (EFI_ERROR (Status)) {
> + return Status;
> + }
> + }
> +
> + //
> + // Read the complete IDENTIFY DEVICE data.
> + //
> + ZeroMem (IdentifyData, sizeof (*IdentifyData));
> + Status = AhciIdentify (PciIo, AhciRegisters, Port, PortMultiplier,
> IdentifyData);
> + if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_ERROR, "Read IDD failed for device at port [%d]
> PortMultiplier [%d] - %r!\n",
> + Port, PortMultiplier, Status));
> + return Status;
> + }
> +
> + DEBUG ((DEBUG_INFO, "IDENTIFY DEVICE: [0] = %016x, [2] = %016x, [83]
> = %016x, [86] = %016x\n",
> + IdentifyData->AtaData.config, IdentifyData->AtaData.specific_config,
> + IdentifyData->AtaData.command_set_supported_83, IdentifyData-
> >AtaData.command_set_feature_enb_86));
> + //
> + // Check if IDD is incomplete
> + //
> + if ((IdentifyData->AtaData.config & BIT2) != 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> /**
> Initialize ATA host controller at AHCI mode.
>
> @@ -2458,6 +2557,28 @@ AhciModeInitialization (
> continue;
> }
>
> + DEBUG ((
> + DEBUG_INFO, "IDENTIFY DEVICE: [0] = %016x, [2] = %016x, [83]
> = %016x, [86] = %016x\n",
> + Buffer.AtaData.config, Buffer.AtaData.specific_config,
> + Buffer.AtaData.command_set_supported_83,
> Buffer.AtaData.command_set_feature_enb_86
> + ));
> + if ((Buffer.AtaData.config & BIT2) != 0) {
> + //
> + // SpinUp disk if device reported incomplete IDENTIFY DEVICE.
> + //
> + Status = AhciSpinUpDisk (
> + PciIo,
> + AhciRegisters,
> + Port,
> + 0,
> + &Buffer
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_ERROR, "Spin up standby device failed - %r\n",
> Status));
> + continue;
> + }
> + }
> +
> DeviceType = EfiIdeHarddisk;
> } else {
> continue;
> @@ -2523,7 +2644,7 @@ AhciModeInitialization (
> TransferMode.ModeNumber = (UINT8) SupportedModes-
> >MultiWordDmaMode.Mode;
> }
>
> - Status = AhciDeviceSetFeature (PciIo, AhciRegisters, Port, 0, 0x03,
> (UINT32)(*(UINT8 *)&TransferMode));
> + Status = AhciDeviceSetFeature (PciIo, AhciRegisters, Port, 0, 0x03,
> (UINT32)(*(UINT8 *)&TransferMode), ATA_ATAPI_TIMEOUT); // RPPO-SKL-
> TBD
Please help to remove the comment here.
With this change,
Reviewed-by: Hao Wu <hao.a.wu@intel.com>
Best Regards,
Hao Wu
> if (EFI_ERROR (Status)) {
> DEBUG ((EFI_D_ERROR, "Set transfer Mode Fail, Status = %r\n", Status));
> continue;
> diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.h
> b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.h
> index 85e5a55539..31b005f2f6 100644
> --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.h
> +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.h
> @@ -1,7 +1,7 @@
> /** @file
> Header file for ATA/ATAPI PASS THRU driver.
>
> - 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
> 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
> @@ -148,6 +148,7 @@ struct _ATA_NONBLOCK_TASK {
> // It means 3 second span.
> //
> #define ATA_ATAPI_TIMEOUT EFI_TIMER_PERIOD_SECONDS(3)
> +#define ATA_SPINUP_TIMEOUT EFI_TIMER_PERIOD_SECONDS(10)
>
> #define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0)
>
> --
> 2.16.1.windows.1
next prev parent reply other threads:[~2018-06-04 5:54 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-01 5:39 [PATCH 0/4] Support PUIS and DEVSLP feature Ruiyu Ni
2018-06-01 5:39 ` [PATCH 1/4] MdeModulePkg/AtaAtapiPassThru: Spin up Power up in Standby devices Ruiyu Ni
2018-06-04 3:51 ` Chiu, Chasel
2018-06-04 5:53 ` Wu, Hao A [this message]
2018-06-01 5:39 ` [PATCH 2/4] MdeModulePkg: Add AtaAtapiPolicy protocol definition Ruiyu Ni
2018-06-04 6:29 ` Zeng, Star
2018-06-04 6:49 ` Ni, Ruiyu
2018-06-01 5:39 ` [PATCH 3/4] MdeModulePkg/AtaAtapiPassThru: enable/disable PUIS per policy Ruiyu Ni
2018-06-04 3:51 ` Chiu, Chasel
2018-06-01 5:39 ` [PATCH 4/4] MdeModulePkg/Ata/AtaAtapiPassThru: Enable/disable DEVSLP " Ruiyu Ni
2018-06-04 3:51 ` Chiu, Chasel
2018-06-04 6:20 ` Wu, Hao A
2018-06-04 6:36 ` Ni, Ruiyu
2018-06-04 6:45 ` Wu, Hao A
2018-06-04 6:48 ` Ni, Ruiyu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=B80AF82E9BFB8E4FBD8C89DA810C6A0931E05F62@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox