1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2013-2014, 2018 Synopsys, Inc. All rights reserved.
9 #include <asm/arcregs.h>
10 #include <asm/cache.h>
12 DECLARE_GLOBAL_DATA_PTR;
14 int arch_cpu_init(void)
18 gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
19 gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
26 int arch_early_init_r(void)
28 gd->bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
29 gd->bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
33 /* This is a dummy function on arc */
39 #ifdef CONFIG_DISPLAY_CPUINFO
40 const char *arc_700_version(int arcver, char *name, int name_len)
49 arc_ver = "v4.6-v4.9";
58 arc_ver = "unknown version";
61 snprintf(name, name_len, "ARC 700 %s", arc_ver);
66 struct em_template_t {
73 static const struct em_template_t em_versions[] = {
74 {false, false, false, "EM4"},
75 {true, false, false, "EM6"},
76 {false, true, false, "EM5D"},
77 {true, true, false, "EM7D"},
78 {false, true, true, "EM9D"},
79 {true, true, true, "EM11D"},
82 const char *arc_em_version(int arcver, char *name, int name_len)
84 const char *arc_name = "EM";
86 bool cache = ARC_FEATURE_EXISTS(ARC_BCR_IC_BUILD);
87 bool dsp = ARC_FEATURE_EXISTS(ARC_AUX_DSP_BUILD);
88 bool xymem = ARC_FEATURE_EXISTS(ARC_AUX_XY_BUILD);
91 for (i = 0; i < sizeof(em_versions) / sizeof(struct em_template_t); i++) {
92 if (em_versions[i].cache == cache &&
93 em_versions[i].dsp == dsp &&
94 em_versions[i].xymem == xymem) {
95 arc_name = em_versions[i].name;
114 arc_ver = "unknown version";
117 snprintf(name, name_len, "ARC %s %s", arc_name, arc_ver);
122 struct hs_template_t {
125 const bool dual_issue;
130 static const struct hs_template_t hs_versions[] = {
131 {false, false, false, false, "HS34"},
132 {true, false, false, false, "HS36"},
133 {true, true, false, false, "HS38"},
134 {false, false, true, false, "HS44"},
135 {true, false, true, false, "HS46"},
136 {true, true, true, false, "HS48"},
137 {false, false, true, true, "HS45D"},
138 {true, false, true, true, "HS47D"},
141 const char *arc_hs_version(int arcver, char *name, int name_len)
143 const char *arc_name = "HS";
145 bool cache = ARC_FEATURE_EXISTS(ARC_BCR_IC_BUILD);
146 bool dsp = ARC_FEATURE_EXISTS(ARC_AUX_DSP_BUILD);
147 bool mmu = !!read_aux_reg(ARC_AUX_MMU_BCR);
148 bool dual_issue = arcver == 0x54 ? true : false;
151 for (i = 0; i < sizeof(hs_versions) / sizeof(struct hs_template_t); i++) {
152 if (hs_versions[i].cache == cache &&
153 hs_versions[i].mmu == mmu &&
154 hs_versions[i].dual_issue == dual_issue &&
155 hs_versions[i].dsp == dsp) {
156 arc_name = hs_versions[i].name;
178 arc_ver = "unknown version";
181 snprintf(name, name_len, "ARC %s %s", arc_name, arc_ver);
186 const char *decode_identity(void)
188 #define MAX_CPU_NAME_LEN 64
190 int arcver = read_aux_reg(ARC_AUX_IDENTITY) & 0xff;
191 char *name = malloc(MAX_CPU_NAME_LEN);
194 return arc_hs_version(arcver, name, MAX_CPU_NAME_LEN);
195 else if (arcver >= 0x40)
196 return arc_em_version(arcver, name, MAX_CPU_NAME_LEN);
197 else if (arcver >= 0x30)
198 return arc_700_version(arcver, name, MAX_CPU_NAME_LEN);
200 return "Unknown ARC core";
203 const char *decode_subsystem(void)
205 int subsys_type = read_aux_reg(ARC_AUX_SUBSYS_BUILD) & GENMASK(3, 0);
207 switch (subsys_type) {
209 case 2: return "ARC Sensor & Control IP Subsystem";
210 case 3: return "ARC Data Fusion IP Subsystem";
211 case 4: return "ARC Secure Subsystem";
212 default: return "Unknown subsystem";
216 __weak int print_cpuinfo(void)
218 const char *subsys_name = decode_subsystem();
221 printf("CPU: %s at %s MHz\n", decode_identity(),
222 strmhz(mhz, gd->cpu_clk));
225 printf("Subsys:%s\n", subsys_name);
229 #endif /* CONFIG_DISPLAY_CPUINFO */