diff mbox

[u-boot,2/2] ARM: meson: Add cpu info display for GX SoCs

Message ID 1522230877-21267-3-git-send-email-narmstrong@baylibre.com (mailing list archive)
State Not Applicable
Headers show

Commit Message

Neil Armstrong March 28, 2018, 9:54 a.m. UTC
The Amlogic SoCs have a registers containing the die revision
and packaging type to determine the SoC family and package marketing
name like S905X for the GXL SoC Family.
This code is taken for the Linux meson-gx-socinfo driver and adapted
to U-Boot printing.

Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
 arch/arm/include/asm/arch-meson/gx.h |   1 +
 arch/arm/mach-meson/Makefile         |   2 +-
 arch/arm/mach-meson/cpu_info.c       | 105 +++++++++++++++++++++++++++++++++++
 configs/khadas-vim_defconfig         |   2 +-
 configs/libretech-cc_defconfig       |   2 +-
 configs/odroid-c2_defconfig          |   2 +-
 configs/odroid_defconfig             |   1 +
 configs/p212_defconfig               |   2 +-
 8 files changed, 112 insertions(+), 5 deletions(-)
 create mode 100644 arch/arm/mach-meson/cpu_info.c

Comments

Beniamino Galvani April 4, 2018, 8:49 p.m. UTC | #1
On Wed, Mar 28, 2018 at 11:54:37AM +0200, Neil Armstrong wrote:
> The Amlogic SoCs have a registers containing the die revision
> and packaging type to determine the SoC family and package marketing
> name like S905X for the GXL SoC Family.
> This code is taken for the Linux meson-gx-socinfo driver and adapted
> to U-Boot printing.
> 
> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
> ---
>  arch/arm/include/asm/arch-meson/gx.h |   1 +
>  arch/arm/mach-meson/Makefile         |   2 +-
>  arch/arm/mach-meson/cpu_info.c       | 105 +++++++++++++++++++++++++++++++++++
>  configs/khadas-vim_defconfig         |   2 +-
>  configs/libretech-cc_defconfig       |   2 +-
>  configs/odroid-c2_defconfig          |   2 +-
>  configs/odroid_defconfig             |   1 +
>  configs/p212_defconfig               |   2 +-
>  8 files changed, 112 insertions(+), 5 deletions(-)
>  create mode 100644 arch/arm/mach-meson/cpu_info.c
> 
> diff --git a/arch/arm/include/asm/arch-meson/gx.h b/arch/arm/include/asm/arch-meson/gx.h
> index 7930efd..6d5b4ea 100644
> --- a/arch/arm/include/asm/arch-meson/gx.h
> +++ b/arch/arm/include/asm/arch-meson/gx.h
> @@ -17,6 +17,7 @@
>  /* Always-On Peripherals registers */
>  #define GX_AO_ADDR(off)	(GX_AOBUS_BASE + ((off) << 2))
>  
> +#define GX_AO_SEC_SD_CFG8	GX_AO_ADDR(0x88)
>  #define GX_AO_SEC_GP_CFG0	GX_AO_ADDR(0x90)
>  #define GX_AO_SEC_GP_CFG3	GX_AO_ADDR(0x93)
>  #define GX_AO_SEC_GP_CFG4	GX_AO_ADDR(0x94)
> diff --git a/arch/arm/mach-meson/Makefile b/arch/arm/mach-meson/Makefile
> index b4e8dde..5a01ff0 100644
> --- a/arch/arm/mach-meson/Makefile
> +++ b/arch/arm/mach-meson/Makefile
> @@ -4,4 +4,4 @@
>  # SPDX-License-Identifier:	GPL-2.0+
>  #
>  
> -obj-y += board.o sm.o eth.o
> +obj-y += board.o sm.o eth.o cpu_info.o
> diff --git a/arch/arm/mach-meson/cpu_info.c b/arch/arm/mach-meson/cpu_info.c
> new file mode 100644
> index 0000000..657768f
> --- /dev/null
> +++ b/arch/arm/mach-meson/cpu_info.c
> @@ -0,0 +1,105 @@
> +/*
> + * Copyright (C) 2018 BayLibre, SAS
> + * Author: Neil Armstrong <narmstrong@baylibre.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <linux/bitfield.h>
> +#include <asm/arch/gx.h>
> +
> +#ifdef CONFIG_DISPLAY_CPUINFO
> +
> +#define SOCINFO_MAJOR	GENMASK(31, 24)
> +#define SOCINFO_PACK	GENMASK(23, 16)
> +#define SOCINFO_MINOR	GENMASK(15, 8)
> +#define SOCINFO_MISC	GENMASK(7, 0)
> +
> +static const struct meson_gx_soc_id {
> +	const char *name;
> +	unsigned int id;
> +} soc_ids[] = {
> +	{ "GXBB", 0x1f },
> +	{ "GXTVBB", 0x20 },
> +	{ "GXL", 0x21 },
> +	{ "GXM", 0x22 },
> +	{ "TXL", 0x23 },
> +};
> +
> +static const struct meson_gx_package_id {
> +	const char *name;
> +	unsigned int major_id;
> +	unsigned int pack_id;
> +} soc_packages[] = {
> +	{ "S905", 0x1f, 0 },
> +	{ "S905M", 0x1f, 0x20 },
> +	{ "S905D", 0x21, 0 },
> +	{ "S905X", 0x21, 0x80 },
> +	{ "S905L", 0x21, 0xc0 },
> +	{ "S905M2", 0x21, 0xe0 },
> +	{ "S912", 0x22, 0 },
> +};
> +
> +static inline unsigned int socinfo_to_major(u32 socinfo)
> +{
> +	return FIELD_GET(SOCINFO_MAJOR, socinfo);
> +}
> +
> +static inline unsigned int socinfo_to_minor(u32 socinfo)
> +{
> +	return FIELD_GET(SOCINFO_MINOR, socinfo);
> +}
> +
> +static inline unsigned int socinfo_to_pack(u32 socinfo)
> +{
> +	return FIELD_GET(SOCINFO_PACK, socinfo);
> +}
> +
> +static inline unsigned int socinfo_to_misc(u32 socinfo)
> +{
> +	return FIELD_GET(SOCINFO_MISC, socinfo);
> +}
> +
> +static const char *socinfo_to_package_id(u32 socinfo)
> +{
> +	unsigned int pack = socinfo_to_pack(socinfo) & 0xf0;
> +	unsigned int major = socinfo_to_major(socinfo);
> +	int i;
> +
> +	for (i = 0 ; i < ARRAY_SIZE(soc_packages) ; ++i) {
> +		if (soc_packages[i].major_id == major &&
> +		    soc_packages[i].pack_id == pack)
> +			return soc_packages[i].name;
> +	}
> +
> +	return "Unknown";
> +}
> +
> +static const char *socinfo_to_soc_id(u32 socinfo)
> +{
> +	unsigned int id = socinfo_to_major(socinfo);
> +	int i;
> +
> +	for (i = 0 ; i < ARRAY_SIZE(soc_ids) ; ++i) {
> +		if (soc_ids[i].id == id)
> +			return soc_ids[i].name;
> +	}
> +
> +	return "Unknown";
> +}
> +
> +int print_cpuinfo(void)
> +{
> +	u32 socinfo = readl(GX_AO_SEC_SD_CFG8);

Perhaps, add a blank line between declarations and code? checkpatch
issues a warning about this.

> +	printf("CPU: Amlogic Meson %s (%s) rev %x:%x (%x:%x)\n",
> +		socinfo_to_soc_id(socinfo),
> +		socinfo_to_package_id(socinfo),
> +		socinfo_to_major(socinfo),
> +		socinfo_to_minor(socinfo),
> +		socinfo_to_pack(socinfo),
> +		socinfo_to_misc(socinfo));
> +	return 0;
> +}
> +#endif /* CONFIG_DISPLAY_CPUINFO */
> diff --git a/configs/khadas-vim_defconfig b/configs/khadas-vim_defconfig
> index a0b3f8d..970d373 100644
> --- a/configs/khadas-vim_defconfig
> +++ b/configs/khadas-vim_defconfig
> @@ -7,7 +7,7 @@ CONFIG_IDENT_STRING=" khadas-vim"
>  CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905x-khadas-vim"
>  CONFIG_DEBUG_UART=y
>  CONFIG_OF_BOARD_SETUP=y
> -# CONFIG_DISPLAY_CPUINFO is not set
> +CONFIG_DISPLAY_CPUINFO=y
>  # CONFIG_DISPLAY_BOARDINFO is not set
>  # CONFIG_CMD_BDI is not set
>  # CONFIG_CMD_IMI is not set
> diff --git a/configs/libretech-cc_defconfig b/configs/libretech-cc_defconfig
> index a7177b9..cfbba30 100644
> --- a/configs/libretech-cc_defconfig
> +++ b/configs/libretech-cc_defconfig
> @@ -7,7 +7,7 @@ CONFIG_IDENT_STRING=" libretech-cc"
>  CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905x-libretech-cc"
>  CONFIG_DEBUG_UART=y
>  CONFIG_OF_BOARD_SETUP=y
> -# CONFIG_DISPLAY_CPUINFO is not set
> +CONFIG_DISPLAY_CPUINFO=y
>  # CONFIG_DISPLAY_BOARDINFO is not set
>  # CONFIG_CMD_BDI is not set
>  # CONFIG_CMD_IMI is not set
> diff --git a/configs/odroid-c2_defconfig b/configs/odroid-c2_defconfig
> index 49461aa..657b647 100644
> --- a/configs/odroid-c2_defconfig
> +++ b/configs/odroid-c2_defconfig
> @@ -7,7 +7,7 @@ CONFIG_IDENT_STRING=" odroid-c2"
>  CONFIG_DEFAULT_DEVICE_TREE="meson-gxbb-odroidc2"
>  CONFIG_DEBUG_UART=y
>  CONFIG_OF_BOARD_SETUP=y
> -# CONFIG_DISPLAY_CPUINFO is not set
> +CONFIG_DISPLAY_CPUINFO=y
>  # CONFIG_DISPLAY_BOARDINFO is not set
>  # CONFIG_CMD_BDI is not set
>  # CONFIG_CMD_IMI is not set
> diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig
> index 810874d..251bf38 100644
> --- a/configs/odroid_defconfig
> +++ b/configs/odroid_defconfig
> @@ -56,3 +56,4 @@ CONFIG_USB_HOST_ETHER=y
>  CONFIG_USB_ETHER_SMSC95XX=y
>  CONFIG_LIB_HW_RAND=y
>  CONFIG_ERRNO_STR=y
> +CONFIG_DISPLAY_CPUINFO=y

Odroid is not an Amlogic board.

With these 2 issues fixed: Reviewed-by: Beniamino Galvani <b.galvani@gmail.com>

Beniamino
Simon Glass April 8, 2018, 1:50 p.m. UTC | #2
Hi,

On 28 March 2018 at 05:54, Neil Armstrong <narmstrong@baylibre.com> wrote:
> The Amlogic SoCs have a registers containing the die revision
> and packaging type to determine the SoC family and package marketing
> name like S905X for the GXL SoC Family.
> This code is taken for the Linux meson-gx-socinfo driver and adapted
> to U-Boot printing.
>
> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
> ---
>  arch/arm/include/asm/arch-meson/gx.h |   1 +
>  arch/arm/mach-meson/Makefile         |   2 +-
>  arch/arm/mach-meson/cpu_info.c       | 105 +++++++++++++++++++++++++++++++++++
>  configs/khadas-vim_defconfig         |   2 +-
>  configs/libretech-cc_defconfig       |   2 +-
>  configs/odroid-c2_defconfig          |   2 +-
>  configs/odroid_defconfig             |   1 +
>  configs/p212_defconfig               |   2 +-
>  8 files changed, 112 insertions(+), 5 deletions(-)
>  create mode 100644 arch/arm/mach-meson/cpu_info.c

Please can you use driver model's CPU interface for this?

Regards,
Simon
Neil Armstrong April 9, 2018, 1:47 p.m. UTC | #3
On 04/04/2018 22:49, Beniamino Galvani wrote:
> On Wed, Mar 28, 2018 at 11:54:37AM +0200, Neil Armstrong wrote:
>> The Amlogic SoCs have a registers containing the die revision
>> and packaging type to determine the SoC family and package marketing
>> name like S905X for the GXL SoC Family.
>> This code is taken for the Linux meson-gx-socinfo driver and adapted
>> to U-Boot printing.
>>
>> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
>> ---
>>  arch/arm/include/asm/arch-meson/gx.h |   1 +
>>  arch/arm/mach-meson/Makefile         |   2 +-
>>  arch/arm/mach-meson/cpu_info.c       | 105 +++++++++++++++++++++++++++++++++++
>>  configs/khadas-vim_defconfig         |   2 +-
>>  configs/libretech-cc_defconfig       |   2 +-
>>  configs/odroid-c2_defconfig          |   2 +-
>>  configs/odroid_defconfig             |   1 +
>>  configs/p212_defconfig               |   2 +-
>>  8 files changed, 112 insertions(+), 5 deletions(-)
>>  create mode 100644 arch/arm/mach-meson/cpu_info.c
>>
>> diff --git a/arch/arm/include/asm/arch-meson/gx.h b/arch/arm/include/asm/arch-meson/gx.h
>> index 7930efd..6d5b4ea 100644
>> --- a/arch/arm/include/asm/arch-meson/gx.h
>> +++ b/arch/arm/include/asm/arch-meson/gx.h
>> @@ -17,6 +17,7 @@
>>  /* Always-On Peripherals registers */
>>  #define GX_AO_ADDR(off)	(GX_AOBUS_BASE + ((off) << 2))
>>  
>> +#define GX_AO_SEC_SD_CFG8	GX_AO_ADDR(0x88)
>>  #define GX_AO_SEC_GP_CFG0	GX_AO_ADDR(0x90)
>>  #define GX_AO_SEC_GP_CFG3	GX_AO_ADDR(0x93)
>>  #define GX_AO_SEC_GP_CFG4	GX_AO_ADDR(0x94)
>> diff --git a/arch/arm/mach-meson/Makefile b/arch/arm/mach-meson/Makefile
>> index b4e8dde..5a01ff0 100644
>> --- a/arch/arm/mach-meson/Makefile
>> +++ b/arch/arm/mach-meson/Makefile
>> @@ -4,4 +4,4 @@
>>  # SPDX-License-Identifier:	GPL-2.0+
>>  #
>>  
>> -obj-y += board.o sm.o eth.o
>> +obj-y += board.o sm.o eth.o cpu_info.o
>> diff --git a/arch/arm/mach-meson/cpu_info.c b/arch/arm/mach-meson/cpu_info.c
>> new file mode 100644
>> index 0000000..657768f
>> --- /dev/null
>> +++ b/arch/arm/mach-meson/cpu_info.c
>> @@ -0,0 +1,105 @@
>> +/*
>> + * Copyright (C) 2018 BayLibre, SAS
>> + * Author: Neil Armstrong <narmstrong@baylibre.com>
>> + *
>> + * SPDX-License-Identifier:	GPL-2.0+
>> + */
>> +
>> +#include <common.h>
>> +#include <asm/io.h>
>> +#include <linux/bitfield.h>
>> +#include <asm/arch/gx.h>
>> +
>> +#ifdef CONFIG_DISPLAY_CPUINFO
>> +
>> +#define SOCINFO_MAJOR	GENMASK(31, 24)
>> +#define SOCINFO_PACK	GENMASK(23, 16)
>> +#define SOCINFO_MINOR	GENMASK(15, 8)
>> +#define SOCINFO_MISC	GENMASK(7, 0)
>> +
>> +static const struct meson_gx_soc_id {
>> +	const char *name;
>> +	unsigned int id;
>> +} soc_ids[] = {
>> +	{ "GXBB", 0x1f },
>> +	{ "GXTVBB", 0x20 },
>> +	{ "GXL", 0x21 },
>> +	{ "GXM", 0x22 },
>> +	{ "TXL", 0x23 },
>> +};
>> +
>> +static const struct meson_gx_package_id {
>> +	const char *name;
>> +	unsigned int major_id;
>> +	unsigned int pack_id;
>> +} soc_packages[] = {
>> +	{ "S905", 0x1f, 0 },
>> +	{ "S905M", 0x1f, 0x20 },
>> +	{ "S905D", 0x21, 0 },
>> +	{ "S905X", 0x21, 0x80 },
>> +	{ "S905L", 0x21, 0xc0 },
>> +	{ "S905M2", 0x21, 0xe0 },
>> +	{ "S912", 0x22, 0 },
>> +};
>> +
>> +static inline unsigned int socinfo_to_major(u32 socinfo)
>> +{
>> +	return FIELD_GET(SOCINFO_MAJOR, socinfo);
>> +}
>> +
>> +static inline unsigned int socinfo_to_minor(u32 socinfo)
>> +{
>> +	return FIELD_GET(SOCINFO_MINOR, socinfo);
>> +}
>> +
>> +static inline unsigned int socinfo_to_pack(u32 socinfo)
>> +{
>> +	return FIELD_GET(SOCINFO_PACK, socinfo);
>> +}
>> +
>> +static inline unsigned int socinfo_to_misc(u32 socinfo)
>> +{
>> +	return FIELD_GET(SOCINFO_MISC, socinfo);
>> +}
>> +
>> +static const char *socinfo_to_package_id(u32 socinfo)
>> +{
>> +	unsigned int pack = socinfo_to_pack(socinfo) & 0xf0;
>> +	unsigned int major = socinfo_to_major(socinfo);
>> +	int i;
>> +
>> +	for (i = 0 ; i < ARRAY_SIZE(soc_packages) ; ++i) {
>> +		if (soc_packages[i].major_id == major &&
>> +		    soc_packages[i].pack_id == pack)
>> +			return soc_packages[i].name;
>> +	}
>> +
>> +	return "Unknown";
>> +}
>> +
>> +static const char *socinfo_to_soc_id(u32 socinfo)
>> +{
>> +	unsigned int id = socinfo_to_major(socinfo);
>> +	int i;
>> +
>> +	for (i = 0 ; i < ARRAY_SIZE(soc_ids) ; ++i) {
>> +		if (soc_ids[i].id == id)
>> +			return soc_ids[i].name;
>> +	}
>> +
>> +	return "Unknown";
>> +}
>> +
>> +int print_cpuinfo(void)
>> +{
>> +	u32 socinfo = readl(GX_AO_SEC_SD_CFG8);
> 
> Perhaps, add a blank line between declarations and code? checkpatch
> issues a warning about this.

Ok

> 
>> +	printf("CPU: Amlogic Meson %s (%s) rev %x:%x (%x:%x)\n",
>> +		socinfo_to_soc_id(socinfo),
>> +		socinfo_to_package_id(socinfo),
>> +		socinfo_to_major(socinfo),
>> +		socinfo_to_minor(socinfo),
>> +		socinfo_to_pack(socinfo),
>> +		socinfo_to_misc(socinfo));
>> +	return 0;
>> +}
>> +#endif /* CONFIG_DISPLAY_CPUINFO */
>> diff --git a/configs/khadas-vim_defconfig b/configs/khadas-vim_defconfig
>> index a0b3f8d..970d373 100644
>> --- a/configs/khadas-vim_defconfig
>> +++ b/configs/khadas-vim_defconfig
>> @@ -7,7 +7,7 @@ CONFIG_IDENT_STRING=" khadas-vim"
>>  CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905x-khadas-vim"
>>  CONFIG_DEBUG_UART=y
>>  CONFIG_OF_BOARD_SETUP=y
>> -# CONFIG_DISPLAY_CPUINFO is not set
>> +CONFIG_DISPLAY_CPUINFO=y
>>  # CONFIG_DISPLAY_BOARDINFO is not set
>>  # CONFIG_CMD_BDI is not set
>>  # CONFIG_CMD_IMI is not set
>> diff --git a/configs/libretech-cc_defconfig b/configs/libretech-cc_defconfig
>> index a7177b9..cfbba30 100644
>> --- a/configs/libretech-cc_defconfig
>> +++ b/configs/libretech-cc_defconfig
>> @@ -7,7 +7,7 @@ CONFIG_IDENT_STRING=" libretech-cc"
>>  CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905x-libretech-cc"
>>  CONFIG_DEBUG_UART=y
>>  CONFIG_OF_BOARD_SETUP=y
>> -# CONFIG_DISPLAY_CPUINFO is not set
>> +CONFIG_DISPLAY_CPUINFO=y
>>  # CONFIG_DISPLAY_BOARDINFO is not set
>>  # CONFIG_CMD_BDI is not set
>>  # CONFIG_CMD_IMI is not set
>> diff --git a/configs/odroid-c2_defconfig b/configs/odroid-c2_defconfig
>> index 49461aa..657b647 100644
>> --- a/configs/odroid-c2_defconfig
>> +++ b/configs/odroid-c2_defconfig
>> @@ -7,7 +7,7 @@ CONFIG_IDENT_STRING=" odroid-c2"
>>  CONFIG_DEFAULT_DEVICE_TREE="meson-gxbb-odroidc2"
>>  CONFIG_DEBUG_UART=y
>>  CONFIG_OF_BOARD_SETUP=y
>> -# CONFIG_DISPLAY_CPUINFO is not set
>> +CONFIG_DISPLAY_CPUINFO=y
>>  # CONFIG_DISPLAY_BOARDINFO is not set
>>  # CONFIG_CMD_BDI is not set
>>  # CONFIG_CMD_IMI is not set
>> diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig
>> index 810874d..251bf38 100644
>> --- a/configs/odroid_defconfig
>> +++ b/configs/odroid_defconfig
>> @@ -56,3 +56,4 @@ CONFIG_USB_HOST_ETHER=y
>>  CONFIG_USB_ETHER_SMSC95XX=y
>>  CONFIG_LIB_HW_RAND=y
>>  CONFIG_ERRNO_STR=y
>> +CONFIG_DISPLAY_CPUINFO=y
> 
> Odroid is not an Amlogic board.

Oops, will remove it.

> 
> With these 2 issues fixed: Reviewed-by: Beniamino Galvani <b.galvani@gmail.com>
> 
> Beniamino
>
Neil Armstrong April 9, 2018, 1:48 p.m. UTC | #4
On 08/04/2018 15:50, Simon Glass wrote:
> Hi,
> 
> On 28 March 2018 at 05:54, Neil Armstrong <narmstrong@baylibre.com> wrote:
>> The Amlogic SoCs have a registers containing the die revision
>> and packaging type to determine the SoC family and package marketing
>> name like S905X for the GXL SoC Family.
>> This code is taken for the Linux meson-gx-socinfo driver and adapted
>> to U-Boot printing.
>>
>> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
>> ---
>>  arch/arm/include/asm/arch-meson/gx.h |   1 +
>>  arch/arm/mach-meson/Makefile         |   2 +-
>>  arch/arm/mach-meson/cpu_info.c       | 105 +++++++++++++++++++++++++++++++++++
>>  configs/khadas-vim_defconfig         |   2 +-
>>  configs/libretech-cc_defconfig       |   2 +-
>>  configs/odroid-c2_defconfig          |   2 +-
>>  configs/odroid_defconfig             |   1 +
>>  configs/p212_defconfig               |   2 +-
>>  8 files changed, 112 insertions(+), 5 deletions(-)
>>  create mode 100644 arch/arm/mach-meson/cpu_info.c
> 
> Please can you use driver model's CPU interface for this?
> 
> Regards,
> Simon
> 

You are right, I totally missed this one.

Neil
Neil Armstrong April 10, 2018, 1:51 p.m. UTC | #5
On 08/04/2018 15:50, Simon Glass wrote:
> Hi,
> 
> On 28 March 2018 at 05:54, Neil Armstrong <narmstrong@baylibre.com> wrote:
>> The Amlogic SoCs have a registers containing the die revision
>> and packaging type to determine the SoC family and package marketing
>> name like S905X for the GXL SoC Family.
>> This code is taken for the Linux meson-gx-socinfo driver and adapted
>> to U-Boot printing.
>>
>> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
>> ---
>>  arch/arm/include/asm/arch-meson/gx.h |   1 +
>>  arch/arm/mach-meson/Makefile         |   2 +-
>>  arch/arm/mach-meson/cpu_info.c       | 105 +++++++++++++++++++++++++++++++++++
>>  configs/khadas-vim_defconfig         |   2 +-
>>  configs/libretech-cc_defconfig       |   2 +-
>>  configs/odroid-c2_defconfig          |   2 +-
>>  configs/odroid_defconfig             |   1 +
>>  configs/p212_defconfig               |   2 +-
>>  8 files changed, 112 insertions(+), 5 deletions(-)
>>  create mode 100644 arch/arm/mach-meson/cpu_info.c
> 
> Please can you use driver model's CPU interface for this?
> 
> Regards,
> Simon
> 

Hi Simon,

The CPU uclass is designed for the /cpu/* nodes, here we fetch the SoC information
in some /soc/ subnodes which cannot be used with the current CPU uclass and
won't be probed before relocation.

Either I push is as a MISC driver (with the pre-reloc issue) or we leave this in mach-meson.

What do you think ?

Thanks,
Neil
Simon Glass April 10, 2018, 2:37 p.m. UTC | #6
Hi Neil,

On 10 April 2018 at 09:51, Neil Armstrong <narmstrong@baylibre.com> wrote:
> On 08/04/2018 15:50, Simon Glass wrote:
>> Hi,
>>
>> On 28 March 2018 at 05:54, Neil Armstrong <narmstrong@baylibre.com> wrote:
>>> The Amlogic SoCs have a registers containing the die revision
>>> and packaging type to determine the SoC family and package marketing
>>> name like S905X for the GXL SoC Family.
>>> This code is taken for the Linux meson-gx-socinfo driver and adapted
>>> to U-Boot printing.
>>>
>>> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
>>> ---
>>>  arch/arm/include/asm/arch-meson/gx.h |   1 +
>>>  arch/arm/mach-meson/Makefile         |   2 +-
>>>  arch/arm/mach-meson/cpu_info.c       | 105 +++++++++++++++++++++++++++++++++++
>>>  configs/khadas-vim_defconfig         |   2 +-
>>>  configs/libretech-cc_defconfig       |   2 +-
>>>  configs/odroid-c2_defconfig          |   2 +-
>>>  configs/odroid_defconfig             |   1 +
>>>  configs/p212_defconfig               |   2 +-
>>>  8 files changed, 112 insertions(+), 5 deletions(-)
>>>  create mode 100644 arch/arm/mach-meson/cpu_info.c
>>
>> Please can you use driver model's CPU interface for this?
>>
>> Regards,
>> Simon
>>
>
> Hi Simon,
>
> The CPU uclass is designed for the /cpu/* nodes, here we fetch the SoC information
> in some /soc/ subnodes which cannot be used with the current CPU uclass and
> won't be probed before relocation.
>
> Either I push is as a MISC driver (with the pre-reloc issue) or we leave this in mach-meson.
>
> What do you think ?

Do you think it could search both /cpu and /soc ? They seem to be
fairly equivalent. Is that the only problem?

>
> Thanks,
> Neil

Regards,
Simon
diff mbox

Patch

diff --git a/arch/arm/include/asm/arch-meson/gx.h b/arch/arm/include/asm/arch-meson/gx.h
index 7930efd..6d5b4ea 100644
--- a/arch/arm/include/asm/arch-meson/gx.h
+++ b/arch/arm/include/asm/arch-meson/gx.h
@@ -17,6 +17,7 @@ 
 /* Always-On Peripherals registers */
 #define GX_AO_ADDR(off)	(GX_AOBUS_BASE + ((off) << 2))
 
+#define GX_AO_SEC_SD_CFG8	GX_AO_ADDR(0x88)
 #define GX_AO_SEC_GP_CFG0	GX_AO_ADDR(0x90)
 #define GX_AO_SEC_GP_CFG3	GX_AO_ADDR(0x93)
 #define GX_AO_SEC_GP_CFG4	GX_AO_ADDR(0x94)
diff --git a/arch/arm/mach-meson/Makefile b/arch/arm/mach-meson/Makefile
index b4e8dde..5a01ff0 100644
--- a/arch/arm/mach-meson/Makefile
+++ b/arch/arm/mach-meson/Makefile
@@ -4,4 +4,4 @@ 
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
-obj-y += board.o sm.o eth.o
+obj-y += board.o sm.o eth.o cpu_info.o
diff --git a/arch/arm/mach-meson/cpu_info.c b/arch/arm/mach-meson/cpu_info.c
new file mode 100644
index 0000000..657768f
--- /dev/null
+++ b/arch/arm/mach-meson/cpu_info.c
@@ -0,0 +1,105 @@ 
+/*
+ * Copyright (C) 2018 BayLibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <linux/bitfield.h>
+#include <asm/arch/gx.h>
+
+#ifdef CONFIG_DISPLAY_CPUINFO
+
+#define SOCINFO_MAJOR	GENMASK(31, 24)
+#define SOCINFO_PACK	GENMASK(23, 16)
+#define SOCINFO_MINOR	GENMASK(15, 8)
+#define SOCINFO_MISC	GENMASK(7, 0)
+
+static const struct meson_gx_soc_id {
+	const char *name;
+	unsigned int id;
+} soc_ids[] = {
+	{ "GXBB", 0x1f },
+	{ "GXTVBB", 0x20 },
+	{ "GXL", 0x21 },
+	{ "GXM", 0x22 },
+	{ "TXL", 0x23 },
+};
+
+static const struct meson_gx_package_id {
+	const char *name;
+	unsigned int major_id;
+	unsigned int pack_id;
+} soc_packages[] = {
+	{ "S905", 0x1f, 0 },
+	{ "S905M", 0x1f, 0x20 },
+	{ "S905D", 0x21, 0 },
+	{ "S905X", 0x21, 0x80 },
+	{ "S905L", 0x21, 0xc0 },
+	{ "S905M2", 0x21, 0xe0 },
+	{ "S912", 0x22, 0 },
+};
+
+static inline unsigned int socinfo_to_major(u32 socinfo)
+{
+	return FIELD_GET(SOCINFO_MAJOR, socinfo);
+}
+
+static inline unsigned int socinfo_to_minor(u32 socinfo)
+{
+	return FIELD_GET(SOCINFO_MINOR, socinfo);
+}
+
+static inline unsigned int socinfo_to_pack(u32 socinfo)
+{
+	return FIELD_GET(SOCINFO_PACK, socinfo);
+}
+
+static inline unsigned int socinfo_to_misc(u32 socinfo)
+{
+	return FIELD_GET(SOCINFO_MISC, socinfo);
+}
+
+static const char *socinfo_to_package_id(u32 socinfo)
+{
+	unsigned int pack = socinfo_to_pack(socinfo) & 0xf0;
+	unsigned int major = socinfo_to_major(socinfo);
+	int i;
+
+	for (i = 0 ; i < ARRAY_SIZE(soc_packages) ; ++i) {
+		if (soc_packages[i].major_id == major &&
+		    soc_packages[i].pack_id == pack)
+			return soc_packages[i].name;
+	}
+
+	return "Unknown";
+}
+
+static const char *socinfo_to_soc_id(u32 socinfo)
+{
+	unsigned int id = socinfo_to_major(socinfo);
+	int i;
+
+	for (i = 0 ; i < ARRAY_SIZE(soc_ids) ; ++i) {
+		if (soc_ids[i].id == id)
+			return soc_ids[i].name;
+	}
+
+	return "Unknown";
+}
+
+int print_cpuinfo(void)
+{
+	u32 socinfo = readl(GX_AO_SEC_SD_CFG8);
+	printf("CPU: Amlogic Meson %s (%s) rev %x:%x (%x:%x)\n",
+		socinfo_to_soc_id(socinfo),
+		socinfo_to_package_id(socinfo),
+		socinfo_to_major(socinfo),
+		socinfo_to_minor(socinfo),
+		socinfo_to_pack(socinfo),
+		socinfo_to_misc(socinfo));
+	return 0;
+}
+#endif /* CONFIG_DISPLAY_CPUINFO */
diff --git a/configs/khadas-vim_defconfig b/configs/khadas-vim_defconfig
index a0b3f8d..970d373 100644
--- a/configs/khadas-vim_defconfig
+++ b/configs/khadas-vim_defconfig
@@ -7,7 +7,7 @@  CONFIG_IDENT_STRING=" khadas-vim"
 CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905x-khadas-vim"
 CONFIG_DEBUG_UART=y
 CONFIG_OF_BOARD_SETUP=y
-# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_DISPLAY_CPUINFO=y
 # CONFIG_DISPLAY_BOARDINFO is not set
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
diff --git a/configs/libretech-cc_defconfig b/configs/libretech-cc_defconfig
index a7177b9..cfbba30 100644
--- a/configs/libretech-cc_defconfig
+++ b/configs/libretech-cc_defconfig
@@ -7,7 +7,7 @@  CONFIG_IDENT_STRING=" libretech-cc"
 CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905x-libretech-cc"
 CONFIG_DEBUG_UART=y
 CONFIG_OF_BOARD_SETUP=y
-# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_DISPLAY_CPUINFO=y
 # CONFIG_DISPLAY_BOARDINFO is not set
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
diff --git a/configs/odroid-c2_defconfig b/configs/odroid-c2_defconfig
index 49461aa..657b647 100644
--- a/configs/odroid-c2_defconfig
+++ b/configs/odroid-c2_defconfig
@@ -7,7 +7,7 @@  CONFIG_IDENT_STRING=" odroid-c2"
 CONFIG_DEFAULT_DEVICE_TREE="meson-gxbb-odroidc2"
 CONFIG_DEBUG_UART=y
 CONFIG_OF_BOARD_SETUP=y
-# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_DISPLAY_CPUINFO=y
 # CONFIG_DISPLAY_BOARDINFO is not set
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig
index 810874d..251bf38 100644
--- a/configs/odroid_defconfig
+++ b/configs/odroid_defconfig
@@ -56,3 +56,4 @@  CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_SMSC95XX=y
 CONFIG_LIB_HW_RAND=y
 CONFIG_ERRNO_STR=y
+CONFIG_DISPLAY_CPUINFO=y
diff --git a/configs/p212_defconfig b/configs/p212_defconfig
index d276e06..4302977 100644
--- a/configs/p212_defconfig
+++ b/configs/p212_defconfig
@@ -7,7 +7,7 @@  CONFIG_IDENT_STRING=" p212"
 CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905x-p212"
 CONFIG_DEBUG_UART=y
 CONFIG_OF_BOARD_SETUP=y
-# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_DISPLAY_CPUINFO=y
 # CONFIG_DISPLAY_BOARDINFO is not set
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set