mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-21 04:34:27 +02:00
ArmPkg/ArmScmiDxe: Add PERFORMANCE_DESCRIBE_FASTCHANNEL support
The PERFORMANCE_DESCRIBE_FASTCHANNEL Scmi command is available since SCMI v2.0 and allows to query information about the supported fast-channels of the Scmi performance protocol. Add support for this command. Also move SCMI_MESSAGE_ID_PERFORMANCE enum definition up in the file to use it in SCMI_PERFORMANCE_DESCRIBE_FASTCHANNEL function declaration. Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com> Acked-by: Ard Biesheuvel <ardb@kernel.org> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
This commit is contained in:
parent
3630cdf6e7
commit
9f0ebabb57
@ -1,12 +1,12 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2017-2023, Arm Limited. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
System Control and Management Interface V1.0
|
System Control and Management Interface V3.2, latest version at:
|
||||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
- https://developer.arm.com/documentation/den0056/latest/
|
||||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
@ -416,6 +416,75 @@ PerformanceLevelGet (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Discover the attributes of the FastChannel for the specified
|
||||||
|
performance domain and the specified message.
|
||||||
|
|
||||||
|
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||||
|
@param[in] DomainId Identifier for the performance domain.
|
||||||
|
@param[in] MessageId Message Id of the FastChannel to discover.
|
||||||
|
Must be one of:
|
||||||
|
- PERFORMANCE_LIMITS_SET
|
||||||
|
- PERFORMANCE_LIMITS_GET
|
||||||
|
- PERFORMANCE_LEVEL_SET
|
||||||
|
- PERFORMANCE_LEVEL_GET
|
||||||
|
@param[out] FastChannel If success, contains the FastChannel description.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Performance level got successfully.
|
||||||
|
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||||
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
||||||
|
@retval EFI_TIMEOUT Time out.
|
||||||
|
@retval EFI_UNSUPPORTED Unsupported.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
DescribeFastchannel (
|
||||||
|
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||||
|
IN UINT32 DomainId,
|
||||||
|
IN SCMI_MESSAGE_ID_PERFORMANCE MessageId,
|
||||||
|
OUT SCMI_PERFORMANCE_FASTCHANNEL *FastChannel
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
SCMI_COMMAND Cmd;
|
||||||
|
UINT32 PayloadLength;
|
||||||
|
UINT32 *ReturnValues;
|
||||||
|
UINT32 *MessageParams;
|
||||||
|
|
||||||
|
if ((This == NULL) ||
|
||||||
|
(FastChannel == NULL))
|
||||||
|
{
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = ScmiCommandGetPayload (&MessageParams);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
*MessageParams++ = DomainId;
|
||||||
|
*MessageParams = MessageId;
|
||||||
|
|
||||||
|
Cmd.ProtocolId = ScmiProtocolIdPerformance;
|
||||||
|
Cmd.MessageId = ScmiMessageIdPerformanceDescribeFastchannel;
|
||||||
|
PayloadLength = sizeof (DomainId) + sizeof (MessageId);
|
||||||
|
|
||||||
|
Status = ScmiCommandExecute (
|
||||||
|
&Cmd,
|
||||||
|
&PayloadLength,
|
||||||
|
&ReturnValues
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
CopyMem (
|
||||||
|
FastChannel,
|
||||||
|
ReturnValues,
|
||||||
|
sizeof (SCMI_PERFORMANCE_FASTCHANNEL)
|
||||||
|
);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
// Instance of the SCMI performance management protocol.
|
// Instance of the SCMI performance management protocol.
|
||||||
STATIC CONST SCMI_PERFORMANCE_PROTOCOL PerformanceProtocol = {
|
STATIC CONST SCMI_PERFORMANCE_PROTOCOL PerformanceProtocol = {
|
||||||
PerformanceGetVersion,
|
PerformanceGetVersion,
|
||||||
@ -425,7 +494,8 @@ STATIC CONST SCMI_PERFORMANCE_PROTOCOL PerformanceProtocol = {
|
|||||||
PerformanceLimitsSet,
|
PerformanceLimitsSet,
|
||||||
PerformanceLimitsGet,
|
PerformanceLimitsGet,
|
||||||
PerformanceLevelSet,
|
PerformanceLevelSet,
|
||||||
PerformanceLevelGet
|
PerformanceLevelGet,
|
||||||
|
DescribeFastchannel,
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Initialize performance management protocol and install on a given Handle.
|
/** Initialize performance management protocol and install on a given Handle.
|
||||||
|
@ -79,8 +79,58 @@ typedef struct {
|
|||||||
UINT32 RangeMin;
|
UINT32 RangeMin;
|
||||||
} SCMI_PERFORMANCE_LIMITS;
|
} SCMI_PERFORMANCE_LIMITS;
|
||||||
|
|
||||||
|
/// Doorbell Support bit.
|
||||||
|
#define SCMI_PERF_FC_ATTRIB_HAS_DOORBELL BIT0
|
||||||
|
|
||||||
|
/// Performance protocol describe fastchannel
|
||||||
|
typedef struct {
|
||||||
|
/// Attributes.
|
||||||
|
UINT32 Attributes;
|
||||||
|
|
||||||
|
/// Rate limit.
|
||||||
|
UINT32 RateLimit;
|
||||||
|
|
||||||
|
/// Lower 32 bits of the FastChannel address.
|
||||||
|
UINT32 ChanAddrLow;
|
||||||
|
|
||||||
|
/// Higher 32 bits of the FastChannel address.
|
||||||
|
UINT32 ChanAddrHigh;
|
||||||
|
|
||||||
|
/// Size of the FastChannel in bytes.
|
||||||
|
UINT32 ChanSize;
|
||||||
|
|
||||||
|
/// Lower 32 bits of the doorbell address.
|
||||||
|
UINT32 DoorbellAddrLow;
|
||||||
|
|
||||||
|
/// Higher 32 bits of the doorbell address.
|
||||||
|
UINT32 DoorbellAddrHigh;
|
||||||
|
|
||||||
|
/// Mask of lower 32 bits to set when writing to the doorbell register.
|
||||||
|
UINT32 DoorbellSetMaskLow;
|
||||||
|
|
||||||
|
/// Mask of higher 32 bits to set when writing to the doorbell register.
|
||||||
|
UINT32 DoorbellSetMaskHigh;
|
||||||
|
|
||||||
|
/// Mask of lower 32 bits to preserve when writing to the doorbell register.
|
||||||
|
UINT32 DoorbellPreserveMaskLow;
|
||||||
|
|
||||||
|
/// Mask of higher 32 bits to preserve when writing to the doorbell register.
|
||||||
|
UINT32 DoorbellPreserveMaskHigh;
|
||||||
|
} SCMI_PERFORMANCE_FASTCHANNEL;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
/// SCMI Message Ids for the Performance Protocol.
|
||||||
|
typedef enum {
|
||||||
|
ScmiMessageIdPerformanceDomainAttributes = 0x3,
|
||||||
|
ScmiMessageIdPerformanceDescribeLevels = 0x4,
|
||||||
|
ScmiMessageIdPerformanceLimitsSet = 0x5,
|
||||||
|
ScmiMessageIdPerformanceLimitsGet = 0x6,
|
||||||
|
ScmiMessageIdPerformanceLevelSet = 0x7,
|
||||||
|
ScmiMessageIdPerformanceLevelGet = 0x8,
|
||||||
|
ScmiMessageIdPerformanceDescribeFastchannel = 0xB,
|
||||||
|
} SCMI_MESSAGE_ID_PERFORMANCE;
|
||||||
|
|
||||||
/** Return version of the performance management protocol supported by SCP.
|
/** Return version of the performance management protocol supported by SCP.
|
||||||
firmware.
|
firmware.
|
||||||
|
|
||||||
@ -238,6 +288,34 @@ EFI_STATUS
|
|||||||
OUT UINT32 *Level
|
OUT UINT32 *Level
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/** Discover the attributes of the FastChannel for the specified
|
||||||
|
performance domain and the specified message.
|
||||||
|
|
||||||
|
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||||
|
@param[in] DomainId Identifier for the performance domain.
|
||||||
|
@param[in] MessageId Message Id of the FastChannel to discover.
|
||||||
|
Must be one of:
|
||||||
|
- PERFORMANCE_LIMITS_SET
|
||||||
|
- PERFORMANCE_LIMITS_GET
|
||||||
|
- PERFORMANCE_LEVEL_SET
|
||||||
|
- PERFORMANCE_LEVEL_GET
|
||||||
|
@param[out] FastChannel If success, contains the FastChannel description.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Performance level got successfully.
|
||||||
|
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||||
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
||||||
|
@retval EFI_TIMEOUT Time out.
|
||||||
|
@retval EFI_UNSUPPORTED Unsupported.
|
||||||
|
**/
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *SCMI_PERFORMANCE_DESCRIBE_FASTCHANNEL)(
|
||||||
|
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||||
|
IN UINT32 DomainId,
|
||||||
|
IN SCMI_MESSAGE_ID_PERFORMANCE MessageId,
|
||||||
|
OUT SCMI_PERFORMANCE_FASTCHANNEL *FastChannel
|
||||||
|
);
|
||||||
|
|
||||||
typedef struct _SCMI_PERFORMANCE_PROTOCOL {
|
typedef struct _SCMI_PERFORMANCE_PROTOCOL {
|
||||||
SCMI_PERFORMANCE_GET_VERSION GetVersion;
|
SCMI_PERFORMANCE_GET_VERSION GetVersion;
|
||||||
SCMI_PERFORMANCE_GET_ATTRIBUTES GetProtocolAttributes;
|
SCMI_PERFORMANCE_GET_ATTRIBUTES GetProtocolAttributes;
|
||||||
@ -247,15 +325,7 @@ typedef struct _SCMI_PERFORMANCE_PROTOCOL {
|
|||||||
SCMI_PERFORMANCE_LIMITS_GET LimitsGet;
|
SCMI_PERFORMANCE_LIMITS_GET LimitsGet;
|
||||||
SCMI_PERFORMANCE_LEVEL_SET LevelSet;
|
SCMI_PERFORMANCE_LEVEL_SET LevelSet;
|
||||||
SCMI_PERFORMANCE_LEVEL_GET LevelGet;
|
SCMI_PERFORMANCE_LEVEL_GET LevelGet;
|
||||||
|
SCMI_PERFORMANCE_DESCRIBE_FASTCHANNEL DescribeFastchannel;
|
||||||
} SCMI_PERFORMANCE_PROTOCOL;
|
} SCMI_PERFORMANCE_PROTOCOL;
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
ScmiMessageIdPerformanceDomainAttributes = 0x3,
|
|
||||||
ScmiMessageIdPerformanceDescribeLevels = 0x4,
|
|
||||||
ScmiMessageIdPerformanceLimitsSet = 0x5,
|
|
||||||
ScmiMessageIdPerformanceLimitsGet = 0x6,
|
|
||||||
ScmiMessageIdPerformanceLevelSet = 0x7,
|
|
||||||
ScmiMessageIdPerformanceLevelGet = 0x8,
|
|
||||||
} SCMI_MESSAGE_ID_PERFORMANCE;
|
|
||||||
|
|
||||||
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */
|
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user