[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