cpu.c 4.6 KB

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