312-mt7622-select-rootdisk.patch 3.8 KB

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