prom.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 prom_init(void)
  57. {
  58. uint32_t model;
  59. /* uart0 */
  60. setup_8250_early_printk_port(0xb8002000, 2, 0);
  61. soc_info.sw_base = RTL838X_SW_BASE;
  62. model = sw_r32(RTL838X_MODEL_NAME_INFO) >> 16;
  63. if (model != 0x8328 && model != 0x8330 && model != 0x8332 &&
  64. model != 0x8380 && model != 0x8382)
  65. model = sw_r32(RTL839X_MODEL_NAME_INFO) >> 16;
  66. soc_info.id = model;
  67. switch (model) {
  68. case 0x8328:
  69. soc_info.name = "RTL8328";
  70. soc_info.family = RTL8328_FAMILY_ID;
  71. break;
  72. case 0x8332:
  73. soc_info.name = "RTL8332";
  74. soc_info.family = RTL8380_FAMILY_ID;
  75. break;
  76. case 0x8380:
  77. soc_info.name = "RTL8380";
  78. soc_info.family = RTL8380_FAMILY_ID;
  79. break;
  80. case 0x8382:
  81. soc_info.name = "RTL8382";
  82. soc_info.family = RTL8380_FAMILY_ID;
  83. break;
  84. case 0x8390:
  85. soc_info.name = "RTL8390";
  86. soc_info.family = RTL8390_FAMILY_ID;
  87. break;
  88. case 0x8391:
  89. soc_info.name = "RTL8391";
  90. soc_info.family = RTL8390_FAMILY_ID;
  91. break;
  92. case 0x8392:
  93. soc_info.name = "RTL8392";
  94. soc_info.family = RTL8390_FAMILY_ID;
  95. break;
  96. case 0x8393:
  97. soc_info.name = "RTL8393";
  98. soc_info.family = RTL8390_FAMILY_ID;
  99. break;
  100. default:
  101. soc_info.name = "DEFAULT";
  102. soc_info.family = 0;
  103. }
  104. pr_info("SoC Type: %s\n", get_system_type());
  105. prom_init_cmdline();
  106. }