Skip to content

Commit 010a8c9

Browse files
committed
ARC: boot log: decontaminate ARCv2 ISA_CONFIG register
ARCv2 ISA_CONFIG and ARC700_BUILD build config registers are not compatible. cpuinfo_arc had isa info placeholder which was mashup of bits form both. Untangle this by defining it off of ARCv2 ISA info and it is fine even for ARC700 since former is a super set of latter (ARC700 buildonly has 2 bits for atomics and stack check). At runtime, we treat ARCv2 ISA info as a generic placeholder but populate it correctly depending on ARC700 or HS. This paves way for adding more HS specific bits in isa info which was colliding with the extra bits for arc700. Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
1 parent d9bc84a commit 010a8c9

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

arch/arc/include/asm/arcregs.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,12 @@ struct bcr_identity {
135135
#endif
136136
};
137137

138-
struct bcr_isa {
138+
struct bcr_isa_arcv2 {
139139
#ifdef CONFIG_CPU_BIG_ENDIAN
140140
unsigned int div_rem:4, pad2:4, ldd:1, unalign:1, atomic:1, be:1,
141-
pad1:11, atomic1:1, ver:8;
141+
pad1:12, ver:8;
142142
#else
143-
unsigned int ver:8, atomic1:1, pad1:11, be:1, atomic:1, unalign:1,
143+
unsigned int ver:8, pad1:12, be:1, atomic:1, unalign:1,
144144
ldd:1, pad2:4, div_rem:4;
145145
#endif
146146
};
@@ -263,7 +263,7 @@ struct cpuinfo_arc {
263263
struct cpuinfo_arc_mmu mmu;
264264
struct cpuinfo_arc_bpu bpu;
265265
struct bcr_identity core;
266-
struct bcr_isa isa;
266+
struct bcr_isa_arcv2 isa;
267267
const char *details, *name;
268268
unsigned int vec_base;
269269
struct cpuinfo_arc_ccm iccm, dccm;

arch/arc/kernel/setup.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,11 @@ static void read_arc_build_cfg_regs(void)
119119
struct bcr_generic bcr;
120120
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
121121
const struct id_to_str *tbl;
122+
struct bcr_isa_arcv2 isa;
122123

123124
FIX_PTR(cpu);
124125

125126
READ_BCR(AUX_IDENTITY, cpu->core);
126-
READ_BCR(ARC_REG_ISA_CFG_BCR, cpu->isa);
127127

128128
for (tbl = &arc_cpu_rel[0]; tbl->id != 0; tbl++) {
129129
if (cpu->core.family == tbl->id) {
@@ -205,18 +205,25 @@ static void read_arc_build_cfg_regs(void)
205205

206206
cpu->extn.debug = cpu->extn.ap | cpu->extn.smart | cpu->extn.rtt;
207207

208+
READ_BCR(ARC_REG_ISA_CFG_BCR, isa);
209+
208210
/* some hacks for lack of feature BCR info in old ARC700 cores */
209211
if (is_isa_arcompact()) {
210-
if (!cpu->isa.ver) /* ISA BCR absent, use Kconfig info */
212+
if (!isa.ver) /* ISA BCR absent, use Kconfig info */
211213
cpu->isa.atomic = IS_ENABLED(CONFIG_ARC_HAS_LLSC);
212-
else
213-
cpu->isa.atomic = cpu->isa.atomic1;
214+
else {
215+
/* ARC700_BUILD only has 2 bits of isa info */
216+
struct bcr_generic bcr = *(struct bcr_generic *)&isa;
217+
cpu->isa.atomic = bcr.info & 1;
218+
}
214219

215220
cpu->isa.be = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN);
216221

217222
/* there's no direct way to distinguish 750 vs. 770 */
218223
if (unlikely(cpu->core.family < 0x34 || cpu->mmu.ver < 3))
219224
cpu->name = "ARC750";
225+
} else {
226+
cpu->isa = isa;
220227
}
221228
}
222229

0 commit comments

Comments
 (0)