1
target-arm queue of various easier things that had piled
1
Two last-minute regression fixes that I thought we might as well
2
up while I was on holiday.
2
squeeze in before rc1.
3
3
4
thanks
4
thanks
5
-- PMM
5
-- PMM
6
6
7
The following changes since commit 506e4a00de01e0b29fa83db5cbbc3d154253b4ea:
7
The following changes since commit d37bfe142382fa8258531c47b4519387c77cd169:
8
8
9
Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-3.1-20180925' into staging (2018-09-25 13:30:45 +0100)
9
Merge remote-tracking branch 'remotes/palmer/tags/riscv-for-master-4.0-rc1-v2' into staging (2019-03-26 10:27:20 +0000)
10
10
11
are available in the Git repository at:
11
are available in the Git repository at:
12
12
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180925
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190326
14
14
15
for you to fetch changes up to 4a87106b160a3e72152443065fb92f8a1313c23d:
15
for you to fetch changes up to c99ef792dc9ec6d8a5061428faf396ea9ceb8f57:
16
16
17
target/arm: Start AArch32 CPUs with EL2 but not EL3 in Hyp mode (2018-09-25 14:14:07 +0100)
17
gdbstub: fix vCont packet handling when no thread is specified (2019-03-26 12:53:26 +0000)
18
18
19
----------------------------------------------------------------
19
----------------------------------------------------------------
20
target-arm queue:
20
target-arm queue:
21
* target/arm: Fix cpu_get_tb_cpu_state() for non-SVE CPUs
21
* Set SIMDMISC and FPMISC for 32-bit -cpu max
22
* hw/arm/exynos4210: fix Exynos4210 UART support
22
(fixes regression from 3.1)
23
* hw/arm/virt-acpi-build: Add a check for memory-less NUMA nodes
23
* fix vCont packet handling when no thread is specified
24
* arm: Add BBC micro:bit machine
25
* aspeed/i2c: Fix interrupt handling bugs
26
* hw/arm/smmu-common: Fix the name of the iommu memory regions
27
* hw/arm/smmuv3: fix eventq recording and IRQ triggerring
28
* hw/intc/arm_gic: Document QEMU interface
29
* hw/intc/arm_gic: Drop GIC_BASE_IRQ macro
30
* hw/net/pcnet-pci: Convert away from old_mmio accessors
31
* hw/timer/cmsdk-apb-dualtimer: Add missing 'break' statements
32
* aspeed/timer: fix compile breakage with clang 3.4.2
33
* hw/arm/aspeed: change the FMC flash model of the AST2500 evb
34
* hw/arm/aspeed: Minor code cleanups
35
* target/arm: Start AArch32 CPUs with EL2 but not EL3 in Hyp mode
36
24
37
----------------------------------------------------------------
25
----------------------------------------------------------------
38
Bartlomiej Zolnierkiewicz (1):
26
Luc Michel (1):
39
hw/arm/exynos4210: fix Exynos4210 UART support
27
gdbstub: fix vCont packet handling when no thread is specified
40
41
Cédric Le Goater (5):
42
aspeed/i2c: interrupts should be cleared by software only
43
aspeed/timer: fix compile breakage with clang 3.4.2
44
hw/arm/aspeed: change the FMC flash model of the AST2500 evb
45
hw/arm/aspeed: Add an Aspeed machine class
46
aspeed/smc: fix some alignment issues
47
48
Eric Auger (2):
49
hw/arm/smmu-common: Fix the name of the iommu memory regions
50
hw/arm/smmuv3: fix eventq recording and IRQ triggerring
51
52
Guenter Roeck (2):
53
aspeed/i2c: Handle receive command in separate function
54
aspeed/i2c: Fix receive done interrupt handling
55
56
Joel Stanley (3):
57
MAINTAINERS: Add NRF51 entry
58
arm: Add Nordic Semiconductor nRF51 SoC
59
arm: Add BBC micro:bit machine
60
61
Peter Maydell (6):
62
hw/intc/arm_gic: Document QEMU interface
63
hw/intc/arm_gic: Drop GIC_BASE_IRQ macro
64
hw/net/pcnet-pci: Convert away from old_mmio accessors
65
hw/net/pcnet-pci: Unify pcnet_ioport_read/write and pcnet_mmio_read/write
66
hw/timer/cmsdk-apb-dualtimer: Add missing 'break' statements
67
target/arm: Start AArch32 CPUs with EL2 but not EL3 in Hyp mode
68
28
69
Richard Henderson (1):
29
Richard Henderson (1):
70
target/arm: Fix cpu_get_tb_cpu_state() for non-SVE CPUs
30
target/arm: Set SIMDMISC and FPMISC for 32-bit -cpu max
71
31
72
Shannon Zhao (1):
32
gdbstub.c | 14 ++++++++++++--
73
hw/arm/virt-acpi-build: Add a check for memory-less NUMA nodes
33
target/arm/cpu.c | 5 +++++
34
2 files changed, 17 insertions(+), 2 deletions(-)
74
35
75
hw/arm/Makefile.objs | 1 +
76
hw/arm/smmuv3-internal.h | 26 ++---
77
hw/intc/gic_internal.h | 2 -
78
include/hw/arm/aspeed.h | 46 +++++++++
79
include/hw/arm/nrf51_soc.h | 41 ++++++++
80
include/hw/intc/arm_gic.h | 43 ++++++++
81
include/hw/timer/aspeed_timer.h | 3 +-
82
hw/arm/aspeed.c | 212 +++++++++++++---------------------------
83
hw/arm/exynos4210.c | 8 +-
84
hw/arm/microbit.c | 67 +++++++++++++
85
hw/arm/nrf51_soc.c | 133 +++++++++++++++++++++++++
86
hw/arm/smmu-common.c | 6 +-
87
hw/arm/smmuv3.c | 2 +-
88
hw/arm/virt-acpi-build.c | 10 +-
89
hw/i2c/aspeed_i2c.c | 63 ++++++++----
90
hw/intc/arm_gic.c | 31 +++---
91
hw/intc/arm_gic_common.c | 1 -
92
hw/net/pcnet-pci.c | 98 ++-----------------
93
hw/ssi/aspeed_smc.c | 8 +-
94
hw/timer/aspeed_timer.c | 1 -
95
hw/timer/cmsdk-apb-dualtimer.c | 2 +
96
target/arm/cpu.c | 14 ++-
97
target/arm/helper.c | 45 +++++----
98
MAINTAINERS | 8 ++
99
default-configs/arm-softmmu.mak | 1 +
100
hw/net/trace-events | 6 --
101
26 files changed, 542 insertions(+), 336 deletions(-)
102
create mode 100644 include/hw/arm/aspeed.h
103
create mode 100644 include/hw/arm/nrf51_soc.h
104
create mode 100644 hw/arm/microbit.c
105
create mode 100644 hw/arm/nrf51_soc.c
106
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Not only are the sve-related tb_flags fields unused when SVE is
4
disabled, but not all of the cpu registers are initialized properly
5
for computing same. This can corrupt other fields by ORing in -1,
6
which might result in QEMU crashing.
7
8
This bug was not present in 3.0, but this patch is cc'd to
9
stable because adf92eab90e3f5f34c285 where the bug was
10
introduced was marked for stable.
11
12
Fixes: adf92eab90e3f5f34c285
13
Cc: qemu-stable@nongnu.org (3.0.1)
14
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
target/arm/helper.c | 45 ++++++++++++++++++++++++---------------------
19
1 file changed, 24 insertions(+), 21 deletions(-)
20
21
diff --git a/target/arm/helper.c b/target/arm/helper.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/helper.c
24
+++ b/target/arm/helper.c
25
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
26
uint32_t flags;
27
28
if (is_a64(env)) {
29
- int sve_el = sve_exception_el(env);
30
- uint32_t zcr_len;
31
-
32
*pc = env->pc;
33
flags = ARM_TBFLAG_AARCH64_STATE_MASK;
34
/* Get control bits for tagged addresses */
35
flags |= (arm_regime_tbi0(env, mmu_idx) << ARM_TBFLAG_TBI0_SHIFT);
36
flags |= (arm_regime_tbi1(env, mmu_idx) << ARM_TBFLAG_TBI1_SHIFT);
37
- flags |= sve_el << ARM_TBFLAG_SVEEXC_EL_SHIFT;
38
39
- /* If SVE is disabled, but FP is enabled,
40
- then the effective len is 0. */
41
- if (sve_el != 0 && fp_el == 0) {
42
- zcr_len = 0;
43
- } else {
44
- int current_el = arm_current_el(env);
45
- ARMCPU *cpu = arm_env_get_cpu(env);
46
+ if (arm_feature(env, ARM_FEATURE_SVE)) {
47
+ int sve_el = sve_exception_el(env);
48
+ uint32_t zcr_len;
49
50
- zcr_len = cpu->sve_max_vq - 1;
51
- if (current_el <= 1) {
52
- zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[1]);
53
- }
54
- if (current_el < 2 && arm_feature(env, ARM_FEATURE_EL2)) {
55
- zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[2]);
56
- }
57
- if (current_el < 3 && arm_feature(env, ARM_FEATURE_EL3)) {
58
- zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[3]);
59
+ /* If SVE is disabled, but FP is enabled,
60
+ * then the effective len is 0.
61
+ */
62
+ if (sve_el != 0 && fp_el == 0) {
63
+ zcr_len = 0;
64
+ } else {
65
+ int current_el = arm_current_el(env);
66
+ ARMCPU *cpu = arm_env_get_cpu(env);
67
+
68
+ zcr_len = cpu->sve_max_vq - 1;
69
+ if (current_el <= 1) {
70
+ zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[1]);
71
+ }
72
+ if (current_el < 2 && arm_feature(env, ARM_FEATURE_EL2)) {
73
+ zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[2]);
74
+ }
75
+ if (current_el < 3 && arm_feature(env, ARM_FEATURE_EL3)) {
76
+ zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[3]);
77
+ }
78
}
79
+ flags |= sve_el << ARM_TBFLAG_SVEEXC_EL_SHIFT;
80
+ flags |= zcr_len << ARM_TBFLAG_ZCR_LEN_SHIFT;
81
}
82
- flags |= zcr_len << ARM_TBFLAG_ZCR_LEN_SHIFT;
83
} else {
84
*pc = env->regs[15];
85
flags = (env->thumb << ARM_TBFLAG_THUMB_SHIFT)
86
--
87
2.19.0
88
89
diff view generated by jsdifflib
Deleted patch
1
From: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
2
1
3
commit 97274d0c05d4 ("hw/char/exynos4210_uart.c: Remove unneeded
4
handling of NULL chardev") broke Exynos4210 support as it removed
5
NULL 'Chardev *chr' handling from exynos4210_uart_create() and
6
currently exynos4210_init() always passes NULL as 'Chardev *chr'
7
argument to exynos4210_uart_create() calls. Fix it by adding
8
missing serial_hd() calls to exynos4210_init().
9
10
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
11
Reviewed-by: Thomas Huth <thuth@redhat.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 9310418.Wg32kryeWE@amdc3058
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/arm/exynos4210.c | 8 ++++----
17
1 file changed, 4 insertions(+), 4 deletions(-)
18
19
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/exynos4210.c
22
+++ b/hw/arm/exynos4210.c
23
@@ -XXX,XX +XXX,XX @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem)
24
25
/*** UARTs ***/
26
exynos4210_uart_create(EXYNOS4210_UART0_BASE_ADDR,
27
- EXYNOS4210_UART0_FIFO_SIZE, 0, NULL,
28
+ EXYNOS4210_UART0_FIFO_SIZE, 0, serial_hd(0),
29
s->irq_table[exynos4210_get_irq(EXYNOS4210_UART_INT_GRP, 0)]);
30
31
exynos4210_uart_create(EXYNOS4210_UART1_BASE_ADDR,
32
- EXYNOS4210_UART1_FIFO_SIZE, 1, NULL,
33
+ EXYNOS4210_UART1_FIFO_SIZE, 1, serial_hd(1),
34
s->irq_table[exynos4210_get_irq(EXYNOS4210_UART_INT_GRP, 1)]);
35
36
exynos4210_uart_create(EXYNOS4210_UART2_BASE_ADDR,
37
- EXYNOS4210_UART2_FIFO_SIZE, 2, NULL,
38
+ EXYNOS4210_UART2_FIFO_SIZE, 2, serial_hd(2),
39
s->irq_table[exynos4210_get_irq(EXYNOS4210_UART_INT_GRP, 2)]);
40
41
exynos4210_uart_create(EXYNOS4210_UART3_BASE_ADDR,
42
- EXYNOS4210_UART3_FIFO_SIZE, 3, NULL,
43
+ EXYNOS4210_UART3_FIFO_SIZE, 3, serial_hd(3),
44
s->irq_table[exynos4210_get_irq(EXYNOS4210_UART_INT_GRP, 3)]);
45
46
/*** SD/MMC host controllers ***/
47
--
48
2.19.0
49
50
diff view generated by jsdifflib
Deleted patch
1
From: Shannon Zhao <shannon.zhaosl@gmail.com>
2
1
3
Like commit 16b4226(hw/acpi-build: Add a check for memory-less NUMA node
4
), it also needs to check memory length for NUMA nodes on ARM.
5
6
Signed-off-by: Shannon Zhao <shannon.zhaosl@gmail.com>
7
Reviewed-by: Andrew Jones <drjones@redhat.com>
8
Message-id: 20180911112643.19296-1-shenglong.zsl@alibaba-inc.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/virt-acpi-build.c | 10 ++++++----
12
1 file changed, 6 insertions(+), 4 deletions(-)
13
14
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/virt-acpi-build.c
17
+++ b/hw/arm/virt-acpi-build.c
18
@@ -XXX,XX +XXX,XX @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
19
20
mem_base = vms->memmap[VIRT_MEM].base;
21
for (i = 0; i < nb_numa_nodes; ++i) {
22
- numamem = acpi_data_push(table_data, sizeof(*numamem));
23
- build_srat_memory(numamem, mem_base, numa_info[i].node_mem, i,
24
- MEM_AFFINITY_ENABLED);
25
- mem_base += numa_info[i].node_mem;
26
+ if (numa_info[i].node_mem > 0) {
27
+ numamem = acpi_data_push(table_data, sizeof(*numamem));
28
+ build_srat_memory(numamem, mem_base, numa_info[i].node_mem, i,
29
+ MEM_AFFINITY_ENABLED);
30
+ mem_base += numa_info[i].node_mem;
31
+ }
32
}
33
34
build_header(linker, table_data, (void *)(table_data->data + srat_start),
35
--
36
2.19.0
37
38
diff view generated by jsdifflib
Deleted patch
1
From: Joel Stanley <joel@jms.id.au>
2
1
3
This contains the NRF51, and the machine that uses it, the BBC
4
micro:bit.
5
6
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Joel Stanley <joel@jms.id.au>
9
Message-id: 20180831220920.27113-2-joel@jms.id.au
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
MAINTAINERS | 8 ++++++++
13
1 file changed, 8 insertions(+)
14
15
diff --git a/MAINTAINERS b/MAINTAINERS
16
index XXXXXXX..XXXXXXX 100644
17
--- a/MAINTAINERS
18
+++ b/MAINTAINERS
19
@@ -XXX,XX +XXX,XX @@ F: include/hw/*/*aspeed*
20
F: hw/net/ftgmac100.c
21
F: include/hw/net/ftgmac100.h
22
23
+NRF51
24
+M: Joel Stanley <joel@jms.id.au>
25
+L: qemu-arm@nongnu.org
26
+S: Maintained
27
+F: hw/arm/nrf51_soc.c
28
+F: hw/arm/microbit.c
29
+F: include/hw/arm/nrf51_soc.h
30
+
31
CRIS Machines
32
-------------
33
Axis Dev88
34
--
35
2.19.0
36
37
diff view generated by jsdifflib
Deleted patch
1
From: Joel Stanley <joel@jms.id.au>
2
1
3
The nRF51 is a Cortex-M0 microcontroller with an on-board radio module,
4
plus other common ARM SoC peripherals.
5
6
http://infocenter.nordicsemi.com/pdf/nRF51_RM_v3.0.pdf
7
8
This defines a basic model of the CPU and memory, with no peripherals
9
implemented at this stage.
10
11
Signed-off-by: Joel Stanley <joel@jms.id.au>
12
Message-id: 20180831220920.27113-3-joel@jms.id.au
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
[PMM: wrapped a few long lines]
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/arm/Makefile.objs | 1 +
18
include/hw/arm/nrf51_soc.h | 41 ++++++++++
19
hw/arm/nrf51_soc.c | 133 ++++++++++++++++++++++++++++++++
20
default-configs/arm-softmmu.mak | 1 +
21
4 files changed, 176 insertions(+)
22
create mode 100644 include/hw/arm/nrf51_soc.h
23
create mode 100644 hw/arm/nrf51_soc.c
24
25
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
26
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/arm/Makefile.objs
28
+++ b/hw/arm/Makefile.objs
29
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_IOTKIT) += iotkit.o
30
obj-$(CONFIG_FSL_IMX7) += fsl-imx7.o mcimx7d-sabre.o
31
obj-$(CONFIG_ARM_SMMUV3) += smmu-common.o smmuv3.o
32
obj-$(CONFIG_FSL_IMX6UL) += fsl-imx6ul.o mcimx6ul-evk.o
33
+obj-$(CONFIG_NRF51_SOC) += nrf51_soc.o
34
diff --git a/include/hw/arm/nrf51_soc.h b/include/hw/arm/nrf51_soc.h
35
new file mode 100644
36
index XXXXXXX..XXXXXXX
37
--- /dev/null
38
+++ b/include/hw/arm/nrf51_soc.h
39
@@ -XXX,XX +XXX,XX @@
40
+/*
41
+ * Nordic Semiconductor nRF51 SoC
42
+ *
43
+ * Copyright 2018 Joel Stanley <joel@jms.id.au>
44
+ *
45
+ * This code is licensed under the GPL version 2 or later. See
46
+ * the COPYING file in the top-level directory.
47
+ */
48
+
49
+#ifndef NRF51_SOC_H
50
+#define NRF51_SOC_H
51
+
52
+#include "hw/sysbus.h"
53
+#include "hw/arm/armv7m.h"
54
+
55
+#define TYPE_NRF51_SOC "nrf51-soc"
56
+#define NRF51_SOC(obj) \
57
+ OBJECT_CHECK(NRF51State, (obj), TYPE_NRF51_SOC)
58
+
59
+typedef struct NRF51State {
60
+ /*< private >*/
61
+ SysBusDevice parent_obj;
62
+
63
+ /*< public >*/
64
+ ARMv7MState cpu;
65
+
66
+ MemoryRegion iomem;
67
+ MemoryRegion sram;
68
+ MemoryRegion flash;
69
+
70
+ uint32_t sram_size;
71
+ uint32_t flash_size;
72
+
73
+ MemoryRegion *board_memory;
74
+
75
+ MemoryRegion container;
76
+
77
+} NRF51State;
78
+
79
+#endif
80
+
81
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
82
new file mode 100644
83
index XXXXXXX..XXXXXXX
84
--- /dev/null
85
+++ b/hw/arm/nrf51_soc.c
86
@@ -XXX,XX +XXX,XX @@
87
+/*
88
+ * Nordic Semiconductor nRF51 SoC
89
+ * http://infocenter.nordicsemi.com/pdf/nRF51_RM_v3.0.1.pdf
90
+ *
91
+ * Copyright 2018 Joel Stanley <joel@jms.id.au>
92
+ *
93
+ * This code is licensed under the GPL version 2 or later. See
94
+ * the COPYING file in the top-level directory.
95
+ */
96
+
97
+#include "qemu/osdep.h"
98
+#include "qapi/error.h"
99
+#include "qemu-common.h"
100
+#include "hw/arm/arm.h"
101
+#include "hw/sysbus.h"
102
+#include "hw/boards.h"
103
+#include "hw/devices.h"
104
+#include "hw/misc/unimp.h"
105
+#include "exec/address-spaces.h"
106
+#include "sysemu/sysemu.h"
107
+#include "qemu/log.h"
108
+#include "cpu.h"
109
+
110
+#include "hw/arm/nrf51_soc.h"
111
+
112
+#define IOMEM_BASE 0x40000000
113
+#define IOMEM_SIZE 0x20000000
114
+
115
+#define FICR_BASE 0x10000000
116
+#define FICR_SIZE 0x000000fc
117
+
118
+#define FLASH_BASE 0x00000000
119
+#define SRAM_BASE 0x20000000
120
+
121
+#define PRIVATE_BASE 0xF0000000
122
+#define PRIVATE_SIZE 0x10000000
123
+
124
+/*
125
+ * The size and base is for the NRF51822 part. If other parts
126
+ * are supported in the future, add a sub-class of NRF51SoC for
127
+ * the specific variants
128
+ */
129
+#define NRF51822_FLASH_SIZE (256 * 1024)
130
+#define NRF51822_SRAM_SIZE (16 * 1024)
131
+
132
+static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
133
+{
134
+ NRF51State *s = NRF51_SOC(dev_soc);
135
+ Error *err = NULL;
136
+
137
+ if (!s->board_memory) {
138
+ error_setg(errp, "memory property was not set");
139
+ return;
140
+ }
141
+
142
+ object_property_set_link(OBJECT(&s->cpu), OBJECT(&s->container), "memory",
143
+ &err);
144
+ if (err) {
145
+ error_propagate(errp, err);
146
+ return;
147
+ }
148
+ object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
149
+ if (err) {
150
+ error_propagate(errp, err);
151
+ return;
152
+ }
153
+
154
+ memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -1);
155
+
156
+ memory_region_init_rom(&s->flash, OBJECT(s), "nrf51.flash", s->flash_size,
157
+ &err);
158
+ if (err) {
159
+ error_propagate(errp, err);
160
+ return;
161
+ }
162
+ memory_region_add_subregion(&s->container, FLASH_BASE, &s->flash);
163
+
164
+ memory_region_init_ram(&s->sram, NULL, "nrf51.sram", s->sram_size, &err);
165
+ if (err) {
166
+ error_propagate(errp, err);
167
+ return;
168
+ }
169
+ memory_region_add_subregion(&s->container, SRAM_BASE, &s->sram);
170
+
171
+ create_unimplemented_device("nrf51_soc.io", IOMEM_BASE, IOMEM_SIZE);
172
+ create_unimplemented_device("nrf51_soc.ficr", FICR_BASE, FICR_SIZE);
173
+ create_unimplemented_device("nrf51_soc.private",
174
+ PRIVATE_BASE, PRIVATE_SIZE);
175
+}
176
+
177
+static void nrf51_soc_init(Object *obj)
178
+{
179
+ NRF51State *s = NRF51_SOC(obj);
180
+
181
+ memory_region_init(&s->container, obj, "nrf51-container", UINT64_MAX);
182
+
183
+ sysbus_init_child_obj(OBJECT(s), "armv6m", OBJECT(&s->cpu), sizeof(s->cpu),
184
+ TYPE_ARMV7M);
185
+ qdev_prop_set_string(DEVICE(&s->cpu), "cpu-type",
186
+ ARM_CPU_TYPE_NAME("cortex-m0"));
187
+ qdev_prop_set_uint32(DEVICE(&s->cpu), "num-irq", 32);
188
+}
189
+
190
+static Property nrf51_soc_properties[] = {
191
+ DEFINE_PROP_LINK("memory", NRF51State, board_memory, TYPE_MEMORY_REGION,
192
+ MemoryRegion *),
193
+ DEFINE_PROP_UINT32("sram-size", NRF51State, sram_size, NRF51822_SRAM_SIZE),
194
+ DEFINE_PROP_UINT32("flash-size", NRF51State, flash_size,
195
+ NRF51822_FLASH_SIZE),
196
+ DEFINE_PROP_END_OF_LIST(),
197
+};
198
+
199
+static void nrf51_soc_class_init(ObjectClass *klass, void *data)
200
+{
201
+ DeviceClass *dc = DEVICE_CLASS(klass);
202
+
203
+ dc->realize = nrf51_soc_realize;
204
+ dc->props = nrf51_soc_properties;
205
+}
206
+
207
+static const TypeInfo nrf51_soc_info = {
208
+ .name = TYPE_NRF51_SOC,
209
+ .parent = TYPE_SYS_BUS_DEVICE,
210
+ .instance_size = sizeof(NRF51State),
211
+ .instance_init = nrf51_soc_init,
212
+ .class_init = nrf51_soc_class_init,
213
+};
214
+
215
+static void nrf51_soc_types(void)
216
+{
217
+ type_register_static(&nrf51_soc_info);
218
+}
219
+type_init(nrf51_soc_types)
220
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
221
index XXXXXXX..XXXXXXX 100644
222
--- a/default-configs/arm-softmmu.mak
223
+++ b/default-configs/arm-softmmu.mak
224
@@ -XXX,XX +XXX,XX @@ CONFIG_STM32F2XX_SYSCFG=y
225
CONFIG_STM32F2XX_ADC=y
226
CONFIG_STM32F2XX_SPI=y
227
CONFIG_STM32F205_SOC=y
228
+CONFIG_NRF51_SOC=y
229
230
CONFIG_CMSDK_APB_TIMER=y
231
CONFIG_CMSDK_APB_DUALTIMER=y
232
--
233
2.19.0
234
235
diff view generated by jsdifflib
Deleted patch
1
From: Joel Stanley <joel@jms.id.au>
2
1
3
This adds the base for a machine model of the BBC micro:bit:
4
5
https://en.wikipedia.org/wiki/Micro_Bit
6
7
This is a system with a nRF51 SoC containing the main processor, with
8
various peripherals on board.
9
10
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
11
Signed-off-by: Joel Stanley <joel@jms.id.au>
12
Message-id: 20180831220920.27113-4-joel@jms.id.au
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/arm/Makefile.objs | 2 +-
17
hw/arm/microbit.c | 67 ++++++++++++++++++++++++++++++++++++++++++++
18
2 files changed, 68 insertions(+), 1 deletion(-)
19
create mode 100644 hw/arm/microbit.c
20
21
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/arm/Makefile.objs
24
+++ b/hw/arm/Makefile.objs
25
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_IOTKIT) += iotkit.o
26
obj-$(CONFIG_FSL_IMX7) += fsl-imx7.o mcimx7d-sabre.o
27
obj-$(CONFIG_ARM_SMMUV3) += smmu-common.o smmuv3.o
28
obj-$(CONFIG_FSL_IMX6UL) += fsl-imx6ul.o mcimx6ul-evk.o
29
-obj-$(CONFIG_NRF51_SOC) += nrf51_soc.o
30
+obj-$(CONFIG_NRF51_SOC) += nrf51_soc.o microbit.o
31
diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c
32
new file mode 100644
33
index XXXXXXX..XXXXXXX
34
--- /dev/null
35
+++ b/hw/arm/microbit.c
36
@@ -XXX,XX +XXX,XX @@
37
+/*
38
+ * BBC micro:bit machine
39
+ * http://tech.microbit.org/hardware/
40
+ *
41
+ * Copyright 2018 Joel Stanley <joel@jms.id.au>
42
+ *
43
+ * This code is licensed under the GPL version 2 or later. See
44
+ * the COPYING file in the top-level directory.
45
+ */
46
+
47
+#include "qemu/osdep.h"
48
+#include "qapi/error.h"
49
+#include "hw/boards.h"
50
+#include "hw/arm/arm.h"
51
+#include "exec/address-spaces.h"
52
+
53
+#include "hw/arm/nrf51_soc.h"
54
+
55
+typedef struct {
56
+ MachineState parent;
57
+
58
+ NRF51State nrf51;
59
+} MicrobitMachineState;
60
+
61
+#define TYPE_MICROBIT_MACHINE MACHINE_TYPE_NAME("microbit")
62
+
63
+#define MICROBIT_MACHINE(obj) \
64
+ OBJECT_CHECK(MicrobitMachineState, obj, TYPE_MICROBIT_MACHINE)
65
+
66
+static void microbit_init(MachineState *machine)
67
+{
68
+ MicrobitMachineState *s = MICROBIT_MACHINE(machine);
69
+ MemoryRegion *system_memory = get_system_memory();
70
+ Object *soc = OBJECT(&s->nrf51);
71
+
72
+ sysbus_init_child_obj(OBJECT(machine), "nrf51", soc, sizeof(s->nrf51),
73
+ TYPE_NRF51_SOC);
74
+ object_property_set_link(soc, OBJECT(system_memory), "memory",
75
+ &error_fatal);
76
+ object_property_set_bool(soc, true, "realized", &error_fatal);
77
+
78
+ armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename,
79
+ NRF51_SOC(soc)->flash_size);
80
+}
81
+
82
+static void microbit_machine_class_init(ObjectClass *oc, void *data)
83
+{
84
+ MachineClass *mc = MACHINE_CLASS(oc);
85
+
86
+ mc->desc = "BBC micro:bit";
87
+ mc->init = microbit_init;
88
+ mc->max_cpus = 1;
89
+}
90
+
91
+static const TypeInfo microbit_info = {
92
+ .name = TYPE_MICROBIT_MACHINE,
93
+ .parent = TYPE_MACHINE,
94
+ .instance_size = sizeof(MicrobitMachineState),
95
+ .class_init = microbit_machine_class_init,
96
+};
97
+
98
+static void microbit_machine_init(void)
99
+{
100
+ type_register_static(&microbit_info);
101
+}
102
+
103
+type_init(microbit_machine_init);
104
--
105
2.19.0
106
107
diff view generated by jsdifflib
Deleted patch
1
From: Cédric Le Goater <clg@kaod.org>
2
1
3
aspeed i2c interrupts should be cleared by software only, and the bus
4
interrupt should be lowered when all interrupts have been cleared.
5
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Message-id: 20180914063506.20815-2-clg@kaod.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
[PMM: drop TODO comment describing an issue which is
10
fixed later in the patch series, and clean up commit message]
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/i2c/aspeed_i2c.c | 16 ++++++++++++----
14
1 file changed, 12 insertions(+), 4 deletions(-)
15
16
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/i2c/aspeed_i2c.c
19
+++ b/hw/i2c/aspeed_i2c.c
20
@@ -XXX,XX +XXX,XX @@
21
#define I2CD_AC_TIMING_REG2 0x08 /* Clock and AC Timing Control #1 */
22
#define I2CD_INTR_CTRL_REG 0x0c /* I2CD Interrupt Control */
23
#define I2CD_INTR_STS_REG 0x10 /* I2CD Interrupt Status */
24
+
25
+#define I2CD_INTR_SLAVE_ADDR_MATCH (0x1 << 31) /* 0: addr1 1: addr2 */
26
+#define I2CD_INTR_SLAVE_ADDR_RX_PENDING (0x1 << 30)
27
+/* bits[19-16] Reserved */
28
+
29
+/* All bits below are cleared by writing 1 */
30
+#define I2CD_INTR_SLAVE_INACTIVE_TIMEOUT (0x1 << 15)
31
#define I2CD_INTR_SDA_DL_TIMEOUT (0x1 << 14)
32
#define I2CD_INTR_BUS_RECOVER_DONE (0x1 << 13)
33
#define I2CD_INTR_SMBUS_ALERT (0x1 << 12) /* Bus [0-3] only */
34
@@ -XXX,XX +XXX,XX @@
35
#define I2CD_INTR_SMBUS_DEV_ALERT_ADDR (0x1 << 10) /* Removed */
36
#define I2CD_INTR_SMBUS_DEF_ADDR (0x1 << 9) /* Removed */
37
#define I2CD_INTR_GCALL_ADDR (0x1 << 8) /* Removed */
38
-#define I2CD_INTR_SLAVE_MATCH (0x1 << 7) /* use RX_DONE */
39
+#define I2CD_INTR_SLAVE_ADDR_RX_MATCH (0x1 << 7) /* use RX_DONE */
40
#define I2CD_INTR_SCL_TIMEOUT (0x1 << 6)
41
#define I2CD_INTR_ABNORMAL (0x1 << 5)
42
#define I2CD_INTR_NORMAL_STOP (0x1 << 4)
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
44
{
45
bus->cmd &= ~0xFFFF;
46
bus->cmd |= value & 0xFFFF;
47
- bus->intr_status = 0;
48
49
if (bus->cmd & I2CD_M_START_CMD) {
50
uint8_t state = aspeed_i2c_get_state(bus) & I2CD_MACTIVE ?
51
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
52
break;
53
case I2CD_INTR_STS_REG:
54
bus->intr_status &= ~(value & 0x7FFF);
55
- bus->controller->intr_status &= ~(1 << bus->id);
56
- qemu_irq_lower(bus->controller->irq);
57
+ if (!bus->intr_status) {
58
+ bus->controller->intr_status &= ~(1 << bus->id);
59
+ qemu_irq_lower(bus->controller->irq);
60
+ }
61
break;
62
case I2CD_DEV_ADDR_REG:
63
qemu_log_mask(LOG_UNIMP, "%s: slave mode not implemented\n",
64
--
65
2.19.0
66
67
diff view generated by jsdifflib
Deleted patch
1
From: Guenter Roeck <linux@roeck-us.net>
2
1
3
Receive command handling may have to be deferred if a previous receive
4
done interrupt was not yet acknowledged. Move receive command handling
5
into a separate function to prepare for the necessary changes.
6
7
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Message-id: 20180914063506.20815-3-clg@kaod.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/i2c/aspeed_i2c.c | 37 +++++++++++++++++++++----------------
14
1 file changed, 21 insertions(+), 16 deletions(-)
15
16
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/i2c/aspeed_i2c.c
19
+++ b/hw/i2c/aspeed_i2c.c
20
@@ -XXX,XX +XXX,XX @@ static uint8_t aspeed_i2c_get_state(AspeedI2CBus *bus)
21
return (bus->cmd >> I2CD_TX_STATE_SHIFT) & I2CD_TX_STATE_MASK;
22
}
23
24
+static void aspeed_i2c_handle_rx_cmd(AspeedI2CBus *bus)
25
+{
26
+ int ret;
27
+
28
+ aspeed_i2c_set_state(bus, I2CD_MRXD);
29
+ ret = i2c_recv(bus->bus);
30
+ if (ret < 0) {
31
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: read failed\n", __func__);
32
+ ret = 0xff;
33
+ } else {
34
+ bus->intr_status |= I2CD_INTR_RX_DONE;
35
+ }
36
+ bus->buf = (ret & I2CD_BYTE_BUF_RX_MASK) << I2CD_BYTE_BUF_RX_SHIFT;
37
+ if (bus->cmd & I2CD_M_S_RX_CMD_LAST) {
38
+ i2c_nack(bus->bus);
39
+ }
40
+ bus->cmd &= ~(I2CD_M_RX_CMD | I2CD_M_S_RX_CMD_LAST);
41
+ aspeed_i2c_set_state(bus, I2CD_MACTIVE);
42
+}
43
+
44
/*
45
* The state machine needs some refinement. It is only used to track
46
* invalid STOP commands for the moment.
47
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
48
}
49
50
if (bus->cmd & (I2CD_M_RX_CMD | I2CD_M_S_RX_CMD_LAST)) {
51
- int ret;
52
-
53
- aspeed_i2c_set_state(bus, I2CD_MRXD);
54
- ret = i2c_recv(bus->bus);
55
- if (ret < 0) {
56
- qemu_log_mask(LOG_GUEST_ERROR, "%s: read failed\n", __func__);
57
- ret = 0xff;
58
- } else {
59
- bus->intr_status |= I2CD_INTR_RX_DONE;
60
- }
61
- bus->buf = (ret & I2CD_BYTE_BUF_RX_MASK) << I2CD_BYTE_BUF_RX_SHIFT;
62
- if (bus->cmd & I2CD_M_S_RX_CMD_LAST) {
63
- i2c_nack(bus->bus);
64
- }
65
- bus->cmd &= ~(I2CD_M_RX_CMD | I2CD_M_S_RX_CMD_LAST);
66
- aspeed_i2c_set_state(bus, I2CD_MACTIVE);
67
+ aspeed_i2c_handle_rx_cmd(bus);
68
}
69
70
if (bus->cmd & I2CD_M_STOP_CMD) {
71
--
72
2.19.0
73
74
diff view generated by jsdifflib
Deleted patch
1
From: Guenter Roeck <linux@roeck-us.net>
2
1
3
The AST2500 datasheet says:
4
5
I2CD10 Interrupt Status Register
6
bit 2 Receive Done Interrupt status
7
S/W needs to clear this status bit to allow next data receiving
8
9
The Rx interrupt done interrupt status bit needs to be cleared
10
explicitly before the next byte can be received, and must therefore
11
not be auto-cleared. Also, receiving the next byte must be delayed
12
until the bit has been cleared.
13
14
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
15
Signed-off-by: Cédric Le Goater <clg@kaod.org>
16
Message-id: 20180914063506.20815-4-clg@kaod.org
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
19
hw/i2c/aspeed_i2c.c | 10 +++++++++-
20
1 file changed, 9 insertions(+), 1 deletion(-)
21
22
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/i2c/aspeed_i2c.c
25
+++ b/hw/i2c/aspeed_i2c.c
26
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
27
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
28
}
29
30
- if (bus->cmd & (I2CD_M_RX_CMD | I2CD_M_S_RX_CMD_LAST)) {
31
+ if ((bus->cmd & (I2CD_M_RX_CMD | I2CD_M_S_RX_CMD_LAST)) &&
32
+ !(bus->intr_status & I2CD_INTR_RX_DONE)) {
33
aspeed_i2c_handle_rx_cmd(bus);
34
}
35
36
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
37
uint64_t value, unsigned size)
38
{
39
AspeedI2CBus *bus = opaque;
40
+ bool handle_rx;
41
42
switch (offset) {
43
case I2CD_FUN_CTRL_REG:
44
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
45
bus->intr_ctrl = value & 0x7FFF;
46
break;
47
case I2CD_INTR_STS_REG:
48
+ handle_rx = (bus->intr_status & I2CD_INTR_RX_DONE) &&
49
+ (value & I2CD_INTR_RX_DONE);
50
bus->intr_status &= ~(value & 0x7FFF);
51
if (!bus->intr_status) {
52
bus->controller->intr_status &= ~(1 << bus->id);
53
qemu_irq_lower(bus->controller->irq);
54
}
55
+ if (handle_rx && (bus->cmd & (I2CD_M_RX_CMD | I2CD_M_S_RX_CMD_LAST))) {
56
+ aspeed_i2c_handle_rx_cmd(bus);
57
+ aspeed_i2c_bus_raise_interrupt(bus);
58
+ }
59
break;
60
case I2CD_DEV_ADDR_REG:
61
qemu_log_mask(LOG_UNIMP, "%s: slave mode not implemented\n",
62
--
63
2.19.0
64
65
diff view generated by jsdifflib
Deleted patch
1
From: Eric Auger <eric.auger@redhat.com>
2
1
3
At the point smmu_find_add_as() gets called, the bus number might
4
not be computed. Let's change the name of IOMMU memory region and
5
just use the devfn and an incrementing index.
6
7
The name only is used for debug.
8
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 20180921070138.10114-2-eric.auger@redhat.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/smmu-common.c | 6 +++---
15
1 file changed, 3 insertions(+), 3 deletions(-)
16
17
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/smmu-common.c
20
+++ b/hw/arm/smmu-common.c
21
@@ -XXX,XX +XXX,XX @@ static AddressSpace *smmu_find_add_as(PCIBus *bus, void *opaque, int devfn)
22
SMMUState *s = opaque;
23
SMMUPciBus *sbus = g_hash_table_lookup(s->smmu_pcibus_by_busptr, bus);
24
SMMUDevice *sdev;
25
+ static uint index;
26
27
if (!sbus) {
28
sbus = g_malloc0(sizeof(SMMUPciBus) +
29
@@ -XXX,XX +XXX,XX @@ static AddressSpace *smmu_find_add_as(PCIBus *bus, void *opaque, int devfn)
30
31
sdev = sbus->pbdev[devfn];
32
if (!sdev) {
33
- char *name = g_strdup_printf("%s-%d-%d",
34
- s->mrtypename,
35
- pci_bus_num(bus), devfn);
36
+ char *name = g_strdup_printf("%s-%d-%d", s->mrtypename, devfn, index++);
37
+
38
sdev = sbus->pbdev[devfn] = g_new0(SMMUDevice, 1);
39
40
sdev->smmu = s;
41
--
42
2.19.0
43
44
diff view generated by jsdifflib
Deleted patch
1
From: Eric Auger <eric.auger@redhat.com>
2
1
3
The event queue management is broken today. Event records
4
are not properly written as EVT_SET_* macro was not updating
5
the actual event record. Also the event queue interrupt
6
is not correctly triggered.
7
8
Fixes: bb981004eaf4 ("hw/arm/smmuv3: Event queue recording helper")
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 20180921070138.10114-3-eric.auger@redhat.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/smmuv3-internal.h | 26 +++++++++++++-------------
15
hw/arm/smmuv3.c | 2 +-
16
2 files changed, 14 insertions(+), 14 deletions(-)
17
18
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/smmuv3-internal.h
21
+++ b/hw/arm/smmuv3-internal.h
22
@@ -XXX,XX +XXX,XX @@ typedef struct SMMUEventInfo {
23
24
#define EVT_Q_OVERFLOW (1 << 31)
25
26
-#define EVT_SET_TYPE(x, v) deposit32((x)->word[0], 0 , 8 , v)
27
-#define EVT_SET_SSV(x, v) deposit32((x)->word[0], 11, 1 , v)
28
-#define EVT_SET_SSID(x, v) deposit32((x)->word[0], 12, 20, v)
29
-#define EVT_SET_SID(x, v) ((x)->word[1] = v)
30
-#define EVT_SET_STAG(x, v) deposit32((x)->word[2], 0 , 16, v)
31
-#define EVT_SET_STALL(x, v) deposit32((x)->word[2], 31, 1 , v)
32
-#define EVT_SET_PNU(x, v) deposit32((x)->word[3], 1 , 1 , v)
33
-#define EVT_SET_IND(x, v) deposit32((x)->word[3], 2 , 1 , v)
34
-#define EVT_SET_RNW(x, v) deposit32((x)->word[3], 3 , 1 , v)
35
-#define EVT_SET_S2(x, v) deposit32((x)->word[3], 7 , 1 , v)
36
-#define EVT_SET_CLASS(x, v) deposit32((x)->word[3], 8 , 2 , v)
37
+#define EVT_SET_TYPE(x, v) ((x)->word[0] = deposit32((x)->word[0], 0 , 8 , v))
38
+#define EVT_SET_SSV(x, v) ((x)->word[0] = deposit32((x)->word[0], 11, 1 , v))
39
+#define EVT_SET_SSID(x, v) ((x)->word[0] = deposit32((x)->word[0], 12, 20, v))
40
+#define EVT_SET_SID(x, v) ((x)->word[1] = v)
41
+#define EVT_SET_STAG(x, v) ((x)->word[2] = deposit32((x)->word[2], 0 , 16, v))
42
+#define EVT_SET_STALL(x, v) ((x)->word[2] = deposit32((x)->word[2], 31, 1 , v))
43
+#define EVT_SET_PNU(x, v) ((x)->word[3] = deposit32((x)->word[3], 1 , 1 , v))
44
+#define EVT_SET_IND(x, v) ((x)->word[3] = deposit32((x)->word[3], 2 , 1 , v))
45
+#define EVT_SET_RNW(x, v) ((x)->word[3] = deposit32((x)->word[3], 3 , 1 , v))
46
+#define EVT_SET_S2(x, v) ((x)->word[3] = deposit32((x)->word[3], 7 , 1 , v))
47
+#define EVT_SET_CLASS(x, v) ((x)->word[3] = deposit32((x)->word[3], 8 , 2 , v))
48
#define EVT_SET_ADDR(x, addr) \
49
do { \
50
(x)->word[5] = (uint32_t)(addr >> 32); \
51
@@ -XXX,XX +XXX,XX @@ typedef struct SMMUEventInfo {
52
} while (0)
53
#define EVT_SET_ADDR2(x, addr) \
54
do { \
55
- deposit32((x)->word[7], 3, 29, addr >> 16); \
56
- deposit32((x)->word[7], 0, 16, addr & 0xffff);\
57
+ (x)->word[7] = deposit32((x)->word[7], 3, 29, addr >> 16); \
58
+ (x)->word[7] = deposit32((x)->word[7], 0, 16, addr & 0xffff);\
59
} while (0)
60
61
void smmuv3_record_event(SMMUv3State *s, SMMUEventInfo *event);
62
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/hw/arm/smmuv3.c
65
+++ b/hw/arm/smmuv3.c
66
@@ -XXX,XX +XXX,XX @@ static MemTxResult smmuv3_write_eventq(SMMUv3State *s, Evt *evt)
67
return r;
68
}
69
70
- if (smmuv3_q_empty(q)) {
71
+ if (!smmuv3_q_empty(q)) {
72
smmuv3_trigger_irq(s, SMMU_IRQ_EVTQ, 0);
73
}
74
return MEMTX_OK;
75
--
76
2.19.0
77
78
diff view generated by jsdifflib
Deleted patch
1
The GICv2's QEMU interface (sysbus MMIO regions, IRQs,
2
etc) is now quite complicated with the addition of the
3
virtualization extensions. Add a comment in the header
4
file which documents it.
5
1
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
Message-id: 20180823103818.31189-1-peter.maydell@linaro.org
9
---
10
include/hw/intc/arm_gic.h | 43 +++++++++++++++++++++++++++++++++++++++
11
1 file changed, 43 insertions(+)
12
13
diff --git a/include/hw/intc/arm_gic.h b/include/hw/intc/arm_gic.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/intc/arm_gic.h
16
+++ b/include/hw/intc/arm_gic.h
17
@@ -XXX,XX +XXX,XX @@
18
* with this program; if not, see <http://www.gnu.org/licenses/>.
19
*/
20
21
+/*
22
+ * QEMU interface:
23
+ * + QOM property "num-cpu": number of CPUs to support
24
+ * + QOM property "num-irq": number of IRQs (including both SPIs and PPIs)
25
+ * + QOM property "revision": GIC version (1 or 2), or 0 for the 11MPCore GIC
26
+ * + QOM property "has-security-extensions": set true if the GIC should
27
+ * implement the security extensions
28
+ * + QOM property "has-virtualization-extensions": set true if the GIC should
29
+ * implement the virtualization extensions
30
+ * + unnamed GPIO inputs: (where P is number of SPIs, i.e. num-irq - 32)
31
+ * [0..P-1] SPIs
32
+ * [P..P+31] PPIs for CPU 0
33
+ * [P+32..P+63] PPIs for CPU 1
34
+ * ...
35
+ * + sysbus IRQs: (in order; number will vary depending on number of cores)
36
+ * - IRQ for CPU 0
37
+ * - IRQ for CPU 1
38
+ * ...
39
+ * - FIQ for CPU 0
40
+ * - FIQ for CPU 1
41
+ * ...
42
+ * - VIRQ for CPU 0 (exists even if virt extensions not present)
43
+ * - VIRQ for CPU 1 (exists even if virt extensions not present)
44
+ * ...
45
+ * - VFIQ for CPU 0 (exists even if virt extensions not present)
46
+ * - VFIQ for CPU 1 (exists even if virt extensions not present)
47
+ * ...
48
+ * - maintenance IRQ for CPU i/f 0 (only if virt extensions present)
49
+ * - maintenance IRQ for CPU i/f 1 (only if virt extensions present)
50
+ * + sysbus MMIO regions: (in order; numbers will vary depending on
51
+ * whether virtualization extensions are present and on number of cores)
52
+ * - distributor registers (GICD*)
53
+ * - CPU interface for the accessing core (GICC*)
54
+ * - virtual interface control registers (GICH*) (only if virt extns present)
55
+ * - virtual CPU interface for the accessing core (GICV*) (only if virt)
56
+ * - CPU 0 CPU interface registers
57
+ * - CPU 1 CPU interface registers
58
+ * ...
59
+ * - CPU 0 virtual interface control registers (only if virt extns present)
60
+ * - CPU 1 virtual interface control registers (only if virt extns present)
61
+ * ...
62
+ */
63
+
64
#ifndef HW_ARM_GIC_H
65
#define HW_ARM_GIC_H
66
67
--
68
2.19.0
69
70
diff view generated by jsdifflib
Deleted patch
1
The GIC_BASE_IRQ macro is a leftover from when we shared code
2
between the GICv2 and the v7M NVIC. Since the NVIC is now
3
split off, GIC_BASE_IRQ is always 0, and we can just delete it.
4
1
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
Message-id: 20180824161819.11085-1-peter.maydell@linaro.org
9
---
10
hw/intc/gic_internal.h | 2 --
11
hw/intc/arm_gic.c | 31 ++++++++++++++-----------------
12
hw/intc/arm_gic_common.c | 1 -
13
3 files changed, 14 insertions(+), 20 deletions(-)
14
15
diff --git a/hw/intc/gic_internal.h b/hw/intc/gic_internal.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/intc/gic_internal.h
18
+++ b/hw/intc/gic_internal.h
19
@@ -XXX,XX +XXX,XX @@
20
21
#define ALL_CPU_MASK ((unsigned)(((1 << GIC_NCPU) - 1)))
22
23
-#define GIC_BASE_IRQ 0
24
-
25
#define GIC_DIST_SET_ENABLED(irq, cm) (s->irq_state[irq].enabled |= (cm))
26
#define GIC_DIST_CLEAR_ENABLED(irq, cm) (s->irq_state[irq].enabled &= ~(cm))
27
#define GIC_DIST_TEST_ENABLED(irq, cm) ((s->irq_state[irq].enabled & (cm)) != 0)
28
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/intc/arm_gic.c
31
+++ b/hw/intc/arm_gic.c
32
@@ -XXX,XX +XXX,XX @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset, MemTxAttrs attrs)
33
res = 0;
34
if (!(s->security_extn && !attrs.secure) && gic_has_groups(s)) {
35
/* Every byte offset holds 8 group status bits */
36
- irq = (offset - 0x080) * 8 + GIC_BASE_IRQ;
37
+ irq = (offset - 0x080) * 8;
38
if (irq >= s->num_irq) {
39
goto bad_reg;
40
}
41
@@ -XXX,XX +XXX,XX @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset, MemTxAttrs attrs)
42
irq = (offset - 0x100) * 8;
43
else
44
irq = (offset - 0x180) * 8;
45
- irq += GIC_BASE_IRQ;
46
if (irq >= s->num_irq)
47
goto bad_reg;
48
res = 0;
49
@@ -XXX,XX +XXX,XX @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset, MemTxAttrs attrs)
50
irq = (offset - 0x200) * 8;
51
else
52
irq = (offset - 0x280) * 8;
53
- irq += GIC_BASE_IRQ;
54
if (irq >= s->num_irq)
55
goto bad_reg;
56
res = 0;
57
@@ -XXX,XX +XXX,XX @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset, MemTxAttrs attrs)
58
goto bad_reg;
59
}
60
61
- irq += GIC_BASE_IRQ;
62
if (irq >= s->num_irq)
63
goto bad_reg;
64
res = 0;
65
@@ -XXX,XX +XXX,XX @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset, MemTxAttrs attrs)
66
}
67
} else if (offset < 0x800) {
68
/* Interrupt Priority. */
69
- irq = (offset - 0x400) + GIC_BASE_IRQ;
70
+ irq = (offset - 0x400);
71
if (irq >= s->num_irq)
72
goto bad_reg;
73
res = gic_dist_get_priority(s, cpu, irq, attrs);
74
@@ -XXX,XX +XXX,XX @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset, MemTxAttrs attrs)
75
/* For uniprocessor GICs these RAZ/WI */
76
res = 0;
77
} else {
78
- irq = (offset - 0x800) + GIC_BASE_IRQ;
79
+ irq = (offset - 0x800);
80
if (irq >= s->num_irq) {
81
goto bad_reg;
82
}
83
@@ -XXX,XX +XXX,XX @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset, MemTxAttrs attrs)
84
}
85
} else if (offset < 0xf00) {
86
/* Interrupt Configuration. */
87
- irq = (offset - 0xc00) * 4 + GIC_BASE_IRQ;
88
+ irq = (offset - 0xc00) * 4;
89
if (irq >= s->num_irq)
90
goto bad_reg;
91
res = 0;
92
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
93
*/
94
if (!(s->security_extn && !attrs.secure) && gic_has_groups(s)) {
95
/* Every byte offset holds 8 group status bits */
96
- irq = (offset - 0x80) * 8 + GIC_BASE_IRQ;
97
+ irq = (offset - 0x80) * 8;
98
if (irq >= s->num_irq) {
99
goto bad_reg;
100
}
101
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
102
}
103
} else if (offset < 0x180) {
104
/* Interrupt Set Enable. */
105
- irq = (offset - 0x100) * 8 + GIC_BASE_IRQ;
106
+ irq = (offset - 0x100) * 8;
107
if (irq >= s->num_irq)
108
goto bad_reg;
109
if (irq < GIC_NR_SGIS) {
110
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
111
}
112
} else if (offset < 0x200) {
113
/* Interrupt Clear Enable. */
114
- irq = (offset - 0x180) * 8 + GIC_BASE_IRQ;
115
+ irq = (offset - 0x180) * 8;
116
if (irq >= s->num_irq)
117
goto bad_reg;
118
if (irq < GIC_NR_SGIS) {
119
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
120
}
121
} else if (offset < 0x280) {
122
/* Interrupt Set Pending. */
123
- irq = (offset - 0x200) * 8 + GIC_BASE_IRQ;
124
+ irq = (offset - 0x200) * 8;
125
if (irq >= s->num_irq)
126
goto bad_reg;
127
if (irq < GIC_NR_SGIS) {
128
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
129
}
130
} else if (offset < 0x300) {
131
/* Interrupt Clear Pending. */
132
- irq = (offset - 0x280) * 8 + GIC_BASE_IRQ;
133
+ irq = (offset - 0x280) * 8;
134
if (irq >= s->num_irq)
135
goto bad_reg;
136
if (irq < GIC_NR_SGIS) {
137
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
138
goto bad_reg;
139
}
140
141
- irq = (offset - 0x300) * 8 + GIC_BASE_IRQ;
142
+ irq = (offset - 0x300) * 8;
143
if (irq >= s->num_irq) {
144
goto bad_reg;
145
}
146
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
147
goto bad_reg;
148
}
149
150
- irq = (offset - 0x380) * 8 + GIC_BASE_IRQ;
151
+ irq = (offset - 0x380) * 8;
152
if (irq >= s->num_irq) {
153
goto bad_reg;
154
}
155
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
156
}
157
} else if (offset < 0x800) {
158
/* Interrupt Priority. */
159
- irq = (offset - 0x400) + GIC_BASE_IRQ;
160
+ irq = (offset - 0x400);
161
if (irq >= s->num_irq)
162
goto bad_reg;
163
gic_dist_set_priority(s, cpu, irq, value, attrs);
164
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
165
* annoying exception of the 11MPCore's GIC.
166
*/
167
if (s->num_cpu != 1 || s->revision == REV_11MPCORE) {
168
- irq = (offset - 0x800) + GIC_BASE_IRQ;
169
+ irq = (offset - 0x800);
170
if (irq >= s->num_irq) {
171
goto bad_reg;
172
}
173
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
174
}
175
} else if (offset < 0xf00) {
176
/* Interrupt Configuration. */
177
- irq = (offset - 0xc00) * 4 + GIC_BASE_IRQ;
178
+ irq = (offset - 0xc00) * 4;
179
if (irq >= s->num_irq)
180
goto bad_reg;
181
if (irq < GIC_NR_SGIS)
182
diff --git a/hw/intc/arm_gic_common.c b/hw/intc/arm_gic_common.c
183
index XXXXXXX..XXXXXXX 100644
184
--- a/hw/intc/arm_gic_common.c
185
+++ b/hw/intc/arm_gic_common.c
186
@@ -XXX,XX +XXX,XX @@ static void arm_gic_common_realize(DeviceState *dev, Error **errp)
187
s->num_cpu, GIC_NCPU);
188
return;
189
}
190
- s->num_irq += GIC_BASE_IRQ;
191
if (s->num_irq > GIC_MAXIRQ) {
192
error_setg(errp,
193
"requested %u interrupt lines exceeds GIC maximum %d",
194
--
195
2.19.0
196
197
diff view generated by jsdifflib
Deleted patch
1
Convert the pcnet-pci device away from using the old_mmio
2
MemoryRegionOps accessor functions.
3
1
4
This commit is a no-behaviour-change API conversion.
5
(Since PCNET_PNPMMIO_SIZE is 0x20, the old "addr & 0x10"
6
check and the new "addr < 0x10" check are exact opposites;
7
the new code is phrased to be parallel with the
8
pcnet_io_read/write functions.)
9
10
I have left a TODO comment marker because the similarity
11
between the MMIO and IO accessor behaviour is suspicious
12
and they could be combined, but this will be left to a
13
different patch.
14
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/net/pcnet-pci.c | 133 ++++++++++++++++++--------------------------
19
hw/net/trace-events | 8 +--
20
2 files changed, 57 insertions(+), 84 deletions(-)
21
22
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/net/pcnet-pci.c
25
+++ b/hw/net/pcnet-pci.c
26
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps pcnet_io_ops = {
27
.endianness = DEVICE_LITTLE_ENDIAN,
28
};
29
30
-static void pcnet_mmio_writeb(void *opaque, hwaddr addr, uint32_t val)
31
+/*
32
+ * TODO: should MMIO accesses to the addresses corresponding to the
33
+ * APROM also honour the BCR_DWIO() setting? If so, then these functions
34
+ * and pcnet_ioport_write/pcnet_ioport_read could be merged.
35
+ * If not, then should pcnet_ioport_{read,write}{w,l} really check
36
+ * BCR_DWIO() for MMIO writes ?
37
+ */
38
+static void pcnet_mmio_write(void *opaque, hwaddr addr, uint64_t value,
39
+ unsigned size)
40
{
41
PCNetState *d = opaque;
42
43
- trace_pcnet_mmio_writeb(opaque, addr, val);
44
- if (!(addr & 0x10))
45
- pcnet_aprom_writeb(d, addr & 0x0f, val);
46
-}
47
+ trace_pcnet_mmio_write(opaque, addr, size, val);
48
49
-static uint32_t pcnet_mmio_readb(void *opaque, hwaddr addr)
50
-{
51
- PCNetState *d = opaque;
52
- uint32_t val = -1;
53
-
54
- if (!(addr & 0x10))
55
- val = pcnet_aprom_readb(d, addr & 0x0f);
56
- trace_pcnet_mmio_readb(opaque, addr, val);
57
- return val;
58
-}
59
-
60
-static void pcnet_mmio_writew(void *opaque, hwaddr addr, uint32_t val)
61
-{
62
- PCNetState *d = opaque;
63
-
64
- trace_pcnet_mmio_writew(opaque, addr, val);
65
- if (addr & 0x10)
66
- pcnet_ioport_writew(d, addr & 0x0f, val);
67
- else {
68
- addr &= 0x0f;
69
- pcnet_aprom_writeb(d, addr, val & 0xff);
70
- pcnet_aprom_writeb(d, addr+1, (val & 0xff00) >> 8);
71
+ if (addr < 0x10) {
72
+ if (size == 1) {
73
+ pcnet_aprom_writeb(d, addr, data);
74
+ } else if ((addr & 1) == 0 && size == 2) {
75
+ pcnet_aprom_writeb(d, addr, data & 0xff);
76
+ pcnet_aprom_writeb(d, addr + 1, data >> 8);
77
+ } else if ((addr & 3) == 0 && size == 4) {
78
+ pcnet_aprom_writeb(d, addr, data & 0xff);
79
+ pcnet_aprom_writeb(d, addr + 1, (data >> 8) & 0xff);
80
+ pcnet_aprom_writeb(d, addr + 2, (data >> 16) & 0xff);
81
+ pcnet_aprom_writeb(d, addr + 3, data >> 24);
82
+ }
83
+ } else {
84
+ if (size == 2) {
85
+ pcnet_ioport_writew(d, addr, data);
86
+ } else if (size == 4) {
87
+ pcnet_ioport_writel(d, addr, data);
88
+ }
89
}
90
}
91
92
-static uint32_t pcnet_mmio_readw(void *opaque, hwaddr addr)
93
-{
94
- PCNetState *d = opaque;
95
- uint32_t val = -1;
96
-
97
- if (addr & 0x10)
98
- val = pcnet_ioport_readw(d, addr & 0x0f);
99
- else {
100
- addr &= 0x0f;
101
- val = pcnet_aprom_readb(d, addr+1);
102
- val <<= 8;
103
- val |= pcnet_aprom_readb(d, addr);
104
- }
105
- trace_pcnet_mmio_readw(opaque, addr, val);
106
- return val;
107
-}
108
-
109
-static void pcnet_mmio_writel(void *opaque, hwaddr addr, uint32_t val)
110
+static uint64_t pcnet_mmio_read(void *opque, hwaddr addr, unsigned size)
111
{
112
PCNetState *d = opaque;
113
114
- trace_pcnet_mmio_writel(opaque, addr, val);
115
- if (addr & 0x10)
116
- pcnet_ioport_writel(d, addr & 0x0f, val);
117
- else {
118
- addr &= 0x0f;
119
- pcnet_aprom_writeb(d, addr, val & 0xff);
120
- pcnet_aprom_writeb(d, addr+1, (val & 0xff00) >> 8);
121
- pcnet_aprom_writeb(d, addr+2, (val & 0xff0000) >> 16);
122
- pcnet_aprom_writeb(d, addr+3, (val & 0xff000000) >> 24);
123
- }
124
-}
125
+ trace_pcnet_ioport_read(opaque, addr, size);
126
127
-static uint32_t pcnet_mmio_readl(void *opaque, hwaddr addr)
128
-{
129
- PCNetState *d = opaque;
130
- uint32_t val;
131
-
132
- if (addr & 0x10)
133
- val = pcnet_ioport_readl(d, addr & 0x0f);
134
- else {
135
- addr &= 0x0f;
136
- val = pcnet_aprom_readb(d, addr+3);
137
- val <<= 8;
138
- val |= pcnet_aprom_readb(d, addr+2);
139
- val <<= 8;
140
- val |= pcnet_aprom_readb(d, addr+1);
141
- val <<= 8;
142
- val |= pcnet_aprom_readb(d, addr);
143
+ if (addr < 0x10) {
144
+ if (size == 1) {
145
+ return pcnet_aprom_readb(d, addr);
146
+ } else if ((addr & 1) == 0 && size == 2) {
147
+ return pcnet_aprom_readb(d, addr) |
148
+ (pcnet_aprom_readb(d, addr + 1) << 8);
149
+ } else if ((addr & 3) == 0 && size == 4) {
150
+ return pcnet_aprom_readb(d, addr) |
151
+ (pcnet_aprom_readb(d, addr + 1) << 8) |
152
+ (pcnet_aprom_readb(d, addr + 2) << 16) |
153
+ (pcnet_aprom_readb(d, addr + 3) << 24);
154
+ }
155
+ } else {
156
+ if (size == 2) {
157
+ return pcnet_ioport_readw(d, addr);
158
+ } else if (size == 4) {
159
+ return pcnet_ioport_readl(d, addr);
160
+ }
161
}
162
- trace_pcnet_mmio_readl(opaque, addr, val);
163
- return val;
164
+ return ((uint64_t)1 << (size * 8)) - 1;
165
}
166
167
static const VMStateDescription vmstate_pci_pcnet = {
168
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pci_pcnet = {
169
/* PCI interface */
170
171
static const MemoryRegionOps pcnet_mmio_ops = {
172
- .old_mmio = {
173
- .read = { pcnet_mmio_readb, pcnet_mmio_readw, pcnet_mmio_readl },
174
- .write = { pcnet_mmio_writeb, pcnet_mmio_writew, pcnet_mmio_writel },
175
- },
176
+ .read = pcnet_mmio_read,
177
+ .write = pcnet_mmio_write,
178
+ .valid.min_access_size = 1,
179
+ .valid.max_access_size = 4,
180
+ .impl.min_access_size = 1,
181
+ .impl.max_access_size = 4,
182
.endianness = DEVICE_LITTLE_ENDIAN,
183
};
184
185
diff --git a/hw/net/trace-events b/hw/net/trace-events
186
index XXXXXXX..XXXXXXX 100644
187
--- a/hw/net/trace-events
188
+++ b/hw/net/trace-events
189
@@ -XXX,XX +XXX,XX @@ pcnet_aprom_writeb(void *opaque, uint32_t addr, uint32_t val) "opaque=%p addr=0x
190
pcnet_aprom_readb(void *opaque, uint32_t addr, uint32_t val) "opaque=%p addr=0x%08x val=0x%02x"
191
pcnet_ioport_read(void *opaque, uint64_t addr, unsigned size) "opaque=%p addr=0x%"PRIx64" size=%d"
192
pcnet_ioport_write(void *opaque, uint64_t addr, uint64_t data, unsigned size) "opaque=%p addr=0x%"PRIx64" data=0x%"PRIx64" size=%d"
193
-pcnet_mmio_writeb(void *opaque, uint64_t addr, uint32_t val) "opaque=%p addr=0x%"PRIx64" val=0x%x"
194
-pcnet_mmio_writew(void *opaque, uint64_t addr, uint32_t val) "opaque=%p addr=0x%"PRIx64" val=0x%x"
195
-pcnet_mmio_writel(void *opaque, uint64_t addr, uint32_t val) "opaque=%p addr=0x%"PRIx64" val=0x%x"
196
-pcnet_mmio_readb(void *opaque, uint64_t addr, uint32_t val) "opaque=%p addr=0x%"PRIx64" val=0x%x"
197
-pcnet_mmio_readw(void *opaque, uint64_t addr, uint32_t val) "opaque=%p addr=0x%"PRIx64" val=0x%x"
198
-pcnet_mmio_readl(void *opaque, uint64_t addr, uint32_t val) "opaque=%p addr=0x%"PRIx64" val=0x%x"
199
+pcnet_mmio_write(void *opaque, uint64_t addr, uint32_t val, unsigned size) "opaque=%p addr=0x%"PRIx64" val=0x%x size=%d"
200
+pcnet_mmio_read(void *opaque, uint64_t addr, unsigned size) "opaque=%p addr=0x%"PRIx64" size=%d"
201
202
# hw/net/net_rx_pkt.c
203
net_rx_pkt_parsed(bool ip4, bool ip6, bool udp, bool tcp, size_t l3o, size_t l4o, size_t l5o) "RX packet parsed: ip4: %d, ip6: %d, udp: %d, tcp: %d, l3 offset: %zu, l4 offset: %zu, l5 offset: %zu"
204
--
205
2.19.0
206
207
diff view generated by jsdifflib
Deleted patch
1
The only difference between our implementation of the pcnet ioport
2
accessors and the mmio accessors is that the former check BCR_DWIO to
3
see what access widths are permitted for addresses in the aprom range
4
(0x0..0xf). In fact our failure to do this in the mmio accessors
5
is a bug (one which was fixed for the ioport accessors in
6
commit 7ba79741970 in 2011).
7
1
8
The data sheet for the Am79C970A does not describe the DWIO
9
bit as only applying for I/O space mapped I/O resources and
10
not memory mapped I/O resources, and our MMIO accessors already
11
honour DWIO for accesses in the 0x10..0x1f range (since the
12
pcnet_ioport_{read,write}{w,l} functions check it).
13
14
The data sheet for the later but compatible Am79C976 is clearer:
15
it states specifically "DWIO mode applies to both I/O- and
16
memory-mapped acceses." This seems to be reasonable evidence
17
in favour of interpretating the Am79C970A spec as being the same.
18
19
(NB: Linux's pcnet driver only supports I/O accesses, so the
20
MMIO access part of this device is probably untested anyway.)
21
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
25
hw/net/pcnet-pci.c | 67 ++-------------------------------------------
26
hw/net/trace-events | 2 --
27
2 files changed, 2 insertions(+), 67 deletions(-)
28
29
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/net/pcnet-pci.c
32
+++ b/hw/net/pcnet-pci.c
33
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps pcnet_io_ops = {
34
.endianness = DEVICE_LITTLE_ENDIAN,
35
};
36
37
-/*
38
- * TODO: should MMIO accesses to the addresses corresponding to the
39
- * APROM also honour the BCR_DWIO() setting? If so, then these functions
40
- * and pcnet_ioport_write/pcnet_ioport_read could be merged.
41
- * If not, then should pcnet_ioport_{read,write}{w,l} really check
42
- * BCR_DWIO() for MMIO writes ?
43
- */
44
-static void pcnet_mmio_write(void *opaque, hwaddr addr, uint64_t value,
45
- unsigned size)
46
-{
47
- PCNetState *d = opaque;
48
-
49
- trace_pcnet_mmio_write(opaque, addr, size, val);
50
-
51
- if (addr < 0x10) {
52
- if (size == 1) {
53
- pcnet_aprom_writeb(d, addr, data);
54
- } else if ((addr & 1) == 0 && size == 2) {
55
- pcnet_aprom_writeb(d, addr, data & 0xff);
56
- pcnet_aprom_writeb(d, addr + 1, data >> 8);
57
- } else if ((addr & 3) == 0 && size == 4) {
58
- pcnet_aprom_writeb(d, addr, data & 0xff);
59
- pcnet_aprom_writeb(d, addr + 1, (data >> 8) & 0xff);
60
- pcnet_aprom_writeb(d, addr + 2, (data >> 16) & 0xff);
61
- pcnet_aprom_writeb(d, addr + 3, data >> 24);
62
- }
63
- } else {
64
- if (size == 2) {
65
- pcnet_ioport_writew(d, addr, data);
66
- } else if (size == 4) {
67
- pcnet_ioport_writel(d, addr, data);
68
- }
69
- }
70
-}
71
-
72
-static uint64_t pcnet_mmio_read(void *opque, hwaddr addr, unsigned size)
73
-{
74
- PCNetState *d = opaque;
75
-
76
- trace_pcnet_ioport_read(opaque, addr, size);
77
-
78
- if (addr < 0x10) {
79
- if (size == 1) {
80
- return pcnet_aprom_readb(d, addr);
81
- } else if ((addr & 1) == 0 && size == 2) {
82
- return pcnet_aprom_readb(d, addr) |
83
- (pcnet_aprom_readb(d, addr + 1) << 8);
84
- } else if ((addr & 3) == 0 && size == 4) {
85
- return pcnet_aprom_readb(d, addr) |
86
- (pcnet_aprom_readb(d, addr + 1) << 8) |
87
- (pcnet_aprom_readb(d, addr + 2) << 16) |
88
- (pcnet_aprom_readb(d, addr + 3) << 24);
89
- }
90
- } else {
91
- if (size == 2) {
92
- return pcnet_ioport_readw(d, addr);
93
- } else if (size == 4) {
94
- return pcnet_ioport_readl(d, addr);
95
- }
96
- }
97
- return ((uint64_t)1 << (size * 8)) - 1;
98
-}
99
-
100
static const VMStateDescription vmstate_pci_pcnet = {
101
.name = "pcnet",
102
.version_id = 3,
103
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pci_pcnet = {
104
/* PCI interface */
105
106
static const MemoryRegionOps pcnet_mmio_ops = {
107
- .read = pcnet_mmio_read,
108
- .write = pcnet_mmio_write,
109
+ .read = pcnet_ioport_read,
110
+ .write = pcnet_ioport_write,
111
.valid.min_access_size = 1,
112
.valid.max_access_size = 4,
113
.impl.min_access_size = 1,
114
diff --git a/hw/net/trace-events b/hw/net/trace-events
115
index XXXXXXX..XXXXXXX 100644
116
--- a/hw/net/trace-events
117
+++ b/hw/net/trace-events
118
@@ -XXX,XX +XXX,XX @@ pcnet_aprom_writeb(void *opaque, uint32_t addr, uint32_t val) "opaque=%p addr=0x
119
pcnet_aprom_readb(void *opaque, uint32_t addr, uint32_t val) "opaque=%p addr=0x%08x val=0x%02x"
120
pcnet_ioport_read(void *opaque, uint64_t addr, unsigned size) "opaque=%p addr=0x%"PRIx64" size=%d"
121
pcnet_ioport_write(void *opaque, uint64_t addr, uint64_t data, unsigned size) "opaque=%p addr=0x%"PRIx64" data=0x%"PRIx64" size=%d"
122
-pcnet_mmio_write(void *opaque, uint64_t addr, uint32_t val, unsigned size) "opaque=%p addr=0x%"PRIx64" val=0x%x size=%d"
123
-pcnet_mmio_read(void *opaque, uint64_t addr, unsigned size) "opaque=%p addr=0x%"PRIx64" size=%d"
124
125
# hw/net/net_rx_pkt.c
126
net_rx_pkt_parsed(bool ip4, bool ip6, bool udp, bool tcp, size_t l3o, size_t l4o, size_t l5o) "RX packet parsed: ip4: %d, ip6: %d, udp: %d, tcp: %d, l3 offset: %zu, l4 offset: %zu, l5 offset: %zu"
127
--
128
2.19.0
129
130
diff view generated by jsdifflib
Deleted patch
1
Add 'break' statements missing from a switch in the APB dual-timer
2
write function. Spotted by Coverity as CID 1395626 and 1395633.
3
1
4
Reported-by: Paolo Bonzini <pbonzini@redhat.com>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20180924123122.14549-1-peter.maydell@linaro.org
8
---
9
hw/timer/cmsdk-apb-dualtimer.c | 2 ++
10
1 file changed, 2 insertions(+)
11
12
diff --git a/hw/timer/cmsdk-apb-dualtimer.c b/hw/timer/cmsdk-apb-dualtimer.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/timer/cmsdk-apb-dualtimer.c
15
+++ b/hw/timer/cmsdk-apb-dualtimer.c
16
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_write(void *opaque, hwaddr offset,
17
case A_TIMERITCR:
18
s->timeritcr = value & R_TIMERITCR_VALID_MASK;
19
cmsdk_apb_dualtimer_update(s);
20
+ break;
21
case A_TIMERITOP:
22
s->timeritop = value & R_TIMERITOP_VALID_MASK;
23
cmsdk_apb_dualtimer_update(s);
24
+ break;
25
default:
26
bad_offset:
27
qemu_log_mask(LOG_GUEST_ERROR,
28
--
29
2.19.0
30
31
diff view generated by jsdifflib
Deleted patch
1
From: Cédric Le Goater <clg@kaod.org>
2
1
3
In file included from /home/thuth/devel/qemu/hw/timer/aspeed_timer.c:16:
4
/home/thuth/devel/qemu/include/hw/misc/aspeed_scu.h:37:3: error:
5
redefinition of typedef 'AspeedSCUState' is a C11 feature
6
[-Werror,-Wtypedef-redefinition]
7
} AspeedSCUState;
8
^
9
/home/thuth/devel/qemu/include/hw/timer/aspeed_timer.h:27:31: note:
10
previous definition is here
11
typedef struct AspeedSCUState AspeedSCUState;
12
13
Reported-by: Thomas Huth <thuth@redhat.com>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Message-id: 20180921161939.822-2-clg@kaod.org
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
20
include/hw/timer/aspeed_timer.h | 3 +--
21
hw/timer/aspeed_timer.c | 1 -
22
2 files changed, 1 insertion(+), 3 deletions(-)
23
24
diff --git a/include/hw/timer/aspeed_timer.h b/include/hw/timer/aspeed_timer.h
25
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/timer/aspeed_timer.h
27
+++ b/include/hw/timer/aspeed_timer.h
28
@@ -XXX,XX +XXX,XX @@
29
#define ASPEED_TIMER_H
30
31
#include "qemu/timer.h"
32
-
33
-typedef struct AspeedSCUState AspeedSCUState;
34
+#include "hw/misc/aspeed_scu.h"
35
36
#define ASPEED_TIMER(obj) \
37
OBJECT_CHECK(AspeedTimerCtrlState, (obj), TYPE_ASPEED_TIMER);
38
diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/timer/aspeed_timer.c
41
+++ b/hw/timer/aspeed_timer.c
42
@@ -XXX,XX +XXX,XX @@
43
#include "qapi/error.h"
44
#include "hw/sysbus.h"
45
#include "hw/timer/aspeed_timer.h"
46
-#include "hw/misc/aspeed_scu.h"
47
#include "qemu-common.h"
48
#include "qemu/bitops.h"
49
#include "qemu/timer.h"
50
--
51
2.19.0
52
53
diff view generated by jsdifflib
Deleted patch
1
From: Cédric Le Goater <clg@kaod.org>
2
1
3
The AST2500 evb is shipped with a W25Q256 which has a non volatile bit
4
to make the chip operate in 4 Byte address mode at power up. This
5
should be an interesting feature to model as it will exercise a bit
6
more the SMC controllers and MMIO execution at boot time.
7
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Message-id: 20180921161939.822-3-clg@kaod.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/arm/aspeed.c | 2 +-
14
1 file changed, 1 insertion(+), 1 deletion(-)
15
16
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/aspeed.c
19
+++ b/hw/arm/aspeed.c
20
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
21
[AST2500_EVB] = {
22
.soc_name = "ast2500-a1",
23
.hw_strap1 = AST2500_EVB_HW_STRAP1,
24
- .fmc_model = "n25q256a",
25
+ .fmc_model = "w25q256",
26
.spi_model = "mx25l25635e",
27
.num_cs = 1,
28
.i2c_init = ast2500_evb_i2c_init,
29
--
30
2.19.0
31
32
diff view generated by jsdifflib
Deleted patch
1
From: Cédric Le Goater <clg@kaod.org>
2
1
3
The code looks better, it removes duplicated lines and it will ease
4
the introduction of common properties for the Aspeed machines.
5
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20180921161939.822-4-clg@kaod.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/arm/aspeed.h | 46 +++++++++
12
hw/arm/aspeed.c | 212 +++++++++++++---------------------------
13
2 files changed, 116 insertions(+), 142 deletions(-)
14
create mode 100644 include/hw/arm/aspeed.h
15
16
diff --git a/include/hw/arm/aspeed.h b/include/hw/arm/aspeed.h
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/include/hw/arm/aspeed.h
21
@@ -XXX,XX +XXX,XX @@
22
+/*
23
+ * Aspeed Machines
24
+ *
25
+ * Copyright 2018 IBM Corp.
26
+ *
27
+ * This code is licensed under the GPL version 2 or later. See
28
+ * the COPYING file in the top-level directory.
29
+ */
30
+#ifndef ARM_ASPEED_H
31
+#define ARM_ASPEED_H
32
+
33
+#include "hw/boards.h"
34
+
35
+typedef struct AspeedBoardState AspeedBoardState;
36
+
37
+typedef struct AspeedBoardConfig {
38
+ const char *name;
39
+ const char *desc;
40
+ const char *soc_name;
41
+ uint32_t hw_strap1;
42
+ const char *fmc_model;
43
+ const char *spi_model;
44
+ uint32_t num_cs;
45
+ void (*i2c_init)(AspeedBoardState *bmc);
46
+} AspeedBoardConfig;
47
+
48
+#define TYPE_ASPEED_MACHINE MACHINE_TYPE_NAME("aspeed")
49
+#define ASPEED_MACHINE(obj) \
50
+ OBJECT_CHECK(AspeedMachine, (obj), TYPE_ASPEED_MACHINE)
51
+
52
+typedef struct AspeedMachine {
53
+ MachineState parent_obj;
54
+} AspeedMachine;
55
+
56
+#define ASPEED_MACHINE_CLASS(klass) \
57
+ OBJECT_CLASS_CHECK(AspeedMachineClass, (klass), TYPE_ASPEED_MACHINE)
58
+#define ASPEED_MACHINE_GET_CLASS(obj) \
59
+ OBJECT_GET_CLASS(AspeedMachineClass, (obj), TYPE_ASPEED_MACHINE)
60
+
61
+typedef struct AspeedMachineClass {
62
+ MachineClass parent_obj;
63
+ const AspeedBoardConfig *board;
64
+} AspeedMachineClass;
65
+
66
+
67
+#endif
68
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/hw/arm/aspeed.c
71
+++ b/hw/arm/aspeed.c
72
@@ -XXX,XX +XXX,XX @@
73
#include "cpu.h"
74
#include "exec/address-spaces.h"
75
#include "hw/arm/arm.h"
76
+#include "hw/arm/aspeed.h"
77
#include "hw/arm/aspeed_soc.h"
78
#include "hw/boards.h"
79
#include "hw/i2c/smbus.h"
80
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedBoardState {
81
MemoryRegion max_ram;
82
} AspeedBoardState;
83
84
-typedef struct AspeedBoardConfig {
85
- const char *soc_name;
86
- uint32_t hw_strap1;
87
- const char *fmc_model;
88
- const char *spi_model;
89
- uint32_t num_cs;
90
- void (*i2c_init)(AspeedBoardState *bmc);
91
-} AspeedBoardConfig;
92
-
93
-enum {
94
- PALMETTO_BMC,
95
- AST2500_EVB,
96
- ROMULUS_BMC,
97
- WITHERSPOON_BMC,
98
-};
99
-
100
/* Palmetto hardware value: 0x120CE416 */
101
#define PALMETTO_BMC_HW_STRAP1 ( \
102
SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \
103
@@ -XXX,XX +XXX,XX @@ enum {
104
/* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
105
#define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
106
107
-static void palmetto_bmc_i2c_init(AspeedBoardState *bmc);
108
-static void ast2500_evb_i2c_init(AspeedBoardState *bmc);
109
-static void romulus_bmc_i2c_init(AspeedBoardState *bmc);
110
-static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc);
111
-
112
-static const AspeedBoardConfig aspeed_boards[] = {
113
- [PALMETTO_BMC] = {
114
- .soc_name = "ast2400-a1",
115
- .hw_strap1 = PALMETTO_BMC_HW_STRAP1,
116
- .fmc_model = "n25q256a",
117
- .spi_model = "mx25l25635e",
118
- .num_cs = 1,
119
- .i2c_init = palmetto_bmc_i2c_init,
120
- },
121
- [AST2500_EVB] = {
122
- .soc_name = "ast2500-a1",
123
- .hw_strap1 = AST2500_EVB_HW_STRAP1,
124
- .fmc_model = "w25q256",
125
- .spi_model = "mx25l25635e",
126
- .num_cs = 1,
127
- .i2c_init = ast2500_evb_i2c_init,
128
- },
129
- [ROMULUS_BMC] = {
130
- .soc_name = "ast2500-a1",
131
- .hw_strap1 = ROMULUS_BMC_HW_STRAP1,
132
- .fmc_model = "n25q256a",
133
- .spi_model = "mx66l1g45g",
134
- .num_cs = 2,
135
- .i2c_init = romulus_bmc_i2c_init,
136
- },
137
- [WITHERSPOON_BMC] = {
138
- .soc_name = "ast2500-a1",
139
- .hw_strap1 = WITHERSPOON_BMC_HW_STRAP1,
140
- .fmc_model = "mx25l25635e",
141
- .spi_model = "mx66l1g45g",
142
- .num_cs = 2,
143
- .i2c_init = witherspoon_bmc_i2c_init,
144
- },
145
-};
146
-
147
/*
148
* The max ram region is for firmwares that scan the address space
149
* with load/store to guess how much RAM the SoC has.
150
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_i2c_init(AspeedBoardState *bmc)
151
object_property_set_int(OBJECT(dev), 110000, "temperature3", &error_abort);
152
}
153
154
-static void palmetto_bmc_init(MachineState *machine)
155
-{
156
- aspeed_board_init(machine, &aspeed_boards[PALMETTO_BMC]);
157
-}
158
-
159
-static void palmetto_bmc_class_init(ObjectClass *oc, void *data)
160
-{
161
- MachineClass *mc = MACHINE_CLASS(oc);
162
-
163
- mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
164
- mc->init = palmetto_bmc_init;
165
- mc->max_cpus = 1;
166
- mc->no_sdcard = 1;
167
- mc->no_floppy = 1;
168
- mc->no_cdrom = 1;
169
- mc->no_parallel = 1;
170
-}
171
-
172
-static const TypeInfo palmetto_bmc_type = {
173
- .name = MACHINE_TYPE_NAME("palmetto-bmc"),
174
- .parent = TYPE_MACHINE,
175
- .class_init = palmetto_bmc_class_init,
176
-};
177
-
178
static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
179
{
180
AspeedSoCState *soc = &bmc->soc;
181
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
182
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
183
}
184
185
-static void ast2500_evb_init(MachineState *machine)
186
-{
187
- aspeed_board_init(machine, &aspeed_boards[AST2500_EVB]);
188
-}
189
-
190
-static void ast2500_evb_class_init(ObjectClass *oc, void *data)
191
-{
192
- MachineClass *mc = MACHINE_CLASS(oc);
193
-
194
- mc->desc = "Aspeed AST2500 EVB (ARM1176)";
195
- mc->init = ast2500_evb_init;
196
- mc->max_cpus = 1;
197
- mc->no_sdcard = 1;
198
- mc->no_floppy = 1;
199
- mc->no_cdrom = 1;
200
- mc->no_parallel = 1;
201
-}
202
-
203
-static const TypeInfo ast2500_evb_type = {
204
- .name = MACHINE_TYPE_NAME("ast2500-evb"),
205
- .parent = TYPE_MACHINE,
206
- .class_init = ast2500_evb_class_init,
207
-};
208
-
209
static void romulus_bmc_i2c_init(AspeedBoardState *bmc)
210
{
211
AspeedSoCState *soc = &bmc->soc;
212
@@ -XXX,XX +XXX,XX @@ static void romulus_bmc_i2c_init(AspeedBoardState *bmc)
213
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
214
}
215
216
-static void romulus_bmc_init(MachineState *machine)
217
-{
218
- aspeed_board_init(machine, &aspeed_boards[ROMULUS_BMC]);
219
-}
220
-
221
-static void romulus_bmc_class_init(ObjectClass *oc, void *data)
222
-{
223
- MachineClass *mc = MACHINE_CLASS(oc);
224
-
225
- mc->desc = "OpenPOWER Romulus BMC (ARM1176)";
226
- mc->init = romulus_bmc_init;
227
- mc->max_cpus = 1;
228
- mc->no_sdcard = 1;
229
- mc->no_floppy = 1;
230
- mc->no_cdrom = 1;
231
- mc->no_parallel = 1;
232
-}
233
-
234
-static const TypeInfo romulus_bmc_type = {
235
- .name = MACHINE_TYPE_NAME("romulus-bmc"),
236
- .parent = TYPE_MACHINE,
237
- .class_init = romulus_bmc_class_init,
238
-};
239
-
240
static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
241
{
242
AspeedSoCState *soc = &bmc->soc;
243
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
244
0x60);
245
}
246
247
-static void witherspoon_bmc_init(MachineState *machine)
248
+static void aspeed_machine_init(MachineState *machine)
249
{
250
- aspeed_board_init(machine, &aspeed_boards[WITHERSPOON_BMC]);
251
+ AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
252
+
253
+ aspeed_board_init(machine, amc->board);
254
}
255
256
-static void witherspoon_bmc_class_init(ObjectClass *oc, void *data)
257
+static void aspeed_machine_class_init(ObjectClass *oc, void *data)
258
{
259
MachineClass *mc = MACHINE_CLASS(oc);
260
+ AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
261
+ const AspeedBoardConfig *board = data;
262
263
- mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
264
- mc->init = witherspoon_bmc_init;
265
+ mc->desc = board->desc;
266
+ mc->init = aspeed_machine_init;
267
mc->max_cpus = 1;
268
mc->no_sdcard = 1;
269
mc->no_floppy = 1;
270
mc->no_cdrom = 1;
271
mc->no_parallel = 1;
272
+ amc->board = board;
273
}
274
275
-static const TypeInfo witherspoon_bmc_type = {
276
- .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
277
+static const TypeInfo aspeed_machine_type = {
278
+ .name = TYPE_ASPEED_MACHINE,
279
.parent = TYPE_MACHINE,
280
- .class_init = witherspoon_bmc_class_init,
281
+ .instance_size = sizeof(AspeedMachine),
282
+ .class_size = sizeof(AspeedMachineClass),
283
+ .abstract = true,
284
};
285
286
-static void aspeed_machine_init(void)
287
+static const AspeedBoardConfig aspeed_boards[] = {
288
+ {
289
+ .name = MACHINE_TYPE_NAME("palmetto-bmc"),
290
+ .desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)",
291
+ .soc_name = "ast2400-a1",
292
+ .hw_strap1 = PALMETTO_BMC_HW_STRAP1,
293
+ .fmc_model = "n25q256a",
294
+ .spi_model = "mx25l25635e",
295
+ .num_cs = 1,
296
+ .i2c_init = palmetto_bmc_i2c_init,
297
+ }, {
298
+ .name = MACHINE_TYPE_NAME("ast2500-evb"),
299
+ .desc = "Aspeed AST2500 EVB (ARM1176)",
300
+ .soc_name = "ast2500-a1",
301
+ .hw_strap1 = AST2500_EVB_HW_STRAP1,
302
+ .fmc_model = "w25q256",
303
+ .spi_model = "mx25l25635e",
304
+ .num_cs = 1,
305
+ .i2c_init = ast2500_evb_i2c_init,
306
+ }, {
307
+ .name = MACHINE_TYPE_NAME("romulus-bmc"),
308
+ .desc = "OpenPOWER Romulus BMC (ARM1176)",
309
+ .soc_name = "ast2500-a1",
310
+ .hw_strap1 = ROMULUS_BMC_HW_STRAP1,
311
+ .fmc_model = "n25q256a",
312
+ .spi_model = "mx66l1g45g",
313
+ .num_cs = 2,
314
+ .i2c_init = romulus_bmc_i2c_init,
315
+ }, {
316
+ .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
317
+ .desc = "OpenPOWER Witherspoon BMC (ARM1176)",
318
+ .soc_name = "ast2500-a1",
319
+ .hw_strap1 = WITHERSPOON_BMC_HW_STRAP1,
320
+ .fmc_model = "mx25l25635e",
321
+ .spi_model = "mx66l1g45g",
322
+ .num_cs = 2,
323
+ .i2c_init = witherspoon_bmc_i2c_init,
324
+ },
325
+};
326
+
327
+static void aspeed_machine_types(void)
328
{
329
- type_register_static(&palmetto_bmc_type);
330
- type_register_static(&ast2500_evb_type);
331
- type_register_static(&romulus_bmc_type);
332
- type_register_static(&witherspoon_bmc_type);
333
+ int i;
334
+
335
+ type_register_static(&aspeed_machine_type);
336
+ for (i = 0; i < ARRAY_SIZE(aspeed_boards); ++i) {
337
+ TypeInfo ti = {
338
+ .name = aspeed_boards[i].name,
339
+ .parent = TYPE_ASPEED_MACHINE,
340
+ .class_init = aspeed_machine_class_init,
341
+ .class_data = (void *)&aspeed_boards[i],
342
+ };
343
+ type_register(&ti);
344
+ }
345
}
346
347
-type_init(aspeed_machine_init)
348
+type_init(aspeed_machine_types)
349
--
350
2.19.0
351
352
diff view generated by jsdifflib
1
The ARMv8 architecture defines that an AArch32 CPU starts
1
From: Richard Henderson <richard.henderson@linaro.org>
2
in SVC mode, unless EL2 is the highest available EL, in
3
which case it starts in Hyp mode. (In ARMv7 a CPU with EL2
4
but not EL3 was not a valid configuration, but we don't
5
specifically reject this if the user asks for one.)
6
2
3
Fixes: https://bugs.launchpad.net/bugs/1821430
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 20190325161338.6536-1-richard.henderson@linaro.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20180823135047.16525-1-peter.maydell@linaro.org
10
---
9
---
11
target/arm/cpu.c | 14 ++++++++++++--
10
target/arm/cpu.c | 5 +++++
12
1 file changed, 12 insertions(+), 2 deletions(-)
11
1 file changed, 5 insertions(+)
13
12
14
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
13
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.c
15
--- a/target/arm/cpu.c
17
+++ b/target/arm/cpu.c
16
+++ b/target/arm/cpu.c
18
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
17
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
19
env->cp15.c15_cpar = 1;
18
t = FIELD_DP32(t, ID_ISAR6, SPECRES, 1);
20
}
19
cpu->isar.id_isar6 = t;
21
#else
20
22
- /* SVC mode with interrupts disabled. */
21
+ t = cpu->isar.mvfr2;
23
- env->uncached_cpsr = ARM_CPU_MODE_SVC;
22
+ t = FIELD_DP32(t, MVFR2, SIMDMISC, 3); /* SIMD MaxNum */
23
+ t = FIELD_DP32(t, MVFR2, FPMISC, 4); /* FP MaxNum */
24
+ cpu->isar.mvfr2 = t;
24
+
25
+
25
+ /*
26
t = cpu->id_mmfr4;
26
+ * If the highest available EL is EL2, AArch32 will start in Hyp
27
t = FIELD_DP32(t, ID_MMFR4, HPDS, 1); /* AA32HPD */
27
+ * mode; otherwise it starts in SVC. Note that if we start in
28
cpu->id_mmfr4 = t;
28
+ * AArch64 then these values in the uncached_cpsr will be ignored.
29
+ */
30
+ if (arm_feature(env, ARM_FEATURE_EL2) &&
31
+ !arm_feature(env, ARM_FEATURE_EL3)) {
32
+ env->uncached_cpsr = ARM_CPU_MODE_HYP;
33
+ } else {
34
+ env->uncached_cpsr = ARM_CPU_MODE_SVC;
35
+ }
36
env->daif = PSTATE_D | PSTATE_A | PSTATE_I | PSTATE_F;
37
38
if (arm_feature(env, ARM_FEATURE_M)) {
39
--
29
--
40
2.19.0
30
2.20.1
41
31
42
32
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Luc Michel <luc.michel@greensocs.com>
2
2
3
Signed-off-by: Cédric Le Goater <clg@kaod.org>
3
The vCont packet accepts a series of actions, each being applied on a
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
given thread ID. Giving no thread ID for an action is valid and means
5
Message-id: 20180921161939.822-6-clg@kaod.org
5
"all threads".
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
7
This commit fixes vCont packets being incorrectly rejected when no
8
thread ID was given for an action.
9
10
In multiprocess mode, the GDB Remote Protocol specification is unclear
11
on what "all threads" means. We choose to apply the action on all
12
threads of all attached processes.
13
14
This commit is based on the initial fix by Lucien Murray-Pitts.
15
16
Fixes: e40e5204af8388
17
Reported-by: Lucien Murray-Pitts <lucienmp_antispam@yahoo.com>
18
Reported-by: Jan Kiszka <jan.kiszka@siemens.com>
19
Signed-off-by: Luc Michel <luc.michel@greensocs.com>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Message-id: 20190325110452.6756-1-luc.michel@greensocs.com
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
23
---
9
hw/ssi/aspeed_smc.c | 8 ++++----
24
gdbstub.c | 14 ++++++++++++--
10
1 file changed, 4 insertions(+), 4 deletions(-)
25
1 file changed, 12 insertions(+), 2 deletions(-)
11
26
12
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
27
diff --git a/gdbstub.c b/gdbstub.c
13
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/ssi/aspeed_smc.c
29
--- a/gdbstub.c
15
+++ b/hw/ssi/aspeed_smc.c
30
+++ b/gdbstub.c
16
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_flash_default_read(void *opaque, hwaddr addr,
31
@@ -XXX,XX +XXX,XX @@ static int gdb_handle_vcont(GDBState *s, const char *p)
17
static void aspeed_smc_flash_default_write(void *opaque, hwaddr addr,
32
uint32_t pid, tid;
18
uint64_t data, unsigned size)
33
GDBProcess *process;
19
{
34
CPUState *cpu;
20
- qemu_log_mask(LOG_GUEST_ERROR, "%s: To 0x%" HWADDR_PRIx " of size %u: 0x%"
35
+ GDBThreadIdKind kind;
21
- PRIx64 "\n", __func__, addr, size, data);
36
#ifdef CONFIG_USER_ONLY
22
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: To 0x%" HWADDR_PRIx " of size %u: 0x%"
37
int max_cpus = 1; /* global variable max_cpus exists only in system mode */
23
+ PRIx64 "\n", __func__, addr, size, data);
38
24
}
39
@@ -XXX,XX +XXX,XX @@ static int gdb_handle_vcont(GDBState *s, const char *p)
25
40
goto out;
26
static const MemoryRegionOps aspeed_smc_flash_default_ops = {
27
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_flash_setup(AspeedSMCFlash *fl, uint32_t addr)
28
*/
29
if (aspeed_smc_flash_mode(fl) == CTRL_FREADMODE) {
30
for (i = 0; i < aspeed_smc_flash_dummies(fl); i++) {
31
- ssi_transfer(fl->controller->spi, 0xFF);
32
+ ssi_transfer(fl->controller->spi, 0xFF);
33
}
41
}
34
}
42
35
}
43
- if (*p++ != ':') {
36
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_flash_read(void *opaque, hwaddr addr, unsigned size)
44
+ if (*p == '\0' || *p == ';') {
37
}
45
+ /*
38
46
+ * No thread specifier, action is on "all threads". The
39
static void aspeed_smc_flash_write(void *opaque, hwaddr addr, uint64_t data,
47
+ * specification is unclear regarding the process to act on. We
40
- unsigned size)
48
+ * choose all processes.
41
+ unsigned size)
49
+ */
42
{
50
+ kind = GDB_ALL_PROCESSES;
43
AspeedSMCFlash *fl = opaque;
51
+ } else if (*p++ == ':') {
44
AspeedSMCState *s = fl->controller;
52
+ kind = read_thread_id(p, &p, &pid, &tid);
53
+ } else {
54
res = -ENOTSUP;
55
goto out;
56
}
57
58
- switch (read_thread_id(p, &p, &pid, &tid)) {
59
+ switch (kind) {
60
case GDB_READ_THREAD_ERR:
61
res = -EINVAL;
62
goto out;
45
--
63
--
46
2.19.0
64
2.20.1
47
65
48
66
diff view generated by jsdifflib