pmu: add adb_autopoll_block() and adb_autopoll_unblock() functions

Ensure that the PMU buffer is protected from autopoll requests overwriting
its contents whilst existing PMU requests are in progress.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Tested-by: Finn Thain <fthain@telegraphics.com.au>
Acked-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20200623204936.24064-18-mark.cave-ayland@ilande.co.uk>
This commit is contained in:
Mark Cave-Ayland 2020-06-23 21:49:31 +01:00
parent 45c9d721ef
commit cf093b0772

View File

@ -517,6 +517,7 @@ static void pmu_update(PMUState *s)
{ {
MOS6522PMUState *mps = &s->mos6522_pmu; MOS6522PMUState *mps = &s->mos6522_pmu;
MOS6522State *ms = MOS6522(mps); MOS6522State *ms = MOS6522(mps);
ADBBusState *adb_bus = &s->adb_bus;
/* Only react to changes in reg B */ /* Only react to changes in reg B */
if (ms->b == s->last_b) { if (ms->b == s->last_b) {
@ -578,6 +579,7 @@ static void pmu_update(PMUState *s)
s->cmd_rsp_pos = 0; s->cmd_rsp_pos = 0;
s->cmd_state = pmu_state_cmd; s->cmd_state = pmu_state_cmd;
adb_autopoll_block(adb_bus);
trace_pmu_debug_protocol_cmd(s->cmd, s->cmdlen, s->rsplen); trace_pmu_debug_protocol_cmd(s->cmd, s->cmdlen, s->rsplen);
break; break;
@ -636,6 +638,7 @@ static void pmu_update(PMUState *s)
if (s->cmd_state == pmu_state_rsp && s->rsplen == s->cmd_rsp_pos) { if (s->cmd_state == pmu_state_rsp && s->rsplen == s->cmd_rsp_pos) {
trace_pmu_debug_protocol_cmd_resp_complete(ms->ier); trace_pmu_debug_protocol_cmd_resp_complete(ms->ier);
adb_autopoll_unblock(adb_bus);
s->cmd_state = pmu_state_idle; s->cmd_state = pmu_state_idle;
} }
} }