1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2013-2014, 2018 Synopsys, Inc. All rights reserved.
10 #include <asm/arcregs.h>
11 #include <asm/cache.h>
12 #include <linux/bitops.h>
14 DECLARE_GLOBAL_DATA_PTR;
16 int arch_cpu_init(void)
20 gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
21 gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
28 int arch_early_init_r(void)
30 gd->bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
31 gd->bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
35 /* This is a dummy function on arc */
41 #ifdef CONFIG_DISPLAY_CPUINFO
42 const char *arc_700_version(int arcver, char *name, int name_len)
51 arc_ver = "v4.6-v4.9";
60 arc_ver = "unknown version";
63 snprintf(name, name_len, "ARC 700 %s", arc_ver);
68 struct em_template_t {
75 static const struct em_template_t em_versions[] = {
76 {false, false, false, "EM4"},
77 {true, false, false, "EM6"},
78 {false, true, false, "EM5D"},
79 {true, true, false, "EM7D"},
80 {false, true, true, "EM9D"},
81 {true, true, true, "EM11D"},
84 const char *arc_em_version(int arcver, char *name, int name_len)
86 const char *arc_name = "EM";
88 bool cache = ARC_FEATURE_EXISTS(ARC_BCR_IC_BUILD);
89 bool dsp = ARC_FEATURE_EXISTS(ARC_AUX_DSP_BUILD);
90 bool xymem = ARC_FEATURE_EXISTS(ARC_AUX_XY_BUILD);
93 for (i = 0; i < sizeof(em_versions) / sizeof(struct em_template_t); i++) {
94 if (em_versions[i].cache == cache &&
95 em_versions[i].dsp == dsp &&
96 em_versions[i].xymem == xymem) {
97 arc_name = em_versions[i].name;
116 arc_ver = "unknown version";
119 snprintf(name, name_len, "ARC %s %s", arc_name, arc_ver);
124 struct hs_template_t {
127 const bool dual_issue;
132 static const struct hs_template_t hs_versions[] = {
133 {false, false, false, false, "HS34"},
134 {true, false, false, false, "HS36"},
135 {true, true, false, false, "HS38"},
136 {false, false, true, false, "HS44"},
137 {true, false, true, false, "HS46"},
138 {true, true, true, false, "HS48"},
139 {false, false, true, true, "HS45D"},
140 {true, false, true, true, "HS47D"},
143 const char *arc_hs_version(int arcver, char *name, int name_len)
145 const char *arc_name = "HS";
147 bool cache = ARC_FEATURE_EXISTS(ARC_BCR_IC_BUILD);
148 bool dsp = ARC_FEATURE_EXISTS(ARC_AUX_DSP_BUILD);
149 bool mmu = !!read_aux_reg(ARC_AUX_MMU_BCR);
150 bool dual_issue = arcver == 0x54 ? true : false;
153 for (i = 0; i < sizeof(hs_versions) / sizeof(struct hs_template_t); i++) {
154 if (hs_versions[i].cache == cache &&
155 hs_versions[i].mmu == mmu &&
156 hs_versions[i].dual_issue == dual_issue &&
157 hs_versions[i].dsp == dsp) {
158 arc_name = hs_versions[i].name;
180 arc_ver = "unknown version";
183 snprintf(name, name_len, "ARC %s %s", arc_name, arc_ver);
188 const char *decode_identity(void)
190 #define MAX_CPU_NAME_LEN 64
192 int arcver = read_aux_reg(ARC_AUX_IDENTITY) & 0xff;
193 char *name = malloc(MAX_CPU_NAME_LEN);
196 return arc_hs_version(arcver, name, MAX_CPU_NAME_LEN);
197 else if (arcver >= 0x40)
198 return arc_em_version(arcver, name, MAX_CPU_NAME_LEN);
199 else if (arcver >= 0x30)
200 return arc_700_version(arcver, name, MAX_CPU_NAME_LEN);
202 return "Unknown ARC core";
205 const char *decode_subsystem(void)
207 int subsys_type = read_aux_reg(ARC_AUX_SUBSYS_BUILD) & GENMASK(3, 0);
209 switch (subsys_type) {
211 case 2: return "ARC Sensor & Control IP Subsystem";
212 case 3: return "ARC Data Fusion IP Subsystem";
213 case 4: return "ARC Secure Subsystem";
214 default: return "Unknown subsystem";
218 __weak int print_cpuinfo(void)
220 const char *subsys_name = decode_subsystem();
223 printf("CPU: %s at %s MHz\n", decode_identity(),
224 strmhz(mhz, gd->cpu_clk));
227 printf("Subsys:%s\n", subsys_name);
231 #endif /* CONFIG_DISPLAY_CPUINFO */