[U-Boot] [PATCH 1/4] imx: mx6: display max cpu frequency in print_cpuinfo()
Markus Niebel
list-09_u-boot at tqsc.de
Wed Apr 29 10:08:22 CEST 2015
Hello Tim,
Am 28.04.2015 um 17:44 schrieb Tim Harvey:
> The IMX6 has four different speed grades determined by eFUSE SPEED_GRADING
> (OCOTP_CFG3[17:16]).
>
> Display this value to make it clear the difference regarding the CPU speed
> currently running at vs the max speed allowed per grade. Note that the power
> on CPU speed is determined by OCOTP_CFG4[18].
>
> I see no indication in the IMX6SX reference manual that it has the same CPU
> speed grades in this OTP register.
>
AFAIK there is no speed grading info for i.MX6 Solo / DualLight in OTP.
> Signed-off-by: Tim Harvey <tharvey at gateworks.com>
> ---
> arch/arm/cpu/armv7/mx6/soc.c | 26 ++++++++++++++++++++++++++
> arch/arm/imx-common/cpu.c | 17 +++++++++++++++++
> arch/arm/include/asm/arch-mx6/sys_proto.h | 1 +
> arch/arm/include/asm/proc | 1 +
> 4 files changed, 45 insertions(+)
> create mode 120000 arch/arm/include/asm/proc
>
> diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c
> index dd34138..dc422a6 100644
> --- a/arch/arm/cpu/armv7/mx6/soc.c
> +++ b/arch/arm/cpu/armv7/mx6/soc.c
> @@ -83,6 +83,32 @@ u32 get_cpu_rev(void)
> return (type << 12) | (reg + 0x10);
> }
>
> +#define OCOTP_CFG3_SPEED_SHIFT 16
> +#define OCOTP_CFG3_SPEED_1P2GHZ 0x3
> +#define OCOTP_CFG3_SPEED_996MHZ 0x2
> +#define OCOTP_CFG3_SPEED_852MHZ 0x1
> +
> +u32 get_cpu_speed_grade_hz(void)
> +{
> + struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
> + struct fuse_bank *bank = &ocotp->bank[0];
> + struct fuse_bank0_regs *fuse =
> + (struct fuse_bank0_regs *)bank->fuse_regs;
> + uint32_t val;
> +
> + val = readl(&fuse->cfg3);
> + val >>= OCOTP_CFG3_SPEED_SHIFT;
> + val &= 0x3;
> +
> + if (val == OCOTP_CFG3_SPEED_1P2GHZ)
> + return 1200000000;
> + if (val == OCOTP_CFG3_SPEED_996MHZ)
> + return 996000000;
> + if (val == OCOTP_CFG3_SPEED_852MHZ)
> + return 852000000;
> + return 792000000;
> +}
> +
> #ifdef CONFIG_REVISION_TAG
> u32 __weak get_board_rev(void)
> {
> diff --git a/arch/arm/imx-common/cpu.c b/arch/arm/imx-common/cpu.c
> index 067d08f..ead7f08 100644
> --- a/arch/arm/imx-common/cpu.c
> +++ b/arch/arm/imx-common/cpu.c
> @@ -151,11 +151,28 @@ int print_cpuinfo(void)
>
> cpurev = get_cpu_rev();
>
> +#if defined(CONFIG_MX6)
> + printf("CPU: Freescale i.MX%s rev%d.%d",
> + get_imx_type((cpurev & 0xFF000) >> 12),
> + (cpurev & 0x000F0) >> 4,
> + (cpurev & 0x0000F) >> 0);
> + if (is_cpu_type(MXC_CPU_MX6SX))
> + printf(" at %d MHz", mxc_get_clock(MXC_ARM_CLK) / 1000000);
> + else {
> + printf(" %d MHz", get_cpu_speed_grade_hz() / 1000000);
> + if (get_cpu_speed_grade_hz() != mxc_get_clock(MXC_ARM_CLK)) {
> + printf(" (at %d MHz)",
> + mxc_get_clock(MXC_ARM_CLK) / 1000000);
> + }
> + }
> + puts("\n");
> +#else
> printf("CPU: Freescale i.MX%s rev%d.%d at %d MHz\n",
> get_imx_type((cpurev & 0xFF000) >> 12),
> (cpurev & 0x000F0) >> 4,
> (cpurev & 0x0000F) >> 0,
> mxc_get_clock(MXC_ARM_CLK) / 1000000);
> +#endif
>
> #if defined(CONFIG_MX6) && defined(CONFIG_IMX6_THERMAL)
> ret = uclass_get_device(UCLASS_THERMAL, 0, &thermal_dev);
> diff --git a/arch/arm/include/asm/arch-mx6/sys_proto.h b/arch/arm/include/asm/arch-mx6/sys_proto.h
> index 28ba844..a2cd0a9 100644
> --- a/arch/arm/include/asm/arch-mx6/sys_proto.h
> +++ b/arch/arm/include/asm/arch-mx6/sys_proto.h
> @@ -16,6 +16,7 @@
>
> u32 get_nr_cpus(void);
> u32 get_cpu_rev(void);
> +u32 get_cpu_speed_grade_hz(void);
>
> /* returns MXC_CPU_ value */
> #define cpu_type(rev) (((rev) >> 12)&0xff)
> diff --git a/arch/arm/include/asm/proc b/arch/arm/include/asm/proc
> new file mode 120000
> index 0000000..c7f3c20
> --- /dev/null
> +++ b/arch/arm/include/asm/proc
> @@ -0,0 +1 @@
> +proc-armv
> \ No newline at end of file
>
More information about the U-Boot
mailing list