Commit d975cbc8 authored by Vineet Gupta's avatar Vineet Gupta

ARC: boot log: refactor cpu name/release printing

The motivation is to identify ARC750 vs. ARC770 (we currently print
generic "ARC700").

A given ARC700 release could be 750 or 770, with same ARCNUM (or family
identifier which is unfortunate). The existing arc_cpu_tbl[] kept a single
concatenated string for core name and release which thus doesn't work
for 750 vs. 770 identification.

So split this into 2 tables, one with core names and other with release.
And while we are at it, get rid of the range checking for family numbers.
We just document the known to exist cores running Linux and ditch
others.

With this in place, we add detection of ARC750 which is
 - cores 0x33 and before
 - cores 0x34 and later with MMUv2
Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
parent d7c46114
...@@ -349,7 +349,7 @@ struct cpuinfo_arc { ...@@ -349,7 +349,7 @@ struct cpuinfo_arc {
struct cpuinfo_arc_bpu bpu; struct cpuinfo_arc_bpu bpu;
struct bcr_identity core; struct bcr_identity core;
struct bcr_isa isa; struct bcr_isa isa;
const char *details; const char *details, *name;
unsigned int vec_base; unsigned int vec_base;
struct cpuinfo_arc_ccm iccm, dccm; struct cpuinfo_arc_ccm iccm, dccm;
struct { struct {
......
...@@ -27,11 +27,6 @@ struct id_to_str { ...@@ -27,11 +27,6 @@ struct id_to_str {
const char *str; const char *str;
}; };
struct cpuinfo_data {
struct id_to_str info;
int up_range;
};
extern int root_mountflags, end_mem; extern int root_mountflags, end_mem;
void setup_processor(void); void setup_processor(void);
......
...@@ -40,18 +40,27 @@ struct task_struct *_current_task[NR_CPUS]; /* For stack switching */ ...@@ -40,18 +40,27 @@ struct task_struct *_current_task[NR_CPUS]; /* For stack switching */
struct cpuinfo_arc cpuinfo_arc700[NR_CPUS]; struct cpuinfo_arc cpuinfo_arc700[NR_CPUS];
static const struct cpuinfo_data arc_cpu_tbl[] = { static const struct id_to_str arc_cpu_rel[] = {
#ifdef CONFIG_ISA_ARCOMPACT #ifdef CONFIG_ISA_ARCOMPACT
{ {0x20, "ARC 600" }, 0x2F}, { 0x34, "R4.10"},
{ {0x30, "ARC 700" }, 0x33}, { 0x35, "R4.11"},
{ {0x34, "ARC 700 R4.10"}, 0x34},
{ {0x35, "ARC 700 R4.11"}, 0x35},
#else #else
{ {0x50, "ARC HS38 R2.0"}, 0x51}, { 0x51, "R2.0" },
{ {0x52, "ARC HS38 R2.1"}, 0x52}, { 0x52, "R2.1" },
{ {0x53, "ARC HS38 R3.0"}, 0x53}, { 0x53, "R3.0" },
#endif #endif
{ {0x00, NULL } } { 0x00, NULL }
};
static const struct id_to_str arc_cpu_nm[] = {
#ifdef CONFIG_ISA_ARCOMPACT
{ 0x20, "ARC 600" },
{ 0x30, "ARC 770" }, /* 750 identified seperately */
#else
{ 0x40, "ARC EM" },
{ 0x50, "ARC HS38" },
#endif
{ 0x00, "Unknown" }
}; };
static void read_decode_ccm_bcr(struct cpuinfo_arc *cpu) static void read_decode_ccm_bcr(struct cpuinfo_arc *cpu)
...@@ -106,23 +115,25 @@ static void read_arc_build_cfg_regs(void) ...@@ -106,23 +115,25 @@ static void read_arc_build_cfg_regs(void)
struct bcr_timer timer; struct bcr_timer timer;
struct bcr_generic bcr; struct bcr_generic bcr;
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()]; struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
const struct cpuinfo_data *tbl; const struct id_to_str *tbl;
FIX_PTR(cpu); FIX_PTR(cpu);
READ_BCR(AUX_IDENTITY, cpu->core); READ_BCR(AUX_IDENTITY, cpu->core);
READ_BCR(ARC_REG_ISA_CFG_BCR, cpu->isa); READ_BCR(ARC_REG_ISA_CFG_BCR, cpu->isa);
for (tbl = &arc_cpu_tbl[0]; tbl->info.id != 0; tbl++) { for (tbl = &arc_cpu_rel[0]; tbl->id != 0; tbl++) {
if ((cpu->core.family >= tbl->info.id) && if (cpu->core.family == tbl->id) {
(cpu->core.family <= tbl->up_range)) { cpu->details = tbl->str;
cpu->details = tbl->info.str;
break; break;
} }
} }
if (tbl->info.id == 0) for (tbl = &arc_cpu_nm[0]; tbl->id != 0; tbl++) {
cpu->details = "UNKNOWN"; if ((cpu->core.family & 0xF0) == tbl->id)
break;
}
cpu->name = tbl->str;
READ_BCR(ARC_REG_TIMERS_BCR, timer); READ_BCR(ARC_REG_TIMERS_BCR, timer);
cpu->extn.timer0 = timer.t0; cpu->extn.timer0 = timer.t0;
...@@ -199,6 +210,10 @@ static void read_arc_build_cfg_regs(void) ...@@ -199,6 +210,10 @@ static void read_arc_build_cfg_regs(void)
cpu->isa.atomic = cpu->isa.atomic1; cpu->isa.atomic = cpu->isa.atomic1;
cpu->isa.be = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN); cpu->isa.be = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN);
/* there's no direct way to distinguish 750 vs. 770 */
if (unlikely(cpu->core.family < 0x34 || cpu->mmu.ver < 3))
cpu->name = "ARC750";
} }
} }
...@@ -214,8 +229,8 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len) ...@@ -214,8 +229,8 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
"\nIDENTITY\t: ARCVER [%#02x] ARCNUM [%#02x] CHIPID [%#4x]\n", "\nIDENTITY\t: ARCVER [%#02x] ARCNUM [%#02x] CHIPID [%#4x]\n",
core->family, core->cpu_id, core->chip_id); core->family, core->cpu_id, core->chip_id);
n += scnprintf(buf + n, len - n, "processor [%d]\t: %s (%s ISA) %s\n", n += scnprintf(buf + n, len - n, "processor [%d]\t: %s %s (%s ISA) %s\n",
cpu_id, cpu->details, cpu_id, cpu->name, cpu->details,
is_isa_arcompact() ? "ARCompact" : "ARCv2", is_isa_arcompact() ? "ARCompact" : "ARCv2",
IS_AVAIL1(cpu->isa.be, "[Big-Endian]")); IS_AVAIL1(cpu->isa.be, "[Big-Endian]"));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment