Skip to content

Commit 7b2e932

Browse files
committed
ARCv2: don't assume core 0x54 has dual issue
The first release of core4 (0x54) was dual issue only (HS4x). Newer releases allow hardware to be configured as single issue (HS3x) or dual issue. Prevent accessing a HS4x only aux register in HS3x, which otherwise leads to illegal instruction exceptions Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
1 parent b6835ea commit 7b2e932

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

arch/arc/include/asm/arcregs.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,14 @@ struct bcr_isa_arcv2 {
151151
#endif
152152
};
153153

154+
struct bcr_uarch_build_arcv2 {
155+
#ifdef CONFIG_CPU_BIG_ENDIAN
156+
unsigned int pad:8, prod:8, maj:8, min:8;
157+
#else
158+
unsigned int min:8, maj:8, prod:8, pad:8;
159+
#endif
160+
};
161+
154162
struct bcr_mpy {
155163
#ifdef CONFIG_CPU_BIG_ENDIAN
156164
unsigned int pad:8, x1616:8, dsp:4, cycles:2, type:2, ver:8;

arch/arc/kernel/setup.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,13 +199,29 @@ static void read_arc_build_cfg_regs(void)
199199
cpu->bpu.ret_stk = 4 << bpu.rse;
200200

201201
if (cpu->core.family >= 0x54) {
202-
unsigned int exec_ctrl;
203202

204-
READ_BCR(AUX_EXEC_CTRL, exec_ctrl);
205-
cpu->extn.dual_enb = !(exec_ctrl & 1);
203+
struct bcr_uarch_build_arcv2 uarch;
206204

207-
/* dual issue always present for this core */
208-
cpu->extn.dual = 1;
205+
/*
206+
* The first 0x54 core (uarch maj:min 0:1 or 0:2) was
207+
* dual issue only (HS4x). But next uarch rev (1:0)
208+
* allows it be configured for single issue (HS3x)
209+
* Ensure we fiddle with dual issue only on HS4x
210+
*/
211+
READ_BCR(ARC_REG_MICRO_ARCH_BCR, uarch);
212+
213+
if (uarch.prod == 4) {
214+
unsigned int exec_ctrl;
215+
216+
/* dual issue hardware always present */
217+
cpu->extn.dual = 1;
218+
219+
READ_BCR(AUX_EXEC_CTRL, exec_ctrl);
220+
221+
/* dual issue hardware enabled ? */
222+
cpu->extn.dual_enb = !(exec_ctrl & 1);
223+
224+
}
209225
}
210226
}
211227

0 commit comments

Comments
 (0)