1
target-arm queue: aspeed patches from Cédric, and
1
First arm pullreq for 7.1. The bulk of this is the qemu_split_irq
2
cleanup and sd card patches from Philippe.
2
removal.
3
4
I have enough stuff in my to-review queue that I expect to do another
5
pullreq early next week, but 31 patches is enough to not hang on to.
3
6
4
thanks
7
thanks
5
-- PMM
8
-- PMM
6
9
7
The following changes since commit bac5ba3dc5da706f52c149fa6c0bd1dc96899bec:
10
The following changes since commit 9c125d17e9402c232c46610802e5931b3639d77b:
8
11
9
Merge remote-tracking branch 'remotes/thibault/tags/samuel-thibault' into staging (2018-06-08 10:26:16 +0100)
12
Merge tag 'pull-tcg-20220420' of https://gitlab.com/rth7680/qemu into staging (2022-04-20 16:43:11 -0700)
10
13
11
are available in the Git repository at:
14
are available in the Git repository at:
12
15
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180608
16
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220421
14
17
15
for you to fetch changes up to 113f31c06c6bf16451892b2459d83c9b9c5e9844:
18
for you to fetch changes up to 5b415dd61bdbf61fb4be0e9f1a7172b8bce682c6:
16
19
17
sdcard: Disable CMD19/CMD23 for Spec v2 (2018-06-08 13:15:34 +0100)
20
hw/arm: Use bit fields for NPCM7XX PWRON STRAPs (2022-04-21 11:37:05 +0100)
18
21
19
----------------------------------------------------------------
22
----------------------------------------------------------------
20
target-arm queue:
23
target-arm queue:
21
* arm_gicv3_kvm: fix migration of registers corresponding to
24
* hw/arm/virt: Check for attempt to use TrustZone with KVM or HVF
22
IRQs 992 to 1020 in the KVM GIC
25
* versal: Add the Cortex-R5s in the Real-Time Processing Unit (RPU) subsystem
23
* aspeed: remove ignore_memory_transaction_failures on all boards
26
* versal: model enough of the Clock/Reset Low-power domain (CRL) to allow control of the Cortex-R5s
24
* aspeed: add support for the witherspoon-bmc board
27
* xlnx-zynqmp: Connect 4 TTC timers
25
* aspeed: add an I2C RTC device and EEPROM I2C devices
28
* exynos4210: Refactor GIC/combiner code to stop using qemu_split_irq
26
* aspeed: add the pc9552 chips to the witherspoon machine
29
* realview: replace 'qemu_split_irq' with 'TYPE_SPLIT_IRQ'
27
* ftgmac100: fix various bugs
30
* stellaris: replace 'qemu_split_irq' with 'TYPE_SPLIT_IRQ'
28
* hw/arm: Remove the deprecated xlnx-ep108 machine
31
* hw/core/irq: remove unused 'qemu_irq_split' function
29
* hw/i2c: Add trace events
32
* npcm7xx: use symbolic constants for PWRON STRAP bit fields
30
* add missing '\n' on various qemu_log() logging strings
33
* virt: document impact of gic-version on max CPUs
31
* sdcard: clean up spec version support so we report the
32
right spec version to the guest and only implement the
33
commands that are supposed to be present in that version
34
34
35
----------------------------------------------------------------
35
----------------------------------------------------------------
36
Cédric Le Goater (11):
36
Edgar E. Iglesias (6):
37
aspeed: remove ignore_memory_transaction_failures on all boards
37
timer: cadence_ttc: Break out header file to allow embedding
38
aspeed: add support for the witherspoon-bmc board
38
hw/arm/xlnx-zynqmp: Connect 4 TTC timers
39
aspeed: add an I2C RTC device to all machines
39
hw/arm: versal: Create an APU CPU Cluster
40
smbus: add a smbus_eeprom_init_one() routine
40
hw/arm: versal: Add the Cortex-R5Fs
41
aspeed: Add EEPROM I2C devices
41
hw/misc: Add a model of the Xilinx Versal CRL
42
misc: add pca9552 LED blinker model
42
hw/arm: versal: Connect the CRL
43
aspeed: add the pc9552 chips to the witherspoon machine
44
ftgmac100: compute maximum frame size depending on the protocol
45
ftgmac100: add IEEE 802.1Q VLAN support
46
ftgmac100: fix multicast hash routine
47
ftgmac100: remove check on runt messages
48
43
49
Philippe Mathieu-Daudé (18):
44
Hao Wu (2):
50
hw/i2c: Add trace events
45
hw/misc: Add PWRON STRAP bit fields in GCR module
51
hw/sd/milkymist-memcard: Add trailing '\n' to qemu_log() call
46
hw/arm: Use bit fields for NPCM7XX PWRON STRAPs
52
hw/digic: Add trailing '\n' to qemu_log() calls
53
xilinx-dp: Add trailing '\n' to qemu_log() call
54
ppc/pnv: Add trailing '\n' to qemu_log() calls
55
hw/core/register: Add trailing '\n' to qemu_log() call
56
hw/mips/boston: Add trailing '\n' to qemu_log() calls
57
stellaris: Add trailing '\n' to qemu_log() calls
58
target/arm: Add trailing '\n' to qemu_log() calls
59
target/m68k: Add trailing '\n' to qemu_log() call
60
RISC-V: Add trailing '\n' to qemu_log() calls
61
target/xtensa: Add trailing '\n' to qemu_log() calls
62
sdcard: Update the Configuration Register (SCR) to Spec Version 1.10
63
sdcard: Allow commands valid in SPI mode
64
sdcard: Add a 'spec_version' property, default to Spec v2.00
65
sdcard: Disable SEND_IF_COND (CMD8) for Spec v1
66
sdcard: Reflect when the Spec v3 is supported in the Config Register (SCR)
67
sdcard: Disable CMD19/CMD23 for Spec v2
68
47
69
Shannon Zhao (1):
48
Heinrich Schuchardt (1):
70
arm_gicv3_kvm: kvm_dist_get/put: skip the registers banked by GICR
49
hw/arm/virt: impact of gic-version on max CPUs
71
50
72
Thomas Huth (1):
51
Peter Maydell (19):
73
hw/arm: Remove the deprecated xlnx-ep108 machine
52
hw/arm/virt: Check for attempt to use TrustZone with KVM or HVF
53
hw/arm/exynos4210: Use TYPE_OR_IRQ instead of custom OR-gate device
54
hw/intc/exynos4210_gic: Remove unused TYPE_EXYNOS4210_IRQ_GATE
55
hw/arm/exynos4210: Put a9mpcore device into state struct
56
hw/arm/exynos4210: Drop int_gic_irq[] from Exynos4210Irq struct
57
hw/arm/exynos4210: Coalesce board_irqs and irq_table
58
hw/arm/exynos4210: Fix code style nit in combiner_grp_to_gic_id[]
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
74
71
75
Makefile.objs | 1 +
72
Zongyuan Li (3):
76
hw/misc/Makefile.objs | 1 +
73
hw/arm/realview: replace 'qemu_split_irq' with 'TYPE_SPLIT_IRQ'
77
tests/Makefile.include | 2 +
74
hw/arm/stellaris: replace 'qemu_split_irq' with 'TYPE_SPLIT_IRQ'
78
include/hw/i2c/smbus.h | 1 +
75
hw/core/irq: remove unused 'qemu_irq_split' function
79
include/hw/intc/arm_gicv3_common.h | 1 +
80
include/hw/misc/pca9552.h | 32 +++++
81
include/hw/misc/pca9552_regs.h | 32 +++++
82
include/hw/net/ftgmac100.h | 7 +-
83
include/hw/sd/sd.h | 6 +
84
tests/libqos/i2c.h | 2 +
85
hw/arm/aspeed.c | 88 +++++++++++++-
86
hw/arm/stellaris.c | 11 +-
87
hw/arm/xlnx-zcu102.c | 62 +---------
88
hw/char/digic-uart.c | 4 +-
89
hw/core/register.c | 2 +-
90
hw/display/xlnx_dp.c | 4 +-
91
hw/i2c/core.c | 25 ++--
92
hw/i2c/smbus_eeprom.c | 16 ++-
93
hw/intc/arm_gicv3_common.c | 79 ++++++++++++
94
hw/intc/arm_gicv3_kvm.c | 38 ++++++
95
hw/mips/boston.c | 8 +-
96
hw/misc/pca9552.c | 240 +++++++++++++++++++++++++++++++++++++
97
hw/net/ftgmac100.c | 64 ++++++----
98
hw/ppc/pnv_core.c | 4 +-
99
hw/sd/milkymist-memcard.c | 2 +-
100
hw/sd/sd.c | 50 +++++---
101
hw/timer/digic-timer.c | 4 +-
102
target/arm/helper.c | 4 +-
103
target/m68k/translate.c | 2 +-
104
target/riscv/op_helper.c | 6 +-
105
target/xtensa/translate.c | 6 +-
106
tests/pca9552-test.c | 116 ++++++++++++++++++
107
tests/tmp105-test.c | 2 -
108
default-configs/arm-softmmu.mak | 1 +
109
hw/i2c/trace-events | 7 ++
110
qemu-doc.texi | 5 -
111
36 files changed, 788 insertions(+), 147 deletions(-)
112
create mode 100644 include/hw/misc/pca9552.h
113
create mode 100644 include/hw/misc/pca9552_regs.h
114
create mode 100644 hw/misc/pca9552.c
115
create mode 100644 tests/pca9552-test.c
116
create mode 100644 hw/i2c/trace-events
117
76
77
docs/system/arm/virt.rst | 4 +-
78
include/hw/arm/exynos4210.h | 50 ++--
79
include/hw/arm/xlnx-versal.h | 16 ++
80
include/hw/arm/xlnx-zynqmp.h | 4 +
81
include/hw/intc/exynos4210_combiner.h | 57 +++++
82
include/hw/intc/exynos4210_gic.h | 43 ++++
83
include/hw/irq.h | 5 -
84
include/hw/misc/npcm7xx_gcr.h | 30 +++
85
include/hw/misc/xlnx-versal-crl.h | 235 +++++++++++++++++++
86
include/hw/timer/cadence_ttc.h | 54 +++++
87
hw/arm/exynos4210.c | 430 ++++++++++++++++++++++++++++++----
88
hw/arm/npcm7xx_boards.c | 24 +-
89
hw/arm/realview.c | 33 ++-
90
hw/arm/stellaris.c | 15 +-
91
hw/arm/virt.c | 7 +
92
hw/arm/xlnx-versal-virt.c | 6 +-
93
hw/arm/xlnx-versal.c | 99 +++++++-
94
hw/arm/xlnx-zynqmp.c | 22 ++
95
hw/core/irq.c | 15 --
96
hw/intc/exynos4210_combiner.c | 108 +--------
97
hw/intc/exynos4210_gic.c | 344 +--------------------------
98
hw/misc/xlnx-versal-crl.c | 421 +++++++++++++++++++++++++++++++++
99
hw/timer/cadence_ttc.c | 32 +--
100
MAINTAINERS | 2 +-
101
hw/misc/meson.build | 1 +
102
25 files changed, 1457 insertions(+), 600 deletions(-)
103
create mode 100644 include/hw/intc/exynos4210_combiner.h
104
create mode 100644 include/hw/intc/exynos4210_gic.h
105
create mode 100644 include/hw/misc/xlnx-versal-crl.h
106
create mode 100644 include/hw/timer/cadence_ttc.h
107
create mode 100644 hw/misc/xlnx-versal-crl.c
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
It's not possible to provide the guest with the Security extensions
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:
2
6
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
$ qemu-system-aarch64 -enable-kvm -machine virt,secure=on -cpu host -display none
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Unexpected error in object_property_find_err() at ../../qom/object.c:1304:
5
Message-id: 20180606152128.449-6-f4bug@amsat.org
9
qemu-system-aarch64: Property 'host-arm-cpu.secure-memory' not found
10
Aborted
11
12
Check for this combination of options and report an error, in the
13
same way we already do for attempts to give a KVM or HVF guest the
14
Virtualization or MTE extensions. Now we will report:
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
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
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
7
---
22
---
8
hw/core/register.c | 2 +-
23
hw/arm/virt.c | 7 +++++++
9
1 file changed, 1 insertion(+), 1 deletion(-)
24
1 file changed, 7 insertions(+)
10
25
11
diff --git a/hw/core/register.c b/hw/core/register.c
26
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
12
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/core/register.c
28
--- a/hw/arm/virt.c
14
+++ b/hw/core/register.c
29
+++ b/hw/arm/virt.c
15
@@ -XXX,XX +XXX,XX @@ void register_write(RegisterInfo *reg, uint64_t val, uint64_t we,
30
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
16
if (test) {
31
exit(1);
17
qemu_log_mask(LOG_UNIMP,
18
"%s:%s writing %#" PRIx64 " to unimplemented bits:" \
19
- " %#" PRIx64 "",
20
+ " %#" PRIx64 "\n",
21
prefix, reg->access->name, val, ac->unimp);
22
}
32
}
23
33
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())) {
42
error_report("mach-virt: %s does not support providing "
43
"Virtualization extensions to the guest CPU",
24
--
44
--
25
2.17.1
45
2.25.1
26
27
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Break out header file to allow embedding of the the TTC.
4
Message-id: 20180606191801.6331-1-f4bug@amsat.org
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
9
Message-id: 20220331222017.2914409-2-edgar.iglesias@gmail.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
Makefile.objs | 1 +
12
include/hw/timer/cadence_ttc.h | 54 ++++++++++++++++++++++++++++++++++
9
hw/i2c/core.c | 25 ++++++++++++++++++-------
13
hw/timer/cadence_ttc.c | 32 ++------------------
10
hw/i2c/trace-events | 7 +++++++
14
2 files changed, 56 insertions(+), 30 deletions(-)
11
3 files changed, 26 insertions(+), 7 deletions(-)
15
create mode 100644 include/hw/timer/cadence_ttc.h
12
create mode 100644 hw/i2c/trace-events
13
16
14
diff --git a/Makefile.objs b/Makefile.objs
17
diff --git a/include/hw/timer/cadence_ttc.h b/include/hw/timer/cadence_ttc.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/Makefile.objs
17
+++ b/Makefile.objs
18
@@ -XXX,XX +XXX,XX @@ trace-events-subdirs += hw/char
19
trace-events-subdirs += hw/display
20
trace-events-subdirs += hw/dma
21
trace-events-subdirs += hw/hppa
22
+trace-events-subdirs += hw/i2c
23
trace-events-subdirs += hw/i386
24
trace-events-subdirs += hw/i386/xen
25
trace-events-subdirs += hw/ide
26
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/i2c/core.c
29
+++ b/hw/i2c/core.c
30
@@ -XXX,XX +XXX,XX @@
31
32
#include "qemu/osdep.h"
33
#include "hw/i2c/i2c.h"
34
+#include "trace.h"
35
36
#define I2C_BROADCAST 0x00
37
38
@@ -XXX,XX +XXX,XX @@ int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv)
39
}
40
41
QLIST_FOREACH(node, &bus->current_devs, next) {
42
+ I2CSlave *s = node->elt;
43
int rv;
44
45
- sc = I2C_SLAVE_GET_CLASS(node->elt);
46
+ sc = I2C_SLAVE_GET_CLASS(s);
47
/* If the bus is already busy, assume this is a repeated
48
start condition. */
49
50
if (sc->event) {
51
- rv = sc->event(node->elt, recv ? I2C_START_RECV : I2C_START_SEND);
52
+ trace_i2c_event("start", s->address);
53
+ rv = sc->event(s, recv ? I2C_START_RECV : I2C_START_SEND);
54
if (rv && !bus->broadcast) {
55
if (bus_scanned) {
56
/* First call, terminate the transfer. */
57
@@ -XXX,XX +XXX,XX @@ void i2c_end_transfer(I2CBus *bus)
58
I2CNode *node, *next;
59
60
QLIST_FOREACH_SAFE(node, &bus->current_devs, next, next) {
61
- sc = I2C_SLAVE_GET_CLASS(node->elt);
62
+ I2CSlave *s = node->elt;
63
+ sc = I2C_SLAVE_GET_CLASS(s);
64
if (sc->event) {
65
- sc->event(node->elt, I2C_FINISH);
66
+ trace_i2c_event("finish", s->address);
67
+ sc->event(s, I2C_FINISH);
68
}
69
QLIST_REMOVE(node, next);
70
g_free(node);
71
@@ -XXX,XX +XXX,XX @@ void i2c_end_transfer(I2CBus *bus)
72
int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send)
73
{
74
I2CSlaveClass *sc;
75
+ I2CSlave *s;
76
I2CNode *node;
77
int ret = 0;
78
79
if (send) {
80
QLIST_FOREACH(node, &bus->current_devs, next) {
81
- sc = I2C_SLAVE_GET_CLASS(node->elt);
82
+ s = node->elt;
83
+ sc = I2C_SLAVE_GET_CLASS(s);
84
if (sc->send) {
85
- ret = ret || sc->send(node->elt, *data);
86
+ trace_i2c_send(s->address, *data);
87
+ ret = ret || sc->send(s, *data);
88
} else {
89
ret = -1;
90
}
91
@@ -XXX,XX +XXX,XX @@ int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send)
92
93
sc = I2C_SLAVE_GET_CLASS(QLIST_FIRST(&bus->current_devs)->elt);
94
if (sc->recv) {
95
- ret = sc->recv(QLIST_FIRST(&bus->current_devs)->elt);
96
+ s = QLIST_FIRST(&bus->current_devs)->elt;
97
+ ret = sc->recv(s);
98
+ trace_i2c_recv(s->address, ret);
99
if (ret < 0) {
100
return ret;
101
} else {
102
@@ -XXX,XX +XXX,XX @@ void i2c_nack(I2CBus *bus)
103
QLIST_FOREACH(node, &bus->current_devs, next) {
104
sc = I2C_SLAVE_GET_CLASS(node->elt);
105
if (sc->event) {
106
+ trace_i2c_event("nack", node->elt->address);
107
sc->event(node->elt, I2C_NACK);
108
}
109
}
110
diff --git a/hw/i2c/trace-events b/hw/i2c/trace-events
111
new file mode 100644
18
new file mode 100644
112
index XXXXXXX..XXXXXXX
19
index XXXXXXX..XXXXXXX
113
--- /dev/null
20
--- /dev/null
114
+++ b/hw/i2c/trace-events
21
+++ b/include/hw/timer/cadence_ttc.h
115
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
116
+# See docs/devel/tracing.txt for syntax documentation.
23
+/*
24
+ * Xilinx Zynq cadence TTC model
25
+ *
26
+ * Copyright (c) 2011 Xilinx Inc.
27
+ * Copyright (c) 2012 Peter A.G. Crosthwaite (peter.crosthwaite@petalogix.com)
28
+ * Copyright (c) 2012 PetaLogix Pty Ltd.
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
117
+
42
+
118
+# hw/i2c/core.c
43
+#include "hw/sysbus.h"
44
+#include "qemu/timer.h"
119
+
45
+
120
+i2c_event(const char *event, uint8_t address) "%s(addr:0x%02x)"
46
+typedef struct {
121
+i2c_send(uint8_t address, uint8_t data) "send(addr:0x%02x) data:0x%02x"
47
+ QEMUTimer *timer;
122
+i2c_recv(uint8_t address, uint8_t data) "recv(addr:0x%02x) data:0x%02x"
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
77
diff --git a/hw/timer/cadence_ttc.c b/hw/timer/cadence_ttc.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/timer/cadence_ttc.c
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));
123
--
127
--
124
2.17.1
128
2.25.1
125
126
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
2
2
3
The AST2500 EVB does not have an RTC but we can pretend that one is
3
Connect the 4 TTC timers on the ZynqMP.
4
plugged on the I2C bus header.
5
4
6
The romulus and witherspoon boards expects an Epson RX8900 I2C RTC but
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
7
a ds1338 is good enough for the basic features we need.
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
10
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
9
Message-id: 20220331222017.2914409-3-edgar.iglesias@gmail.com
11
Message-id: 20180530064049.27976-4-clg@kaod.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
11
---
14
hw/arm/aspeed.c | 19 +++++++++++++++++++
12
include/hw/arm/xlnx-zynqmp.h | 4 ++++
15
1 file changed, 19 insertions(+)
13
hw/arm/xlnx-zynqmp.c | 22 ++++++++++++++++++++++
14
2 files changed, 26 insertions(+)
16
15
17
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
16
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
18
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/aspeed.c
18
--- a/include/hw/arm/xlnx-zynqmp.h
20
+++ b/hw/arm/aspeed.c
19
+++ b/include/hw/arm/xlnx-zynqmp.h
21
@@ -XXX,XX +XXX,XX @@ enum {
20
@@ -XXX,XX +XXX,XX @@
22
21
#include "hw/or-irq.h"
23
static void palmetto_bmc_i2c_init(AspeedBoardState *bmc);
22
#include "hw/misc/xlnx-zynqmp-apu-ctrl.h"
24
static void ast2500_evb_i2c_init(AspeedBoardState *bmc);
23
#include "hw/misc/xlnx-zynqmp-crf.h"
25
+static void romulus_bmc_i2c_init(AspeedBoardState *bmc);
24
+#include "hw/timer/cadence_ttc.h"
26
static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc);
25
27
26
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
28
static const AspeedBoardConfig aspeed_boards[] = {
27
OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
29
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
28
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
30
.fmc_model = "n25q256a",
29
#define XLNX_ZYNQMP_MAX_RAM_SIZE (XLNX_ZYNQMP_MAX_LOW_RAM_SIZE + \
31
.spi_model = "mx66l1g45g",
30
XLNX_ZYNQMP_MAX_HIGH_RAM_SIZE)
32
.num_cs = 2,
31
33
+ .i2c_init = romulus_bmc_i2c_init,
32
+#define XLNX_ZYNQMP_NUM_TTC 4
34
},
35
[WITHERSPOON_BMC] = {
36
.soc_name = "ast2500-a1",
37
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
38
39
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
40
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 7), "tmp105", 0x4d);
41
+
33
+
42
+ /* The AST2500 EVB does not have an RTC. Let's pretend that one is
34
/*
43
+ * plugged on the I2C bus header */
35
* Unimplemented mmio regions needed to boot some images.
44
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
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]);
45
}
61
}
46
62
47
static void ast2500_evb_init(MachineState *machine)
63
+static void xlnx_zynqmp_create_ttc(XlnxZynqMPState *s, qemu_irq *gic)
48
@@ -XXX,XX +XXX,XX @@ static const TypeInfo ast2500_evb_type = {
49
.class_init = ast2500_evb_class_init,
50
};
51
52
+static void romulus_bmc_i2c_init(AspeedBoardState *bmc)
53
+{
64
+{
54
+ AspeedSoCState *soc = &bmc->soc;
65
+ SysBusDevice *sbd;
66
+ int i, irq;
55
+
67
+
56
+ /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
68
+ for (i = 0; i < XLNX_ZYNQMP_NUM_TTC; i++) {
57
+ * good enough */
69
+ object_initialize_child(OBJECT(s), "ttc[*]", &s->ttc[i],
58
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
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
+ }
59
+}
79
+}
60
+
80
+
61
static void romulus_bmc_init(MachineState *machine)
81
static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
62
{
82
{
63
aspeed_board_init(machine, &aspeed_boards[ROMULUS_BMC]);
83
static const struct UnimpInfo {
64
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
84
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
65
85
xlnx_zynqmp_create_efuse(s, gic_spi);
66
/* The Witherspoon expects a TMP275 but a TMP105 is compatible */
86
xlnx_zynqmp_create_apu_ctrl(s, gic_spi);
67
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 9), "tmp105", 0x4a);
87
xlnx_zynqmp_create_crf(s, gic_spi);
68
+
88
+ xlnx_zynqmp_create_ttc(s, gic_spi);
69
+ /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
89
xlnx_zynqmp_create_unimp_mmio(s);
70
+ * good enough */
90
71
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
91
for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA_CH; i++) {
72
}
73
74
static void witherspoon_bmc_init(MachineState *machine)
75
--
92
--
76
2.17.1
93
2.25.1
77
78
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
2
2
3
As of this commit, the Spec v1 is not working, and all controllers
3
Create an APU CPU Cluster. This is in preparation to add the RPU.
4
expect the cards to be conformant to Spec v2.
5
4
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
8
Message-id: 20180607180641.874-4-f4bug@amsat.org
7
Message-id: 20220406174303.2022038-2-edgar.iglesias@xilinx.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
include/hw/sd/sd.h | 5 +++++
10
include/hw/arm/xlnx-versal.h | 2 ++
12
hw/sd/sd.c | 23 ++++++++++++++++++++---
11
hw/arm/xlnx-versal.c | 9 ++++++++-
13
2 files changed, 25 insertions(+), 3 deletions(-)
12
2 files changed, 10 insertions(+), 1 deletion(-)
14
13
15
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
14
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/sd/sd.h
16
--- a/include/hw/arm/xlnx-versal.h
18
+++ b/include/hw/sd/sd.h
17
+++ b/include/hw/arm/xlnx-versal.h
19
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
20
#define APP_CMD            (1 << 5)
19
21
#define AKE_SEQ_ERROR        (1 << 3)
20
#include "hw/sysbus.h"
22
21
#include "hw/arm/boot.h"
23
+enum SDPhySpecificationVersion {
22
+#include "hw/cpu/cluster.h"
24
+ SD_PHY_SPECv1_10_VERS = 1,
23
#include "hw/or-irq.h"
25
+ SD_PHY_SPECv2_00_VERS = 2,
24
#include "hw/sd/sdhci.h"
26
+};
25
#include "hw/intc/arm_gicv3.h"
26
@@ -XXX,XX +XXX,XX @@ struct Versal {
27
struct {
28
struct {
29
MemoryRegion mr;
30
+ CPUClusterState cluster;
31
ARMCPU cpu[XLNX_VERSAL_NR_ACPUS];
32
GICv3State gic;
33
} apu;
34
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/arm/xlnx-versal.c
37
+++ b/hw/arm/xlnx-versal.c
38
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
39
{
40
int i;
41
42
+ object_initialize_child(OBJECT(s), "apu-cluster", &s->fpd.apu.cluster,
43
+ TYPE_CPU_CLUSTER);
44
+ qdev_prop_set_uint32(DEVICE(&s->fpd.apu.cluster), "cluster-id", 0);
27
+
45
+
28
typedef enum {
46
for (i = 0; i < ARRAY_SIZE(s->fpd.apu.cpu); i++) {
29
SD_VOLTAGE_0_4V = 400, /* currently not supported */
47
Object *obj;
30
SD_VOLTAGE_1_8V = 1800,
48
31
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
49
- object_initialize_child(OBJECT(s), "apu-cpu[*]", &s->fpd.apu.cpu[i],
32
index XXXXXXX..XXXXXXX 100644
50
+ object_initialize_child(OBJECT(&s->fpd.apu.cluster),
33
--- a/hw/sd/sd.c
51
+ "apu-cpu[*]", &s->fpd.apu.cpu[i],
34
+++ b/hw/sd/sd.c
52
XLNX_VERSAL_ACPU_TYPE);
35
@@ -XXX,XX +XXX,XX @@
53
obj = OBJECT(&s->fpd.apu.cpu[i]);
36
/*
54
if (i) {
37
* SD Memory Card emulation as defined in the "SD Memory Card Physical
55
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
38
- * layer specification, Version 1.10."
56
&error_abort);
39
+ * layer specification, Version 2.00."
57
qdev_realize(DEVICE(obj), NULL, &error_fatal);
40
*
58
}
41
* Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
42
* Copyright (c) 2007 CodeSourcery
43
+ * Copyright (c) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
44
*
45
* Redistribution and use in source and binary forms, with or without
46
* modification, are permitted provided that the following conditions
47
@@ -XXX,XX +XXX,XX @@ struct SDState {
48
uint8_t sd_status[64];
49
50
/* Configurable properties */
51
+ uint8_t spec_version;
52
BlockBackend *blk;
53
bool spi;
54
55
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
56
57
static void sd_set_scr(SDState *sd)
58
{
59
- sd->scr[0] = (0 << 4) /* SCR structure version 1.0 */
60
- | 1; /* Spec Version 1.10 */
61
+ sd->scr[0] = 0 << 4; /* SCR structure version 1.0 */
62
+ if (sd->spec_version == SD_PHY_SPECv1_10_VERS) {
63
+ sd->scr[0] |= 1; /* Spec Version 1.10 */
64
+ } else {
65
+ sd->scr[0] |= 2; /* Spec Version 2.00 */
66
+ }
67
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
68
| 0b0101; /* 1-bit or 4-bit width bus modes */
69
sd->scr[2] = 0x00; /* Extended Security is not supported. */
70
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
71
72
sd->proto_name = sd->spi ? "SPI" : "SD";
73
74
+ switch (sd->spec_version) {
75
+ case SD_PHY_SPECv1_10_VERS
76
+ ... SD_PHY_SPECv2_00_VERS:
77
+ break;
78
+ default:
79
+ error_setg(errp, "Invalid SD card Spec version: %u", sd->spec_version);
80
+ return;
81
+ }
82
+
59
+
83
if (sd->blk && blk_is_read_only(sd->blk)) {
60
+ qdev_realize(DEVICE(&s->fpd.apu.cluster), NULL, &error_fatal);
84
error_setg(errp, "Cannot use read-only drive as SD card");
85
return;
86
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
87
}
61
}
88
62
89
static Property sd_properties[] = {
63
static void versal_create_apu_gic(Versal *s, qemu_irq *pic)
90
+ DEFINE_PROP_UINT8("spec_version", SDState,
91
+ spec_version, SD_PHY_SPECv2_00_VERS),
92
DEFINE_PROP_DRIVE("drive", SDState, blk),
93
/* We do not model the chip select pin, so allow the board to select
94
* whether card should be in SSI or MMC/SD mode. It is also up to the
95
--
64
--
96
2.17.1
65
2.25.1
97
98
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
2
2
3
The maximum frame size includes the CRC and depends if a VLAN tag is
3
Add the Cortex-R5Fs of the Versal RPU (Real-time Processing Unit)
4
inserted or not. Adjust the frame size limit in the transmit handler
4
subsystem.
5
using on the FTGMAC100State buffer size and in the receive handler use
6
the packet protocol.
7
5
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
10
Message-id: 20180530061711.23673-2-clg@kaod.org
8
Message-id: 20220406174303.2022038-3-edgar.iglesias@xilinx.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
10
---
13
include/hw/net/ftgmac100.h | 7 ++++++-
11
include/hw/arm/xlnx-versal.h | 10 ++++++++++
14
hw/net/ftgmac100.c | 23 ++++++++++++-----------
12
hw/arm/xlnx-versal-virt.c | 6 +++---
15
2 files changed, 18 insertions(+), 12 deletions(-)
13
hw/arm/xlnx-versal.c | 36 ++++++++++++++++++++++++++++++++++++
14
3 files changed, 49 insertions(+), 3 deletions(-)
16
15
17
diff --git a/include/hw/net/ftgmac100.h b/include/hw/net/ftgmac100.h
16
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
18
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/net/ftgmac100.h
18
--- a/include/hw/arm/xlnx-versal.h
20
+++ b/include/hw/net/ftgmac100.h
19
+++ b/include/hw/arm/xlnx-versal.h
20
@@ -XXX,XX +XXX,XX @@
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
21
@@ -XXX,XX +XXX,XX @@
65
@@ -XXX,XX +XXX,XX @@
22
#include "hw/sysbus.h"
66
#include "hw/sysbus.h"
23
#include "net/net.h"
67
24
68
#define XLNX_VERSAL_ACPU_TYPE ARM_CPU_TYPE_NAME("cortex-a72")
25
+/*
69
+#define XLNX_VERSAL_RCPU_TYPE ARM_CPU_TYPE_NAME("cortex-r5f")
26
+ * Max frame size for the receiving buffer
70
#define GEM_REVISION 0x40070106
27
+ */
71
28
+#define FTGMAC100_MAX_FRAME_SIZE 9220
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
}
75
}
76
77
+static void versal_create_rpu_cpus(Versal *s)
78
+{
79
+ int i;
29
+
80
+
30
typedef struct FTGMAC100State {
81
+ object_initialize_child(OBJECT(s), "rpu-cluster", &s->lpd.rpu.cluster,
31
/*< private >*/
82
+ TYPE_CPU_CLUSTER);
32
SysBusDevice parent_obj;
83
+ qdev_prop_set_uint32(DEVICE(&s->lpd.rpu.cluster), "cluster-id", 1);
33
@@ -XXX,XX +XXX,XX @@ typedef struct FTGMAC100State {
84
+
34
qemu_irq irq;
85
+ for (i = 0; i < ARRAY_SIZE(s->lpd.rpu.cpu); i++) {
35
MemoryRegion iomem;
86
+ Object *obj;
36
87
+
37
- uint8_t *frame;
88
+ object_initialize_child(OBJECT(&s->lpd.rpu.cluster),
38
+ uint8_t frame[FTGMAC100_MAX_FRAME_SIZE];
89
+ "rpu-cpu[*]", &s->lpd.rpu.cpu[i],
39
90
+ XLNX_VERSAL_RCPU_TYPE);
40
uint32_t irq_state;
91
+ obj = OBJECT(&s->lpd.rpu.cpu[i]);
41
uint32_t isr;
92
+ object_property_set_bool(obj, "start-powered-off", true,
42
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
93
+ &error_abort);
43
index XXXXXXX..XXXXXXX 100644
94
+
44
--- a/hw/net/ftgmac100.c
95
+ object_property_set_int(obj, "mp-affinity", 0x100 | i, &error_abort);
45
+++ b/hw/net/ftgmac100.c
96
+ object_property_set_int(obj, "core-count", ARRAY_SIZE(s->lpd.rpu.cpu),
46
@@ -XXX,XX +XXX,XX @@ typedef struct {
97
+ &error_abort);
47
/*
98
+ object_property_set_link(obj, "memory", OBJECT(&s->lpd.rpu.mr),
48
* Max frame size for the receiving buffer
99
+ &error_abort);
49
*/
100
+ qdev_realize(DEVICE(obj), NULL, &error_fatal);
50
-#define FTGMAC100_MAX_FRAME_SIZE 10240
101
+ }
51
+#define FTGMAC100_MAX_FRAME_SIZE 9220
102
+
52
103
+ qdev_realize(DEVICE(&s->lpd.rpu.cluster), NULL, &error_fatal);
53
/* Limits depending on the type of the frame
104
+}
54
*
105
+
55
* 9216 for Jumbo frames (+ 4 for VLAN)
106
static void versal_create_uarts(Versal *s, qemu_irq *pic)
56
* 1518 for other frames (+ 4 for VLAN)
57
*/
58
-static int ftgmac100_max_frame_size(FTGMAC100State *s)
59
+static int ftgmac100_max_frame_size(FTGMAC100State *s, uint16_t proto)
60
{
107
{
61
- return (s->maccr & FTGMAC100_MACCR_JUMBO_LF ? 9216 : 1518) + 4;
108
int i;
62
+ int max = (s->maccr & FTGMAC100_MACCR_JUMBO_LF ? 9216 : 1518);
109
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
63
+
110
64
+ return max + (proto == ETH_P_VLAN ? 4 : 0);
111
versal_create_apu_cpus(s);
112
versal_create_apu_gic(s, pic);
113
+ versal_create_rpu_cpus(s);
114
versal_create_uarts(s, pic);
115
versal_create_usbs(s, pic);
116
versal_create_gems(s, pic);
117
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
118
119
memory_region_add_subregion_overlap(&s->mr_ps, MM_OCM, &s->lpd.mr_ocm, 0);
120
memory_region_add_subregion_overlap(&s->fpd.apu.mr, 0, &s->mr_ps, 0);
121
+ memory_region_add_subregion_overlap(&s->lpd.rpu.mr, 0,
122
+ &s->lpd.rpu.mr_ps_alias, 0);
65
}
123
}
66
124
67
static void ftgmac100_update_irq(FTGMAC100State *s)
125
static void versal_init(Object *obj)
68
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
126
@@ -XXX,XX +XXX,XX @@ static void versal_init(Object *obj)
69
uint8_t *ptr = s->frame;
127
Versal *s = XLNX_VERSAL(obj);
70
uint32_t addr = tx_descriptor;
128
71
uint32_t flags = 0;
129
memory_region_init(&s->fpd.apu.mr, obj, "mr-apu", UINT64_MAX);
72
- int max_frame_size = ftgmac100_max_frame_size(s);
130
+ memory_region_init(&s->lpd.rpu.mr, obj, "mr-rpu", UINT64_MAX);
73
131
memory_region_init(&s->mr_ps, obj, "mr-ps-switch", UINT64_MAX);
74
while (1) {
132
+ memory_region_init_alias(&s->lpd.rpu.mr_ps_alias, OBJECT(s),
75
FTGMAC100Desc bd;
133
+ "mr-rpu-ps-alias", &s->mr_ps, 0, UINT64_MAX);
76
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
77
flags = bd.des1;
78
}
79
80
- len = bd.des0 & 0x3FFF;
81
- if (frame_size + len > max_frame_size) {
82
+ len = FTGMAC100_TXDES0_TXBUF_SIZE(bd.des0);
83
+ if (frame_size + len > sizeof(s->frame)) {
84
qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %d bytes\n",
85
__func__, len);
86
- len = max_frame_size - frame_size;
87
+ s->isr |= FTGMAC100_INT_XPKT_LOST;
88
+ len = sizeof(s->frame) - frame_size;
89
}
90
91
if (dma_memory_read(&address_space_memory, bd.des3, ptr, len)) {
92
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
93
uint32_t buf_len;
94
size_t size = len;
95
uint32_t first = FTGMAC100_RXDES0_FRS;
96
- int max_frame_size = ftgmac100_max_frame_size(s);
97
+ uint16_t proto = be16_to_cpu(PKT_GET_ETH_HDR(buf)->h_proto);
98
+ int max_frame_size = ftgmac100_max_frame_size(s, proto);
99
100
if ((s->maccr & (FTGMAC100_MACCR_RXDMA_EN | FTGMAC100_MACCR_RXMAC_EN))
101
!= (FTGMAC100_MACCR_RXDMA_EN | FTGMAC100_MACCR_RXMAC_EN)) {
102
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
103
104
/* Huge frames are truncated. */
105
if (size > max_frame_size) {
106
- size = max_frame_size;
107
qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %zd bytes\n",
108
__func__, size);
109
+ size = max_frame_size;
110
flags |= FTGMAC100_RXDES0_FTL;
111
}
112
113
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_realize(DeviceState *dev, Error **errp)
114
object_get_typename(OBJECT(dev)), DEVICE(dev)->id,
115
s);
116
qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
117
-
118
- s->frame = g_malloc(FTGMAC100_MAX_FRAME_SIZE);
119
}
134
}
120
135
121
static const VMStateDescription vmstate_ftgmac100 = {
136
static Property versal_properties[] = {
122
--
137
--
123
2.17.1
138
2.25.1
124
125
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
2
2
3
While we skip the GIC_INTERNAL irqs, we don't change the register offset
3
Add a model of the Xilinx Versal CRL.
4
accordingly. This will overlap the GICR registers value and leave the
5
last GIC_INTERNAL irq's registers out of update.
6
4
7
Fix this by skipping the registers banked by GICR.
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
8
6
Reviewed-by: Frederic Konrad <fkonrad@amd.com>
9
Also for migration compatibility if the migration source (old version
7
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
10
qemu) doesn't send gicd_no_migration_shift_bug = 1 to destination, then
8
Message-id: 20220406174303.2022038-4-edgar.iglesias@xilinx.com
11
we shift the data of PPI to get the right data for SPI.
12
13
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
14
Cc: qemu-stable@nongnu.org
15
Reviewed-by: Eric Auger <eric.auger@redhat.com>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
18
Message-id: 1527816987-16108-1-git-send-email-zhaoshenglong@huawei.com
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
10
---
21
include/hw/intc/arm_gicv3_common.h | 1 +
11
include/hw/misc/xlnx-versal-crl.h | 235 +++++++++++++++++
22
hw/intc/arm_gicv3_common.c | 79 ++++++++++++++++++++++++++++++
12
hw/misc/xlnx-versal-crl.c | 421 ++++++++++++++++++++++++++++++
23
hw/intc/arm_gicv3_kvm.c | 38 ++++++++++++++
13
hw/misc/meson.build | 1 +
24
3 files changed, 118 insertions(+)
14
3 files changed, 657 insertions(+)
15
create mode 100644 include/hw/misc/xlnx-versal-crl.h
16
create mode 100644 hw/misc/xlnx-versal-crl.c
25
17
26
diff --git a/include/hw/intc/arm_gicv3_common.h b/include/hw/intc/arm_gicv3_common.h
18
diff --git a/include/hw/misc/xlnx-versal-crl.h b/include/hw/misc/xlnx-versal-crl.h
27
index XXXXXXX..XXXXXXX 100644
19
new file mode 100644
28
--- a/include/hw/intc/arm_gicv3_common.h
20
index XXXXXXX..XXXXXXX
29
+++ b/include/hw/intc/arm_gicv3_common.h
21
--- /dev/null
30
@@ -XXX,XX +XXX,XX @@ struct GICv3State {
22
+++ b/include/hw/misc/xlnx-versal-crl.h
31
uint32_t revision;
32
bool security_extn;
33
bool irq_reset_nonsecure;
34
+ bool gicd_no_migration_shift_bug;
35
36
int dev_fd; /* kvm device fd if backed by kvm vgic support */
37
Error *migration_blocker;
38
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/intc/arm_gicv3_common.c
41
+++ b/hw/intc/arm_gicv3_common.c
42
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@
43
#include "hw/intc/arm_gicv3_common.h"
24
+/*
44
#include "gicv3_internal.h"
25
+ * QEMU model of the Clock-Reset-LPD (CRL).
45
#include "hw/arm/linux-boot-if.h"
26
+ *
46
+#include "sysemu/kvm.h"
27
+ * Copyright (c) 2022 Xilinx Inc.
47
28
+ * SPDX-License-Identifier: GPL-2.0-or-later
48
static int gicv3_pre_save(void *opaque)
29
+ *
49
{
30
+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>
50
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_gicv3_cpu = {
31
+ */
51
}
32
+#ifndef HW_MISC_XLNX_VERSAL_CRL_H
52
};
33
+#define HW_MISC_XLNX_VERSAL_CRL_H
53
34
+
54
+static int gicv3_gicd_no_migration_shift_bug_pre_load(void *opaque)
35
+#include "hw/sysbus.h"
55
+{
36
+#include "hw/register.h"
56
+ GICv3State *cs = opaque;
37
+#include "target/arm/cpu.h"
57
+
38
+
58
+ /*
39
+#define TYPE_XLNX_VERSAL_CRL "xlnx,versal-crl"
59
+ * The gicd_no_migration_shift_bug flag is used for migration compatibility
40
+OBJECT_DECLARE_SIMPLE_TYPE(XlnxVersalCRL, XLNX_VERSAL_CRL)
60
+ * for old version QEMU which may have the GICD bmp shift bug under KVM mode.
41
+
61
+ * Strictly, what we want to know is whether the migration source is using
42
+REG32(ERR_CTRL, 0x0)
62
+ * KVM. Since we don't have any way to determine that, we look at whether the
43
+ FIELD(ERR_CTRL, SLVERR_ENABLE, 0, 1)
63
+ * destination is using KVM; this is close enough because for the older QEMU
44
+REG32(IR_STATUS, 0x4)
64
+ * versions with this bug KVM -> TCG migration didn't work anyway. If the
45
+ FIELD(IR_STATUS, ADDR_DECODE_ERR, 0, 1)
65
+ * source is a newer QEMU without this bug it will transmit the migration
46
+REG32(IR_MASK, 0x8)
66
+ * subsection which sets the flag to true; otherwise it will remain set to
47
+ FIELD(IR_MASK, ADDR_DECODE_ERR, 0, 1)
67
+ * the value we select here.
48
+REG32(IR_ENABLE, 0xc)
68
+ */
49
+ FIELD(IR_ENABLE, ADDR_DECODE_ERR, 0, 1)
69
+ if (kvm_enabled()) {
50
+REG32(IR_DISABLE, 0x10)
70
+ cs->gicd_no_migration_shift_bug = false;
51
+ FIELD(IR_DISABLE, ADDR_DECODE_ERR, 0, 1)
71
+ }
52
+REG32(WPROT, 0x1c)
72
+
53
+ FIELD(WPROT, ACTIVE, 0, 1)
54
+REG32(PLL_CLK_OTHER_DMN, 0x20)
55
+ FIELD(PLL_CLK_OTHER_DMN, APLL_BYPASS, 0, 1)
56
+REG32(RPLL_CTRL, 0x40)
57
+ FIELD(RPLL_CTRL, POST_SRC, 24, 3)
58
+ FIELD(RPLL_CTRL, PRE_SRC, 20, 3)
59
+ FIELD(RPLL_CTRL, CLKOUTDIV, 16, 2)
60
+ FIELD(RPLL_CTRL, FBDIV, 8, 8)
61
+ FIELD(RPLL_CTRL, BYPASS, 3, 1)
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;
245
+
246
+ struct {
247
+ ARMCPU *cpu_r5[RPU_MAX_CPU];
248
+ DeviceState *adma[8];
249
+ DeviceState *uart[2];
250
+ DeviceState *gem[2];
251
+ DeviceState *usb;
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
261
index XXXXXXX..XXXXXXX
262
--- /dev/null
263
+++ b/hw/misc/xlnx-versal-crl.c
264
@@ -XXX,XX +XXX,XX @@
265
+/*
266
+ * QEMU model of the Clock-Reset-LPD (CRL).
267
+ *
268
+ * Copyright (c) 2022 Advanced Micro Devices, Inc.
269
+ * SPDX-License-Identifier: GPL-2.0-or-later
270
+ *
271
+ * Written by Edgar E. Iglesias <edgar.iglesias@amd.com>
272
+ */
273
+
274
+#include "qemu/osdep.h"
275
+#include "qapi/error.h"
276
+#include "qemu/log.h"
277
+#include "qemu/bitops.h"
278
+#include "migration/vmstate.h"
279
+#include "hw/qdev-properties.h"
280
+#include "hw/sysbus.h"
281
+#include "hw/irq.h"
282
+#include "hw/register.h"
283
+#include "hw/resettable.h"
284
+
285
+#include "target/arm/arm-powerctl.h"
286
+#include "hw/misc/xlnx-versal-crl.h"
287
+
288
+#ifndef XLNX_VERSAL_CRL_ERR_DEBUG
289
+#define XLNX_VERSAL_CRL_ERR_DEBUG 0
290
+#endif
291
+
292
+static void crl_update_irq(XlnxVersalCRL *s)
293
+{
294
+ bool pending = s->regs[R_IR_STATUS] & ~s->regs[R_IR_MASK];
295
+ qemu_set_irq(s->irq, pending);
296
+}
297
+
298
+static void crl_status_postw(RegisterInfo *reg, uint64_t val64)
299
+{
300
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
301
+ crl_update_irq(s);
302
+}
303
+
304
+static uint64_t crl_enable_prew(RegisterInfo *reg, uint64_t val64)
305
+{
306
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
307
+ uint32_t val = val64;
308
+
309
+ s->regs[R_IR_MASK] &= ~val;
310
+ crl_update_irq(s);
73
+ return 0;
311
+ return 0;
74
+}
312
+}
75
+
313
+
76
+static int gicv3_gicd_no_migration_shift_bug_post_load(void *opaque,
314
+static uint64_t crl_disable_prew(RegisterInfo *reg, uint64_t val64)
77
+ int version_id)
315
+{
78
+{
316
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
79
+ GICv3State *cs = opaque;
317
+ uint32_t val = val64;
80
+
318
+
81
+ if (cs->gicd_no_migration_shift_bug) {
319
+ s->regs[R_IR_MASK] |= val;
82
+ return 0;
320
+ crl_update_irq(s);
83
+ }
84
+
85
+ /* Older versions of QEMU had a bug in the handling of state save/restore
86
+ * to the KVM GICv3: they got the offset in the bitmap arrays wrong,
87
+ * so that instead of the data for external interrupts 32 and up
88
+ * starting at bit position 32 in the bitmap, it started at bit
89
+ * position 64. If we're receiving data from a QEMU with that bug,
90
+ * we must move the data down into the right place.
91
+ */
92
+ memmove(cs->group, (uint8_t *)cs->group + GIC_INTERNAL / 8,
93
+ sizeof(cs->group) - GIC_INTERNAL / 8);
94
+ memmove(cs->grpmod, (uint8_t *)cs->grpmod + GIC_INTERNAL / 8,
95
+ sizeof(cs->grpmod) - GIC_INTERNAL / 8);
96
+ memmove(cs->enabled, (uint8_t *)cs->enabled + GIC_INTERNAL / 8,
97
+ sizeof(cs->enabled) - GIC_INTERNAL / 8);
98
+ memmove(cs->pending, (uint8_t *)cs->pending + GIC_INTERNAL / 8,
99
+ sizeof(cs->pending) - GIC_INTERNAL / 8);
100
+ memmove(cs->active, (uint8_t *)cs->active + GIC_INTERNAL / 8,
101
+ sizeof(cs->active) - GIC_INTERNAL / 8);
102
+ memmove(cs->edge_trigger, (uint8_t *)cs->edge_trigger + GIC_INTERNAL / 8,
103
+ sizeof(cs->edge_trigger) - GIC_INTERNAL / 8);
104
+
105
+ /*
106
+ * While this new version QEMU doesn't have this kind of bug as we fix it,
107
+ * so it needs to set the flag to true to indicate that and it's necessary
108
+ * for next migration to work from this new version QEMU.
109
+ */
110
+ cs->gicd_no_migration_shift_bug = true;
111
+
112
+ return 0;
321
+ return 0;
113
+}
322
+}
114
+
323
+
115
+const VMStateDescription vmstate_gicv3_gicd_no_migration_shift_bug = {
324
+static void crl_reset_dev(XlnxVersalCRL *s, DeviceState *dev,
116
+ .name = "arm_gicv3/gicd_no_migration_shift_bug",
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
+ }
338
+}
339
+
340
+#define REGFIELD_RESET(type, s, reg, f, new_val, dev) { \
341
+ bool old_f = ARRAY_FIELD_EX32((s)->regs, reg, f); \
342
+ bool new_f = FIELD_EX32(new_val, reg, f); \
343
+ \
344
+ /* Detect edges. */ \
345
+ if (dev && old_f != new_f) { \
346
+ crl_reset_ ## type(s, dev, old_f, new_f); \
347
+ } \
348
+}
349
+
350
+static uint64_t crl_rst_r5_prew(RegisterInfo *reg, uint64_t val64)
351
+{
352
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
353
+
354
+ REGFIELD_RESET(cpu, s, RST_CPU_R5, RESET_CPU0, val64, s->cfg.cpu_r5[0]);
355
+ REGFIELD_RESET(cpu, s, RST_CPU_R5, RESET_CPU1, val64, s->cfg.cpu_r5[1]);
356
+ return val64;
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
+ }
368
+ return val64;
369
+}
370
+
371
+static uint64_t crl_rst_uart0_prew(RegisterInfo *reg, uint64_t val64)
372
+{
373
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
374
+
375
+ REGFIELD_RESET(dev, s, RST_UART0, RESET, val64, s->cfg.uart[0]);
376
+ return val64;
377
+}
378
+
379
+static uint64_t crl_rst_uart1_prew(RegisterInfo *reg, uint64_t val64)
380
+{
381
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
382
+
383
+ REGFIELD_RESET(dev, s, RST_UART1, RESET, val64, s->cfg.uart[1]);
384
+ return val64;
385
+}
386
+
387
+static uint64_t crl_rst_gem0_prew(RegisterInfo *reg, uint64_t val64)
388
+{
389
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
390
+
391
+ REGFIELD_RESET(dev, s, RST_GEM0, RESET, val64, s->cfg.gem[0]);
392
+ return val64;
393
+}
394
+
395
+static uint64_t crl_rst_gem1_prew(RegisterInfo *reg, uint64_t val64)
396
+{
397
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(reg->opaque);
398
+
399
+ REGFIELD_RESET(dev, s, RST_GEM1, RESET, val64, s->cfg.gem[1]);
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
+ }
565
+};
566
+
567
+static void crl_reset_enter(Object *obj, ResetType type)
568
+{
569
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj);
570
+ unsigned int i;
571
+
572
+ for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
573
+ register_reset(&s->regs_info[i]);
574
+ }
575
+}
576
+
577
+static void crl_reset_hold(Object *obj)
578
+{
579
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj);
580
+
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,
588
+ .valid = {
589
+ .min_access_size = 4,
590
+ .max_access_size = 4,
591
+ },
592
+};
593
+
594
+static void crl_init(Object *obj)
595
+{
596
+ XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj);
597
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
598
+ int i;
599
+
600
+ s->reg_array =
601
+ register_init_block32(DEVICE(obj), crl_regs_info,
602
+ ARRAY_SIZE(crl_regs_info),
603
+ s->regs_info, s->regs,
604
+ &crl_ops,
605
+ XLNX_VERSAL_CRL_ERR_DEBUG,
606
+ CRL_R_MAX * 4);
607
+ sysbus_init_mmio(sbd, &s->reg_array->mem);
608
+ sysbus_init_irq(sbd, &s->irq);
609
+
610
+ for (i = 0; i < ARRAY_SIZE(s->cfg.cpu_r5); ++i) {
611
+ object_property_add_link(obj, "cpu_r5[*]", TYPE_ARM_CPU,
612
+ (Object **)&s->cfg.cpu_r5[i],
613
+ qdev_prop_allow_set_link_before_realize,
614
+ OBJ_PROP_LINK_STRONG);
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,
117
+ .version_id = 1,
652
+ .version_id = 1,
118
+ .minimum_version_id = 1,
653
+ .minimum_version_id = 1,
119
+ .pre_load = gicv3_gicd_no_migration_shift_bug_pre_load,
120
+ .post_load = gicv3_gicd_no_migration_shift_bug_post_load,
121
+ .fields = (VMStateField[]) {
654
+ .fields = (VMStateField[]) {
122
+ VMSTATE_BOOL(gicd_no_migration_shift_bug, GICv3State),
655
+ VMSTATE_UINT32_ARRAY(regs, XlnxVersalCRL, CRL_R_MAX),
123
+ VMSTATE_END_OF_LIST()
656
+ VMSTATE_END_OF_LIST(),
124
+ }
657
+ }
125
+};
658
+};
126
+
659
+
127
static const VMStateDescription vmstate_gicv3 = {
660
+static void crl_class_init(ObjectClass *klass, void *data)
128
.name = "arm_gicv3",
661
+{
129
.version_id = 1,
662
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
130
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_gicv3 = {
663
+ DeviceClass *dc = DEVICE_CLASS(klass);
131
VMSTATE_STRUCT_VARRAY_POINTER_UINT32(cpu, GICv3State, num_cpu,
664
+
132
vmstate_gicv3_cpu, GICv3CPUState),
665
+ dc->vmsd = &vmstate_crl;
133
VMSTATE_END_OF_LIST()
666
+
134
+ },
667
+ rc->phases.enter = crl_reset_enter;
135
+ .subsections = (const VMStateDescription * []) {
668
+ rc->phases.hold = crl_reset_hold;
136
+ &vmstate_gicv3_gicd_no_migration_shift_bug,
669
+}
137
+ NULL
670
+
138
}
671
+static const TypeInfo crl_info = {
139
};
672
+ .name = TYPE_XLNX_VERSAL_CRL,
140
673
+ .parent = TYPE_SYS_BUS_DEVICE,
141
@@ -XXX,XX +XXX,XX @@ static void arm_gicv3_common_reset(DeviceState *dev)
674
+ .instance_size = sizeof(XlnxVersalCRL),
142
gicv3_gicd_group_set(s, i);
675
+ .class_init = crl_class_init,
143
}
676
+ .instance_init = crl_init,
144
}
677
+ .instance_finalize = crl_finalize,
145
+ s->gicd_no_migration_shift_bug = true;
678
+};
146
}
679
+
147
680
+static void crl_register_types(void)
148
static void arm_gic_common_linux_init(ARMLinuxBootIf *obj,
681
+{
149
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
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
150
index XXXXXXX..XXXXXXX 100644
687
index XXXXXXX..XXXXXXX 100644
151
--- a/hw/intc/arm_gicv3_kvm.c
688
--- a/hw/misc/meson.build
152
+++ b/hw/intc/arm_gicv3_kvm.c
689
+++ b/hw/misc/meson.build
153
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_get_edge_trigger(GICv3State *s, uint32_t offset,
690
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c'))
154
uint32_t reg;
691
softmmu_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c'))
155
int irq;
692
specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-crf.c'))
156
693
specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-apu-ctrl.c'))
157
+ /* For the KVM GICv3, affinity routing is always enabled, and the first 2
694
+specific_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal-crl.c'))
158
+ * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
695
softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files(
159
+ * functionality is replaced by GICR_ICFGR<n>. It doesn't need to sync
696
'xlnx-versal-xramc.c',
160
+ * them. So it should increase the offset to skip GIC_INTERNAL irqs.
697
'xlnx-versal-pmc-iou-slcr.c',
161
+ * This matches the for_each_dist_irq_reg() macro which also skips the
162
+ * first GIC_INTERNAL irqs.
163
+ */
164
+ offset += (GIC_INTERNAL * 2) / 8;
165
for_each_dist_irq_reg(irq, s->num_irq, 2) {
166
kvm_gicd_access(s, offset, &reg, false);
167
reg = half_unshuffle32(reg >> 1);
168
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_put_edge_trigger(GICv3State *s, uint32_t offset,
169
uint32_t reg;
170
int irq;
171
172
+ /* For the KVM GICv3, affinity routing is always enabled, and the first 2
173
+ * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
174
+ * functionality is replaced by GICR_ICFGR<n>. It doesn't need to sync
175
+ * them. So it should increase the offset to skip GIC_INTERNAL irqs.
176
+ * This matches the for_each_dist_irq_reg() macro which also skips the
177
+ * first GIC_INTERNAL irqs.
178
+ */
179
+ offset += (GIC_INTERNAL * 2) / 8;
180
for_each_dist_irq_reg(irq, s->num_irq, 2) {
181
reg = *gic_bmp_ptr32(bmp, irq);
182
if (irq % 32 != 0) {
183
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_getbmp(GICv3State *s, uint32_t offset, uint32_t *bmp)
184
uint32_t reg;
185
int irq;
186
187
+ /* For the KVM GICv3, affinity routing is always enabled, and the
188
+ * GICD_IGROUPR0/GICD_IGRPMODR0/GICD_ISENABLER0/GICD_ISPENDR0/
189
+ * GICD_ISACTIVER0 registers are always RAZ/WI. The corresponding
190
+ * functionality is replaced by the GICR registers. It doesn't need to sync
191
+ * them. So it should increase the offset to skip GIC_INTERNAL irqs.
192
+ * This matches the for_each_dist_irq_reg() macro which also skips the
193
+ * first GIC_INTERNAL irqs.
194
+ */
195
+ offset += (GIC_INTERNAL * 1) / 8;
196
for_each_dist_irq_reg(irq, s->num_irq, 1) {
197
kvm_gicd_access(s, offset, &reg, false);
198
*gic_bmp_ptr32(bmp, irq) = reg;
199
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
200
uint32_t reg;
201
int irq;
202
203
+ /* For the KVM GICv3, affinity routing is always enabled, and the
204
+ * GICD_IGROUPR0/GICD_IGRPMODR0/GICD_ISENABLER0/GICD_ISPENDR0/
205
+ * GICD_ISACTIVER0 registers are always RAZ/WI. The corresponding
206
+ * functionality is replaced by the GICR registers. It doesn't need to sync
207
+ * them. So it should increase the offset and clroffset to skip GIC_INTERNAL
208
+ * irqs. This matches the for_each_dist_irq_reg() macro which also skips the
209
+ * first GIC_INTERNAL irqs.
210
+ */
211
+ offset += (GIC_INTERNAL * 1) / 8;
212
+ if (clroffset != 0) {
213
+ clroffset += (GIC_INTERNAL * 1) / 8;
214
+ }
215
+
216
for_each_dist_irq_reg(irq, s->num_irq, 1) {
217
/* If this bitmap is a set/clear register pair, first write to the
218
* clear-reg to clear all bits before using the set-reg to write
219
--
698
--
220
2.17.1
699
2.25.1
221
222
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Connect the CRL (Clock Reset LPD) to the Versal SoC.
4
Message-id: 20180606152128.449-3-f4bug@amsat.org
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
6
Reviewed-by: Frederic Konrad <fkonrad@amd.com>
7
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
8
Message-id: 20220406174303.2022038-5-edgar.iglesias@xilinx.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
hw/char/digic-uart.c | 4 ++--
11
include/hw/arm/xlnx-versal.h | 4 +++
9
hw/timer/digic-timer.c | 4 ++--
12
hw/arm/xlnx-versal.c | 54 ++++++++++++++++++++++++++++++++++--
10
2 files changed, 4 insertions(+), 4 deletions(-)
13
2 files changed, 56 insertions(+), 2 deletions(-)
11
14
12
diff --git a/hw/char/digic-uart.c b/hw/char/digic-uart.c
15
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/char/digic-uart.c
17
--- a/include/hw/arm/xlnx-versal.h
15
+++ b/hw/char/digic-uart.c
18
+++ b/include/hw/arm/xlnx-versal.h
16
@@ -XXX,XX +XXX,XX @@ static uint64_t digic_uart_read(void *opaque, hwaddr addr,
19
@@ -XXX,XX +XXX,XX @@
17
default:
20
#include "hw/nvram/xlnx-versal-efuse.h"
18
qemu_log_mask(LOG_UNIMP,
21
#include "hw/ssi/xlnx-versal-ospi.h"
19
"digic-uart: read access to unknown register 0x"
22
#include "hw/dma/xlnx_csu_dma.h"
20
- TARGET_FMT_plx, addr << 2);
23
+#include "hw/misc/xlnx-versal-crl.h"
21
+ TARGET_FMT_plx "\n", addr << 2);
24
#include "hw/misc/xlnx-versal-pmc-iou-slcr.h"
22
}
25
23
26
#define TYPE_XLNX_VERSAL "xlnx-versal"
24
return ret;
27
@@ -XXX,XX +XXX,XX @@ struct Versal {
25
@@ -XXX,XX +XXX,XX @@ static void digic_uart_write(void *opaque, hwaddr addr, uint64_t value,
28
qemu_or_irq irq_orgate;
26
default:
29
XlnxXramCtrl ctrl[XLNX_VERSAL_NR_XRAM];
27
qemu_log_mask(LOG_UNIMP,
30
} xram;
28
"digic-uart: write access to unknown register 0x"
31
+
29
- TARGET_FMT_plx, addr << 2);
32
+ XlnxVersalCRL crl;
30
+ TARGET_FMT_plx "\n", addr << 2);
33
} lpd;
31
}
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]);
32
}
50
}
33
51
34
diff --git a/hw/timer/digic-timer.c b/hw/timer/digic-timer.c
52
+static void versal_create_crl(Versal *s, qemu_irq *pic)
35
index XXXXXXX..XXXXXXX 100644
53
+{
36
--- a/hw/timer/digic-timer.c
54
+ SysBusDevice *sbd;
37
+++ b/hw/timer/digic-timer.c
55
+ int i;
38
@@ -XXX,XX +XXX,XX @@ static uint64_t digic_timer_read(void *opaque, hwaddr offset, unsigned size)
56
+
39
default:
57
+ object_initialize_child(OBJECT(s), "crl", &s->lpd.crl,
40
qemu_log_mask(LOG_UNIMP,
58
+ TYPE_XLNX_VERSAL_CRL);
41
"digic-timer: read access to unknown register 0x"
59
+ sbd = SYS_BUS_DEVICE(&s->lpd.crl);
42
- TARGET_FMT_plx, offset);
60
+
43
+ TARGET_FMT_plx "\n", offset);
61
+ for (i = 0; i < ARRAY_SIZE(s->lpd.rpu.cpu); i++) {
44
}
62
+ g_autofree gchar *name = g_strdup_printf("cpu_r5[%d]", i);
45
63
+
46
return ret;
64
+ object_property_set_link(OBJECT(&s->lpd.crl),
47
@@ -XXX,XX +XXX,XX @@ static void digic_timer_write(void *opaque, hwaddr offset,
65
+ name, OBJECT(&s->lpd.rpu.cpu[i]),
48
default:
66
+ &error_abort);
49
qemu_log_mask(LOG_UNIMP,
67
+ }
50
"digic-timer: read access to unknown register 0x"
68
+
51
- TARGET_FMT_plx, offset);
69
+ for (i = 0; i < ARRAY_SIZE(s->lpd.iou.gem); i++) {
52
+ TARGET_FMT_plx "\n", offset);
70
+ g_autofree gchar *name = g_strdup_printf("gem[%d]", i);
53
}
71
+
54
}
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);
55
122
56
--
123
--
57
2.17.1
124
2.25.1
58
59
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
The Exynos4210 SoC device currently uses a custom device
2
"exynos4210.irq_gate" to model the OR gate that feeds each CPU's IRQ
3
line. We have a standard TYPE_OR_IRQ device for this now, so use
4
that instead.
2
5
3
This is a ethernet wire limitation not needed in emulation. It breaks
6
(This is a migration compatibility break, but that is OK for this
4
U-Boot n/w stack also.
7
machine type.)
5
8
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Message-id: 20180530061711.23673-5-clg@kaod.org
8
Reviewed-by: Peter Maydell <peter.maydell@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
10
---
12
---
11
hw/net/ftgmac100.c | 6 ------
13
include/hw/arm/exynos4210.h | 1 +
12
1 file changed, 6 deletions(-)
14
hw/arm/exynos4210.c | 31 ++++++++++++++++---------------
15
2 files changed, 17 insertions(+), 15 deletions(-)
13
16
14
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
17
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/net/ftgmac100.c
19
--- a/include/hw/arm/exynos4210.h
17
+++ b/hw/net/ftgmac100.c
20
+++ b/include/hw/arm/exynos4210.h
18
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
21
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
19
return size;
22
MemoryRegion bootreg_mem;
23
I2CBus *i2c_if[EXYNOS4210_I2C_NUMBER];
24
qemu_or_irq pl330_irq_orgate[EXYNOS4210_NUM_DMA];
25
+ qemu_or_irq cpu_irq_orgate[EXYNOS4210_NCPUS];
26
};
27
28
#define TYPE_EXYNOS4210_SOC "exynos4210"
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
{
35
Exynos4210State *s = EXYNOS4210_SOC(socdev);
36
MemoryRegion *system_mem = get_system_memory();
37
- qemu_irq gate_irq[EXYNOS4210_NCPUS][EXYNOS4210_IRQ_GATE_NINPUTS];
38
SysBusDevice *busdev;
39
DeviceState *dev, *uart[4], *pl330[3];
40
int i, n;
41
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
42
43
/* IRQ Gate */
44
for (i = 0; i < EXYNOS4210_NCPUS; i++) {
45
- dev = qdev_new("exynos4210.irq_gate");
46
- qdev_prop_set_uint32(dev, "n_in", EXYNOS4210_IRQ_GATE_NINPUTS);
47
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
48
- /* Get IRQ Gate input in gate_irq */
49
- for (n = 0; n < EXYNOS4210_IRQ_GATE_NINPUTS; n++) {
50
- gate_irq[i][n] = qdev_get_gpio_in(dev, n);
51
- }
52
- busdev = SYS_BUS_DEVICE(dev);
53
-
54
- /* Connect IRQ Gate output to CPU's IRQ line */
55
- sysbus_connect_irq(busdev, 0,
56
- qdev_get_gpio_in(DEVICE(s->cpu[i]), ARM_CPU_IRQ));
57
+ DeviceState *orgate = DEVICE(&s->cpu_irq_orgate[i]);
58
+ object_property_set_int(OBJECT(orgate), "num-lines",
59
+ EXYNOS4210_IRQ_GATE_NINPUTS,
60
+ &error_abort);
61
+ qdev_realize(orgate, NULL, &error_abort);
62
+ qdev_connect_gpio_out(orgate, 0,
63
+ qdev_get_gpio_in(DEVICE(s->cpu[i]), ARM_CPU_IRQ));
20
}
64
}
21
65
22
- if (size < 64 && !(s->maccr & FTGMAC100_MACCR_RX_RUNT)) {
66
/* Private memory region and Internal GIC */
23
- qemu_log_mask(LOG_GUEST_ERROR, "%s: dropped runt frame of %zd bytes\n",
67
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
24
- __func__, size);
68
sysbus_realize_and_unref(busdev, &error_fatal);
25
- return size;
69
sysbus_mmio_map(busdev, 0, EXYNOS4210_SMP_PRIVATE_BASE_ADDR);
26
- }
70
for (n = 0; n < EXYNOS4210_NCPUS; n++) {
27
-
71
- sysbus_connect_irq(busdev, n, gate_irq[n][0]);
28
if (!ftgmac100_filter(s, buf, size)) {
72
+ sysbus_connect_irq(busdev, n,
29
return size;
73
+ qdev_get_gpio_in(DEVICE(&s->cpu_irq_orgate[n]), 0));
30
}
74
}
75
for (n = 0; n < EXYNOS4210_INT_GIC_NIRQ; n++) {
76
s->irqs.int_gic_irq[n] = qdev_get_gpio_in(dev, n);
77
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
78
/* Map Distributer interface */
79
sysbus_mmio_map(busdev, 1, EXYNOS4210_EXT_GIC_DIST_BASE_ADDR);
80
for (n = 0; n < EXYNOS4210_NCPUS; n++) {
81
- sysbus_connect_irq(busdev, n, gate_irq[n][1]);
82
+ sysbus_connect_irq(busdev, n,
83
+ qdev_get_gpio_in(DEVICE(&s->cpu_irq_orgate[n]), 1));
84
}
85
for (n = 0; n < EXYNOS4210_EXT_GIC_NIRQ; n++) {
86
s->irqs.ext_gic_irq[n] = qdev_get_gpio_in(dev, n);
87
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init(Object *obj)
88
object_initialize_child(obj, name, orgate, TYPE_OR_IRQ);
89
g_free(name);
90
}
91
+
92
+ for (i = 0; i < ARRAY_SIZE(s->cpu_irq_orgate); i++) {
93
+ g_autofree char *name = g_strdup_printf("cpu-irq-orgate%d", i);
94
+ object_initialize_child(obj, name, &s->cpu_irq_orgate[i], TYPE_OR_IRQ);
95
+ }
96
}
97
98
static void exynos4210_class_init(ObjectClass *klass, void *data)
31
--
99
--
32
2.17.1
100
2.25.1
33
34
diff view generated by jsdifflib
1
From: Thomas Huth <thuth@redhat.com>
1
Now we have removed the only use of TYPE_EXYNOS4210_IRQ_GATE we can
2
delete the device entirely.
2
3
3
It has been marked as deprecated since QEMU v2.11, so it is time to
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
remove this now. The xlnx-zcu102 machine is very much the same and
5
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
5
can be used as a replacement instead.
6
Message-id: 20220404154658.565020-3-peter.maydell@linaro.org
7
---
8
hw/intc/exynos4210_gic.c | 107 ---------------------------------------
9
1 file changed, 107 deletions(-)
6
10
7
Signed-off-by: Thomas Huth <thuth@redhat.com>
11
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/xlnx-zcu102.c | 62 ++------------------------------------------
12
qemu-doc.texi | 5 ----
13
2 files changed, 2 insertions(+), 65 deletions(-)
14
15
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
16
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-zcu102.c
13
--- a/hw/intc/exynos4210_gic.c
18
+++ b/hw/arm/xlnx-zcu102.c
14
+++ b/hw/intc/exynos4210_gic.c
19
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZCU102 {
15
@@ -XXX,XX +XXX,XX @@ static void exynos4210_gic_register_types(void)
20
#define ZCU102_MACHINE(obj) \
16
}
21
OBJECT_CHECK(XlnxZCU102, (obj), TYPE_ZCU102_MACHINE)
17
22
18
type_init(exynos4210_gic_register_types)
23
-#define TYPE_EP108_MACHINE MACHINE_TYPE_NAME("xlnx-ep108")
24
-#define EP108_MACHINE(obj) \
25
- OBJECT_CHECK(XlnxZCU102, (obj), TYPE_EP108_MACHINE)
26
-
19
-
27
static struct arm_boot_info xlnx_zcu102_binfo;
20
-/* IRQ OR Gate struct.
28
21
- *
29
static bool zcu102_get_secure(Object *obj, Error **errp)
22
- * This device models an OR gate. There are n_in input qdev gpio lines and one
30
@@ -XXX,XX +XXX,XX @@ static void zcu102_set_virt(Object *obj, bool value, Error **errp)
23
- * output sysbus IRQ line. The output IRQ level is formed as OR between all
31
s->virt = value;
24
- * gpio inputs.
32
}
25
- */
33
26
-
34
-static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
27
-#define TYPE_EXYNOS4210_IRQ_GATE "exynos4210.irq_gate"
35
+static void xlnx_zcu102_init(MachineState *machine)
28
-OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210IRQGateState, EXYNOS4210_IRQ_GATE)
36
{
29
-
37
+ XlnxZCU102 *s = ZCU102_MACHINE(machine);
30
-struct Exynos4210IRQGateState {
38
int i;
31
- SysBusDevice parent_obj;
39
uint64_t ram_size = machine->ram_size;
32
-
40
33
- uint32_t n_in; /* inputs amount */
41
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
34
- uint32_t *level; /* input levels */
42
arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_zcu102_binfo);
35
- qemu_irq out; /* output IRQ */
43
}
36
-};
44
37
-
45
-static void xlnx_ep108_init(MachineState *machine)
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)
46
-{
55
-{
47
- XlnxZCU102 *s = EP108_MACHINE(machine);
56
- Exynos4210IRQGateState *s = (Exynos4210IRQGateState *)opaque;
57
- uint32_t i;
48
-
58
-
49
- if (!qtest_enabled()) {
59
- assert(irq < s->n_in);
50
- info_report("The Xilinx EP108 machine is deprecated, please use the "
60
-
51
- "ZCU102 machine (which has the same features) instead.");
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
- }
52
- }
68
- }
53
-
69
-
54
- xlnx_zynqmp_init(s, machine);
70
- qemu_irq_lower(s->out);
55
-}
71
-}
56
-
72
-
57
-static void xlnx_ep108_machine_instance_init(Object *obj)
73
-static void exynos4210_irq_gate_reset(DeviceState *d)
58
-{
74
-{
59
- XlnxZCU102 *s = EP108_MACHINE(obj);
75
- Exynos4210IRQGateState *s = EXYNOS4210_IRQ_GATE(d);
60
-
76
-
61
- /* EP108, we don't support setting secure or virt */
77
- memset(s->level, 0, s->n_in * sizeof(*s->level));
62
- s->secure = false;
63
- s->virt = false;
64
-}
78
-}
65
-
79
-
66
-static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
80
-/*
81
- * IRQ Gate initialization.
82
- */
83
-static void exynos4210_irq_gate_init(Object *obj)
67
-{
84
-{
68
- MachineClass *mc = MACHINE_CLASS(oc);
85
- Exynos4210IRQGateState *s = EXYNOS4210_IRQ_GATE(obj);
86
- SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
69
-
87
-
70
- mc->desc = "Xilinx ZynqMP EP108 board (Deprecated, please use xlnx-zcu102)";
88
- sysbus_init_irq(sbd, &s->out);
71
- mc->init = xlnx_ep108_init;
72
- mc->block_default_type = IF_IDE;
73
- mc->units_per_default_bus = 1;
74
- mc->ignore_memory_transaction_failures = true;
75
- mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS;
76
- mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS;
77
-}
89
-}
78
-
90
-
79
-static const TypeInfo xlnx_ep108_machine_init_typeinfo = {
91
-static void exynos4210_irq_gate_realize(DeviceState *dev, Error **errp)
80
- .name = MACHINE_TYPE_NAME("xlnx-ep108"),
92
-{
81
- .parent = TYPE_MACHINE,
93
- Exynos4210IRQGateState *s = EXYNOS4210_IRQ_GATE(dev);
82
- .class_init = xlnx_ep108_machine_class_init,
94
-
83
- .instance_init = xlnx_ep108_machine_instance_init,
95
- /* Allocate general purpose input signals and connect a handler to each of
84
- .instance_size = sizeof(XlnxZCU102),
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,
85
-};
118
-};
86
-
119
-
87
-static void xlnx_ep108_machine_init_register_types(void)
120
-static void exynos4210_irq_gate_register_types(void)
88
-{
121
-{
89
- type_register_static(&xlnx_ep108_machine_init_typeinfo);
122
- type_register_static(&exynos4210_irq_gate_info);
90
-}
123
-}
91
-
124
-
92
-static void xlnx_zcu102_init(MachineState *machine)
125
-type_init(exynos4210_irq_gate_register_types)
93
-{
94
- XlnxZCU102 *s = ZCU102_MACHINE(machine);
95
-
96
- xlnx_zynqmp_init(s, machine);
97
-}
98
-
99
static void xlnx_zcu102_machine_instance_init(Object *obj)
100
{
101
XlnxZCU102 *s = ZCU102_MACHINE(obj);
102
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_init_register_types(void)
103
}
104
105
type_init(xlnx_zcu102_machine_init_register_types)
106
-type_init(xlnx_ep108_machine_init_register_types)
107
diff --git a/qemu-doc.texi b/qemu-doc.texi
108
index XXXXXXX..XXXXXXX 100644
109
--- a/qemu-doc.texi
110
+++ b/qemu-doc.texi
111
@@ -XXX,XX +XXX,XX @@ support page sizes < 4096 any longer.
112
113
@section System emulator machines
114
115
-@subsection Xilinx EP108 (since 2.11.0)
116
-
117
-The ``xlnx-ep108'' machine has been replaced by the ``xlnx-zcu102'' machine.
118
-The ``xlnx-zcu102'' machine has the same features and capabilites in QEMU.
119
-
120
@section Block device options
121
122
@subsection "backing": "" (since 2.12.0)
123
--
126
--
124
2.17.1
127
2.25.1
125
126
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The exynos4210 SoC mostly creates its child devices as if it were
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.
2
6
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Acked-by: David Gibson <david@gibson.dropbear.id.au>
5
Message-id: 20180606152128.449-5-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
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
7
---
10
---
8
hw/ppc/pnv_core.c | 4 ++--
11
include/hw/arm/exynos4210.h | 2 ++
9
1 file changed, 2 insertions(+), 2 deletions(-)
12
hw/arm/exynos4210.c | 11 ++++++-----
13
2 files changed, 8 insertions(+), 5 deletions(-)
10
14
11
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
15
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/ppc/pnv_core.c
17
--- a/include/hw/arm/exynos4210.h
14
+++ b/hw/ppc/pnv_core.c
18
+++ b/include/hw/arm/exynos4210.h
15
@@ -XXX,XX +XXX,XX @@ static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr,
19
@@ -XXX,XX +XXX,XX @@
16
val = 0x24f000000000000ull;
20
17
break;
21
#include "hw/or-irq.h"
18
default:
22
#include "hw/sysbus.h"
19
- qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx,
23
+#include "hw/cpu/a9mpcore.h"
20
+ qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx "\n",
24
#include "target/arm/cpu-qom.h"
21
addr);
25
#include "qom/object.h"
26
27
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
28
I2CBus *i2c_if[EXYNOS4210_I2C_NUMBER];
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)
22
}
40
}
23
41
24
@@ -XXX,XX +XXX,XX @@ static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr,
42
/* Private memory region and Internal GIC */
25
static void pnv_core_xscom_write(void *opaque, hwaddr addr, uint64_t val,
43
- dev = qdev_new(TYPE_A9MPCORE_PRIV);
26
unsigned int width)
44
- qdev_prop_set_uint32(dev, "num-cpu", EXYNOS4210_NCPUS);
27
{
45
- busdev = SYS_BUS_DEVICE(dev);
28
- qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx,
46
- sysbus_realize_and_unref(busdev, &error_fatal);
29
+ qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx "\n",
47
+ qdev_prop_set_uint32(DEVICE(&s->a9mpcore), "num-cpu", EXYNOS4210_NCPUS);
30
addr);
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);
31
}
67
}
32
68
69
static void exynos4210_class_init(ObjectClass *klass, void *data)
33
--
70
--
34
2.17.1
71
2.25.1
35
36
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
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.
2
8
3
The initial implementation is based on the Specs v1.10 (see a1bb27b1e98).
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(-)
4
16
5
However the SCR is anouncing the card being v1.01.
17
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
6
7
The new chapters added in version 1.10 are:
8
9
4.3.10 Switch function command
10
11
Switch function command (CMD6) 1 is used to switch or expand
12
memory card functions. [...]
13
This is a new feature, introduced in SD physical Layer
14
Specification Version 1.10. Therefore, cards that are
15
compatible with earlier versions of the spec do not support
16
it. The host shall check the "SD_SPEC" field in the SCR
17
register to recognize what version of the spec the card
18
complies with before using CMD6. It is mandatory for SD
19
memory card of Ver1.10 to support CMD6.
20
21
4.3.11 High-Speed mode (25MB/sec interface speed)
22
23
Though the Rev 1.01 SD memory card supports up to 12.5MB/sec
24
interface speed, the speed of 25MB/sec is necessary to support
25
increasing performance needs of the host and because of memory
26
size which continues to grow.
27
To achieve 25MB/sec interface speed, clock rate is increased to
28
50MHz and CLK/CMD/DAT signal timing and circuit conditions are
29
reconsidered and changed from Physical Layer Specification
30
Version 1.01.
31
32
4.3.12 Command system (This chapter is newly added in version 1.10)
33
34
SD commands CMD34-37, CMD50, CMD57 are reserved for SD command
35
system expansion via the switch command.
36
[These commands] will be considered as illegal commands (as
37
defined in revision 1.01 of the SD physical layer specification).
38
39
The SWITCH_FUNCTION is implemented since the first commit, a1bb27b1e98.
40
41
The 25MB/sec High-Speed mode was already updated in d7ecb867529.
42
43
The current implementation does not implements CMD34-37, CMD50 and
44
CMD57, thus these commands already return ILLEGAL.
45
46
With this patch, the SCR register now matches the description of the header:
47
48
* SD Memory Card emulation as defined in the "SD Memory Card Physical
49
* layer specification, Version 1.10."
50
51
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
52
Message-id: 20180607180641.874-2-f4bug@amsat.org
53
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
54
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
55
---
56
hw/sd/sd.c | 4 ++--
57
1 file changed, 2 insertions(+), 2 deletions(-)
58
59
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
60
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/sd/sd.c
19
--- a/include/hw/arm/exynos4210.h
62
+++ b/hw/sd/sd.c
20
+++ b/include/hw/arm/exynos4210.h
63
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
21
@@ -XXX,XX +XXX,XX @@
64
22
typedef struct Exynos4210Irq {
65
static void sd_set_scr(SDState *sd)
23
qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
66
{
24
qemu_irq ext_combiner_irq[EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ];
67
- sd->scr[0] = (0 << 4) /* SCR version 1.0 */
25
- qemu_irq int_gic_irq[EXYNOS4210_INT_GIC_NIRQ];
68
- | 0; /* Spec Versions 1.0 and 1.01 */
26
qemu_irq ext_gic_irq[EXYNOS4210_EXT_GIC_NIRQ];
69
+ sd->scr[0] = (0 << 4) /* SCR structure version 1.0 */
27
qemu_irq board_irqs[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
70
+ | 1; /* Spec Version 1.10 */
28
} Exynos4210Irq;
71
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
29
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
72
| 0b0101; /* 1-bit or 4-bit width bus modes */
30
index XXXXXXX..XXXXXXX 100644
73
sd->scr[2] = 0x00; /* Extended Security is not supported. */
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);
74
--
53
--
75
2.17.1
54
2.25.1
76
77
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The exynos4210 code currently has two very similar arrays of IRQs:
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
* board_irqs is a field of the Exynos4210Irq struct which is filled
4
Message-id: 20180606152128.449-7-f4bug@amsat.org
4
in by exynos4210_init_board_irqs() with the appropriate qemu_irqs
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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
11
The extra indirection through irq_table is unnecessary, so coalesce
12
these into a single irq_table[] array as a direct field in
13
Exynos4210State which exynos4210_init_board_irqs() fills in.
14
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20220404154658.565020-6-peter.maydell@linaro.org
7
---
18
---
8
hw/mips/boston.c | 8 ++++----
19
include/hw/arm/exynos4210.h | 8 ++------
9
1 file changed, 4 insertions(+), 4 deletions(-)
20
hw/arm/exynos4210.c | 6 +-----
21
hw/intc/exynos4210_gic.c | 32 ++++++++------------------------
22
3 files changed, 11 insertions(+), 35 deletions(-)
10
23
11
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
24
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
12
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/mips/boston.c
26
--- a/include/hw/arm/exynos4210.h
14
+++ b/hw/mips/boston.c
27
+++ b/include/hw/arm/exynos4210.h
15
@@ -XXX,XX +XXX,XX @@ static uint64_t boston_platreg_read(void *opaque, hwaddr addr,
28
@@ -XXX,XX +XXX,XX @@ typedef struct Exynos4210Irq {
16
uint32_t gic_freq, val;
29
qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
17
30
qemu_irq ext_combiner_irq[EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ];
18
if (size != 4) {
31
qemu_irq ext_gic_irq[EXYNOS4210_EXT_GIC_NIRQ];
19
- qemu_log_mask(LOG_UNIMP, "%uB platform register read", size);
32
- qemu_irq board_irqs[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
20
+ qemu_log_mask(LOG_UNIMP, "%uB platform register read\n", size);
33
} Exynos4210Irq;
21
return 0;
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);
22
}
65
}
23
66
24
@@ -XXX,XX +XXX,XX @@ static uint64_t boston_platreg_read(void *opaque, hwaddr addr,
67
- /*** IRQs ***/
25
val |= PLAT_DDR_CFG_MHZ;
68
-
26
return val;
69
- s->irq_table = exynos4210_init_irq(&s->irqs);
27
default:
70
-
28
- qemu_log_mask(LOG_UNIMP, "Read platform register 0x%" HWADDR_PRIx,
71
/* IRQ Gate */
29
+ qemu_log_mask(LOG_UNIMP, "Read platform register 0x%" HWADDR_PRIx "\n",
72
for (i = 0; i < EXYNOS4210_NCPUS; i++) {
30
addr & 0xffff);
73
DeviceState *orgate = DEVICE(&s->cpu_irq_orgate[i]);
31
return 0;
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
-
108
/*
109
* Initialize board IRQs.
110
* These IRQs contain splitted Int/External Combiner and External Gic IRQs.
111
*/
112
-void exynos4210_init_board_irqs(Exynos4210Irq *s)
113
+void exynos4210_init_board_irqs(Exynos4210State *s)
114
{
115
uint32_t grp, bit, irq_id, n;
116
+ Exynos4210Irq *is = &s->irqs;
117
118
for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
119
irq_id = 0;
120
@@ -XXX,XX +XXX,XX @@ void exynos4210_init_board_irqs(Exynos4210Irq *s)
121
irq_id = EXT_GIC_ID_MCT_G1;
122
}
123
if (irq_id) {
124
- s->board_irqs[n] = qemu_irq_split(s->int_combiner_irq[n],
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
}
32
}
134
}
33
@@ -XXX,XX +XXX,XX @@ static void boston_platreg_write(void *opaque, hwaddr addr,
135
for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
34
uint64_t val, unsigned size)
136
@@ -XXX,XX +XXX,XX @@ void exynos4210_init_board_irqs(Exynos4210Irq *s)
35
{
137
EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][bit];
36
if (size != 4) {
138
37
- qemu_log_mask(LOG_UNIMP, "%uB platform register write", size);
139
if (irq_id) {
38
+ qemu_log_mask(LOG_UNIMP, "%uB platform register write\n", size);
140
- s->board_irqs[n] = qemu_irq_split(s->int_combiner_irq[n],
39
return;
141
- s->ext_gic_irq[irq_id-32]);
40
}
142
+ s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
41
143
+ is->ext_gic_irq[irq_id - 32]);
42
@@ -XXX,XX +XXX,XX @@ static void boston_platreg_write(void *opaque, hwaddr addr,
144
}
43
break;
44
default:
45
qemu_log_mask(LOG_UNIMP, "Write platform register 0x%" HWADDR_PRIx
46
- " = 0x%" PRIx64, addr & 0xffff, val);
47
+ " = 0x%" PRIx64 "\n", addr & 0xffff, val);
48
break;
49
}
145
}
50
}
146
}
51
--
147
--
52
2.17.1
148
2.25.1
53
54
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Fix a missing set of spaces around '-' in the definition of
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.
2
5
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
5
Message-id: 20180606152128.449-10-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
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
7
---
9
---
8
target/m68k/translate.c | 2 +-
10
hw/intc/exynos4210_gic.c | 2 +-
9
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
10
12
11
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
13
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/target/m68k/translate.c
15
--- a/hw/intc/exynos4210_gic.c
14
+++ b/target/m68k/translate.c
16
+++ b/hw/intc/exynos4210_gic.c
15
@@ -XXX,XX +XXX,XX @@ DISAS_INSN(undef)
17
@@ -XXX,XX +XXX,XX @@ enum ExtInt {
16
/* ??? This is both instructions that are as yet unimplemented
18
*/
17
for the 680x0 series, as well as those that are implemented
19
18
but actually illegal for CPU32 or pre-68020. */
20
static const uint32_t
19
- qemu_log_mask(LOG_UNIMP, "Illegal instruction: %04x @ %08x",
21
-combiner_grp_to_gic_id[64-EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
20
+ qemu_log_mask(LOG_UNIMP, "Illegal instruction: %04x @ %08x\n",
22
+combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
21
insn, s->insn_pc);
23
/* int combiner groups 16-19 */
22
gen_exception(s, s->insn_pc, EXCP_UNSUPPORTED);
24
{ }, { }, { }, { },
23
}
25
/* int combiner group 20 */
24
--
26
--
25
2.17.1
27
2.25.1
26
27
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
The function exynos4210_init_board_irqs() currently lives in
2
exynos4210_gic.c, but it isn't really part of the exynos4210.gic
3
device -- it is a function that implements (some of) the wiring up of
4
interrupts between the SoC's GIC and combiner components. This means
5
it fits better in exynos4210.c, which is the SoC-level code. Move it
6
there. Similarly, exynos4210_git_irq() is used almost only in the
7
SoC-level code, so move it too.
2
8
3
Specs are available here :
9
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
include/hw/arm/exynos4210.h | 4 -
14
hw/arm/exynos4210.c | 202 +++++++++++++++++++++++++++++++++++
15
hw/intc/exynos4210_gic.c | 204 ------------------------------------
16
3 files changed, 202 insertions(+), 208 deletions(-)
4
17
5
https://www.nxp.com/docs/en/application-note/AN264.pdf
18
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
6
7
This is a simple model supporting the basic registers for led and GPIO
8
mode. The device also supports two blinking rates but not the model
9
yet.
10
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20180530064049.27976-7-clg@kaod.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/misc/Makefile.objs | 1 +
18
tests/Makefile.include | 2 +
19
include/hw/misc/pca9552.h | 32 +++++
20
include/hw/misc/pca9552_regs.h | 32 +++++
21
tests/libqos/i2c.h | 2 +
22
hw/misc/pca9552.c | 240 ++++++++++++++++++++++++++++++++
23
tests/pca9552-test.c | 116 +++++++++++++++
24
tests/tmp105-test.c | 2 -
25
default-configs/arm-softmmu.mak | 1 +
26
9 files changed, 426 insertions(+), 2 deletions(-)
27
create mode 100644 include/hw/misc/pca9552.h
28
create mode 100644 include/hw/misc/pca9552_regs.h
29
create mode 100644 hw/misc/pca9552.c
30
create mode 100644 tests/pca9552-test.c
31
32
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
33
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/misc/Makefile.objs
20
--- a/include/hw/arm/exynos4210.h
35
+++ b/hw/misc/Makefile.objs
21
+++ b/include/hw/arm/exynos4210.h
36
@@ -XXX,XX +XXX,XX @@ common-obj-$(CONFIG_SGA) += sga.o
22
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210State, EXYNOS4210_SOC)
37
common-obj-$(CONFIG_ISA_TESTDEV) += pc-testdev.o
23
void exynos4210_write_secondary(ARMCPU *cpu,
38
common-obj-$(CONFIG_PCI_TESTDEV) += pci-testdev.o
24
const struct arm_boot_info *info);
39
common-obj-$(CONFIG_EDU) += edu.o
25
40
+common-obj-$(CONFIG_PCA9552) += pca9552.o
26
-/* Initialize board IRQs.
41
27
- * These IRQs contain splitted Int/External Combiner and External Gic IRQs */
42
common-obj-y += unimp.o
28
-void exynos4210_init_board_irqs(Exynos4210State *s);
43
common-obj-$(CONFIG_FW_CFG_DMA) += vmcoreinfo.o
29
-
44
diff --git a/tests/Makefile.include b/tests/Makefile.include
30
/* Get IRQ number from exynos4210 IRQ subsystem stub.
31
* To identify IRQ source use internal combiner group and bit number
32
* grp - group number
33
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
45
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
46
--- a/tests/Makefile.include
35
--- a/hw/arm/exynos4210.c
47
+++ b/tests/Makefile.include
36
+++ b/hw/arm/exynos4210.c
48
@@ -XXX,XX +XXX,XX @@ check-qtest-sparc64-y += tests/prom-env-test$(EXESUF)
49
check-qtest-sparc64-y += tests/boot-serial-test$(EXESUF)
50
51
check-qtest-arm-y = tests/tmp105-test$(EXESUF)
52
+check-qtest-arm-y += tests/pca9552-test$(EXESUF)
53
check-qtest-arm-y += tests/ds1338-test$(EXESUF)
54
check-qtest-arm-y += tests/m25p80-test$(EXESUF)
55
gcov-files-arm-y += hw/misc/tmp105.c
56
@@ -XXX,XX +XXX,XX @@ tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \
57
    tests/boot-sector.o tests/acpi-utils.o $(libqos-obj-y)
58
tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y)
59
tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y)
60
+tests/pca9552-test$(EXESUF): tests/pca9552-test.o $(libqos-omap-obj-y)
61
tests/ds1338-test$(EXESUF): tests/ds1338-test.o $(libqos-imx-obj-y)
62
tests/m25p80-test$(EXESUF): tests/m25p80-test.o
63
tests/i440fx-test$(EXESUF): tests/i440fx-test.o $(libqos-pc-obj-y)
64
diff --git a/include/hw/misc/pca9552.h b/include/hw/misc/pca9552.h
65
new file mode 100644
66
index XXXXXXX..XXXXXXX
67
--- /dev/null
68
+++ b/include/hw/misc/pca9552.h
69
@@ -XXX,XX +XXX,XX @@
37
@@ -XXX,XX +XXX,XX @@
38
#define EXYNOS4210_PL330_BASE1_ADDR 0x12690000
39
#define EXYNOS4210_PL330_BASE2_ADDR 0x12850000
40
41
+enum ExtGicId {
42
+ EXT_GIC_ID_MDMA_LCD0 = 66,
43
+ EXT_GIC_ID_PDMA0,
44
+ EXT_GIC_ID_PDMA1,
45
+ EXT_GIC_ID_TIMER0,
46
+ EXT_GIC_ID_TIMER1,
47
+ EXT_GIC_ID_TIMER2,
48
+ EXT_GIC_ID_TIMER3,
49
+ EXT_GIC_ID_TIMER4,
50
+ EXT_GIC_ID_MCT_L0,
51
+ EXT_GIC_ID_WDT,
52
+ EXT_GIC_ID_RTC_ALARM,
53
+ EXT_GIC_ID_RTC_TIC,
54
+ EXT_GIC_ID_GPIO_XB,
55
+ EXT_GIC_ID_GPIO_XA,
56
+ EXT_GIC_ID_MCT_L1,
57
+ EXT_GIC_ID_IEM_APC,
58
+ EXT_GIC_ID_IEM_IEC,
59
+ EXT_GIC_ID_NFC,
60
+ EXT_GIC_ID_UART0,
61
+ EXT_GIC_ID_UART1,
62
+ EXT_GIC_ID_UART2,
63
+ EXT_GIC_ID_UART3,
64
+ EXT_GIC_ID_UART4,
65
+ EXT_GIC_ID_MCT_G0,
66
+ EXT_GIC_ID_I2C0,
67
+ EXT_GIC_ID_I2C1,
68
+ EXT_GIC_ID_I2C2,
69
+ EXT_GIC_ID_I2C3,
70
+ EXT_GIC_ID_I2C4,
71
+ EXT_GIC_ID_I2C5,
72
+ EXT_GIC_ID_I2C6,
73
+ EXT_GIC_ID_I2C7,
74
+ EXT_GIC_ID_SPI0,
75
+ EXT_GIC_ID_SPI1,
76
+ EXT_GIC_ID_SPI2,
77
+ EXT_GIC_ID_MCT_G1,
78
+ EXT_GIC_ID_USB_HOST,
79
+ EXT_GIC_ID_USB_DEVICE,
80
+ EXT_GIC_ID_MODEMIF,
81
+ EXT_GIC_ID_HSMMC0,
82
+ EXT_GIC_ID_HSMMC1,
83
+ EXT_GIC_ID_HSMMC2,
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
+
70
+/*
125
+/*
71
+ * PCA9552 I2C LED blinker
126
+ * External GIC sources which are not from External Interrupt Combiner or
72
+ *
127
+ * External Interrupts are starting from EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ,
73
+ * Copyright (c) 2017-2018, IBM Corporation.
128
+ * which is INTG16 in Internal Interrupt Combiner.
74
+ *
75
+ * This work is licensed under the terms of the GNU GPL, version 2 or
76
+ * later. See the COPYING file in the top-level directory.
77
+ */
129
+ */
78
+#ifndef PCA9552_H
130
+
79
+#define PCA9552_H
131
+static const uint32_t
80
+
132
+combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
81
+#include "hw/i2c/i2c.h"
133
+ /* int combiner groups 16-19 */
82
+
134
+ { }, { }, { }, { },
83
+#define TYPE_PCA9552 "pca9552"
135
+ /* int combiner group 20 */
84
+#define PCA9552(obj) OBJECT_CHECK(PCA9552State, (obj), TYPE_PCA9552)
136
+ { 0, EXT_GIC_ID_MDMA_LCD0 },
85
+
137
+ /* int combiner group 21 */
86
+#define PCA9552_NR_REGS 10
138
+ { EXT_GIC_ID_PDMA0, EXT_GIC_ID_PDMA1 },
87
+
139
+ /* int combiner group 22 */
88
+typedef struct PCA9552State {
140
+ { EXT_GIC_ID_TIMER0, EXT_GIC_ID_TIMER1, EXT_GIC_ID_TIMER2,
89
+ /*< private >*/
141
+ EXT_GIC_ID_TIMER3, EXT_GIC_ID_TIMER4 },
90
+ I2CSlave i2c;
142
+ /* int combiner group 23 */
91
+ /*< public >*/
143
+ { EXT_GIC_ID_RTC_ALARM, EXT_GIC_ID_RTC_TIC },
92
+
144
+ /* int combiner group 24 */
93
+ uint8_t len;
145
+ { EXT_GIC_ID_GPIO_XB, EXT_GIC_ID_GPIO_XA },
94
+ uint8_t pointer;
146
+ /* int combiner group 25 */
95
+
147
+ { EXT_GIC_ID_IEM_APC, EXT_GIC_ID_IEM_IEC },
96
+ uint8_t regs[PCA9552_NR_REGS];
148
+ /* int combiner group 26 */
97
+ uint8_t max_reg;
149
+ { EXT_GIC_ID_UART0, EXT_GIC_ID_UART1, EXT_GIC_ID_UART2, EXT_GIC_ID_UART3,
98
+ uint8_t nr_leds;
150
+ EXT_GIC_ID_UART4 },
99
+} PCA9552State;
151
+ /* int combiner group 27 */
100
+
152
+ { EXT_GIC_ID_I2C0, EXT_GIC_ID_I2C1, EXT_GIC_ID_I2C2, EXT_GIC_ID_I2C3,
101
+#endif
153
+ EXT_GIC_ID_I2C4, EXT_GIC_ID_I2C5, EXT_GIC_ID_I2C6,
102
diff --git a/include/hw/misc/pca9552_regs.h b/include/hw/misc/pca9552_regs.h
154
+ EXT_GIC_ID_I2C7 },
103
new file mode 100644
155
+ /* int combiner group 28 */
104
index XXXXXXX..XXXXXXX
156
+ { EXT_GIC_ID_SPI0, EXT_GIC_ID_SPI1, EXT_GIC_ID_SPI2 , EXT_GIC_ID_USB_HOST},
105
--- /dev/null
157
+ /* int combiner group 29 */
106
+++ b/include/hw/misc/pca9552_regs.h
158
+ { EXT_GIC_ID_HSMMC0, EXT_GIC_ID_HSMMC1, EXT_GIC_ID_HSMMC2,
107
@@ -XXX,XX +XXX,XX @@
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
+
108
+/*
189
+/*
109
+ * PCA9552 I2C LED blinker registers
190
+ * Initialize board IRQs.
110
+ *
191
+ * These IRQs contain splitted Int/External Combiner and External Gic IRQs.
111
+ * Copyright (c) 2017-2018, IBM Corporation.
112
+ *
113
+ * This work is licensed under the terms of the GNU GPL, version 2 or
114
+ * later. See the COPYING file in the top-level directory.
115
+ */
192
+ */
116
+#ifndef PCA9552_REGS_H
193
+static void exynos4210_init_board_irqs(Exynos4210State *s)
117
+#define PCA9552_REGS_H
118
+
119
+/*
120
+ * Bits [0:3] are used to address a specific register.
121
+ */
122
+#define PCA9552_INPUT0 0 /* read only input register 0 */
123
+#define PCA9552_INPUT1 1 /* read only input register 1 */
124
+#define PCA9552_PSC0 2 /* read/write frequency prescaler 0 */
125
+#define PCA9552_PWM0 3 /* read/write PWM register 0 */
126
+#define PCA9552_PSC1 4 /* read/write frequency prescaler 1 */
127
+#define PCA9552_PWM1 5 /* read/write PWM register 1 */
128
+#define PCA9552_LS0 6 /* read/write LED0 to LED3 selector */
129
+#define PCA9552_LS1 7 /* read/write LED4 to LED7 selector */
130
+#define PCA9552_LS2 8 /* read/write LED8 to LED11 selector */
131
+#define PCA9552_LS3 9 /* read/write LED12 to LED15 selector */
132
+
133
+/*
134
+ * Bit [4] is used to activate the Auto-Increment option of the
135
+ * register address
136
+ */
137
+#define PCA9552_AUTOINC (1 << 4)
138
+
139
+#endif
140
diff --git a/tests/libqos/i2c.h b/tests/libqos/i2c.h
141
index XXXXXXX..XXXXXXX 100644
142
--- a/tests/libqos/i2c.h
143
+++ b/tests/libqos/i2c.h
144
@@ -XXX,XX +XXX,XX @@ struct I2CAdapter {
145
QTestState *qts;
146
};
147
148
+#define OMAP2_I2C_1_BASE 0x48070000
149
+
150
void i2c_send(I2CAdapter *i2c, uint8_t addr,
151
const uint8_t *buf, uint16_t len);
152
void i2c_recv(I2CAdapter *i2c, uint8_t addr,
153
diff --git a/hw/misc/pca9552.c b/hw/misc/pca9552.c
154
new file mode 100644
155
index XXXXXXX..XXXXXXX
156
--- /dev/null
157
+++ b/hw/misc/pca9552.c
158
@@ -XXX,XX +XXX,XX @@
159
+/*
160
+ * PCA9552 I2C LED blinker
161
+ *
162
+ * https://www.nxp.com/docs/en/application-note/AN264.pdf
163
+ *
164
+ * Copyright (c) 2017-2018, IBM Corporation.
165
+ *
166
+ * This work is licensed under the terms of the GNU GPL, version 2 or
167
+ * later. See the COPYING file in the top-level directory.
168
+ */
169
+
170
+#include "qemu/osdep.h"
171
+#include "qemu/log.h"
172
+#include "hw/hw.h"
173
+#include "hw/misc/pca9552.h"
174
+#include "hw/misc/pca9552_regs.h"
175
+
176
+#define PCA9552_LED_ON 0x0
177
+#define PCA9552_LED_OFF 0x1
178
+#define PCA9552_LED_PWM0 0x2
179
+#define PCA9552_LED_PWM1 0x3
180
+
181
+static uint8_t pca9552_pin_get_config(PCA9552State *s, int pin)
182
+{
194
+{
183
+ uint8_t reg = PCA9552_LS0 + (pin / 4);
195
+ uint32_t grp, bit, irq_id, n;
184
+ uint8_t shift = (pin % 4) << 1;
196
+ Exynos4210Irq *is = &s->irqs;
185
+
197
+
186
+ return extract32(s->regs[reg], shift, 2);
198
+ for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
187
+}
199
+ irq_id = 0;
188
+
200
+ if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 4) ||
189
+static void pca9552_update_pin_input(PCA9552State *s)
201
+ n == EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 4)) {
190
+{
202
+ /* MCT_G0 is passed to External GIC */
191
+ int i;
203
+ irq_id = EXT_GIC_ID_MCT_G0;
192
+
204
+ }
193
+ for (i = 0; i < s->nr_leds; i++) {
205
+ if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 5) ||
194
+ uint8_t input_reg = PCA9552_INPUT0 + (i / 8);
206
+ n == EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 5)) {
195
+ uint8_t input_shift = (i % 8);
207
+ /* MCT_G1 is passed to External and GIC */
196
+ uint8_t config = pca9552_pin_get_config(s, i);
208
+ irq_id = EXT_GIC_ID_MCT_G1;
197
+
209
+ }
198
+ switch (config) {
210
+ if (irq_id) {
199
+ case PCA9552_LED_ON:
211
+ s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
200
+ s->regs[input_reg] |= 1 << input_shift;
212
+ is->ext_gic_irq[irq_id - 32]);
201
+ break;
213
+ } else {
202
+ case PCA9552_LED_OFF:
214
+ s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
203
+ s->regs[input_reg] &= ~(1 << input_shift);
215
+ is->ext_combiner_irq[n]);
204
+ break;
216
+ }
205
+ case PCA9552_LED_PWM0:
217
+ }
206
+ case PCA9552_LED_PWM1:
218
+ for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
207
+ /* TODO */
219
+ /* these IDs are passed to Internal Combiner and External GIC */
208
+ default:
220
+ grp = EXYNOS4210_COMBINER_GET_GRP_NUM(n);
209
+ break;
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]);
210
+ }
228
+ }
211
+ }
229
+ }
212
+}
230
+}
213
+
231
+
214
+static uint8_t pca9552_read(PCA9552State *s, uint8_t reg)
232
+/*
233
+ * Get IRQ number from exynos4210 IRQ subsystem stub.
234
+ * To identify IRQ source use internal combiner group and bit number
235
+ * grp - group number
236
+ * bit - bit number inside group
237
+ */
238
+uint32_t exynos4210_get_irq(uint32_t grp, uint32_t bit)
215
+{
239
+{
216
+ switch (reg) {
240
+ return EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit);
217
+ case PCA9552_INPUT0:
218
+ case PCA9552_INPUT1:
219
+ case PCA9552_PSC0:
220
+ case PCA9552_PWM0:
221
+ case PCA9552_PSC1:
222
+ case PCA9552_PWM1:
223
+ case PCA9552_LS0:
224
+ case PCA9552_LS1:
225
+ case PCA9552_LS2:
226
+ case PCA9552_LS3:
227
+ return s->regs[reg];
228
+ default:
229
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: unexpected read to register %d\n",
230
+ __func__, reg);
231
+ return 0xFF;
232
+ }
233
+}
241
+}
234
+
242
+
235
+static void pca9552_write(PCA9552State *s, uint8_t reg, uint8_t data)
243
static uint8_t chipid_and_omr[] = { 0x11, 0x02, 0x21, 0x43,
236
+{
244
0x09, 0x00, 0x00, 0x00 };
237
+ switch (reg) {
245
238
+ case PCA9552_PSC0:
246
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
239
+ case PCA9552_PWM0:
247
index XXXXXXX..XXXXXXX 100644
240
+ case PCA9552_PSC1:
248
--- a/hw/intc/exynos4210_gic.c
241
+ case PCA9552_PWM1:
249
+++ b/hw/intc/exynos4210_gic.c
242
+ s->regs[reg] = data;
243
+ break;
244
+
245
+ case PCA9552_LS0:
246
+ case PCA9552_LS1:
247
+ case PCA9552_LS2:
248
+ case PCA9552_LS3:
249
+ s->regs[reg] = data;
250
+ pca9552_update_pin_input(s);
251
+ break;
252
+
253
+ case PCA9552_INPUT0:
254
+ case PCA9552_INPUT1:
255
+ default:
256
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: unexpected write to register %d\n",
257
+ __func__, reg);
258
+ }
259
+}
260
+
261
+/*
262
+ * When Auto-Increment is on, the register address is incremented
263
+ * after each byte is sent to or received by the device. The index
264
+ * rollovers to 0 when the maximum register address is reached.
265
+ */
266
+static void pca9552_autoinc(PCA9552State *s)
267
+{
268
+ if (s->pointer != 0xFF && s->pointer & PCA9552_AUTOINC) {
269
+ uint8_t reg = s->pointer & 0xf;
270
+
271
+ reg = (reg + 1) % (s->max_reg + 1);
272
+ s->pointer = reg | PCA9552_AUTOINC;
273
+ }
274
+}
275
+
276
+static int pca9552_recv(I2CSlave *i2c)
277
+{
278
+ PCA9552State *s = PCA9552(i2c);
279
+ uint8_t ret;
280
+
281
+ ret = pca9552_read(s, s->pointer & 0xf);
282
+
283
+ /*
284
+ * From the Specs:
285
+ *
286
+ * Important Note: When a Read sequence is initiated and the
287
+ * AI bit is set to Logic Level 1, the Read Sequence MUST
288
+ * start by a register different from 0.
289
+ *
290
+ * I don't know what should be done in this case, so throw an
291
+ * error.
292
+ */
293
+ if (s->pointer == PCA9552_AUTOINC) {
294
+ qemu_log_mask(LOG_GUEST_ERROR,
295
+ "%s: Autoincrement read starting with register 0\n",
296
+ __func__);
297
+ }
298
+
299
+ pca9552_autoinc(s);
300
+
301
+ return ret;
302
+}
303
+
304
+static int pca9552_send(I2CSlave *i2c, uint8_t data)
305
+{
306
+ PCA9552State *s = PCA9552(i2c);
307
+
308
+ /* First byte sent by is the register address */
309
+ if (s->len == 0) {
310
+ s->pointer = data;
311
+ s->len++;
312
+ } else {
313
+ pca9552_write(s, s->pointer & 0xf, data);
314
+
315
+ pca9552_autoinc(s);
316
+ }
317
+
318
+ return 0;
319
+}
320
+
321
+static int pca9552_event(I2CSlave *i2c, enum i2c_event event)
322
+{
323
+ PCA9552State *s = PCA9552(i2c);
324
+
325
+ s->len = 0;
326
+ return 0;
327
+}
328
+
329
+static const VMStateDescription pca9552_vmstate = {
330
+ .name = "PCA9552",
331
+ .version_id = 0,
332
+ .minimum_version_id = 0,
333
+ .fields = (VMStateField[]) {
334
+ VMSTATE_UINT8(len, PCA9552State),
335
+ VMSTATE_UINT8(pointer, PCA9552State),
336
+ VMSTATE_UINT8_ARRAY(regs, PCA9552State, PCA9552_NR_REGS),
337
+ VMSTATE_I2C_SLAVE(i2c, PCA9552State),
338
+ VMSTATE_END_OF_LIST()
339
+ }
340
+};
341
+
342
+static void pca9552_reset(DeviceState *dev)
343
+{
344
+ PCA9552State *s = PCA9552(dev);
345
+
346
+ s->regs[PCA9552_PSC0] = 0xFF;
347
+ s->regs[PCA9552_PWM0] = 0x80;
348
+ s->regs[PCA9552_PSC1] = 0xFF;
349
+ s->regs[PCA9552_PWM1] = 0x80;
350
+ s->regs[PCA9552_LS0] = 0x55; /* all OFF */
351
+ s->regs[PCA9552_LS1] = 0x55;
352
+ s->regs[PCA9552_LS2] = 0x55;
353
+ s->regs[PCA9552_LS3] = 0x55;
354
+
355
+ pca9552_update_pin_input(s);
356
+
357
+ s->pointer = 0xFF;
358
+ s->len = 0;
359
+}
360
+
361
+static void pca9552_initfn(Object *obj)
362
+{
363
+ PCA9552State *s = PCA9552(obj);
364
+
365
+ /* If support for the other PCA955X devices are implemented, these
366
+ * constant values might be part of class structure describing the
367
+ * PCA955X device
368
+ */
369
+ s->max_reg = PCA9552_LS3;
370
+ s->nr_leds = 16;
371
+}
372
+
373
+static void pca9552_class_init(ObjectClass *klass, void *data)
374
+{
375
+ DeviceClass *dc = DEVICE_CLASS(klass);
376
+ I2CSlaveClass *k = I2C_SLAVE_CLASS(klass);
377
+
378
+ k->event = pca9552_event;
379
+ k->recv = pca9552_recv;
380
+ k->send = pca9552_send;
381
+ dc->reset = pca9552_reset;
382
+ dc->vmsd = &pca9552_vmstate;
383
+}
384
+
385
+static const TypeInfo pca9552_info = {
386
+ .name = TYPE_PCA9552,
387
+ .parent = TYPE_I2C_SLAVE,
388
+ .instance_init = pca9552_initfn,
389
+ .instance_size = sizeof(PCA9552State),
390
+ .class_init = pca9552_class_init,
391
+};
392
+
393
+static void pca9552_register_types(void)
394
+{
395
+ type_register_static(&pca9552_info);
396
+}
397
+
398
+type_init(pca9552_register_types)
399
diff --git a/tests/pca9552-test.c b/tests/pca9552-test.c
400
new file mode 100644
401
index XXXXXXX..XXXXXXX
402
--- /dev/null
403
+++ b/tests/pca9552-test.c
404
@@ -XXX,XX +XXX,XX @@
250
@@ -XXX,XX +XXX,XX @@
405
+/*
251
#include "hw/arm/exynos4210.h"
406
+ * QTest testcase for the PCA9552 LED blinker
252
#include "qom/object.h"
407
+ *
253
408
+ * Copyright (c) 2017-2018, IBM Corporation.
254
-enum ExtGicId {
409
+ *
255
- EXT_GIC_ID_MDMA_LCD0 = 66,
410
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
256
- EXT_GIC_ID_PDMA0,
411
+ * See the COPYING file in the top-level directory.
257
- EXT_GIC_ID_PDMA1,
412
+ */
258
- EXT_GIC_ID_TIMER0,
413
+
259
- EXT_GIC_ID_TIMER1,
414
+#include "qemu/osdep.h"
260
- EXT_GIC_ID_TIMER2,
415
+
261
- EXT_GIC_ID_TIMER3,
416
+#include "libqtest.h"
262
- EXT_GIC_ID_TIMER4,
417
+#include "libqos/i2c.h"
263
- EXT_GIC_ID_MCT_L0,
418
+#include "hw/misc/pca9552_regs.h"
264
- EXT_GIC_ID_WDT,
419
+
265
- EXT_GIC_ID_RTC_ALARM,
420
+#define PCA9552_TEST_ID "pca9552-test"
266
- EXT_GIC_ID_RTC_TIC,
421
+#define PCA9552_TEST_ADDR 0x60
267
- EXT_GIC_ID_GPIO_XB,
422
+
268
- EXT_GIC_ID_GPIO_XA,
423
+static I2CAdapter *i2c;
269
- EXT_GIC_ID_MCT_L1,
424
+
270
- EXT_GIC_ID_IEM_APC,
425
+static uint8_t pca9552_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
271
- EXT_GIC_ID_IEM_IEC,
426
+{
272
- EXT_GIC_ID_NFC,
427
+ uint8_t resp[1];
273
- EXT_GIC_ID_UART0,
428
+ i2c_send(i2c, addr, &reg, 1);
274
- EXT_GIC_ID_UART1,
429
+ i2c_recv(i2c, addr, resp, 1);
275
- EXT_GIC_ID_UART2,
430
+ return resp[0];
276
- EXT_GIC_ID_UART3,
431
+}
277
- EXT_GIC_ID_UART4,
432
+
278
- EXT_GIC_ID_MCT_G0,
433
+static void pca9552_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
279
- EXT_GIC_ID_I2C0,
434
+ uint8_t value)
280
- EXT_GIC_ID_I2C1,
435
+{
281
- EXT_GIC_ID_I2C2,
436
+ uint8_t cmd[2];
282
- EXT_GIC_ID_I2C3,
437
+ uint8_t resp[1];
283
- EXT_GIC_ID_I2C4,
438
+
284
- EXT_GIC_ID_I2C5,
439
+ cmd[0] = reg;
285
- EXT_GIC_ID_I2C6,
440
+ cmd[1] = value;
286
- EXT_GIC_ID_I2C7,
441
+ i2c_send(i2c, addr, cmd, 2);
287
- EXT_GIC_ID_SPI0,
442
+ i2c_recv(i2c, addr, resp, 1);
288
- EXT_GIC_ID_SPI1,
443
+ g_assert_cmphex(resp[0], ==, cmd[1]);
289
- EXT_GIC_ID_SPI2,
444
+}
290
- EXT_GIC_ID_MCT_G1,
445
+
291
- EXT_GIC_ID_USB_HOST,
446
+static void receive_autoinc(void)
292
- EXT_GIC_ID_USB_DEVICE,
447
+{
293
- EXT_GIC_ID_MODEMIF,
448
+ uint8_t resp;
294
- EXT_GIC_ID_HSMMC0,
449
+ uint8_t reg = PCA9552_LS0 | PCA9552_AUTOINC;
295
- EXT_GIC_ID_HSMMC1,
450
+
296
- EXT_GIC_ID_HSMMC2,
451
+ i2c_send(i2c, PCA9552_TEST_ADDR, &reg, 1);
297
- EXT_GIC_ID_HSMMC3,
452
+
298
- EXT_GIC_ID_SDMMC,
453
+ /* PCA9552_LS0 */
299
- EXT_GIC_ID_MIPI_CSI_4LANE,
454
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
300
- EXT_GIC_ID_MIPI_DSI_4LANE,
455
+ g_assert_cmphex(resp, ==, 0x54);
301
- EXT_GIC_ID_MIPI_CSI_2LANE,
456
+
302
- EXT_GIC_ID_MIPI_DSI_2LANE,
457
+ /* PCA9552_LS1 */
303
- EXT_GIC_ID_ONENAND_AUDI,
458
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
304
- EXT_GIC_ID_ROTATOR,
459
+ g_assert_cmphex(resp, ==, 0x55);
305
- EXT_GIC_ID_FIMC0,
460
+
306
- EXT_GIC_ID_FIMC1,
461
+ /* PCA9552_LS2 */
307
- EXT_GIC_ID_FIMC2,
462
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
308
- EXT_GIC_ID_FIMC3,
463
+ g_assert_cmphex(resp, ==, 0x55);
309
- EXT_GIC_ID_JPEG,
464
+
310
- EXT_GIC_ID_2D,
465
+ /* PCA9552_LS3 */
311
- EXT_GIC_ID_PCIe,
466
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
312
- EXT_GIC_ID_MIXER,
467
+ g_assert_cmphex(resp, ==, 0x54);
313
- EXT_GIC_ID_HDMI,
468
+}
314
- EXT_GIC_ID_HDMI_I2C,
469
+
315
- EXT_GIC_ID_MFC,
470
+static void send_and_receive(void)
316
- EXT_GIC_ID_TVENC,
471
+{
317
-};
472
+ uint8_t value;
318
-
473
+
319
-enum ExtInt {
474
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
320
- EXT_GIC_ID_EXTINT0 = 48,
475
+ g_assert_cmphex(value, ==, 0x55);
321
- EXT_GIC_ID_EXTINT1,
476
+
322
- EXT_GIC_ID_EXTINT2,
477
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
323
- EXT_GIC_ID_EXTINT3,
478
+ g_assert_cmphex(value, ==, 0x0);
324
- EXT_GIC_ID_EXTINT4,
479
+
325
- EXT_GIC_ID_EXTINT5,
480
+ /* Switch on LED 0 */
326
- EXT_GIC_ID_EXTINT6,
481
+ pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0, 0x54);
327
- EXT_GIC_ID_EXTINT7,
482
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
328
- EXT_GIC_ID_EXTINT8,
483
+ g_assert_cmphex(value, ==, 0x54);
329
- EXT_GIC_ID_EXTINT9,
484
+
330
- EXT_GIC_ID_EXTINT10,
485
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
331
- EXT_GIC_ID_EXTINT11,
486
+ g_assert_cmphex(value, ==, 0x01);
332
- EXT_GIC_ID_EXTINT12,
487
+
333
- EXT_GIC_ID_EXTINT13,
488
+ /* Switch on LED 12 */
334
- EXT_GIC_ID_EXTINT14,
489
+ pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3, 0x54);
335
- EXT_GIC_ID_EXTINT15
490
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3);
336
-};
491
+ g_assert_cmphex(value, ==, 0x54);
337
-
492
+
338
-/*
493
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT1);
339
- * External GIC sources which are not from External Interrupt Combiner or
494
+ g_assert_cmphex(value, ==, 0x10);
340
- * External Interrupts are starting from EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ,
495
+}
341
- * which is INTG16 in Internal Interrupt Combiner.
496
+
342
- */
497
+int main(int argc, char **argv)
343
-
498
+{
344
-static const uint32_t
499
+ QTestState *s = NULL;
345
-combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
500
+ int ret;
346
- /* int combiner groups 16-19 */
501
+
347
- { }, { }, { }, { },
502
+ g_test_init(&argc, &argv, NULL);
348
- /* int combiner group 20 */
503
+
349
- { 0, EXT_GIC_ID_MDMA_LCD0 },
504
+ s = qtest_start("-machine n800 "
350
- /* int combiner group 21 */
505
+ "-device pca9552,bus=i2c-bus.0,id=" PCA9552_TEST_ID
351
- { EXT_GIC_ID_PDMA0, EXT_GIC_ID_PDMA1 },
506
+ ",address=0x60");
352
- /* int combiner group 22 */
507
+ i2c = omap_i2c_create(s, OMAP2_I2C_1_BASE);
353
- { EXT_GIC_ID_TIMER0, EXT_GIC_ID_TIMER1, EXT_GIC_ID_TIMER2,
508
+
354
- EXT_GIC_ID_TIMER3, EXT_GIC_ID_TIMER4 },
509
+ qtest_add_func("/pca9552/tx-rx", send_and_receive);
355
- /* int combiner group 23 */
510
+ qtest_add_func("/pca9552/rx-autoinc", receive_autoinc);
356
- { EXT_GIC_ID_RTC_ALARM, EXT_GIC_ID_RTC_TIC },
511
+
357
- /* int combiner group 24 */
512
+ ret = g_test_run();
358
- { EXT_GIC_ID_GPIO_XB, EXT_GIC_ID_GPIO_XA },
513
+
359
- /* int combiner group 25 */
514
+ if (s) {
360
- { EXT_GIC_ID_IEM_APC, EXT_GIC_ID_IEM_IEC },
515
+ qtest_quit(s);
361
- /* int combiner group 26 */
516
+ }
362
- { EXT_GIC_ID_UART0, EXT_GIC_ID_UART1, EXT_GIC_ID_UART2, EXT_GIC_ID_UART3,
517
+ g_free(i2c);
363
- EXT_GIC_ID_UART4 },
518
+
364
- /* int combiner group 27 */
519
+ return ret;
365
- { EXT_GIC_ID_I2C0, EXT_GIC_ID_I2C1, EXT_GIC_ID_I2C2, EXT_GIC_ID_I2C3,
520
+}
366
- EXT_GIC_ID_I2C4, EXT_GIC_ID_I2C5, EXT_GIC_ID_I2C6,
521
diff --git a/tests/tmp105-test.c b/tests/tmp105-test.c
367
- EXT_GIC_ID_I2C7 },
522
index XXXXXXX..XXXXXXX 100644
368
- /* int combiner group 28 */
523
--- a/tests/tmp105-test.c
369
- { EXT_GIC_ID_SPI0, EXT_GIC_ID_SPI1, EXT_GIC_ID_SPI2 , EXT_GIC_ID_USB_HOST},
524
+++ b/tests/tmp105-test.c
370
- /* int combiner group 29 */
525
@@ -XXX,XX +XXX,XX @@
371
- { EXT_GIC_ID_HSMMC0, EXT_GIC_ID_HSMMC1, EXT_GIC_ID_HSMMC2,
526
#include "qapi/qmp/qdict.h"
372
- EXT_GIC_ID_HSMMC3, EXT_GIC_ID_SDMMC },
527
#include "hw/misc/tmp105_regs.h"
373
- /* int combiner group 30 */
528
374
- { EXT_GIC_ID_MIPI_CSI_4LANE, EXT_GIC_ID_MIPI_CSI_2LANE },
529
-#define OMAP2_I2C_1_BASE 0x48070000
375
- /* int combiner group 31 */
530
-
376
- { EXT_GIC_ID_MIPI_DSI_4LANE, EXT_GIC_ID_MIPI_DSI_2LANE },
531
#define TMP105_TEST_ID "tmp105-test"
377
- /* int combiner group 32 */
532
#define TMP105_TEST_ADDR 0x49
378
- { EXT_GIC_ID_FIMC0, EXT_GIC_ID_FIMC1 },
533
379
- /* int combiner group 33 */
534
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
380
- { EXT_GIC_ID_FIMC2, EXT_GIC_ID_FIMC3 },
535
index XXXXXXX..XXXXXXX 100644
381
- /* int combiner group 34 */
536
--- a/default-configs/arm-softmmu.mak
382
- { EXT_GIC_ID_ONENAND_AUDI, EXT_GIC_ID_NFC },
537
+++ b/default-configs/arm-softmmu.mak
383
- /* int combiner group 35 */
538
@@ -XXX,XX +XXX,XX @@ CONFIG_TSC2005=y
384
- { 0, 0, 0, EXT_GIC_ID_MCT_L1, EXT_GIC_ID_MCT_G0, EXT_GIC_ID_MCT_G1 },
539
CONFIG_LM832X=y
385
- /* int combiner group 36 */
540
CONFIG_TMP105=y
386
- { EXT_GIC_ID_MIXER },
541
CONFIG_TMP421=y
387
- /* int combiner group 37 */
542
+CONFIG_PCA9552=y
388
- { EXT_GIC_ID_EXTINT4, EXT_GIC_ID_EXTINT5, EXT_GIC_ID_EXTINT6,
543
CONFIG_STELLARIS=y
389
- EXT_GIC_ID_EXTINT7 },
544
CONFIG_STELLARIS_INPUT=y
390
- /* groups 38-50 */
545
CONFIG_STELLARIS_ENET=y
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
-{
415
- uint32_t grp, bit, irq_id, n;
416
- Exynos4210Irq *is = &s->irqs;
417
-
418
- for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
419
- irq_id = 0;
420
- if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 4) ||
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
- }
425
- if (n == EXYNOS4210_COMBINER_GET_IRQ_NUM(1, 5) ||
426
- n == EXYNOS4210_COMBINER_GET_IRQ_NUM(12, 5)) {
427
- /* MCT_G1 is passed to External and GIC */
428
- irq_id = EXT_GIC_ID_MCT_G1;
429
- }
430
- if (irq_id) {
431
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
432
- is->ext_gic_irq[irq_id - 32]);
433
- } else {
434
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
435
- is->ext_combiner_irq[n]);
436
- }
437
- }
438
- for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
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
-}
451
-
452
-/*
453
- * Get IRQ number from exynos4210 IRQ subsystem stub.
454
- * To identify IRQ source use internal combiner group and bit number
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
546
--
468
--
547
2.17.1
469
2.25.1
548
549
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
Switch the creation of the external GIC to the new-style "embedded in
2
state struct" approach, so we can easily refer to the object
3
elsewhere during realize.
2
4
3
The pca9552 LED blinkers on the Witherspoon machine are used for leds
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
but also as GPIOs to control fans and GPUs.
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220404154658.565020-9-peter.maydell@linaro.org
8
---
9
include/hw/arm/exynos4210.h | 2 ++
10
include/hw/intc/exynos4210_gic.h | 43 ++++++++++++++++++++++++++++++++
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
5
16
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
17
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
7
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180530064049.27976-8-clg@kaod.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/aspeed.c | 4 ++++
13
1 file changed, 4 insertions(+)
14
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed.c
19
--- a/include/hw/arm/exynos4210.h
18
+++ b/hw/arm/aspeed.c
20
+++ b/include/hw/arm/exynos4210.h
19
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
21
@@ -XXX,XX +XXX,XX @@
20
AspeedSoCState *soc = &bmc->soc;
22
#include "hw/or-irq.h"
21
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
23
#include "hw/sysbus.h"
22
24
#include "hw/cpu/a9mpcore.h"
23
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 3), "pca9552", 0x60);
25
+#include "hw/intc/exynos4210_gic.h"
26
#include "target/arm/cpu-qom.h"
27
#include "qom/object.h"
28
29
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
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
24
+
66
+
25
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
67
+#include "hw/sysbus.h"
26
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
68
+
27
69
+#define TYPE_EXYNOS4210_GIC "exynos4210.gic"
28
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
70
+OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210GicState, EXYNOS4210_GIC)
29
71
+
30
smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), 0x51,
72
+#define EXYNOS4210_GIC_NCPUS 2
31
eeprom_buf);
73
+
32
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "pca9552",
74
+struct Exynos4210GicState {
33
+ 0x60);
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);
34
}
118
}
35
119
36
static void witherspoon_bmc_init(MachineState *machine)
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
-
140
-struct Exynos4210GicState {
141
- SysBusDevice parent_obj;
142
-
143
- MemoryRegion cpu_container;
144
- MemoryRegion dist_container;
145
- MemoryRegion cpu_alias[EXYNOS4210_NCPUS];
146
- MemoryRegion dist_alias[EXYNOS4210_NCPUS];
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>
37
--
176
--
38
2.17.1
177
2.25.1
39
40
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The only time we use the ext_gic_irq[] array in the Exynos4210Irq
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.
2
8
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Message-id: 20180606152128.449-11-f4bug@amsat.org
5
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
6
---
12
---
7
target/riscv/op_helper.c | 6 ++++--
13
include/hw/arm/exynos4210.h | 1 -
8
1 file changed, 4 insertions(+), 2 deletions(-)
14
hw/arm/exynos4210.c | 12 ++++++------
15
2 files changed, 6 insertions(+), 7 deletions(-)
9
16
10
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
17
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
11
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
12
--- a/target/riscv/op_helper.c
19
--- a/include/hw/arm/exynos4210.h
13
+++ b/target/riscv/op_helper.c
20
+++ b/include/hw/arm/exynos4210.h
14
@@ -XXX,XX +XXX,XX @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
21
@@ -XXX,XX +XXX,XX @@
15
if ((val_to_write & 3) == 0) {
22
typedef struct Exynos4210Irq {
16
env->stvec = val_to_write >> 2 << 2;
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 ext_gic_irq[EXYNOS4210_EXT_GIC_NIRQ];
26
} Exynos4210Irq;
27
28
struct Exynos4210State {
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_init_board_irqs(Exynos4210State *s)
34
{
35
uint32_t grp, bit, irq_id, n;
36
Exynos4210Irq *is = &s->irqs;
37
+ DeviceState *extgicdev = DEVICE(&s->ext_gic);
38
39
for (n = 0; n < EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ; n++) {
40
irq_id = 0;
41
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
42
}
43
if (irq_id) {
44
s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
45
- is->ext_gic_irq[irq_id - 32]);
46
+ qdev_get_gpio_in(extgicdev,
47
+ irq_id - 32));
17
} else {
48
} else {
18
- qemu_log_mask(LOG_UNIMP, "CSR_STVEC: vectored traps not supported");
49
s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
19
+ qemu_log_mask(LOG_UNIMP,
50
is->ext_combiner_irq[n]);
20
+ "CSR_STVEC: vectored traps not supported\n");
51
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
52
53
if (irq_id) {
54
s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
55
- is->ext_gic_irq[irq_id - 32]);
56
+ qdev_get_gpio_in(extgicdev,
57
+ irq_id - 32));
21
}
58
}
22
break;
59
}
23
case CSR_SCOUNTEREN:
60
}
24
@@ -XXX,XX +XXX,XX @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
61
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
25
if ((val_to_write & 3) == 0) {
62
sysbus_connect_irq(busdev, n,
26
env->mtvec = val_to_write >> 2 << 2;
63
qdev_get_gpio_in(DEVICE(&s->cpu_irq_orgate[n]), 1));
27
} else {
64
}
28
- qemu_log_mask(LOG_UNIMP, "CSR_MTVEC: vectored traps not supported");
65
- for (n = 0; n < EXYNOS4210_EXT_GIC_NIRQ; n++) {
29
+ qemu_log_mask(LOG_UNIMP,
66
- s->irqs.ext_gic_irq[n] = qdev_get_gpio_in(DEVICE(&s->ext_gic), n);
30
+ "CSR_MTVEC: vectored traps not supported\n");
67
- }
31
}
68
32
break;
69
/* Internal Interrupt Combiner */
33
case CSR_MCOUNTEREN:
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);
34
--
80
--
35
2.17.1
81
2.25.1
36
37
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
The function exynos4210_combiner_get_gpioin() currently lives in
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.
2
8
3
The ftgmac100 NIC supports VLAN tag insertion and the MAC engine also
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
has a control to remove VLAN tags from received packets.
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20220404154658.565020-11-peter.maydell@linaro.org
12
---
13
include/hw/arm/exynos4210.h | 11 -----
14
hw/arm/exynos4210.c | 82 +++++++++++++++++++++++++++++++++++
15
hw/intc/exynos4210_combiner.c | 77 --------------------------------
16
3 files changed, 82 insertions(+), 88 deletions(-)
5
17
6
The VLAN control bits and VLAN tag information are contained in the
18
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
7
second word of the transmit and receive descriptors. The Insert VLAN
8
bit and the VLAN Tag available bit are only valid in the first segment
9
of the packet.
10
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180530061711.23673-3-clg@kaod.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/net/ftgmac100.c | 31 ++++++++++++++++++++++++++++++-
17
1 file changed, 30 insertions(+), 1 deletion(-)
18
19
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
20
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/net/ftgmac100.c
20
--- a/include/hw/arm/exynos4210.h
22
+++ b/hw/net/ftgmac100.c
21
+++ b/include/hw/arm/exynos4210.h
23
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
22
@@ -XXX,XX +XXX,XX @@
24
break;
23
#define EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ \
25
}
24
(EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ * 8)
26
25
27
+ /* Check for VLAN */
26
-#define EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit) ((grp)*8 + (bit))
28
+ if (bd.des0 & FTGMAC100_TXDES0_FTS &&
27
-#define EXYNOS4210_COMBINER_GET_GRP_NUM(irq) ((irq) / 8)
29
+ bd.des1 & FTGMAC100_TXDES1_INS_VLANTAG &&
28
-#define EXYNOS4210_COMBINER_GET_BIT_NUM(irq) \
30
+ be16_to_cpu(PKT_GET_ETH_HDR(ptr)->h_proto) != ETH_P_VLAN) {
29
- ((irq) - 8 * EXYNOS4210_COMBINER_GET_GRP_NUM(irq))
31
+ if (frame_size + len + 4 > sizeof(s->frame)) {
30
-
32
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %d bytes\n",
31
/* IRQs number for external and internal GIC */
33
+ __func__, len);
32
#define EXYNOS4210_EXT_GIC_NIRQ (160-32)
34
+ s->isr |= FTGMAC100_INT_XPKT_LOST;
33
#define EXYNOS4210_INT_GIC_NIRQ 64
35
+ len = sizeof(s->frame) - frame_size - 4;
34
@@ -XXX,XX +XXX,XX @@ void exynos4210_write_secondary(ARMCPU *cpu,
36
+ }
35
* bit - bit number inside group */
37
+ memmove(ptr + 16, ptr + 12, len - 12);
36
uint32_t exynos4210_get_irq(uint32_t grp, uint32_t bit);
38
+ stw_be_p(ptr + 12, ETH_P_VLAN);
37
39
+ stw_be_p(ptr + 14, bd.des1);
38
-/*
40
+ len += 4;
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
49
--- a/hw/arm/exynos4210.c
50
+++ b/hw/arm/exynos4210.c
51
@@ -XXX,XX +XXX,XX @@ combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
52
{ }, { }, { }, { }, { }, { }, { }, { }, { }, { }
53
};
54
55
+#define EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit) ((grp) * 8 + (bit))
56
+#define EXYNOS4210_COMBINER_GET_GRP_NUM(irq) ((irq) / 8)
57
+#define EXYNOS4210_COMBINER_GET_BIT_NUM(irq) \
58
+ ((irq) - 8 * EXYNOS4210_COMBINER_GET_GRP_NUM(irq))
59
+
60
/*
61
* Initialize board IRQs.
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;
41
+ }
138
+ }
42
+
139
+
43
ptr += len;
140
+ irq[n] = qdev_get_gpio_in(dev, n);
44
frame_size += len;
141
+ }
45
if (bd.des0 & FTGMAC100_TXDES0_LTS) {
142
+}
46
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
143
+
47
buf_len += size - 4;
144
static uint8_t chipid_and_omr[] = { 0x11, 0x02, 0x21, 0x43,
48
}
145
0x09, 0x00, 0x00, 0x00 };
49
buf_addr = bd.des3;
146
50
- dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
147
diff --git a/hw/intc/exynos4210_combiner.c b/hw/intc/exynos4210_combiner.c
51
+ if (first && proto == ETH_P_VLAN && buf_len >= 18) {
148
index XXXXXXX..XXXXXXX 100644
52
+ bd.des1 = lduw_be_p(buf + 14) | FTGMAC100_RXDES1_VLANTAG_AVAIL;
149
--- a/hw/intc/exynos4210_combiner.c
53
+
150
+++ b/hw/intc/exynos4210_combiner.c
54
+ if (s->maccr & FTGMAC100_MACCR_RM_VLAN) {
151
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_exynos4210_combiner = {
55
+ dma_memory_write(&address_space_memory, buf_addr, buf, 12);
152
}
56
+ dma_memory_write(&address_space_memory, buf_addr + 12, buf + 16,
153
};
57
+ buf_len - 16);
154
58
+ } else {
155
-/*
59
+ dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
156
- * Get Combiner input GPIO into irqs structure
60
+ }
157
- */
61
+ } else {
158
-void exynos4210_combiner_get_gpioin(Exynos4210Irq *irqs, DeviceState *dev,
62
+ bd.des1 = 0;
159
- int ext)
63
+ dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
160
-{
64
+ }
161
- int n;
65
buf += buf_len;
162
- int bit;
66
if (size < 4) {
163
- int max;
67
dma_memory_write(&address_space_memory, buf_addr + buf_len,
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
{
68
--
235
--
69
2.17.1
236
2.25.1
70
71
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Delete a couple of #defines which are never used.
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20180606152128.449-4-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
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
7
---
6
---
8
hw/display/xlnx_dp.c | 4 +++-
7
include/hw/arm/exynos4210.h | 4 ----
9
1 file changed, 3 insertions(+), 1 deletion(-)
8
1 file changed, 4 deletions(-)
10
9
11
diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c
10
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
12
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/display/xlnx_dp.c
12
--- a/include/hw/arm/exynos4210.h
14
+++ b/hw/display/xlnx_dp.c
13
+++ b/include/hw/arm/exynos4210.h
15
@@ -XXX,XX +XXX,XX @@ static void xlnx_dp_avbufm_write(void *opaque, hwaddr offset, uint64_t value,
14
@@ -XXX,XX +XXX,XX @@
16
case AV_BUF_STC_SNAPSHOT1:
15
#define EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ \
17
case AV_BUF_HCOUNT_VCOUNT_INT0:
16
(EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ * 8)
18
case AV_BUF_HCOUNT_VCOUNT_INT1:
17
19
- qemu_log_mask(LOG_UNIMP, "avbufm: unimplmented");
18
-/* IRQs number for external and internal GIC */
20
+ qemu_log_mask(LOG_UNIMP, "avbufm: unimplemented register 0x%04"
19
-#define EXYNOS4210_EXT_GIC_NIRQ (160-32)
21
+ PRIx64 "\n",
20
-#define EXYNOS4210_INT_GIC_NIRQ 64
22
+ offset << 2);
21
-
23
break;
22
#define EXYNOS4210_I2C_NUMBER 9
24
default:
23
25
s->avbufm_registers[offset] = value;
24
#define EXYNOS4210_NUM_DMA 3
26
--
25
--
27
2.17.1
26
2.25.1
28
29
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
In exynos4210_init_board_irqs(), use the TYPE_SPLIT_IRQ device
2
instead of qemu_irq_split().
2
3
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Acked-by: Max Filippov <jcmvbkbc@gmail.com>
5
Message-id: 20180606152128.449-12-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
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
target/xtensa/translate.c | 6 +++---
8
include/hw/arm/exynos4210.h | 9 ++++++++
9
1 file changed, 3 insertions(+), 3 deletions(-)
9
hw/arm/exynos4210.c | 41 +++++++++++++++++++++++++++++--------
10
2 files changed, 42 insertions(+), 8 deletions(-)
10
11
11
diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
12
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/xtensa/translate.c
14
--- a/include/hw/arm/exynos4210.h
14
+++ b/target/xtensa/translate.c
15
+++ b/include/hw/arm/exynos4210.h
15
@@ -XXX,XX +XXX,XX @@ static void translate_rur(DisasContext *dc, const uint32_t arg[],
16
@@ -XXX,XX +XXX,XX @@
16
if (uregnames[par[0]].name) {
17
#include "hw/sysbus.h"
17
tcg_gen_mov_i32(cpu_R[arg[0]], cpu_UR[par[0]]);
18
#include "hw/cpu/a9mpcore.h"
19
#include "hw/intc/exynos4210_gic.h"
20
+#include "hw/core/split-irq.h"
21
#include "target/arm/cpu-qom.h"
22
#include "qom/object.h"
23
24
@@ -XXX,XX +XXX,XX @@
25
26
#define EXYNOS4210_NUM_DMA 3
27
28
+/*
29
+ * We need one splitter for every external combiner input, plus
30
+ * one for every non-zero entry in combiner_grp_to_gic_id[].
31
+ * We'll assert in exynos4210_init_board_irqs() if this is wrong.
32
+ */
33
+#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 60)
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));
18
} else {
77
} else {
19
- qemu_log_mask(LOG_UNIMP, "RUR %d not implemented, ", par[0]);
78
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
20
+ qemu_log_mask(LOG_UNIMP, "RUR %d not implemented\n", par[0]);
79
- is->ext_combiner_irq[n]);
80
+ qdev_connect_gpio_out(splitter, 1, is->ext_combiner_irq[n]);
21
}
81
}
22
}
82
}
23
}
83
for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
24
@@ -XXX,XX +XXX,XX @@ static void translate_slli(DisasContext *dc, const uint32_t arg[],
84
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
25
{
85
EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][bit];
26
if (gen_window_check2(dc, arg[0], arg[1])) {
86
27
if (arg[2] == 32) {
87
if (irq_id) {
28
- qemu_log_mask(LOG_GUEST_ERROR, "slli a%d, a%d, 32 is undefined",
88
- s->irq_table[n] = qemu_irq_split(is->int_combiner_irq[n],
29
+ qemu_log_mask(LOG_GUEST_ERROR, "slli a%d, a%d, 32 is undefined\n",
89
- qdev_get_gpio_in(extgicdev,
30
arg[0], arg[1]);
90
- irq_id - 32));
31
}
91
+ assert(splitcount < EXYNOS4210_NUM_SPLITTERS);
32
tcg_gen_shli_i32(cpu_R[arg[0]], cpu_R[arg[1]], arg[2] & 0x1f);
92
+ splitter = DEVICE(&s->splitter[splitcount]);
33
@@ -XXX,XX +XXX,XX @@ static void translate_wur(DisasContext *dc, const uint32_t arg[],
93
+ qdev_prop_set_uint16(splitter, "num-lines", 2);
34
if (uregnames[par[0]].name) {
94
+ qdev_realize(splitter, NULL, &error_abort);
35
gen_wur(par[0], cpu_R[arg[0]]);
95
+ splitcount++;
36
} else {
96
+ s->irq_table[n] = qdev_get_gpio_in(splitter, 0);
37
- qemu_log_mask(LOG_UNIMP, "WUR %d not implemented, ", par[0]);
97
+ qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
38
+ qemu_log_mask(LOG_UNIMP, "WUR %d not implemented\n", par[0]);
98
+ qdev_connect_gpio_out(splitter, 1,
99
+ qdev_get_gpio_in(extgicdev, irq_id - 32));
39
}
100
}
40
}
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
+ }
119
+
120
object_initialize_child(obj, "a9mpcore", &s->a9mpcore, TYPE_A9MPCORE_PRIV);
121
object_initialize_child(obj, "ext-gic", &s->ext_gic, TYPE_EXYNOS4210_GIC);
41
}
122
}
42
--
123
--
43
2.17.1
124
2.25.1
44
45
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
In exynos4210_init_board_irqs(), the loop that handles IRQ lines that
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.)
2
8
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
I don't have a reliable datasheet for this SoC, but since we do wire
4
Message-id: 20180606152128.449-2-f4bug@amsat.org
10
up one interrupt line in this category (the HDMI I2C device on
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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
17
This bug didn't have any visible guest effects because the only
18
implemented device that was affected was the HDMI I2C controller,
19
and we never connect any I2C devices to that bus.
20
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
23
Message-id: 20220404154658.565020-14-peter.maydell@linaro.org
7
---
24
---
8
hw/sd/milkymist-memcard.c | 2 +-
25
hw/arm/exynos4210.c | 2 ++
9
1 file changed, 1 insertion(+), 1 deletion(-)
26
1 file changed, 2 insertions(+)
10
27
11
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
28
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
12
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/sd/milkymist-memcard.c
30
--- a/hw/arm/exynos4210.c
14
+++ b/hw/sd/milkymist-memcard.c
31
+++ b/hw/arm/exynos4210.c
15
@@ -XXX,XX +XXX,XX @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
32
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
16
r = s->response[s->response_read_ptr++];
33
qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
17
if (s->response_read_ptr > s->response_len) {
34
qdev_connect_gpio_out(splitter, 1,
18
qemu_log_mask(LOG_GUEST_ERROR, "milkymist_memcard: "
35
qdev_get_gpio_in(extgicdev, irq_id - 32));
19
- "read more cmd bytes than available. Clipping.");
36
+ } else {
20
+ "read more cmd bytes than available: clipping\n");
37
+ s->irq_table[n] = is->int_combiner_irq[n];
21
s->response_read_ptr = 0;
22
}
23
}
38
}
39
}
40
/*
24
--
41
--
25
2.17.1
42
2.25.1
26
27
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
Currently for the interrupts MCT_G0 and MCT_G1 which are
2
the only ones in the input range of the external combiner
3
and which are also wired to the external GIC, we connect
4
them only to the internal combiner and the external GIC.
5
This seems likely to be a bug, as all other interrupts
6
which are in the input range of both combiners are
7
connected to both combiners. (The fact that the code in
8
exynos4210_combiner_get_gpioin() is also trying to wire
9
up these inputs on both combiners also suggests this.)
2
10
3
Based on the multicast hash calculation of the FTGMAC100 Linux driver.
11
Wire these interrupts up to both combiners, like the rest.
4
12
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20180530061711.23673-4-clg@kaod.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
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
9
---
16
---
10
hw/net/ftgmac100.c | 4 ++--
17
hw/arm/exynos4210.c | 7 +++----
11
1 file changed, 2 insertions(+), 2 deletions(-)
18
1 file changed, 3 insertions(+), 4 deletions(-)
12
19
13
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
20
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
14
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/net/ftgmac100.c
22
--- a/hw/arm/exynos4210.c
16
+++ b/hw/net/ftgmac100.c
23
+++ b/hw/arm/exynos4210.c
17
@@ -XXX,XX +XXX,XX @@ static int ftgmac100_filter(FTGMAC100State *s, const uint8_t *buf, size_t len)
24
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
18
return 0;
25
19
}
26
assert(splitcount < EXYNOS4210_NUM_SPLITTERS);
20
27
splitter = DEVICE(&s->splitter[splitcount]);
21
- /* TODO: this does not seem to work for ftgmac100 */
28
- qdev_prop_set_uint16(splitter, "num-lines", 2);
22
- mcast_idx = net_crc32(buf, ETH_ALEN) >> 26;
29
+ qdev_prop_set_uint16(splitter, "num-lines", irq_id ? 3 : 2);
23
+ mcast_idx = net_crc32_le(buf, ETH_ALEN);
30
qdev_realize(splitter, NULL, &error_abort);
24
+ mcast_idx = (~(mcast_idx >> 2)) & 0x3f;
31
splitcount++;
25
if (!(s->math[mcast_idx / 32] & (1 << (mcast_idx % 32)))) {
32
s->irq_table[n] = qdev_get_gpio_in(splitter, 0);
26
return 0;
33
qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
27
}
34
+ qdev_connect_gpio_out(splitter, 1, is->ext_combiner_irq[n]);
35
if (irq_id) {
36
- qdev_connect_gpio_out(splitter, 1,
37
+ qdev_connect_gpio_out(splitter, 2,
38
qdev_get_gpio_in(extgicdev, irq_id - 32));
39
- } else {
40
- qdev_connect_gpio_out(splitter, 1, is->ext_combiner_irq[n]);
41
}
42
}
43
for (; n < EXYNOS4210_MAX_INT_COMBINER_IN_IRQ; n++) {
28
--
44
--
29
2.17.1
45
2.25.1
30
31
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The combiner_grp_to_gic_id[] array includes the EXT_GIC_ID_MCT_G0
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.
2
7
3
CMD8 is "Reserved" in Spec v1.10.
8
Overall we do this for interrupt IDs
9
(1, 4), (12, 4), (35, 4), (51, 4), (53, 4) for EXT_GIC_ID_MCT_G0
10
and
11
(1, 5), (12, 5), (35, 5), (51, 5), (53, 5) for EXT_GIC_ID_MCT_G1
4
12
5
Spec v2.00 introduces the SEND_IF_COND command:
13
These correspond to the cases for the multi-core timer that we are
14
wiring up to multiple inputs on the combiner in
15
exynos4210_combiner_get_gpioin(). That code already deals with all
16
these interrupt IDs being the same input source, so we don't need to
17
connect the external GIC interrupt for any of them except the first
18
(1, 4) and (1, 5). Remove the array entries and conditionals which
19
were incorrectly causing us to wire up extra lines.
6
20
7
6.4.1 Power Up
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.
8
24
9
CMD8 is newly added in the Physical Layer Specification Version
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
2.00 to support multiple voltage ranges and used to check whether
26
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
the card supports supplied voltage. The version 2.00 or later host
27
Message-id: 20220404154658.565020-16-peter.maydell@linaro.org
12
shall issue CMD8 and verify voltage before card initialization.
28
---
13
The host that does not support CMD8 shall supply high voltage range.
29
include/hw/arm/exynos4210.h | 2 +-
30
hw/arm/exynos4210.c | 12 +++++-------
31
2 files changed, 6 insertions(+), 8 deletions(-)
14
32
15
Message-Id: 201204252110.20873.paul@codesourcery.com
33
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
16
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20180607180641.874-5-f4bug@amsat.org
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
21
hw/sd/sd.c | 4 +++-
22
1 file changed, 3 insertions(+), 1 deletion(-)
23
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
25
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/sd/sd.c
35
--- a/include/hw/arm/exynos4210.h
27
+++ b/hw/sd/sd.c
36
+++ b/include/hw/arm/exynos4210.h
28
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
37
@@ -XXX,XX +XXX,XX @@
29
break;
38
* one for every non-zero entry in combiner_grp_to_gic_id[].
30
39
* We'll assert in exynos4210_init_board_irqs() if this is wrong.
31
case 8:    /* CMD8: SEND_IF_COND */
40
*/
32
- /* Physical Layer Specification Version 2.00 command */
41
-#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 60)
33
+ if (sd->spec_version < SD_PHY_SPECv2_00_VERS) {
42
+#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 54)
34
+ break;
43
35
+ }
44
typedef struct Exynos4210Irq {
36
if (sd->state != sd_idle_state) {
45
qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
37
break;
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;
38
}
88
}
39
--
89
--
40
2.17.1
90
2.25.1
41
42
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
At this point, the function exynos4210_init_board_irqs() splits input
2
2
IRQ lines to connect them to the input combiner, output combiner and
3
This is an helper routine to add a single EEPROM on an I2C bus. It can
3
external GIC. The function exynos4210_combiner_get_gpioin() splits
4
be directly used by smbus_eeprom_init() which adds a certain number of
4
some of the combiner input lines further to connect them to multiple
5
EEPROMs on mips and x86 machines.
5
different inputs on the combiner.
6
6
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Because (unlike qemu_irq_split()) the TYPE_SPLIT_IRQ device has a
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
configurable number of outputs, we can do all this in one place, by
9
Message-id: 20180530064049.27976-5-clg@kaod.org
9
making exynos4210_init_board_irqs() add extra outputs to the splitter
10
device when it must be connected to more than one input on each
11
combiner.
12
13
We do this with a new data structure, the combinermap, which is an
14
array each of whose elements is a list of the interrupt IDs on the
15
combiner which must be tied together. As we loop through each
16
interrupt ID, if we find that it is the first one in one of these
17
lists, we configure the splitter device with eonugh extra outputs and
18
wire them up to the other interrupt IDs in the list.
19
20
Conveniently, for all the cases where this is necessary, the
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
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
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
11
---
42
---
12
include/hw/i2c/smbus.h | 1 +
43
include/hw/arm/exynos4210.h | 6 +-
13
hw/i2c/smbus_eeprom.c | 16 +++++++++++-----
44
hw/arm/exynos4210.c | 178 +++++++++++++++++++++++-------------
14
2 files changed, 12 insertions(+), 5 deletions(-)
45
2 files changed, 119 insertions(+), 65 deletions(-)
15
46
16
diff --git a/include/hw/i2c/smbus.h b/include/hw/i2c/smbus.h
47
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
17
index XXXXXXX..XXXXXXX 100644
48
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/i2c/smbus.h
49
--- a/include/hw/arm/exynos4210.h
19
+++ b/include/hw/i2c/smbus.h
50
+++ b/include/hw/arm/exynos4210.h
20
@@ -XXX,XX +XXX,XX @@ int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data);
51
@@ -XXX,XX +XXX,XX @@
21
int smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data,
52
22
int len);
53
/*
23
54
* We need one splitter for every external combiner input, plus
24
+void smbus_eeprom_init_one(I2CBus *smbus, uint8_t address, uint8_t *eeprom_buf);
55
- * one for every non-zero entry in combiner_grp_to_gic_id[].
25
void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
56
+ * one for every non-zero entry in combiner_grp_to_gic_id[],
26
const uint8_t *eeprom_spd, int size);
57
+ * minus one for every external combiner ID in second or later
27
58
+ * places in a combinermap[] line.
28
diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
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
29
index XXXXXXX..XXXXXXX 100644
67
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/i2c/smbus_eeprom.c
68
--- a/hw/arm/exynos4210.c
31
+++ b/hw/i2c/smbus_eeprom.c
69
+++ b/hw/arm/exynos4210.c
32
@@ -XXX,XX +XXX,XX @@ static void smbus_eeprom_register_types(void)
70
@@ -XXX,XX +XXX,XX @@ combiner_grp_to_gic_id[64 - EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][8] = {
33
71
#define EXYNOS4210_COMBINER_GET_BIT_NUM(irq) \
34
type_init(smbus_eeprom_register_types)
72
((irq) - 8 * EXYNOS4210_COMBINER_GET_GRP_NUM(irq))
35
73
36
+void smbus_eeprom_init_one(I2CBus *smbus, uint8_t address, uint8_t *eeprom_buf)
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)
37
+{
113
+{
38
+ DeviceState *dev;
114
+ /*
39
+
115
+ * If the interrupt number passed in is the first entry in some
40
+ dev = qdev_create((BusState *) smbus, "smbus-eeprom");
116
+ * line of the combinermap, return a pointer to that line;
41
+ qdev_prop_set_uint8(dev, "address", address);
117
+ * otherwise return NULL.
42
+ qdev_prop_set_ptr(dev, "data", eeprom_buf);
118
+ */
43
+ qdev_init_nofail(dev);
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;
44
+}
126
+}
45
+
127
+
46
void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
128
+static int mapline_size(const int *mapline)
47
const uint8_t *eeprom_spd, int eeprom_spd_size)
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
}
207
}
208
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
209
irq_id = combiner_grp_to_gic_id[grp -
210
EXYNOS4210_MAX_EXT_COMBINER_OUT_IRQ][bit];
211
212
+ if (s->irq_table[n]) {
213
+ /*
214
+ * This must be some non-first entry in a combinermap line,
215
+ * and we've already filled it in.
216
+ */
217
+ continue;
218
+ }
219
+
220
if (irq_id) {
221
assert(splitcount < EXYNOS4210_NUM_SPLITTERS);
222
splitter = DEVICE(&s->splitter[splitcount]);
223
@@ -XXX,XX +XXX,XX @@ static void exynos4210_combiner_get_gpioin(Exynos4210Irq *irqs,
224
DeviceState *dev, int ext)
48
{
225
{
49
@@ -XXX,XX +XXX,XX @@ void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
226
int n;
50
}
227
- int bit;
51
228
int max;
52
for (i = 0; i < nb_eeprom; i++) {
229
qemu_irq *irq;
53
- DeviceState *eeprom;
230
54
- eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
231
@@ -XXX,XX +XXX,XX @@ static void exynos4210_combiner_get_gpioin(Exynos4210Irq *irqs,
55
- qdev_prop_set_uint8(eeprom, "address", 0x50 + i);
232
EXYNOS4210_MAX_INT_COMBINER_IN_IRQ;
56
- qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
233
irq = ext ? irqs->ext_combiner_irq : irqs->int_combiner_irq;
57
- qdev_init_nofail(eeprom);
234
58
+ smbus_eeprom_init_one(smbus, 0x50 + i, eeprom_buf + (i * 256));
235
- /*
236
- * Some IRQs of Int/External Combiner are going to two Combiners groups,
237
- * so let split them.
238
- */
239
for (n = 0; n < max; n++) {
240
-
241
- bit = EXYNOS4210_COMBINER_GET_BIT_NUM(n);
242
-
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);
59
}
294
}
60
}
295
}
61
--
296
--
62
2.17.1
297
2.25.1
63
64
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
Switch the creation of the combiner devices to the new-style
2
"embedded in state struct" approach, so we can easily refer
3
to the object elsewhere during realize.
2
4
3
The Witherspoon boards are OpenPOWER system hosting POWER9 Processors.
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Add support for their BMC including a couple of I2C devices as found
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
on real HW.
7
Message-id: 20220404154658.565020-18-peter.maydell@linaro.org
8
---
9
include/hw/arm/exynos4210.h | 3 ++
10
include/hw/intc/exynos4210_combiner.h | 57 +++++++++++++++++++++++++++
11
hw/arm/exynos4210.c | 20 +++++-----
12
hw/intc/exynos4210_combiner.c | 31 +--------------
13
4 files changed, 72 insertions(+), 39 deletions(-)
14
create mode 100644 include/hw/intc/exynos4210_combiner.h
6
15
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
16
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
8
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
9
Message-id: 20180530064049.27976-3-clg@kaod.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/aspeed.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
13
1 file changed, 49 insertions(+)
14
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed.c
18
--- a/include/hw/arm/exynos4210.h
18
+++ b/hw/arm/aspeed.c
19
+++ b/include/hw/arm/exynos4210.h
19
@@ -XXX,XX +XXX,XX @@ enum {
20
@@ -XXX,XX +XXX,XX @@
20
PALMETTO_BMC,
21
#include "hw/sysbus.h"
21
AST2500_EVB,
22
#include "hw/cpu/a9mpcore.h"
22
ROMULUS_BMC,
23
#include "hw/intc/exynos4210_gic.h"
23
+ WITHERSPOON_BMC,
24
+#include "hw/intc/exynos4210_combiner.h"
25
#include "hw/core/split-irq.h"
26
#include "target/arm/cpu-qom.h"
27
#include "qom/object.h"
28
@@ -XXX,XX +XXX,XX @@ struct Exynos4210State {
29
qemu_or_irq cpu_irq_orgate[EXYNOS4210_NCPUS];
30
A9MPPrivState a9mpcore;
31
Exynos4210GicState ext_gic;
32
+ Exynos4210CombinerState int_combiner;
33
+ Exynos4210CombinerState ext_combiner;
34
SplitIRQ splitter[EXYNOS4210_NUM_SPLITTERS];
24
};
35
};
25
36
26
/* Palmetto hardware value: 0x120CE416 */
37
diff --git a/include/hw/intc/exynos4210_combiner.h b/include/hw/intc/exynos4210_combiner.h
27
@@ -XXX,XX +XXX,XX @@ enum {
38
new file mode 100644
28
SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
39
index XXXXXXX..XXXXXXX
29
SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
40
--- /dev/null
30
41
+++ b/include/hw/intc/exynos4210_combiner.h
31
+/* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
42
@@ -XXX,XX +XXX,XX @@
32
+#define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
43
+/*
44
+ * Samsung exynos4210 Interrupt Combiner
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
+ */
33
+
64
+
34
static void palmetto_bmc_i2c_init(AspeedBoardState *bmc);
65
+#ifndef HW_INTC_EXYNOS4210_COMBINER
35
static void ast2500_evb_i2c_init(AspeedBoardState *bmc);
66
+#define HW_INTC_EXYNOS4210_COMBINER
36
+static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc);
37
38
static const AspeedBoardConfig aspeed_boards[] = {
39
[PALMETTO_BMC] = {
40
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
41
.spi_model = "mx66l1g45g",
42
.num_cs = 2,
43
},
44
+ [WITHERSPOON_BMC] = {
45
+ .soc_name = "ast2500-a1",
46
+ .hw_strap1 = WITHERSPOON_BMC_HW_STRAP1,
47
+ .fmc_model = "mx25l25635e",
48
+ .spi_model = "mx66l1g45g",
49
+ .num_cs = 2,
50
+ .i2c_init = witherspoon_bmc_i2c_init,
51
+ },
52
};
53
54
#define FIRMWARE_ADDR 0x0
55
@@ -XXX,XX +XXX,XX @@ static const TypeInfo romulus_bmc_type = {
56
.class_init = romulus_bmc_class_init,
57
};
58
59
+static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
60
+{
61
+ AspeedSoCState *soc = &bmc->soc;
62
+
67
+
63
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
68
+#include "hw/sysbus.h"
64
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
65
+
69
+
66
+ /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
70
+/*
67
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 9), "tmp105", 0x4a);
71
+ * State for each output signal of internal combiner
68
+}
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;
69
+
77
+
70
+static void witherspoon_bmc_init(MachineState *machine)
78
+#define TYPE_EXYNOS4210_COMBINER "exynos4210.combiner"
71
+{
79
+OBJECT_DECLARE_SIMPLE_TYPE(Exynos4210CombinerState, EXYNOS4210_COMBINER)
72
+ aspeed_board_init(machine, &aspeed_boards[WITHERSPOON_BMC]);
73
+}
74
+
80
+
75
+static void witherspoon_bmc_class_init(ObjectClass *oc, void *data)
81
+/* Number of groups and total number of interrupts for the internal combiner */
76
+{
82
+#define IIC_NGRP 64
77
+ MachineClass *mc = MACHINE_CLASS(oc);
83
+#define IIC_NIRQ (IIC_NGRP * 8)
84
+#define IIC_REGSET_SIZE 0x41
78
+
85
+
79
+ mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
86
+struct Exynos4210CombinerState {
80
+ mc->init = witherspoon_bmc_init;
87
+ SysBusDevice parent_obj;
81
+ mc->max_cpus = 1;
82
+ mc->no_sdcard = 1;
83
+ mc->no_floppy = 1;
84
+ mc->no_cdrom = 1;
85
+ mc->no_parallel = 1;
86
+}
87
+
88
+
88
+static const TypeInfo witherspoon_bmc_type = {
89
+ MemoryRegion iomem;
89
+ .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
90
+
90
+ .parent = TYPE_MACHINE,
91
+ struct CombinerGroupState group[IIC_NGRP];
91
+ .class_init = witherspoon_bmc_class_init,
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];
92
+};
97
+};
93
+
98
+
94
static void aspeed_machine_init(void)
99
+#endif
95
{
100
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
96
type_register_static(&palmetto_bmc_type);
101
index XXXXXXX..XXXXXXX 100644
97
type_register_static(&ast2500_evb_type);
102
--- a/hw/arm/exynos4210.c
98
type_register_static(&romulus_bmc_type);
103
+++ b/hw/arm/exynos4210.c
99
+ type_register_static(&witherspoon_bmc_type);
104
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
105
}
106
107
/* Internal Interrupt Combiner */
108
- dev = qdev_new("exynos4210.combiner");
109
- busdev = SYS_BUS_DEVICE(dev);
110
- sysbus_realize_and_unref(busdev, &error_fatal);
111
+ busdev = SYS_BUS_DEVICE(&s->int_combiner);
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);
100
}
145
}
101
146
102
type_init(aspeed_machine_init)
147
static void exynos4210_class_init(ObjectClass *klass, void *data)
148
diff --git a/hw/intc/exynos4210_combiner.c b/hw/intc/exynos4210_combiner.c
149
index XXXXXXX..XXXXXXX 100644
150
--- a/hw/intc/exynos4210_combiner.c
151
+++ b/hw/intc/exynos4210_combiner.c
152
@@ -XXX,XX +XXX,XX @@
153
#include "hw/sysbus.h"
154
#include "migration/vmstate.h"
155
#include "qemu/module.h"
156
-
157
+#include "hw/intc/exynos4210_combiner.h"
158
#include "hw/arm/exynos4210.h"
159
#include "hw/hw.h"
160
#include "hw/irq.h"
161
@@ -XXX,XX +XXX,XX @@
162
#define DPRINTF(fmt, ...) do {} while (0)
163
#endif
164
165
-#define IIC_NGRP 64 /* Internal Interrupt Combiner
166
- Groups number */
167
-#define IIC_NIRQ (IIC_NGRP * 8)/* Internal Interrupt Combiner
168
- Interrupts number */
169
#define IIC_REGION_SIZE 0x108 /* Size of memory mapped region */
170
-#define IIC_REGSET_SIZE 0x41
171
-
172
-/*
173
- * State for each output signal of internal combiner
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",
103
--
198
--
104
2.17.1
199
2.25.1
105
106
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
The only time we use the int_combiner_irq[] and ext_combiner_irq[]
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.
2
9
3
The Aspeed boards have at least one EEPROM to hold the Vital Product
10
Since these are the only two remaining elements of Exynos4210Irq,
4
Data (VPD).
11
we can remove that struct entirely.
5
12
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
8
Message-id: 20180530064049.27976-6-clg@kaod.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
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
10
---
16
---
11
hw/arm/aspeed.c | 13 +++++++++++++
17
include/hw/arm/exynos4210.h | 6 ------
12
1 file changed, 13 insertions(+)
18
hw/arm/exynos4210.c | 34 ++++++++--------------------------
19
2 files changed, 8 insertions(+), 32 deletions(-)
13
20
14
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
21
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
15
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/aspeed.c
23
--- a/include/hw/arm/exynos4210.h
17
+++ b/hw/arm/aspeed.c
24
+++ b/include/hw/arm/exynos4210.h
18
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@
19
#include "hw/arm/arm.h"
26
*/
20
#include "hw/arm/aspeed_soc.h"
27
#define EXYNOS4210_NUM_SPLITTERS (EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ + 38)
21
#include "hw/boards.h"
28
22
+#include "hw/i2c/smbus.h"
29
-typedef struct Exynos4210Irq {
23
#include "qemu/log.h"
30
- qemu_irq int_combiner_irq[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
24
#include "sysemu/block-backend.h"
31
- qemu_irq ext_combiner_irq[EXYNOS4210_MAX_EXT_COMBINER_IN_IRQ];
25
#include "hw/loader.h"
32
-} Exynos4210Irq;
26
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_i2c_init(AspeedBoardState *bmc)
33
-
34
struct Exynos4210State {
35
/*< private >*/
36
SysBusDevice parent_obj;
37
/*< public >*/
38
ARMCPU *cpu[EXYNOS4210_NCPUS];
39
- Exynos4210Irq irqs;
40
qemu_irq irq_table[EXYNOS4210_MAX_INT_COMBINER_IN_IRQ];
41
42
MemoryRegion chipid_mem;
43
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/arm/exynos4210.c
46
+++ b/hw/arm/exynos4210.c
47
@@ -XXX,XX +XXX,XX @@ static int mapline_size(const int *mapline)
48
static void exynos4210_init_board_irqs(Exynos4210State *s)
27
{
49
{
28
AspeedSoCState *soc = &bmc->soc;
50
uint32_t grp, bit, irq_id, n;
29
DeviceState *dev;
51
- Exynos4210Irq *is = &s->irqs;
30
+ uint8_t *eeprom_buf = g_malloc0(32 * 1024);
52
DeviceState *extgicdev = DEVICE(&s->ext_gic);
31
53
+ DeviceState *intcdev = DEVICE(&s->int_combiner);
32
/* The palmetto platform expects a ds3231 RTC but a ds1338 is
54
+ DeviceState *extcdev = DEVICE(&s->ext_combiner);
33
* enough to provide basic RTC features. Alarms will be missing */
55
int splitcount = 0;
34
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 0), "ds1338", 0x68);
56
DeviceState *splitter;
35
57
const int *mapline;
36
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 0), 0x50,
58
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
37
+ eeprom_buf);
59
splitin = 0;
38
+
60
for (;;) {
39
/* add a TMP423 temperature sensor */
61
s->irq_table[in] = qdev_get_gpio_in(splitter, 0);
40
dev = i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 2),
62
- qdev_connect_gpio_out(splitter, splitin, is->int_combiner_irq[in]);
41
"tmp423", 0x4c);
63
- qdev_connect_gpio_out(splitter, splitin + 1, is->ext_combiner_irq[in]);
42
@@ -XXX,XX +XXX,XX @@ static const TypeInfo palmetto_bmc_type = {
64
+ qdev_connect_gpio_out(splitter, splitin,
43
static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
65
+ qdev_get_gpio_in(intcdev, in));
44
{
66
+ qdev_connect_gpio_out(splitter, splitin + 1,
45
AspeedSoCState *soc = &bmc->soc;
67
+ qdev_get_gpio_in(extcdev, in));
46
+ uint8_t *eeprom_buf = g_malloc0(8 * 1024);
68
splitin += 2;
47
+
69
if (!mapline) {
48
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 3), 0x50,
70
break;
49
+ eeprom_buf);
71
@@ -XXX,XX +XXX,XX @@ static void exynos4210_init_board_irqs(Exynos4210State *s)
50
72
qdev_realize(splitter, NULL, &error_abort);
51
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
73
splitcount++;
52
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 7), "tmp105", 0x4d);
74
s->irq_table[n] = qdev_get_gpio_in(splitter, 0);
53
@@ -XXX,XX +XXX,XX @@ static const TypeInfo romulus_bmc_type = {
75
- qdev_connect_gpio_out(splitter, 0, is->int_combiner_irq[n]);
54
static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
76
+ qdev_connect_gpio_out(splitter, 0, qdev_get_gpio_in(intcdev, n));
55
{
77
qdev_connect_gpio_out(splitter, 1,
56
AspeedSoCState *soc = &bmc->soc;
78
qdev_get_gpio_in(extgicdev, irq_id - 32));
57
+ uint8_t *eeprom_buf = g_malloc0(8 * 1024);
79
} else {
58
80
- s->irq_table[n] = is->int_combiner_irq[n];
59
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
81
+ s->irq_table[n] = qdev_get_gpio_in(intcdev, n);
60
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
82
}
61
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
83
}
62
/* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
84
/*
63
* good enough */
85
@@ -XXX,XX +XXX,XX @@ uint32_t exynos4210_get_irq(uint32_t grp, uint32_t bit)
64
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
86
return EXYNOS4210_COMBINER_GET_IRQ_NUM(grp, bit);
65
+
66
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), 0x51,
67
+ eeprom_buf);
68
}
87
}
69
88
70
static void witherspoon_bmc_init(MachineState *machine)
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. */
71
--
127
--
72
2.17.1
128
2.25.1
73
74
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Zongyuan Li <zongyuan.li@smartx.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Signed-off-by: Zongyuan Li <zongyuan.li@smartx.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180607180641.874-6-f4bug@amsat.org
5
Message-id: 20220324181557.203805-2-zongyuan.li@smartx.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
include/hw/sd/sd.h | 1 +
8
hw/arm/realview.c | 33 ++++++++++++++++++++++++---------
9
hw/sd/sd.c | 7 +++++--
9
1 file changed, 24 insertions(+), 9 deletions(-)
10
2 files changed, 6 insertions(+), 2 deletions(-)
11
10
12
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
11
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/include/hw/sd/sd.h
13
--- a/hw/arm/realview.c
15
+++ b/include/hw/sd/sd.h
14
+++ b/hw/arm/realview.c
16
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
17
enum SDPhySpecificationVersion {
16
#include "hw/sysbus.h"
18
SD_PHY_SPECv1_10_VERS = 1,
17
#include "hw/arm/boot.h"
19
SD_PHY_SPECv2_00_VERS = 2,
18
#include "hw/arm/primecell.h"
20
+ SD_PHY_SPECv3_01_VERS = 3,
19
+#include "hw/core/split-irq.h"
20
#include "hw/net/lan9118.h"
21
#include "hw/net/smc91c111.h"
22
#include "hw/pci/pci.h"
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
21
};
29
};
22
30
23
typedef enum {
31
+static void split_irq_from_named(DeviceState *src, const char* outname,
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
32
+ qemu_irq out1, qemu_irq out2) {
25
index XXXXXXX..XXXXXXX 100644
33
+ DeviceState *splitter = qdev_new(TYPE_SPLIT_IRQ);
26
--- a/hw/sd/sd.c
34
+
27
+++ b/hw/sd/sd.c
35
+ qdev_prop_set_uint32(splitter, "num-lines", 2);
28
@@ -XXX,XX +XXX,XX @@ static void sd_set_scr(SDState *sd)
36
+
29
if (sd->spec_version == SD_PHY_SPECv1_10_VERS) {
37
+ qdev_realize_and_unref(splitter, NULL, &error_fatal);
30
sd->scr[0] |= 1; /* Spec Version 1.10 */
38
+
31
} else {
39
+ qdev_connect_gpio_out(splitter, 0, out1);
32
- sd->scr[0] |= 2; /* Spec Version 2.00 */
40
+ qdev_connect_gpio_out(splitter, 1, out2);
33
+ sd->scr[0] |= 2; /* Spec Version 2.00 or Version 3.0X */
41
+ qdev_connect_gpio_out_named(src, outname, 0,
34
}
42
+ qdev_get_gpio_in(splitter, 0));
35
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
43
+}
36
| 0b0101; /* 1-bit or 4-bit width bus modes */
44
+
37
sd->scr[2] = 0x00; /* Extended Security is not supported. */
45
static void realview_init(MachineState *machine,
38
+ if (sd->spec_version >= SD_PHY_SPECv3_01_VERS) {
46
enum realview_board_type board_type)
39
+ sd->scr[2] |= 1 << 7; /* Spec Version 3.0X */
47
{
40
+ }
48
@@ -XXX,XX +XXX,XX @@ static void realview_init(MachineState *machine,
41
sd->scr[3] = 0x00;
49
DeviceState *dev, *sysctl, *gpio2, *pl041;
42
/* reserved for manufacturer usage */
50
SysBusDevice *busdev;
43
sd->scr[4] = 0x00;
51
qemu_irq pic[64];
44
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
52
- qemu_irq mmc_irq[2];
45
53
PCIBus *pci_bus = NULL;
46
switch (sd->spec_version) {
54
NICInfo *nd;
47
case SD_PHY_SPECv1_10_VERS
55
DriveInfo *dinfo;
48
- ... SD_PHY_SPECv2_00_VERS:
56
@@ -XXX,XX +XXX,XX @@ static void realview_init(MachineState *machine,
49
+ ... SD_PHY_SPECv3_01_VERS:
57
* and the PL061 has them the other way about. Also the card
50
break;
58
* detect line is inverted.
51
default:
59
*/
52
error_setg(errp, "Invalid SD card Spec version: %u", sd->spec_version);
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;
53
--
79
--
54
2.17.1
80
2.25.1
55
56
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Zongyuan Li <zongyuan.li@smartx.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Signed-off-by: Zongyuan Li <zongyuan.li@smartx.com>
4
Message-id: 20180606152128.449-8-f4bug@amsat.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220324181557.203805-3-zongyuan.li@smartx.com
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 | 11 ++++++-----
8
hw/arm/stellaris.c | 15 +++++++++++++--
9
1 file changed, 6 insertions(+), 5 deletions(-)
9
1 file changed, 13 insertions(+), 2 deletions(-)
10
10
11
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
11
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/stellaris.c
13
--- a/hw/arm/stellaris.c
14
+++ b/hw/arm/stellaris.c
14
+++ b/hw/arm/stellaris.c
15
@@ -XXX,XX +XXX,XX @@ static uint64_t gptm_read(void *opaque, hwaddr offset,
15
@@ -XXX,XX +XXX,XX @@
16
return s->rtc;
16
17
}
17
#include "qemu/osdep.h"
18
qemu_log_mask(LOG_UNIMP,
18
#include "qapi/error.h"
19
- "GPTM: read of TAR but timer read not supported");
19
+#include "hw/core/split-irq.h"
20
+ "GPTM: read of TAR but timer read not supported\n");
20
#include "hw/sysbus.h"
21
return 0;
21
#include "hw/sd/sd.h"
22
case 0x4c: /* TBR */
22
#include "hw/ssi/ssi.h"
23
qemu_log_mask(LOG_UNIMP,
23
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
24
- "GPTM: read of TBR but timer read not supported");
24
DeviceState *ssddev;
25
+ "GPTM: read of TBR but timer read not supported\n");
25
DriveInfo *dinfo;
26
return 0;
26
DeviceState *carddev;
27
default:
27
+ DeviceState *gpio_d_splitter;
28
qemu_log_mask(LOG_GUEST_ERROR,
28
BlockBackend *blk;
29
@@ -XXX,XX +XXX,XX @@ static void stellaris_i2c_write(void *opaque, hwaddr offset,
29
30
break;
30
/*
31
case 0x20: /* MCR */
31
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
32
if (value & 1) {
32
&error_fatal);
33
- qemu_log_mask(LOG_UNIMP, "stellaris_i2c: Loopback not implemented");
33
34
+ qemu_log_mask(LOG_UNIMP,
34
ssddev = ssi_create_peripheral(bus, "ssd0323");
35
+ "stellaris_i2c: Loopback not implemented\n");
35
- gpio_out[GPIO_D][0] = qemu_irq_split(
36
}
36
- qdev_get_gpio_in_named(sddev, SSI_GPIO_CS, 0),
37
if (value & 0x20) {
37
+
38
qemu_log_mask(LOG_UNIMP,
38
+ gpio_d_splitter = qdev_new(TYPE_SPLIT_IRQ);
39
- "stellaris_i2c: Slave mode not implemented");
39
+ qdev_prop_set_uint32(gpio_d_splitter, "num-lines", 2);
40
+ "stellaris_i2c: Slave mode not implemented\n");
40
+ qdev_realize_and_unref(gpio_d_splitter, NULL, &error_fatal);
41
}
41
+ qdev_connect_gpio_out(
42
s->mcr = value & 0x31;
42
+ gpio_d_splitter, 0,
43
break;
43
+ qdev_get_gpio_in_named(sddev, SSI_GPIO_CS, 0));
44
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_write(void *opaque, hwaddr offset,
44
+ qdev_connect_gpio_out(
45
s->sspri = value;
45
+ gpio_d_splitter, 1,
46
break;
46
qdev_get_gpio_in_named(ssddev, SSI_GPIO_CS, 0));
47
case 0x28: /* PSSI */
47
+ gpio_out[GPIO_D][0] = qdev_get_gpio_in(gpio_d_splitter, 0);
48
- qemu_log_mask(LOG_UNIMP, "ADC: sample initiate unimplemented");
48
+
49
+ qemu_log_mask(LOG_UNIMP, "ADC: sample initiate unimplemented\n");
49
gpio_out[GPIO_C][7] = qdev_get_gpio_in(ssddev, 0);
50
break;
50
51
case 0x30: /* SAC */
51
/* Make sure the select pin is high. */
52
s->sac = value;
53
--
52
--
54
2.17.1
53
2.25.1
55
56
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Zongyuan Li <zongyuan.li@smartx.com>
2
2
3
Signed-off-by: Cédric Le Goater <clg@kaod.org>
3
Signed-off-by: Zongyuan Li <zongyuan.li@smartx.com>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180530064049.27976-2-clg@kaod.org
5
Message-id: 20220324181557.203805-5-zongyuan.li@smartx.com
6
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/811
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
---
8
hw/arm/aspeed.c | 3 ---
9
include/hw/irq.h | 5 -----
9
1 file changed, 3 deletions(-)
10
hw/core/irq.c | 15 ---------------
11
2 files changed, 20 deletions(-)
10
12
11
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
13
diff --git a/include/hw/irq.h b/include/hw/irq.h
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/aspeed.c
15
--- a/include/hw/irq.h
14
+++ b/hw/arm/aspeed.c
16
+++ b/include/hw/irq.h
15
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_class_init(ObjectClass *oc, void *data)
17
@@ -XXX,XX +XXX,XX @@ void qemu_free_irq(qemu_irq irq);
16
mc->no_floppy = 1;
18
/* Returns a new IRQ with opposite polarity. */
17
mc->no_cdrom = 1;
19
qemu_irq qemu_irq_invert(qemu_irq irq);
18
mc->no_parallel = 1;
20
19
- mc->ignore_memory_transaction_failures = true;
21
-/* Returns a new IRQ which feeds into both the passed IRQs.
22
- * It's probably better to use the TYPE_SPLIT_IRQ device instead.
23
- */
24
-qemu_irq qemu_irq_split(qemu_irq irq1, qemu_irq irq2);
25
-
26
/* For internal use in qtest. Similar to qemu_irq_split, but operating
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);
20
}
35
}
21
36
22
static const TypeInfo palmetto_bmc_type = {
37
-static void qemu_splitirq(void *opaque, int line, int level)
23
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_class_init(ObjectClass *oc, void *data)
38
-{
24
mc->no_floppy = 1;
39
- struct IRQState **irq = opaque;
25
mc->no_cdrom = 1;
40
- irq[0]->handler(irq[0]->opaque, irq[0]->n, level);
26
mc->no_parallel = 1;
41
- irq[1]->handler(irq[1]->opaque, irq[1]->n, level);
27
- mc->ignore_memory_transaction_failures = true;
42
-}
28
}
43
-
29
44
-qemu_irq qemu_irq_split(qemu_irq irq1, qemu_irq irq2)
30
static const TypeInfo ast2500_evb_type = {
45
-{
31
@@ -XXX,XX +XXX,XX @@ static void romulus_bmc_class_init(ObjectClass *oc, void *data)
46
- qemu_irq *s = g_new0(qemu_irq, 2);
32
mc->no_floppy = 1;
47
- s[0] = irq1;
33
mc->no_cdrom = 1;
48
- s[1] = irq2;
34
mc->no_parallel = 1;
49
- return qemu_allocate_irq(qemu_splitirq, s, 0);
35
- mc->ignore_memory_transaction_failures = true;
50
-}
36
}
51
-
37
52
void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n)
38
static const TypeInfo romulus_bmc_type = {
53
{
54
int i;
39
--
55
--
40
2.17.1
56
2.25.1
41
42
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Describe that the gic-version influences the maximum number of CPUs.
4
Message-id: 20180606152128.449-9-f4bug@amsat.org
4
5
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
6
Message-id: 20220413231456.35811-1-heinrich.schuchardt@canonical.com
7
[PMM: minor punctuation tweaks]
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/helper.c | 4 ++--
11
docs/system/arm/virt.rst | 4 ++--
9
1 file changed, 2 insertions(+), 2 deletions(-)
12
1 file changed, 2 insertions(+), 2 deletions(-)
10
13
11
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/helper.c
16
--- a/docs/system/arm/virt.rst
14
+++ b/target/arm/helper.c
17
+++ b/docs/system/arm/virt.rst
15
@@ -XXX,XX +XXX,XX @@ void hw_breakpoint_update(ARMCPU *cpu, int n)
18
@@ -XXX,XX +XXX,XX @@ gic-version
16
case 4: /* unlinked address mismatch (reserved if AArch64) */
19
Valid values are:
17
case 5: /* linked address mismatch (reserved if AArch64) */
20
18
qemu_log_mask(LOG_UNIMP,
21
``2``
19
- "arm: address mismatch breakpoint types not implemented");
22
- GICv2
20
+ "arm: address mismatch breakpoint types not implemented\n");
23
+ GICv2. Note that this limits the number of CPUs to 8.
21
return;
24
``3``
22
case 0: /* unlinked address match */
25
- GICv3
23
case 1: /* linked address match */
26
+ GICv3. This allows up to 512 CPUs.
24
@@ -XXX,XX +XXX,XX @@ void hw_breakpoint_update(ARMCPU *cpu, int n)
27
``host``
25
case 8: /* unlinked VMID match (reserved if no EL2) */
28
Use the same GIC version the host provides, when using KVM
26
case 10: /* unlinked context ID and VMID match (reserved if no EL2) */
29
``max``
27
qemu_log_mask(LOG_UNIMP,
28
- "arm: unlinked context breakpoint types not implemented");
29
+ "arm: unlinked context breakpoint types not implemented\n");
30
return;
31
case 9: /* linked VMID match (reserved if no EL2) */
32
case 11: /* linked context ID and VMID match (reserved if no EL2) */
33
--
30
--
34
2.17.1
31
2.25.1
35
36
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Hao Wu <wuhaotsh@google.com>
2
2
3
These commands got introduced by Spec v3
3
Similar to the Aspeed code in include/misc/aspeed_scu.h, we define
4
(see 0c3fb03f7ec and 4481bbc79d2).
4
the PWRON STRAP fields in their corresponding module for NPCM7XX.
5
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Hao Wu <wuhaotsh@google.com>
7
Message-id: 20180607180641.874-7-f4bug@amsat.org
7
Reviewed-by: Patrick Venture <venture@google.com>
8
Message-id: 20220411165842.3912945-2-wuhaotsh@google.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
hw/sd/sd.c | 6 ++++++
12
include/hw/misc/npcm7xx_gcr.h | 30 ++++++++++++++++++++++++++++++
12
1 file changed, 6 insertions(+)
13
1 file changed, 30 insertions(+)
13
14
14
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
15
diff --git a/include/hw/misc/npcm7xx_gcr.h b/include/hw/misc/npcm7xx_gcr.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/sd/sd.c
17
--- a/include/hw/misc/npcm7xx_gcr.h
17
+++ b/hw/sd/sd.c
18
+++ b/include/hw/misc/npcm7xx_gcr.h
18
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
19
@@ -XXX,XX +XXX,XX @@
19
break;
20
#include "exec/memory.h"
20
21
#include "hw/sysbus.h"
21
case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
22
22
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
23
+/*
23
+ break;
24
+ * NPCM7XX PWRON STRAP bit fields
24
+ }
25
+ * 12: SPI0 powered by VSBV3 at 1.8V
25
if (sd->state == sd_transfer_state) {
26
+ * 11: System flash attached to BMC
26
sd->state = sd_sendingdata_state;
27
+ * 10: BSP alternative pins.
27
sd->data_offset = 0;
28
+ * 9:8: Flash UART command route enabled.
28
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
29
+ * 7: Security enabled.
29
break;
30
+ * 6: HI-Z state control.
30
31
+ * 5: ECC disabled.
31
case 23: /* CMD23: SET_BLOCK_COUNT */
32
+ * 4: Reserved
32
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
33
+ * 3: JTAG2 enabled.
33
+ break;
34
+ * 2:0: CPU and DRAM clock frequency.
34
+ }
35
+ */
35
switch (sd->state) {
36
+#define NPCM7XX_PWRON_STRAP_SPI0F18 BIT(12)
36
case sd_transfer_state:
37
+#define NPCM7XX_PWRON_STRAP_SFAB BIT(11)
37
sd->multi_blk_cnt = req.arg;
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.
38
--
56
--
39
2.17.1
57
2.25.1
40
41
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Hao Wu <wuhaotsh@google.com>
2
2
3
From the "Physical Layer Simplified Specification Version 1.10"
3
This patch uses the defined fields to describe PWRON STRAPs for
4
Chapter 7.3 "SPI Mode Transaction Packets"
4
better readability.
5
Table 57: "Commands and arguments"
6
5
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Hao Wu <wuhaotsh@google.com>
8
Acked-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Patrick Venture <venture@google.com>
9
Message-id: 20180607180641.874-3-f4bug@amsat.org
8
Message-id: 20220411165842.3912945-3-wuhaotsh@google.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
11
---
13
hw/sd/sd.c | 14 --------------
12
hw/arm/npcm7xx_boards.c | 24 +++++++++++++++++++-----
14
1 file changed, 14 deletions(-)
13
1 file changed, 19 insertions(+), 5 deletions(-)
15
14
16
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
15
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/sd/sd.c
17
--- a/hw/arm/npcm7xx_boards.c
19
+++ b/hw/sd/sd.c
18
+++ b/hw/arm/npcm7xx_boards.c
20
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
19
@@ -XXX,XX +XXX,XX @@
21
return sd_illegal;
20
#include "sysemu/sysemu.h"
22
21
#include "sysemu/block-backend.h"
23
case 6:    /* CMD6: SWITCH_FUNCTION */
22
24
- if (sd->spi)
23
-#define NPCM750_EVB_POWER_ON_STRAPS 0x00001ff7
25
- goto bad_cmd;
24
-#define QUANTA_GSJ_POWER_ON_STRAPS 0x00001fff
26
switch (sd->mode) {
25
-#define QUANTA_GBS_POWER_ON_STRAPS 0x000017ff
27
case sd_data_transfer_mode:
26
-#define KUDO_BMC_POWER_ON_STRAPS 0x00001fff
28
sd_function_switch(sd, req.arg);
27
-#define MORI_BMC_POWER_ON_STRAPS 0x00001fff
29
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
28
+#define NPCM7XX_POWER_ON_STRAPS_DEFAULT ( \
30
29
+ NPCM7XX_PWRON_STRAP_SPI0F18 | \
31
/* Block write commands (Class 4) */
30
+ NPCM7XX_PWRON_STRAP_SFAB | \
32
case 24:    /* CMD24: WRITE_SINGLE_BLOCK */
31
+ NPCM7XX_PWRON_STRAP_BSPA | \
33
- if (sd->spi) {
32
+ NPCM7XX_PWRON_STRAP_FUP(FUP_NORM_UART2) | \
34
- goto unimplemented_spi_cmd;
33
+ NPCM7XX_PWRON_STRAP_SECEN | \
35
- }
34
+ NPCM7XX_PWRON_STRAP_HIZ | \
36
switch (sd->state) {
35
+ NPCM7XX_PWRON_STRAP_ECC | \
37
case sd_transfer_state:
36
+ NPCM7XX_PWRON_STRAP_RESERVE1 | \
38
/* Writing in SPI mode not implemented. */
37
+ NPCM7XX_PWRON_STRAP_J2EN | \
39
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
38
+ NPCM7XX_PWRON_STRAP_CKFRQ(CKFRQ_DEFAULT))
40
break;
39
+
41
40
+#define NPCM750_EVB_POWER_ON_STRAPS ( \
42
case 25:    /* CMD25: WRITE_MULTIPLE_BLOCK */
41
+ NPCM7XX_POWER_ON_STRAPS_DEFAULT & ~NPCM7XX_PWRON_STRAP_J2EN)
43
- if (sd->spi) {
42
+#define QUANTA_GSJ_POWER_ON_STRAPS NPCM7XX_POWER_ON_STRAPS_DEFAULT
44
- goto unimplemented_spi_cmd;
43
+#define QUANTA_GBS_POWER_ON_STRAPS ( \
45
- }
44
+ NPCM7XX_POWER_ON_STRAPS_DEFAULT & ~NPCM7XX_PWRON_STRAP_SFAB)
46
switch (sd->state) {
45
+#define KUDO_BMC_POWER_ON_STRAPS NPCM7XX_POWER_ON_STRAPS_DEFAULT
47
case sd_transfer_state:
46
+#define MORI_BMC_POWER_ON_STRAPS NPCM7XX_POWER_ON_STRAPS_DEFAULT
48
/* Writing in SPI mode not implemented. */
47
49
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
48
static const char npcm7xx_default_bootrom[] = "npcm7xx_bootrom.bin";
50
break;
49
51
52
case 27:    /* CMD27: PROGRAM_CSD */
53
- if (sd->spi) {
54
- goto unimplemented_spi_cmd;
55
- }
56
switch (sd->state) {
57
case sd_transfer_state:
58
sd->state = sd_receivingdata_state;
59
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
60
61
/* Lock card commands (Class 7) */
62
case 42:    /* CMD42: LOCK_UNLOCK */
63
- if (sd->spi) {
64
- goto unimplemented_spi_cmd;
65
- }
66
switch (sd->state) {
67
case sd_transfer_state:
68
sd->state = sd_receivingdata_state;
69
--
50
--
70
2.17.1
51
2.25.1
71
72
diff view generated by jsdifflib