aboutsummaryrefslogtreecommitdiff
path: root/hw/gpio/imx_gpio.c
diff options
context:
space:
mode:
authorJamin Lin <jamin_lin@aspeedtech.com>2024-10-01 10:43:30 +0800
committerCédric Le Goater <clg@redhat.com>2024-10-24 07:57:47 +0200
commit7e22f6fafef951b336d1427d781d2e4a71f37d9f (patch)
tree507042a3a04a0ec8955c77b814fb2fd04ac1a725 /hw/gpio/imx_gpio.c
parent404e75343c3faef7d8e042dd3ad3153a9815ade1 (diff)
downloadqemu-7e22f6fafef951b336d1427d781d2e4a71f37d9f.zip
qemu-7e22f6fafef951b336d1427d781d2e4a71f37d9f.tar.gz
qemu-7e22f6fafef951b336d1427d781d2e4a71f37d9f.tar.bz2
hw/gpio/aspeed: Fix clear incorrect interrupt status for GPIO index mode
The interrupt status field is W1C, where a set bit on read indicates an interrupt is pending. If the bit extracted from data is set it should clear the corresponding bit in reg_value. However, if the extracted bit is clear then the value of the corresponding bit in reg_value should be unchanged. SHARED_FIELD_EX32() extracts the interrupt status bit from the write (data). reg_value is set to the set's interrupt status, which means that for any pin with an interrupt pending, the corresponding bit is set. The deposit32() call updates the bit at pin_idx in the reg_value, using the value extracted from the write (data). The result is that if multiple interrupt status bits were pending and the write was acknowledging specific one bit, then the all interrupt status bits will be cleared. However, it is index mode and should only clear the corresponding bit. For example, say we have an interrupt pending for GPIOA0, where the following statements are true: set->int_status == 0b01 s->pending == 1 Before it is acknowledged, an interrupt becomes pending for GPIOA1: set->int_status == 0b11 s->pending == 2 A write is issued to acknowledge the interrupt for GPIOA0. This causes the following sequence: reg_value == 0b11 pending == 2 s->pending == 0 set->int_status == 0b00 It should only clear bit 0 in index mode and the correct result should be as following. set->int_status == 0b11 s->pending == 2 pending == 1 s->pending == 1 set->int_status == 0b10 Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com> Suggested-by: Andrew Jeffery <andrew@codeconstruct.com.au> Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Diffstat (limited to 'hw/gpio/imx_gpio.c')
0 files changed, 0 insertions, 0 deletions