Commit 7c3a622d authored by Nigel Stephens's avatar Nigel Stephens Committed by Ralf Baechle

[MIPS] vpe: handle halting TCs in an errata safe way.

Adds a JR.HB after halting a TC, to ensure that the TC has really halted.
only modifies the TCSTATUS register when the TC is safely halted.
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 8dfa741f
...@@ -1003,6 +1003,7 @@ static void cleanup_tc(struct tc *tc) ...@@ -1003,6 +1003,7 @@ static void cleanup_tc(struct tc *tc)
write_tc_c0_tcstatus(tmp); write_tc_c0_tcstatus(tmp);
write_tc_c0_tchalt(TCHALT_H); write_tc_c0_tchalt(TCHALT_H);
mips_ihb();
/* bind it to anything other than VPE1 */ /* bind it to anything other than VPE1 */
// write_tc_c0_tcbind(read_tc_c0_tcbind() & ~TCBIND_CURVPE); // | TCBIND_CURVPE // write_tc_c0_tcbind(read_tc_c0_tcbind() & ~TCBIND_CURVPE); // | TCBIND_CURVPE
...@@ -1235,9 +1236,12 @@ int vpe_free(vpe_handle vpe) ...@@ -1235,9 +1236,12 @@ int vpe_free(vpe_handle vpe)
settc(t->index); settc(t->index);
write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() & ~VPECONF0_VPA); write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() & ~VPECONF0_VPA);
/* mark the TC unallocated and halt'ed */ /* halt the TC */
write_tc_c0_tcstatus(read_tc_c0_tcstatus() & ~TCSTATUS_A);
write_tc_c0_tchalt(TCHALT_H); write_tc_c0_tchalt(TCHALT_H);
mips_ihb();
/* mark the TC unallocated */
write_tc_c0_tcstatus(read_tc_c0_tcstatus() & ~TCSTATUS_A);
v->state = VPE_STATE_UNUSED; v->state = VPE_STATE_UNUSED;
...@@ -1533,14 +1537,16 @@ static int __init vpe_module_init(void) ...@@ -1533,14 +1537,16 @@ static int __init vpe_module_init(void)
t->pvpe = get_vpe(0); /* set the parent vpe */ t->pvpe = get_vpe(0); /* set the parent vpe */
} }
/* halt the TC */
write_tc_c0_tchalt(TCHALT_H);
mips_ihb();
tmp = read_tc_c0_tcstatus(); tmp = read_tc_c0_tcstatus();
/* mark not activated and not dynamically allocatable */ /* mark not activated and not dynamically allocatable */
tmp &= ~(TCSTATUS_A | TCSTATUS_DA); tmp &= ~(TCSTATUS_A | TCSTATUS_DA);
tmp |= TCSTATUS_IXMT; /* interrupt exempt */ tmp |= TCSTATUS_IXMT; /* interrupt exempt */
write_tc_c0_tcstatus(tmp); write_tc_c0_tcstatus(tmp);
write_tc_c0_tchalt(TCHALT_H);
} }
} }
......
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