cpu.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2013-2014, 2018 Synopsys, Inc. All rights reserved.
  4. */
  5. #include <common.h>
  6. #include <malloc.h>
  7. #include <vsprintf.h>
  8. #include <asm/arcregs.h>
  9. #include <asm/cache.h>
  10. DECLARE_GLOBAL_DATA_PTR;
  11. int arch_cpu_init(void)
  12. {
  13. timer_init();
  14. gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
  15. gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
  16. cache_init();
  17. return 0;
  18. }
  19. int arch_early_init_r(void)
  20. {
  21. gd->bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
  22. gd->bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
  23. return 0;
  24. }
  25. /* This is a dummy function on arc */
  26. int dram_init(void)
  27. {
  28. return 0;
  29. }
  30. #ifdef CONFIG_DISPLAY_CPUINFO
  31. const char *arc_700_version(int arcver, char *name, int name_len)
  32. {
  33. const char *arc_ver;
  34. switch (arcver) {
  35. case 0x32:
  36. arc_ver = "v4.4-4.5";
  37. break;
  38. case 0x33:
  39. arc_ver = "v4.6-v4.9";
  40. break;
  41. case 0x34:
  42. arc_ver = "v4.10";
  43. break;
  44. case 0x35:
  45. arc_ver = "v4.11";
  46. break;
  47. default:
  48. arc_ver = "unknown version";
  49. }
  50. snprintf(name, name_len, "ARC 700 %s", arc_ver);
  51. return name;
  52. }
  53. struct em_template_t {
  54. const bool cache;
  55. const bool dsp;
  56. const bool xymem;
  57. const char name[8];
  58. };
  59. static const struct em_template_t em_versions[] = {
  60. {false, false, false, "EM4"},
  61. {true, false, false, "EM6"},
  62. {false, true, false, "EM5D"},
  63. {true, true, false, "EM7D"},
  64. {false, true, true, "EM9D"},
  65. {true, true, true, "EM11D"},
  66. };
  67. const char *arc_em_version(int arcver, char *name, int name_len)
  68. {
  69. const char *arc_name = "EM";
  70. const char *arc_ver;
  71. bool cache = ARC_FEATURE_EXISTS(ARC_BCR_IC_BUILD);
  72. bool dsp = ARC_FEATURE_EXISTS(ARC_AUX_DSP_BUILD);
  73. bool xymem = ARC_FEATURE_EXISTS(ARC_AUX_XY_BUILD);
  74. int i;
  75. for (i = 0; i < sizeof(em_versions) / sizeof(struct em_template_t); i++) {
  76. if (em_versions[i].cache == cache &&
  77. em_versions[i].dsp == dsp &&
  78. em_versions[i].xymem == xymem) {
  79. arc_name = em_versions[i].name;
  80. break;
  81. }
  82. }
  83. switch (arcver) {
  84. case 0x41:
  85. arc_ver = "v1.1a";
  86. break;
  87. case 0x42:
  88. arc_ver = "v3.0";
  89. break;
  90. case 0x43:
  91. arc_ver = "v4.0";
  92. break;
  93. case 0x44:
  94. arc_ver = "v5.0";
  95. break;
  96. default:
  97. arc_ver = "unknown version";
  98. }
  99. snprintf(name, name_len, "ARC %s %s", arc_name, arc_ver);
  100. return name;
  101. }
  102. struct hs_template_t {
  103. const bool cache;
  104. const bool mmu;
  105. const bool dual_issue;
  106. const bool dsp;
  107. const char name[8];
  108. };
  109. static const struct hs_template_t hs_versions[] = {
  110. {false, false, false, false, "HS34"},
  111. {true, false, false, false, "HS36"},
  112. {true, true, false, false, "HS38"},
  113. {false, false, true, false, "HS44"},
  114. {true, false, true, false, "HS46"},
  115. {true, true, true, false, "HS48"},
  116. {false, false, true, true, "HS45D"},
  117. {true, false, true, true, "HS47D"},
  118. };
  119. const char *arc_hs_version(int arcver, char *name, int name_len)
  120. {
  121. const char *arc_name = "HS";
  122. const char *arc_ver;
  123. bool cache = ARC_FEATURE_EXISTS(ARC_BCR_IC_BUILD);
  124. bool dsp = ARC_FEATURE_EXISTS(ARC_AUX_DSP_BUILD);
  125. bool mmu = !!read_aux_reg(ARC_AUX_MMU_BCR);
  126. bool dual_issue = arcver == 0x54 ? true : false;
  127. int i;
  128. for (i = 0; i < sizeof(hs_versions) / sizeof(struct hs_template_t); i++) {
  129. if (hs_versions[i].cache == cache &&
  130. hs_versions[i].mmu == mmu &&
  131. hs_versions[i].dual_issue == dual_issue &&
  132. hs_versions[i].dsp == dsp) {
  133. arc_name = hs_versions[i].name;
  134. break;
  135. }
  136. }
  137. switch (arcver) {
  138. case 0x50:
  139. arc_ver = "v1.0";
  140. break;
  141. case 0x51:
  142. arc_ver = "v2.0";
  143. break;
  144. case 0x52:
  145. arc_ver = "v2.1c";
  146. break;
  147. case 0x53:
  148. arc_ver = "v3.0";
  149. break;
  150. case 0x54:
  151. arc_ver = "v4.0";
  152. break;
  153. default:
  154. arc_ver = "unknown version";
  155. }
  156. snprintf(name, name_len, "ARC %s %s", arc_name, arc_ver);
  157. return name;
  158. }
  159. const char *decode_identity(void)
  160. {
  161. #define MAX_CPU_NAME_LEN 64
  162. int arcver = read_aux_reg(ARC_AUX_IDENTITY) & 0xff;
  163. char *name = malloc(MAX_CPU_NAME_LEN);
  164. if (arcver >= 0x50)
  165. return arc_hs_version(arcver, name, MAX_CPU_NAME_LEN);
  166. else if (arcver >= 0x40)
  167. return arc_em_version(arcver, name, MAX_CPU_NAME_LEN);
  168. else if (arcver >= 0x30)
  169. return arc_700_version(arcver, name, MAX_CPU_NAME_LEN);
  170. else
  171. return "Unknown ARC core";
  172. }
  173. const char *decode_subsystem(void)
  174. {
  175. int subsys_type = read_aux_reg(ARC_AUX_SUBSYS_BUILD) & GENMASK(3, 0);
  176. switch (subsys_type) {
  177. case 0: return NULL;
  178. case 2: return "ARC Sensor & Control IP Subsystem";
  179. case 3: return "ARC Data Fusion IP Subsystem";
  180. case 4: return "ARC Secure Subsystem";
  181. default: return "Unknown subsystem";
  182. };
  183. }
  184. __weak int print_cpuinfo(void)
  185. {
  186. const char *subsys_name = decode_subsystem();
  187. char mhz[8];
  188. printf("CPU: %s at %s MHz\n", decode_identity(),
  189. strmhz(mhz, gd->cpu_clk));
  190. if (subsys_name)
  191. printf("Subsys:%s\n", subsys_name);
  192. return 0;
  193. }
  194. #endif /* CONFIG_DISPLAY_CPUINFO */