Skip to content

Commit

Permalink
hw/ssi/pl022: Correct wrong DMACR and ICR handling
Browse files Browse the repository at this point in the history
In the PL022, register offset 0x20 is the ICR, a write-only
interrupt-clear register.  Register offset 0x24 is DMACR, the DMA
control register.  We were incorrectly implementing (a stub version
of) DMACR at 0x20, and not implementing anything at 0x24.  Fix this
bug.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 20180820141116.9118-21-peter.maydell@linaro.org
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
  • Loading branch information
pm215 committed Aug 24, 2018
1 parent 139d941 commit 7d3912f
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions hw/ssi/pl022.c
Expand Up @@ -146,7 +146,7 @@ static uint64_t pl022_read(void *opaque, hwaddr offset,
return s->is;
case 0x1c: /* MIS */
return s->im & s->is;
case 0x20: /* DMACR */
case 0x24: /* DMACR */
/* Not implemented. */
return 0;
default:
Expand Down Expand Up @@ -192,7 +192,15 @@ static void pl022_write(void *opaque, hwaddr offset,
s->im = value;
pl022_update(s);
break;
case 0x20: /* DMACR */
case 0x20: /* ICR */
/*
* write-1-to-clear: bit 0 clears ROR, bit 1 clears RT;
* RX and TX interrupts cannot be cleared this way.
*/
value &= PL022_INT_ROR | PL022_INT_RT;
s->is &= ~value;
break;
case 0x24: /* DMACR */
if (value) {
qemu_log_mask(LOG_UNIMP, "pl022: DMA not implemented\n");
}
Expand Down

0 comments on commit 7d3912f

Please sign in to comment.