Skip to content

Commit

Permalink
RK356x: Add CPU clock configuration menu.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaredmcneill committed Apr 15, 2023
1 parent 40434a7 commit 4beccdf
Show file tree
Hide file tree
Showing 16 changed files with 259 additions and 664 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/BaseCryptLib.h>
#include <Protocol/ArmScmi.h>
#include <Protocol/ArmScmiClockProtocol.h>

#include <IndustryStandard/Rk356x.h>
#include <IndustryStandard/Rk356xCru.h>
Expand Down Expand Up @@ -118,133 +116,6 @@ STATIC CONST GPIO_IOMUX_CONFIG mSdmmc1IomuxConfig[] = {
{ "sdmmc1_det", 2, GPIO_PIN_PB2, 0, GPIO_PIN_PULL_NONE, GPIO_PIN_DRIVE_DEFAULT },
};

STATIC
EFI_STATUS
BoardInitSetCpuSpeed (
VOID
)
{
EFI_STATUS Status;
SCMI_CLOCK_PROTOCOL *ClockProtocol;
EFI_GUID ClockProtocolGuid = ARM_SCMI_CLOCK_PROTOCOL_GUID;
UINT64 CpuRate;
UINT32 ClockId;
UINT32 ClockProtocolVersion;
BOOLEAN Enabled;
CHAR8 ClockName[SCMI_MAX_STR_LEN];
UINT32 TotalRates = 0;
UINT32 ClockRateSize;
SCMI_CLOCK_RATE *ClockRate;
SCMI_CLOCK_RATE_FORMAT ClockRateFormat;

Status = gBS->LocateProtocol (
&ClockProtocolGuid,
NULL,
(VOID**)&ClockProtocol
);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

Status = ClockProtocol->GetVersion (ClockProtocol, &ClockProtocolVersion);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
DEBUG ((DEBUG_ERROR, "SCMI clock management protocol version = %x\n",
ClockProtocolVersion));

ClockId = 0;

Status = ClockProtocol->GetClockAttributes (
ClockProtocol,
ClockId,
&Enabled,
ClockName
);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

Status = ClockProtocol->RateGet (ClockProtocol, ClockId, &CpuRate);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

DEBUG ((DEBUG_INFO, "SCMI: %a: Current rate is %uHz\n", ClockName, CpuRate));

TotalRates = 0;
ClockRateSize = 0;
Status = ClockProtocol->DescribeRates (
ClockProtocol,
ClockId,
&ClockRateFormat,
&TotalRates,
&ClockRateSize,
ClockRate
);
if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {
ASSERT_EFI_ERROR (Status);
return Status;
}
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
ASSERT (TotalRates > 0);
ASSERT (ClockRateFormat == ScmiClockRateFormatDiscrete);
if (Status != EFI_BUFFER_TOO_SMALL ||
TotalRates == 0 ||
ClockRateFormat != ScmiClockRateFormatDiscrete) {
return EFI_DEVICE_ERROR;
}

ClockRateSize = sizeof (*ClockRate) * TotalRates;
ClockRate = AllocatePool (ClockRateSize);
ASSERT (ClockRate != NULL);
if (ClockRate == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = ClockProtocol->DescribeRates (
ClockProtocol,
ClockId,
&ClockRateFormat,
&TotalRates,
&ClockRateSize,
ClockRate
);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
FreePool (ClockRate);
return Status;
}

CpuRate = ClockRate[TotalRates - 1].DiscreteRate.Rate;
FreePool (ClockRate);

DEBUG ((DEBUG_INFO, "SCMI: %a: New rate is %uHz\n", ClockName, CpuRate));

Status = ClockProtocol->RateSet (
ClockProtocol,
ClockId,
CpuRate
);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

Status = ClockProtocol->RateGet (ClockProtocol, ClockId, &CpuRate);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

DEBUG ((DEBUG_INFO, "SCMI: %a: Current rate is %uHz\n", ClockName, CpuRate));

return EFI_SUCCESS;
}

STATIC
VOID
BoardInitGmac (
Expand Down Expand Up @@ -434,9 +305,6 @@ BoardInitDriverEntryPoint (
GpioPinSetDirection (0, GPIO_PIN_PD3, GPIO_PIN_OUTPUT);
GpioPinWrite (0, GPIO_PIN_PD3, TRUE);

/* Update CPU speed */
BoardInitSetCpuSpeed ();

/* Enable automatic clock gating */
MmioWrite32 (PMU_NOC_AUTO_CON0, 0xFFFFFFFFU);
MmioWrite32 (PMU_NOC_AUTO_CON1, 0x000F000FU);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,8 @@
# ConfigDxe
#
gRk356xTokenSpaceGuid.PcdSystemTableMode|L"SystemTableMode"|gConfigDxeFormSetGuid|0x0|0
gRk356xTokenSpaceGuid.PcdCpuClock|L"CpuClock"|gConfigDxeFormSetGuid|0x0|2
gRk356xTokenSpaceGuid.PcdCustomCpuClock|L"CustomCpuClock"|gConfigDxeFormSetGuid|0x0|816

#
# Common UEFI ones.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/BaseCryptLib.h>
#include <Protocol/ArmScmi.h>
#include <Protocol/ArmScmiClockProtocol.h>

#include <IndustryStandard/Rk356x.h>
#include <IndustryStandard/Rk356xCru.h>
Expand Down Expand Up @@ -159,133 +157,6 @@ STATIC CONST GPIO_IOMUX_CONFIG mPcie30x2IomuxConfig[] = {
{ "pcie30x2_wakenm1", 2, GPIO_PIN_PD5, 4, GPIO_PIN_PULL_NONE, GPIO_PIN_DRIVE_DEFAULT },
};

STATIC
EFI_STATUS
BoardInitSetCpuSpeed (
VOID
)
{
EFI_STATUS Status;
SCMI_CLOCK_PROTOCOL *ClockProtocol;
EFI_GUID ClockProtocolGuid = ARM_SCMI_CLOCK_PROTOCOL_GUID;
UINT64 CpuRate;
UINT32 ClockId;
UINT32 ClockProtocolVersion;
BOOLEAN Enabled;
CHAR8 ClockName[SCMI_MAX_STR_LEN];
UINT32 TotalRates = 0;
UINT32 ClockRateSize;
SCMI_CLOCK_RATE *ClockRate;
SCMI_CLOCK_RATE_FORMAT ClockRateFormat;

Status = gBS->LocateProtocol (
&ClockProtocolGuid,
NULL,
(VOID**)&ClockProtocol
);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

Status = ClockProtocol->GetVersion (ClockProtocol, &ClockProtocolVersion);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
DEBUG ((DEBUG_ERROR, "SCMI clock management protocol version = %x\n",
ClockProtocolVersion));

ClockId = 0;

Status = ClockProtocol->GetClockAttributes (
ClockProtocol,
ClockId,
&Enabled,
ClockName
);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

Status = ClockProtocol->RateGet (ClockProtocol, ClockId, &CpuRate);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

DEBUG ((DEBUG_INFO, "SCMI: %a: Current rate is %uHz\n", ClockName, CpuRate));

TotalRates = 0;
ClockRateSize = 0;
Status = ClockProtocol->DescribeRates (
ClockProtocol,
ClockId,
&ClockRateFormat,
&TotalRates,
&ClockRateSize,
ClockRate
);
if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {
ASSERT_EFI_ERROR (Status);
return Status;
}
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
ASSERT (TotalRates > 0);
ASSERT (ClockRateFormat == ScmiClockRateFormatDiscrete);
if (Status != EFI_BUFFER_TOO_SMALL ||
TotalRates == 0 ||
ClockRateFormat != ScmiClockRateFormatDiscrete) {
return EFI_DEVICE_ERROR;
}

ClockRateSize = sizeof (*ClockRate) * TotalRates;
ClockRate = AllocatePool (ClockRateSize);
ASSERT (ClockRate != NULL);
if (ClockRate == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = ClockProtocol->DescribeRates (
ClockProtocol,
ClockId,
&ClockRateFormat,
&TotalRates,
&ClockRateSize,
ClockRate
);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
FreePool (ClockRate);
return Status;
}

CpuRate = ClockRate[TotalRates - 1].DiscreteRate.Rate;
FreePool (ClockRate);

DEBUG ((DEBUG_INFO, "SCMI: %a: New rate is %uHz\n", ClockName, CpuRate));

Status = ClockProtocol->RateSet (
ClockProtocol,
ClockId,
CpuRate
);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

Status = ClockProtocol->RateGet (ClockProtocol, ClockId, &CpuRate);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}

DEBUG ((DEBUG_INFO, "SCMI: %a: Current rate is %uHz\n", ClockName, CpuRate));

return EFI_SUCCESS;
}

STATIC
VOID
BoardInitGmac (
Expand Down Expand Up @@ -541,9 +412,6 @@ BoardInitDriverEntryPoint (
GpioPinSetInput (3, GPIO_PIN_PB4, GPIO_PIN_INPUT_SCHMITT);
GpioPinSetFunction (3, GPIO_PIN_PB4, 4);

/* Update CPU speed */
BoardInitSetCpuSpeed ();

/* Enable automatic clock gating */
MmioWrite32 (PMU_NOC_AUTO_CON0, 0xFFFFFFFFU);
MmioWrite32 (PMU_NOC_AUTO_CON1, 0x000F000FU);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,8 @@
# ConfigDxe
#
gRk356xTokenSpaceGuid.PcdSystemTableMode|L"SystemTableMode"|gConfigDxeFormSetGuid|0x0|0
gRk356xTokenSpaceGuid.PcdCpuClock|L"CpuClock"|gConfigDxeFormSetGuid|0x0|2
gRk356xTokenSpaceGuid.PcdCustomCpuClock|L"CustomCpuClock"|gConfigDxeFormSetGuid|0x0|816

#
# Common UEFI ones.
Expand Down
Loading

0 comments on commit 4beccdf

Please sign in to comment.