summaryrefslogtreecommitdiffstats
path: root/hw/ssi
diff options
context:
space:
mode:
authorPeter Maydell2018-08-24 14:17:46 +0200
committerPeter Maydell2018-08-24 14:17:46 +0200
commit7d3912f54e74a16dc69c1e427396ebef58ff4976 (patch)
treee9fdca9f5cd3ee95650077d193c3fb037ad69947 /hw/ssi
parenthw/ssi/pl022: Correct wrong value for PL022_INT_RT (diff)
downloadqemu-7d3912f54e74a16dc69c1e427396ebef58ff4976.tar.gz
qemu-7d3912f54e74a16dc69c1e427396ebef58ff4976.tar.xz
qemu-7d3912f54e74a16dc69c1e427396ebef58ff4976.zip
hw/ssi/pl022: Correct wrong DMACR and ICR handling
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>
Diffstat (limited to 'hw/ssi')
-rw-r--r--hw/ssi/pl022.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/hw/ssi/pl022.c b/hw/ssi/pl022.c
index d310671d18..e58247554c 100644
--- a/hw/ssi/pl022.c
+++ b/hw/ssi/pl022.c
@@ -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:
@@ -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");
}