1
First arm pullreq for 7.1. The bulk of this is the qemu_split_irq
1
The following changes since commit 003ba52a8b327180e284630b289c6ece5a3e08b9:
2
removal.
3
2
4
I have enough stuff in my to-review queue that I expect to do another
3
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging (2023-02-16 11:16:39 +0000)
5
pullreq early next week, but 31 patches is enough to not hang on to.
6
7
thanks
8
-- PMM
9
10
The following changes since commit 9c125d17e9402c232c46610802e5931b3639d77b:
11
12
Merge tag 'pull-tcg-20220420' of https://gitlab.com/rth7680/qemu into staging (2022-04-20 16:43:11 -0700)
13
4
14
are available in the Git repository at:
5
are available in the Git repository at:
15
6
16
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220421
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230216
17
8
18
for you to fetch changes up to 5b415dd61bdbf61fb4be0e9f1a7172b8bce682c6:
9
for you to fetch changes up to caf01d6a435d9f4a95aeae2f9fc6cb8b889b1fb8:
19
10
20
hw/arm: Use bit fields for NPCM7XX PWRON STRAPs (2022-04-21 11:37:05 +0100)
11
tests/qtest: Restrict tpm-tis-devices-{swtpm}-test to CONFIG_TCG (2023-02-16 16:28:53 +0000)
21
12
22
----------------------------------------------------------------
13
----------------------------------------------------------------
23
target-arm queue:
14
target-arm queue:
24
* hw/arm/virt: Check for attempt to use TrustZone with KVM or HVF
15
* Some mostly M-profile-related code cleanups
25
* versal: Add the Cortex-R5s in the Real-Time Processing Unit (RPU) subsystem
16
* avocado: Retire the boot_linux.py AArch64 TCG tests
26
* versal: model enough of the Clock/Reset Low-power domain (CRL) to allow control of the Cortex-R5s
17
* hw/arm/smmuv3: Add GBPA register
27
* xlnx-zynqmp: Connect 4 TTC timers
18
* arm/virt: don't try to spell out the accelerator
28
* exynos4210: Refactor GIC/combiner code to stop using qemu_split_irq
19
* hw/arm: Attach PSPI module to NPCM7XX SoC
29
* realview: replace 'qemu_split_irq' with 'TYPE_SPLIT_IRQ'
20
* Some cleanup/refactoring patches aiming towards
30
* stellaris: replace 'qemu_split_irq' with 'TYPE_SPLIT_IRQ'
21
allowing building Arm targets without CONFIG_TCG
31
* hw/core/irq: remove unused 'qemu_irq_split' function
32
* npcm7xx: use symbolic constants for PWRON STRAP bit fields
33
* virt: document impact of gic-version on max CPUs
34
22
35
----------------------------------------------------------------
23
----------------------------------------------------------------
36
Edgar E. Iglesias (6):
24
Alex Bennée (1):
37
timer: cadence_ttc: Break out header file to allow embedding
25
tests/avocado: retire the Aarch64 TCG tests from boot_linux.py
38
hw/arm/xlnx-zynqmp: Connect 4 TTC timers
39
hw/arm: versal: Create an APU CPU Cluster
40
hw/arm: versal: Add the Cortex-R5Fs
41
hw/misc: Add a model of the Xilinx Versal CRL
42
hw/arm: versal: Connect the CRL
43
26
44
Hao Wu (2):
27
Claudio Fontana (3):
45
hw/misc: Add PWRON STRAP bit fields in GCR module
28
target/arm: rename handle_semihosting to tcg_handle_semihosting
46
hw/arm: Use bit fields for NPCM7XX PWRON STRAPs
29
target/arm: wrap psci call with tcg_enabled
30
target/arm: wrap call to aarch64_sve_change_el in tcg_enabled()
47
31
48
Heinrich Schuchardt (1):
32
Cornelia Huck (1):
49
hw/arm/virt: impact of gic-version on max CPUs
33
arm/virt: don't try to spell out the accelerator
50
34
51
Peter Maydell (19):
35
Fabiano Rosas (7):
52
hw/arm/virt: Check for attempt to use TrustZone with KVM or HVF
36
target/arm: Move PC alignment check
53
hw/arm/exynos4210: Use TYPE_OR_IRQ instead of custom OR-gate device
37
target/arm: Move cpregs code out of cpu.h
54
hw/intc/exynos4210_gic: Remove unused TYPE_EXYNOS4210_IRQ_GATE
38
tests/avocado: Skip tests that require a missing accelerator
55
hw/arm/exynos4210: Put a9mpcore device into state struct
39
tests/avocado: Tag TCG tests with accel:tcg
56
hw/arm/exynos4210: Drop int_gic_irq[] from Exynos4210Irq struct
40
target/arm: Use "max" as default cpu for the virt machine with KVM
57
hw/arm/exynos4210: Coalesce board_irqs and irq_table
41
tests/qtest: arm-cpu-features: Match tests to required accelerators
58
hw/arm/exynos4210: Fix code style nit in combiner_grp_to_gic_id[]
42
tests/qtest: Restrict tpm-tis-devices-{swtpm}-test to CONFIG_TCG
59
hw/arm/exynos4210: Move exynos4210_init_board_irqs() into exynos4210.c
60
hw/arm/exynos4210: Put external GIC into state struct
61
hw/arm/exynos4210: Drop ext_gic_irq[] from Exynos4210Irq struct
62
hw/arm/exynos4210: Move exynos4210_combiner_get_gpioin() into exynos4210.c
63
hw/arm/exynos4210: Delete unused macro definitions
64
hw/arm/exynos4210: Use TYPE_SPLIT_IRQ in exynos4210_init_board_irqs()
65
hw/arm/exynos4210: Fill in irq_table[] for internal-combiner-only IRQ lines
66
hw/arm/exynos4210: Connect MCT_G0 and MCT_G1 to both combiners
67
hw/arm/exynos4210: Don't connect multiple lines to external GIC inputs
68
hw/arm/exynos4210: Fold combiner splits into exynos4210_init_board_irqs()
69
hw/arm/exynos4210: Put combiners into state struct
70
hw/arm/exynos4210: Drop Exynos4210Irq struct
71
43
72
Zongyuan Li (3):
44
Hao Wu (3):
73
hw/arm/realview: replace 'qemu_split_irq' with 'TYPE_SPLIT_IRQ'
45
MAINTAINERS: Add myself to maintainers and remove Havard
74
hw/arm/stellaris: replace 'qemu_split_irq' with 'TYPE_SPLIT_IRQ'
46
hw/ssi: Add Nuvoton PSPI Module
75
hw/core/irq: remove unused 'qemu_irq_split' function
47
hw/arm: Attach PSPI module to NPCM7XX SoC
76
48
77
docs/system/arm/virt.rst | 4 +-
49
Jean-Philippe Brucker (2):
78
include/hw/arm/exynos4210.h | 50 ++--
50
hw/arm/smmu-common: Support 64-bit addresses
79
include/hw/arm/xlnx-versal.h | 16 ++
51
hw/arm/smmu-common: Fix TTB1 handling
80
include/hw/arm/xlnx-zynqmp.h | 4 +
52
81
include/hw/intc/exynos4210_combiner.h | 57 +++++
53
Mostafa Saleh (1):
82
include/hw/intc/exynos4210_gic.h | 43 ++++
54
hw/arm/smmuv3: Add GBPA register
83
include/hw/irq.h | 5 -
55
84
include/hw/misc/npcm7xx_gcr.h | 30 +++
56
Philippe Mathieu-Daudé (12):
85
include/hw/misc/xlnx-versal-crl.h | 235 +++++++++++++++++++
57
hw/intc/armv7m_nvic: Use OBJECT_DECLARE_SIMPLE_TYPE() macro
86
include/hw/timer/cadence_ttc.h | 54 +++++
58
target/arm: Simplify arm_v7m_mmu_idx_for_secstate() for user emulation
87
hw/arm/exynos4210.c | 430 ++++++++++++++++++++++++++++++----
59
target/arm: Reduce arm_v7m_mmu_idx_[all/for_secstate_and_priv]() scope
88
hw/arm/npcm7xx_boards.c | 24 +-
60
target/arm: Constify ID_PFR1 on user emulation
89
hw/arm/realview.c | 33 ++-
61
target/arm: Convert CPUARMState::eabi to boolean
90
hw/arm/stellaris.c | 15 +-
62
target/arm: Avoid resetting CPUARMState::eabi field
91
hw/arm/virt.c | 7 +
63
target/arm: Restrict CPUARMState::gicv3state to sysemu
92
hw/arm/xlnx-versal-virt.c | 6 +-
64
target/arm: Restrict CPUARMState::arm_boot_info to sysemu
93
hw/arm/xlnx-versal.c | 99 +++++++-
65
target/arm: Restrict CPUARMState::nvic to sysemu
94
hw/arm/xlnx-zynqmp.c | 22 ++
66
target/arm: Store CPUARMState::nvic as NVICState*
95
hw/core/irq.c | 15 --
67
target/arm: Declare CPU <-> NVIC helpers in 'hw/intc/armv7m_nvic.h'
96
hw/intc/exynos4210_combiner.c | 108 +--------
68
hw/arm: Add missing XLNX_ZYNQMP_ARM -> USB_DWC3 Kconfig dependency
97
hw/intc/exynos4210_gic.c | 344 +--------------------------
69
98
hw/misc/xlnx-versal-crl.c | 421 +++++++++++++++++++++++++++++++++
70
MAINTAINERS | 8 +-
99
hw/timer/cadence_ttc.c | 32 +--
71
docs/system/arm/nuvoton.rst | 2 +-
100
MAINTAINERS | 2 +-
72
hw/arm/smmuv3-internal.h | 7 +
101
hw/misc/meson.build | 1 +
73
include/hw/arm/npcm7xx.h | 2 +
102
25 files changed, 1457 insertions(+), 600 deletions(-)
74
include/hw/arm/smmu-common.h | 2 -
103
create mode 100644 include/hw/intc/exynos4210_combiner.h
75
include/hw/arm/smmuv3.h | 1 +
104
create mode 100644 include/hw/intc/exynos4210_gic.h
76
include/hw/intc/armv7m_nvic.h | 128 +++++++++++++++++-
105
create mode 100644 include/hw/misc/xlnx-versal-crl.h
77
include/hw/ssi/npcm_pspi.h | 53 ++++++++
106
create mode 100644 include/hw/timer/cadence_ttc.h
78
linux-user/user-internals.h | 2 +-
107
create mode 100644 hw/misc/xlnx-versal-crl.c
79
target/arm/cpregs.h | 98 ++++++++++++++
80
target/arm/cpu.h | 228 ++-------------------------------
81
target/arm/internals.h | 14 --
82
hw/arm/npcm7xx.c | 25 +++-
83
hw/arm/smmu-common.c | 4 +-
84
hw/arm/smmuv3.c | 43 ++++++-
85
hw/arm/virt.c | 10 +-
86
hw/intc/armv7m_nvic.c | 38 ++----
87
hw/ssi/npcm_pspi.c | 221 ++++++++++++++++++++++++++++++++
88
linux-user/arm/cpu_loop.c | 4 +-
89
target/arm/cpu.c | 5 +-
90
target/arm/cpu_tcg.c | 3 +
91
target/arm/helper.c | 31 +++--
92
target/arm/m_helper.c | 86 +++++++------
93
target/arm/machine.c | 18 +--
94
tests/qtest/arm-cpu-features.c | 28 ++--
95
hw/arm/Kconfig | 1 +
96
hw/ssi/meson.build | 2 +-
97
hw/ssi/trace-events | 5 +
98
tests/avocado/avocado_qemu/__init__.py | 4 +
99
tests/avocado/boot_linux.py | 48 ++-----
100
tests/avocado/boot_linux_console.py | 1 +
101
tests/avocado/machine_aarch64_virt.py | 63 ++++++++-
102
tests/avocado/reverse_debugging.py | 8 ++
103
tests/qtest/meson.build | 4 +-
104
34 files changed, 798 insertions(+), 399 deletions(-)
105
create mode 100644 include/hw/ssi/npcm_pspi.h
106
create mode 100644 hw/ssi/npcm_pspi.c
107
diff view generated by jsdifflib
1
Switch the creation of the external GIC to the new-style "embedded in
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
state struct" approach, so we can easily refer to the object
3
elsewhere during realize.
4
2
3
Manually convert to OBJECT_DECLARE_SIMPLE_TYPE() macro,
4
similarly to automatic conversion from commit 8063396bf3
5
("Use OBJECT_DECLARE_SIMPLE_TYPE when possible").
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230206223502.25122-2-philmd@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220404154658.565020-9-peter.maydell@linaro.org
8
---
11
---
9
include/hw/arm/exynos4210.h | 2 ++
12
include/hw/intc/armv7m_nvic.h | 5 +----
10
include/hw/intc/exynos4210_gic.h | 43 ++++++++++++++++++++++++++++++++
13
1 file changed, 1 insertion(+), 4 deletions(-)
11
hw/arm/exynos4210.c | 10 ++++----
12
hw/intc/exynos4210_gic.c | 17 ++-----------
13
MAINTAINERS | 2 +-
14
5 files changed, 53 insertions(+), 21 deletions(-)
15
create mode 100644 include/hw/intc/exynos4210_gic.h
16
14
17
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
15
diff --git a/include/hw/intc/armv7m_nvic.h b/include/hw/intc/armv7m_nvic.h
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/exynos4210.h
17
--- a/include/hw/intc/armv7m_nvic.h
20
+++ b/include/hw/arm/exynos4210.h
18
+++ b/include/hw/intc/armv7m_nvic.h
21
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
22
#include "hw/or-irq.h"
23
#include "hw/sysbus.h"
24
#include "hw/cpu/a9mpcore.h"
25
+#include "hw/intc/exynos4210_gic.h"
26
#include "target/arm/cpu-qom.h"
27
#include "qom/object.h"
20
#include "qom/object.h"
28
21
29
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
22
#define TYPE_NVIC "armv7m_nvic"
30
qemu_or_irq pl330_irq_orgate[EXYNOS4210_NUM_DMA];
31
qemu_or_irq cpu_irq_orgate[EXYNOS4210_NCPUS];
32
A9MPPrivState a9mpcore;
33
+ Exynos4210GicState ext_gic;
34
};
35
36
#define TYPE_EXYNOS4210_SOC "exynos4210"
37
diff --git a/include/hw/intc/exynos4210_gic.h b/include/hw/intc/exynos4210_gic.h
38
new file mode 100644
39
index XXXXXXX..XXXXXXX
40
--- /dev/null
41
+++ b/include/hw/intc/exynos4210_gic.h
42
@@ -XXX,XX +XXX,XX @@
43
+/*
44
+ * Samsung exynos4210 GIC implementation. Based on hw/arm_gic.c
45
+ *
46
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
47
+ * All rights reserved.
48
+ *
49
+ * Evgeny Voevodin <e.voevodin@samsung.com>
50
+ *
51
+ * This program is free software; you can redistribute it and/or modify it
52
+ * under the terms of the GNU General Public License as published by the
53
+ * Free Software Foundation; either version 2 of the License, or (at your
54
+ * option) any later version.
55
+ *
56
+ * This program is distributed in the hope that it will be useful,
57
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
58
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
59
+ * See the GNU General Public License for more details.
60
+ *
61
+ * You should have received a copy of the GNU General Public License along
62
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
63
+ */
64
+#ifndef HW_INTC_EXYNOS4210_GIC_H
65
+#define HW_INTC_EXYNOS4210_GIC_H
66
+
67
+#include "hw/sysbus.h"
68
+
69
+#define TYPE_EXYNOS4210_GIC "exynos4210.gic"
70
+OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210GicState, EXYNOS4210_GIC)
71
+
72
+#define EXYNOS4210_GIC_NCPUS 2
73
+
74
+struct Exynos4210GicState {
75
+ SysBusDevice parent_obj;
76
+
77
+ MemoryRegion cpu_container;
78
+ MemoryRegion dist_container;
79
+ MemoryRegion cpu_alias[EXYNOS4210_GIC_NCPUS];
80
+ MemoryRegion dist_alias[EXYNOS4210_GIC_NCPUS];
81
+ uint32_t num_cpu;
82
+ DeviceState *gic;
83
+};
84
+
85
+#endif
86
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/arm/exynos4210.c
89
+++ b/hw/arm/exynos4210.c
90
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
91
sysbus_create_simple("l2x0", EXYNOS4210_L2X0_BASE_ADDR, NULL);
92
93
/* External GIC */
94
- dev = qdev_new("exynos4210.gic");
95
- qdev_prop_set_uint32(dev, "num-cpu", EXYNOS4210_NCPUS);
96
- busdev = SYS_BUS_DEVICE(dev);
97
- sysbus_realize_and_unref(busdev, &error_fatal);
98
+ qdev_prop_set_uint32(DEVICE(&s->ext_gic), "num-cpu", EXYNOS4210_NCPUS);
99
+ busdev = SYS_BUS_DEVICE(&s->ext_gic);
100
+ sysbus_realize(busdev, &error_fatal);
101
/* Map CPU interface */
102
sysbus_mmio_map(busdev, 0, EXYNOS4210_EXT_GIC_CPU_BASE_ADDR);
103
/* Map Distributer interface */
104
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
105
qdev_get_gpio_in(DEVICE(&s->cpu_irq_orgate[n]), 1));
106
}
107
for (n = 0; n < EXYNOS4210_EXT_GIC_NIRQ; n++) {
108
- s->irqs.ext_gic_irq[n] = qdev_get_gpio_in(dev, n);
109
+ s->irqs.ext_gic_irq[n] = qdev_get_gpio_in(DEVICE(&s->ext_gic), n);
110
}
111
112
/* Internal Interrupt Combiner */
113
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init(Object *obj)
114
}
115
116
object_initialize_child(obj, "a9mpcore", &s->a9mpcore, TYPE_A9MPCORE_PRIV);
117
+ object_initialize_child(obj, "ext-gic", &s->ext_gic, TYPE_EXYNOS4210_GIC);
118
}
119
120
static void exynos4210_class_init(ObjectClass *klass, void *data)
121
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/hw/intc/exynos4210_gic.c
124
+++ b/hw/intc/exynos4210_gic.c
125
@@ -XXX,XX +XXX,XX @@
126
#include "qemu/module.h"
127
#include "hw/irq.h"
128
#include "hw/qdev-properties.h"
129
+#include "hw/intc/exynos4210_gic.h"
130
#include "hw/arm/exynos4210.h"
131
#include "qom/object.h"
132
133
@@ -XXX,XX +XXX,XX @@
134
#define EXYNOS4210_GIC_CPU_REGION_SIZE 0x100
135
#define EXYNOS4210_GIC_DIST_REGION_SIZE 0x1000
136
137
-#define TYPE_EXYNOS4210_GIC "exynos4210.gic"
138
-OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210GicState, EXYNOS4210_GIC)
139
-
23
-
140
-struct Exynos4210GicState {
24
-typedef struct NVICState NVICState;
141
- SysBusDevice parent_obj;
25
-DECLARE_INSTANCE_CHECKER(NVICState, NVIC,
142
-
26
- TYPE_NVIC)
143
- MemoryRegion cpu_container;
27
+OBJECT_DECLARE_SIMPLE_TYPE(NVICState, NVIC)
144
- MemoryRegion dist_container;
28
145
- MemoryRegion cpu_alias[EXYNOS4210_NCPUS];
29
/* Highest permitted number of exceptions (architectural limit) */
146
- MemoryRegion dist_alias[EXYNOS4210_NCPUS];
30
#define NVIC_MAX_VECTORS 512
147
- uint32_t num_cpu;
148
- DeviceState *gic;
149
-};
150
-
151
static void exynos4210_gic_set_irq(void *opaque, int irq, int level)
152
{
153
Exynos4210GicState *s = (Exynos4210GicState *)opaque;
154
@@ -XXX,XX +XXX,XX @@ static void exynos4210_gic_realize(DeviceState *dev, Error **errp)
155
* enough room for the cpu numbers. gcc 9.2.1 on 32-bit x86
156
* doesn't figure this out, otherwise and gives spurious warnings.
157
*/
158
- assert(n <= EXYNOS4210_NCPUS);
159
+ assert(n <= EXYNOS4210_GIC_NCPUS);
160
for (i = 0; i < n; i++) {
161
/* Map CPU interface per SMP Core */
162
sprintf(cpu_alias_name, "%s%x", cpu_prefix, i);
163
diff --git a/MAINTAINERS b/MAINTAINERS
164
index XXXXXXX..XXXXXXX 100644
165
--- a/MAINTAINERS
166
+++ b/MAINTAINERS
167
@@ -XXX,XX +XXX,XX @@ M: Peter Maydell <peter.maydell@linaro.org>
168
L: qemu-arm@nongnu.org
169
S: Odd Fixes
170
F: hw/*/exynos*
171
-F: include/hw/arm/exynos4210.h
172
+F: include/hw/*/exynos*
173
174
Calxeda Highbank
175
M: Rob Herring <robh@kernel.org>
176
--
31
--
177
2.25.1
32
2.34.1
33
34
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Connect the 4 TTC timers on the ZynqMP.
3
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
4
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-id: 20230206223502.25122-3-philmd@linaro.org
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
9
Message-id: 20220331222017.2914409-3-edgar.iglesias@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
8
---
12
include/hw/arm/xlnx-zynqmp.h | 4 ++++
9
target/arm/m_helper.c | 11 ++++++++---
13
hw/arm/xlnx-zynqmp.c | 22 ++++++++++++++++++++++
10
1 file changed, 8 insertions(+), 3 deletions(-)
14
2 files changed, 26 insertions(+)
15
11
16
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
12
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
17
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/xlnx-zynqmp.h
14
--- a/target/arm/m_helper.c
19
+++ b/include/hw/arm/xlnx-zynqmp.h
15
+++ b/target/arm/m_helper.c
20
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
21
#include "hw/or-irq.h"
17
return 0;
22
#include "hw/misc/xlnx-zynqmp-apu-ctrl.h"
23
#include "hw/misc/xlnx-zynqmp-crf.h"
24
+#include "hw/timer/cadence_ttc.h"
25
26
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
27
OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
28
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
29
#define XLNX_ZYNQMP_MAX_RAM_SIZE (XLNX_ZYNQMP_MAX_LOW_RAM_SIZE + \
30
XLNX_ZYNQMP_MAX_HIGH_RAM_SIZE)
31
32
+#define XLNX_ZYNQMP_NUM_TTC 4
33
+
34
/*
35
* Unimplemented mmio regions needed to boot some images.
36
*/
37
@@ -XXX,XX +XXX,XX @@ struct XlnxZynqMPState {
38
qemu_or_irq qspi_irq_orgate;
39
XlnxZynqMPAPUCtrl apu_ctrl;
40
XlnxZynqMPCRF crf;
41
+ CadenceTTCState ttc[XLNX_ZYNQMP_NUM_TTC];
42
43
char *boot_cpu;
44
ARMCPU *boot_cpu_ptr;
45
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/hw/arm/xlnx-zynqmp.c
48
+++ b/hw/arm/xlnx-zynqmp.c
49
@@ -XXX,XX +XXX,XX @@
50
#define APU_ADDR 0xfd5c0000
51
#define APU_IRQ 153
52
53
+#define TTC0_ADDR 0xFF110000
54
+#define TTC0_IRQ 36
55
+
56
#define IPI_ADDR 0xFF300000
57
#define IPI_IRQ 64
58
59
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_crf(XlnxZynqMPState *s, qemu_irq *gic)
60
sysbus_connect_irq(sbd, 0, gic[CRF_IRQ]);
61
}
18
}
62
19
63
+static void xlnx_zynqmp_create_ttc(XlnxZynqMPState *s, qemu_irq *gic)
20
-#else
21
+ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
64
+{
22
+{
65
+ SysBusDevice *sbd;
23
+ return ARMMMUIdx_MUser;
66
+ int i, irq;
67
+
68
+ for (i = 0; i < XLNX_ZYNQMP_NUM_TTC; i++) {
69
+ object_initialize_child(OBJECT(s), "ttc[*]", &s->ttc[i],
70
+ TYPE_CADENCE_TTC);
71
+ sbd = SYS_BUS_DEVICE(&s->ttc[i]);
72
+
73
+ sysbus_realize(sbd, &error_fatal);
74
+ sysbus_mmio_map(sbd, 0, TTC0_ADDR + i * 0x10000);
75
+ for (irq = 0; irq < 3; irq++) {
76
+ sysbus_connect_irq(sbd, irq, gic[TTC0_IRQ + i * 3 + irq]);
77
+ }
78
+ }
79
+}
24
+}
80
+
25
+
81
static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
26
+#else /* !CONFIG_USER_ONLY */
27
28
/*
29
* What kind of stack write are we doing? This affects how exceptions
30
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
31
return tt_resp;
32
}
33
34
-#endif /* !CONFIG_USER_ONLY */
35
-
36
ARMMMUIdx arm_v7m_mmu_idx_all(CPUARMState *env,
37
bool secstate, bool priv, bool negpri)
82
{
38
{
83
static const struct UnimpInfo {
39
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
84
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
40
85
xlnx_zynqmp_create_efuse(s, gic_spi);
41
return arm_v7m_mmu_idx_for_secstate_and_priv(env, secstate, priv);
86
xlnx_zynqmp_create_apu_ctrl(s, gic_spi);
42
}
87
xlnx_zynqmp_create_crf(s, gic_spi);
43
+
88
+ xlnx_zynqmp_create_ttc(s, gic_spi);
44
+#endif /* !CONFIG_USER_ONLY */
89
xlnx_zynqmp_create_unimp_mmio(s);
90
91
for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA_CH; i++) {
92
--
45
--
93
2.25.1
46
2.34.1
47
48
diff view generated by jsdifflib
1
Now we have removed the only use of TYPE_EXYNOS4210_IRQ_GATE we can
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
delete the device entirely.
3
2
3
arm_v7m_mmu_idx_all() and arm_v7m_mmu_idx_for_secstate_and_priv()
4
are only used for system emulation in m_helper.c.
5
Move the definitions to avoid prototype forward declarations.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230206223502.25122-4-philmd@linaro.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
6
Message-id: 20220404154658.565020-3-peter.maydell@linaro.org
7
---
11
---
8
hw/intc/exynos4210_gic.c | 107 ---------------------------------------
12
target/arm/internals.h | 14 --------
9
1 file changed, 107 deletions(-)
13
target/arm/m_helper.c | 74 +++++++++++++++++++++---------------------
14
2 files changed, 37 insertions(+), 51 deletions(-)
10
15
11
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
16
diff --git a/target/arm/internals.h b/target/arm/internals.h
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/intc/exynos4210_gic.c
18
--- a/target/arm/internals.h
14
+++ b/hw/intc/exynos4210_gic.c
19
+++ b/target/arm/internals.h
15
@@ -XXX,XX +XXX,XX @@ static void exynos4210_gic_register_types(void)
20
@@ -XXX,XX +XXX,XX @@ static inline ARMMMUIdx core_to_aa64_mmu_idx(int mmu_idx)
21
22
int arm_mmu_idx_to_el(ARMMMUIdx mmu_idx);
23
24
-/*
25
- * Return the MMU index for a v7M CPU with all relevant information
26
- * manually specified.
27
- */
28
-ARMMMUIdx arm_v7m_mmu_idx_all(CPUARMState *env,
29
- bool secstate, bool priv, bool negpri);
30
-
31
-/*
32
- * Return the MMU index for a v7M CPU in the specified security and
33
- * privilege state.
34
- */
35
-ARMMMUIdx arm_v7m_mmu_idx_for_secstate_and_priv(CPUARMState *env,
36
- bool secstate, bool priv);
37
-
38
/* Return the MMU index for a v7M CPU in the specified security state */
39
ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate);
40
41
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/m_helper.c
44
+++ b/target/arm/m_helper.c
45
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
46
47
#else /* !CONFIG_USER_ONLY */
48
49
+static ARMMMUIdx arm_v7m_mmu_idx_all(CPUARMState *env,
50
+ bool secstate, bool priv, bool negpri)
51
+{
52
+ ARMMMUIdx mmu_idx = ARM_MMU_IDX_M;
53
+
54
+ if (priv) {
55
+ mmu_idx |= ARM_MMU_IDX_M_PRIV;
56
+ }
57
+
58
+ if (negpri) {
59
+ mmu_idx |= ARM_MMU_IDX_M_NEGPRI;
60
+ }
61
+
62
+ if (secstate) {
63
+ mmu_idx |= ARM_MMU_IDX_M_S;
64
+ }
65
+
66
+ return mmu_idx;
67
+}
68
+
69
+static ARMMMUIdx arm_v7m_mmu_idx_for_secstate_and_priv(CPUARMState *env,
70
+ bool secstate, bool priv)
71
+{
72
+ bool negpri = armv7m_nvic_neg_prio_requested(env->nvic, secstate);
73
+
74
+ return arm_v7m_mmu_idx_all(env, secstate, priv, negpri);
75
+}
76
+
77
+/* Return the MMU index for a v7M CPU in the specified security state */
78
+ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
79
+{
80
+ bool priv = arm_v7m_is_handler_mode(env) ||
81
+ !(env->v7m.control[secstate] & 1);
82
+
83
+ return arm_v7m_mmu_idx_for_secstate_and_priv(env, secstate, priv);
84
+}
85
+
86
/*
87
* What kind of stack write are we doing? This affects how exceptions
88
* generated during the stacking are treated.
89
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
90
return tt_resp;
16
}
91
}
17
92
18
type_init(exynos4210_gic_register_types)
93
-ARMMMUIdx arm_v7m_mmu_idx_all(CPUARMState *env,
94
- bool secstate, bool priv, bool negpri)
95
-{
96
- ARMMMUIdx mmu_idx = ARM_MMU_IDX_M;
19
-
97
-
20
-/* IRQ OR Gate struct.
98
- if (priv) {
21
- *
99
- mmu_idx |= ARM_MMU_IDX_M_PRIV;
22
- * This device models an OR gate. There are n_in input qdev gpio lines and one
23
- * output sysbus IRQ line. The output IRQ level is formed as OR between all
24
- * gpio inputs.
25
- */
26
-
27
-#define TYPE_EXYNOS4210_IRQ_GATE "exynos4210.irq_gate"
28
-OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210IRQGateState, EXYNOS4210_IRQ_GATE)
29
-
30
-struct Exynos4210IRQGateState {
31
- SysBusDevice parent_obj;
32
-
33
- uint32_t n_in; /* inputs amount */
34
- uint32_t *level; /* input levels */
35
- qemu_irq out; /* output IRQ */
36
-};
37
-
38
-static Property exynos4210_irq_gate_properties[] = {
39
- DEFINE_PROP_UINT32("n_in", Exynos4210IRQGateState, n_in, 1),
40
- DEFINE_PROP_END_OF_LIST(),
41
-};
42
-
43
-static const VMStateDescription vmstate_exynos4210_irq_gate = {
44
- .name = "exynos4210.irq_gate",
45
- .version_id = 2,
46
- .minimum_version_id = 2,
47
- .fields = (VMStateField[]) {
48
- VMSTATE_VBUFFER_UINT32(level, Exynos4210IRQGateState, 1, NULL, n_in),
49
- VMSTATE_END_OF_LIST()
50
- }
51
-};
52
-
53
-/* Process a change in IRQ input. */
54
-static void exynos4210_irq_gate_handler(void *opaque, int irq, int level)
55
-{
56
- Exynos4210IRQGateState *s = (Exynos4210IRQGateState *)opaque;
57
- uint32_t i;
58
-
59
- assert(irq < s->n_in);
60
-
61
- s->level[irq] = level;
62
-
63
- for (i = 0; i < s->n_in; i++) {
64
- if (s->level[i] >= 1) {
65
- qemu_irq_raise(s->out);
66
- return;
67
- }
68
- }
100
- }
69
-
101
-
70
- qemu_irq_lower(s->out);
102
- if (negpri) {
103
- mmu_idx |= ARM_MMU_IDX_M_NEGPRI;
104
- }
105
-
106
- if (secstate) {
107
- mmu_idx |= ARM_MMU_IDX_M_S;
108
- }
109
-
110
- return mmu_idx;
71
-}
111
-}
72
-
112
-
73
-static void exynos4210_irq_gate_reset(DeviceState *d)
113
-ARMMMUIdx arm_v7m_mmu_idx_for_secstate_and_priv(CPUARMState *env,
114
- bool secstate, bool priv)
74
-{
115
-{
75
- Exynos4210IRQGateState *s = EXYNOS4210_IRQ_GATE(d);
116
- bool negpri = armv7m_nvic_neg_prio_requested(env->nvic, secstate);
76
-
117
-
77
- memset(s->level, 0, s->n_in * sizeof(*s->level));
118
- return arm_v7m_mmu_idx_all(env, secstate, priv, negpri);
78
-}
119
-}
79
-
120
-
80
-/*
121
-/* Return the MMU index for a v7M CPU in the specified security state */
81
- * IRQ Gate initialization.
122
-ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
82
- */
83
-static void exynos4210_irq_gate_init(Object *obj)
84
-{
123
-{
85
- Exynos4210IRQGateState *s = EXYNOS4210_IRQ_GATE(obj);
124
- bool priv = arm_v7m_is_handler_mode(env) ||
86
- SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
125
- !(env->v7m.control[secstate] & 1);
87
-
126
-
88
- sysbus_init_irq(sbd, &s->out);
127
- return arm_v7m_mmu_idx_for_secstate_and_priv(env, secstate, priv);
89
-}
128
-}
90
-
129
-
91
-static void exynos4210_irq_gate_realize(DeviceState *dev, Error **errp)
130
#endif /* !CONFIG_USER_ONLY */
92
-{
93
- Exynos4210IRQGateState *s = EXYNOS4210_IRQ_GATE(dev);
94
-
95
- /* Allocate general purpose input signals and connect a handler to each of
96
- * them */
97
- qdev_init_gpio_in(dev, exynos4210_irq_gate_handler, s->n_in);
98
-
99
- s->level = g_malloc0(s->n_in * sizeof(*s->level));
100
-}
101
-
102
-static void exynos4210_irq_gate_class_init(ObjectClass *klass, void *data)
103
-{
104
- DeviceClass *dc = DEVICE_CLASS(klass);
105
-
106
- dc->reset = exynos4210_irq_gate_reset;
107
- dc->vmsd = &vmstate_exynos4210_irq_gate;
108
- device_class_set_props(dc, exynos4210_irq_gate_properties);
109
- dc->realize = exynos4210_irq_gate_realize;
110
-}
111
-
112
-static const TypeInfo exynos4210_irq_gate_info = {
113
- .name = TYPE_EXYNOS4210_IRQ_GATE,
114
- .parent = TYPE_SYS_BUS_DEVICE,
115
- .instance_size = sizeof(Exynos4210IRQGateState),
116
- .instance_init = exynos4210_irq_gate_init,
117
- .class_init = exynos4210_irq_gate_class_init,
118
-};
119
-
120
-static void exynos4210_irq_gate_register_types(void)
121
-{
122
- type_register_static(&exynos4210_irq_gate_info);
123
-}
124
-
125
-type_init(exynos4210_irq_gate_register_types)
126
--
131
--
127
2.25.1
132
2.34.1
133
134
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Add the Cortex-R5Fs of the Versal RPU (Real-time Processing Unit)
3
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
subsystem.
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
5
Message-id: 20230206223502.25122-5-philmd@linaro.org
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
7
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
8
Message-id: 20220406174303.2022038-3-edgar.iglesias@xilinx.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
7
---
11
include/hw/arm/xlnx-versal.h | 10 ++++++++++
8
target/arm/helper.c | 12 ++++++++++--
12
hw/arm/xlnx-versal-virt.c | 6 +++---
9
1 file changed, 10 insertions(+), 2 deletions(-)
13
hw/arm/xlnx-versal.c | 36 ++++++++++++++++++++++++++++++++++++
14
3 files changed, 49 insertions(+), 3 deletions(-)
15
10
16
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
11
diff --git a/target/arm/helper.c b/target/arm/helper.c
17
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/xlnx-versal.h
13
--- a/target/arm/helper.c
19
+++ b/include/hw/arm/xlnx-versal.h
14
+++ b/target/arm/helper.c
20
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@ static void define_pmu_regs(ARMCPU *cpu)
21
OBJECT_DECLARE_SIMPLE_TYPE(Versal, XLNX_VERSAL)
22
23
#define XLNX_VERSAL_NR_ACPUS 2
24
+#define XLNX_VERSAL_NR_RCPUS 2
25
#define XLNX_VERSAL_NR_UARTS 2
26
#define XLNX_VERSAL_NR_GEMS 2
27
#define XLNX_VERSAL_NR_ADMAS 8
28
@@ -XXX,XX +XXX,XX @@ struct Versal {
29
VersalUsb2 usb;
30
} iou;
31
32
+ /* Real-time Processing Unit. */
33
+ struct {
34
+ MemoryRegion mr;
35
+ MemoryRegion mr_ps_alias;
36
+
37
+ CPUClusterState cluster;
38
+ ARMCPU cpu[XLNX_VERSAL_NR_RCPUS];
39
+ } rpu;
40
+
41
struct {
42
qemu_or_irq irq_orgate;
43
XlnxXramCtrl ctrl[XLNX_VERSAL_NR_XRAM];
44
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/arm/xlnx-versal-virt.c
47
+++ b/hw/arm/xlnx-versal-virt.c
48
@@ -XXX,XX +XXX,XX @@ static void versal_virt_machine_class_init(ObjectClass *oc, void *data)
49
50
mc->desc = "Xilinx Versal Virtual development board";
51
mc->init = versal_virt_init;
52
- mc->min_cpus = XLNX_VERSAL_NR_ACPUS;
53
- mc->max_cpus = XLNX_VERSAL_NR_ACPUS;
54
- mc->default_cpus = XLNX_VERSAL_NR_ACPUS;
55
+ mc->min_cpus = XLNX_VERSAL_NR_ACPUS + XLNX_VERSAL_NR_RCPUS;
56
+ mc->max_cpus = XLNX_VERSAL_NR_ACPUS + XLNX_VERSAL_NR_RCPUS;
57
+ mc->default_cpus = XLNX_VERSAL_NR_ACPUS + XLNX_VERSAL_NR_RCPUS;
58
mc->no_cdrom = true;
59
mc->default_ram_id = "ddr";
60
}
61
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/hw/arm/xlnx-versal.c
64
+++ b/hw/arm/xlnx-versal.c
65
@@ -XXX,XX +XXX,XX @@
66
#include "hw/sysbus.h"
67
68
#define XLNX_VERSAL_ACPU_TYPE ARM_CPU_TYPE_NAME("cortex-a72")
69
+#define XLNX_VERSAL_RCPU_TYPE ARM_CPU_TYPE_NAME("cortex-r5f")
70
#define GEM_REVISION 0x40070106
71
72
#define VERSAL_NUM_PMC_APB_IRQS 3
73
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_gic(Versal *s, qemu_irq *pic)
74
}
16
}
75
}
17
}
76
18
77
+static void versal_create_rpu_cpus(Versal *s)
19
+#ifndef CONFIG_USER_ONLY
78
+{
20
/*
79
+ int i;
21
* We don't know until after realize whether there's a GICv3
80
+
22
* attached, and that is what registers the gicv3 sysregs.
81
+ object_initialize_child(OBJECT(s), "rpu-cluster", &s->lpd.rpu.cluster,
23
@@ -XXX,XX +XXX,XX @@ static uint64_t id_pfr1_read(CPUARMState *env, const ARMCPRegInfo *ri)
82
+ TYPE_CPU_CLUSTER);
24
return pfr1;
83
+ qdev_prop_set_uint32(DEVICE(&s->lpd.rpu.cluster), "cluster-id", 1);
25
}
84
+
26
85
+ for (i = 0; i < ARRAY_SIZE(s->lpd.rpu.cpu); i++) {
27
-#ifndef CONFIG_USER_ONLY
86
+ Object *obj;
28
static uint64_t id_aa64pfr0_read(CPUARMState *env, const ARMCPRegInfo *ri)
87
+
88
+ object_initialize_child(OBJECT(&s->lpd.rpu.cluster),
89
+ "rpu-cpu[*]", &s->lpd.rpu.cpu[i],
90
+ XLNX_VERSAL_RCPU_TYPE);
91
+ obj = OBJECT(&s->lpd.rpu.cpu[i]);
92
+ object_property_set_bool(obj, "start-powered-off", true,
93
+ &error_abort);
94
+
95
+ object_property_set_int(obj, "mp-affinity", 0x100 | i, &error_abort);
96
+ object_property_set_int(obj, "core-count", ARRAY_SIZE(s->lpd.rpu.cpu),
97
+ &error_abort);
98
+ object_property_set_link(obj, "memory", OBJECT(&s->lpd.rpu.mr),
99
+ &error_abort);
100
+ qdev_realize(DEVICE(obj), NULL, &error_fatal);
101
+ }
102
+
103
+ qdev_realize(DEVICE(&s->lpd.rpu.cluster), NULL, &error_fatal);
104
+}
105
+
106
static void versal_create_uarts(Versal *s, qemu_irq *pic)
107
{
29
{
108
int i;
30
ARMCPU *cpu = env_archcpu(env);
109
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
31
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
110
32
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 1,
111
versal_create_apu_cpus(s);
33
.access = PL1_R, .type = ARM_CP_NO_RAW,
112
versal_create_apu_gic(s, pic);
34
.accessfn = access_aa32_tid3,
113
+ versal_create_rpu_cpus(s);
35
+#ifdef CONFIG_USER_ONLY
114
versal_create_uarts(s, pic);
36
+ .type = ARM_CP_CONST,
115
versal_create_usbs(s, pic);
37
+ .resetvalue = cpu->isar.id_pfr1,
116
versal_create_gems(s, pic);
38
+#else
117
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
39
+ .type = ARM_CP_NO_RAW,
118
40
+ .accessfn = access_aa32_tid3,
119
memory_region_add_subregion_overlap(&s->mr_ps, MM_OCM, &s->lpd.mr_ocm, 0);
41
.readfn = id_pfr1_read,
120
memory_region_add_subregion_overlap(&s->fpd.apu.mr, 0, &s->mr_ps, 0);
42
- .writefn = arm_cp_write_ignore },
121
+ memory_region_add_subregion_overlap(&s->lpd.rpu.mr, 0,
43
+ .writefn = arm_cp_write_ignore
122
+ &s->lpd.rpu.mr_ps_alias, 0);
44
+#endif
123
}
45
+ },
124
46
{ .name = "ID_DFR0", .state = ARM_CP_STATE_BOTH,
125
static void versal_init(Object *obj)
47
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 2,
126
@@ -XXX,XX +XXX,XX @@ static void versal_init(Object *obj)
48
.access = PL1_R, .type = ARM_CP_CONST,
127
Versal *s = XLNX_VERSAL(obj);
128
129
memory_region_init(&s->fpd.apu.mr, obj, "mr-apu", UINT64_MAX);
130
+ memory_region_init(&s->lpd.rpu.mr, obj, "mr-rpu", UINT64_MAX);
131
memory_region_init(&s->mr_ps, obj, "mr-ps-switch", UINT64_MAX);
132
+ memory_region_init_alias(&s->lpd.rpu.mr_ps_alias, OBJECT(s),
133
+ "mr-rpu-ps-alias", &s->mr_ps, 0, UINT64_MAX);
134
}
135
136
static Property versal_properties[] = {
137
--
49
--
138
2.25.1
50
2.34.1
51
52
diff view generated by jsdifflib
1
From: Hao Wu <wuhaotsh@google.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
This patch uses the defined fields to describe PWRON STRAPs for
3
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
4
better readability.
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Hao Wu <wuhaotsh@google.com>
6
Message-id: 20230206223502.25122-6-philmd@linaro.org
7
Reviewed-by: Patrick Venture <venture@google.com>
8
Message-id: 20220411165842.3912945-3-wuhaotsh@google.com
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
8
---
12
hw/arm/npcm7xx_boards.c | 24 +++++++++++++++++++-----
9
linux-user/user-internals.h | 2 +-
13
1 file changed, 19 insertions(+), 5 deletions(-)
10
target/arm/cpu.h | 2 +-
11
linux-user/arm/cpu_loop.c | 4 ++--
12
3 files changed, 4 insertions(+), 4 deletions(-)
14
13
15
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
14
diff --git a/linux-user/user-internals.h b/linux-user/user-internals.h
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/npcm7xx_boards.c
16
--- a/linux-user/user-internals.h
18
+++ b/hw/arm/npcm7xx_boards.c
17
+++ b/linux-user/user-internals.h
19
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ void print_termios(void *arg);
20
#include "sysemu/sysemu.h"
19
#ifdef TARGET_ARM
21
#include "sysemu/block-backend.h"
20
static inline int regpairs_aligned(CPUArchState *cpu_env, int num)
22
21
{
23
-#define NPCM750_EVB_POWER_ON_STRAPS 0x00001ff7
22
- return cpu_env->eabi == 1;
24
-#define QUANTA_GSJ_POWER_ON_STRAPS 0x00001fff
23
+ return cpu_env->eabi;
25
-#define QUANTA_GBS_POWER_ON_STRAPS 0x000017ff
24
}
26
-#define KUDO_BMC_POWER_ON_STRAPS 0x00001fff
25
#elif defined(TARGET_MIPS) && defined(TARGET_ABI_MIPSO32)
27
-#define MORI_BMC_POWER_ON_STRAPS 0x00001fff
26
static inline int regpairs_aligned(CPUArchState *cpu_env, int num) { return 1; }
28
+#define NPCM7XX_POWER_ON_STRAPS_DEFAULT ( \
27
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
29
+ NPCM7XX_PWRON_STRAP_SPI0F18 | \
28
index XXXXXXX..XXXXXXX 100644
30
+ NPCM7XX_PWRON_STRAP_SFAB | \
29
--- a/target/arm/cpu.h
31
+ NPCM7XX_PWRON_STRAP_BSPA | \
30
+++ b/target/arm/cpu.h
32
+ NPCM7XX_PWRON_STRAP_FUP(FUP_NORM_UART2) | \
31
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
33
+ NPCM7XX_PWRON_STRAP_SECEN | \
32
34
+ NPCM7XX_PWRON_STRAP_HIZ | \
33
#if defined(CONFIG_USER_ONLY)
35
+ NPCM7XX_PWRON_STRAP_ECC | \
34
/* For usermode syscall translation. */
36
+ NPCM7XX_PWRON_STRAP_RESERVE1 | \
35
- int eabi;
37
+ NPCM7XX_PWRON_STRAP_J2EN | \
36
+ bool eabi;
38
+ NPCM7XX_PWRON_STRAP_CKFRQ(CKFRQ_DEFAULT))
37
#endif
39
+
38
40
+#define NPCM750_EVB_POWER_ON_STRAPS ( \
39
struct CPUBreakpoint *cpu_breakpoint[16];
41
+ NPCM7XX_POWER_ON_STRAPS_DEFAULT & ~NPCM7XX_PWRON_STRAP_J2EN)
40
diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c
42
+#define QUANTA_GSJ_POWER_ON_STRAPS NPCM7XX_POWER_ON_STRAPS_DEFAULT
41
index XXXXXXX..XXXXXXX 100644
43
+#define QUANTA_GBS_POWER_ON_STRAPS ( \
42
--- a/linux-user/arm/cpu_loop.c
44
+ NPCM7XX_POWER_ON_STRAPS_DEFAULT & ~NPCM7XX_PWRON_STRAP_SFAB)
43
+++ b/linux-user/arm/cpu_loop.c
45
+#define KUDO_BMC_POWER_ON_STRAPS NPCM7XX_POWER_ON_STRAPS_DEFAULT
44
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
46
+#define MORI_BMC_POWER_ON_STRAPS NPCM7XX_POWER_ON_STRAPS_DEFAULT
45
break;
47
46
case EXCP_SWI:
48
static const char npcm7xx_default_bootrom[] = "npcm7xx_bootrom.bin";
47
{
48
- env->eabi = 1;
49
+ env->eabi = true;
50
/* system call */
51
if (env->thumb) {
52
/* Thumb is always EABI style with syscall number in r7 */
53
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
54
* > 0xfffff and are handled below as out-of-range.
55
*/
56
n ^= ARM_SYSCALL_BASE;
57
- env->eabi = 0;
58
+ env->eabi = false;
59
}
60
}
49
61
50
--
62
--
51
2.25.1
63
2.34.1
64
65
diff view generated by jsdifflib
1
The only time we use the int_combiner_irq[] and ext_combiner_irq[]
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
arrays in the Exynos4210Irq struct is during realize of the SoC -- we
3
initialize them with the input IRQs of the combiner devices, and then
4
connect those to outputs of other devices in
5
exynos4210_init_board_irqs(). Now that the combiner objects are
6
easily accessible as s->int_combiner and s->ext_combiner we can make
7
the connections directly from one device to the other without going
8
via these arrays.
9
2
10
Since these are the only two remaining elements of Exynos4210Irq,
3
Although the 'eabi' field is only used in user emulation where
11
we can remove that struct entirely.
4
CPU reset doesn't occur, it doesn't belong to the area to reset.
5
Move it after the 'end_reset_fields' for consistency.
12
6
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Message-id: 20230206223502.25122-7-philmd@linaro.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20220404154658.565020-19-peter.maydell@linaro.org
16
---
11
---
17
include/hw/arm/exynos4210.h | 6 ------
12
target/arm/cpu.h | 9 ++++-----
18
hw/arm/exynos4210.c | 34 ++++++++--------------------------
13
1 file changed, 4 insertions(+), 5 deletions(-)
19
2 files changed, 8 insertions(+), 32 deletions(-)
20
14
21
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
22
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/arm/exynos4210.h
17
--- a/target/arm/cpu.h
24
+++ b/include/hw/arm/exynos4210.h
18
+++ b/target/arm/cpu.h
25
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
26
*/
20
ARMVectorReg zarray[ARM_MAX_VQ * 16];
27
#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 38)
21
#endif
28
22
29
-typedef struct Exynos4210Irq {
23
-#if defined(CONFIG_USER_ONLY)
30
- qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
24
- /* For usermode syscall translation. */
31
- qemu_irq ext_combiner_irq[EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ];
25
- bool eabi;
32
-} Exynos4210Irq;
26
-#endif
33
-
27
-
34
struct Exynos4210State {
28
struct CPUBreakpoint *cpu_breakpoint[16];
35
/*< private >*/
29
struct CPUWatchpoint *cpu_watchpoint[16];
36
SysBusDevice parent_obj;
30
37
/*< public >*/
31
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
38
ARMCPU *cpu[EXYNOS4210_NCPUS];
32
const struct arm_boot_info *boot_info;
39
- Exynos4210Irq irqs;
33
/* Store GICv3CPUState to access from this struct */
40
qemu_irq irq_table[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
34
void *gicv3state;
41
35
+#if defined(CONFIG_USER_ONLY)
42
MemoryRegion chipid_mem;
36
+ /* For usermode syscall translation. */
43
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
37
+ bool eabi;
44
index XXXXXXX..XXXXXXX 100644
38
+#endif /* CONFIG_USER_ONLY */
45
--- a/hw/arm/exynos4210.c
39
46
+++ b/hw/arm/exynos4210.c
40
#ifdef TARGET_TAGGED_ADDRESSES
47
@@ -XXX,XX +XXX,XX @@ static int mapline_size(const int *mapline)
41
/* Linux syscall tagged address support */
48
static void exynos4210_init_board_irqs(Exynos4210State *s)
49
{
50
uint32_t grp, bit, irq_id, n;
51
- Exynos4210Irq *is = &s->irqs;
52
DeviceState *extgicdev = DEVICE(&s->ext_gic);
53
+ DeviceState *intcdev = DEVICE(&s->int_combiner);
54
+ DeviceState *extcdev = DEVICE(&s->ext_combiner);
55
int splitcount = 0;
56
DeviceState *splitter;
57
const int *mapline;
58
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
59
splitin = 0;
60
for (;;) {
61
s->irq_table[in] = qdev_get_gpio_in(splitter, 0);
62
- qdev_connect_gpio_out(splitter, splitin, is->int_combiner_irq[in]);
63
- qdev_connect_gpio_out(splitter, splitin + 1, is->ext_combiner_irq[in]);
64
+ qdev_connect_gpio_out(splitter, splitin,
65
+ qdev_get_gpio_in(intcdev, in));
66
+ qdev_connect_gpio_out(splitter, splitin + 1,
67
+ qdev_get_gpio_in(extcdev, in));
68
splitin += 2;
69
if (!mapline) {
70
break;
71
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
72
qdev_realize(splitter, NULL, &error_abort);
73
splitcount++;
74
s->irq_table[n] = qdev_get_gpio_in(splitter, 0);
75
- qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
76
+ qdev_connect_gpio_out(splitter, 0, qdev_get_gpio_in(intcdev, n));
77
qdev_connect_gpio_out(splitter, 1,
78
qdev_get_gpio_in(extgicdev, irq_id - 32));
79
} else {
80
- s->irq_table[n] = is->int_combiner_irq[n];
81
+ s->irq_table[n] = qdev_get_gpio_in(intcdev, n);
82
}
83
}
84
/*
85
@@ -XXX,XX +XXX,XX @@ uint32_t exynos4210_get_irq(uint32_t grp, uint32_t bit)
86
return EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit);
87
}
88
89
-/*
90
- * Get Combiner input GPIO into irqs structure
91
- */
92
-static void exynos4210_combiner_get_gpioin(Exynos4210Irq *irqs,
93
- DeviceState *dev, int ext)
94
-{
95
- int n;
96
- int max;
97
- qemu_irq *irq;
98
-
99
- max = ext ? EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ :
100
- EXYNOS4210_MAX_INT_COMBINER_IN_IRQ;
101
- irq = ext ? irqs->ext_combiner_irq : irqs->int_combiner_irq;
102
-
103
- for (n = 0; n < max; n++) {
104
- irq[n] = qdev_get_gpio_in(dev, n);
105
- }
106
-}
107
-
108
static uint8_t chipid_and_omr[] = { 0x11, 0x02, 0x21, 0x43,
109
0x09, 0x00, 0x00, 0x00 };
110
111
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
112
sysbus_connect_irq(busdev, n,
113
qdev_get_gpio_in(DEVICE(&s->a9mpcore), n));
114
}
115
- exynos4210_combiner_get_gpioin(&s->irqs, DEVICE(&s->int_combiner), 0);
116
sysbus_mmio_map(busdev, 0, EXYNOS4210_INT_COMBINER_BASE_ADDR);
117
118
/* External Interrupt Combiner */
119
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
120
for (n = 0; n < EXYNOS4210_MAX_INT_COMBINER_OUT_IRQ; n++) {
121
sysbus_connect_irq(busdev, n, qdev_get_gpio_in(DEVICE(&s->ext_gic), n));
122
}
123
- exynos4210_combiner_get_gpioin(&s->irqs, DEVICE(&s->ext_combiner), 1);
124
sysbus_mmio_map(busdev, 0, EXYNOS4210_EXT_COMBINER_BASE_ADDR);
125
126
/* Initialize board IRQs. */
127
--
42
--
128
2.25.1
43
2.34.1
44
45
diff view generated by jsdifflib
1
The combiner_grp_to_gic_id[] array includes the EXT_GIC_ID_MCT_G0
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
and EXT_GIC_ID_MCT_G1 multiple times. This means that we will
3
connect multiple IRQs up to the same external GIC input, which
4
is not permitted. We do the same thing in the code in
5
exynos4210_init_board_irqs() because the conditionals selecting
6
an irq_id in the first loop match multiple interrupt IDs.
7
2
8
Overall we do this for interrupt IDs
3
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
(1, 4), (12, 4), (35, 4), (51, 4), (53, 4) for EXT_GIC_ID_MCT_G0
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
and
5
Message-id: 20230206223502.25122-8-philmd@linaro.org
11
(1, 5), (12, 5), (35, 5), (51, 5), (53, 5) for EXT_GIC_ID_MCT_G1
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/cpu.h | 3 ++-
9
1 file changed, 2 insertions(+), 1 deletion(-)
12
10
13
These correspond to the cases for the multi-core timer that we are
11
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
wiring up to multiple inputs on the combiner in
12
index XXXXXXX..XXXXXXX 100644
15
exynos4210_combiner_get_gpioin(). That code already deals with all
13
--- a/target/arm/cpu.h
16
these interrupt IDs being the same input source, so we don't need to
14
+++ b/target/arm/cpu.h
17
connect the external GIC interrupt for any of them except the first
15
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
18
(1, 4) and (1, 5). Remove the array entries and conditionals which
16
19
were incorrectly causing us to wire up extra lines.
17
void *nvic;
18
const struct arm_boot_info *boot_info;
19
+#if !defined(CONFIG_USER_ONLY)
20
/* Store GICv3CPUState to access from this struct */
21
void *gicv3state;
22
-#if defined(CONFIG_USER_ONLY)
23
+#else /* CONFIG_USER_ONLY */
24
/* For usermode syscall translation. */
25
bool eabi;
26
#endif /* CONFIG_USER_ONLY */
27
--
28
2.34.1
20
29
21
This bug didn't cause any visible effects, because we only connect
22
up a device to the "primary" ID values (1, 4) and (1, 5), so the
23
extra lines would never be set to a level.
24
30
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
27
Message-id: 20220404154658.565020-16-peter.maydell@linaro.org
28
---
29
include/hw/arm/exynos4210.h | 2 +-
30
hw/arm/exynos4210.c | 12 +++++-------
31
2 files changed, 6 insertions(+), 8 deletions(-)
32
33
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
34
index XXXXXXX..XXXXXXX 100644
35
--- a/include/hw/arm/exynos4210.h
36
+++ b/include/hw/arm/exynos4210.h
37
@@ -XXX,XX +XXX,XX @@
38
* one for every non-zero entry in combiner_grp_to_gic_id[].
39
* We'll assert in exynos4210_init_board_irqs() if this is wrong.
40
*/
41
-#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 60)
42
+#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 54)
43
44
typedef struct Exynos4210Irq {
45
qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
46
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/exynos4210.c
49
+++ b/hw/arm/exynos4210.c
50
@@ -XXX,XX +XXX,XX @@ combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
51
/* int combiner group 34 */
52
{ EXT_GIC_ID_ONENAND_AUDI, EXT_GIC_ID_NFC },
53
/* int combiner group 35 */
54
- { 0, 0, 0, EXT_GIC_ID_MCT_L1, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
55
+ { 0, 0, 0, EXT_GIC_ID_MCT_L1 },
56
/* int combiner group 36 */
57
{ EXT_GIC_ID_MIXER },
58
/* int combiner group 37 */
59
@@ -XXX,XX +XXX,XX @@ combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
60
/* groups 38-50 */
61
{ }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { },
62
/* int combiner group 51 */
63
- { EXT_GIC_ID_MCT_L0, 0, 0, 0, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
64
+ { EXT_GIC_ID_MCT_L0 },
65
/* group 52 */
66
{ },
67
/* int combiner group 53 */
68
- { EXT_GIC_ID_WDT, 0, 0, 0, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
69
+ { EXT_GIC_ID_WDT },
70
/* groups 54-63 */
71
{ }, { }, { }, { }, { }, { }, { }, { }, { }, { }
72
};
73
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
74
75
for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
76
irq_id = 0;
77
- if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 4) ||
78
- n == EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 4)) {
79
+ if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 4)) {
80
/* MCT_G0 is passed to External GIC */
81
irq_id = EXT_GIC_ID_MCT_G0;
82
}
83
- if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 5) ||
84
- n == EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 5)) {
85
+ if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 5)) {
86
/* MCT_G1 is passed to External and GIC */
87
irq_id = EXT_GIC_ID_MCT_G1;
88
}
89
--
90
2.25.1
diff view generated by jsdifflib
1
From: Zongyuan Li <zongyuan.li@smartx.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Zongyuan Li <zongyuan.li@smartx.com>
3
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Message-id: 20220324181557.203805-5-zongyuan.li@smartx.com
5
Message-id: 20230206223502.25122-9-philmd@linaro.org
6
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/811
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
7
---
9
include/hw/irq.h | 5 -----
8
target/arm/cpu.h | 2 +-
10
hw/core/irq.c | 15 ---------------
9
1 file changed, 1 insertion(+), 1 deletion(-)
11
2 files changed, 20 deletions(-)
12
10
13
diff --git a/include/hw/irq.h b/include/hw/irq.h
11
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/irq.h
13
--- a/target/arm/cpu.h
16
+++ b/include/hw/irq.h
14
+++ b/target/arm/cpu.h
17
@@ -XXX,XX +XXX,XX @@ void qemu_free_irq(qemu_irq irq);
15
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
18
/* Returns a new IRQ with opposite polarity. */
16
} sau;
19
qemu_irq qemu_irq_invert(qemu_irq irq);
17
20
18
void *nvic;
21
-/* Returns a new IRQ which feeds into both the passed IRQs.
19
- const struct arm_boot_info *boot_info;
22
- * It's probably better to use the TYPE_SPLIT_IRQ device instead.
20
#if !defined(CONFIG_USER_ONLY)
23
- */
21
+ const struct arm_boot_info *boot_info;
24
-qemu_irq qemu_irq_split(qemu_irq irq1, qemu_irq irq2);
22
/* Store GICv3CPUState to access from this struct */
25
-
23
void *gicv3state;
26
/* For internal use in qtest. Similar to qemu_irq_split, but operating
24
#else /* CONFIG_USER_ONLY */
27
on an existing vector of qemu_irq. */
28
void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n);
29
diff --git a/hw/core/irq.c b/hw/core/irq.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/core/irq.c
32
+++ b/hw/core/irq.c
33
@@ -XXX,XX +XXX,XX @@ qemu_irq qemu_irq_invert(qemu_irq irq)
34
return qemu_allocate_irq(qemu_notirq, irq, 0);
35
}
36
37
-static void qemu_splitirq(void *opaque, int line, int level)
38
-{
39
- struct IRQState **irq = opaque;
40
- irq[0]->handler(irq[0]->opaque, irq[0]->n, level);
41
- irq[1]->handler(irq[1]->opaque, irq[1]->n, level);
42
-}
43
-
44
-qemu_irq qemu_irq_split(qemu_irq irq1, qemu_irq irq2)
45
-{
46
- qemu_irq *s = g_new0(qemu_irq, 2);
47
- s[0] = irq1;
48
- s[1] = irq2;
49
- return qemu_allocate_irq(qemu_splitirq, s, 0);
50
-}
51
-
52
void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n)
53
{
54
int i;
55
--
25
--
56
2.25.1
26
2.34.1
27
28
diff view generated by jsdifflib
1
From: Zongyuan Li <zongyuan.li@smartx.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Zongyuan Li <zongyuan.li@smartx.com>
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220324181557.203805-3-zongyuan.li@smartx.com
5
Message-id: 20230206223502.25122-10-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
hw/arm/stellaris.c | 15 +++++++++++++--
8
target/arm/cpu.h | 2 +-
9
1 file changed, 13 insertions(+), 2 deletions(-)
9
1 file changed, 1 insertion(+), 1 deletion(-)
10
10
11
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
11
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/stellaris.c
13
--- a/target/arm/cpu.h
14
+++ b/hw/arm/stellaris.c
14
+++ b/target/arm/cpu.h
15
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
16
16
uint32_t ctrl;
17
#include "qemu/osdep.h"
17
} sau;
18
#include "qapi/error.h"
18
19
+#include "hw/core/split-irq.h"
19
- void *nvic;
20
#include "hw/sysbus.h"
20
#if !defined(CONFIG_USER_ONLY)
21
#include "hw/sd/sd.h"
21
+ void *nvic;
22
#include "hw/ssi/ssi.h"
22
const struct arm_boot_info *boot_info;
23
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
23
/* Store GICv3CPUState to access from this struct */
24
DeviceState *ssddev;
24
void *gicv3state;
25
DriveInfo *dinfo;
26
DeviceState *carddev;
27
+ DeviceState *gpio_d_splitter;
28
BlockBackend *blk;
29
30
/*
31
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
32
&error_fatal);
33
34
ssddev = ssi_create_peripheral(bus, "ssd0323");
35
- gpio_out[GPIO_D][0] = qemu_irq_split(
36
- qdev_get_gpio_in_named(sddev, SSI_GPIO_CS, 0),
37
+
38
+ gpio_d_splitter = qdev_new(TYPE_SPLIT_IRQ);
39
+ qdev_prop_set_uint32(gpio_d_splitter, "num-lines", 2);
40
+ qdev_realize_and_unref(gpio_d_splitter, NULL, &error_fatal);
41
+ qdev_connect_gpio_out(
42
+ gpio_d_splitter, 0,
43
+ qdev_get_gpio_in_named(sddev, SSI_GPIO_CS, 0));
44
+ qdev_connect_gpio_out(
45
+ gpio_d_splitter, 1,
46
qdev_get_gpio_in_named(ssddev, SSI_GPIO_CS, 0));
47
+ gpio_out[GPIO_D][0] = qdev_get_gpio_in(gpio_d_splitter, 0);
48
+
49
gpio_out[GPIO_C][7] = qdev_get_gpio_in(ssddev, 0);
50
51
/* Make sure the select pin is high. */
52
--
25
--
53
2.25.1
26
2.34.1
27
28
diff view generated by jsdifflib
1
Currently for the interrupts MCT_G0 and MCT_G1 which are
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
the only ones in the input range of the external combiner
2
3
and which are also wired to the external GIC, we connect
3
There is no point in using a void pointer to access the NVIC.
4
them only to the internal combiner and the external GIC.
4
Use the real type to avoid casting it while debugging.
5
This seems likely to be a bug, as all other interrupts
5
6
which are in the input range of both combiners are
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
connected to both combiners. (The fact that the code in
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
exynos4210_combiner_get_gpioin() is also trying to wire
8
Message-id: 20230206223502.25122-11-philmd@linaro.org
9
up these inputs on both combiners also suggests this.)
10
11
Wire these interrupts up to both combiners, like the rest.
12
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20220404154658.565020-15-peter.maydell@linaro.org
16
---
10
---
17
hw/arm/exynos4210.c | 7 +++----
11
target/arm/cpu.h | 46 ++++++++++++++++++++++---------------------
18
1 file changed, 3 insertions(+), 4 deletions(-)
12
hw/intc/armv7m_nvic.c | 38 ++++++++++++-----------------------
19
13
target/arm/cpu.c | 1 +
20
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
14
target/arm/m_helper.c | 2 +-
15
4 files changed, 39 insertions(+), 48 deletions(-)
16
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
21
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/exynos4210.c
19
--- a/target/arm/cpu.h
23
+++ b/hw/arm/exynos4210.c
20
+++ b/target/arm/cpu.h
24
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
21
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMTBFlags {
25
22
26
assert(splitcount < EXYNOS4210_NUM_SPLITTERS);
23
typedef struct ARMMMUFaultInfo ARMMMUFaultInfo;
27
splitter = DEVICE(&s->splitter[splitcount]);
24
28
- qdev_prop_set_uint16(splitter, "num-lines", 2);
25
+typedef struct NVICState NVICState;
29
+ qdev_prop_set_uint16(splitter, "num-lines", irq_id ? 3 : 2);
26
+
30
qdev_realize(splitter, NULL, &error_abort);
27
typedef struct CPUArchState {
31
splitcount++;
28
/* Regs for current mode. */
32
s->irq_table[n] = qdev_get_gpio_in(splitter, 0);
29
uint32_t regs[16];
33
qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
30
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
34
+ qdev_connect_gpio_out(splitter, 1, is->ext_combiner_irq[n]);
31
} sau;
35
if (irq_id) {
32
36
- qdev_connect_gpio_out(splitter, 1,
33
#if !defined(CONFIG_USER_ONLY)
37
+ qdev_connect_gpio_out(splitter, 2,
34
- void *nvic;
38
qdev_get_gpio_in(extgicdev, irq_id - 32));
35
+ NVICState *nvic;
39
- } else {
36
const struct arm_boot_info *boot_info;
40
- qdev_connect_gpio_out(splitter, 1, is->ext_combiner_irq[n]);
37
/* Store GICv3CPUState to access from this struct */
41
}
38
void *gicv3state;
39
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
40
41
/* Interface between CPU and Interrupt controller. */
42
#ifndef CONFIG_USER_ONLY
43
-bool armv7m_nvic_can_take_pending_exception(void *opaque);
44
+bool armv7m_nvic_can_take_pending_exception(NVICState *s);
45
#else
46
-static inline bool armv7m_nvic_can_take_pending_exception(void *opaque)
47
+static inline bool armv7m_nvic_can_take_pending_exception(NVICState *s)
48
{
49
return true;
50
}
51
#endif
52
/**
53
* armv7m_nvic_set_pending: mark the specified exception as pending
54
- * @opaque: the NVIC
55
+ * @s: the NVIC
56
* @irq: the exception number to mark pending
57
* @secure: false for non-banked exceptions or for the nonsecure
58
* version of a banked exception, true for the secure version of a banked
59
@@ -XXX,XX +XXX,XX @@ static inline bool armv7m_nvic_can_take_pending_exception(void *opaque)
60
* if @secure is true and @irq does not specify one of the fixed set
61
* of architecturally banked exceptions.
62
*/
63
-void armv7m_nvic_set_pending(void *opaque, int irq, bool secure);
64
+void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure);
65
/**
66
* armv7m_nvic_set_pending_derived: mark this derived exception as pending
67
- * @opaque: the NVIC
68
+ * @s: the NVIC
69
* @irq: the exception number to mark pending
70
* @secure: false for non-banked exceptions or for the nonsecure
71
* version of a banked exception, true for the secure version of a banked
72
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending(void *opaque, int irq, bool secure);
73
* exceptions (exceptions generated in the course of trying to take
74
* a different exception).
75
*/
76
-void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure);
77
+void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure);
78
/**
79
* armv7m_nvic_set_pending_lazyfp: mark this lazy FP exception as pending
80
- * @opaque: the NVIC
81
+ * @s: the NVIC
82
* @irq: the exception number to mark pending
83
* @secure: false for non-banked exceptions or for the nonsecure
84
* version of a banked exception, true for the secure version of a banked
85
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure);
86
* Similar to armv7m_nvic_set_pending(), but specifically for exceptions
87
* generated in the course of lazy stacking of FP registers.
88
*/
89
-void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure);
90
+void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure);
91
/**
92
* armv7m_nvic_get_pending_irq_info: return highest priority pending
93
* exception, and whether it targets Secure state
94
- * @opaque: the NVIC
95
+ * @s: the NVIC
96
* @pirq: set to pending exception number
97
* @ptargets_secure: set to whether pending exception targets Secure
98
*
99
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure);
100
* to true if the current highest priority pending exception should
101
* be taken to Secure state, false for NS.
102
*/
103
-void armv7m_nvic_get_pending_irq_info(void *opaque, int *pirq,
104
+void armv7m_nvic_get_pending_irq_info(NVICState *s, int *pirq,
105
bool *ptargets_secure);
106
/**
107
* armv7m_nvic_acknowledge_irq: make highest priority pending exception active
108
- * @opaque: the NVIC
109
+ * @s: the NVIC
110
*
111
* Move the current highest priority pending exception from the pending
112
* state to the active state, and update v7m.exception to indicate that
113
* it is the exception currently being handled.
114
*/
115
-void armv7m_nvic_acknowledge_irq(void *opaque);
116
+void armv7m_nvic_acknowledge_irq(NVICState *s);
117
/**
118
* armv7m_nvic_complete_irq: complete specified interrupt or exception
119
- * @opaque: the NVIC
120
+ * @s: the NVIC
121
* @irq: the exception number to complete
122
* @secure: true if this exception was secure
123
*
124
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_acknowledge_irq(void *opaque);
125
* 0 if there is still an irq active after this one was completed
126
* (Ignoring -1, this is the same as the RETTOBASE value before completion.)
127
*/
128
-int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure);
129
+int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure);
130
/**
131
* armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
132
- * @opaque: the NVIC
133
+ * @s: the NVIC
134
* @irq: the exception number to mark pending
135
* @secure: false for non-banked exceptions or for the nonsecure
136
* version of a banked exception, true for the secure version of a banked
137
@@ -XXX,XX +XXX,XX @@ int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure);
138
* interrupt the current execution priority. This controls whether the
139
* RDY bit for it in the FPCCR is set.
140
*/
141
-bool armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure);
142
+bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure);
143
/**
144
* armv7m_nvic_raw_execution_priority: return the raw execution priority
145
- * @opaque: the NVIC
146
+ * @s: the NVIC
147
*
148
* Returns: the raw execution priority as defined by the v8M architecture.
149
* This is the execution priority minus the effects of AIRCR.PRIS,
150
* and minus any PRIMASK/FAULTMASK/BASEPRI priority boosting.
151
* (v8M ARM ARM I_PKLD.)
152
*/
153
-int armv7m_nvic_raw_execution_priority(void *opaque);
154
+int armv7m_nvic_raw_execution_priority(NVICState *s);
155
/**
156
* armv7m_nvic_neg_prio_requested: return true if the requested execution
157
* priority is negative for the specified security state.
158
- * @opaque: the NVIC
159
+ * @s: the NVIC
160
* @secure: the security state to test
161
* This corresponds to the pseudocode IsReqExecPriNeg().
162
*/
163
#ifndef CONFIG_USER_ONLY
164
-bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure);
165
+bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure);
166
#else
167
-static inline bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure)
168
+static inline bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
169
{
170
return false;
171
}
172
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
173
index XXXXXXX..XXXXXXX 100644
174
--- a/hw/intc/armv7m_nvic.c
175
+++ b/hw/intc/armv7m_nvic.c
176
@@ -XXX,XX +XXX,XX @@ static inline int nvic_exec_prio(NVICState *s)
177
return MIN(running, s->exception_prio);
178
}
179
180
-bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure)
181
+bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
182
{
183
/* Return true if the requested execution priority is negative
184
* for the specified security state, ie that security state
185
@@ -XXX,XX +XXX,XX @@ bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure)
186
* mean we don't allow FAULTMASK_NS to actually make the execution
187
* priority negative). Compare pseudocode IsReqExcPriNeg().
188
*/
189
- NVICState *s = opaque;
190
-
191
if (s->cpu->env.v7m.faultmask[secure]) {
192
return true;
42
}
193
}
43
for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
194
@@ -XXX,XX +XXX,XX @@ bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure)
195
return false;
196
}
197
198
-bool armv7m_nvic_can_take_pending_exception(void *opaque)
199
+bool armv7m_nvic_can_take_pending_exception(NVICState *s)
200
{
201
- NVICState *s = opaque;
202
-
203
return nvic_exec_prio(s) > nvic_pending_prio(s);
204
}
205
206
-int armv7m_nvic_raw_execution_priority(void *opaque)
207
+int armv7m_nvic_raw_execution_priority(NVICState *s)
208
{
209
- NVICState *s = opaque;
210
-
211
return s->exception_prio;
212
}
213
214
@@ -XXX,XX +XXX,XX @@ static void nvic_irq_update(NVICState *s)
215
* if @secure is true and @irq does not specify one of the fixed set
216
* of architecturally banked exceptions.
217
*/
218
-static void armv7m_nvic_clear_pending(void *opaque, int irq, bool secure)
219
+static void armv7m_nvic_clear_pending(NVICState *s, int irq, bool secure)
220
{
221
- NVICState *s = (NVICState *)opaque;
222
VecInfo *vec;
223
224
assert(irq > ARMV7M_EXCP_RESET && irq < s->num_irq);
225
@@ -XXX,XX +XXX,XX @@ static void do_armv7m_nvic_set_pending(void *opaque, int irq, bool secure,
226
}
227
}
228
229
-void armv7m_nvic_set_pending(void *opaque, int irq, bool secure)
230
+void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure)
231
{
232
- do_armv7m_nvic_set_pending(opaque, irq, secure, false);
233
+ do_armv7m_nvic_set_pending(s, irq, secure, false);
234
}
235
236
-void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure)
237
+void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure)
238
{
239
- do_armv7m_nvic_set_pending(opaque, irq, secure, true);
240
+ do_armv7m_nvic_set_pending(s, irq, secure, true);
241
}
242
243
-void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure)
244
+void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure)
245
{
246
/*
247
* Pend an exception during lazy FP stacking. This differs
248
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure)
249
* whether we should escalate depends on the saved context
250
* in the FPCCR register, not on the current state of the CPU/NVIC.
251
*/
252
- NVICState *s = (NVICState *)opaque;
253
bool banked = exc_is_banked(irq);
254
VecInfo *vec;
255
bool targets_secure;
256
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure)
257
}
258
259
/* Make pending IRQ active. */
260
-void armv7m_nvic_acknowledge_irq(void *opaque)
261
+void armv7m_nvic_acknowledge_irq(NVICState *s)
262
{
263
- NVICState *s = (NVICState *)opaque;
264
CPUARMState *env = &s->cpu->env;
265
const int pending = s->vectpending;
266
const int running = nvic_exec_prio(s);
267
@@ -XXX,XX +XXX,XX @@ static bool vectpending_targets_secure(NVICState *s)
268
exc_targets_secure(s, s->vectpending);
269
}
270
271
-void armv7m_nvic_get_pending_irq_info(void *opaque,
272
+void armv7m_nvic_get_pending_irq_info(NVICState *s,
273
int *pirq, bool *ptargets_secure)
274
{
275
- NVICState *s = (NVICState *)opaque;
276
const int pending = s->vectpending;
277
bool targets_secure;
278
279
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_get_pending_irq_info(void *opaque,
280
*pirq = pending;
281
}
282
283
-int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure)
284
+int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure)
285
{
286
- NVICState *s = (NVICState *)opaque;
287
VecInfo *vec = NULL;
288
int ret = 0;
289
290
@@ -XXX,XX +XXX,XX @@ int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure)
291
return ret;
292
}
293
294
-bool armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
295
+bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure)
296
{
297
/*
298
* Return whether an exception is "ready", i.e. it is enabled and is
299
@@ -XXX,XX +XXX,XX @@ bool armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
300
* for non-banked exceptions secure is always false; for banked exceptions
301
* it indicates which of the exceptions is required.
302
*/
303
- NVICState *s = (NVICState *)opaque;
304
bool banked = exc_is_banked(irq);
305
VecInfo *vec;
306
int running = nvic_exec_prio(s);
307
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
308
index XXXXXXX..XXXXXXX 100644
309
--- a/target/arm/cpu.c
310
+++ b/target/arm/cpu.c
311
@@ -XXX,XX +XXX,XX @@
312
#if !defined(CONFIG_USER_ONLY)
313
#include "hw/loader.h"
314
#include "hw/boards.h"
315
+#include "hw/intc/armv7m_nvic.h"
316
#endif
317
#include "sysemu/tcg.h"
318
#include "sysemu/qtest.h"
319
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
320
index XXXXXXX..XXXXXXX 100644
321
--- a/target/arm/m_helper.c
322
+++ b/target/arm/m_helper.c
323
@@ -XXX,XX +XXX,XX @@ static void v7m_update_fpccr(CPUARMState *env, uint32_t frameptr,
324
* that we will need later in order to do lazy FP reg stacking.
325
*/
326
bool is_secure = env->v7m.secure;
327
- void *nvic = env->nvic;
328
+ NVICState *nvic = env->nvic;
329
/*
330
* Some bits are unbanked and live always in fpccr[M_REG_S]; some bits
331
* are banked and we want to update the bit in the bank for the
44
--
332
--
45
2.25.1
333
2.34.1
334
335
diff view generated by jsdifflib
1
The Exynos4210 SoC device currently uses a custom device
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
"exynos4210.irq_gate" to model the OR gate that feeds each CPU's IRQ
2
3
line. We have a standard TYPE_OR_IRQ device for this now, so use
3
While dozens of files include "cpu.h", only 3 files require
4
that instead.
4
these NVIC helper declarations.
5
5
6
(This is a migration compatibility break, but that is OK for this
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
machine type.)
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
8
Message-id: 20230206223502.25122-12-philmd@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20220404154658.565020-2-peter.maydell@linaro.org
12
---
10
---
13
include/hw/arm/exynos4210.h | 1 +
11
include/hw/intc/armv7m_nvic.h | 123 ++++++++++++++++++++++++++++++++++
14
hw/arm/exynos4210.c | 31 ++++++++++++++++---------------
12
target/arm/cpu.h | 123 ----------------------------------
15
2 files changed, 17 insertions(+), 15 deletions(-)
13
target/arm/cpu.c | 4 +-
16
14
target/arm/cpu_tcg.c | 3 +
17
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
15
target/arm/m_helper.c | 3 +
18
index XXXXXXX..XXXXXXX 100644
16
5 files changed, 132 insertions(+), 124 deletions(-)
19
--- a/include/hw/arm/exynos4210.h
17
20
+++ b/include/hw/arm/exynos4210.h
18
diff --git a/include/hw/intc/armv7m_nvic.h b/include/hw/intc/armv7m_nvic.h
21
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
19
index XXXXXXX..XXXXXXX 100644
22
MemoryRegion bootreg_mem;
20
--- a/include/hw/intc/armv7m_nvic.h
23
I2CBus *i2c_if[EXYNOS4210_I2C_NUMBER];
21
+++ b/include/hw/intc/armv7m_nvic.h
24
qemu_or_irq pl330_irq_orgate[EXYNOS4210_NUM_DMA];
22
@@ -XXX,XX +XXX,XX @@ struct NVICState {
25
+ qemu_or_irq cpu_irq_orgate[EXYNOS4210_NCPUS];
23
qemu_irq sysresetreq;
26
};
24
};
27
25
28
#define TYPE_EXYNOS4210_SOC "exynos4210"
26
+/* Interface between CPU and Interrupt controller. */
29
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
27
+/**
30
index XXXXXXX..XXXXXXX 100644
28
+ * armv7m_nvic_set_pending: mark the specified exception as pending
31
--- a/hw/arm/exynos4210.c
29
+ * @s: the NVIC
32
+++ b/hw/arm/exynos4210.c
30
+ * @irq: the exception number to mark pending
33
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
31
+ * @secure: false for non-banked exceptions or for the nonsecure
34
{
32
+ * version of a banked exception, true for the secure version of a banked
35
Exynos4210State *s = EXYNOS4210_SOC(socdev);
33
+ * exception.
36
MemoryRegion *system_mem = get_system_memory();
34
+ *
37
- qemu_irq gate_irq[EXYNOS4210_NCPUS][EXYNOS4210_IRQ_GATE_NINPUTS];
35
+ * Marks the specified exception as pending. Note that we will assert()
38
SysBusDevice *busdev;
36
+ * if @secure is true and @irq does not specify one of the fixed set
39
DeviceState *dev, *uart[4], *pl330[3];
37
+ * of architecturally banked exceptions.
40
int i, n;
38
+ */
41
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
39
+void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure);
42
40
+/**
43
/* IRQ Gate */
41
+ * armv7m_nvic_set_pending_derived: mark this derived exception as pending
44
for (i = 0; i < EXYNOS4210_NCPUS; i++) {
42
+ * @s: the NVIC
45
- dev = qdev_new("exynos4210.irq_gate");
43
+ * @irq: the exception number to mark pending
46
- qdev_prop_set_uint32(dev, "n_in", EXYNOS4210_IRQ_GATE_NINPUTS);
44
+ * @secure: false for non-banked exceptions or for the nonsecure
47
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
45
+ * version of a banked exception, true for the secure version of a banked
48
- /* Get IRQ Gate input in gate_irq */
46
+ * exception.
49
- for (n = 0; n < EXYNOS4210_IRQ_GATE_NINPUTS; n++) {
47
+ *
50
- gate_irq[i][n] = qdev_get_gpio_in(dev, n);
48
+ * Similar to armv7m_nvic_set_pending(), but specifically for derived
51
- }
49
+ * exceptions (exceptions generated in the course of trying to take
52
- busdev = SYS_BUS_DEVICE(dev);
50
+ * a different exception).
51
+ */
52
+void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure);
53
+/**
54
+ * armv7m_nvic_set_pending_lazyfp: mark this lazy FP exception as pending
55
+ * @s: the NVIC
56
+ * @irq: the exception number to mark pending
57
+ * @secure: false for non-banked exceptions or for the nonsecure
58
+ * version of a banked exception, true for the secure version of a banked
59
+ * exception.
60
+ *
61
+ * Similar to armv7m_nvic_set_pending(), but specifically for exceptions
62
+ * generated in the course of lazy stacking of FP registers.
63
+ */
64
+void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure);
65
+/**
66
+ * armv7m_nvic_get_pending_irq_info: return highest priority pending
67
+ * exception, and whether it targets Secure state
68
+ * @s: the NVIC
69
+ * @pirq: set to pending exception number
70
+ * @ptargets_secure: set to whether pending exception targets Secure
71
+ *
72
+ * This function writes the number of the highest priority pending
73
+ * exception (the one which would be made active by
74
+ * armv7m_nvic_acknowledge_irq()) to @pirq, and sets @ptargets_secure
75
+ * to true if the current highest priority pending exception should
76
+ * be taken to Secure state, false for NS.
77
+ */
78
+void armv7m_nvic_get_pending_irq_info(NVICState *s, int *pirq,
79
+ bool *ptargets_secure);
80
+/**
81
+ * armv7m_nvic_acknowledge_irq: make highest priority pending exception active
82
+ * @s: the NVIC
83
+ *
84
+ * Move the current highest priority pending exception from the pending
85
+ * state to the active state, and update v7m.exception to indicate that
86
+ * it is the exception currently being handled.
87
+ */
88
+void armv7m_nvic_acknowledge_irq(NVICState *s);
89
+/**
90
+ * armv7m_nvic_complete_irq: complete specified interrupt or exception
91
+ * @s: the NVIC
92
+ * @irq: the exception number to complete
93
+ * @secure: true if this exception was secure
94
+ *
95
+ * Returns: -1 if the irq was not active
96
+ * 1 if completing this irq brought us back to base (no active irqs)
97
+ * 0 if there is still an irq active after this one was completed
98
+ * (Ignoring -1, this is the same as the RETTOBASE value before completion.)
99
+ */
100
+int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure);
101
+/**
102
+ * armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
103
+ * @s: the NVIC
104
+ * @irq: the exception number to mark pending
105
+ * @secure: false for non-banked exceptions or for the nonsecure
106
+ * version of a banked exception, true for the secure version of a banked
107
+ * exception.
108
+ *
109
+ * Return whether an exception is "ready", i.e. whether the exception is
110
+ * enabled and is configured at a priority which would allow it to
111
+ * interrupt the current execution priority. This controls whether the
112
+ * RDY bit for it in the FPCCR is set.
113
+ */
114
+bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure);
115
+/**
116
+ * armv7m_nvic_raw_execution_priority: return the raw execution priority
117
+ * @s: the NVIC
118
+ *
119
+ * Returns: the raw execution priority as defined by the v8M architecture.
120
+ * This is the execution priority minus the effects of AIRCR.PRIS,
121
+ * and minus any PRIMASK/FAULTMASK/BASEPRI priority boosting.
122
+ * (v8M ARM ARM I_PKLD.)
123
+ */
124
+int armv7m_nvic_raw_execution_priority(NVICState *s);
125
+/**
126
+ * armv7m_nvic_neg_prio_requested: return true if the requested execution
127
+ * priority is negative for the specified security state.
128
+ * @s: the NVIC
129
+ * @secure: the security state to test
130
+ * This corresponds to the pseudocode IsReqExecPriNeg().
131
+ */
132
+#ifndef CONFIG_USER_ONLY
133
+bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure);
134
+#else
135
+static inline bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
136
+{
137
+ return false;
138
+}
139
+#endif
140
+#ifndef CONFIG_USER_ONLY
141
+bool armv7m_nvic_can_take_pending_exception(NVICState *s);
142
+#else
143
+static inline bool armv7m_nvic_can_take_pending_exception(NVICState *s)
144
+{
145
+ return true;
146
+}
147
+#endif
148
+
149
#endif
150
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
151
index XXXXXXX..XXXXXXX 100644
152
--- a/target/arm/cpu.h
153
+++ b/target/arm/cpu.h
154
@@ -XXX,XX +XXX,XX @@ void arm_cpu_list(void);
155
uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
156
uint32_t cur_el, bool secure);
157
158
-/* Interface between CPU and Interrupt controller. */
159
-#ifndef CONFIG_USER_ONLY
160
-bool armv7m_nvic_can_take_pending_exception(NVICState *s);
161
-#else
162
-static inline bool armv7m_nvic_can_take_pending_exception(NVICState *s)
163
-{
164
- return true;
165
-}
166
-#endif
167
-/**
168
- * armv7m_nvic_set_pending: mark the specified exception as pending
169
- * @s: the NVIC
170
- * @irq: the exception number to mark pending
171
- * @secure: false for non-banked exceptions or for the nonsecure
172
- * version of a banked exception, true for the secure version of a banked
173
- * exception.
174
- *
175
- * Marks the specified exception as pending. Note that we will assert()
176
- * if @secure is true and @irq does not specify one of the fixed set
177
- * of architecturally banked exceptions.
178
- */
179
-void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure);
180
-/**
181
- * armv7m_nvic_set_pending_derived: mark this derived exception as pending
182
- * @s: the NVIC
183
- * @irq: the exception number to mark pending
184
- * @secure: false for non-banked exceptions or for the nonsecure
185
- * version of a banked exception, true for the secure version of a banked
186
- * exception.
187
- *
188
- * Similar to armv7m_nvic_set_pending(), but specifically for derived
189
- * exceptions (exceptions generated in the course of trying to take
190
- * a different exception).
191
- */
192
-void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure);
193
-/**
194
- * armv7m_nvic_set_pending_lazyfp: mark this lazy FP exception as pending
195
- * @s: the NVIC
196
- * @irq: the exception number to mark pending
197
- * @secure: false for non-banked exceptions or for the nonsecure
198
- * version of a banked exception, true for the secure version of a banked
199
- * exception.
200
- *
201
- * Similar to armv7m_nvic_set_pending(), but specifically for exceptions
202
- * generated in the course of lazy stacking of FP registers.
203
- */
204
-void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure);
205
-/**
206
- * armv7m_nvic_get_pending_irq_info: return highest priority pending
207
- * exception, and whether it targets Secure state
208
- * @s: the NVIC
209
- * @pirq: set to pending exception number
210
- * @ptargets_secure: set to whether pending exception targets Secure
211
- *
212
- * This function writes the number of the highest priority pending
213
- * exception (the one which would be made active by
214
- * armv7m_nvic_acknowledge_irq()) to @pirq, and sets @ptargets_secure
215
- * to true if the current highest priority pending exception should
216
- * be taken to Secure state, false for NS.
217
- */
218
-void armv7m_nvic_get_pending_irq_info(NVICState *s, int *pirq,
219
- bool *ptargets_secure);
220
-/**
221
- * armv7m_nvic_acknowledge_irq: make highest priority pending exception active
222
- * @s: the NVIC
223
- *
224
- * Move the current highest priority pending exception from the pending
225
- * state to the active state, and update v7m.exception to indicate that
226
- * it is the exception currently being handled.
227
- */
228
-void armv7m_nvic_acknowledge_irq(NVICState *s);
229
-/**
230
- * armv7m_nvic_complete_irq: complete specified interrupt or exception
231
- * @s: the NVIC
232
- * @irq: the exception number to complete
233
- * @secure: true if this exception was secure
234
- *
235
- * Returns: -1 if the irq was not active
236
- * 1 if completing this irq brought us back to base (no active irqs)
237
- * 0 if there is still an irq active after this one was completed
238
- * (Ignoring -1, this is the same as the RETTOBASE value before completion.)
239
- */
240
-int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure);
241
-/**
242
- * armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
243
- * @s: the NVIC
244
- * @irq: the exception number to mark pending
245
- * @secure: false for non-banked exceptions or for the nonsecure
246
- * version of a banked exception, true for the secure version of a banked
247
- * exception.
248
- *
249
- * Return whether an exception is "ready", i.e. whether the exception is
250
- * enabled and is configured at a priority which would allow it to
251
- * interrupt the current execution priority. This controls whether the
252
- * RDY bit for it in the FPCCR is set.
253
- */
254
-bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure);
255
-/**
256
- * armv7m_nvic_raw_execution_priority: return the raw execution priority
257
- * @s: the NVIC
258
- *
259
- * Returns: the raw execution priority as defined by the v8M architecture.
260
- * This is the execution priority minus the effects of AIRCR.PRIS,
261
- * and minus any PRIMASK/FAULTMASK/BASEPRI priority boosting.
262
- * (v8M ARM ARM I_PKLD.)
263
- */
264
-int armv7m_nvic_raw_execution_priority(NVICState *s);
265
-/**
266
- * armv7m_nvic_neg_prio_requested: return true if the requested execution
267
- * priority is negative for the specified security state.
268
- * @s: the NVIC
269
- * @secure: the security state to test
270
- * This corresponds to the pseudocode IsReqExecPriNeg().
271
- */
272
-#ifndef CONFIG_USER_ONLY
273
-bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure);
274
-#else
275
-static inline bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
276
-{
277
- return false;
278
-}
279
-#endif
53
-
280
-
54
- /* Connect IRQ Gate output to CPU's IRQ line */
281
/* Interface for defining coprocessor registers.
55
- sysbus_connect_irq(busdev, 0,
282
* Registers are defined in tables of arm_cp_reginfo structs
56
- qdev_get_gpio_in(DEVICE(s->cpu[i]), ARM_CPU_IRQ));
283
* which are passed to define_arm_cp_regs().
57
+ DeviceState *orgate = DEVICE(&s->cpu_irq_orgate[i]);
284
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
58
+ object_property_set_int(OBJECT(orgate), "num-lines",
285
index XXXXXXX..XXXXXXX 100644
59
+ EXYNOS4210_IRQ_GATE_NINPUTS,
286
--- a/target/arm/cpu.c
60
+ &error_abort);
287
+++ b/target/arm/cpu.c
61
+ qdev_realize(orgate, NULL, &error_abort);
288
@@ -XXX,XX +XXX,XX @@
62
+ qdev_connect_gpio_out(orgate, 0,
289
#if !defined(CONFIG_USER_ONLY)
63
+ qdev_get_gpio_in(DEVICE(s->cpu[i]), ARM_CPU_IRQ));
290
#include "hw/loader.h"
64
}
291
#include "hw/boards.h"
65
292
+#ifdef CONFIG_TCG
66
/* Private memory region and Internal GIC */
293
#include "hw/intc/armv7m_nvic.h"
67
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
294
-#endif
68
sysbus_realize_and_unref(busdev, &error_fatal);
295
+#endif /* CONFIG_TCG */
69
sysbus_mmio_map(busdev, 0, EXYNOS4210_SMP_PRIVATE_BASE_ADDR);
296
+#endif /* !CONFIG_USER_ONLY */
70
for (n = 0; n < EXYNOS4210_NCPUS; n++) {
297
#include "sysemu/tcg.h"
71
- sysbus_connect_irq(busdev, n, gate_irq[n][0]);
298
#include "sysemu/qtest.h"
72
+ sysbus_connect_irq(busdev, n,
299
#include "sysemu/hw_accel.h"
73
+ qdev_get_gpio_in(DEVICE(&s->cpu_irq_orgate[n]), 0));
300
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
74
}
301
index XXXXXXX..XXXXXXX 100644
75
for (n = 0; n < EXYNOS4210_INT_GIC_NIRQ; n++) {
302
--- a/target/arm/cpu_tcg.c
76
s->irqs.int_gic_irq[n] = qdev_get_gpio_in(dev, n);
303
+++ b/target/arm/cpu_tcg.c
77
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
304
@@ -XXX,XX +XXX,XX @@
78
/* Map Distributer interface */
305
#include "hw/boards.h"
79
sysbus_mmio_map(busdev, 1, EXYNOS4210_EXT_GIC_DIST_BASE_ADDR);
306
#endif
80
for (n = 0; n < EXYNOS4210_NCPUS; n++) {
307
#include "cpregs.h"
81
- sysbus_connect_irq(busdev, n, gate_irq[n][1]);
308
+#if !defined(CONFIG_USER_ONLY) && defined(CONFIG_TCG)
82
+ sysbus_connect_irq(busdev, n,
309
+#include "hw/intc/armv7m_nvic.h"
83
+ qdev_get_gpio_in(DEVICE(&s->cpu_irq_orgate[n]), 1));
310
+#endif
84
}
311
85
for (n = 0; n < EXYNOS4210_EXT_GIC_NIRQ; n++) {
312
86
s->irqs.ext_gic_irq[n] = qdev_get_gpio_in(dev, n);
313
/* Share AArch32 -cpu max features with AArch64. */
87
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init(Object *obj)
314
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
88
object_initialize_child(obj, name, orgate, TYPE_OR_IRQ);
315
index XXXXXXX..XXXXXXX 100644
89
g_free(name);
316
--- a/target/arm/m_helper.c
90
}
317
+++ b/target/arm/m_helper.c
91
+
318
@@ -XXX,XX +XXX,XX @@
92
+ for (i = 0; i < ARRAY_SIZE(s->cpu_irq_orgate); i++) {
319
#include "exec/cpu_ldst.h"
93
+ g_autofree char *name = g_strdup_printf("cpu-irq-orgate%d", i);
320
#include "semihosting/common-semi.h"
94
+ object_initialize_child(obj, name, &s->cpu_irq_orgate[i], TYPE_OR_IRQ);
321
#endif
95
+ }
322
+#if !defined(CONFIG_USER_ONLY)
96
}
323
+#include "hw/intc/armv7m_nvic.h"
97
324
+#endif
98
static void exynos4210_class_init(ObjectClass *klass, void *data)
325
326
static void v7m_msr_xpsr(CPUARMState *env, uint32_t mask,
327
uint32_t reg, uint32_t val)
99
--
328
--
100
2.25.1
329
2.34.1
330
331
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
Create an APU CPU Cluster. This is in preparation to add the RPU.
3
The two TCG tests for GICv2 and GICv3 are very heavy weight distros
4
4
that take a long time to boot up, especially for an --enable-debug
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
5
build. The total code coverage they give is:
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
6
7
Message-id: 20220406174303.2022038-2-edgar.iglesias@xilinx.com
7
Overall coverage rate:
8
lines......: 11.2% (59584 of 530123 lines)
9
functions..: 15.0% (7436 of 49443 functions)
10
branches...: 6.3% (19273 of 303933 branches)
11
12
We already get pretty close to that with the machine_aarch64_virt
13
tests which only does one full boot (~120s vs ~600s) of alpine. We
14
expand the kernel+initrd boot (~8s) to test both GICs and also add an
15
RNG device and a block device to generate a few IRQs and exercise the
16
storage layer. With that we get to a coverage of:
17
18
Overall coverage rate:
19
lines......: 11.0% (58121 of 530123 lines)
20
functions..: 14.9% (7343 of 49443 functions)
21
branches...: 6.0% (18269 of 303933 branches)
22
23
which I feel is close enough given the massive time saving. If we want
24
to target any more sub-systems we can use lighter weight more directed
25
tests.
26
27
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
28
Reviewed-by: Fabiano Rosas <farosas@suse.de>
29
Acked-by: Richard Henderson <richard.henderson@linaro.org>
30
Message-id: 20230203181632.2919715-1-alex.bennee@linaro.org
31
Cc: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
33
---
10
include/hw/arm/xlnx-versal.h | 2 ++
34
tests/avocado/boot_linux.py | 48 ++++----------------
11
hw/arm/xlnx-versal.c | 9 ++++++++-
35
tests/avocado/machine_aarch64_virt.py | 63 ++++++++++++++++++++++++---
12
2 files changed, 10 insertions(+), 1 deletion(-)
36
2 files changed, 65 insertions(+), 46 deletions(-)
13
37
14
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
38
diff --git a/tests/avocado/boot_linux.py b/tests/avocado/boot_linux.py
15
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
16
--- a/include/hw/arm/xlnx-versal.h
40
--- a/tests/avocado/boot_linux.py
17
+++ b/include/hw/arm/xlnx-versal.h
41
+++ b/tests/avocado/boot_linux.py
42
@@ -XXX,XX +XXX,XX @@ def test_pc_q35_kvm(self):
43
self.launch_and_wait(set_up_ssh_connection=False)
44
45
46
-# For Aarch64 we only boot KVM tests in CI as the TCG tests are very
47
-# heavyweight. There are lighter weight distros which we use in the
48
-# machine_aarch64_virt.py tests.
49
+# For Aarch64 we only boot KVM tests in CI as booting the current
50
+# Fedora OS in TCG tests is very heavyweight. There are lighter weight
51
+# distros which we use in the machine_aarch64_virt.py tests.
52
class BootLinuxAarch64(LinuxTest):
53
"""
54
:avocado: tags=arch:aarch64
55
:avocado: tags=machine:virt
56
- :avocado: tags=machine:gic-version=2
57
"""
58
timeout = 720
59
60
- def add_common_args(self):
61
- self.vm.add_args('-bios',
62
- os.path.join(BUILD_DIR, 'pc-bios',
63
- 'edk2-aarch64-code.fd'))
64
- self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
65
- self.vm.add_args('-object', 'rng-random,id=rng0,filename=/dev/urandom')
66
-
67
- @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
68
- def test_fedora_cloud_tcg_gicv2(self):
69
- """
70
- :avocado: tags=accel:tcg
71
- :avocado: tags=cpu:max
72
- :avocado: tags=device:gicv2
73
- """
74
- self.require_accelerator("tcg")
75
- self.vm.add_args("-accel", "tcg")
76
- self.vm.add_args("-cpu", "max,lpa2=off")
77
- self.vm.add_args("-machine", "virt,gic-version=2")
78
- self.add_common_args()
79
- self.launch_and_wait(set_up_ssh_connection=False)
80
-
81
- @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
82
- def test_fedora_cloud_tcg_gicv3(self):
83
- """
84
- :avocado: tags=accel:tcg
85
- :avocado: tags=cpu:max
86
- :avocado: tags=device:gicv3
87
- """
88
- self.require_accelerator("tcg")
89
- self.vm.add_args("-accel", "tcg")
90
- self.vm.add_args("-cpu", "max,lpa2=off")
91
- self.vm.add_args("-machine", "virt,gic-version=3")
92
- self.add_common_args()
93
- self.launch_and_wait(set_up_ssh_connection=False)
94
-
95
def test_virt_kvm(self):
96
"""
97
:avocado: tags=accel:kvm
98
@@ -XXX,XX +XXX,XX @@ def test_virt_kvm(self):
99
self.require_accelerator("kvm")
100
self.vm.add_args("-accel", "kvm")
101
self.vm.add_args("-machine", "virt,gic-version=host")
102
- self.add_common_args()
103
+ self.vm.add_args('-bios',
104
+ os.path.join(BUILD_DIR, 'pc-bios',
105
+ 'edk2-aarch64-code.fd'))
106
+ self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
107
+ self.vm.add_args('-object', 'rng-random,id=rng0,filename=/dev/urandom')
108
self.launch_and_wait(set_up_ssh_connection=False)
109
110
111
diff --git a/tests/avocado/machine_aarch64_virt.py b/tests/avocado/machine_aarch64_virt.py
112
index XXXXXXX..XXXXXXX 100644
113
--- a/tests/avocado/machine_aarch64_virt.py
114
+++ b/tests/avocado/machine_aarch64_virt.py
18
@@ -XXX,XX +XXX,XX @@
115
@@ -XXX,XX +XXX,XX @@
19
116
20
#include "hw/sysbus.h"
117
import time
21
#include "hw/arm/boot.h"
118
import os
22
+#include "hw/cpu/cluster.h"
119
+import logging
23
#include "hw/or-irq.h"
120
24
#include "hw/sd/sdhci.h"
121
from avocado_qemu import QemuSystemTest
25
#include "hw/intc/arm_gicv3.h"
122
from avocado_qemu import wait_for_console_pattern
26
@@ -XXX,XX +XXX,XX @@ struct Versal {
123
from avocado_qemu import exec_command
27
struct {
124
from avocado_qemu import BUILD_DIR
28
struct {
125
+from avocado.utils import process
29
MemoryRegion mr;
126
+from avocado.utils.path import find_command
30
+ CPUClusterState cluster;
127
31
ARMCPU cpu[XLNX_VERSAL_NR_ACPUS];
128
class Aarch64VirtMachine(QemuSystemTest):
32
GICv3State gic;
129
KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
33
} apu;
130
@@ -XXX,XX +XXX,XX @@ def test_alpine_virt_tcg_gic_max(self):
34
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
131
self.wait_for_console_pattern('Welcome to Alpine Linux 3.16')
35
index XXXXXXX..XXXXXXX 100644
132
36
--- a/hw/arm/xlnx-versal.c
133
37
+++ b/hw/arm/xlnx-versal.c
134
- def test_aarch64_virt(self):
38
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
135
+ def common_aarch64_virt(self, machine):
39
{
136
"""
40
int i;
137
- :avocado: tags=arch:aarch64
41
138
- :avocado: tags=machine:virt
42
+ object_initialize_child(OBJECT(s), "apu-cluster", &s->fpd.apu.cluster,
139
- :avocado: tags=accel:tcg
43
+ TYPE_CPU_CLUSTER);
140
- :avocado: tags=cpu:max
44
+ qdev_prop_set_uint32(DEVICE(&s->fpd.apu.cluster), "cluster-id", 0);
141
+ Common code to launch basic virt machine with kernel+initrd
45
+
142
+ and a scratch disk.
46
for (i = 0; i < ARRAY_SIZE(s->fpd.apu.cpu); i++) {
143
"""
47
Object *obj;
144
+ logger = logging.getLogger('aarch64_virt')
48
145
+
49
- object_initialize_child(OBJECT(s), "apu-cpu[*]", &s->fpd.apu.cpu[i],
146
kernel_url = ('https://fileserver.linaro.org/s/'
50
+ object_initialize_child(OBJECT(&s->fpd.apu.cluster),
147
'z6B2ARM7DQT3HWN/download')
51
+ "apu-cpu[*]", &s->fpd.apu.cpu[i],
148
-
52
XLNX_VERSAL_ACPU_TYPE);
149
kernel_hash = 'ed11daab50c151dde0e1e9c9cb8b2d9bd3215347'
53
obj = OBJECT(&s->fpd.apu.cpu[i]);
150
kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
54
if (i) {
151
55
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
152
@@ -XXX,XX +XXX,XX @@ def test_aarch64_virt(self):
56
&error_abort);
153
'console=ttyAMA0')
57
qdev_realize(DEVICE(obj), NULL, &error_fatal);
154
self.require_accelerator("tcg")
58
}
155
self.vm.add_args('-cpu', 'max,pauth-impdef=on',
59
+
156
+ '-machine', machine,
60
+ qdev_realize(DEVICE(&s->fpd.apu.cluster), NULL, &error_fatal);
157
'-accel', 'tcg',
61
}
158
'-kernel', kernel_path,
62
159
'-append', kernel_command_line)
63
static void versal_create_apu_gic(Versal *s, qemu_irq *pic)
160
+
161
+ # A RNG offers an easy way to generate a few IRQs
162
+ self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
163
+ self.vm.add_args('-object',
164
+ 'rng-random,id=rng0,filename=/dev/urandom')
165
+
166
+ # Also add a scratch block device
167
+ logger.info('creating scratch qcow2 image')
168
+ image_path = os.path.join(self.workdir, 'scratch.qcow2')
169
+ qemu_img = os.path.join(BUILD_DIR, 'qemu-img')
170
+ if not os.path.exists(qemu_img):
171
+ qemu_img = find_command('qemu-img', False)
172
+ if qemu_img is False:
173
+ self.cancel('Could not find "qemu-img", which is required to '
174
+ 'create the temporary qcow2 image')
175
+ cmd = '%s create -f qcow2 %s 8M' % (qemu_img, image_path)
176
+ process.run(cmd)
177
+
178
+ # Add the device
179
+ self.vm.add_args('-blockdev',
180
+ f"driver=qcow2,file.driver=file,file.filename={image_path},node-name=scratch")
181
+ self.vm.add_args('-device',
182
+ 'virtio-blk-device,drive=scratch')
183
+
184
self.vm.launch()
185
self.wait_for_console_pattern('Welcome to Buildroot')
186
time.sleep(0.1)
187
exec_command(self, 'root')
188
time.sleep(0.1)
189
+ exec_command(self, 'dd if=/dev/hwrng of=/dev/vda bs=512 count=4')
190
+ time.sleep(0.1)
191
+ exec_command(self, 'md5sum /dev/vda')
192
+ time.sleep(0.1)
193
+ exec_command(self, 'cat /proc/interrupts')
194
+ time.sleep(0.1)
195
exec_command(self, 'cat /proc/self/maps')
196
time.sleep(0.1)
197
+
198
+ def test_aarch64_virt_gicv3(self):
199
+ """
200
+ :avocado: tags=arch:aarch64
201
+ :avocado: tags=machine:virt
202
+ :avocado: tags=accel:tcg
203
+ :avocado: tags=cpu:max
204
+ """
205
+ self.common_aarch64_virt("virt,gic_version=3")
206
+
207
+ def test_aarch64_virt_gicv2(self):
208
+ """
209
+ :avocado: tags=arch:aarch64
210
+ :avocado: tags=machine:virt
211
+ :avocado: tags=accel:tcg
212
+ :avocado: tags=cpu:max
213
+ """
214
+ self.common_aarch64_virt("virt,gic-version=2")
64
--
215
--
65
2.25.1
216
2.34.1
217
218
diff view generated by jsdifflib
1
The function exynos4210_combiner_get_gpioin() currently lives in
1
From: Mostafa Saleh <smostafa@google.com>
2
exynos4210_combiner.c, but it isn't really part of the combiner
3
device itself -- it is a function that implements the wiring up of
4
some interrupt sources to multiple combiner inputs. Move it to live
5
with the other SoC-level code in exynos4210.c, along with a few
6
macros previously defined in exynos4210.h which are now used only
7
in exynos4210.c.
8
2
3
GBPA register can be used to globally abort all
4
transactions.
5
6
It is described in the SMMU manual in "6.3.14 SMMU_GBPA".
7
ABORT reset value is IMPLEMENTATION DEFINED, it is chosen to
8
be zero(Do not abort incoming transactions).
9
10
Other fields have default values of Use Incoming.
11
12
If UPDATE is not set, the write is ignored. This is the only permitted
13
behavior in SMMUv3.2 and later.(6.3.14.1 Update procedure)
14
15
As this patch adds a new state to the SMMU (GBPA), it is added
16
in a new subsection for forward migration compatibility.
17
GBPA is only migrated if its value is different from the reset value.
18
It does this to be backward migration compatible if SW didn't write
19
the register.
20
21
Signed-off-by: Mostafa Saleh <smostafa@google.com>
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
23
Reviewed-by: Eric Auger <eric.auger@redhat.com>
24
Message-id: 20230214094009.2445653-1-smostafa@google.com
25
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20220404154658.565020-11-peter.maydell@linaro.org
12
---
27
---
13
include/hw/arm/exynos4210.h | 11 -----
28
hw/arm/smmuv3-internal.h | 7 +++++++
14
hw/arm/exynos4210.c | 82 +++++++++++++++++++++++++++++++++++
29
include/hw/arm/smmuv3.h | 1 +
15
hw/intc/exynos4210_combiner.c | 77 --------------------------------
30
hw/arm/smmuv3.c | 43 +++++++++++++++++++++++++++++++++++++++-
16
3 files changed, 82 insertions(+), 88 deletions(-)
31
3 files changed, 50 insertions(+), 1 deletion(-)
17
32
18
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
33
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
19
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/arm/exynos4210.h
35
--- a/hw/arm/smmuv3-internal.h
21
+++ b/include/hw/arm/exynos4210.h
36
+++ b/hw/arm/smmuv3-internal.h
22
@@ -XXX,XX +XXX,XX @@
37
@@ -XXX,XX +XXX,XX @@ REG32(CR0ACK, 0x24)
23
#define EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ \
38
REG32(CR1, 0x28)
24
(EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ * 8)
39
REG32(CR2, 0x2c)
25
40
REG32(STATUSR, 0x40)
26
-#define EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit) ((grp)*8 + (bit))
41
+REG32(GBPA, 0x44)
27
-#define EXYNOS4210_COMBINER_GET_GRP_NUM(irq) ((irq) / 8)
42
+ FIELD(GBPA, ABORT, 20, 1)
28
-#define EXYNOS4210_COMBINER_GET_BIT_NUM(irq) \
43
+ FIELD(GBPA, UPDATE, 31, 1)
29
- ((irq) - 8 * EXYNOS4210_COMBINER_GET_GRP_NUM(irq))
44
+
30
-
45
+/* Use incoming. */
31
/* IRQs number for external and internal GIC */
46
+#define SMMU_GBPA_RESET_VAL 0x1000
32
#define EXYNOS4210_EXT_GIC_NIRQ (160-32)
47
+
33
#define EXYNOS4210_INT_GIC_NIRQ 64
48
REG32(IRQ_CTRL, 0x50)
34
@@ -XXX,XX +XXX,XX @@ void exynos4210_write_secondary(ARMCPU *cpu,
49
FIELD(IRQ_CTRL, GERROR_IRQEN, 0, 1)
35
* bit - bit number inside group */
50
FIELD(IRQ_CTRL, PRI_IRQEN, 1, 1)
36
uint32_t exynos4210_get_irq(uint32_t grp, uint32_t bit);
51
diff --git a/include/hw/arm/smmuv3.h b/include/hw/arm/smmuv3.h
37
38
-/*
39
- * Get Combiner input GPIO into irqs structure
40
- */
41
-void exynos4210_combiner_get_gpioin(Exynos4210Irq *irqs, DeviceState *dev,
42
- int ext);
43
-
44
/*
45
* exynos4210 UART
46
*/
47
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
48
index XXXXXXX..XXXXXXX 100644
52
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/arm/exynos4210.c
53
--- a/include/hw/arm/smmuv3.h
50
+++ b/hw/arm/exynos4210.c
54
+++ b/include/hw/arm/smmuv3.h
51
@@ -XXX,XX +XXX,XX @@ combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
55
@@ -XXX,XX +XXX,XX @@ struct SMMUv3State {
52
{ }, { }, { }, { }, { }, { }, { }, { }, { }, { }
56
uint32_t cr[3];
57
uint32_t cr0ack;
58
uint32_t statusr;
59
+ uint32_t gbpa;
60
uint32_t irq_ctrl;
61
uint32_t gerror;
62
uint32_t gerrorn;
63
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/arm/smmuv3.c
66
+++ b/hw/arm/smmuv3.c
67
@@ -XXX,XX +XXX,XX @@ static void smmuv3_init_regs(SMMUv3State *s)
68
s->gerror = 0;
69
s->gerrorn = 0;
70
s->statusr = 0;
71
+ s->gbpa = SMMU_GBPA_RESET_VAL;
72
}
73
74
static int smmu_get_ste(SMMUv3State *s, dma_addr_t addr, STE *buf,
75
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
76
qemu_mutex_lock(&s->mutex);
77
78
if (!smmu_enabled(s)) {
79
- status = SMMU_TRANS_DISABLE;
80
+ if (FIELD_EX32(s->gbpa, GBPA, ABORT)) {
81
+ status = SMMU_TRANS_ABORT;
82
+ } else {
83
+ status = SMMU_TRANS_DISABLE;
84
+ }
85
goto epilogue;
86
}
87
88
@@ -XXX,XX +XXX,XX @@ static MemTxResult smmu_writel(SMMUv3State *s, hwaddr offset,
89
case A_GERROR_IRQ_CFG2:
90
s->gerror_irq_cfg2 = data;
91
return MEMTX_OK;
92
+ case A_GBPA:
93
+ /*
94
+ * If UPDATE is not set, the write is ignored. This is the only
95
+ * permitted behavior in SMMUv3.2 and later.
96
+ */
97
+ if (data & R_GBPA_UPDATE_MASK) {
98
+ /* Ignore update bit as write is synchronous. */
99
+ s->gbpa = data & ~R_GBPA_UPDATE_MASK;
100
+ }
101
+ return MEMTX_OK;
102
case A_STRTAB_BASE: /* 64b */
103
s->strtab_base = deposit64(s->strtab_base, 0, 32, data);
104
return MEMTX_OK;
105
@@ -XXX,XX +XXX,XX @@ static MemTxResult smmu_readl(SMMUv3State *s, hwaddr offset,
106
case A_STATUSR:
107
*data = s->statusr;
108
return MEMTX_OK;
109
+ case A_GBPA:
110
+ *data = s->gbpa;
111
+ return MEMTX_OK;
112
case A_IRQ_CTRL:
113
case A_IRQ_CTRL_ACK:
114
*data = s->irq_ctrl;
115
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_smmuv3_queue = {
116
},
53
};
117
};
54
118
55
+#define EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit) ((grp) * 8 + (bit))
119
+static bool smmuv3_gbpa_needed(void *opaque)
56
+#define EXYNOS4210_COMBINER_GET_GRP_NUM(irq) ((irq) / 8)
120
+{
57
+#define EXYNOS4210_COMBINER_GET_BIT_NUM(irq) \
121
+ SMMUv3State *s = opaque;
58
+ ((irq) - 8 * EXYNOS4210_COMBINER_GET_GRP_NUM(irq))
59
+
122
+
60
/*
123
+ /* Only migrate GBPA if it has different reset value. */
61
* Initialize board IRQs.
124
+ return s->gbpa != SMMU_GBPA_RESET_VAL;
62
* These IRQs contain splitted Int/External Combiner and External Gic IRQs.
63
@@ -XXX,XX +XXX,XX @@ uint32_t exynos4210_get_irq(uint32_t grp, uint32_t bit)
64
return EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit);
65
}
66
67
+/*
68
+ * Get Combiner input GPIO into irqs structure
69
+ */
70
+static void exynos4210_combiner_get_gpioin(Exynos4210Irq *irqs,
71
+ DeviceState *dev, int ext)
72
+{
73
+ int n;
74
+ int bit;
75
+ int max;
76
+ qemu_irq *irq;
77
+
78
+ max = ext ? EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ :
79
+ EXYNOS4210_MAX_INT_COMBINER_IN_IRQ;
80
+ irq = ext ? irqs->ext_combiner_irq : irqs->int_combiner_irq;
81
+
82
+ /*
83
+ * Some IRQs of Int/External Combiner are going to two Combiners groups,
84
+ * so let split them.
85
+ */
86
+ for (n = 0; n < max; n++) {
87
+
88
+ bit = EXYNOS4210_COMBINER_GET_BIT_NUM(n);
89
+
90
+ switch (n) {
91
+ /* MDNIE_LCD1 INTG1 */
92
+ case EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 0) ...
93
+ EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 3):
94
+ irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
95
+ irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(0, bit + 4)]);
96
+ continue;
97
+
98
+ /* TMU INTG3 */
99
+ case EXYNOS4210_COMBINER_GET_IRQ_NUM(3, 4):
100
+ irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
101
+ irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(2, bit)]);
102
+ continue;
103
+
104
+ /* LCD1 INTG12 */
105
+ case EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 0) ...
106
+ EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 3):
107
+ irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
108
+ irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(11, bit + 4)]);
109
+ continue;
110
+
111
+ /* Multi-Core Timer INTG12 */
112
+ case EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 4) ...
113
+ EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 8):
114
+ irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
115
+ irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
116
+ continue;
117
+
118
+ /* Multi-Core Timer INTG35 */
119
+ case EXYNOS4210_COMBINER_GET_IRQ_NUM(35, 4) ...
120
+ EXYNOS4210_COMBINER_GET_IRQ_NUM(35, 8):
121
+ irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
122
+ irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
123
+ continue;
124
+
125
+ /* Multi-Core Timer INTG51 */
126
+ case EXYNOS4210_COMBINER_GET_IRQ_NUM(51, 4) ...
127
+ EXYNOS4210_COMBINER_GET_IRQ_NUM(51, 8):
128
+ irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
129
+ irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
130
+ continue;
131
+
132
+ /* Multi-Core Timer INTG53 */
133
+ case EXYNOS4210_COMBINER_GET_IRQ_NUM(53, 4) ...
134
+ EXYNOS4210_COMBINER_GET_IRQ_NUM(53, 8):
135
+ irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
136
+ irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
137
+ continue;
138
+ }
139
+
140
+ irq[n] = qdev_get_gpio_in(dev, n);
141
+ }
142
+}
125
+}
143
+
126
+
144
static uint8_t chipid_and_omr[] = { 0x11, 0x02, 0x21, 0x43,
127
+static const VMStateDescription vmstate_gbpa = {
145
0x09, 0x00, 0x00, 0x00 };
128
+ .name = "smmuv3/gbpa",
146
129
+ .version_id = 1,
147
diff --git a/hw/intc/exynos4210_combiner.c b/hw/intc/exynos4210_combiner.c
130
+ .minimum_version_id = 1,
148
index XXXXXXX..XXXXXXX 100644
131
+ .needed = smmuv3_gbpa_needed,
149
--- a/hw/intc/exynos4210_combiner.c
132
+ .fields = (VMStateField[]) {
150
+++ b/hw/intc/exynos4210_combiner.c
133
+ VMSTATE_UINT32(gbpa, SMMUv3State),
151
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_exynos4210_combiner = {
134
+ VMSTATE_END_OF_LIST()
152
}
135
+ }
136
+};
137
+
138
static const VMStateDescription vmstate_smmuv3 = {
139
.name = "smmuv3",
140
.version_id = 1,
141
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_smmuv3 = {
142
143
VMSTATE_END_OF_LIST(),
144
},
145
+ .subsections = (const VMStateDescription * []) {
146
+ &vmstate_gbpa,
147
+ NULL
148
+ }
153
};
149
};
154
150
155
-/*
151
static void smmuv3_instance_init(Object *obj)
156
- * Get Combiner input GPIO into irqs structure
157
- */
158
-void exynos4210_combiner_get_gpioin(Exynos4210Irq *irqs, DeviceState *dev,
159
- int ext)
160
-{
161
- int n;
162
- int bit;
163
- int max;
164
- qemu_irq *irq;
165
-
166
- max = ext ? EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ :
167
- EXYNOS4210_MAX_INT_COMBINER_IN_IRQ;
168
- irq = ext ? irqs->ext_combiner_irq : irqs->int_combiner_irq;
169
-
170
- /*
171
- * Some IRQs of Int/External Combiner are going to two Combiners groups,
172
- * so let split them.
173
- */
174
- for (n = 0; n < max; n++) {
175
-
176
- bit = EXYNOS4210_COMBINER_GET_BIT_NUM(n);
177
-
178
- switch (n) {
179
- /* MDNIE_LCD1 INTG1 */
180
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 0) ...
181
- EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 3):
182
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
183
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(0, bit + 4)]);
184
- continue;
185
-
186
- /* TMU INTG3 */
187
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(3, 4):
188
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
189
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(2, bit)]);
190
- continue;
191
-
192
- /* LCD1 INTG12 */
193
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 0) ...
194
- EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 3):
195
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
196
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(11, bit + 4)]);
197
- continue;
198
-
199
- /* Multi-Core Timer INTG12 */
200
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 4) ...
201
- EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 8):
202
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
203
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
204
- continue;
205
-
206
- /* Multi-Core Timer INTG35 */
207
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(35, 4) ...
208
- EXYNOS4210_COMBINER_GET_IRQ_NUM(35, 8):
209
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
210
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
211
- continue;
212
-
213
- /* Multi-Core Timer INTG51 */
214
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(51, 4) ...
215
- EXYNOS4210_COMBINER_GET_IRQ_NUM(51, 8):
216
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
217
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
218
- continue;
219
-
220
- /* Multi-Core Timer INTG53 */
221
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(53, 4) ...
222
- EXYNOS4210_COMBINER_GET_IRQ_NUM(53, 8):
223
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
224
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
225
- continue;
226
- }
227
-
228
- irq[n] = qdev_get_gpio_in(dev, n);
229
- }
230
-}
231
-
232
static uint64_t
233
exynos4210_combiner_read(void *opaque, hwaddr offset, unsigned size)
234
{
235
--
152
--
236
2.25.1
153
2.34.1
diff view generated by jsdifflib
1
From: Zongyuan Li <zongyuan.li@smartx.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Zongyuan Li <zongyuan.li@smartx.com>
3
Since commit acc0b8b05a when running the ZynqMP ZCU102 board with
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
a QEMU configured using --without-default-devices, we get:
5
Message-id: 20220324181557.203805-2-zongyuan.li@smartx.com
5
6
$ qemu-system-aarch64 -M xlnx-zcu102
7
qemu-system-aarch64: missing object type 'usb_dwc3'
8
Abort trap: 6
9
10
Fix by adding the missing Kconfig dependency.
11
12
Fixes: acc0b8b05a ("hw/arm/xlnx-zynqmp: Connect ZynqMP's USB controllers")
13
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
14
Message-id: 20230216092327.2203-1-philmd@linaro.org
15
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
17
---
8
hw/arm/realview.c | 33 ++++++++++++++++++++++++---------
18
hw/arm/Kconfig | 1 +
9
1 file changed, 24 insertions(+), 9 deletions(-)
19
1 file changed, 1 insertion(+)
10
20
11
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
21
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
12
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/realview.c
23
--- a/hw/arm/Kconfig
14
+++ b/hw/arm/realview.c
24
+++ b/hw/arm/Kconfig
15
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@ config XLNX_ZYNQMP_ARM
16
#include "hw/sysbus.h"
26
select XLNX_CSU_DMA
17
#include "hw/arm/boot.h"
27
select XLNX_ZYNQMP
18
#include "hw/arm/primecell.h"
28
select XLNX_ZDMA
19
+#include "hw/core/split-irq.h"
29
+ select USB_DWC3
20
#include "hw/net/lan9118.h"
30
21
#include "hw/net/smc91c111.h"
31
config XLNX_VERSAL
22
#include "hw/pci/pci.h"
32
bool
23
+#include "hw/qdev-core.h"
24
#include "net/net.h"
25
#include "sysemu/sysemu.h"
26
#include "hw/boards.h"
27
@@ -XXX,XX +XXX,XX @@ static const int realview_board_id[] = {
28
0x76d
29
};
30
31
+static void split_irq_from_named(DeviceState *src, const char* outname,
32
+ qemu_irq out1, qemu_irq out2) {
33
+ DeviceState *splitter = qdev_new(TYPE_SPLIT_IRQ);
34
+
35
+ qdev_prop_set_uint32(splitter, "num-lines", 2);
36
+
37
+ qdev_realize_and_unref(splitter, NULL, &error_fatal);
38
+
39
+ qdev_connect_gpio_out(splitter, 0, out1);
40
+ qdev_connect_gpio_out(splitter, 1, out2);
41
+ qdev_connect_gpio_out_named(src, outname, 0,
42
+ qdev_get_gpio_in(splitter, 0));
43
+}
44
+
45
static void realview_init(MachineState *machine,
46
enum realview_board_type board_type)
47
{
48
@@ -XXX,XX +XXX,XX @@ static void realview_init(MachineState *machine,
49
DeviceState *dev, *sysctl, *gpio2, *pl041;
50
SysBusDevice *busdev;
51
qemu_irq pic[64];
52
- qemu_irq mmc_irq[2];
53
PCIBus *pci_bus = NULL;
54
NICInfo *nd;
55
DriveInfo *dinfo;
56
@@ -XXX,XX +XXX,XX @@ static void realview_init(MachineState *machine,
57
* and the PL061 has them the other way about. Also the card
58
* detect line is inverted.
59
*/
60
- mmc_irq[0] = qemu_irq_split(
61
- qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_WPROT),
62
- qdev_get_gpio_in(gpio2, 1));
63
- mmc_irq[1] = qemu_irq_split(
64
- qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_CARDIN),
65
- qemu_irq_invert(qdev_get_gpio_in(gpio2, 0)));
66
- qdev_connect_gpio_out_named(dev, "card-read-only", 0, mmc_irq[0]);
67
- qdev_connect_gpio_out_named(dev, "card-inserted", 0, mmc_irq[1]);
68
+ split_irq_from_named(dev, "card-read-only",
69
+ qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_WPROT),
70
+ qdev_get_gpio_in(gpio2, 1));
71
+
72
+ split_irq_from_named(dev, "card-inserted",
73
+ qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_CARDIN),
74
+ qemu_irq_invert(qdev_get_gpio_in(gpio2, 0)));
75
+
76
dinfo = drive_get(IF_SD, 0, 0);
77
if (dinfo) {
78
DeviceState *card;
79
--
33
--
80
2.25.1
34
2.34.1
35
36
diff view generated by jsdifflib
1
It's not possible to provide the guest with the Security extensions
1
From: Cornelia Huck <cohuck@redhat.com>
2
(TrustZone) when using KVM or HVF, because the hardware
3
virtualization extensions don't permit running EL3 guest code.
4
However, we weren't checking for this combination, with the result
5
that QEMU would assert if you tried it:
6
2
7
$ qemu-system-aarch64 -enable-kvm -machine virt,secure=on -cpu host -display none
3
Just use current_accel_name() directly.
8
Unexpected error in object_property_find_err() at ../../qom/object.c:1304:
9
qemu-system-aarch64: Property 'host-arm-cpu.secure-memory' not found
10
Aborted
11
4
12
Check for this combination of options and report an error, in the
5
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
13
same way we already do for attempts to give a KVM or HVF guest the
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
14
Virtualization or MTE extensions. Now we will report:
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
16
qemu-system-aarch64: mach-virt: KVM does not support providing Security extensions (TrustZone) to the guest CPU
17
18
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/961
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Message-id: 20220404155301.566542-1-peter.maydell@linaro.org
22
---
9
---
23
hw/arm/virt.c | 7 +++++++
10
hw/arm/virt.c | 6 +++---
24
1 file changed, 7 insertions(+)
11
1 file changed, 3 insertions(+), 3 deletions(-)
25
12
26
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
13
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
27
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/arm/virt.c
15
--- a/hw/arm/virt.c
29
+++ b/hw/arm/virt.c
16
+++ b/hw/arm/virt.c
30
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
17
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
18
if (vms->secure && (kvm_enabled() || hvf_enabled())) {
19
error_report("mach-virt: %s does not support providing "
20
"Security extensions (TrustZone) to the guest CPU",
21
- kvm_enabled() ? "KVM" : "HVF");
22
+ current_accel_name());
31
exit(1);
23
exit(1);
32
}
24
}
33
25
34
+ if (vms->secure && (kvm_enabled() || hvf_enabled())) {
35
+ error_report("mach-virt: %s does not support providing "
36
+ "Security extensions (TrustZone) to the guest CPU",
37
+ kvm_enabled() ? "KVM" : "HVF");
38
+ exit(1);
39
+ }
40
+
41
if (vms->virt && (kvm_enabled() || hvf_enabled())) {
26
if (vms->virt && (kvm_enabled() || hvf_enabled())) {
42
error_report("mach-virt: %s does not support providing "
27
error_report("mach-virt: %s does not support providing "
43
"Virtualization extensions to the guest CPU",
28
"Virtualization extensions to the guest CPU",
29
- kvm_enabled() ? "KVM" : "HVF");
30
+ current_accel_name());
31
exit(1);
32
}
33
34
if (vms->mte && (kvm_enabled() || hvf_enabled())) {
35
error_report("mach-virt: %s does not support providing "
36
"MTE to the guest CPU",
37
- kvm_enabled() ? "KVM" : "HVF");
38
+ current_accel_name());
39
exit(1);
40
}
41
44
--
42
--
45
2.25.1
43
2.34.1
diff view generated by jsdifflib
1
From: Hao Wu <wuhaotsh@google.com>
1
From: Hao Wu <wuhaotsh@google.com>
2
2
3
Similar to the Aspeed code in include/misc/aspeed_scu.h, we define
3
Havard is no longer working on the Nuvoton systems for a while
4
the PWRON STRAP fields in their corresponding module for NPCM7XX.
4
and won't be able to do any work on it in the future. So I'll
5
take over maintaining the Nuvoton system from him.
5
6
6
Signed-off-by: Hao Wu <wuhaotsh@google.com>
7
Signed-off-by: Hao Wu <wuhaotsh@google.com>
7
Reviewed-by: Patrick Venture <venture@google.com>
8
Acked-by: Havard Skinnemoen <hskinnemoen@google.com>
8
Message-id: 20220411165842.3912945-2-wuhaotsh@google.com
9
Reviewed-by: Philippe Mathieu-Daude <philmd@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Message-id: 20230208235433.3989937-2-wuhaotsh@google.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
---
12
include/hw/misc/npcm7xx_gcr.h | 30 ++++++++++++++++++++++++++++++
13
MAINTAINERS | 2 +-
13
1 file changed, 30 insertions(+)
14
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
15
diff --git a/include/hw/misc/npcm7xx_gcr.h b/include/hw/misc/npcm7xx_gcr.h
16
diff --git a/MAINTAINERS b/MAINTAINERS
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/misc/npcm7xx_gcr.h
18
--- a/MAINTAINERS
18
+++ b/include/hw/misc/npcm7xx_gcr.h
19
+++ b/MAINTAINERS
19
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ F: include/hw/net/mv88w8618_eth.h
20
#include "exec/memory.h"
21
F: docs/system/arm/musicpal.rst
21
#include "hw/sysbus.h"
22
22
23
Nuvoton NPCM7xx
23
+/*
24
-M: Havard Skinnemoen <hskinnemoen@google.com>
24
+ * NPCM7XX PWRON STRAP bit fields
25
M: Tyrone Ting <kfting@nuvoton.com>
25
+ * 12: SPI0 powered by VSBV3 at 1.8V
26
+M: Hao Wu <wuhaotsh@google.com>
26
+ * 11: System flash attached to BMC
27
L: qemu-arm@nongnu.org
27
+ * 10: BSP alternative pins.
28
S: Supported
28
+ * 9:8: Flash UART command route enabled.
29
F: hw/*/npcm7xx*
29
+ * 7: Security enabled.
30
+ * 6: HI-Z state control.
31
+ * 5: ECC disabled.
32
+ * 4: Reserved
33
+ * 3: JTAG2 enabled.
34
+ * 2:0: CPU and DRAM clock frequency.
35
+ */
36
+#define NPCM7XX_PWRON_STRAP_SPI0F18 BIT(12)
37
+#define NPCM7XX_PWRON_STRAP_SFAB BIT(11)
38
+#define NPCM7XX_PWRON_STRAP_BSPA BIT(10)
39
+#define NPCM7XX_PWRON_STRAP_FUP(x) ((x) << 8)
40
+#define FUP_NORM_UART2 3
41
+#define FUP_PROG_UART3 2
42
+#define FUP_PROG_UART2 1
43
+#define FUP_NORM_UART3 0
44
+#define NPCM7XX_PWRON_STRAP_SECEN BIT(7)
45
+#define NPCM7XX_PWRON_STRAP_HIZ BIT(6)
46
+#define NPCM7XX_PWRON_STRAP_ECC BIT(5)
47
+#define NPCM7XX_PWRON_STRAP_RESERVE1 BIT(4)
48
+#define NPCM7XX_PWRON_STRAP_J2EN BIT(3)
49
+#define NPCM7XX_PWRON_STRAP_CKFRQ(x) (x)
50
+#define CKFRQ_SKIPINIT 0x000
51
+#define CKFRQ_DEFAULT 0x111
52
+
53
/*
54
* Number of registers in our device state structure. Don't change this without
55
* incrementing the version_id in the vmstate.
56
--
30
--
57
2.25.1
31
2.34.1
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
1
From: Hao Wu <wuhaotsh@google.com>
2
2
3
Add a model of the Xilinx Versal CRL.
3
Nuvoton's PSPI is a general purpose SPI module which enables
4
connections to SPI-based peripheral devices.
4
5
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
6
Signed-off-by: Hao Wu <wuhaotsh@google.com>
6
Reviewed-by: Frederic Konrad <fkonrad@amd.com>
7
Reviewed-by: Chris Rauer <crauer@google.com>
7
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
8
Reviewed-by: Philippe Mathieu-Daude <philmd@linaro.org>
8
Message-id: 20220406174303.2022038-4-edgar.iglesias@xilinx.com
9
Message-id: 20230208235433.3989937-3-wuhaotsh@google.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
include/hw/misc/xlnx-versal-crl.h | 235 +++++++++++++++++
12
MAINTAINERS | 6 +-
12
hw/misc/xlnx-versal-crl.c | 421 ++++++++++++++++++++++++++++++
13
include/hw/ssi/npcm_pspi.h | 53 +++++++++
13
hw/misc/meson.build | 1 +
14
hw/ssi/npcm_pspi.c | 221 +++++++++++++++++++++++++++++++++++++
14
3 files changed, 657 insertions(+)
15
hw/ssi/meson.build | 2 +-
15
create mode 100644 include/hw/misc/xlnx-versal-crl.h
16
hw/ssi/trace-events | 5 +
16
create mode 100644 hw/misc/xlnx-versal-crl.c
17
5 files changed, 283 insertions(+), 4 deletions(-)
18
create mode 100644 include/hw/ssi/npcm_pspi.h
19
create mode 100644 hw/ssi/npcm_pspi.c
17
20
18
diff --git a/include/hw/misc/xlnx-versal-crl.h b/include/hw/misc/xlnx-versal-crl.h
21
diff --git a/MAINTAINERS b/MAINTAINERS
22
index XXXXXXX..XXXXXXX 100644
23
--- a/MAINTAINERS
24
+++ b/MAINTAINERS
25
@@ -XXX,XX +XXX,XX @@ M: Tyrone Ting <kfting@nuvoton.com>
26
M: Hao Wu <wuhaotsh@google.com>
27
L: qemu-arm@nongnu.org
28
S: Supported
29
-F: hw/*/npcm7xx*
30
-F: include/hw/*/npcm7xx*
31
-F: tests/qtest/npcm7xx*
32
+F: hw/*/npcm*
33
+F: include/hw/*/npcm*
34
+F: tests/qtest/npcm*
35
F: pc-bios/npcm7xx_bootrom.bin
36
F: roms/vbootrom
37
F: docs/system/arm/nuvoton.rst
38
diff --git a/include/hw/ssi/npcm_pspi.h b/include/hw/ssi/npcm_pspi.h
19
new file mode 100644
39
new file mode 100644
20
index XXXXXXX..XXXXXXX
40
index XXXXXXX..XXXXXXX
21
--- /dev/null
41
--- /dev/null
22
+++ b/include/hw/misc/xlnx-versal-crl.h
42
+++ b/include/hw/ssi/npcm_pspi.h
23
@@ -XXX,XX +XXX,XX @@
43
@@ -XXX,XX +XXX,XX @@
24
+/*
44
+/*
25
+ * QEMU model of the Clock-Reset-LPD (CRL).
45
+ * Nuvoton Peripheral SPI Module
26
+ *
46
+ *
27
+ * Copyright (c) 2022 Xilinx Inc.
47
+ * Copyright 2023 Google LLC
28
+ * SPDX-License-Identifier: GPL-2.0-or-later
48
+ *
29
+ *
49
+ * This program is free software; you can redistribute it and/or modify it
30
+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>
50
+ * under the terms of the GNU General Public License as published by the
51
+ * Free Software Foundation; either version 2 of the License, or
52
+ * (at your option) any later version.
53
+ *
54
+ * This program is distributed in the hope that it will be useful, but WITHOUT
55
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
56
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
57
+ * for more details.
31
+ */
58
+ */
32
+#ifndef HW_MISC_XLNX_VERSAL_CRL_H
59
+#ifndef NPCM_PSPI_H
33
+#define HW_MISC_XLNX_VERSAL_CRL_H
60
+#define NPCM_PSPI_H
34
+
61
+
62
+#include "hw/ssi/ssi.h"
35
+#include "hw/sysbus.h"
63
+#include "hw/sysbus.h"
36
+#include "hw/register.h"
64
+
37
+#include "target/arm/cpu.h"
65
+/*
38
+
66
+ * Number of registers in our device state structure. Don't change this without
39
+#define TYPE_XLNX_VERSAL_CRL "xlnx,versal-crl"
67
+ * incrementing the version_id in the vmstate.
40
+OBJECT_DECLARE_SIMPLE_TYPE(XlnxVersalCRL, XLNX_VERSAL_CRL)
68
+ */
41
+
69
+#define NPCM_PSPI_NR_REGS 3
42
+REG32(ERR_CTRL, 0x0)
70
+
43
+ FIELD(ERR_CTRL, SLVERR_ENABLE, 0, 1)
71
+/**
44
+REG32(IR_STATUS, 0x4)
72
+ * NPCMPSPIState - Device state for one Flash Interface Unit.
45
+ FIELD(IR_STATUS, ADDR_DECODE_ERR, 0, 1)
73
+ * @parent: System bus device.
46
+REG32(IR_MASK, 0x8)
74
+ * @mmio: Memory region for register access.
47
+ FIELD(IR_MASK, ADDR_DECODE_ERR, 0, 1)
75
+ * @spi: The SPI bus mastered by this controller.
48
+REG32(IR_ENABLE, 0xc)
76
+ * @regs: Register contents.
49
+ FIELD(IR_ENABLE, ADDR_DECODE_ERR, 0, 1)
77
+ * @irq: The interrupt request queue for this module.
50
+REG32(IR_DISABLE, 0x10)
78
+ *
51
+ FIELD(IR_DISABLE, ADDR_DECODE_ERR, 0, 1)
79
+ * Each PSPI has a shared bank of registers, and controls up to four chip
52
+REG32(WPROT, 0x1c)
80
+ * selects. Each chip select has a dedicated memory region which may be used to
53
+ FIELD(WPROT, ACTIVE, 0, 1)
81
+ * read and write the flash connected to that chip select as if it were memory.
54
+REG32(PLL_CLK_OTHER_DMN, 0x20)
82
+ */
55
+ FIELD(PLL_CLK_OTHER_DMN, APLL_BYPASS, 0, 1)
83
+typedef struct NPCMPSPIState {
56
+REG32(RPLL_CTRL, 0x40)
84
+ SysBusDevice parent;
57
+ FIELD(RPLL_CTRL, POST_SRC, 24, 3)
85
+
58
+ FIELD(RPLL_CTRL, PRE_SRC, 20, 3)
86
+ MemoryRegion mmio;
59
+ FIELD(RPLL_CTRL, CLKOUTDIV, 16, 2)
87
+
60
+ FIELD(RPLL_CTRL, FBDIV, 8, 8)
88
+ SSIBus *spi;
61
+ FIELD(RPLL_CTRL, BYPASS, 3, 1)
89
+ uint16_t regs[NPCM_PSPI_NR_REGS];
62
+ FIELD(RPLL_CTRL, RESET, 0, 1)
63
+REG32(RPLL_CFG, 0x44)
64
+ FIELD(RPLL_CFG, LOCK_DLY, 25, 7)
65
+ FIELD(RPLL_CFG, LOCK_CNT, 13, 10)
66
+ FIELD(RPLL_CFG, LFHF, 10, 2)
67
+ FIELD(RPLL_CFG, CP, 5, 4)
68
+ FIELD(RPLL_CFG, RES, 0, 4)
69
+REG32(RPLL_FRAC_CFG, 0x48)
70
+ FIELD(RPLL_FRAC_CFG, ENABLED, 31, 1)
71
+ FIELD(RPLL_FRAC_CFG, SEED, 22, 3)
72
+ FIELD(RPLL_FRAC_CFG, ALGRTHM, 19, 1)
73
+ FIELD(RPLL_FRAC_CFG, ORDER, 18, 1)
74
+ FIELD(RPLL_FRAC_CFG, DATA, 0, 16)
75
+REG32(PLL_STATUS, 0x50)
76
+ FIELD(PLL_STATUS, RPLL_STABLE, 2, 1)
77
+ FIELD(PLL_STATUS, RPLL_LOCK, 0, 1)
78
+REG32(RPLL_TO_XPD_CTRL, 0x100)
79
+ FIELD(RPLL_TO_XPD_CTRL, CLKACT, 25, 1)
80
+ FIELD(RPLL_TO_XPD_CTRL, DIVISOR0, 8, 10)
81
+REG32(LPD_TOP_SWITCH_CTRL, 0x104)
82
+ FIELD(LPD_TOP_SWITCH_CTRL, CLKACT_ADMA, 26, 1)
83
+ FIELD(LPD_TOP_SWITCH_CTRL, CLKACT, 25, 1)
84
+ FIELD(LPD_TOP_SWITCH_CTRL, DIVISOR0, 8, 10)
85
+ FIELD(LPD_TOP_SWITCH_CTRL, SRCSEL, 0, 3)
86
+REG32(LPD_LSBUS_CTRL, 0x108)
87
+ FIELD(LPD_LSBUS_CTRL, CLKACT, 25, 1)
88
+ FIELD(LPD_LSBUS_CTRL, DIVISOR0, 8, 10)
89
+ FIELD(LPD_LSBUS_CTRL, SRCSEL, 0, 3)
90
+REG32(CPU_R5_CTRL, 0x10c)
91
+ FIELD(CPU_R5_CTRL, CLKACT_OCM2, 28, 1)
92
+ FIELD(CPU_R5_CTRL, CLKACT_OCM, 27, 1)
93
+ FIELD(CPU_R5_CTRL, CLKACT_CORE, 26, 1)
94
+ FIELD(CPU_R5_CTRL, CLKACT, 25, 1)
95
+ FIELD(CPU_R5_CTRL, DIVISOR0, 8, 10)
96
+ FIELD(CPU_R5_CTRL, SRCSEL, 0, 3)
97
+REG32(IOU_SWITCH_CTRL, 0x114)
98
+ FIELD(IOU_SWITCH_CTRL, CLKACT, 25, 1)
99
+ FIELD(IOU_SWITCH_CTRL, DIVISOR0, 8, 10)
100
+ FIELD(IOU_SWITCH_CTRL, SRCSEL, 0, 3)
101
+REG32(GEM0_REF_CTRL, 0x118)
102
+ FIELD(GEM0_REF_CTRL, CLKACT_RX, 27, 1)
103
+ FIELD(GEM0_REF_CTRL, CLKACT_TX, 26, 1)
104
+ FIELD(GEM0_REF_CTRL, CLKACT, 25, 1)
105
+ FIELD(GEM0_REF_CTRL, DIVISOR0, 8, 10)
106
+ FIELD(GEM0_REF_CTRL, SRCSEL, 0, 3)
107
+REG32(GEM1_REF_CTRL, 0x11c)
108
+ FIELD(GEM1_REF_CTRL, CLKACT_RX, 27, 1)
109
+ FIELD(GEM1_REF_CTRL, CLKACT_TX, 26, 1)
110
+ FIELD(GEM1_REF_CTRL, CLKACT, 25, 1)
111
+ FIELD(GEM1_REF_CTRL, DIVISOR0, 8, 10)
112
+ FIELD(GEM1_REF_CTRL, SRCSEL, 0, 3)
113
+REG32(GEM_TSU_REF_CTRL, 0x120)
114
+ FIELD(GEM_TSU_REF_CTRL, CLKACT, 25, 1)
115
+ FIELD(GEM_TSU_REF_CTRL, DIVISOR0, 8, 10)
116
+ FIELD(GEM_TSU_REF_CTRL, SRCSEL, 0, 3)
117
+REG32(USB0_BUS_REF_CTRL, 0x124)
118
+ FIELD(USB0_BUS_REF_CTRL, CLKACT, 25, 1)
119
+ FIELD(USB0_BUS_REF_CTRL, DIVISOR0, 8, 10)
120
+ FIELD(USB0_BUS_REF_CTRL, SRCSEL, 0, 3)
121
+REG32(UART0_REF_CTRL, 0x128)
122
+ FIELD(UART0_REF_CTRL, CLKACT, 25, 1)
123
+ FIELD(UART0_REF_CTRL, DIVISOR0, 8, 10)
124
+ FIELD(UART0_REF_CTRL, SRCSEL, 0, 3)
125
+REG32(UART1_REF_CTRL, 0x12c)
126
+ FIELD(UART1_REF_CTRL, CLKACT, 25, 1)
127
+ FIELD(UART1_REF_CTRL, DIVISOR0, 8, 10)
128
+ FIELD(UART1_REF_CTRL, SRCSEL, 0, 3)
129
+REG32(SPI0_REF_CTRL, 0x130)
130
+ FIELD(SPI0_REF_CTRL, CLKACT, 25, 1)
131
+ FIELD(SPI0_REF_CTRL, DIVISOR0, 8, 10)
132
+ FIELD(SPI0_REF_CTRL, SRCSEL, 0, 3)
133
+REG32(SPI1_REF_CTRL, 0x134)
134
+ FIELD(SPI1_REF_CTRL, CLKACT, 25, 1)
135
+ FIELD(SPI1_REF_CTRL, DIVISOR0, 8, 10)
136
+ FIELD(SPI1_REF_CTRL, SRCSEL, 0, 3)
137
+REG32(CAN0_REF_CTRL, 0x138)
138
+ FIELD(CAN0_REF_CTRL, CLKACT, 25, 1)
139
+ FIELD(CAN0_REF_CTRL, DIVISOR0, 8, 10)
140
+ FIELD(CAN0_REF_CTRL, SRCSEL, 0, 3)
141
+REG32(CAN1_REF_CTRL, 0x13c)
142
+ FIELD(CAN1_REF_CTRL, CLKACT, 25, 1)
143
+ FIELD(CAN1_REF_CTRL, DIVISOR0, 8, 10)
144
+ FIELD(CAN1_REF_CTRL, SRCSEL, 0, 3)
145
+REG32(I2C0_REF_CTRL, 0x140)
146
+ FIELD(I2C0_REF_CTRL, CLKACT, 25, 1)
147
+ FIELD(I2C0_REF_CTRL, DIVISOR0, 8, 10)
148
+ FIELD(I2C0_REF_CTRL, SRCSEL, 0, 3)
149
+REG32(I2C1_REF_CTRL, 0x144)
150
+ FIELD(I2C1_REF_CTRL, CLKACT, 25, 1)
151
+ FIELD(I2C1_REF_CTRL, DIVISOR0, 8, 10)
152
+ FIELD(I2C1_REF_CTRL, SRCSEL, 0, 3)
153
+REG32(DBG_LPD_CTRL, 0x148)
154
+ FIELD(DBG_LPD_CTRL, CLKACT, 25, 1)
155
+ FIELD(DBG_LPD_CTRL, DIVISOR0, 8, 10)
156
+ FIELD(DBG_LPD_CTRL, SRCSEL, 0, 3)
157
+REG32(TIMESTAMP_REF_CTRL, 0x14c)
158
+ FIELD(TIMESTAMP_REF_CTRL, CLKACT, 25, 1)
159
+ FIELD(TIMESTAMP_REF_CTRL, DIVISOR0, 8, 10)
160
+ FIELD(TIMESTAMP_REF_CTRL, SRCSEL, 0, 3)
161
+REG32(CRL_SAFETY_CHK, 0x150)
162
+REG32(PSM_REF_CTRL, 0x154)
163
+ FIELD(PSM_REF_CTRL, DIVISOR0, 8, 10)
164
+ FIELD(PSM_REF_CTRL, SRCSEL, 0, 3)
165
+REG32(DBG_TSTMP_CTRL, 0x158)
166
+ FIELD(DBG_TSTMP_CTRL, CLKACT, 25, 1)
167
+ FIELD(DBG_TSTMP_CTRL, DIVISOR0, 8, 10)
168
+ FIELD(DBG_TSTMP_CTRL, SRCSEL, 0, 3)
169
+REG32(CPM_TOPSW_REF_CTRL, 0x15c)
170
+ FIELD(CPM_TOPSW_REF_CTRL, CLKACT, 25, 1)
171
+ FIELD(CPM_TOPSW_REF_CTRL, DIVISOR0, 8, 10)
172
+ FIELD(CPM_TOPSW_REF_CTRL, SRCSEL, 0, 3)
173
+REG32(USB3_DUAL_REF_CTRL, 0x160)
174
+ FIELD(USB3_DUAL_REF_CTRL, CLKACT, 25, 1)
175
+ FIELD(USB3_DUAL_REF_CTRL, DIVISOR0, 8, 10)
176
+ FIELD(USB3_DUAL_REF_CTRL, SRCSEL, 0, 3)
177
+REG32(RST_CPU_R5, 0x300)
178
+ FIELD(RST_CPU_R5, RESET_PGE, 4, 1)
179
+ FIELD(RST_CPU_R5, RESET_AMBA, 2, 1)
180
+ FIELD(RST_CPU_R5, RESET_CPU1, 1, 1)
181
+ FIELD(RST_CPU_R5, RESET_CPU0, 0, 1)
182
+REG32(RST_ADMA, 0x304)
183
+ FIELD(RST_ADMA, RESET, 0, 1)
184
+REG32(RST_GEM0, 0x308)
185
+ FIELD(RST_GEM0, RESET, 0, 1)
186
+REG32(RST_GEM1, 0x30c)
187
+ FIELD(RST_GEM1, RESET, 0, 1)
188
+REG32(RST_SPARE, 0x310)
189
+ FIELD(RST_SPARE, RESET, 0, 1)
190
+REG32(RST_USB0, 0x314)
191
+ FIELD(RST_USB0, RESET, 0, 1)
192
+REG32(RST_UART0, 0x318)
193
+ FIELD(RST_UART0, RESET, 0, 1)
194
+REG32(RST_UART1, 0x31c)
195
+ FIELD(RST_UART1, RESET, 0, 1)
196
+REG32(RST_SPI0, 0x320)
197
+ FIELD(RST_SPI0, RESET, 0, 1)
198
+REG32(RST_SPI1, 0x324)
199
+ FIELD(RST_SPI1, RESET, 0, 1)
200
+REG32(RST_CAN0, 0x328)
201
+ FIELD(RST_CAN0, RESET, 0, 1)
202
+REG32(RST_CAN1, 0x32c)
203
+ FIELD(RST_CAN1, RESET, 0, 1)
204
+REG32(RST_I2C0, 0x330)
205
+ FIELD(RST_I2C0, RESET, 0, 1)
206
+REG32(RST_I2C1, 0x334)
207
+ FIELD(RST_I2C1, RESET, 0, 1)
208
+REG32(RST_DBG_LPD, 0x338)
209
+ FIELD(RST_DBG_LPD, RPU_DBG1_RESET, 5, 1)
210
+ FIELD(RST_DBG_LPD, RPU_DBG0_RESET, 4, 1)
211
+ FIELD(RST_DBG_LPD, RESET_HSDP, 1, 1)
212
+ FIELD(RST_DBG_LPD, RESET, 0, 1)
213
+REG32(RST_GPIO, 0x33c)
214
+ FIELD(RST_GPIO, RESET, 0, 1)
215
+REG32(RST_TTC, 0x344)
216
+ FIELD(RST_TTC, TTC3_RESET, 3, 1)
217
+ FIELD(RST_TTC, TTC2_RESET, 2, 1)
218
+ FIELD(RST_TTC, TTC1_RESET, 1, 1)
219
+ FIELD(RST_TTC, TTC0_RESET, 0, 1)
220
+REG32(RST_TIMESTAMP, 0x348)
221
+ FIELD(RST_TIMESTAMP, RESET, 0, 1)
222
+REG32(RST_SWDT, 0x34c)
223
+ FIELD(RST_SWDT, RESET, 0, 1)
224
+REG32(RST_OCM, 0x350)
225
+ FIELD(RST_OCM, RESET, 0, 1)
226
+REG32(RST_IPI, 0x354)
227
+ FIELD(RST_IPI, RESET, 0, 1)
228
+REG32(RST_SYSMON, 0x358)
229
+ FIELD(RST_SYSMON, SEQ_RST, 1, 1)
230
+ FIELD(RST_SYSMON, CFG_RST, 0, 1)
231
+REG32(RST_FPD, 0x360)
232
+ FIELD(RST_FPD, SRST, 1, 1)
233
+ FIELD(RST_FPD, POR, 0, 1)
234
+REG32(PSM_RST_MODE, 0x370)
235
+ FIELD(PSM_RST_MODE, WAKEUP, 2, 1)
236
+ FIELD(PSM_RST_MODE, RST_MODE, 0, 2)
237
+
238
+#define CRL_R_MAX (R_PSM_RST_MODE + 1)
239
+
240
+#define RPU_MAX_CPU 2
241
+
242
+struct XlnxVersalCRL {
243
+ SysBusDevice parent_obj;
244
+ qemu_irq irq;
90
+ qemu_irq irq;
245
+
91
+} NPCMPSPIState;
246
+ struct {
92
+
247
+ ARMCPU *cpu_r5[RPU_MAX_CPU];
93
+#define TYPE_NPCM_PSPI "npcm-pspi"
248
+ DeviceState *adma[8];
94
+OBJECT_DECLARE_SIMPLE_TYPE(NPCMPSPIState, NPCM_PSPI)
249
+ DeviceState *uart[2];
95
+
250
+ DeviceState *gem[2];
96
+#endif /* NPCM_PSPI_H */
251
+ DeviceState *usb;
97
diff --git a/hw/ssi/npcm_pspi.c b/hw/ssi/npcm_pspi.c
252
+ } cfg;
253
+
254
+ RegisterInfoArray *reg_array;
255
+ uint32_t regs[CRL_R_MAX];
256
+ RegisterInfo regs_info[CRL_R_MAX];
257
+};
258
+#endif
259
diff --git a/hw/misc/xlnx-versal-crl.c b/hw/misc/xlnx-versal-crl.c
260
new file mode 100644
98
new file mode 100644
261
index XXXXXXX..XXXXXXX
99
index XXXXXXX..XXXXXXX
262
--- /dev/null
100
--- /dev/null
263
+++ b/hw/misc/xlnx-versal-crl.c
101
+++ b/hw/ssi/npcm_pspi.c
264
@@ -XXX,XX +XXX,XX @@
102
@@ -XXX,XX +XXX,XX @@
265
+/*
103
+/*
266
+ * QEMU model of the Clock-Reset-LPD (CRL).
104
+ * Nuvoton NPCM Peripheral SPI Module (PSPI)
267
+ *
105
+ *
268
+ * Copyright (c) 2022 Advanced Micro Devices, Inc.
106
+ * Copyright 2023 Google LLC
269
+ * SPDX-License-Identifier: GPL-2.0-or-later
107
+ *
270
+ *
108
+ * This program is free software; you can redistribute it and/or modify it
271
+ * Written by Edgar E. Iglesias <edgar.iglesias@amd.com>
109
+ * under the terms of the GNU General Public License as published by the
110
+ * Free Software Foundation; either version 2 of the License, or
111
+ * (at your option) any later version.
112
+ *
113
+ * This program is distributed in the hope that it will be useful, but WITHOUT
114
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
115
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
116
+ * for more details.
272
+ */
117
+ */
273
+
118
+
274
+#include "qemu/osdep.h"
119
+#include "qemu/osdep.h"
120
+
121
+#include "hw/irq.h"
122
+#include "hw/registerfields.h"
123
+#include "hw/ssi/npcm_pspi.h"
124
+#include "migration/vmstate.h"
275
+#include "qapi/error.h"
125
+#include "qapi/error.h"
126
+#include "qemu/error-report.h"
276
+#include "qemu/log.h"
127
+#include "qemu/log.h"
277
+#include "qemu/bitops.h"
128
+#include "qemu/module.h"
278
+#include "migration/vmstate.h"
129
+#include "qemu/units.h"
279
+#include "hw/qdev-properties.h"
130
+
280
+#include "hw/sysbus.h"
131
+#include "trace.h"
281
+#include "hw/irq.h"
132
+
282
+#include "hw/register.h"
133
+REG16(PSPI_DATA, 0x0)
283
+#include "hw/resettable.h"
134
+REG16(PSPI_CTL1, 0x2)
284
+
135
+ FIELD(PSPI_CTL1, SPIEN, 0, 1)
285
+#include "target/arm/arm-powerctl.h"
136
+ FIELD(PSPI_CTL1, MOD, 2, 1)
286
+#include "hw/misc/xlnx-versal-crl.h"
137
+ FIELD(PSPI_CTL1, EIR, 5, 1)
287
+
138
+ FIELD(PSPI_CTL1, EIW, 6, 1)
288
+#ifndef XLNX_VERSAL_CRL_ERR_DEBUG
139
+ FIELD(PSPI_CTL1, SCM, 7, 1)
289
+#define XLNX_VERSAL_CRL_ERR_DEBUG 0
140
+ FIELD(PSPI_CTL1, SCIDL, 8, 1)
290
+#endif
141
+ FIELD(PSPI_CTL1, SCDV, 9, 7)
291
+
142
+REG16(PSPI_STAT, 0x4)
292
+static void crl_update_irq(XlnxVersalCRL *s)
143
+ FIELD(PSPI_STAT, BSY, 0, 1)
293
+{
144
+ FIELD(PSPI_STAT, RBF, 1, 1)
294
+ bool pending = s->regs[R_IR_STATUS] & ~s->regs[R_IR_MASK];
145
+
295
+ qemu_set_irq(s->irq, pending);
146
+static void npcm_pspi_update_irq(NPCMPSPIState *s)
296
+}
147
+{
297
+
148
+ int level = 0;
298
+static void crl_status_postw(RegisterInfo *reg, uint64_t val64)
149
+
299
+{
150
+ /* Only fire IRQ when the module is enabled. */
300
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
151
+ if (FIELD_EX16(s->regs[R_PSPI_CTL1], PSPI_CTL1, SPIEN)) {
301
+ crl_update_irq(s);
152
+ /* Update interrupt as BSY is cleared. */
302
+}
153
+ if ((!FIELD_EX16(s->regs[R_PSPI_STAT], PSPI_STAT, BSY)) &&
303
+
154
+ FIELD_EX16(s->regs[R_PSPI_CTL1], PSPI_CTL1, EIW)) {
304
+static uint64_t crl_enable_prew(RegisterInfo *reg, uint64_t val64)
155
+ level = 1;
305
+{
156
+ }
306
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
157
+
307
+ uint32_t val = val64;
158
+ /* Update interrupt as RBF is set. */
308
+
159
+ if (FIELD_EX16(s->regs[R_PSPI_STAT], PSPI_STAT, RBF) &&
309
+ s->regs[R_IR_MASK] &= ~val;
160
+ FIELD_EX16(s->regs[R_PSPI_CTL1], PSPI_CTL1, EIR)) {
310
+ crl_update_irq(s);
161
+ level = 1;
311
+ return 0;
162
+ }
312
+}
313
+
314
+static uint64_t crl_disable_prew(RegisterInfo *reg, uint64_t val64)
315
+{
316
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
317
+ uint32_t val = val64;
318
+
319
+ s->regs[R_IR_MASK] |= val;
320
+ crl_update_irq(s);
321
+ return 0;
322
+}
323
+
324
+static void crl_reset_dev(XlnxVersalCRL *s, DeviceState *dev,
325
+ bool rst_old, bool rst_new)
326
+{
327
+ device_cold_reset(dev);
328
+}
329
+
330
+static void crl_reset_cpu(XlnxVersalCRL *s, ARMCPU *armcpu,
331
+ bool rst_old, bool rst_new)
332
+{
333
+ if (rst_new) {
334
+ arm_set_cpu_off(armcpu->mp_affinity);
335
+ } else {
336
+ arm_set_cpu_on_and_reset(armcpu->mp_affinity);
337
+ }
163
+ }
338
+}
164
+ qemu_set_irq(s->irq, level);
339
+
165
+}
340
+#define REGFIELD_RESET(type, s, reg, f, new_val, dev) { \
166
+
341
+ bool old_f = ARRAY_FIELD_EX32((s)->regs, reg, f); \
167
+static uint16_t npcm_pspi_read_data(NPCMPSPIState *s)
342
+ bool new_f = FIELD_EX32(new_val, reg, f); \
168
+{
343
+ \
169
+ uint16_t value = s->regs[R_PSPI_DATA];
344
+ /* Detect edges. */ \
170
+
345
+ if (dev && old_f != new_f) { \
171
+ /* Clear stat bits as the value are read out. */
346
+ crl_reset_ ## type(s, dev, old_f, new_f); \
172
+ s->regs[R_PSPI_STAT] = 0;
347
+ } \
173
+
348
+}
174
+ return value;
349
+
175
+}
350
+static uint64_t crl_rst_r5_prew(RegisterInfo *reg, uint64_t val64)
176
+
351
+{
177
+static void npcm_pspi_write_data(NPCMPSPIState *s, uint16_t data)
352
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
178
+{
353
+
179
+ uint16_t value = 0;
354
+ REGFIELD_RESET(cpu, s, RST_CPU_R5, RESET_CPU0, val64, s->cfg.cpu_r5[0]);
180
+
355
+ REGFIELD_RESET(cpu, s, RST_CPU_R5, RESET_CPU1, val64, s->cfg.cpu_r5[1]);
181
+ if (FIELD_EX16(s->regs[R_PSPI_CTL1], PSPI_CTL1, MOD)) {
356
+ return val64;
182
+ value = ssi_transfer(s->spi, extract16(data, 8, 8)) << 8;
357
+}
358
+
359
+static uint64_t crl_rst_adma_prew(RegisterInfo *reg, uint64_t val64)
360
+{
361
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
362
+ int i;
363
+
364
+ /* A single register fans out to all ADMA reset inputs. */
365
+ for (i = 0; i < ARRAY_SIZE(s->cfg.adma); i++) {
366
+ REGFIELD_RESET(dev, s, RST_ADMA, RESET, val64, s->cfg.adma[i]);
367
+ }
183
+ }
368
+ return val64;
184
+ value |= ssi_transfer(s->spi, extract16(data, 0, 8));
369
+}
185
+ s->regs[R_PSPI_DATA] = value;
370
+
186
+
371
+static uint64_t crl_rst_uart0_prew(RegisterInfo *reg, uint64_t val64)
187
+ /* Mark data as available */
372
+{
188
+ s->regs[R_PSPI_STAT] = R_PSPI_STAT_BSY_MASK | R_PSPI_STAT_RBF_MASK;
373
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
189
+}
374
+
190
+
375
+ REGFIELD_RESET(dev, s, RST_UART0, RESET, val64, s->cfg.uart[0]);
191
+/* Control register read handler. */
376
+ return val64;
192
+static uint64_t npcm_pspi_ctrl_read(void *opaque, hwaddr addr,
377
+}
193
+ unsigned int size)
378
+
194
+{
379
+static uint64_t crl_rst_uart1_prew(RegisterInfo *reg, uint64_t val64)
195
+ NPCMPSPIState *s = opaque;
380
+{
196
+ uint16_t value;
381
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
197
+
382
+
198
+ switch (addr) {
383
+ REGFIELD_RESET(dev, s, RST_UART1, RESET, val64, s->cfg.uart[1]);
199
+ case A_PSPI_DATA:
384
+ return val64;
200
+ value = npcm_pspi_read_data(s);
385
+}
201
+ break;
386
+
202
+
387
+static uint64_t crl_rst_gem0_prew(RegisterInfo *reg, uint64_t val64)
203
+ case A_PSPI_CTL1:
388
+{
204
+ value = s->regs[R_PSPI_CTL1];
389
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
205
+ break;
390
+
206
+
391
+ REGFIELD_RESET(dev, s, RST_GEM0, RESET, val64, s->cfg.gem[0]);
207
+ case A_PSPI_STAT:
392
+ return val64;
208
+ value = s->regs[R_PSPI_STAT];
393
+}
209
+ break;
394
+
210
+
395
+static uint64_t crl_rst_gem1_prew(RegisterInfo *reg, uint64_t val64)
211
+ default:
396
+{
212
+ qemu_log_mask(LOG_GUEST_ERROR,
397
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
213
+ "%s: write to invalid offset 0x%" PRIx64 "\n",
398
+
214
+ DEVICE(s)->canonical_path, addr);
399
+ REGFIELD_RESET(dev, s, RST_GEM1, RESET, val64, s->cfg.gem[1]);
215
+ return 0;
400
+ return val64;
401
+}
402
+
403
+static uint64_t crl_rst_usb_prew(RegisterInfo *reg, uint64_t val64)
404
+{
405
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
406
+
407
+ REGFIELD_RESET(dev, s, RST_USB0, RESET, val64, s->cfg.usb);
408
+ return val64;
409
+}
410
+
411
+static const RegisterAccessInfo crl_regs_info[] = {
412
+ { .name = "ERR_CTRL", .addr = A_ERR_CTRL,
413
+ },{ .name = "IR_STATUS", .addr = A_IR_STATUS,
414
+ .w1c = 0x1,
415
+ .post_write = crl_status_postw,
416
+ },{ .name = "IR_MASK", .addr = A_IR_MASK,
417
+ .reset = 0x1,
418
+ .ro = 0x1,
419
+ },{ .name = "IR_ENABLE", .addr = A_IR_ENABLE,
420
+ .pre_write = crl_enable_prew,
421
+ },{ .name = "IR_DISABLE", .addr = A_IR_DISABLE,
422
+ .pre_write = crl_disable_prew,
423
+ },{ .name = "WPROT", .addr = A_WPROT,
424
+ },{ .name = "PLL_CLK_OTHER_DMN", .addr = A_PLL_CLK_OTHER_DMN,
425
+ .reset = 0x1,
426
+ .rsvd = 0xe,
427
+ },{ .name = "RPLL_CTRL", .addr = A_RPLL_CTRL,
428
+ .reset = 0x24809,
429
+ .rsvd = 0xf88c00f6,
430
+ },{ .name = "RPLL_CFG", .addr = A_RPLL_CFG,
431
+ .reset = 0x2000000,
432
+ .rsvd = 0x1801210,
433
+ },{ .name = "RPLL_FRAC_CFG", .addr = A_RPLL_FRAC_CFG,
434
+ .rsvd = 0x7e330000,
435
+ },{ .name = "PLL_STATUS", .addr = A_PLL_STATUS,
436
+ .reset = R_PLL_STATUS_RPLL_STABLE_MASK |
437
+ R_PLL_STATUS_RPLL_LOCK_MASK,
438
+ .rsvd = 0xfa,
439
+ .ro = 0x5,
440
+ },{ .name = "RPLL_TO_XPD_CTRL", .addr = A_RPLL_TO_XPD_CTRL,
441
+ .reset = 0x2000100,
442
+ .rsvd = 0xfdfc00ff,
443
+ },{ .name = "LPD_TOP_SWITCH_CTRL", .addr = A_LPD_TOP_SWITCH_CTRL,
444
+ .reset = 0x6000300,
445
+ .rsvd = 0xf9fc00f8,
446
+ },{ .name = "LPD_LSBUS_CTRL", .addr = A_LPD_LSBUS_CTRL,
447
+ .reset = 0x2000800,
448
+ .rsvd = 0xfdfc00f8,
449
+ },{ .name = "CPU_R5_CTRL", .addr = A_CPU_R5_CTRL,
450
+ .reset = 0xe000300,
451
+ .rsvd = 0xe1fc00f8,
452
+ },{ .name = "IOU_SWITCH_CTRL", .addr = A_IOU_SWITCH_CTRL,
453
+ .reset = 0x2000500,
454
+ .rsvd = 0xfdfc00f8,
455
+ },{ .name = "GEM0_REF_CTRL", .addr = A_GEM0_REF_CTRL,
456
+ .reset = 0xe000a00,
457
+ .rsvd = 0xf1fc00f8,
458
+ },{ .name = "GEM1_REF_CTRL", .addr = A_GEM1_REF_CTRL,
459
+ .reset = 0xe000a00,
460
+ .rsvd = 0xf1fc00f8,
461
+ },{ .name = "GEM_TSU_REF_CTRL", .addr = A_GEM_TSU_REF_CTRL,
462
+ .reset = 0x300,
463
+ .rsvd = 0xfdfc00f8,
464
+ },{ .name = "USB0_BUS_REF_CTRL", .addr = A_USB0_BUS_REF_CTRL,
465
+ .reset = 0x2001900,
466
+ .rsvd = 0xfdfc00f8,
467
+ },{ .name = "UART0_REF_CTRL", .addr = A_UART0_REF_CTRL,
468
+ .reset = 0xc00,
469
+ .rsvd = 0xfdfc00f8,
470
+ },{ .name = "UART1_REF_CTRL", .addr = A_UART1_REF_CTRL,
471
+ .reset = 0xc00,
472
+ .rsvd = 0xfdfc00f8,
473
+ },{ .name = "SPI0_REF_CTRL", .addr = A_SPI0_REF_CTRL,
474
+ .reset = 0x600,
475
+ .rsvd = 0xfdfc00f8,
476
+ },{ .name = "SPI1_REF_CTRL", .addr = A_SPI1_REF_CTRL,
477
+ .reset = 0x600,
478
+ .rsvd = 0xfdfc00f8,
479
+ },{ .name = "CAN0_REF_CTRL", .addr = A_CAN0_REF_CTRL,
480
+ .reset = 0xc00,
481
+ .rsvd = 0xfdfc00f8,
482
+ },{ .name = "CAN1_REF_CTRL", .addr = A_CAN1_REF_CTRL,
483
+ .reset = 0xc00,
484
+ .rsvd = 0xfdfc00f8,
485
+ },{ .name = "I2C0_REF_CTRL", .addr = A_I2C0_REF_CTRL,
486
+ .reset = 0xc00,
487
+ .rsvd = 0xfdfc00f8,
488
+ },{ .name = "I2C1_REF_CTRL", .addr = A_I2C1_REF_CTRL,
489
+ .reset = 0xc00,
490
+ .rsvd = 0xfdfc00f8,
491
+ },{ .name = "DBG_LPD_CTRL", .addr = A_DBG_LPD_CTRL,
492
+ .reset = 0x300,
493
+ .rsvd = 0xfdfc00f8,
494
+ },{ .name = "TIMESTAMP_REF_CTRL", .addr = A_TIMESTAMP_REF_CTRL,
495
+ .reset = 0x2000c00,
496
+ .rsvd = 0xfdfc00f8,
497
+ },{ .name = "CRL_SAFETY_CHK", .addr = A_CRL_SAFETY_CHK,
498
+ },{ .name = "PSM_REF_CTRL", .addr = A_PSM_REF_CTRL,
499
+ .reset = 0xf04,
500
+ .rsvd = 0xfffc00f8,
501
+ },{ .name = "DBG_TSTMP_CTRL", .addr = A_DBG_TSTMP_CTRL,
502
+ .reset = 0x300,
503
+ .rsvd = 0xfdfc00f8,
504
+ },{ .name = "CPM_TOPSW_REF_CTRL", .addr = A_CPM_TOPSW_REF_CTRL,
505
+ .reset = 0x300,
506
+ .rsvd = 0xfdfc00f8,
507
+ },{ .name = "USB3_DUAL_REF_CTRL", .addr = A_USB3_DUAL_REF_CTRL,
508
+ .reset = 0x3c00,
509
+ .rsvd = 0xfdfc00f8,
510
+ },{ .name = "RST_CPU_R5", .addr = A_RST_CPU_R5,
511
+ .reset = 0x17,
512
+ .rsvd = 0x8,
513
+ .pre_write = crl_rst_r5_prew,
514
+ },{ .name = "RST_ADMA", .addr = A_RST_ADMA,
515
+ .reset = 0x1,
516
+ .pre_write = crl_rst_adma_prew,
517
+ },{ .name = "RST_GEM0", .addr = A_RST_GEM0,
518
+ .reset = 0x1,
519
+ .pre_write = crl_rst_gem0_prew,
520
+ },{ .name = "RST_GEM1", .addr = A_RST_GEM1,
521
+ .reset = 0x1,
522
+ .pre_write = crl_rst_gem1_prew,
523
+ },{ .name = "RST_SPARE", .addr = A_RST_SPARE,
524
+ .reset = 0x1,
525
+ },{ .name = "RST_USB0", .addr = A_RST_USB0,
526
+ .reset = 0x1,
527
+ .pre_write = crl_rst_usb_prew,
528
+ },{ .name = "RST_UART0", .addr = A_RST_UART0,
529
+ .reset = 0x1,
530
+ .pre_write = crl_rst_uart0_prew,
531
+ },{ .name = "RST_UART1", .addr = A_RST_UART1,
532
+ .reset = 0x1,
533
+ .pre_write = crl_rst_uart1_prew,
534
+ },{ .name = "RST_SPI0", .addr = A_RST_SPI0,
535
+ .reset = 0x1,
536
+ },{ .name = "RST_SPI1", .addr = A_RST_SPI1,
537
+ .reset = 0x1,
538
+ },{ .name = "RST_CAN0", .addr = A_RST_CAN0,
539
+ .reset = 0x1,
540
+ },{ .name = "RST_CAN1", .addr = A_RST_CAN1,
541
+ .reset = 0x1,
542
+ },{ .name = "RST_I2C0", .addr = A_RST_I2C0,
543
+ .reset = 0x1,
544
+ },{ .name = "RST_I2C1", .addr = A_RST_I2C1,
545
+ .reset = 0x1,
546
+ },{ .name = "RST_DBG_LPD", .addr = A_RST_DBG_LPD,
547
+ .reset = 0x33,
548
+ .rsvd = 0xcc,
549
+ },{ .name = "RST_GPIO", .addr = A_RST_GPIO,
550
+ .reset = 0x1,
551
+ },{ .name = "RST_TTC", .addr = A_RST_TTC,
552
+ .reset = 0xf,
553
+ },{ .name = "RST_TIMESTAMP", .addr = A_RST_TIMESTAMP,
554
+ .reset = 0x1,
555
+ },{ .name = "RST_SWDT", .addr = A_RST_SWDT,
556
+ .reset = 0x1,
557
+ },{ .name = "RST_OCM", .addr = A_RST_OCM,
558
+ },{ .name = "RST_IPI", .addr = A_RST_IPI,
559
+ },{ .name = "RST_FPD", .addr = A_RST_FPD,
560
+ .reset = 0x3,
561
+ },{ .name = "PSM_RST_MODE", .addr = A_PSM_RST_MODE,
562
+ .reset = 0x1,
563
+ .rsvd = 0xf8,
564
+ }
216
+ }
565
+};
217
+ trace_npcm_pspi_ctrl_read(DEVICE(s)->canonical_path, addr, value);
566
+
218
+ npcm_pspi_update_irq(s);
567
+static void crl_reset_enter(Object *obj, ResetType type)
219
+
568
+{
220
+ return value;
569
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj);
221
+}
570
+ unsigned int i;
222
+
571
+
223
+/* Control register write handler. */
572
+ for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
224
+static void npcm_pspi_ctrl_write(void *opaque, hwaddr addr, uint64_t v,
573
+ register_reset(&s->regs_info[i]);
225
+ unsigned int size)
226
+{
227
+ NPCMPSPIState *s = opaque;
228
+ uint16_t value = v;
229
+
230
+ trace_npcm_pspi_ctrl_write(DEVICE(s)->canonical_path, addr, value);
231
+
232
+ switch (addr) {
233
+ case A_PSPI_DATA:
234
+ npcm_pspi_write_data(s, value);
235
+ break;
236
+
237
+ case A_PSPI_CTL1:
238
+ s->regs[R_PSPI_CTL1] = value;
239
+ break;
240
+
241
+ case A_PSPI_STAT:
242
+ qemu_log_mask(LOG_GUEST_ERROR,
243
+ "%s: write to read-only register PSPI_STAT: 0x%08"
244
+ PRIx64 "\n", DEVICE(s)->canonical_path, v);
245
+ break;
246
+
247
+ default:
248
+ qemu_log_mask(LOG_GUEST_ERROR,
249
+ "%s: write to invalid offset 0x%" PRIx64 "\n",
250
+ DEVICE(s)->canonical_path, addr);
251
+ return;
574
+ }
252
+ }
575
+}
253
+ npcm_pspi_update_irq(s);
576
+
254
+}
577
+static void crl_reset_hold(Object *obj)
255
+
578
+{
256
+static const MemoryRegionOps npcm_pspi_ctrl_ops = {
579
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj);
257
+ .read = npcm_pspi_ctrl_read,
580
+
258
+ .write = npcm_pspi_ctrl_write,
581
+ crl_update_irq(s);
582
+}
583
+
584
+static const MemoryRegionOps crl_ops = {
585
+ .read = register_read_memory,
586
+ .write = register_write_memory,
587
+ .endianness = DEVICE_LITTLE_ENDIAN,
259
+ .endianness = DEVICE_LITTLE_ENDIAN,
588
+ .valid = {
260
+ .valid = {
589
+ .min_access_size = 4,
261
+ .min_access_size = 1,
590
+ .max_access_size = 4,
262
+ .max_access_size = 2,
263
+ .unaligned = false,
264
+ },
265
+ .impl = {
266
+ .min_access_size = 2,
267
+ .max_access_size = 2,
268
+ .unaligned = false,
591
+ },
269
+ },
592
+};
270
+};
593
+
271
+
594
+static void crl_init(Object *obj)
272
+static void npcm_pspi_enter_reset(Object *obj, ResetType type)
595
+{
273
+{
596
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj);
274
+ NPCMPSPIState *s = NPCM_PSPI(obj);
597
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
275
+
598
+ int i;
276
+ trace_npcm_pspi_enter_reset(DEVICE(obj)->canonical_path, type);
599
+
277
+ memset(s->regs, 0, sizeof(s->regs));
600
+ s->reg_array =
278
+}
601
+ register_init_block32(DEVICE(obj), crl_regs_info,
279
+
602
+ ARRAY_SIZE(crl_regs_info),
280
+static void npcm_pspi_realize(DeviceState *dev, Error **errp)
603
+ s->regs_info, s->regs,
281
+{
604
+ &crl_ops,
282
+ NPCMPSPIState *s = NPCM_PSPI(dev);
605
+ XLNX_VERSAL_CRL_ERR_DEBUG,
283
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
606
+ CRL_R_MAX * 4);
284
+ Object *obj = OBJECT(dev);
607
+ sysbus_init_mmio(sbd, &s->reg_array->mem);
285
+
286
+ s->spi = ssi_create_bus(dev, "pspi");
287
+ memory_region_init_io(&s->mmio, obj, &npcm_pspi_ctrl_ops, s,
288
+ "mmio", 4 * KiB);
289
+ sysbus_init_mmio(sbd, &s->mmio);
608
+ sysbus_init_irq(sbd, &s->irq);
290
+ sysbus_init_irq(sbd, &s->irq);
609
+
291
+}
610
+ for (i = 0; i < ARRAY_SIZE(s->cfg.cpu_r5); ++i) {
292
+
611
+ object_property_add_link(obj, "cpu_r5[*]", TYPE_ARM_CPU,
293
+static const VMStateDescription vmstate_npcm_pspi = {
612
+ (Object **)&s->cfg.cpu_r5[i],
294
+ .name = "npcm-pspi",
613
+ qdev_prop_allow_set_link_before_realize,
295
+ .version_id = 0,
614
+ OBJ_PROP_LINK_STRONG);
296
+ .minimum_version_id = 0,
615
+ }
616
+
617
+ for (i = 0; i < ARRAY_SIZE(s->cfg.adma); ++i) {
618
+ object_property_add_link(obj, "adma[*]", TYPE_DEVICE,
619
+ (Object **)&s->cfg.adma[i],
620
+ qdev_prop_allow_set_link_before_realize,
621
+ OBJ_PROP_LINK_STRONG);
622
+ }
623
+
624
+ for (i = 0; i < ARRAY_SIZE(s->cfg.uart); ++i) {
625
+ object_property_add_link(obj, "uart[*]", TYPE_DEVICE,
626
+ (Object **)&s->cfg.uart[i],
627
+ qdev_prop_allow_set_link_before_realize,
628
+ OBJ_PROP_LINK_STRONG);
629
+ }
630
+
631
+ for (i = 0; i < ARRAY_SIZE(s->cfg.gem); ++i) {
632
+ object_property_add_link(obj, "gem[*]", TYPE_DEVICE,
633
+ (Object **)&s->cfg.gem[i],
634
+ qdev_prop_allow_set_link_before_realize,
635
+ OBJ_PROP_LINK_STRONG);
636
+ }
637
+
638
+ object_property_add_link(obj, "usb", TYPE_DEVICE,
639
+ (Object **)&s->cfg.gem[i],
640
+ qdev_prop_allow_set_link_before_realize,
641
+ OBJ_PROP_LINK_STRONG);
642
+}
643
+
644
+static void crl_finalize(Object *obj)
645
+{
646
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj);
647
+ register_finalize_block(s->reg_array);
648
+}
649
+
650
+static const VMStateDescription vmstate_crl = {
651
+ .name = TYPE_XLNX_VERSAL_CRL,
652
+ .version_id = 1,
653
+ .minimum_version_id = 1,
654
+ .fields = (VMStateField[]) {
297
+ .fields = (VMStateField[]) {
655
+ VMSTATE_UINT32_ARRAY(regs, XlnxVersalCRL, CRL_R_MAX),
298
+ VMSTATE_UINT16_ARRAY(regs, NPCMPSPIState, NPCM_PSPI_NR_REGS),
656
+ VMSTATE_END_OF_LIST(),
299
+ VMSTATE_END_OF_LIST(),
657
+ }
300
+ },
658
+};
301
+};
659
+
302
+
660
+static void crl_class_init(ObjectClass *klass, void *data)
303
+
304
+static void npcm_pspi_class_init(ObjectClass *klass, void *data)
661
+{
305
+{
662
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
306
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
663
+ DeviceClass *dc = DEVICE_CLASS(klass);
307
+ DeviceClass *dc = DEVICE_CLASS(klass);
664
+
308
+
665
+ dc->vmsd = &vmstate_crl;
309
+ dc->desc = "NPCM Peripheral SPI Module";
666
+
310
+ dc->realize = npcm_pspi_realize;
667
+ rc->phases.enter = crl_reset_enter;
311
+ dc->vmsd = &vmstate_npcm_pspi;
668
+ rc->phases.hold = crl_reset_hold;
312
+ rc->phases.enter = npcm_pspi_enter_reset;
669
+}
313
+}
670
+
314
+
671
+static const TypeInfo crl_info = {
315
+static const TypeInfo npcm_pspi_types[] = {
672
+ .name = TYPE_XLNX_VERSAL_CRL,
316
+ {
673
+ .parent = TYPE_SYS_BUS_DEVICE,
317
+ .name = TYPE_NPCM_PSPI,
674
+ .instance_size = sizeof(XlnxVersalCRL),
318
+ .parent = TYPE_SYS_BUS_DEVICE,
675
+ .class_init = crl_class_init,
319
+ .instance_size = sizeof(NPCMPSPIState),
676
+ .instance_init = crl_init,
320
+ .class_init = npcm_pspi_class_init,
677
+ .instance_finalize = crl_finalize,
321
+ },
678
+};
322
+};
679
+
323
+DEFINE_TYPES(npcm_pspi_types);
680
+static void crl_register_types(void)
324
diff --git a/hw/ssi/meson.build b/hw/ssi/meson.build
681
+{
682
+ type_register_static(&crl_info);
683
+}
684
+
685
+type_init(crl_register_types)
686
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
687
index XXXXXXX..XXXXXXX 100644
325
index XXXXXXX..XXXXXXX 100644
688
--- a/hw/misc/meson.build
326
--- a/hw/ssi/meson.build
689
+++ b/hw/misc/meson.build
327
+++ b/hw/ssi/meson.build
690
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c'))
328
@@ -XXX,XX +XXX,XX @@
691
softmmu_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c'))
329
softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_smc.c'))
692
specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-crf.c'))
330
softmmu_ss.add(when: 'CONFIG_MSF2', if_true: files('mss-spi.c'))
693
specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-apu-ctrl.c'))
331
-softmmu_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx_fiu.c'))
694
+specific_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal-crl.c'))
332
+softmmu_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx_fiu.c', 'npcm_pspi.c'))
695
softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files(
333
softmmu_ss.add(when: 'CONFIG_PL022', if_true: files('pl022.c'))
696
'xlnx-versal-xramc.c',
334
softmmu_ss.add(when: 'CONFIG_SIFIVE_SPI', if_true: files('sifive_spi.c'))
697
'xlnx-versal-pmc-iou-slcr.c',
335
softmmu_ss.add(when: 'CONFIG_SSI', if_true: files('ssi.c'))
336
diff --git a/hw/ssi/trace-events b/hw/ssi/trace-events
337
index XXXXXXX..XXXXXXX 100644
338
--- a/hw/ssi/trace-events
339
+++ b/hw/ssi/trace-events
340
@@ -XXX,XX +XXX,XX @@ npcm7xx_fiu_ctrl_write(const char *id, uint64_t addr, uint32_t data) "%s offset:
341
npcm7xx_fiu_flash_read(const char *id, int cs, uint64_t addr, unsigned int size, uint64_t value) "%s[%d] offset: 0x%08" PRIx64 " size: %u value: 0x%" PRIx64
342
npcm7xx_fiu_flash_write(const char *id, unsigned cs, uint64_t addr, unsigned int size, uint64_t value) "%s[%d] offset: 0x%08" PRIx64 " size: %u value: 0x%" PRIx64
343
344
+# npcm_pspi.c
345
+npcm_pspi_enter_reset(const char *id, int reset_type) "%s reset type: %d"
346
+npcm_pspi_ctrl_read(const char *id, uint64_t addr, uint16_t data) "%s offset: 0x%03" PRIx64 " value: 0x%04" PRIx16
347
+npcm_pspi_ctrl_write(const char *id, uint64_t addr, uint16_t data) "%s offset: 0x%03" PRIx64 " value: 0x%04" PRIx16
348
+
349
# ibex_spi_host.c
350
351
ibex_spi_host_reset(const char *msg) "%s"
698
--
352
--
699
2.25.1
353
2.34.1
diff view generated by jsdifflib
1
Switch the creation of the combiner devices to the new-style
1
From: Hao Wu <wuhaotsh@google.com>
2
"embedded in state struct" approach, so we can easily refer
3
to the object elsewhere during realize.
4
2
3
Signed-off-by: Hao Wu <wuhaotsh@google.com>
4
Reviewed-by: Titus Rwantare <titusr@google.com>
5
Reviewed-by: Philippe Mathieu-Daude <philmd@linaro.org>
6
Message-id: 20230208235433.3989937-4-wuhaotsh@google.com
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220404154658.565020-18-peter.maydell@linaro.org
8
---
8
---
9
include/hw/arm/exynos4210.h | 3 ++
9
docs/system/arm/nuvoton.rst | 2 +-
10
include/hw/intc/exynos4210_combiner.h | 57 +++++++++++++++++++++++++++
10
include/hw/arm/npcm7xx.h | 2 ++
11
hw/arm/exynos4210.c | 20 +++++-----
11
hw/arm/npcm7xx.c | 25 +++++++++++++++++++++++--
12
hw/intc/exynos4210_combiner.c | 31 +--------------
12
3 files changed, 26 insertions(+), 3 deletions(-)
13
4 files changed, 72 insertions(+), 39 deletions(-)
14
create mode 100644 include/hw/intc/exynos4210_combiner.h
15
13
16
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
14
diff --git a/docs/system/arm/nuvoton.rst b/docs/system/arm/nuvoton.rst
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/exynos4210.h
16
--- a/docs/system/arm/nuvoton.rst
19
+++ b/include/hw/arm/exynos4210.h
17
+++ b/docs/system/arm/nuvoton.rst
18
@@ -XXX,XX +XXX,XX @@ Supported devices
19
* SMBus controller (SMBF)
20
* Ethernet controller (EMC)
21
* Tachometer
22
+ * Peripheral SPI controller (PSPI)
23
24
Missing devices
25
---------------
26
@@ -XXX,XX +XXX,XX @@ Missing devices
27
28
* Ethernet controller (GMAC)
29
* USB device (USBD)
30
- * Peripheral SPI controller (PSPI)
31
* SD/MMC host
32
* PECI interface
33
* PCI and PCIe root complex and bridges
34
diff --git a/include/hw/arm/npcm7xx.h b/include/hw/arm/npcm7xx.h
35
index XXXXXXX..XXXXXXX 100644
36
--- a/include/hw/arm/npcm7xx.h
37
+++ b/include/hw/arm/npcm7xx.h
20
@@ -XXX,XX +XXX,XX @@
38
@@ -XXX,XX +XXX,XX @@
21
#include "hw/sysbus.h"
39
#include "hw/nvram/npcm7xx_otp.h"
22
#include "hw/cpu/a9mpcore.h"
40
#include "hw/timer/npcm7xx_timer.h"
23
#include "hw/intc/exynos4210_gic.h"
41
#include "hw/ssi/npcm7xx_fiu.h"
24
+#include "hw/intc/exynos4210_combiner.h"
42
+#include "hw/ssi/npcm_pspi.h"
25
#include "hw/core/split-irq.h"
43
#include "hw/usb/hcd-ehci.h"
26
#include "target/arm/cpu-qom.h"
44
#include "hw/usb/hcd-ohci.h"
27
#include "qom/object.h"
45
#include "target/arm/cpu.h"
28
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
46
@@ -XXX,XX +XXX,XX @@ struct NPCM7xxState {
29
qemu_or_irq cpu_irq_orgate[EXYNOS4210_NCPUS];
47
NPCM7xxFIUState fiu[2];
30
A9MPPrivState a9mpcore;
48
NPCM7xxEMCState emc[2];
31
Exynos4210GicState ext_gic;
49
NPCM7xxSDHCIState mmc;
32
+ Exynos4210CombinerState int_combiner;
50
+ NPCMPSPIState pspi[2];
33
+ Exynos4210CombinerState ext_combiner;
34
SplitIRQ splitter[EXYNOS4210_NUM_SPLITTERS];
35
};
51
};
36
52
37
diff --git a/include/hw/intc/exynos4210_combiner.h b/include/hw/intc/exynos4210_combiner.h
53
#define TYPE_NPCM7XX "npcm7xx"
38
new file mode 100644
54
diff --git a/hw/arm/npcm7xx.c b/hw/arm/npcm7xx.c
39
index XXXXXXX..XXXXXXX
55
index XXXXXXX..XXXXXXX 100644
40
--- /dev/null
56
--- a/hw/arm/npcm7xx.c
41
+++ b/include/hw/intc/exynos4210_combiner.h
57
+++ b/hw/arm/npcm7xx.c
42
@@ -XXX,XX +XXX,XX @@
58
@@ -XXX,XX +XXX,XX @@ enum NPCM7xxInterrupt {
43
+/*
59
NPCM7XX_EMC1RX_IRQ = 15,
44
+ * Samsung exynos4210 Interrupt Combiner
60
NPCM7XX_EMC1TX_IRQ,
45
+ *
61
NPCM7XX_MMC_IRQ = 26,
46
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
62
+ NPCM7XX_PSPI2_IRQ = 28,
47
+ * All rights reserved.
63
+ NPCM7XX_PSPI1_IRQ = 31,
48
+ *
64
NPCM7XX_TIMER0_IRQ = 32, /* Timer Module 0 */
49
+ * Evgeny Voevodin <e.voevodin@samsung.com>
65
NPCM7XX_TIMER1_IRQ,
50
+ *
66
NPCM7XX_TIMER2_IRQ,
51
+ * This program is free software; you can redistribute it and/or modify it
67
@@ -XXX,XX +XXX,XX @@ static const hwaddr npcm7xx_emc_addr[] = {
52
+ * under the terms of the GNU General Public License as published by the
68
0xf0826000,
53
+ * Free Software Foundation; either version 2 of the License, or (at your
69
};
54
+ * option) any later version.
70
55
+ *
71
+/* Register base address for each PSPI Module */
56
+ * This program is distributed in the hope that it will be useful,
72
+static const hwaddr npcm7xx_pspi_addr[] = {
57
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
73
+ 0xf0200000,
58
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
74
+ 0xf0201000,
59
+ * See the GNU General Public License for more details.
60
+ *
61
+ * You should have received a copy of the GNU General Public License along
62
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
63
+ */
64
+
65
+#ifndef HW_INTC_EXYNOS4210_COMBINER
66
+#define HW_INTC_EXYNOS4210_COMBINER
67
+
68
+#include "hw/sysbus.h"
69
+
70
+/*
71
+ * State for each output signal of internal combiner
72
+ */
73
+typedef struct CombinerGroupState {
74
+ uint8_t src_mask; /* 1 - source enabled, 0 - disabled */
75
+ uint8_t src_pending; /* Pending source interrupts before masking */
76
+} CombinerGroupState;
77
+
78
+#define TYPE_EXYNOS4210_COMBINER "exynos4210.combiner"
79
+OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210CombinerState, EXYNOS4210_COMBINER)
80
+
81
+/* Number of groups and total number of interrupts for the internal combiner */
82
+#define IIC_NGRP 64
83
+#define IIC_NIRQ (IIC_NGRP * 8)
84
+#define IIC_REGSET_SIZE 0x41
85
+
86
+struct Exynos4210CombinerState {
87
+ SysBusDevice parent_obj;
88
+
89
+ MemoryRegion iomem;
90
+
91
+ struct CombinerGroupState group[IIC_NGRP];
92
+ uint32_t reg_set[IIC_REGSET_SIZE];
93
+ uint32_t icipsr[2];
94
+ uint32_t external; /* 1 means that this combiner is external */
95
+
96
+ qemu_irq output_irq[IIC_NGRP];
97
+};
75
+};
98
+
76
+
99
+#endif
77
static const struct {
100
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
78
hwaddr regs_addr;
101
index XXXXXXX..XXXXXXX 100644
79
uint32_t unconnected_pins;
102
--- a/hw/arm/exynos4210.c
80
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_init(Object *obj)
103
+++ b/hw/arm/exynos4210.c
81
object_initialize_child(obj, "emc[*]", &s->emc[i], TYPE_NPCM7XX_EMC);
104
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
105
}
82
}
106
83
107
/* Internal Interrupt Combiner */
84
+ for (i = 0; i < ARRAY_SIZE(s->pspi); i++) {
108
- dev = qdev_new("exynos4210.combiner");
85
+ object_initialize_child(obj, "pspi[*]", &s->pspi[i], TYPE_NPCM_PSPI);
109
- busdev = SYS_BUS_DEVICE(dev);
86
+ }
110
- sysbus_realize_and_unref(busdev, &error_fatal);
87
+
111
+ busdev = SYS_BUS_DEVICE(&s->int_combiner);
88
object_initialize_child(obj, "mmc", &s->mmc, TYPE_NPCM7XX_SDHCI);
112
+ sysbus_realize(busdev, &error_fatal);
113
for (n = 0; n < EXYNOS4210_MAX_INT_COMBINER_OUT_IRQ; n++) {
114
sysbus_connect_irq(busdev, n,
115
qdev_get_gpio_in(DEVICE(&s->a9mpcore), n));
116
}
117
- exynos4210_combiner_get_gpioin(&s->irqs, dev, 0);
118
+ exynos4210_combiner_get_gpioin(&s->irqs, DEVICE(&s->int_combiner), 0);
119
sysbus_mmio_map(busdev, 0, EXYNOS4210_INT_COMBINER_BASE_ADDR);
120
121
/* External Interrupt Combiner */
122
- dev = qdev_new("exynos4210.combiner");
123
- qdev_prop_set_uint32(dev, "external", 1);
124
- busdev = SYS_BUS_DEVICE(dev);
125
- sysbus_realize_and_unref(busdev, &error_fatal);
126
+ qdev_prop_set_uint32(DEVICE(&s->ext_combiner), "external", 1);
127
+ busdev = SYS_BUS_DEVICE(&s->ext_combiner);
128
+ sysbus_realize(busdev, &error_fatal);
129
for (n = 0; n < EXYNOS4210_MAX_INT_COMBINER_OUT_IRQ; n++) {
130
sysbus_connect_irq(busdev, n, qdev_get_gpio_in(DEVICE(&s->ext_gic), n));
131
}
132
- exynos4210_combiner_get_gpioin(&s->irqs, dev, 1);
133
+ exynos4210_combiner_get_gpioin(&s->irqs, DEVICE(&s->ext_combiner), 1);
134
sysbus_mmio_map(busdev, 0, EXYNOS4210_EXT_COMBINER_BASE_ADDR);
135
136
/* Initialize board IRQs. */
137
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init(Object *obj)
138
139
object_initialize_child(obj, "a9mpcore", &s->a9mpcore, TYPE_A9MPCORE_PRIV);
140
object_initialize_child(obj, "ext-gic", &s->ext_gic, TYPE_EXYNOS4210_GIC);
141
+ object_initialize_child(obj, "int-combiner", &s->int_combiner,
142
+ TYPE_EXYNOS4210_COMBINER);
143
+ object_initialize_child(obj, "ext-combiner", &s->ext_combiner,
144
+ TYPE_EXYNOS4210_COMBINER);
145
}
89
}
146
90
147
static void exynos4210_class_init(ObjectClass *klass, void *data)
91
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
148
diff --git a/hw/intc/exynos4210_combiner.c b/hw/intc/exynos4210_combiner.c
92
sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc), 0,
149
index XXXXXXX..XXXXXXX 100644
93
npcm7xx_irq(s, NPCM7XX_MMC_IRQ));
150
--- a/hw/intc/exynos4210_combiner.c
94
151
+++ b/hw/intc/exynos4210_combiner.c
95
+ /* PSPI */
152
@@ -XXX,XX +XXX,XX @@
96
+ QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_pspi_addr) != ARRAY_SIZE(s->pspi));
153
#include "hw/sysbus.h"
97
+ for (i = 0; i < ARRAY_SIZE(s->pspi); i++) {
154
#include "migration/vmstate.h"
98
+ SysBusDevice *sbd = SYS_BUS_DEVICE(&s->pspi[i]);
155
#include "qemu/module.h"
99
+ int irq = (i == 0) ? NPCM7XX_PSPI1_IRQ : NPCM7XX_PSPI2_IRQ;
156
-
100
+
157
+#include "hw/intc/exynos4210_combiner.h"
101
+ sysbus_realize(sbd, &error_abort);
158
#include "hw/arm/exynos4210.h"
102
+ sysbus_mmio_map(sbd, 0, npcm7xx_pspi_addr[i]);
159
#include "hw/hw.h"
103
+ sysbus_connect_irq(sbd, 0, npcm7xx_irq(s, irq));
160
#include "hw/irq.h"
104
+ }
161
@@ -XXX,XX +XXX,XX @@
105
+
162
#define DPRINTF(fmt, ...) do {} while (0)
106
create_unimplemented_device("npcm7xx.shm", 0xc0001000, 4 * KiB);
163
#endif
107
create_unimplemented_device("npcm7xx.vdmx", 0xe0800000, 4 * KiB);
164
108
create_unimplemented_device("npcm7xx.pcierc", 0xe1000000, 64 * KiB);
165
-#define IIC_NGRP 64 /* Internal Interrupt Combiner
109
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
166
- Groups number */
110
create_unimplemented_device("npcm7xx.peci", 0xf0100000, 4 * KiB);
167
-#define IIC_NIRQ (IIC_NGRP * 8)/* Internal Interrupt Combiner
111
create_unimplemented_device("npcm7xx.siox[1]", 0xf0101000, 4 * KiB);
168
- Interrupts number */
112
create_unimplemented_device("npcm7xx.siox[2]", 0xf0102000, 4 * KiB);
169
#define IIC_REGION_SIZE 0x108 /* Size of memory mapped region */
113
- create_unimplemented_device("npcm7xx.pspi1", 0xf0200000, 4 * KiB);
170
-#define IIC_REGSET_SIZE 0x41
114
- create_unimplemented_device("npcm7xx.pspi2", 0xf0201000, 4 * KiB);
171
-
115
create_unimplemented_device("npcm7xx.ahbpci", 0xf0400000, 1 * MiB);
172
-/*
116
create_unimplemented_device("npcm7xx.mcphy", 0xf05f0000, 64 * KiB);
173
- * State for each output signal of internal combiner
117
create_unimplemented_device("npcm7xx.gmac1", 0xf0802000, 8 * KiB);
174
- */
175
-typedef struct CombinerGroupState {
176
- uint8_t src_mask; /* 1 - source enabled, 0 - disabled */
177
- uint8_t src_pending; /* Pending source interrupts before masking */
178
-} CombinerGroupState;
179
-
180
-#define TYPE_EXYNOS4210_COMBINER "exynos4210.combiner"
181
-OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210CombinerState, EXYNOS4210_COMBINER)
182
-
183
-struct Exynos4210CombinerState {
184
- SysBusDevice parent_obj;
185
-
186
- MemoryRegion iomem;
187
-
188
- struct CombinerGroupState group[IIC_NGRP];
189
- uint32_t reg_set[IIC_REGSET_SIZE];
190
- uint32_t icipsr[2];
191
- uint32_t external; /* 1 means that this combiner is external */
192
-
193
- qemu_irq output_irq[IIC_NGRP];
194
-};
195
196
static const VMStateDescription vmstate_exynos4210_combiner_group_state = {
197
.name = "exynos4210.combiner.groupstate",
198
--
118
--
199
2.25.1
119
2.34.1
diff view generated by jsdifflib
1
The exynos4210 code currently has two very similar arrays of IRQs:
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
* board_irqs is a field of the Exynos4210Irq struct which is filled
3
Addresses targeting the second translation table (TTB1) in the SMMU have
4
in by exynos4210_init_board_irqs() with the appropriate qemu_irqs
4
all upper bits set. Ensure the IOMMU region covers all 64 bits.
5
for each IRQ the board/SoC can assert
6
* irq_table is a set of qemu_irqs pointed to from the
7
Exynos4210State struct. It's allocated in exynos4210_init_irq,
8
and the only behaviour these irqs have is that they pass on the
9
level to the equivalent board_irqs[] irq
10
5
11
The extra indirection through irq_table is unnecessary, so coalesce
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
these into a single irq_table[] array as a direct field in
7
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
13
Exynos4210State which exynos4210_init_board_irqs() fills in.
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Message-id: 20230214171921.1917916-2-jean-philippe@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
include/hw/arm/smmu-common.h | 2 --
13
hw/arm/smmu-common.c | 2 +-
14
2 files changed, 1 insertion(+), 3 deletions(-)
14
15
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20220404154658.565020-6-peter.maydell@linaro.org
18
---
19
include/hw/arm/exynos4210.h | 8 ++------
20
hw/arm/exynos4210.c | 6 +-----
21
hw/intc/exynos4210_gic.c | 32 ++++++++------------------------
22
3 files changed, 11 insertions(+), 35 deletions(-)
23
24
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/arm/exynos4210.h
18
--- a/include/hw/arm/smmu-common.h
27
+++ b/include/hw/arm/exynos4210.h
19
+++ b/include/hw/arm/smmu-common.h
28
@@ -XXX,XX +XXX,XX @@ typedef struct Exynos4210Irq {
20
@@ -XXX,XX +XXX,XX @@
29
qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
21
#define SMMU_PCI_DEVFN_MAX 256
30
qemu_irq ext_combiner_irq[EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ];
22
#define SMMU_PCI_DEVFN(sid) (sid & 0xFF)
31
qemu_irq ext_gic_irq[EXYNOS4210_EXT_GIC_NIRQ];
23
32
- qemu_irq board_irqs[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
24
-#define SMMU_MAX_VA_BITS 48
33
} Exynos4210Irq;
34
35
struct Exynos4210State {
36
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
37
/*< public >*/
38
ARMCPU *cpu[EXYNOS4210_NCPUS];
39
Exynos4210Irq irqs;
40
- qemu_irq *irq_table;
41
+ qemu_irq irq_table[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
42
43
MemoryRegion chipid_mem;
44
MemoryRegion iram_mem;
45
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210State, EXYNOS4210_SOC)
46
void exynos4210_write_secondary(ARMCPU *cpu,
47
const struct arm_boot_info *info);
48
49
-/* Initialize exynos4210 IRQ subsystem stub */
50
-qemu_irq *exynos4210_init_irq(Exynos4210Irq *env);
51
-
52
/* Initialize board IRQs.
53
* These IRQs contain splitted Int/External Combiner and External Gic IRQs */
54
-void exynos4210_init_board_irqs(Exynos4210Irq *s);
55
+void exynos4210_init_board_irqs(Exynos4210State *s);
56
57
/* Get IRQ number from exynos4210 IRQ subsystem stub.
58
* To identify IRQ source use internal combiner group and bit number
59
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/arm/exynos4210.c
62
+++ b/hw/arm/exynos4210.c
63
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
64
qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
65
}
66
67
- /*** IRQs ***/
68
-
69
- s->irq_table = exynos4210_init_irq(&s->irqs);
70
-
71
/* IRQ Gate */
72
for (i = 0; i < EXYNOS4210_NCPUS; i++) {
73
DeviceState *orgate = DEVICE(&s->cpu_irq_orgate[i]);
74
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
75
sysbus_mmio_map(busdev, 0, EXYNOS4210_EXT_COMBINER_BASE_ADDR);
76
77
/* Initialize board IRQs. */
78
- exynos4210_init_board_irqs(&s->irqs);
79
+ exynos4210_init_board_irqs(s);
80
81
/*** Memory ***/
82
83
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
84
index XXXXXXX..XXXXXXX 100644
85
--- a/hw/intc/exynos4210_gic.c
86
+++ b/hw/intc/exynos4210_gic.c
87
@@ -XXX,XX +XXX,XX @@ combiner_grp_to_gic_id[64-EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
88
#define EXYNOS4210_GIC_CPU_REGION_SIZE 0x100
89
#define EXYNOS4210_GIC_DIST_REGION_SIZE 0x1000
90
91
-static void exynos4210_irq_handler(void *opaque, int irq, int level)
92
-{
93
- Exynos4210Irq *s = (Exynos4210Irq *)opaque;
94
-
95
- /* Bypass */
96
- qemu_set_irq(s->board_irqs[irq], level);
97
-}
98
-
99
-/*
100
- * Initialize exynos4210 IRQ subsystem stub.
101
- */
102
-qemu_irq *exynos4210_init_irq(Exynos4210Irq *s)
103
-{
104
- return qemu_allocate_irqs(exynos4210_irq_handler, s,
105
- EXYNOS4210_MAX_INT_COMBINER_IN_IRQ);
106
-}
107
-
25
-
108
/*
26
/*
109
* Initialize board IRQs.
27
* Page table walk error types
110
* These IRQs contain splitted Int/External Combiner and External Gic IRQs.
111
*/
28
*/
112
-void exynos4210_init_board_irqs(Exynos4210Irq *s)
29
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
113
+void exynos4210_init_board_irqs(Exynos4210State *s)
30
index XXXXXXX..XXXXXXX 100644
114
{
31
--- a/hw/arm/smmu-common.c
115
uint32_t grp, bit, irq_id, n;
32
+++ b/hw/arm/smmu-common.c
116
+ Exynos4210Irq *is = &s->irqs;
33
@@ -XXX,XX +XXX,XX @@ static AddressSpace *smmu_find_add_as(PCIBus *bus, void *opaque, int devfn)
117
34
118
for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
35
memory_region_init_iommu(&sdev->iommu, sizeof(sdev->iommu),
119
irq_id = 0;
36
s->mrtypename,
120
@@ -XXX,XX +XXX,XX @@ void exynos4210_init_board_irqs(Exynos4210Irq *s)
37
- OBJECT(s), name, 1ULL << SMMU_MAX_VA_BITS);
121
irq_id = EXT_GIC_ID_MCT_G1;
38
+ OBJECT(s), name, UINT64_MAX);
122
}
39
address_space_init(&sdev->as,
123
if (irq_id) {
40
MEMORY_REGION(&sdev->iommu), name);
124
- s->board_irqs[n] = qemu_irq_split(s->int_combiner_irq[n],
41
trace_smmu_add_mr(name);
125
- s->ext_gic_irq[irq_id-32]);
126
+ s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
127
+ is->ext_gic_irq[irq_id - 32]);
128
} else {
129
- s->board_irqs[n] = qemu_irq_split(s->int_combiner_irq[n],
130
- s->ext_combiner_irq[n]);
131
+ s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
132
+ is->ext_combiner_irq[n]);
133
}
134
}
135
for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
136
@@ -XXX,XX +XXX,XX @@ void exynos4210_init_board_irqs(Exynos4210Irq *s)
137
EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][bit];
138
139
if (irq_id) {
140
- s->board_irqs[n] = qemu_irq_split(s->int_combiner_irq[n],
141
- s->ext_gic_irq[irq_id-32]);
142
+ s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
143
+ is->ext_gic_irq[irq_id - 32]);
144
}
145
}
146
}
147
--
42
--
148
2.25.1
43
2.34.1
diff view generated by jsdifflib
1
Fix a missing set of spaces around '-' in the definition of
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
combiner_grp_to_gic_id[]. We're about to move this code, so
3
fix the style issue first to keep checkpatch happy with the
4
code-motion patch.
5
2
3
Addresses targeting the second translation table (TTB1) in the SMMU have
4
all upper bits set (except for the top byte when TBI is enabled). Fix
5
the TTB1 check.
6
7
Reported-by: Ola Hugosson <ola.hugosson@arm.com>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
11
Message-id: 20230214171921.1917916-3-jean-philippe@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220404154658.565020-7-peter.maydell@linaro.org
9
---
13
---
10
hw/intc/exynos4210_gic.c | 2 +-
14
hw/arm/smmu-common.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
15
1 file changed, 1 insertion(+), 1 deletion(-)
12
16
13
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
17
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/intc/exynos4210_gic.c
19
--- a/hw/arm/smmu-common.c
16
+++ b/hw/intc/exynos4210_gic.c
20
+++ b/hw/arm/smmu-common.c
17
@@ -XXX,XX +XXX,XX @@ enum ExtInt {
21
@@ -XXX,XX +XXX,XX @@ SMMUTransTableInfo *select_tt(SMMUTransCfg *cfg, dma_addr_t iova)
18
*/
22
/* there is a ttbr0 region and we are in it (high bits all zero) */
19
23
return &cfg->tt[0];
20
static const uint32_t
24
} else if (cfg->tt[1].tsz &&
21
-combiner_grp_to_gic_id[64-EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
25
- !extract64(iova, 64 - cfg->tt[1].tsz, cfg->tt[1].tsz - tbi_byte)) {
22
+combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
26
+ sextract64(iova, 64 - cfg->tt[1].tsz, cfg->tt[1].tsz - tbi_byte) == -1) {
23
/* int combiner groups 16-19 */
27
/* there is a ttbr1 region and we are in it (high bits all one) */
24
{ }, { }, { }, { },
28
return &cfg->tt[1];
25
/* int combiner group 20 */
29
} else if (!cfg->tt[0].tsz) {
26
--
30
--
27
2.25.1
31
2.34.1
diff view generated by jsdifflib
1
In exynos4210_init_board_irqs(), the loop that handles IRQ lines that
1
From: Claudio Fontana <cfontana@suse.de>
2
are in a range that applies to the internal combiner only creates a
3
splitter for those interrupts which go to both the internal combiner
4
and to the external GIC, but it does nothing at all for the
5
interrupts which don't go to the external GIC, leaving the
6
irq_table[] array element empty for those. (This will result in
7
those interrupts simply being lost, not in a QEMU crash.)
8
2
9
I don't have a reliable datasheet for this SoC, but since we do wire
3
make it clearer from the name that this is a tcg-only function.
10
up one interrupt line in this category (the HDMI I2C device on
11
interrupt 16,1), this seems like it must be a bug in the existing
12
QEMU code. Fill in the irq_table[] entries where we're not splitting
13
the IRQ to both the internal combiner and the external GIC with the
14
IRQ line of the internal combiner. (That is, these IRQ lines go to
15
just one device, not multiple.)
16
4
17
This bug didn't have any visible guest effects because the only
5
Signed-off-by: Claudio Fontana <cfontana@suse.de>
18
implemented device that was affected was the HDMI I2C controller,
6
Signed-off-by: Fabiano Rosas <farosas@suse.de>
19
and we never connect any I2C devices to that bus.
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/helper.c | 4 ++--
13
1 file changed, 2 insertions(+), 2 deletions(-)
20
14
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
index XXXXXXX..XXXXXXX 100644
23
Message-id: 20220404154658.565020-14-peter.maydell@linaro.org
17
--- a/target/arm/helper.c
24
---
18
+++ b/target/arm/helper.c
25
hw/arm/exynos4210.c | 2 ++
19
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
26
1 file changed, 2 insertions(+)
20
* trapped to the hypervisor in KVM.
21
*/
22
#ifdef CONFIG_TCG
23
-static void handle_semihosting(CPUState *cs)
24
+static void tcg_handle_semihosting(CPUState *cs)
25
{
26
ARMCPU *cpu = ARM_CPU(cs);
27
CPUARMState *env = &cpu->env;
28
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
29
*/
30
#ifdef CONFIG_TCG
31
if (cs->exception_index == EXCP_SEMIHOST) {
32
- handle_semihosting(cs);
33
+ tcg_handle_semihosting(cs);
34
return;
35
}
36
#endif
37
--
38
2.34.1
27
39
28
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
40
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/arm/exynos4210.c
31
+++ b/hw/arm/exynos4210.c
32
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
33
qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
34
qdev_connect_gpio_out(splitter, 1,
35
qdev_get_gpio_in(extgicdev, irq_id - 32));
36
+ } else {
37
+ s->irq_table[n] = is->int_combiner_irq[n];
38
}
39
}
40
/*
41
--
42
2.25.1
diff view generated by jsdifflib
1
The exynos4210 SoC mostly creates its child devices as if it were
1
From: Claudio Fontana <cfontana@suse.de>
2
board code. This includes the a9mpcore object. Switch that to a
3
new-style "embedded in the state struct" creation, because in the
4
next commit we're going to want to refer to the object again further
5
down in the exynos4210_realize() function.
6
2
3
for "all" builds (tcg + kvm), we want to avoid doing
4
the psci check if tcg is built-in, but not enabled.
5
6
Signed-off-by: Claudio Fontana <cfontana@suse.de>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Fabiano Rosas <farosas@suse.de>
9
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220404154658.565020-4-peter.maydell@linaro.org
10
---
11
---
11
include/hw/arm/exynos4210.h | 2 ++
12
target/arm/helper.c | 3 ++-
12
hw/arm/exynos4210.c | 11 ++++++-----
13
1 file changed, 2 insertions(+), 1 deletion(-)
13
2 files changed, 8 insertions(+), 5 deletions(-)
14
14
15
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/exynos4210.h
17
--- a/target/arm/helper.c
18
+++ b/include/hw/arm/exynos4210.h
18
+++ b/target/arm/helper.c
19
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
20
20
#include "hw/irq.h"
21
#include "hw/or-irq.h"
21
#include "sysemu/cpu-timers.h"
22
#include "hw/sysbus.h"
22
#include "sysemu/kvm.h"
23
+#include "hw/cpu/a9mpcore.h"
23
+#include "sysemu/tcg.h"
24
#include "target/arm/cpu-qom.h"
24
#include "qapi/qapi-commands-machine-target.h"
25
#include "qom/object.h"
25
#include "qapi/error.h"
26
26
#include "qemu/guest-random.h"
27
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
27
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
28
I2CBus *i2c_if[EXYNOS4210_I2C_NUMBER];
28
env->exception.syndrome);
29
qemu_or_irq pl330_irq_orgate[EXYNOS4210_NUM_DMA];
30
qemu_or_irq cpu_irq_orgate[EXYNOS4210_NCPUS];
31
+ A9MPPrivState a9mpcore;
32
};
33
34
#define TYPE_EXYNOS4210_SOC "exynos4210"
35
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/hw/arm/exynos4210.c
38
+++ b/hw/arm/exynos4210.c
39
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
40
}
29
}
41
30
42
/* Private memory region and Internal GIC */
31
- if (arm_is_psci_call(cpu, cs->exception_index)) {
43
- dev = qdev_new(TYPE_A9MPCORE_PRIV);
32
+ if (tcg_enabled() && arm_is_psci_call(cpu, cs->exception_index)) {
44
- qdev_prop_set_uint32(dev, "num-cpu", EXYNOS4210_NCPUS);
33
arm_handle_psci_call(cpu);
45
- busdev = SYS_BUS_DEVICE(dev);
34
qemu_log_mask(CPU_LOG_INT, "...handled as PSCI call\n");
46
- sysbus_realize_and_unref(busdev, &error_fatal);
35
return;
47
+ qdev_prop_set_uint32(DEVICE(&s->a9mpcore), "num-cpu", EXYNOS4210_NCPUS);
48
+ busdev = SYS_BUS_DEVICE(&s->a9mpcore);
49
+ sysbus_realize(busdev, &error_fatal);
50
sysbus_mmio_map(busdev, 0, EXYNOS4210_SMP_PRIVATE_BASE_ADDR);
51
for (n = 0; n < EXYNOS4210_NCPUS; n++) {
52
sysbus_connect_irq(busdev, n,
53
qdev_get_gpio_in(DEVICE(&s->cpu_irq_orgate[n]), 0));
54
}
55
for (n = 0; n < EXYNOS4210_INT_GIC_NIRQ; n++) {
56
- s->irqs.int_gic_irq[n] = qdev_get_gpio_in(dev, n);
57
+ s->irqs.int_gic_irq[n] = qdev_get_gpio_in(DEVICE(&s->a9mpcore), n);
58
}
59
60
/* Cache controller */
61
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init(Object *obj)
62
g_autofree char *name = g_strdup_printf("cpu-irq-orgate%d", i);
63
object_initialize_child(obj, name, &s->cpu_irq_orgate[i], TYPE_OR_IRQ);
64
}
65
+
66
+ object_initialize_child(obj, "a9mpcore", &s->a9mpcore, TYPE_A9MPCORE_PRIV);
67
}
68
69
static void exynos4210_class_init(ObjectClass *klass, void *data)
70
--
36
--
71
2.25.1
37
2.34.1
38
39
diff view generated by jsdifflib
1
Delete a couple of #defines which are never used.
1
From: Claudio Fontana <cfontana@suse.de>
2
2
3
Signed-off-by: Claudio Fontana <cfontana@suse.de>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Fabiano Rosas <farosas@suse.de>
6
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220404154658.565020-12-peter.maydell@linaro.org
6
---
8
---
7
include/hw/arm/exynos4210.h | 4 ----
9
target/arm/helper.c | 12 +++++++-----
8
1 file changed, 4 deletions(-)
10
1 file changed, 7 insertions(+), 5 deletions(-)
9
11
10
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
12
diff --git a/target/arm/helper.c b/target/arm/helper.c
11
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
12
--- a/include/hw/arm/exynos4210.h
14
--- a/target/arm/helper.c
13
+++ b/include/hw/arm/exynos4210.h
15
+++ b/target/arm/helper.c
14
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
15
#define EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ \
17
unsigned int cur_el = arm_current_el(env);
16
(EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ * 8)
18
int rt;
17
19
18
-/* IRQs number for external and internal GIC */
20
- /*
19
-#define EXYNOS4210_EXT_GIC_NIRQ (160-32)
21
- * Note that new_el can never be 0. If cur_el is 0, then
20
-#define EXYNOS4210_INT_GIC_NIRQ 64
22
- * el0_a64 is is_a64(), else el0_a64 is ignored.
21
-
23
- */
22
#define EXYNOS4210_I2C_NUMBER 9
24
- aarch64_sve_change_el(env, cur_el, new_el, is_a64(env));
23
25
+ if (tcg_enabled()) {
24
#define EXYNOS4210_NUM_DMA 3
26
+ /*
27
+ * Note that new_el can never be 0. If cur_el is 0, then
28
+ * el0_a64 is is_a64(), else el0_a64 is ignored.
29
+ */
30
+ aarch64_sve_change_el(env, cur_el, new_el, is_a64(env));
31
+ }
32
33
if (cur_el < new_el) {
34
/*
25
--
35
--
26
2.25.1
36
2.34.1
37
38
diff view generated by jsdifflib
1
At this point, the function exynos4210_init_board_irqs() splits input
1
From: Fabiano Rosas <farosas@suse.de>
2
IRQ lines to connect them to the input combiner, output combiner and
3
external GIC. The function exynos4210_combiner_get_gpioin() splits
4
some of the combiner input lines further to connect them to multiple
5
different inputs on the combiner.
6
2
7
Because (unlike qemu_irq_split()) the TYPE_SPLIT_IRQ device has a
3
Move this earlier to make the next patch diff cleaner. While here
8
configurable number of outputs, we can do all this in one place, by
4
update the comment slightly to not give the impression that the
9
making exynos4210_init_board_irqs() add extra outputs to the splitter
5
misalignment affects only TCG.
10
device when it must be connected to more than one input on each
11
combiner.
12
6
13
We do this with a new data structure, the combinermap, which is an
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
array each of whose elements is a list of the interrupt IDs on the
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
15
combiner which must be tied together. As we loop through each
9
Signed-off-by: Fabiano Rosas <farosas@suse.de>
16
interrupt ID, if we find that it is the first one in one of these
10
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
17
lists, we configure the splitter device with eonugh extra outputs and
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
wire them up to the other interrupt IDs in the list.
12
---
13
target/arm/machine.c | 18 +++++++++---------
14
1 file changed, 9 insertions(+), 9 deletions(-)
19
15
20
Conveniently, for all the cases where this is necessary, the
16
diff --git a/target/arm/machine.c b/target/arm/machine.c
21
lowest-numbered interrupt ID in each group is in the range of the
22
external combiner, so we only need to code for this in the first of
23
the two loops in exynos4210_init_board_irqs().
24
25
The old code in exynos4210_combiner_get_gpioin() which is being
26
deleted here had several problems which don't exist in the new code
27
in its handling of the multi-core timer interrupts:
28
(1) the case labels specified bits 4 ... 8, but bit '8' doesn't
29
exist; these should have been 4 ... 7
30
(2) it used the input irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]
31
multiple times as the input of several different splitters,
32
which isn't allowed
33
(3) in an apparent cut-and-paste error, the cases for all the
34
multi-core timer inputs used "bit + 4" even though the
35
bit range for the case was (intended to be) 4 ... 7, which
36
meant it was looking at non-existent bits 8 ... 11.
37
None of these exist in the new code.
38
39
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
40
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
41
Message-id: 20220404154658.565020-17-peter.maydell@linaro.org
42
---
43
include/hw/arm/exynos4210.h | 6 +-
44
hw/arm/exynos4210.c | 178 +++++++++++++++++++++++-------------
45
2 files changed, 119 insertions(+), 65 deletions(-)
46
47
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
48
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
49
--- a/include/hw/arm/exynos4210.h
18
--- a/target/arm/machine.c
50
+++ b/include/hw/arm/exynos4210.h
19
+++ b/target/arm/machine.c
51
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
52
53
/*
54
* We need one splitter for every external combiner input, plus
55
- * one for every non-zero entry in combiner_grp_to_gic_id[].
56
+ * one for every non-zero entry in combiner_grp_to_gic_id[],
57
+ * minus one for every external combiner ID in second or later
58
+ * places in a combinermap[] line.
59
* We'll assert in exynos4210_init_board_irqs() if this is wrong.
60
*/
61
-#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 54)
62
+#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 38)
63
64
typedef struct Exynos4210Irq {
65
qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
66
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/arm/exynos4210.c
69
+++ b/hw/arm/exynos4210.c
70
@@ -XXX,XX +XXX,XX @@ combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
71
#define EXYNOS4210_COMBINER_GET_BIT_NUM(irq) \
72
((irq) - 8 * EXYNOS4210_COMBINER_GET_GRP_NUM(irq))
73
74
+/*
75
+ * Some interrupt lines go to multiple combiner inputs.
76
+ * This data structure defines those: each array element is
77
+ * a list of combiner inputs which are connected together;
78
+ * the one with the smallest interrupt ID value must be first.
79
+ * As with combiner_grp_to_gic_id[], we rely on (0, 0) not being
80
+ * wired to anything so we can use 0 as a terminator.
81
+ */
82
+#define IRQNO(G, B) EXYNOS4210_COMBINER_GET_IRQ_NUM(G, B)
83
+#define IRQNONE 0
84
+
85
+#define COMBINERMAP_SIZE 16
86
+
87
+static const int combinermap[COMBINERMAP_SIZE][6] = {
88
+ /* MDNIE_LCD1 */
89
+ { IRQNO(0, 4), IRQNO(1, 0), IRQNONE },
90
+ { IRQNO(0, 5), IRQNO(1, 1), IRQNONE },
91
+ { IRQNO(0, 6), IRQNO(1, 2), IRQNONE },
92
+ { IRQNO(0, 7), IRQNO(1, 3), IRQNONE },
93
+ /* TMU */
94
+ { IRQNO(2, 4), IRQNO(3, 4), IRQNONE },
95
+ { IRQNO(2, 5), IRQNO(3, 5), IRQNONE },
96
+ { IRQNO(2, 6), IRQNO(3, 6), IRQNONE },
97
+ { IRQNO(2, 7), IRQNO(3, 7), IRQNONE },
98
+ /* LCD1 */
99
+ { IRQNO(11, 4), IRQNO(12, 0), IRQNONE },
100
+ { IRQNO(11, 5), IRQNO(12, 1), IRQNONE },
101
+ { IRQNO(11, 6), IRQNO(12, 2), IRQNONE },
102
+ { IRQNO(11, 7), IRQNO(12, 3), IRQNONE },
103
+ /* Multi-core timer */
104
+ { IRQNO(1, 4), IRQNO(12, 4), IRQNO(35, 4), IRQNO(51, 4), IRQNO(53, 4), IRQNONE },
105
+ { IRQNO(1, 5), IRQNO(12, 5), IRQNO(35, 5), IRQNO(51, 5), IRQNO(53, 5), IRQNONE },
106
+ { IRQNO(1, 6), IRQNO(12, 6), IRQNO(35, 6), IRQNO(51, 6), IRQNO(53, 6), IRQNONE },
107
+ { IRQNO(1, 7), IRQNO(12, 7), IRQNO(35, 7), IRQNO(51, 7), IRQNO(53, 7), IRQNONE },
108
+};
109
+
110
+#undef IRQNO
111
+
112
+static const int *combinermap_entry(int irq)
113
+{
114
+ /*
115
+ * If the interrupt number passed in is the first entry in some
116
+ * line of the combinermap, return a pointer to that line;
117
+ * otherwise return NULL.
118
+ */
119
+ int i;
120
+ for (i = 0; i < COMBINERMAP_SIZE; i++) {
121
+ if (combinermap[i][0] == irq) {
122
+ return combinermap[i];
123
+ }
124
+ }
125
+ return NULL;
126
+}
127
+
128
+static int mapline_size(const int *mapline)
129
+{
130
+ /* Return number of entries in this mapline in total */
131
+ int i = 0;
132
+
133
+ if (!mapline) {
134
+ /* Not in the map? IRQ goes to exactly one combiner input */
135
+ return 1;
136
+ }
137
+ while (*mapline != IRQNONE) {
138
+ mapline++;
139
+ i++;
140
+ }
141
+ return i;
142
+}
143
+
144
/*
145
* Initialize board IRQs.
146
* These IRQs contain splitted Int/External Combiner and External Gic IRQs.
147
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
148
DeviceState *extgicdev = DEVICE(&s->ext_gic);
149
int splitcount = 0;
150
DeviceState *splitter;
151
+ const int *mapline;
152
+ int numlines, splitin, in;
153
154
for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
155
irq_id = 0;
156
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
157
irq_id = EXT_GIC_ID_MCT_G1;
158
}
159
160
+ if (s->irq_table[n]) {
161
+ /*
162
+ * This must be some non-first entry in a combinermap line,
163
+ * and we've already filled it in.
164
+ */
165
+ continue;
166
+ }
167
+ mapline = combinermap_entry(n);
168
+ /*
169
+ * We need to connect the IRQ to multiple inputs on both combiners
170
+ * and possibly also to the external GIC.
171
+ */
172
+ numlines = 2 * mapline_size(mapline);
173
+ if (irq_id) {
174
+ numlines++;
175
+ }
176
assert(splitcount < EXYNOS4210_NUM_SPLITTERS);
177
splitter = DEVICE(&s->splitter[splitcount]);
178
- qdev_prop_set_uint16(splitter, "num-lines", irq_id ? 3 : 2);
179
+ qdev_prop_set_uint16(splitter, "num-lines", numlines);
180
qdev_realize(splitter, NULL, &error_abort);
181
splitcount++;
182
- s->irq_table[n] = qdev_get_gpio_in(splitter, 0);
183
- qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
184
- qdev_connect_gpio_out(splitter, 1, is->ext_combiner_irq[n]);
185
+
186
+ in = n;
187
+ splitin = 0;
188
+ for (;;) {
189
+ s->irq_table[in] = qdev_get_gpio_in(splitter, 0);
190
+ qdev_connect_gpio_out(splitter, splitin, is->int_combiner_irq[in]);
191
+ qdev_connect_gpio_out(splitter, splitin + 1, is->ext_combiner_irq[in]);
192
+ splitin += 2;
193
+ if (!mapline) {
194
+ break;
195
+ }
196
+ mapline++;
197
+ in = *mapline;
198
+ if (in == IRQNONE) {
199
+ break;
200
+ }
201
+ }
202
if (irq_id) {
203
- qdev_connect_gpio_out(splitter, 2,
204
+ qdev_connect_gpio_out(splitter, splitin,
205
qdev_get_gpio_in(extgicdev, irq_id - 32));
206
}
21
}
207
}
22
}
208
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
23
209
irq_id = combiner_grp_to_gic_id[grp -
24
+ /*
210
EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][bit];
25
+ * Misaligned thumb pc is architecturally impossible. Fail the
211
26
+ * incoming migration. For TCG it would trigger the assert in
212
+ if (s->irq_table[n]) {
27
+ * thumb_tr_translate_insn().
213
+ /*
28
+ */
214
+ * This must be some non-first entry in a combinermap line,
29
+ if (!is_a64(env) && env->thumb && (env->regs[15] & 1)) {
215
+ * and we've already filled it in.
30
+ return -1;
216
+ */
31
+ }
217
+ continue;
218
+ }
219
+
32
+
220
if (irq_id) {
33
hw_breakpoint_update_all(cpu);
221
assert(splitcount < EXYNOS4210_NUM_SPLITTERS);
34
hw_watchpoint_update_all(cpu);
222
splitter = DEVICE(&s->splitter[splitcount]);
35
223
@@ -XXX,XX +XXX,XX @@ static void exynos4210_combiner_get_gpioin(Exynos4210Irq *irqs,
36
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
224
DeviceState *dev, int ext)
37
}
225
{
38
}
226
int n;
227
- int bit;
228
int max;
229
qemu_irq *irq;
230
231
@@ -XXX,XX +XXX,XX @@ static void exynos4210_combiner_get_gpioin(Exynos4210Irq *irqs,
232
EXYNOS4210_MAX_INT_COMBINER_IN_IRQ;
233
irq = ext ? irqs->ext_combiner_irq : irqs->int_combiner_irq;
234
39
235
- /*
40
- /*
236
- * Some IRQs of Int/External Combiner are going to two Combiners groups,
41
- * Misaligned thumb pc is architecturally impossible.
237
- * so let split them.
42
- * We have an assert in thumb_tr_translate_insn to verify this.
43
- * Fail an incoming migrate to avoid this assert.
238
- */
44
- */
239
for (n = 0; n < max; n++) {
45
- if (!is_a64(env) && env->thumb && (env->regs[15] & 1)) {
46
- return -1;
47
- }
240
-
48
-
241
- bit = EXYNOS4210_COMBINER_GET_BIT_NUM(n);
49
if (!kvm_enabled()) {
242
-
50
pmu_op_finish(&cpu->env);
243
- switch (n) {
244
- /* MDNIE_LCD1 INTG1 */
245
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 0) ...
246
- EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 3):
247
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
248
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(0, bit + 4)]);
249
- continue;
250
-
251
- /* TMU INTG3 */
252
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(3, 4):
253
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
254
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(2, bit)]);
255
- continue;
256
-
257
- /* LCD1 INTG12 */
258
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 0) ...
259
- EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 3):
260
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
261
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(11, bit + 4)]);
262
- continue;
263
-
264
- /* Multi-Core Timer INTG12 */
265
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 4) ...
266
- EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 8):
267
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
268
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
269
- continue;
270
-
271
- /* Multi-Core Timer INTG35 */
272
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(35, 4) ...
273
- EXYNOS4210_COMBINER_GET_IRQ_NUM(35, 8):
274
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
275
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
276
- continue;
277
-
278
- /* Multi-Core Timer INTG51 */
279
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(51, 4) ...
280
- EXYNOS4210_COMBINER_GET_IRQ_NUM(51, 8):
281
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
282
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
283
- continue;
284
-
285
- /* Multi-Core Timer INTG53 */
286
- case EXYNOS4210_COMBINER_GET_IRQ_NUM(53, 4) ...
287
- EXYNOS4210_COMBINER_GET_IRQ_NUM(53, 8):
288
- irq[n] = qemu_irq_split(qdev_get_gpio_in(dev, n),
289
- irq[EXYNOS4210_COMBINER_GET_IRQ_NUM(1, bit + 4)]);
290
- continue;
291
- }
292
-
293
irq[n] = qdev_get_gpio_in(dev, n);
294
}
51
}
295
}
296
--
52
--
297
2.25.1
53
2.34.1
54
55
diff view generated by jsdifflib
1
The function exynos4210_init_board_irqs() currently lives in
1
From: Fabiano Rosas <farosas@suse.de>
2
exynos4210_gic.c, but it isn't really part of the exynos4210.gic
2
3
device -- it is a function that implements (some of) the wiring up of
3
Since commit cf7c6d1004 ("target/arm: Split out cpregs.h") we now have
4
interrupts between the SoC's GIC and combiner components. This means
4
a cpregs.h header which is more suitable for this code.
5
it fits better in exynos4210.c, which is the SoC-level code. Move it
5
6
there. Similarly, exynos4210_git_irq() is used almost only in the
6
Code moved verbatim.
7
SoC-level code, so move it too.
7
8
8
Signed-off-by: Fabiano Rosas <farosas@suse.de>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20220404154658.565020-8-peter.maydell@linaro.org
12
---
13
---
13
include/hw/arm/exynos4210.h | 4 -
14
target/arm/cpregs.h | 98 +++++++++++++++++++++++++++++++++++++++++++++
14
hw/arm/exynos4210.c | 202 +++++++++++++++++++++++++++++++++++
15
target/arm/cpu.h | 91 -----------------------------------------
15
hw/intc/exynos4210_gic.c | 204 ------------------------------------
16
2 files changed, 98 insertions(+), 91 deletions(-)
16
3 files changed, 202 insertions(+), 208 deletions(-)
17
17
18
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
18
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
19
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/arm/exynos4210.h
20
--- a/target/arm/cpregs.h
21
+++ b/include/hw/arm/exynos4210.h
21
+++ b/target/arm/cpregs.h
22
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210State, EXYNOS4210_SOC)
22
@@ -XXX,XX +XXX,XX @@ enum {
23
void exynos4210_write_secondary(ARMCPU *cpu,
23
ARM_CP_SME = 1 << 19,
24
const struct arm_boot_info *info);
24
};
25
25
26
-/* Initialize board IRQs.
26
+/*
27
- * These IRQs contain splitted Int/External Combiner and External Gic IRQs */
27
+ * Interface for defining coprocessor registers.
28
-void exynos4210_init_board_irqs(Exynos4210State *s);
28
+ * Registers are defined in tables of arm_cp_reginfo structs
29
-
29
+ * which are passed to define_arm_cp_regs().
30
/* Get IRQ number from exynos4210 IRQ subsystem stub.
30
+ */
31
* To identify IRQ source use internal combiner group and bit number
31
+
32
* grp - group number
32
+/*
33
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
33
+ * When looking up a coprocessor register we look for it
34
index XXXXXXX..XXXXXXX 100644
34
+ * via an integer which encodes all of:
35
--- a/hw/arm/exynos4210.c
35
+ * coprocessor number
36
+++ b/hw/arm/exynos4210.c
36
+ * Crn, Crm, opc1, opc2 fields
37
@@ -XXX,XX +XXX,XX @@
37
+ * 32 or 64 bit register (ie is it accessed via MRC/MCR
38
#define EXYNOS4210_PL330_BASE1_ADDR 0x12690000
38
+ * or via MRRC/MCRR?)
39
#define EXYNOS4210_PL330_BASE2_ADDR 0x12850000
39
+ * non-secure/secure bank (AArch32 only)
40
40
+ * We allow 4 bits for opc1 because MRRC/MCRR have a 4 bit field.
41
+enum ExtGicId {
41
+ * (In this case crn and opc2 should be zero.)
42
+ EXT_GIC_ID_MDMA_LCD0 = 66,
42
+ * For AArch64, there is no 32/64 bit size distinction;
43
+ EXT_GIC_ID_PDMA0,
43
+ * instead all registers have a 2 bit op0, 3 bit op1 and op2,
44
+ EXT_GIC_ID_PDMA1,
44
+ * and 4 bit CRn and CRm. The encoding patterns are chosen
45
+ EXT_GIC_ID_TIMER0,
45
+ * to be easy to convert to and from the KVM encodings, and also
46
+ EXT_GIC_ID_TIMER1,
46
+ * so that the hashtable can contain both AArch32 and AArch64
47
+ EXT_GIC_ID_TIMER2,
47
+ * registers (to allow for interprocessing where we might run
48
+ EXT_GIC_ID_TIMER3,
48
+ * 32 bit code on a 64 bit core).
49
+ EXT_GIC_ID_TIMER4,
49
+ */
50
+ EXT_GIC_ID_MCT_L0,
50
+/*
51
+ EXT_GIC_ID_WDT,
51
+ * This bit is private to our hashtable cpreg; in KVM register
52
+ EXT_GIC_ID_RTC_ALARM,
52
+ * IDs the AArch64/32 distinction is the KVM_REG_ARM/ARM64
53
+ EXT_GIC_ID_RTC_TIC,
53
+ * in the upper bits of the 64 bit ID.
54
+ EXT_GIC_ID_GPIO_XB,
54
+ */
55
+ EXT_GIC_ID_GPIO_XA,
55
+#define CP_REG_AA64_SHIFT 28
56
+ EXT_GIC_ID_MCT_L1,
56
+#define CP_REG_AA64_MASK (1 << CP_REG_AA64_SHIFT)
57
+ EXT_GIC_ID_IEM_APC,
57
+
58
+ EXT_GIC_ID_IEM_IEC,
58
+/*
59
+ EXT_GIC_ID_NFC,
59
+ * To enable banking of coprocessor registers depending on ns-bit we
60
+ EXT_GIC_ID_UART0,
60
+ * add a bit to distinguish between secure and non-secure cpregs in the
61
+ EXT_GIC_ID_UART1,
61
+ * hashtable.
62
+ EXT_GIC_ID_UART2,
62
+ */
63
+ EXT_GIC_ID_UART3,
63
+#define CP_REG_NS_SHIFT 29
64
+ EXT_GIC_ID_UART4,
64
+#define CP_REG_NS_MASK (1 << CP_REG_NS_SHIFT)
65
+ EXT_GIC_ID_MCT_G0,
65
+
66
+ EXT_GIC_ID_I2C0,
66
+#define ENCODE_CP_REG(cp, is64, ns, crn, crm, opc1, opc2) \
67
+ EXT_GIC_ID_I2C1,
67
+ ((ns) << CP_REG_NS_SHIFT | ((cp) << 16) | ((is64) << 15) | \
68
+ EXT_GIC_ID_I2C2,
68
+ ((crn) << 11) | ((crm) << 7) | ((opc1) << 3) | (opc2))
69
+ EXT_GIC_ID_I2C3,
69
+
70
+ EXT_GIC_ID_I2C4,
70
+#define ENCODE_AA64_CP_REG(cp, crn, crm, op0, op1, op2) \
71
+ EXT_GIC_ID_I2C5,
71
+ (CP_REG_AA64_MASK | \
72
+ EXT_GIC_ID_I2C6,
72
+ ((cp) << CP_REG_ARM_COPROC_SHIFT) | \
73
+ EXT_GIC_ID_I2C7,
73
+ ((op0) << CP_REG_ARM64_SYSREG_OP0_SHIFT) | \
74
+ EXT_GIC_ID_SPI0,
74
+ ((op1) << CP_REG_ARM64_SYSREG_OP1_SHIFT) | \
75
+ EXT_GIC_ID_SPI1,
75
+ ((crn) << CP_REG_ARM64_SYSREG_CRN_SHIFT) | \
76
+ EXT_GIC_ID_SPI2,
76
+ ((crm) << CP_REG_ARM64_SYSREG_CRM_SHIFT) | \
77
+ EXT_GIC_ID_MCT_G1,
77
+ ((op2) << CP_REG_ARM64_SYSREG_OP2_SHIFT))
78
+ EXT_GIC_ID_USB_HOST,
78
+
79
+ EXT_GIC_ID_USB_DEVICE,
79
+/*
80
+ EXT_GIC_ID_MODEMIF,
80
+ * Convert a full 64 bit KVM register ID to the truncated 32 bit
81
+ EXT_GIC_ID_HSMMC0,
81
+ * version used as a key for the coprocessor register hashtable
82
+ EXT_GIC_ID_HSMMC1,
82
+ */
83
+ EXT_GIC_ID_HSMMC2,
83
+static inline uint32_t kvm_to_cpreg_id(uint64_t kvmid)
84
+ EXT_GIC_ID_HSMMC3,
85
+ EXT_GIC_ID_SDMMC,
86
+ EXT_GIC_ID_MIPI_CSI_4LANE,
87
+ EXT_GIC_ID_MIPI_DSI_4LANE,
88
+ EXT_GIC_ID_MIPI_CSI_2LANE,
89
+ EXT_GIC_ID_MIPI_DSI_2LANE,
90
+ EXT_GIC_ID_ONENAND_AUDI,
91
+ EXT_GIC_ID_ROTATOR,
92
+ EXT_GIC_ID_FIMC0,
93
+ EXT_GIC_ID_FIMC1,
94
+ EXT_GIC_ID_FIMC2,
95
+ EXT_GIC_ID_FIMC3,
96
+ EXT_GIC_ID_JPEG,
97
+ EXT_GIC_ID_2D,
98
+ EXT_GIC_ID_PCIe,
99
+ EXT_GIC_ID_MIXER,
100
+ EXT_GIC_ID_HDMI,
101
+ EXT_GIC_ID_HDMI_I2C,
102
+ EXT_GIC_ID_MFC,
103
+ EXT_GIC_ID_TVENC,
104
+};
105
+
106
+enum ExtInt {
107
+ EXT_GIC_ID_EXTINT0 = 48,
108
+ EXT_GIC_ID_EXTINT1,
109
+ EXT_GIC_ID_EXTINT2,
110
+ EXT_GIC_ID_EXTINT3,
111
+ EXT_GIC_ID_EXTINT4,
112
+ EXT_GIC_ID_EXTINT5,
113
+ EXT_GIC_ID_EXTINT6,
114
+ EXT_GIC_ID_EXTINT7,
115
+ EXT_GIC_ID_EXTINT8,
116
+ EXT_GIC_ID_EXTINT9,
117
+ EXT_GIC_ID_EXTINT10,
118
+ EXT_GIC_ID_EXTINT11,
119
+ EXT_GIC_ID_EXTINT12,
120
+ EXT_GIC_ID_EXTINT13,
121
+ EXT_GIC_ID_EXTINT14,
122
+ EXT_GIC_ID_EXTINT15
123
+};
124
+
125
+/*
126
+ * External GIC sources which are not from External Interrupt Combiner or
127
+ * External Interrupts are starting from EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ,
128
+ * which is INTG16 in Internal Interrupt Combiner.
129
+ */
130
+
131
+static const uint32_t
132
+combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
133
+ /* int combiner groups 16-19 */
134
+ { }, { }, { }, { },
135
+ /* int combiner group 20 */
136
+ { 0, EXT_GIC_ID_MDMA_LCD0 },
137
+ /* int combiner group 21 */
138
+ { EXT_GIC_ID_PDMA0, EXT_GIC_ID_PDMA1 },
139
+ /* int combiner group 22 */
140
+ { EXT_GIC_ID_TIMER0, EXT_GIC_ID_TIMER1, EXT_GIC_ID_TIMER2,
141
+ EXT_GIC_ID_TIMER3, EXT_GIC_ID_TIMER4 },
142
+ /* int combiner group 23 */
143
+ { EXT_GIC_ID_RTC_ALARM, EXT_GIC_ID_RTC_TIC },
144
+ /* int combiner group 24 */
145
+ { EXT_GIC_ID_GPIO_XB, EXT_GIC_ID_GPIO_XA },
146
+ /* int combiner group 25 */
147
+ { EXT_GIC_ID_IEM_APC, EXT_GIC_ID_IEM_IEC },
148
+ /* int combiner group 26 */
149
+ { EXT_GIC_ID_UART0, EXT_GIC_ID_UART1, EXT_GIC_ID_UART2, EXT_GIC_ID_UART3,
150
+ EXT_GIC_ID_UART4 },
151
+ /* int combiner group 27 */
152
+ { EXT_GIC_ID_I2C0, EXT_GIC_ID_I2C1, EXT_GIC_ID_I2C2, EXT_GIC_ID_I2C3,
153
+ EXT_GIC_ID_I2C4, EXT_GIC_ID_I2C5, EXT_GIC_ID_I2C6,
154
+ EXT_GIC_ID_I2C7 },
155
+ /* int combiner group 28 */
156
+ { EXT_GIC_ID_SPI0, EXT_GIC_ID_SPI1, EXT_GIC_ID_SPI2 , EXT_GIC_ID_USB_HOST},
157
+ /* int combiner group 29 */
158
+ { EXT_GIC_ID_HSMMC0, EXT_GIC_ID_HSMMC1, EXT_GIC_ID_HSMMC2,
159
+ EXT_GIC_ID_HSMMC3, EXT_GIC_ID_SDMMC },
160
+ /* int combiner group 30 */
161
+ { EXT_GIC_ID_MIPI_CSI_4LANE, EXT_GIC_ID_MIPI_CSI_2LANE },
162
+ /* int combiner group 31 */
163
+ { EXT_GIC_ID_MIPI_DSI_4LANE, EXT_GIC_ID_MIPI_DSI_2LANE },
164
+ /* int combiner group 32 */
165
+ { EXT_GIC_ID_FIMC0, EXT_GIC_ID_FIMC1 },
166
+ /* int combiner group 33 */
167
+ { EXT_GIC_ID_FIMC2, EXT_GIC_ID_FIMC3 },
168
+ /* int combiner group 34 */
169
+ { EXT_GIC_ID_ONENAND_AUDI, EXT_GIC_ID_NFC },
170
+ /* int combiner group 35 */
171
+ { 0, 0, 0, EXT_GIC_ID_MCT_L1, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
172
+ /* int combiner group 36 */
173
+ { EXT_GIC_ID_MIXER },
174
+ /* int combiner group 37 */
175
+ { EXT_GIC_ID_EXTINT4, EXT_GIC_ID_EXTINT5, EXT_GIC_ID_EXTINT6,
176
+ EXT_GIC_ID_EXTINT7 },
177
+ /* groups 38-50 */
178
+ { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { },
179
+ /* int combiner group 51 */
180
+ { EXT_GIC_ID_MCT_L0, 0, 0, 0, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
181
+ /* group 52 */
182
+ { },
183
+ /* int combiner group 53 */
184
+ { EXT_GIC_ID_WDT, 0, 0, 0, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
185
+ /* groups 54-63 */
186
+ { }, { }, { }, { }, { }, { }, { }, { }, { }, { }
187
+};
188
+
189
+/*
190
+ * Initialize board IRQs.
191
+ * These IRQs contain splitted Int/External Combiner and External Gic IRQs.
192
+ */
193
+static void exynos4210_init_board_irqs(Exynos4210State *s)
194
+{
84
+{
195
+ uint32_t grp, bit, irq_id, n;
85
+ uint32_t cpregid = kvmid;
196
+ Exynos4210Irq *is = &s->irqs;
86
+ if ((kvmid & CP_REG_ARCH_MASK) == CP_REG_ARM64) {
197
+
87
+ cpregid |= CP_REG_AA64_MASK;
198
+ for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
88
+ } else {
199
+ irq_id = 0;
89
+ if ((kvmid & CP_REG_SIZE_MASK) == CP_REG_SIZE_U64) {
200
+ if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 4) ||
90
+ cpregid |= (1 << 15);
201
+ n == EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 4)) {
202
+ /* MCT_G0 is passed to External GIC */
203
+ irq_id = EXT_GIC_ID_MCT_G0;
204
+ }
91
+ }
205
+ if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 5) ||
92
+
206
+ n == EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 5)) {
93
+ /*
207
+ /* MCT_G1 is passed to External and GIC */
94
+ * KVM is always non-secure so add the NS flag on AArch32 register
208
+ irq_id = EXT_GIC_ID_MCT_G1;
95
+ * entries.
209
+ }
96
+ */
210
+ if (irq_id) {
97
+ cpregid |= 1 << CP_REG_NS_SHIFT;
211
+ s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
98
+ }
212
+ is->ext_gic_irq[irq_id - 32]);
99
+ return cpregid;
100
+}
101
+
102
+/*
103
+ * Convert a truncated 32 bit hashtable key into the full
104
+ * 64 bit KVM register ID.
105
+ */
106
+static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
107
+{
108
+ uint64_t kvmid;
109
+
110
+ if (cpregid & CP_REG_AA64_MASK) {
111
+ kvmid = cpregid & ~CP_REG_AA64_MASK;
112
+ kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM64;
113
+ } else {
114
+ kvmid = cpregid & ~(1 << 15);
115
+ if (cpregid & (1 << 15)) {
116
+ kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM;
213
+ } else {
117
+ } else {
214
+ s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
118
+ kvmid |= CP_REG_SIZE_U32 | CP_REG_ARM;
215
+ is->ext_combiner_irq[n]);
216
+ }
119
+ }
217
+ }
120
+ }
218
+ for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
121
+ return kvmid;
219
+ /* these IDs are passed to Internal Combiner and External GIC */
220
+ grp = EXYNOS4210_COMBINER_GET_GRP_NUM(n);
221
+ bit = EXYNOS4210_COMBINER_GET_BIT_NUM(n);
222
+ irq_id = combiner_grp_to_gic_id[grp -
223
+ EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][bit];
224
+
225
+ if (irq_id) {
226
+ s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
227
+ is->ext_gic_irq[irq_id - 32]);
228
+ }
229
+ }
230
+}
122
+}
231
+
123
+
232
+/*
124
/*
233
+ * Get IRQ number from exynos4210 IRQ subsystem stub.
125
* Valid values for ARMCPRegInfo state field, indicating which of
234
+ * To identify IRQ source use internal combiner group and bit number
126
* the AArch32 and AArch64 execution states this register is visible in.
235
+ * grp - group number
127
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
236
+ * bit - bit number inside group
237
+ */
238
+uint32_t exynos4210_get_irq(uint32_t grp, uint32_t bit)
239
+{
240
+ return EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit);
241
+}
242
+
243
static uint8_t chipid_and_omr[] = { 0x11, 0x02, 0x21, 0x43,
244
0x09, 0x00, 0x00, 0x00 };
245
246
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
247
index XXXXXXX..XXXXXXX 100644
128
index XXXXXXX..XXXXXXX 100644
248
--- a/hw/intc/exynos4210_gic.c
129
--- a/target/arm/cpu.h
249
+++ b/hw/intc/exynos4210_gic.c
130
+++ b/target/arm/cpu.h
250
@@ -XXX,XX +XXX,XX @@
131
@@ -XXX,XX +XXX,XX @@ void arm_cpu_list(void);
251
#include "hw/arm/exynos4210.h"
132
uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
252
#include "qom/object.h"
133
uint32_t cur_el, bool secure);
253
134
254
-enum ExtGicId {
135
-/* Interface for defining coprocessor registers.
255
- EXT_GIC_ID_MDMA_LCD0 = 66,
136
- * Registers are defined in tables of arm_cp_reginfo structs
256
- EXT_GIC_ID_PDMA0,
137
- * which are passed to define_arm_cp_regs().
257
- EXT_GIC_ID_PDMA1,
138
- */
258
- EXT_GIC_ID_TIMER0,
139
-
259
- EXT_GIC_ID_TIMER1,
140
-/* When looking up a coprocessor register we look for it
260
- EXT_GIC_ID_TIMER2,
141
- * via an integer which encodes all of:
261
- EXT_GIC_ID_TIMER3,
142
- * coprocessor number
262
- EXT_GIC_ID_TIMER4,
143
- * Crn, Crm, opc1, opc2 fields
263
- EXT_GIC_ID_MCT_L0,
144
- * 32 or 64 bit register (ie is it accessed via MRC/MCR
264
- EXT_GIC_ID_WDT,
145
- * or via MRRC/MCRR?)
265
- EXT_GIC_ID_RTC_ALARM,
146
- * non-secure/secure bank (AArch32 only)
266
- EXT_GIC_ID_RTC_TIC,
147
- * We allow 4 bits for opc1 because MRRC/MCRR have a 4 bit field.
267
- EXT_GIC_ID_GPIO_XB,
148
- * (In this case crn and opc2 should be zero.)
268
- EXT_GIC_ID_GPIO_XA,
149
- * For AArch64, there is no 32/64 bit size distinction;
269
- EXT_GIC_ID_MCT_L1,
150
- * instead all registers have a 2 bit op0, 3 bit op1 and op2,
270
- EXT_GIC_ID_IEM_APC,
151
- * and 4 bit CRn and CRm. The encoding patterns are chosen
271
- EXT_GIC_ID_IEM_IEC,
152
- * to be easy to convert to and from the KVM encodings, and also
272
- EXT_GIC_ID_NFC,
153
- * so that the hashtable can contain both AArch32 and AArch64
273
- EXT_GIC_ID_UART0,
154
- * registers (to allow for interprocessing where we might run
274
- EXT_GIC_ID_UART1,
155
- * 32 bit code on a 64 bit core).
275
- EXT_GIC_ID_UART2,
156
- */
276
- EXT_GIC_ID_UART3,
157
-/* This bit is private to our hashtable cpreg; in KVM register
277
- EXT_GIC_ID_UART4,
158
- * IDs the AArch64/32 distinction is the KVM_REG_ARM/ARM64
278
- EXT_GIC_ID_MCT_G0,
159
- * in the upper bits of the 64 bit ID.
279
- EXT_GIC_ID_I2C0,
160
- */
280
- EXT_GIC_ID_I2C1,
161
-#define CP_REG_AA64_SHIFT 28
281
- EXT_GIC_ID_I2C2,
162
-#define CP_REG_AA64_MASK (1 << CP_REG_AA64_SHIFT)
282
- EXT_GIC_ID_I2C3,
163
-
283
- EXT_GIC_ID_I2C4,
164
-/* To enable banking of coprocessor registers depending on ns-bit we
284
- EXT_GIC_ID_I2C5,
165
- * add a bit to distinguish between secure and non-secure cpregs in the
285
- EXT_GIC_ID_I2C6,
166
- * hashtable.
286
- EXT_GIC_ID_I2C7,
167
- */
287
- EXT_GIC_ID_SPI0,
168
-#define CP_REG_NS_SHIFT 29
288
- EXT_GIC_ID_SPI1,
169
-#define CP_REG_NS_MASK (1 << CP_REG_NS_SHIFT)
289
- EXT_GIC_ID_SPI2,
170
-
290
- EXT_GIC_ID_MCT_G1,
171
-#define ENCODE_CP_REG(cp, is64, ns, crn, crm, opc1, opc2) \
291
- EXT_GIC_ID_USB_HOST,
172
- ((ns) << CP_REG_NS_SHIFT | ((cp) << 16) | ((is64) << 15) | \
292
- EXT_GIC_ID_USB_DEVICE,
173
- ((crn) << 11) | ((crm) << 7) | ((opc1) << 3) | (opc2))
293
- EXT_GIC_ID_MODEMIF,
174
-
294
- EXT_GIC_ID_HSMMC0,
175
-#define ENCODE_AA64_CP_REG(cp, crn, crm, op0, op1, op2) \
295
- EXT_GIC_ID_HSMMC1,
176
- (CP_REG_AA64_MASK | \
296
- EXT_GIC_ID_HSMMC2,
177
- ((cp) << CP_REG_ARM_COPROC_SHIFT) | \
297
- EXT_GIC_ID_HSMMC3,
178
- ((op0) << CP_REG_ARM64_SYSREG_OP0_SHIFT) | \
298
- EXT_GIC_ID_SDMMC,
179
- ((op1) << CP_REG_ARM64_SYSREG_OP1_SHIFT) | \
299
- EXT_GIC_ID_MIPI_CSI_4LANE,
180
- ((crn) << CP_REG_ARM64_SYSREG_CRN_SHIFT) | \
300
- EXT_GIC_ID_MIPI_DSI_4LANE,
181
- ((crm) << CP_REG_ARM64_SYSREG_CRM_SHIFT) | \
301
- EXT_GIC_ID_MIPI_CSI_2LANE,
182
- ((op2) << CP_REG_ARM64_SYSREG_OP2_SHIFT))
302
- EXT_GIC_ID_MIPI_DSI_2LANE,
183
-
303
- EXT_GIC_ID_ONENAND_AUDI,
184
-/* Convert a full 64 bit KVM register ID to the truncated 32 bit
304
- EXT_GIC_ID_ROTATOR,
185
- * version used as a key for the coprocessor register hashtable
305
- EXT_GIC_ID_FIMC0,
186
- */
306
- EXT_GIC_ID_FIMC1,
187
-static inline uint32_t kvm_to_cpreg_id(uint64_t kvmid)
307
- EXT_GIC_ID_FIMC2,
308
- EXT_GIC_ID_FIMC3,
309
- EXT_GIC_ID_JPEG,
310
- EXT_GIC_ID_2D,
311
- EXT_GIC_ID_PCIe,
312
- EXT_GIC_ID_MIXER,
313
- EXT_GIC_ID_HDMI,
314
- EXT_GIC_ID_HDMI_I2C,
315
- EXT_GIC_ID_MFC,
316
- EXT_GIC_ID_TVENC,
317
-};
318
-
319
-enum ExtInt {
320
- EXT_GIC_ID_EXTINT0 = 48,
321
- EXT_GIC_ID_EXTINT1,
322
- EXT_GIC_ID_EXTINT2,
323
- EXT_GIC_ID_EXTINT3,
324
- EXT_GIC_ID_EXTINT4,
325
- EXT_GIC_ID_EXTINT5,
326
- EXT_GIC_ID_EXTINT6,
327
- EXT_GIC_ID_EXTINT7,
328
- EXT_GIC_ID_EXTINT8,
329
- EXT_GIC_ID_EXTINT9,
330
- EXT_GIC_ID_EXTINT10,
331
- EXT_GIC_ID_EXTINT11,
332
- EXT_GIC_ID_EXTINT12,
333
- EXT_GIC_ID_EXTINT13,
334
- EXT_GIC_ID_EXTINT14,
335
- EXT_GIC_ID_EXTINT15
336
-};
337
-
338
-/*
339
- * External GIC sources which are not from External Interrupt Combiner or
340
- * External Interrupts are starting from EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ,
341
- * which is INTG16 in Internal Interrupt Combiner.
342
- */
343
-
344
-static const uint32_t
345
-combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
346
- /* int combiner groups 16-19 */
347
- { }, { }, { }, { },
348
- /* int combiner group 20 */
349
- { 0, EXT_GIC_ID_MDMA_LCD0 },
350
- /* int combiner group 21 */
351
- { EXT_GIC_ID_PDMA0, EXT_GIC_ID_PDMA1 },
352
- /* int combiner group 22 */
353
- { EXT_GIC_ID_TIMER0, EXT_GIC_ID_TIMER1, EXT_GIC_ID_TIMER2,
354
- EXT_GIC_ID_TIMER3, EXT_GIC_ID_TIMER4 },
355
- /* int combiner group 23 */
356
- { EXT_GIC_ID_RTC_ALARM, EXT_GIC_ID_RTC_TIC },
357
- /* int combiner group 24 */
358
- { EXT_GIC_ID_GPIO_XB, EXT_GIC_ID_GPIO_XA },
359
- /* int combiner group 25 */
360
- { EXT_GIC_ID_IEM_APC, EXT_GIC_ID_IEM_IEC },
361
- /* int combiner group 26 */
362
- { EXT_GIC_ID_UART0, EXT_GIC_ID_UART1, EXT_GIC_ID_UART2, EXT_GIC_ID_UART3,
363
- EXT_GIC_ID_UART4 },
364
- /* int combiner group 27 */
365
- { EXT_GIC_ID_I2C0, EXT_GIC_ID_I2C1, EXT_GIC_ID_I2C2, EXT_GIC_ID_I2C3,
366
- EXT_GIC_ID_I2C4, EXT_GIC_ID_I2C5, EXT_GIC_ID_I2C6,
367
- EXT_GIC_ID_I2C7 },
368
- /* int combiner group 28 */
369
- { EXT_GIC_ID_SPI0, EXT_GIC_ID_SPI1, EXT_GIC_ID_SPI2 , EXT_GIC_ID_USB_HOST},
370
- /* int combiner group 29 */
371
- { EXT_GIC_ID_HSMMC0, EXT_GIC_ID_HSMMC1, EXT_GIC_ID_HSMMC2,
372
- EXT_GIC_ID_HSMMC3, EXT_GIC_ID_SDMMC },
373
- /* int combiner group 30 */
374
- { EXT_GIC_ID_MIPI_CSI_4LANE, EXT_GIC_ID_MIPI_CSI_2LANE },
375
- /* int combiner group 31 */
376
- { EXT_GIC_ID_MIPI_DSI_4LANE, EXT_GIC_ID_MIPI_DSI_2LANE },
377
- /* int combiner group 32 */
378
- { EXT_GIC_ID_FIMC0, EXT_GIC_ID_FIMC1 },
379
- /* int combiner group 33 */
380
- { EXT_GIC_ID_FIMC2, EXT_GIC_ID_FIMC3 },
381
- /* int combiner group 34 */
382
- { EXT_GIC_ID_ONENAND_AUDI, EXT_GIC_ID_NFC },
383
- /* int combiner group 35 */
384
- { 0, 0, 0, EXT_GIC_ID_MCT_L1, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
385
- /* int combiner group 36 */
386
- { EXT_GIC_ID_MIXER },
387
- /* int combiner group 37 */
388
- { EXT_GIC_ID_EXTINT4, EXT_GIC_ID_EXTINT5, EXT_GIC_ID_EXTINT6,
389
- EXT_GIC_ID_EXTINT7 },
390
- /* groups 38-50 */
391
- { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { },
392
- /* int combiner group 51 */
393
- { EXT_GIC_ID_MCT_L0, 0, 0, 0, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
394
- /* group 52 */
395
- { },
396
- /* int combiner group 53 */
397
- { EXT_GIC_ID_WDT, 0, 0, 0, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
398
- /* groups 54-63 */
399
- { }, { }, { }, { }, { }, { }, { }, { }, { }, { }
400
-};
401
-
402
#define EXYNOS4210_GIC_NIRQ 160
403
404
#define EXYNOS4210_EXT_GIC_CPU_REGION_SIZE 0x10000
405
@@ -XXX,XX +XXX,XX @@ combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
406
#define EXYNOS4210_GIC_CPU_REGION_SIZE 0x100
407
#define EXYNOS4210_GIC_DIST_REGION_SIZE 0x1000
408
409
-/*
410
- * Initialize board IRQs.
411
- * These IRQs contain splitted Int/External Combiner and External Gic IRQs.
412
- */
413
-void exynos4210_init_board_irqs(Exynos4210State *s)
414
-{
188
-{
415
- uint32_t grp, bit, irq_id, n;
189
- uint32_t cpregid = kvmid;
416
- Exynos4210Irq *is = &s->irqs;
190
- if ((kvmid & CP_REG_ARCH_MASK) == CP_REG_ARM64) {
417
-
191
- cpregid |= CP_REG_AA64_MASK;
418
- for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
192
- } else {
419
- irq_id = 0;
193
- if ((kvmid & CP_REG_SIZE_MASK) == CP_REG_SIZE_U64) {
420
- if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 4) ||
194
- cpregid |= (1 << 15);
421
- n == EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 4)) {
422
- /* MCT_G0 is passed to External GIC */
423
- irq_id = EXT_GIC_ID_MCT_G0;
424
- }
195
- }
425
- if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 5) ||
196
-
426
- n == EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 5)) {
197
- /* KVM is always non-secure so add the NS flag on AArch32 register
427
- /* MCT_G1 is passed to External and GIC */
198
- * entries.
428
- irq_id = EXT_GIC_ID_MCT_G1;
199
- */
429
- }
200
- cpregid |= 1 << CP_REG_NS_SHIFT;
430
- if (irq_id) {
201
- }
431
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
202
- return cpregid;
432
- is->ext_gic_irq[irq_id - 32]);
203
-}
204
-
205
-/* Convert a truncated 32 bit hashtable key into the full
206
- * 64 bit KVM register ID.
207
- */
208
-static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
209
-{
210
- uint64_t kvmid;
211
-
212
- if (cpregid & CP_REG_AA64_MASK) {
213
- kvmid = cpregid & ~CP_REG_AA64_MASK;
214
- kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM64;
215
- } else {
216
- kvmid = cpregid & ~(1 << 15);
217
- if (cpregid & (1 << 15)) {
218
- kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM;
433
- } else {
219
- } else {
434
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
220
- kvmid |= CP_REG_SIZE_U32 | CP_REG_ARM;
435
- is->ext_combiner_irq[n]);
436
- }
221
- }
437
- }
222
- }
438
- for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
223
- return kvmid;
439
- /* these IDs are passed to Internal Combiner and External GIC */
440
- grp = EXYNOS4210_COMBINER_GET_GRP_NUM(n);
441
- bit = EXYNOS4210_COMBINER_GET_BIT_NUM(n);
442
- irq_id = combiner_grp_to_gic_id[grp -
443
- EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][bit];
444
-
445
- if (irq_id) {
446
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
447
- is->ext_gic_irq[irq_id - 32]);
448
- }
449
- }
450
-}
224
-}
451
-
225
-
452
-/*
226
/* Return the highest implemented Exception Level */
453
- * Get IRQ number from exynos4210 IRQ subsystem stub.
227
static inline int arm_highest_el(CPUARMState *env)
454
- * To identify IRQ source use internal combiner group and bit number
228
{
455
- * grp - group number
456
- * bit - bit number inside group
457
- */
458
-uint32_t exynos4210_get_irq(uint32_t grp, uint32_t bit)
459
-{
460
- return EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit);
461
-}
462
-
463
-/********* GIC part *********/
464
-
465
#define TYPE_EXYNOS4210_GIC "exynos4210.gic"
466
OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210GicState, EXYNOS4210_GIC)
467
468
--
229
--
469
2.25.1
230
2.34.1
231
232
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Connect the CRL (Clock Reset LPD) to the Versal SoC.
3
If a test was tagged with the "accel" tag and the specified
4
accelerator it not present in the qemu binary, cancel the test.
4
5
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
6
We can now write tests without explicit calls to require_accelerator,
6
Reviewed-by: Frederic Konrad <fkonrad@amd.com>
7
just the tag is enough.
7
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
8
8
Message-id: 20220406174303.2022038-5-edgar.iglesias@xilinx.com
9
Signed-off-by: Fabiano Rosas <farosas@suse.de>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
13
---
11
include/hw/arm/xlnx-versal.h | 4 +++
14
tests/avocado/avocado_qemu/__init__.py | 4 ++++
12
hw/arm/xlnx-versal.c | 54 ++++++++++++++++++++++++++++++++++--
15
1 file changed, 4 insertions(+)
13
2 files changed, 56 insertions(+), 2 deletions(-)
14
16
15
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
17
diff --git a/tests/avocado/avocado_qemu/__init__.py b/tests/avocado/avocado_qemu/__init__.py
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/xlnx-versal.h
19
--- a/tests/avocado/avocado_qemu/__init__.py
18
+++ b/include/hw/arm/xlnx-versal.h
20
+++ b/tests/avocado/avocado_qemu/__init__.py
19
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ def setUp(self):
20
#include "hw/nvram/xlnx-versal-efuse.h"
22
21
#include "hw/ssi/xlnx-versal-ospi.h"
23
super().setUp('qemu-system-')
22
#include "hw/dma/xlnx_csu_dma.h"
24
23
+#include "hw/misc/xlnx-versal-crl.h"
25
+ accel_required = self._get_unique_tag_val('accel')
24
#include "hw/misc/xlnx-versal-pmc-iou-slcr.h"
26
+ if accel_required:
25
27
+ self.require_accelerator(accel_required)
26
#define TYPE_XLNX_VERSAL "xlnx-versal"
27
@@ -XXX,XX +XXX,XX @@ struct Versal {
28
qemu_or_irq irq_orgate;
29
XlnxXramCtrl ctrl[XLNX_VERSAL_NR_XRAM];
30
} xram;
31
+
28
+
32
+ XlnxVersalCRL crl;
29
self.machine = self.params.get('machine',
33
} lpd;
30
default=self._get_unique_tag_val('machine'))
34
35
/* The Platform Management Controller subsystem. */
36
@@ -XXX,XX +XXX,XX @@ struct Versal {
37
#define VERSAL_TIMER_NS_EL1_IRQ 14
38
#define VERSAL_TIMER_NS_EL2_IRQ 10
39
40
+#define VERSAL_CRL_IRQ 10
41
#define VERSAL_UART0_IRQ_0 18
42
#define VERSAL_UART1_IRQ_0 19
43
#define VERSAL_USB0_IRQ_0 22
44
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/arm/xlnx-versal.c
47
+++ b/hw/arm/xlnx-versal.c
48
@@ -XXX,XX +XXX,XX @@ static void versal_create_ospi(Versal *s, qemu_irq *pic)
49
qdev_connect_gpio_out(orgate, 0, pic[VERSAL_OSPI_IRQ]);
50
}
51
52
+static void versal_create_crl(Versal *s, qemu_irq *pic)
53
+{
54
+ SysBusDevice *sbd;
55
+ int i;
56
+
57
+ object_initialize_child(OBJECT(s), "crl", &s->lpd.crl,
58
+ TYPE_XLNX_VERSAL_CRL);
59
+ sbd = SYS_BUS_DEVICE(&s->lpd.crl);
60
+
61
+ for (i = 0; i < ARRAY_SIZE(s->lpd.rpu.cpu); i++) {
62
+ g_autofree gchar *name = g_strdup_printf("cpu_r5[%d]", i);
63
+
64
+ object_property_set_link(OBJECT(&s->lpd.crl),
65
+ name, OBJECT(&s->lpd.rpu.cpu[i]),
66
+ &error_abort);
67
+ }
68
+
69
+ for (i = 0; i < ARRAY_SIZE(s->lpd.iou.gem); i++) {
70
+ g_autofree gchar *name = g_strdup_printf("gem[%d]", i);
71
+
72
+ object_property_set_link(OBJECT(&s->lpd.crl),
73
+ name, OBJECT(&s->lpd.iou.gem[i]),
74
+ &error_abort);
75
+ }
76
+
77
+ for (i = 0; i < ARRAY_SIZE(s->lpd.iou.adma); i++) {
78
+ g_autofree gchar *name = g_strdup_printf("adma[%d]", i);
79
+
80
+ object_property_set_link(OBJECT(&s->lpd.crl),
81
+ name, OBJECT(&s->lpd.iou.adma[i]),
82
+ &error_abort);
83
+ }
84
+
85
+ for (i = 0; i < ARRAY_SIZE(s->lpd.iou.uart); i++) {
86
+ g_autofree gchar *name = g_strdup_printf("uart[%d]", i);
87
+
88
+ object_property_set_link(OBJECT(&s->lpd.crl),
89
+ name, OBJECT(&s->lpd.iou.uart[i]),
90
+ &error_abort);
91
+ }
92
+
93
+ object_property_set_link(OBJECT(&s->lpd.crl),
94
+ "usb", OBJECT(&s->lpd.iou.usb),
95
+ &error_abort);
96
+
97
+ sysbus_realize(sbd, &error_fatal);
98
+ memory_region_add_subregion(&s->mr_ps, MM_CRL,
99
+ sysbus_mmio_get_region(sbd, 0));
100
+ sysbus_connect_irq(sbd, 0, pic[VERSAL_CRL_IRQ]);
101
+}
102
+
103
/* This takes the board allocated linear DDR memory and creates aliases
104
* for each split DDR range/aperture on the Versal address map.
105
*/
106
@@ -XXX,XX +XXX,XX @@ static void versal_unimp(Versal *s)
107
108
versal_unimp_area(s, "psm", &s->mr_ps,
109
MM_PSM_START, MM_PSM_END - MM_PSM_START);
110
- versal_unimp_area(s, "crl", &s->mr_ps,
111
- MM_CRL, MM_CRL_SIZE);
112
versal_unimp_area(s, "crf", &s->mr_ps,
113
MM_FPD_CRF, MM_FPD_CRF_SIZE);
114
versal_unimp_area(s, "apu", &s->mr_ps,
115
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
116
versal_create_efuse(s, pic);
117
versal_create_pmc_iou_slcr(s, pic);
118
versal_create_ospi(s, pic);
119
+ versal_create_crl(s, pic);
120
versal_map_ddr(s);
121
versal_unimp(s);
122
31
123
--
32
--
124
2.25.1
33
2.34.1
34
35
diff view generated by jsdifflib
1
The only time we use the ext_gic_irq[] array in the Exynos4210Irq
1
From: Fabiano Rosas <farosas@suse.de>
2
struct is during realize of the SoC -- we initialize it with the
3
input IRQs of the external GIC device, and then connect those to
4
outputs of other devices further on in realize (including in the
5
exynos4210_init_board_irqs() function). Now that the ext_gic object
6
is easily accessible as s->ext_gic we can make the connections
7
directly from one device to the other without going via this array.
8
2
3
This allows the test to be skipped when TCG is not present in the QEMU
4
binary.
5
6
Signed-off-by: Fabiano Rosas <farosas@suse.de>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20220404154658.565020-10-peter.maydell@linaro.org
12
---
10
---
13
include/hw/arm/exynos4210.h | 1 -
11
tests/avocado/boot_linux_console.py | 1 +
14
hw/arm/exynos4210.c | 12 ++++++------
12
tests/avocado/reverse_debugging.py | 8 ++++++++
15
2 files changed, 6 insertions(+), 7 deletions(-)
13
2 files changed, 9 insertions(+)
16
14
17
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
15
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/exynos4210.h
17
--- a/tests/avocado/boot_linux_console.py
20
+++ b/include/hw/arm/exynos4210.h
18
+++ b/tests/avocado/boot_linux_console.py
21
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ def test_arm_orangepi_uboot_netbsd9(self):
22
typedef struct Exynos4210Irq {
20
23
qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
21
def test_aarch64_raspi3_atf(self):
24
qemu_irq ext_combiner_irq[EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ];
22
"""
25
- qemu_irq ext_gic_irq[EXYNOS4210_EXT_GIC_NIRQ];
23
+ :avocado: tags=accel:tcg
26
} Exynos4210Irq;
24
:avocado: tags=arch:aarch64
27
25
:avocado: tags=machine:raspi3b
28
struct Exynos4210State {
26
:avocado: tags=cpu:cortex-a53
29
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
27
diff --git a/tests/avocado/reverse_debugging.py b/tests/avocado/reverse_debugging.py
30
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/arm/exynos4210.c
29
--- a/tests/avocado/reverse_debugging.py
32
+++ b/hw/arm/exynos4210.c
30
+++ b/tests/avocado/reverse_debugging.py
33
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
31
@@ -XXX,XX +XXX,XX @@ def reverse_debugging(self, shift=7, args=None):
34
{
32
vm.shutdown()
35
uint32_t grp, bit, irq_id, n;
33
36
Exynos4210Irq *is = &s->irqs;
34
class ReverseDebugging_X86_64(ReverseDebugging):
37
+ DeviceState *extgicdev = DEVICE(&s->ext_gic);
35
+ """
38
36
+ :avocado: tags=accel:tcg
39
for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
37
+ """
40
irq_id = 0;
38
+
41
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
39
REG_PC = 0x10
42
}
40
REG_CS = 0x12
43
if (irq_id) {
41
def get_pc(self, g):
44
s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
42
@@ -XXX,XX +XXX,XX @@ def test_x86_64_pc(self):
45
- is->ext_gic_irq[irq_id - 32]);
43
self.reverse_debugging()
46
+ qdev_get_gpio_in(extgicdev,
44
47
+ irq_id - 32));
45
class ReverseDebugging_AArch64(ReverseDebugging):
48
} else {
46
+ """
49
s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
47
+ :avocado: tags=accel:tcg
50
is->ext_combiner_irq[n]);
48
+ """
51
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
49
+
52
50
REG_PC = 32
53
if (irq_id) {
51
54
s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
52
# unidentified gitlab timeout problem
55
- is->ext_gic_irq[irq_id - 32]);
56
+ qdev_get_gpio_in(extgicdev,
57
+ irq_id - 32));
58
}
59
}
60
}
61
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
62
sysbus_connect_irq(busdev, n,
63
qdev_get_gpio_in(DEVICE(&s->cpu_irq_orgate[n]), 1));
64
}
65
- for (n = 0; n < EXYNOS4210_EXT_GIC_NIRQ; n++) {
66
- s->irqs.ext_gic_irq[n] = qdev_get_gpio_in(DEVICE(&s->ext_gic), n);
67
- }
68
69
/* Internal Interrupt Combiner */
70
dev = qdev_new("exynos4210.combiner");
71
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
72
busdev = SYS_BUS_DEVICE(dev);
73
sysbus_realize_and_unref(busdev, &error_fatal);
74
for (n = 0; n < EXYNOS4210_MAX_INT_COMBINER_OUT_IRQ; n++) {
75
- sysbus_connect_irq(busdev, n, s->irqs.ext_gic_irq[n]);
76
+ sysbus_connect_irq(busdev, n, qdev_get_gpio_in(DEVICE(&s->ext_gic), n));
77
}
78
exynos4210_combiner_get_gpioin(&s->irqs, dev, 1);
79
sysbus_mmio_map(busdev, 0, EXYNOS4210_EXT_COMBINER_BASE_ADDR);
80
--
53
--
81
2.25.1
54
2.34.1
55
56
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Break out header file to allow embedding of the the TTC.
3
Now that the cortex-a15 is under CONFIG_TCG, use as default CPU for a
4
KVM-only build the 'max' cpu.
4
5
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
6
Note that we cannot use 'host' here because the qtests can run without
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
any other accelerator (than qtest) and 'host' depends on KVM being
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
enabled.
8
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
9
9
Message-id: 20220331222017.2914409-2-edgar.iglesias@gmail.com
10
Signed-off-by: Fabiano Rosas <farosas@suse.de>
11
Acked-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Thomas Huth <thuth@redhat.com>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
14
---
12
include/hw/timer/cadence_ttc.h | 54 ++++++++++++++++++++++++++++++++++
15
hw/arm/virt.c | 4 ++++
13
hw/timer/cadence_ttc.c | 32 ++------------------
16
1 file changed, 4 insertions(+)
14
2 files changed, 56 insertions(+), 30 deletions(-)
15
create mode 100644 include/hw/timer/cadence_ttc.h
16
17
17
diff --git a/include/hw/timer/cadence_ttc.h b/include/hw/timer/cadence_ttc.h
18
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
new file mode 100644
19
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX
20
--- a/hw/arm/virt.c
20
--- /dev/null
21
+++ b/hw/arm/virt.c
21
+++ b/include/hw/timer/cadence_ttc.h
22
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
22
@@ -XXX,XX +XXX,XX @@
23
mc->minimum_page_bits = 12;
23
+/*
24
mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids;
24
+ * Xilinx Zynq cadence TTC model
25
mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
25
+ *
26
+#ifdef CONFIG_TCG
26
+ * Copyright (c) 2011 Xilinx Inc.
27
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
27
+ * Copyright (c) 2012 Peter A.G. Crosthwaite (peter.crosthwaite@petalogix.com)
28
+#else
28
+ * Copyright (c) 2012 PetaLogix Pty Ltd.
29
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("max");
29
+ * Written By Haibing Ma
30
+ * M. Habib
31
+ *
32
+ * This program is free software; you can redistribute it and/or
33
+ * modify it under the terms of the GNU General Public License
34
+ * as published by the Free Software Foundation; either version
35
+ * 2 of the License, or (at your option) any later version.
36
+ *
37
+ * You should have received a copy of the GNU General Public License along
38
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
39
+ */
40
+#ifndef HW_TIMER_CADENCE_TTC_H
41
+#define HW_TIMER_CADENCE_TTC_H
42
+
43
+#include "hw/sysbus.h"
44
+#include "qemu/timer.h"
45
+
46
+typedef struct {
47
+ QEMUTimer *timer;
48
+ int freq;
49
+
50
+ uint32_t reg_clock;
51
+ uint32_t reg_count;
52
+ uint32_t reg_value;
53
+ uint16_t reg_interval;
54
+ uint16_t reg_match[3];
55
+ uint32_t reg_intr;
56
+ uint32_t reg_intr_en;
57
+ uint32_t reg_event_ctrl;
58
+ uint32_t reg_event;
59
+
60
+ uint64_t cpu_time;
61
+ unsigned int cpu_time_valid;
62
+
63
+ qemu_irq irq;
64
+} CadenceTimerState;
65
+
66
+#define TYPE_CADENCE_TTC "cadence_ttc"
67
+OBJECT_DECLARE_SIMPLE_TYPE(CadenceTTCState, CADENCE_TTC)
68
+
69
+struct CadenceTTCState {
70
+ SysBusDevice parent_obj;
71
+
72
+ MemoryRegion iomem;
73
+ CadenceTimerState timer[3];
74
+};
75
+
76
+#endif
30
+#endif
77
diff --git a/hw/timer/cadence_ttc.c b/hw/timer/cadence_ttc.c
31
mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
78
index XXXXXXX..XXXXXXX 100644
32
mc->kvm_type = virt_kvm_type;
79
--- a/hw/timer/cadence_ttc.c
33
assert(!mc->get_hotplug_handler);
80
+++ b/hw/timer/cadence_ttc.c
81
@@ -XXX,XX +XXX,XX @@
82
#include "qemu/timer.h"
83
#include "qom/object.h"
84
85
+#include "hw/timer/cadence_ttc.h"
86
+
87
#ifdef CADENCE_TTC_ERR_DEBUG
88
#define DB_PRINT(...) do { \
89
fprintf(stderr, ": %s: ", __func__); \
90
@@ -XXX,XX +XXX,XX @@
91
#define CLOCK_CTRL_PS_EN 0x00000001
92
#define CLOCK_CTRL_PS_V 0x0000001e
93
94
-typedef struct {
95
- QEMUTimer *timer;
96
- int freq;
97
-
98
- uint32_t reg_clock;
99
- uint32_t reg_count;
100
- uint32_t reg_value;
101
- uint16_t reg_interval;
102
- uint16_t reg_match[3];
103
- uint32_t reg_intr;
104
- uint32_t reg_intr_en;
105
- uint32_t reg_event_ctrl;
106
- uint32_t reg_event;
107
-
108
- uint64_t cpu_time;
109
- unsigned int cpu_time_valid;
110
-
111
- qemu_irq irq;
112
-} CadenceTimerState;
113
-
114
-#define TYPE_CADENCE_TTC "cadence_ttc"
115
-OBJECT_DECLARE_SIMPLE_TYPE(CadenceTTCState, CADENCE_TTC)
116
-
117
-struct CadenceTTCState {
118
- SysBusDevice parent_obj;
119
-
120
- MemoryRegion iomem;
121
- CadenceTimerState timer[3];
122
-};
123
-
124
static void cadence_timer_update(CadenceTimerState *s)
125
{
126
qemu_set_irq(s->irq, !!(s->reg_intr & s->reg_intr_en));
127
--
34
--
128
2.25.1
35
2.34.1
diff view generated by jsdifflib
Deleted patch
1
The only time we use the int_gic_irq[] array in the Exynos4210Irq
2
struct is in the exynos4210_realize() function: we initialize it with
3
the GPIO inputs of the a9mpcore device, and then a bit later on we
4
connect those to the outputs of the internal combiner. Now that the
5
a9mpcore object is easily accessible as s->a9mpcore we can make the
6
connection directly from one device to the other without going via
7
this array.
8
1
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20220404154658.565020-5-peter.maydell@linaro.org
12
---
13
include/hw/arm/exynos4210.h | 1 -
14
hw/arm/exynos4210.c | 6 ++----
15
2 files changed, 2 insertions(+), 5 deletions(-)
16
17
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/exynos4210.h
20
+++ b/include/hw/arm/exynos4210.h
21
@@ -XXX,XX +XXX,XX @@
22
typedef struct Exynos4210Irq {
23
qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
24
qemu_irq ext_combiner_irq[EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ];
25
- qemu_irq int_gic_irq[EXYNOS4210_INT_GIC_NIRQ];
26
qemu_irq ext_gic_irq[EXYNOS4210_EXT_GIC_NIRQ];
27
qemu_irq board_irqs[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
28
} Exynos4210Irq;
29
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/arm/exynos4210.c
32
+++ b/hw/arm/exynos4210.c
33
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
34
sysbus_connect_irq(busdev, n,
35
qdev_get_gpio_in(DEVICE(&s->cpu_irq_orgate[n]), 0));
36
}
37
- for (n = 0; n < EXYNOS4210_INT_GIC_NIRQ; n++) {
38
- s->irqs.int_gic_irq[n] = qdev_get_gpio_in(DEVICE(&s->a9mpcore), n);
39
- }
40
41
/* Cache controller */
42
sysbus_create_simple("l2x0", EXYNOS4210_L2X0_BASE_ADDR, NULL);
43
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
44
busdev = SYS_BUS_DEVICE(dev);
45
sysbus_realize_and_unref(busdev, &error_fatal);
46
for (n = 0; n < EXYNOS4210_MAX_INT_COMBINER_OUT_IRQ; n++) {
47
- sysbus_connect_irq(busdev, n, s->irqs.int_gic_irq[n]);
48
+ sysbus_connect_irq(busdev, n,
49
+ qdev_get_gpio_in(DEVICE(&s->a9mpcore), n));
50
}
51
exynos4210_combiner_get_gpioin(&s->irqs, dev, 0);
52
sysbus_mmio_map(busdev, 0, EXYNOS4210_INT_COMBINER_BASE_ADDR);
53
--
54
2.25.1
diff view generated by jsdifflib
1
In exynos4210_init_board_irqs(), use the TYPE_SPLIT_IRQ device
1
From: Fabiano Rosas <farosas@suse.de>
2
instead of qemu_irq_split().
3
2
3
Signed-off-by: Fabiano Rosas <farosas@suse.de>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Acked-by: Thomas Huth <thuth@redhat.com>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220404154658.565020-13-peter.maydell@linaro.org
7
---
7
---
8
include/hw/arm/exynos4210.h | 9 ++++++++
8
tests/qtest/arm-cpu-features.c | 28 ++++++++++++++++++----------
9
hw/arm/exynos4210.c | 41 +++++++++++++++++++++++++++++--------
9
1 file changed, 18 insertions(+), 10 deletions(-)
10
2 files changed, 42 insertions(+), 8 deletions(-)
11
10
12
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
11
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/include/hw/arm/exynos4210.h
13
--- a/tests/qtest/arm-cpu-features.c
15
+++ b/include/hw/arm/exynos4210.h
14
+++ b/tests/qtest/arm-cpu-features.c
16
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
17
#include "hw/sysbus.h"
16
#define SVE_MAX_VQ 16
18
#include "hw/cpu/a9mpcore.h"
17
19
#include "hw/intc/exynos4210_gic.h"
18
#define MACHINE "-machine virt,gic-version=max -accel tcg "
20
+#include "hw/core/split-irq.h"
19
-#define MACHINE_KVM "-machine virt,gic-version=max -accel kvm -accel tcg "
21
#include "target/arm/cpu-qom.h"
20
+#define MACHINE_KVM "-machine virt,gic-version=max -accel kvm "
22
#include "qom/object.h"
21
#define QUERY_HEAD "{ 'execute': 'query-cpu-model-expansion', " \
23
22
" 'arguments': { 'type': 'full', "
24
@@ -XXX,XX +XXX,XX @@
23
#define QUERY_TAIL "}}"
25
24
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
26
#define EXYNOS4210_NUM_DMA 3
25
{
27
26
g_test_init(&argc, &argv, NULL);
28
+/*
27
29
+ * We need one splitter for every external combiner input, plus
28
- qtest_add_data_func("/arm/query-cpu-model-expansion",
30
+ * one for every non-zero entry in combiner_grp_to_gic_id[].
29
- NULL, test_query_cpu_model_expansion);
31
+ * We'll assert in exynos4210_init_board_irqs() if this is wrong.
30
+ if (qtest_has_accel("tcg")) {
32
+ */
31
+ qtest_add_data_func("/arm/query-cpu-model-expansion",
33
+#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 60)
32
+ NULL, test_query_cpu_model_expansion);
34
+
35
typedef struct Exynos4210Irq {
36
qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
37
qemu_irq ext_combiner_irq[EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ];
38
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
39
qemu_or_irq cpu_irq_orgate[EXYNOS4210_NCPUS];
40
A9MPPrivState a9mpcore;
41
Exynos4210GicState ext_gic;
42
+ SplitIRQ splitter[EXYNOS4210_NUM_SPLITTERS];
43
};
44
45
#define TYPE_EXYNOS4210_SOC "exynos4210"
46
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/exynos4210.c
49
+++ b/hw/arm/exynos4210.c
50
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
51
uint32_t grp, bit, irq_id, n;
52
Exynos4210Irq *is = &s->irqs;
53
DeviceState *extgicdev = DEVICE(&s->ext_gic);
54
+ int splitcount = 0;
55
+ DeviceState *splitter;
56
57
for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
58
irq_id = 0;
59
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
60
/* MCT_G1 is passed to External and GIC */
61
irq_id = EXT_GIC_ID_MCT_G1;
62
}
63
+
64
+ assert(splitcount < EXYNOS4210_NUM_SPLITTERS);
65
+ splitter = DEVICE(&s->splitter[splitcount]);
66
+ qdev_prop_set_uint16(splitter, "num-lines", 2);
67
+ qdev_realize(splitter, NULL, &error_abort);
68
+ splitcount++;
69
+ s->irq_table[n] = qdev_get_gpio_in(splitter, 0);
70
+ qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
71
if (irq_id) {
72
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
73
- qdev_get_gpio_in(extgicdev,
74
- irq_id - 32));
75
+ qdev_connect_gpio_out(splitter, 1,
76
+ qdev_get_gpio_in(extgicdev, irq_id - 32));
77
} else {
78
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
79
- is->ext_combiner_irq[n]);
80
+ qdev_connect_gpio_out(splitter, 1, is->ext_combiner_irq[n]);
81
}
82
}
83
for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
84
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
85
EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][bit];
86
87
if (irq_id) {
88
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
89
- qdev_get_gpio_in(extgicdev,
90
- irq_id - 32));
91
+ assert(splitcount < EXYNOS4210_NUM_SPLITTERS);
92
+ splitter = DEVICE(&s->splitter[splitcount]);
93
+ qdev_prop_set_uint16(splitter, "num-lines", 2);
94
+ qdev_realize(splitter, NULL, &error_abort);
95
+ splitcount++;
96
+ s->irq_table[n] = qdev_get_gpio_in(splitter, 0);
97
+ qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
98
+ qdev_connect_gpio_out(splitter, 1,
99
+ qdev_get_gpio_in(extgicdev, irq_id - 32));
100
}
101
}
102
+ /*
103
+ * We check this here to avoid a more obscure assert later when
104
+ * qdev_assert_realized_properly() checks that we realized every
105
+ * child object we initialized.
106
+ */
107
+ assert(splitcount == EXYNOS4210_NUM_SPLITTERS);
108
}
109
110
/*
111
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init(Object *obj)
112
object_initialize_child(obj, name, &s->cpu_irq_orgate[i], TYPE_OR_IRQ);
113
}
114
115
+ for (i = 0; i < ARRAY_SIZE(s->splitter); i++) {
116
+ g_autofree char *name = g_strdup_printf("irq-splitter%d", i);
117
+ object_initialize_child(obj, name, &s->splitter[i], TYPE_SPLIT_IRQ);
118
+ }
33
+ }
119
+
34
+
120
object_initialize_child(obj, "a9mpcore", &s->a9mpcore, TYPE_A9MPCORE_PRIV);
35
+ if (!g_str_equal(qtest_get_arch(), "aarch64")) {
121
object_initialize_child(obj, "ext-gic", &s->ext_gic, TYPE_EXYNOS4210_GIC);
36
+ goto out;
37
+ }
38
39
/*
40
* For now we only run KVM specific tests with AArch64 QEMU in
41
* order avoid attempting to run an AArch32 QEMU with KVM on
42
* AArch64 hosts. That won't work and isn't easy to detect.
43
*/
44
- if (g_str_equal(qtest_get_arch(), "aarch64") && qtest_has_accel("kvm")) {
45
+ if (qtest_has_accel("kvm")) {
46
/*
47
* This tests target the 'host' CPU type, so register it only if
48
* KVM is available.
49
*/
50
qtest_add_data_func("/arm/kvm/query-cpu-model-expansion",
51
NULL, test_query_cpu_model_expansion_kvm);
52
- }
53
54
- if (g_str_equal(qtest_get_arch(), "aarch64")) {
55
- qtest_add_data_func("/arm/max/query-cpu-model-expansion/sve-max-vq-8",
56
- NULL, sve_tests_sve_max_vq_8);
57
- qtest_add_data_func("/arm/max/query-cpu-model-expansion/sve-off",
58
- NULL, sve_tests_sve_off);
59
qtest_add_data_func("/arm/kvm/query-cpu-model-expansion/sve-off",
60
NULL, sve_tests_sve_off_kvm);
61
}
62
63
+ if (qtest_has_accel("tcg")) {
64
+ qtest_add_data_func("/arm/max/query-cpu-model-expansion/sve-max-vq-8",
65
+ NULL, sve_tests_sve_max_vq_8);
66
+ qtest_add_data_func("/arm/max/query-cpu-model-expansion/sve-off",
67
+ NULL, sve_tests_sve_off);
68
+ }
69
+
70
+out:
71
return g_test_run();
122
}
72
}
123
--
73
--
124
2.25.1
74
2.34.1
diff view generated by jsdifflib
1
From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Describe that the gic-version influences the maximum number of CPUs.
3
These tests set -accel tcg, so restrict them to when TCG is present.
4
4
5
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
5
Signed-off-by: Fabiano Rosas <farosas@suse.de>
6
Message-id: 20220413231456.35811-1-heinrich.schuchardt@canonical.com
6
Acked-by: Richard Henderson <richard.henderson@linaro.org>
7
[PMM: minor punctuation tweaks]
7
Reviewed-by: Thomas Huth <thuth@redhat.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
docs/system/arm/virt.rst | 4 ++--
10
tests/qtest/meson.build | 4 ++--
12
1 file changed, 2 insertions(+), 2 deletions(-)
11
1 file changed, 2 insertions(+), 2 deletions(-)
13
12
14
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
13
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/system/arm/virt.rst
15
--- a/tests/qtest/meson.build
17
+++ b/docs/system/arm/virt.rst
16
+++ b/tests/qtest/meson.build
18
@@ -XXX,XX +XXX,XX @@ gic-version
17
@@ -XXX,XX +XXX,XX @@ qtests_arm = \
19
Valid values are:
18
# TODO: once aarch64 TCG is fixed on ARM 32 bit host, make bios-tables-test unconditional
20
19
qtests_aarch64 = \
21
``2``
20
(cpu != 'arm' and unpack_edk2_blobs ? ['bios-tables-test'] : []) + \
22
- GICv2
21
- (config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-test'] : []) + \
23
+ GICv2. Note that this limits the number of CPUs to 8.
22
- (config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-swtpm-test'] : []) + \
24
``3``
23
+ (config_all.has_key('CONFIG_TCG') and config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? \
25
- GICv3
24
+ ['tpm-tis-device-test', 'tpm-tis-device-swtpm-test'] : []) + \
26
+ GICv3. This allows up to 512 CPUs.
25
(config_all_devices.has_key('CONFIG_XLNX_ZYNQMP_ARM') ? ['xlnx-can-test', 'fuzz-xlnx-dp-test'] : []) + \
27
``host``
26
(config_all_devices.has_key('CONFIG_RASPI') ? ['bcm2835-dma-test'] : []) + \
28
Use the same GIC version the host provides, when using KVM
27
['arm-cpu-features',
29
``max``
30
--
28
--
31
2.25.1
29
2.34.1
diff view generated by jsdifflib