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:
parent
45c9d721ef
commit
cf093b0772
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user