public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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 v2 4/4] MdeModulePkg/Ata/AtaAtapiPassThru: Enable/disable DEVSLP per policy
Date: Mon, 4 Jun 2018 07:30:06 +0000	[thread overview]
Message-ID: <B80AF82E9BFB8E4FBD8C89DA810C6A0931E0609B@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20180604070337.164836-5-ruiyu.ni@intel.com>

Reviewed-by: Hao Wu <hao.a.wu@intel.com>

Best Regards,
Hao Wu


> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Ruiyu Ni
> Sent: Monday, June 04, 2018 3:04 PM
> To: edk2-devel@lists.01.org
> Cc: Wu, Hao A
> Subject: [edk2] [PATCH v2 4/4] MdeModulePkg/Ata/AtaAtapiPassThru:
> Enable/disable DEVSLP per policy
> 
> 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 | 214
> +++++++++++++++++++++++
>  MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h |  23 ++-
>  2 files changed, 235 insertions(+), 2 deletions(-)
> 
> diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
> b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
> index 841b6a0e60..1bae1e8e0c 100644
> --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
> +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
> @@ -2218,6 +2218,213 @@ Error6:
>    return Status;
>  }
> 
> +/**
> +  Read logs from SATA device.
> +
> +  @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  Buffer              The data buffer to store SATA logs.
> +  @param  LogNumber           The address of the log.
> +  @param  PageNumber          The page number of the log.
> +
> +  @retval EFI_INVALID_PARAMETER  PciIo, AhciRegisters or Buffer is NULL.
> +  @retval others                 Return status of AhciPioTransfer().
> +**/
> +EFI_STATUS
> +AhciReadLogExt (
> +  IN EFI_PCI_IO_PROTOCOL       *PciIo,
> +  IN EFI_AHCI_REGISTERS        *AhciRegisters,
> +  IN UINT8                     Port,
> +  IN UINT8                     PortMultiplier,
> +  IN OUT UINT8                 *Buffer,
> +  IN UINT8                     LogNumber,
> +  IN UINT8                     PageNumber
> +  )
> +{
> +  EFI_ATA_COMMAND_BLOCK        AtaCommandBlock;
> +  EFI_ATA_STATUS_BLOCK         AtaStatusBlock;
> +
> +  if (PciIo == NULL || AhciRegisters == NULL || Buffer == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  ///
> +  /// Read log from device
> +  ///
> +  ZeroMem (&AtaCommandBlock, sizeof (EFI_ATA_COMMAND_BLOCK));
> +  ZeroMem (&AtaStatusBlock, sizeof (EFI_ATA_STATUS_BLOCK));
> +  ZeroMem (Buffer, 512);
> +
> +  AtaCommandBlock.AtaCommand      = ATA_CMD_READ_LOG_EXT;
> +  AtaCommandBlock.AtaSectorCount  = 1;
> +  AtaCommandBlock.AtaSectorNumber = LogNumber;
> +  AtaCommandBlock.AtaCylinderLow  = PageNumber;
> +
> +  return AhciPioTransfer (
> +           PciIo,
> +           AhciRegisters,
> +           Port,
> +           PortMultiplier,
> +           NULL,
> +           0,
> +           TRUE,
> +           &AtaCommandBlock,
> +           &AtaStatusBlock,
> +           Buffer,
> +           512,
> +           ATA_ATAPI_TIMEOUT,
> +           NULL
> +           );
> +}
> +
> +/**
> +  Enable DEVSLP of the disk if supported.
> +
> +  @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.
> +
> +  @retval EFI_SUCCESS         The DEVSLP is enabled per policy successfully.
> +  @retval EFI_UNSUPPORTED     The DEVSLP isn't supported by the
> controller/device and policy requires to enable it.
> +**/
> +EFI_STATUS
> +AhciEnableDevSlp (
> +  IN EFI_PCI_IO_PROTOCOL           *PciIo,
> +  IN EFI_AHCI_REGISTERS            *AhciRegisters,
> +  IN UINT8                         Port,
> +  IN UINT8                         PortMultiplier,
> +  IN EFI_IDENTIFY_DATA             *IdentifyData
> +  )
> +{
> +  EFI_STATUS               Status;
> +  UINT32                   Offset;
> +  UINT32                   Capability2;
> +  UINT8                    LogData[512];
> +  DEVSLP_TIMING_VARIABLES  DevSlpTiming;
> +  UINT32                   PortCmd;
> +  UINT32                   PortDevSlp;
> +
> +  if (mAtaAtapiPolicy->DeviceSleepEnable != 1) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  //
> +  // Do not enable DevSlp if DevSlp is not supported.
> +  //
> +  Capability2 = AhciReadReg (PciIo, AHCI_CAPABILITY2_OFFSET);
> +  DEBUG ((DEBUG_INFO, "AHCI CAPABILITY2 = %08x\n", Capability2));
> +  if ((Capability2 & AHCI_CAP2_SDS) == 0) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  //
> +  // Do not enable DevSlp if DevSlp is not present
> +  // Do not enable DevSlp if Hot Plug or Mechanical Presence Switch is
> supported
> +  //
> +  Offset     = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH;
> +  PortCmd    = AhciReadReg (PciIo, Offset + EFI_AHCI_PORT_CMD);
> +  PortDevSlp = AhciReadReg (PciIo, Offset + AHCI_PORT_DEVSLP);
> +  DEBUG ((DEBUG_INFO, "Port CMD/DEVSLP = %08x / %08x\n", PortCmd,
> PortDevSlp));
> +  if (((PortDevSlp & AHCI_PORT_DEVSLP_DSP) == 0) ||
> +      ((PortCmd & (EFI_AHCI_PORT_CMD_HPCP |
> EFI_AHCI_PORT_CMD_MPSP)) != 0)
> +     ) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  //
> +  // Do not enable DevSlp if the device doesn't support DevSlp
> +  //
> +  DEBUG ((DEBUG_INFO, "IDENTIFY DEVICE: [77] = %04x, [78] = %04x, [79]
> = %04x\n",
> +          IdentifyData->AtaData.reserved_77,
> +          IdentifyData->AtaData.serial_ata_features_supported, IdentifyData-
> >AtaData.serial_ata_features_enabled));
> +  if ((IdentifyData->AtaData.serial_ata_features_supported & BIT8) == 0) {
> +    DEBUG ((DEBUG_INFO, "DevSlp feature is not supported for device at
> port [%d] PortMultiplier [%d]!\n",
> +            Port, PortMultiplier));
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  //
> +  // Enable DevSlp when it is not enabled.
> +  //
> +  if ((IdentifyData->AtaData.serial_ata_features_enabled & BIT8) != 0) {
> +    Status = AhciDeviceSetFeature (
> +      PciIo, AhciRegisters, Port, 0, ATA_SUB_CMD_ENABLE_SATA_FEATURE,
> 0x09, ATA_ATAPI_TIMEOUT
> +    );
> +    DEBUG ((DEBUG_INFO, "DevSlp set feature for device at port [%d]
> PortMultiplier [%d] - %r\n",
> +            Port, PortMultiplier, Status));
> +    if (EFI_ERROR (Status)) {
> +      return Status;
> +    }
> +  }
> +
> +  Status = AhciReadLogExt(PciIo, AhciRegisters, Port, PortMultiplier, LogData,
> 0x30, 0x08);
> +
> +  //
> +  // Clear PxCMD.ST and PxDEVSLP.ADSE before updating PxDEVSLP.DITO
> and PxDEVSLP.MDAT.
> +  //
> +  AhciWriteReg (PciIo, Offset + EFI_AHCI_PORT_CMD, PortCmd &
> ~EFI_AHCI_PORT_CMD_ST);
> +  PortDevSlp &= ~AHCI_PORT_DEVSLP_ADSE;
> +  AhciWriteReg (PciIo, Offset + AHCI_PORT_DEVSLP, PortDevSlp);
> +
> +  //
> +  // Set PxDEVSLP.DETO and PxDEVSLP.MDAT to 0.
> +  //
> +  PortDevSlp &= ~AHCI_PORT_DEVSLP_DETO_MASK;
> +  PortDevSlp &= ~AHCI_PORT_DEVSLP_MDAT_MASK;
> +  AhciWriteReg (PciIo, Offset + AHCI_PORT_DEVSLP, PortDevSlp);
> +  DEBUG ((DEBUG_INFO, "Read Log Ext at port [%d] PortMultiplier [%d] -
>  %r\n", Port, PortMultiplier, Status));
> +  if (EFI_ERROR (Status)) {
> +    //
> +    // Assume DEVSLP TIMING VARIABLES is not supported if the Identify
> Device Data log (30h, 8) fails
> +    //
> +    DevSlpTiming.Supported = 0;
> +  } else {
> +    CopyMem (&DevSlpTiming, &LogData[48], sizeof (DevSlpTiming));
> +    DEBUG ((DEBUG_INFO, "DevSlpTiming: Supported(%d), Deto(%d),
> Madt(%d)\n",
> +            DevSlpTiming.Supported, DevSlpTiming.Deto, DevSlpTiming.Madt));
> +  }
> +
> +  //
> +  // Use 20ms as default DETO when DEVSLP TIMING VARIABLES is not
> supported or the DETO is 0.
> +  //
> +  if ((DevSlpTiming.Supported == 0) || (DevSlpTiming.Deto == 0)) {
> +    DevSlpTiming.Deto = 20;
> +  }
> +
> +  //
> +  // Use 10ms as default MADT when DEVSLP TIMING VARIABLES is not
> supported or the MADT is 0.
> +  //
> +  if ((DevSlpTiming.Supported == 0) || (DevSlpTiming.Madt == 0)) {
> +    DevSlpTiming.Madt = 10;
> +  }
> +
> +  PortDevSlp |= DevSlpTiming.Deto << 2;
> +  PortDevSlp |= DevSlpTiming.Madt << 10;
> +  AhciOrReg (PciIo, Offset + AHCI_PORT_DEVSLP, PortDevSlp);
> +
> +  if (mAtaAtapiPolicy->AggressiveDeviceSleepEnable == 1) {
> +    if ((Capability2 & AHCI_CAP2_SADM) != 0) {
> +      PortDevSlp &= ~AHCI_PORT_DEVSLP_DITO_MASK;
> +      PortDevSlp |= (625 << 15);
> +      AhciWriteReg (PciIo, Offset + AHCI_PORT_DEVSLP, PortDevSlp);
> +
> +      PortDevSlp |= AHCI_PORT_DEVSLP_ADSE;
> +      AhciWriteReg (PciIo, Offset + AHCI_PORT_DEVSLP, PortDevSlp);
> +    }
> +  }
> +
> +
> +  AhciWriteReg (PciIo, Offset + EFI_AHCI_PORT_CMD, PortCmd);
> +
> +  DEBUG ((DEBUG_INFO, "Enabled DevSlp feature at port [%d]
> PortMultiplier [%d], Port CMD/DEVSLP = %08x / %08x\n",
> +          Port, PortMultiplier, PortCmd, PortDevSlp));
> +
> +  return EFI_SUCCESS;
> +}
> 
>  /**
>    Spin-up disk if IDD was incomplete or PUIS feature is enabled
> @@ -2689,6 +2896,13 @@ AhciModeInitialization (
>        CreateNewDeviceInfo (Instance, Port, 0xFFFF, DeviceType, &Buffer);
>        if (DeviceType == EfiIdeHarddisk) {
>          REPORT_STATUS_CODE (EFI_PROGRESS_CODE,
> (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_ENABLE));
> +        AhciEnableDevSlp (
> +          PciIo,
> +          AhciRegisters,
> +          Port,
> +          0,
> +          &Buffer
> +          );
>        }
> 
>        //
> diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h
> b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h
> index 809bcc307f..0ef749b4c7 100644
> --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h
> +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h
> @@ -1,7 +1,7 @@
>  /** @file
>    Header file for AHCI mode of ATA host controller.
> 
> -  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
>    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
> @@ -29,6 +29,10 @@
> 
>  #define EFI_AHCI_MAX_PORTS                     32
> 
> +#define AHCI_CAPABILITY2_OFFSET                0x0024
> +#define   AHCI_CAP2_SDS                        BIT3
> +#define   AHCI_CAP2_SADM                       BIT4
> +
>  typedef struct {
>    UINT32  Lower32;
>    UINT32  Upper32;
> @@ -182,7 +186,13 @@ typedef union {
>  #define EFI_AHCI_PORT_SACT                     0x0034
>  #define EFI_AHCI_PORT_CI                       0x0038
>  #define EFI_AHCI_PORT_SNTF                     0x003C
> -
> +#define AHCI_PORT_DEVSLP                       0x0044
> +#define   AHCI_PORT_DEVSLP_ADSE                BIT0
> +#define   AHCI_PORT_DEVSLP_DSP                 BIT1
> +#define   AHCI_PORT_DEVSLP_DETO_MASK           0x000003FC
> +#define   AHCI_PORT_DEVSLP_MDAT_MASK           0x00007C00
> +#define   AHCI_PORT_DEVSLP_DITO_MASK           0x01FF8000
> +#define   AHCI_PORT_DEVSLP_DM_MASK             0x1E000000
> 
>  #pragma pack(1)
>  //
> @@ -283,6 +293,15 @@ typedef struct {
>    UINT8    AhciUnknownFisRsvd[0x60];
>  } EFI_AHCI_RECEIVED_FIS;
> 
> +typedef struct {
> +  UINT8  Madt : 5;
> +  UINT8  Reserved_5 : 3;
> +  UINT8  Deto;
> +  UINT16 Reserved_16;
> +  UINT32 Reserved_32 : 31;
> +  UINT32 Supported : 1;
> +} DEVSLP_TIMING_VARIABLES;
> +
>  #pragma pack()
> 
>  typedef struct {
> --
> 2.16.1.windows.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


      reply	other threads:[~2018-06-04  7:30 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-04  7:03 [PATCH v2 0/4] Support PUIS and DEVSLP feature Ruiyu Ni
2018-06-04  7:03 ` [PATCH v2 1/4] MdeModulePkg/AtaAtapiPassThru: Spin up Power up in Standby devices Ruiyu Ni
2018-06-04  7:03 ` [PATCH v2 2/4] MdeModulePkg: Add AtaAtapiPolicy protocol definition Ruiyu Ni
2018-06-05  2:29   ` Zeng, Star
2018-06-05  3:09     ` Ni, Ruiyu
2018-06-05  3:34       ` Zeng, Star
2018-06-04  7:03 ` [PATCH v2 3/4] MdeModulePkg/AtaAtapiPassThru: enable/disable PUIS per policy Ruiyu Ni
2018-06-05  3:35   ` Zeng, Star
2018-06-05  3:40     ` Ni, Ruiyu
2018-06-05  5:16       ` Zeng, Star
2018-06-05  5:39         ` Ni, Ruiyu
2018-06-05  5:52           ` Zeng, Star
2018-06-04  7:03 ` [PATCH v2 4/4] MdeModulePkg/Ata/AtaAtapiPassThru: Enable/disable DEVSLP " Ruiyu Ni
2018-06-04  7:30   ` Wu, Hao A [this message]

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=B80AF82E9BFB8E4FBD8C89DA810C6A0931E0609B@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