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