[U-Boot] [PATCH 11/19] a70x0: a80x0: add soc type and revision printing in boot log
Stefan Roese
sr at denx.de
Tue Nov 20 07:13:10 UTC 2018
Hi Kosta,
On 29.08.18 10:56, kostap at marvell.com wrote:
> From: zachary zhang <zhangzg at marvell.com>
>
> This patch adds SoC type and revision and each module's type
> and revision printing for a7k and a8k boards.
>
> Signed-off-by: zachary zhang <zhangzg at marvell.com>
> Reviewed-by: Igal Liberman <igall at marvell.com>
> Cc: Stefan Roese <sr at denx.de>
> Cc: Simon Glass <sjg at chromium.org>
> ---
> arch/arm/mach-mvebu/armada8k/Makefile | 1 +
> arch/arm/mach-mvebu/armada8k/cpu.c | 9 +++
> arch/arm/mach-mvebu/armada8k/soc.c | 130 +++++++++++++++++++++++++++++++++
> arch/arm/mach-mvebu/include/mach/soc.h | 3 +
> common/board_f.c | 6 +-
> 5 files changed, 146 insertions(+), 3 deletions(-)
> create mode 100644 arch/arm/mach-mvebu/armada8k/soc.c
Such CPU / SoC info collection and printing should be done nowadays in
a DM CPU driver instead. Please take a look at this driver for example:
drivers/cpu/mpc83xx_cpu.c
Thanks,
Stefan
> diff --git a/arch/arm/mach-mvebu/armada8k/Makefile b/arch/arm/mach-mvebu/armada8k/Makefile
> index 82cb25b..19503f7 100644
> --- a/arch/arm/mach-mvebu/armada8k/Makefile
> +++ b/arch/arm/mach-mvebu/armada8k/Makefile
> @@ -3,4 +3,5 @@
> # Copyright (C) 2016 Stefan Roese <sr at denx.de>
>
> obj-y = cpu.o
> +obj-y += soc.o
> obj-y += cache_llc.o
> diff --git a/arch/arm/mach-mvebu/armada8k/cpu.c b/arch/arm/mach-mvebu/armada8k/cpu.c
> index f8e8e73..dd028e5 100644
> --- a/arch/arm/mach-mvebu/armada8k/cpu.c
> +++ b/arch/arm/mach-mvebu/armada8k/cpu.c
> @@ -12,6 +12,7 @@
> #include <asm/arch/cpu.h>
> #include <asm/arch/soc.h>
> #include <asm/armv8/mmu.h>
> +#include <mach/soc.h>
>
> /* Armada 7k/8k */
> #define MVEBU_RFU_BASE (MVEBU_REGISTER(0x6f0000))
> @@ -125,3 +126,11 @@ u32 mvebu_get_nand_clock(void)
> else
> return 250 * 1000000;
> }
> +
> +#if defined(CONFIG_DISPLAY_BOARDINFO)
> +int print_cpuinfo(void)
> +{
> + soc_print_device_info();
> + return 0;
> +}
> +#endif
> diff --git a/arch/arm/mach-mvebu/armada8k/soc.c b/arch/arm/mach-mvebu/armada8k/soc.c
> new file mode 100644
> index 0000000..511c734
> --- /dev/null
> +++ b/arch/arm/mach-mvebu/armada8k/soc.c
> @@ -0,0 +1,130 @@
> +/*
> + * Copyright (C) 2018 Marvell International Ltd.
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + * https://spdx.org/licenses
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/arch/soc.h>
> +
> +#define CP_DEV_ID_STATUS_REG (MVEBU_REGISTER(0x2400240))
> +#define DEVICE_ID_STATUS_MASK 0xffff
> +#define SW_REV_STATUS_OFFSET 16
> +#define SW_REV_STATUS_MASK 0xf
> +
> +struct mochi_module {
> + u32 module_type;
> + u32 module_rev;
> +};
> +
> +struct soc_info {
> + struct mochi_module soc;
> + char *soc_name;
> + struct mochi_module ap;
> + struct mochi_module cp;
> + u32 ap_num;
> + u32 cp_num;
> +};
> +
> +static struct soc_info soc_info_table[] = {
> + { {0x7040, 1}, "Armada7040-A1", {0x806, 1}, {0x110, 1}, 1, 1 },
> + { {0x7040, 2}, "Armada7040-A2", {0x806, 1}, {0x110, 2}, 1, 1 },
> + { {0x8040, 1}, "Armada8040-A1", {0x806, 1}, {0x110, 1}, 1, 2 },
> + { {0x8040, 2}, "Armada8040-A2", {0x806, 1}, {0x110, 2}, 1, 2 },
> +};
> +
> +static int get_soc_type_rev(u32 *type, u32 *rev)
> +{
> + *type = readl(CP_DEV_ID_STATUS_REG) & DEVICE_ID_STATUS_MASK;
> + *rev = (readl(CP_DEV_ID_STATUS_REG) >> SW_REV_STATUS_OFFSET) &
> + SW_REV_STATUS_MASK;
> +
> + return 0;
> +}
> +
> +static int get_soc_table_index(u32 *index)
> +{
> + u32 soc_type;
> + u32 rev, i, ret = 1;
> +
> + *index = 0;
> + get_soc_type_rev(&soc_type, &rev);
> +
> + for (i = 0; i < sizeof(soc_info_table) / sizeof(struct soc_info); i++) {
> + if ((soc_type ==
> + soc_info_table[i].soc.module_type) &&
> + (rev == soc_info_table[i].soc.module_rev)) {
> + *index = i;
> + ret = 0;
> + }
> + }
> +
> + return ret;
> +}
> +
> +static int get_soc_name(char **soc_name)
> +{
> + u32 index;
> +
> + get_soc_table_index(&index);
> + *soc_name = soc_info_table[index].soc_name;
> +
> + return 0;
> +}
> +
> +static int get_ap_cp_num(u32 *ap_num, u32 *cp_num)
> +{
> + u32 index;
> +
> + get_soc_table_index(&index);
> + *ap_num = soc_info_table[index].ap_num;
> + *cp_num = soc_info_table[index].cp_num;
> +
> + return 0;
> +}
> +
> +/* Get SoC's Application Processor (AP) module type and revision */
> +static int get_ap_type_rev(u32 *type, u32 *rev)
> +{
> + u32 index;
> +
> + get_soc_table_index(&index);
> + *type = soc_info_table[index].ap.module_type;
> + *rev = soc_info_table[index].ap.module_rev;
> +
> + return 0;
> +}
> +
> +/* Get SoC's Communication Processor (CP) module type and revision */
> +static int get_cp_type_rev(u32 *type, u32 *rev)
> +{
> + u32 index;
> +
> + get_soc_table_index(&index);
> + *type = soc_info_table[index].cp.module_type;
> + *rev = soc_info_table[index].cp.module_rev;
> +
> + return 0;
> +}
> +
> +/* Print device's SoC name and AP & CP information */
> +void soc_print_device_info(void)
> +{
> + u32 ap_num, cp_num, ap_type, ap_rev, cp_type, cp_rev;
> + char *soc_name = NULL;
> +
> + get_ap_cp_num(&ap_num, &cp_num);
> +
> + get_soc_name(&soc_name);
> + get_ap_type_rev(&ap_type, &ap_rev);
> + get_cp_type_rev(&cp_type, &cp_rev);
> +
> + printf("SoC: %s; AP%x-A%d; ", soc_name, ap_type, ap_rev);
> + /* more than one cp module */
> + if (cp_num > 1)
> + printf("%dx CP%x-A%d\n", cp_num, cp_type, cp_rev);
> + else
> + printf("CP%x-A%d\n", cp_type, cp_rev);
> +}
> diff --git a/arch/arm/mach-mvebu/include/mach/soc.h b/arch/arm/mach-mvebu/include/mach/soc.h
> index 623ab4e..3192772 100644
> --- a/arch/arm/mach-mvebu/include/mach/soc.h
> +++ b/arch/arm/mach-mvebu/include/mach/soc.h
> @@ -173,4 +173,7 @@
> #define BOOT_FROM_SPI 0x3
> #endif
>
> +#ifndef __ASSEMBLY__
> +void soc_print_device_info(void);
> +#endif /* __ASSEMBLY__ */
> #endif /* _MVEBU_SOC_H */
> diff --git a/common/board_f.c b/common/board_f.c
> index 88d7700..cf9cfdf 100644
> --- a/common/board_f.c
> +++ b/common/board_f.c
> @@ -790,15 +790,15 @@ static const init_fnc_t init_sequence_f[] = {
> #if defined(CONFIG_PPC) || defined(CONFIG_SH) || defined(CONFIG_X86)
> checkcpu,
> #endif
> -#if defined(CONFIG_DISPLAY_CPUINFO)
> - print_cpuinfo, /* display cpu info (and speed) */
> -#endif
> #if defined(CONFIG_DTB_RESELECT)
> embedded_dtb_select,
> #endif
> #if defined(CONFIG_DISPLAY_BOARDINFO)
> show_board_info,
> #endif
> +#if defined(CONFIG_DISPLAY_BOARDINFO)
> + print_cpuinfo, /* display cpu info (and speed) */
> +#endif
> INIT_FUNC_WATCHDOG_INIT
> #if defined(CONFIG_MISC_INIT_F)
> misc_init_f,
>
Viele Grüße,
Stefan
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de
More information about the U-Boot
mailing list