1
The following changes since commit 7e7eb9f852a46b51a71ae9d82590b2e4d28827ee:
1
I might squeeze in another pullreq before softfreeze, but the
2
queue was already big enough that I wanted to send this lot out now.
2
3
3
Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2021-01-28' into staging (2021-01-28 22:43:18 +0000)
4
-- PMM
5
6
The following changes since commit 4abf70a661a5df3886ac9d7c19c3617fa92b922a:
7
8
Merge remote-tracking branch 'remotes/maxreitz/tags/pull-block-2020-06-24' into staging (2020-07-03 15:34:45 +0100)
4
9
5
are available in the Git repository at:
10
are available in the Git repository at:
6
11
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210129
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200703
8
13
9
for you to fetch changes up to 11749122e1a86866591306d43603d2795a3dea1a:
14
for you to fetch changes up to 0f10bf84a9d489259a5b11c6aa1b05c1175b76ea:
10
15
11
hw/arm/stellaris: Remove board-creation reset of STELLARIS_SYS (2021-01-29 10:47:29 +0000)
16
Deprecate TileGX port (2020-07-03 16:59:46 +0100)
12
17
13
----------------------------------------------------------------
18
----------------------------------------------------------------
14
target-arm queue:
19
target-arm queue:
15
* Implement ID_PFR2
20
* i.MX6UL EVK board: put PHYs in the correct places
16
* Conditionalize DBGDIDR
21
* hw/arm/virt: Let the virtio-iommu bypass MSIs
17
* rename xlnx-zcu102.canbusN properties
22
* target/arm: kvm: Handle DABT with no valid ISS
18
* provide powerdown/reset mechanism for secure firmware on 'virt' board
23
* hw/arm/virt-acpi-build: Only expose flash on older machine types
19
* hw/misc: Fix arith overflow in NPCM7XX PWM module
24
* target/arm: Fix temp double-free in sve ldr/str
20
* target/arm: Replace magic value by MMU_DATA_LOAD definition
25
* hw/display/bcm2835_fb.c: Initialize all fields of struct
21
* configure: fix preadv errors on Catalina macOS with new XCode
26
* hw/arm/spitz: Code cleanup to fix Coverity-detected memory leak
22
* Various configure and other cleanups in preparation for iOS support
27
* Deprecate TileGX port
23
* hvf: Add hypervisor entitlement to output binaries (needed for Big Sur)
24
* Implement pvpanic-pci device
25
* Convert the CMSDK timer devices to the Clock framework
26
28
27
----------------------------------------------------------------
29
----------------------------------------------------------------
28
Alexander Graf (1):
30
Andrew Jones (4):
29
hvf: Add hypervisor entitlement to output binaries
31
tests/acpi: remove stale allowed tables
32
tests/acpi: virt: allow DSDT acpi table changes
33
hw/arm/virt-acpi-build: Only expose flash on older machine types
34
tests/acpi: virt: update golden masters for DSDT
30
35
31
Hao Wu (1):
36
Beata Michalska (2):
32
hw/misc: Fix arith overflow in NPCM7XX PWM module
37
target/arm: kvm: Handle DABT with no valid ISS
38
target/arm: kvm: Handle misconfigured dabt injection
33
39
34
Joelle van Dyne (7):
40
Eric Auger (5):
35
configure: cross-compiling with empty cross_prefix
41
qdev: Introduce DEFINE_PROP_RESERVED_REGION
36
osdep: build with non-working system() function
42
virtio-iommu: Implement RESV_MEM probe request
37
darwin: remove redundant dependency declaration
43
virtio-iommu: Handle reserved regions in the translation process
38
darwin: fix cross-compiling for Darwin
44
virtio-iommu-pci: Add array of Interval properties
39
configure: cross compile should use x86_64 cpu_family
45
hw/arm/virt: Let the virtio-iommu bypass MSIs
40
darwin: detect CoreAudio for build
41
darwin: remove 64-bit build detection on 32-bit OS
42
46
43
Maxim Uvarov (3):
47
Jean-Christophe Dubois (3):
44
hw: gpio: implement gpio-pwr driver for qemu reset/poweroff
48
Add a phy-num property to the i.MX FEC emulator
45
arm-virt: refactor gpios creation
49
Add the ability to select a different PHY for each i.MX6UL FEC interface
46
arm-virt: add secure pl061 for reset/power down
50
Select MDIO device 2 and 1 as PHY devices for i.MX6UL EVK board.
47
51
48
Mihai Carabas (4):
52
Peter Maydell (19):
49
hw/misc/pvpanic: split-out generic and bus dependent code
53
hw/display/bcm2835_fb.c: Initialize all fields of struct
50
hw/misc/pvpanic: add PCI interface support
54
hw/arm/spitz: Detabify
51
pvpanic : update pvpanic spec document
55
hw/arm/spitz: Create SpitzMachineClass abstract base class
52
tests/qtest: add a test case for pvpanic-pci
56
hw/arm/spitz: Keep pointers to MPU and SSI devices in SpitzMachineState
57
hw/arm/spitz: Keep pointers to scp0, scp1 in SpitzMachineState
58
hw/arm/spitz: Implement inbound GPIO lines for bit5 and power signals
59
hw/misc/max111x: provide QOM properties for setting initial values
60
hw/misc/max111x: Don't use vmstate_register()
61
ssi: Add ssi_realize_and_unref()
62
hw/arm/spitz: Use max111x properties to set initial values
63
hw/misc/max111x: Use GPIO lines rather than max111x_set_input()
64
hw/misc/max111x: Create header file for documentation, TYPE_ macros
65
hw/arm/spitz: Encapsulate misc GPIO handling in a device
66
hw/gpio/zaurus.c: Use LOG_GUEST_ERROR for bad guest register accesses
67
hw/arm/spitz: Use LOG_GUEST_ERROR for bad guest register accesses
68
hw/arm/pxa2xx_pic: Use LOG_GUEST_ERROR for bad guest register accesses
69
hw/arm/spitz: Provide usual QOM macros for corgi-ssp and spitz-lcdtg
70
Replace uses of FROM_SSI_SLAVE() macro with QOM casts
71
Deprecate TileGX port
53
72
54
Paolo Bonzini (1):
73
Richard Henderson (1):
55
arm: rename xlnx-zcu102.canbusN properties
74
target/arm: Fix temp double-free in sve ldr/str
56
75
57
Peter Maydell (26):
76
docs/system/deprecated.rst | 11 +
58
configure: Move preadv check to meson.build
77
include/exec/memory.h | 6 +
59
ptimer: Add new ptimer_set_period_from_clock() function
78
include/hw/arm/fsl-imx6ul.h | 2 +
60
clock: Add new clock_has_source() function
79
include/hw/arm/pxa.h | 1 -
61
tests: Add a simple test of the CMSDK APB timer
80
include/hw/arm/sharpsl.h | 3 -
62
tests: Add a simple test of the CMSDK APB watchdog
81
include/hw/arm/virt.h | 8 +
63
tests: Add a simple test of the CMSDK APB dual timer
82
include/hw/misc/max111x.h | 56 +++
64
hw/timer/cmsdk-apb-timer: Rename CMSDKAPBTIMER struct to CMSDKAPBTimer
83
include/hw/net/imx_fec.h | 1 +
65
hw/timer/cmsdk-apb-timer: Add Clock input
84
include/hw/qdev-properties.h | 3 +
66
hw/timer/cmsdk-apb-dualtimer: Add Clock input
85
include/hw/ssi/ssi.h | 31 +-
67
hw/watchdog/cmsdk-apb-watchdog: Add Clock input
86
include/hw/virtio/virtio-iommu.h | 2 +
68
hw/arm/armsse: Rename "MAINCLK" property to "MAINCLK_FRQ"
87
include/qemu/typedefs.h | 1 +
69
hw/arm/armsse: Wire up clocks
88
target/arm/cpu.h | 2 +
70
hw/arm/mps2: Inline CMSDK_APB_TIMER creation
89
target/arm/kvm_arm.h | 10 +
71
hw/arm/mps2: Create and connect SYSCLK Clock
90
target/arm/translate-a64.h | 1 +
72
hw/arm/mps2-tz: Create and connect ARMSSE Clocks
91
tests/qtest/bios-tables-test-allowed-diff.h | 18 -
73
hw/arm/musca: Create and connect ARMSSE Clocks
92
hw/arm/fsl-imx6ul.c | 10 +
74
hw/arm/stellaris: Convert SSYS to QOM device
93
hw/arm/mcimx6ul-evk.c | 2 +
75
hw/arm/stellaris: Create Clock input for watchdog
94
hw/arm/pxa2xx_pic.c | 9 +-
76
hw/timer/cmsdk-apb-timer: Convert to use Clock input
95
hw/arm/spitz.c | 507 ++++++++++++++++------------
77
hw/timer/cmsdk-apb-dualtimer: Convert to use Clock input
96
hw/arm/virt-acpi-build.c | 5 +-
78
hw/watchdog/cmsdk-apb-watchdog: Convert to use Clock input
97
hw/arm/virt.c | 33 ++
79
tests/qtest/cmsdk-apb-watchdog-test: Test clock changes
98
hw/arm/z2.c | 11 +-
80
hw/arm/armsse: Use Clock to set system_clock_scale
99
hw/core/qdev-properties.c | 89 +++++
81
arm: Don't set freq properties on CMSDK timer, dualtimer, watchdog, ARMSSE
100
hw/display/ads7846.c | 9 +-
82
arm: Remove frq properties on CMSDK timer, dualtimer, watchdog, ARMSSE
101
hw/display/bcm2835_fb.c | 4 +
83
hw/arm/stellaris: Remove board-creation reset of STELLARIS_SYS
102
hw/display/ssd0323.c | 10 +-
103
hw/gpio/zaurus.c | 12 +-
104
hw/misc/max111x.c | 86 +++--
105
hw/net/imx_fec.c | 24 +-
106
hw/sd/ssi-sd.c | 4 +-
107
hw/ssi/ssi.c | 7 +-
108
hw/virtio/virtio-iommu-pci.c | 11 +
109
hw/virtio/virtio-iommu.c | 114 ++++++-
110
target/arm/kvm.c | 80 +++++
111
target/arm/kvm32.c | 34 ++
112
target/arm/kvm64.c | 49 +++
113
target/arm/translate-a64.c | 6 +
114
target/arm/translate-sve.c | 8 +-
115
MAINTAINERS | 1 +
116
hw/net/trace-events | 4 +-
117
hw/virtio/trace-events | 1 +
118
tests/data/acpi/virt/DSDT | Bin 5307 -> 5205 bytes
119
tests/data/acpi/virt/DSDT.memhp | Bin 6668 -> 6566 bytes
120
tests/data/acpi/virt/DSDT.numamem | Bin 5307 -> 5205 bytes
121
45 files changed, 974 insertions(+), 312 deletions(-)
122
create mode 100644 include/hw/misc/max111x.h
84
123
85
Philippe Mathieu-Daudé (1):
86
target/arm: Replace magic value by MMU_DATA_LOAD definition
87
88
Richard Henderson (2):
89
target/arm: Implement ID_PFR2
90
target/arm: Conditionalize DBGDIDR
91
92
docs/devel/clocks.rst | 16 +++
93
docs/specs/pci-ids.txt | 1 +
94
docs/specs/pvpanic.txt | 13 ++-
95
docs/system/arm/virt.rst | 2 +
96
configure | 78 ++++++++------
97
meson.build | 34 ++++++-
98
include/hw/arm/armsse.h | 14 ++-
99
include/hw/arm/virt.h | 2 +
100
include/hw/clock.h | 15 +++
101
include/hw/misc/pvpanic.h | 24 ++++-
102
include/hw/pci/pci.h | 1 +
103
include/hw/ptimer.h | 22 ++++
104
include/hw/timer/cmsdk-apb-dualtimer.h | 5 +-
105
include/hw/timer/cmsdk-apb-timer.h | 34 ++-----
106
include/hw/watchdog/cmsdk-apb-watchdog.h | 5 +-
107
include/qemu/osdep.h | 12 +++
108
include/qemu/typedefs.h | 1 +
109
target/arm/cpu.h | 1 +
110
hw/arm/armsse.c | 48 ++++++---
111
hw/arm/mps2-tz.c | 14 ++-
112
hw/arm/mps2.c | 28 ++++-
113
hw/arm/musca.c | 13 ++-
114
hw/arm/stellaris.c | 170 +++++++++++++++++++++++--------
115
hw/arm/virt.c | 111 ++++++++++++++++----
116
hw/arm/xlnx-zcu102.c | 4 +-
117
hw/core/ptimer.c | 34 +++++++
118
hw/gpio/gpio_pwr.c | 70 +++++++++++++
119
hw/misc/npcm7xx_pwm.c | 23 ++++-
120
hw/misc/pvpanic-isa.c | 94 +++++++++++++++++
121
hw/misc/pvpanic-pci.c | 94 +++++++++++++++++
122
hw/misc/pvpanic.c | 85 ++--------------
123
hw/timer/cmsdk-apb-dualtimer.c | 53 +++++++---
124
hw/timer/cmsdk-apb-timer.c | 55 +++++-----
125
hw/watchdog/cmsdk-apb-watchdog.c | 29 ++++--
126
target/arm/helper.c | 27 +++--
127
target/arm/kvm64.c | 2 +
128
tests/qtest/cmsdk-apb-dualtimer-test.c | 130 +++++++++++++++++++++++
129
tests/qtest/cmsdk-apb-timer-test.c | 75 ++++++++++++++
130
tests/qtest/cmsdk-apb-watchdog-test.c | 131 ++++++++++++++++++++++++
131
tests/qtest/npcm7xx_pwm-test.c | 4 +-
132
tests/qtest/pvpanic-pci-test.c | 94 +++++++++++++++++
133
tests/qtest/xlnx-can-test.c | 30 +++---
134
MAINTAINERS | 3 +
135
accel/hvf/entitlements.plist | 8 ++
136
hw/arm/Kconfig | 1 +
137
hw/gpio/Kconfig | 3 +
138
hw/gpio/meson.build | 1 +
139
hw/i386/Kconfig | 2 +-
140
hw/misc/Kconfig | 12 ++-
141
hw/misc/meson.build | 4 +-
142
scripts/entitlement.sh | 13 +++
143
tests/qtest/meson.build | 6 +-
144
52 files changed, 1432 insertions(+), 319 deletions(-)
145
create mode 100644 hw/gpio/gpio_pwr.c
146
create mode 100644 hw/misc/pvpanic-isa.c
147
create mode 100644 hw/misc/pvpanic-pci.c
148
create mode 100644 tests/qtest/cmsdk-apb-dualtimer-test.c
149
create mode 100644 tests/qtest/cmsdk-apb-timer-test.c
150
create mode 100644 tests/qtest/cmsdk-apb-watchdog-test.c
151
create mode 100644 tests/qtest/pvpanic-pci-test.c
152
create mode 100644 accel/hvf/entitlements.plist
153
create mode 100755 scripts/entitlement.sh
154
diff view generated by jsdifflib
1
While we transition the ARMSSE code from integer properties
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
specifying clock frequencies to Clock objects, we want to have the
3
device provide both at once. We want the final name of the main
4
input Clock to be "MAINCLK", following the hardware name.
5
Unfortunately creating an input Clock with a name X creates an
6
under-the-hood QOM property X; for "MAINCLK" this clashes with the
7
existing UINT32 property of that name.
8
2
9
Rename the UINT32 property to MAINCLK_FRQ so it can coexist with the
3
We need a solution to use an Ethernet PHY that is not the first device
10
MAINCLK Clock; once the transition is complete MAINCLK_FRQ will be
4
on the MDIO bus (device 0 on MDIO bus).
11
deleted.
12
5
13
Commit created with:
6
As an example with the i.MX6UL the NXP SOC has 2 Ethernet devices but
14
perl -p -i -e 's/MAINCLK/MAINCLK_FRQ/g' hw/arm/{armsse,mps2-tz,musca}.c include/hw/arm/armsse.h
7
only one MDIO bus on which the 2 related PHY are connected but at unique
8
addresses.
15
9
10
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
11
Message-id: a1a5c0e139d1c763194b8020573dcb6025daeefa.1593296112.git.jcd@tribudubois.net
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Reviewed-by: Luc Michel <luc@lmichel.fr>
19
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
Message-id: 20210128114145.20536-11-peter.maydell@linaro.org
21
Message-id: 20210121190622.22000-11-peter.maydell@linaro.org
22
---
14
---
23
include/hw/arm/armsse.h | 2 +-
15
include/hw/net/imx_fec.h | 1 +
24
hw/arm/armsse.c | 6 +++---
16
hw/net/imx_fec.c | 24 +++++++++++++++++-------
25
hw/arm/mps2-tz.c | 2 +-
17
hw/net/trace-events | 4 ++--
26
hw/arm/musca.c | 2 +-
18
3 files changed, 20 insertions(+), 9 deletions(-)
27
4 files changed, 6 insertions(+), 6 deletions(-)
28
19
29
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
20
diff --git a/include/hw/net/imx_fec.h b/include/hw/net/imx_fec.h
30
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
31
--- a/include/hw/arm/armsse.h
22
--- a/include/hw/net/imx_fec.h
32
+++ b/include/hw/arm/armsse.h
23
+++ b/include/hw/net/imx_fec.h
33
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ typedef struct IMXFECState {
34
* QEMU interface:
25
uint32_t phy_advertise;
35
* + QOM property "memory" is a MemoryRegion containing the devices provided
26
uint32_t phy_int;
36
* by the board model.
27
uint32_t phy_int_mask;
37
- * + QOM property "MAINCLK" is the frequency of the main system clock
28
+ uint32_t phy_num;
38
+ * + QOM property "MAINCLK_FRQ" is the frequency of the main system clock
29
39
* + QOM property "EXP_NUMIRQ" sets the number of expansion interrupts.
30
bool is_fec;
40
* (In hardware, the SSE-200 permits the number of expansion interrupts
31
41
* for the two CPUs to be configured separately, but we restrict it to
32
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
42
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
43
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
44
--- a/hw/arm/armsse.c
34
--- a/hw/net/imx_fec.c
45
+++ b/hw/arm/armsse.c
35
+++ b/hw/net/imx_fec.c
46
@@ -XXX,XX +XXX,XX @@ static Property iotkit_properties[] = {
36
@@ -XXX,XX +XXX,XX @@ static void imx_phy_reset(IMXFECState *s)
47
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
37
static uint32_t imx_phy_read(IMXFECState *s, int reg)
48
MemoryRegion *),
38
{
49
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
39
uint32_t val;
50
- DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
40
+ uint32_t phy = reg / 32;
51
+ DEFINE_PROP_UINT32("MAINCLK_FRQ", ARMSSE, mainclk_frq, 0),
41
52
DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
42
- if (reg > 31) {
53
DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
43
- /* we only advertise one phy */
54
DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], true),
44
+ if (phy != s->phy_num) {
55
@@ -XXX,XX +XXX,XX @@ static Property armsse_properties[] = {
45
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s.phy]%s: Bad phy num %u\n",
56
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
46
+ TYPE_IMX_FEC, __func__, phy);
57
MemoryRegion *),
47
return 0;
58
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
59
- DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
60
+ DEFINE_PROP_UINT32("MAINCLK_FRQ", ARMSSE, mainclk_frq, 0),
61
DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
62
DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
63
DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], false),
64
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
65
}
48
}
66
49
67
if (!s->mainclk_frq) {
50
+ reg %= 32;
68
- error_setg(errp, "MAINCLK property was not set");
51
+
69
+ error_setg(errp, "MAINCLK_FRQ property was not set");
52
switch (reg) {
53
case 0: /* Basic Control */
54
val = s->phy_control;
55
@@ -XXX,XX +XXX,XX @@ static uint32_t imx_phy_read(IMXFECState *s, int reg)
56
break;
57
}
58
59
- trace_imx_phy_read(val, reg);
60
+ trace_imx_phy_read(val, phy, reg);
61
62
return val;
63
}
64
65
static void imx_phy_write(IMXFECState *s, int reg, uint32_t val)
66
{
67
- trace_imx_phy_write(val, reg);
68
+ uint32_t phy = reg / 32;
69
70
- if (reg > 31) {
71
- /* we only advertise one phy */
72
+ if (phy != s->phy_num) {
73
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s.phy]%s: Bad phy num %u\n",
74
+ TYPE_IMX_FEC, __func__, phy);
70
return;
75
return;
71
}
76
}
72
77
73
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
78
+ reg %= 32;
79
+
80
+ trace_imx_phy_write(val, phy, reg);
81
+
82
switch (reg) {
83
case 0: /* Basic Control */
84
if (val & 0x8000) {
85
@@ -XXX,XX +XXX,XX @@ static void imx_eth_write(void *opaque, hwaddr offset, uint64_t value,
86
extract32(value,
87
18, 10)));
88
} else {
89
- /* This a write operation */
90
+ /* This is a write operation */
91
imx_phy_write(s, extract32(value, 18, 10), extract32(value, 0, 16));
92
}
93
/* raise the interrupt as the PHY operation is done */
94
@@ -XXX,XX +XXX,XX @@ static void imx_eth_realize(DeviceState *dev, Error **errp)
95
static Property imx_eth_properties[] = {
96
DEFINE_NIC_PROPERTIES(IMXFECState, conf),
97
DEFINE_PROP_UINT32("tx-ring-num", IMXFECState, tx_ring_num, 1),
98
+ DEFINE_PROP_UINT32("phy-num", IMXFECState, phy_num, 0),
99
DEFINE_PROP_END_OF_LIST(),
100
};
101
102
diff --git a/hw/net/trace-events b/hw/net/trace-events
74
index XXXXXXX..XXXXXXX 100644
103
index XXXXXXX..XXXXXXX 100644
75
--- a/hw/arm/mps2-tz.c
104
--- a/hw/net/trace-events
76
+++ b/hw/arm/mps2-tz.c
105
+++ b/hw/net/trace-events
77
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
106
@@ -XXX,XX +XXX,XX @@ i82596_set_multicast(uint16_t count) "Added %d multicast entries"
78
object_property_set_link(OBJECT(&mms->iotkit), "memory",
107
i82596_channel_attention(void *s) "%p: Received CHANNEL ATTENTION"
79
OBJECT(system_memory), &error_abort);
108
80
qdev_prop_set_uint32(iotkitdev, "EXP_NUMIRQ", MPS2TZ_NUMIRQ);
109
# imx_fec.c
81
- qdev_prop_set_uint32(iotkitdev, "MAINCLK", SYSCLK_FRQ);
110
-imx_phy_read(uint32_t val, int reg) "0x%04"PRIx32" <= reg[%d]"
82
+ qdev_prop_set_uint32(iotkitdev, "MAINCLK_FRQ", SYSCLK_FRQ);
111
-imx_phy_write(uint32_t val, int reg) "0x%04"PRIx32" => reg[%d]"
83
sysbus_realize(SYS_BUS_DEVICE(&mms->iotkit), &error_fatal);
112
+imx_phy_read(uint32_t val, int phy, int reg) "0x%04"PRIx32" <= phy[%d].reg[%d]"
84
113
+imx_phy_write(uint32_t val, int phy, int reg) "0x%04"PRIx32" => phy[%d].reg[%d]"
85
/*
114
imx_phy_update_link(const char *s) "%s"
86
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
115
imx_phy_reset(void) ""
87
index XXXXXXX..XXXXXXX 100644
116
imx_fec_read_bd(uint64_t addr, int flags, int len, int data) "tx_bd 0x%"PRIx64" flags 0x%04x len %d data 0x%08x"
88
--- a/hw/arm/musca.c
89
+++ b/hw/arm/musca.c
90
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
91
qdev_prop_set_uint32(ssedev, "EXP_NUMIRQ", mmc->num_irqs);
92
qdev_prop_set_uint32(ssedev, "init-svtor", mmc->init_svtor);
93
qdev_prop_set_uint32(ssedev, "SRAM_ADDR_WIDTH", mmc->sram_addr_width);
94
- qdev_prop_set_uint32(ssedev, "MAINCLK", SYSCLK_FRQ);
95
+ qdev_prop_set_uint32(ssedev, "MAINCLK_FRQ", SYSCLK_FRQ);
96
/*
97
* Musca-A takes the default SSE-200 FPU/DSP settings (ie no for
98
* CPU0 and yes for CPU1); Musca-B1 explicitly enables them for CPU0.
99
--
117
--
100
2.20.1
118
2.20.1
101
119
102
120
diff view generated by jsdifflib
1
From: Mihai Carabas <mihai.carabas@oracle.com>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
Add PCI interface support for PVPANIC device. Create a new file pvpanic-pci.c
3
Add properties to the i.MX6UL processor to be able to select a
4
where the PCI specific routines reside and update the build system with the new
4
particular PHY on the MDIO bus for each FEC device.
5
files and config structure.
6
5
7
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
6
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
8
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
7
Message-id: ea1d604198b6b73ea6521676e45bacfc597aba53.1593296112.git.jcd@tribudubois.net
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
10
---
13
docs/specs/pci-ids.txt | 1 +
11
include/hw/arm/fsl-imx6ul.h | 2 ++
14
include/hw/misc/pvpanic.h | 1 +
12
hw/arm/fsl-imx6ul.c | 10 ++++++++++
15
include/hw/pci/pci.h | 1 +
13
2 files changed, 12 insertions(+)
16
hw/misc/pvpanic-pci.c | 94 +++++++++++++++++++++++++++++++++++++++
17
hw/misc/Kconfig | 6 +++
18
hw/misc/meson.build | 1 +
19
6 files changed, 104 insertions(+)
20
create mode 100644 hw/misc/pvpanic-pci.c
21
14
22
diff --git a/docs/specs/pci-ids.txt b/docs/specs/pci-ids.txt
15
diff --git a/include/hw/arm/fsl-imx6ul.h b/include/hw/arm/fsl-imx6ul.h
23
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
24
--- a/docs/specs/pci-ids.txt
17
--- a/include/hw/arm/fsl-imx6ul.h
25
+++ b/docs/specs/pci-ids.txt
18
+++ b/include/hw/arm/fsl-imx6ul.h
26
@@ -XXX,XX +XXX,XX @@ PCI devices (other than virtio):
19
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6ULState {
27
1b36:000d PCI xhci usb host adapter
20
MemoryRegion caam;
28
1b36:000f mdpy (mdev sample device), linux/samples/vfio-mdev/mdpy.c
21
MemoryRegion ocram;
29
1b36:0010 PCIe NVMe device (-device nvme)
22
MemoryRegion ocram_alias;
30
+1b36:0011 PCI PVPanic device (-device pvpanic-pci)
23
+
31
24
+ uint32_t phy_num[FSL_IMX6UL_NUM_ETHS];
32
All these devices are documented in docs/specs.
25
} FslIMX6ULState;
33
26
34
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
27
enum FslIMX6ULMemoryMap {
28
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
35
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
36
--- a/include/hw/misc/pvpanic.h
30
--- a/hw/arm/fsl-imx6ul.c
37
+++ b/include/hw/misc/pvpanic.h
31
+++ b/hw/arm/fsl-imx6ul.c
38
@@ -XXX,XX +XXX,XX @@
32
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
39
#include "qom/object.h"
33
FSL_IMX6UL_ENET2_TIMER_IRQ,
40
34
};
41
#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
35
42
+#define TYPE_PVPANIC_PCI_DEVICE "pvpanic-pci"
36
+ object_property_set_uint(OBJECT(&s->eth[i]),
43
37
+ s->phy_num[i],
44
#define PVPANIC_IOPORT_PROP "ioport"
38
+ "phy-num", &error_abort);
45
39
object_property_set_uint(OBJECT(&s->eth[i]),
46
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
40
FSL_IMX6UL_ETH_NUM_TX_RINGS,
47
index XXXXXXX..XXXXXXX 100644
41
"tx-ring-num", &error_abort);
48
--- a/include/hw/pci/pci.h
42
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
49
+++ b/include/hw/pci/pci.h
43
FSL_IMX6UL_OCRAM_ALIAS_ADDR, &s->ocram_alias);
50
@@ -XXX,XX +XXX,XX @@ extern bool pci_available;
44
}
51
#define PCI_DEVICE_ID_REDHAT_PCIE_BRIDGE 0x000e
45
52
#define PCI_DEVICE_ID_REDHAT_MDPY 0x000f
46
+static Property fsl_imx6ul_properties[] = {
53
#define PCI_DEVICE_ID_REDHAT_NVME 0x0010
47
+ DEFINE_PROP_UINT32("fec1-phy-num", FslIMX6ULState, phy_num[0], 0),
54
+#define PCI_DEVICE_ID_REDHAT_PVPANIC 0x0011
48
+ DEFINE_PROP_UINT32("fec2-phy-num", FslIMX6ULState, phy_num[1], 1),
55
#define PCI_DEVICE_ID_REDHAT_QXL 0x0100
56
57
#define FMT_PCIBUS PRIx64
58
diff --git a/hw/misc/pvpanic-pci.c b/hw/misc/pvpanic-pci.c
59
new file mode 100644
60
index XXXXXXX..XXXXXXX
61
--- /dev/null
62
+++ b/hw/misc/pvpanic-pci.c
63
@@ -XXX,XX +XXX,XX @@
64
+/*
65
+ * QEMU simulated PCI pvpanic device.
66
+ *
67
+ * Copyright (C) 2020 Oracle
68
+ *
69
+ * Authors:
70
+ * Mihai Carabas <mihai.carabas@oracle.com>
71
+ *
72
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
73
+ * See the COPYING file in the top-level directory.
74
+ *
75
+ */
76
+
77
+#include "qemu/osdep.h"
78
+#include "qemu/log.h"
79
+#include "qemu/module.h"
80
+#include "sysemu/runstate.h"
81
+
82
+#include "hw/nvram/fw_cfg.h"
83
+#include "hw/qdev-properties.h"
84
+#include "migration/vmstate.h"
85
+#include "hw/misc/pvpanic.h"
86
+#include "qom/object.h"
87
+#include "hw/pci/pci.h"
88
+
89
+OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState, PVPANIC_PCI_DEVICE)
90
+
91
+/*
92
+ * PVPanicPCIState for PCI device
93
+ */
94
+typedef struct PVPanicPCIState {
95
+ PCIDevice dev;
96
+ PVPanicState pvpanic;
97
+} PVPanicPCIState;
98
+
99
+static const VMStateDescription vmstate_pvpanic_pci = {
100
+ .name = "pvpanic-pci",
101
+ .version_id = 1,
102
+ .minimum_version_id = 1,
103
+ .fields = (VMStateField[]) {
104
+ VMSTATE_PCI_DEVICE(dev, PVPanicPCIState),
105
+ VMSTATE_END_OF_LIST()
106
+ }
107
+};
108
+
109
+static void pvpanic_pci_realizefn(PCIDevice *dev, Error **errp)
110
+{
111
+ PVPanicPCIState *s = PVPANIC_PCI_DEVICE(dev);
112
+ PVPanicState *ps = &s->pvpanic;
113
+
114
+ pvpanic_setup_io(&s->pvpanic, DEVICE(s), 2);
115
+
116
+ pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &ps->mr);
117
+}
118
+
119
+static Property pvpanic_pci_properties[] = {
120
+ DEFINE_PROP_UINT8("events", PVPanicPCIState, pvpanic.events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
121
+ DEFINE_PROP_END_OF_LIST(),
49
+ DEFINE_PROP_END_OF_LIST(),
122
+};
50
+};
123
+
51
+
124
+static void pvpanic_pci_class_init(ObjectClass *klass, void *data)
52
static void fsl_imx6ul_class_init(ObjectClass *oc, void *data)
125
+{
53
{
126
+ DeviceClass *dc = DEVICE_CLASS(klass);
54
DeviceClass *dc = DEVICE_CLASS(oc);
127
+ PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
55
128
+
56
+ device_class_set_props(dc, fsl_imx6ul_properties);
129
+ device_class_set_props(dc, pvpanic_pci_properties);
57
dc->realize = fsl_imx6ul_realize;
130
+
58
dc->desc = "i.MX6UL SOC";
131
+ pc->realize = pvpanic_pci_realizefn;
59
/* Reason: Uses serial_hds and nd_table in realize() directly */
132
+ pc->vendor_id = PCI_VENDOR_ID_REDHAT;
133
+ pc->device_id = PCI_DEVICE_ID_REDHAT_PVPANIC;
134
+ pc->revision = 1;
135
+ pc->class_id = PCI_CLASS_SYSTEM_OTHER;
136
+ dc->vmsd = &vmstate_pvpanic_pci;
137
+
138
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
139
+}
140
+
141
+static TypeInfo pvpanic_pci_info = {
142
+ .name = TYPE_PVPANIC_PCI_DEVICE,
143
+ .parent = TYPE_PCI_DEVICE,
144
+ .instance_size = sizeof(PVPanicPCIState),
145
+ .class_init = pvpanic_pci_class_init,
146
+ .interfaces = (InterfaceInfo[]) {
147
+ { INTERFACE_CONVENTIONAL_PCI_DEVICE },
148
+ { }
149
+ }
150
+};
151
+
152
+static void pvpanic_register_types(void)
153
+{
154
+ type_register_static(&pvpanic_pci_info);
155
+}
156
+
157
+type_init(pvpanic_register_types);
158
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
159
index XXXXXXX..XXXXXXX 100644
160
--- a/hw/misc/Kconfig
161
+++ b/hw/misc/Kconfig
162
@@ -XXX,XX +XXX,XX @@ config IOTKIT_SYSINFO
163
config PVPANIC_COMMON
164
bool
165
166
+config PVPANIC_PCI
167
+ bool
168
+ default y if PCI_DEVICES
169
+ depends on PCI
170
+ select PVPANIC_COMMON
171
+
172
config PVPANIC_ISA
173
bool
174
depends on ISA_BUS
175
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
176
index XXXXXXX..XXXXXXX 100644
177
--- a/hw/misc/meson.build
178
+++ b/hw/misc/meson.build
179
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ARMSSE_CPUID', if_true: files('armsse-cpuid.c'))
180
softmmu_ss.add(when: 'CONFIG_ARMSSE_MHU', if_true: files('armsse-mhu.c'))
181
182
softmmu_ss.add(when: 'CONFIG_PVPANIC_ISA', if_true: files('pvpanic-isa.c'))
183
+softmmu_ss.add(when: 'CONFIG_PVPANIC_PCI', if_true: files('pvpanic-pci.c'))
184
softmmu_ss.add(when: 'CONFIG_AUX', if_true: files('auxbus.c'))
185
softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_scu.c', 'aspeed_sdmc.c', 'aspeed_xdma.c'))
186
softmmu_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-sysreg.c'))
187
--
60
--
188
2.20.1
61
2.20.1
189
62
190
63
diff view generated by jsdifflib
1
From: Mihai Carabas <mihai.carabas@oracle.com>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
Add pvpanic PCI device support details in docs/specs/pvpanic.txt.
3
The i.MX6UL EVK 14x14 board uses:
4
- PHY 2 for FEC 1
5
- PHY 1 for FEC 2
4
6
5
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
7
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
8
Message-id: fb41992126c091a71d76ab3d1898959091f60583.1593296112.git.jcd@tribudubois.net
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
11
---
9
docs/specs/pvpanic.txt | 13 ++++++++++++-
12
hw/arm/mcimx6ul-evk.c | 2 ++
10
1 file changed, 12 insertions(+), 1 deletion(-)
13
1 file changed, 2 insertions(+)
11
14
12
diff --git a/docs/specs/pvpanic.txt b/docs/specs/pvpanic.txt
15
diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/docs/specs/pvpanic.txt
17
--- a/hw/arm/mcimx6ul-evk.c
15
+++ b/docs/specs/pvpanic.txt
18
+++ b/hw/arm/mcimx6ul-evk.c
16
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static void mcimx6ul_evk_init(MachineState *machine)
17
PVPANIC DEVICE
20
18
==============
21
s = FSL_IMX6UL(object_new(TYPE_FSL_IMX6UL));
19
22
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
20
-pvpanic device is a simulated ISA device, through which a guest panic
23
+ object_property_set_uint(OBJECT(s), 2, "fec1-phy-num", &error_fatal);
21
+pvpanic device is a simulated device, through which a guest panic
24
+ object_property_set_uint(OBJECT(s), 1, "fec2-phy-num", &error_fatal);
22
event is sent to qemu, and a QMP event is generated. This allows
25
qdev_realize(DEVICE(s), NULL, &error_fatal);
23
management apps (e.g. libvirt) to be notified and respond to the event.
26
24
27
memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
25
@@ -XXX,XX +XXX,XX @@ The management app has the option of waiting for GUEST_PANICKED events,
26
and/or polling for guest-panicked RunState, to learn when the pvpanic
27
device has fired a panic event.
28
29
+The pvpanic device can be implemented as an ISA device (using IOPORT) or as a
30
+PCI device.
31
+
32
ISA Interface
33
-------------
34
35
@@ -XXX,XX +XXX,XX @@ bit 1: a guest panic has happened and will be handled by the guest;
36
the host should record it or report it, but should not affect
37
the execution of the guest.
38
39
+PCI Interface
40
+-------------
41
+
42
+The PCI interface is similar to the ISA interface except that it uses an MMIO
43
+address space provided by its BAR0, 1 byte long. Any machine with a PCI bus
44
+can enable a pvpanic device by adding '-device pvpanic-pci' to the command
45
+line.
46
+
47
ACPI Interface
48
--------------
49
50
--
28
--
51
2.20.1
29
2.20.1
52
30
53
31
diff view generated by jsdifflib
1
From: Mihai Carabas <mihai.carabas@oracle.com>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
To ease the PCI device addition in next patches, split the code as follows:
3
Introduce a new property defining a reserved region:
4
- generic code (read/write/setup) is being kept in pvpanic.c
4
<low address>:<high address>:<type>.
5
- ISA dependent code moved to pvpanic-isa.c
6
5
7
Also, rename:
6
This will be used to encode reserved IOVA regions.
8
- ISA_PVPANIC_DEVICE -> PVPANIC_ISA_DEVICE.
9
- TYPE_PVPANIC -> TYPE_PVPANIC_ISA.
10
- MemoryRegion io -> mr.
11
- pvpanic_ioport_* in pvpanic_*.
12
7
13
Update the build system with the new files and config structure.
8
For instance, in virtio-iommu use case, reserved IOVA regions
9
will be passed by the machine code to the virtio-iommu-pci
10
device (an array of those). The type of the reserved region
11
will match the virtio_iommu_probe_resv_mem subtype value:
12
- VIRTIO_IOMMU_RESV_MEM_T_RESERVED (0)
13
- VIRTIO_IOMMU_RESV_MEM_T_MSI (1)
14
14
15
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
15
on PC/Q35 machine, this will be used to inform the
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
virtio-iommu-pci device it should bypass the MSI region.
17
The reserved region will be: 0xfee00000:0xfeefffff:1.
18
19
On ARM, we can declare the ITS MSI doorbell as an MSI
20
region to prevent MSIs from being mapped on guest side.
21
22
Signed-off-by: Eric Auger <eric.auger@redhat.com>
23
Reviewed-by: Markus Armbruster <armbru@redhat.com>
24
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
25
Message-id: 20200629070404.10969-2-eric.auger@redhat.com
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
27
---
19
include/hw/misc/pvpanic.h | 23 +++++++++-
28
include/exec/memory.h | 6 +++
20
hw/misc/pvpanic-isa.c | 94 +++++++++++++++++++++++++++++++++++++++
29
include/hw/qdev-properties.h | 3 ++
21
hw/misc/pvpanic.c | 85 +++--------------------------------
30
include/qemu/typedefs.h | 1 +
22
hw/i386/Kconfig | 2 +-
31
hw/core/qdev-properties.c | 89 ++++++++++++++++++++++++++++++++++++
23
hw/misc/Kconfig | 6 ++-
32
4 files changed, 99 insertions(+)
24
hw/misc/meson.build | 3 +-
25
tests/qtest/meson.build | 2 +-
26
7 files changed, 130 insertions(+), 85 deletions(-)
27
create mode 100644 hw/misc/pvpanic-isa.c
28
33
29
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
34
diff --git a/include/exec/memory.h b/include/exec/memory.h
30
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
31
--- a/include/hw/misc/pvpanic.h
36
--- a/include/exec/memory.h
32
+++ b/include/hw/misc/pvpanic.h
37
+++ b/include/exec/memory.h
38
@@ -XXX,XX +XXX,XX @@ extern bool global_dirty_log;
39
40
typedef struct MemoryRegionOps MemoryRegionOps;
41
42
+struct ReservedRegion {
43
+ hwaddr low;
44
+ hwaddr high;
45
+ unsigned type;
46
+};
47
+
48
typedef struct IOMMUTLBEntry IOMMUTLBEntry;
49
50
/* See address_space_translate: bit 0 is read, bit 1 is write. */
51
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
52
index XXXXXXX..XXXXXXX 100644
53
--- a/include/hw/qdev-properties.h
54
+++ b/include/hw/qdev-properties.h
55
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_string;
56
extern const PropertyInfo qdev_prop_chr;
57
extern const PropertyInfo qdev_prop_tpm;
58
extern const PropertyInfo qdev_prop_macaddr;
59
+extern const PropertyInfo qdev_prop_reserved_region;
60
extern const PropertyInfo qdev_prop_on_off_auto;
61
extern const PropertyInfo qdev_prop_multifd_compression;
62
extern const PropertyInfo qdev_prop_losttickpolicy;
63
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_pcie_link_width;
64
DEFINE_PROP(_n, _s, _f, qdev_prop_drive_iothread, BlockBackend *)
65
#define DEFINE_PROP_MACADDR(_n, _s, _f) \
66
DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr)
67
+#define DEFINE_PROP_RESERVED_REGION(_n, _s, _f) \
68
+ DEFINE_PROP(_n, _s, _f, qdev_prop_reserved_region, ReservedRegion)
69
#define DEFINE_PROP_ON_OFF_AUTO(_n, _s, _f, _d) \
70
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto)
71
#define DEFINE_PROP_MULTIFD_COMPRESSION(_n, _s, _f, _d) \
72
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
73
index XXXXXXX..XXXXXXX 100644
74
--- a/include/qemu/typedefs.h
75
+++ b/include/qemu/typedefs.h
76
@@ -XXX,XX +XXX,XX @@ typedef struct ISABus ISABus;
77
typedef struct ISADevice ISADevice;
78
typedef struct IsaDma IsaDma;
79
typedef struct MACAddr MACAddr;
80
+typedef struct ReservedRegion ReservedRegion;
81
typedef struct MachineClass MachineClass;
82
typedef struct MachineState MachineState;
83
typedef struct MemoryListener MemoryListener;
84
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/hw/core/qdev-properties.c
87
+++ b/hw/core/qdev-properties.c
33
@@ -XXX,XX +XXX,XX @@
88
@@ -XXX,XX +XXX,XX @@
34
89
#include "chardev/char.h"
35
#include "qom/object.h"
90
#include "qemu/uuid.h"
36
91
#include "qemu/units.h"
37
-#define TYPE_PVPANIC "pvpanic"
92
+#include "qemu/cutils.h"
38
+#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
93
39
94
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
40
#define PVPANIC_IOPORT_PROP "ioport"
95
Error **errp)
41
96
@@ -XXX,XX +XXX,XX @@ const PropertyInfo qdev_prop_macaddr = {
42
+/* The bit of supported pv event, TODO: include uapi header and remove this */
97
.set = set_mac,
43
+#define PVPANIC_F_PANICKED 0
98
};
44
+#define PVPANIC_F_CRASHLOADED 1
99
45
+
100
+/* --- Reserved Region --- */
46
+/* The pv event value */
47
+#define PVPANIC_PANICKED (1 << PVPANIC_F_PANICKED)
48
+#define PVPANIC_CRASHLOADED (1 << PVPANIC_F_CRASHLOADED)
49
+
101
+
50
+/*
102
+/*
51
+ * PVPanicState for any device type
103
+ * Accepted syntax:
104
+ * <low address>:<high address>:<type>
105
+ * where low/high addresses are uint64_t in hexadecimal
106
+ * and type is a non-negative decimal integer
52
+ */
107
+ */
53
+typedef struct PVPanicState PVPanicState;
108
+static void get_reserved_region(Object *obj, Visitor *v, const char *name,
54
+struct PVPanicState {
109
+ void *opaque, Error **errp)
55
+ MemoryRegion mr;
110
+{
56
+ uint8_t events;
111
+ DeviceState *dev = DEVICE(obj);
57
+};
112
+ Property *prop = opaque;
113
+ ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
114
+ char buffer[64];
115
+ char *p = buffer;
116
+ int rc;
58
+
117
+
59
+void pvpanic_setup_io(PVPanicState *s, DeviceState *dev, unsigned size);
118
+ rc = snprintf(buffer, sizeof(buffer), "0x%"PRIx64":0x%"PRIx64":%u",
119
+ rr->low, rr->high, rr->type);
120
+ assert(rc < sizeof(buffer));
60
+
121
+
61
static inline uint16_t pvpanic_port(void)
122
+ visit_type_str(v, name, &p, errp);
62
{
63
- Object *o = object_resolve_path_type("", TYPE_PVPANIC, NULL);
64
+ Object *o = object_resolve_path_type("", TYPE_PVPANIC_ISA_DEVICE, NULL);
65
if (!o) {
66
return 0;
67
}
68
diff --git a/hw/misc/pvpanic-isa.c b/hw/misc/pvpanic-isa.c
69
new file mode 100644
70
index XXXXXXX..XXXXXXX
71
--- /dev/null
72
+++ b/hw/misc/pvpanic-isa.c
73
@@ -XXX,XX +XXX,XX @@
74
+/*
75
+ * QEMU simulated pvpanic device.
76
+ *
77
+ * Copyright Fujitsu, Corp. 2013
78
+ *
79
+ * Authors:
80
+ * Wen Congyang <wency@cn.fujitsu.com>
81
+ * Hu Tao <hutao@cn.fujitsu.com>
82
+ *
83
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
84
+ * See the COPYING file in the top-level directory.
85
+ *
86
+ */
87
+
88
+#include "qemu/osdep.h"
89
+#include "qemu/log.h"
90
+#include "qemu/module.h"
91
+#include "sysemu/runstate.h"
92
+
93
+#include "hw/nvram/fw_cfg.h"
94
+#include "hw/qdev-properties.h"
95
+#include "hw/misc/pvpanic.h"
96
+#include "qom/object.h"
97
+#include "hw/isa/isa.h"
98
+
99
+OBJECT_DECLARE_SIMPLE_TYPE(PVPanicISAState, PVPANIC_ISA_DEVICE)
100
+
101
+/*
102
+ * PVPanicISAState for ISA device and
103
+ * use ioport.
104
+ */
105
+struct PVPanicISAState {
106
+ ISADevice parent_obj;
107
+
108
+ uint16_t ioport;
109
+ PVPanicState pvpanic;
110
+};
111
+
112
+static void pvpanic_isa_initfn(Object *obj)
113
+{
114
+ PVPanicISAState *s = PVPANIC_ISA_DEVICE(obj);
115
+
116
+ pvpanic_setup_io(&s->pvpanic, DEVICE(s), 1);
117
+}
123
+}
118
+
124
+
119
+static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp)
125
+static void set_reserved_region(Object *obj, Visitor *v, const char *name,
126
+ void *opaque, Error **errp)
120
+{
127
+{
121
+ ISADevice *d = ISA_DEVICE(dev);
128
+ DeviceState *dev = DEVICE(obj);
122
+ PVPanicISAState *s = PVPANIC_ISA_DEVICE(dev);
129
+ Property *prop = opaque;
123
+ PVPanicState *ps = &s->pvpanic;
130
+ ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
124
+ FWCfgState *fw_cfg = fw_cfg_find();
131
+ Error *local_err = NULL;
125
+ uint16_t *pvpanic_port;
132
+ const char *endptr;
133
+ char *str;
134
+ int ret;
126
+
135
+
127
+ if (!fw_cfg) {
136
+ if (dev->realized) {
137
+ qdev_prop_set_after_realize(dev, name, errp);
128
+ return;
138
+ return;
129
+ }
139
+ }
130
+
140
+
131
+ pvpanic_port = g_malloc(sizeof(*pvpanic_port));
141
+ visit_type_str(v, name, &str, &local_err);
132
+ *pvpanic_port = cpu_to_le16(s->ioport);
142
+ if (local_err) {
133
+ fw_cfg_add_file(fw_cfg, "etc/pvpanic-port", pvpanic_port,
143
+ error_propagate(errp, local_err);
134
+ sizeof(*pvpanic_port));
144
+ return;
145
+ }
135
+
146
+
136
+ isa_register_ioport(d, &ps->mr, s->ioport);
147
+ ret = qemu_strtou64(str, &endptr, 16, &rr->low);
148
+ if (ret) {
149
+ error_setg(errp, "start address of '%s'"
150
+ " must be a hexadecimal integer", name);
151
+ goto out;
152
+ }
153
+ if (*endptr != ':') {
154
+ goto separator_error;
155
+ }
156
+
157
+ ret = qemu_strtou64(endptr + 1, &endptr, 16, &rr->high);
158
+ if (ret) {
159
+ error_setg(errp, "end address of '%s'"
160
+ " must be a hexadecimal integer", name);
161
+ goto out;
162
+ }
163
+ if (*endptr != ':') {
164
+ goto separator_error;
165
+ }
166
+
167
+ ret = qemu_strtoui(endptr + 1, &endptr, 10, &rr->type);
168
+ if (ret) {
169
+ error_setg(errp, "type of '%s'"
170
+ " must be a non-negative decimal integer", name);
171
+ }
172
+ goto out;
173
+
174
+separator_error:
175
+ error_setg(errp, "reserved region fields must be separated with ':'");
176
+out:
177
+ g_free(str);
178
+ return;
137
+}
179
+}
138
+
180
+
139
+static Property pvpanic_isa_properties[] = {
181
+const PropertyInfo qdev_prop_reserved_region = {
140
+ DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicISAState, ioport, 0x505),
182
+ .name = "reserved_region",
141
+ DEFINE_PROP_UINT8("events", PVPanicISAState, pvpanic.events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
183
+ .description = "Reserved Region, example: 0xFEE00000:0xFEEFFFFF:0",
142
+ DEFINE_PROP_END_OF_LIST(),
184
+ .get = get_reserved_region,
185
+ .set = set_reserved_region,
143
+};
186
+};
144
+
187
+
145
+static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
188
/* --- on/off/auto --- */
146
+{
189
147
+ DeviceClass *dc = DEVICE_CLASS(klass);
190
const PropertyInfo qdev_prop_on_off_auto = {
148
+
149
+ dc->realize = pvpanic_isa_realizefn;
150
+ device_class_set_props(dc, pvpanic_isa_properties);
151
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
152
+}
153
+
154
+static TypeInfo pvpanic_isa_info = {
155
+ .name = TYPE_PVPANIC_ISA_DEVICE,
156
+ .parent = TYPE_ISA_DEVICE,
157
+ .instance_size = sizeof(PVPanicISAState),
158
+ .instance_init = pvpanic_isa_initfn,
159
+ .class_init = pvpanic_isa_class_init,
160
+};
161
+
162
+static void pvpanic_register_types(void)
163
+{
164
+ type_register_static(&pvpanic_isa_info);
165
+}
166
+
167
+type_init(pvpanic_register_types)
168
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
169
index XXXXXXX..XXXXXXX 100644
170
--- a/hw/misc/pvpanic.c
171
+++ b/hw/misc/pvpanic.c
172
@@ -XXX,XX +XXX,XX @@
173
#include "hw/misc/pvpanic.h"
174
#include "qom/object.h"
175
176
-/* The bit of supported pv event, TODO: include uapi header and remove this */
177
-#define PVPANIC_F_PANICKED 0
178
-#define PVPANIC_F_CRASHLOADED 1
179
-
180
-/* The pv event value */
181
-#define PVPANIC_PANICKED (1 << PVPANIC_F_PANICKED)
182
-#define PVPANIC_CRASHLOADED (1 << PVPANIC_F_CRASHLOADED)
183
-
184
-typedef struct PVPanicState PVPanicState;
185
-DECLARE_INSTANCE_CHECKER(PVPanicState, ISA_PVPANIC_DEVICE,
186
- TYPE_PVPANIC)
187
-
188
static void handle_event(int event)
189
{
190
static bool logged;
191
@@ -XXX,XX +XXX,XX @@ static void handle_event(int event)
192
}
193
}
194
195
-#include "hw/isa/isa.h"
196
-
197
-struct PVPanicState {
198
- ISADevice parent_obj;
199
-
200
- MemoryRegion io;
201
- uint16_t ioport;
202
- uint8_t events;
203
-};
204
-
205
/* return supported events on read */
206
-static uint64_t pvpanic_ioport_read(void *opaque, hwaddr addr, unsigned size)
207
+static uint64_t pvpanic_read(void *opaque, hwaddr addr, unsigned size)
208
{
209
PVPanicState *pvp = opaque;
210
return pvp->events;
211
}
212
213
-static void pvpanic_ioport_write(void *opaque, hwaddr addr, uint64_t val,
214
+static void pvpanic_write(void *opaque, hwaddr addr, uint64_t val,
215
unsigned size)
216
{
217
handle_event(val);
218
}
219
220
static const MemoryRegionOps pvpanic_ops = {
221
- .read = pvpanic_ioport_read,
222
- .write = pvpanic_ioport_write,
223
+ .read = pvpanic_read,
224
+ .write = pvpanic_write,
225
.impl = {
226
.min_access_size = 1,
227
.max_access_size = 1,
228
},
229
};
230
231
-static void pvpanic_isa_initfn(Object *obj)
232
+void pvpanic_setup_io(PVPanicState *s, DeviceState *dev, unsigned size)
233
{
234
- PVPanicState *s = ISA_PVPANIC_DEVICE(obj);
235
-
236
- memory_region_init_io(&s->io, OBJECT(s), &pvpanic_ops, s, "pvpanic", 1);
237
+ memory_region_init_io(&s->mr, OBJECT(dev), &pvpanic_ops, s, "pvpanic", size);
238
}
239
-
240
-static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp)
241
-{
242
- ISADevice *d = ISA_DEVICE(dev);
243
- PVPanicState *s = ISA_PVPANIC_DEVICE(dev);
244
- FWCfgState *fw_cfg = fw_cfg_find();
245
- uint16_t *pvpanic_port;
246
-
247
- if (!fw_cfg) {
248
- return;
249
- }
250
-
251
- pvpanic_port = g_malloc(sizeof(*pvpanic_port));
252
- *pvpanic_port = cpu_to_le16(s->ioport);
253
- fw_cfg_add_file(fw_cfg, "etc/pvpanic-port", pvpanic_port,
254
- sizeof(*pvpanic_port));
255
-
256
- isa_register_ioport(d, &s->io, s->ioport);
257
-}
258
-
259
-static Property pvpanic_isa_properties[] = {
260
- DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicState, ioport, 0x505),
261
- DEFINE_PROP_UINT8("events", PVPanicState, events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
262
- DEFINE_PROP_END_OF_LIST(),
263
-};
264
-
265
-static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
266
-{
267
- DeviceClass *dc = DEVICE_CLASS(klass);
268
-
269
- dc->realize = pvpanic_isa_realizefn;
270
- device_class_set_props(dc, pvpanic_isa_properties);
271
- set_bit(DEVICE_CATEGORY_MISC, dc->categories);
272
-}
273
-
274
-static TypeInfo pvpanic_isa_info = {
275
- .name = TYPE_PVPANIC,
276
- .parent = TYPE_ISA_DEVICE,
277
- .instance_size = sizeof(PVPanicState),
278
- .instance_init = pvpanic_isa_initfn,
279
- .class_init = pvpanic_isa_class_init,
280
-};
281
-
282
-static void pvpanic_register_types(void)
283
-{
284
- type_register_static(&pvpanic_isa_info);
285
-}
286
-
287
-type_init(pvpanic_register_types)
288
diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
289
index XXXXXXX..XXXXXXX 100644
290
--- a/hw/i386/Kconfig
291
+++ b/hw/i386/Kconfig
292
@@ -XXX,XX +XXX,XX @@ config PC
293
imply ISA_DEBUG
294
imply PARALLEL
295
imply PCI_DEVICES
296
- imply PVPANIC
297
+ imply PVPANIC_ISA
298
imply QXL
299
imply SEV
300
imply SGA
301
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
302
index XXXXXXX..XXXXXXX 100644
303
--- a/hw/misc/Kconfig
304
+++ b/hw/misc/Kconfig
305
@@ -XXX,XX +XXX,XX @@ config IOTKIT_SYSCTL
306
config IOTKIT_SYSINFO
307
bool
308
309
-config PVPANIC
310
+config PVPANIC_COMMON
311
+ bool
312
+
313
+config PVPANIC_ISA
314
bool
315
depends on ISA_BUS
316
+ select PVPANIC_COMMON
317
318
config AUX
319
bool
320
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
321
index XXXXXXX..XXXXXXX 100644
322
--- a/hw/misc/meson.build
323
+++ b/hw/misc/meson.build
324
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_EMC141X', if_true: files('emc141x.c'))
325
softmmu_ss.add(when: 'CONFIG_UNIMP', if_true: files('unimp.c'))
326
softmmu_ss.add(when: 'CONFIG_EMPTY_SLOT', if_true: files('empty_slot.c'))
327
softmmu_ss.add(when: 'CONFIG_LED', if_true: files('led.c'))
328
+softmmu_ss.add(when: 'CONFIG_PVPANIC_COMMON', if_true: files('pvpanic.c'))
329
330
# ARM devices
331
softmmu_ss.add(when: 'CONFIG_PL310', if_true: files('arm_l2x0.c'))
332
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_IOTKIT_SYSINFO', if_true: files('iotkit-sysinfo.c')
333
softmmu_ss.add(when: 'CONFIG_ARMSSE_CPUID', if_true: files('armsse-cpuid.c'))
334
softmmu_ss.add(when: 'CONFIG_ARMSSE_MHU', if_true: files('armsse-mhu.c'))
335
336
-softmmu_ss.add(when: 'CONFIG_PVPANIC', if_true: files('pvpanic.c'))
337
+softmmu_ss.add(when: 'CONFIG_PVPANIC_ISA', if_true: files('pvpanic-isa.c'))
338
softmmu_ss.add(when: 'CONFIG_AUX', if_true: files('auxbus.c'))
339
softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_scu.c', 'aspeed_sdmc.c', 'aspeed_xdma.c'))
340
softmmu_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-sysreg.c'))
341
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
342
index XXXXXXX..XXXXXXX 100644
343
--- a/tests/qtest/meson.build
344
+++ b/tests/qtest/meson.build
345
@@ -XXX,XX +XXX,XX @@ qtests_i386 = \
346
(config_host.has_key('CONFIG_LINUX') and \
347
config_all_devices.has_key('CONFIG_ISA_IPMI_BT') ? ['ipmi-bt-test'] : []) + \
348
(config_all_devices.has_key('CONFIG_WDT_IB700') ? ['wdt_ib700-test'] : []) + \
349
- (config_all_devices.has_key('CONFIG_PVPANIC') ? ['pvpanic-test'] : []) + \
350
+ (config_all_devices.has_key('CONFIG_PVPANIC_ISA') ? ['pvpanic-test'] : []) + \
351
(config_all_devices.has_key('CONFIG_HDA') ? ['intel-hda-test'] : []) + \
352
(config_all_devices.has_key('CONFIG_I82801B11') ? ['i82801b11-test'] : []) + \
353
(config_all_devices.has_key('CONFIG_IOH3420') ? ['ioh3420-test'] : []) + \
354
--
191
--
355
2.20.1
192
2.20.1
356
193
357
194
diff view generated by jsdifflib
1
From: Maxim Uvarov <maxim.uvarov@linaro.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Implement gpio-pwr driver to allow reboot and poweroff machine.
3
This patch implements the PROBE request. At the moment,
4
This is simple driver with just 2 gpios lines. Current use case
4
only THE RESV_MEM property is handled. The first goal is
5
is to reboot and poweroff virt machine in secure mode. Secure
5
to report iommu wide reserved regions such as the MSI regions
6
pl066 gpio chip is needed for that.
6
set by the machine code. On x86 this will be the IOAPIC MSI
7
7
region, [0xFEE00000 - 0xFEEFFFFF], on ARM this may be the ITS
8
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
8
doorbell.
9
Reviewed-by: Hao Wu <wuhaotsh@google.com>
9
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
In the future we may introduce per device reserved regions.
11
This will be useful when protecting host assigned devices
12
which may expose their own reserved regions
13
14
Signed-off-by: Eric Auger <eric.auger@redhat.com>
15
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
16
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
17
Message-id: 20200629070404.10969-3-eric.auger@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
19
---
13
hw/gpio/gpio_pwr.c | 70 +++++++++++++++++++++++++++++++++++++++++++++
20
include/hw/virtio/virtio-iommu.h | 2 +
14
hw/gpio/Kconfig | 3 ++
21
hw/virtio/virtio-iommu.c | 94 ++++++++++++++++++++++++++++++--
15
hw/gpio/meson.build | 1 +
22
hw/virtio/trace-events | 1 +
16
3 files changed, 74 insertions(+)
23
3 files changed, 93 insertions(+), 4 deletions(-)
17
create mode 100644 hw/gpio/gpio_pwr.c
24
18
25
diff --git a/include/hw/virtio/virtio-iommu.h b/include/hw/virtio/virtio-iommu.h
19
diff --git a/hw/gpio/gpio_pwr.c b/hw/gpio/gpio_pwr.c
26
index XXXXXXX..XXXXXXX 100644
20
new file mode 100644
27
--- a/include/hw/virtio/virtio-iommu.h
21
index XXXXXXX..XXXXXXX
28
+++ b/include/hw/virtio/virtio-iommu.h
22
--- /dev/null
29
@@ -XXX,XX +XXX,XX @@ typedef struct VirtIOIOMMU {
23
+++ b/hw/gpio/gpio_pwr.c
30
GHashTable *as_by_busptr;
31
IOMMUPciBus *iommu_pcibus_by_bus_num[PCI_BUS_MAX];
32
PCIBus *primary_bus;
33
+ ReservedRegion *reserved_regions;
34
+ uint32_t nb_reserved_regions;
35
GTree *domains;
36
QemuMutex mutex;
37
GTree *endpoints;
38
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/virtio/virtio-iommu.c
41
+++ b/hw/virtio/virtio-iommu.c
24
@@ -XXX,XX +XXX,XX @@
42
@@ -XXX,XX +XXX,XX @@
25
+/*
43
26
+ * GPIO qemu power controller
44
/* Max size */
27
+ *
45
#define VIOMMU_DEFAULT_QUEUE_SIZE 256
28
+ * Copyright (c) 2020 Linaro Limited
46
+#define VIOMMU_PROBE_SIZE 512
29
+ *
47
30
+ * Author: Maxim Uvarov <maxim.uvarov@linaro.org>
48
typedef struct VirtIOIOMMUDomain {
31
+ *
49
uint32_t id;
32
+ * Virtual gpio driver which can be used on top of pl061
50
@@ -XXX,XX +XXX,XX @@ static int virtio_iommu_unmap(VirtIOIOMMU *s,
33
+ * to reboot and shutdown qemu virtual machine. One of use
51
return ret;
34
+ * case is gpio driver for secure world application (ARM
52
}
35
+ * Trusted Firmware.).
53
36
+ *
54
+static ssize_t virtio_iommu_fill_resv_mem_prop(VirtIOIOMMU *s, uint32_t ep,
37
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
55
+ uint8_t *buf, size_t free)
38
+ * See the COPYING file in the top-level directory.
56
+{
39
+ * SPDX-License-Identifier: GPL-2.0-or-later
57
+ struct virtio_iommu_probe_resv_mem prop = {};
58
+ size_t size = sizeof(prop), length = size - sizeof(prop.head), total;
59
+ int i;
60
+
61
+ total = size * s->nb_reserved_regions;
62
+
63
+ if (total > free) {
64
+ return -ENOSPC;
65
+ }
66
+
67
+ for (i = 0; i < s->nb_reserved_regions; i++) {
68
+ unsigned subtype = s->reserved_regions[i].type;
69
+
70
+ assert(subtype == VIRTIO_IOMMU_RESV_MEM_T_RESERVED ||
71
+ subtype == VIRTIO_IOMMU_RESV_MEM_T_MSI);
72
+ prop.head.type = cpu_to_le16(VIRTIO_IOMMU_PROBE_T_RESV_MEM);
73
+ prop.head.length = cpu_to_le16(length);
74
+ prop.subtype = subtype;
75
+ prop.start = cpu_to_le64(s->reserved_regions[i].low);
76
+ prop.end = cpu_to_le64(s->reserved_regions[i].high);
77
+
78
+ memcpy(buf, &prop, size);
79
+
80
+ trace_virtio_iommu_fill_resv_property(ep, prop.subtype,
81
+ prop.start, prop.end);
82
+ buf += size;
83
+ }
84
+ return total;
85
+}
86
+
87
+/**
88
+ * virtio_iommu_probe - Fill the probe request buffer with
89
+ * the properties the device is able to return
40
+ */
90
+ */
41
+
91
+static int virtio_iommu_probe(VirtIOIOMMU *s,
42
+/*
92
+ struct virtio_iommu_req_probe *req,
43
+ * QEMU interface:
93
+ uint8_t *buf)
44
+ * two named input GPIO lines:
45
+ * 'reset' : when asserted, trigger system reset
46
+ * 'shutdown' : when asserted, trigger system shutdown
47
+ */
48
+
49
+#include "qemu/osdep.h"
50
+#include "hw/sysbus.h"
51
+#include "sysemu/runstate.h"
52
+
53
+#define TYPE_GPIOPWR "gpio-pwr"
54
+OBJECT_DECLARE_SIMPLE_TYPE(GPIO_PWR_State, GPIOPWR)
55
+
56
+struct GPIO_PWR_State {
57
+ SysBusDevice parent_obj;
58
+};
59
+
60
+static void gpio_pwr_reset(void *opaque, int n, int level)
61
+{
94
+{
62
+ if (level) {
95
+ uint32_t ep_id = le32_to_cpu(req->endpoint);
63
+ qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
96
+ size_t free = VIOMMU_PROBE_SIZE;
64
+ }
97
+ ssize_t count;
98
+
99
+ if (!virtio_iommu_mr(s, ep_id)) {
100
+ return VIRTIO_IOMMU_S_NOENT;
101
+ }
102
+
103
+ count = virtio_iommu_fill_resv_mem_prop(s, ep_id, buf, free);
104
+ if (count < 0) {
105
+ return VIRTIO_IOMMU_S_INVAL;
106
+ }
107
+ buf += count;
108
+ free -= count;
109
+
110
+ return VIRTIO_IOMMU_S_OK;
65
+}
111
+}
66
+
112
+
67
+static void gpio_pwr_shutdown(void *opaque, int n, int level)
113
static int virtio_iommu_iov_to_req(struct iovec *iov,
114
unsigned int iov_cnt,
115
void *req, size_t req_sz)
116
@@ -XXX,XX +XXX,XX @@ virtio_iommu_handle_req(detach)
117
virtio_iommu_handle_req(map)
118
virtio_iommu_handle_req(unmap)
119
120
+static int virtio_iommu_handle_probe(VirtIOIOMMU *s,
121
+ struct iovec *iov,
122
+ unsigned int iov_cnt,
123
+ uint8_t *buf)
68
+{
124
+{
69
+ if (level) {
125
+ struct virtio_iommu_req_probe req;
70
+ qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
126
+ int ret = virtio_iommu_iov_to_req(iov, iov_cnt, &req, sizeof(req));
71
+ }
127
+
128
+ return ret ? ret : virtio_iommu_probe(s, &req, buf);
72
+}
129
+}
73
+
130
+
74
+static void gpio_pwr_init(Object *obj)
131
static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
75
+{
132
{
76
+ DeviceState *dev = DEVICE(obj);
133
VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
77
+
134
struct virtio_iommu_req_head head;
78
+ qdev_init_gpio_in_named(dev, gpio_pwr_reset, "reset", 1);
135
struct virtio_iommu_req_tail tail = {};
79
+ qdev_init_gpio_in_named(dev, gpio_pwr_shutdown, "shutdown", 1);
136
+ size_t output_size = sizeof(tail), sz;
80
+}
137
VirtQueueElement *elem;
81
+
138
unsigned int iov_cnt;
82
+static const TypeInfo gpio_pwr_info = {
139
struct iovec *iov;
83
+ .name = TYPE_GPIOPWR,
140
- size_t sz;
84
+ .parent = TYPE_SYS_BUS_DEVICE,
141
+ void *buf = NULL;
85
+ .instance_size = sizeof(GPIO_PWR_State),
142
86
+ .instance_init = gpio_pwr_init,
143
for (;;) {
87
+};
144
elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
88
+
145
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
89
+static void gpio_pwr_register_types(void)
146
case VIRTIO_IOMMU_T_UNMAP:
90
+{
147
tail.status = virtio_iommu_handle_unmap(s, iov, iov_cnt);
91
+ type_register_static(&gpio_pwr_info);
148
break;
92
+}
149
+ case VIRTIO_IOMMU_T_PROBE:
93
+
150
+ {
94
+type_init(gpio_pwr_register_types)
151
+ struct virtio_iommu_req_tail *ptail;
95
diff --git a/hw/gpio/Kconfig b/hw/gpio/Kconfig
152
+
153
+ output_size = s->config.probe_size + sizeof(tail);
154
+ buf = g_malloc0(output_size);
155
+
156
+ ptail = (struct virtio_iommu_req_tail *)
157
+ (buf + s->config.probe_size);
158
+ ptail->status = virtio_iommu_handle_probe(s, iov, iov_cnt, buf);
159
+ }
160
default:
161
tail.status = VIRTIO_IOMMU_S_UNSUPP;
162
}
163
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
164
165
out:
166
sz = iov_from_buf(elem->in_sg, elem->in_num, 0,
167
- &tail, sizeof(tail));
168
- assert(sz == sizeof(tail));
169
+ buf ? buf : &tail, output_size);
170
+ assert(sz == output_size);
171
172
- virtqueue_push(vq, elem, sizeof(tail));
173
+ virtqueue_push(vq, elem, sz);
174
virtio_notify(vdev, vq);
175
g_free(elem);
176
+ g_free(buf);
177
}
178
}
179
180
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_device_realize(DeviceState *dev, Error **errp)
181
s->config.page_size_mask = TARGET_PAGE_MASK;
182
s->config.input_range.end = -1UL;
183
s->config.domain_range.end = 32;
184
+ s->config.probe_size = VIOMMU_PROBE_SIZE;
185
186
virtio_add_feature(&s->features, VIRTIO_RING_F_EVENT_IDX);
187
virtio_add_feature(&s->features, VIRTIO_RING_F_INDIRECT_DESC);
188
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_device_realize(DeviceState *dev, Error **errp)
189
virtio_add_feature(&s->features, VIRTIO_IOMMU_F_MAP_UNMAP);
190
virtio_add_feature(&s->features, VIRTIO_IOMMU_F_BYPASS);
191
virtio_add_feature(&s->features, VIRTIO_IOMMU_F_MMIO);
192
+ virtio_add_feature(&s->features, VIRTIO_IOMMU_F_PROBE);
193
194
qemu_mutex_init(&s->mutex);
195
196
diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events
96
index XXXXXXX..XXXXXXX 100644
197
index XXXXXXX..XXXXXXX 100644
97
--- a/hw/gpio/Kconfig
198
--- a/hw/virtio/trace-events
98
+++ b/hw/gpio/Kconfig
199
+++ b/hw/virtio/trace-events
99
@@ -XXX,XX +XXX,XX @@ config PL061
200
@@ -XXX,XX +XXX,XX @@ virtio_iommu_get_domain(uint32_t domain_id) "Alloc domain=%d"
100
config GPIO_KEY
201
virtio_iommu_put_domain(uint32_t domain_id) "Free domain=%d"
101
bool
202
virtio_iommu_translate_out(uint64_t virt_addr, uint64_t phys_addr, uint32_t sid) "0x%"PRIx64" -> 0x%"PRIx64 " for sid=%d"
102
203
virtio_iommu_report_fault(uint8_t reason, uint32_t flags, uint32_t endpoint, uint64_t addr) "FAULT reason=%d flags=%d endpoint=%d address =0x%"PRIx64
103
+config GPIO_PWR
204
+virtio_iommu_fill_resv_property(uint32_t devid, uint8_t subtype, uint64_t start, uint64_t end) "dev= %d, type=%d start=0x%"PRIx64" end=0x%"PRIx64
104
+ bool
105
+
106
config SIFIVE_GPIO
107
bool
108
diff --git a/hw/gpio/meson.build b/hw/gpio/meson.build
109
index XXXXXXX..XXXXXXX 100644
110
--- a/hw/gpio/meson.build
111
+++ b/hw/gpio/meson.build
112
@@ -XXX,XX +XXX,XX @@
113
softmmu_ss.add(when: 'CONFIG_E500', if_true: files('mpc8xxx.c'))
114
softmmu_ss.add(when: 'CONFIG_GPIO_KEY', if_true: files('gpio_key.c'))
115
+softmmu_ss.add(when: 'CONFIG_GPIO_PWR', if_true: files('gpio_pwr.c'))
116
softmmu_ss.add(when: 'CONFIG_MAX7310', if_true: files('max7310.c'))
117
softmmu_ss.add(when: 'CONFIG_PL061', if_true: files('pl061.c'))
118
softmmu_ss.add(when: 'CONFIG_PUV3', if_true: files('puv3_gpio.c'))
119
--
205
--
120
2.20.1
206
2.20.1
121
207
122
208
diff view generated by jsdifflib
1
Create and connect the two clocks needed by the ARMSSE.
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
When translating an address we need to check if it belongs to
4
a reserved virtual address range. If it does, there are 2 cases:
5
6
- it belongs to a RESERVED region: the guest should neither use
7
this address in a MAP not instruct the end-point to DMA on
8
them. We report an error
9
10
- It belongs to an MSI region: we bypass the translation.
11
12
Signed-off-by: Eric Auger <eric.auger@redhat.com>
13
Reviewed-by: Peter Xu <peterx@redhat.com>
14
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
15
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
16
Message-id: 20200629070404.10969-4-eric.auger@redhat.com
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: Luc Michel <luc@lmichel.fr>
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20210128114145.20536-16-peter.maydell@linaro.org
8
Message-id: 20210121190622.22000-16-peter.maydell@linaro.org
9
---
18
---
10
hw/arm/musca.c | 12 ++++++++++++
19
hw/virtio/virtio-iommu.c | 20 ++++++++++++++++++++
11
1 file changed, 12 insertions(+)
20
1 file changed, 20 insertions(+)
12
21
13
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
22
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
14
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/musca.c
24
--- a/hw/virtio/virtio-iommu.c
16
+++ b/hw/arm/musca.c
25
+++ b/hw/virtio/virtio-iommu.c
17
@@ -XXX,XX +XXX,XX @@
26
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry virtio_iommu_translate(IOMMUMemoryRegion *mr, hwaddr addr,
18
#include "hw/misc/tz-ppc.h"
27
uint32_t sid, flags;
19
#include "hw/misc/unimp.h"
28
bool bypass_allowed;
20
#include "hw/rtc/pl031.h"
29
bool found;
21
+#include "hw/qdev-clock.h"
30
+ int i;
22
#include "qom/object.h"
31
23
32
interval.low = addr;
24
#define MUSCA_NUMIRQ_MAX 96
33
interval.high = addr + 1;
25
@@ -XXX,XX +XXX,XX @@ struct MuscaMachineState {
34
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry virtio_iommu_translate(IOMMUMemoryRegion *mr, hwaddr addr,
26
UnimplementedDeviceState sdio;
35
goto unlock;
27
UnimplementedDeviceState gpio;
28
UnimplementedDeviceState cryptoisland;
29
+ Clock *sysclk;
30
+ Clock *s32kclk;
31
};
32
33
#define TYPE_MUSCA_MACHINE "musca"
34
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(MuscaMachineState, MuscaMachineClass, MUSCA_MACHINE)
35
* don't model that in our SSE-200 model yet.
36
*/
37
#define SYSCLK_FRQ 40000000
38
+/* Slow 32Khz S32KCLK frequency in Hz */
39
+#define S32KCLK_FRQ (32 * 1000)
40
41
static qemu_irq get_sse_irq_in(MuscaMachineState *mms, int irqno)
42
{
43
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
44
exit(1);
45
}
36
}
46
37
47
+ mms->sysclk = clock_new(OBJECT(machine), "SYSCLK");
38
+ for (i = 0; i < s->nb_reserved_regions; i++) {
48
+ clock_set_hz(mms->sysclk, SYSCLK_FRQ);
39
+ ReservedRegion *reg = &s->reserved_regions[i];
49
+ mms->s32kclk = clock_new(OBJECT(machine), "S32KCLK");
50
+ clock_set_hz(mms->s32kclk, S32KCLK_FRQ);
51
+
40
+
52
object_initialize_child(OBJECT(machine), "sse-200", &mms->sse,
41
+ if (addr >= reg->low && addr <= reg->high) {
53
TYPE_SSE200);
42
+ switch (reg->type) {
54
ssedev = DEVICE(&mms->sse);
43
+ case VIRTIO_IOMMU_RESV_MEM_T_MSI:
55
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
44
+ entry.perm = flag;
56
qdev_prop_set_uint32(ssedev, "init-svtor", mmc->init_svtor);
45
+ break;
57
qdev_prop_set_uint32(ssedev, "SRAM_ADDR_WIDTH", mmc->sram_addr_width);
46
+ case VIRTIO_IOMMU_RESV_MEM_T_RESERVED:
58
qdev_prop_set_uint32(ssedev, "MAINCLK_FRQ", SYSCLK_FRQ);
47
+ default:
59
+ qdev_connect_clock_in(ssedev, "MAINCLK", mms->sysclk);
48
+ virtio_iommu_report_fault(s, VIRTIO_IOMMU_FAULT_R_MAPPING,
60
+ qdev_connect_clock_in(ssedev, "S32KCLK", mms->s32kclk);
49
+ VIRTIO_IOMMU_FAULT_F_ADDRESS,
61
/*
50
+ sid, addr);
62
* Musca-A takes the default SSE-200 FPU/DSP settings (ie no for
51
+ break;
63
* CPU0 and yes for CPU1); Musca-B1 explicitly enables them for CPU0.
52
+ }
53
+ goto unlock;
54
+ }
55
+ }
56
+
57
if (!ep->domain) {
58
if (!bypass_allowed) {
59
error_report_once("%s %02x:%02x.%01x not attached to any domain",
64
--
60
--
65
2.20.1
61
2.20.1
66
62
67
63
diff view generated by jsdifflib
1
Create and connect the two clocks needed by the ARMSSE.
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
The machine may need to pass reserved regions to the
4
virtio-iommu-pci device (such as the MSI window on x86
5
or the MSI doorbells on ARM).
6
7
So let's add an array of Interval properties.
8
9
Note: if some reserved regions are already set by the
10
machine code - which should be the case in general -,
11
the length of the property array is already set and
12
prevents the end-user from modifying them. For example,
13
attempting to use:
14
15
-device virtio-iommu-pci,\
16
len-reserved-regions=1,reserved-regions[0]=0xfee00000:0xfeefffff:1
17
18
would result in the following error message:
19
20
qemu-system-aarch64: -device virtio-iommu-pci,addr=0xa,
21
len-reserved-regions=1,reserved-regions[0]=0xfee00000:0xfeefffff:1:
22
array size property len-reserved-regions may not be set more than once
23
24
Otherwise, for example, adding two reserved regions is achieved
25
using the following options:
26
27
-device virtio-iommu-pci,addr=0xa,len-reserved-regions=2,\
28
reserved-regions[0]=0xfee00000:0xfeefffff:1,\
29
reserved-regions[1]=0x1000000:100ffff:1
30
31
Signed-off-by: Eric Auger <eric.auger@redhat.com>
32
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
33
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
34
Reviewed-by: Peter Xu <peterx@redhat.com>
35
Message-id: 20200629070404.10969-5-eric.auger@redhat.com
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
36
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: Luc Michel <luc@lmichel.fr>
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20210128114145.20536-15-peter.maydell@linaro.org
8
Message-id: 20210121190622.22000-15-peter.maydell@linaro.org
9
---
37
---
10
hw/arm/mps2-tz.c | 13 +++++++++++++
38
hw/virtio/virtio-iommu-pci.c | 11 +++++++++++
11
1 file changed, 13 insertions(+)
39
1 file changed, 11 insertions(+)
12
40
13
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
41
diff --git a/hw/virtio/virtio-iommu-pci.c b/hw/virtio/virtio-iommu-pci.c
14
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/mps2-tz.c
43
--- a/hw/virtio/virtio-iommu-pci.c
16
+++ b/hw/arm/mps2-tz.c
44
+++ b/hw/virtio/virtio-iommu-pci.c
17
@@ -XXX,XX +XXX,XX @@
45
@@ -XXX,XX +XXX,XX @@ struct VirtIOIOMMUPCI {
18
#include "hw/net/lan9118.h"
46
19
#include "net/net.h"
47
static Property virtio_iommu_pci_properties[] = {
20
#include "hw/core/split-irq.h"
48
DEFINE_PROP_UINT32("class", VirtIOPCIProxy, class_code, 0),
21
+#include "hw/qdev-clock.h"
49
+ DEFINE_PROP_ARRAY("reserved-regions", VirtIOIOMMUPCI,
22
#include "qom/object.h"
50
+ vdev.nb_reserved_regions, vdev.reserved_regions,
23
51
+ qdev_prop_reserved_region, ReservedRegion),
24
#define MPS2TZ_NUMIRQ 92
52
DEFINE_PROP_END_OF_LIST(),
25
@@ -XXX,XX +XXX,XX @@ struct MPS2TZMachineState {
26
qemu_or_irq uart_irq_orgate;
27
DeviceState *lan9118;
28
SplitIRQ cpu_irq_splitter[MPS2TZ_NUMIRQ];
29
+ Clock *sysclk;
30
+ Clock *s32kclk;
31
};
53
};
32
54
33
#define TYPE_MPS2TZ_MACHINE "mps2tz"
55
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
34
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(MPS2TZMachineState, MPS2TZMachineClass, MPS2TZ_MACHINE)
56
{
35
57
VirtIOIOMMUPCI *dev = VIRTIO_IOMMU_PCI(vpci_dev);
36
/* Main SYSCLK frequency in Hz */
58
DeviceState *vdev = DEVICE(&dev->vdev);
37
#define SYSCLK_FRQ 20000000
59
+ VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
38
+/* Slow 32Khz S32KCLK frequency in Hz */
60
39
+#define S32KCLK_FRQ (32 * 1000)
61
if (!qdev_get_machine_hotplug_handler(DEVICE(vpci_dev))) {
40
62
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
41
/* Create an alias of an entire original MemoryRegion @orig
63
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
42
* located at @base in the memory map.
64
"-no-acpi\n");
43
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
65
return;
44
exit(EXIT_FAILURE);
45
}
66
}
46
67
+ for (int i = 0; i < s->nb_reserved_regions; i++) {
47
+ /* These clocks don't need migration because they are fixed-frequency */
68
+ if (s->reserved_regions[i].type != VIRTIO_IOMMU_RESV_MEM_T_RESERVED &&
48
+ mms->sysclk = clock_new(OBJECT(machine), "SYSCLK");
69
+ s->reserved_regions[i].type != VIRTIO_IOMMU_RESV_MEM_T_MSI) {
49
+ clock_set_hz(mms->sysclk, SYSCLK_FRQ);
70
+ error_setg(errp, "reserved region %d has an invalid type", i);
50
+ mms->s32kclk = clock_new(OBJECT(machine), "S32KCLK");
71
+ error_append_hint(errp, "Valid values are 0 and 1\n");
51
+ clock_set_hz(mms->s32kclk, S32KCLK_FRQ);
72
+ }
52
+
73
+ }
53
object_initialize_child(OBJECT(machine), TYPE_IOTKIT, &mms->iotkit,
74
object_property_set_link(OBJECT(dev),
54
mmc->armsse_type);
75
OBJECT(pci_get_bus(&vpci_dev->pci_dev)),
55
iotkitdev = DEVICE(&mms->iotkit);
76
"primary-bus", &error_abort);
56
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
57
OBJECT(system_memory), &error_abort);
58
qdev_prop_set_uint32(iotkitdev, "EXP_NUMIRQ", MPS2TZ_NUMIRQ);
59
qdev_prop_set_uint32(iotkitdev, "MAINCLK_FRQ", SYSCLK_FRQ);
60
+ qdev_connect_clock_in(iotkitdev, "MAINCLK", mms->sysclk);
61
+ qdev_connect_clock_in(iotkitdev, "S32KCLK", mms->s32kclk);
62
sysbus_realize(SYS_BUS_DEVICE(&mms->iotkit), &error_fatal);
63
64
/*
65
--
77
--
66
2.20.1
78
2.20.1
67
79
68
80
diff view generated by jsdifflib
1
From: Maxim Uvarov <maxim.uvarov@linaro.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
No functional change. Just refactor code to better
3
At the moment the virtio-iommu translates MSI transactions.
4
support secure and normal world gpios.
4
This behavior is inherited from ARM SMMU. The virt machine
5
code knows where the guest MSI doorbells are so we can easily
6
declare those regions as VIRTIO_IOMMU_RESV_MEM_T_MSI. With that
7
setting the guest will not map MSIs through the IOMMU and those
8
transactions will be simply bypassed.
5
9
6
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
10
Depending on which MSI controller is in use (ITS or GICV2M),
7
Reviewed-by: Andrew Jones <drjones@redhat.com>
11
we declare either:
12
- the ITS interrupt translation space (ITS_base + 0x10000),
13
containing the GITS_TRANSLATOR or
14
- The GICV2M single frame, containing the MSI_SETSP_NS register.
15
16
Signed-off-by: Eric Auger <eric.auger@redhat.com>
17
Message-id: 20200629070404.10969-6-eric.auger@redhat.com
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
20
---
10
hw/arm/virt.c | 57 ++++++++++++++++++++++++++++++++-------------------
21
include/hw/arm/virt.h | 7 +++++++
11
1 file changed, 36 insertions(+), 21 deletions(-)
22
hw/arm/virt.c | 30 ++++++++++++++++++++++++++++++
23
2 files changed, 37 insertions(+)
12
24
25
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
26
index XXXXXXX..XXXXXXX 100644
27
--- a/include/hw/arm/virt.h
28
+++ b/include/hw/arm/virt.h
29
@@ -XXX,XX +XXX,XX @@ typedef enum VirtIOMMUType {
30
VIRT_IOMMU_VIRTIO,
31
} VirtIOMMUType;
32
33
+typedef enum VirtMSIControllerType {
34
+ VIRT_MSI_CTRL_NONE,
35
+ VIRT_MSI_CTRL_GICV2M,
36
+ VIRT_MSI_CTRL_ITS,
37
+} VirtMSIControllerType;
38
+
39
typedef enum VirtGICType {
40
VIRT_GIC_VERSION_MAX,
41
VIRT_GIC_VERSION_HOST,
42
@@ -XXX,XX +XXX,XX @@ typedef struct {
43
OnOffAuto acpi;
44
VirtGICType gic_version;
45
VirtIOMMUType iommu;
46
+ VirtMSIControllerType msi_controller;
47
uint16_t virtio_iommu_bdf;
48
struct arm_boot_info bootinfo;
49
MemMapEntry *memmap;
13
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
50
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
14
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/virt.c
52
--- a/hw/arm/virt.c
16
+++ b/hw/arm/virt.c
53
+++ b/hw/arm/virt.c
17
@@ -XXX,XX +XXX,XX @@ static void virt_powerdown_req(Notifier *n, void *opaque)
54
@@ -XXX,XX +XXX,XX @@ static void create_its(VirtMachineState *vms)
55
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base);
56
57
fdt_add_its_gic_node(vms);
58
+ vms->msi_controller = VIRT_MSI_CTRL_ITS;
59
}
60
61
static void create_v2m(VirtMachineState *vms)
62
@@ -XXX,XX +XXX,XX @@ static void create_v2m(VirtMachineState *vms)
63
}
64
65
fdt_add_v2m_gic_node(vms);
66
+ vms->msi_controller = VIRT_MSI_CTRL_GICV2M;
67
}
68
69
static void create_gic(VirtMachineState *vms)
70
@@ -XXX,XX +XXX,XX @@ out:
71
static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
72
DeviceState *dev, Error **errp)
73
{
74
+ VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
75
+
76
if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
77
virt_memory_pre_plug(hotplug_dev, dev, errp);
78
+ } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
79
+ hwaddr db_start = 0, db_end = 0;
80
+ char *resv_prop_str;
81
+
82
+ switch (vms->msi_controller) {
83
+ case VIRT_MSI_CTRL_NONE:
84
+ return;
85
+ case VIRT_MSI_CTRL_ITS:
86
+ /* GITS_TRANSLATER page */
87
+ db_start = base_memmap[VIRT_GIC_ITS].base + 0x10000;
88
+ db_end = base_memmap[VIRT_GIC_ITS].base +
89
+ base_memmap[VIRT_GIC_ITS].size - 1;
90
+ break;
91
+ case VIRT_MSI_CTRL_GICV2M:
92
+ /* MSI_SETSPI_NS page */
93
+ db_start = base_memmap[VIRT_GIC_V2M].base;
94
+ db_end = db_start + base_memmap[VIRT_GIC_V2M].size - 1;
95
+ break;
96
+ }
97
+ resv_prop_str = g_strdup_printf("0x%"PRIx64":0x%"PRIx64":%u",
98
+ db_start, db_end,
99
+ VIRTIO_IOMMU_RESV_MEM_T_MSI);
100
+
101
+ qdev_prop_set_uint32(dev, "len-reserved-regions", 1);
102
+ qdev_prop_set_string(dev, "reserved-regions[0]", resv_prop_str);
103
+ g_free(resv_prop_str);
18
}
104
}
19
}
105
}
20
106
21
-static void create_gpio(const VirtMachineState *vms)
22
+static void create_gpio_keys(const VirtMachineState *vms,
23
+ DeviceState *pl061_dev,
24
+ uint32_t phandle)
25
+{
26
+ gpio_key_dev = sysbus_create_simple("gpio-key", -1,
27
+ qdev_get_gpio_in(pl061_dev, 3));
28
+
29
+ qemu_fdt_add_subnode(vms->fdt, "/gpio-keys");
30
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-keys", "compatible", "gpio-keys");
31
+ qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#size-cells", 0);
32
+ qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#address-cells", 1);
33
+
34
+ qemu_fdt_add_subnode(vms->fdt, "/gpio-keys/poweroff");
35
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-keys/poweroff",
36
+ "label", "GPIO Key Poweroff");
37
+ qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys/poweroff", "linux,code",
38
+ KEY_POWER);
39
+ qemu_fdt_setprop_cells(vms->fdt, "/gpio-keys/poweroff",
40
+ "gpios", phandle, 3, 0);
41
+}
42
+
43
+static void create_gpio_devices(const VirtMachineState *vms, int gpio,
44
+ MemoryRegion *mem)
45
{
46
char *nodename;
47
DeviceState *pl061_dev;
48
- hwaddr base = vms->memmap[VIRT_GPIO].base;
49
- hwaddr size = vms->memmap[VIRT_GPIO].size;
50
- int irq = vms->irqmap[VIRT_GPIO];
51
+ hwaddr base = vms->memmap[gpio].base;
52
+ hwaddr size = vms->memmap[gpio].size;
53
+ int irq = vms->irqmap[gpio];
54
const char compat[] = "arm,pl061\0arm,primecell";
55
+ SysBusDevice *s;
56
57
- pl061_dev = sysbus_create_simple("pl061", base,
58
- qdev_get_gpio_in(vms->gic, irq));
59
+ pl061_dev = qdev_new("pl061");
60
+ s = SYS_BUS_DEVICE(pl061_dev);
61
+ sysbus_realize_and_unref(s, &error_fatal);
62
+ memory_region_add_subregion(mem, base, sysbus_mmio_get_region(s, 0));
63
+ sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq));
64
65
uint32_t phandle = qemu_fdt_alloc_phandle(vms->fdt);
66
nodename = g_strdup_printf("/pl061@%" PRIx64, base);
67
@@ -XXX,XX +XXX,XX @@ static void create_gpio(const VirtMachineState *vms)
68
qemu_fdt_setprop_string(vms->fdt, nodename, "clock-names", "apb_pclk");
69
qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", phandle);
70
71
- gpio_key_dev = sysbus_create_simple("gpio-key", -1,
72
- qdev_get_gpio_in(pl061_dev, 3));
73
- qemu_fdt_add_subnode(vms->fdt, "/gpio-keys");
74
- qemu_fdt_setprop_string(vms->fdt, "/gpio-keys", "compatible", "gpio-keys");
75
- qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#size-cells", 0);
76
- qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#address-cells", 1);
77
-
78
- qemu_fdt_add_subnode(vms->fdt, "/gpio-keys/poweroff");
79
- qemu_fdt_setprop_string(vms->fdt, "/gpio-keys/poweroff",
80
- "label", "GPIO Key Poweroff");
81
- qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys/poweroff", "linux,code",
82
- KEY_POWER);
83
- qemu_fdt_setprop_cells(vms->fdt, "/gpio-keys/poweroff",
84
- "gpios", phandle, 3, 0);
85
g_free(nodename);
86
+
87
+ /* Child gpio devices */
88
+ create_gpio_keys(vms, pl061_dev, phandle);
89
}
90
91
static void create_virtio_devices(const VirtMachineState *vms)
92
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
93
if (has_ged && aarch64 && firmware_loaded && virt_is_acpi_enabled(vms)) {
94
vms->acpi_dev = create_acpi_ged(vms);
95
} else {
96
- create_gpio(vms);
97
+ create_gpio_devices(vms, VIRT_GPIO, sysmem);
98
}
99
100
/* connect powerdown request */
101
--
107
--
102
2.20.1
108
2.20.1
103
109
104
110
diff view generated by jsdifflib
1
The ptimer API currently provides two methods for setting the period:
1
From: Beata Michalska <beata.michalska@linaro.org>
2
ptimer_set_period(), which takes a period in nanoseconds, and
3
ptimer_set_freq(), which takes a frequency in Hz. Neither of these
4
lines up nicely with the Clock API, because although both the Clock
5
and the ptimer track the frequency using a representation of whole
6
and fractional nanoseconds, conversion via either period-in-ns or
7
frequency-in-Hz will introduce a rounding error.
8
2
9
Add a new function ptimer_set_period_from_clock() which takes the
3
On ARMv7 & ARMv8 some load/store instructions might trigger a data abort
10
Clock object directly to avoid the rounding issues. This includes a
4
exception with no valid ISS info to be decoded. The lack of decode info
11
facility for the user to specify that there is a frequency divider
5
makes it at least tricky to emulate those instruction which is one of the
12
between the Clock proper and the timer, as some timer devices like
6
(many) reasons why KVM will not even try to do so.
13
the CMSDK APB dualtimer need this.
14
7
15
To avoid having to drag in clock.h from ptimer.h we add the Clock
8
Add support for handling those by requesting KVM to inject external
16
type to typedefs.h.
9
dabt into the quest.
17
10
11
Signed-off-by: Beata Michalska <beata.michalska@linaro.org>
12
Reviewed-by: Andrew Jones <drjones@redhat.com>
13
Message-id: 20200629114110.30723-2-beata.michalska@linaro.org
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Luc Michel <luc@lmichel.fr>
20
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
22
Message-id: 20210128114145.20536-2-peter.maydell@linaro.org
23
Message-id: 20210121190622.22000-2-peter.maydell@linaro.org
24
---
15
---
25
include/hw/ptimer.h | 22 ++++++++++++++++++++++
16
target/arm/kvm.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
26
include/qemu/typedefs.h | 1 +
17
1 file changed, 52 insertions(+)
27
hw/core/ptimer.c | 34 ++++++++++++++++++++++++++++++++++
28
3 files changed, 57 insertions(+)
29
18
30
diff --git a/include/hw/ptimer.h b/include/hw/ptimer.h
19
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
31
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
32
--- a/include/hw/ptimer.h
21
--- a/target/arm/kvm.c
33
+++ b/include/hw/ptimer.h
22
+++ b/target/arm/kvm.c
34
@@ -XXX,XX +XXX,XX @@ void ptimer_transaction_commit(ptimer_state *s);
23
@@ -XXX,XX +XXX,XX @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
35
*/
24
36
void ptimer_set_period(ptimer_state *s, int64_t period);
25
static bool cap_has_mp_state;
37
26
static bool cap_has_inject_serror_esr;
38
+/**
27
+static bool cap_has_inject_ext_dabt;
39
+ * ptimer_set_period_from_clock - Set counter increment from a Clock
28
40
+ * @s: ptimer to configure
29
static ARMHostCPUFeatures arm_host_cpu_features;
41
+ * @clk: pointer to Clock object to take period from
30
42
+ * @divisor: value to scale the clock frequency down by
31
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init(MachineState *ms, KVMState *s)
43
+ *
32
ret = -EINVAL;
44
+ * If the ptimer is being driven from a Clock, this is the preferred
33
}
45
+ * way to tell the ptimer about the period, because it avoids any
34
46
+ * possible rounding errors that might happen if the internal
35
+ if (kvm_check_extension(s, KVM_CAP_ARM_NISV_TO_USER)) {
47
+ * representation of the Clock period was converted to either a period
36
+ if (kvm_vm_enable_cap(s, KVM_CAP_ARM_NISV_TO_USER, 0)) {
48
+ * in ns or a frequency in Hz.
37
+ error_report("Failed to enable KVM_CAP_ARM_NISV_TO_USER cap");
49
+ *
38
+ } else {
50
+ * If the ptimer should run at the same frequency as the clock,
39
+ /* Set status for supporting the external dabt injection */
51
+ * pass 1 as the @divisor; if the ptimer should run at half the
40
+ cap_has_inject_ext_dabt = kvm_check_extension(s,
52
+ * frequency, pass 2, and so on.
41
+ KVM_CAP_ARM_INJECT_EXT_DABT);
53
+ *
42
+ }
54
+ * This function will assert if it is called outside a
43
+ }
55
+ * ptimer_transaction_begin/commit block.
56
+ */
57
+void ptimer_set_period_from_clock(ptimer_state *s, const Clock *clock,
58
+ unsigned int divisor);
59
+
44
+
60
/**
45
return ret;
61
* ptimer_set_freq - Set counter frequency in Hz
46
}
62
* @s: ptimer to configure
47
63
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
48
@@ -XXX,XX +XXX,XX @@ void kvm_arm_vm_state_change(void *opaque, int running, RunState state)
64
index XXXXXXX..XXXXXXX 100644
65
--- a/include/qemu/typedefs.h
66
+++ b/include/qemu/typedefs.h
67
@@ -XXX,XX +XXX,XX @@ typedef struct BlockDriverState BlockDriverState;
68
typedef struct BusClass BusClass;
69
typedef struct BusState BusState;
70
typedef struct Chardev Chardev;
71
+typedef struct Clock Clock;
72
typedef struct CompatProperty CompatProperty;
73
typedef struct CoMutex CoMutex;
74
typedef struct CPUAddressSpace CPUAddressSpace;
75
diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/hw/core/ptimer.c
78
+++ b/hw/core/ptimer.c
79
@@ -XXX,XX +XXX,XX @@
80
#include "sysemu/qtest.h"
81
#include "block/aio.h"
82
#include "sysemu/cpus.h"
83
+#include "hw/clock.h"
84
85
#define DELTA_ADJUST 1
86
#define DELTA_NO_ADJUST -1
87
@@ -XXX,XX +XXX,XX @@ void ptimer_set_period(ptimer_state *s, int64_t period)
88
}
49
}
89
}
50
}
90
51
91
+/* Set counter increment interval from a Clock */
52
+/**
92
+void ptimer_set_period_from_clock(ptimer_state *s, const Clock *clk,
53
+ * kvm_arm_handle_dabt_nisv:
93
+ unsigned int divisor)
54
+ * @cs: CPUState
55
+ * @esr_iss: ISS encoding (limited) for the exception from Data Abort
56
+ * ISV bit set to '0b0' -> no valid instruction syndrome
57
+ * @fault_ipa: faulting address for the synchronous data abort
58
+ *
59
+ * Returns: 0 if the exception has been handled, < 0 otherwise
60
+ */
61
+static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
62
+ uint64_t fault_ipa)
94
+{
63
+{
95
+ /*
64
+ /*
96
+ * The raw clock period is a 64-bit value in units of 2^-32 ns;
65
+ * Request KVM to inject the external data abort into the guest
97
+ * put another way it's a 32.32 fixed-point ns value. Our internal
98
+ * representation of the period is 64.32 fixed point ns, so
99
+ * the conversion is simple.
100
+ */
66
+ */
101
+ uint64_t raw_period = clock_get(clk);
67
+ if (cap_has_inject_ext_dabt) {
102
+ uint64_t period_frac;
68
+ struct kvm_vcpu_events events = { };
103
+
69
+ /*
104
+ assert(s->in_transaction);
70
+ * The external data abort event will be handled immediately by KVM
105
+ s->delta = ptimer_get_count(s);
71
+ * using the address fault that triggered the exit on given VCPU.
106
+ s->period = extract64(raw_period, 32, 32);
72
+ * Requesting injection of the external data abort does not rely
107
+ period_frac = extract64(raw_period, 0, 32);
73
+ * on any other VCPU state. Therefore, in this particular case, the VCPU
108
+ /*
74
+ * synchronization can be exceptionally skipped.
109
+ * divisor specifies a possible frequency divisor between the
75
+ */
110
+ * clock and the timer, so it is a multiplier on the period.
76
+ events.exception.ext_dabt_pending = 1;
111
+ * We do the multiply after splitting the raw period out into
77
+ /* KVM_CAP_ARM_INJECT_EXT_DABT implies KVM_CAP_VCPU_EVENTS */
112
+ * period and frac to avoid having to do a 32*64->96 multiply.
78
+ return kvm_vcpu_ioctl(cs, KVM_SET_VCPU_EVENTS, &events);
113
+ */
79
+ } else {
114
+ s->period *= divisor;
80
+ error_report("Data abort exception triggered by guest memory access "
115
+ period_frac *= divisor;
81
+ "at physical address: 0x" TARGET_FMT_lx,
116
+ s->period += extract64(period_frac, 32, 32);
82
+ (target_ulong)fault_ipa);
117
+ s->period_frac = (uint32_t)period_frac;
83
+ error_printf("KVM unable to emulate faulting instruction.\n");
118
+
119
+ if (s->enabled) {
120
+ s->need_reload = true;
121
+ }
84
+ }
85
+ return -1;
122
+}
86
+}
123
+
87
+
124
/* Set counter frequency in Hz. */
88
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
125
void ptimer_set_freq(ptimer_state *s, uint32_t freq)
126
{
89
{
90
int ret = 0;
91
@@ -XXX,XX +XXX,XX @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
92
ret = EXCP_DEBUG;
93
} /* otherwise return to guest */
94
break;
95
+ case KVM_EXIT_ARM_NISV:
96
+ /* External DABT with no valid iss to decode */
97
+ ret = kvm_arm_handle_dabt_nisv(cs, run->arm_nisv.esr_iss,
98
+ run->arm_nisv.fault_ipa);
99
+ break;
100
default:
101
qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n",
102
__func__, run->exit_reason);
127
--
103
--
128
2.20.1
104
2.20.1
129
105
130
106
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Beata Michalska <beata.michalska@linaro.org>
2
2
3
This was defined at some point before ARMv8.4, and will
3
Injecting external data abort through KVM might trigger
4
shortly be used by new processor descriptions.
4
an issue on kernels that do not get updated to include the KVM fix.
5
5
For those and aarch32 guests, the injected abort gets misconfigured
6
to be an implementation defined exception. This leads to the guest
7
repeatedly re-running the faulting instruction.
8
9
Add support for handling that case.
10
11
[
12
Fixed-by: 018f22f95e8a
13
    ('KVM: arm: Fix DFSR setting for non-LPAE aarch32 guests')
14
Fixed-by: 21aecdbd7f3a
15
    ('KVM: arm: Make inject_abt32() inject an external abort instead')
16
]
17
18
Signed-off-by: Beata Michalska <beata.michalska@linaro.org>
19
Acked-by: Andrew Jones <drjones@redhat.com>
20
Message-id: 20200629114110.30723-3-beata.michalska@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20210120204400.1056582-1-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
23
---
11
target/arm/cpu.h | 1 +
24
target/arm/cpu.h | 2 ++
12
target/arm/helper.c | 4 ++--
25
target/arm/kvm_arm.h | 10 +++++++++
13
target/arm/kvm64.c | 2 ++
26
target/arm/kvm.c | 30 ++++++++++++++++++++++++++-
14
3 files changed, 5 insertions(+), 2 deletions(-)
27
target/arm/kvm32.c | 34 ++++++++++++++++++++++++++++++
28
target/arm/kvm64.c | 49 ++++++++++++++++++++++++++++++++++++++++++++
29
5 files changed, 124 insertions(+), 1 deletion(-)
15
30
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
31
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
33
--- a/target/arm/cpu.h
19
+++ b/target/arm/cpu.h
34
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
35
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
21
uint32_t id_mmfr4;
36
uint64_t esr;
22
uint32_t id_pfr0;
37
} serror;
23
uint32_t id_pfr1;
38
24
+ uint32_t id_pfr2;
39
+ uint8_t ext_dabt_raised; /* Tracking/verifying injection of ext DABT */
25
uint32_t mvfr0;
40
+
26
uint32_t mvfr1;
41
/* State of our input IRQ/FIQ/VIRQ/VFIQ lines */
27
uint32_t mvfr2;
42
uint32_t irq_line_state;
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
43
29
index XXXXXXX..XXXXXXX 100644
44
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
30
--- a/target/arm/helper.c
45
index XXXXXXX..XXXXXXX 100644
31
+++ b/target/arm/helper.c
46
--- a/target/arm/kvm_arm.h
32
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
47
+++ b/target/arm/kvm_arm.h
33
.access = PL1_R, .type = ARM_CP_CONST,
48
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_hw_debug_active(CPUState *cs);
34
.accessfn = access_aa64_tid3,
49
struct kvm_guest_debug_arch;
35
.resetvalue = 0 },
50
void kvm_arm_copy_hw_debug_data(struct kvm_guest_debug_arch *ptr);
36
- { .name = "MVFR4_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
51
37
+ { .name = "ID_PFR2", .state = ARM_CP_STATE_BOTH,
52
+/**
38
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 4,
53
+ * kvm_arm_verify_ext_dabt_pending:
39
.access = PL1_R, .type = ARM_CP_CONST,
54
+ * @cs: CPUState
40
.accessfn = access_aa64_tid3,
55
+ *
41
- .resetvalue = 0 },
56
+ * Verify the fault status code wrt the Ext DABT injection
42
+ .resetvalue = cpu->isar.id_pfr2 },
57
+ *
43
{ .name = "MVFR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
58
+ * Returns: true if the fault status code is as expected, false otherwise
44
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 5,
59
+ */
45
.access = PL1_R, .type = ARM_CP_CONST,
60
+bool kvm_arm_verify_ext_dabt_pending(CPUState *cs);
61
+
62
/**
63
* its_class_name:
64
*
65
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/target/arm/kvm.c
68
+++ b/target/arm/kvm.c
69
@@ -XXX,XX +XXX,XX @@ int kvm_get_vcpu_events(ARMCPU *cpu)
70
71
void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run)
72
{
73
+ ARMCPU *cpu = ARM_CPU(cs);
74
+ CPUARMState *env = &cpu->env;
75
+
76
+ if (unlikely(env->ext_dabt_raised)) {
77
+ /*
78
+ * Verifying that the ext DABT has been properly injected,
79
+ * otherwise risking indefinitely re-running the faulting instruction
80
+ * Covering a very narrow case for kernels 5.5..5.5.4
81
+ * when injected abort was misconfigured to be
82
+ * an IMPLEMENTATION DEFINED exception (for 32-bit EL1)
83
+ */
84
+ if (!arm_feature(env, ARM_FEATURE_AARCH64) &&
85
+ unlikely(!kvm_arm_verify_ext_dabt_pending(cs))) {
86
+
87
+ error_report("Data abort exception with no valid ISS generated by "
88
+ "guest memory access. KVM unable to emulate faulting "
89
+ "instruction. Failed to inject an external data abort "
90
+ "into the guest.");
91
+ abort();
92
+ }
93
+ /* Clear the status */
94
+ env->ext_dabt_raised = 0;
95
+ }
96
}
97
98
MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
99
@@ -XXX,XX +XXX,XX @@ void kvm_arm_vm_state_change(void *opaque, int running, RunState state)
100
static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
101
uint64_t fault_ipa)
102
{
103
+ ARMCPU *cpu = ARM_CPU(cs);
104
+ CPUARMState *env = &cpu->env;
105
/*
106
* Request KVM to inject the external data abort into the guest
107
*/
108
@@ -XXX,XX +XXX,XX @@ static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
109
*/
110
events.exception.ext_dabt_pending = 1;
111
/* KVM_CAP_ARM_INJECT_EXT_DABT implies KVM_CAP_VCPU_EVENTS */
112
- return kvm_vcpu_ioctl(cs, KVM_SET_VCPU_EVENTS, &events);
113
+ if (!kvm_vcpu_ioctl(cs, KVM_SET_VCPU_EVENTS, &events)) {
114
+ env->ext_dabt_raised = 1;
115
+ return 0;
116
+ }
117
} else {
118
error_report("Data abort exception triggered by guest memory access "
119
"at physical address: 0x" TARGET_FMT_lx,
120
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
121
index XXXXXXX..XXXXXXX 100644
122
--- a/target/arm/kvm32.c
123
+++ b/target/arm/kvm32.c
124
@@ -XXX,XX +XXX,XX @@ void kvm_arm_pmu_init(CPUState *cs)
125
{
126
qemu_log_mask(LOG_UNIMP, "%s: not implemented\n", __func__);
127
}
128
+
129
+#define ARM_REG_DFSR ARM_CP15_REG32(0, 5, 0, 0)
130
+#define ARM_REG_TTBCR ARM_CP15_REG32(0, 2, 0, 2)
131
+/*
132
+ *DFSR:
133
+ * TTBCR.EAE == 0
134
+ * FS[4] - DFSR[10]
135
+ * FS[3:0] - DFSR[3:0]
136
+ * TTBCR.EAE == 1
137
+ * FS, bits [5:0]
138
+ */
139
+#define DFSR_FSC(lpae, v) \
140
+ ((lpae) ? ((v) & 0x3F) : (((v) >> 6) | ((v) & 0x1F)))
141
+
142
+#define DFSC_EXTABT(lpae) ((lpae) ? 0x10 : 0x08)
143
+
144
+bool kvm_arm_verify_ext_dabt_pending(CPUState *cs)
145
+{
146
+ uint32_t dfsr_val;
147
+
148
+ if (!kvm_get_one_reg(cs, ARM_REG_DFSR, &dfsr_val)) {
149
+ ARMCPU *cpu = ARM_CPU(cs);
150
+ CPUARMState *env = &cpu->env;
151
+ uint32_t ttbcr;
152
+ int lpae = 0;
153
+
154
+ if (!kvm_get_one_reg(cs, ARM_REG_TTBCR, &ttbcr)) {
155
+ lpae = arm_feature(env, ARM_FEATURE_LPAE) && (ttbcr & TTBCR_EAE);
156
+ }
157
+ /* The verification is based on FS filed of the DFSR reg only*/
158
+ return (DFSR_FSC(lpae, dfsr_val) == DFSC_EXTABT(lpae));
159
+ }
160
+ return false;
161
+}
46
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
162
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
47
index XXXXXXX..XXXXXXX 100644
163
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/kvm64.c
164
--- a/target/arm/kvm64.c
49
+++ b/target/arm/kvm64.c
165
+++ b/target/arm/kvm64.c
50
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
166
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit)
51
ARM64_SYS_REG(3, 0, 0, 1, 0));
167
52
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_pfr1,
168
return false;
53
ARM64_SYS_REG(3, 0, 0, 1, 1));
169
}
54
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_pfr2,
170
+
55
+ ARM64_SYS_REG(3, 0, 0, 3, 4));
171
+#define ARM64_REG_ESR_EL1 ARM64_SYS_REG(3, 0, 5, 2, 0)
56
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_dfr0,
172
+#define ARM64_REG_TCR_EL1 ARM64_SYS_REG(3, 0, 2, 0, 2)
57
ARM64_SYS_REG(3, 0, 0, 1, 2));
173
+
58
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr0,
174
+/*
175
+ * ESR_EL1
176
+ * ISS encoding
177
+ * AARCH64: DFSC, bits [5:0]
178
+ * AARCH32:
179
+ * TTBCR.EAE == 0
180
+ * FS[4] - DFSR[10]
181
+ * FS[3:0] - DFSR[3:0]
182
+ * TTBCR.EAE == 1
183
+ * FS, bits [5:0]
184
+ */
185
+#define ESR_DFSC(aarch64, lpae, v) \
186
+ ((aarch64 || (lpae)) ? ((v) & 0x3F) \
187
+ : (((v) >> 6) | ((v) & 0x1F)))
188
+
189
+#define ESR_DFSC_EXTABT(aarch64, lpae) \
190
+ ((aarch64) ? 0x10 : (lpae) ? 0x10 : 0x8)
191
+
192
+bool kvm_arm_verify_ext_dabt_pending(CPUState *cs)
193
+{
194
+ uint64_t dfsr_val;
195
+
196
+ if (!kvm_get_one_reg(cs, ARM64_REG_ESR_EL1, &dfsr_val)) {
197
+ ARMCPU *cpu = ARM_CPU(cs);
198
+ CPUARMState *env = &cpu->env;
199
+ int aarch64_mode = arm_feature(env, ARM_FEATURE_AARCH64);
200
+ int lpae = 0;
201
+
202
+ if (!aarch64_mode) {
203
+ uint64_t ttbcr;
204
+
205
+ if (!kvm_get_one_reg(cs, ARM64_REG_TCR_EL1, &ttbcr)) {
206
+ lpae = arm_feature(env, ARM_FEATURE_LPAE)
207
+ && (ttbcr & TTBCR_EAE);
208
+ }
209
+ }
210
+ /*
211
+ * The verification here is based on the DFSC bits
212
+ * of the ESR_EL1 reg only
213
+ */
214
+ return (ESR_DFSC(aarch64_mode, lpae, dfsr_val) ==
215
+ ESR_DFSC_EXTABT(aarch64_mode, lpae));
216
+ }
217
+ return false;
218
+}
59
--
219
--
60
2.20.1
220
2.20.1
61
221
62
222
diff view generated by jsdifflib
1
From: Mihai Carabas <mihai.carabas@oracle.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
Add a test case for pvpanic-pci device. The scenario is the same as pvpanic
3
Fixes: 93dd625f8bf7 ("tests/acpi: update expected data files")
4
ISA device, but is using the PCI bus.
4
Signed-off-by: Andrew Jones <drjones@redhat.com>
5
5
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
6
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Acked-by: Thomas Huth <thuth@redhat.com>
7
Message-id: 20200629140938.17566-2-drjones@redhat.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
9
---
12
tests/qtest/pvpanic-pci-test.c | 94 ++++++++++++++++++++++++++++++++++
10
tests/qtest/bios-tables-test-allowed-diff.h | 18 ------------------
13
tests/qtest/meson.build | 1 +
11
1 file changed, 18 deletions(-)
14
2 files changed, 95 insertions(+)
15
create mode 100644 tests/qtest/pvpanic-pci-test.c
16
12
17
diff --git a/tests/qtest/pvpanic-pci-test.c b/tests/qtest/pvpanic-pci-test.c
13
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
18
new file mode 100644
19
index XXXXXXX..XXXXXXX
20
--- /dev/null
21
+++ b/tests/qtest/pvpanic-pci-test.c
22
@@ -XXX,XX +XXX,XX @@
23
+/*
24
+ * QTest testcase for PV Panic PCI device
25
+ *
26
+ * Copyright (C) 2020 Oracle
27
+ *
28
+ * Authors:
29
+ * Mihai Carabas <mihai.carabas@oracle.com>
30
+ *
31
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
32
+ * See the COPYING file in the top-level directory.
33
+ *
34
+ */
35
+
36
+#include "qemu/osdep.h"
37
+#include "libqos/libqtest.h"
38
+#include "qapi/qmp/qdict.h"
39
+#include "libqos/pci.h"
40
+#include "libqos/pci-pc.h"
41
+#include "hw/pci/pci_regs.h"
42
+
43
+static void test_panic_nopause(void)
44
+{
45
+ uint8_t val;
46
+ QDict *response, *data;
47
+ QTestState *qts;
48
+ QPCIBus *pcibus;
49
+ QPCIDevice *dev;
50
+ QPCIBar bar;
51
+
52
+ qts = qtest_init("-device pvpanic-pci,addr=04.0 -action panic=none");
53
+ pcibus = qpci_new_pc(qts, NULL);
54
+ dev = qpci_device_find(pcibus, QPCI_DEVFN(0x4, 0x0));
55
+ qpci_device_enable(dev);
56
+ bar = qpci_iomap(dev, 0, NULL);
57
+
58
+ qpci_memread(dev, bar, 0, &val, sizeof(val));
59
+ g_assert_cmpuint(val, ==, 3);
60
+
61
+ val = 1;
62
+ qpci_memwrite(dev, bar, 0, &val, sizeof(val));
63
+
64
+ response = qtest_qmp_eventwait_ref(qts, "GUEST_PANICKED");
65
+ g_assert(qdict_haskey(response, "data"));
66
+ data = qdict_get_qdict(response, "data");
67
+ g_assert(qdict_haskey(data, "action"));
68
+ g_assert_cmpstr(qdict_get_str(data, "action"), ==, "run");
69
+ qobject_unref(response);
70
+
71
+ qtest_quit(qts);
72
+}
73
+
74
+static void test_panic(void)
75
+{
76
+ uint8_t val;
77
+ QDict *response, *data;
78
+ QTestState *qts;
79
+ QPCIBus *pcibus;
80
+ QPCIDevice *dev;
81
+ QPCIBar bar;
82
+
83
+ qts = qtest_init("-device pvpanic-pci,addr=04.0 -action panic=pause");
84
+ pcibus = qpci_new_pc(qts, NULL);
85
+ dev = qpci_device_find(pcibus, QPCI_DEVFN(0x4, 0x0));
86
+ qpci_device_enable(dev);
87
+ bar = qpci_iomap(dev, 0, NULL);
88
+
89
+ qpci_memread(dev, bar, 0, &val, sizeof(val));
90
+ g_assert_cmpuint(val, ==, 3);
91
+
92
+ val = 1;
93
+ qpci_memwrite(dev, bar, 0, &val, sizeof(val));
94
+
95
+ response = qtest_qmp_eventwait_ref(qts, "GUEST_PANICKED");
96
+ g_assert(qdict_haskey(response, "data"));
97
+ data = qdict_get_qdict(response, "data");
98
+ g_assert(qdict_haskey(data, "action"));
99
+ g_assert_cmpstr(qdict_get_str(data, "action"), ==, "pause");
100
+ qobject_unref(response);
101
+
102
+ qtest_quit(qts);
103
+}
104
+
105
+int main(int argc, char **argv)
106
+{
107
+ int ret;
108
+
109
+ g_test_init(&argc, &argv, NULL);
110
+ qtest_add_func("/pvpanic-pci/panic", test_panic);
111
+ qtest_add_func("/pvpanic-pci/panic-nopause", test_panic_nopause);
112
+
113
+ ret = g_test_run();
114
+
115
+ return ret;
116
+}
117
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
118
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
119
--- a/tests/qtest/meson.build
15
--- a/tests/qtest/bios-tables-test-allowed-diff.h
120
+++ b/tests/qtest/meson.build
16
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
121
@@ -XXX,XX +XXX,XX @@ qtests_i386 = \
17
@@ -1,19 +1 @@
122
config_all_devices.has_key('CONFIG_ISA_IPMI_BT') ? ['ipmi-bt-test'] : []) + \
18
/* List of comma-separated changed AML files to ignore */
123
(config_all_devices.has_key('CONFIG_WDT_IB700') ? ['wdt_ib700-test'] : []) + \
19
-"tests/data/acpi/pc/DSDT",
124
(config_all_devices.has_key('CONFIG_PVPANIC_ISA') ? ['pvpanic-test'] : []) + \
20
-"tests/data/acpi/pc/DSDT.acpihmat",
125
+ (config_all_devices.has_key('CONFIG_PVPANIC_PCI') ? ['pvpanic-pci-test'] : []) + \
21
-"tests/data/acpi/pc/DSDT.bridge",
126
(config_all_devices.has_key('CONFIG_HDA') ? ['intel-hda-test'] : []) + \
22
-"tests/data/acpi/pc/DSDT.cphp",
127
(config_all_devices.has_key('CONFIG_I82801B11') ? ['i82801b11-test'] : []) + \
23
-"tests/data/acpi/pc/DSDT.dimmpxm",
128
(config_all_devices.has_key('CONFIG_IOH3420') ? ['ioh3420-test'] : []) + \
24
-"tests/data/acpi/pc/DSDT.ipmikcs",
25
-"tests/data/acpi/pc/DSDT.memhp",
26
-"tests/data/acpi/pc/DSDT.numamem",
27
-"tests/data/acpi/q35/DSDT",
28
-"tests/data/acpi/q35/DSDT.acpihmat",
29
-"tests/data/acpi/q35/DSDT.bridge",
30
-"tests/data/acpi/q35/DSDT.cphp",
31
-"tests/data/acpi/q35/DSDT.dimmpxm",
32
-"tests/data/acpi/q35/DSDT.ipmibt",
33
-"tests/data/acpi/q35/DSDT.memhp",
34
-"tests/data/acpi/q35/DSDT.mmio64",
35
-"tests/data/acpi/q35/DSDT.numamem",
36
-"tests/data/acpi/q35/DSDT.tis",
129
--
37
--
130
2.20.1
38
2.20.1
131
39
132
40
diff view generated by jsdifflib
1
From: Alexander Graf <agraf@csgraf.de>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
In macOS 11, QEMU only gets access to Hypervisor.framework if it has the
3
Signed-off-by: Andrew Jones <drjones@redhat.com>
4
respective entitlement. Add an entitlement template and automatically self
4
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
5
sign and apply the entitlement in the build.
5
Reviewed-by: Eric Auger <eric.auger@redhat.com>
6
6
Message-id: 20200629140938.17566-3-drjones@redhat.com
7
Signed-off-by: Alexander Graf <agraf@csgraf.de>
8
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
9
Tested-by: Roman Bolshakov <r.bolshakov@yadro.com>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
8
---
12
meson.build | 29 +++++++++++++++++++++++++----
9
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
13
accel/hvf/entitlements.plist | 8 ++++++++
10
1 file changed, 3 insertions(+)
14
scripts/entitlement.sh | 13 +++++++++++++
15
3 files changed, 46 insertions(+), 4 deletions(-)
16
create mode 100644 accel/hvf/entitlements.plist
17
create mode 100755 scripts/entitlement.sh
18
11
19
diff --git a/meson.build b/meson.build
12
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
20
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
21
--- a/meson.build
14
--- a/tests/qtest/bios-tables-test-allowed-diff.h
22
+++ b/meson.build
15
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
23
@@ -XXX,XX +XXX,XX @@ foreach target : target_dirs
16
@@ -1 +1,4 @@
24
}]
17
/* List of comma-separated changed AML files to ignore */
25
endif
18
+"tests/data/acpi/virt/DSDT",
26
foreach exe: execs
19
+"tests/data/acpi/virt/DSDT.memhp",
27
- emulators += {exe['name']:
20
+"tests/data/acpi/virt/DSDT.numamem",
28
- executable(exe['name'], exe['sources'],
29
- install: true,
30
+ exe_name = exe['name']
31
+ exe_sign = 'CONFIG_HVF' in config_target
32
+ if exe_sign
33
+ exe_name += '-unsigned'
34
+ endif
35
+
36
+ emulator = executable(exe_name, exe['sources'],
37
+ install: not exe_sign,
38
c_args: c_args,
39
dependencies: arch_deps + deps + exe['dependencies'],
40
objects: lib.extract_all_objects(recursive: true),
41
@@ -XXX,XX +XXX,XX @@ foreach target : target_dirs
42
link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
43
link_args: link_args,
44
gui_app: exe['gui'])
45
- }
46
+
47
+ if exe_sign
48
+ emulators += {exe['name'] : custom_target(exe['name'],
49
+ install: true,
50
+ install_dir: get_option('bindir'),
51
+ depends: emulator,
52
+ output: exe['name'],
53
+ command: [
54
+ meson.current_source_dir() / 'scripts/entitlement.sh',
55
+ meson.current_build_dir() / exe_name,
56
+ meson.current_build_dir() / exe['name'],
57
+ meson.current_source_dir() / 'accel/hvf/entitlements.plist'
58
+ ])
59
+ }
60
+ else
61
+ emulators += {exe['name']: emulator}
62
+ endif
63
64
if 'CONFIG_TRACE_SYSTEMTAP' in config_host
65
foreach stp: [
66
diff --git a/accel/hvf/entitlements.plist b/accel/hvf/entitlements.plist
67
new file mode 100644
68
index XXXXXXX..XXXXXXX
69
--- /dev/null
70
+++ b/accel/hvf/entitlements.plist
71
@@ -XXX,XX +XXX,XX @@
72
+<?xml version="1.0" encoding="UTF-8"?>
73
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
74
+<plist version="1.0">
75
+<dict>
76
+ <key>com.apple.security.hypervisor</key>
77
+ <true/>
78
+</dict>
79
+</plist>
80
diff --git a/scripts/entitlement.sh b/scripts/entitlement.sh
81
new file mode 100755
82
index XXXXXXX..XXXXXXX
83
--- /dev/null
84
+++ b/scripts/entitlement.sh
85
@@ -XXX,XX +XXX,XX @@
86
+#!/bin/sh -e
87
+#
88
+# Helper script for the build process to apply entitlements
89
+
90
+SRC="$1"
91
+DST="$2"
92
+ENTITLEMENT="$3"
93
+
94
+trap 'rm "$DST.tmp"' exit
95
+cp -af "$SRC" "$DST.tmp"
96
+codesign --entitlements "$ENTITLEMENT" --force -s - "$DST.tmp"
97
+mv "$DST.tmp" "$DST"
98
+trap '' exit
99
--
21
--
100
2.20.1
22
2.20.1
101
23
102
24
diff view generated by jsdifflib
1
From: Maxim Uvarov <maxim.uvarov@linaro.org>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
Add secure pl061 for reset/power down machine from
3
The flash device is exclusively for the host-controlled firmware, so
4
the secure world (Arm Trusted Firmware). Connect it
4
we should not expose it to the OS. Exposing it risks the OS messing
5
with gpio-pwr driver.
5
with it, which could break firmware runtime services and surprise the
6
OS when all its changes disappear after reboot.
6
7
7
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
8
As firmware needs the device and uses DT, we leave the device exposed
8
Reviewed-by: Andrew Jones <drjones@redhat.com>
9
there. It's up to firmware to remove the nodes from DT before sending
9
[PMM: Added mention of the new device to the documentation]
10
it on to the OS. However, there's no need to force firmware to remove
11
tables from ACPI (which it doesn't know how to do anyway), so we
12
simply don't add the tables in the first place. But, as we've been
13
adding the tables for quite some time and don't want to change the
14
default hardware exposed to versioned machines, then we only stop
15
exposing the flash device tables for 5.1 and later machine types.
16
17
Suggested-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
18
Suggested-by: Laszlo Ersek <lersek@redhat.com>
19
Signed-off-by: Andrew Jones <drjones@redhat.com>
20
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
21
Reviewed-by: Eric Auger <eric.auger@redhat.com>
22
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
23
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
24
Message-id: 20200629140938.17566-4-drjones@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
26
---
12
docs/system/arm/virt.rst | 2 ++
27
include/hw/arm/virt.h | 1 +
13
include/hw/arm/virt.h | 2 ++
28
hw/arm/virt-acpi-build.c | 5 ++++-
14
hw/arm/virt.c | 56 +++++++++++++++++++++++++++++++++++++++-
29
hw/arm/virt.c | 3 +++
15
hw/arm/Kconfig | 1 +
30
3 files changed, 8 insertions(+), 1 deletion(-)
16
4 files changed, 60 insertions(+), 1 deletion(-)
17
31
18
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
19
index XXXXXXX..XXXXXXX 100644
20
--- a/docs/system/arm/virt.rst
21
+++ b/docs/system/arm/virt.rst
22
@@ -XXX,XX +XXX,XX @@ The virt board supports:
23
- Secure-World-only devices if the CPU has TrustZone:
24
25
- A second PL011 UART
26
+ - A second PL061 GPIO controller, with GPIO lines for triggering
27
+ a system reset or system poweroff
28
- A secure flash memory
29
- 16MB of secure RAM
30
31
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
32
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
32
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
33
--- a/include/hw/arm/virt.h
34
--- a/include/hw/arm/virt.h
34
+++ b/include/hw/arm/virt.h
35
+++ b/include/hw/arm/virt.h
35
@@ -XXX,XX +XXX,XX @@ enum {
36
@@ -XXX,XX +XXX,XX @@ typedef struct {
36
VIRT_GPIO,
37
bool no_highmem_ecam;
37
VIRT_SECURE_UART,
38
bool no_ged; /* Machines < 4.2 has no support for ACPI GED device */
38
VIRT_SECURE_MEM,
39
+ VIRT_SECURE_GPIO,
40
VIRT_PCDIMM_ACPI,
41
VIRT_ACPI_GED,
42
VIRT_NVDIMM_ACPI,
43
@@ -XXX,XX +XXX,XX @@ struct VirtMachineClass {
44
bool kvm_no_adjvtime;
39
bool kvm_no_adjvtime;
45
bool no_kvm_steal_time;
40
+ bool acpi_expose_flash;
46
bool acpi_expose_flash;
41
} VirtMachineClass;
47
+ bool no_secure_gpio;
42
48
};
43
typedef struct {
49
44
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
50
struct VirtMachineState {
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/arm/virt-acpi-build.c
47
+++ b/hw/arm/virt-acpi-build.c
48
@@ -XXX,XX +XXX,XX @@ static void build_fadt_rev5(GArray *table_data, BIOSLinker *linker,
49
static void
50
build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
51
{
52
+ VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
53
Aml *scope, *dsdt;
54
MachineState *ms = MACHINE(vms);
55
const MemMapEntry *memmap = vms->memmap;
56
@@ -XXX,XX +XXX,XX @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
57
acpi_dsdt_add_cpus(scope, vms->smp_cpus);
58
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART],
59
(irqmap[VIRT_UART] + ARM_SPI_BASE));
60
- acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
61
+ if (vmc->acpi_expose_flash) {
62
+ acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
63
+ }
64
acpi_dsdt_add_fw_cfg(scope, &memmap[VIRT_FW_CFG]);
65
acpi_dsdt_add_virtio(scope, &memmap[VIRT_MMIO],
66
(irqmap[VIRT_MMIO] + ARM_SPI_BASE), NUM_VIRTIO_TRANSPORTS);
51
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
67
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
52
index XXXXXXX..XXXXXXX 100644
68
index XXXXXXX..XXXXXXX 100644
53
--- a/hw/arm/virt.c
69
--- a/hw/arm/virt.c
54
+++ b/hw/arm/virt.c
70
+++ b/hw/arm/virt.c
55
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry base_memmap[] = {
71
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 1)
56
[VIRT_ACPI_GED] = { 0x09080000, ACPI_GED_EVT_SEL_LEN },
72
57
[VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
73
static void virt_machine_5_0_options(MachineClass *mc)
58
[VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
59
+ [VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 },
60
[VIRT_MMIO] = { 0x0a000000, 0x00000200 },
61
/* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
62
[VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 },
63
@@ -XXX,XX +XXX,XX @@ static void create_gpio_keys(const VirtMachineState *vms,
64
"gpios", phandle, 3, 0);
65
}
66
67
+#define SECURE_GPIO_POWEROFF 0
68
+#define SECURE_GPIO_RESET 1
69
+
70
+static void create_secure_gpio_pwr(const VirtMachineState *vms,
71
+ DeviceState *pl061_dev,
72
+ uint32_t phandle)
73
+{
74
+ DeviceState *gpio_pwr_dev;
75
+
76
+ /* gpio-pwr */
77
+ gpio_pwr_dev = sysbus_create_simple("gpio-pwr", -1, NULL);
78
+
79
+ /* connect secure pl061 to gpio-pwr */
80
+ qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_RESET,
81
+ qdev_get_gpio_in_named(gpio_pwr_dev, "reset", 0));
82
+ qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_POWEROFF,
83
+ qdev_get_gpio_in_named(gpio_pwr_dev, "shutdown", 0));
84
+
85
+ qemu_fdt_add_subnode(vms->fdt, "/gpio-poweroff");
86
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-poweroff", "compatible",
87
+ "gpio-poweroff");
88
+ qemu_fdt_setprop_cells(vms->fdt, "/gpio-poweroff",
89
+ "gpios", phandle, SECURE_GPIO_POWEROFF, 0);
90
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-poweroff", "status", "disabled");
91
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-poweroff", "secure-status",
92
+ "okay");
93
+
94
+ qemu_fdt_add_subnode(vms->fdt, "/gpio-restart");
95
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-restart", "compatible",
96
+ "gpio-restart");
97
+ qemu_fdt_setprop_cells(vms->fdt, "/gpio-restart",
98
+ "gpios", phandle, SECURE_GPIO_RESET, 0);
99
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-restart", "status", "disabled");
100
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-restart", "secure-status",
101
+ "okay");
102
+}
103
+
104
static void create_gpio_devices(const VirtMachineState *vms, int gpio,
105
MemoryRegion *mem)
106
{
107
@@ -XXX,XX +XXX,XX @@ static void create_gpio_devices(const VirtMachineState *vms, int gpio,
108
qemu_fdt_setprop_string(vms->fdt, nodename, "clock-names", "apb_pclk");
109
qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", phandle);
110
111
+ if (gpio != VIRT_GPIO) {
112
+ /* Mark as not usable by the normal world */
113
+ qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled");
114
+ qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay");
115
+ }
116
g_free(nodename);
117
118
/* Child gpio devices */
119
- create_gpio_keys(vms, pl061_dev, phandle);
120
+ if (gpio == VIRT_GPIO) {
121
+ create_gpio_keys(vms, pl061_dev, phandle);
122
+ } else {
123
+ create_secure_gpio_pwr(vms, pl061_dev, phandle);
124
+ }
125
}
126
127
static void create_virtio_devices(const VirtMachineState *vms)
128
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
129
create_gpio_devices(vms, VIRT_GPIO, sysmem);
130
}
131
132
+ if (vms->secure && !vmc->no_secure_gpio) {
133
+ create_gpio_devices(vms, VIRT_SECURE_GPIO, secure_sysmem);
134
+ }
135
+
136
/* connect powerdown request */
137
vms->powerdown_notifier.notify = virt_powerdown_req;
138
qemu_register_powerdown_notifier(&vms->powerdown_notifier);
139
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(6, 0)
140
141
static void virt_machine_5_2_options(MachineClass *mc)
142
{
74
{
143
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
75
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
144
+
76
+
145
virt_machine_6_0_options(mc);
77
virt_machine_5_1_options(mc);
146
compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
78
compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
147
+ vmc->no_secure_gpio = true;
79
mc->numa_mem_supported = true;
80
+ vmc->acpi_expose_flash = true;
148
}
81
}
149
DEFINE_VIRT_MACHINE(5, 2)
82
DEFINE_VIRT_MACHINE(5, 0)
150
83
151
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
152
index XXXXXXX..XXXXXXX 100644
153
--- a/hw/arm/Kconfig
154
+++ b/hw/arm/Kconfig
155
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
156
select PL011 # UART
157
select PL031 # RTC
158
select PL061 # GPIO
159
+ select GPIO_PWR
160
select PLATFORM_BUS
161
select SMBIOS
162
select VIRTIO_MMIO
163
--
84
--
164
2.20.1
85
2.20.1
165
86
166
87
diff view generated by jsdifflib
1
As the first step in converting the CMSDK_APB_TIMER device to the
1
From: Andrew Jones <drjones@redhat.com>
2
Clock framework, add a Clock input. For the moment we do nothing
3
with this clock; we will change the behaviour from using the
4
wdogclk-frq property to using the Clock once all the users of this
5
device have been converted to wire up the Clock.
6
2
7
This is a migration compatibility break for machines mps2-an385,
3
Differences between disassembled ASL files for DSDT:
8
mps2-an386, mps2-an500, mps2-an511, mps2-an505, mps2-an521, musca-a,
9
musca-b1, lm3s811evb, lm3s6965evb.
10
4
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Luc Michel <luc@lmichel.fr>
14
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20210128114145.20536-10-peter.maydell@linaro.org
16
Message-id: 20210121190622.22000-10-peter.maydell@linaro.org
17
---
18
include/hw/watchdog/cmsdk-apb-watchdog.h | 3 +++
19
hw/watchdog/cmsdk-apb-watchdog.c | 7 +++++--
20
2 files changed, 8 insertions(+), 2 deletions(-)
21
22
diff --git a/include/hw/watchdog/cmsdk-apb-watchdog.h b/include/hw/watchdog/cmsdk-apb-watchdog.h
23
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/watchdog/cmsdk-apb-watchdog.h
25
+++ b/include/hw/watchdog/cmsdk-apb-watchdog.h
26
@@ -XXX,XX +XXX,XX @@
5
@@ -XXX,XX +XXX,XX @@
27
*
6
*
28
* QEMU interface:
7
* Disassembling to symbolic ASL+ operators
29
* + QOM property "wdogclk-frq": frequency at which the watchdog is clocked
30
+ * + Clock input "WDOGCLK": clock for the watchdog's timer
31
* + sysbus MMIO region 0: the register bank
32
* + sysbus IRQ 0: watchdog interrupt
33
*
8
*
9
- * Disassembly of a, Mon Jun 29 09:50:01 2020
10
+ * Disassembly of b, Mon Jun 29 09:50:03 2020
11
*
12
* Original Table Header:
13
* Signature "DSDT"
14
- * Length 0x000014BB (5307)
15
+ * Length 0x00001455 (5205)
16
* Revision 0x02
17
- * Checksum 0xD1
18
+ * Checksum 0xE1
19
* OEM ID "BOCHS "
20
* OEM Table ID "BXPCDSDT"
21
* OEM Revision 0x00000001 (1)
34
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
35
23
})
36
#include "hw/sysbus.h"
24
}
37
#include "hw/ptimer.h"
25
38
+#include "hw/clock.h"
26
- Device (FLS0)
39
#include "qom/object.h"
27
- {
40
28
- Name (_HID, "LNRO0015") // _HID: Hardware ID
41
#define TYPE_CMSDK_APB_WATCHDOG "cmsdk-apb-watchdog"
29
- Name (_UID, Zero) // _UID: Unique ID
42
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBWatchdog {
30
- Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
43
uint32_t wdogclk_frq;
31
- {
44
bool is_luminary;
32
- Memory32Fixed (ReadWrite,
45
struct ptimer_state *timer;
33
- 0x00000000, // Address Base
46
+ Clock *wdogclk;
34
- 0x04000000, // Address Length
47
35
- )
48
uint32_t control;
36
- })
49
uint32_t intstatus;
37
- }
50
diff --git a/hw/watchdog/cmsdk-apb-watchdog.c b/hw/watchdog/cmsdk-apb-watchdog.c
38
-
39
- Device (FLS1)
40
- {
41
- Name (_HID, "LNRO0015") // _HID: Hardware ID
42
- Name (_UID, One) // _UID: Unique ID
43
- Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
44
- {
45
- Memory32Fixed (ReadWrite,
46
- 0x04000000, // Address Base
47
- 0x04000000, // Address Length
48
- )
49
- })
50
- }
51
-
52
Device (FWCF)
53
{
54
Name (_HID, "QEMU0002") // _HID: Hardware ID
55
56
The other two binaries have the same changes (the removal of the
57
flash devices).
58
59
Signed-off-by: Andrew Jones <drjones@redhat.com>
60
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
61
Reviewed-by: Eric Auger <eric.auger@redhat.com>
62
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
63
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
64
Message-id: 20200629140938.17566-5-drjones@redhat.com
65
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
66
---
67
tests/qtest/bios-tables-test-allowed-diff.h | 3 ---
68
tests/data/acpi/virt/DSDT | Bin 5307 -> 5205 bytes
69
tests/data/acpi/virt/DSDT.memhp | Bin 6668 -> 6566 bytes
70
tests/data/acpi/virt/DSDT.numamem | Bin 5307 -> 5205 bytes
71
4 files changed, 3 deletions(-)
72
73
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
51
index XXXXXXX..XXXXXXX 100644
74
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/watchdog/cmsdk-apb-watchdog.c
75
--- a/tests/qtest/bios-tables-test-allowed-diff.h
53
+++ b/hw/watchdog/cmsdk-apb-watchdog.c
76
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
54
@@ -XXX,XX +XXX,XX @@
77
@@ -1,4 +1 @@
55
#include "hw/irq.h"
78
/* List of comma-separated changed AML files to ignore */
56
#include "hw/qdev-properties.h"
79
-"tests/data/acpi/virt/DSDT",
57
#include "hw/registerfields.h"
80
-"tests/data/acpi/virt/DSDT.memhp",
58
+#include "hw/qdev-clock.h"
81
-"tests/data/acpi/virt/DSDT.numamem",
59
#include "hw/watchdog/cmsdk-apb-watchdog.h"
82
diff --git a/tests/data/acpi/virt/DSDT b/tests/data/acpi/virt/DSDT
60
#include "migration/vmstate.h"
83
index XXXXXXX..XXXXXXX 100644
61
84
GIT binary patch
62
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_init(Object *obj)
85
delta 28
63
s, "cmsdk-apb-watchdog", 0x1000);
86
kcmdn3c~yhUCD<h-RD^+n>ET2!X{H9}iRuX(-<}f&0DgxFc>n+a
64
sysbus_init_mmio(sbd, &s->iomem);
87
65
sysbus_init_irq(sbd, &s->wdogint);
88
delta 156
66
+ s->wdogclk = qdev_init_clock_in(DEVICE(s), "WDOGCLK", NULL, NULL);
89
zcmcbrv0IbNCD<iow+I6R)5VEg(oAih6V(&y4c&Z#4LIUGJY9Hw{DS-q3=B;fIO0P+
67
90
zU4W!>P_UpN7hfAE10w?juv9WcH-WSmV$;Hiu7w4t3#`S$E!^1+q9xGPH`KtuzzAr5
68
s->is_luminary = false;
91
LaERl^1zUvy_;n(J
69
s->id = cmsdk_apb_watchdog_id;
92
70
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_realize(DeviceState *dev, Error **errp)
93
diff --git a/tests/data/acpi/virt/DSDT.memhp b/tests/data/acpi/virt/DSDT.memhp
71
94
index XXXXXXX..XXXXXXX 100644
72
static const VMStateDescription cmsdk_apb_watchdog_vmstate = {
95
GIT binary patch
73
.name = "cmsdk-apb-watchdog",
96
delta 28
74
- .version_id = 1,
97
kcmeA%S!T@T66_MPOp<|tiD@F2G*jb@iRuX(-^xn@0CHUjRR910
75
- .minimum_version_id = 1,
98
76
+ .version_id = 2,
99
delta 156
77
+ .minimum_version_id = 2,
100
zcmZ2x++)J!66_MfBgMeL^l>7WG*kP$iRuaUhHgH=1|0Doo-VvTenI{Q28N~#9Py!^
78
.fields = (VMStateField[]) {
101
zE<n;bC|FRCi?5B7fsp|MSSlH!n?PC&v1wsM*TMqS1=eEW7Vhi@(GuwD8){%+U<5Qj
79
+ VMSTATE_CLOCK(wdogclk, CMSDKAPBWatchdog),
102
LIK*+|0yaqism~!^
80
VMSTATE_PTIMER(timer, CMSDKAPBWatchdog),
103
81
VMSTATE_UINT32(control, CMSDKAPBWatchdog),
104
diff --git a/tests/data/acpi/virt/DSDT.numamem b/tests/data/acpi/virt/DSDT.numamem
82
VMSTATE_UINT32(intstatus, CMSDKAPBWatchdog),
105
index XXXXXXX..XXXXXXX 100644
106
GIT binary patch
107
delta 28
108
kcmdn3c~yhUCD<h-RD^+n>ET2!X{H9}iRuX(-<}f&0DgxFc>n+a
109
110
delta 156
111
zcmcbrv0IbNCD<iow+I6R)5VEg(oAih6V(&y4c&Z#4LIUGJY9Hw{DS-q3=B;fIO0P+
112
zU4W!>P_UpN7hfAE10w?juv9WcH-WSmV$;Hiu7w4t3#`S$E!^1+q9xGPH`KtuzzAr5
113
LaERl^1zUvy_;n(J
114
83
--
115
--
84
2.20.1
116
2.20.1
85
117
86
118
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Only define the register if it exists for the cpu.
3
The temp that gets assigned to clean_addr has been allocated with
4
new_tmp_a64, which means that it will be freed at the end of the
5
instruction. Freeing it earlier leads to assertion failure.
4
6
7
The loop creates a complication, in which we allocate a new local
8
temp, which does need freeing, and the final code path is shared
9
between the loop and non-loop.
10
11
Fix this complication by adding new_tmp_a64_local so that the new
12
local temp is freed at the end, and can be treated exactly like
13
the non-loop path.
14
15
Fixes: bba87d0a0f4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
16
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20210120031656.737646-1-richard.henderson@linaro.org
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Message-id: 20200702175605.1987125-1-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
20
---
10
target/arm/helper.c | 21 +++++++++++++++------
21
target/arm/translate-a64.h | 1 +
11
1 file changed, 15 insertions(+), 6 deletions(-)
22
target/arm/translate-a64.c | 6 ++++++
23
target/arm/translate-sve.c | 8 ++------
24
3 files changed, 9 insertions(+), 6 deletions(-)
12
25
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
14
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
28
--- a/target/arm/translate-a64.h
16
+++ b/target/arm/helper.c
29
+++ b/target/arm/translate-a64.h
17
@@ -XXX,XX +XXX,XX @@ static void define_debug_regs(ARMCPU *cpu)
30
@@ -XXX,XX +XXX,XX @@ void unallocated_encoding(DisasContext *s);
18
*/
31
} while (0)
19
int i;
32
20
int wrps, brps, ctx_cmps;
33
TCGv_i64 new_tmp_a64(DisasContext *s);
21
- ARMCPRegInfo dbgdidr = {
34
+TCGv_i64 new_tmp_a64_local(DisasContext *s);
22
- .name = "DBGDIDR", .cp = 14, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 0,
35
TCGv_i64 new_tmp_a64_zero(DisasContext *s);
23
- .access = PL0_R, .accessfn = access_tda,
36
TCGv_i64 cpu_reg(DisasContext *s, int reg);
24
- .type = ARM_CP_CONST, .resetvalue = cpu->isar.dbgdidr,
37
TCGv_i64 cpu_reg_sp(DisasContext *s, int reg);
25
- };
38
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/translate-a64.c
41
+++ b/target/arm/translate-a64.c
42
@@ -XXX,XX +XXX,XX @@ TCGv_i64 new_tmp_a64(DisasContext *s)
43
return s->tmp_a64[s->tmp_a64_count++] = tcg_temp_new_i64();
44
}
45
46
+TCGv_i64 new_tmp_a64_local(DisasContext *s)
47
+{
48
+ assert(s->tmp_a64_count < TMP_A64_MAX);
49
+ return s->tmp_a64[s->tmp_a64_count++] = tcg_temp_local_new_i64();
50
+}
26
+
51
+
27
+ /*
52
TCGv_i64 new_tmp_a64_zero(DisasContext *s)
28
+ * The Arm ARM says DBGDIDR is optional and deprecated if EL1 cannot
53
{
29
+ * use AArch32. Given that bit 15 is RES1, if the value is 0 then
54
TCGv_i64 t = new_tmp_a64(s);
30
+ * the register must not exist for this cpu.
55
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
31
+ */
56
index XXXXXXX..XXXXXXX 100644
32
+ if (cpu->isar.dbgdidr != 0) {
57
--- a/target/arm/translate-sve.c
33
+ ARMCPRegInfo dbgdidr = {
58
+++ b/target/arm/translate-sve.c
34
+ .name = "DBGDIDR", .cp = 14, .crn = 0, .crm = 0,
59
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
35
+ .opc1 = 0, .opc2 = 0,
60
36
+ .access = PL0_R, .accessfn = access_tda,
61
/* Copy the clean address into a local temp, live across the loop. */
37
+ .type = ARM_CP_CONST, .resetvalue = cpu->isar.dbgdidr,
62
t0 = clean_addr;
38
+ };
63
- clean_addr = tcg_temp_local_new_i64();
39
+ define_one_arm_cp_reg(cpu, &dbgdidr);
64
+ clean_addr = new_tmp_a64_local(s);
40
+ }
65
tcg_gen_mov_i64(clean_addr, t0);
41
66
- tcg_temp_free_i64(t0);
42
/* Note that all these register fields hold "number of Xs minus 1". */
67
43
brps = arm_num_brps(cpu);
68
gen_set_label(loop);
44
@@ -XXX,XX +XXX,XX @@ static void define_debug_regs(ARMCPU *cpu)
69
45
70
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
46
assert(ctx_cmps <= brps);
71
tcg_gen_st_i64(t0, cpu_env, vofs + len_align);
47
72
tcg_temp_free_i64(t0);
48
- define_one_arm_cp_reg(cpu, &dbgdidr);
73
}
49
define_arm_cp_regs(cpu, debug_cp_reginfo);
74
- tcg_temp_free_i64(clean_addr);
50
75
}
51
if (arm_feature(&cpu->env, ARM_FEATURE_LPAE)) {
76
77
/* Similarly for stores. */
78
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
79
80
/* Copy the clean address into a local temp, live across the loop. */
81
t0 = clean_addr;
82
- clean_addr = tcg_temp_local_new_i64();
83
+ clean_addr = new_tmp_a64_local(s);
84
tcg_gen_mov_i64(clean_addr, t0);
85
- tcg_temp_free_i64(t0);
86
87
gen_set_label(loop);
88
89
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
90
}
91
tcg_temp_free_i64(t0);
92
}
93
- tcg_temp_free_i64(clean_addr);
94
}
95
96
static bool trans_LDR_zri(DisasContext *s, arg_rri *a)
52
--
97
--
53
2.20.1
98
2.20.1
54
99
55
100
diff view generated by jsdifflib
Deleted patch
1
From: Paolo Bonzini <pbonzini@redhat.com>
2
1
3
The properties to attach a CANBUS object to the xlnx-zcu102 machine have
4
a period in them. We want to use periods in properties for compound QAPI types,
5
and besides the "xlnx-zcu102." prefix is both unnecessary and different
6
from any other machine property name. Remove it.
7
8
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
9
Message-id: 20210118162537.779542-1-pbonzini@redhat.com
10
Reviewed-by: Vikram Garhwal <fnu.vikram@xilinx.com>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/arm/xlnx-zcu102.c | 4 ++--
14
tests/qtest/xlnx-can-test.c | 30 +++++++++++++++---------------
15
2 files changed, 17 insertions(+), 17 deletions(-)
16
17
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/xlnx-zcu102.c
20
+++ b/hw/arm/xlnx-zcu102.c
21
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_instance_init(Object *obj)
22
s->secure = false;
23
/* Default to virt (EL2) being disabled */
24
s->virt = false;
25
- object_property_add_link(obj, "xlnx-zcu102.canbus0", TYPE_CAN_BUS,
26
+ object_property_add_link(obj, "canbus0", TYPE_CAN_BUS,
27
(Object **)&s->canbus[0],
28
object_property_allow_set_link,
29
0);
30
31
- object_property_add_link(obj, "xlnx-zcu102.canbus1", TYPE_CAN_BUS,
32
+ object_property_add_link(obj, "canbus1", TYPE_CAN_BUS,
33
(Object **)&s->canbus[1],
34
object_property_allow_set_link,
35
0);
36
diff --git a/tests/qtest/xlnx-can-test.c b/tests/qtest/xlnx-can-test.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/tests/qtest/xlnx-can-test.c
39
+++ b/tests/qtest/xlnx-can-test.c
40
@@ -XXX,XX +XXX,XX @@ static void test_can_bus(void)
41
uint8_t can_timestamp = 1;
42
43
QTestState *qts = qtest_init("-machine xlnx-zcu102"
44
- " -object can-bus,id=canbus0"
45
- " -machine xlnx-zcu102.canbus0=canbus0"
46
- " -machine xlnx-zcu102.canbus1=canbus0"
47
+ " -object can-bus,id=canbus"
48
+ " -machine canbus0=canbus"
49
+ " -machine canbus1=canbus"
50
);
51
52
/* Configure the CAN0 and CAN1. */
53
@@ -XXX,XX +XXX,XX @@ static void test_can_loopback(void)
54
uint32_t status = 0;
55
56
QTestState *qts = qtest_init("-machine xlnx-zcu102"
57
- " -object can-bus,id=canbus0"
58
- " -machine xlnx-zcu102.canbus0=canbus0"
59
- " -machine xlnx-zcu102.canbus1=canbus0"
60
+ " -object can-bus,id=canbus"
61
+ " -machine canbus0=canbus"
62
+ " -machine canbus1=canbus"
63
);
64
65
/* Configure the CAN0 in loopback mode. */
66
@@ -XXX,XX +XXX,XX @@ static void test_can_filter(void)
67
uint8_t can_timestamp = 1;
68
69
QTestState *qts = qtest_init("-machine xlnx-zcu102"
70
- " -object can-bus,id=canbus0"
71
- " -machine xlnx-zcu102.canbus0=canbus0"
72
- " -machine xlnx-zcu102.canbus1=canbus0"
73
+ " -object can-bus,id=canbus"
74
+ " -machine canbus0=canbus"
75
+ " -machine canbus1=canbus"
76
);
77
78
/* Configure the CAN0 and CAN1. */
79
@@ -XXX,XX +XXX,XX @@ static void test_can_sleepmode(void)
80
uint8_t can_timestamp = 1;
81
82
QTestState *qts = qtest_init("-machine xlnx-zcu102"
83
- " -object can-bus,id=canbus0"
84
- " -machine xlnx-zcu102.canbus0=canbus0"
85
- " -machine xlnx-zcu102.canbus1=canbus0"
86
+ " -object can-bus,id=canbus"
87
+ " -machine canbus0=canbus"
88
+ " -machine canbus1=canbus"
89
);
90
91
/* Configure the CAN0. */
92
@@ -XXX,XX +XXX,XX @@ static void test_can_snoopmode(void)
93
uint8_t can_timestamp = 1;
94
95
QTestState *qts = qtest_init("-machine xlnx-zcu102"
96
- " -object can-bus,id=canbus0"
97
- " -machine xlnx-zcu102.canbus0=canbus0"
98
- " -machine xlnx-zcu102.canbus1=canbus0"
99
+ " -object can-bus,id=canbus"
100
+ " -machine canbus0=canbus"
101
+ " -machine canbus1=canbus"
102
);
103
104
/* Configure the CAN0. */
105
--
106
2.20.1
107
108
diff view generated by jsdifflib
Deleted patch
1
From: Hao Wu <wuhaotsh@google.com>
2
1
3
Fix potential overflow problem when calculating pwm_duty.
4
1. Ensure p->cmr and p->cnr to be from [0,65535], according to the
5
hardware specification.
6
2. Changed duty to uint32_t. However, since MAX_DUTY * (p->cmr+1)
7
can excceed UINT32_MAX, we convert them to uint64_t in computation
8
and converted them back to uint32_t.
9
(duty is guaranteed to be <= MAX_DUTY so it won't overflow.)
10
11
Fixes: CID 1442342
12
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Doug Evans <dje@google.com>
14
Signed-off-by: Hao Wu <wuhaotsh@google.com>
15
Message-id: 20210127011142.2122790-1-wuhaotsh@google.com
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
19
hw/misc/npcm7xx_pwm.c | 23 +++++++++++++++++++----
20
tests/qtest/npcm7xx_pwm-test.c | 4 ++--
21
2 files changed, 21 insertions(+), 6 deletions(-)
22
23
diff --git a/hw/misc/npcm7xx_pwm.c b/hw/misc/npcm7xx_pwm.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/misc/npcm7xx_pwm.c
26
+++ b/hw/misc/npcm7xx_pwm.c
27
@@ -XXX,XX +XXX,XX @@ REG32(NPCM7XX_PWM_PWDR3, 0x50);
28
#define NPCM7XX_CH_INV BIT(2)
29
#define NPCM7XX_CH_MOD BIT(3)
30
31
+#define NPCM7XX_MAX_CMR 65535
32
+#define NPCM7XX_MAX_CNR 65535
33
+
34
/* Offset of each PWM channel's prescaler in the PPR register. */
35
static const int npcm7xx_ppr_base[] = { 0, 0, 8, 8 };
36
/* Offset of each PWM channel's clock selector in the CSR register. */
37
@@ -XXX,XX +XXX,XX @@ static uint32_t npcm7xx_pwm_calculate_freq(NPCM7xxPWM *p)
38
39
static uint32_t npcm7xx_pwm_calculate_duty(NPCM7xxPWM *p)
40
{
41
- uint64_t duty;
42
+ uint32_t duty;
43
44
if (p->running) {
45
if (p->cnr == 0) {
46
@@ -XXX,XX +XXX,XX @@ static uint32_t npcm7xx_pwm_calculate_duty(NPCM7xxPWM *p)
47
} else if (p->cmr >= p->cnr) {
48
duty = NPCM7XX_PWM_MAX_DUTY;
49
} else {
50
- duty = NPCM7XX_PWM_MAX_DUTY * (p->cmr + 1) / (p->cnr + 1);
51
+ duty = (uint64_t)NPCM7XX_PWM_MAX_DUTY * (p->cmr + 1) / (p->cnr + 1);
52
}
53
} else {
54
duty = 0;
55
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_pwm_write(void *opaque, hwaddr offset,
56
case A_NPCM7XX_PWM_CNR2:
57
case A_NPCM7XX_PWM_CNR3:
58
p = &s->pwm[npcm7xx_cnr_index(offset)];
59
- p->cnr = value;
60
+ if (value > NPCM7XX_MAX_CNR) {
61
+ qemu_log_mask(LOG_GUEST_ERROR,
62
+ "%s: invalid cnr value: %u", __func__, value);
63
+ p->cnr = NPCM7XX_MAX_CNR;
64
+ } else {
65
+ p->cnr = value;
66
+ }
67
npcm7xx_pwm_update_output(p);
68
break;
69
70
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_pwm_write(void *opaque, hwaddr offset,
71
case A_NPCM7XX_PWM_CMR2:
72
case A_NPCM7XX_PWM_CMR3:
73
p = &s->pwm[npcm7xx_cmr_index(offset)];
74
- p->cmr = value;
75
+ if (value > NPCM7XX_MAX_CMR) {
76
+ qemu_log_mask(LOG_GUEST_ERROR,
77
+ "%s: invalid cmr value: %u", __func__, value);
78
+ p->cmr = NPCM7XX_MAX_CMR;
79
+ } else {
80
+ p->cmr = value;
81
+ }
82
npcm7xx_pwm_update_output(p);
83
break;
84
85
diff --git a/tests/qtest/npcm7xx_pwm-test.c b/tests/qtest/npcm7xx_pwm-test.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/tests/qtest/npcm7xx_pwm-test.c
88
+++ b/tests/qtest/npcm7xx_pwm-test.c
89
@@ -XXX,XX +XXX,XX @@ static uint64_t pwm_compute_freq(QTestState *qts, uint32_t ppr, uint32_t csr,
90
91
static uint64_t pwm_compute_duty(uint32_t cnr, uint32_t cmr, bool inverted)
92
{
93
- uint64_t duty;
94
+ uint32_t duty;
95
96
if (cnr == 0) {
97
/* PWM is stopped. */
98
@@ -XXX,XX +XXX,XX @@ static uint64_t pwm_compute_duty(uint32_t cnr, uint32_t cmr, bool inverted)
99
} else if (cmr >= cnr) {
100
duty = MAX_DUTY;
101
} else {
102
- duty = MAX_DUTY * (cmr + 1) / (cnr + 1);
103
+ duty = (uint64_t)MAX_DUTY * (cmr + 1) / (cnr + 1);
104
}
105
106
if (inverted) {
107
--
108
2.20.1
109
110
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
cpu_get_phys_page_debug() uses 'DATA LOAD' MMU access type.
4
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20210127232822.3530782-1-f4bug@amsat.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/helper.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
16
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
18
19
*attrs = (MemTxAttrs) {};
20
21
- ret = get_phys_addr(env, addr, 0, mmu_idx, &phys_addr,
22
+ ret = get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &phys_addr,
23
attrs, &prot, &page_size, &fi, &cacheattrs);
24
25
if (ret) {
26
--
27
2.20.1
28
29
diff view generated by jsdifflib
Deleted patch
1
Move the preadv availability check to meson.build. This is what we
2
want to be doing for host-OS-feature-checks anyway, but it also fixes
3
a problem with building for macOS with the most recent XCode SDK on a
4
Catalina host.
5
1
6
On that configuration, 'preadv()' is provided as a weak symbol, so
7
that programs can be built with optional support for it and make a
8
runtime availability check to see whether the preadv() they have is a
9
working one or one which they must not call because it will
10
runtime-assert. QEMU's configure test passes (unless you're building
11
with --enable-werror) because the test program using preadv()
12
compiles, but then QEMU crashes at runtime when preadv() is called,
13
with errors like:
14
15
dyld: lazy symbol binding failed: Symbol not found: _preadv
16
Referenced from: /Users/pm215/src/qemu/./build/x86/tests/test-replication
17
Expected in: /usr/lib/libSystem.B.dylib
18
19
dyld: Symbol not found: _preadv
20
Referenced from: /Users/pm215/src/qemu/./build/x86/tests/test-replication
21
Expected in: /usr/lib/libSystem.B.dylib
22
23
Meson's own function availability check has a special case for macOS
24
which adds '-Wl,-no_weak_imports' to the compiler flags, which forces
25
the test to require the real function, not the macOS-version-too-old
26
stub.
27
28
So this commit fixes the bug where macOS builds on Catalina currently
29
require --disable-werror.
30
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
33
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
34
Message-id: 20210126155846.17109-1-peter.maydell@linaro.org
35
---
36
configure | 16 ----------------
37
meson.build | 4 +++-
38
2 files changed, 3 insertions(+), 17 deletions(-)
39
40
diff --git a/configure b/configure
41
index XXXXXXX..XXXXXXX 100755
42
--- a/configure
43
+++ b/configure
44
@@ -XXX,XX +XXX,XX @@ if compile_prog "" "" ; then
45
iovec=yes
46
fi
47
48
-##########################################
49
-# preadv probe
50
-cat > $TMPC <<EOF
51
-#include <sys/types.h>
52
-#include <sys/uio.h>
53
-#include <unistd.h>
54
-int main(void) { return preadv(0, 0, 0, 0); }
55
-EOF
56
-preadv=no
57
-if compile_prog "" "" ; then
58
- preadv=yes
59
-fi
60
-
61
##########################################
62
# fdt probe
63
64
@@ -XXX,XX +XXX,XX @@ fi
65
if test "$iovec" = "yes" ; then
66
echo "CONFIG_IOVEC=y" >> $config_host_mak
67
fi
68
-if test "$preadv" = "yes" ; then
69
- echo "CONFIG_PREADV=y" >> $config_host_mak
70
-fi
71
if test "$membarrier" = "yes" ; then
72
echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
73
fi
74
diff --git a/meson.build b/meson.build
75
index XXXXXXX..XXXXXXX 100644
76
--- a/meson.build
77
+++ b/meson.build
78
@@ -XXX,XX +XXX,XX @@ config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
79
config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
80
config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
81
82
+config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
83
+
84
ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
85
arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
86
strings = ['HOST_DSOSUF', 'CONFIG_IASL']
87
@@ -XXX,XX +XXX,XX @@ summary_info += {'PIE': get_option('b_pie')}
88
summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
89
summary_info += {'malloc trim support': has_malloc_trim}
90
summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
91
-summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
92
+summary_info += {'preadv support': config_host_data.get('CONFIG_PREADV')}
93
summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
94
summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
95
summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
96
--
97
2.20.1
98
99
diff view generated by jsdifflib
Deleted patch
1
From: Joelle van Dyne <j@getutm.app>
2
1
3
The iOS toolchain does not use the host prefix naming convention. So we
4
need to enable cross-compile options while allowing the PREFIX to be
5
blank.
6
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Signed-off-by: Joelle van Dyne <j@getutm.app>
9
Message-id: 20210126012457.39046-3-j@getutm.app
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
configure | 6 ++++--
13
1 file changed, 4 insertions(+), 2 deletions(-)
14
15
diff --git a/configure b/configure
16
index XXXXXXX..XXXXXXX 100755
17
--- a/configure
18
+++ b/configure
19
@@ -XXX,XX +XXX,XX @@ cpu=""
20
iasl="iasl"
21
interp_prefix="/usr/gnemul/qemu-%M"
22
static="no"
23
+cross_compile="no"
24
cross_prefix=""
25
audio_drv_list=""
26
block_drv_rw_whitelist=""
27
@@ -XXX,XX +XXX,XX @@ for opt do
28
optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
29
case "$opt" in
30
--cross-prefix=*) cross_prefix="$optarg"
31
+ cross_compile="yes"
32
;;
33
--cc=*) CC="$optarg"
34
;;
35
@@ -XXX,XX +XXX,XX @@ $(echo Deprecated targets: $deprecated_targets_list | \
36
--target-list-exclude=LIST exclude a set of targets from the default target-list
37
38
Advanced options (experts only):
39
- --cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]
40
+ --cross-prefix=PREFIX use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
41
--cc=CC use C compiler CC [$cc]
42
--iasl=IASL use ACPI compiler IASL [$iasl]
43
--host-cc=CC use C compiler CC [$host_cc] for code run at
44
@@ -XXX,XX +XXX,XX @@ if has $sdl2_config; then
45
fi
46
echo "strip = [$(meson_quote $strip)]" >> $cross
47
echo "windres = [$(meson_quote $windres)]" >> $cross
48
-if test -n "$cross_prefix"; then
49
+if test "$cross_compile" = "yes"; then
50
cross_arg="--cross-file config-meson.cross"
51
echo "[host_machine]" >> $cross
52
if test "$mingw32" = "yes" ; then
53
--
54
2.20.1
55
56
diff view generated by jsdifflib
Deleted patch
1
From: Joelle van Dyne <j@getutm.app>
2
1
3
Build without error on hosts without a working system(). If system()
4
is called, return -1 with ENOSYS.
5
6
Signed-off-by: Joelle van Dyne <j@getutm.app>
7
Message-id: 20210126012457.39046-6-j@getutm.app
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
meson.build | 1 +
12
include/qemu/osdep.h | 12 ++++++++++++
13
2 files changed, 13 insertions(+)
14
15
diff --git a/meson.build b/meson.build
16
index XXXXXXX..XXXXXXX 100644
17
--- a/meson.build
18
+++ b/meson.build
19
@@ -XXX,XX +XXX,XX @@ config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
20
config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
21
config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
22
config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
23
+config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
24
25
config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
26
27
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
28
index XXXXXXX..XXXXXXX 100644
29
--- a/include/qemu/osdep.h
30
+++ b/include/qemu/osdep.h
31
@@ -XXX,XX +XXX,XX @@ static inline void qemu_thread_jit_write(void) {}
32
static inline void qemu_thread_jit_execute(void) {}
33
#endif
34
35
+/**
36
+ * Platforms which do not support system() return ENOSYS
37
+ */
38
+#ifndef HAVE_SYSTEM_FUNCTION
39
+#define system platform_does_not_support_system
40
+static inline int platform_does_not_support_system(const char *command)
41
+{
42
+ errno = ENOSYS;
43
+ return -1;
44
+}
45
+#endif /* !HAVE_SYSTEM_FUNCTION */
46
+
47
#endif
48
--
49
2.20.1
50
51
diff view generated by jsdifflib
Deleted patch
1
From: Joelle van Dyne <j@getutm.app>
2
1
3
Meson will find CoreFoundation, IOKit, and Cocoa as needed.
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Joelle van Dyne <j@getutm.app>
7
Message-id: 20210126012457.39046-7-j@getutm.app
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
configure | 1 -
11
1 file changed, 1 deletion(-)
12
13
diff --git a/configure b/configure
14
index XXXXXXX..XXXXXXX 100755
15
--- a/configure
16
+++ b/configure
17
@@ -XXX,XX +XXX,XX @@ Darwin)
18
fi
19
audio_drv_list="coreaudio try-sdl"
20
audio_possible_drivers="coreaudio sdl"
21
- QEMU_LDFLAGS="-framework CoreFoundation -framework IOKit $QEMU_LDFLAGS"
22
# Disable attempts to use ObjectiveC features in os/object.h since they
23
# won't work when we're compiling with gcc as a C compiler.
24
QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
25
--
26
2.20.1
27
28
diff view generated by jsdifflib
1
From: Joelle van Dyne <j@getutm.app>
1
In bcm2835_fb_mbox_push(), Coverity complains (CID 1429989) that we
2
pass a pointer to a local struct to another function without
3
initializing all its fields. This is a real bug:
4
bcm2835_fb_reconfigure() copies the whole of our new BCM2385FBConfig
5
struct into s->config, so any fields we don't initialize will corrupt
6
the state of the device.
2
7
3
Add objc to the Meson cross file as well as detection of Darwin.
8
Copy the two fields which we don't want to update (pixo and alpha)
9
from the existing config so we don't accidentally change them.
4
10
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Fixes: cfb7ba983857e40e88
6
Signed-off-by: Joelle van Dyne <j@getutm.app>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210126012457.39046-8-j@getutm.app
14
Message-id: 20200628195436.27582-1-peter.maydell@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
15
---
11
configure | 4 ++++
16
hw/display/bcm2835_fb.c | 4 ++++
12
1 file changed, 4 insertions(+)
17
1 file changed, 4 insertions(+)
13
18
14
diff --git a/configure b/configure
19
diff --git a/hw/display/bcm2835_fb.c b/hw/display/bcm2835_fb.c
15
index XXXXXXX..XXXXXXX 100755
20
index XXXXXXX..XXXXXXX 100644
16
--- a/configure
21
--- a/hw/display/bcm2835_fb.c
17
+++ b/configure
22
+++ b/hw/display/bcm2835_fb.c
18
@@ -XXX,XX +XXX,XX @@ echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
23
@@ -XXX,XX +XXX,XX @@ static void bcm2835_fb_mbox_push(BCM2835FBState *s, uint32_t value)
19
echo "[binaries]" >> $cross
24
newconf.base = s->vcram_base | (value & 0xc0000000);
20
echo "c = [$(meson_quote $cc)]" >> $cross
25
newconf.base += BCM2835_FB_OFFSET;
21
test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
26
22
+test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
27
+ /* Copy fields which we don't want to change from the existing config */
23
echo "ar = [$(meson_quote $ar)]" >> $cross
28
+ newconf.pixo = s->config.pixo;
24
echo "nm = [$(meson_quote $nm)]" >> $cross
29
+ newconf.alpha = s->config.alpha;
25
echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
30
+
26
@@ -XXX,XX +XXX,XX @@ if test "$cross_compile" = "yes"; then
31
bcm2835_fb_validate_config(&newconf);
27
if test "$linux" = "yes" ; then
32
28
echo "system = 'linux'" >> $cross
33
pitch = bcm2835_fb_get_pitch(&newconf);
29
fi
30
+ if test "$darwin" = "yes" ; then
31
+ echo "system = 'darwin'" >> $cross
32
+ fi
33
case "$ARCH" in
34
i386|x86_64)
35
echo "cpu_family = 'x86'" >> $cross
36
--
34
--
37
2.20.1
35
2.20.1
38
36
39
37
diff view generated by jsdifflib
Deleted patch
1
From: Joelle van Dyne <j@getutm.app>
2
1
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
4
Signed-off-by: Joelle van Dyne <j@getutm.app>
5
Message-id: 20210126012457.39046-9-j@getutm.app
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
configure | 5 ++++-
9
1 file changed, 4 insertions(+), 1 deletion(-)
10
11
diff --git a/configure b/configure
12
index XXXXXXX..XXXXXXX 100755
13
--- a/configure
14
+++ b/configure
15
@@ -XXX,XX +XXX,XX @@ if test "$cross_compile" = "yes"; then
16
echo "system = 'darwin'" >> $cross
17
fi
18
case "$ARCH" in
19
- i386|x86_64)
20
+ i386)
21
echo "cpu_family = 'x86'" >> $cross
22
;;
23
+ x86_64)
24
+ echo "cpu_family = 'x86_64'" >> $cross
25
+ ;;
26
ppc64le)
27
echo "cpu_family = 'ppc64'" >> $cross
28
;;
29
--
30
2.20.1
31
32
diff view generated by jsdifflib
Deleted patch
1
From: Joelle van Dyne <j@getutm.app>
2
1
3
On iOS there is no CoreAudio, so we should not assume Darwin always
4
has it.
5
6
Signed-off-by: Joelle van Dyne <j@getutm.app>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210126012457.39046-11-j@getutm.app
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
configure | 35 +++++++++++++++++++++++++++++++++--
12
1 file changed, 33 insertions(+), 2 deletions(-)
13
14
diff --git a/configure b/configure
15
index XXXXXXX..XXXXXXX 100755
16
--- a/configure
17
+++ b/configure
18
@@ -XXX,XX +XXX,XX @@ fdt="auto"
19
netmap="no"
20
sdl="auto"
21
sdl_image="auto"
22
+coreaudio="auto"
23
virtiofsd="auto"
24
virtfs="auto"
25
libudev="auto"
26
@@ -XXX,XX +XXX,XX @@ Darwin)
27
QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
28
QEMU_LDFLAGS="-arch x86_64 $QEMU_LDFLAGS"
29
fi
30
- audio_drv_list="coreaudio try-sdl"
31
+ audio_drv_list="try-coreaudio try-sdl"
32
audio_possible_drivers="coreaudio sdl"
33
# Disable attempts to use ObjectiveC features in os/object.h since they
34
# won't work when we're compiling with gcc as a C compiler.
35
@@ -XXX,XX +XXX,XX @@ EOF
36
fi
37
fi
38
39
+##########################################
40
+# detect CoreAudio
41
+if test "$coreaudio" != "no" ; then
42
+ coreaudio_libs="-framework CoreAudio"
43
+ cat > $TMPC << EOF
44
+#include <CoreAudio/CoreAudio.h>
45
+int main(void)
46
+{
47
+ return (int)AudioGetCurrentHostTime();
48
+}
49
+EOF
50
+ if compile_prog "" "$coreaudio_libs" ; then
51
+ coreaudio=yes
52
+ else
53
+ coreaudio=no
54
+ fi
55
+fi
56
+
57
##########################################
58
# Sound support libraries probe
59
60
@@ -XXX,XX +XXX,XX @@ for drv in $audio_drv_list; do
61
fi
62
;;
63
64
- coreaudio)
65
+ coreaudio | try-coreaudio)
66
+ if test "$coreaudio" = "no"; then
67
+ if test "$drv" = "try-coreaudio"; then
68
+ audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio//')
69
+ else
70
+ error_exit "$drv check failed" \
71
+ "Make sure to have the $drv is available."
72
+ fi
73
+ else
74
coreaudio_libs="-framework CoreAudio"
75
+ if test "$drv" = "try-coreaudio"; then
76
+ audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio/coreaudio/')
77
+ fi
78
+ fi
79
;;
80
81
dsound)
82
--
83
2.20.1
84
85
diff view generated by jsdifflib
Deleted patch
1
From: Joelle van Dyne <j@getutm.app>
2
1
3
A workaround added in early days of 64-bit OSX forced x86_64 if the
4
host machine had 64-bit support. This creates issues when cross-
5
compiling for ARM64. Additionally, the user can always use --cpu=* to
6
manually set the host CPU and therefore this workaround should be
7
removed.
8
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Joelle van Dyne <j@getutm.app>
11
Message-id: 20210126012457.39046-12-j@getutm.app
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
configure | 11 -----------
15
1 file changed, 11 deletions(-)
16
17
diff --git a/configure b/configure
18
index XXXXXXX..XXXXXXX 100755
19
--- a/configure
20
+++ b/configure
21
@@ -XXX,XX +XXX,XX @@ fi
22
# the correct CPU with the --cpu option.
23
case $targetos in
24
Darwin)
25
- # on Leopard most of the system is 32-bit, so we have to ask the kernel if we can
26
- # run 64-bit userspace code.
27
- # If the user didn't specify a CPU explicitly and the kernel says this is
28
- # 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code.
29
- if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
30
- cpu="x86_64"
31
- fi
32
HOST_DSOSUF=".dylib"
33
;;
34
SunOS)
35
@@ -XXX,XX +XXX,XX @@ OpenBSD)
36
Darwin)
37
bsd="yes"
38
darwin="yes"
39
- if [ "$cpu" = "x86_64" ] ; then
40
- QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
41
- QEMU_LDFLAGS="-arch x86_64 $QEMU_LDFLAGS"
42
- fi
43
audio_drv_list="try-coreaudio try-sdl"
44
audio_possible_drivers="coreaudio sdl"
45
# Disable attempts to use ObjectiveC features in os/object.h since they
46
--
47
2.20.1
48
49
diff view generated by jsdifflib
Deleted patch
1
Add a function for checking whether a clock has a source. This is
2
useful for devices which have input clocks that must be wired up by
3
the board as it allows them to fail in realize rather than ploughing
4
on with a zero-period clock.
5
1
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20210128114145.20536-3-peter.maydell@linaro.org
11
Message-id: 20210121190622.22000-3-peter.maydell@linaro.org
12
---
13
docs/devel/clocks.rst | 16 ++++++++++++++++
14
include/hw/clock.h | 15 +++++++++++++++
15
2 files changed, 31 insertions(+)
16
17
diff --git a/docs/devel/clocks.rst b/docs/devel/clocks.rst
18
index XXXXXXX..XXXXXXX 100644
19
--- a/docs/devel/clocks.rst
20
+++ b/docs/devel/clocks.rst
21
@@ -XXX,XX +XXX,XX @@ object during device instance init. For example:
22
/* set initial value to 10ns / 100MHz */
23
clock_set_ns(clk, 10);
24
25
+To enforce that the clock is wired up by the board code, you can
26
+call ``clock_has_source()`` in your device's realize method:
27
+
28
+.. code-block:: c
29
+
30
+ if (!clock_has_source(s->clk)) {
31
+ error_setg(errp, "MyDevice: clk input must be connected");
32
+ return;
33
+ }
34
+
35
+Note that this only checks that the clock has been wired up; it is
36
+still possible that the output clock connected to it is disabled
37
+or has not yet been configured, in which case the period will be
38
+zero. You should use the clock callback to find out when the clock
39
+period changes.
40
+
41
Fetching clock frequency/period
42
-------------------------------
43
44
diff --git a/include/hw/clock.h b/include/hw/clock.h
45
index XXXXXXX..XXXXXXX 100644
46
--- a/include/hw/clock.h
47
+++ b/include/hw/clock.h
48
@@ -XXX,XX +XXX,XX @@ void clock_clear_callback(Clock *clk);
49
*/
50
void clock_set_source(Clock *clk, Clock *src);
51
52
+/**
53
+ * clock_has_source:
54
+ * @clk: the clock
55
+ *
56
+ * Returns true if the clock has a source clock connected to it.
57
+ * This is useful for devices which have input clocks which must
58
+ * be connected by the board/SoC code which creates them. The
59
+ * device code can use this to check in its realize method that
60
+ * the clock has been connected.
61
+ */
62
+static inline bool clock_has_source(const Clock *clk)
63
+{
64
+ return clk->source != NULL;
65
+}
66
+
67
/**
68
* clock_set:
69
* @clk: the clock to initialize.
70
--
71
2.20.1
72
73
diff view generated by jsdifflib
1
The state struct for the CMSDK APB timer device doesn't follow our
1
The spitz board has been around a long time, and still has a fair number
2
usual naming convention of camelcase -- "CMSDK" and "APB" are both
2
of hard-coded tab characters in it. We're about to do some work on
3
acronyms, but "TIMER" is not so should not be all-uppercase.
3
this source file, so start out by expanding out the tabs.
4
Globally rename the struct to "CMSDKAPBTimer" (bringing it into line
4
5
with CMSDKAPBWatchdog and CMSDKAPBDualTimer; CMSDKAPBUART remains
5
This commit is a pure whitespace only change.
6
as-is because "UART" is an acronym).
7
8
Commit created with:
9
perl -p -i -e 's/CMSDKAPBTIMER/CMSDKAPBTimer/g' hw/timer/cmsdk-apb-timer.c include/hw/arm/armsse.h include/hw/timer/cmsdk-apb-timer.h
10
6
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Luc Michel <luc@lmichel.fr>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20200628142429.17111-2-peter.maydell@linaro.org
15
Message-id: 20210128114145.20536-7-peter.maydell@linaro.org
16
Message-id: 20210121190622.22000-7-peter.maydell@linaro.org
17
---
11
---
18
include/hw/arm/armsse.h | 6 +++---
12
hw/arm/spitz.c | 156 ++++++++++++++++++++++++-------------------------
19
include/hw/timer/cmsdk-apb-timer.h | 4 ++--
13
1 file changed, 78 insertions(+), 78 deletions(-)
20
hw/timer/cmsdk-apb-timer.c | 28 ++++++++++++++--------------
14
21
3 files changed, 19 insertions(+), 19 deletions(-)
15
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
22
23
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
24
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/arm/armsse.h
17
--- a/hw/arm/spitz.c
26
+++ b/include/hw/arm/armsse.h
18
+++ b/hw/arm/spitz.c
27
@@ -XXX,XX +XXX,XX @@ struct ARMSSE {
28
TZPPC apb_ppc0;
29
TZPPC apb_ppc1;
30
TZMPC mpc[IOTS_NUM_MPC];
31
- CMSDKAPBTIMER timer0;
32
- CMSDKAPBTIMER timer1;
33
- CMSDKAPBTIMER s32ktimer;
34
+ CMSDKAPBTimer timer0;
35
+ CMSDKAPBTimer timer1;
36
+ CMSDKAPBTimer s32ktimer;
37
qemu_or_irq ppc_irq_orgate;
38
SplitIRQ sec_resp_splitter;
39
SplitIRQ ppc_irq_splitter[NUM_PPCS];
40
diff --git a/include/hw/timer/cmsdk-apb-timer.h b/include/hw/timer/cmsdk-apb-timer.h
41
index XXXXXXX..XXXXXXX 100644
42
--- a/include/hw/timer/cmsdk-apb-timer.h
43
+++ b/include/hw/timer/cmsdk-apb-timer.h
44
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
45
#include "qom/object.h"
20
#include "cpu.h"
46
21
47
#define TYPE_CMSDK_APB_TIMER "cmsdk-apb-timer"
22
#undef REG_FMT
48
-OBJECT_DECLARE_SIMPLE_TYPE(CMSDKAPBTIMER, CMSDK_APB_TIMER)
23
-#define REG_FMT            "0x%02lx"
49
+OBJECT_DECLARE_SIMPLE_TYPE(CMSDKAPBTimer, CMSDK_APB_TIMER)
24
+#define REG_FMT "0x%02lx"
50
25
51
-struct CMSDKAPBTIMER {
26
/* Spitz Flash */
52
+struct CMSDKAPBTimer {
27
-#define FLASH_BASE        0x0c000000
53
/*< private >*/
28
-#define FLASH_ECCLPLB        0x00    /* Line parity 7 - 0 bit */
54
SysBusDevice parent_obj;
29
-#define FLASH_ECCLPUB        0x04    /* Line parity 15 - 8 bit */
55
30
-#define FLASH_ECCCP        0x08    /* Column parity 5 - 0 bit */
56
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
31
-#define FLASH_ECCCNTR        0x0c    /* ECC byte counter */
57
index XXXXXXX..XXXXXXX 100644
32
-#define FLASH_ECCCLRR        0x10    /* Clear ECC */
58
--- a/hw/timer/cmsdk-apb-timer.c
33
-#define FLASH_FLASHIO        0x14    /* Flash I/O */
59
+++ b/hw/timer/cmsdk-apb-timer.c
34
-#define FLASH_FLASHCTL        0x18    /* Flash Control */
60
@@ -XXX,XX +XXX,XX @@ static const int timer_id[] = {
35
+#define FLASH_BASE 0x0c000000
61
0x0d, 0xf0, 0x05, 0xb1, /* CID0..CID3 */
36
+#define FLASH_ECCLPLB 0x00 /* Line parity 7 - 0 bit */
37
+#define FLASH_ECCLPUB 0x04 /* Line parity 15 - 8 bit */
38
+#define FLASH_ECCCP 0x08 /* Column parity 5 - 0 bit */
39
+#define FLASH_ECCCNTR 0x0c /* ECC byte counter */
40
+#define FLASH_ECCCLRR 0x10 /* Clear ECC */
41
+#define FLASH_FLASHIO 0x14 /* Flash I/O */
42
+#define FLASH_FLASHCTL 0x18 /* Flash Control */
43
44
-#define FLASHCTL_CE0        (1 << 0)
45
-#define FLASHCTL_CLE        (1 << 1)
46
-#define FLASHCTL_ALE        (1 << 2)
47
-#define FLASHCTL_WP        (1 << 3)
48
-#define FLASHCTL_CE1        (1 << 4)
49
-#define FLASHCTL_RYBY        (1 << 5)
50
-#define FLASHCTL_NCE        (FLASHCTL_CE0 | FLASHCTL_CE1)
51
+#define FLASHCTL_CE0 (1 << 0)
52
+#define FLASHCTL_CLE (1 << 1)
53
+#define FLASHCTL_ALE (1 << 2)
54
+#define FLASHCTL_WP (1 << 3)
55
+#define FLASHCTL_CE1 (1 << 4)
56
+#define FLASHCTL_RYBY (1 << 5)
57
+#define FLASHCTL_NCE (FLASHCTL_CE0 | FLASHCTL_CE1)
58
59
#define TYPE_SL_NAND "sl-nand"
60
#define SL_NAND(obj) OBJECT_CHECK(SLNANDState, (obj), TYPE_SL_NAND)
61
@@ -XXX,XX +XXX,XX @@ static uint64_t sl_read(void *opaque, hwaddr addr, unsigned size)
62
int ryby;
63
64
switch (addr) {
65
-#define BSHR(byte, from, to)    ((s->ecc.lp[byte] >> (from - to)) & (1 << to))
66
+#define BSHR(byte, from, to) ((s->ecc.lp[byte] >> (from - to)) & (1 << to))
67
case FLASH_ECCLPLB:
68
return BSHR(0, 4, 0) | BSHR(0, 5, 2) | BSHR(0, 6, 4) | BSHR(0, 7, 6) |
69
BSHR(1, 4, 1) | BSHR(1, 5, 3) | BSHR(1, 6, 5) | BSHR(1, 7, 7);
70
71
-#define BSHL(byte, from, to)    ((s->ecc.lp[byte] << (to - from)) & (1 << to))
72
+#define BSHL(byte, from, to) ((s->ecc.lp[byte] << (to - from)) & (1 << to))
73
case FLASH_ECCLPUB:
74
return BSHL(0, 0, 0) | BSHL(0, 1, 2) | BSHL(0, 2, 4) | BSHL(0, 3, 6) |
75
BSHL(1, 0, 1) | BSHL(1, 1, 3) | BSHL(1, 2, 5) | BSHL(1, 3, 7);
76
@@ -XXX,XX +XXX,XX @@ static void sl_nand_realize(DeviceState *dev, Error **errp)
77
78
/* Spitz Keyboard */
79
80
-#define SPITZ_KEY_STROBE_NUM    11
81
-#define SPITZ_KEY_SENSE_NUM    7
82
+#define SPITZ_KEY_STROBE_NUM 11
83
+#define SPITZ_KEY_SENSE_NUM 7
84
85
static const int spitz_gpio_key_sense[SPITZ_KEY_SENSE_NUM] = {
86
12, 17, 91, 34, 36, 38, 39
87
@@ -XXX,XX +XXX,XX @@ static int spitz_keymap[SPITZ_KEY_SENSE_NUM + 1][SPITZ_KEY_STROBE_NUM] = {
88
{ 0x52, 0x43, 0x01, 0x47, 0x49, -1 , -1 , -1 , -1 , -1 , -1 },
62
};
89
};
63
90
64
-static void cmsdk_apb_timer_update(CMSDKAPBTIMER *s)
91
-#define SPITZ_GPIO_AK_INT    13    /* Remote control */
65
+static void cmsdk_apb_timer_update(CMSDKAPBTimer *s)
92
-#define SPITZ_GPIO_SYNC        16    /* Sync button */
93
-#define SPITZ_GPIO_ON_KEY    95    /* Power button */
94
-#define SPITZ_GPIO_SWA        97    /* Lid */
95
-#define SPITZ_GPIO_SWB        96    /* Tablet mode */
96
+#define SPITZ_GPIO_AK_INT 13 /* Remote control */
97
+#define SPITZ_GPIO_SYNC 16 /* Sync button */
98
+#define SPITZ_GPIO_ON_KEY 95 /* Power button */
99
+#define SPITZ_GPIO_SWA 97 /* Lid */
100
+#define SPITZ_GPIO_SWB 96 /* Tablet mode */
101
102
/* The special buttons are mapped to unused keys */
103
static const int spitz_gpiomap[5] = {
104
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_keydown(SpitzKeyboardState *s, int keycode)
105
#define SPITZ_MOD_CTRL (1 << 8)
106
#define SPITZ_MOD_FN (1 << 9)
107
108
-#define QUEUE_KEY(c)    s->fifo[(s->fifopos + s->fifolen ++) & 0xf] = c
109
+#define QUEUE_KEY(c) s->fifo[(s->fifopos + s->fifolen ++) & 0xf] = c
110
111
static void spitz_keyboard_handler(void *opaque, int keycode)
66
{
112
{
67
qemu_set_irq(s->timerint, !!(s->intstatus & R_INTSTATUS_IRQ_MASK));
113
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_handler(void *opaque, int keycode)
114
uint16_t code;
115
int mapcode;
116
switch (keycode) {
117
- case 0x2a:    /* Left Shift */
118
+ case 0x2a: /* Left Shift */
119
s->modifiers |= 1;
120
break;
121
case 0xaa:
122
s->modifiers &= ~1;
123
break;
124
- case 0x36:    /* Right Shift */
125
+ case 0x36: /* Right Shift */
126
s->modifiers |= 2;
127
break;
128
case 0xb6:
129
s->modifiers &= ~2;
130
break;
131
- case 0x1d:    /* Control */
132
+ case 0x1d: /* Control */
133
s->modifiers |= 4;
134
break;
135
case 0x9d:
136
s->modifiers &= ~4;
137
break;
138
- case 0x38:    /* Alt */
139
+ case 0x38: /* Alt */
140
s->modifiers |= 8;
141
break;
142
case 0xb8:
143
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_realize(DeviceState *dev, Error **errp)
144
145
/* LCD backlight controller */
146
147
-#define LCDTG_RESCTL    0x00
148
-#define LCDTG_PHACTRL    0x01
149
-#define LCDTG_DUTYCTRL    0x02
150
-#define LCDTG_POWERREG0    0x03
151
-#define LCDTG_POWERREG1    0x04
152
-#define LCDTG_GPOR3    0x05
153
-#define LCDTG_PICTRL    0x06
154
-#define LCDTG_POLCTRL    0x07
155
+#define LCDTG_RESCTL 0x00
156
+#define LCDTG_PHACTRL 0x01
157
+#define LCDTG_DUTYCTRL 0x02
158
+#define LCDTG_POWERREG0 0x03
159
+#define LCDTG_POWERREG1 0x04
160
+#define LCDTG_GPOR3 0x05
161
+#define LCDTG_PICTRL 0x06
162
+#define LCDTG_POLCTRL 0x07
163
164
typedef struct {
165
SSISlave ssidev;
166
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_realize(SSISlave *dev, Error **errp)
167
168
/* SSP devices */
169
170
-#define CORGI_SSP_PORT        2
171
+#define CORGI_SSP_PORT 2
172
173
-#define SPITZ_GPIO_LCDCON_CS    53
174
-#define SPITZ_GPIO_ADS7846_CS    14
175
-#define SPITZ_GPIO_MAX1111_CS    20
176
-#define SPITZ_GPIO_TP_INT    11
177
+#define SPITZ_GPIO_LCDCON_CS 53
178
+#define SPITZ_GPIO_ADS7846_CS 14
179
+#define SPITZ_GPIO_MAX1111_CS 20
180
+#define SPITZ_GPIO_TP_INT 11
181
182
static DeviceState *max1111;
183
184
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
185
s->enable[line] = !level;
68
}
186
}
69
187
70
static uint64_t cmsdk_apb_timer_read(void *opaque, hwaddr offset, unsigned size)
188
-#define MAX1111_BATT_VOLT    1
189
-#define MAX1111_BATT_TEMP    2
190
-#define MAX1111_ACIN_VOLT    3
191
+#define MAX1111_BATT_VOLT 1
192
+#define MAX1111_BATT_TEMP 2
193
+#define MAX1111_ACIN_VOLT 3
194
195
-#define SPITZ_BATTERY_TEMP    0xe0    /* About 2.9V */
196
-#define SPITZ_BATTERY_VOLT    0xd0    /* About 4.0V */
197
-#define SPITZ_CHARGEON_ACIN    0x80    /* About 5.0V */
198
+#define SPITZ_BATTERY_TEMP 0xe0 /* About 2.9V */
199
+#define SPITZ_BATTERY_VOLT 0xd0 /* About 4.0V */
200
+#define SPITZ_CHARGEON_ACIN 0x80 /* About 5.0V */
201
202
static void spitz_adc_temp_on(void *opaque, int line, int level)
71
{
203
{
72
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(opaque);
204
@@ -XXX,XX +XXX,XX @@ static void spitz_microdrive_attach(PXA2xxState *cpu, int slot)
73
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(opaque);
205
74
uint64_t r;
206
/* Wm8750 and Max7310 on I2C */
75
207
76
switch (offset) {
208
-#define AKITA_MAX_ADDR    0x18
77
@@ -XXX,XX +XXX,XX @@ static uint64_t cmsdk_apb_timer_read(void *opaque, hwaddr offset, unsigned size)
209
-#define SPITZ_WM_ADDRL    0x1b
78
static void cmsdk_apb_timer_write(void *opaque, hwaddr offset, uint64_t value,
210
-#define SPITZ_WM_ADDRH    0x1a
79
unsigned size)
211
+#define AKITA_MAX_ADDR 0x18
212
+#define SPITZ_WM_ADDRL 0x1b
213
+#define SPITZ_WM_ADDRH 0x1a
214
215
-#define SPITZ_GPIO_WM    5
216
+#define SPITZ_GPIO_WM 5
217
218
static void spitz_wm8750_addr(void *opaque, int line, int level)
80
{
219
{
81
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(opaque);
220
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
82
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(opaque);
83
84
trace_cmsdk_apb_timer_write(offset, value, size);
85
86
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps cmsdk_apb_timer_ops = {
87
88
static void cmsdk_apb_timer_tick(void *opaque)
89
{
90
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(opaque);
91
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(opaque);
92
93
if (s->ctrl & R_CTRL_IRQEN_MASK) {
94
s->intstatus |= R_INTSTATUS_IRQ_MASK;
95
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_tick(void *opaque)
96
97
static void cmsdk_apb_timer_reset(DeviceState *dev)
98
{
99
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(dev);
100
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(dev);
101
102
trace_cmsdk_apb_timer_reset();
103
s->ctrl = 0;
104
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_reset(DeviceState *dev)
105
static void cmsdk_apb_timer_init(Object *obj)
106
{
107
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
108
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(obj);
109
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(obj);
110
111
memory_region_init_io(&s->iomem, obj, &cmsdk_apb_timer_ops,
112
s, "cmsdk-apb-timer", 0x1000);
113
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_init(Object *obj)
114
115
static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
116
{
117
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(dev);
118
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(dev);
119
120
if (s->pclk_frq == 0) {
121
error_setg(errp, "CMSDK APB timer: pclk-frq property must be set");
122
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_apb_timer_vmstate = {
123
.version_id = 1,
124
.minimum_version_id = 1,
125
.fields = (VMStateField[]) {
126
- VMSTATE_PTIMER(timer, CMSDKAPBTIMER),
127
- VMSTATE_UINT32(ctrl, CMSDKAPBTIMER),
128
- VMSTATE_UINT32(value, CMSDKAPBTIMER),
129
- VMSTATE_UINT32(reload, CMSDKAPBTIMER),
130
- VMSTATE_UINT32(intstatus, CMSDKAPBTIMER),
131
+ VMSTATE_PTIMER(timer, CMSDKAPBTimer),
132
+ VMSTATE_UINT32(ctrl, CMSDKAPBTimer),
133
+ VMSTATE_UINT32(value, CMSDKAPBTimer),
134
+ VMSTATE_UINT32(reload, CMSDKAPBTimer),
135
+ VMSTATE_UINT32(intstatus, CMSDKAPBTimer),
136
VMSTATE_END_OF_LIST()
137
}
221
}
138
};
222
}
139
223
140
static Property cmsdk_apb_timer_properties[] = {
224
-#define SPITZ_SCP_LED_GREEN        1
141
- DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBTIMER, pclk_frq, 0),
225
-#define SPITZ_SCP_JK_B            2
142
+ DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBTimer, pclk_frq, 0),
226
-#define SPITZ_SCP_CHRG_ON        3
143
DEFINE_PROP_END_OF_LIST(),
227
-#define SPITZ_SCP_MUTE_L        4
144
};
228
-#define SPITZ_SCP_MUTE_R        5
145
229
-#define SPITZ_SCP_CF_POWER        6
146
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_class_init(ObjectClass *klass, void *data)
230
-#define SPITZ_SCP_LED_ORANGE        7
147
static const TypeInfo cmsdk_apb_timer_info = {
231
-#define SPITZ_SCP_JK_A            8
148
.name = TYPE_CMSDK_APB_TIMER,
232
-#define SPITZ_SCP_ADC_TEMP_ON        9
149
.parent = TYPE_SYS_BUS_DEVICE,
233
-#define SPITZ_SCP2_IR_ON        1
150
- .instance_size = sizeof(CMSDKAPBTIMER),
234
-#define SPITZ_SCP2_AKIN_PULLUP        2
151
+ .instance_size = sizeof(CMSDKAPBTimer),
235
-#define SPITZ_SCP2_BACKLIGHT_CONT    7
152
.instance_init = cmsdk_apb_timer_init,
236
-#define SPITZ_SCP2_BACKLIGHT_ON        8
153
.class_init = cmsdk_apb_timer_class_init,
237
-#define SPITZ_SCP2_MIC_BIAS        9
154
};
238
+#define SPITZ_SCP_LED_GREEN 1
239
+#define SPITZ_SCP_JK_B 2
240
+#define SPITZ_SCP_CHRG_ON 3
241
+#define SPITZ_SCP_MUTE_L 4
242
+#define SPITZ_SCP_MUTE_R 5
243
+#define SPITZ_SCP_CF_POWER 6
244
+#define SPITZ_SCP_LED_ORANGE 7
245
+#define SPITZ_SCP_JK_A 8
246
+#define SPITZ_SCP_ADC_TEMP_ON 9
247
+#define SPITZ_SCP2_IR_ON 1
248
+#define SPITZ_SCP2_AKIN_PULLUP 2
249
+#define SPITZ_SCP2_BACKLIGHT_CONT 7
250
+#define SPITZ_SCP2_BACKLIGHT_ON 8
251
+#define SPITZ_SCP2_MIC_BIAS 9
252
253
static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
254
DeviceState *scp0, DeviceState *scp1)
255
@@ -XXX,XX +XXX,XX @@ static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
256
qdev_connect_gpio_out(scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
257
}
258
259
-#define SPITZ_GPIO_HSYNC        22
260
-#define SPITZ_GPIO_SD_DETECT        9
261
-#define SPITZ_GPIO_SD_WP        81
262
-#define SPITZ_GPIO_ON_RESET        89
263
-#define SPITZ_GPIO_BAT_COVER        90
264
-#define SPITZ_GPIO_CF1_IRQ        105
265
-#define SPITZ_GPIO_CF1_CD        94
266
-#define SPITZ_GPIO_CF2_IRQ        106
267
-#define SPITZ_GPIO_CF2_CD        93
268
+#define SPITZ_GPIO_HSYNC 22
269
+#define SPITZ_GPIO_SD_DETECT 9
270
+#define SPITZ_GPIO_SD_WP 81
271
+#define SPITZ_GPIO_ON_RESET 89
272
+#define SPITZ_GPIO_BAT_COVER 90
273
+#define SPITZ_GPIO_CF1_IRQ 105
274
+#define SPITZ_GPIO_CF1_CD 94
275
+#define SPITZ_GPIO_CF2_IRQ 106
276
+#define SPITZ_GPIO_CF2_CD 93
277
278
static int spitz_hsync;
279
280
@@ -XXX,XX +XXX,XX @@ static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
281
/* Board init. */
282
enum spitz_model_e { spitz, akita, borzoi, terrier };
283
284
-#define SPITZ_RAM    0x04000000
285
-#define SPITZ_ROM    0x00800000
286
+#define SPITZ_RAM 0x04000000
287
+#define SPITZ_ROM 0x00800000
288
289
static struct arm_boot_info spitz_binfo = {
290
.loader_start = PXA2XX_SDRAM_BASE,
155
--
291
--
156
2.20.1
292
2.20.1
157
293
158
294
diff view generated by jsdifflib
1
The old-style convenience function cmsdk_apb_timer_create() for
1
For the four Spitz-family machines (akita, borzoi, spitz, terrier)
2
creating CMSDK_APB_TIMER objects is used in only two places in
2
create a proper abstract class SpitzMachineClass which encapsulates
3
mps2.c. Most of the rest of the code in that file uses the new
3
the common behaviour, rather than having them all derive directly
4
"initialize in place" coding style.
4
from TYPE_MACHINE:
5
5
* instead of each machine class setting mc->init to a wrapper
6
We want to connect up a Clock object which should be done between the
6
function which calls spitz_common_init() with parameters,
7
object creation and realization; rather than adding a Clock* argument
7
put that data in the SpitzMachineClass and make spitz_common_init
8
to the convenience function, convert the timer creation code in
8
the SpitzMachineClass machine-init function
9
mps2.c to the same style as is used already for the watchdog,
9
* move the settings of mc->block_default_type and
10
dualtimer and other devices, and delete the now-unused convenience
10
mc->ignore_memory_transaction_failures into the SpitzMachineClass
11
function.
11
class init rather than repeating them in each machine's class init
12
13
(The motivation is that we're going to want to keep some state in
14
the SpitzMachineState so we can connect GPIOs between devices created
15
in one sub-function of the machine init to devices created in a
16
different sub-function.)
12
17
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Reviewed-by: Luc Michel <luc@lmichel.fr>
20
Message-id: 20200628142429.17111-3-peter.maydell@linaro.org
16
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20210128114145.20536-13-peter.maydell@linaro.org
18
Message-id: 20210121190622.22000-13-peter.maydell@linaro.org
19
---
21
---
20
include/hw/timer/cmsdk-apb-timer.h | 21 ---------------------
22
hw/arm/spitz.c | 91 ++++++++++++++++++++++++++++++--------------------
21
hw/arm/mps2.c | 18 ++++++++++++++++--
23
1 file changed, 55 insertions(+), 36 deletions(-)
22
2 files changed, 16 insertions(+), 23 deletions(-)
24
23
25
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
24
diff --git a/include/hw/timer/cmsdk-apb-timer.h b/include/hw/timer/cmsdk-apb-timer.h
25
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/timer/cmsdk-apb-timer.h
27
--- a/hw/arm/spitz.c
27
+++ b/include/hw/timer/cmsdk-apb-timer.h
28
+++ b/hw/arm/spitz.c
28
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBTimer {
29
@@ -XXX,XX +XXX,XX @@
29
uint32_t intstatus;
30
#include "exec/address-spaces.h"
30
};
31
#include "cpu.h"
31
32
32
-/**
33
+enum spitz_model_e { spitz, akita, borzoi, terrier };
33
- * cmsdk_apb_timer_create - convenience function to create TYPE_CMSDK_APB_TIMER
34
+
34
- * @addr: location in system memory to map registers
35
+typedef struct {
35
- * @pclk_frq: frequency in Hz of the PCLK clock (used for calculating baud rate)
36
+ MachineClass parent;
36
- */
37
+ enum spitz_model_e model;
37
-static inline DeviceState *cmsdk_apb_timer_create(hwaddr addr,
38
+ int arm_id;
38
- qemu_irq timerint,
39
+} SpitzMachineClass;
39
- uint32_t pclk_frq)
40
+
41
+typedef struct {
42
+ MachineState parent;
43
+} SpitzMachineState;
44
+
45
+#define TYPE_SPITZ_MACHINE "spitz-common"
46
+#define SPITZ_MACHINE(obj) \
47
+ OBJECT_CHECK(SpitzMachineState, obj, TYPE_SPITZ_MACHINE)
48
+#define SPITZ_MACHINE_GET_CLASS(obj) \
49
+ OBJECT_GET_CLASS(SpitzMachineClass, obj, TYPE_SPITZ_MACHINE)
50
+#define SPITZ_MACHINE_CLASS(klass) \
51
+ OBJECT_CLASS_CHECK(SpitzMachineClass, klass, TYPE_SPITZ_MACHINE)
52
+
53
#undef REG_FMT
54
#define REG_FMT "0x%02lx"
55
56
@@ -XXX,XX +XXX,XX @@ static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
57
}
58
59
/* Board init. */
60
-enum spitz_model_e { spitz, akita, borzoi, terrier };
61
-
62
#define SPITZ_RAM 0x04000000
63
#define SPITZ_ROM 0x00800000
64
65
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info spitz_binfo = {
66
.ram_size = 0x04000000,
67
};
68
69
-static void spitz_common_init(MachineState *machine,
70
- enum spitz_model_e model, int arm_id)
71
+static void spitz_common_init(MachineState *machine)
72
{
73
+ SpitzMachineClass *smc = SPITZ_MACHINE_GET_CLASS(machine);
74
+ enum spitz_model_e model = smc->model;
75
PXA2xxState *mpu;
76
DeviceState *scp0, *scp1 = NULL;
77
MemoryRegion *address_space_mem = get_system_memory();
78
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine,
79
/* A 4.0 GB microdrive is permanently sitting in CF slot 0. */
80
spitz_microdrive_attach(mpu, 0);
81
82
- spitz_binfo.board_id = arm_id;
83
+ spitz_binfo.board_id = smc->arm_id;
84
arm_load_kernel(mpu->cpu, machine, &spitz_binfo);
85
sl_bootparam_write(SL_PXA_PARAM_BASE);
86
}
87
88
-static void spitz_init(MachineState *machine)
89
+static void spitz_common_class_init(ObjectClass *oc, void *data)
90
{
91
- spitz_common_init(machine, spitz, 0x2c9);
92
+ MachineClass *mc = MACHINE_CLASS(oc);
93
+
94
+ mc->block_default_type = IF_IDE;
95
+ mc->ignore_memory_transaction_failures = true;
96
+ mc->init = spitz_common_init;
97
}
98
99
-static void borzoi_init(MachineState *machine)
40
-{
100
-{
41
- DeviceState *dev;
101
- spitz_common_init(machine, borzoi, 0x33f);
42
- SysBusDevice *s;
43
-
44
- dev = qdev_new(TYPE_CMSDK_APB_TIMER);
45
- s = SYS_BUS_DEVICE(dev);
46
- qdev_prop_set_uint32(dev, "pclk-frq", pclk_frq);
47
- sysbus_realize_and_unref(s, &error_fatal);
48
- sysbus_mmio_map(s, 0, addr);
49
- sysbus_connect_irq(s, 0, timerint);
50
- return dev;
51
-}
102
-}
52
-
103
-
53
#endif
104
-static void akita_init(MachineState *machine)
54
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
105
-{
55
index XXXXXXX..XXXXXXX 100644
106
- spitz_common_init(machine, akita, 0x2e8);
56
--- a/hw/arm/mps2.c
107
-}
57
+++ b/hw/arm/mps2.c
108
-
58
@@ -XXX,XX +XXX,XX @@ struct MPS2MachineState {
109
-static void terrier_init(MachineState *machine)
59
/* CMSDK APB subsystem */
110
-{
60
CMSDKAPBDualTimer dualtimer;
111
- spitz_common_init(machine, terrier, 0x33f);
61
CMSDKAPBWatchdog watchdog;
112
-}
62
+ CMSDKAPBTimer timer[2];
113
+static const TypeInfo spitz_common_info = {
63
};
114
+ .name = TYPE_SPITZ_MACHINE,
64
115
+ .parent = TYPE_MACHINE,
65
#define TYPE_MPS2_MACHINE "mps2"
116
+ .abstract = true,
66
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
117
+ .instance_size = sizeof(SpitzMachineState),
67
}
118
+ .class_size = sizeof(SpitzMachineClass),
68
119
+ .class_init = spitz_common_class_init,
69
/* CMSDK APB subsystem */
120
+};
70
- cmsdk_apb_timer_create(0x40000000, qdev_get_gpio_in(armv7m, 8), SYSCLK_FRQ);
121
71
- cmsdk_apb_timer_create(0x40001000, qdev_get_gpio_in(armv7m, 9), SYSCLK_FRQ);
122
static void akitapda_class_init(ObjectClass *oc, void *data)
72
+ for (i = 0; i < ARRAY_SIZE(mms->timer); i++) {
123
{
73
+ g_autofree char *name = g_strdup_printf("timer%d", i);
124
MachineClass *mc = MACHINE_CLASS(oc);
74
+ hwaddr base = 0x40000000 + i * 0x1000;
125
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
75
+ int irqno = 8 + i;
126
76
+ SysBusDevice *sbd;
127
mc->desc = "Sharp SL-C1000 (Akita) PDA (PXA270)";
77
+
128
- mc->init = akita_init;
78
+ object_initialize_child(OBJECT(mms), name, &mms->timer[i],
129
- mc->ignore_memory_transaction_failures = true;
79
+ TYPE_CMSDK_APB_TIMER);
130
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
80
+ sbd = SYS_BUS_DEVICE(&mms->timer[i]);
131
+ smc->model = akita;
81
+ qdev_prop_set_uint32(DEVICE(&mms->timer[i]), "pclk-frq", SYSCLK_FRQ);
132
+ smc->arm_id = 0x2e8;
82
+ sysbus_realize_and_unref(sbd, &error_fatal);
133
}
83
+ sysbus_mmio_map(sbd, 0, base);
134
84
+ sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(armv7m, irqno));
135
static const TypeInfo akitapda_type = {
85
+ }
136
.name = MACHINE_TYPE_NAME("akita"),
86
+
137
- .parent = TYPE_MACHINE,
87
object_initialize_child(OBJECT(mms), "dualtimer", &mms->dualtimer,
138
+ .parent = TYPE_SPITZ_MACHINE,
88
TYPE_CMSDK_APB_DUALTIMER);
139
.class_init = akitapda_class_init,
89
qdev_prop_set_uint32(DEVICE(&mms->dualtimer), "pclk-frq", SYSCLK_FRQ);
140
};
141
142
static void spitzpda_class_init(ObjectClass *oc, void *data)
143
{
144
MachineClass *mc = MACHINE_CLASS(oc);
145
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
146
147
mc->desc = "Sharp SL-C3000 (Spitz) PDA (PXA270)";
148
- mc->init = spitz_init;
149
- mc->block_default_type = IF_IDE;
150
- mc->ignore_memory_transaction_failures = true;
151
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
152
+ smc->model = spitz;
153
+ smc->arm_id = 0x2c9;
154
}
155
156
static const TypeInfo spitzpda_type = {
157
.name = MACHINE_TYPE_NAME("spitz"),
158
- .parent = TYPE_MACHINE,
159
+ .parent = TYPE_SPITZ_MACHINE,
160
.class_init = spitzpda_class_init,
161
};
162
163
static void borzoipda_class_init(ObjectClass *oc, void *data)
164
{
165
MachineClass *mc = MACHINE_CLASS(oc);
166
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
167
168
mc->desc = "Sharp SL-C3100 (Borzoi) PDA (PXA270)";
169
- mc->init = borzoi_init;
170
- mc->block_default_type = IF_IDE;
171
- mc->ignore_memory_transaction_failures = true;
172
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
173
+ smc->model = borzoi;
174
+ smc->arm_id = 0x33f;
175
}
176
177
static const TypeInfo borzoipda_type = {
178
.name = MACHINE_TYPE_NAME("borzoi"),
179
- .parent = TYPE_MACHINE,
180
+ .parent = TYPE_SPITZ_MACHINE,
181
.class_init = borzoipda_class_init,
182
};
183
184
static void terrierpda_class_init(ObjectClass *oc, void *data)
185
{
186
MachineClass *mc = MACHINE_CLASS(oc);
187
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
188
189
mc->desc = "Sharp SL-C3200 (Terrier) PDA (PXA270)";
190
- mc->init = terrier_init;
191
- mc->block_default_type = IF_IDE;
192
- mc->ignore_memory_transaction_failures = true;
193
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c5");
194
+ smc->model = terrier;
195
+ smc->arm_id = 0x33f;
196
}
197
198
static const TypeInfo terrierpda_type = {
199
.name = MACHINE_TYPE_NAME("terrier"),
200
- .parent = TYPE_MACHINE,
201
+ .parent = TYPE_SPITZ_MACHINE,
202
.class_init = terrierpda_class_init,
203
};
204
205
static void spitz_machine_init(void)
206
{
207
+ type_register_static(&spitz_common_info);
208
type_register_static(&akitapda_type);
209
type_register_static(&spitzpda_type);
210
type_register_static(&borzoipda_type);
90
--
211
--
91
2.20.1
212
2.20.1
92
213
93
214
diff view generated by jsdifflib
1
As the first step in converting the CMSDK_APB_DUALTIMER device to the
1
Keep pointers to the MPU and the SSI devices in SpitzMachineState.
2
Clock framework, add a Clock input. For the moment we do nothing
2
We're going to want to make GPIO connections between some of the
3
with this clock; we will change the behaviour from using the pclk-frq
3
SSI devices and the SCPs, so we want to keep hold of a pointer to
4
property to using the Clock once all the users of this device have
4
those; putting the MPU into the struct allows us to pass just
5
been converted to wire up the Clock.
5
one thing to spitz_ssp_attach() rather than two.
6
6
7
We take the opportunity to correct the name of the clock input to
7
We have to retain the setting of the global "max1111" variable
8
match the hardware -- the dual timer names the clock which drives the
8
for the moment as it is used in spitz_adc_temp_on(); later in
9
timers TIMCLK. (It does also have a 'pclk' input, which is used only
9
this series of commits we will be able to remove it.
10
for the register and APB bus logic; on the SSE-200 these clocks are
11
both connected together.)
12
13
This is a migration compatibility break for machines mps2-an385,
14
mps2-an386, mps2-an500, mps2-an511, mps2-an505, mps2-an521, musca-a,
15
musca-b1.
16
10
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
19
Reviewed-by: Luc Michel <luc@lmichel.fr>
13
Message-id: 20200628142429.17111-4-peter.maydell@linaro.org
20
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Message-id: 20210128114145.20536-9-peter.maydell@linaro.org
22
Message-id: 20210121190622.22000-9-peter.maydell@linaro.org
23
---
14
---
24
include/hw/timer/cmsdk-apb-dualtimer.h | 3 +++
15
hw/arm/spitz.c | 50 ++++++++++++++++++++++++++++----------------------
25
hw/timer/cmsdk-apb-dualtimer.c | 7 +++++--
16
1 file changed, 28 insertions(+), 22 deletions(-)
26
2 files changed, 8 insertions(+), 2 deletions(-)
27
17
28
diff --git a/include/hw/timer/cmsdk-apb-dualtimer.h b/include/hw/timer/cmsdk-apb-dualtimer.h
18
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
29
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
30
--- a/include/hw/timer/cmsdk-apb-dualtimer.h
20
--- a/hw/arm/spitz.c
31
+++ b/include/hw/timer/cmsdk-apb-dualtimer.h
21
+++ b/hw/arm/spitz.c
32
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ typedef struct {
33
*
23
34
* QEMU interface:
24
typedef struct {
35
* + QOM property "pclk-frq": frequency at which the timer is clocked
25
MachineState parent;
36
+ * + Clock input "TIMCLK": clock (for both timers)
26
+ PXA2xxState *mpu;
37
* + sysbus MMIO region 0: the register bank
27
+ DeviceState *mux;
38
* + sysbus IRQ 0: combined timer interrupt TIMINTC
28
+ DeviceState *lcdtg;
39
* + sysbus IRO 1: timer block 1 interrupt TIMINT1
29
+ DeviceState *ads7846;
40
@@ -XXX,XX +XXX,XX @@
30
+ DeviceState *max1111;
41
31
} SpitzMachineState;
42
#include "hw/sysbus.h"
32
43
#include "hw/ptimer.h"
33
#define TYPE_SPITZ_MACHINE "spitz-common"
44
+#include "hw/clock.h"
34
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_realize(SSISlave *d, Error **errp)
45
#include "qom/object.h"
35
s->bus[2] = ssi_create_bus(dev, "ssi2");
46
47
#define TYPE_CMSDK_APB_DUALTIMER "cmsdk-apb-dualtimer"
48
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBDualTimer {
49
MemoryRegion iomem;
50
qemu_irq timerintc;
51
uint32_t pclk_frq;
52
+ Clock *timclk;
53
54
CMSDKAPBDualTimerModule timermod[CMSDK_APB_DUALTIMER_NUM_MODULES];
55
uint32_t timeritcr;
56
diff --git a/hw/timer/cmsdk-apb-dualtimer.c b/hw/timer/cmsdk-apb-dualtimer.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/timer/cmsdk-apb-dualtimer.c
59
+++ b/hw/timer/cmsdk-apb-dualtimer.c
60
@@ -XXX,XX +XXX,XX @@
61
#include "hw/irq.h"
62
#include "hw/qdev-properties.h"
63
#include "hw/registerfields.h"
64
+#include "hw/qdev-clock.h"
65
#include "hw/timer/cmsdk-apb-dualtimer.h"
66
#include "migration/vmstate.h"
67
68
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_init(Object *obj)
69
for (i = 0; i < ARRAY_SIZE(s->timermod); i++) {
70
sysbus_init_irq(sbd, &s->timermod[i].timerint);
71
}
72
+ s->timclk = qdev_init_clock_in(DEVICE(s), "TIMCLK", NULL, NULL);
73
}
36
}
74
37
75
static void cmsdk_apb_dualtimer_realize(DeviceState *dev, Error **errp)
38
-static void spitz_ssp_attach(PXA2xxState *cpu)
76
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_dualtimermod_vmstate = {
39
+static void spitz_ssp_attach(SpitzMachineState *sms)
77
40
{
78
static const VMStateDescription cmsdk_apb_dualtimer_vmstate = {
41
- DeviceState *mux;
79
.name = "cmsdk-apb-dualtimer",
42
- DeviceState *dev;
80
- .version_id = 1,
43
void *bus;
81
- .minimum_version_id = 1,
44
82
+ .version_id = 2,
45
- mux = ssi_create_slave(cpu->ssp[CORGI_SSP_PORT - 1], "corgi-ssp");
83
+ .minimum_version_id = 2,
46
+ sms->mux = ssi_create_slave(sms->mpu->ssp[CORGI_SSP_PORT - 1], "corgi-ssp");
84
.fields = (VMStateField[]) {
47
85
+ VMSTATE_CLOCK(timclk, CMSDKAPBDualTimer),
48
- bus = qdev_get_child_bus(mux, "ssi0");
86
VMSTATE_STRUCT_ARRAY(timermod, CMSDKAPBDualTimer,
49
- ssi_create_slave(bus, "spitz-lcdtg");
87
CMSDK_APB_DUALTIMER_NUM_MODULES,
50
+ bus = qdev_get_child_bus(sms->mux, "ssi0");
88
1, cmsdk_dualtimermod_vmstate,
51
+ sms->lcdtg = ssi_create_slave(bus, "spitz-lcdtg");
52
53
- bus = qdev_get_child_bus(mux, "ssi1");
54
- dev = ssi_create_slave(bus, "ads7846");
55
- qdev_connect_gpio_out(dev, 0,
56
- qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_TP_INT));
57
+ bus = qdev_get_child_bus(sms->mux, "ssi1");
58
+ sms->ads7846 = ssi_create_slave(bus, "ads7846");
59
+ qdev_connect_gpio_out(sms->ads7846, 0,
60
+ qdev_get_gpio_in(sms->mpu->gpio, SPITZ_GPIO_TP_INT));
61
62
- bus = qdev_get_child_bus(mux, "ssi2");
63
- max1111 = ssi_create_slave(bus, "max1111");
64
- max111x_set_input(max1111, MAX1111_BATT_VOLT, SPITZ_BATTERY_VOLT);
65
- max111x_set_input(max1111, MAX1111_BATT_TEMP, 0);
66
- max111x_set_input(max1111, MAX1111_ACIN_VOLT, SPITZ_CHARGEON_ACIN);
67
+ bus = qdev_get_child_bus(sms->mux, "ssi2");
68
+ sms->max1111 = ssi_create_slave(bus, "max1111");
69
+ max1111 = sms->max1111;
70
+ max111x_set_input(sms->max1111, MAX1111_BATT_VOLT, SPITZ_BATTERY_VOLT);
71
+ max111x_set_input(sms->max1111, MAX1111_BATT_TEMP, 0);
72
+ max111x_set_input(sms->max1111, MAX1111_ACIN_VOLT, SPITZ_CHARGEON_ACIN);
73
74
- qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_LCDCON_CS,
75
- qdev_get_gpio_in(mux, 0));
76
- qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_ADS7846_CS,
77
- qdev_get_gpio_in(mux, 1));
78
- qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_MAX1111_CS,
79
- qdev_get_gpio_in(mux, 2));
80
+ qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_LCDCON_CS,
81
+ qdev_get_gpio_in(sms->mux, 0));
82
+ qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_ADS7846_CS,
83
+ qdev_get_gpio_in(sms->mux, 1));
84
+ qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_MAX1111_CS,
85
+ qdev_get_gpio_in(sms->mux, 2));
86
}
87
88
/* CF Microdrive */
89
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info spitz_binfo = {
90
static void spitz_common_init(MachineState *machine)
91
{
92
SpitzMachineClass *smc = SPITZ_MACHINE_GET_CLASS(machine);
93
+ SpitzMachineState *sms = SPITZ_MACHINE(machine);
94
enum spitz_model_e model = smc->model;
95
PXA2xxState *mpu;
96
DeviceState *scp0, *scp1 = NULL;
97
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
98
/* Setup CPU & memory */
99
mpu = pxa270_init(address_space_mem, spitz_binfo.ram_size,
100
machine->cpu_type);
101
+ sms->mpu = mpu;
102
103
sl_flash_register(mpu, (model == spitz) ? FLASH_128M : FLASH_1024M);
104
105
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
106
/* Setup peripherals */
107
spitz_keyboard_register(mpu);
108
109
- spitz_ssp_attach(mpu);
110
+ spitz_ssp_attach(sms);
111
112
scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
113
if (model != akita) {
89
--
114
--
90
2.20.1
115
2.20.1
91
116
92
117
diff view generated by jsdifflib
1
Now that the CMSDK APB watchdog uses its Clock input, it will
1
Keep pointers to scp0, scp1 in SpitzMachineState, and just pass
2
correctly respond when the system clock frequency is changed using
2
that to spitz_scoop_gpio_setup().
3
the RCC register on in the Stellaris board system registers. Test
3
4
that when the RCC register is written it causes the watchdog timer to
4
(We'll want to use some of the other fields in SpitzMachineState
5
change speed.
5
in that function in the next commit.)
6
6
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Luc Michel <luc@lmichel.fr>
9
Message-id: 20200628142429.17111-5-peter.maydell@linaro.org
10
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20210128114145.20536-22-peter.maydell@linaro.org
12
Message-id: 20210121190622.22000-22-peter.maydell@linaro.org
13
---
10
---
14
tests/qtest/cmsdk-apb-watchdog-test.c | 52 +++++++++++++++++++++++++++
11
hw/arm/spitz.c | 34 +++++++++++++++++++---------------
15
1 file changed, 52 insertions(+)
12
1 file changed, 19 insertions(+), 15 deletions(-)
16
13
17
diff --git a/tests/qtest/cmsdk-apb-watchdog-test.c b/tests/qtest/cmsdk-apb-watchdog-test.c
14
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/qtest/cmsdk-apb-watchdog-test.c
16
--- a/hw/arm/spitz.c
20
+++ b/tests/qtest/cmsdk-apb-watchdog-test.c
17
+++ b/hw/arm/spitz.c
21
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ typedef struct {
22
*/
19
DeviceState *lcdtg;
23
20
DeviceState *ads7846;
24
#include "qemu/osdep.h"
21
DeviceState *max1111;
25
+#include "qemu/bitops.h"
22
+ DeviceState *scp0;
26
#include "libqtest-single.h"
23
+ DeviceState *scp1;
27
24
} SpitzMachineState;
28
/*
25
29
@@ -XXX,XX +XXX,XX @@
26
#define TYPE_SPITZ_MACHINE "spitz-common"
30
#define WDOGMIS 0x14
27
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
31
#define WDOGLOCK 0xc00
28
#define SPITZ_SCP2_BACKLIGHT_ON 8
32
29
#define SPITZ_SCP2_MIC_BIAS 9
33
+#define SSYS_BASE 0x400fe000
30
34
+#define RCC 0x60
31
-static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
35
+#define SYSDIV_SHIFT 23
32
- DeviceState *scp0, DeviceState *scp1)
36
+#define SYSDIV_LENGTH 4
33
+static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
37
+
38
static void test_watchdog(void)
39
{
34
{
40
g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
35
- qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, cpu, 8);
41
@@ -XXX,XX +XXX,XX @@ static void test_watchdog(void)
36
+ qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, sms->mpu, 8);
42
g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
37
38
- qdev_connect_gpio_out(scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
39
- qdev_connect_gpio_out(scp0, SPITZ_SCP_JK_B, outsignals[1]);
40
- qdev_connect_gpio_out(scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
41
- qdev_connect_gpio_out(scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
42
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
43
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_JK_B, outsignals[1]);
44
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
45
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
46
47
- if (scp1) {
48
- qdev_connect_gpio_out(scp1, SPITZ_SCP2_BACKLIGHT_CONT, outsignals[4]);
49
- qdev_connect_gpio_out(scp1, SPITZ_SCP2_BACKLIGHT_ON, outsignals[5]);
50
+ if (sms->scp1) {
51
+ qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_CONT,
52
+ outsignals[4]);
53
+ qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_ON,
54
+ outsignals[5]);
55
}
56
57
- qdev_connect_gpio_out(scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
58
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
43
}
59
}
44
60
45
+static void test_clock_change(void)
61
#define SPITZ_GPIO_HSYNC 22
46
+{
62
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
47
+ uint32_t rcc;
63
SpitzMachineState *sms = SPITZ_MACHINE(machine);
48
+
64
enum spitz_model_e model = smc->model;
49
+ /*
65
PXA2xxState *mpu;
50
+ * Test that writing to the stellaris board's RCC register to
66
- DeviceState *scp0, *scp1 = NULL;
51
+ * change the system clock frequency causes the watchdog
67
MemoryRegion *address_space_mem = get_system_memory();
52
+ * to change the speed it counts at.
68
MemoryRegion *rom = g_new(MemoryRegion, 1);
53
+ */
69
54
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
70
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
55
+
71
56
+ writel(WDOG_BASE + WDOGCONTROL, 1);
72
spitz_ssp_attach(sms);
57
+ writel(WDOG_BASE + WDOGLOAD, 1000);
73
58
+
74
- scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
59
+ /* Step to just past the 500th tick */
75
+ sms->scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
60
+ clock_step(80 * 500 + 1);
76
if (model != akita) {
61
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
77
- scp1 = sysbus_create_simple("scoop", 0x08800040, NULL);
62
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
78
+ sms->scp1 = sysbus_create_simple("scoop", 0x08800040, NULL);
63
+
79
+ } else {
64
+ /* Rewrite RCC.SYSDIV from 16 to 8, so the clock is now 40ns per tick */
80
+ sms->scp1 = NULL;
65
+ rcc = readl(SSYS_BASE + RCC);
81
}
66
+ g_assert_cmpuint(extract32(rcc, SYSDIV_SHIFT, SYSDIV_LENGTH), ==, 0xf);
82
67
+ rcc = deposit32(rcc, SYSDIV_SHIFT, SYSDIV_LENGTH, 7);
83
- spitz_scoop_gpio_setup(mpu, scp0, scp1);
68
+ writel(SSYS_BASE + RCC, rcc);
84
+ spitz_scoop_gpio_setup(sms);
69
+
85
70
+ /* Just past the 1000th tick: timer should have fired */
86
spitz_gpio_setup(mpu, (model == akita) ? 1 : 2);
71
+ clock_step(40 * 500);
72
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
73
+
74
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 0);
75
+
76
+ /* VALUE reloads at following tick */
77
+ clock_step(41);
78
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
79
+
80
+ /* Writing any value to WDOGINTCLR clears the interrupt and reloads */
81
+ clock_step(40 * 500);
82
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
83
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
84
+ writel(WDOG_BASE + WDOGINTCLR, 0);
85
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
86
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
87
+}
88
+
89
int main(int argc, char **argv)
90
{
91
int r;
92
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
93
qtest_start("-machine lm3s811evb");
94
95
qtest_add_func("/cmsdk-apb-watchdog/watchdog", test_watchdog);
96
+ qtest_add_func("/cmsdk-apb-watchdog/watchdog_clock_change",
97
+ test_clock_change);
98
99
r = g_test_run();
100
87
101
--
88
--
102
2.20.1
89
2.20.1
103
90
104
91
diff view generated by jsdifflib
1
Create and connect the Clock input for the watchdog device on the
1
Currently the Spitz board uses a nasty hack for the GPIO lines
2
Stellaris boards. Because the Stellaris boards model the ability to
2
that pass "bit5" and "power" information to the LCD controller:
3
change the clock rate by programming PLL registers, we have to create
3
the lcdtg realize function sets a global variable to point to
4
an output Clock on the ssys_state device and wire it up to the
4
the instance it just realized, and then the functions spitz_bl_power()
5
watchdog.
5
and spitz_bl_bit5() use that to find the device they are changing
6
the internal state of. There is a comment reading:
7
FIXME: Implement GPIO properly and remove this hack.
8
which was added in 2009.
6
9
7
Note that the old comment on ssys_calculate_system_clock() got the
10
Implement GPIO properly and remove this hack.
8
units wrong -- system_clock_scale is in nanoseconds, not
9
milliseconds. Improve the commentary to clarify how we are
10
calculating the period.
11
11
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Luc Michel <luc@lmichel.fr>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20200628142429.17111-6-peter.maydell@linaro.org
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Message-id: 20210128114145.20536-18-peter.maydell@linaro.org
17
Message-id: 20210121190622.22000-18-peter.maydell@linaro.org
18
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
---
15
---
20
hw/arm/stellaris.c | 43 +++++++++++++++++++++++++++++++------------
16
hw/arm/spitz.c | 28 ++++++++++++----------------
21
1 file changed, 31 insertions(+), 12 deletions(-)
17
1 file changed, 12 insertions(+), 16 deletions(-)
22
18
23
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
19
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
24
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/arm/stellaris.c
21
--- a/hw/arm/spitz.c
26
+++ b/hw/arm/stellaris.c
22
+++ b/hw/arm/spitz.c
27
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ static void spitz_bl_update(SpitzLCDTG *s)
28
#include "hw/watchdog/cmsdk-apb-watchdog.h"
24
zaurus_printf("LCD Backlight now off\n");
29
#include "migration/vmstate.h"
30
#include "hw/misc/unimp.h"
31
+#include "hw/qdev-clock.h"
32
#include "cpu.h"
33
#include "qom/object.h"
34
35
@@ -XXX,XX +XXX,XX @@ struct ssys_state {
36
uint32_t clkvclr;
37
uint32_t ldoarst;
38
qemu_irq irq;
39
+ Clock *sysclk;
40
/* Properties (all read-only registers) */
41
uint32_t user0;
42
uint32_t user1;
43
@@ -XXX,XX +XXX,XX @@ static bool ssys_use_rcc2(ssys_state *s)
44
}
25
}
45
26
46
/*
27
-/* FIXME: Implement GPIO properly and remove this hack. */
47
- * Caculate the sys. clock period in ms.
28
-static SpitzLCDTG *spitz_lcdtg;
48
+ * Calculate the system clock period. We only want to propagate
29
-
49
+ * this change to the rest of the system if we're not being called
30
static inline void spitz_bl_bit5(void *opaque, int line, int level)
50
+ * from migration post-load.
51
*/
52
-static void ssys_calculate_system_clock(ssys_state *s)
53
+static void ssys_calculate_system_clock(ssys_state *s, bool propagate_clock)
54
{
31
{
55
+ /*
32
- SpitzLCDTG *s = spitz_lcdtg;
56
+ * SYSDIV field specifies divisor: 0 == /1, 1 == /2, etc. Input
33
+ SpitzLCDTG *s = opaque;
57
+ * clock is 200MHz, which is a period of 5 ns. Dividing the clock
34
int prev = s->bl_intensity;
58
+ * frequency by X is the same as multiplying the period by X.
35
59
+ */
36
if (level)
60
if (ssys_use_rcc2(s)) {
37
@@ -XXX,XX +XXX,XX @@ static inline void spitz_bl_bit5(void *opaque, int line, int level)
61
system_clock_scale = 5 * (((s->rcc2 >> 23) & 0x3f) + 1);
38
62
} else {
39
static inline void spitz_bl_power(void *opaque, int line, int level)
63
system_clock_scale = 5 * (((s->rcc >> 23) & 0xf) + 1);
40
{
64
}
41
- SpitzLCDTG *s = spitz_lcdtg;
65
+ clock_set_ns(s->sysclk, system_clock_scale);
42
+ SpitzLCDTG *s = opaque;
66
+ if (propagate_clock) {
43
s->bl_power = !!level;
67
+ clock_propagate(s->sysclk);
44
spitz_bl_update(s);
68
+ }
69
}
45
}
70
46
@@ -XXX,XX +XXX,XX @@ static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
71
static void ssys_write(void *opaque, hwaddr offset,
72
@@ -XXX,XX +XXX,XX @@ static void ssys_write(void *opaque, hwaddr offset,
73
s->int_status |= (1 << 6);
74
}
75
s->rcc = value;
76
- ssys_calculate_system_clock(s);
77
+ ssys_calculate_system_clock(s, true);
78
break;
79
case 0x070: /* RCC2 */
80
if (ssys_board_class(s) == DID0_CLASS_SANDSTORM) {
81
@@ -XXX,XX +XXX,XX @@ static void ssys_write(void *opaque, hwaddr offset,
82
s->int_status |= (1 << 6);
83
}
84
s->rcc2 = value;
85
- ssys_calculate_system_clock(s);
86
+ ssys_calculate_system_clock(s, true);
87
break;
88
case 0x100: /* RCGC0 */
89
s->rcgc[0] = value;
90
@@ -XXX,XX +XXX,XX @@ static void stellaris_sys_reset_hold(Object *obj)
91
{
92
ssys_state *s = STELLARIS_SYS(obj);
93
94
- ssys_calculate_system_clock(s);
95
+ /* OK to propagate clocks from the hold phase */
96
+ ssys_calculate_system_clock(s, true);
97
}
98
99
static void stellaris_sys_reset_exit(Object *obj)
100
@@ -XXX,XX +XXX,XX @@ static int stellaris_sys_post_load(void *opaque, int version_id)
101
{
102
ssys_state *s = opaque;
103
104
- ssys_calculate_system_clock(s);
105
+ ssys_calculate_system_clock(s, false);
106
107
return 0;
47
return 0;
108
}
48
}
109
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_stellaris_sys = {
49
110
VMSTATE_UINT32_ARRAY(dcgc, ssys_state, 3),
50
-static void spitz_lcdtg_realize(SSISlave *dev, Error **errp)
111
VMSTATE_UINT32(clkvclr, ssys_state),
51
+static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
112
VMSTATE_UINT32(ldoarst, ssys_state),
52
{
113
+ /* No field for sysclk -- handled in post-load instead */
53
- SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, dev);
114
VMSTATE_END_OF_LIST()
54
+ SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, ssi);
55
+ DeviceState *dev = DEVICE(s);
56
57
- spitz_lcdtg = s;
58
s->bl_power = 0;
59
s->bl_intensity = 0x20;
60
+
61
+ qdev_init_gpio_in_named(dev, spitz_bl_bit5, "bl_bit5", 1);
62
+ qdev_init_gpio_in_named(dev, spitz_bl_power, "bl_power", 1);
63
}
64
65
/* SSP devices */
66
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
67
case 3:
68
zaurus_printf("Orange LED %s.\n", level ? "on" : "off");
69
break;
70
- case 4:
71
- spitz_bl_bit5(opaque, line, level);
72
- break;
73
- case 5:
74
- spitz_bl_power(opaque, line, level);
75
- break;
76
case 6:
77
spitz_adc_temp_on(opaque, line, level);
78
break;
79
+ default:
80
+ g_assert_not_reached();
115
}
81
}
116
};
117
@@ -XXX,XX +XXX,XX @@ static void stellaris_sys_instance_init(Object *obj)
118
memory_region_init_io(&s->iomem, obj, &ssys_ops, s, "ssys", 0x00001000);
119
sysbus_init_mmio(sbd, &s->iomem);
120
sysbus_init_irq(sbd, &s->irq);
121
+ s->sysclk = qdev_init_clock_out(DEVICE(s), "SYSCLK");
122
}
82
}
123
83
124
-static int stellaris_sys_init(uint32_t base, qemu_irq irq,
84
@@ -XXX,XX +XXX,XX @@ static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
125
- stellaris_board_info * board,
85
126
- uint8_t *macaddr)
86
if (sms->scp1) {
127
+static DeviceState *stellaris_sys_init(uint32_t base, qemu_irq irq,
87
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_CONT,
128
+ stellaris_board_info *board,
88
- outsignals[4]);
129
+ uint8_t *macaddr)
89
+ qdev_get_gpio_in_named(sms->lcdtg, "bl_bit5", 0));
130
{
90
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_ON,
131
DeviceState *dev = qdev_new(TYPE_STELLARIS_SYS);
91
- outsignals[5]);
132
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
92
+ qdev_get_gpio_in_named(sms->lcdtg, "bl_power", 0));
133
@@ -XXX,XX +XXX,XX @@ static int stellaris_sys_init(uint32_t base, qemu_irq irq,
134
*/
135
device_cold_reset(dev);
136
137
- return 0;
138
+ return dev;
139
}
140
141
/* I2C controller. */
142
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
143
int flash_size;
144
I2CBus *i2c;
145
DeviceState *dev;
146
+ DeviceState *ssys_dev;
147
int i;
148
int j;
149
150
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
151
}
152
}
93
}
153
94
154
- stellaris_sys_init(0x400fe000, qdev_get_gpio_in(nvic, 28),
95
qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
155
- board, nd_table[0].macaddr.a);
156
+ ssys_dev = stellaris_sys_init(0x400fe000, qdev_get_gpio_in(nvic, 28),
157
+ board, nd_table[0].macaddr.a);
158
159
160
if (board->dc1 & (1 << 3)) { /* watchdog present */
161
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
162
/* system_clock_scale is valid now */
163
uint32_t mainclk = NANOSECONDS_PER_SECOND / system_clock_scale;
164
qdev_prop_set_uint32(dev, "wdogclk-frq", mainclk);
165
+ qdev_connect_clock_in(dev, "WDOGCLK",
166
+ qdev_get_clock_out(ssys_dev, "SYSCLK"));
167
168
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
169
sysbus_mmio_map(SYS_BUS_DEVICE(dev),
170
--
96
--
171
2.20.1
97
2.20.1
172
98
173
99
diff view generated by jsdifflib
1
Switch the CMSDK APB dualtimer device over to using its Clock input;
1
Add some QOM properties to the max111x ADC device to allow the
2
the pclk-frq property is now ignored.
2
initial values to be configured. Currently this is done by
3
board code calling max111x_set_input() after it creates the
4
device, which doesn't work on system reset.
5
6
This requires us to implement a reset method for this device,
7
so while we're doing that make sure we reset the other parts
8
of the device state.
3
9
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Luc Michel <luc@lmichel.fr>
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210128114145.20536-20-peter.maydell@linaro.org
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210121190622.22000-20-peter.maydell@linaro.org
13
Message-id: 20200628142429.17111-7-peter.maydell@linaro.org
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
---
14
---
12
hw/timer/cmsdk-apb-dualtimer.c | 42 ++++++++++++++++++++++++++++++----
15
hw/misc/max111x.c | 57 ++++++++++++++++++++++++++++++++++++++---------
13
1 file changed, 37 insertions(+), 5 deletions(-)
16
1 file changed, 47 insertions(+), 10 deletions(-)
14
17
15
diff --git a/hw/timer/cmsdk-apb-dualtimer.c b/hw/timer/cmsdk-apb-dualtimer.c
18
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/timer/cmsdk-apb-dualtimer.c
20
--- a/hw/misc/max111x.c
18
+++ b/hw/timer/cmsdk-apb-dualtimer.c
21
+++ b/hw/misc/max111x.c
19
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_update(CMSDKAPBDualTimer *s)
22
@@ -XXX,XX +XXX,XX @@
20
qemu_set_irq(s->timerintc, timintc);
23
#include "hw/ssi/ssi.h"
24
#include "migration/vmstate.h"
25
#include "qemu/module.h"
26
+#include "hw/qdev-properties.h"
27
28
typedef struct {
29
SSISlave parent_obj;
30
31
qemu_irq interrupt;
32
+ /* Values of inputs at system reset (settable by QOM property) */
33
+ uint8_t reset_input[8];
34
+
35
uint8_t tb1, rb2, rb3;
36
int cycle;
37
38
@@ -XXX,XX +XXX,XX @@ static int max111x_init(SSISlave *d, int inputs)
39
qdev_init_gpio_out(dev, &s->interrupt, 1);
40
41
s->inputs = inputs;
42
- /* TODO: add a user interface for setting these */
43
- s->input[0] = 0xf0;
44
- s->input[1] = 0xe0;
45
- s->input[2] = 0xd0;
46
- s->input[3] = 0xc0;
47
- s->input[4] = 0xb0;
48
- s->input[5] = 0xa0;
49
- s->input[6] = 0x90;
50
- s->input[7] = 0x80;
51
- s->com = 0;
52
53
vmstate_register(VMSTATE_IF(dev), VMSTATE_INSTANCE_ID_ANY,
54
&vmstate_max111x, s);
55
@@ -XXX,XX +XXX,XX @@ void max111x_set_input(DeviceState *dev, int line, uint8_t value)
56
s->input[line] = value;
21
}
57
}
22
58
23
+static int cmsdk_dualtimermod_divisor(CMSDKAPBDualTimerModule *m)
59
+static void max111x_reset(DeviceState *dev)
24
+{
60
+{
25
+ /* Return the divisor set by the current CONTROL.PRESCALE value */
61
+ MAX111xState *s = MAX_111X(dev);
26
+ switch (FIELD_EX32(m->control, CONTROL, PRESCALE)) {
62
+ int i;
27
+ case 0:
63
+
28
+ return 1;
64
+ for (i = 0; i < s->inputs; i++) {
29
+ case 1:
65
+ s->input[i] = s->reset_input[i];
30
+ return 16;
31
+ case 2:
32
+ case 3: /* UNDEFINED, we treat like 2 (and complained when it was set) */
33
+ return 256;
34
+ default:
35
+ g_assert_not_reached();
36
+ }
66
+ }
67
+ s->com = 0;
68
+ s->tb1 = 0;
69
+ s->rb2 = 0;
70
+ s->rb3 = 0;
71
+ s->cycle = 0;
37
+}
72
+}
38
+
73
+
39
static void cmsdk_dualtimermod_write_control(CMSDKAPBDualTimerModule *m,
74
+static Property max1110_properties[] = {
40
uint32_t newctrl)
75
+ /* Reset values for ADC inputs */
76
+ DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
77
+ DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
78
+ DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
79
+ DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
80
+ DEFINE_PROP_END_OF_LIST(),
81
+};
82
+
83
+static Property max1111_properties[] = {
84
+ /* Reset values for ADC inputs */
85
+ DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
86
+ DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
87
+ DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
88
+ DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
89
+ DEFINE_PROP_UINT8("input4", MAX111xState, reset_input[4], 0xb0),
90
+ DEFINE_PROP_UINT8("input5", MAX111xState, reset_input[5], 0xa0),
91
+ DEFINE_PROP_UINT8("input6", MAX111xState, reset_input[6], 0x90),
92
+ DEFINE_PROP_UINT8("input7", MAX111xState, reset_input[7], 0x80),
93
+ DEFINE_PROP_END_OF_LIST(),
94
+};
95
+
96
static void max111x_class_init(ObjectClass *klass, void *data)
41
{
97
{
42
@@ -XXX,XX +XXX,XX @@ static void cmsdk_dualtimermod_write_control(CMSDKAPBDualTimerModule *m,
98
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
43
default:
99
+ DeviceClass *dc = DEVICE_CLASS(klass);
44
g_assert_not_reached();
100
45
}
101
k->transfer = max111x_transfer;
46
- ptimer_set_freq(m->timer, m->parent->pclk_frq / divisor);
102
+ dc->reset = max111x_reset;
47
+ ptimer_set_period_from_clock(m->timer, m->parent->timclk, divisor);
48
}
49
50
if (changed & R_CONTROL_MODE_MASK) {
51
@@ -XXX,XX +XXX,XX @@ static void cmsdk_dualtimermod_reset(CMSDKAPBDualTimerModule *m)
52
* limit must both be set to 0xffff, so we wrap at 16 bits.
53
*/
54
ptimer_set_limit(m->timer, 0xffff, 1);
55
- ptimer_set_freq(m->timer, m->parent->pclk_frq);
56
+ ptimer_set_period_from_clock(m->timer, m->parent->timclk,
57
+ cmsdk_dualtimermod_divisor(m));
58
ptimer_transaction_commit(m->timer);
59
}
103
}
60
104
61
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_reset(DeviceState *dev)
105
static const TypeInfo max111x_info = {
62
s->timeritop = 0;
106
@@ -XXX,XX +XXX,XX @@ static const TypeInfo max111x_info = {
107
static void max1110_class_init(ObjectClass *klass, void *data)
108
{
109
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
110
+ DeviceClass *dc = DEVICE_CLASS(klass);
111
112
k->realize = max1110_realize;
113
+ device_class_set_props(dc, max1110_properties);
63
}
114
}
64
115
65
+static void cmsdk_apb_dualtimer_clk_update(void *opaque)
116
static const TypeInfo max1110_info = {
66
+{
117
@@ -XXX,XX +XXX,XX @@ static const TypeInfo max1110_info = {
67
+ CMSDKAPBDualTimer *s = CMSDK_APB_DUALTIMER(opaque);
118
static void max1111_class_init(ObjectClass *klass, void *data)
68
+ int i;
69
+
70
+ for (i = 0; i < ARRAY_SIZE(s->timermod); i++) {
71
+ CMSDKAPBDualTimerModule *m = &s->timermod[i];
72
+ ptimer_transaction_begin(m->timer);
73
+ ptimer_set_period_from_clock(m->timer, m->parent->timclk,
74
+ cmsdk_dualtimermod_divisor(m));
75
+ ptimer_transaction_commit(m->timer);
76
+ }
77
+}
78
+
79
static void cmsdk_apb_dualtimer_init(Object *obj)
80
{
119
{
81
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
120
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
82
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_init(Object *obj)
121
+ DeviceClass *dc = DEVICE_CLASS(klass);
83
for (i = 0; i < ARRAY_SIZE(s->timermod); i++) {
122
84
sysbus_init_irq(sbd, &s->timermod[i].timerint);
123
k->realize = max1111_realize;
85
}
124
+ device_class_set_props(dc, max1111_properties);
86
- s->timclk = qdev_init_clock_in(DEVICE(s), "TIMCLK", NULL, NULL);
87
+ s->timclk = qdev_init_clock_in(DEVICE(s), "TIMCLK",
88
+ cmsdk_apb_dualtimer_clk_update, s);
89
}
125
}
90
126
91
static void cmsdk_apb_dualtimer_realize(DeviceState *dev, Error **errp)
127
static const TypeInfo max1111_info = {
92
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_realize(DeviceState *dev, Error **errp)
93
CMSDKAPBDualTimer *s = CMSDK_APB_DUALTIMER(dev);
94
int i;
95
96
- if (s->pclk_frq == 0) {
97
- error_setg(errp, "CMSDK APB timer: pclk-frq property must be set");
98
+ if (!clock_has_source(s->timclk)) {
99
+ error_setg(errp, "CMSDK APB dualtimer: TIMCLK clock must be connected");
100
return;
101
}
102
103
--
128
--
104
2.20.1
129
2.20.1
105
130
106
131
diff view generated by jsdifflib
1
Now no users are setting the frq properties on the CMSDK timer,
1
The max111x is a proper qdev device; we can use dc->vmsd rather than
2
dualtimer, watchdog or ARMSSE SoC devices, we can remove the
2
directly calling vmstate_register().
3
properties and the struct fields that back them.
3
4
It's possible that this is a migration compat break, but the only
5
boards that use this device are the spitz-family ('akita', 'borzoi',
6
'spitz', 'terrier').
4
7
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200628142429.17111-8-peter.maydell@linaro.org
9
Message-id: 20210128114145.20536-25-peter.maydell@linaro.org
10
Message-id: 20210121190622.22000-25-peter.maydell@linaro.org
11
---
12
---
12
include/hw/arm/armsse.h | 2 --
13
hw/misc/max111x.c | 3 +--
13
include/hw/timer/cmsdk-apb-dualtimer.h | 2 --
14
1 file changed, 1 insertion(+), 2 deletions(-)
14
include/hw/timer/cmsdk-apb-timer.h | 2 --
15
include/hw/watchdog/cmsdk-apb-watchdog.h | 2 --
16
hw/arm/armsse.c | 2 --
17
hw/timer/cmsdk-apb-dualtimer.c | 6 ------
18
hw/timer/cmsdk-apb-timer.c | 6 ------
19
hw/watchdog/cmsdk-apb-watchdog.c | 6 ------
20
8 files changed, 28 deletions(-)
21
15
22
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
16
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
23
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/armsse.h
18
--- a/hw/misc/max111x.c
25
+++ b/include/hw/arm/armsse.h
19
+++ b/hw/misc/max111x.c
26
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ static int max111x_init(SSISlave *d, int inputs)
27
* + Clock input "S32KCLK": slow 32KHz clock used for a few peripherals
21
28
* + QOM property "memory" is a MemoryRegion containing the devices provided
22
s->inputs = inputs;
29
* by the board model.
23
30
- * + QOM property "MAINCLK_FRQ" is the frequency of the main system clock
24
- vmstate_register(VMSTATE_IF(dev), VMSTATE_INSTANCE_ID_ANY,
31
* + QOM property "EXP_NUMIRQ" sets the number of expansion interrupts.
25
- &vmstate_max111x, s);
32
* (In hardware, the SSE-200 permits the number of expansion interrupts
26
return 0;
33
* for the two CPUs to be configured separately, but we restrict it to
34
@@ -XXX,XX +XXX,XX @@ struct ARMSSE {
35
/* Properties */
36
MemoryRegion *board_memory;
37
uint32_t exp_numirq;
38
- uint32_t mainclk_frq;
39
uint32_t sram_addr_width;
40
uint32_t init_svtor;
41
bool cpu_fpu[SSE_MAX_CPUS];
42
diff --git a/include/hw/timer/cmsdk-apb-dualtimer.h b/include/hw/timer/cmsdk-apb-dualtimer.h
43
index XXXXXXX..XXXXXXX 100644
44
--- a/include/hw/timer/cmsdk-apb-dualtimer.h
45
+++ b/include/hw/timer/cmsdk-apb-dualtimer.h
46
@@ -XXX,XX +XXX,XX @@
47
* https://developer.arm.com/products/system-design/system-design-kits/cortex-m-system-design-kit
48
*
49
* QEMU interface:
50
- * + QOM property "pclk-frq": frequency at which the timer is clocked
51
* + Clock input "TIMCLK": clock (for both timers)
52
* + sysbus MMIO region 0: the register bank
53
* + sysbus IRQ 0: combined timer interrupt TIMINTC
54
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBDualTimer {
55
/*< public >*/
56
MemoryRegion iomem;
57
qemu_irq timerintc;
58
- uint32_t pclk_frq;
59
Clock *timclk;
60
61
CMSDKAPBDualTimerModule timermod[CMSDK_APB_DUALTIMER_NUM_MODULES];
62
diff --git a/include/hw/timer/cmsdk-apb-timer.h b/include/hw/timer/cmsdk-apb-timer.h
63
index XXXXXXX..XXXXXXX 100644
64
--- a/include/hw/timer/cmsdk-apb-timer.h
65
+++ b/include/hw/timer/cmsdk-apb-timer.h
66
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(CMSDKAPBTimer, CMSDK_APB_TIMER)
67
68
/*
69
* QEMU interface:
70
- * + QOM property "pclk-frq": frequency at which the timer is clocked
71
* + Clock input "pclk": clock for the timer
72
* + sysbus MMIO region 0: the register bank
73
* + sysbus IRQ 0: timer interrupt TIMERINT
74
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBTimer {
75
/*< public >*/
76
MemoryRegion iomem;
77
qemu_irq timerint;
78
- uint32_t pclk_frq;
79
struct ptimer_state *timer;
80
Clock *pclk;
81
82
diff --git a/include/hw/watchdog/cmsdk-apb-watchdog.h b/include/hw/watchdog/cmsdk-apb-watchdog.h
83
index XXXXXXX..XXXXXXX 100644
84
--- a/include/hw/watchdog/cmsdk-apb-watchdog.h
85
+++ b/include/hw/watchdog/cmsdk-apb-watchdog.h
86
@@ -XXX,XX +XXX,XX @@
87
* https://developer.arm.com/products/system-design/system-design-kits/cortex-m-system-design-kit
88
*
89
* QEMU interface:
90
- * + QOM property "wdogclk-frq": frequency at which the watchdog is clocked
91
* + Clock input "WDOGCLK": clock for the watchdog's timer
92
* + sysbus MMIO region 0: the register bank
93
* + sysbus IRQ 0: watchdog interrupt
94
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBWatchdog {
95
/*< public >*/
96
MemoryRegion iomem;
97
qemu_irq wdogint;
98
- uint32_t wdogclk_frq;
99
bool is_luminary;
100
struct ptimer_state *timer;
101
Clock *wdogclk;
102
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
103
index XXXXXXX..XXXXXXX 100644
104
--- a/hw/arm/armsse.c
105
+++ b/hw/arm/armsse.c
106
@@ -XXX,XX +XXX,XX @@ static Property iotkit_properties[] = {
107
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
108
MemoryRegion *),
109
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
110
- DEFINE_PROP_UINT32("MAINCLK_FRQ", ARMSSE, mainclk_frq, 0),
111
DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
112
DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
113
DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], true),
114
@@ -XXX,XX +XXX,XX @@ static Property armsse_properties[] = {
115
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
116
MemoryRegion *),
117
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
118
- DEFINE_PROP_UINT32("MAINCLK_FRQ", ARMSSE, mainclk_frq, 0),
119
DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
120
DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
121
DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], false),
122
diff --git a/hw/timer/cmsdk-apb-dualtimer.c b/hw/timer/cmsdk-apb-dualtimer.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/hw/timer/cmsdk-apb-dualtimer.c
125
+++ b/hw/timer/cmsdk-apb-dualtimer.c
126
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_apb_dualtimer_vmstate = {
127
}
128
};
129
130
-static Property cmsdk_apb_dualtimer_properties[] = {
131
- DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBDualTimer, pclk_frq, 0),
132
- DEFINE_PROP_END_OF_LIST(),
133
-};
134
-
135
static void cmsdk_apb_dualtimer_class_init(ObjectClass *klass, void *data)
136
{
137
DeviceClass *dc = DEVICE_CLASS(klass);
138
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_class_init(ObjectClass *klass, void *data)
139
dc->realize = cmsdk_apb_dualtimer_realize;
140
dc->vmsd = &cmsdk_apb_dualtimer_vmstate;
141
dc->reset = cmsdk_apb_dualtimer_reset;
142
- device_class_set_props(dc, cmsdk_apb_dualtimer_properties);
143
}
27
}
144
28
145
static const TypeInfo cmsdk_apb_dualtimer_info = {
29
@@ -XXX,XX +XXX,XX @@ static void max111x_class_init(ObjectClass *klass, void *data)
146
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
30
147
index XXXXXXX..XXXXXXX 100644
31
k->transfer = max111x_transfer;
148
--- a/hw/timer/cmsdk-apb-timer.c
32
dc->reset = max111x_reset;
149
+++ b/hw/timer/cmsdk-apb-timer.c
33
+ dc->vmsd = &vmstate_max111x;
150
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_apb_timer_vmstate = {
151
}
152
};
153
154
-static Property cmsdk_apb_timer_properties[] = {
155
- DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBTimer, pclk_frq, 0),
156
- DEFINE_PROP_END_OF_LIST(),
157
-};
158
-
159
static void cmsdk_apb_timer_class_init(ObjectClass *klass, void *data)
160
{
161
DeviceClass *dc = DEVICE_CLASS(klass);
162
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_class_init(ObjectClass *klass, void *data)
163
dc->realize = cmsdk_apb_timer_realize;
164
dc->vmsd = &cmsdk_apb_timer_vmstate;
165
dc->reset = cmsdk_apb_timer_reset;
166
- device_class_set_props(dc, cmsdk_apb_timer_properties);
167
}
34
}
168
35
169
static const TypeInfo cmsdk_apb_timer_info = {
36
static const TypeInfo max111x_info = {
170
diff --git a/hw/watchdog/cmsdk-apb-watchdog.c b/hw/watchdog/cmsdk-apb-watchdog.c
171
index XXXXXXX..XXXXXXX 100644
172
--- a/hw/watchdog/cmsdk-apb-watchdog.c
173
+++ b/hw/watchdog/cmsdk-apb-watchdog.c
174
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_apb_watchdog_vmstate = {
175
}
176
};
177
178
-static Property cmsdk_apb_watchdog_properties[] = {
179
- DEFINE_PROP_UINT32("wdogclk-frq", CMSDKAPBWatchdog, wdogclk_frq, 0),
180
- DEFINE_PROP_END_OF_LIST(),
181
-};
182
-
183
static void cmsdk_apb_watchdog_class_init(ObjectClass *klass, void *data)
184
{
185
DeviceClass *dc = DEVICE_CLASS(klass);
186
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_class_init(ObjectClass *klass, void *data)
187
dc->realize = cmsdk_apb_watchdog_realize;
188
dc->vmsd = &cmsdk_apb_watchdog_vmstate;
189
dc->reset = cmsdk_apb_watchdog_reset;
190
- device_class_set_props(dc, cmsdk_apb_watchdog_properties);
191
}
192
193
static const TypeInfo cmsdk_apb_watchdog_info = {
194
--
37
--
195
2.20.1
38
2.20.1
196
39
197
40
diff view generated by jsdifflib
1
Switch the CMSDK APB watchdog device over to using its Clock input;
1
Add an ssi_realize_and_unref(), for the benefit of callers
2
the wdogclk_frq property is now ignored.
2
who want to be able to create an SSI device, set QOM properties
3
on it, and then do the realize-and-unref afterwards.
4
5
The API works on the same principle as the recently added
6
qdev_realize_and_undef(), sysbus_realize_and_undef(), etc.
3
7
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200628142429.17111-9-peter.maydell@linaro.org
8
Message-id: 20210128114145.20536-21-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-21-peter.maydell@linaro.org
10
---
12
---
11
hw/watchdog/cmsdk-apb-watchdog.c | 18 ++++++++++++++----
13
include/hw/ssi/ssi.h | 26 ++++++++++++++++++++++++++
12
1 file changed, 14 insertions(+), 4 deletions(-)
14
hw/ssi/ssi.c | 7 ++++++-
15
2 files changed, 32 insertions(+), 1 deletion(-)
13
16
14
diff --git a/hw/watchdog/cmsdk-apb-watchdog.c b/hw/watchdog/cmsdk-apb-watchdog.c
17
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/watchdog/cmsdk-apb-watchdog.c
19
--- a/include/hw/ssi/ssi.h
17
+++ b/hw/watchdog/cmsdk-apb-watchdog.c
20
+++ b/include/hw/ssi/ssi.h
18
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_reset(DeviceState *dev)
21
@@ -XXX,XX +XXX,XX @@ extern const VMStateDescription vmstate_ssi_slave;
19
ptimer_transaction_commit(s->timer);
20
}
22
}
21
23
22
+static void cmsdk_apb_watchdog_clk_update(void *opaque)
24
DeviceState *ssi_create_slave(SSIBus *bus, const char *name);
25
+/**
26
+ * ssi_realize_and_unref: realize and unref an SSI slave device
27
+ * @dev: SSI slave device to realize
28
+ * @bus: SSI bus to put it on
29
+ * @errp: error pointer
30
+ *
31
+ * Call 'realize' on @dev, put it on the specified @bus, and drop the
32
+ * reference to it. Errors are reported via @errp and by returning
33
+ * false.
34
+ *
35
+ * This function is useful if you have created @dev via qdev_new()
36
+ * (which takes a reference to the device it returns to you), so that
37
+ * you can set properties on it before realizing it. If you don't need
38
+ * to set properties then ssi_create_slave() is probably better (as it
39
+ * does the create, init and realize in one step).
40
+ *
41
+ * If you are embedding the SSI slave into another QOM device and
42
+ * initialized it via some variant on object_initialize_child() then
43
+ * do not use this function, because that family of functions arrange
44
+ * for the only reference to the child device to be held by the parent
45
+ * via the child<> property, and so the reference-count-drop done here
46
+ * would be incorrect. (Instead you would want ssi_realize(), which
47
+ * doesn't currently exist but would be trivial to create if we had
48
+ * any code that wanted it.)
49
+ */
50
+bool ssi_realize_and_unref(DeviceState *dev, SSIBus *bus, Error **errp);
51
52
/* Master interface. */
53
SSIBus *ssi_create_bus(DeviceState *parent, const char *name);
54
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/hw/ssi/ssi.c
57
+++ b/hw/ssi/ssi.c
58
@@ -XXX,XX +XXX,XX @@ static const TypeInfo ssi_slave_info = {
59
.abstract = true,
60
};
61
62
+bool ssi_realize_and_unref(DeviceState *dev, SSIBus *bus, Error **errp)
23
+{
63
+{
24
+ CMSDKAPBWatchdog *s = CMSDK_APB_WATCHDOG(opaque);
64
+ return qdev_realize_and_unref(dev, &bus->parent_obj, errp);
25
+
26
+ ptimer_transaction_begin(s->timer);
27
+ ptimer_set_period_from_clock(s->timer, s->wdogclk, 1);
28
+ ptimer_transaction_commit(s->timer);
29
+}
65
+}
30
+
66
+
31
static void cmsdk_apb_watchdog_init(Object *obj)
67
DeviceState *ssi_create_slave(SSIBus *bus, const char *name)
32
{
68
{
33
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
69
DeviceState *dev = qdev_new(name);
34
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_init(Object *obj)
70
35
s, "cmsdk-apb-watchdog", 0x1000);
71
- qdev_realize_and_unref(dev, &bus->parent_obj, &error_fatal);
36
sysbus_init_mmio(sbd, &s->iomem);
72
+ ssi_realize_and_unref(dev, bus, &error_fatal);
37
sysbus_init_irq(sbd, &s->wdogint);
73
return dev;
38
- s->wdogclk = qdev_init_clock_in(DEVICE(s), "WDOGCLK", NULL, NULL);
39
+ s->wdogclk = qdev_init_clock_in(DEVICE(s), "WDOGCLK",
40
+ cmsdk_apb_watchdog_clk_update, s);
41
42
s->is_luminary = false;
43
s->id = cmsdk_apb_watchdog_id;
44
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_realize(DeviceState *dev, Error **errp)
45
{
46
CMSDKAPBWatchdog *s = CMSDK_APB_WATCHDOG(dev);
47
48
- if (s->wdogclk_frq == 0) {
49
+ if (!clock_has_source(s->wdogclk)) {
50
error_setg(errp,
51
- "CMSDK APB watchdog: wdogclk-frq property must be set");
52
+ "CMSDK APB watchdog: WDOGCLK clock must be connected");
53
return;
54
}
55
56
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_realize(DeviceState *dev, Error **errp)
57
PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
58
59
ptimer_transaction_begin(s->timer);
60
- ptimer_set_freq(s->timer, s->wdogclk_frq);
61
+ ptimer_set_period_from_clock(s->timer, s->wdogclk, 1);
62
ptimer_transaction_commit(s->timer);
63
}
74
}
64
75
65
--
76
--
66
2.20.1
77
2.20.1
67
78
68
79
diff view generated by jsdifflib
1
Add a simple test of the CMSDK APB timer, since we're about to do
1
Use the new max111x qdev properties to set the initial input
2
some refactoring of how it is clocked.
2
values rather than calling max111x_set_input(); this means that
3
on system reset the inputs will correctly return to their initial
4
values.
3
5
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Message-id: 20200628142429.17111-10-peter.maydell@linaro.org
7
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210128114145.20536-4-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-4-peter.maydell@linaro.org
10
---
9
---
11
tests/qtest/cmsdk-apb-timer-test.c | 75 ++++++++++++++++++++++++++++++
10
hw/arm/spitz.c | 11 +++++++----
12
MAINTAINERS | 1 +
11
1 file changed, 7 insertions(+), 4 deletions(-)
13
tests/qtest/meson.build | 1 +
14
3 files changed, 77 insertions(+)
15
create mode 100644 tests/qtest/cmsdk-apb-timer-test.c
16
12
17
diff --git a/tests/qtest/cmsdk-apb-timer-test.c b/tests/qtest/cmsdk-apb-timer-test.c
13
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
18
new file mode 100644
19
index XXXXXXX..XXXXXXX
20
--- /dev/null
21
+++ b/tests/qtest/cmsdk-apb-timer-test.c
22
@@ -XXX,XX +XXX,XX @@
23
+/*
24
+ * QTest testcase for the CMSDK APB timer device
25
+ *
26
+ * Copyright (c) 2021 Linaro Limited
27
+ *
28
+ * This program is free software; you can redistribute it and/or modify it
29
+ * under the terms of the GNU General Public License as published by the
30
+ * Free Software Foundation; either version 2 of the License, or
31
+ * (at your option) any later version.
32
+ *
33
+ * This program is distributed in the hope that it will be useful, but WITHOUT
34
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
35
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
36
+ * for more details.
37
+ */
38
+
39
+#include "qemu/osdep.h"
40
+#include "libqtest-single.h"
41
+
42
+/* IoTKit/ARMSSE-200 timer0; driven at 25MHz in mps2-an385, so 40ns per tick */
43
+#define TIMER_BASE 0x40000000
44
+
45
+#define CTRL 0
46
+#define VALUE 4
47
+#define RELOAD 8
48
+#define INTSTATUS 0xc
49
+
50
+static void test_timer(void)
51
+{
52
+ g_assert_true(readl(TIMER_BASE + INTSTATUS) == 0);
53
+
54
+ /* Start timer: will fire after 40 * 1000 == 40000 ns */
55
+ writel(TIMER_BASE + RELOAD, 1000);
56
+ writel(TIMER_BASE + CTRL, 9);
57
+
58
+ /* Step to just past the 500th tick and check VALUE */
59
+ clock_step(40 * 500 + 1);
60
+ g_assert_cmpuint(readl(TIMER_BASE + INTSTATUS), ==, 0);
61
+ g_assert_cmpuint(readl(TIMER_BASE + VALUE), ==, 500);
62
+
63
+ /* Just past the 1000th tick: timer should have fired */
64
+ clock_step(40 * 500);
65
+ g_assert_cmpuint(readl(TIMER_BASE + INTSTATUS), ==, 1);
66
+ g_assert_cmpuint(readl(TIMER_BASE + VALUE), ==, 0);
67
+
68
+ /* VALUE reloads at the following tick */
69
+ clock_step(40);
70
+ g_assert_cmpuint(readl(TIMER_BASE + VALUE), ==, 1000);
71
+
72
+ /* Check write-1-to-clear behaviour of INTSTATUS */
73
+ writel(TIMER_BASE + INTSTATUS, 0);
74
+ g_assert_cmpuint(readl(TIMER_BASE + INTSTATUS), ==, 1);
75
+ writel(TIMER_BASE + INTSTATUS, 1);
76
+ g_assert_cmpuint(readl(TIMER_BASE + INTSTATUS), ==, 0);
77
+
78
+ /* Turn off the timer */
79
+ writel(TIMER_BASE + CTRL, 0);
80
+}
81
+
82
+int main(int argc, char **argv)
83
+{
84
+ int r;
85
+
86
+ g_test_init(&argc, &argv, NULL);
87
+
88
+ qtest_start("-machine mps2-an385");
89
+
90
+ qtest_add_func("/cmsdk-apb-timer/timer", test_timer);
91
+
92
+ r = g_test_run();
93
+
94
+ qtest_end();
95
+
96
+ return r;
97
+}
98
diff --git a/MAINTAINERS b/MAINTAINERS
99
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
100
--- a/MAINTAINERS
15
--- a/hw/arm/spitz.c
101
+++ b/MAINTAINERS
16
+++ b/hw/arm/spitz.c
102
@@ -XXX,XX +XXX,XX @@ F: include/hw/rtc/pl031.h
17
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
103
F: include/hw/arm/primecell.h
18
qdev_get_gpio_in(sms->mpu->gpio, SPITZ_GPIO_TP_INT));
104
F: hw/timer/cmsdk-apb-timer.c
19
105
F: include/hw/timer/cmsdk-apb-timer.h
20
bus = qdev_get_child_bus(sms->mux, "ssi2");
106
+F: tests/qtest/cmsdk-apb-timer-test.c
21
- sms->max1111 = ssi_create_slave(bus, "max1111");
107
F: hw/timer/cmsdk-apb-dualtimer.c
22
+ sms->max1111 = qdev_new("max1111");
108
F: include/hw/timer/cmsdk-apb-dualtimer.h
23
max1111 = sms->max1111;
109
F: hw/char/cmsdk-apb-uart.c
24
- max111x_set_input(sms->max1111, MAX1111_BATT_VOLT, SPITZ_BATTERY_VOLT);
110
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
25
- max111x_set_input(sms->max1111, MAX1111_BATT_TEMP, 0);
111
index XXXXXXX..XXXXXXX 100644
26
- max111x_set_input(sms->max1111, MAX1111_ACIN_VOLT, SPITZ_CHARGEON_ACIN);
112
--- a/tests/qtest/meson.build
27
+ qdev_prop_set_uint8(sms->max1111, "input1" /* BATT_VOLT */,
113
+++ b/tests/qtest/meson.build
28
+ SPITZ_BATTERY_VOLT);
114
@@ -XXX,XX +XXX,XX @@ qtests_npcm7xx = \
29
+ qdev_prop_set_uint8(sms->max1111, "input2" /* BATT_TEMP */, 0);
115
'npcm7xx_timer-test',
30
+ qdev_prop_set_uint8(sms->max1111, "input3" /* ACIN_VOLT */,
116
'npcm7xx_watchdog_timer-test']
31
+ SPITZ_CHARGEON_ACIN);
117
qtests_arm = \
32
+ ssi_realize_and_unref(sms->max1111, bus, &error_fatal);
118
+ (config_all_devices.has_key('CONFIG_CMSDK_APB_TIMER') ? ['cmsdk-apb-timer-test'] : []) + \
33
119
(config_all_devices.has_key('CONFIG_PFLASH_CFI02') ? ['pflash-cfi02-test'] : []) + \
34
qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_LCDCON_CS,
120
(config_all_devices.has_key('CONFIG_NPCM7XX') ? qtests_npcm7xx : []) + \
35
qdev_get_gpio_in(sms->mux, 0));
121
['arm-cpu-features',
122
--
36
--
123
2.20.1
37
2.20.1
124
38
125
39
diff view generated by jsdifflib
1
Convert the SSYS code in the Stellaris boards (which encapsulates the
1
The max111x ADC device model allows other code to set the level on
2
system registers) to a proper QOM device. This will provide us with
2
the 8 ADC inputs using the max111x_set_input() function. Replace
3
somewhere to put the output Clock whose frequency depends on the
3
this with generic qdev GPIO inputs, which also allow inputs to be set
4
setting of the PLL configuration registers.
4
to arbitrary values.
5
5
6
This is a migration compatibility break for lm3s811evb, lm3s6965evb.
6
Using GPIO lines will make it easier for board code to wire things
7
7
up, so that if device A wants to set the ADC input it doesn't need to
8
We use 3-phase reset here because the Clock will need to propagate
8
have a direct pointer to the max111x but can just set that value on
9
its value in the hold phase.
9
its output GPIO, which is then wired up by the board to the
10
10
appropriate max111x input.
11
For the moment we reset the device during the board creation so that
12
the system_clock_scale global gets set; this will be removed in a
13
subsequent commit.
14
11
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Luc Michel <luc@lmichel.fr>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
17
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20200628142429.17111-11-peter.maydell@linaro.org
18
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Message-id: 20210128114145.20536-17-peter.maydell@linaro.org
20
Message-id: 20210121190622.22000-17-peter.maydell@linaro.org
21
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
22
---
15
---
23
hw/arm/stellaris.c | 132 ++++++++++++++++++++++++++++++++++++---------
16
include/hw/ssi/ssi.h | 3 ---
24
1 file changed, 107 insertions(+), 25 deletions(-)
17
hw/arm/spitz.c | 9 +++++----
18
hw/misc/max111x.c | 16 +++++++++-------
19
3 files changed, 14 insertions(+), 14 deletions(-)
25
20
26
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
21
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
27
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/arm/stellaris.c
23
--- a/include/hw/ssi/ssi.h
29
+++ b/hw/arm/stellaris.c
24
+++ b/include/hw/ssi/ssi.h
30
@@ -XXX,XX +XXX,XX @@ static void stellaris_gptm_realize(DeviceState *dev, Error **errp)
25
@@ -XXX,XX +XXX,XX @@ SSIBus *ssi_create_bus(DeviceState *parent, const char *name);
31
26
32
/* System controller. */
27
uint32_t ssi_transfer(SSIBus *bus, uint32_t val);
33
28
34
-typedef struct {
29
-/* max111x.c */
35
+#define TYPE_STELLARIS_SYS "stellaris-sys"
30
-void max111x_set_input(DeviceState *dev, int line, uint8_t value);
36
+OBJECT_DECLARE_SIMPLE_TYPE(ssys_state, STELLARIS_SYS)
31
-
32
#endif
33
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/spitz.c
36
+++ b/hw/arm/spitz.c
37
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
38
39
static void spitz_adc_temp_on(void *opaque, int line, int level)
40
{
41
+ int batt_temp;
37
+
42
+
38
+struct ssys_state {
43
if (!max1111)
39
+ SysBusDevice parent_obj;
44
return;
45
46
- if (level)
47
- max111x_set_input(max1111, MAX1111_BATT_TEMP, SPITZ_BATTERY_TEMP);
48
- else
49
- max111x_set_input(max1111, MAX1111_BATT_TEMP, 0);
50
+ batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
40
+
51
+
41
MemoryRegion iomem;
52
+ qemu_set_irq(qdev_get_gpio_in(max1111, MAX1111_BATT_TEMP), batt_temp);
42
uint32_t pborctl;
53
}
43
uint32_t ldopctl;
54
44
@@ -XXX,XX +XXX,XX @@ typedef struct {
55
static void corgi_ssp_realize(SSISlave *d, Error **errp)
45
uint32_t dcgc[3];
56
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
46
uint32_t clkvclr;
57
index XXXXXXX..XXXXXXX 100644
47
uint32_t ldoarst;
58
--- a/hw/misc/max111x.c
48
+ qemu_irq irq;
59
+++ b/hw/misc/max111x.c
49
+ /* Properties (all read-only registers) */
60
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_max111x = {
50
uint32_t user0;
61
}
51
uint32_t user1;
52
- qemu_irq irq;
53
- stellaris_board_info *board;
54
-} ssys_state;
55
+ uint32_t did0;
56
+ uint32_t did1;
57
+ uint32_t dc0;
58
+ uint32_t dc1;
59
+ uint32_t dc2;
60
+ uint32_t dc3;
61
+ uint32_t dc4;
62
+};
63
64
static void ssys_update(ssys_state *s)
65
{
66
@@ -XXX,XX +XXX,XX @@ static uint32_t pllcfg_fury[16] = {
67
68
static int ssys_board_class(const ssys_state *s)
69
{
70
- uint32_t did0 = s->board->did0;
71
+ uint32_t did0 = s->did0;
72
switch (did0 & DID0_VER_MASK) {
73
case DID0_VER_0:
74
return DID0_CLASS_SANDSTORM;
75
@@ -XXX,XX +XXX,XX @@ static uint64_t ssys_read(void *opaque, hwaddr offset,
76
77
switch (offset) {
78
case 0x000: /* DID0 */
79
- return s->board->did0;
80
+ return s->did0;
81
case 0x004: /* DID1 */
82
- return s->board->did1;
83
+ return s->did1;
84
case 0x008: /* DC0 */
85
- return s->board->dc0;
86
+ return s->dc0;
87
case 0x010: /* DC1 */
88
- return s->board->dc1;
89
+ return s->dc1;
90
case 0x014: /* DC2 */
91
- return s->board->dc2;
92
+ return s->dc2;
93
case 0x018: /* DC3 */
94
- return s->board->dc3;
95
+ return s->dc3;
96
case 0x01c: /* DC4 */
97
- return s->board->dc4;
98
+ return s->dc4;
99
case 0x030: /* PBORCTL */
100
return s->pborctl;
101
case 0x034: /* LDOPCTL */
102
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps ssys_ops = {
103
.endianness = DEVICE_NATIVE_ENDIAN,
104
};
62
};
105
63
106
-static void ssys_reset(void *opaque)
64
+static void max111x_input_set(void *opaque, int line, int value)
107
+static void stellaris_sys_reset_enter(Object *obj, ResetType type)
65
+{
108
{
66
+ MAX111xState *s = MAX_111X(opaque);
109
- ssys_state *s = (ssys_state *)opaque;
67
+
110
+ ssys_state *s = STELLARIS_SYS(obj);
68
+ assert(line >= 0 && line < s->inputs);
111
69
+ s->input[line] = value;
112
s->pborctl = 0x7ffd;
113
s->rcc = 0x078e3ac0;
114
@@ -XXX,XX +XXX,XX @@ static void ssys_reset(void *opaque)
115
s->rcgc[0] = 1;
116
s->scgc[0] = 1;
117
s->dcgc[0] = 1;
118
+}
70
+}
119
+
71
+
120
+static void stellaris_sys_reset_hold(Object *obj)
72
static int max111x_init(SSISlave *d, int inputs)
121
+{
73
{
122
+ ssys_state *s = STELLARIS_SYS(obj);
74
DeviceState *dev = DEVICE(d);
123
+
75
MAX111xState *s = MAX_111X(dev);
124
ssys_calculate_system_clock(s);
76
77
qdev_init_gpio_out(dev, &s->interrupt, 1);
78
+ qdev_init_gpio_in(dev, max111x_input_set, inputs);
79
80
s->inputs = inputs;
81
82
@@ -XXX,XX +XXX,XX @@ static void max1111_realize(SSISlave *dev, Error **errp)
83
max111x_init(dev, 4);
125
}
84
}
126
85
127
+static void stellaris_sys_reset_exit(Object *obj)
86
-void max111x_set_input(DeviceState *dev, int line, uint8_t value)
128
+{
87
-{
129
+}
88
- MAX111xState *s = MAX_111X(dev);
130
+
89
- assert(line >= 0 && line < s->inputs);
131
static int stellaris_sys_post_load(void *opaque, int version_id)
90
- s->input[line] = value;
91
-}
92
-
93
static void max111x_reset(DeviceState *dev)
132
{
94
{
133
ssys_state *s = opaque;
95
MAX111xState *s = MAX_111X(dev);
134
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_stellaris_sys = {
135
}
136
};
137
138
+static Property stellaris_sys_properties[] = {
139
+ DEFINE_PROP_UINT32("user0", ssys_state, user0, 0),
140
+ DEFINE_PROP_UINT32("user1", ssys_state, user1, 0),
141
+ DEFINE_PROP_UINT32("did0", ssys_state, did0, 0),
142
+ DEFINE_PROP_UINT32("did1", ssys_state, did1, 0),
143
+ DEFINE_PROP_UINT32("dc0", ssys_state, dc0, 0),
144
+ DEFINE_PROP_UINT32("dc1", ssys_state, dc1, 0),
145
+ DEFINE_PROP_UINT32("dc2", ssys_state, dc2, 0),
146
+ DEFINE_PROP_UINT32("dc3", ssys_state, dc3, 0),
147
+ DEFINE_PROP_UINT32("dc4", ssys_state, dc4, 0),
148
+ DEFINE_PROP_END_OF_LIST()
149
+};
150
+
151
+static void stellaris_sys_instance_init(Object *obj)
152
+{
153
+ ssys_state *s = STELLARIS_SYS(obj);
154
+ SysBusDevice *sbd = SYS_BUS_DEVICE(s);
155
+
156
+ memory_region_init_io(&s->iomem, obj, &ssys_ops, s, "ssys", 0x00001000);
157
+ sysbus_init_mmio(sbd, &s->iomem);
158
+ sysbus_init_irq(sbd, &s->irq);
159
+}
160
+
161
static int stellaris_sys_init(uint32_t base, qemu_irq irq,
162
stellaris_board_info * board,
163
uint8_t *macaddr)
164
{
165
- ssys_state *s;
166
+ DeviceState *dev = qdev_new(TYPE_STELLARIS_SYS);
167
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
168
169
- s = g_new0(ssys_state, 1);
170
- s->irq = irq;
171
- s->board = board;
172
/* Most devices come preprogrammed with a MAC address in the user data. */
173
- s->user0 = macaddr[0] | (macaddr[1] << 8) | (macaddr[2] << 16);
174
- s->user1 = macaddr[3] | (macaddr[4] << 8) | (macaddr[5] << 16);
175
+ qdev_prop_set_uint32(dev, "user0",
176
+ macaddr[0] | (macaddr[1] << 8) | (macaddr[2] << 16));
177
+ qdev_prop_set_uint32(dev, "user1",
178
+ macaddr[3] | (macaddr[4] << 8) | (macaddr[5] << 16));
179
+ qdev_prop_set_uint32(dev, "did0", board->did0);
180
+ qdev_prop_set_uint32(dev, "did1", board->did1);
181
+ qdev_prop_set_uint32(dev, "dc0", board->dc0);
182
+ qdev_prop_set_uint32(dev, "dc1", board->dc1);
183
+ qdev_prop_set_uint32(dev, "dc2", board->dc2);
184
+ qdev_prop_set_uint32(dev, "dc3", board->dc3);
185
+ qdev_prop_set_uint32(dev, "dc4", board->dc4);
186
+
187
+ sysbus_realize_and_unref(sbd, &error_fatal);
188
+ sysbus_mmio_map(sbd, 0, base);
189
+ sysbus_connect_irq(sbd, 0, irq);
190
+
191
+ /*
192
+ * Normally we should not be resetting devices like this during
193
+ * board creation. For the moment we need to do so, because
194
+ * system_clock_scale will only get set when the STELLARIS_SYS
195
+ * device is reset, and we need its initial value to pass to
196
+ * the watchdog device. This hack can be removed once the
197
+ * watchdog has been converted to use a Clock input instead.
198
+ */
199
+ device_cold_reset(dev);
200
201
- memory_region_init_io(&s->iomem, NULL, &ssys_ops, s, "ssys", 0x00001000);
202
- memory_region_add_subregion(get_system_memory(), base, &s->iomem);
203
- ssys_reset(s);
204
- vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY, &vmstate_stellaris_sys, s);
205
return 0;
206
}
207
208
-
209
/* I2C controller. */
210
211
#define TYPE_STELLARIS_I2C "stellaris-i2c"
212
@@ -XXX,XX +XXX,XX @@ static const TypeInfo stellaris_adc_info = {
213
.class_init = stellaris_adc_class_init,
214
};
215
216
+static void stellaris_sys_class_init(ObjectClass *klass, void *data)
217
+{
218
+ DeviceClass *dc = DEVICE_CLASS(klass);
219
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
220
+
221
+ dc->vmsd = &vmstate_stellaris_sys;
222
+ rc->phases.enter = stellaris_sys_reset_enter;
223
+ rc->phases.hold = stellaris_sys_reset_hold;
224
+ rc->phases.exit = stellaris_sys_reset_exit;
225
+ device_class_set_props(dc, stellaris_sys_properties);
226
+}
227
+
228
+static const TypeInfo stellaris_sys_info = {
229
+ .name = TYPE_STELLARIS_SYS,
230
+ .parent = TYPE_SYS_BUS_DEVICE,
231
+ .instance_size = sizeof(ssys_state),
232
+ .instance_init = stellaris_sys_instance_init,
233
+ .class_init = stellaris_sys_class_init,
234
+};
235
+
236
static void stellaris_register_types(void)
237
{
238
type_register_static(&stellaris_i2c_info);
239
type_register_static(&stellaris_gptm_info);
240
type_register_static(&stellaris_adc_info);
241
+ type_register_static(&stellaris_sys_info);
242
}
243
244
type_init(stellaris_register_types)
245
--
96
--
246
2.20.1
97
2.20.1
247
98
248
99
diff view generated by jsdifflib
1
Add a simple test of the CMSDK watchdog, since we're about to do some
1
Create a header file for the hw/misc/max111x device, in the
2
refactoring of how it is clocked.
2
usual modern style for QOM devices:
3
* definition of the TYPE_ constants and macros
4
* definition of the device's state struct so that it can
5
be embedded in other structs if desired
6
* documentation of the interface
7
8
This allows us to use TYPE_MAX_1111 in the spitz.c code rather
9
than the string "max1111".
3
10
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Luc Michel <luc@lmichel.fr>
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210128114145.20536-5-peter.maydell@linaro.org
13
Message-id: 20200628142429.17111-12-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-5-peter.maydell@linaro.org
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
---
14
---
12
tests/qtest/cmsdk-apb-watchdog-test.c | 79 +++++++++++++++++++++++++++
15
include/hw/misc/max111x.h | 56 +++++++++++++++++++++++++++++++++++++++
13
MAINTAINERS | 1 +
16
hw/arm/spitz.c | 3 ++-
14
tests/qtest/meson.build | 1 +
17
hw/misc/max111x.c | 24 +----------------
15
3 files changed, 81 insertions(+)
18
MAINTAINERS | 1 +
16
create mode 100644 tests/qtest/cmsdk-apb-watchdog-test.c
19
4 files changed, 60 insertions(+), 24 deletions(-)
20
create mode 100644 include/hw/misc/max111x.h
17
21
18
diff --git a/tests/qtest/cmsdk-apb-watchdog-test.c b/tests/qtest/cmsdk-apb-watchdog-test.c
22
diff --git a/include/hw/misc/max111x.h b/include/hw/misc/max111x.h
19
new file mode 100644
23
new file mode 100644
20
index XXXXXXX..XXXXXXX
24
index XXXXXXX..XXXXXXX
21
--- /dev/null
25
--- /dev/null
22
+++ b/tests/qtest/cmsdk-apb-watchdog-test.c
26
+++ b/include/hw/misc/max111x.h
23
@@ -XXX,XX +XXX,XX @@
27
@@ -XXX,XX +XXX,XX @@
24
+/*
28
+/*
25
+ * QTest testcase for the CMSDK APB watchdog device
29
+ * Maxim MAX1110/1111 ADC chip emulation.
26
+ *
30
+ *
27
+ * Copyright (c) 2021 Linaro Limited
31
+ * Copyright (c) 2006 Openedhand Ltd.
32
+ * Written by Andrzej Zaborowski <balrog@zabor.org>
28
+ *
33
+ *
29
+ * This program is free software; you can redistribute it and/or modify it
34
+ * This code is licensed under the GNU GPLv2.
30
+ * under the terms of the GNU General Public License as published by the
31
+ * Free Software Foundation; either version 2 of the License, or
32
+ * (at your option) any later version.
33
+ *
35
+ *
34
+ * This program is distributed in the hope that it will be useful, but WITHOUT
36
+ * Contributions after 2012-01-13 are licensed under the terms of the
35
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37
+ * GNU GPL, version 2 or (at your option) any later version.
36
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37
+ * for more details.
38
+ */
38
+ */
39
+
39
+
40
+#include "qemu/osdep.h"
40
+#ifndef HW_MISC_MAX111X_H
41
+#include "libqtest-single.h"
41
+#define HW_MISC_MAX111X_H
42
+
43
+#include "hw/ssi/ssi.h"
42
+
44
+
43
+/*
45
+/*
44
+ * lm3s811evb watchdog; at board startup this runs at 200MHz / 16 == 12.5MHz,
46
+ * This is a model of the Maxim MAX1110/1111 ADC chip, which for QEMU
45
+ * which is 80ns per tick.
47
+ * is an SSI slave device. It has either 4 (max1110) or 8 (max1111)
48
+ * 8-bit ADC channels.
49
+ *
50
+ * QEMU interface:
51
+ * + GPIO inputs 0..3 (for max1110) or 0..7 (for max1111): set the value
52
+ * of each ADC input, as an unsigned 8-bit value
53
+ * + GPIO output 0: interrupt line
54
+ * + Properties "input0" to "input3" (max1110) or "input0" to "input7"
55
+ * (max1111): initial reset values for ADC inputs.
56
+ *
57
+ * Known bugs:
58
+ * + the interrupt line is not correctly implemented, and will never
59
+ * be lowered once it has been asserted.
46
+ */
60
+ */
47
+#define WDOG_BASE 0x40000000
61
+typedef struct {
62
+ SSISlave parent_obj;
48
+
63
+
49
+#define WDOGLOAD 0
64
+ qemu_irq interrupt;
50
+#define WDOGVALUE 4
65
+ /* Values of inputs at system reset (settable by QOM property) */
51
+#define WDOGCONTROL 8
66
+ uint8_t reset_input[8];
52
+#define WDOGINTCLR 0xc
53
+#define WDOGRIS 0x10
54
+#define WDOGMIS 0x14
55
+#define WDOGLOCK 0xc00
56
+
67
+
57
+static void test_watchdog(void)
68
+ uint8_t tb1, rb2, rb3;
58
+{
69
+ int cycle;
59
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
60
+
70
+
61
+ writel(WDOG_BASE + WDOGCONTROL, 1);
71
+ uint8_t input[8];
62
+ writel(WDOG_BASE + WDOGLOAD, 1000);
72
+ int inputs, com;
73
+} MAX111xState;
63
+
74
+
64
+ /* Step to just past the 500th tick */
75
+#define TYPE_MAX_111X "max111x"
65
+ clock_step(500 * 80 + 1);
66
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
67
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
68
+
76
+
69
+ /* Just past the 1000th tick: timer should have fired */
77
+#define MAX_111X(obj) \
70
+ clock_step(500 * 80);
78
+ OBJECT_CHECK(MAX111xState, (obj), TYPE_MAX_111X)
71
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
72
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 0);
73
+
79
+
74
+ /* VALUE reloads at following tick */
80
+#define TYPE_MAX_1110 "max1110"
75
+ clock_step(80);
81
+#define TYPE_MAX_1111 "max1111"
76
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
77
+
82
+
78
+ /* Writing any value to WDOGINTCLR clears the interrupt and reloads */
83
+#endif
79
+ clock_step(500 * 80);
84
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
80
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
85
index XXXXXXX..XXXXXXX 100644
81
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
86
--- a/hw/arm/spitz.c
82
+ writel(WDOG_BASE + WDOGINTCLR, 0);
87
+++ b/hw/arm/spitz.c
83
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
88
@@ -XXX,XX +XXX,XX @@
84
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
89
#include "audio/audio.h"
85
+}
90
#include "hw/boards.h"
86
+
91
#include "hw/sysbus.h"
87
+int main(int argc, char **argv)
92
+#include "hw/misc/max111x.h"
88
+{
93
#include "migration/vmstate.h"
89
+ int r;
94
#include "exec/address-spaces.h"
90
+
95
#include "cpu.h"
91
+ g_test_init(&argc, &argv, NULL);
96
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
92
+
97
qdev_get_gpio_in(sms->mpu->gpio, SPITZ_GPIO_TP_INT));
93
+ qtest_start("-machine lm3s811evb");
98
94
+
99
bus = qdev_get_child_bus(sms->mux, "ssi2");
95
+ qtest_add_func("/cmsdk-apb-watchdog/watchdog", test_watchdog);
100
- sms->max1111 = qdev_new("max1111");
96
+
101
+ sms->max1111 = qdev_new(TYPE_MAX_1111);
97
+ r = g_test_run();
102
max1111 = sms->max1111;
98
+
103
qdev_prop_set_uint8(sms->max1111, "input1" /* BATT_VOLT */,
99
+ qtest_end();
104
SPITZ_BATTERY_VOLT);
100
+
105
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
101
+ return r;
106
index XXXXXXX..XXXXXXX 100644
102
+}
107
--- a/hw/misc/max111x.c
108
+++ b/hw/misc/max111x.c
109
@@ -XXX,XX +XXX,XX @@
110
*/
111
112
#include "qemu/osdep.h"
113
+#include "hw/misc/max111x.h"
114
#include "hw/irq.h"
115
-#include "hw/ssi/ssi.h"
116
#include "migration/vmstate.h"
117
#include "qemu/module.h"
118
#include "hw/qdev-properties.h"
119
120
-typedef struct {
121
- SSISlave parent_obj;
122
-
123
- qemu_irq interrupt;
124
- /* Values of inputs at system reset (settable by QOM property) */
125
- uint8_t reset_input[8];
126
-
127
- uint8_t tb1, rb2, rb3;
128
- int cycle;
129
-
130
- uint8_t input[8];
131
- int inputs, com;
132
-} MAX111xState;
133
-
134
-#define TYPE_MAX_111X "max111x"
135
-
136
-#define MAX_111X(obj) \
137
- OBJECT_CHECK(MAX111xState, (obj), TYPE_MAX_111X)
138
-
139
-#define TYPE_MAX_1110 "max1110"
140
-#define TYPE_MAX_1111 "max1111"
141
-
142
/* Control-byte bitfields */
143
#define CB_PD0        (1 << 0)
144
#define CB_PD1        (1 << 1)
103
diff --git a/MAINTAINERS b/MAINTAINERS
145
diff --git a/MAINTAINERS b/MAINTAINERS
104
index XXXXXXX..XXXXXXX 100644
146
index XXXXXXX..XXXXXXX 100644
105
--- a/MAINTAINERS
147
--- a/MAINTAINERS
106
+++ b/MAINTAINERS
148
+++ b/MAINTAINERS
107
@@ -XXX,XX +XXX,XX @@ F: hw/char/cmsdk-apb-uart.c
149
@@ -XXX,XX +XXX,XX @@ F: hw/gpio/max7310.c
108
F: include/hw/char/cmsdk-apb-uart.h
150
F: hw/gpio/zaurus.c
109
F: hw/watchdog/cmsdk-apb-watchdog.c
151
F: hw/misc/mst_fpga.c
110
F: include/hw/watchdog/cmsdk-apb-watchdog.h
152
F: hw/misc/max111x.c
111
+F: tests/qtest/cmsdk-apb-watchdog-test.c
153
+F: include/hw/misc/max111x.h
112
F: hw/misc/tz-ppc.c
154
F: include/hw/arm/pxa.h
113
F: include/hw/misc/tz-ppc.h
155
F: include/hw/arm/sharpsl.h
114
F: hw/misc/tz-mpc.c
156
F: include/hw/display/tc6393xb.h
115
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
116
index XXXXXXX..XXXXXXX 100644
117
--- a/tests/qtest/meson.build
118
+++ b/tests/qtest/meson.build
119
@@ -XXX,XX +XXX,XX @@ qtests_npcm7xx = \
120
'npcm7xx_watchdog_timer-test']
121
qtests_arm = \
122
(config_all_devices.has_key('CONFIG_CMSDK_APB_TIMER') ? ['cmsdk-apb-timer-test'] : []) + \
123
+ (config_all_devices.has_key('CONFIG_CMSDK_APB_WATCHDOG') ? ['cmsdk-apb-watchdog-test'] : []) + \
124
(config_all_devices.has_key('CONFIG_PFLASH_CFI02') ? ['pflash-cfi02-test'] : []) + \
125
(config_all_devices.has_key('CONFIG_NPCM7XX') ? qtests_npcm7xx : []) + \
126
['arm-cpu-features',
127
--
157
--
128
2.20.1
158
2.20.1
129
159
130
160
diff view generated by jsdifflib
Deleted patch
1
Add a simple test of the CMSDK dual timer, since we're about to do
2
some refactoring of how it is clocked.
3
1
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Message-id: 20210128114145.20536-6-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-6-peter.maydell@linaro.org
10
---
11
tests/qtest/cmsdk-apb-dualtimer-test.c | 130 +++++++++++++++++++++++++
12
MAINTAINERS | 1 +
13
tests/qtest/meson.build | 1 +
14
3 files changed, 132 insertions(+)
15
create mode 100644 tests/qtest/cmsdk-apb-dualtimer-test.c
16
17
diff --git a/tests/qtest/cmsdk-apb-dualtimer-test.c b/tests/qtest/cmsdk-apb-dualtimer-test.c
18
new file mode 100644
19
index XXXXXXX..XXXXXXX
20
--- /dev/null
21
+++ b/tests/qtest/cmsdk-apb-dualtimer-test.c
22
@@ -XXX,XX +XXX,XX @@
23
+/*
24
+ * QTest testcase for the CMSDK APB dualtimer device
25
+ *
26
+ * Copyright (c) 2021 Linaro Limited
27
+ *
28
+ * This program is free software; you can redistribute it and/or modify it
29
+ * under the terms of the GNU General Public License as published by the
30
+ * Free Software Foundation; either version 2 of the License, or
31
+ * (at your option) any later version.
32
+ *
33
+ * This program is distributed in the hope that it will be useful, but WITHOUT
34
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
35
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
36
+ * for more details.
37
+ */
38
+
39
+#include "qemu/osdep.h"
40
+#include "libqtest-single.h"
41
+
42
+/* IoTKit/ARMSSE dualtimer; driven at 25MHz in mps2-an385, so 40ns per tick */
43
+#define TIMER_BASE 0x40002000
44
+
45
+#define TIMER1LOAD 0
46
+#define TIMER1VALUE 4
47
+#define TIMER1CONTROL 8
48
+#define TIMER1INTCLR 0xc
49
+#define TIMER1RIS 0x10
50
+#define TIMER1MIS 0x14
51
+#define TIMER1BGLOAD 0x18
52
+
53
+#define TIMER2LOAD 0x20
54
+#define TIMER2VALUE 0x24
55
+#define TIMER2CONTROL 0x28
56
+#define TIMER2INTCLR 0x2c
57
+#define TIMER2RIS 0x30
58
+#define TIMER2MIS 0x34
59
+#define TIMER2BGLOAD 0x38
60
+
61
+#define CTRL_ENABLE (1 << 7)
62
+#define CTRL_PERIODIC (1 << 6)
63
+#define CTRL_INTEN (1 << 5)
64
+#define CTRL_PRESCALE_1 (0 << 2)
65
+#define CTRL_PRESCALE_16 (1 << 2)
66
+#define CTRL_PRESCALE_256 (2 << 2)
67
+#define CTRL_32BIT (1 << 1)
68
+#define CTRL_ONESHOT (1 << 0)
69
+
70
+static void test_dualtimer(void)
71
+{
72
+ g_assert_true(readl(TIMER_BASE + TIMER1RIS) == 0);
73
+
74
+ /* Start timer: will fire after 40000 ns */
75
+ writel(TIMER_BASE + TIMER1LOAD, 1000);
76
+ /* enable in free-running, wrapping, interrupt mode */
77
+ writel(TIMER_BASE + TIMER1CONTROL, CTRL_ENABLE | CTRL_INTEN);
78
+
79
+ /* Step to just past the 500th tick and check VALUE */
80
+ clock_step(500 * 40 + 1);
81
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1RIS), ==, 0);
82
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1VALUE), ==, 500);
83
+
84
+ /* Just past the 1000th tick: timer should have fired */
85
+ clock_step(500 * 40);
86
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1RIS), ==, 1);
87
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1VALUE), ==, 0);
88
+
89
+ /*
90
+ * We are in free-running wrapping 16-bit mode, so on the following
91
+ * tick VALUE should have wrapped round to 0xffff.
92
+ */
93
+ clock_step(40);
94
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1VALUE), ==, 0xffff);
95
+
96
+ /* Check that any write to INTCLR clears interrupt */
97
+ writel(TIMER_BASE + TIMER1INTCLR, 1);
98
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1RIS), ==, 0);
99
+
100
+ /* Turn off the timer */
101
+ writel(TIMER_BASE + TIMER1CONTROL, 0);
102
+}
103
+
104
+static void test_prescale(void)
105
+{
106
+ g_assert_true(readl(TIMER_BASE + TIMER2RIS) == 0);
107
+
108
+ /* Start timer: will fire after 40 * 256 * 1000 == 1024000 ns */
109
+ writel(TIMER_BASE + TIMER2LOAD, 1000);
110
+ /* enable in periodic, wrapping, interrupt mode, prescale 256 */
111
+ writel(TIMER_BASE + TIMER2CONTROL,
112
+ CTRL_ENABLE | CTRL_INTEN | CTRL_PERIODIC | CTRL_PRESCALE_256);
113
+
114
+ /* Step to just past the 500th tick and check VALUE */
115
+ clock_step(40 * 256 * 501);
116
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2RIS), ==, 0);
117
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2VALUE), ==, 500);
118
+
119
+ /* Just past the 1000th tick: timer should have fired */
120
+ clock_step(40 * 256 * 500);
121
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2RIS), ==, 1);
122
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2VALUE), ==, 0);
123
+
124
+ /* In periodic mode the tick VALUE now reloads */
125
+ clock_step(40 * 256);
126
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2VALUE), ==, 1000);
127
+
128
+ /* Check that any write to INTCLR clears interrupt */
129
+ writel(TIMER_BASE + TIMER2INTCLR, 1);
130
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2RIS), ==, 0);
131
+
132
+ /* Turn off the timer */
133
+ writel(TIMER_BASE + TIMER2CONTROL, 0);
134
+}
135
+
136
+int main(int argc, char **argv)
137
+{
138
+ int r;
139
+
140
+ g_test_init(&argc, &argv, NULL);
141
+
142
+ qtest_start("-machine mps2-an385");
143
+
144
+ qtest_add_func("/cmsdk-apb-dualtimer/dualtimer", test_dualtimer);
145
+ qtest_add_func("/cmsdk-apb-dualtimer/prescale", test_prescale);
146
+
147
+ r = g_test_run();
148
+
149
+ qtest_end();
150
+
151
+ return r;
152
+}
153
diff --git a/MAINTAINERS b/MAINTAINERS
154
index XXXXXXX..XXXXXXX 100644
155
--- a/MAINTAINERS
156
+++ b/MAINTAINERS
157
@@ -XXX,XX +XXX,XX @@ F: include/hw/timer/cmsdk-apb-timer.h
158
F: tests/qtest/cmsdk-apb-timer-test.c
159
F: hw/timer/cmsdk-apb-dualtimer.c
160
F: include/hw/timer/cmsdk-apb-dualtimer.h
161
+F: tests/qtest/cmsdk-apb-dualtimer-test.c
162
F: hw/char/cmsdk-apb-uart.c
163
F: include/hw/char/cmsdk-apb-uart.h
164
F: hw/watchdog/cmsdk-apb-watchdog.c
165
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
166
index XXXXXXX..XXXXXXX 100644
167
--- a/tests/qtest/meson.build
168
+++ b/tests/qtest/meson.build
169
@@ -XXX,XX +XXX,XX @@ qtests_npcm7xx = \
170
'npcm7xx_timer-test',
171
'npcm7xx_watchdog_timer-test']
172
qtests_arm = \
173
+ (config_all_devices.has_key('CONFIG_CMSDK_APB_DUALTIMER') ? ['cmsdk-apb-dualtimer-test'] : []) + \
174
(config_all_devices.has_key('CONFIG_CMSDK_APB_TIMER') ? ['cmsdk-apb-timer-test'] : []) + \
175
(config_all_devices.has_key('CONFIG_CMSDK_APB_WATCHDOG') ? ['cmsdk-apb-watchdog-test'] : []) + \
176
(config_all_devices.has_key('CONFIG_PFLASH_CFI02') ? ['pflash-cfi02-test'] : []) + \
177
--
178
2.20.1
179
180
diff view generated by jsdifflib
1
Switch the CMSDK APB timer device over to using its Clock input; the
1
Currently we have a free-floating set of IRQs and a function
2
pclk-frq property is now ignored.
2
spitz_out_switch() which handle some miscellaneous GPIO lines for the
3
spitz board. Encapsulate this behaviour in a simple QOM device.
4
5
At this point we can finally remove the 'max1111' global, because the
6
ADC battery-temperature value is now handled by the misc-gpio device
7
writing the value to its outbound "adc-temp" GPIO, which the board
8
code wires up to the appropriate inbound GPIO line on the max1111.
9
10
This commit also fixes Coverity issue CID 1421913 (which pointed out
11
that the 'outsignals' in spitz_scoop_gpio_setup() were leaked),
12
because it removes the use of the qemu_allocate_irqs() API from this
13
code entirely.
3
14
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
17
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20200628142429.17111-13-peter.maydell@linaro.org
8
Message-id: 20210128114145.20536-19-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-19-peter.maydell@linaro.org
10
---
19
---
11
hw/timer/cmsdk-apb-timer.c | 18 ++++++++++++++----
20
hw/arm/spitz.c | 129 +++++++++++++++++++++++++++++++++----------------
12
1 file changed, 14 insertions(+), 4 deletions(-)
21
1 file changed, 87 insertions(+), 42 deletions(-)
13
22
14
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
23
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
15
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/timer/cmsdk-apb-timer.c
25
--- a/hw/arm/spitz.c
17
+++ b/hw/timer/cmsdk-apb-timer.c
26
+++ b/hw/arm/spitz.c
18
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_reset(DeviceState *dev)
27
@@ -XXX,XX +XXX,XX @@ typedef struct {
19
ptimer_transaction_commit(s->timer);
28
DeviceState *max1111;
29
DeviceState *scp0;
30
DeviceState *scp1;
31
+ DeviceState *misc_gpio;
32
} SpitzMachineState;
33
34
#define TYPE_SPITZ_MACHINE "spitz-common"
35
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
36
#define SPITZ_GPIO_MAX1111_CS 20
37
#define SPITZ_GPIO_TP_INT 11
38
39
-static DeviceState *max1111;
40
-
41
/* "Demux" the signal based on current chipselect */
42
typedef struct {
43
SSISlave ssidev;
44
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
45
#define SPITZ_BATTERY_VOLT 0xd0 /* About 4.0V */
46
#define SPITZ_CHARGEON_ACIN 0x80 /* About 5.0V */
47
48
-static void spitz_adc_temp_on(void *opaque, int line, int level)
49
-{
50
- int batt_temp;
51
-
52
- if (!max1111)
53
- return;
54
-
55
- batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
56
-
57
- qemu_set_irq(qdev_get_gpio_in(max1111, MAX1111_BATT_TEMP), batt_temp);
58
-}
59
-
60
static void corgi_ssp_realize(SSISlave *d, Error **errp)
61
{
62
DeviceState *dev = DEVICE(d);
63
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
64
65
bus = qdev_get_child_bus(sms->mux, "ssi2");
66
sms->max1111 = qdev_new(TYPE_MAX_1111);
67
- max1111 = sms->max1111;
68
qdev_prop_set_uint8(sms->max1111, "input1" /* BATT_VOLT */,
69
SPITZ_BATTERY_VOLT);
70
qdev_prop_set_uint8(sms->max1111, "input2" /* BATT_TEMP */, 0);
71
@@ -XXX,XX +XXX,XX @@ static void spitz_akita_i2c_setup(PXA2xxState *cpu)
72
73
/* Other peripherals */
74
75
-static void spitz_out_switch(void *opaque, int line, int level)
76
+/*
77
+ * Encapsulation of some miscellaneous GPIO line behaviour for the Spitz boards.
78
+ *
79
+ * QEMU interface:
80
+ * + named GPIO inputs "green-led", "orange-led", "charging", "discharging":
81
+ * these currently just print messages that the line has been signalled
82
+ * + named GPIO input "adc-temp-on": set to cause the battery-temperature
83
+ * value to be passed to the max111x ADC
84
+ * + named GPIO output "adc-temp": the ADC value, to be wired up to the max111x
85
+ */
86
+#define TYPE_SPITZ_MISC_GPIO "spitz-misc-gpio"
87
+#define SPITZ_MISC_GPIO(obj) \
88
+ OBJECT_CHECK(SpitzMiscGPIOState, (obj), TYPE_SPITZ_MISC_GPIO)
89
+
90
+typedef struct SpitzMiscGPIOState {
91
+ SysBusDevice parent_obj;
92
+
93
+ qemu_irq adc_value;
94
+} SpitzMiscGPIOState;
95
+
96
+static void spitz_misc_charging(void *opaque, int n, int level)
97
{
98
- switch (line) {
99
- case 0:
100
- zaurus_printf("Charging %s.\n", level ? "off" : "on");
101
- break;
102
- case 1:
103
- zaurus_printf("Discharging %s.\n", level ? "on" : "off");
104
- break;
105
- case 2:
106
- zaurus_printf("Green LED %s.\n", level ? "on" : "off");
107
- break;
108
- case 3:
109
- zaurus_printf("Orange LED %s.\n", level ? "on" : "off");
110
- break;
111
- case 6:
112
- spitz_adc_temp_on(opaque, line, level);
113
- break;
114
- default:
115
- g_assert_not_reached();
116
- }
117
+ zaurus_printf("Charging %s.\n", level ? "off" : "on");
118
+}
119
+
120
+static void spitz_misc_discharging(void *opaque, int n, int level)
121
+{
122
+ zaurus_printf("Discharging %s.\n", level ? "off" : "on");
123
+}
124
+
125
+static void spitz_misc_green_led(void *opaque, int n, int level)
126
+{
127
+ zaurus_printf("Green LED %s.\n", level ? "off" : "on");
128
+}
129
+
130
+static void spitz_misc_orange_led(void *opaque, int n, int level)
131
+{
132
+ zaurus_printf("Orange LED %s.\n", level ? "off" : "on");
133
+}
134
+
135
+static void spitz_misc_adc_temp(void *opaque, int n, int level)
136
+{
137
+ SpitzMiscGPIOState *s = SPITZ_MISC_GPIO(opaque);
138
+ int batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
139
+
140
+ qemu_set_irq(s->adc_value, batt_temp);
141
+}
142
+
143
+static void spitz_misc_gpio_init(Object *obj)
144
+{
145
+ SpitzMiscGPIOState *s = SPITZ_MISC_GPIO(obj);
146
+ DeviceState *dev = DEVICE(obj);
147
+
148
+ qdev_init_gpio_in_named(dev, spitz_misc_charging, "charging", 1);
149
+ qdev_init_gpio_in_named(dev, spitz_misc_discharging, "discharging", 1);
150
+ qdev_init_gpio_in_named(dev, spitz_misc_green_led, "green-led", 1);
151
+ qdev_init_gpio_in_named(dev, spitz_misc_orange_led, "orange-led", 1);
152
+ qdev_init_gpio_in_named(dev, spitz_misc_adc_temp, "adc-temp-on", 1);
153
+
154
+ qdev_init_gpio_out_named(dev, &s->adc_value, "adc-temp", 1);
20
}
155
}
21
156
22
+static void cmsdk_apb_timer_clk_update(void *opaque)
157
#define SPITZ_SCP_LED_GREEN 1
23
+{
158
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
24
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(opaque);
159
25
+
160
static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
26
+ ptimer_transaction_begin(s->timer);
161
{
27
+ ptimer_set_period_from_clock(s->timer, s->pclk, 1);
162
- qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, sms->mpu, 8);
28
+ ptimer_transaction_commit(s->timer);
163
+ DeviceState *miscdev = sysbus_create_simple(TYPE_SPITZ_MISC_GPIO, -1, NULL);
29
+}
164
30
+
165
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
31
static void cmsdk_apb_timer_init(Object *obj)
166
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_JK_B, outsignals[1]);
32
{
167
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
33
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
168
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
34
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_init(Object *obj)
169
+ sms->misc_gpio = miscdev;
35
s, "cmsdk-apb-timer", 0x1000);
170
+
36
sysbus_init_mmio(sbd, &s->iomem);
171
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_CHRG_ON,
37
sysbus_init_irq(sbd, &s->timerint);
172
+ qdev_get_gpio_in_named(miscdev, "charging", 0));
38
- s->pclk = qdev_init_clock_in(DEVICE(s), "pclk", NULL, NULL);
173
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_JK_B,
39
+ s->pclk = qdev_init_clock_in(DEVICE(s), "pclk",
174
+ qdev_get_gpio_in_named(miscdev, "discharging", 0));
40
+ cmsdk_apb_timer_clk_update, s);
175
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_GREEN,
176
+ qdev_get_gpio_in_named(miscdev, "green-led", 0));
177
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_ORANGE,
178
+ qdev_get_gpio_in_named(miscdev, "orange-led", 0));
179
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON,
180
+ qdev_get_gpio_in_named(miscdev, "adc-temp-on", 0));
181
+ qdev_connect_gpio_out_named(miscdev, "adc-temp", 0,
182
+ qdev_get_gpio_in(sms->max1111, MAX1111_BATT_TEMP));
183
184
if (sms->scp1) {
185
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_CONT,
186
@@ -XXX,XX +XXX,XX @@ static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
187
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_ON,
188
qdev_get_gpio_in_named(sms->lcdtg, "bl_power", 0));
189
}
190
-
191
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
41
}
192
}
42
193
43
static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
194
#define SPITZ_GPIO_HSYNC 22
44
{
195
@@ -XXX,XX +XXX,XX @@ static const TypeInfo spitz_lcdtg_info = {
45
CMSDKAPBTimer *s = CMSDK_APB_TIMER(dev);
196
.class_init = spitz_lcdtg_class_init,
46
197
};
47
- if (s->pclk_frq == 0) {
198
48
- error_setg(errp, "CMSDK APB timer: pclk-frq property must be set");
199
+static const TypeInfo spitz_misc_gpio_info = {
49
+ if (!clock_has_source(s->pclk)) {
200
+ .name = TYPE_SPITZ_MISC_GPIO,
50
+ error_setg(errp, "CMSDK APB timer: pclk clock must be connected");
201
+ .parent = TYPE_SYS_BUS_DEVICE,
51
return;
202
+ .instance_size = sizeof(SpitzMiscGPIOState),
52
}
203
+ .instance_init = spitz_misc_gpio_init,
53
204
+ /*
54
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
205
+ * No class_init required: device has no internal state so does not
55
PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
206
+ * need to set up reset or vmstate, and does not have a realize method.
56
207
+ */
57
ptimer_transaction_begin(s->timer);
208
+};
58
- ptimer_set_freq(s->timer, s->pclk_frq);
209
+
59
+ ptimer_set_period_from_clock(s->timer, s->pclk, 1);
210
static void spitz_register_types(void)
60
ptimer_transaction_commit(s->timer);
211
{
212
type_register_static(&corgi_ssp_info);
213
type_register_static(&spitz_lcdtg_info);
214
type_register_static(&spitz_keyboard_info);
215
type_register_static(&sl_nand_info);
216
+ type_register_static(&spitz_misc_gpio_info);
61
}
217
}
62
218
219
type_init(spitz_register_types)
63
--
220
--
64
2.20.1
221
2.20.1
65
222
66
223
diff view generated by jsdifflib
1
As the first step in converting the CMSDK_APB_TIMER device to the
1
Instead of logging guest accesses to invalid register offsets in this
2
Clock framework, add a Clock input. For the moment we do nothing
2
device using zaurus_printf() (which just prints to stderr), use the
3
with this clock; we will change the behaviour from using the pclk-frq
3
usual qemu_log_mask(LOG_GUEST_ERROR,...).
4
property to using the Clock once all the users of this device have
5
been converted to wire up the Clock.
6
4
7
Since the device doesn't already have a doc comment for its "QEMU
5
Since this was the only use of the zaurus_printf() macro outside
8
interface", we add one including the new Clock.
6
spitz.c, we can move the definition of that macro from sharpsl.h
9
7
to spitz.c.
10
This is a migration compatibility break for machines mps2-an505,
11
mps2-an521, musca-a, musca-b1.
12
8
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Reviewed-by: Luc Michel <luc@lmichel.fr>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
16
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20200628142429.17111-14-peter.maydell@linaro.org
17
Message-id: 20210128114145.20536-8-peter.maydell@linaro.org
18
Message-id: 20210121190622.22000-8-peter.maydell@linaro.org
19
---
13
---
20
include/hw/timer/cmsdk-apb-timer.h | 9 +++++++++
14
include/hw/arm/sharpsl.h | 3 ---
21
hw/timer/cmsdk-apb-timer.c | 7 +++++--
15
hw/arm/spitz.c | 3 +++
22
2 files changed, 14 insertions(+), 2 deletions(-)
16
hw/gpio/zaurus.c | 12 +++++++-----
17
3 files changed, 10 insertions(+), 8 deletions(-)
23
18
24
diff --git a/include/hw/timer/cmsdk-apb-timer.h b/include/hw/timer/cmsdk-apb-timer.h
19
diff --git a/include/hw/arm/sharpsl.h b/include/hw/arm/sharpsl.h
25
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/timer/cmsdk-apb-timer.h
21
--- a/include/hw/arm/sharpsl.h
27
+++ b/include/hw/timer/cmsdk-apb-timer.h
22
+++ b/include/hw/arm/sharpsl.h
28
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@
29
#include "hw/qdev-properties.h"
24
30
#include "hw/sysbus.h"
25
#include "exec/hwaddr.h"
31
#include "hw/ptimer.h"
26
32
+#include "hw/clock.h"
27
-#define zaurus_printf(format, ...)    \
33
#include "qom/object.h"
28
- fprintf(stderr, "%s: " format, __func__, ##__VA_ARGS__)
34
29
-
35
#define TYPE_CMSDK_APB_TIMER "cmsdk-apb-timer"
30
/* zaurus.c */
36
OBJECT_DECLARE_SIMPLE_TYPE(CMSDKAPBTimer, CMSDK_APB_TIMER)
31
37
32
#define SL_PXA_PARAM_BASE    0xa0000a00
38
+/*
33
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
39
+ * QEMU interface:
40
+ * + QOM property "pclk-frq": frequency at which the timer is clocked
41
+ * + Clock input "pclk": clock for the timer
42
+ * + sysbus MMIO region 0: the register bank
43
+ * + sysbus IRQ 0: timer interrupt TIMERINT
44
+ */
45
struct CMSDKAPBTimer {
46
/*< private >*/
47
SysBusDevice parent_obj;
48
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBTimer {
49
qemu_irq timerint;
50
uint32_t pclk_frq;
51
struct ptimer_state *timer;
52
+ Clock *pclk;
53
54
uint32_t ctrl;
55
uint32_t value;
56
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
57
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/timer/cmsdk-apb-timer.c
35
--- a/hw/arm/spitz.c
59
+++ b/hw/timer/cmsdk-apb-timer.c
36
+++ b/hw/arm/spitz.c
37
@@ -XXX,XX +XXX,XX @@ typedef struct {
38
#define SPITZ_MACHINE_CLASS(klass) \
39
OBJECT_CLASS_CHECK(SpitzMachineClass, klass, TYPE_SPITZ_MACHINE)
40
41
+#define zaurus_printf(format, ...) \
42
+ fprintf(stderr, "%s: " format, __func__, ##__VA_ARGS__)
43
+
44
#undef REG_FMT
45
#define REG_FMT "0x%02lx"
46
47
diff --git a/hw/gpio/zaurus.c b/hw/gpio/zaurus.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/gpio/zaurus.c
50
+++ b/hw/gpio/zaurus.c
60
@@ -XXX,XX +XXX,XX @@
51
@@ -XXX,XX +XXX,XX @@
61
#include "hw/sysbus.h"
52
#include "hw/sysbus.h"
62
#include "hw/irq.h"
63
#include "hw/registerfields.h"
64
+#include "hw/qdev-clock.h"
65
#include "hw/timer/cmsdk-apb-timer.h"
66
#include "migration/vmstate.h"
53
#include "migration/vmstate.h"
67
54
#include "qemu/module.h"
68
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_init(Object *obj)
55
-
69
s, "cmsdk-apb-timer", 0x1000);
56
-#undef REG_FMT
70
sysbus_init_mmio(sbd, &s->iomem);
57
-#define REG_FMT            "0x%02lx"
71
sysbus_init_irq(sbd, &s->timerint);
58
+#include "qemu/log.h"
72
+ s->pclk = qdev_init_clock_in(DEVICE(s), "pclk", NULL, NULL);
59
60
/* SCOOP devices */
61
62
@@ -XXX,XX +XXX,XX @@ static uint64_t scoop_read(void *opaque, hwaddr addr,
63
case SCOOP_GPRR:
64
return s->gpio_level;
65
default:
66
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
67
+ qemu_log_mask(LOG_GUEST_ERROR,
68
+ "scoop_read: bad register offset 0x%02" HWADDR_PRIx "\n",
69
+ addr);
70
}
71
72
return 0;
73
@@ -XXX,XX +XXX,XX @@ static void scoop_write(void *opaque, hwaddr addr,
74
scoop_gpio_handler_update(s);
75
break;
76
default:
77
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
78
+ qemu_log_mask(LOG_GUEST_ERROR,
79
+ "scoop_write: bad register offset 0x%02" HWADDR_PRIx "\n",
80
+ addr);
81
}
73
}
82
}
74
83
75
static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
76
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
77
78
static const VMStateDescription cmsdk_apb_timer_vmstate = {
79
.name = "cmsdk-apb-timer",
80
- .version_id = 1,
81
- .minimum_version_id = 1,
82
+ .version_id = 2,
83
+ .minimum_version_id = 2,
84
.fields = (VMStateField[]) {
85
VMSTATE_PTIMER(timer, CMSDKAPBTimer),
86
+ VMSTATE_CLOCK(pclk, CMSDKAPBTimer),
87
VMSTATE_UINT32(ctrl, CMSDKAPBTimer),
88
VMSTATE_UINT32(value, CMSDKAPBTimer),
89
VMSTATE_UINT32(reload, CMSDKAPBTimer),
90
--
84
--
91
2.20.1
85
2.20.1
92
86
93
87
diff view generated by jsdifflib
1
Remove all the code that sets frequency properties on the CMSDK
1
Instead of logging guest accesses to invalid register offsets in the
2
timer, dualtimer and watchdog devices and on the ARMSSE SoC device:
2
Spitz flash device with zaurus_printf() (which just prints to stderr),
3
these properties are unused now that the devices rely on their Clock
3
use the usual qemu_log_mask(LOG_GUEST_ERROR,...).
4
inputs instead.
5
4
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Luc Michel <luc@lmichel.fr>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20200628142429.17111-15-peter.maydell@linaro.org
10
Message-id: 20210128114145.20536-24-peter.maydell@linaro.org
11
Message-id: 20210121190622.22000-24-peter.maydell@linaro.org
12
---
9
---
13
hw/arm/armsse.c | 7 -------
10
hw/arm/spitz.c | 12 +++++++-----
14
hw/arm/mps2-tz.c | 1 -
11
1 file changed, 7 insertions(+), 5 deletions(-)
15
hw/arm/mps2.c | 3 ---
16
hw/arm/musca.c | 1 -
17
hw/arm/stellaris.c | 3 ---
18
5 files changed, 15 deletions(-)
19
12
20
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
13
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
21
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/armsse.c
15
--- a/hw/arm/spitz.c
23
+++ b/hw/arm/armsse.c
16
+++ b/hw/arm/spitz.c
24
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
17
@@ -XXX,XX +XXX,XX @@
25
* it to the appropriate PPC port; then we can realize the PPC and
18
#include "hw/ssi/ssi.h"
26
* map its upstream ends to the right place in the container.
19
#include "hw/block/flash.h"
27
*/
20
#include "qemu/timer.h"
28
- qdev_prop_set_uint32(DEVICE(&s->timer0), "pclk-frq", s->mainclk_frq);
21
+#include "qemu/log.h"
29
qdev_connect_clock_in(DEVICE(&s->timer0), "pclk", s->mainclk);
22
#include "hw/arm/sharpsl.h"
30
if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer0), errp)) {
23
#include "ui/console.h"
31
return;
24
#include "hw/audio/wm8750.h"
32
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
25
@@ -XXX,XX +XXX,XX @@ typedef struct {
33
object_property_set_link(OBJECT(&s->apb_ppc0), "port[0]", OBJECT(mr),
26
#define zaurus_printf(format, ...) \
34
&error_abort);
27
fprintf(stderr, "%s: " format, __func__, ##__VA_ARGS__)
35
28
36
- qdev_prop_set_uint32(DEVICE(&s->timer1), "pclk-frq", s->mainclk_frq);
29
-#undef REG_FMT
37
qdev_connect_clock_in(DEVICE(&s->timer1), "pclk", s->mainclk);
30
-#define REG_FMT "0x%02lx"
38
if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer1), errp)) {
31
-
39
return;
32
/* Spitz Flash */
40
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
33
#define FLASH_BASE 0x0c000000
41
object_property_set_link(OBJECT(&s->apb_ppc0), "port[1]", OBJECT(mr),
34
#define FLASH_ECCLPLB 0x00 /* Line parity 7 - 0 bit */
42
&error_abort);
35
@@ -XXX,XX +XXX,XX @@ static uint64_t sl_read(void *opaque, hwaddr addr, unsigned size)
43
36
return ecc_digest(&s->ecc, nand_getio(s->nand));
44
- qdev_prop_set_uint32(DEVICE(&s->dualtimer), "pclk-frq", s->mainclk_frq);
37
45
qdev_connect_clock_in(DEVICE(&s->dualtimer), "TIMCLK", s->mainclk);
38
default:
46
if (!sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), errp)) {
39
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
47
return;
40
+ qemu_log_mask(LOG_GUEST_ERROR,
48
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
41
+ "sl_read: bad register offset 0x%02" HWADDR_PRIx "\n",
49
/* Devices behind APB PPC1:
42
+ addr);
50
* 0x4002f000: S32K timer
43
}
51
*/
44
return 0;
52
- qdev_prop_set_uint32(DEVICE(&s->s32ktimer), "pclk-frq", S32KCLK);
45
}
53
qdev_connect_clock_in(DEVICE(&s->s32ktimer), "pclk", s->s32kclk);
46
@@ -XXX,XX +XXX,XX @@ static void sl_write(void *opaque, hwaddr addr,
54
if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), errp)) {
47
break;
55
return;
48
56
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
49
default:
57
qdev_connect_gpio_out(DEVICE(&s->nmi_orgate), 0,
50
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
58
qdev_get_gpio_in_named(DEVICE(&s->armv7m), "NMI", 0));
51
+ qemu_log_mask(LOG_GUEST_ERROR,
59
52
+ "sl_write: bad register offset 0x%02" HWADDR_PRIx "\n",
60
- qdev_prop_set_uint32(DEVICE(&s->s32kwatchdog), "wdogclk-frq", S32KCLK);
53
+ addr);
61
qdev_connect_clock_in(DEVICE(&s->s32kwatchdog), "WDOGCLK", s->s32kclk);
54
}
62
if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), errp)) {
55
}
63
return;
64
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
65
66
/* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
67
68
- qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
69
qdev_connect_clock_in(DEVICE(&s->nswatchdog), "WDOGCLK", s->mainclk);
70
if (!sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), errp)) {
71
return;
72
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
73
armsse_get_common_irq_in(s, 1));
74
sysbus_mmio_map(SYS_BUS_DEVICE(&s->nswatchdog), 0, 0x40081000);
75
76
- qdev_prop_set_uint32(DEVICE(&s->swatchdog), "wdogclk-frq", s->mainclk_frq);
77
qdev_connect_clock_in(DEVICE(&s->swatchdog), "WDOGCLK", s->mainclk);
78
if (!sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), errp)) {
79
return;
80
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/hw/arm/mps2-tz.c
83
+++ b/hw/arm/mps2-tz.c
84
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
85
object_property_set_link(OBJECT(&mms->iotkit), "memory",
86
OBJECT(system_memory), &error_abort);
87
qdev_prop_set_uint32(iotkitdev, "EXP_NUMIRQ", MPS2TZ_NUMIRQ);
88
- qdev_prop_set_uint32(iotkitdev, "MAINCLK_FRQ", SYSCLK_FRQ);
89
qdev_connect_clock_in(iotkitdev, "MAINCLK", mms->sysclk);
90
qdev_connect_clock_in(iotkitdev, "S32KCLK", mms->s32kclk);
91
sysbus_realize(SYS_BUS_DEVICE(&mms->iotkit), &error_fatal);
92
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
93
index XXXXXXX..XXXXXXX 100644
94
--- a/hw/arm/mps2.c
95
+++ b/hw/arm/mps2.c
96
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
97
object_initialize_child(OBJECT(mms), name, &mms->timer[i],
98
TYPE_CMSDK_APB_TIMER);
99
sbd = SYS_BUS_DEVICE(&mms->timer[i]);
100
- qdev_prop_set_uint32(DEVICE(&mms->timer[i]), "pclk-frq", SYSCLK_FRQ);
101
qdev_connect_clock_in(DEVICE(&mms->timer[i]), "pclk", mms->sysclk);
102
sysbus_realize_and_unref(sbd, &error_fatal);
103
sysbus_mmio_map(sbd, 0, base);
104
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
105
106
object_initialize_child(OBJECT(mms), "dualtimer", &mms->dualtimer,
107
TYPE_CMSDK_APB_DUALTIMER);
108
- qdev_prop_set_uint32(DEVICE(&mms->dualtimer), "pclk-frq", SYSCLK_FRQ);
109
qdev_connect_clock_in(DEVICE(&mms->dualtimer), "TIMCLK", mms->sysclk);
110
sysbus_realize(SYS_BUS_DEVICE(&mms->dualtimer), &error_fatal);
111
sysbus_connect_irq(SYS_BUS_DEVICE(&mms->dualtimer), 0,
112
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
113
sysbus_mmio_map(SYS_BUS_DEVICE(&mms->dualtimer), 0, 0x40002000);
114
object_initialize_child(OBJECT(mms), "watchdog", &mms->watchdog,
115
TYPE_CMSDK_APB_WATCHDOG);
116
- qdev_prop_set_uint32(DEVICE(&mms->watchdog), "wdogclk-frq", SYSCLK_FRQ);
117
qdev_connect_clock_in(DEVICE(&mms->watchdog), "WDOGCLK", mms->sysclk);
118
sysbus_realize(SYS_BUS_DEVICE(&mms->watchdog), &error_fatal);
119
sysbus_connect_irq(SYS_BUS_DEVICE(&mms->watchdog), 0,
120
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
121
index XXXXXXX..XXXXXXX 100644
122
--- a/hw/arm/musca.c
123
+++ b/hw/arm/musca.c
124
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
125
qdev_prop_set_uint32(ssedev, "EXP_NUMIRQ", mmc->num_irqs);
126
qdev_prop_set_uint32(ssedev, "init-svtor", mmc->init_svtor);
127
qdev_prop_set_uint32(ssedev, "SRAM_ADDR_WIDTH", mmc->sram_addr_width);
128
- qdev_prop_set_uint32(ssedev, "MAINCLK_FRQ", SYSCLK_FRQ);
129
qdev_connect_clock_in(ssedev, "MAINCLK", mms->sysclk);
130
qdev_connect_clock_in(ssedev, "S32KCLK", mms->s32kclk);
131
/*
132
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
133
index XXXXXXX..XXXXXXX 100644
134
--- a/hw/arm/stellaris.c
135
+++ b/hw/arm/stellaris.c
136
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
137
if (board->dc1 & (1 << 3)) { /* watchdog present */
138
dev = qdev_new(TYPE_LUMINARY_WATCHDOG);
139
140
- /* system_clock_scale is valid now */
141
- uint32_t mainclk = NANOSECONDS_PER_SECOND / system_clock_scale;
142
- qdev_prop_set_uint32(dev, "wdogclk-frq", mainclk);
143
qdev_connect_clock_in(dev, "WDOGCLK",
144
qdev_get_clock_out(ssys_dev, "SYSCLK"));
145
56
146
--
57
--
147
2.20.1
58
2.20.1
148
59
149
60
diff view generated by jsdifflib
1
Create two input clocks on the ARMSSE devices, one for the normal
1
Instead of using printf() for logging guest accesses to invalid
2
MAINCLK, and one for the 32KHz S32KCLK, and wire these up to the
2
register offsets in the pxa2xx PIC device, use the usual
3
appropriate devices. The old property-based clock frequency setting
3
qemu_log_mask(LOG_GUEST_ERROR,...).
4
will remain in place until conversion is complete.
5
4
6
This is a migration compatibility break for machines mps2-an505,
5
This was the only user of the REG_FMT macro in pxa.h, so we can
7
mps2-an521, musca-a, musca-b1.
6
remove that.
8
7
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Luc Michel <luc@lmichel.fr>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200628142429.17111-16-peter.maydell@linaro.org
13
Message-id: 20210128114145.20536-12-peter.maydell@linaro.org
14
Message-id: 20210121190622.22000-12-peter.maydell@linaro.org
15
---
12
---
16
include/hw/arm/armsse.h | 6 ++++++
13
include/hw/arm/pxa.h | 1 -
17
hw/arm/armsse.c | 17 +++++++++++++++--
14
hw/arm/pxa2xx_pic.c | 9 +++++++--
18
2 files changed, 21 insertions(+), 2 deletions(-)
15
2 files changed, 7 insertions(+), 3 deletions(-)
19
16
20
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
17
diff --git a/include/hw/arm/pxa.h b/include/hw/arm/pxa.h
21
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/armsse.h
19
--- a/include/hw/arm/pxa.h
23
+++ b/include/hw/arm/armsse.h
20
+++ b/include/hw/arm/pxa.h
21
@@ -XXX,XX +XXX,XX @@ struct PXA2xxI2SState {
22
};
23
24
# define PA_FMT            "0x%08lx"
25
-# define REG_FMT        "0x" TARGET_FMT_plx
26
27
PXA2xxState *pxa270_init(MemoryRegion *address_space, unsigned int sdram_size,
28
const char *revision);
29
diff --git a/hw/arm/pxa2xx_pic.c b/hw/arm/pxa2xx_pic.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/arm/pxa2xx_pic.c
32
+++ b/hw/arm/pxa2xx_pic.c
24
@@ -XXX,XX +XXX,XX @@
33
@@ -XXX,XX +XXX,XX @@
25
* per-CPU identity and control register blocks
34
#include "qemu/osdep.h"
26
*
35
#include "qapi/error.h"
27
* QEMU interface:
36
#include "qemu/module.h"
28
+ * + Clock input "MAINCLK": clock for CPUs and most peripherals
37
+#include "qemu/log.h"
29
+ * + Clock input "S32KCLK": slow 32KHz clock used for a few peripherals
38
#include "cpu.h"
30
* + QOM property "memory" is a MemoryRegion containing the devices provided
39
#include "hw/arm/pxa.h"
31
* by the board model.
40
#include "hw/sysbus.h"
32
* + QOM property "MAINCLK_FRQ" is the frequency of the main system clock
41
@@ -XXX,XX +XXX,XX @@ static uint64_t pxa2xx_pic_mem_read(void *opaque, hwaddr offset,
33
@@ -XXX,XX +XXX,XX @@
42
case ICHP:    /* Highest Priority register */
34
#include "hw/misc/armsse-mhu.h"
43
return pxa2xx_pic_highest(s);
35
#include "hw/misc/unimp.h"
44
default:
36
#include "hw/or-irq.h"
45
- printf("%s: Bad register offset " REG_FMT "\n", __func__, offset);
37
+#include "hw/clock.h"
46
+ qemu_log_mask(LOG_GUEST_ERROR,
38
#include "hw/core/split-irq.h"
47
+ "pxa2xx_pic_mem_read: bad register offset 0x%" HWADDR_PRIx
39
#include "hw/cpu/cluster.h"
48
+ "\n", offset);
40
#include "qom/object.h"
49
return 0;
41
@@ -XXX,XX +XXX,XX @@ struct ARMSSE {
50
}
42
51
}
43
uint32_t nsccfg;
52
@@ -XXX,XX +XXX,XX @@ static void pxa2xx_pic_mem_write(void *opaque, hwaddr offset,
44
53
s->priority[32 + ((offset - IPR32) >> 2)] = value & 0x8000003f;
45
+ Clock *mainclk;
54
break;
46
+ Clock *s32kclk;
55
default:
47
+
56
- printf("%s: Bad register offset " REG_FMT "\n", __func__, offset);
48
/* Properties */
57
+ qemu_log_mask(LOG_GUEST_ERROR,
49
MemoryRegion *board_memory;
58
+ "pxa2xx_pic_mem_write: bad register offset 0x%"
50
uint32_t exp_numirq;
59
+ HWADDR_PRIx "\n", offset);
51
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/hw/arm/armsse.c
54
+++ b/hw/arm/armsse.c
55
@@ -XXX,XX +XXX,XX @@
56
#include "hw/arm/armsse.h"
57
#include "hw/arm/boot.h"
58
#include "hw/irq.h"
59
+#include "hw/qdev-clock.h"
60
61
/* Format of the System Information block SYS_CONFIG register */
62
typedef enum SysConfigFormat {
63
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
64
assert(info->sram_banks <= MAX_SRAM_BANKS);
65
assert(info->num_cpus <= SSE_MAX_CPUS);
66
67
+ s->mainclk = qdev_init_clock_in(DEVICE(s), "MAINCLK", NULL, NULL);
68
+ s->s32kclk = qdev_init_clock_in(DEVICE(s), "S32KCLK", NULL, NULL);
69
+
70
memory_region_init(&s->container, obj, "armsse-container", UINT64_MAX);
71
72
for (i = 0; i < info->num_cpus; i++) {
73
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
74
* map its upstream ends to the right place in the container.
75
*/
76
qdev_prop_set_uint32(DEVICE(&s->timer0), "pclk-frq", s->mainclk_frq);
77
+ qdev_connect_clock_in(DEVICE(&s->timer0), "pclk", s->mainclk);
78
if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer0), errp)) {
79
return;
60
return;
80
}
61
}
81
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
62
pxa2xx_pic_update(opaque);
82
&error_abort);
83
84
qdev_prop_set_uint32(DEVICE(&s->timer1), "pclk-frq", s->mainclk_frq);
85
+ qdev_connect_clock_in(DEVICE(&s->timer1), "pclk", s->mainclk);
86
if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer1), errp)) {
87
return;
88
}
89
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
90
&error_abort);
91
92
qdev_prop_set_uint32(DEVICE(&s->dualtimer), "pclk-frq", s->mainclk_frq);
93
+ qdev_connect_clock_in(DEVICE(&s->dualtimer), "TIMCLK", s->mainclk);
94
if (!sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), errp)) {
95
return;
96
}
97
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
98
* 0x4002f000: S32K timer
99
*/
100
qdev_prop_set_uint32(DEVICE(&s->s32ktimer), "pclk-frq", S32KCLK);
101
+ qdev_connect_clock_in(DEVICE(&s->s32ktimer), "pclk", s->s32kclk);
102
if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), errp)) {
103
return;
104
}
105
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
106
qdev_get_gpio_in_named(DEVICE(&s->armv7m), "NMI", 0));
107
108
qdev_prop_set_uint32(DEVICE(&s->s32kwatchdog), "wdogclk-frq", S32KCLK);
109
+ qdev_connect_clock_in(DEVICE(&s->s32kwatchdog), "WDOGCLK", s->s32kclk);
110
if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), errp)) {
111
return;
112
}
113
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
114
/* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
115
116
qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
117
+ qdev_connect_clock_in(DEVICE(&s->nswatchdog), "WDOGCLK", s->mainclk);
118
if (!sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), errp)) {
119
return;
120
}
121
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
122
sysbus_mmio_map(SYS_BUS_DEVICE(&s->nswatchdog), 0, 0x40081000);
123
124
qdev_prop_set_uint32(DEVICE(&s->swatchdog), "wdogclk-frq", s->mainclk_frq);
125
+ qdev_connect_clock_in(DEVICE(&s->swatchdog), "WDOGCLK", s->mainclk);
126
if (!sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), errp)) {
127
return;
128
}
129
@@ -XXX,XX +XXX,XX @@ static void armsse_idau_check(IDAUInterface *ii, uint32_t address,
130
131
static const VMStateDescription armsse_vmstate = {
132
.name = "iotkit",
133
- .version_id = 1,
134
- .minimum_version_id = 1,
135
+ .version_id = 2,
136
+ .minimum_version_id = 2,
137
.fields = (VMStateField[]) {
138
+ VMSTATE_CLOCK(mainclk, ARMSSE),
139
+ VMSTATE_CLOCK(s32kclk, ARMSSE),
140
VMSTATE_UINT32(nsccfg, ARMSSE),
141
VMSTATE_END_OF_LIST()
142
}
143
--
63
--
144
2.20.1
64
2.20.1
145
65
146
66
diff view generated by jsdifflib
1
Use the MAINCLK Clock input to set the system_clock_scale variable
1
The QOM types "spitz-lcdtg" and "corgi-ssp" are missing the
2
rather than using the mainclk_frq property.
2
usual QOM TYPE and casting macros; provide and use them.
3
4
In particular, we can safely use the QOM cast macros instead of
5
FROM_SSI_SLAVE() because in both cases the 'ssidev' field of
6
the instance state struct is the first field in it.
3
7
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
11
Message-id: 20200628142429.17111-17-peter.maydell@linaro.org
8
Message-id: 20210128114145.20536-23-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-23-peter.maydell@linaro.org
10
---
12
---
11
hw/arm/armsse.c | 24 +++++++++++++++++++-----
13
hw/arm/spitz.c | 23 +++++++++++++++--------
12
1 file changed, 19 insertions(+), 5 deletions(-)
14
1 file changed, 15 insertions(+), 8 deletions(-)
13
15
14
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
16
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/armsse.c
18
--- a/hw/arm/spitz.c
17
+++ b/hw/arm/armsse.c
19
+++ b/hw/arm/spitz.c
18
@@ -XXX,XX +XXX,XX @@ static void armsse_forward_sec_resp_cfg(ARMSSE *s)
20
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_realize(DeviceState *dev, Error **errp)
19
qdev_connect_gpio_out(dev_splitter, 2, s->sec_resp_cfg_in);
21
#define LCDTG_PICTRL 0x06
22
#define LCDTG_POLCTRL 0x07
23
24
+#define TYPE_SPITZ_LCDTG "spitz-lcdtg"
25
+#define SPITZ_LCDTG(obj) OBJECT_CHECK(SpitzLCDTG, (obj), TYPE_SPITZ_LCDTG)
26
+
27
typedef struct {
28
SSISlave ssidev;
29
uint32_t bl_intensity;
30
@@ -XXX,XX +XXX,XX @@ static inline void spitz_bl_power(void *opaque, int line, int level)
31
32
static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
33
{
34
- SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, dev);
35
+ SpitzLCDTG *s = SPITZ_LCDTG(dev);
36
int addr;
37
addr = value >> 5;
38
value &= 0x1f;
39
@@ -XXX,XX +XXX,XX @@ static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
40
41
static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
42
{
43
- SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, ssi);
44
+ SpitzLCDTG *s = SPITZ_LCDTG(ssi);
45
DeviceState *dev = DEVICE(s);
46
47
s->bl_power = 0;
48
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
49
#define SPITZ_GPIO_MAX1111_CS 20
50
#define SPITZ_GPIO_TP_INT 11
51
52
+#define TYPE_CORGI_SSP "corgi-ssp"
53
+#define CORGI_SSP(obj) OBJECT_CHECK(CorgiSSPState, (obj), TYPE_CORGI_SSP)
54
+
55
/* "Demux" the signal based on current chipselect */
56
typedef struct {
57
SSISlave ssidev;
58
@@ -XXX,XX +XXX,XX @@ typedef struct {
59
60
static uint32_t corgi_ssp_transfer(SSISlave *dev, uint32_t value)
61
{
62
- CorgiSSPState *s = FROM_SSI_SLAVE(CorgiSSPState, dev);
63
+ CorgiSSPState *s = CORGI_SSP(dev);
64
int i;
65
66
for (i = 0; i < 3; i++) {
67
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
68
static void corgi_ssp_realize(SSISlave *d, Error **errp)
69
{
70
DeviceState *dev = DEVICE(d);
71
- CorgiSSPState *s = FROM_SSI_SLAVE(CorgiSSPState, d);
72
+ CorgiSSPState *s = CORGI_SSP(d);
73
74
qdev_init_gpio_in(dev, corgi_ssp_gpio_cs, 3);
75
s->bus[0] = ssi_create_bus(dev, "ssi0");
76
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
77
{
78
void *bus;
79
80
- sms->mux = ssi_create_slave(sms->mpu->ssp[CORGI_SSP_PORT - 1], "corgi-ssp");
81
+ sms->mux = ssi_create_slave(sms->mpu->ssp[CORGI_SSP_PORT - 1],
82
+ TYPE_CORGI_SSP);
83
84
bus = qdev_get_child_bus(sms->mux, "ssi0");
85
- sms->lcdtg = ssi_create_slave(bus, "spitz-lcdtg");
86
+ sms->lcdtg = ssi_create_slave(bus, TYPE_SPITZ_LCDTG);
87
88
bus = qdev_get_child_bus(sms->mux, "ssi1");
89
sms->ads7846 = ssi_create_slave(bus, "ads7846");
90
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_class_init(ObjectClass *klass, void *data)
20
}
91
}
21
92
22
+static void armsse_mainclk_update(void *opaque)
93
static const TypeInfo corgi_ssp_info = {
23
+{
94
- .name = "corgi-ssp",
24
+ ARMSSE *s = ARM_SSE(opaque);
95
+ .name = TYPE_CORGI_SSP,
25
+ /*
96
.parent = TYPE_SSI_SLAVE,
26
+ * Set system_clock_scale from our Clock input; this is what
97
.instance_size = sizeof(CorgiSSPState),
27
+ * controls the tick rate of the CPU SysTick timer.
98
.class_init = corgi_ssp_class_init,
28
+ */
99
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_class_init(ObjectClass *klass, void *data)
29
+ system_clock_scale = clock_ticks_to_ns(s->mainclk, 1);
30
+}
31
+
32
static void armsse_init(Object *obj)
33
{
34
ARMSSE *s = ARM_SSE(obj);
35
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
36
assert(info->sram_banks <= MAX_SRAM_BANKS);
37
assert(info->num_cpus <= SSE_MAX_CPUS);
38
39
- s->mainclk = qdev_init_clock_in(DEVICE(s), "MAINCLK", NULL, NULL);
40
+ s->mainclk = qdev_init_clock_in(DEVICE(s), "MAINCLK",
41
+ armsse_mainclk_update, s);
42
s->s32kclk = qdev_init_clock_in(DEVICE(s), "S32KCLK", NULL, NULL);
43
44
memory_region_init(&s->container, obj, "armsse-container", UINT64_MAX);
45
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
46
return;
47
}
48
49
- if (!s->mainclk_frq) {
50
- error_setg(errp, "MAINCLK_FRQ property was not set");
51
- return;
52
+ if (!clock_has_source(s->mainclk)) {
53
+ error_setg(errp, "MAINCLK clock was not connected");
54
+ }
55
+ if (!clock_has_source(s->s32kclk)) {
56
+ error_setg(errp, "S32KCLK clock was not connected");
57
}
58
59
assert(info->num_cpus <= SSE_MAX_CPUS);
60
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
61
*/
62
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->container);
63
64
- system_clock_scale = NANOSECONDS_PER_SECOND / s->mainclk_frq;
65
+ /* Set initial system_clock_scale from MAINCLK */
66
+ armsse_mainclk_update(s);
67
}
100
}
68
101
69
static void armsse_idau_check(IDAUInterface *ii, uint32_t address,
102
static const TypeInfo spitz_lcdtg_info = {
103
- .name = "spitz-lcdtg",
104
+ .name = TYPE_SPITZ_LCDTG,
105
.parent = TYPE_SSI_SLAVE,
106
.instance_size = sizeof(SpitzLCDTG),
107
.class_init = spitz_lcdtg_class_init,
70
--
108
--
71
2.20.1
109
2.20.1
72
110
73
111
diff view generated by jsdifflib
1
Create a fixed-frequency Clock object to be the SYSCLK, and wire it
1
The FROM_SSI_SLAVE() macro predates QOM and is used as a typesafe way
2
up to the devices that require it.
2
to cast from an SSISlave* to the instance struct of a subtype of
3
TYPE_SSI_SLAVE. Switch to using the QOM cast macros instead, which
4
have the same effect (by writing the QOM macros if the types were
5
previously missing them.)
6
7
(The FROM_SSI_SLAVE() macro allows the SSISlave member of the
8
subtype's struct to be anywhere as long as it is named "ssidev",
9
whereas a QOM cast macro insists that it is the first thing in the
10
subtype's struct. This is true for all the types we convert here.)
11
12
This removes all the uses of FROM_SSI_SLAVE() so we can delete the
13
definition.
3
14
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
17
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20200628142429.17111-18-peter.maydell@linaro.org
8
Message-id: 20210128114145.20536-14-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-14-peter.maydell@linaro.org
10
---
19
---
11
hw/arm/mps2.c | 9 +++++++++
20
include/hw/ssi/ssi.h | 2 --
12
1 file changed, 9 insertions(+)
21
hw/arm/z2.c | 11 +++++++----
22
hw/display/ads7846.c | 9 ++++++---
23
hw/display/ssd0323.c | 10 +++++++---
24
hw/sd/ssi-sd.c | 4 ++--
25
5 files changed, 22 insertions(+), 14 deletions(-)
13
26
14
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
27
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
15
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/mps2.c
29
--- a/include/hw/ssi/ssi.h
17
+++ b/hw/arm/mps2.c
30
+++ b/include/hw/ssi/ssi.h
18
@@ -XXX,XX +XXX,XX @@
31
@@ -XXX,XX +XXX,XX @@ struct SSISlave {
19
#include "hw/net/lan9118.h"
32
bool cs;
20
#include "net/net.h"
21
#include "hw/watchdog/cmsdk-apb-watchdog.h"
22
+#include "hw/qdev-clock.h"
23
#include "qom/object.h"
24
25
typedef enum MPS2FPGAType {
26
@@ -XXX,XX +XXX,XX @@ struct MPS2MachineState {
27
CMSDKAPBDualTimer dualtimer;
28
CMSDKAPBWatchdog watchdog;
29
CMSDKAPBTimer timer[2];
30
+ Clock *sysclk;
31
};
33
};
32
34
33
#define TYPE_MPS2_MACHINE "mps2"
35
-#define FROM_SSI_SLAVE(type, dev) DO_UPCAST(type, ssidev, dev)
34
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
36
-
35
exit(EXIT_FAILURE);
37
extern const VMStateDescription vmstate_ssi_slave;
36
}
38
37
39
#define VMSTATE_SSI_SLAVE(_field, _state) { \
38
+ /* This clock doesn't need migration because it is fixed-frequency */
40
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
39
+ mms->sysclk = clock_new(OBJECT(machine), "SYSCLK");
41
index XXXXXXX..XXXXXXX 100644
40
+ clock_set_hz(mms->sysclk, SYSCLK_FRQ);
42
--- a/hw/arm/z2.c
43
+++ b/hw/arm/z2.c
44
@@ -XXX,XX +XXX,XX @@ typedef struct {
45
int pos;
46
} ZipitLCD;
47
48
+#define TYPE_ZIPIT_LCD "zipit-lcd"
49
+#define ZIPIT_LCD(obj) OBJECT_CHECK(ZipitLCD, (obj), TYPE_ZIPIT_LCD)
41
+
50
+
42
/* The FPGA images have an odd combination of different RAMs,
51
static uint32_t zipit_lcd_transfer(SSISlave *dev, uint32_t value)
43
* because in hardware they are different implementations and
52
{
44
* connected to different buses, giving varying performance/size
53
- ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
45
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
54
+ ZipitLCD *z = ZIPIT_LCD(dev);
46
TYPE_CMSDK_APB_TIMER);
55
uint16_t val;
47
sbd = SYS_BUS_DEVICE(&mms->timer[i]);
56
if (z->selected) {
48
qdev_prop_set_uint32(DEVICE(&mms->timer[i]), "pclk-frq", SYSCLK_FRQ);
57
z->buf[z->pos] = value & 0xff;
49
+ qdev_connect_clock_in(DEVICE(&mms->timer[i]), "pclk", mms->sysclk);
58
@@ -XXX,XX +XXX,XX @@ static void z2_lcd_cs(void *opaque, int line, int level)
50
sysbus_realize_and_unref(sbd, &error_fatal);
59
51
sysbus_mmio_map(sbd, 0, base);
60
static void zipit_lcd_realize(SSISlave *dev, Error **errp)
52
sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(armv7m, irqno));
61
{
53
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
62
- ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
54
object_initialize_child(OBJECT(mms), "dualtimer", &mms->dualtimer,
63
+ ZipitLCD *z = ZIPIT_LCD(dev);
55
TYPE_CMSDK_APB_DUALTIMER);
64
z->selected = 0;
56
qdev_prop_set_uint32(DEVICE(&mms->dualtimer), "pclk-frq", SYSCLK_FRQ);
65
z->enabled = 0;
57
+ qdev_connect_clock_in(DEVICE(&mms->dualtimer), "TIMCLK", mms->sysclk);
66
z->pos = 0;
58
sysbus_realize(SYS_BUS_DEVICE(&mms->dualtimer), &error_fatal);
67
@@ -XXX,XX +XXX,XX @@ static void zipit_lcd_class_init(ObjectClass *klass, void *data)
59
sysbus_connect_irq(SYS_BUS_DEVICE(&mms->dualtimer), 0,
68
}
60
qdev_get_gpio_in(armv7m, 10));
69
61
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
70
static const TypeInfo zipit_lcd_info = {
62
object_initialize_child(OBJECT(mms), "watchdog", &mms->watchdog,
71
- .name = "zipit-lcd",
63
TYPE_CMSDK_APB_WATCHDOG);
72
+ .name = TYPE_ZIPIT_LCD,
64
qdev_prop_set_uint32(DEVICE(&mms->watchdog), "wdogclk-frq", SYSCLK_FRQ);
73
.parent = TYPE_SSI_SLAVE,
65
+ qdev_connect_clock_in(DEVICE(&mms->watchdog), "WDOGCLK", mms->sysclk);
74
.instance_size = sizeof(ZipitLCD),
66
sysbus_realize(SYS_BUS_DEVICE(&mms->watchdog), &error_fatal);
75
.class_init = zipit_lcd_class_init,
67
sysbus_connect_irq(SYS_BUS_DEVICE(&mms->watchdog), 0,
76
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
68
qdev_get_gpio_in_named(armv7m, "NMI", 0));
77
78
type_register_static(&zipit_lcd_info);
79
type_register_static(&aer915_info);
80
- z2_lcd = ssi_create_slave(mpu->ssp[1], "zipit-lcd");
81
+ z2_lcd = ssi_create_slave(mpu->ssp[1], TYPE_ZIPIT_LCD);
82
bus = pxa2xx_i2c_bus(mpu->i2c[0]);
83
i2c_create_slave(bus, TYPE_AER915, 0x55);
84
wm = i2c_create_slave(bus, TYPE_WM8750, 0x1b);
85
diff --git a/hw/display/ads7846.c b/hw/display/ads7846.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/hw/display/ads7846.c
88
+++ b/hw/display/ads7846.c
89
@@ -XXX,XX +XXX,XX @@ typedef struct {
90
int output;
91
} ADS7846State;
92
93
+#define TYPE_ADS7846 "ads7846"
94
+#define ADS7846(obj) OBJECT_CHECK(ADS7846State, (obj), TYPE_ADS7846)
95
+
96
/* Control-byte bitfields */
97
#define CB_PD0        (1 << 0)
98
#define CB_PD1        (1 << 1)
99
@@ -XXX,XX +XXX,XX @@ static void ads7846_int_update(ADS7846State *s)
100
101
static uint32_t ads7846_transfer(SSISlave *dev, uint32_t value)
102
{
103
- ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, dev);
104
+ ADS7846State *s = ADS7846(dev);
105
106
switch (s->cycle ++) {
107
case 0:
108
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_ads7846 = {
109
static void ads7846_realize(SSISlave *d, Error **errp)
110
{
111
DeviceState *dev = DEVICE(d);
112
- ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, d);
113
+ ADS7846State *s = ADS7846(d);
114
115
qdev_init_gpio_out(dev, &s->interrupt, 1);
116
117
@@ -XXX,XX +XXX,XX @@ static void ads7846_class_init(ObjectClass *klass, void *data)
118
}
119
120
static const TypeInfo ads7846_info = {
121
- .name = "ads7846",
122
+ .name = TYPE_ADS7846,
123
.parent = TYPE_SSI_SLAVE,
124
.instance_size = sizeof(ADS7846State),
125
.class_init = ads7846_class_init,
126
diff --git a/hw/display/ssd0323.c b/hw/display/ssd0323.c
127
index XXXXXXX..XXXXXXX 100644
128
--- a/hw/display/ssd0323.c
129
+++ b/hw/display/ssd0323.c
130
@@ -XXX,XX +XXX,XX @@ typedef struct {
131
uint8_t framebuffer[128 * 80 / 2];
132
} ssd0323_state;
133
134
+#define TYPE_SSD0323 "ssd0323"
135
+#define SSD0323(obj) OBJECT_CHECK(ssd0323_state, (obj), TYPE_SSD0323)
136
+
137
+
138
static uint32_t ssd0323_transfer(SSISlave *dev, uint32_t data)
139
{
140
- ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, dev);
141
+ ssd0323_state *s = SSD0323(dev);
142
143
switch (s->mode) {
144
case SSD0323_DATA:
145
@@ -XXX,XX +XXX,XX @@ static const GraphicHwOps ssd0323_ops = {
146
static void ssd0323_realize(SSISlave *d, Error **errp)
147
{
148
DeviceState *dev = DEVICE(d);
149
- ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, d);
150
+ ssd0323_state *s = SSD0323(d);
151
152
s->col_end = 63;
153
s->row_end = 79;
154
@@ -XXX,XX +XXX,XX @@ static void ssd0323_class_init(ObjectClass *klass, void *data)
155
}
156
157
static const TypeInfo ssd0323_info = {
158
- .name = "ssd0323",
159
+ .name = TYPE_SSD0323,
160
.parent = TYPE_SSI_SLAVE,
161
.instance_size = sizeof(ssd0323_state),
162
.class_init = ssd0323_class_init,
163
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
164
index XXXXXXX..XXXXXXX 100644
165
--- a/hw/sd/ssi-sd.c
166
+++ b/hw/sd/ssi-sd.c
167
@@ -XXX,XX +XXX,XX @@ typedef struct {
168
169
static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
170
{
171
- ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, dev);
172
+ ssi_sd_state *s = SSI_SD(dev);
173
174
/* Special case: allow CMD12 (STOP TRANSMISSION) while reading data. */
175
if (s->mode == SSI_SD_DATA_READ && val == 0x4d) {
176
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_ssi_sd = {
177
178
static void ssi_sd_realize(SSISlave *d, Error **errp)
179
{
180
- ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, d);
181
+ ssi_sd_state *s = SSI_SD(d);
182
DeviceState *carddev;
183
DriveInfo *dinfo;
184
Error *err = NULL;
69
--
185
--
70
2.20.1
186
2.20.1
71
187
72
188
diff view generated by jsdifflib
1
Now that the watchdog device uses its Clock input rather than being
1
Deprecate our TileGX target support:
2
passed the value of system_clock_scale at creation time, we can
2
* we have no active maintainer for it
3
remove the hack where we reset the STELLARIS_SYS at board creation
3
* it has had essentially no contributions (other than tree-wide cleanups
4
time to force it to set system_clock_scale. Instead it will be reset
4
and similar) since it was first added
5
at the usual point in startup and will inform the watchdog of the
5
* the Linux kernel dropped support in 2018, as has glibc
6
clock frequency at that point.
6
7
Note the deprecation in the manual, but don't try to print a warning
8
when QEMU runs -- printing unsuppressable messages is more obtrusive
9
for linux-user mode than it would be for system-emulation mode, and
10
it doesn't seem worth trying to invent a new suppressible-error
11
system for linux-user just for this.
7
12
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Luc Michel <luc@lmichel.fr>
14
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
10
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20210128114145.20536-26-peter.maydell@linaro.org
16
Reviewed-by: Thomas Huth <thuth@redhat.com>
13
Message-id: 20210121190622.22000-26-peter.maydell@linaro.org
17
Message-id: 20200619154831.26319-1-peter.maydell@linaro.org
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
---
18
---
16
hw/arm/stellaris.c | 10 ----------
19
docs/system/deprecated.rst | 11 +++++++++++
17
1 file changed, 10 deletions(-)
20
1 file changed, 11 insertions(+)
18
21
19
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
22
diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst
20
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/stellaris.c
24
--- a/docs/system/deprecated.rst
22
+++ b/hw/arm/stellaris.c
25
+++ b/docs/system/deprecated.rst
23
@@ -XXX,XX +XXX,XX @@ static DeviceState *stellaris_sys_init(uint32_t base, qemu_irq irq,
26
@@ -XXX,XX +XXX,XX @@ The above, converted to the current supported format::
24
sysbus_mmio_map(sbd, 0, base);
27
25
sysbus_connect_irq(sbd, 0, irq);
28
json:{"file.driver":"rbd", "file.pool":"rbd", "file.image":"name"}
26
29
27
- /*
30
+linux-user mode CPUs
28
- * Normally we should not be resetting devices like this during
31
+--------------------
29
- * board creation. For the moment we need to do so, because
32
+
30
- * system_clock_scale will only get set when the STELLARIS_SYS
33
+``tilegx`` CPUs (since 5.1.0)
31
- * device is reset, and we need its initial value to pass to
34
+'''''''''''''''''''''''''''''
32
- * the watchdog device. This hack can be removed once the
35
+
33
- * watchdog has been converted to use a Clock input instead.
36
+The ``tilegx`` guest CPU support (which was only implemented in
34
- */
37
+linux-user mode) is deprecated and will be removed in a future version
35
- device_cold_reset(dev);
38
+of QEMU. Support for this CPU was removed from the upstream Linux
36
-
39
+kernel in 2018, and has also been dropped from glibc.
37
return dev;
40
+
38
}
41
Related binaries
42
----------------
39
43
40
--
44
--
41
2.20.1
45
2.20.1
42
46
43
47
diff view generated by jsdifflib