Re: [edk2] [PATCH] ArmPkg/ArmScmiDxe: Add clock enable function

2018-11-09 Thread Sami Mujawar
-Original Message-
From: Leif Lindholm  
Sent: 09 November 2018 06:49 PM
To: Jeff Brasen 
Cc: edk2-devel@lists.01.org; Ard Biesheuvel ; Girish 
Pathak ; Sami Mujawar 
Subject: Re: [PATCH] ArmPkg/ArmScmiDxe: Add clock enable function

On Fri, Nov 09, 2018 at 06:35:02PM +, Jeff Brasen wrote:
> >   1.  Add new ArmScmiClock2Protocol.h + guid
> >   2.  Add new guid and document that you have to use that guid for the 
> > enable function
> >   3.  Add new guid under old name and have the old guid installed on
> >   the handle as well, this would keep things fairly clean but
> >   would have a guid that wouldn't map to a protocol in header
> >   form.
> >   4.  Just change the protocol without changing the guid, this has
> >   the reverse issue of the change I made (except errors can
> >   result in a crash) (don't really like this option)
> 
> I think my (quite puritan) preference would be 5. Add another guid, 
> describe it in the same .h file.
> 
> For example, see (among several others) 
> EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL/EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
> in MdePkg/Include/Protocol/FirmwareVolumeBlock.h.
> (This may be what you mean by 2?)
> 
> [JB] Yes this was what I was thinking with #2

OK, cool, then we're on the same page.

[SAMI] I think this would be the right approach.

> It's a bit of a sledgehammer, but it is a well known and common 
> pattern in edk2.
> 
> However, if we do this, I would prefer to take the opportunity to add 
> any new functions not already implemented at the same time. Do you 
> know if we have other missing calls?
> 
> Now, this _isn't_ a protocol described by any external specification, 
> so we don't need to be quite as rigid as for public interfaces.
> Basically, there shouldn't be (non-debug/non-devtool) dynamic 
> applications making use of this protocol in the first place. (If we 
> think there should be, we need to document this GUID and protocol in a 
> spec somewhere.) So in reality, I think 4 would also be a valid thing 
> to do.
> 
> But I do want feedback from the original author.
> 
> [JB] Sounds good, I think Girish is out of office until 11/21

Yeah. I'd take feedback from Sami as well :) But both me and Ard will be at 
plumbers next week, and we are expecting the stable tag to happen then as well 
- so that is basically lost anyway.

Regards,

Leif
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


Re: [edk2] [PATCH] ArmPkg/ArmScmiDxe: Add clock enable function

2018-11-09 Thread Leif Lindholm
On Fri, Nov 09, 2018 at 06:35:02PM +, Jeff Brasen wrote:
> >   1.  Add new ArmScmiClock2Protocol.h + guid
> >   2.  Add new guid and document that you have to use that guid for the 
> > enable function
> >   3.  Add new guid under old name and have the old guid installed on
> >   the handle as well, this would keep things fairly clean but
> >   would have a guid that wouldn't map to a protocol in header
> >   form.
> >   4.  Just change the protocol without changing the guid, this has
> >   the reverse issue of the change I made (except errors can
> >   result in a crash) (don't really like this option)
> 
> I think my (quite puritan) preference would be
> 5. Add another guid, describe it in the same .h file.
> 
> For example, see (among several others)
> EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL/EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
> in MdePkg/Include/Protocol/FirmwareVolumeBlock.h.
> (This may be what you mean by 2?)
> 
> [JB] Yes this was what I was thinking with #2

OK, cool, then we're on the same page.

> It's a bit of a sledgehammer, but it is a well known and common
> pattern in edk2.
> 
> However, if we do this, I would prefer to take the opportunity to add
> any new functions not already implemented at the same time. Do you
> know if we have other missing calls?
> 
> Now, this _isn't_ a protocol described by any external specification,
> so we don't need to be quite as rigid as for public interfaces.
> Basically, there shouldn't be (non-debug/non-devtool) dynamic
> applications making use of this protocol in the first place. (If we
> think there should be, we need to document this GUID and protocol in a
> spec somewhere.)
> So in reality, I think 4 would also be a valid thing to do.
> 
> But I do want feedback from the original author.
> 
> [JB] Sounds good, I think Girish is out of office until 11/21

Yeah. I'd take feedback from Sami as well :)
But both me and Ard will be at plumbers next week, and we are
expecting the stable tag to happen then as well - so that is basically
lost anyway.

Regards,

Leif
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


Re: [edk2] [PATCH] ArmPkg/ArmScmiDxe: Add clock enable function

2018-11-09 Thread Leif Lindholm
On Fri, Nov 09, 2018 at 05:03:53PM +, Jeff Brasen wrote:
> 
> From: Leif Lindholm 
> Sent: Friday, November 9, 2018 7:09 AM
> To: Jeff Brasen
> Cc: edk2-devel@lists.01.org; Ard Biesheuvel; Grish Pathak; Sami Mujawar
> Subject: Re: [PATCH] ArmPkg/ArmScmiDxe: Add clock enable function
> 
> Hi Jeff,
> 
> On Thu, Nov 08, 2018 at 10:50:44AM -0700, Jeff Brasen wrote:
> > Add function to allow enabling and disabling of the clock using the SCMI
> > interface. Update the protocol GUID as the protocol interface has
> > changed.
> 
> Changing a protocol GUID for an interface update feels a bit
> un-idiomatic for tianocore. (Generally, a new version of the protocol
> is added.)
> 
> My main concern is that I can't see how removing the ability to
> discover the protocol by the old GUID could ever have a desirable
> outcome.
> 
> Girish, Sami, what's your take?
> 
> [JB] I was trying to prevent new dynamic apps from crashing on old platforms. 
> I figured this was ok as this is a fairly new non-specification based 
> protocol. I do see the concern with this though. Of the following what is 
> your preference?
> 
> 
>   1.  Add new ArmScmiClock2Protocol.h + guid
>   2.  Add new guid and document that you have to use that guid for the enable 
> function
>   3.  Add new guid under old name and have the old guid installed on
>   the handle as well, this would keep things fairly clean but
>   would have a guid that wouldn't map to a protocol in header
>   form.
>   4.  Just change the protocol without changing the guid, this has
>   the reverse issue of the change I made (except errors can
>   result in a crash) (don't really like this option)

I think my (quite puritan) preference would be
5. Add another guid, describe it in the same .h file.

For example, see (among several others)
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL/EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
in MdePkg/Include/Protocol/FirmwareVolumeBlock.h.
(This may be what you mean by 2?)

It's a bit of a sledgehammer, but it is a well known and common
pattern in edk2.

However, if we do this, I would prefer to take the opportunity to add
any new functions not already implemented at the same time. Do you
know if we have other missing calls?

Now, this _isn't_ a protocol described by any external specification,
so we don't need to be quite as rigid as for public interfaces.
Basically, there shouldn't be (non-debug/non-devtool) dynamic
applications making use of this protocol in the first place. (If we
think there should be, we need to document this GUID and protocol in a
spec somewhere.)
So in reality, I think 4 would also be a valid thing to do.

But I do want feedback from the original author.

Regards,

Leif

> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Jeff Brasen 
> > Cc: Ard Biesheuvel 
> > Cc: Leif Lindholm 
> > Cc: Grish Pathak 
> > ---
> >  ArmPkg/ArmPkg.dec  |  2 +-
> >  .../ArmScmiDxe/ArmScmiClockProtocolPrivate.h   |  7 +++
> >  ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c  | 50 
> > +-
> >  ArmPkg/Include/Protocol/ArmScmiClockProtocol.h | 21 -
> >  4 files changed, 77 insertions(+), 3 deletions(-)
> 
> Could you make sure you follow
> https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt-git-guide-for-edk2-contributors-and-maintainers#contrib-23
> when generating patches (or let os know if you are, and we have more
> git breakage)?
> 
> /
> Leif
> 
> > diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
> > index 84e57a0..a7b55a1 100644
> > --- a/ArmPkg/ArmPkg.dec
> > +++ b/ArmPkg/ArmPkg.dec
> > @@ -57,7 +57,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 } }
> > +  gArmScmiClockProtocolGuid = { 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)  

Re: [edk2] [PATCH] ArmPkg/ArmScmiDxe: Add clock enable function

2018-11-09 Thread Jeff Brasen





From: Leif Lindholm 
Sent: Friday, November 9, 2018 7:09 AM
To: Jeff Brasen
Cc: edk2-devel@lists.01.org; Ard Biesheuvel; Grish Pathak; Sami Mujawar
Subject: Re: [PATCH] ArmPkg/ArmScmiDxe: Add clock enable function

Hi Jeff,

On Thu, Nov 08, 2018 at 10:50:44AM -0700, Jeff Brasen wrote:
> Add function to allow enabling and disabling of the clock using the SCMI
> interface. Update the protocol GUID as the protocol interface has
> changed.

Changing a protocol GUID for an interface update feels a bit
un-idiomatic for tianocore. (Generally, a new version of the protocol
is added.)

My main concern is that I can't see how removing the ability to
discover the protocol by the old GUID could ever have a desirable
outcome.

Girish, Sami, what's your take?

[JB] I was trying to prevent new dynamic apps from crashing on old platforms. I 
figured this was ok as this is a fairly new non-specification based protocol. I 
do see the concern with this though. Of the following what is your preference?


  1.  Add new ArmScmiClock2Protocol.h + guid
  2.  Add new guid and document that you have to use that guid for the enable 
function
  3.  Add new guid under old name and have the old guid installed on the handle 
as well, this would keep things fairly clean but would have a guid that 
wouldn't map to a protocol in header form.
  4.  Just change the protocol without changing the guid, this has the reverse 
issue of the change I made (except errors can result in a crash) (don't really 
like this option)

> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Jeff Brasen 
> Cc: Ard Biesheuvel 
> Cc: Leif Lindholm 
> Cc: Grish Pathak 
> ---
>  ArmPkg/ArmPkg.dec  |  2 +-
>  .../ArmScmiDxe/ArmScmiClockProtocolPrivate.h   |  7 +++
>  ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c  | 50 
> +-
>  ArmPkg/Include/Protocol/ArmScmiClockProtocol.h | 21 -
>  4 files changed, 77 insertions(+), 3 deletions(-)

Could you make sure you follow
https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt-git-guide-for-edk2-contributors-and-maintainers#contrib-23
when generating patches (or let os know if you are, and we have more
git breakage)?

/
Leif

> diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
> index 84e57a0..a7b55a1 100644
> --- a/ArmPkg/ArmPkg.dec
> +++ b/ArmPkg/ArmPkg.dec
> @@ -57,7 +57,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 } }
> +  gArmScmiClockProtocolGuid = { 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/ScmiClockProtocol.c 
> b/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
> index 64d2afa..493eb45 100644
> --- a/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
> +++ b/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
> @@ -388,6 +388,53 @@ ClockRateSet (
>return Status;
>  }
>
> +/** Enable/Disable specified clock.
> +
> +  @param[in]  ThisA 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_CLOCK_PROTOCOL  *This,
> +  IN UINT32   ClockId,
> +  IN BOOLEAN  Enable
> +  )
> +{
> +  EFI_STATUS  Status;
> +  CLOCK_CONFIG_SET_ATTRIBUTES *ClockConfigSetAttributes;
> +  SCMI_COMMANDCmd;
> +  UINT32  PayloadLength;
> +
> +  Status = ScmiCommandGetPayload ((UINT32**));
> +  if (EFI_ERROR (Status)) {
> +return Status;
> +  }
> +
> +  // Fill arguments for clock protocol command.
> +  

Re: [edk2] [PATCH] ArmPkg/ArmScmiDxe: Add clock enable function

2018-11-09 Thread Leif Lindholm
Hi Jeff,

On Thu, Nov 08, 2018 at 10:50:44AM -0700, Jeff Brasen wrote:
> Add function to allow enabling and disabling of the clock using the SCMI
> interface. Update the protocol GUID as the protocol interface has
> changed.

Changing a protocol GUID for an interface update feels a bit
un-idiomatic for tianocore. (Generally, a new version of the protocol
is added.)

My main concern is that I can't see how removing the ability to
discover the protocol by the old GUID could ever have a desirable
outcome.

Girish, Sami, what's your take?

> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Jeff Brasen 
> Cc: Ard Biesheuvel 
> Cc: Leif Lindholm 
> Cc: Grish Pathak 
> ---
>  ArmPkg/ArmPkg.dec  |  2 +-
>  .../ArmScmiDxe/ArmScmiClockProtocolPrivate.h   |  7 +++
>  ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c  | 50 
> +-
>  ArmPkg/Include/Protocol/ArmScmiClockProtocol.h | 21 -
>  4 files changed, 77 insertions(+), 3 deletions(-)

Could you make sure you follow
https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt-git-guide-for-edk2-contributors-and-maintainers#contrib-23
when generating patches (or let os know if you are, and we have more
git breakage)?

/
Leif

> diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
> index 84e57a0..a7b55a1 100644
> --- a/ArmPkg/ArmPkg.dec
> +++ b/ArmPkg/ArmPkg.dec
> @@ -57,7 +57,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 } }
> +  gArmScmiClockProtocolGuid = { 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/ScmiClockProtocol.c 
> b/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
> index 64d2afa..493eb45 100644
> --- a/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
> +++ b/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
> @@ -388,6 +388,53 @@ ClockRateSet (
>return Status;
>  }
>  
> +/** Enable/Disable specified clock.
> +
> +  @param[in]  ThisA 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_CLOCK_PROTOCOL  *This,
> +  IN UINT32   ClockId,
> +  IN BOOLEAN  Enable
> +  )
> +{
> +  EFI_STATUS  Status;
> +  CLOCK_CONFIG_SET_ATTRIBUTES *ClockConfigSetAttributes;
> +  SCMI_COMMANDCmd;
> +  UINT32  PayloadLength;
> +
> +  Status = ScmiCommandGetPayload ((UINT32**));
> +  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 (
> + ,
> + ,
> + NULL
> + );
> +
> +  return Status;
> +}
> +
>  // Instance of the SCMI clock management protocol.
>  STATIC CONST SCMI_CLOCK_PROTOCOL ScmiClockProtocol = {
>ClockGetVersion,
> @@ -395,7 +442,8 @@ STATIC CONST SCMI_CLOCK_PROTOCOL ScmiClockProtocol = {
>ClockGetClockAttributes,
>ClockDescribeRates,
>ClockRateGet,
> -  ClockRateSet
> +  ClockRateSet,
> +  ClockEnable
>   };
>  
>  /** Initialize clock management protocol and install protocol on a given 
> handle.
> diff --git a/ArmPkg/Include/Protocol/ArmScmiClockProtocol.h 
> 

[edk2] [PATCH] ArmPkg/ArmScmiDxe: Add clock enable function

2018-11-08 Thread Jeff Brasen
Add function to allow enabling and disabling of the clock using the SCMI
interface. Update the protocol GUID as the protocol interface has
changed.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jeff Brasen 
Cc: Ard Biesheuvel 
Cc: Leif Lindholm 
Cc: Grish Pathak 
---
 ArmPkg/ArmPkg.dec  |  2 +-
 .../ArmScmiDxe/ArmScmiClockProtocolPrivate.h   |  7 +++
 ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c  | 50 +-
 ArmPkg/Include/Protocol/ArmScmiClockProtocol.h | 21 -
 4 files changed, 77 insertions(+), 3 deletions(-)

diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
index 84e57a0..a7b55a1 100644
--- a/ArmPkg/ArmPkg.dec
+++ b/ArmPkg/ArmPkg.dec
@@ -57,7 +57,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 } }
+  gArmScmiClockProtocolGuid = { 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/ScmiClockProtocol.c 
b/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
index 64d2afa..493eb45 100644
--- a/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
+++ b/ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
@@ -388,6 +388,53 @@ ClockRateSet (
   return Status;
 }
 
+/** Enable/Disable specified clock.
+
+  @param[in]  ThisA 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_CLOCK_PROTOCOL  *This,
+  IN UINT32   ClockId,
+  IN BOOLEAN  Enable
+  )
+{
+  EFI_STATUS  Status;
+  CLOCK_CONFIG_SET_ATTRIBUTES *ClockConfigSetAttributes;
+  SCMI_COMMANDCmd;
+  UINT32  PayloadLength;
+
+  Status = ScmiCommandGetPayload ((UINT32**));
+  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 (
+ ,
+ ,
+ NULL
+ );
+
+  return Status;
+}
+
 // Instance of the SCMI clock management protocol.
 STATIC CONST SCMI_CLOCK_PROTOCOL ScmiClockProtocol = {
   ClockGetVersion,
@@ -395,7 +442,8 @@ STATIC CONST SCMI_CLOCK_PROTOCOL ScmiClockProtocol = {
   ClockGetClockAttributes,
   ClockDescribeRates,
   ClockRateGet,
-  ClockRateSet
+  ClockRateSet,
+  ClockEnable
  };
 
 /** Initialize clock management protocol and install protocol on a given 
handle.
diff --git a/ArmPkg/Include/Protocol/ArmScmiClockProtocol.h 
b/ArmPkg/Include/Protocol/ArmScmiClockProtocol.h
index 3db26cb..d367f37 100644
--- a/ArmPkg/Include/Protocol/ArmScmiClockProtocol.h
+++ b/ArmPkg/Include/Protocol/ArmScmiClockProtocol.h
@@ -21,7 +21,7 @@
 #include 
 
 #define ARM_SCMI_CLOCK_PROTOCOL_GUID { \
-  0x91ce67a8, 0xe0aa, 0x4012, {0xb9, 0x9f, 0xb6, 0xfc, 0xf3, 0x4, 0x8e, 0xaa} \
+  0xb8d8caf2, 0x9e94, 0x462c, { 0xa8, 0x34, 0x6c, 0x99, 0xfc, 0x05, 0xef, 0xcf 
} \
   }
 
 extern EFI_GUID gArmScmiClockProtocolGuid;
@@ -205,6 +205,24 @@ EFI_STATUS
   IN UINT64   Rate
   );
 
+/** Enable/Disable specified clock.
+
+  @param[in]  ThisA 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