Add baseboard id detection

- Add get_baseboard_id routine, and a baseboardid console command.

Change-Id: I857dafd6ebc675406c2daf8b313437d4345f0ef6
diff --git a/board/freescale/imx8mq_phanbell/board_id.c b/board/freescale/imx8mq_phanbell/board_id.c
index 3b623c3..8d64741 100644
--- a/board/freescale/imx8mq_phanbell/board_id.c
+++ b/board/freescale/imx8mq_phanbell/board_id.c
@@ -16,18 +16,43 @@
 #define BOARD_ID_GPIO2 IMX_GPIO_NR(BOARD_ID_GPIOS_PORT, BOARD_ID_GPIO2_INDEX)
 #define BOARD_ID_GPIO3 IMX_GPIO_NR(BOARD_ID_GPIOS_PORT, BOARD_ID_GPIO3_INDEX)
 
+#define BASEBOARD_ID_GPIOS_PORT 3
+#define BASEBOARD_ID_GPIOS_BASE GPIO3_BASE_ADDR
+#define BASEBOARD_ID_GPIO1_INDEX 25
+#define BASEBOARD_ID_GPIO2_INDEX 23
+#define BASEBOARD_ID_GPIO3_INDEX 20
+#define BASEBOARD_ID_GPIO4_INDEX 21
+#define BASEBOARD_ID_GPIO1 IMX_GPIO_NR(BASEBOARD_ID_GPIOS_PORT, BASEBOARD_ID_GPIO1_INDEX)
+#define BASEBOARD_ID_GPIO2 IMX_GPIO_NR(BASEBOARD_ID_GPIOS_PORT, BASEBOARD_ID_GPIO2_INDEX)
+#define BASEBOARD_ID_GPIO3 IMX_GPIO_NR(BASEBOARD_ID_GPIOS_PORT, BASEBOARD_ID_GPIO3_INDEX)
+#define BASEBOARD_ID_GPIO4 IMX_GPIO_NR(BASEBOARD_ID_GPIOS_PORT, BASEBOARD_ID_GPIO4_INDEX)
+
 static iomux_v3_cfg_t const board_id_pads[] = {
 	IMX8MQ_PAD_SAI5_RXD1__GPIO3_IO22 | MUX_PAD_CTRL(PAD_CTL_DSE0),
 	IMX8MQ_PAD_SAI5_RXD3__GPIO3_IO24 | MUX_PAD_CTRL(PAD_CTL_DSE0),
 	IMX8MQ_PAD_SAI5_RXFS__GPIO3_IO19 | MUX_PAD_CTRL(PAD_CTL_DSE0),
 };
 
-static iomux_v3_cfg_t const default_pads[] = {
+static iomux_v3_cfg_t const board_id_default_pads[] = {
 	IMX8MQ_PAD_SAI5_RXD1__SAI5_RX_DATA1 | MUX_PAD_CTRL(0x1816),
 	IMX8MQ_PAD_SAI5_RXD3__SAI5_RX_DATA3 | MUX_PAD_CTRL(0x16),
 	IMX8MQ_PAD_SAI5_RXFS__SAI5_RX_SYNC | MUX_PAD_CTRL(0x16),
 };
 
+static iomux_v3_cfg_t const baseboard_id_pads[] = {
+	IMX8MQ_PAD_SAI5_MCLK__GPIO3_IO25 | MUX_PAD_CTRL(PAD_CTL_DSE0),
+	IMX8MQ_PAD_SAI5_RXD2__GPIO3_IO23 | MUX_PAD_CTRL(PAD_CTL_DSE0),
+	IMX8MQ_PAD_SAI5_RXC__GPIO3_IO20 | MUX_PAD_CTRL(PAD_CTL_DSE0),
+	IMX8MQ_PAD_SAI5_RXD0__GPIO3_IO21 | MUX_PAD_CTRL(PAD_CTL_DSE0),
+};
+
+static iomux_v3_cfg_t const baseboard_id_default_pads[] = {
+	IMX8MQ_PAD_SAI5_MCLK__SAI5_MCLK | MUX_PAD_CTRL(0x16),
+	IMX8MQ_PAD_SAI5_RXD2__SAI5_RX_DATA2 | MUX_PAD_CTRL(0x16),
+	IMX8MQ_PAD_SAI5_RXC__SAI5_RX_BCLK | MUX_PAD_CTRL(0x16),
+	IMX8MQ_PAD_SAI5_RXD0__SAI5_RX_DATA0 | MUX_PAD_CTRL(0x16),
+};
+
 int get_board_id() {
 	int board_id = 0;
 
@@ -56,12 +81,51 @@
 	board_id |= (readl(&regs->gpio_dr) >> (BOARD_ID_GPIO3_INDEX - 2)) & 0x04;
 #endif
 
-	imx_iomux_v3_setup_multiple_pads(default_pads,
-		ARRAY_SIZE(default_pads));
+	imx_iomux_v3_setup_multiple_pads(board_id_default_pads,
+		ARRAY_SIZE(board_id_default_pads));
 
 	return board_id;
 }
 
+int get_baseboard_id() {
+	int baseboard_id = -1;
+
+	imx_iomux_v3_setup_multiple_pads(baseboard_id_pads, ARRAY_SIZE(baseboard_id_pads));
+
+#ifdef CONFIG_SPL_BUILD
+	gpio_request(BASEBOARD_ID_GPIO1, "baseboard_id_1");
+	gpio_direction_input(BASEBOARD_ID_GPIO1);
+	gpio_request(BASEBOARD_ID_GPIO2, "baseboard_id_2");
+	gpio_direction_input(BASEBOARD_ID_GPIO2);
+	gpio_request(BASEBOARD_ID_GPIO3, "baseboard_id_3");
+	gpio_direction_input(BASEBOARD_ID_GPIO3);
+	gpio_request(BASEBOARD_ID_GPIO4, "baseboard_id_4");
+	gpio_direction_input(BASEBOARD_ID_GPIO4);
+
+	baseboard_id = gpio_get_value(BASEBOARD_ID_GPIO1);
+	baseboard_id |= gpio_get_value(BASEBOARD_ID_GPIO2) << 1;
+	baseboard_id |= gpio_get_value(BASEBOARD_ID_GPIO3) << 2;
+	baseboard_id |= gpio_get_value(BASEBOARD_ID_GPIO4) << 3;
+
+	gpio_free(BASEBOARD_ID_GPIO1);
+	gpio_free(BASEBOARD_ID_GPIO2);
+	gpio_free(BASEBOARD_ID_GPIO3);
+	gpio_free(BASEBOARD_ID_GPIO4);
+#else
+
+	struct gpio_regs *regs = (struct gpio_regs *)BASEBOARD_ID_GPIOS_BASE;
+	baseboard_id = (readl(&regs->gpio_dr) >> BASEBOARD_ID_GPIO1_INDEX) & 0x01;
+	baseboard_id |= (readl(&regs->gpio_dr) >> (BASEBOARD_ID_GPIO2_INDEX - 1)) & 0x02;
+	baseboard_id |= (readl(&regs->gpio_dr) >> (BASEBOARD_ID_GPIO3_INDEX - 2)) & 0x04;
+	baseboard_id |= (readl(&regs->gpio_dr) >> (BASEBOARD_ID_GPIO4_INDEX - 3)) & 0x08;
+#endif
+
+	imx_iomux_v3_setup_multiple_pads(baseboard_id_default_pads,
+		ARRAY_SIZE(baseboard_id_default_pads));
+
+	return baseboard_id;
+}
+
 size_t get_ddr_size(void) {
 	const size_t k1Gb = 0x40000000;
 	const size_t k3Gb = 0xC0000000;
diff --git a/board/freescale/imx8mq_phanbell/board_id.h b/board/freescale/imx8mq_phanbell/board_id.h
index 48716b0..e0832eb 100644
--- a/board/freescale/imx8mq_phanbell/board_id.h
+++ b/board/freescale/imx8mq_phanbell/board_id.h
@@ -14,6 +14,7 @@
 // 7 - DVT boards with 3Gb Micron (MT53E768M32D4DT) DDR
 
 int get_board_id(void);
+int get_baseboard_id(void);
 size_t get_ddr_size(void);
 
 #endif
diff --git a/board/freescale/imx8mq_phanbell/board_id_cmd.c b/board/freescale/imx8mq_phanbell/board_id_cmd.c
index 7fbcc5c..240b030 100644
--- a/board/freescale/imx8mq_phanbell/board_id_cmd.c
+++ b/board/freescale/imx8mq_phanbell/board_id_cmd.c
@@ -18,6 +18,13 @@
 	"Unknown"
 };
 
+const char* baseboard_id_names[] = {
+	"Invalid",
+	"Enterprise",
+	"Yorktown",
+	"Unknown"
+};
+
 static int do_board_id(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	int board_id = get_board_id();
@@ -37,9 +44,35 @@
 	return 0;
 }
 
+static int do_baseboard_id(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	int baseboard_id = get_baseboard_id();
+	const char* baseboard_id_name;
+
+	if (baseboard_id >= ARRAY_SIZE(baseboard_id_names)) {
+		baseboard_id_name = baseboard_id_names[ARRAY_SIZE(baseboard_id_names) - 1];
+	}
+
+	baseboard_id_name = baseboard_id_names[baseboard_id];
+
+	putc('0' + baseboard_id);
+	puts(": ");
+	puts(baseboard_id_name);
+	putc('\n');
+
+	return 0;
+}
+
 U_BOOT_CMD(
 	boardid, 1, 0, do_board_id,
 	"display board ID",
 	"\n"
 	"    - displays the board ID value from the GPIO pins."
 );
+
+U_BOOT_CMD(
+	baseboardid, 1, 0, do_baseboard_id,
+	"display baseboard ID",
+	"\n"
+	"   - displays the board ID value for the baseboard."
+);