On Fri, 21 Dec 2018 at 17:48, Girish Pathak <[email protected]> wrote: > > Apart from some minor indentation errors in function parameter declarations > in ArmScmiClock2Protocol.h , this looks fine. >
Thanks Reviewed-by: Ard Biesheuvel <[email protected]> I've cleaned it up a bit and pushed it as 9bba10eb4336..559a07d84e5a > > -----Original Message----- > From: Ard Biesheuvel <[email protected]> > Sent: 21 December 2018 14:55 > To: Jeff Brasen <[email protected]>; Girish Pathak <[email protected]> > Cc: [email protected]; Leif Lindholm <[email protected]> > Subject: Re: [PATCH v3] ArmPkg/ArmScmiDxe: Add clock enable function > > On Fri, 14 Dec 2018 at 00:48, Jeff Brasen <[email protected]> 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 <[email protected]> > > Cc: Ard Biesheuvel <[email protected]> > > Cc: Leif Lindholm <[email protected]> > > Cc: Grish Pathak <[email protected]> > > 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 > > > IMPORTANT NOTICE: The contents of this email and any attachments are > confidential and may also be privileged. If you are not the intended > recipient, please notify the sender immediately and do not disclose the > contents to any other person, use it for any purpose, or store or copy the > information in any medium. Thank you. _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

