aboutsummaryrefslogtreecommitdiff
path: root/package/boot/uboot-mediatek/patches/312-mt7622-select-rootdisk.patch
blob: 70cbf6b46300e2f78f87719dea9b734910e4c8ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
--- a/board/mediatek/mt7622/mt7622_rfb.c
+++ b/board/mediatek/mt7622/mt7622_rfb.c
@@ -11,7 +11,9 @@
 #include <env.h>
 #include <init.h>
 #include <asm/global_data.h>
+#include <asm/io.h>
 #include <linux/delay.h>
+#include <linux/libfdt.h>
 
 #ifndef CONFIG_RESET_BUTTON_LABEL
 #define CONFIG_RESET_BUTTON_LABEL "reset"
@@ -22,10 +24,43 @@
 #include <nmbm/nmbm.h>
 #include <nmbm/nmbm-mtd.h>
 
+#define MT7622_TOPRGUSTRAP_PAR			0x10212060
+#define MT7622_BOOT_SEQ_MASK			0x18
+#define MT7622_BOOT_SEQ_SHIFT			3
+#define MT7622_BOOT_SEQ_NOR_EMMC_SDXC		0x0
+#define MT7622_BOOT_SEQ_SPI_NAND_EMMC_SDXC	0x1
+#define MT7622_BOOT_SEQ_NAND_EMMC_SDXC		0x2
+#define MT7622_BOOT_SEQ_SDXC_EMMC_NAND		0x3
+
+#define MT7622_GPIO_MODE0			0x10211300
+#define MT7622_GPIO_NAND_MODE_MASK		0x00f00000
+#define MT7622_GPIO_NAND_MODE_SHIFT		20
+#define MT7622_GPIO_NAND_MODE_EMMC		0x2
+#define MT7622_GPIO_RGMII_MODE_MASK		0x0000f000
+#define MT7622_GPIO_RGMII_MODE_SHIFT		12
+#define MT7622_GPIO_RGMII_MODE_SDCX		0x2
+#define MT7622_GPIO_SPI_MODE_MASK		0x00000f00
+#define MT7622_GPIO_SPI_MODE_SHIFT		8
+#define MT7622_GPIO_SPI_MODE_NAND		0x2
+
+#define MT7622_MSDC_INT				0x1124000C
+#define MT7622_MSDC_INT_BD_CS_ERR		0x200
+
 DECLARE_GLOBAL_DATA_PTR;
 
+static int	gpio_mode0;
+static int	msdc_int;
+
 int board_init(void)
 {
+	/*
+	 * Save content of GPIO_MODE0 as left behind by the BootROM.
+	 * Also grab MSDC1 INT status to see if BootROM has been reading
+	 * from SD card.
+	 * Together this will allow to infer the device used for booting.
+	 */
+	gpio_mode0 = readl(MT7622_GPIO_MODE0);
+	msdc_int = readl(MT7622_MSDC_INT);
 	return 0;
 }
 
@@ -83,3 +118,84 @@ int board_nmbm_init(void)
 
 	return 0;
 }
+
+int ft_system_setup(void *blob, struct bd_info *bd)
+{
+	bool pinctrl_set_mmc = false;
+	bool pinctrl_set_snfi = false;
+	bool pinctrl_set_emmc = false;
+	bool msdc_bd_cs_err = false;
+
+	const u32 *media_handle_p;
+	int chosen, len, ret;
+	const char *media;
+	u32 media_handle, strap;
+
+	if ((gpio_mode0 & MT7622_GPIO_RGMII_MODE_MASK) >>
+	    MT7622_GPIO_RGMII_MODE_SHIFT == MT7622_GPIO_RGMII_MODE_SDCX)
+		pinctrl_set_mmc = true;
+
+	if ((gpio_mode0 & MT7622_GPIO_SPI_MODE_MASK) >>
+	    MT7622_GPIO_SPI_MODE_SHIFT == MT7622_GPIO_SPI_MODE_NAND)
+		pinctrl_set_snfi = true;
+
+	if ((gpio_mode0 & MT7622_GPIO_NAND_MODE_MASK) >>
+	    MT7622_GPIO_NAND_MODE_SHIFT == MT7622_GPIO_NAND_MODE_EMMC)
+		pinctrl_set_emmc = true;
+
+	if (msdc_int & MT7622_MSDC_INT_BD_CS_ERR)
+		msdc_bd_cs_err = true;
+
+	strap = readl(MT7622_TOPRGUSTRAP_PAR);
+	strap &= MT7622_BOOT_SEQ_MASK;
+	strap >>= MT7622_BOOT_SEQ_SHIFT;
+	switch (strap) {
+	case MT7622_BOOT_SEQ_NOR_EMMC_SDXC:
+		if (!pinctrl_set_emmc)
+			media = "rootdisk-nor";
+		else if (pinctrl_set_mmc)
+			media = "rootdisk-emmc";
+		else
+			media = "rootdisk-sd";
+		break
+		;;
+	case MT7622_BOOT_SEQ_SPI_NAND_EMMC_SDXC:
+		if (pinctrl_set_snfi)
+			media = "rootdisk-snfi";
+		else if (pinctrl_set_emmc)
+			media = "rootdisk-emmc";
+		else
+			media = "rootdisk-sd";
+		break
+		;;
+	case MT7622_BOOT_SEQ_NAND_EMMC_SDXC:
+	case MT7622_BOOT_SEQ_SDXC_EMMC_NAND:
+		if (!pinctrl_set_emmc && pinctrl_set_mmc)
+			media = "rootdisk-nand";
+		else if (pinctrl_set_emmc)
+			media = "rootdisk-emmc";
+		else
+			media = "rootdisk-sd";
+		break
+		;;
+	}
+
+	chosen = fdt_path_offset(blob, "/chosen");
+	if (chosen <= 0)
+		return 0;
+
+	media_handle_p = fdt_getprop(blob, chosen, media, &len);
+	if (media_handle_p <= 0 || len != 4)
+		return 0;
+
+	media_handle = *media_handle_p;
+	ret = fdt_setprop(blob, chosen, "rootdisk", &media_handle, sizeof(media_handle));
+	if (ret) {
+		printf("cannot set media phandle %s as rootdisk /chosen node\n", media);
+		return ret;
+	}
+
+	printf("set /chosen/rootdisk to bootrom media: %s (phandle 0x%08x)\n", media, fdt32_to_cpu(media_handle));
+
+	return 0;
+}