prom.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * prom.c
  4. * Early intialization code for the Realtek RTL838X SoC
  5. *
  6. * based on the original BSP by
  7. * Copyright (C) 2006-2012 Tony Wu ([email protected])
  8. * Copyright (C) 2020 B. Koblitz
  9. *
  10. */
  11. #include <linux/init.h>
  12. #include <linux/kernel.h>
  13. #include <linux/string.h>
  14. #include <linux/of_fdt.h>
  15. #include <linux/libfdt.h>
  16. #include <asm/bootinfo.h>
  17. #include <asm/addrspace.h>
  18. #include <asm/page.h>
  19. #include <asm/cpu.h>
  20. #include <mach-rtl83xx.h>
  21. extern char arcs_cmdline[];
  22. extern const char __appended_dtb;
  23. struct rtl83xx_soc_info soc_info;
  24. const void *fdt;
  25. const char *get_system_type(void)
  26. {
  27. return soc_info.name;
  28. }
  29. void __init prom_free_prom_memory(void)
  30. {
  31. }
  32. void __init device_tree_init(void)
  33. {
  34. if (!fdt_check_header(&__appended_dtb)) {
  35. fdt = &__appended_dtb;
  36. pr_info("Using appended Device Tree.\n");
  37. }
  38. initial_boot_params = (void *)fdt;
  39. unflatten_and_copy_device_tree();
  40. }
  41. static void __init prom_init_cmdline(void)
  42. {
  43. int argc = fw_arg0;
  44. char **argv = (char **) KSEG1ADDR(fw_arg1);
  45. int i;
  46. arcs_cmdline[0] = '\0';
  47. for (i = 0; i < argc; i++) {
  48. char *p = (char *) KSEG1ADDR(argv[i]);
  49. if (CPHYSADDR(p) && *p) {
  50. strlcat(arcs_cmdline, p, sizeof(arcs_cmdline));
  51. strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline));
  52. }
  53. }
  54. pr_info("Kernel command line: %s\n", arcs_cmdline);
  55. }
  56. void __init identify_rtl9302(void)
  57. {
  58. switch (sw_r32(RTL93XX_MODEL_NAME_INFO) & 0xfffffff0) {
  59. case 0x93020810:
  60. soc_info.name = "RTL9302A 12x2.5G";
  61. break;
  62. case 0x93021010:
  63. soc_info.name = "RTL9302B 8x2.5G";
  64. break;
  65. case 0x93021810:
  66. soc_info.name = "RTL9302C 16x2.5G";
  67. break;
  68. case 0x93022010:
  69. soc_info.name = "RTL9302D 24x2.5G";
  70. break;
  71. case 0x93020800:
  72. soc_info.name = "RTL9302A";
  73. break;
  74. case 0x93021000:
  75. soc_info.name = "RTL9302B";
  76. break;
  77. case 0x93021800:
  78. soc_info.name = "RTL9302C";
  79. break;
  80. case 0x93022000:
  81. soc_info.name = "RTL9302D";
  82. break;
  83. case 0x93023001:
  84. soc_info.name = "RTL9302F";
  85. break;
  86. default:
  87. soc_info.name = "RTL9302";
  88. }
  89. }
  90. void __init prom_init(void)
  91. {
  92. uint32_t model;
  93. /* uart0 */
  94. setup_8250_early_printk_port(0xb8002000, 2, 0);
  95. model = sw_r32(RTL838X_MODEL_NAME_INFO);
  96. pr_info("RTL838X model is %x\n", model);
  97. model = model >> 16 & 0xFFFF;
  98. if ((model != 0x8328) && (model != 0x8330) && (model != 0x8332)
  99. && (model != 0x8380) && (model != 0x8382)) {
  100. model = sw_r32(RTL839X_MODEL_NAME_INFO);
  101. pr_info("RTL839X model is %x\n", model);
  102. model = model >> 16 & 0xFFFF;
  103. }
  104. if ((model & 0x8390) != 0x8380 && (model & 0x8390) != 0x8390) {
  105. model = sw_r32(RTL93XX_MODEL_NAME_INFO);
  106. pr_info("RTL93XX model is %x\n", model);
  107. model = model >> 16 & 0xFFFF;
  108. }
  109. soc_info.id = model;
  110. switch (model) {
  111. case 0x8328:
  112. soc_info.name = "RTL8328";
  113. soc_info.family = RTL8328_FAMILY_ID;
  114. break;
  115. case 0x8332:
  116. soc_info.name = "RTL8332";
  117. soc_info.family = RTL8380_FAMILY_ID;
  118. break;
  119. case 0x8380:
  120. soc_info.name = "RTL8380";
  121. soc_info.family = RTL8380_FAMILY_ID;
  122. break;
  123. case 0x8382:
  124. soc_info.name = "RTL8382";
  125. soc_info.family = RTL8380_FAMILY_ID;
  126. break;
  127. case 0x8390:
  128. soc_info.name = "RTL8390";
  129. soc_info.family = RTL8390_FAMILY_ID;
  130. break;
  131. case 0x8391:
  132. soc_info.name = "RTL8391";
  133. soc_info.family = RTL8390_FAMILY_ID;
  134. break;
  135. case 0x8392:
  136. soc_info.name = "RTL8392";
  137. soc_info.family = RTL8390_FAMILY_ID;
  138. break;
  139. case 0x8393:
  140. soc_info.name = "RTL8393";
  141. soc_info.family = RTL8390_FAMILY_ID;
  142. break;
  143. case 0x9301:
  144. soc_info.name = "RTL9301";
  145. soc_info.family = RTL9300_FAMILY_ID;
  146. break;
  147. case 0x9302:
  148. identify_rtl9302();
  149. soc_info.family = RTL9300_FAMILY_ID;
  150. break;
  151. case 0x9313:
  152. soc_info.name = "RTL9313";
  153. soc_info.family = RTL9310_FAMILY_ID;
  154. break;
  155. default:
  156. soc_info.name = "DEFAULT";
  157. soc_info.family = 0;
  158. }
  159. pr_info("SoC Type: %s\n", get_system_type());
  160. prom_init_cmdline();
  161. }