[PATCH 3/3] arm: mach-k3: am62a: Fixup a53 max cpu frequency by speed-grade

Aparna Patra a-patra at ti.com
Wed May 28 12:14:48 CEST 2025


On 02/05/25 15:02, Daniel Schultz wrote:
>
> On 4/30/25 12:42, Aparna Patra wrote:
>> AM62A SoC has multiple speed grades. Add function to delete
>> non-relevant CPU frequency nodes, based on the information
>> retrieved from hardware registers. Fastest grade's maximum
>> frequency also depends on PMIC voltage,hence to simplify
>> implementation use the smaller value.
>>
>> Signed-off-by: Aparna Patra <a-patra at ti.com>
>> ---
>>   arch/arm/mach-k3/am62ax/am62a7_fdt.c          | 14 +++++++++++
>>   .../arm/mach-k3/include/mach/am62a_hardware.h | 23 +++++++++++++++++++
>>   2 files changed, 37 insertions(+)
>>
>> diff --git a/arch/arm/mach-k3/am62ax/am62a7_fdt.c 
>> b/arch/arm/mach-k3/am62ax/am62a7_fdt.c
>> index 40833ca392..9526c5b255 100644
>> --- a/arch/arm/mach-k3/am62ax/am62a7_fdt.c
>> +++ b/arch/arm/mach-k3/am62ax/am62a7_fdt.c
>> @@ -81,6 +81,19 @@ static void 
>> fdt_fixup_thermal_zone_nodes_am62a(void *blob, int maxc)
>>       }
>>   }
>>   +static void fdt_fixup_cpu_freq_nodes_am62a(void *blob, int max_freq)
>> +{
>> +    if (max_freq >= 1250000000)
>> +        return;
> I dont think this if case is required. Just let if fail both following 
> conditions.
Agreed, will remove this.
>> +    if (max_freq <= 1000000000) {
>> +        fdt_del_node_path(blob, "/opp-table/opp-1250000000");
>> +        fdt_del_node_path(blob, "/opp-table/opp-1400000000");
>> +    }
>> +    if (max_freq <= 800000000) {
>> +        fdt_del_node_path(blob, "/opp-table/opp-1000000000");
>> +    }
>> +}
>> +
>>   int ft_system_setup(void *blob, struct bd_info *bd)
>>   {
>>       fdt_fixup_cores_wdt_nodes_am62a(blob, k3_get_core_nr());
>> @@ -88,6 +101,7 @@ int ft_system_setup(void *blob, struct bd_info *bd)
>>       fdt_fixup_video_codec_nodes_am62a(blob, k3_has_video_codec());
>>       fdt_fixup_canfd_nodes_am62a(blob, k3_has_canfd());
>>       fdt_fixup_thermal_zone_nodes_am62a(blob, k3_get_max_temp());
>> +    fdt_fixup_cpu_freq_nodes_am62a(blob, k3_get_a53_max_frequency());
>>       fdt_fixup_reserved(blob, "tfa", CONFIG_K3_ATF_LOAD_ADDR, 0x80000);
>>       fdt_fixup_reserved(blob, "optee", CONFIG_K3_OPTEE_LOAD_ADDR, 
>> 0x1800000);
>>   diff --git a/arch/arm/mach-k3/include/mach/am62a_hardware.h 
>> b/arch/arm/mach-k3/include/mach/am62a_hardware.h
>> index 0ec04a72f5..64e4a379fa 100644
>> --- a/arch/arm/mach-k3/include/mach/am62a_hardware.h
>> +++ b/arch/arm/mach-k3/include/mach/am62a_hardware.h
>> @@ -28,6 +28,8 @@
>>   #define JTAG_DEV_VIDEO_CODEC_SHIFT            14
>>   #define JTAG_DEV_DSS_MASK            GENMASK(16, 13)
>>   #define JTAG_DEV_DSS_SHIFT            13
>> +#define JTAG_DEV_SPEED_MASK            GENMASK(10, 6)
>> +#define JTAG_DEV_SPEED_SHIFT            6
>>   #define JTAG_DEV_TEMP_MASK            GENMASK(5, 3)
>>   #define JTAG_DEV_TEMP_SHIFT            3
>>   @@ -144,6 +146,27 @@ static inline int k3_get_max_temp(void)
>>           return JTAG_DEV_TEMP_EXTENDED_VALUE;
>>   }
>>   +static inline char k3_get_speed_grade(void)
>> +{
>> +    u32 dev_id = readl(CTRLMMR_WKUP_JTAG_DEVICE_ID);
>> +    u32 speed_grade = (dev_id & JTAG_DEV_SPEED_MASK) >>
>> +               JTAG_DEV_SPEED_SHIFT;
>> +
>> +    return 'A' - 1 + speed_grade;
>> +}
>> +
>> +static inline int k3_get_a53_max_frequency(void)
>> +{
>> +    if (k3_get_speed_grade() <= 'N')
>> +        return 800000000;
>> +
>
> ^ empty lines where should be none in this function.
>
> - Daniel

Will remove the empty lines as well.
Thanks!

>
>> +    else if (k3_get_speed_grade() <= 'R')
>> +        return 1000000000;
>> +
>> +    else
>> +        return 1250000000;
>> +}
>> +
>>   #if defined(CONFIG_SYS_K3_SPL_ATF) && !defined(__ASSEMBLY__)
>>     static const u32 put_device_ids[] = {};


More information about the U-Boot mailing list