mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-29 22:20:48 +00:00
MFC: Fix Tag Status report for sync/eieio/barrier commands
This commit is contained in:
parent
0979207cc6
commit
d7a2d42d8f
@ -1027,32 +1027,32 @@ void spu_thread::cpu_init()
|
|||||||
ch_tag_upd = 0;
|
ch_tag_upd = 0;
|
||||||
ch_tag_mask = 0;
|
ch_tag_mask = 0;
|
||||||
mfc_prxy_mask = 0;
|
mfc_prxy_mask = 0;
|
||||||
ch_tag_stat.data.release({});
|
ch_tag_stat.data.raw() = {};
|
||||||
ch_stall_mask = 0;
|
ch_stall_mask = 0;
|
||||||
ch_stall_stat.data.release({});
|
ch_stall_stat.data.raw() = {};
|
||||||
ch_atomic_stat.data.release({});
|
ch_atomic_stat.data.raw() = {};
|
||||||
|
|
||||||
ch_in_mbox.clear();
|
ch_in_mbox.clear();
|
||||||
|
|
||||||
ch_out_mbox.data.release({});
|
ch_out_mbox.data.raw() = {};
|
||||||
ch_out_intr_mbox.data.release({});
|
ch_out_intr_mbox.data.raw() = {};
|
||||||
|
|
||||||
snr_config = 0;
|
snr_config = 0;
|
||||||
|
|
||||||
ch_snr1.data.release({});
|
ch_snr1.data.raw() = {};
|
||||||
ch_snr2.data.release({});
|
ch_snr2.data.raw() = {};
|
||||||
|
|
||||||
ch_event_mask = 0;
|
ch_event_mask.raw() = 0;
|
||||||
ch_event_stat = 0;
|
ch_event_stat.raw() = 0;
|
||||||
interrupts_enabled = false;
|
interrupts_enabled.raw() = false;
|
||||||
raddr = 0;
|
raddr = 0;
|
||||||
|
|
||||||
ch_dec_start_timestamp = get_timebased_time(); // ???
|
ch_dec_start_timestamp = get_timebased_time(); // ???
|
||||||
ch_dec_value = 0;
|
ch_dec_value = 0;
|
||||||
|
|
||||||
run_ctrl.release(0);
|
run_ctrl.raw() = 0;
|
||||||
status.release(0);
|
status.raw() = 0;
|
||||||
npc.release(0);
|
npc.raw() = 0;
|
||||||
|
|
||||||
int_ctrl[0].clear();
|
int_ctrl[0].clear();
|
||||||
int_ctrl[1].clear();
|
int_ctrl[1].clear();
|
||||||
@ -1488,6 +1488,7 @@ bool spu_thread::do_dma_check(const spu_mfc_cmd& args)
|
|||||||
if ((mfc_queue[i].cmd & ~0xc) == MFC_BARRIER_CMD)
|
if ((mfc_queue[i].cmd & ~0xc) == MFC_BARRIER_CMD)
|
||||||
{
|
{
|
||||||
mfc_barrier |= -1;
|
mfc_barrier |= -1;
|
||||||
|
mfc_fence |= utils::rol32(1, mfc_queue[i].tag);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1657,6 +1658,9 @@ void spu_thread::do_mfc(bool wait)
|
|||||||
// Process enqueued commands
|
// Process enqueued commands
|
||||||
std::remove_if(mfc_queue + 0, mfc_queue + mfc_size, [&](spu_mfc_cmd& args)
|
std::remove_if(mfc_queue + 0, mfc_queue + mfc_size, [&](spu_mfc_cmd& args)
|
||||||
{
|
{
|
||||||
|
// Select tag bit in the tag mask or the stall mask
|
||||||
|
const u32 mask = utils::rol32(1, args.tag);
|
||||||
|
|
||||||
if ((args.cmd & ~0xc) == MFC_BARRIER_CMD)
|
if ((args.cmd & ~0xc) == MFC_BARRIER_CMD)
|
||||||
{
|
{
|
||||||
if (&args - mfc_queue <= removed)
|
if (&args - mfc_queue <= removed)
|
||||||
@ -1669,12 +1673,10 @@ void spu_thread::do_mfc(bool wait)
|
|||||||
|
|
||||||
// Block all tags
|
// Block all tags
|
||||||
barrier |= -1;
|
barrier |= -1;
|
||||||
|
fence |= mask;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select tag bit in the tag mask or the stall mask
|
|
||||||
const u32 mask = utils::rol32(1, args.tag);
|
|
||||||
|
|
||||||
if (barrier & mask)
|
if (barrier & mask)
|
||||||
{
|
{
|
||||||
fence |= mask;
|
fence |= mask;
|
||||||
@ -2092,6 +2094,7 @@ bool spu_thread::process_mfc_cmd()
|
|||||||
{
|
{
|
||||||
mfc_queue[mfc_size++] = ch_mfc_cmd;
|
mfc_queue[mfc_size++] = ch_mfc_cmd;
|
||||||
mfc_barrier |= -1;
|
mfc_barrier |= -1;
|
||||||
|
mfc_fence |= utils::rol32(1, ch_mfc_cmd.tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user