cpu.c 4.5 KB

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