1
Arm queue; bugfixes only.
1
Mostly just bug fixes. The important one here is
2
hw/intc/arm_gic: Fix interrupt ID in GICD_SGIR register
3
which fixes a buffer overrun that's a security issue if you're running
4
KVM on Arm with kernel-irqchip=off (which hopefully nobody is doing in
5
a security context, because kernel-irqchip=on is the default and the
6
sensible choice for performance).
2
7
3
thanks
4
-- PMM
8
-- PMM
5
9
6
The following changes since commit 48aa8f0ac536db3550a35c295ff7de94e4c33739:
10
The following changes since commit cf7ca7d5b9faca13f1f8e3ea92cfb2f741eb0c0e:
7
11
8
Merge remote-tracking branch 'remotes/ericb/tags/pull-nbd-2020-11-16' into staging (2020-11-17 11:07:00 +0000)
12
Merge remote-tracking branch 'remotes/stefanha-gitlab/tags/tracing-pull-request' into staging (2021-02-01 16:28:00 +0000)
9
13
10
are available in the Git repository at:
14
are available in the Git repository at:
11
15
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201117
16
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210202-1
13
17
14
for you to fetch changes up to ab135622cf478585bdfcb68b85e4a817d74a0c42:
18
for you to fetch changes up to 14657850c9cc10948551fbb884c30eb5a3a7370a:
15
19
16
tmp105: Correct handling of temperature limit checks (2020-11-17 12:56:33 +0000)
20
hw/arm: Display CPU type in machine description (2021-02-02 17:53:44 +0000)
17
21
18
----------------------------------------------------------------
22
----------------------------------------------------------------
19
target-arm queue:
23
target-arm queue:
20
* hw/arm/virt: ARM_VIRT must select ARM_GIC
24
* hw/intc/arm_gic: Allow to use QTest without crashing
21
* exynos: Fix bad printf format specifiers
25
* hw/char/exynos4210_uart: Fix buffer size reporting with FIFO disabled
22
* hw/input/ps2.c: Remove remnants of printf debug
26
* hw/char/exynos4210_uart: Fix missing call to report ready for input
23
* target/openrisc: Remove dead code attempting to check "is timer disabled"
27
* hw/arm/smmuv3: Fix addr_mask for range-based invalidation
24
* register: Remove unnecessary NULL check
28
* hw/ssi/imx_spi: Fix various minor bugs
25
* util/cutils: Fix Coverity array overrun in freq_to_str()
29
* hw/intc/arm_gic: Fix interrupt ID in GICD_SGIR register
26
* configure: Make "does libgio work" test pull in some actual functions
30
* hw/arm: Add missing Kconfig dependencies
27
* tmp105: reset the T_low and T_High registers
31
* hw/arm: Display CPU type in machine description
28
* tmp105: Correct handling of temperature limit checks
29
32
30
----------------------------------------------------------------
33
----------------------------------------------------------------
31
Alex Chen (1):
34
Bin Meng (5):
32
exynos: Fix bad printf format specifiers
35
hw/ssi: imx_spi: Use a macro for number of chip selects supported
36
hw/ssi: imx_spi: Remove imx_spi_update_irq() in imx_spi_reset()
37
hw/ssi: imx_spi: Round up the burst length to be multiple of 8
38
hw/ssi: imx_spi: Correct the burst length > 32 bit transfer logic
39
hw/ssi: imx_spi: Correct tx and rx fifo endianness
33
40
34
Alistair Francis (1):
41
Iris Johnson (2):
35
register: Remove unnecessary NULL check
42
hw/char/exynos4210_uart: Fix buffer size reporting with FIFO disabled
43
hw/char/exynos4210_uart: Fix missing call to report ready for input
36
44
37
Andrew Jones (1):
45
Philippe Mathieu-Daudé (12):
38
hw/arm/virt: ARM_VIRT must select ARM_GIC
46
hw/intc/arm_gic: Allow to use QTest without crashing
47
hw/ssi: imx_spi: Remove pointless variable initialization
48
hw/ssi: imx_spi: Rework imx_spi_reset() to keep CONREG register value
49
hw/ssi: imx_spi: Rework imx_spi_read() to handle block disabled
50
hw/ssi: imx_spi: Rework imx_spi_write() to handle block disabled
51
hw/intc/arm_gic: Fix interrupt ID in GICD_SGIR register
52
hw/arm/stm32f405_soc: Add missing dependency on OR_IRQ
53
hw/arm/exynos4210: Add missing dependency on OR_IRQ
54
hw/arm/xlnx-versal: Versal SoC requires ZDMA
55
hw/arm/xlnx-versal: Versal SoC requires ZynqMP peripherals
56
hw/net/can: ZynqMP CAN device requires PTIMER
57
hw/arm: Display CPU type in machine description
39
58
40
Peter Maydell (5):
59
Xuzhou Cheng (1):
41
hw/input/ps2.c: Remove remnants of printf debug
60
hw/ssi: imx_spi: Disable chip selects when controller is disabled
42
target/openrisc: Remove dead code attempting to check "is timer disabled"
43
configure: Make "does libgio work" test pull in some actual functions
44
hw/misc/tmp105: reset the T_low and T_High registers
45
tmp105: Correct handling of temperature limit checks
46
61
47
Philippe Mathieu-Daudé (1):
62
Zenghui Yu (1):
48
util/cutils: Fix Coverity array overrun in freq_to_str()
63
hw/arm/smmuv3: Fix addr_mask for range-based invalidation
49
64
50
configure | 11 +++++--
65
include/hw/ssi/imx_spi.h | 5 +-
51
hw/misc/tmp105.h | 7 +++++
66
hw/arm/digic_boards.c | 2 +-
52
hw/core/register.c | 4 ---
67
hw/arm/microbit.c | 2 +-
53
hw/input/ps2.c | 9 ------
68
hw/arm/netduino2.c | 2 +-
54
hw/misc/tmp105.c | 73 ++++++++++++++++++++++++++++++++++++++------
69
hw/arm/netduinoplus2.c | 2 +-
55
hw/timer/exynos4210_mct.c | 4 +--
70
hw/arm/orangepi.c | 2 +-
56
hw/timer/exynos4210_pwm.c | 8 ++---
71
hw/arm/smmuv3.c | 4 +-
57
target/openrisc/sys_helper.c | 3 --
72
hw/arm/stellaris.c | 4 +-
58
util/cutils.c | 3 +-
73
hw/char/exynos4210_uart.c | 7 ++-
59
hw/arm/Kconfig | 1 +
74
hw/intc/arm_gic.c | 5 +-
60
10 files changed, 89 insertions(+), 34 deletions(-)
75
hw/ssi/imx_spi.c | 153 +++++++++++++++++++++++++++++-----------------
76
hw/Kconfig | 1 +
77
hw/arm/Kconfig | 5 ++
78
hw/dma/Kconfig | 3 +
79
hw/dma/meson.build | 2 +-
80
15 files changed, 130 insertions(+), 69 deletions(-)
61
81
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
Alexander reported an issue in gic_get_current_cpu() using the
4
fuzzer. Yet another "deref current_cpu with QTest" bug, reproducible
5
doing:
6
7
$ echo readb 0xf03ff000 | qemu-system-arm -M npcm750-evb,accel=qtest -qtest stdio
8
[I 1611849440.651452] OPENED
9
[R +0.242498] readb 0xf03ff000
10
hw/intc/arm_gic.c:63:29: runtime error: member access within null pointer of type 'CPUState' (aka 'struct CPUState')
11
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior hw/intc/arm_gic.c:63:29 in
12
AddressSanitizer:DEADLYSIGNAL
13
=================================================================
14
==3719691==ERROR: AddressSanitizer: SEGV on unknown address 0x0000000082a0 (pc 0x5618790ac882 bp 0x7ffca946f4f0 sp 0x7ffca946f4a0 T0)
15
==3719691==The signal is caused by a READ memory access.
16
#0 0x5618790ac882 in gic_get_current_cpu hw/intc/arm_gic.c:63:29
17
#1 0x5618790a8901 in gic_dist_readb hw/intc/arm_gic.c:955:11
18
#2 0x5618790a7489 in gic_dist_read hw/intc/arm_gic.c:1158:17
19
#3 0x56187adc573b in memory_region_read_with_attrs_accessor softmmu/memory.c:464:9
20
#4 0x56187ad7903a in access_with_adjusted_size softmmu/memory.c:552:18
21
#5 0x56187ad766d6 in memory_region_dispatch_read1 softmmu/memory.c:1426:16
22
#6 0x56187ad758a8 in memory_region_dispatch_read softmmu/memory.c:1449:9
23
#7 0x56187b09e84c in flatview_read_continue softmmu/physmem.c:2822:23
24
#8 0x56187b0a0115 in flatview_read softmmu/physmem.c:2862:12
25
#9 0x56187b09fc9e in address_space_read_full softmmu/physmem.c:2875:18
26
#10 0x56187aa88633 in address_space_read include/exec/memory.h:2489:18
27
#11 0x56187aa88633 in qtest_process_command softmmu/qtest.c:558:13
28
#12 0x56187aa81881 in qtest_process_inbuf softmmu/qtest.c:797:9
29
#13 0x56187aa80e02 in qtest_read softmmu/qtest.c:809:5
30
31
current_cpu is NULL because QTest accelerator does not use CPU.
32
33
Fix by skipping the check and returning the first CPU index when
34
QTest accelerator is used, similarly to commit c781a2cc423
35
("hw/i386/vmport: Allow QTest use without crashing").
36
37
Reported-by: Alexander Bulekov <alxndr@bu.edu>
38
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
39
Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
40
Reviewed-by: Alexander Bulekov <alxndr@bu.edu>
41
Message-id: 20210128161417.3726358-1-philmd@redhat.com
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
44
hw/intc/arm_gic.c | 3 ++-
45
1 file changed, 2 insertions(+), 1 deletion(-)
46
47
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/intc/arm_gic.c
50
+++ b/hw/intc/arm_gic.c
51
@@ -XXX,XX +XXX,XX @@
52
#include "qemu/module.h"
53
#include "trace.h"
54
#include "sysemu/kvm.h"
55
+#include "sysemu/qtest.h"
56
57
/* #define DEBUG_GIC */
58
59
@@ -XXX,XX +XXX,XX @@ static const uint8_t gic_id_gicv2[] = {
60
61
static inline int gic_get_current_cpu(GICState *s)
62
{
63
- if (s->num_cpu > 1) {
64
+ if (!qtest_enabled() && s->num_cpu > 1) {
65
return current_cpu->cpu_index;
66
}
67
return 0;
68
--
69
2.20.1
70
71
diff view generated by jsdifflib
New patch
1
From: Iris Johnson <iris@modwiz.com>
1
2
3
Currently the Exynos 4210 UART code always reports available FIFO space
4
when the backend checks for buffer space. When the FIFO is disabled this
5
is behavior causes the backend chardev code to replace the data before the
6
guest can read it.
7
8
This patch changes adds the logic to report the capacity properly when the
9
FIFO is not being used.
10
11
Buglink: https://bugs.launchpad.net/qemu/+bug/1913344
12
Signed-off-by: Iris Johnson <iris@modwiz.com>
13
Message-id: 20210128033655.1029577-1-iris@modwiz.com
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/char/exynos4210_uart.c | 6 +++++-
18
1 file changed, 5 insertions(+), 1 deletion(-)
19
20
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/char/exynos4210_uart.c
23
+++ b/hw/char/exynos4210_uart.c
24
@@ -XXX,XX +XXX,XX @@ static int exynos4210_uart_can_receive(void *opaque)
25
{
26
Exynos4210UartState *s = (Exynos4210UartState *)opaque;
27
28
- return fifo_empty_elements_number(&s->rx);
29
+ if (s->reg[I_(UFCON)] & UFCON_FIFO_ENABLE) {
30
+ return fifo_empty_elements_number(&s->rx);
31
+ } else {
32
+ return !(s->reg[I_(UTRSTAT)] & UTRSTAT_Rx_BUFFER_DATA_READY);
33
+ }
34
}
35
36
static void exynos4210_uart_receive(void *opaque, const uint8_t *buf, int size)
37
--
38
2.20.1
39
40
diff view generated by jsdifflib
New patch
1
From: Iris Johnson <iris@modwiz.com>
1
2
3
When the frontend device has no space for a read the fd is removed
4
from polling to allow time for the guest to read and clear the buffer.
5
Without the call to qemu_chr_fe_accept_input(), the poll will not be
6
broken out of when the guest has cleared the buffer causing significant
7
IO delays that get worse with smaller buffers.
8
9
Buglink: https://bugs.launchpad.net/qemu/+bug/1913341
10
Signed-off-by: Iris Johnson <iris@modwiz.com>
11
Message-id: 20210130184016.1787097-1-iris@modwiz.com
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/char/exynos4210_uart.c | 1 +
16
1 file changed, 1 insertion(+)
17
18
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/char/exynos4210_uart.c
21
+++ b/hw/char/exynos4210_uart.c
22
@@ -XXX,XX +XXX,XX @@ static uint64_t exynos4210_uart_read(void *opaque, hwaddr offset,
23
s->reg[I_(UTRSTAT)] &= ~UTRSTAT_Rx_BUFFER_DATA_READY;
24
res = s->reg[I_(URXH)];
25
}
26
+ qemu_chr_fe_accept_input(&s->chr);
27
exynos4210_uart_update_dmabusy(s);
28
trace_exynos_uart_read(s->channel, offset,
29
exynos4210_uart_regname(offset), res);
30
--
31
2.20.1
32
33
diff view generated by jsdifflib
New patch
1
From: Zenghui Yu <yuzenghui@huawei.com>
1
2
3
When handling guest range-based IOTLB invalidation, we should decode the TG
4
field into the corresponding translation granule size so that we can pass
5
the correct invalidation range to backend. Set @granule to (tg * 2 + 10) to
6
properly emulate the architecture.
7
8
Fixes: d52915616c05 ("hw/arm/smmuv3: Get prepared for range invalidation")
9
Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
10
Acked-by: Eric Auger <eric.auger@redhat.com>
11
Message-id: 20210130043220.1345-1-yuzenghui@huawei.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/smmuv3.c | 4 +++-
15
1 file changed, 3 insertions(+), 1 deletion(-)
16
17
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/smmuv3.c
20
+++ b/hw/arm/smmuv3.c
21
@@ -XXX,XX +XXX,XX @@ static void smmuv3_notify_iova(IOMMUMemoryRegion *mr,
22
{
23
SMMUDevice *sdev = container_of(mr, SMMUDevice, iommu);
24
IOMMUTLBEvent event;
25
- uint8_t granule = tg;
26
+ uint8_t granule;
27
28
if (!tg) {
29
SMMUEventInfo event = {.inval_ste_allowed = true};
30
@@ -XXX,XX +XXX,XX @@ static void smmuv3_notify_iova(IOMMUMemoryRegion *mr,
31
return;
32
}
33
granule = tt->granule_sz;
34
+ } else {
35
+ granule = tg * 2 + 10;
36
}
37
38
event.type = IOMMU_NOTIFIER_UNMAP;
39
--
40
2.20.1
41
42
diff view generated by jsdifflib
1
In commit 5edab03d4040 we added tracepoints to the ps2 keyboard
1
From: Bin Meng <bin.meng@windriver.com>
2
and mouse emulation. However we didn't remove all the debug-by-printf
3
support. In fact there is only one printf() remaining, and it is
4
redundant with the trace_ps2_write_mouse() event next to it.
5
Remove the printf() and the now-unused DEBUG* macros.
6
2
3
Avoid using a magic number (4) everywhere for the number of chip
4
selects supported.
5
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Juan Quintela <quintela@redhat.com>
10
Message-id: 20210129132323.30946-2-bmeng.cn@gmail.com
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
10
Message-id: 20201101133258.4240-1-peter.maydell@linaro.org
11
---
12
---
12
hw/input/ps2.c | 9 ---------
13
include/hw/ssi/imx_spi.h | 5 ++++-
13
1 file changed, 9 deletions(-)
14
hw/ssi/imx_spi.c | 4 ++--
15
2 files changed, 6 insertions(+), 3 deletions(-)
14
16
15
diff --git a/hw/input/ps2.c b/hw/input/ps2.c
17
diff --git a/include/hw/ssi/imx_spi.h b/include/hw/ssi/imx_spi.h
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/input/ps2.c
19
--- a/include/hw/ssi/imx_spi.h
18
+++ b/hw/input/ps2.c
20
+++ b/include/hw/ssi/imx_spi.h
19
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@
20
22
21
#include "trace.h"
23
#define EXTRACT(value, name) extract32(value, name##_SHIFT, name##_LENGTH)
22
24
23
-/* debug PC keyboard */
25
+/* number of chip selects supported */
24
-//#define DEBUG_KBD
26
+#define ECSPI_NUM_CS 4
25
-
27
+
26
-/* debug PC keyboard : only mouse */
28
#define TYPE_IMX_SPI "imx.spi"
27
-//#define DEBUG_MOUSE
29
OBJECT_DECLARE_SIMPLE_TYPE(IMXSPIState, IMX_SPI)
28
-
30
29
/* Keyboard Commands */
31
@@ -XXX,XX +XXX,XX @@ struct IMXSPIState {
30
#define KBD_CMD_SET_LEDS    0xED    /* Set keyboard leds */
32
31
#define KBD_CMD_ECHO     0xEE
33
qemu_irq irq;
32
@@ -XXX,XX +XXX,XX @@ void ps2_write_mouse(void *opaque, int val)
34
33
PS2MouseState *s = (PS2MouseState *)opaque;
35
- qemu_irq cs_lines[4];
34
36
+ qemu_irq cs_lines[ECSPI_NUM_CS];
35
trace_ps2_write_mouse(opaque, val);
37
36
-#ifdef DEBUG_MOUSE
38
SSIBus *bus;
37
- printf("kbd: write mouse 0x%02x\n", val);
39
38
-#endif
40
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
39
switch(s->common.write_cmd) {
41
index XXXXXXX..XXXXXXX 100644
40
default:
42
--- a/hw/ssi/imx_spi.c
41
case -1:
43
+++ b/hw/ssi/imx_spi.c
44
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
45
46
/* We are in master mode */
47
48
- for (i = 0; i < 4; i++) {
49
+ for (i = 0; i < ECSPI_NUM_CS; i++) {
50
qemu_set_irq(s->cs_lines[i],
51
i == imx_spi_selected_channel(s) ? 0 : 1);
52
}
53
@@ -XXX,XX +XXX,XX @@ static void imx_spi_realize(DeviceState *dev, Error **errp)
54
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
55
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
56
57
- for (i = 0; i < 4; ++i) {
58
+ for (i = 0; i < ECSPI_NUM_CS; ++i) {
59
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->cs_lines[i]);
60
}
61
42
--
62
--
43
2.20.1
63
2.20.1
44
64
45
65
diff view generated by jsdifflib
New patch
1
From: Bin Meng <bin.meng@windriver.com>
1
2
3
Usually the approach is that the device on the other end of the line
4
is going to reset its state anyway, so there's no need to actively
5
signal an irq line change during the reset hook.
6
7
Move imx_spi_update_irq() out of imx_spi_reset(), to a new function
8
imx_spi_soft_reset() that is called when the controller is disabled.
9
10
Signed-off-by: Bin Meng <bin.meng@windriver.com>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Message-id: 20210129132323.30946-3-bmeng.cn@gmail.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/ssi/imx_spi.c | 14 ++++++++++----
16
1 file changed, 10 insertions(+), 4 deletions(-)
17
18
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/ssi/imx_spi.c
21
+++ b/hw/ssi/imx_spi.c
22
@@ -XXX,XX +XXX,XX @@ static void imx_spi_reset(DeviceState *dev)
23
imx_spi_rxfifo_reset(s);
24
imx_spi_txfifo_reset(s);
25
26
- imx_spi_update_irq(s);
27
-
28
s->burst_length = 0;
29
}
30
31
+static void imx_spi_soft_reset(IMXSPIState *s)
32
+{
33
+ imx_spi_reset(DEVICE(s));
34
+
35
+ imx_spi_update_irq(s);
36
+}
37
+
38
static uint64_t imx_spi_read(void *opaque, hwaddr offset, unsigned size)
39
{
40
uint32_t value = 0;
41
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
42
s->regs[ECSPI_CONREG] = value;
43
44
if (!imx_spi_is_enabled(s)) {
45
- /* device is disabled, so this is a reset */
46
- imx_spi_reset(DEVICE(s));
47
+ /* device is disabled, so this is a soft reset */
48
+ imx_spi_soft_reset(s);
49
+
50
return;
51
}
52
53
--
54
2.20.1
55
56
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Fix Coverity CID 1435957: Memory - illegal accesses (OVERRUN):
3
'burst_length' is cleared in imx_spi_reset(), which is called
4
after imx_spi_realize(). Remove the initialization to simplify.
4
5
5
>>> Overrunning array "suffixes" of 7 8-byte elements at element
6
Reviewed-by: Juan Quintela <quintela@redhat.com>
6
index 7 (byte offset 63) using index "idx" (which evaluates to 7).
7
8
Note, the biggest input value freq_to_str() can accept is UINT64_MAX,
9
which is ~18.446 EHz, less than 1000 EHz.
10
11
Reported-by: Eduardo Habkost <ehabkost@redhat.com>
12
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Bin Meng <bin.meng@windriver.com>
14
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
9
Signed-off-by: Bin Meng <bin.meng@windriver.com>
15
Reviewed-by: Luc Michel <luc@lmichel.fr>
10
Message-id: 20210129132323.30946-4-bmeng.cn@gmail.com
16
Message-id: 20201101215755.2021421-1-f4bug@amsat.org
11
Message-Id: <20210115153049.3353008-3-f4bug@amsat.org>
17
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Bin Meng <bin.meng@windriver.com>
18
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Signed-off-by: Bin Meng <bin.meng@windriver.com>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
15
---
21
util/cutils.c | 3 ++-
16
hw/ssi/imx_spi.c | 2 --
22
1 file changed, 2 insertions(+), 1 deletion(-)
17
1 file changed, 2 deletions(-)
23
18
24
diff --git a/util/cutils.c b/util/cutils.c
19
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
25
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
26
--- a/util/cutils.c
21
--- a/hw/ssi/imx_spi.c
27
+++ b/util/cutils.c
22
+++ b/hw/ssi/imx_spi.c
28
@@ -XXX,XX +XXX,XX @@ char *freq_to_str(uint64_t freq_hz)
23
@@ -XXX,XX +XXX,XX @@ static void imx_spi_realize(DeviceState *dev, Error **errp)
29
double freq = freq_hz;
24
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->cs_lines[i]);
30
size_t idx = 0;
31
32
- while (freq >= 1000.0 && idx < ARRAY_SIZE(suffixes)) {
33
+ while (freq >= 1000.0) {
34
freq /= 1000.0;
35
idx++;
36
}
25
}
37
+ assert(idx < ARRAY_SIZE(suffixes));
26
38
27
- s->burst_length = 0;
39
return g_strdup_printf("%0.3g %sHz", freq, suffixes[idx]);
28
-
29
fifo32_create(&s->tx_fifo, ECSPI_FIFO_SIZE);
30
fifo32_create(&s->rx_fifo, ECSPI_FIFO_SIZE);
40
}
31
}
41
--
32
--
42
2.20.1
33
2.20.1
43
34
44
35
diff view generated by jsdifflib
1
The TMP105 datasheet says that in Interrupt Mode (when TM==1) the device
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
signals an alert when the temperature equals or exceeds the T_high value and
3
then remains high until a device register is read or the device responds to
4
the SMBUS Alert Response address, or the device is put into Shutdown Mode.
5
Thereafter the Alert pin will only be re-signalled when temperature falls
6
below T_low; alert can then be cleared in the same set of ways, and the
7
device returns to its initial "alert when temperature goes above T_high"
8
mode. (If this textual description is confusing, see figure 3 in the
9
TI datasheet at https://www.ti.com/lit/gpn/tmp105 .)
10
2
11
We were misimplementing this as a simple "always alert if temperature is
3
When the block is disabled, all registers are reset with the
12
above T_high or below T_low" condition, which gives a spurious alert on
4
exception of the ECSPI_CONREG. It is initialized to zero
13
startup if using the "T_high = 80 degrees C, T_low = 75 degrees C" reset
5
when the instance is created.
14
limit values.
15
6
16
Implement the correct (hysteresis) behaviour by tracking whether we
7
Ref: i.MX 6DQ Applications Processor Reference Manual (IMX6DQRM),
17
are currently looking for the temperature to rise over T_high or
8
chapter 21.7.3: Control Register (ECSPIx_CONREG)
18
for it to fall below T_low. Our implementation of the comparator
19
mode (TM==0) wasn't wrong, but rephrase it to match the way that
20
interrupt mode is now handled for clarity.
21
9
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Signed-off-by: Bin Meng <bin.meng@windriver.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20210129132323.30946-5-bmeng.cn@gmail.com
14
[bmeng: add a 'common_reset' function that does most of reset operation]
15
Signed-off-by: Bin Meng <bin.meng@windriver.com>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Reviewed-by: Cédric Le Goater <clg@kaod.org>
24
Message-id: 20201110150023.25533-3-peter.maydell@linaro.org
25
---
17
---
26
hw/misc/tmp105.h | 7 +++++
18
hw/ssi/imx_spi.c | 32 ++++++++++++++++++++++++--------
27
hw/misc/tmp105.c | 70 +++++++++++++++++++++++++++++++++++++++++-------
19
1 file changed, 24 insertions(+), 8 deletions(-)
28
2 files changed, 68 insertions(+), 9 deletions(-)
29
20
30
diff --git a/hw/misc/tmp105.h b/hw/misc/tmp105.h
21
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
31
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/misc/tmp105.h
23
--- a/hw/ssi/imx_spi.c
33
+++ b/hw/misc/tmp105.h
24
+++ b/hw/ssi/imx_spi.c
34
@@ -XXX,XX +XXX,XX @@ struct TMP105State {
25
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
35
int16_t limit[2];
26
fifo32_num_used(&s->tx_fifo), fifo32_num_used(&s->rx_fifo));
36
int faults;
27
}
37
uint8_t alarm;
28
38
+ /*
29
-static void imx_spi_reset(DeviceState *dev)
39
+ * The TMP105 initially looks for a temperature rising above T_high;
30
+static void imx_spi_common_reset(IMXSPIState *s)
40
+ * once this is detected, the condition it looks for next is the
31
{
41
+ * temperature falling below T_low. This flag is false when initially
32
- IMXSPIState *s = IMX_SPI(dev);
42
+ * looking for T_high, true when looking for T_low.
33
+ int i;
43
+ */
34
44
+ bool detect_falling;
35
- DPRINTF("\n");
45
};
36
-
46
37
- memset(s->regs, 0, sizeof(s->regs));
47
#endif
38
-
48
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
39
- s->regs[ECSPI_STATREG] = 0x00000003;
49
index XXXXXXX..XXXXXXX 100644
40
+ for (i = 0; i < ARRAY_SIZE(s->regs); i++) {
50
--- a/hw/misc/tmp105.c
41
+ switch (i) {
51
+++ b/hw/misc/tmp105.c
42
+ case ECSPI_CONREG:
52
@@ -XXX,XX +XXX,XX @@ static void tmp105_alarm_update(TMP105State *s)
43
+ /* CONREG is not updated on soft reset */
53
return;
44
+ break;
54
}
45
+ case ECSPI_STATREG:
55
46
+ s->regs[i] = 0x00000003;
56
- if ((s->config >> 1) & 1) {                    /* TM */
47
+ break;
57
- if (s->temperature >= s->limit[1])
48
+ default:
58
- s->alarm = 1;
49
+ s->regs[i] = 0;
59
- else if (s->temperature < s->limit[0])
50
+ break;
60
- s->alarm = 1;
61
+ if (s->config >> 1 & 1) {
62
+ /*
63
+ * TM == 1 : Interrupt mode. We signal Alert when the
64
+ * temperature rises above T_high, and expect the guest to clear
65
+ * it (eg by reading a device register).
66
+ */
67
+ if (s->detect_falling) {
68
+ if (s->temperature < s->limit[0]) {
69
+ s->alarm = 1;
70
+ s->detect_falling = false;
71
+ }
72
+ } else {
73
+ if (s->temperature >= s->limit[1]) {
74
+ s->alarm = 1;
75
+ s->detect_falling = true;
76
+ }
77
+ }
51
+ }
78
} else {
52
+ }
79
- if (s->temperature >= s->limit[1])
53
80
- s->alarm = 1;
54
imx_spi_rxfifo_reset(s);
81
- else if (s->temperature < s->limit[0])
55
imx_spi_txfifo_reset(s);
82
- s->alarm = 0;
56
@@ -XXX,XX +XXX,XX @@ static void imx_spi_reset(DeviceState *dev)
83
+ /*
57
84
+ * TM == 0 : Comparator mode. We signal Alert when the temperature
58
static void imx_spi_soft_reset(IMXSPIState *s)
85
+ * rises above T_high, and stop signalling it when the temperature
59
{
86
+ * falls below T_low.
60
- imx_spi_reset(DEVICE(s));
87
+ */
61
+ imx_spi_common_reset(s);
88
+ if (s->detect_falling) {
62
89
+ if (s->temperature < s->limit[0]) {
63
imx_spi_update_irq(s);
90
+ s->alarm = 0;
91
+ s->detect_falling = false;
92
+ }
93
+ } else {
94
+ if (s->temperature >= s->limit[1]) {
95
+ s->alarm = 1;
96
+ s->detect_falling = true;
97
+ }
98
+ }
99
}
100
101
tmp105_interrupt_update(s);
102
@@ -XXX,XX +XXX,XX @@ static int tmp105_post_load(void *opaque, int version_id)
103
return 0;
104
}
64
}
105
65
106
+static bool detect_falling_needed(void *opaque)
66
+static void imx_spi_reset(DeviceState *dev)
107
+{
67
+{
108
+ TMP105State *s = opaque;
68
+ IMXSPIState *s = IMX_SPI(dev);
109
+
69
+
110
+ /*
70
+ imx_spi_common_reset(s);
111
+ * We only need to migrate the detect_falling bool if it's set;
71
+ s->regs[ECSPI_CONREG] = 0;
112
+ * for migration from older machines we assume that it is false
113
+ * (ie temperature is not out of range).
114
+ */
115
+ return s->detect_falling;
116
+}
72
+}
117
+
73
+
118
+static const VMStateDescription vmstate_tmp105_detect_falling = {
74
static uint64_t imx_spi_read(void *opaque, hwaddr offset, unsigned size)
119
+ .name = "TMP105/detect-falling",
75
{
120
+ .version_id = 1,
76
uint32_t value = 0;
121
+ .minimum_version_id = 1,
122
+ .needed = detect_falling_needed,
123
+ .fields = (VMStateField[]) {
124
+ VMSTATE_BOOL(detect_falling, TMP105State),
125
+ VMSTATE_END_OF_LIST()
126
+ }
127
+};
128
+
129
static const VMStateDescription vmstate_tmp105 = {
130
.name = "TMP105",
131
.version_id = 0,
132
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_tmp105 = {
133
VMSTATE_UINT8(alarm, TMP105State),
134
VMSTATE_I2C_SLAVE(i2c, TMP105State),
135
VMSTATE_END_OF_LIST()
136
+ },
137
+ .subsections = (const VMStateDescription*[]) {
138
+ &vmstate_tmp105_detect_falling,
139
+ NULL
140
}
141
};
142
143
@@ -XXX,XX +XXX,XX @@ static void tmp105_reset(I2CSlave *i2c)
144
s->config = 0;
145
s->faults = tmp105_faultq[(s->config >> 3) & 3];
146
s->alarm = 0;
147
+ s->detect_falling = false;
148
149
s->limit[0] = 0x4b00; /* T_LOW, 75 degrees C */
150
s->limit[1] = 0x5000; /* T_HIGH, 80 degrees C */
151
--
77
--
152
2.20.1
78
2.20.1
153
79
154
80
diff view generated by jsdifflib
1
The TMP105 datasheet (https://www.ti.com/lit/gpn/tmp105) says that the
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
power-up reset values for the T_low and T_high registers are 80 degrees C
3
and 75 degrees C, which are 0x500 and 0x4B0 hex according to table 5. These
4
values are then shifted right by four bits to give the register reset
5
values, since both registers store the 12 bits of temperature data in bits
6
[15..4] of a 16 bit register.
7
2
8
We were resetting these registers to zero, which is problematic for Linux
3
When the block is disabled, it stay it is 'internal reset logic'
9
guests which enable the alert interrupt and then immediately take an
4
(internal clocks are gated off). Reading any register returns
10
unexpected overtemperature alert because the current temperature is above
5
its reset value. Only update this value if the device is enabled.
11
freezing...
12
6
7
Ref: i.MX 6DQ Applications Processor Reference Manual (IMX6DQRM),
8
chapter 21.7.3: Control Register (ECSPIx_CONREG)
9
10
Reviewed-by: Juan Quintela <quintela@redhat.com>
11
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Bin Meng <bin.meng@windriver.com>
13
Signed-off-by: Bin Meng <bin.meng@windriver.com>
14
Message-id: 20210129132323.30946-6-bmeng.cn@gmail.com
15
Message-Id: <20210115153049.3353008-5-f4bug@amsat.org>
16
Reviewed-by: Bin Meng <bin.meng@windriver.com>
17
Signed-off-by: Bin Meng <bin.meng@windriver.com>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
15
Message-id: 20201110150023.25533-2-peter.maydell@linaro.org
16
---
19
---
17
hw/misc/tmp105.c | 3 +++
20
hw/ssi/imx_spi.c | 60 +++++++++++++++++++++++-------------------------
18
1 file changed, 3 insertions(+)
21
1 file changed, 29 insertions(+), 31 deletions(-)
19
22
20
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
23
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
21
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/misc/tmp105.c
25
--- a/hw/ssi/imx_spi.c
23
+++ b/hw/misc/tmp105.c
26
+++ b/hw/ssi/imx_spi.c
24
@@ -XXX,XX +XXX,XX @@ static void tmp105_reset(I2CSlave *i2c)
27
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_spi_read(void *opaque, hwaddr offset, unsigned size)
25
s->faults = tmp105_faultq[(s->config >> 3) & 3];
28
return 0;
26
s->alarm = 0;
29
}
27
30
28
+ s->limit[0] = 0x4b00; /* T_LOW, 75 degrees C */
31
- switch (index) {
29
+ s->limit[1] = 0x5000; /* T_HIGH, 80 degrees C */
32
- case ECSPI_RXDATA:
33
- if (!imx_spi_is_enabled(s)) {
34
- value = 0;
35
- } else if (fifo32_is_empty(&s->rx_fifo)) {
36
- /* value is undefined */
37
- value = 0xdeadbeef;
38
- } else {
39
- /* read from the RX FIFO */
40
- value = fifo32_pop(&s->rx_fifo);
41
+ value = s->regs[index];
30
+
42
+
31
tmp105_interrupt_update(s);
43
+ if (imx_spi_is_enabled(s)) {
44
+ switch (index) {
45
+ case ECSPI_RXDATA:
46
+ if (fifo32_is_empty(&s->rx_fifo)) {
47
+ /* value is undefined */
48
+ value = 0xdeadbeef;
49
+ } else {
50
+ /* read from the RX FIFO */
51
+ value = fifo32_pop(&s->rx_fifo);
52
+ }
53
+ break;
54
+ case ECSPI_TXDATA:
55
+ qemu_log_mask(LOG_GUEST_ERROR,
56
+ "[%s]%s: Trying to read from TX FIFO\n",
57
+ TYPE_IMX_SPI, __func__);
58
+
59
+ /* Reading from TXDATA gives 0 */
60
+ break;
61
+ case ECSPI_MSGDATA:
62
+ qemu_log_mask(LOG_GUEST_ERROR,
63
+ "[%s]%s: Trying to read from MSG FIFO\n",
64
+ TYPE_IMX_SPI, __func__);
65
+ /* Reading from MSGDATA gives 0 */
66
+ break;
67
+ default:
68
+ break;
69
}
70
71
- break;
72
- case ECSPI_TXDATA:
73
- qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Trying to read from TX FIFO\n",
74
- TYPE_IMX_SPI, __func__);
75
-
76
- /* Reading from TXDATA gives 0 */
77
-
78
- break;
79
- case ECSPI_MSGDATA:
80
- qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Trying to read from MSG FIFO\n",
81
- TYPE_IMX_SPI, __func__);
82
-
83
- /* Reading from MSGDATA gives 0 */
84
-
85
- break;
86
- default:
87
- value = s->regs[index];
88
- break;
89
+ imx_spi_update_irq(s);
90
}
91
-
92
DPRINTF("reg[%s] => 0x%" PRIx32 "\n", imx_spi_reg_name(index), value);
93
94
- imx_spi_update_irq(s);
95
-
96
return (uint64_t)value;
32
}
97
}
33
98
34
--
99
--
35
2.20.1
100
2.20.1
36
101
37
102
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
When the block is disabled, only the ECSPI_CONREG register can
4
be modified. Setting the EN bit enabled the device, clearing it
5
"disables the block and resets the internal logic with the
6
exception of the ECSPI_CONREG" register.
7
8
Ignore all other registers write except ECSPI_CONREG when the
9
block is disabled.
10
11
Ref: i.MX 6DQ Applications Processor Reference Manual (IMX6DQRM),
12
chapter 21.7.3: Control Register (ECSPIx_CONREG)
13
14
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Signed-off-by: Bin Meng <bin.meng@windriver.com>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Message-id: 20210129132323.30946-7-bmeng.cn@gmail.com
18
Message-Id: <20210115153049.3353008-6-f4bug@amsat.org>
19
Signed-off-by: Bin Meng <bin.meng@windriver.com>
20
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
23
hw/ssi/imx_spi.c | 13 +++++++++----
24
1 file changed, 9 insertions(+), 4 deletions(-)
25
26
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/ssi/imx_spi.c
29
+++ b/hw/ssi/imx_spi.c
30
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
31
DPRINTF("reg[%s] <= 0x%" PRIx32 "\n", imx_spi_reg_name(index),
32
(uint32_t)value);
33
34
+ if (!imx_spi_is_enabled(s)) {
35
+ /* Block is disabled */
36
+ if (index != ECSPI_CONREG) {
37
+ /* Ignore access */
38
+ return;
39
+ }
40
+ }
41
+
42
change_mask = s->regs[index] ^ value;
43
44
switch (index) {
45
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
46
TYPE_IMX_SPI, __func__);
47
break;
48
case ECSPI_TXDATA:
49
- if (!imx_spi_is_enabled(s)) {
50
- /* Ignore writes if device is disabled */
51
- break;
52
- } else if (fifo32_is_full(&s->tx_fifo)) {
53
+ if (fifo32_is_full(&s->tx_fifo)) {
54
/* Ignore writes if queue is full */
55
break;
56
}
57
--
58
2.20.1
59
60
diff view generated by jsdifflib
New patch
1
From: Xuzhou Cheng <xuzhou.cheng@windriver.com>
1
2
3
When a write to ECSPI_CONREG register to disable the SPI controller,
4
imx_spi_soft_reset() is called to reset the controller, but chip
5
select lines should have been disabled, otherwise the state machine
6
of any devices (e.g.: SPI flashes) connected to the SPI master is
7
stuck to its last state and responds incorrectly to any follow-up
8
commands.
9
10
Fixes: c906a3a01582 ("i.MX: Add the Freescale SPI Controller")
11
Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com>
12
Signed-off-by: Bin Meng <bin.meng@windriver.com>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20210129132323.30946-8-bmeng.cn@gmail.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/ssi/imx_spi.c | 6 ++++++
18
1 file changed, 6 insertions(+)
19
20
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/ssi/imx_spi.c
23
+++ b/hw/ssi/imx_spi.c
24
@@ -XXX,XX +XXX,XX @@ static void imx_spi_common_reset(IMXSPIState *s)
25
26
static void imx_spi_soft_reset(IMXSPIState *s)
27
{
28
+ int i;
29
+
30
imx_spi_common_reset(s);
31
32
imx_spi_update_irq(s);
33
+
34
+ for (i = 0; i < ECSPI_NUM_CS; i++) {
35
+ qemu_set_irq(s->cs_lines[i], 1);
36
+ }
37
}
38
39
static void imx_spi_reset(DeviceState *dev)
40
--
41
2.20.1
42
43
diff view generated by jsdifflib
New patch
1
From: Bin Meng <bin.meng@windriver.com>
1
2
3
Current implementation of the imx spi controller expects the burst
4
length to be multiple of 8, which is the most common use case.
5
6
In case the burst length is not what we expect, log it to give user
7
a chance to notice it, and round it up to be multiple of 8.
8
9
Signed-off-by: Bin Meng <bin.meng@windriver.com>
10
Message-id: 20210129132323.30946-9-bmeng.cn@gmail.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/ssi/imx_spi.c | 17 ++++++++++++++++-
15
1 file changed, 16 insertions(+), 1 deletion(-)
16
17
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/ssi/imx_spi.c
20
+++ b/hw/ssi/imx_spi.c
21
@@ -XXX,XX +XXX,XX @@ static uint8_t imx_spi_selected_channel(IMXSPIState *s)
22
23
static uint32_t imx_spi_burst_length(IMXSPIState *s)
24
{
25
- return EXTRACT(s->regs[ECSPI_CONREG], ECSPI_CONREG_BURST_LENGTH) + 1;
26
+ uint32_t burst;
27
+
28
+ burst = EXTRACT(s->regs[ECSPI_CONREG], ECSPI_CONREG_BURST_LENGTH) + 1;
29
+ if (burst % 8) {
30
+ burst = ROUND_UP(burst, 8);
31
+ }
32
+
33
+ return burst;
34
}
35
36
static bool imx_spi_is_enabled(IMXSPIState *s)
37
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
38
IMXSPIState *s = opaque;
39
uint32_t index = offset >> 2;
40
uint32_t change_mask;
41
+ uint32_t burst;
42
43
if (index >= ECSPI_MAX) {
44
qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad register at offset 0x%"
45
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
46
case ECSPI_CONREG:
47
s->regs[ECSPI_CONREG] = value;
48
49
+ burst = EXTRACT(s->regs[ECSPI_CONREG], ECSPI_CONREG_BURST_LENGTH) + 1;
50
+ if (burst % 8) {
51
+ qemu_log_mask(LOG_UNIMP,
52
+ "[%s]%s: burst length %d not supported: rounding up to next multiple of 8\n",
53
+ TYPE_IMX_SPI, __func__, burst);
54
+ }
55
+
56
if (!imx_spi_is_enabled(s)) {
57
/* device is disabled, so this is a soft reset */
58
imx_spi_soft_reset(s);
59
--
60
2.20.1
61
62
diff view generated by jsdifflib
New patch
1
From: Bin Meng <bin.meng@windriver.com>
1
2
3
For the ECSPIx_CONREG register BURST_LENGTH field, the manual says:
4
5
0x020 A SPI burst contains the 1 LSB in first word and all 32 bits in second word.
6
0x021 A SPI burst contains the 2 LSB in first word and all 32 bits in second word.
7
8
Current logic uses either s->burst_length or 32, whichever smaller,
9
to determine how many bits it should read from the tx fifo each time.
10
For example, for a 48 bit burst length, current logic transfers the
11
first 32 bit from the first word in the tx fifo, followed by a 16
12
bit from the second word in the tx fifo, which is wrong. The correct
13
logic should be: transfer the first 16 bit from the first word in
14
the tx fifo, followed by a 32 bit from the second word in the tx fifo.
15
16
With this change, SPI flash can be successfully probed by U-Boot on
17
imx6 sabrelite board.
18
19
=> sf probe
20
SF: Detected sst25vf016b with page size 256 Bytes, erase size 4 KiB, total 2 MiB
21
22
Fixes: c906a3a01582 ("i.MX: Add the Freescale SPI Controller")
23
Signed-off-by: Bin Meng <bin.meng@windriver.com>
24
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
25
Message-id: 20210129132323.30946-10-bmeng.cn@gmail.com
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
---
28
hw/ssi/imx_spi.c | 2 +-
29
1 file changed, 1 insertion(+), 1 deletion(-)
30
31
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/ssi/imx_spi.c
34
+++ b/hw/ssi/imx_spi.c
35
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
36
37
DPRINTF("data tx:0x%08x\n", tx);
38
39
- tx_burst = MIN(s->burst_length, 32);
40
+ tx_burst = (s->burst_length % 32) ? : 32;
41
42
rx = 0;
43
44
--
45
2.20.1
46
47
diff view generated by jsdifflib
New patch
1
From: Bin Meng <bin.meng@windriver.com>
1
2
3
The endianness of data exchange between tx and rx fifo is incorrect.
4
Earlier bytes are supposed to show up on MSB and later bytes on LSB,
5
ie: in big endian. The manual does not explicitly say this, but the
6
U-Boot and Linux driver codes have a swap on the data transferred
7
to tx fifo and from rx fifo.
8
9
With this change, U-Boot read from / write to SPI flash tests pass.
10
11
=> sf test 1ff000 1000
12
SPI flash test:
13
0 erase: 0 ticks, 4096000 KiB/s 32768.000 Mbps
14
1 check: 3 ticks, 1333 KiB/s 10.664 Mbps
15
2 write: 235 ticks, 17 KiB/s 0.136 Mbps
16
3 read: 2 ticks, 2000 KiB/s 16.000 Mbps
17
Test passed
18
0 erase: 0 ticks, 4096000 KiB/s 32768.000 Mbps
19
1 check: 3 ticks, 1333 KiB/s 10.664 Mbps
20
2 write: 235 ticks, 17 KiB/s 0.136 Mbps
21
3 read: 2 ticks, 2000 KiB/s 16.000 Mbps
22
23
Fixes: c906a3a01582 ("i.MX: Add the Freescale SPI Controller")
24
Signed-off-by: Bin Meng <bin.meng@windriver.com>
25
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
26
Message-id: 20210129132323.30946-11-bmeng.cn@gmail.com
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
---
29
hw/ssi/imx_spi.c | 7 ++-----
30
1 file changed, 2 insertions(+), 5 deletions(-)
31
32
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/ssi/imx_spi.c
35
+++ b/hw/ssi/imx_spi.c
36
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
37
38
while (!fifo32_is_empty(&s->tx_fifo)) {
39
int tx_burst = 0;
40
- int index = 0;
41
42
if (s->burst_length <= 0) {
43
s->burst_length = imx_spi_burst_length(s);
44
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
45
rx = 0;
46
47
while (tx_burst > 0) {
48
- uint8_t byte = tx & 0xff;
49
+ uint8_t byte = tx >> (tx_burst - 8);
50
51
DPRINTF("writing 0x%02x\n", (uint32_t)byte);
52
53
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
54
55
DPRINTF("0x%02x read\n", (uint32_t)byte);
56
57
- tx = tx >> 8;
58
- rx |= (byte << (index * 8));
59
+ rx = (rx << 8) | byte;
60
61
/* Remove 8 bits from the actual burst */
62
tx_burst -= 8;
63
s->burst_length -= 8;
64
- index++;
65
}
66
67
DPRINTF("data rx:0x%08x\n", rx);
68
--
69
2.20.1
70
71
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
Per the ARM Generic Interrupt Controller Architecture specification
4
(document "ARM IHI 0048B.b (ID072613)"), the SGIINTID field is 4 bit,
5
not 10:
6
7
- 4.3 Distributor register descriptions
8
- 4.3.15 Software Generated Interrupt Register, GICD_SG
9
10
- Table 4-21 GICD_SGIR bit assignments
11
12
The Interrupt ID of the SGI to forward to the specified CPU
13
interfaces. The value of this field is the Interrupt ID, in
14
the range 0-15, for example a value of 0b0011 specifies
15
Interrupt ID 3.
16
17
Correct the irq mask to fix an undefined behavior (which eventually
18
lead to a heap-buffer-overflow, see [Buglink]):
19
20
$ echo 'writel 0x8000f00 0xff4affb0' | qemu-system-aarch64 -M virt,accel=qtest -qtest stdio
21
[I 1612088147.116987] OPENED
22
[R +0.278293] writel 0x8000f00 0xff4affb0
23
../hw/intc/arm_gic.c:1498:13: runtime error: index 944 out of bounds for type 'uint8_t [16][8]'
24
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior ../hw/intc/arm_gic.c:1498:13
25
26
This fixes a security issue when running with KVM on Arm with
27
kernel-irqchip=off. (The default is kernel-irqchip=on, which is
28
unaffected, and which is also the correct choice for performance.)
29
30
Cc: qemu-stable@nongnu.org
31
Fixes: 9ee6e8bb853 ("ARMv7 support.")
32
Buglink: https://bugs.launchpad.net/qemu/+bug/1913916
33
Buglink: https://bugs.launchpad.net/qemu/+bug/1913917
34
Reported-by: Alexander Bulekov <alxndr@bu.edu>
35
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
36
Message-id: 20210131103401.217160-1-f4bug@amsat.org
37
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
38
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
39
---
40
hw/intc/arm_gic.c | 2 +-
41
1 file changed, 1 insertion(+), 1 deletion(-)
42
43
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/intc/arm_gic.c
46
+++ b/hw/intc/arm_gic.c
47
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writel(void *opaque, hwaddr offset,
48
int target_cpu;
49
50
cpu = gic_get_current_cpu(s);
51
- irq = value & 0x3ff;
52
+ irq = value & 0xf;
53
switch ((value >> 24) & 3) {
54
case 0:
55
mask = (value >> 16) & ALL_CPU_MASK;
56
--
57
2.20.1
58
59
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
The STM32F405 SoC uses an OR gate on its ADC IRQs.
4
5
Fixes: 529fc5fd3e1 ("hw/arm: Add the STM32F4xx SoC")
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210131184449.382425-2-f4bug@amsat.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/Kconfig | 1 +
12
1 file changed, 1 insertion(+)
13
14
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/Kconfig
17
+++ b/hw/arm/Kconfig
18
@@ -XXX,XX +XXX,XX @@ config STM32F205_SOC
19
config STM32F405_SOC
20
bool
21
select ARM_V7M
22
+ select OR_IRQ
23
select STM32F4XX_SYSCFG
24
select STM32F4XX_EXTI
25
26
--
27
2.20.1
28
29
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@wdc.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
This patch fixes CID 1432800 by removing an unnecessary check.
3
The Exynos4210 SoC uses an OR gate on the PL330 IRQ lines.
4
4
5
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5
Fixes: dab15fbe2ab ("hw/arm/exynos4210: Fix DMA initialization")
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20210131184449.382425-3-f4bug@amsat.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
10
---
9
hw/core/register.c | 4 ----
11
hw/arm/Kconfig | 1 +
10
1 file changed, 4 deletions(-)
12
1 file changed, 1 insertion(+)
11
13
12
diff --git a/hw/core/register.c b/hw/core/register.c
14
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/core/register.c
16
--- a/hw/arm/Kconfig
15
+++ b/hw/core/register.c
17
+++ b/hw/arm/Kconfig
16
@@ -XXX,XX +XXX,XX @@ static RegisterInfoArray *register_init_block(DeviceState *owner,
18
@@ -XXX,XX +XXX,XX @@ config EXYNOS4
17
int index = rae[i].addr / data_size;
19
select PTIMER
18
RegisterInfo *r = &ri[index];
20
select SDHCI
19
21
select USB_EHCI_SYSBUS
20
- if (data + data_size * index == 0 || !&rae[i]) {
22
+ select OR_IRQ
21
- continue;
23
22
- }
24
config HIGHBANK
23
-
25
bool
24
/* Init the register, this will zero it. */
25
object_initialize((void *)r, sizeof(*r), TYPE_REGISTER);
26
27
--
26
--
28
2.20.1
27
2.20.1
29
28
30
29
diff view generated by jsdifflib
1
In commit 76346b6264a9b01979 we tried to add a configure check that
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
the libgio pkg-config data was correct, which builds an executable
3
linked against it. Unfortunately this doesn't catch the problem
4
(missing static library dependency info), because a "do nothing" test
5
source file doesn't have any symbol references that cause the linker
6
to pull in .o files from libgio.a, and so we don't see the "missing
7
symbols from libmount" error that a full QEMU link triggers.
8
2
9
(The ineffective test went unnoticed because of a typo that
3
The Versal SoC instantiates the TYPE_XLNX_ZDMA object in
10
effectively disabled libgio unconditionally, but after commit
4
versal_create_admas(). Introduce the XLNX_ZDMA configuration
11
3569a5dfc11f2 fixed that, a static link of the system emulator on
5
and select it to fix:
12
Ubuntu stopped working again.)
13
6
14
Improve the gio test by having the test source fragment reference a
7
$ qemu-system-aarch64 -M xlnx-versal-virt ...
15
g_dbus function (which is what is indirectly causing us to end up
8
qemu-system-aarch64: missing object type 'xlnx.zdma'
16
wanting functions from libmount).
17
9
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-id: 20210131184449.382425-4-f4bug@amsat.org
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
20
Message-id: 20201116104617.18333-1-peter.maydell@linaro.org
21
---
14
---
22
configure | 11 +++++++++--
15
hw/arm/Kconfig | 2 ++
23
1 file changed, 9 insertions(+), 2 deletions(-)
16
hw/dma/Kconfig | 3 +++
17
hw/dma/meson.build | 2 +-
18
3 files changed, 6 insertions(+), 1 deletion(-)
24
19
25
diff --git a/configure b/configure
20
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
26
index XXXXXXX..XXXXXXX 100755
21
index XXXXXXX..XXXXXXX 100644
27
--- a/configure
22
--- a/hw/arm/Kconfig
28
+++ b/configure
23
+++ b/hw/arm/Kconfig
29
@@ -XXX,XX +XXX,XX @@ if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
24
@@ -XXX,XX +XXX,XX @@ config XLNX_ZYNQMP_ARM
30
# Check that the libraries actually work -- Ubuntu 18.04 ships
25
select XILINX_AXI
31
# with pkg-config --static --libs data for gio-2.0 that is missing
26
select XILINX_SPIPS
32
# -lblkid and will give a link error.
27
select XLNX_ZYNQMP
33
- write_c_skeleton
28
+ select XLNX_ZDMA
34
- if compile_prog "" "$gio_libs" ; then
29
35
+ cat > $TMPC <<EOF
30
config XLNX_VERSAL
36
+#include <gio/gio.h>
31
bool
37
+int main(void)
32
@@ -XXX,XX +XXX,XX @@ config XLNX_VERSAL
38
+{
33
select CADENCE
39
+ g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
34
select VIRTIO_MMIO
40
+ return 0;
35
select UNIMP
41
+}
36
+ select XLNX_ZDMA
42
+EOF
37
43
+ if compile_prog "$gio_cflags" "$gio_libs" ; then
38
config NPCM7XX
44
gio=yes
39
bool
45
else
40
diff --git a/hw/dma/Kconfig b/hw/dma/Kconfig
46
gio=no
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/dma/Kconfig
43
+++ b/hw/dma/Kconfig
44
@@ -XXX,XX +XXX,XX @@ config ZYNQ_DEVCFG
45
bool
46
select REGISTER
47
48
+config XLNX_ZDMA
49
+ bool
50
+
51
config STP2000
52
bool
53
54
diff --git a/hw/dma/meson.build b/hw/dma/meson.build
55
index XXXXXXX..XXXXXXX 100644
56
--- a/hw/dma/meson.build
57
+++ b/hw/dma/meson.build
58
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ZYNQ_DEVCFG', if_true: files('xlnx-zynq-devcfg.c'))
59
softmmu_ss.add(when: 'CONFIG_ETRAXFS', if_true: files('etraxfs_dma.c'))
60
softmmu_ss.add(when: 'CONFIG_STP2000', if_true: files('sparc32_dma.c'))
61
softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx_dpdma.c'))
62
-softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zdma.c'))
63
+softmmu_ss.add(when: 'CONFIG_XLNX_ZDMA', if_true: files('xlnx-zdma.c'))
64
softmmu_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_dma.c', 'soc_dma.c'))
65
softmmu_ss.add(when: 'CONFIG_PXA2XX', if_true: files('pxa2xx_dma.c'))
66
softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_dma.c'))
47
--
67
--
48
2.20.1
68
2.20.1
49
69
50
70
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
The removal of the selection of A15MPCORE from ARM_VIRT also
3
The Versal SoC instantiates the TYPE_XLNX_ZYNQMP_RTC object in
4
removed what A15MPCORE selects, ARM_GIC. We still need ARM_GIC.
4
versal_create_rtc()(). Select CONFIG_XLNX_ZYNQMP to fix:
5
5
6
Fixes: bec3c97e0cf9 ("hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals")
6
$ make check-qtest-aarch64
7
Reported-by: Miroslav Rezanina <mrezanin@redhat.com>
7
...
8
Signed-off-by: Andrew Jones <drjones@redhat.com>
8
Running test qtest-aarch64/qom-test
9
Reviewed-by: Miroslav Rezanina <mrezanin@redhat.com>
9
qemu-system-aarch64: missing object type 'xlnx-zynmp.rtc'
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Broken pipe
11
Message-id: 20201111143440.112763-1-drjones@redhat.com
11
12
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Message-id: 20210131184449.382425-5-f4bug@amsat.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
16
---
14
hw/arm/Kconfig | 1 +
17
hw/arm/Kconfig | 1 +
15
1 file changed, 1 insertion(+)
18
1 file changed, 1 insertion(+)
16
19
17
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
20
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
18
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/Kconfig
22
--- a/hw/arm/Kconfig
20
+++ b/hw/arm/Kconfig
23
+++ b/hw/arm/Kconfig
21
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
24
@@ -XXX,XX +XXX,XX @@ config XLNX_VERSAL
22
imply VFIO_PLATFORM
25
select VIRTIO_MMIO
23
imply VFIO_XGMAC
26
select UNIMP
24
imply TPM_TIS_SYSBUS
27
select XLNX_ZDMA
25
+ select ARM_GIC
28
+ select XLNX_ZYNQMP
26
select ACPI
29
27
select ARM_SMMUV3
30
config NPCM7XX
28
select GPIO_KEY
31
bool
29
--
32
--
30
2.20.1
33
2.20.1
31
34
32
35
diff view generated by jsdifflib
1
In the mtspr helper we attempt to check for "is the timer disabled"
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
with "if (env->ttmr & TIMER_NONE)". This is wrong because TIMER_NONE
3
is zero and the condition is always false (Coverity complains about
4
the dead code.)
5
2
6
The correct check would be to test whether the TTMR_M field in the
3
Add a dependency XLNX_ZYNQMP -> PTIMER to fix:
7
register is equal to TIMER_NONE instead. However, the
8
cpu_openrisc_timer_update() function checks whether the timer is
9
enabled (it looks at cpu->env.is_counting, which is set to 0 via
10
cpu_openrisc_count_stop() when the TTMR_M field is set to
11
TIMER_NONE), so there's no need to check for "timer disabled" in the
12
target/openrisc code. Instead, simply remove the dead code.
13
4
14
Fixes: Coverity CID 1005812
5
/usr/bin/ld:
6
libcommon.fa.p/hw_net_can_xlnx-zynqmp-can.c.o: in function `xlnx_zynqmp_can_realize':
7
hw/net/can/xlnx-zynqmp-can.c:1082: undefined reference to `ptimer_init'
8
hw/net/can/xlnx-zynqmp-can.c:1085: undefined reference to `ptimer_transaction_begin'
9
hw/net/can/xlnx-zynqmp-can.c:1087: undefined reference to `ptimer_set_freq'
10
hw/net/can/xlnx-zynqmp-can.c:1088: undefined reference to `ptimer_set_limit'
11
hw/net/can/xlnx-zynqmp-can.c:1089: undefined reference to `ptimer_run'
12
hw/net/can/xlnx-zynqmp-can.c:1090: undefined reference to `ptimer_transaction_commit'
13
libcommon.fa.p/hw_net_can_xlnx-zynqmp-can.c.o:(.data.rel+0x2c8): undefined reference to `vmstate_ptimer'
14
15
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
17
Message-id: 20210131184449.382425-6-f4bug@amsat.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Acked-by: Stafford Horne <shorne@gmail.com>
17
Message-id: 20201103114654.18540-1-peter.maydell@linaro.org
18
---
19
---
19
target/openrisc/sys_helper.c | 3 ---
20
hw/Kconfig | 1 +
20
1 file changed, 3 deletions(-)
21
1 file changed, 1 insertion(+)
21
22
22
diff --git a/target/openrisc/sys_helper.c b/target/openrisc/sys_helper.c
23
diff --git a/hw/Kconfig b/hw/Kconfig
23
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
24
--- a/target/openrisc/sys_helper.c
25
--- a/hw/Kconfig
25
+++ b/target/openrisc/sys_helper.c
26
+++ b/hw/Kconfig
26
@@ -XXX,XX +XXX,XX @@ void HELPER(mtspr)(CPUOpenRISCState *env, target_ulong spr, target_ulong rb)
27
@@ -XXX,XX +XXX,XX @@ config XLNX_ZYNQMP
27
28
bool
28
case TO_SPR(10, 1): /* TTCR */
29
select REGISTER
29
cpu_openrisc_count_set(cpu, rb);
30
select CAN_BUS
30
- if (env->ttmr & TIMER_NONE) {
31
+ select PTIMER
31
- return;
32
- }
33
cpu_openrisc_timer_update(cpu);
34
break;
35
#endif
36
--
32
--
37
2.20.1
33
2.20.1
38
34
39
35
diff view generated by jsdifflib
1
From: Alex Chen <alex.chen@huawei.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
We should use printf format specifier "%u" instead of "%d" for
3
Most of ARM machines display their CPU when QEMU list the available
4
argument of type "unsigned int".
4
machines (-M help). Some machines do not. Fix to unify the help
5
output.
5
6
6
Reported-by: Euler Robot <euler.robot@huawei.com>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Alex Chen <alex.chen@huawei.com>
8
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Message-id: 20201111073651.72804-1-alex.chen@huawei.com
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20210131184449.382425-7-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
13
---
12
hw/timer/exynos4210_mct.c | 4 ++--
14
hw/arm/digic_boards.c | 2 +-
13
hw/timer/exynos4210_pwm.c | 8 ++++----
15
hw/arm/microbit.c | 2 +-
14
2 files changed, 6 insertions(+), 6 deletions(-)
16
hw/arm/netduino2.c | 2 +-
17
hw/arm/netduinoplus2.c | 2 +-
18
hw/arm/orangepi.c | 2 +-
19
hw/arm/stellaris.c | 4 ++--
20
6 files changed, 7 insertions(+), 7 deletions(-)
15
21
16
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
22
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
17
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/timer/exynos4210_mct.c
24
--- a/hw/arm/digic_boards.c
19
+++ b/hw/timer/exynos4210_mct.c
25
+++ b/hw/arm/digic_boards.c
20
@@ -XXX,XX +XXX,XX @@ static void exynos4210_gcomp_raise_irq(void *opaque, uint32_t id)
26
@@ -XXX,XX +XXX,XX @@ static void canon_a1100_init(MachineState *machine)
21
/* If CSTAT is pending and IRQ is enabled */
27
22
if ((s->reg.int_cstat & G_INT_CSTAT_COMP(id)) &&
28
static void canon_a1100_machine_init(MachineClass *mc)
23
(s->reg.int_enb & G_INT_ENABLE(id))) {
29
{
24
- DPRINTF("gcmp timer[%d] IRQ\n", id);
30
- mc->desc = "Canon PowerShot A1100 IS";
25
+ DPRINTF("gcmp timer[%u] IRQ\n", id);
31
+ mc->desc = "Canon PowerShot A1100 IS (ARM946)";
26
qemu_irq_raise(s->irq[id]);
32
mc->init = &canon_a1100_init;
27
}
33
mc->ignore_memory_transaction_failures = true;
34
mc->default_ram_size = 64 * MiB;
35
diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/hw/arm/microbit.c
38
+++ b/hw/arm/microbit.c
39
@@ -XXX,XX +XXX,XX @@ static void microbit_machine_class_init(ObjectClass *oc, void *data)
40
{
41
MachineClass *mc = MACHINE_CLASS(oc);
42
43
- mc->desc = "BBC micro:bit";
44
+ mc->desc = "BBC micro:bit (Cortex-M0)";
45
mc->init = microbit_init;
46
mc->max_cpus = 1;
28
}
47
}
29
@@ -XXX,XX +XXX,XX @@ static void exynos4210_mct_update_freq(Exynos4210MCTState *s)
48
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
30
MCT_CFG_GET_DIVIDER(s->reg_mct_cfg));
31
32
if (freq != s->freq) {
33
- DPRINTF("freq=%dHz\n", s->freq);
34
+ DPRINTF("freq=%uHz\n", s->freq);
35
36
/* global timer */
37
tx_ptimer_set_freq(s->g_timer.ptimer_frc, s->freq);
38
diff --git a/hw/timer/exynos4210_pwm.c b/hw/timer/exynos4210_pwm.c
39
index XXXXXXX..XXXXXXX 100644
49
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/timer/exynos4210_pwm.c
50
--- a/hw/arm/netduino2.c
41
+++ b/hw/timer/exynos4210_pwm.c
51
+++ b/hw/arm/netduino2.c
42
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_update_freq(Exynos4210PWMState *s, uint32_t id)
52
@@ -XXX,XX +XXX,XX @@ static void netduino2_init(MachineState *machine)
43
53
44
if (freq != s->timer[id].freq) {
54
static void netduino2_machine_init(MachineClass *mc)
45
ptimer_set_freq(s->timer[id].ptimer, s->timer[id].freq);
55
{
46
- DPRINTF("freq=%dHz\n", s->timer[id].freq);
56
- mc->desc = "Netduino 2 Machine";
47
+ DPRINTF("freq=%uHz\n", s->timer[id].freq);
57
+ mc->desc = "Netduino 2 Machine (Cortex-M3)";
48
}
58
mc->init = netduino2_init;
59
mc->ignore_memory_transaction_failures = true;
49
}
60
}
50
61
diff --git a/hw/arm/netduinoplus2.c b/hw/arm/netduinoplus2.c
51
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_tick(void *opaque)
62
index XXXXXXX..XXXXXXX 100644
52
uint32_t id = s->id;
63
--- a/hw/arm/netduinoplus2.c
53
bool cmp;
64
+++ b/hw/arm/netduinoplus2.c
54
65
@@ -XXX,XX +XXX,XX @@ static void netduinoplus2_init(MachineState *machine)
55
- DPRINTF("timer %d tick\n", id);
66
56
+ DPRINTF("timer %u tick\n", id);
67
static void netduinoplus2_machine_init(MachineClass *mc)
57
68
{
58
/* set irq status */
69
- mc->desc = "Netduino Plus 2 Machine";
59
p->reg_tint_cstat |= TINT_CSTAT_STATUS(id);
70
+ mc->desc = "Netduino Plus 2 Machine (Cortex-M4)";
60
71
mc->init = netduinoplus2_init;
61
/* raise IRQ */
72
}
62
if (p->reg_tint_cstat & TINT_CSTAT_ENABLE(id)) {
73
63
- DPRINTF("timer %d IRQ\n", id);
74
diff --git a/hw/arm/orangepi.c b/hw/arm/orangepi.c
64
+ DPRINTF("timer %u IRQ\n", id);
75
index XXXXXXX..XXXXXXX 100644
65
qemu_irq_raise(p->timer[id].irq);
76
--- a/hw/arm/orangepi.c
66
}
77
+++ b/hw/arm/orangepi.c
67
78
@@ -XXX,XX +XXX,XX @@ static void orangepi_init(MachineState *machine)
68
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_tick(void *opaque)
79
69
}
80
static void orangepi_machine_init(MachineClass *mc)
70
81
{
71
if (cmp) {
82
- mc->desc = "Orange Pi PC";
72
- DPRINTF("auto reload timer %d count to %x\n", id,
83
+ mc->desc = "Orange Pi PC (Cortex-A7)";
73
+ DPRINTF("auto reload timer %u count to %x\n", id,
84
mc->init = orangepi_init;
74
p->timer[id].reg_tcntb);
85
mc->block_default_type = IF_SD;
75
ptimer_set_count(p->timer[id].ptimer, p->timer[id].reg_tcntb);
86
mc->units_per_default_bus = 1;
76
ptimer_run(p->timer[id].ptimer, 1);
87
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
88
index XXXXXXX..XXXXXXX 100644
89
--- a/hw/arm/stellaris.c
90
+++ b/hw/arm/stellaris.c
91
@@ -XXX,XX +XXX,XX @@ static void lm3s811evb_class_init(ObjectClass *oc, void *data)
92
{
93
MachineClass *mc = MACHINE_CLASS(oc);
94
95
- mc->desc = "Stellaris LM3S811EVB";
96
+ mc->desc = "Stellaris LM3S811EVB (Cortex-M3)";
97
mc->init = lm3s811evb_init;
98
mc->ignore_memory_transaction_failures = true;
99
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m3");
100
@@ -XXX,XX +XXX,XX @@ static void lm3s6965evb_class_init(ObjectClass *oc, void *data)
101
{
102
MachineClass *mc = MACHINE_CLASS(oc);
103
104
- mc->desc = "Stellaris LM3S6965EVB";
105
+ mc->desc = "Stellaris LM3S6965EVB (Cortex-M3)";
106
mc->init = lm3s6965evb_init;
107
mc->ignore_memory_transaction_failures = true;
108
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m3");
77
--
109
--
78
2.20.1
110
2.20.1
79
111
80
112
diff view generated by jsdifflib