public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: Jeff Brasen <jbrasen@nvidia.com>, Grish Pathak <girish.pathak@arm.com>
Cc: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
	Leif Lindholm <leif.lindholm@linaro.org>
Subject: Re: [PATCH v3] ArmPkg/ArmScmiDxe: Add clock enable function
Date: Fri, 21 Dec 2018 15:54:53 +0100	[thread overview]
Message-ID: <CAKv+Gu_E+LJkhxHNdsEs8e=Rc9AKHEW5FfbbEjRsrDYnMWE+vQ@mail.gmail.com> (raw)
In-Reply-To: <76d15663dbbcc6e83813d86f6ca981b47791cdcf.1544744882.git.jbrasen@nvidia.com>

On Fri, 14 Dec 2018 at 00:48, Jeff Brasen <jbrasen@nvidia.com> wrote:
>
> Add function to allow enabling and disabling of the clock using the SCMI
> interface. Add gArmScmiClock2ProtocolGuid to distinguish platforms that
> support new API from those that just have the older protocol.
>
> SCMI_CLOCK2_PROTOCOL also adds a version parameter to allow for future
> changes. It is placed after the functions that are present in the
> existing protocol to allow SCMI_CLOCK2_PROTOCOL to be cast to
> SCMI_CLOCK_PROTOCOL so that only a single implementation of those
> function are needed.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Jeff Brasen <jbrasen@nvidia.com>
> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> Cc: Leif Lindholm <leif.lindholm@linaro.org>
> Cc: Grish Pathak <girish.pathak@arm.com>

I'd like to hear from Girish as well, since he contributed this code originally.

> ---
>  ArmPkg/ArmPkg.dec                                  |   1 +
>  .../ArmScmiDxe/ArmScmiClockProtocolPrivate.h       |   7 +
>  ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf           |   1 +
>  ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c      |  62 +++++++
>  ArmPkg/Include/Protocol/ArmScmiClock2Protocol.h    | 198 +++++++++++++++++++++
>  5 files changed, 269 insertions(+)
>  create mode 100644 ArmPkg/Include/Protocol/ArmScmiClock2Protocol.h
>
> diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
> index d99eb67..2f5e5b3 100644
> --- a/ArmPkg/ArmPkg.dec
> +++ b/ArmPkg/ArmPkg.dec
> @@ -59,6 +59,7 @@
>    ## Arm System Control and Management Interface(SCMI) Clock management protocol
>    ## ArmPkg/Include/Protocol/ArmScmiClockProtocol.h
>    gArmScmiClockProtocolGuid = { 0x91ce67a8, 0xe0aa, 0x4012, { 0xb9, 0x9f, 0xb6, 0xfc, 0xf3, 0x4, 0x8e, 0xaa } }
> +  gArmScmiClock2ProtocolGuid = { 0xb8d8caf2, 0x9e94, 0x462c, { 0xa8, 0x34, 0x6c, 0x99, 0xfc, 0x05, 0xef, 0xcf } }
>
>    ## Arm System Control and Management Interface(SCMI) Clock management protocol
>    ## ArmPkg/Include/Protocol/ArmScmiPerformanceProtocol.h
> diff --git a/ArmPkg/Drivers/ArmScmiDxe/ArmScmiClockProtocolPrivate.h b/ArmPkg/Drivers/ArmScmiDxe/ArmScmiClockProtocolPrivate.h
> index 0d1ec6f..c135bac 100644
> --- a/ArmPkg/Drivers/ArmScmiDxe/ArmScmiClockProtocolPrivate.h
> +++ b/ArmPkg/Drivers/ArmScmiDxe/ArmScmiClockProtocolPrivate.h
> @@ -59,6 +59,13 @@ typedef struct {
>    CLOCK_RATE_DWORD Rate;
>  } CLOCK_RATE_SET_ATTRIBUTES;
>
> +
> +// Message parameters for CLOCK_CONFIG_SET command.
> +typedef struct {
> +  UINT32 ClockId;
> +  UINT32 Attributes;
> +} CLOCK_CONFIG_SET_ATTRIBUTES;
> +
>  //  if ClockAttr Bit[0] is set then clock device is enabled.
>  #define CLOCK_ENABLE_MASK         0x1
>  #define CLOCK_ENABLED(ClockAttr)  ((ClockAttr & CLOCK_ENABLE_MASK) == 1)
> diff --git a/ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf b/ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
> index 05ce9c0..9b29b9f 100644
> --- a/ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
> +++ b/ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
> @@ -46,6 +46,7 @@
>  [Protocols]
>    gArmScmiBaseProtocolGuid
>    gArmScmiClockProtocolGuid
> +  gArmScmiClock2ProtocolGuid
>    gArmScmiPerformanceProtocolGuid
>
>  [Depex]
> diff --git a/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c b/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
> index 64d2afa..c7f27a3 100644
> --- a/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
> +++ b/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
> @@ -19,6 +19,7 @@
>  #include <Library/DebugLib.h>
>  #include <Library/UefiBootServicesTableLib.h>
>  #include <Protocol/ArmScmiClockProtocol.h>
> +#include <Protocol/ArmScmiClock2Protocol.h>
>
>  #include "ArmScmiClockProtocolPrivate.h"
>  #include "ScmiPrivate.h"
> @@ -388,6 +389,53 @@ ClockRateSet (
>    return Status;
>  }
>
> +/** Enable/Disable specified clock.
> +
> +  @param[in]  This        A Pointer to SCMI_CLOCK_PROTOCOL Instance.
> +  @param[in]  ClockId     Identifier for the clock device.
> +  @param[in]  Enable      TRUE to enable, FALSE to disable.
> +
> +  @retval EFI_SUCCESS          Clock enable/disable successful.
> +  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
> +  @retval !(EFI_SUCCESS)       Other errors.
> +**/
> +STATIC
> +EFI_STATUS
> +ClockEnable (
> +  IN SCMI_CLOCK2_PROTOCOL *This,
> +  IN UINT32               ClockId,
> +  IN BOOLEAN              Enable
> +  )
> +{
> +  EFI_STATUS                  Status;
> +  CLOCK_CONFIG_SET_ATTRIBUTES *ClockConfigSetAttributes;
> +  SCMI_COMMAND                Cmd;
> +  UINT32                      PayloadLength;
> +
> +  Status = ScmiCommandGetPayload ((UINT32**)&ClockConfigSetAttributes);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  // Fill arguments for clock protocol command.
> +  ClockConfigSetAttributes->ClockId    = ClockId;
> +  ClockConfigSetAttributes->Attributes = Enable ? BIT0 : 0;
> +
> +  Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
> +  Cmd.MessageId  = SCMI_MESSAGE_ID_CLOCK_CONFIG_SET;
> +
> +  PayloadLength = sizeof (CLOCK_CONFIG_SET_ATTRIBUTES);
> +
> +  // Execute and wait for response on a SCMI channel.
> +  Status = ScmiCommandExecute (
> +             &Cmd,
> +             &PayloadLength,
> +             NULL
> +             );
> +
> +  return Status;
> +}
> +
>  // Instance of the SCMI clock management protocol.
>  STATIC CONST SCMI_CLOCK_PROTOCOL ScmiClockProtocol = {
>    ClockGetVersion,
> @@ -398,6 +446,18 @@ STATIC CONST SCMI_CLOCK_PROTOCOL ScmiClockProtocol = {
>    ClockRateSet
>   };
>
> +// Instance of the SCMI clock management protocol.
> +STATIC CONST SCMI_CLOCK2_PROTOCOL ScmiClock2Protocol = {
> +  (SCMI_CLOCK2_GET_VERSION)ClockGetVersion,
> +  (SCMI_CLOCK2_GET_TOTAL_CLOCKS)ClockGetTotalClocks,
> +  (SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES)ClockGetClockAttributes,
> +  (SCMI_CLOCK2_DESCRIBE_RATES)ClockDescribeRates,
> +  (SCMI_CLOCK2_RATE_GET)ClockRateGet,
> +  (SCMI_CLOCK2_RATE_SET)ClockRateSet,
> +  SCMI_CLOCK2_PROTOCOL_VERSION,
> +  ClockEnable
> + };
> +
>  /** Initialize clock management protocol and install protocol on a given handle.
>
>    @param[in] Handle              Handle to install clock management protocol.
> @@ -413,6 +473,8 @@ ScmiClockProtocolInit (
>                  Handle,
>                  &gArmScmiClockProtocolGuid,
>                  &ScmiClockProtocol,
> +                &gArmScmiClock2ProtocolGuid,
> +                &ScmiClock2Protocol,
>                  NULL
>                  );
>  }
> diff --git a/ArmPkg/Include/Protocol/ArmScmiClock2Protocol.h b/ArmPkg/Include/Protocol/ArmScmiClock2Protocol.h
> new file mode 100644
> index 0000000..f2c9670
> --- /dev/null
> +++ b/ArmPkg/Include/Protocol/ArmScmiClock2Protocol.h
> @@ -0,0 +1,198 @@
> +/** @file
> +
> +  Copyright (c) 2017-2018, Arm Limited. All rights reserved.
> +
> +  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
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +  System Control and Management Interface V1.0
> +    http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
> +    DEN0056A_System_Control_and_Management_Interface.pdf
> +**/
> +
> +#ifndef ARM_SCMI_CLOCK2_PROTOCOL_H_
> +#define ARM_SCMI_CLOCK2_PROTOCOL_H_
> +
> +#include <Protocol/ArmScmi.h>
> +#include <Protocol/ArmScmiClockProtocol.h>
> +
> +#define ARM_SCMI_CLOCK2_PROTOCOL_GUID { \
> +  0xb8d8caf2, 0x9e94, 0x462c, { 0xa8, 0x34, 0x6c, 0x99, 0xfc, 0x05, 0xef, 0xcf } \
> +  }
> +
> +extern EFI_GUID gArmScmiClock2ProtocolGuid;
> +
> +#define SCMI_CLOCK2_PROTOCOL_VERSION 1
> +
> +typedef struct _SCMI_CLOCK2_PROTOCOL SCMI_CLOCK2_PROTOCOL;
> +
> +// Protocol Interface functions.
> +
> +/** Return version of the clock management protocol supported by SCP firmware.
> +
> +  @param[in]  This     A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
> +
> +  @param[out] Version  Version of the supported SCMI Clock management protocol.
> +
> +  @retval EFI_SUCCESS       The version is returned.
> +  @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.
> +  @retval !(EFI_SUCCESS)    Other errors.
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *SCMI_CLOCK2_GET_VERSION) (
> +  IN  SCMI_CLOCK2_PROTOCOL  *This,
> +  OUT UINT32               *Version
> +  );
> +
> +/** Return total number of clock devices supported by the clock management
> +   protocol.
> +
> +  @param[in]  This         A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
> +
> +  @param[out] TotalClocks  Total number of clocks supported.
> +
> +  @retval EFI_SUCCESS       Total number of clocks supported is returned.
> +  @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.
> +  @retval !(EFI_SUCCESS)    Other errors.
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *SCMI_CLOCK2_GET_TOTAL_CLOCKS) (
> +  IN  SCMI_CLOCK2_PROTOCOL  *This,
> +  OUT UINT32               *TotalClocks
> +  );
> +
> +/** Return attributes of a clock device.
> +
> +  @param[in]  This        A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
> +  @param[in]  ClockId     Identifier for the clock device.
> +
> +  @param[out] Enabled         If TRUE, the clock device is enabled.
> +  @param[out] ClockAsciiName  A NULL terminated ASCII string with the clock
> +                              name, of up to 16 bytes.
> +
> +  @retval EFI_SUCCESS          Clock device attributes are returned.
> +  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
> +  @retval !(EFI_SUCCESS)       Other errors.
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES) (
> +  IN  SCMI_CLOCK2_PROTOCOL  *This,
> +  IN  UINT32               ClockId,
> +  OUT BOOLEAN              *Enabled,
> +  OUT CHAR8                *ClockAsciiName
> +  );
> +
> +/** Return list of rates supported by a given clock device.
> +
> +  @param[in] This        A pointer to SCMI_CLOCK2_PROTOCOL Instance.
> +  @param[in] ClockId     Identifier for the clock device.
> +
> +  @param[out] Format      SCMI_CLOCK_RATE_FORMAT_DISCRETE: Clock device
> +                          supports range of clock rates which are non-linear.
> +
> +                          SCMI_CLOCK_RATE_FORMAT_LINEAR: Clock device supports
> +                          range of linear clock rates from Min to Max in steps.
> +
> +  @param[out] TotalRates  Total number of rates.
> +
> +  @param[in,out] RateArraySize  Size of the RateArray.
> +
> +  @param[out] RateArray   List of clock rates.
> +
> +  @retval EFI_SUCCESS          List of clock rates are returned.
> +  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
> +  @retval EFI_BUFFER_TOO_SMALL RateArraySize is too small for the result.
> +                               It has been updated to the size needed.
> +  @retval !(EFI_SUCCESS)       Other errors.
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *SCMI_CLOCK2_DESCRIBE_RATES) (
> +  IN     SCMI_CLOCK2_PROTOCOL     *This,
> +  IN     UINT32                   ClockId,
> +  OUT    SCMI_CLOCK_RATE_FORMAT  *Format,
> +  OUT    UINT32                  *TotalRates,
> +  IN OUT UINT32                  *RateArraySize,
> +  OUT    SCMI_CLOCK_RATE         *RateArray
> +  );
> +
> +/** Get clock rate.
> +
> +  @param[in]  This        A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
> +  @param[in]  ClockId     Identifier for the clock device.
> +
> +  @param[out]  Rate       Clock rate.
> +
> +  @retval EFI_SUCCESS          Clock rate is returned.
> +  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
> +  @retval !(EFI_SUCCESS)       Other errors.
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *SCMI_CLOCK2_RATE_GET) (
> +  IN  SCMI_CLOCK2_PROTOCOL  *This,
> +  IN  UINT32               ClockId,
> +  OUT UINT64               *Rate
> +  );
> +
> +/** Set clock rate.
> +
> +  @param[in]  This        A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
> +  @param[in]  ClockId     Identifier for the clock device.
> +  @param[in]  Rate        Clock rate.
> +
> +  @retval EFI_SUCCESS          Clock rate set success.
> +  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
> +  @retval !(EFI_SUCCESS)       Other errors.
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *SCMI_CLOCK2_RATE_SET) (
> +  IN SCMI_CLOCK2_PROTOCOL  *This,
> +  IN UINT32               ClockId,
> +  IN UINT64               Rate
> +  );
> +
> +/** Enable/Disable specified clock.
> +    Function is only available under gArmScmiClock2ProtocolGuid
> +
> +  @param[in]  This        A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
> +  @param[in]  ClockId     Identifier for the clock device.
> +  @param[in]  Enable      TRUE to enable, FALSE to disable.
> +
> +  @retval EFI_SUCCESS          Clock enable/disable successful.
> +  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
> +  @retval !(EFI_SUCCESS)       Other errors.
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *SCMI_CLOCK2_ENABLE) (
> +  IN SCMI_CLOCK2_PROTOCOL *This,
> +  IN UINT32               ClockId,
> +  IN BOOLEAN              Enable
> +  );
> +
> +typedef struct _SCMI_CLOCK2_PROTOCOL {
> +  SCMI_CLOCK2_GET_VERSION GetVersion;
> +  SCMI_CLOCK2_GET_TOTAL_CLOCKS GetTotalClocks;
> +  SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES GetClockAttributes;
> +  SCMI_CLOCK2_DESCRIBE_RATES DescribeRates;
> +  SCMI_CLOCK2_RATE_GET RateGet;
> +  SCMI_CLOCK2_RATE_SET RateSet;
> +
> +  //Extention to original ClockProtocol, added here so SCMI_CLOCK2_PROTOCOL
> +  //can be cast to SCMI_CLOCK_PROTOCOL
> +  UINTN Version; //For future expandability of protocol
> +  SCMI_CLOCK2_ENABLE Enable;
> +} SCMI_CLOCK2_PROTOCOL;
> +
> +#endif /* ARM_SCMI_CLOCK2_PROTOCOL_H_ */
> +
> --
> 2.7.4
>


  reply	other threads:[~2018-12-21 14:55 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-13 23:48 [PATCH v3] ArmPkg/ArmScmiDxe: Add clock enable function Jeff Brasen
2018-12-21 14:54 ` Ard Biesheuvel [this message]
2018-12-21 16:48   ` Girish Pathak
2018-12-21 17:31     ` Ard Biesheuvel

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='CAKv+Gu_E+LJkhxHNdsEs8e=Rc9AKHEW5FfbbEjRsrDYnMWE+vQ@mail.gmail.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