ARM: meson: display Amlogic SoC Information
authorJulien Masson <jmasson@baylibre.com>
Mon, 25 Mar 2019 10:55:29 +0000 (11:55 +0100)
committerNeil Armstrong <narmstrong@baylibre.com>
Wed, 10 Apr 2019 14:48:31 +0000 (16:48 +0200)
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 from the Linux meson-gx-socinfo driver and adapted
to U-Boot printing.

Signed-off-by: Julien Masson <jmasson@baylibre.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
[narmstrong: also updated new p200/p201 defconfigs]

arch/arm/mach-meson/Makefile
arch/arm/mach-meson/board-info.c [new file with mode: 0644]
configs/khadas-vim2_defconfig
configs/khadas-vim_defconfig
configs/libretech-cc_defconfig
configs/nanopi-k2_defconfig
configs/odroid-c2_defconfig
configs/p200_defconfig
configs/p201_defconfig
configs/p212_defconfig
configs/s400_defconfig

index b716e1a152903ae6922284455e35543a9827b35e..6ddfba606b712fec11385546a281dc0a941026ad 100644 (file)
@@ -2,6 +2,6 @@
 #
 # Copyright (c) 2016 Beniamino Galvani <b.galvani@gmail.com>
 
-obj-y += board-common.o sm.o
+obj-y += board-common.o sm.o board-info.o
 obj-$(CONFIG_MESON_GX) += board-gx.o
 obj-$(CONFIG_MESON_AXG) += board-axg.o
diff --git a/arch/arm/mach-meson/board-info.c b/arch/arm/mach-meson/board-info.c
new file mode 100644 (file)
index 0000000..ba248e8
--- /dev/null
@@ -0,0 +1,166 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2019 Julien Masson <jmasson@baylibre.com>
+ * (C) Copyright 2019 Neil Armstrong <narmstrong@baylibre.com>
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <dm.h>
+#include <linux/bitfield.h>
+#include <regmap.h>
+#include <syscon.h>
+
+#define AO_SEC_SD_CFG8         0xe0
+#define AO_SEC_SOCINFO_OFFSET  AO_SEC_SD_CFG8
+
+#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 },
+       { "TXLX",   0x24 },
+       { "AXG",    0x25 },
+       { "GXLX",   0x26 },
+       { "TXHD",   0x27 },
+       { "G12A",   0x28 },
+       { "G12B",   0x29 },
+};
+
+static const struct meson_gx_package_id {
+       const char *name;
+       unsigned int major_id;
+       unsigned int pack_id;
+       unsigned int pack_mask;
+} soc_packages[] = {
+       { "S905",   0x1f, 0,    0x20 }, /* pack_id != 0x20 */
+       { "S905H",  0x1f, 0x3,  0xf },  /* pack_id & 0xf == 0x3 */
+       { "S905M",  0x1f, 0x20, 0xf0 }, /* pack_id == 0x20 */
+       { "S905D",  0x21, 0,    0xf0 },
+       { "S905X",  0x21, 0x80, 0xf0 },
+       { "S905W",  0x21, 0xa0, 0xf0 },
+       { "S905L",  0x21, 0xc0, 0xf0 },
+       { "S905M2", 0x21, 0xe0, 0xf0 },
+       { "S805X",  0x21, 0x30, 0xf0 },
+       { "S805Y",  0x21, 0xb0, 0xf0 },
+       { "S912",   0x22, 0,    0x0 },  /* Only S912 is known for GXM */
+       { "962X",   0x24, 0x10, 0xf0 },
+       { "962E",   0x24, 0x20, 0xf0 },
+       { "A113X",  0x25, 0x37, 0xff },
+       { "A113D",  0x25, 0x22, 0xff },
+       { "S905D2", 0x28, 0x10, 0xf0 },
+       { "S905X2", 0x28, 0x40, 0xf0 },
+       { "S922X",  0x29, 0x40, 0xf0 },
+};
+
+DECLARE_GLOBAL_DATA_PTR;
+
+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);
+       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 & soc_packages[i].pack_mask))
+                       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";
+}
+
+static void print_board_model(void)
+{
+       const char *model;
+       model = fdt_getprop(gd->fdt_blob, 0, "model", NULL);
+       printf("Model: %s\n", model ? model : "Unknown");
+}
+
+int show_board_info(void)
+{
+       struct regmap *regmap;
+       int nodeoffset, ret;
+       ofnode node;
+       unsigned int socinfo;
+
+       /* find the offset of compatible node */
+       nodeoffset = fdt_node_offset_by_compatible(gd->fdt_blob, -1,
+                                                  "amlogic,meson-gx-ao-secure");
+       if (nodeoffset < 0)
+               return 0;
+
+       /* check if chip-id is available */
+       if (!fdt_getprop(gd->fdt_blob, nodeoffset, "amlogic,has-chip-id", NULL))
+               return 0;
+
+       /* get regmap from the syscon node */
+       node = offset_to_ofnode(nodeoffset);
+       regmap = syscon_node_to_regmap(node);
+       if (IS_ERR(regmap)) {
+               printf("%s: failed to get regmap\n", __func__);
+               return 0;
+       }
+
+       /* read soc info */
+       ret = regmap_read(regmap, AO_SEC_SOCINFO_OFFSET, &socinfo);
+       if (ret && !socinfo) {
+               printf("%s: invalid chipid value\n", __func__);
+               return 0;
+       }
+
+       /* print board information */
+       print_board_model();
+       printf("Soc:   Amlogic Meson %s (%s) Revision %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;
+}
index 080dd19590e34596bcb53eec762fe9e31274df09..611f179c6f145f4044835d3bc3d2364d8a17ef7e 100644 (file)
@@ -11,7 +11,7 @@ CONFIG_OF_BOARD_SETUP=y
 CONFIG_CONSOLE_MUX=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_DISPLAY_BOARDINFO=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_ADC=y
index 6f1ad0e573b42115dd2b4f2035b6504d159b2f45..aeec2bece53e66145d8a520966fc7ab9e82a5ea7 100644 (file)
@@ -11,7 +11,7 @@ CONFIG_OF_BOARD_SETUP=y
 CONFIG_CONSOLE_MUX=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_DISPLAY_BOARDINFO=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_ADC=y
index d28c7ab45ec820b55653f516d9659c102d55b6e9..a1b9fd91e388e678d4ae4c868638e9b72e6c5ad9 100644 (file)
@@ -10,7 +10,7 @@ CONFIG_NR_DRAM_BANKS=1
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_DISPLAY_BOARDINFO=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_ADC=y
index 8bbf48f41f7dd922fbe0c410a75be5b7c2c0fabb..60481cd39baa69890ef86166f8da5e4de9849d06 100644 (file)
@@ -9,7 +9,7 @@ CONFIG_NR_DRAM_BANKS=1
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_DISPLAY_BOARDINFO=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_GPIO=y
index 747da184b3adb6c1dcdcdb5dee539ddd1c7bccfc..04904c28b57d4e0108fc06227a59c70faf488dff 100644 (file)
@@ -10,7 +10,7 @@ CONFIG_OF_BOARD_SETUP=y
 CONFIG_CONSOLE_MUX=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_DISPLAY_BOARDINFO=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_GPIO=y
index 3980e4eb5f1d8c17aea3c14f29081f4ee7fe31af..12f34151931b69da99d28895908260fb85e1d89f 100644 (file)
@@ -9,7 +9,7 @@ CONFIG_NR_DRAM_BANKS=1
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_DISPLAY_BOARDINFO=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_GPIO=y
index f6a821cf32750f6b4e690e6b428ef7d867134391..6e0b2ec49ce889b17d36c6c7b7bd6aa4c9775d63 100644 (file)
@@ -9,7 +9,7 @@ CONFIG_NR_DRAM_BANKS=1
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_DISPLAY_BOARDINFO=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_GPIO=y
index b0488635fc70a5385a8f7cfe85ffa335bef8e277..042274016087ba0ff3780b2543a52d2a2a8f8c3f 100644 (file)
@@ -11,7 +11,7 @@ CONFIG_OF_BOARD_SETUP=y
 CONFIG_CONSOLE_MUX=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_DISPLAY_BOARDINFO=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_GPIO=y
index 1bd4b7127b1d63aa65dab308d5dc453af52122e5..6cd47d0184b27f8cf49a78358fae6dc42aab161f 100644 (file)
@@ -10,7 +10,7 @@ CONFIG_NR_DRAM_BANKS=1
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_MISC_INIT_R=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_DISPLAY_BOARDINFO=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_GPIO=y