1
target-arm queue. The big thing here is the landing of the 3-phase
1
The following changes since commit 3db29dcac23da85486704ef9e7a8e7217f7829cd:
2
reset patches...
3
2
4
-- PMM
3
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging (2023-01-12 13:51:36 +0000)
5
6
The following changes since commit 204aa60b37c23a89e690d418f49787d274303ca7:
7
8
Merge remote-tracking branch 'remotes/amarkovic/tags/mips-queue-jan-29-2020' into staging (2020-01-30 14:18:45 +0000)
9
4
10
are available in the Git repository at:
5
are available in the Git repository at:
11
6
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200130
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230113
13
8
14
for you to fetch changes up to dea101a1ae9968c9fec6ab0291489dad7c49f36f:
9
for you to fetch changes up to 08899b5c68a55a3780d707e2464073c8f2670d31:
15
10
16
target/arm/cpu: Add the kvm-no-adjvtime CPU property (2020-01-30 16:02:06 +0000)
11
target/arm: allow writes to SCR_EL3.HXEn bit when FEAT_HCX is enabled (2023-01-13 13:19:36 +0000)
17
12
18
----------------------------------------------------------------
13
----------------------------------------------------------------
19
target-arm queue:
14
target-arm queue:
20
* hw/core/or-irq: Fix incorrect assert forbidding num-lines == MAX_OR_LINES
15
hw/arm/stm32f405: correctly describe the memory layout
21
* target/arm/arm-semi: Don't let the guest close stdin/stdout/stderr
16
hw/arm: Add Olimex H405 board
22
* aspeed: some minor bugfixes
17
cubieboard: Support booting from an SD card image with u-boot on it
23
* aspeed: add eMMC controller model for AST2600 SoC
18
target/arm: Fix sve_probe_page
24
* hw/arm/raspi: Remove obsolete use of -smp to set the soc 'enabled-cpus'
19
target/arm: allow writes to SCR_EL3.HXEn bit when FEAT_HCX is enabled
25
* New 3-phase reset API for device models
20
various code cleanups
26
* hw/intc/arm_gicv3_kvm: Stop wrongly programming GICR_PENDBASER.PTZ bit
27
* Arm KVM: stop/restart the guest counter when the VM is stopped and started
28
21
29
----------------------------------------------------------------
22
----------------------------------------------------------------
30
Andrew Jeffery (2):
23
Evgeny Iakovlev (1):
31
hw/sd: Configure number of slots exposed by the ASPEED SDHCI model
24
target/arm: allow writes to SCR_EL3.HXEn bit when FEAT_HCX is enabled
32
hw/arm: ast2600: Wire up the eMMC controller
33
25
34
Andrew Jones (6):
26
Felipe Balbi (2):
35
target/arm/kvm: trivial: Clean up header documentation
27
hw/arm/stm32f405: correctly describe the memory layout
36
hw/arm/virt: Add missing 5.0 options call to 4.2 options
28
hw/arm: Add Olimex H405
37
target/arm/kvm64: kvm64 cpus have timer registers
38
tests/arm-cpu-features: Check feature default values
39
target/arm/kvm: Implement virtual time adjustment
40
target/arm/cpu: Add the kvm-no-adjvtime CPU property
41
29
42
Cédric Le Goater (2):
30
Philippe Mathieu-Daudé (27):
43
ftgmac100: check RX and TX buffer alignment
31
hw/arm/pxa2xx: Simplify pxa255_init()
44
hw/arm/aspeed: add a 'execute-in-place' property to boot directly from CE0
32
hw/arm/pxa2xx: Simplify pxa270_init()
33
hw/arm/collie: Use the IEC binary prefix definitions
34
hw/arm/collie: Simplify flash creation using for() loop
35
hw/arm/gumstix: Improve documentation
36
hw/arm/gumstix: Use the IEC binary prefix definitions
37
hw/arm/mainstone: Use the IEC binary prefix definitions
38
hw/arm/musicpal: Use the IEC binary prefix definitions
39
hw/arm/omap_sx1: Remove unused 'total_ram' definitions
40
hw/arm/omap_sx1: Use the IEC binary prefix definitions
41
hw/arm/z2: Use the IEC binary prefix definitions
42
hw/arm/vexpress: Remove dead code in vexpress_common_init()
43
hw/arm: Remove unreachable code calling pflash_cfi01_register()
44
hw/arm/pxa: Avoid forward-declaring PXA2xxI2CState
45
hw/gpio/omap_gpio: Add local variable to avoid embedded cast
46
hw/arm/omap: Drop useless casts from void * to pointer
47
hw/gpio/omap_gpio: Use CamelCase for TYPE_OMAP1_GPIO type name
48
hw/gpio/omap_gpio: Use CamelCase for TYPE_OMAP2_GPIO type name
49
hw/intc/omap_intc: Use CamelCase for TYPE_OMAP_INTC type name
50
hw/arm/stellaris: Drop useless casts from void * to pointer
51
hw/arm/stellaris: Use CamelCase for STELLARIS_ADC type name
52
hw/arm/bcm2836: Remove definitions generated by OBJECT_DECLARE_TYPE()
53
hw/arm/npcm7xx: Declare QOM macros using OBJECT_DECLARE_SIMPLE_TYPE()
54
hw/misc/sbsa_ec: Rename TYPE_SBSA_EC -> TYPE_SBSA_SECURE_EC
55
hw/misc/sbsa_ec: Declare QOM macros using OBJECT_DECLARE_SIMPLE_TYPE()
56
hw/intc/xilinx_intc: Use 'XpsIntc' typedef instead of 'struct xlx_pic'
57
hw/timer/xilinx_timer: Use XpsTimerState instead of 'struct timerblock'
45
58
46
Damien Hedde (11):
59
Richard Henderson (1):
47
add device_legacy_reset function to prepare for reset api change
60
target/arm: Fix sve_probe_page
48
hw/core/qdev: add trace events to help with resettable transition
49
hw/core: create Resettable QOM interface
50
hw/core: add Resettable support to BusClass and DeviceClass
51
hw/core/resettable: add support for changing parent
52
hw/core/qdev: handle parent bus change regarding resettable
53
hw/core/qdev: update hotplug reset regarding resettable
54
hw/core: deprecate old reset functions and introduce new ones
55
docs/devel/reset.rst: add doc about Resettable interface
56
vl: replace deprecated qbus_reset_all registration
57
hw/s390x/ipl: replace deprecated qdev_reset_all registration
58
61
59
Joel Stanley (1):
62
Strahinja Jankovic (7):
60
misc/pca9552: Add qom set and get
63
hw/misc: Allwinner-A10 Clock Controller Module Emulation
64
hw/misc: Allwinner A10 DRAM Controller Emulation
65
{hw/i2c,docs/system/arm}: Allwinner TWI/I2C Emulation
66
hw/misc: AXP209 PMU Emulation
67
hw/arm: Add AXP209 to Cubieboard
68
hw/arm: Allwinner A10 enable SPL load from MMC
69
tests/avocado: Add SD boot test to Cubieboard
61
70
62
Peter Maydell (2):
71
docs/system/arm/cubieboard.rst | 1 +
63
hw/core/or-irq: Fix incorrect assert forbidding num-lines == MAX_OR_LINES
72
docs/system/arm/orangepi.rst | 1 +
64
target/arm/arm-semi: Don't let the guest close stdin/stdout/stderr
73
docs/system/arm/stm32.rst | 1 +
74
configs/devices/arm-softmmu/default.mak | 1 +
75
include/hw/adc/npcm7xx_adc.h | 7 +-
76
include/hw/arm/allwinner-a10.h | 27 ++
77
include/hw/arm/allwinner-h3.h | 3 +
78
include/hw/arm/npcm7xx.h | 18 +-
79
include/hw/arm/omap.h | 24 +-
80
include/hw/arm/pxa.h | 11 +-
81
include/hw/arm/stm32f405_soc.h | 5 +-
82
include/hw/i2c/allwinner-i2c.h | 55 ++++
83
include/hw/i2c/npcm7xx_smbus.h | 7 +-
84
include/hw/misc/allwinner-a10-ccm.h | 67 +++++
85
include/hw/misc/allwinner-a10-dramc.h | 68 +++++
86
include/hw/misc/npcm7xx_clk.h | 2 +-
87
include/hw/misc/npcm7xx_gcr.h | 6 +-
88
include/hw/misc/npcm7xx_mft.h | 7 +-
89
include/hw/misc/npcm7xx_pwm.h | 3 +-
90
include/hw/misc/npcm7xx_rng.h | 6 +-
91
include/hw/net/npcm7xx_emc.h | 5 +-
92
include/hw/sd/npcm7xx_sdhci.h | 4 +-
93
hw/arm/allwinner-a10.c | 40 +++
94
hw/arm/allwinner-h3.c | 11 +-
95
hw/arm/bcm2836.c | 9 +-
96
hw/arm/collie.c | 25 +-
97
hw/arm/cubieboard.c | 11 +
98
hw/arm/gumstix.c | 45 ++--
99
hw/arm/mainstone.c | 37 ++-
100
hw/arm/musicpal.c | 9 +-
101
hw/arm/olimex-stm32-h405.c | 69 +++++
102
hw/arm/omap1.c | 115 ++++----
103
hw/arm/omap2.c | 40 ++-
104
hw/arm/omap_sx1.c | 53 ++--
105
hw/arm/palm.c | 2 +-
106
hw/arm/pxa2xx.c | 8 +-
107
hw/arm/spitz.c | 6 +-
108
hw/arm/stellaris.c | 73 +++--
109
hw/arm/stm32f405_soc.c | 8 +
110
hw/arm/tosa.c | 2 +-
111
hw/arm/versatilepb.c | 6 +-
112
hw/arm/vexpress.c | 10 +-
113
hw/arm/z2.c | 16 +-
114
hw/char/omap_uart.c | 7 +-
115
hw/display/omap_dss.c | 15 +-
116
hw/display/omap_lcdc.c | 9 +-
117
hw/dma/omap_dma.c | 15 +-
118
hw/gpio/omap_gpio.c | 48 ++--
119
hw/i2c/allwinner-i2c.c | 459 ++++++++++++++++++++++++++++++++
120
hw/intc/omap_intc.c | 38 +--
121
hw/intc/xilinx_intc.c | 28 +-
122
hw/misc/allwinner-a10-ccm.c | 224 ++++++++++++++++
123
hw/misc/allwinner-a10-dramc.c | 179 +++++++++++++
124
hw/misc/axp209.c | 238 +++++++++++++++++
125
hw/misc/omap_gpmc.c | 12 +-
126
hw/misc/omap_l4.c | 7 +-
127
hw/misc/omap_sdrc.c | 7 +-
128
hw/misc/omap_tap.c | 5 +-
129
hw/misc/sbsa_ec.c | 12 +-
130
hw/sd/omap_mmc.c | 9 +-
131
hw/ssi/omap_spi.c | 7 +-
132
hw/timer/omap_gptimer.c | 22 +-
133
hw/timer/omap_synctimer.c | 4 +-
134
hw/timer/xilinx_timer.c | 27 +-
135
target/arm/helper.c | 3 +
136
target/arm/sve_helper.c | 14 +-
137
MAINTAINERS | 8 +
138
hw/arm/Kconfig | 9 +
139
hw/arm/meson.build | 1 +
140
hw/i2c/Kconfig | 4 +
141
hw/i2c/meson.build | 1 +
142
hw/i2c/trace-events | 5 +
143
hw/misc/Kconfig | 10 +
144
hw/misc/meson.build | 3 +
145
hw/misc/trace-events | 5 +
146
tests/avocado/boot_linux_console.py | 47 ++++
147
76 files changed, 1951 insertions(+), 455 deletions(-)
148
create mode 100644 include/hw/i2c/allwinner-i2c.h
149
create mode 100644 include/hw/misc/allwinner-a10-ccm.h
150
create mode 100644 include/hw/misc/allwinner-a10-dramc.h
151
create mode 100644 hw/arm/olimex-stm32-h405.c
152
create mode 100644 hw/i2c/allwinner-i2c.c
153
create mode 100644 hw/misc/allwinner-a10-ccm.c
154
create mode 100644 hw/misc/allwinner-a10-dramc.c
155
create mode 100644 hw/misc/axp209.c
65
156
66
Philippe Mathieu-Daudé (1):
67
hw/arm/raspi: Remove obsolete use of -smp to set the soc 'enabled-cpus'
68
69
Zenghui Yu (1):
70
hw/intc/arm_gicv3_kvm: Stop wrongly programming GICR_PENDBASER.PTZ bit
71
72
hw/core/Makefile.objs | 1 +
73
tests/Makefile.include | 1 +
74
include/hw/arm/aspeed.h | 2 +
75
include/hw/arm/aspeed_soc.h | 2 +
76
include/hw/arm/virt.h | 1 +
77
include/hw/qdev-core.h | 58 +++++++-
78
include/hw/resettable.h | 247 +++++++++++++++++++++++++++++++++
79
include/hw/sd/aspeed_sdhci.h | 1 +
80
target/arm/cpu.h | 7 +
81
target/arm/kvm_arm.h | 95 ++++++++++---
82
hw/arm/aspeed.c | 72 ++++++++--
83
hw/arm/aspeed_ast2600.c | 31 ++++-
84
hw/arm/aspeed_soc.c | 2 +
85
hw/arm/raspi.c | 2 -
86
hw/arm/virt.c | 9 ++
87
hw/audio/intel-hda.c | 2 +-
88
hw/core/bus.c | 102 ++++++++++++++
89
hw/core/or-irq.c | 2 +-
90
hw/core/qdev.c | 160 ++++++++++++++++++++--
91
hw/core/resettable.c | 301 +++++++++++++++++++++++++++++++++++++++++
92
hw/hyperv/hyperv.c | 2 +-
93
hw/i386/microvm.c | 2 +-
94
hw/i386/pc.c | 2 +-
95
hw/ide/microdrive.c | 8 +-
96
hw/intc/arm_gicv3_kvm.c | 11 +-
97
hw/intc/spapr_xive.c | 2 +-
98
hw/misc/pca9552.c | 90 ++++++++++++
99
hw/net/ftgmac100.c | 13 ++
100
hw/ppc/pnv_psi.c | 4 +-
101
hw/ppc/spapr_pci.c | 2 +-
102
hw/ppc/spapr_vio.c | 2 +-
103
hw/s390x/ipl.c | 10 +-
104
hw/s390x/s390-pci-inst.c | 2 +-
105
hw/scsi/vmw_pvscsi.c | 2 +-
106
hw/sd/aspeed_sdhci.c | 11 +-
107
hw/sd/omap_mmc.c | 2 +-
108
hw/sd/pl181.c | 2 +-
109
target/arm/arm-semi.c | 9 ++
110
target/arm/cpu.c | 2 +
111
target/arm/cpu64.c | 1 +
112
target/arm/kvm.c | 120 ++++++++++++++++
113
target/arm/kvm32.c | 3 +
114
target/arm/kvm64.c | 4 +
115
target/arm/machine.c | 7 +
116
target/arm/monitor.c | 1 +
117
tests/qtest/arm-cpu-features.c | 41 ++++--
118
vl.c | 10 +-
119
docs/arm-cpu-features.rst | 37 ++++-
120
docs/devel/index.rst | 1 +
121
docs/devel/reset.rst | 289 +++++++++++++++++++++++++++++++++++++++
122
hw/core/trace-events | 27 ++++
123
51 files changed, 1727 insertions(+), 90 deletions(-)
124
create mode 100644 include/hw/resettable.h
125
create mode 100644 hw/core/resettable.c
126
create mode 100644 docs/devel/reset.rst
127
diff view generated by jsdifflib
New patch
1
From: Felipe Balbi <balbi@kernel.org>
1
2
3
STM32F405 has 128K of SRAM and another 64K of CCM (Core-coupled
4
Memory) at a different base address. Correctly describe the memory
5
layout to give existing FW images a chance to run unmodified.
6
7
Reviewed-by: Alistair Francis <alistair@alistair23.me>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Felipe Balbi <balbi@kernel.org>
10
Message-id: 20221230145733.200496-2-balbi@kernel.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
include/hw/arm/stm32f405_soc.h | 5 ++++-
14
hw/arm/stm32f405_soc.c | 8 ++++++++
15
2 files changed, 12 insertions(+), 1 deletion(-)
16
17
diff --git a/include/hw/arm/stm32f405_soc.h b/include/hw/arm/stm32f405_soc.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/stm32f405_soc.h
20
+++ b/include/hw/arm/stm32f405_soc.h
21
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(STM32F405State, STM32F405_SOC)
22
#define FLASH_BASE_ADDRESS 0x08000000
23
#define FLASH_SIZE (1024 * 1024)
24
#define SRAM_BASE_ADDRESS 0x20000000
25
-#define SRAM_SIZE (192 * 1024)
26
+#define SRAM_SIZE (128 * 1024)
27
+#define CCM_BASE_ADDRESS 0x10000000
28
+#define CCM_SIZE (64 * 1024)
29
30
struct STM32F405State {
31
/*< private >*/
32
@@ -XXX,XX +XXX,XX @@ struct STM32F405State {
33
STM32F2XXADCState adc[STM_NUM_ADCS];
34
STM32F2XXSPIState spi[STM_NUM_SPIS];
35
36
+ MemoryRegion ccm;
37
MemoryRegion sram;
38
MemoryRegion flash;
39
MemoryRegion flash_alias;
40
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/arm/stm32f405_soc.c
43
+++ b/hw/arm/stm32f405_soc.c
44
@@ -XXX,XX +XXX,XX @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
45
}
46
memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
47
48
+ memory_region_init_ram(&s->ccm, NULL, "STM32F405.ccm", CCM_SIZE,
49
+ &err);
50
+ if (err != NULL) {
51
+ error_propagate(errp, err);
52
+ return;
53
+ }
54
+ memory_region_add_subregion(system_memory, CCM_BASE_ADDRESS, &s->ccm);
55
+
56
armv7m = DEVICE(&s->armv7m);
57
qdev_prop_set_uint32(armv7m, "num-irq", 96);
58
qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
59
--
60
2.34.1
61
62
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Felipe Balbi <balbi@kernel.org>
2
2
3
Add a function resettable_change_parent() to do the required
3
Olimex makes a series of low-cost STM32 boards. This commit introduces
4
plumbing when changing the parent a of Resettable object.
4
the minimum setup to support SMT32-H405. See [1] for details
5
5
6
We need to make sure that the reset state of the object remains
6
[1] https://www.olimex.com/Products/ARM/ST/STM32-H405/
7
coherent with the reset state of the new parent.
8
7
9
We make the 2 following hypothesis:
8
Signed-off-by: Felipe Balbi <balbi@kernel.org>
10
+ when an object is put in a parent under reset, the object goes in
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
reset.
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
+ when an object is removed from a parent under reset, the object
11
Message-id: 20221230145733.200496-3-balbi@kernel.org
13
leaves reset.
14
15
The added function avoids any glitch if both old and new parent are
16
already in reset.
17
18
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
21
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
22
Message-id: 20200123132823.1117486-6-damien.hedde@greensocs.com
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
13
---
25
include/hw/resettable.h | 16 +++++++++++
14
docs/system/arm/stm32.rst | 1 +
26
hw/core/resettable.c | 62 +++++++++++++++++++++++++++++++++++++++--
15
configs/devices/arm-softmmu/default.mak | 1 +
27
hw/core/trace-events | 1 +
16
hw/arm/olimex-stm32-h405.c | 69 +++++++++++++++++++++++++
28
3 files changed, 77 insertions(+), 2 deletions(-)
17
MAINTAINERS | 6 +++
18
hw/arm/Kconfig | 4 ++
19
hw/arm/meson.build | 1 +
20
6 files changed, 82 insertions(+)
21
create mode 100644 hw/arm/olimex-stm32-h405.c
29
22
30
diff --git a/include/hw/resettable.h b/include/hw/resettable.h
23
diff --git a/docs/system/arm/stm32.rst b/docs/system/arm/stm32.rst
31
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
32
--- a/include/hw/resettable.h
25
--- a/docs/system/arm/stm32.rst
33
+++ b/include/hw/resettable.h
26
+++ b/docs/system/arm/stm32.rst
34
@@ -XXX,XX +XXX,XX @@ void resettable_release_reset(Object *obj, ResetType type);
27
@@ -XXX,XX +XXX,XX @@ The STM32F4 series is based on ARM Cortex-M4F core. This series is pin-to-pin
35
*/
28
compatible with STM32F2 series. The following machines are based on this chip :
36
bool resettable_is_in_reset(Object *obj);
29
37
30
- ``netduinoplus2`` Netduino Plus 2 board with STM32F405RGT6 microcontroller
38
+/**
31
+- ``olimex-stm32-h405`` Olimex STM32 H405 board with STM32F405RGT6 microcontroller
39
+ * resettable_change_parent:
32
40
+ * Indicate that the parent of Ressettable @obj is changing from @oldp to @newp.
33
There are many other STM32 series that are currently not supported by QEMU.
41
+ * All 3 objects must implement resettable interface. @oldp or @newp may be
34
42
+ * NULL.
35
diff --git a/configs/devices/arm-softmmu/default.mak b/configs/devices/arm-softmmu/default.mak
36
index XXXXXXX..XXXXXXX 100644
37
--- a/configs/devices/arm-softmmu/default.mak
38
+++ b/configs/devices/arm-softmmu/default.mak
39
@@ -XXX,XX +XXX,XX @@ CONFIG_COLLIE=y
40
CONFIG_ASPEED_SOC=y
41
CONFIG_NETDUINO2=y
42
CONFIG_NETDUINOPLUS2=y
43
+CONFIG_OLIMEX_STM32_H405=y
44
CONFIG_MPS2=y
45
CONFIG_RASPI=y
46
CONFIG_DIGIC=y
47
diff --git a/hw/arm/olimex-stm32-h405.c b/hw/arm/olimex-stm32-h405.c
48
new file mode 100644
49
index XXXXXXX..XXXXXXX
50
--- /dev/null
51
+++ b/hw/arm/olimex-stm32-h405.c
52
@@ -XXX,XX +XXX,XX @@
53
+/*
54
+ * ST STM32VLDISCOVERY machine
55
+ * Olimex STM32-H405 machine
43
+ *
56
+ *
44
+ * This function will adapt the reset state of @obj so that it is coherent
57
+ * Copyright (c) 2022 Felipe Balbi <balbi@kernel.org>
45
+ * with the reset state of @newp. It may trigger @resettable_assert_reset()
46
+ * or @resettable_release_reset(). It will do such things only if the reset
47
+ * state of @newp and @oldp are different.
48
+ *
58
+ *
49
+ * When using this function during reset, it must only be called during
59
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
50
+ * a hold phase method. Calling this during enter or exit phase is an error.
60
+ * of this software and associated documentation files (the "Software"), to deal
61
+ * in the Software without restriction, including without limitation the rights
62
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
63
+ * copies of the Software, and to permit persons to whom the Software is
64
+ * furnished to do so, subject to the following conditions:
65
+ *
66
+ * The above copyright notice and this permission notice shall be included in
67
+ * all copies or substantial portions of the Software.
68
+ *
69
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
70
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
71
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
72
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
73
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
74
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
75
+ * THE SOFTWARE.
51
+ */
76
+ */
52
+void resettable_change_parent(Object *obj, Object *newp, Object *oldp);
53
+
77
+
54
/**
78
+#include "qemu/osdep.h"
55
* resettable_class_set_parent_phases:
79
+#include "qapi/error.h"
56
*
80
+#include "hw/boards.h"
57
diff --git a/hw/core/resettable.c b/hw/core/resettable.c
81
+#include "hw/qdev-properties.h"
58
index XXXXXXX..XXXXXXX 100644
82
+#include "hw/qdev-clock.h"
59
--- a/hw/core/resettable.c
83
+#include "qemu/error-report.h"
60
+++ b/hw/core/resettable.c
84
+#include "hw/arm/stm32f405_soc.h"
61
@@ -XXX,XX +XXX,XX @@ static void resettable_phase_exit(Object *obj, void *opaque, ResetType type);
85
+#include "hw/arm/boot.h"
62
* enter_phase_in_progress:
86
+
63
* True if we are currently in reset enter phase.
87
+/* olimex-stm32-h405 implementation is derived from netduinoplus2 */
64
*
88
+
65
- * Note: This flag is only used to guarantee (using asserts) that the reset
89
+/* Main SYSCLK frequency in Hz (168MHz) */
66
- * API is used correctly. We can use a global variable because we rely on the
90
+#define SYSCLK_FRQ 168000000ULL
67
+ * exit_phase_in_progress:
91
+
68
+ * count the number of exit phase we are in.
92
+static void olimex_stm32_h405_init(MachineState *machine)
69
+ *
70
+ * Note: These flags are only used to guarantee (using asserts) that the reset
71
+ * API is used correctly. We can use global variables because we rely on the
72
* iothread mutex to ensure only one reset operation is in a progress at a
73
* given time.
74
*/
75
static bool enter_phase_in_progress;
76
+static unsigned exit_phase_in_progress;
77
78
void resettable_reset(Object *obj, ResetType type)
79
{
80
@@ -XXX,XX +XXX,XX @@ void resettable_release_reset(Object *obj, ResetType type)
81
trace_resettable_reset_release_begin(obj, type);
82
assert(!enter_phase_in_progress);
83
84
+ exit_phase_in_progress += 1;
85
resettable_phase_exit(obj, NULL, type);
86
+ exit_phase_in_progress -= 1;
87
88
trace_resettable_reset_release_end(obj);
89
}
90
@@ -XXX,XX +XXX,XX @@ static void resettable_phase_exit(Object *obj, void *opaque, ResetType type)
91
trace_resettable_phase_exit_end(obj, obj_typename, s->count);
92
}
93
94
+/*
95
+ * resettable_get_count:
96
+ * Get the count of the Resettable object @obj. Return 0 if @obj is NULL.
97
+ */
98
+static unsigned resettable_get_count(Object *obj)
99
+{
93
+{
100
+ if (obj) {
94
+ DeviceState *dev;
101
+ ResettableClass *rc = RESETTABLE_GET_CLASS(obj);
95
+ Clock *sysclk;
102
+ return rc->get_state(obj)->count;
96
+
103
+ }
97
+ /* This clock doesn't need migration because it is fixed-frequency */
104
+ return 0;
98
+ sysclk = clock_new(OBJECT(machine), "SYSCLK");
99
+ clock_set_hz(sysclk, SYSCLK_FRQ);
100
+
101
+ dev = qdev_new(TYPE_STM32F405_SOC);
102
+ qdev_prop_set_string(dev, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m4"));
103
+ qdev_connect_clock_in(dev, "sysclk", sysclk);
104
+ sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
105
+
106
+ armv7m_load_kernel(ARM_CPU(first_cpu),
107
+ machine->kernel_filename,
108
+ 0, FLASH_SIZE);
105
+}
109
+}
106
+
110
+
107
+void resettable_change_parent(Object *obj, Object *newp, Object *oldp)
111
+static void olimex_stm32_h405_machine_init(MachineClass *mc)
108
+{
112
+{
109
+ ResettableClass *rc = RESETTABLE_GET_CLASS(obj);
113
+ mc->desc = "Olimex STM32-H405 (Cortex-M4)";
110
+ ResettableState *s = rc->get_state(obj);
114
+ mc->init = olimex_stm32_h405_init;
111
+ unsigned newp_count = resettable_get_count(newp);
115
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m4");
112
+ unsigned oldp_count = resettable_get_count(oldp);
113
+
116
+
114
+ /*
117
+ /* SRAM pre-allocated as part of the SoC instantiation */
115
+ * Ensure we do not change parent when in enter or exit phase.
118
+ mc->default_ram_size = 0;
116
+ * During these phases, the reset subtree being updated is partly in reset
117
+ * and partly not in reset (it depends on the actual position in
118
+ * resettable_child_foreach()s). We are not able to tell in which part is a
119
+ * leaving or arriving device. Thus we cannot set the reset count of the
120
+ * moving device to the proper value.
121
+ */
122
+ assert(!enter_phase_in_progress && !exit_phase_in_progress);
123
+ trace_resettable_change_parent(obj, oldp, oldp_count, newp, newp_count);
124
+
125
+ /*
126
+ * At most one of the two 'for' loops will be executed below
127
+ * in order to cope with the difference between the two counts.
128
+ */
129
+ /* if newp is more reset than oldp */
130
+ for (unsigned i = oldp_count; i < newp_count; i++) {
131
+ resettable_assert_reset(obj, RESET_TYPE_COLD);
132
+ }
133
+ /*
134
+ * if obj is leaving a bus under reset, we need to ensure
135
+ * hold phase is not pending.
136
+ */
137
+ if (oldp_count && s->hold_phase_pending) {
138
+ resettable_phase_hold(obj, NULL, RESET_TYPE_COLD);
139
+ }
140
+ /* if oldp is more reset than newp */
141
+ for (unsigned i = newp_count; i < oldp_count; i++) {
142
+ resettable_release_reset(obj, RESET_TYPE_COLD);
143
+ }
144
+}
119
+}
145
+
120
+
146
void resettable_class_set_parent_phases(ResettableClass *rc,
121
+DEFINE_MACHINE("olimex-stm32-h405", olimex_stm32_h405_machine_init)
147
ResettableEnterPhase enter,
122
diff --git a/MAINTAINERS b/MAINTAINERS
148
ResettableHoldPhase hold,
149
diff --git a/hw/core/trace-events b/hw/core/trace-events
150
index XXXXXXX..XXXXXXX 100644
123
index XXXXXXX..XXXXXXX 100644
151
--- a/hw/core/trace-events
124
--- a/MAINTAINERS
152
+++ b/hw/core/trace-events
125
+++ b/MAINTAINERS
153
@@ -XXX,XX +XXX,XX @@ resettable_reset_assert_begin(void *obj, int cold) "obj=%p cold=%d"
126
@@ -XXX,XX +XXX,XX @@ L: qemu-arm@nongnu.org
154
resettable_reset_assert_end(void *obj) "obj=%p"
127
S: Maintained
155
resettable_reset_release_begin(void *obj, int cold) "obj=%p cold=%d"
128
F: hw/arm/netduinoplus2.c
156
resettable_reset_release_end(void *obj) "obj=%p"
129
157
+resettable_change_parent(void *obj, void *o, unsigned oc, void *n, unsigned nc) "obj=%p from=%p(%d) to=%p(%d)"
130
+Olimex STM32 H405
158
resettable_phase_enter_begin(void *obj, const char *objtype, unsigned count, int type) "obj=%p(%s) count=%d type=%d"
131
+M: Felipe Balbi <balbi@kernel.org>
159
resettable_phase_enter_exec(void *obj, const char *objtype, int type, int has_method) "obj=%p(%s) type=%d method=%d"
132
+L: qemu-arm@nongnu.org
160
resettable_phase_enter_end(void *obj, const char *objtype, unsigned count) "obj=%p(%s) count=%d"
133
+S: Maintained
134
+F: hw/arm/olimex-stm32-h405.c
135
+
136
SmartFusion2
137
M: Subbaraya Sundeep <sundeep.lkml@gmail.com>
138
M: Peter Maydell <peter.maydell@linaro.org>
139
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
140
index XXXXXXX..XXXXXXX 100644
141
--- a/hw/arm/Kconfig
142
+++ b/hw/arm/Kconfig
143
@@ -XXX,XX +XXX,XX @@ config NETDUINOPLUS2
144
bool
145
select STM32F405_SOC
146
147
+config OLIMEX_STM32_H405
148
+ bool
149
+ select STM32F405_SOC
150
+
151
config NSERIES
152
bool
153
select OMAP
154
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
155
index XXXXXXX..XXXXXXX 100644
156
--- a/hw/arm/meson.build
157
+++ b/hw/arm/meson.build
158
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_MICROBIT', if_true: files('microbit.c'))
159
arm_ss.add(when: 'CONFIG_MUSICPAL', if_true: files('musicpal.c'))
160
arm_ss.add(when: 'CONFIG_NETDUINO2', if_true: files('netduino2.c'))
161
arm_ss.add(when: 'CONFIG_NETDUINOPLUS2', if_true: files('netduinoplus2.c'))
162
+arm_ss.add(when: 'CONFIG_OLIMEX_STM32_H405', if_true: files('olimex-stm32-h405.c'))
163
arm_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx.c', 'npcm7xx_boards.c'))
164
arm_ss.add(when: 'CONFIG_NSERIES', if_true: files('nseries.c'))
165
arm_ss.add(when: 'CONFIG_SX1', if_true: files('omap_sx1.c'))
161
--
166
--
162
2.20.1
167
2.34.1
163
168
164
169
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
2
2
3
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
3
During SPL boot several Clock Controller Module (CCM) registers are
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
read, most important are PLL and Tuning, as well as divisor registers.
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Message-id: 20200123132823.1117486-10-damien.hedde@greensocs.com
6
This patch adds these registers and initializes reset values from user's
7
guide.
8
9
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
10
11
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
12
Message-id: 20221226220303.14420-2-strahinja.p.jankovic@gmail.com
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
14
---
9
docs/devel/index.rst | 1 +
15
include/hw/arm/allwinner-a10.h | 2 +
10
docs/devel/reset.rst | 289 +++++++++++++++++++++++++++++++++++++++++++
16
include/hw/misc/allwinner-a10-ccm.h | 67 +++++++++
11
2 files changed, 290 insertions(+)
17
hw/arm/allwinner-a10.c | 7 +
12
create mode 100644 docs/devel/reset.rst
18
hw/misc/allwinner-a10-ccm.c | 224 ++++++++++++++++++++++++++++
19
hw/arm/Kconfig | 1 +
20
hw/misc/Kconfig | 3 +
21
hw/misc/meson.build | 1 +
22
7 files changed, 305 insertions(+)
23
create mode 100644 include/hw/misc/allwinner-a10-ccm.h
24
create mode 100644 hw/misc/allwinner-a10-ccm.c
13
25
14
diff --git a/docs/devel/index.rst b/docs/devel/index.rst
26
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
15
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/devel/index.rst
28
--- a/include/hw/arm/allwinner-a10.h
17
+++ b/docs/devel/index.rst
29
+++ b/include/hw/arm/allwinner-a10.h
18
@@ -XXX,XX +XXX,XX @@ Contents:
30
@@ -XXX,XX +XXX,XX @@
19
tcg
31
#include "hw/usb/hcd-ohci.h"
20
tcg-plugins
32
#include "hw/usb/hcd-ehci.h"
21
bitops
33
#include "hw/rtc/allwinner-rtc.h"
22
+ reset
34
+#include "hw/misc/allwinner-a10-ccm.h"
23
diff --git a/docs/devel/reset.rst b/docs/devel/reset.rst
35
36
#include "target/arm/cpu.h"
37
#include "qom/object.h"
38
@@ -XXX,XX +XXX,XX @@ struct AwA10State {
39
/*< public >*/
40
41
ARMCPU cpu;
42
+ AwA10ClockCtlState ccm;
43
AwA10PITState timer;
44
AwA10PICState intc;
45
AwEmacState emac;
46
diff --git a/include/hw/misc/allwinner-a10-ccm.h b/include/hw/misc/allwinner-a10-ccm.h
24
new file mode 100644
47
new file mode 100644
25
index XXXXXXX..XXXXXXX
48
index XXXXXXX..XXXXXXX
26
--- /dev/null
49
--- /dev/null
27
+++ b/docs/devel/reset.rst
50
+++ b/include/hw/misc/allwinner-a10-ccm.h
28
@@ -XXX,XX +XXX,XX @@
51
@@ -XXX,XX +XXX,XX @@
29
+
52
+/*
30
+=======================================
53
+ * Allwinner A10 Clock Control Module emulation
31
+Reset in QEMU: the Resettable interface
54
+ *
32
+=======================================
55
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
33
+
56
+ *
34
+The reset of qemu objects is handled using the resettable interface declared
57
+ * This file is derived from Allwinner H3 CCU,
35
+in ``include/hw/resettable.h``.
58
+ * by Niek Linnenbank.
36
+
59
+ *
37
+This interface allows objects to be grouped (on a tree basis); so that the
60
+ * This program is free software: you can redistribute it and/or modify
38
+whole group can be reset consistently. Each individual member object does not
61
+ * it under the terms of the GNU General Public License as published by
39
+have to care about others; in particular, problems of order (which object is
62
+ * the Free Software Foundation, either version 2 of the License, or
40
+reset first) are addressed.
63
+ * (at your option) any later version.
41
+
64
+ *
42
+As of now DeviceClass and BusClass implement this interface.
65
+ * This program is distributed in the hope that it will be useful,
43
+
66
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
44
+
67
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
45
+Triggering reset
68
+ * GNU General Public License for more details.
46
+----------------
69
+ *
47
+
70
+ * You should have received a copy of the GNU General Public License
48
+This section documents the APIs which "users" of a resettable object should use
71
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
49
+to control it. All resettable control functions must be called while holding
72
+ */
50
+the iothread lock.
73
+
51
+
74
+#ifndef HW_MISC_ALLWINNER_A10_CCM_H
52
+You can apply a reset to an object using ``resettable_assert_reset()``. You need
75
+#define HW_MISC_ALLWINNER_A10_CCM_H
53
+to call ``resettable_release_reset()`` to release the object from reset. To
76
+
54
+instantly reset an object, without keeping it in reset state, just call
77
+#include "qom/object.h"
55
+``resettable_reset()``. These functions take two parameters: a pointer to the
78
+#include "hw/sysbus.h"
56
+object to reset and a reset type.
79
+
57
+
80
+/**
58
+Several types of reset will be supported. For now only cold reset is defined;
81
+ * @name Constants
59
+others may be added later. The Resettable interface handles reset types with an
82
+ * @{
60
+enum:
83
+ */
61
+
84
+
62
+``RESET_TYPE_COLD``
85
+/** Size of register I/O address space used by CCM device */
63
+ Cold reset is supported by every resettable object. In QEMU, it means we reset
86
+#define AW_A10_CCM_IOSIZE (0x400)
64
+ to the initial state corresponding to the start of QEMU; this might differ
87
+
65
+ from what is a real hardware cold reset. It differs from other resets (like
88
+/** Total number of known registers */
66
+ warm or bus resets) which may keep certain parts untouched.
89
+#define AW_A10_CCM_REGS_NUM (AW_A10_CCM_IOSIZE / sizeof(uint32_t))
67
+
90
+
68
+Calling ``resettable_reset()`` is equivalent to calling
91
+/** @} */
69
+``resettable_assert_reset()`` then ``resettable_release_reset()``. It is
92
+
70
+possible to interleave multiple calls to these three functions. There may
93
+/**
71
+be several reset sources/controllers of a given object. The interface handles
94
+ * @name Object model
72
+everything and the different reset controllers do not need to know anything
95
+ * @{
73
+about each others. The object will leave reset state only when each other
96
+ */
74
+controllers end their reset operation. This point is handled internally by
97
+
75
+maintaining a count of in-progress resets; it is crucial to call
98
+#define TYPE_AW_A10_CCM "allwinner-a10-ccm"
76
+``resettable_release_reset()`` one time and only one time per
99
+OBJECT_DECLARE_SIMPLE_TYPE(AwA10ClockCtlState, AW_A10_CCM)
77
+``resettable_assert_reset()`` call.
100
+
78
+
101
+/** @} */
79
+For now migration of a device or bus in reset is not supported. Care must be
102
+
80
+taken not to delay ``resettable_release_reset()`` after its
103
+/**
81
+``resettable_assert_reset()`` counterpart.
104
+ * Allwinner A10 CCM object instance state.
82
+
105
+ */
83
+Note that, since resettable is an interface, the API takes a simple Object as
106
+struct AwA10ClockCtlState {
84
+parameter. Still, it is a programming error to call a resettable function on a
107
+ /*< private >*/
85
+non-resettable object and it will trigger a run time assert error. Since most
108
+ SysBusDevice parent_obj;
86
+calls to resettable interface are done through base class functions, such an
109
+ /*< public >*/
87
+error is not likely to happen.
110
+
88
+
111
+ /** Maps I/O registers in physical memory */
89
+For Devices and Buses, the following helper functions exist:
112
+ MemoryRegion iomem;
90
+
113
+
91
+- ``device_cold_reset()``
114
+ /** Array of hardware registers */
92
+- ``bus_cold_reset()``
115
+ uint32_t regs[AW_A10_CCM_REGS_NUM];
93
+
116
+};
94
+These are simple wrappers around resettable_reset() function; they only cast the
117
+
95
+Device or Bus into an Object and pass the cold reset type. When possible
118
+#endif /* HW_MISC_ALLWINNER_H3_CCU_H */
96
+prefer to use these functions instead of ``resettable_reset()``.
119
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
97
+
120
index XXXXXXX..XXXXXXX 100644
98
+Device and bus functions co-exist because there can be semantic differences
121
--- a/hw/arm/allwinner-a10.c
99
+between resetting a bus and resetting the controller bridge which owns it.
122
+++ b/hw/arm/allwinner-a10.c
100
+For example, consider a SCSI controller. Resetting the controller puts all
123
@@ -XXX,XX +XXX,XX @@
101
+its registers back to what reset state was as well as reset everything on the
124
#include "hw/usb/hcd-ohci.h"
102
+SCSI bus, whereas resetting just the SCSI bus only resets everything that's on
125
103
+it but not the controller.
126
#define AW_A10_MMC0_BASE 0x01c0f000
104
+
127
+#define AW_A10_CCM_BASE 0x01c20000
105
+
128
#define AW_A10_PIC_REG_BASE 0x01c20400
106
+Multi-phase mechanism
129
#define AW_A10_PIT_REG_BASE 0x01c20c00
107
+---------------------
130
#define AW_A10_UART0_REG_BASE 0x01c28000
108
+
131
@@ -XXX,XX +XXX,XX @@ static void aw_a10_init(Object *obj)
109
+This section documents the internals of the resettable interface.
132
110
+
133
object_initialize_child(obj, "timer", &s->timer, TYPE_AW_A10_PIT);
111
+The resettable interface uses a multi-phase system to relieve objects and
134
112
+machines from reset ordering problems. To address this, the reset operation
135
+ object_initialize_child(obj, "ccm", &s->ccm, TYPE_AW_A10_CCM);
113
+of an object is split into three well defined phases.
136
+
114
+
137
object_initialize_child(obj, "emac", &s->emac, TYPE_AW_EMAC);
115
+When resetting several objects (for example the whole machine at simulation
138
116
+startup), all first phases of all objects are executed, then all second phases
139
object_initialize_child(obj, "sata", &s->sata, TYPE_ALLWINNER_AHCI);
117
+and then all third phases.
140
@@ -XXX,XX +XXX,XX @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
118
+
141
memory_region_add_subregion(get_system_memory(), 0x00000000, &s->sram_a);
119
+The three phases are:
142
create_unimplemented_device("a10-sram-ctrl", 0x01c00000, 4 * KiB);
120
+
143
121
+1. The **enter** phase is executed when the object enters reset. It resets only
144
+ /* Clock Control Module */
122
+ local state of the object; it must not do anything that has a side-effect
145
+ sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &error_fatal);
123
+ on other objects, such as raising or lowering a qemu_irq line or reading or
146
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, AW_A10_CCM_BASE);
124
+ writing guest memory.
147
+
125
+
148
/* FIXME use qdev NIC properties instead of nd_table[] */
126
+2. The **hold** phase is executed for entry into reset, once every object in the
149
if (nd_table[0].used) {
127
+ group which is being reset has had its *enter* phase executed. At this point
150
qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC);
128
+ devices can do actions that affect other objects.
151
diff --git a/hw/misc/allwinner-a10-ccm.c b/hw/misc/allwinner-a10-ccm.c
129
+
152
new file mode 100644
130
+3. The **exit** phase is executed when the object leaves the reset state.
153
index XXXXXXX..XXXXXXX
131
+ Actions affecting other objects are permitted.
154
--- /dev/null
132
+
155
+++ b/hw/misc/allwinner-a10-ccm.c
133
+As said in previous section, the interface maintains a count of reset. This
156
@@ -XXX,XX +XXX,XX @@
134
+count is used to ensure phases are executed only when required. *enter* and
157
+/*
135
+*hold* phases are executed only when asserting reset for the first time
158
+ * Allwinner A10 Clock Control Module emulation
136
+(if an object is already in reset state when calling
159
+ *
137
+``resettable_assert_reset()`` or ``resettable_reset()``, they are not
160
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
138
+executed).
161
+ *
139
+The *exit* phase is executed only when the last reset operation ends. Therefore
162
+ * This file is derived from Allwinner H3 CCU,
140
+the object does not need to care how many of reset controllers it has and how
163
+ * by Niek Linnenbank.
141
+many of them have started a reset.
164
+ *
142
+
165
+ * This program is free software: you can redistribute it and/or modify
143
+
166
+ * it under the terms of the GNU General Public License as published by
144
+Handling reset in a resettable object
167
+ * the Free Software Foundation, either version 2 of the License, or
145
+-------------------------------------
168
+ * (at your option) any later version.
146
+
169
+ *
147
+This section documents the APIs that an implementation of a resettable object
170
+ * This program is distributed in the hope that it will be useful,
148
+must provide and what functions it has access to. It is intended for people
171
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
149
+who want to implement or convert a class which has the resettable interface;
172
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
150
+for example when specializing an existing device or bus.
173
+ * GNU General Public License for more details.
151
+
174
+ *
152
+Methods to implement
175
+ * You should have received a copy of the GNU General Public License
153
+....................
176
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
154
+
177
+ */
155
+Three methods should be defined or left empty. Each method corresponds to a
178
+
156
+phase of the reset; they are name ``phases.enter()``, ``phases.hold()`` and
179
+#include "qemu/osdep.h"
157
+``phases.exit()``. They all take the object as parameter. The *enter* method
180
+#include "qemu/units.h"
158
+also take the reset type as second parameter.
181
+#include "hw/sysbus.h"
159
+
182
+#include "migration/vmstate.h"
160
+When extending an existing class, these methods may need to be extended too.
183
+#include "qemu/log.h"
161
+The ``resettable_class_set_parent_phases()`` class function may be used to
184
+#include "qemu/module.h"
162
+backup parent class methods.
185
+#include "hw/misc/allwinner-a10-ccm.h"
163
+
186
+
164
+Here follows an example to implement reset for a Device which sets an IO while
187
+/* CCM register offsets */
165
+in reset.
188
+enum {
166
+
189
+ REG_PLL1_CFG = 0x0000, /* PLL1 Control */
167
+::
190
+ REG_PLL1_TUN = 0x0004, /* PLL1 Tuning */
168
+
191
+ REG_PLL2_CFG = 0x0008, /* PLL2 Control */
169
+ static void mydev_reset_enter(Object *obj, ResetType type)
192
+ REG_PLL2_TUN = 0x000C, /* PLL2 Tuning */
170
+ {
193
+ REG_PLL3_CFG = 0x0010, /* PLL3 Control */
171
+ MyDevClass *myclass = MYDEV_GET_CLASS(obj);
194
+ REG_PLL4_CFG = 0x0018, /* PLL4 Control */
172
+ MyDevState *mydev = MYDEV(obj);
195
+ REG_PLL5_CFG = 0x0020, /* PLL5 Control */
173
+ /* call parent class enter phase */
196
+ REG_PLL5_TUN = 0x0024, /* PLL5 Tuning */
174
+ if (myclass->parent_phases.enter) {
197
+ REG_PLL6_CFG = 0x0028, /* PLL6 Control */
175
+ myclass->parent_phases.enter(obj, type);
198
+ REG_PLL6_TUN = 0x002C, /* PLL6 Tuning */
176
+ }
199
+ REG_PLL7_CFG = 0x0030, /* PLL7 Control */
177
+ /* initialize local state only */
200
+ REG_PLL1_TUN2 = 0x0038, /* PLL1 Tuning2 */
178
+ mydev->var = 0;
201
+ REG_PLL5_TUN2 = 0x003C, /* PLL5 Tuning2 */
202
+ REG_PLL8_CFG = 0x0040, /* PLL8 Control */
203
+ REG_OSC24M_CFG = 0x0050, /* OSC24M Control */
204
+ REG_CPU_AHB_APB0_CFG = 0x0054, /* CPU, AHB and APB0 Divide Ratio */
205
+};
206
+
207
+#define REG_INDEX(offset) (offset / sizeof(uint32_t))
208
+
209
+/* CCM register reset values */
210
+enum {
211
+ REG_PLL1_CFG_RST = 0x21005000,
212
+ REG_PLL1_TUN_RST = 0x0A101000,
213
+ REG_PLL2_CFG_RST = 0x08100010,
214
+ REG_PLL2_TUN_RST = 0x00000000,
215
+ REG_PLL3_CFG_RST = 0x0010D063,
216
+ REG_PLL4_CFG_RST = 0x21009911,
217
+ REG_PLL5_CFG_RST = 0x11049280,
218
+ REG_PLL5_TUN_RST = 0x14888000,
219
+ REG_PLL6_CFG_RST = 0x21009911,
220
+ REG_PLL6_TUN_RST = 0x00000000,
221
+ REG_PLL7_CFG_RST = 0x0010D063,
222
+ REG_PLL1_TUN2_RST = 0x00000000,
223
+ REG_PLL5_TUN2_RST = 0x00000000,
224
+ REG_PLL8_CFG_RST = 0x21009911,
225
+ REG_OSC24M_CFG_RST = 0x00138013,
226
+ REG_CPU_AHB_APB0_CFG_RST = 0x00010010,
227
+};
228
+
229
+static uint64_t allwinner_a10_ccm_read(void *opaque, hwaddr offset,
230
+ unsigned size)
231
+{
232
+ const AwA10ClockCtlState *s = AW_A10_CCM(opaque);
233
+ const uint32_t idx = REG_INDEX(offset);
234
+
235
+ switch (offset) {
236
+ case REG_PLL1_CFG:
237
+ case REG_PLL1_TUN:
238
+ case REG_PLL2_CFG:
239
+ case REG_PLL2_TUN:
240
+ case REG_PLL3_CFG:
241
+ case REG_PLL4_CFG:
242
+ case REG_PLL5_CFG:
243
+ case REG_PLL5_TUN:
244
+ case REG_PLL6_CFG:
245
+ case REG_PLL6_TUN:
246
+ case REG_PLL7_CFG:
247
+ case REG_PLL1_TUN2:
248
+ case REG_PLL5_TUN2:
249
+ case REG_PLL8_CFG:
250
+ case REG_OSC24M_CFG:
251
+ case REG_CPU_AHB_APB0_CFG:
252
+ break;
253
+ case 0x158 ... AW_A10_CCM_IOSIZE:
254
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: out-of-bounds offset 0x%04x\n",
255
+ __func__, (uint32_t)offset);
256
+ return 0;
257
+ default:
258
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented read offset 0x%04x\n",
259
+ __func__, (uint32_t)offset);
260
+ return 0;
179
+ }
261
+ }
180
+
262
+
181
+ static void mydev_reset_hold(Object *obj)
263
+ return s->regs[idx];
182
+ {
264
+}
183
+ MyDevClass *myclass = MYDEV_GET_CLASS(obj);
265
+
184
+ MyDevState *mydev = MYDEV(obj);
266
+static void allwinner_a10_ccm_write(void *opaque, hwaddr offset,
185
+ /* call parent class hold phase */
267
+ uint64_t val, unsigned size)
186
+ if (myclass->parent_phases.hold) {
268
+{
187
+ myclass->parent_phases.hold(obj);
269
+ AwA10ClockCtlState *s = AW_A10_CCM(opaque);
188
+ }
270
+ const uint32_t idx = REG_INDEX(offset);
189
+ /* set an IO */
271
+
190
+ qemu_set_irq(mydev->irq, 1);
272
+ switch (offset) {
273
+ case REG_PLL1_CFG:
274
+ case REG_PLL1_TUN:
275
+ case REG_PLL2_CFG:
276
+ case REG_PLL2_TUN:
277
+ case REG_PLL3_CFG:
278
+ case REG_PLL4_CFG:
279
+ case REG_PLL5_CFG:
280
+ case REG_PLL5_TUN:
281
+ case REG_PLL6_CFG:
282
+ case REG_PLL6_TUN:
283
+ case REG_PLL7_CFG:
284
+ case REG_PLL1_TUN2:
285
+ case REG_PLL5_TUN2:
286
+ case REG_PLL8_CFG:
287
+ case REG_OSC24M_CFG:
288
+ case REG_CPU_AHB_APB0_CFG:
289
+ break;
290
+ case 0x158 ... AW_A10_CCM_IOSIZE:
291
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: out-of-bounds offset 0x%04x\n",
292
+ __func__, (uint32_t)offset);
293
+ break;
294
+ default:
295
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented write offset 0x%04x\n",
296
+ __func__, (uint32_t)offset);
297
+ break;
191
+ }
298
+ }
192
+
299
+
193
+ static void mydev_reset_exit(Object *obj)
300
+ s->regs[idx] = (uint32_t) val;
194
+ {
301
+}
195
+ MyDevClass *myclass = MYDEV_GET_CLASS(obj);
302
+
196
+ MyDevState *mydev = MYDEV(obj);
303
+static const MemoryRegionOps allwinner_a10_ccm_ops = {
197
+ /* call parent class exit phase */
304
+ .read = allwinner_a10_ccm_read,
198
+ if (myclass->parent_phases.exit) {
305
+ .write = allwinner_a10_ccm_write,
199
+ myclass->parent_phases.exit(obj);
306
+ .endianness = DEVICE_NATIVE_ENDIAN,
200
+ }
307
+ .valid = {
201
+ /* clear an IO */
308
+ .min_access_size = 4,
202
+ qemu_set_irq(mydev->irq, 0);
309
+ .max_access_size = 4,
310
+ },
311
+ .impl.min_access_size = 4,
312
+};
313
+
314
+static void allwinner_a10_ccm_reset_enter(Object *obj, ResetType type)
315
+{
316
+ AwA10ClockCtlState *s = AW_A10_CCM(obj);
317
+
318
+ /* Set default values for registers */
319
+ s->regs[REG_INDEX(REG_PLL1_CFG)] = REG_PLL1_CFG_RST;
320
+ s->regs[REG_INDEX(REG_PLL1_TUN)] = REG_PLL1_TUN_RST;
321
+ s->regs[REG_INDEX(REG_PLL2_CFG)] = REG_PLL2_CFG_RST;
322
+ s->regs[REG_INDEX(REG_PLL2_TUN)] = REG_PLL2_TUN_RST;
323
+ s->regs[REG_INDEX(REG_PLL3_CFG)] = REG_PLL3_CFG_RST;
324
+ s->regs[REG_INDEX(REG_PLL4_CFG)] = REG_PLL4_CFG_RST;
325
+ s->regs[REG_INDEX(REG_PLL5_CFG)] = REG_PLL5_CFG_RST;
326
+ s->regs[REG_INDEX(REG_PLL5_TUN)] = REG_PLL5_TUN_RST;
327
+ s->regs[REG_INDEX(REG_PLL6_CFG)] = REG_PLL6_CFG_RST;
328
+ s->regs[REG_INDEX(REG_PLL6_TUN)] = REG_PLL6_TUN_RST;
329
+ s->regs[REG_INDEX(REG_PLL7_CFG)] = REG_PLL7_CFG_RST;
330
+ s->regs[REG_INDEX(REG_PLL1_TUN2)] = REG_PLL1_TUN2_RST;
331
+ s->regs[REG_INDEX(REG_PLL5_TUN2)] = REG_PLL5_TUN2_RST;
332
+ s->regs[REG_INDEX(REG_PLL8_CFG)] = REG_PLL8_CFG_RST;
333
+ s->regs[REG_INDEX(REG_OSC24M_CFG)] = REG_OSC24M_CFG_RST;
334
+ s->regs[REG_INDEX(REG_CPU_AHB_APB0_CFG)] = REG_CPU_AHB_APB0_CFG_RST;
335
+}
336
+
337
+static void allwinner_a10_ccm_init(Object *obj)
338
+{
339
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
340
+ AwA10ClockCtlState *s = AW_A10_CCM(obj);
341
+
342
+ /* Memory mapping */
343
+ memory_region_init_io(&s->iomem, OBJECT(s), &allwinner_a10_ccm_ops, s,
344
+ TYPE_AW_A10_CCM, AW_A10_CCM_IOSIZE);
345
+ sysbus_init_mmio(sbd, &s->iomem);
346
+}
347
+
348
+static const VMStateDescription allwinner_a10_ccm_vmstate = {
349
+ .name = "allwinner-a10-ccm",
350
+ .version_id = 1,
351
+ .minimum_version_id = 1,
352
+ .fields = (VMStateField[]) {
353
+ VMSTATE_UINT32_ARRAY(regs, AwA10ClockCtlState, AW_A10_CCM_REGS_NUM),
354
+ VMSTATE_END_OF_LIST()
203
+ }
355
+ }
204
+
356
+};
205
+ typedef struct MyDevClass {
357
+
206
+ MyParentClass parent_class;
358
+static void allwinner_a10_ccm_class_init(ObjectClass *klass, void *data)
207
+ /* to store eventual parent reset methods */
359
+{
208
+ ResettablePhases parent_phases;
360
+ DeviceClass *dc = DEVICE_CLASS(klass);
209
+ } MyDevClass;
361
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
210
+
362
+
211
+ static void mydev_class_init(ObjectClass *class, void *data)
363
+ rc->phases.enter = allwinner_a10_ccm_reset_enter;
212
+ {
364
+ dc->vmsd = &allwinner_a10_ccm_vmstate;
213
+ MyDevClass *myclass = MYDEV_CLASS(class);
365
+}
214
+ ResettableClass *rc = RESETTABLE_CLASS(class);
366
+
215
+ resettable_class_set_parent_reset_phases(rc,
367
+static const TypeInfo allwinner_a10_ccm_info = {
216
+ mydev_reset_enter,
368
+ .name = TYPE_AW_A10_CCM,
217
+ mydev_reset_hold,
369
+ .parent = TYPE_SYS_BUS_DEVICE,
218
+ mydev_reset_exit,
370
+ .instance_init = allwinner_a10_ccm_init,
219
+ &myclass->parent_phases);
371
+ .instance_size = sizeof(AwA10ClockCtlState),
220
+ }
372
+ .class_init = allwinner_a10_ccm_class_init,
221
+
373
+};
222
+In the above example, we override all three phases. It is possible to override
374
+
223
+only some of them by passing NULL instead of a function pointer to
375
+static void allwinner_a10_ccm_register(void)
224
+``resettable_class_set_parent_reset_phases()``. For example, the following will
376
+{
225
+only override the *enter* phase and leave *hold* and *exit* untouched::
377
+ type_register_static(&allwinner_a10_ccm_info);
226
+
378
+}
227
+ resettable_class_set_parent_reset_phases(rc, mydev_reset_enter,
379
+
228
+ NULL, NULL,
380
+type_init(allwinner_a10_ccm_register)
229
+ &myclass->parent_phases);
381
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
230
+
382
index XXXXXXX..XXXXXXX 100644
231
+This is equivalent to providing a trivial implementation of the hold and exit
383
--- a/hw/arm/Kconfig
232
+phases which does nothing but call the parent class's implementation of the
384
+++ b/hw/arm/Kconfig
233
+phase.
385
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_A10
234
+
386
select AHCI
235
+Polling the reset state
387
select ALLWINNER_A10_PIT
236
+.......................
388
select ALLWINNER_A10_PIC
237
+
389
+ select ALLWINNER_A10_CCM
238
+Resettable interface provides the ``resettable_is_in_reset()`` function.
390
select ALLWINNER_EMAC
239
+This function returns true if the object parameter is currently under reset.
391
select SERIAL
240
+
392
select UNIMP
241
+An object is under reset from the beginning of the *init* phase to the end of
393
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
242
+the *exit* phase. During all three phases, the function will return that the
394
index XXXXXXX..XXXXXXX 100644
243
+object is in reset.
395
--- a/hw/misc/Kconfig
244
+
396
+++ b/hw/misc/Kconfig
245
+This function may be used if the object behavior has to be adapted
397
@@ -XXX,XX +XXX,XX @@ config VIRT_CTRL
246
+while in reset state. For example if a device has an irq input,
398
config LASI
247
+it will probably need to ignore it while in reset; then it can for
399
bool
248
+example check the reset state at the beginning of the irq callback.
400
249
+
401
+config ALLWINNER_A10_CCM
250
+Note that until migration of the reset state is supported, an object
402
+ bool
251
+should not be left in reset. So apart from being currently executing
403
+
252
+one of the reset phases, the only cases when this function will return
404
source macio/Kconfig
253
+true is if an external interaction (like changing an io) is made during
405
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
254
+*hold* or *exit* phase of another object in the same reset group.
406
index XXXXXXX..XXXXXXX 100644
255
+
407
--- a/hw/misc/meson.build
256
+Helpers ``device_is_in_reset()`` and ``bus_is_in_reset()`` are also provided
408
+++ b/hw/misc/meson.build
257
+for devices and buses and should be preferred.
409
@@ -XXX,XX +XXX,XX @@ subdir('macio')
258
+
410
259
+
411
softmmu_ss.add(when: 'CONFIG_IVSHMEM_DEVICE', if_true: files('ivshmem.c'))
260
+Base class handling of reset
412
261
+----------------------------
413
+softmmu_ss.add(when: 'CONFIG_ALLWINNER_A10_CCM', if_true: files('allwinner-a10-ccm.c'))
262
+
414
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-h3-ccu.c'))
263
+This section documents parts of the reset mechanism that you only need to know
415
specific_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-cpucfg.c'))
264
+about if you are extending it to work with a new base class other than
416
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-h3-dramc.c'))
265
+DeviceClass or BusClass, or maintaining the existing code in those classes. Most
266
+people can ignore it.
267
+
268
+Methods to implement
269
+....................
270
+
271
+There are two other methods that need to exist in a class implementing the
272
+interface: ``get_state()`` and ``child_foreach()``.
273
+
274
+``get_state()`` is simple. *resettable* is an interface and, as a consequence,
275
+does not have any class state structure. But in order to factorize the code, we
276
+need one. This method must return a pointer to ``ResettableState`` structure.
277
+The structure must be allocated by the base class; preferably it should be
278
+located inside the object instance structure.
279
+
280
+``child_foreach()`` is more complex. It should execute the given callback on
281
+every reset child of the given resettable object. All children must be
282
+resettable too. Additional parameters (a reset type and an opaque pointer) must
283
+be passed to the callback too.
284
+
285
+In ``DeviceClass`` and ``BusClass`` the ``ResettableState`` is located
286
+``DeviceState`` and ``BusState`` structure. ``child_foreach()`` is implemented
287
+to follow the bus hierarchy; for a bus, it calls the function on every child
288
+device; for a device, it calls the function on every bus child. When we reset
289
+the main system bus, we reset the whole machine bus tree.
290
+
291
+Changing a resettable parent
292
+............................
293
+
294
+One thing which should be taken care of by the base class is handling reset
295
+hierarchy changes.
296
+
297
+The reset hierarchy is supposed to be static and built during machine creation.
298
+But there are actually some exceptions. To cope with this, the resettable API
299
+provides ``resettable_change_parent()``. This function allows to set, update or
300
+remove the parent of a resettable object after machine creation is done. As
301
+parameters, it takes the object being moved, the old parent if any and the new
302
+parent if any.
303
+
304
+This function can be used at any time when not in a reset operation. During
305
+a reset operation it must be used only in *hold* phase. Using it in *enter* or
306
+*exit* phase is an error.
307
+Also it should not be used during machine creation, although it is harmless to
308
+do so: the function is a no-op as long as old and new parent are NULL or not
309
+in reset.
310
+
311
+There is currently 2 cases where this function is used:
312
+
313
+1. *device hotplug*; it means a new device is introduced on a live bus.
314
+
315
+2. *hot bus change*; it means an existing live device is added, moved or
316
+ removed in the bus hierarchy. At the moment, it occurs only in the raspi
317
+ machines for changing the sdbus used by sd card.
318
--
417
--
319
2.20.1
418
2.34.1
320
321
diff view generated by jsdifflib
New patch
1
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
2
3
During SPL boot several DRAM Controller registers are used. Most
4
important registers are those related to DRAM initialization and
5
calibration, where SPL initiates process and waits until certain bit is
6
set/cleared.
7
8
This patch adds these registers, initializes reset values from user's
9
guide and updates state of registers as SPL expects it.
10
11
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
12
13
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
14
Message-id: 20221226220303.14420-3-strahinja.p.jankovic@gmail.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
include/hw/arm/allwinner-a10.h | 2 +
18
include/hw/misc/allwinner-a10-dramc.h | 68 ++++++++++
19
hw/arm/allwinner-a10.c | 7 +
20
hw/misc/allwinner-a10-dramc.c | 179 ++++++++++++++++++++++++++
21
hw/arm/Kconfig | 1 +
22
hw/misc/Kconfig | 3 +
23
hw/misc/meson.build | 1 +
24
7 files changed, 261 insertions(+)
25
create mode 100644 include/hw/misc/allwinner-a10-dramc.h
26
create mode 100644 hw/misc/allwinner-a10-dramc.c
27
28
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
29
index XXXXXXX..XXXXXXX 100644
30
--- a/include/hw/arm/allwinner-a10.h
31
+++ b/include/hw/arm/allwinner-a10.h
32
@@ -XXX,XX +XXX,XX @@
33
#include "hw/usb/hcd-ehci.h"
34
#include "hw/rtc/allwinner-rtc.h"
35
#include "hw/misc/allwinner-a10-ccm.h"
36
+#include "hw/misc/allwinner-a10-dramc.h"
37
38
#include "target/arm/cpu.h"
39
#include "qom/object.h"
40
@@ -XXX,XX +XXX,XX @@ struct AwA10State {
41
42
ARMCPU cpu;
43
AwA10ClockCtlState ccm;
44
+ AwA10DramControllerState dramc;
45
AwA10PITState timer;
46
AwA10PICState intc;
47
AwEmacState emac;
48
diff --git a/include/hw/misc/allwinner-a10-dramc.h b/include/hw/misc/allwinner-a10-dramc.h
49
new file mode 100644
50
index XXXXXXX..XXXXXXX
51
--- /dev/null
52
+++ b/include/hw/misc/allwinner-a10-dramc.h
53
@@ -XXX,XX +XXX,XX @@
54
+/*
55
+ * Allwinner A10 DRAM Controller emulation
56
+ *
57
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
58
+ *
59
+ * This file is derived from Allwinner H3 DRAMC,
60
+ * by Niek Linnenbank.
61
+ *
62
+ * This program is free software: you can redistribute it and/or modify
63
+ * it under the terms of the GNU General Public License as published by
64
+ * the Free Software Foundation, either version 2 of the License, or
65
+ * (at your option) any later version.
66
+ *
67
+ * This program is distributed in the hope that it will be useful,
68
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
69
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
70
+ * GNU General Public License for more details.
71
+ *
72
+ * You should have received a copy of the GNU General Public License
73
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
74
+ */
75
+
76
+#ifndef HW_MISC_ALLWINNER_A10_DRAMC_H
77
+#define HW_MISC_ALLWINNER_A10_DRAMC_H
78
+
79
+#include "qom/object.h"
80
+#include "hw/sysbus.h"
81
+#include "hw/register.h"
82
+
83
+/**
84
+ * @name Constants
85
+ * @{
86
+ */
87
+
88
+/** Size of register I/O address space used by DRAMC device */
89
+#define AW_A10_DRAMC_IOSIZE (0x1000)
90
+
91
+/** Total number of known registers */
92
+#define AW_A10_DRAMC_REGS_NUM (AW_A10_DRAMC_IOSIZE / sizeof(uint32_t))
93
+
94
+/** @} */
95
+
96
+/**
97
+ * @name Object model
98
+ * @{
99
+ */
100
+
101
+#define TYPE_AW_A10_DRAMC "allwinner-a10-dramc"
102
+OBJECT_DECLARE_SIMPLE_TYPE(AwA10DramControllerState, AW_A10_DRAMC)
103
+
104
+/** @} */
105
+
106
+/**
107
+ * Allwinner A10 DRAMC object instance state.
108
+ */
109
+struct AwA10DramControllerState {
110
+ /*< private >*/
111
+ SysBusDevice parent_obj;
112
+ /*< public >*/
113
+
114
+ /** Maps I/O registers in physical memory */
115
+ MemoryRegion iomem;
116
+
117
+ /** Array of hardware registers */
118
+ uint32_t regs[AW_A10_DRAMC_REGS_NUM];
119
+};
120
+
121
+#endif /* HW_MISC_ALLWINNER_A10_DRAMC_H */
122
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/hw/arm/allwinner-a10.c
125
+++ b/hw/arm/allwinner-a10.c
126
@@ -XXX,XX +XXX,XX @@
127
#include "hw/boards.h"
128
#include "hw/usb/hcd-ohci.h"
129
130
+#define AW_A10_DRAMC_BASE 0x01c01000
131
#define AW_A10_MMC0_BASE 0x01c0f000
132
#define AW_A10_CCM_BASE 0x01c20000
133
#define AW_A10_PIC_REG_BASE 0x01c20400
134
@@ -XXX,XX +XXX,XX @@ static void aw_a10_init(Object *obj)
135
136
object_initialize_child(obj, "ccm", &s->ccm, TYPE_AW_A10_CCM);
137
138
+ object_initialize_child(obj, "dramc", &s->dramc, TYPE_AW_A10_DRAMC);
139
+
140
object_initialize_child(obj, "emac", &s->emac, TYPE_AW_EMAC);
141
142
object_initialize_child(obj, "sata", &s->sata, TYPE_ALLWINNER_AHCI);
143
@@ -XXX,XX +XXX,XX @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
144
sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &error_fatal);
145
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, AW_A10_CCM_BASE);
146
147
+ /* DRAM Control Module */
148
+ sysbus_realize(SYS_BUS_DEVICE(&s->dramc), &error_fatal);
149
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->dramc), 0, AW_A10_DRAMC_BASE);
150
+
151
/* FIXME use qdev NIC properties instead of nd_table[] */
152
if (nd_table[0].used) {
153
qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC);
154
diff --git a/hw/misc/allwinner-a10-dramc.c b/hw/misc/allwinner-a10-dramc.c
155
new file mode 100644
156
index XXXXXXX..XXXXXXX
157
--- /dev/null
158
+++ b/hw/misc/allwinner-a10-dramc.c
159
@@ -XXX,XX +XXX,XX @@
160
+/*
161
+ * Allwinner A10 DRAM Controller emulation
162
+ *
163
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
164
+ *
165
+ * This file is derived from Allwinner H3 DRAMC,
166
+ * by Niek Linnenbank.
167
+ *
168
+ * This program is free software: you can redistribute it and/or modify
169
+ * it under the terms of the GNU General Public License as published by
170
+ * the Free Software Foundation, either version 2 of the License, or
171
+ * (at your option) any later version.
172
+ *
173
+ * This program is distributed in the hope that it will be useful,
174
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
175
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
176
+ * GNU General Public License for more details.
177
+ *
178
+ * You should have received a copy of the GNU General Public License
179
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
180
+ */
181
+
182
+#include "qemu/osdep.h"
183
+#include "qemu/units.h"
184
+#include "hw/sysbus.h"
185
+#include "migration/vmstate.h"
186
+#include "qemu/log.h"
187
+#include "qemu/module.h"
188
+#include "hw/misc/allwinner-a10-dramc.h"
189
+
190
+/* DRAMC register offsets */
191
+enum {
192
+ REG_SDR_CCR = 0x0000,
193
+ REG_SDR_ZQCR0 = 0x00a8,
194
+ REG_SDR_ZQSR = 0x00b0
195
+};
196
+
197
+#define REG_INDEX(offset) (offset / sizeof(uint32_t))
198
+
199
+/* DRAMC register flags */
200
+enum {
201
+ REG_SDR_CCR_DATA_TRAINING = (1 << 30),
202
+ REG_SDR_CCR_DRAM_INIT = (1 << 31),
203
+};
204
+enum {
205
+ REG_SDR_ZQSR_ZCAL = (1 << 31),
206
+};
207
+
208
+/* DRAMC register reset values */
209
+enum {
210
+ REG_SDR_CCR_RESET = 0x80020000,
211
+ REG_SDR_ZQCR0_RESET = 0x07b00000,
212
+ REG_SDR_ZQSR_RESET = 0x80000000
213
+};
214
+
215
+static uint64_t allwinner_a10_dramc_read(void *opaque, hwaddr offset,
216
+ unsigned size)
217
+{
218
+ const AwA10DramControllerState *s = AW_A10_DRAMC(opaque);
219
+ const uint32_t idx = REG_INDEX(offset);
220
+
221
+ switch (offset) {
222
+ case REG_SDR_CCR:
223
+ case REG_SDR_ZQCR0:
224
+ case REG_SDR_ZQSR:
225
+ break;
226
+ case 0x2e4 ... AW_A10_DRAMC_IOSIZE:
227
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: out-of-bounds offset 0x%04x\n",
228
+ __func__, (uint32_t)offset);
229
+ return 0;
230
+ default:
231
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented read offset 0x%04x\n",
232
+ __func__, (uint32_t)offset);
233
+ return 0;
234
+ }
235
+
236
+ return s->regs[idx];
237
+}
238
+
239
+static void allwinner_a10_dramc_write(void *opaque, hwaddr offset,
240
+ uint64_t val, unsigned size)
241
+{
242
+ AwA10DramControllerState *s = AW_A10_DRAMC(opaque);
243
+ const uint32_t idx = REG_INDEX(offset);
244
+
245
+ switch (offset) {
246
+ case REG_SDR_CCR:
247
+ if (val & REG_SDR_CCR_DRAM_INIT) {
248
+ /* Clear DRAM_INIT to indicate process is done. */
249
+ val &= ~REG_SDR_CCR_DRAM_INIT;
250
+ }
251
+ if (val & REG_SDR_CCR_DATA_TRAINING) {
252
+ /* Clear DATA_TRAINING to indicate process is done. */
253
+ val &= ~REG_SDR_CCR_DATA_TRAINING;
254
+ }
255
+ break;
256
+ case REG_SDR_ZQCR0:
257
+ /* Set ZCAL in ZQSR to indicate calibration is done. */
258
+ s->regs[REG_INDEX(REG_SDR_ZQSR)] |= REG_SDR_ZQSR_ZCAL;
259
+ break;
260
+ case 0x2e4 ... AW_A10_DRAMC_IOSIZE:
261
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: out-of-bounds offset 0x%04x\n",
262
+ __func__, (uint32_t)offset);
263
+ break;
264
+ default:
265
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented write offset 0x%04x\n",
266
+ __func__, (uint32_t)offset);
267
+ break;
268
+ }
269
+
270
+ s->regs[idx] = (uint32_t) val;
271
+}
272
+
273
+static const MemoryRegionOps allwinner_a10_dramc_ops = {
274
+ .read = allwinner_a10_dramc_read,
275
+ .write = allwinner_a10_dramc_write,
276
+ .endianness = DEVICE_NATIVE_ENDIAN,
277
+ .valid = {
278
+ .min_access_size = 4,
279
+ .max_access_size = 4,
280
+ },
281
+ .impl.min_access_size = 4,
282
+};
283
+
284
+static void allwinner_a10_dramc_reset_enter(Object *obj, ResetType type)
285
+{
286
+ AwA10DramControllerState *s = AW_A10_DRAMC(obj);
287
+
288
+ /* Set default values for registers */
289
+ s->regs[REG_INDEX(REG_SDR_CCR)] = REG_SDR_CCR_RESET;
290
+ s->regs[REG_INDEX(REG_SDR_ZQCR0)] = REG_SDR_ZQCR0_RESET;
291
+ s->regs[REG_INDEX(REG_SDR_ZQSR)] = REG_SDR_ZQSR_RESET;
292
+}
293
+
294
+static void allwinner_a10_dramc_init(Object *obj)
295
+{
296
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
297
+ AwA10DramControllerState *s = AW_A10_DRAMC(obj);
298
+
299
+ /* Memory mapping */
300
+ memory_region_init_io(&s->iomem, OBJECT(s), &allwinner_a10_dramc_ops, s,
301
+ TYPE_AW_A10_DRAMC, AW_A10_DRAMC_IOSIZE);
302
+ sysbus_init_mmio(sbd, &s->iomem);
303
+}
304
+
305
+static const VMStateDescription allwinner_a10_dramc_vmstate = {
306
+ .name = "allwinner-a10-dramc",
307
+ .version_id = 1,
308
+ .minimum_version_id = 1,
309
+ .fields = (VMStateField[]) {
310
+ VMSTATE_UINT32_ARRAY(regs, AwA10DramControllerState,
311
+ AW_A10_DRAMC_REGS_NUM),
312
+ VMSTATE_END_OF_LIST()
313
+ }
314
+};
315
+
316
+static void allwinner_a10_dramc_class_init(ObjectClass *klass, void *data)
317
+{
318
+ DeviceClass *dc = DEVICE_CLASS(klass);
319
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
320
+
321
+ rc->phases.enter = allwinner_a10_dramc_reset_enter;
322
+ dc->vmsd = &allwinner_a10_dramc_vmstate;
323
+}
324
+
325
+static const TypeInfo allwinner_a10_dramc_info = {
326
+ .name = TYPE_AW_A10_DRAMC,
327
+ .parent = TYPE_SYS_BUS_DEVICE,
328
+ .instance_init = allwinner_a10_dramc_init,
329
+ .instance_size = sizeof(AwA10DramControllerState),
330
+ .class_init = allwinner_a10_dramc_class_init,
331
+};
332
+
333
+static void allwinner_a10_dramc_register(void)
334
+{
335
+ type_register_static(&allwinner_a10_dramc_info);
336
+}
337
+
338
+type_init(allwinner_a10_dramc_register)
339
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
340
index XXXXXXX..XXXXXXX 100644
341
--- a/hw/arm/Kconfig
342
+++ b/hw/arm/Kconfig
343
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_A10
344
select ALLWINNER_A10_PIT
345
select ALLWINNER_A10_PIC
346
select ALLWINNER_A10_CCM
347
+ select ALLWINNER_A10_DRAMC
348
select ALLWINNER_EMAC
349
select SERIAL
350
select UNIMP
351
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
352
index XXXXXXX..XXXXXXX 100644
353
--- a/hw/misc/Kconfig
354
+++ b/hw/misc/Kconfig
355
@@ -XXX,XX +XXX,XX @@ config LASI
356
config ALLWINNER_A10_CCM
357
bool
358
359
+config ALLWINNER_A10_DRAMC
360
+ bool
361
+
362
source macio/Kconfig
363
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
364
index XXXXXXX..XXXXXXX 100644
365
--- a/hw/misc/meson.build
366
+++ b/hw/misc/meson.build
367
@@ -XXX,XX +XXX,XX @@ subdir('macio')
368
softmmu_ss.add(when: 'CONFIG_IVSHMEM_DEVICE', if_true: files('ivshmem.c'))
369
370
softmmu_ss.add(when: 'CONFIG_ALLWINNER_A10_CCM', if_true: files('allwinner-a10-ccm.c'))
371
+softmmu_ss.add(when: 'CONFIG_ALLWINNER_A10_DRAMC', if_true: files('allwinner-a10-dramc.c'))
372
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-h3-ccu.c'))
373
specific_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-cpucfg.c'))
374
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-h3-dramc.c'))
375
--
376
2.34.1
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
2
2
3
This commit defines an interface allowing multi-phase reset. This aims
3
This patch implements Allwinner TWI/I2C controller emulation. Only
4
to solve a problem of the actual single-phase reset (built in
4
master-mode functionality is implemented.
5
DeviceClass and BusClass): reset behavior is dependent on the order
6
in which reset handlers are called. In particular doing external
7
side-effect (like setting an qemu_irq) is problematic because receiving
8
object may not be reset yet.
9
5
10
The Resettable interface divides the reset in 3 well defined phases.
6
The SPL boot for Cubieboard expects AXP209 PMIC on TWI0/I2C0 bus, so this is
11
To reset an object tree, all 1st phases are executed then all 2nd then
7
first part enabling the TWI/I2C bus operation.
12
all 3rd. See the comments in include/hw/resettable.h for a more complete
13
description. The interface defines 3 phases to let the future
14
possibility of holding an object into reset for some time.
15
8
16
The qdev/qbus reset in DeviceClass and BusClass will be modified in
9
Since both Allwinner A10 and H3 use the same module, it is added for
17
following commits to use this interface. A mechanism is provided
10
both boards.
18
to allow executing a transitional reset handler in place of the 2nd
19
phase which is executed in children-then-parent order inside a tree.
20
This will allow to transition devices and buses smoothly while
21
keeping the exact current qdev/qbus reset behavior for now.
22
11
23
Documentation will be added in a following commit.
12
Docs are also updated for Cubieboard and Orangepi-PC board to indicate
13
I2C availability.
24
14
25
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
15
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
26
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
27
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
17
Message-id: 20221226220303.14420-4-strahinja.p.jankovic@gmail.com
28
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
29
Message-id: 20200123132823.1117486-4-damien.hedde@greensocs.com
30
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
31
---
19
---
32
hw/core/Makefile.objs | 1 +
20
docs/system/arm/cubieboard.rst | 1 +
33
include/hw/resettable.h | 211 +++++++++++++++++++++++++++++++++++
21
docs/system/arm/orangepi.rst | 1 +
34
hw/core/resettable.c | 238 ++++++++++++++++++++++++++++++++++++++++
22
include/hw/arm/allwinner-a10.h | 2 +
35
hw/core/trace-events | 17 +++
23
include/hw/arm/allwinner-h3.h | 3 +
36
4 files changed, 467 insertions(+)
24
include/hw/i2c/allwinner-i2c.h | 55 ++++
37
create mode 100644 include/hw/resettable.h
25
hw/arm/allwinner-a10.c | 8 +
38
create mode 100644 hw/core/resettable.c
26
hw/arm/allwinner-h3.c | 11 +-
27
hw/i2c/allwinner-i2c.c | 459 +++++++++++++++++++++++++++++++++
28
hw/arm/Kconfig | 2 +
29
hw/i2c/Kconfig | 4 +
30
hw/i2c/meson.build | 1 +
31
hw/i2c/trace-events | 5 +
32
12 files changed, 551 insertions(+), 1 deletion(-)
33
create mode 100644 include/hw/i2c/allwinner-i2c.h
34
create mode 100644 hw/i2c/allwinner-i2c.c
39
35
40
diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
36
diff --git a/docs/system/arm/cubieboard.rst b/docs/system/arm/cubieboard.rst
41
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/core/Makefile.objs
38
--- a/docs/system/arm/cubieboard.rst
43
+++ b/hw/core/Makefile.objs
39
+++ b/docs/system/arm/cubieboard.rst
40
@@ -XXX,XX +XXX,XX @@ Emulated devices:
41
- SDHCI
42
- USB controller
43
- SATA controller
44
+- TWI (I2C) controller
45
diff --git a/docs/system/arm/orangepi.rst b/docs/system/arm/orangepi.rst
46
index XXXXXXX..XXXXXXX 100644
47
--- a/docs/system/arm/orangepi.rst
48
+++ b/docs/system/arm/orangepi.rst
49
@@ -XXX,XX +XXX,XX @@ The Orange Pi PC machine supports the following devices:
50
* Clock Control Unit
51
* System Control module
52
* Security Identifier device
53
+ * TWI (I2C)
54
55
Limitations
56
"""""""""""
57
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
58
index XXXXXXX..XXXXXXX 100644
59
--- a/include/hw/arm/allwinner-a10.h
60
+++ b/include/hw/arm/allwinner-a10.h
44
@@ -XXX,XX +XXX,XX @@
61
@@ -XXX,XX +XXX,XX @@
45
common-obj-y += qdev.o qdev-properties.o
62
#include "hw/rtc/allwinner-rtc.h"
46
common-obj-y += bus.o
63
#include "hw/misc/allwinner-a10-ccm.h"
47
common-obj-y += cpu.o
64
#include "hw/misc/allwinner-a10-dramc.h"
48
+common-obj-y += resettable.o
65
+#include "hw/i2c/allwinner-i2c.h"
49
common-obj-y += hotplug.o
66
50
common-obj-y += vmstate-if.o
67
#include "target/arm/cpu.h"
51
# irq.o needed for qdev GPIO handling:
68
#include "qom/object.h"
52
diff --git a/include/hw/resettable.h b/include/hw/resettable.h
69
@@ -XXX,XX +XXX,XX @@ struct AwA10State {
70
AwEmacState emac;
71
AllwinnerAHCIState sata;
72
AwSdHostState mmc0;
73
+ AWI2CState i2c0;
74
AwRtcState rtc;
75
MemoryRegion sram_a;
76
EHCISysBusState ehci[AW_A10_NUM_USB];
77
diff --git a/include/hw/arm/allwinner-h3.h b/include/hw/arm/allwinner-h3.h
78
index XXXXXXX..XXXXXXX 100644
79
--- a/include/hw/arm/allwinner-h3.h
80
+++ b/include/hw/arm/allwinner-h3.h
81
@@ -XXX,XX +XXX,XX @@
82
#include "hw/sd/allwinner-sdhost.h"
83
#include "hw/net/allwinner-sun8i-emac.h"
84
#include "hw/rtc/allwinner-rtc.h"
85
+#include "hw/i2c/allwinner-i2c.h"
86
#include "target/arm/cpu.h"
87
#include "sysemu/block-backend.h"
88
89
@@ -XXX,XX +XXX,XX @@ enum {
90
AW_H3_DEV_UART2,
91
AW_H3_DEV_UART3,
92
AW_H3_DEV_EMAC,
93
+ AW_H3_DEV_TWI0,
94
AW_H3_DEV_DRAMCOM,
95
AW_H3_DEV_DRAMCTL,
96
AW_H3_DEV_DRAMPHY,
97
@@ -XXX,XX +XXX,XX @@ struct AwH3State {
98
AwH3SysCtrlState sysctrl;
99
AwSidState sid;
100
AwSdHostState mmc0;
101
+ AWI2CState i2c0;
102
AwSun8iEmacState emac;
103
AwRtcState rtc;
104
GICState gic;
105
diff --git a/include/hw/i2c/allwinner-i2c.h b/include/hw/i2c/allwinner-i2c.h
53
new file mode 100644
106
new file mode 100644
54
index XXXXXXX..XXXXXXX
107
index XXXXXXX..XXXXXXX
55
--- /dev/null
108
--- /dev/null
56
+++ b/include/hw/resettable.h
109
+++ b/include/hw/i2c/allwinner-i2c.h
57
@@ -XXX,XX +XXX,XX @@
110
@@ -XXX,XX +XXX,XX @@
58
+/*
111
+/*
59
+ * Resettable interface header.
112
+ * Allwinner I2C Bus Serial Interface registers definition
60
+ *
113
+ *
61
+ * Copyright (c) 2019 GreenSocs SAS
114
+ * Copyright (C) 2022 Strahinja Jankovic. <strahinja.p.jankovic@gmail.com>
62
+ *
115
+ *
63
+ * Authors:
116
+ * This file is derived from IMX I2C controller,
64
+ * Damien Hedde
117
+ * by Jean-Christophe DUBOIS .
65
+ *
118
+ *
66
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
119
+ * This program is free software; you can redistribute it and/or modify it
67
+ * See the COPYING file in the top-level directory.
120
+ * under the terms of the GNU General Public License as published by the
121
+ * Free Software Foundation; either version 2 of the License, or
122
+ * (at your option) any later version.
123
+ *
124
+ * This program is distributed in the hope that it will be useful, but WITHOUT
125
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
126
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
127
+ * for more details.
128
+ *
129
+ * You should have received a copy of the GNU General Public License along
130
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
131
+ *
68
+ */
132
+ */
69
+
133
+
70
+#ifndef HW_RESETTABLE_H
134
+#ifndef ALLWINNER_I2C_H
71
+#define HW_RESETTABLE_H
135
+#define ALLWINNER_I2C_H
72
+
136
+
137
+#include "hw/sysbus.h"
73
+#include "qom/object.h"
138
+#include "qom/object.h"
74
+
139
+
75
+#define TYPE_RESETTABLE_INTERFACE "resettable"
140
+#define TYPE_AW_I2C "allwinner.i2c"
76
+
141
+OBJECT_DECLARE_SIMPLE_TYPE(AWI2CState, AW_I2C)
77
+#define RESETTABLE_CLASS(class) \
142
+
78
+ OBJECT_CLASS_CHECK(ResettableClass, (class), TYPE_RESETTABLE_INTERFACE)
143
+#define AW_I2C_MEM_SIZE 0x24
79
+
144
+
80
+#define RESETTABLE_GET_CLASS(obj) \
145
+struct AWI2CState {
81
+ OBJECT_GET_CLASS(ResettableClass, (obj), TYPE_RESETTABLE_INTERFACE)
146
+ /*< private >*/
82
+
147
+ SysBusDevice parent_obj;
83
+typedef struct ResettableState ResettableState;
148
+
84
+
149
+ /*< public >*/
85
+/**
150
+ MemoryRegion iomem;
86
+ * ResetType:
151
+ I2CBus *bus;
87
+ * Types of reset.
152
+ qemu_irq irq;
88
+ *
153
+
89
+ * + Cold: reset resulting from a power cycle of the object.
154
+ uint8_t addr;
90
+ *
155
+ uint8_t xaddr;
91
+ * TODO: Support has to be added to handle more types. In particular,
156
+ uint8_t data;
92
+ * ResettableState structure needs to be expanded.
157
+ uint8_t cntr;
93
+ */
158
+ uint8_t stat;
94
+typedef enum ResetType {
159
+ uint8_t ccr;
95
+ RESET_TYPE_COLD,
160
+ uint8_t srst;
96
+} ResetType;
161
+ uint8_t efr;
97
+
162
+ uint8_t lcr;
98
+/*
99
+ * ResettableClass:
100
+ * Interface for resettable objects.
101
+ *
102
+ * See docs/devel/reset.rst for more detailed information about how QEMU models
103
+ * reset. This whole API must only be used when holding the iothread mutex.
104
+ *
105
+ * All objects which can be reset must implement this interface;
106
+ * it is usually provided by a base class such as DeviceClass or BusClass.
107
+ * Every Resettable object must maintain some state tracking the
108
+ * progress of a reset operation by providing a ResettableState structure.
109
+ * The functions defined in this module take care of updating the
110
+ * state of the reset.
111
+ * The base class implementation of the interface provides this
112
+ * state and implements the associated method: get_state.
113
+ *
114
+ * Concrete object implementations (typically specific devices
115
+ * such as a UART model) should provide the functions
116
+ * for the phases.enter, phases.hold and phases.exit methods, which
117
+ * they can set in their class init function, either directly or
118
+ * by calling resettable_class_set_parent_phases().
119
+ * The phase methods are guaranteed to only only ever be called once
120
+ * for any reset event, in the order 'enter', 'hold', 'exit'.
121
+ * An object will always move quickly from 'enter' to 'hold'
122
+ * but might remain in 'hold' for an arbitrary period of time
123
+ * before eventually reset is deasserted and the 'exit' phase is called.
124
+ * Object implementations should be prepared for functions handling
125
+ * inbound connections from other devices (such as qemu_irq handler
126
+ * functions) to be called at any point during reset after their
127
+ * 'enter' method has been called.
128
+ *
129
+ * Users of a resettable object should not call these methods
130
+ * directly, but instead use the function resettable_reset().
131
+ *
132
+ * @phases.enter: This phase is called when the object enters reset. It
133
+ * should reset local state of the object, but it must not do anything that
134
+ * has a side-effect on other objects, such as raising or lowering a qemu_irq
135
+ * line or reading or writing guest memory. It takes the reset's type as
136
+ * argument.
137
+ *
138
+ * @phases.hold: This phase is called for entry into reset, once every object
139
+ * in the system which is being reset has had its @phases.enter method called.
140
+ * At this point devices can do actions that affect other objects.
141
+ *
142
+ * @phases.exit: This phase is called when the object leaves the reset state.
143
+ * Actions affecting other objects are permitted.
144
+ *
145
+ * @get_state: Mandatory method which must return a pointer to a
146
+ * ResettableState.
147
+ *
148
+ * @get_transitional_function: transitional method to handle Resettable objects
149
+ * not yet fully moved to this interface. It will be removed as soon as it is
150
+ * not needed anymore. This method is optional and may return a pointer to a
151
+ * function to be used instead of the phases. If the method exists and returns
152
+ * a non-NULL function pointer then that function is executed as a replacement
153
+ * of the 'hold' phase method taking the object as argument. The two other phase
154
+ * methods are not executed.
155
+ *
156
+ * @child_foreach: Executes a given callback on every Resettable child. Child
157
+ * in this context means a child in the qbus tree, so the children of a qbus
158
+ * are the devices on it, and the children of a device are all the buses it
159
+ * owns. This is not the same as the QOM object hierarchy. The function takes
160
+ * additional opaque and ResetType arguments which must be passed unmodified to
161
+ * the callback.
162
+ */
163
+typedef void (*ResettableEnterPhase)(Object *obj, ResetType type);
164
+typedef void (*ResettableHoldPhase)(Object *obj);
165
+typedef void (*ResettableExitPhase)(Object *obj);
166
+typedef ResettableState * (*ResettableGetState)(Object *obj);
167
+typedef void (*ResettableTrFunction)(Object *obj);
168
+typedef ResettableTrFunction (*ResettableGetTrFunction)(Object *obj);
169
+typedef void (*ResettableChildCallback)(Object *, void *opaque,
170
+ ResetType type);
171
+typedef void (*ResettableChildForeach)(Object *obj,
172
+ ResettableChildCallback cb,
173
+ void *opaque, ResetType type);
174
+typedef struct ResettablePhases {
175
+ ResettableEnterPhase enter;
176
+ ResettableHoldPhase hold;
177
+ ResettableExitPhase exit;
178
+} ResettablePhases;
179
+typedef struct ResettableClass {
180
+ InterfaceClass parent_class;
181
+
182
+ /* Phase methods */
183
+ ResettablePhases phases;
184
+
185
+ /* State access method */
186
+ ResettableGetState get_state;
187
+
188
+ /* Transitional method for legacy reset compatibility */
189
+ ResettableGetTrFunction get_transitional_function;
190
+
191
+ /* Hierarchy handling method */
192
+ ResettableChildForeach child_foreach;
193
+} ResettableClass;
194
+
195
+/**
196
+ * ResettableState:
197
+ * Structure holding reset related state. The fields should not be accessed
198
+ * directly; the definition is here to allow further inclusion into other
199
+ * objects.
200
+ *
201
+ * @count: Number of reset level the object is into. It is incremented when
202
+ * the reset operation starts and decremented when it finishes.
203
+ * @hold_phase_pending: flag which indicates that we need to invoke the 'hold'
204
+ * phase handler for this object.
205
+ * @exit_phase_in_progress: true if we are currently in the exit phase
206
+ */
207
+struct ResettableState {
208
+ unsigned count;
209
+ bool hold_phase_pending;
210
+ bool exit_phase_in_progress;
211
+};
163
+};
212
+
164
+
213
+/**
165
+#endif /* ALLWINNER_I2C_H */
214
+ * resettable_reset:
166
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
215
+ * Trigger a reset on an object @obj of type @type. @obj must implement
167
index XXXXXXX..XXXXXXX 100644
216
+ * Resettable interface.
168
--- a/hw/arm/allwinner-a10.c
217
+ *
169
+++ b/hw/arm/allwinner-a10.c
218
+ * Calling this function is equivalent to calling @resettable_assert_reset()
170
@@ -XXX,XX +XXX,XX @@
219
+ * then @resettable_release_reset().
171
#define AW_A10_OHCI_BASE 0x01c14400
220
+ */
172
#define AW_A10_SATA_BASE 0x01c18000
221
+void resettable_reset(Object *obj, ResetType type);
173
#define AW_A10_RTC_BASE 0x01c20d00
222
+
174
+#define AW_A10_I2C0_BASE 0x01c2ac00
223
+/**
175
224
+ * resettable_assert_reset:
176
static void aw_a10_init(Object *obj)
225
+ * Put an object @obj into reset. @obj must implement Resettable interface.
177
{
226
+ *
178
@@ -XXX,XX +XXX,XX @@ static void aw_a10_init(Object *obj)
227
+ * @resettable_release_reset() must eventually be called after this call.
179
228
+ * There must be one call to @resettable_release_reset() per call of
180
object_initialize_child(obj, "sata", &s->sata, TYPE_ALLWINNER_AHCI);
229
+ * @resettable_assert_reset(), with the same type argument.
181
230
+ *
182
+ object_initialize_child(obj, "i2c0", &s->i2c0, TYPE_AW_I2C);
231
+ * NOTE: Until support for migration is added, the @resettable_release_reset()
183
+
232
+ * must not be delayed. It must occur just after @resettable_assert_reset() so
184
if (machine_usb(current_machine)) {
233
+ * that migration cannot be triggered in between. Prefer using
185
int i;
234
+ * @resettable_reset() for now.
186
235
+ */
187
@@ -XXX,XX +XXX,XX @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
236
+void resettable_assert_reset(Object *obj, ResetType type);
188
/* RTC */
237
+
189
sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &error_fatal);
238
+/**
190
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->rtc), 0, AW_A10_RTC_BASE, 10);
239
+ * resettable_release_reset:
191
+
240
+ * Release the object @obj from reset. @obj must implement Resettable interface.
192
+ /* I2C */
241
+ *
193
+ sysbus_realize(SYS_BUS_DEVICE(&s->i2c0), &error_fatal);
242
+ * See @resettable_assert_reset() description for details.
194
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c0), 0, AW_A10_I2C0_BASE);
243
+ */
195
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c0), 0, qdev_get_gpio_in(dev, 7));
244
+void resettable_release_reset(Object *obj, ResetType type);
196
}
245
+
197
246
+/**
198
static void aw_a10_class_init(ObjectClass *oc, void *data)
247
+ * resettable_is_in_reset:
199
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
248
+ * Return true if @obj is under reset.
200
index XXXXXXX..XXXXXXX 100644
249
+ *
201
--- a/hw/arm/allwinner-h3.c
250
+ * @obj must implement Resettable interface.
202
+++ b/hw/arm/allwinner-h3.c
251
+ */
203
@@ -XXX,XX +XXX,XX @@ const hwaddr allwinner_h3_memmap[] = {
252
+bool resettable_is_in_reset(Object *obj);
204
[AW_H3_DEV_UART1] = 0x01c28400,
253
+
205
[AW_H3_DEV_UART2] = 0x01c28800,
254
+/**
206
[AW_H3_DEV_UART3] = 0x01c28c00,
255
+ * resettable_class_set_parent_phases:
207
+ [AW_H3_DEV_TWI0] = 0x01c2ac00,
256
+ *
208
[AW_H3_DEV_EMAC] = 0x01c30000,
257
+ * Save @rc current reset phases into @parent_phases and override @rc phases
209
[AW_H3_DEV_DRAMCOM] = 0x01c62000,
258
+ * by the given new methods (@enter, @hold and @exit).
210
[AW_H3_DEV_DRAMCTL] = 0x01c63000,
259
+ * Each phase is overridden only if the new one is not NULL allowing to
211
@@ -XXX,XX +XXX,XX @@ struct AwH3Unimplemented {
260
+ * override a subset of phases.
212
{ "uart1", 0x01c28400, 1 * KiB },
261
+ */
213
{ "uart2", 0x01c28800, 1 * KiB },
262
+void resettable_class_set_parent_phases(ResettableClass *rc,
214
{ "uart3", 0x01c28c00, 1 * KiB },
263
+ ResettableEnterPhase enter,
215
- { "twi0", 0x01c2ac00, 1 * KiB },
264
+ ResettableHoldPhase hold,
216
{ "twi1", 0x01c2b000, 1 * KiB },
265
+ ResettableExitPhase exit,
217
{ "twi2", 0x01c2b400, 1 * KiB },
266
+ ResettablePhases *parent_phases);
218
{ "scr", 0x01c2c400, 1 * KiB },
267
+
219
@@ -XXX,XX +XXX,XX @@ enum {
268
+#endif
220
AW_H3_GIC_SPI_UART1 = 1,
269
diff --git a/hw/core/resettable.c b/hw/core/resettable.c
221
AW_H3_GIC_SPI_UART2 = 2,
222
AW_H3_GIC_SPI_UART3 = 3,
223
+ AW_H3_GIC_SPI_TWI0 = 6,
224
AW_H3_GIC_SPI_TIMER0 = 18,
225
AW_H3_GIC_SPI_TIMER1 = 19,
226
AW_H3_GIC_SPI_MMC0 = 60,
227
@@ -XXX,XX +XXX,XX @@ static void allwinner_h3_init(Object *obj)
228
"ram-size");
229
230
object_initialize_child(obj, "rtc", &s->rtc, TYPE_AW_RTC_SUN6I);
231
+
232
+ object_initialize_child(obj, "twi0", &s->i2c0, TYPE_AW_I2C);
233
}
234
235
static void allwinner_h3_realize(DeviceState *dev, Error **errp)
236
@@ -XXX,XX +XXX,XX @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
237
sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &error_fatal);
238
sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, s->memmap[AW_H3_DEV_RTC]);
239
240
+ /* I2C */
241
+ sysbus_realize(SYS_BUS_DEVICE(&s->i2c0), &error_fatal);
242
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c0), 0, s->memmap[AW_H3_DEV_TWI0]);
243
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c0), 0,
244
+ qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_TWI0));
245
+
246
/* Unimplemented devices */
247
for (i = 0; i < ARRAY_SIZE(unimplemented); i++) {
248
create_unimplemented_device(unimplemented[i].device_name,
249
diff --git a/hw/i2c/allwinner-i2c.c b/hw/i2c/allwinner-i2c.c
270
new file mode 100644
250
new file mode 100644
271
index XXXXXXX..XXXXXXX
251
index XXXXXXX..XXXXXXX
272
--- /dev/null
252
--- /dev/null
273
+++ b/hw/core/resettable.c
253
+++ b/hw/i2c/allwinner-i2c.c
274
@@ -XXX,XX +XXX,XX @@
254
@@ -XXX,XX +XXX,XX @@
275
+/*
255
+/*
276
+ * Resettable interface.
256
+ * Allwinner I2C Bus Serial Interface Emulation
277
+ *
257
+ *
278
+ * Copyright (c) 2019 GreenSocs SAS
258
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
279
+ *
259
+ *
280
+ * Authors:
260
+ * This file is derived from IMX I2C controller,
281
+ * Damien Hedde
261
+ * by Jean-Christophe DUBOIS .
282
+ *
262
+ *
283
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
263
+ * This program is free software; you can redistribute it and/or modify it
284
+ * See the COPYING file in the top-level directory.
264
+ * under the terms of the GNU General Public License as published by the
265
+ * Free Software Foundation; either version 2 of the License, or
266
+ * (at your option) any later version.
267
+ *
268
+ * This program is distributed in the hope that it will be useful, but WITHOUT
269
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
270
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
271
+ * for more details.
272
+ *
273
+ * You should have received a copy of the GNU General Public License along
274
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
275
+ *
276
+ * SPDX-License-Identifier: MIT
285
+ */
277
+ */
286
+
278
+
287
+#include "qemu/osdep.h"
279
+#include "qemu/osdep.h"
280
+#include "hw/i2c/allwinner-i2c.h"
281
+#include "hw/irq.h"
282
+#include "migration/vmstate.h"
283
+#include "hw/i2c/i2c.h"
284
+#include "qemu/log.h"
285
+#include "trace.h"
288
+#include "qemu/module.h"
286
+#include "qemu/module.h"
289
+#include "hw/resettable.h"
287
+
290
+#include "trace.h"
288
+/* Allwinner I2C memory map */
291
+
289
+#define TWI_ADDR_REG 0x00 /* slave address register */
292
+/**
290
+#define TWI_XADDR_REG 0x04 /* extended slave address register */
293
+ * resettable_phase_enter/hold/exit:
291
+#define TWI_DATA_REG 0x08 /* data register */
294
+ * Function executing a phase recursively in a resettable object and its
292
+#define TWI_CNTR_REG 0x0c /* control register */
295
+ * children.
293
+#define TWI_STAT_REG 0x10 /* status register */
296
+ */
294
+#define TWI_CCR_REG 0x14 /* clock control register */
297
+static void resettable_phase_enter(Object *obj, void *opaque, ResetType type);
295
+#define TWI_SRST_REG 0x18 /* software reset register */
298
+static void resettable_phase_hold(Object *obj, void *opaque, ResetType type);
296
+#define TWI_EFR_REG 0x1c /* enhance feature register */
299
+static void resettable_phase_exit(Object *obj, void *opaque, ResetType type);
297
+#define TWI_LCR_REG 0x20 /* line control register */
300
+
298
+
301
+/**
299
+/* Used only in slave mode, do not set */
302
+ * enter_phase_in_progress:
300
+#define TWI_ADDR_RESET 0
303
+ * True if we are currently in reset enter phase.
301
+#define TWI_XADDR_RESET 0
304
+ *
302
+
305
+ * Note: This flag is only used to guarantee (using asserts) that the reset
303
+/* Data register */
306
+ * API is used correctly. We can use a global variable because we rely on the
304
+#define TWI_DATA_MASK 0xFF
307
+ * iothread mutex to ensure only one reset operation is in a progress at a
305
+#define TWI_DATA_RESET 0
308
+ * given time.
306
+
309
+ */
307
+/* Control register */
310
+static bool enter_phase_in_progress;
308
+#define TWI_CNTR_INT_EN (1 << 7)
311
+
309
+#define TWI_CNTR_BUS_EN (1 << 6)
312
+void resettable_reset(Object *obj, ResetType type)
310
+#define TWI_CNTR_M_STA (1 << 5)
313
+{
311
+#define TWI_CNTR_M_STP (1 << 4)
314
+ trace_resettable_reset(obj, type);
312
+#define TWI_CNTR_INT_FLAG (1 << 3)
315
+ resettable_assert_reset(obj, type);
313
+#define TWI_CNTR_A_ACK (1 << 2)
316
+ resettable_release_reset(obj, type);
314
+#define TWI_CNTR_MASK 0xFC
317
+}
315
+#define TWI_CNTR_RESET 0
318
+
316
+
319
+void resettable_assert_reset(Object *obj, ResetType type)
317
+/* Status register */
320
+{
318
+#define TWI_STAT_MASK 0xF8
321
+ /* TODO: change this assert when adding support for other reset types */
319
+#define TWI_STAT_RESET 0xF8
322
+ assert(type == RESET_TYPE_COLD);
320
+
323
+ trace_resettable_reset_assert_begin(obj, type);
321
+/* Clock register */
324
+ assert(!enter_phase_in_progress);
322
+#define TWI_CCR_CLK_M_MASK 0x78
325
+
323
+#define TWI_CCR_CLK_N_MASK 0x07
326
+ enter_phase_in_progress = true;
324
+#define TWI_CCR_MASK 0x7F
327
+ resettable_phase_enter(obj, NULL, type);
325
+#define TWI_CCR_RESET 0
328
+ enter_phase_in_progress = false;
326
+
329
+
327
+/* Soft reset */
330
+ resettable_phase_hold(obj, NULL, type);
328
+#define TWI_SRST_MASK 0x01
331
+
329
+#define TWI_SRST_RESET 0
332
+ trace_resettable_reset_assert_end(obj);
330
+
333
+}
331
+/* Enhance feature */
334
+
332
+#define TWI_EFR_MASK 0x03
335
+void resettable_release_reset(Object *obj, ResetType type)
333
+#define TWI_EFR_RESET 0
336
+{
334
+
337
+ /* TODO: change this assert when adding support for other reset types */
335
+/* Line control */
338
+ assert(type == RESET_TYPE_COLD);
336
+#define TWI_LCR_SCL_STATE (1 << 5)
339
+ trace_resettable_reset_release_begin(obj, type);
337
+#define TWI_LCR_SDA_STATE (1 << 4)
340
+ assert(!enter_phase_in_progress);
338
+#define TWI_LCR_SCL_CTL (1 << 3)
341
+
339
+#define TWI_LCR_SCL_CTL_EN (1 << 2)
342
+ resettable_phase_exit(obj, NULL, type);
340
+#define TWI_LCR_SDA_CTL (1 << 1)
343
+
341
+#define TWI_LCR_SDA_CTL_EN (1 << 0)
344
+ trace_resettable_reset_release_end(obj);
342
+#define TWI_LCR_MASK 0x3F
345
+}
343
+#define TWI_LCR_RESET 0x3A
346
+
344
+
347
+bool resettable_is_in_reset(Object *obj)
345
+/* Status value in STAT register is shifted by 3 bits */
348
+{
346
+#define TWI_STAT_SHIFT 3
349
+ ResettableClass *rc = RESETTABLE_GET_CLASS(obj);
347
+#define STAT_FROM_STA(x) ((x) << TWI_STAT_SHIFT)
350
+ ResettableState *s = rc->get_state(obj);
348
+#define STAT_TO_STA(x) ((x) >> TWI_STAT_SHIFT)
351
+
349
+
352
+ return s->count > 0;
350
+enum {
353
+}
351
+ STAT_BUS_ERROR = 0,
354
+
352
+ /* Master mode */
355
+/**
353
+ STAT_M_STA_TX,
356
+ * resettable_child_foreach:
354
+ STAT_M_RSTA_TX,
357
+ * helper to avoid checking the existence of the method.
355
+ STAT_M_ADDR_WR_ACK,
358
+ */
356
+ STAT_M_ADDR_WR_NACK,
359
+static void resettable_child_foreach(ResettableClass *rc, Object *obj,
357
+ STAT_M_DATA_TX_ACK,
360
+ ResettableChildCallback cb,
358
+ STAT_M_DATA_TX_NACK,
361
+ void *opaque, ResetType type)
359
+ STAT_M_ARB_LOST,
362
+{
360
+ STAT_M_ADDR_RD_ACK,
363
+ if (rc->child_foreach) {
361
+ STAT_M_ADDR_RD_NACK,
364
+ rc->child_foreach(obj, cb, opaque, type);
362
+ STAT_M_DATA_RX_ACK,
363
+ STAT_M_DATA_RX_NACK,
364
+ /* Slave mode */
365
+ STAT_S_ADDR_WR_ACK,
366
+ STAT_S_ARB_LOST_AW_ACK,
367
+ STAT_S_GCA_ACK,
368
+ STAT_S_ARB_LOST_GCA_ACK,
369
+ STAT_S_DATA_RX_SA_ACK,
370
+ STAT_S_DATA_RX_SA_NACK,
371
+ STAT_S_DATA_RX_GCA_ACK,
372
+ STAT_S_DATA_RX_GCA_NACK,
373
+ STAT_S_STP_RSTA,
374
+ STAT_S_ADDR_RD_ACK,
375
+ STAT_S_ARB_LOST_AR_ACK,
376
+ STAT_S_DATA_TX_ACK,
377
+ STAT_S_DATA_TX_NACK,
378
+ STAT_S_LB_TX_ACK,
379
+ /* Master mode, 10-bit */
380
+ STAT_M_2ND_ADDR_WR_ACK,
381
+ STAT_M_2ND_ADDR_WR_NACK,
382
+ /* Idle */
383
+ STAT_IDLE = 0x1f
384
+} TWI_STAT_STA;
385
+
386
+static const char *allwinner_i2c_get_regname(unsigned offset)
387
+{
388
+ switch (offset) {
389
+ case TWI_ADDR_REG:
390
+ return "ADDR";
391
+ case TWI_XADDR_REG:
392
+ return "XADDR";
393
+ case TWI_DATA_REG:
394
+ return "DATA";
395
+ case TWI_CNTR_REG:
396
+ return "CNTR";
397
+ case TWI_STAT_REG:
398
+ return "STAT";
399
+ case TWI_CCR_REG:
400
+ return "CCR";
401
+ case TWI_SRST_REG:
402
+ return "SRST";
403
+ case TWI_EFR_REG:
404
+ return "EFR";
405
+ case TWI_LCR_REG:
406
+ return "LCR";
407
+ default:
408
+ return "[?]";
365
+ }
409
+ }
366
+}
410
+}
367
+
411
+
368
+/**
412
+static inline bool allwinner_i2c_is_reset(AWI2CState *s)
369
+ * resettable_get_tr_func:
413
+{
370
+ * helper to fetch transitional reset callback if any.
414
+ return s->srst & TWI_SRST_MASK;
371
+ */
415
+}
372
+static ResettableTrFunction resettable_get_tr_func(ResettableClass *rc,
416
+
373
+ Object *obj)
417
+static inline bool allwinner_i2c_bus_is_enabled(AWI2CState *s)
374
+{
418
+{
375
+ ResettableTrFunction tr_func = NULL;
419
+ return s->cntr & TWI_CNTR_BUS_EN;
376
+ if (rc->get_transitional_function) {
420
+}
377
+ tr_func = rc->get_transitional_function(obj);
421
+
422
+static inline bool allwinner_i2c_interrupt_is_enabled(AWI2CState *s)
423
+{
424
+ return s->cntr & TWI_CNTR_INT_EN;
425
+}
426
+
427
+static void allwinner_i2c_reset_hold(Object *obj)
428
+{
429
+ AWI2CState *s = AW_I2C(obj);
430
+
431
+ if (STAT_TO_STA(s->stat) != STAT_IDLE) {
432
+ i2c_end_transfer(s->bus);
378
+ }
433
+ }
379
+ return tr_func;
434
+
380
+}
435
+ s->addr = TWI_ADDR_RESET;
381
+
436
+ s->xaddr = TWI_XADDR_RESET;
382
+static void resettable_phase_enter(Object *obj, void *opaque, ResetType type)
437
+ s->data = TWI_DATA_RESET;
383
+{
438
+ s->cntr = TWI_CNTR_RESET;
384
+ ResettableClass *rc = RESETTABLE_GET_CLASS(obj);
439
+ s->stat = TWI_STAT_RESET;
385
+ ResettableState *s = rc->get_state(obj);
440
+ s->ccr = TWI_CCR_RESET;
386
+ const char *obj_typename = object_get_typename(obj);
441
+ s->srst = TWI_SRST_RESET;
387
+ bool action_needed = false;
442
+ s->efr = TWI_EFR_RESET;
388
+
443
+ s->lcr = TWI_LCR_RESET;
389
+ /* exit phase has to finish properly before entering back in reset */
444
+}
390
+ assert(!s->exit_phase_in_progress);
445
+
391
+
446
+static inline void allwinner_i2c_raise_interrupt(AWI2CState *s)
392
+ trace_resettable_phase_enter_begin(obj, obj_typename, s->count, type);
447
+{
393
+
394
+ /* Only take action if we really enter reset for the 1st time. */
395
+ /*
448
+ /*
396
+ * TODO: if adding more ResetType support, some additional checks
449
+ * Raise an interrupt if the device is not reset and it is configured
397
+ * are probably needed here.
450
+ * to generate some interrupts.
398
+ */
451
+ */
399
+ if (s->count++ == 0) {
452
+ if (!allwinner_i2c_is_reset(s) && allwinner_i2c_bus_is_enabled(s)) {
400
+ action_needed = true;
453
+ if (STAT_TO_STA(s->stat) != STAT_IDLE) {
401
+ }
454
+ s->cntr |= TWI_CNTR_INT_FLAG;
402
+ /*
455
+ if (allwinner_i2c_interrupt_is_enabled(s)) {
403
+ * We limit the count to an arbitrary "big" value. The value is big
456
+ qemu_irq_raise(s->irq);
404
+ * enough not to be triggered normally.
457
+ }
405
+ * The assert will stop an infinite loop if there is a cycle in the
406
+ * reset tree. The loop goes through resettable_foreach_child below
407
+ * which at some point will call us again.
408
+ */
409
+ assert(s->count <= 50);
410
+
411
+ /*
412
+ * handle the children even if action_needed is at false so that
413
+ * child counts are incremented too
414
+ */
415
+ resettable_child_foreach(rc, obj, resettable_phase_enter, NULL, type);
416
+
417
+ /* execute enter phase for the object if needed */
418
+ if (action_needed) {
419
+ trace_resettable_phase_enter_exec(obj, obj_typename, type,
420
+ !!rc->phases.enter);
421
+ if (rc->phases.enter && !resettable_get_tr_func(rc, obj)) {
422
+ rc->phases.enter(obj, type);
423
+ }
424
+ s->hold_phase_pending = true;
425
+ }
426
+ trace_resettable_phase_enter_end(obj, obj_typename, s->count);
427
+}
428
+
429
+static void resettable_phase_hold(Object *obj, void *opaque, ResetType type)
430
+{
431
+ ResettableClass *rc = RESETTABLE_GET_CLASS(obj);
432
+ ResettableState *s = rc->get_state(obj);
433
+ const char *obj_typename = object_get_typename(obj);
434
+
435
+ /* exit phase has to finish properly before entering back in reset */
436
+ assert(!s->exit_phase_in_progress);
437
+
438
+ trace_resettable_phase_hold_begin(obj, obj_typename, s->count, type);
439
+
440
+ /* handle children first */
441
+ resettable_child_foreach(rc, obj, resettable_phase_hold, NULL, type);
442
+
443
+ /* exec hold phase */
444
+ if (s->hold_phase_pending) {
445
+ s->hold_phase_pending = false;
446
+ ResettableTrFunction tr_func = resettable_get_tr_func(rc, obj);
447
+ trace_resettable_phase_hold_exec(obj, obj_typename, !!rc->phases.hold);
448
+ if (tr_func) {
449
+ trace_resettable_transitional_function(obj, obj_typename);
450
+ tr_func(obj);
451
+ } else if (rc->phases.hold) {
452
+ rc->phases.hold(obj);
453
+ }
458
+ }
454
+ }
459
+ }
455
+ trace_resettable_phase_hold_end(obj, obj_typename, s->count);
460
+}
456
+}
461
+
457
+
462
+static uint64_t allwinner_i2c_read(void *opaque, hwaddr offset,
458
+static void resettable_phase_exit(Object *obj, void *opaque, ResetType type)
463
+ unsigned size)
459
+{
464
+{
460
+ ResettableClass *rc = RESETTABLE_GET_CLASS(obj);
465
+ uint16_t value;
461
+ ResettableState *s = rc->get_state(obj);
466
+ AWI2CState *s = AW_I2C(opaque);
462
+ const char *obj_typename = object_get_typename(obj);
467
+
463
+
468
+ switch (offset) {
464
+ assert(!s->exit_phase_in_progress);
469
+ case TWI_ADDR_REG:
465
+ trace_resettable_phase_exit_begin(obj, obj_typename, s->count, type);
470
+ value = s->addr;
466
+
471
+ break;
467
+ /* exit_phase_in_progress ensures this phase is 'atomic' */
472
+ case TWI_XADDR_REG:
468
+ s->exit_phase_in_progress = true;
473
+ value = s->xaddr;
469
+ resettable_child_foreach(rc, obj, resettable_phase_exit, NULL, type);
474
+ break;
470
+
475
+ case TWI_DATA_REG:
471
+ assert(s->count > 0);
476
+ if ((STAT_TO_STA(s->stat) == STAT_M_ADDR_RD_ACK) ||
472
+ if (s->count == 1) {
477
+ (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_ACK) ||
473
+ trace_resettable_phase_exit_exec(obj, obj_typename, !!rc->phases.exit);
478
+ (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_NACK)) {
474
+ if (rc->phases.exit && !resettable_get_tr_func(rc, obj)) {
479
+ /* Get the next byte */
475
+ rc->phases.exit(obj);
480
+ s->data = i2c_recv(s->bus);
481
+
482
+ if (s->cntr & TWI_CNTR_A_ACK) {
483
+ s->stat = STAT_FROM_STA(STAT_M_DATA_RX_ACK);
484
+ } else {
485
+ s->stat = STAT_FROM_STA(STAT_M_DATA_RX_NACK);
486
+ }
487
+ allwinner_i2c_raise_interrupt(s);
476
+ }
488
+ }
477
+ s->count = 0;
489
+ value = s->data;
490
+ break;
491
+ case TWI_CNTR_REG:
492
+ value = s->cntr;
493
+ break;
494
+ case TWI_STAT_REG:
495
+ value = s->stat;
496
+ /*
497
+ * If polling when reading then change state to indicate data
498
+ * is available
499
+ */
500
+ if (STAT_TO_STA(s->stat) == STAT_M_ADDR_RD_ACK) {
501
+ if (s->cntr & TWI_CNTR_A_ACK) {
502
+ s->stat = STAT_FROM_STA(STAT_M_DATA_RX_ACK);
503
+ } else {
504
+ s->stat = STAT_FROM_STA(STAT_M_DATA_RX_NACK);
505
+ }
506
+ allwinner_i2c_raise_interrupt(s);
507
+ }
508
+ break;
509
+ case TWI_CCR_REG:
510
+ value = s->ccr;
511
+ break;
512
+ case TWI_SRST_REG:
513
+ value = s->srst;
514
+ break;
515
+ case TWI_EFR_REG:
516
+ value = s->efr;
517
+ break;
518
+ case TWI_LCR_REG:
519
+ value = s->lcr;
520
+ break;
521
+ default:
522
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad address at offset 0x%"
523
+ HWADDR_PRIx "\n", TYPE_AW_I2C, __func__, offset);
524
+ value = 0;
525
+ break;
478
+ }
526
+ }
479
+ s->exit_phase_in_progress = false;
527
+
480
+ trace_resettable_phase_exit_end(obj, obj_typename, s->count);
528
+ trace_allwinner_i2c_read(allwinner_i2c_get_regname(offset), offset, value);
481
+}
529
+
482
+
530
+ return (uint64_t)value;
483
+void resettable_class_set_parent_phases(ResettableClass *rc,
531
+}
484
+ ResettableEnterPhase enter,
532
+
485
+ ResettableHoldPhase hold,
533
+static void allwinner_i2c_write(void *opaque, hwaddr offset,
486
+ ResettableExitPhase exit,
534
+ uint64_t value, unsigned size)
487
+ ResettablePhases *parent_phases)
535
+{
488
+{
536
+ AWI2CState *s = AW_I2C(opaque);
489
+ *parent_phases = rc->phases;
537
+
490
+ if (enter) {
538
+ value &= 0xff;
491
+ rc->phases.enter = enter;
539
+
540
+ trace_allwinner_i2c_write(allwinner_i2c_get_regname(offset), offset, value);
541
+
542
+ switch (offset) {
543
+ case TWI_ADDR_REG:
544
+ s->addr = (uint8_t)value;
545
+ break;
546
+ case TWI_XADDR_REG:
547
+ s->xaddr = (uint8_t)value;
548
+ break;
549
+ case TWI_DATA_REG:
550
+ /* If the device is in reset or not enabled, nothing to do */
551
+ if (allwinner_i2c_is_reset(s) || (!allwinner_i2c_bus_is_enabled(s))) {
552
+ break;
553
+ }
554
+
555
+ s->data = value & TWI_DATA_MASK;
556
+
557
+ switch (STAT_TO_STA(s->stat)) {
558
+ case STAT_M_STA_TX:
559
+ case STAT_M_RSTA_TX:
560
+ /* Send address */
561
+ if (i2c_start_transfer(s->bus, extract32(s->data, 1, 7),
562
+ extract32(s->data, 0, 1))) {
563
+ /* If non zero is returned, the address is not valid */
564
+ s->stat = STAT_FROM_STA(STAT_M_ADDR_WR_NACK);
565
+ } else {
566
+ /* Determine if read of write */
567
+ if (extract32(s->data, 0, 1)) {
568
+ s->stat = STAT_FROM_STA(STAT_M_ADDR_RD_ACK);
569
+ } else {
570
+ s->stat = STAT_FROM_STA(STAT_M_ADDR_WR_ACK);
571
+ }
572
+ allwinner_i2c_raise_interrupt(s);
573
+ }
574
+ break;
575
+ case STAT_M_ADDR_WR_ACK:
576
+ case STAT_M_DATA_TX_ACK:
577
+ if (i2c_send(s->bus, s->data)) {
578
+ /* If the target return non zero then end the transfer */
579
+ s->stat = STAT_FROM_STA(STAT_M_DATA_TX_NACK);
580
+ i2c_end_transfer(s->bus);
581
+ } else {
582
+ s->stat = STAT_FROM_STA(STAT_M_DATA_TX_ACK);
583
+ allwinner_i2c_raise_interrupt(s);
584
+ }
585
+ break;
586
+ default:
587
+ break;
588
+ }
589
+ break;
590
+ case TWI_CNTR_REG:
591
+ if (!allwinner_i2c_is_reset(s)) {
592
+ /* Do something only if not in software reset */
593
+ s->cntr = value & TWI_CNTR_MASK;
594
+
595
+ /* Check if start condition should be sent */
596
+ if (s->cntr & TWI_CNTR_M_STA) {
597
+ /* Update status */
598
+ if (STAT_TO_STA(s->stat) == STAT_IDLE) {
599
+ /* Send start condition */
600
+ s->stat = STAT_FROM_STA(STAT_M_STA_TX);
601
+ } else {
602
+ /* Send repeated start condition */
603
+ s->stat = STAT_FROM_STA(STAT_M_RSTA_TX);
604
+ }
605
+ /* Clear start condition */
606
+ s->cntr &= ~TWI_CNTR_M_STA;
607
+ }
608
+ if (s->cntr & TWI_CNTR_M_STP) {
609
+ /* Update status */
610
+ i2c_end_transfer(s->bus);
611
+ s->stat = STAT_FROM_STA(STAT_IDLE);
612
+ s->cntr &= ~TWI_CNTR_M_STP;
613
+ }
614
+ if ((s->cntr & TWI_CNTR_INT_FLAG) == 0) {
615
+ /* Interrupt flag cleared */
616
+ qemu_irq_lower(s->irq);
617
+ }
618
+ if ((s->cntr & TWI_CNTR_A_ACK) == 0) {
619
+ if (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_ACK) {
620
+ s->stat = STAT_FROM_STA(STAT_M_DATA_RX_NACK);
621
+ }
622
+ } else {
623
+ if (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_NACK) {
624
+ s->stat = STAT_FROM_STA(STAT_M_DATA_RX_ACK);
625
+ }
626
+ }
627
+ allwinner_i2c_raise_interrupt(s);
628
+
629
+ }
630
+ break;
631
+ case TWI_CCR_REG:
632
+ s->ccr = value & TWI_CCR_MASK;
633
+ break;
634
+ case TWI_SRST_REG:
635
+ if (((value & TWI_SRST_MASK) == 0) && (s->srst & TWI_SRST_MASK)) {
636
+ /* Perform reset */
637
+ allwinner_i2c_reset_hold(OBJECT(s));
638
+ }
639
+ s->srst = value & TWI_SRST_MASK;
640
+ break;
641
+ case TWI_EFR_REG:
642
+ s->efr = value & TWI_EFR_MASK;
643
+ break;
644
+ case TWI_LCR_REG:
645
+ s->lcr = value & TWI_LCR_MASK;
646
+ break;
647
+ default:
648
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad address at offset 0x%"
649
+ HWADDR_PRIx "\n", TYPE_AW_I2C, __func__, offset);
650
+ break;
492
+ }
651
+ }
493
+ if (hold) {
652
+}
494
+ rc->phases.hold = hold;
653
+
654
+static const MemoryRegionOps allwinner_i2c_ops = {
655
+ .read = allwinner_i2c_read,
656
+ .write = allwinner_i2c_write,
657
+ .valid.min_access_size = 1,
658
+ .valid.max_access_size = 4,
659
+ .endianness = DEVICE_NATIVE_ENDIAN,
660
+};
661
+
662
+static const VMStateDescription allwinner_i2c_vmstate = {
663
+ .name = TYPE_AW_I2C,
664
+ .version_id = 1,
665
+ .minimum_version_id = 1,
666
+ .fields = (VMStateField[]) {
667
+ VMSTATE_UINT8(addr, AWI2CState),
668
+ VMSTATE_UINT8(xaddr, AWI2CState),
669
+ VMSTATE_UINT8(data, AWI2CState),
670
+ VMSTATE_UINT8(cntr, AWI2CState),
671
+ VMSTATE_UINT8(ccr, AWI2CState),
672
+ VMSTATE_UINT8(srst, AWI2CState),
673
+ VMSTATE_UINT8(efr, AWI2CState),
674
+ VMSTATE_UINT8(lcr, AWI2CState),
675
+ VMSTATE_END_OF_LIST()
495
+ }
676
+ }
496
+ if (exit) {
497
+ rc->phases.exit = exit;
498
+ }
499
+}
500
+
501
+static const TypeInfo resettable_interface_info = {
502
+ .name = TYPE_RESETTABLE_INTERFACE,
503
+ .parent = TYPE_INTERFACE,
504
+ .class_size = sizeof(ResettableClass),
505
+};
677
+};
506
+
678
+
507
+static void reset_register_types(void)
679
+static void allwinner_i2c_realize(DeviceState *dev, Error **errp)
508
+{
680
+{
509
+ type_register_static(&resettable_interface_info);
681
+ AWI2CState *s = AW_I2C(dev);
510
+}
682
+
511
+
683
+ memory_region_init_io(&s->iomem, OBJECT(s), &allwinner_i2c_ops, s,
512
+type_init(reset_register_types)
684
+ TYPE_AW_I2C, AW_I2C_MEM_SIZE);
513
diff --git a/hw/core/trace-events b/hw/core/trace-events
685
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
514
index XXXXXXX..XXXXXXX 100644
686
+ sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
515
--- a/hw/core/trace-events
687
+ s->bus = i2c_init_bus(dev, "i2c");
516
+++ b/hw/core/trace-events
688
+}
517
@@ -XXX,XX +XXX,XX @@ qbus_reset(void *obj, const char *objtype) "obj=%p(%s)"
689
+
518
qbus_reset_all(void *obj, const char *objtype) "obj=%p(%s)"
690
+static void allwinner_i2c_class_init(ObjectClass *klass, void *data)
519
qbus_reset_tree(void *obj, const char *objtype) "obj=%p(%s)"
691
+{
520
qdev_update_parent_bus(void *obj, const char *objtype, void *oldp, const char *oldptype, void *newp, const char *newptype) "obj=%p(%s) old_parent=%p(%s) new_parent=%p(%s)"
692
+ DeviceClass *dc = DEVICE_CLASS(klass);
521
+
693
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
522
+# resettable.c
694
+
523
+resettable_reset(void *obj, int cold) "obj=%p cold=%d"
695
+ rc->phases.hold = allwinner_i2c_reset_hold;
524
+resettable_reset_assert_begin(void *obj, int cold) "obj=%p cold=%d"
696
+ dc->vmsd = &allwinner_i2c_vmstate;
525
+resettable_reset_assert_end(void *obj) "obj=%p"
697
+ dc->realize = allwinner_i2c_realize;
526
+resettable_reset_release_begin(void *obj, int cold) "obj=%p cold=%d"
698
+ dc->desc = "Allwinner I2C Controller";
527
+resettable_reset_release_end(void *obj) "obj=%p"
699
+}
528
+resettable_phase_enter_begin(void *obj, const char *objtype, unsigned count, int type) "obj=%p(%s) count=%d type=%d"
700
+
529
+resettable_phase_enter_exec(void *obj, const char *objtype, int type, int has_method) "obj=%p(%s) type=%d method=%d"
701
+static const TypeInfo allwinner_i2c_type_info = {
530
+resettable_phase_enter_end(void *obj, const char *objtype, unsigned count) "obj=%p(%s) count=%d"
702
+ .name = TYPE_AW_I2C,
531
+resettable_phase_hold_begin(void *obj, const char *objtype, unsigned count, int type) "obj=%p(%s) count=%d type=%d"
703
+ .parent = TYPE_SYS_BUS_DEVICE,
532
+resettable_phase_hold_exec(void *obj, const char *objtype, int has_method) "obj=%p(%s) method=%d"
704
+ .instance_size = sizeof(AWI2CState),
533
+resettable_phase_hold_end(void *obj, const char *objtype, unsigned count) "obj=%p(%s) count=%d"
705
+ .class_init = allwinner_i2c_class_init,
534
+resettable_phase_exit_begin(void *obj, const char *objtype, unsigned count, int type) "obj=%p(%s) count=%d type=%d"
706
+};
535
+resettable_phase_exit_exec(void *obj, const char *objtype, int has_method) "obj=%p(%s) method=%d"
707
+
536
+resettable_phase_exit_end(void *obj, const char *objtype, unsigned count) "obj=%p(%s) count=%d"
708
+static void allwinner_i2c_register_types(void)
537
+resettable_transitional_function(void *obj, const char *objtype) "obj=%p(%s)"
709
+{
710
+ type_register_static(&allwinner_i2c_type_info);
711
+}
712
+
713
+type_init(allwinner_i2c_register_types)
714
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
715
index XXXXXXX..XXXXXXX 100644
716
--- a/hw/arm/Kconfig
717
+++ b/hw/arm/Kconfig
718
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_A10
719
select ALLWINNER_A10_CCM
720
select ALLWINNER_A10_DRAMC
721
select ALLWINNER_EMAC
722
+ select ALLWINNER_I2C
723
select SERIAL
724
select UNIMP
725
726
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_H3
727
bool
728
select ALLWINNER_A10_PIT
729
select ALLWINNER_SUN8I_EMAC
730
+ select ALLWINNER_I2C
731
select SERIAL
732
select ARM_TIMER
733
select ARM_GIC
734
diff --git a/hw/i2c/Kconfig b/hw/i2c/Kconfig
735
index XXXXXXX..XXXXXXX 100644
736
--- a/hw/i2c/Kconfig
737
+++ b/hw/i2c/Kconfig
738
@@ -XXX,XX +XXX,XX @@ config MPC_I2C
739
bool
740
select I2C
741
742
+config ALLWINNER_I2C
743
+ bool
744
+ select I2C
745
+
746
config PCA954X
747
bool
748
select I2C
749
diff --git a/hw/i2c/meson.build b/hw/i2c/meson.build
750
index XXXXXXX..XXXXXXX 100644
751
--- a/hw/i2c/meson.build
752
+++ b/hw/i2c/meson.build
753
@@ -XXX,XX +XXX,XX @@ i2c_ss.add(when: 'CONFIG_BITBANG_I2C', if_true: files('bitbang_i2c.c'))
754
i2c_ss.add(when: 'CONFIG_EXYNOS4', if_true: files('exynos4210_i2c.c'))
755
i2c_ss.add(when: 'CONFIG_IMX_I2C', if_true: files('imx_i2c.c'))
756
i2c_ss.add(when: 'CONFIG_MPC_I2C', if_true: files('mpc_i2c.c'))
757
+i2c_ss.add(when: 'CONFIG_ALLWINNER_I2C', if_true: files('allwinner-i2c.c'))
758
i2c_ss.add(when: 'CONFIG_NRF51_SOC', if_true: files('microbit_i2c.c'))
759
i2c_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx_smbus.c'))
760
i2c_ss.add(when: 'CONFIG_SMBUS_EEPROM', if_true: files('smbus_eeprom.c'))
761
diff --git a/hw/i2c/trace-events b/hw/i2c/trace-events
762
index XXXXXXX..XXXXXXX 100644
763
--- a/hw/i2c/trace-events
764
+++ b/hw/i2c/trace-events
765
@@ -XXX,XX +XXX,XX @@ i2c_send_async(uint8_t address, uint8_t data) "send_async(addr:0x%02x) data:0x%0
766
i2c_recv(uint8_t address, uint8_t data) "recv(addr:0x%02x) data:0x%02x"
767
i2c_ack(void) ""
768
769
+# allwinner_i2c.c
770
+
771
+allwinner_i2c_read(const char* reg_name, uint64_t offset, uint64_t value) "read %s [0x%" PRIx64 "]: -> 0x%" PRIx64
772
+allwinner_i2c_write(const char* reg_name, uint64_t offset, uint64_t value) "write %s [0x%" PRIx64 "]: <- 0x%" PRIx64
773
+
774
# aspeed_i2c.c
775
776
aspeed_i2c_bus_cmd(uint32_t cmd, const char *cmd_flags, uint32_t count, uint32_t intr_status) "handling cmd=0x%x %s count=%d intr=0x%x"
538
--
777
--
539
2.20.1
778
2.34.1
540
541
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
2
2
3
Following the pattern of the work recently done with the ASPEED GPIO
3
This patch adds minimal support for AXP-209 PMU.
4
model, this adds support for inspecting and modifying the PCA9552 LEDs
4
Most important is chip ID since U-Boot SPL expects version 0x1. Besides
5
from the monitor.
5
the chip ID register, reset values for two more registers used by A10
6
U-Boot SPL are covered.
6
7
7
(qemu) qom-set /machine/unattached/device[17] led0 on
8
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
8
(qemu) qom-set /machine/unattached/device[17] led0 off
9
Message-id: 20221226220303.14420-5-strahinja.p.jankovic@gmail.com
9
(qemu) qom-set /machine/unattached/device[17] led0 pwm0
10
(qemu) qom-set /machine/unattached/device[17] led0 pwm1
11
12
Signed-off-by: Joel Stanley <joel@jms.id.au>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
Message-id: 20200114103433.30534-6-clg@kaod.org
15
[clg: - removed the "qom-get" examples from the commit log
16
- merged memory leak fixes from Joel ]
17
Signed-off-by: Cédric Le Goater <clg@kaod.org>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
12
---
21
hw/misc/pca9552.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++
13
hw/misc/axp209.c | 238 +++++++++++++++++++++++++++++++++++++++++++
22
1 file changed, 90 insertions(+)
14
MAINTAINERS | 2 +
15
hw/misc/Kconfig | 4 +
16
hw/misc/meson.build | 1 +
17
hw/misc/trace-events | 5 +
18
5 files changed, 250 insertions(+)
19
create mode 100644 hw/misc/axp209.c
23
20
24
diff --git a/hw/misc/pca9552.c b/hw/misc/pca9552.c
21
diff --git a/hw/misc/axp209.c b/hw/misc/axp209.c
25
index XXXXXXX..XXXXXXX 100644
22
new file mode 100644
26
--- a/hw/misc/pca9552.c
23
index XXXXXXX..XXXXXXX
27
+++ b/hw/misc/pca9552.c
24
--- /dev/null
25
+++ b/hw/misc/axp209.c
28
@@ -XXX,XX +XXX,XX @@
26
@@ -XXX,XX +XXX,XX @@
29
#include "hw/misc/pca9552.h"
27
+/*
30
#include "hw/misc/pca9552_regs.h"
28
+ * AXP-209 PMU Emulation
31
#include "migration/vmstate.h"
29
+ *
32
+#include "qapi/error.h"
30
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
33
+#include "qapi/visitor.h"
31
+ *
34
32
+ * Permission is hereby granted, free of charge, to any person obtaining a
35
#define PCA9552_LED_ON 0x0
33
+ * copy of this software and associated documentation files (the "Software"),
36
#define PCA9552_LED_OFF 0x1
34
+ * to deal in the Software without restriction, including without limitation
37
#define PCA9552_LED_PWM0 0x2
35
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
38
#define PCA9552_LED_PWM1 0x3
36
+ * and/or sell copies of the Software, and to permit persons to whom the
39
37
+ * Software is furnished to do so, subject to the following conditions:
40
+static const char *led_state[] = {"on", "off", "pwm0", "pwm1"};
38
+ *
41
+
39
+ * The above copyright notice and this permission notice shall be included in
42
static uint8_t pca9552_pin_get_config(PCA9552State *s, int pin)
40
+ * all copies or substantial portions of the Software.
43
{
41
+ *
44
uint8_t reg = PCA9552_LS0 + (pin / 4);
42
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
45
@@ -XXX,XX +XXX,XX @@ static int pca9552_event(I2CSlave *i2c, enum i2c_event event)
43
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
46
return 0;
44
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
47
}
45
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
48
46
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
49
+static void pca9552_get_led(Object *obj, Visitor *v, const char *name,
47
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
50
+ void *opaque, Error **errp)
48
+ * DEALINGS IN THE SOFTWARE.
51
+{
49
+ *
52
+ PCA9552State *s = PCA9552(obj);
50
+ * SPDX-License-Identifier: MIT
53
+ int led, rc, reg;
51
+ */
54
+ uint8_t state;
52
+
55
+
53
+#include "qemu/osdep.h"
56
+ rc = sscanf(name, "led%2d", &led);
54
+#include "qemu/log.h"
57
+ if (rc != 1) {
55
+#include "trace.h"
58
+ error_setg(errp, "%s: error reading %s", __func__, name);
56
+#include "hw/i2c/i2c.h"
59
+ return;
57
+#include "migration/vmstate.h"
58
+
59
+#define TYPE_AXP209_PMU "axp209_pmu"
60
+
61
+#define AXP209(obj) \
62
+ OBJECT_CHECK(AXP209I2CState, (obj), TYPE_AXP209_PMU)
63
+
64
+/* registers */
65
+enum {
66
+ REG_POWER_STATUS = 0x0u,
67
+ REG_OPERATING_MODE,
68
+ REG_OTG_VBUS_STATUS,
69
+ REG_CHIP_VERSION,
70
+ REG_DATA_CACHE_0,
71
+ REG_DATA_CACHE_1,
72
+ REG_DATA_CACHE_2,
73
+ REG_DATA_CACHE_3,
74
+ REG_DATA_CACHE_4,
75
+ REG_DATA_CACHE_5,
76
+ REG_DATA_CACHE_6,
77
+ REG_DATA_CACHE_7,
78
+ REG_DATA_CACHE_8,
79
+ REG_DATA_CACHE_9,
80
+ REG_DATA_CACHE_A,
81
+ REG_DATA_CACHE_B,
82
+ REG_POWER_OUTPUT_CTRL = 0x12u,
83
+ REG_DC_DC2_OUT_V_CTRL = 0x23u,
84
+ REG_DC_DC2_DVS_CTRL = 0x25u,
85
+ REG_DC_DC3_OUT_V_CTRL = 0x27u,
86
+ REG_LDO2_4_OUT_V_CTRL,
87
+ REG_LDO3_OUT_V_CTRL,
88
+ REG_VBUS_CH_MGMT = 0x30u,
89
+ REG_SHUTDOWN_V_CTRL,
90
+ REG_SHUTDOWN_CTRL,
91
+ REG_CHARGE_CTRL_1,
92
+ REG_CHARGE_CTRL_2,
93
+ REG_SPARE_CHARGE_CTRL,
94
+ REG_PEK_KEY_CTRL,
95
+ REG_DC_DC_FREQ_SET,
96
+ REG_CHR_TEMP_TH_SET,
97
+ REG_CHR_HIGH_TEMP_TH_CTRL,
98
+ REG_IPSOUT_WARN_L1,
99
+ REG_IPSOUT_WARN_L2,
100
+ REG_DISCHR_TEMP_TH_SET,
101
+ REG_DISCHR_HIGH_TEMP_TH_CTRL,
102
+ REG_IRQ_BANK_1_CTRL = 0x40u,
103
+ REG_IRQ_BANK_2_CTRL,
104
+ REG_IRQ_BANK_3_CTRL,
105
+ REG_IRQ_BANK_4_CTRL,
106
+ REG_IRQ_BANK_5_CTRL,
107
+ REG_IRQ_BANK_1_STAT = 0x48u,
108
+ REG_IRQ_BANK_2_STAT,
109
+ REG_IRQ_BANK_3_STAT,
110
+ REG_IRQ_BANK_4_STAT,
111
+ REG_IRQ_BANK_5_STAT,
112
+ REG_ADC_ACIN_V_H = 0x56u,
113
+ REG_ADC_ACIN_V_L,
114
+ REG_ADC_ACIN_CURR_H,
115
+ REG_ADC_ACIN_CURR_L,
116
+ REG_ADC_VBUS_V_H,
117
+ REG_ADC_VBUS_V_L,
118
+ REG_ADC_VBUS_CURR_H,
119
+ REG_ADC_VBUS_CURR_L,
120
+ REG_ADC_INT_TEMP_H,
121
+ REG_ADC_INT_TEMP_L,
122
+ REG_ADC_TEMP_SENS_V_H = 0x62u,
123
+ REG_ADC_TEMP_SENS_V_L,
124
+ REG_ADC_BAT_V_H = 0x78u,
125
+ REG_ADC_BAT_V_L,
126
+ REG_ADC_BAT_DISCHR_CURR_H,
127
+ REG_ADC_BAT_DISCHR_CURR_L,
128
+ REG_ADC_BAT_CHR_CURR_H,
129
+ REG_ADC_BAT_CHR_CURR_L,
130
+ REG_ADC_IPSOUT_V_H,
131
+ REG_ADC_IPSOUT_V_L,
132
+ REG_DC_DC_MOD_SEL = 0x80u,
133
+ REG_ADC_EN_1,
134
+ REG_ADC_EN_2,
135
+ REG_ADC_SR_CTRL,
136
+ REG_ADC_IN_RANGE,
137
+ REG_GPIO1_ADC_IRQ_RISING_TH,
138
+ REG_GPIO1_ADC_IRQ_FALLING_TH,
139
+ REG_TIMER_CTRL = 0x8au,
140
+ REG_VBUS_CTRL_MON_SRP,
141
+ REG_OVER_TEMP_SHUTDOWN = 0x8fu,
142
+ REG_GPIO0_FEAT_SET,
143
+ REG_GPIO_OUT_HIGH_SET,
144
+ REG_GPIO1_FEAT_SET,
145
+ REG_GPIO2_FEAT_SET,
146
+ REG_GPIO_SIG_STATE_SET_MON,
147
+ REG_GPIO3_SET,
148
+ REG_COULOMB_CNTR_CTRL = 0xb8u,
149
+ REG_POWER_MEAS_RES,
150
+ NR_REGS
151
+};
152
+
153
+#define AXP209_CHIP_VERSION_ID (0x01)
154
+#define AXP209_DC_DC2_OUT_V_CTRL_RESET (0x16)
155
+#define AXP209_IRQ_BANK_1_CTRL_RESET (0xd8)
156
+
157
+/* A simple I2C slave which returns values of ID or CNT register. */
158
+typedef struct AXP209I2CState {
159
+ /*< private >*/
160
+ I2CSlave i2c;
161
+ /*< public >*/
162
+ uint8_t regs[NR_REGS]; /* peripheral registers */
163
+ uint8_t ptr; /* current register index */
164
+ uint8_t count; /* counter used for tx/rx */
165
+} AXP209I2CState;
166
+
167
+/* Reset all counters and load ID register */
168
+static void axp209_reset_enter(Object *obj, ResetType type)
169
+{
170
+ AXP209I2CState *s = AXP209(obj);
171
+
172
+ memset(s->regs, 0, NR_REGS);
173
+ s->ptr = 0;
174
+ s->count = 0;
175
+ s->regs[REG_CHIP_VERSION] = AXP209_CHIP_VERSION_ID;
176
+ s->regs[REG_DC_DC2_OUT_V_CTRL] = AXP209_DC_DC2_OUT_V_CTRL_RESET;
177
+ s->regs[REG_IRQ_BANK_1_CTRL] = AXP209_IRQ_BANK_1_CTRL_RESET;
178
+}
179
+
180
+/* Handle events from master. */
181
+static int axp209_event(I2CSlave *i2c, enum i2c_event event)
182
+{
183
+ AXP209I2CState *s = AXP209(i2c);
184
+
185
+ s->count = 0;
186
+
187
+ return 0;
188
+}
189
+
190
+/* Called when master requests read */
191
+static uint8_t axp209_rx(I2CSlave *i2c)
192
+{
193
+ AXP209I2CState *s = AXP209(i2c);
194
+ uint8_t ret = 0xff;
195
+
196
+ if (s->ptr < NR_REGS) {
197
+ ret = s->regs[s->ptr++];
60
+ }
198
+ }
61
+ if (led < 0 || led > s->nr_leds) {
199
+
62
+ error_setg(errp, "%s invalid led %s", __func__, name);
200
+ trace_axp209_rx(s->ptr - 1, ret);
63
+ return;
201
+
64
+ }
202
+ return ret;
65
+ /*
66
+ * Get the LSx register as the qom interface should expose the device
67
+ * state, not the modeled 'input line' behaviour which would come from
68
+ * reading the INPUTx reg
69
+ */
70
+ reg = PCA9552_LS0 + led / 4;
71
+ state = (pca9552_read(s, reg) >> (led % 8)) & 0x3;
72
+ visit_type_str(v, name, (char **)&led_state[state], errp);
73
+}
203
+}
74
+
204
+
75
+/*
205
+/*
76
+ * Return an LED selector register value based on an existing one, with
206
+ * Called when master sends write.
77
+ * the appropriate 2-bit state value set for the given LED number (0-3).
207
+ * Update ptr with byte 0, then perform write with second byte.
78
+ */
208
+ */
79
+static inline uint8_t pca955x_ledsel(uint8_t oldval, int led_num, int state)
209
+static int axp209_tx(I2CSlave *i2c, uint8_t data)
80
+{
210
+{
81
+ return (oldval & (~(0x3 << (led_num << 1)))) |
211
+ AXP209I2CState *s = AXP209(i2c);
82
+ ((state & 0x3) << (led_num << 1));
212
+
83
+}
213
+ if (s->count == 0) {
84
+
214
+ /* Store register address */
85
+static void pca9552_set_led(Object *obj, Visitor *v, const char *name,
215
+ s->ptr = data;
86
+ void *opaque, Error **errp)
216
+ s->count++;
87
+{
217
+ trace_axp209_select(data);
88
+ PCA9552State *s = PCA9552(obj);
218
+ } else {
89
+ Error *local_err = NULL;
219
+ trace_axp209_tx(s->ptr, data);
90
+ int led, rc, reg, val;
220
+ if (s->ptr == REG_DC_DC2_OUT_V_CTRL) {
91
+ uint8_t state;
221
+ s->regs[s->ptr++] = data;
92
+ char *state_str;
93
+
94
+ visit_type_str(v, name, &state_str, &local_err);
95
+ if (local_err) {
96
+ error_propagate(errp, local_err);
97
+ return;
98
+ }
99
+ rc = sscanf(name, "led%2d", &led);
100
+ if (rc != 1) {
101
+ error_setg(errp, "%s: error reading %s", __func__, name);
102
+ return;
103
+ }
104
+ if (led < 0 || led > s->nr_leds) {
105
+ error_setg(errp, "%s invalid led %s", __func__, name);
106
+ return;
107
+ }
108
+
109
+ for (state = 0; state < ARRAY_SIZE(led_state); state++) {
110
+ if (!strcmp(state_str, led_state[state])) {
111
+ break;
112
+ }
222
+ }
113
+ }
223
+ }
114
+ if (state >= ARRAY_SIZE(led_state)) {
224
+
115
+ error_setg(errp, "%s invalid led state %s", __func__, state_str);
225
+ return 0;
116
+ return;
226
+}
227
+
228
+static const VMStateDescription vmstate_axp209 = {
229
+ .name = TYPE_AXP209_PMU,
230
+ .version_id = 1,
231
+ .fields = (VMStateField[]) {
232
+ VMSTATE_UINT8_ARRAY(regs, AXP209I2CState, NR_REGS),
233
+ VMSTATE_UINT8(count, AXP209I2CState),
234
+ VMSTATE_UINT8(ptr, AXP209I2CState),
235
+ VMSTATE_END_OF_LIST()
117
+ }
236
+ }
118
+
237
+};
119
+ reg = PCA9552_LS0 + led / 4;
238
+
120
+ val = pca9552_read(s, reg);
239
+static void axp209_class_init(ObjectClass *oc, void *data)
121
+ val = pca955x_ledsel(val, led % 4, state);
240
+{
122
+ pca9552_write(s, reg, val);
241
+ DeviceClass *dc = DEVICE_CLASS(oc);
123
+}
242
+ I2CSlaveClass *isc = I2C_SLAVE_CLASS(oc);
124
+
243
+ ResettableClass *rc = RESETTABLE_CLASS(oc);
125
static const VMStateDescription pca9552_vmstate = {
244
+
126
.name = "PCA9552",
245
+ rc->phases.enter = axp209_reset_enter;
127
.version_id = 0,
246
+ dc->vmsd = &vmstate_axp209;
128
@@ -XXX,XX +XXX,XX @@ static void pca9552_reset(DeviceState *dev)
247
+ isc->event = axp209_event;
129
static void pca9552_initfn(Object *obj)
248
+ isc->recv = axp209_rx;
130
{
249
+ isc->send = axp209_tx;
131
PCA9552State *s = PCA9552(obj);
250
+}
132
+ int led;
251
+
133
252
+static const TypeInfo axp209_info = {
134
/* If support for the other PCA955X devices are implemented, these
253
+ .name = TYPE_AXP209_PMU,
135
* constant values might be part of class structure describing the
254
+ .parent = TYPE_I2C_SLAVE,
136
@@ -XXX,XX +XXX,XX @@ static void pca9552_initfn(Object *obj)
255
+ .instance_size = sizeof(AXP209I2CState),
137
*/
256
+ .class_init = axp209_class_init
138
s->max_reg = PCA9552_LS3;
257
+};
139
s->nr_leds = 16;
258
+
140
+
259
+static void axp209_register_devices(void)
141
+ for (led = 0; led < s->nr_leds; led++) {
260
+{
142
+ char *name;
261
+ type_register_static(&axp209_info);
143
+
262
+}
144
+ name = g_strdup_printf("led%d", led);
263
+
145
+ object_property_add(obj, name, "bool", pca9552_get_led, pca9552_set_led,
264
+type_init(axp209_register_devices);
146
+ NULL, NULL, NULL);
265
diff --git a/MAINTAINERS b/MAINTAINERS
147
+ g_free(name);
266
index XXXXXXX..XXXXXXX 100644
148
+ }
267
--- a/MAINTAINERS
149
}
268
+++ b/MAINTAINERS
150
269
@@ -XXX,XX +XXX,XX @@ ARM Machines
151
static void pca9552_class_init(ObjectClass *klass, void *data)
270
Allwinner-a10
271
M: Beniamino Galvani <b.galvani@gmail.com>
272
M: Peter Maydell <peter.maydell@linaro.org>
273
+R: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
274
L: qemu-arm@nongnu.org
275
S: Odd Fixes
276
F: hw/*/allwinner*
277
F: include/hw/*/allwinner*
278
F: hw/arm/cubieboard.c
279
F: docs/system/arm/cubieboard.rst
280
+F: hw/misc/axp209.c
281
282
Allwinner-h3
283
M: Niek Linnenbank <nieklinnenbank@gmail.com>
284
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
285
index XXXXXXX..XXXXXXX 100644
286
--- a/hw/misc/Kconfig
287
+++ b/hw/misc/Kconfig
288
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_A10_CCM
289
config ALLWINNER_A10_DRAMC
290
bool
291
292
+config AXP209_PMU
293
+ bool
294
+ depends on I2C
295
+
296
source macio/Kconfig
297
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
298
index XXXXXXX..XXXXXXX 100644
299
--- a/hw/misc/meson.build
300
+++ b/hw/misc/meson.build
301
@@ -XXX,XX +XXX,XX @@ specific_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-cpucfg.c'
302
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-h3-dramc.c'))
303
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-h3-sysctrl.c'))
304
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-sid.c'))
305
+softmmu_ss.add(when: 'CONFIG_AXP209_PMU', if_true: files('axp209.c'))
306
softmmu_ss.add(when: 'CONFIG_REALVIEW', if_true: files('arm_sysctl.c'))
307
softmmu_ss.add(when: 'CONFIG_NSERIES', if_true: files('cbus.c'))
308
softmmu_ss.add(when: 'CONFIG_ECCMEMCTL', if_true: files('eccmemctl.c'))
309
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
310
index XXXXXXX..XXXXXXX 100644
311
--- a/hw/misc/trace-events
312
+++ b/hw/misc/trace-events
313
@@ -XXX,XX +XXX,XX @@ allwinner_sid_write(uint64_t offset, uint64_t data, unsigned size) "offset 0x%"
314
avr_power_read(uint8_t value) "power_reduc read value:%u"
315
avr_power_write(uint8_t value) "power_reduc write value:%u"
316
317
+# axp209.c
318
+axp209_rx(uint8_t reg, uint8_t data) "Read reg 0x%" PRIx8 " : 0x%" PRIx8
319
+axp209_select(uint8_t reg) "Accessing reg 0x%" PRIx8
320
+axp209_tx(uint8_t reg, uint8_t data) "Write reg 0x%" PRIx8 " : 0x%" PRIx8
321
+
322
# eccmemctl.c
323
ecc_mem_writel_mer(uint32_t val) "Write memory enable 0x%08x"
324
ecc_mem_writel_mdr(uint32_t val) "Write memory delay 0x%08x"
152
--
325
--
153
2.20.1
326
2.34.1
154
155
diff view generated by jsdifflib
New patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
2
3
SPL Boot for Cubieboard expects AXP209 connected to I2C0 bus.
4
5
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
6
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Message-id: 20221226220303.14420-6-strahinja.p.jankovic@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/cubieboard.c | 6 ++++++
12
hw/arm/Kconfig | 1 +
13
2 files changed, 7 insertions(+)
14
15
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/cubieboard.c
18
+++ b/hw/arm/cubieboard.c
19
@@ -XXX,XX +XXX,XX @@
20
#include "hw/boards.h"
21
#include "hw/qdev-properties.h"
22
#include "hw/arm/allwinner-a10.h"
23
+#include "hw/i2c/i2c.h"
24
25
static struct arm_boot_info cubieboard_binfo = {
26
.loader_start = AW_A10_SDRAM_BASE,
27
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
28
BlockBackend *blk;
29
BusState *bus;
30
DeviceState *carddev;
31
+ I2CBus *i2c;
32
33
/* BIOS is not supported by this board */
34
if (machine->firmware) {
35
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
36
exit(1);
37
}
38
39
+ /* Connect AXP 209 */
40
+ i2c = I2C_BUS(qdev_get_child_bus(DEVICE(&a10->i2c0), "i2c"));
41
+ i2c_slave_create_simple(i2c, "axp209_pmu", 0x34);
42
+
43
/* Retrieve SD bus */
44
di = drive_get(IF_SD, 0, 0);
45
blk = di ? blk_by_legacy_dinfo(di) : NULL;
46
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/Kconfig
49
+++ b/hw/arm/Kconfig
50
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_A10
51
select ALLWINNER_A10_DRAMC
52
select ALLWINNER_EMAC
53
select ALLWINNER_I2C
54
+ select AXP209_PMU
55
select SERIAL
56
select UNIMP
57
58
--
59
2.34.1
60
61
diff view generated by jsdifflib
New patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
2
3
This patch enables copying of SPL from MMC if `-kernel` parameter is not
4
passed when starting QEMU. SPL is copied to SRAM_A.
5
6
The approach is reused from Allwinner H3 implementation.
7
8
Tested with Armbian and custom Yocto image.
9
10
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
11
12
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
13
Message-id: 20221226220303.14420-7-strahinja.p.jankovic@gmail.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
include/hw/arm/allwinner-a10.h | 21 +++++++++++++++++++++
17
hw/arm/allwinner-a10.c | 18 ++++++++++++++++++
18
hw/arm/cubieboard.c | 5 +++++
19
3 files changed, 44 insertions(+)
20
21
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
22
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/arm/allwinner-a10.h
24
+++ b/include/hw/arm/allwinner-a10.h
25
@@ -XXX,XX +XXX,XX @@
26
#include "hw/misc/allwinner-a10-ccm.h"
27
#include "hw/misc/allwinner-a10-dramc.h"
28
#include "hw/i2c/allwinner-i2c.h"
29
+#include "sysemu/block-backend.h"
30
31
#include "target/arm/cpu.h"
32
#include "qom/object.h"
33
@@ -XXX,XX +XXX,XX @@ struct AwA10State {
34
OHCISysBusState ohci[AW_A10_NUM_USB];
35
};
36
37
+/**
38
+ * Emulate Boot ROM firmware setup functionality.
39
+ *
40
+ * A real Allwinner A10 SoC contains a Boot ROM
41
+ * which is the first code that runs right after
42
+ * the SoC is powered on. The Boot ROM is responsible
43
+ * for loading user code (e.g. a bootloader) from any
44
+ * of the supported external devices and writing the
45
+ * downloaded code to internal SRAM. After loading the SoC
46
+ * begins executing the code written to SRAM.
47
+ *
48
+ * This function emulates the Boot ROM by copying 32 KiB
49
+ * of data at offset 8 KiB from the given block device and writes it to
50
+ * the start of the first internal SRAM memory.
51
+ *
52
+ * @s: Allwinner A10 state object pointer
53
+ * @blk: Block backend device object pointer
54
+ */
55
+void allwinner_a10_bootrom_setup(AwA10State *s, BlockBackend *blk);
56
+
57
#endif
58
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/hw/arm/allwinner-a10.c
61
+++ b/hw/arm/allwinner-a10.c
62
@@ -XXX,XX +XXX,XX @@
63
#include "sysemu/sysemu.h"
64
#include "hw/boards.h"
65
#include "hw/usb/hcd-ohci.h"
66
+#include "hw/loader.h"
67
68
+#define AW_A10_SRAM_A_BASE 0x00000000
69
#define AW_A10_DRAMC_BASE 0x01c01000
70
#define AW_A10_MMC0_BASE 0x01c0f000
71
#define AW_A10_CCM_BASE 0x01c20000
72
@@ -XXX,XX +XXX,XX @@
73
#define AW_A10_RTC_BASE 0x01c20d00
74
#define AW_A10_I2C0_BASE 0x01c2ac00
75
76
+void allwinner_a10_bootrom_setup(AwA10State *s, BlockBackend *blk)
77
+{
78
+ const int64_t rom_size = 32 * KiB;
79
+ g_autofree uint8_t *buffer = g_new0(uint8_t, rom_size);
80
+
81
+ if (blk_pread(blk, 8 * KiB, rom_size, buffer, 0) < 0) {
82
+ error_setg(&error_fatal, "%s: failed to read BlockBackend data",
83
+ __func__);
84
+ return;
85
+ }
86
+
87
+ rom_add_blob("allwinner-a10.bootrom", buffer, rom_size,
88
+ rom_size, AW_A10_SRAM_A_BASE,
89
+ NULL, NULL, NULL, NULL, false);
90
+}
91
+
92
static void aw_a10_init(Object *obj)
93
{
94
AwA10State *s = AW_A10(obj);
95
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
96
index XXXXXXX..XXXXXXX 100644
97
--- a/hw/arm/cubieboard.c
98
+++ b/hw/arm/cubieboard.c
99
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
100
memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
101
machine->ram);
102
103
+ /* Load target kernel or start using BootROM */
104
+ if (!machine->kernel_filename && blk && blk_is_available(blk)) {
105
+ /* Use Boot ROM to copy data from SD card to SRAM */
106
+ allwinner_a10_bootrom_setup(a10, blk);
107
+ }
108
/* TODO create and connect IDE devices for ide_drive_get() */
109
110
cubieboard_binfo.ram_size = machine->ram_size;
111
--
112
2.34.1
diff view generated by jsdifflib
New patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
2
3
Cubieboard now can boot directly from SD card, without the need to pass
4
`-kernel` parameter. Update Avocado tests to cover this functionality.
5
6
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
7
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
9
Message-id: 20221226220303.14420-8-strahinja.p.jankovic@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
tests/avocado/boot_linux_console.py | 47 +++++++++++++++++++++++++++++
13
1 file changed, 47 insertions(+)
14
15
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/avocado/boot_linux_console.py
18
+++ b/tests/avocado/boot_linux_console.py
19
@@ -XXX,XX +XXX,XX @@ def test_arm_cubieboard_sata(self):
20
'sda')
21
# cubieboard's reboot is not functioning; omit reboot test.
22
23
+ @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
24
+ def test_arm_cubieboard_openwrt_22_03_2(self):
25
+ """
26
+ :avocado: tags=arch:arm
27
+ :avocado: tags=machine:cubieboard
28
+ :avocado: tags=device:sd
29
+ """
30
+
31
+ # This test download a 7.5 MiB compressed image and expand it
32
+ # to 126 MiB.
33
+ image_url = ('https://downloads.openwrt.org/releases/22.03.2/targets/'
34
+ 'sunxi/cortexa8/openwrt-22.03.2-sunxi-cortexa8-'
35
+ 'cubietech_a10-cubieboard-ext4-sdcard.img.gz')
36
+ image_hash = ('94b5ecbfbc0b3b56276e5146b899eafa'
37
+ '2ac5dc2d08733d6705af9f144f39f554')
38
+ image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash,
39
+ algorithm='sha256')
40
+ image_path = archive.extract(image_path_gz, self.workdir)
41
+ image_pow2ceil_expand(image_path)
42
+
43
+ self.vm.set_console()
44
+ self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw',
45
+ '-nic', 'user',
46
+ '-no-reboot')
47
+ self.vm.launch()
48
+
49
+ kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
50
+ 'usbcore.nousb '
51
+ 'noreboot')
52
+
53
+ self.wait_for_console_pattern('U-Boot SPL')
54
+
55
+ interrupt_interactive_console_until_pattern(
56
+ self, 'Hit any key to stop autoboot:', '=>')
57
+ exec_command_and_wait_for_pattern(self, "setenv extraargs '" +
58
+ kernel_command_line + "'", '=>')
59
+ exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...');
60
+
61
+ self.wait_for_console_pattern(
62
+ 'Please press Enter to activate this console.')
63
+
64
+ exec_command_and_wait_for_pattern(self, ' ', 'root@')
65
+
66
+ exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
67
+ 'Allwinner sun4i/sun5i')
68
+ # cubieboard's reboot is not functioning; omit reboot test.
69
+
70
@skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
71
def test_arm_quanta_gsj(self):
72
"""
73
--
74
2.34.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Don't dereference CPUTLBEntryFull until we verify that
4
the page is valid. Move the other user-only info field
5
updates after the valid check to match.
6
7
Cc: qemu-stable@nongnu.org
8
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1412
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Message-id: 20230104190056.305143-1-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
target/arm/sve_helper.c | 14 +++++++++-----
15
1 file changed, 9 insertions(+), 5 deletions(-)
16
17
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/sve_helper.c
20
+++ b/target/arm/sve_helper.c
21
@@ -XXX,XX +XXX,XX @@ bool sve_probe_page(SVEHostPage *info, bool nofault, CPUARMState *env,
22
#ifdef CONFIG_USER_ONLY
23
flags = probe_access_flags(env, addr, access_type, mmu_idx, nofault,
24
&info->host, retaddr);
25
- memset(&info->attrs, 0, sizeof(info->attrs));
26
- /* Require both ANON and MTE; see allocation_tag_mem(). */
27
- info->tagged = (flags & PAGE_ANON) && (flags & PAGE_MTE);
28
#else
29
CPUTLBEntryFull *full;
30
flags = probe_access_full(env, addr, access_type, mmu_idx, nofault,
31
&info->host, &full, retaddr);
32
- info->attrs = full->attrs;
33
- info->tagged = full->pte_attrs == 0xf0;
34
#endif
35
info->flags = flags;
36
37
@@ -XXX,XX +XXX,XX @@ bool sve_probe_page(SVEHostPage *info, bool nofault, CPUARMState *env,
38
return false;
39
}
40
41
+#ifdef CONFIG_USER_ONLY
42
+ memset(&info->attrs, 0, sizeof(info->attrs));
43
+ /* Require both ANON and MTE; see allocation_tag_mem(). */
44
+ info->tagged = (flags & PAGE_ANON) && (flags & PAGE_MTE);
45
+#else
46
+ info->attrs = full->attrs;
47
+ info->tagged = full->pte_attrs == 0xf0;
48
+#endif
49
+
50
/* Ensure that info->host[] is relative to addr, not addr + mem_off. */
51
info->host -= mem_off;
52
return true;
53
--
54
2.34.1
55
56
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
2
3
Since pxa255_init() must map the device in the system memory,
4
there is no point in passing get_system_memory() by argument.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20230109115316.2235-2-philmd@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/arm/pxa.h | 2 +-
12
hw/arm/gumstix.c | 3 +--
13
hw/arm/pxa2xx.c | 4 +++-
14
hw/arm/tosa.c | 2 +-
15
4 files changed, 6 insertions(+), 5 deletions(-)
16
17
diff --git a/include/hw/arm/pxa.h b/include/hw/arm/pxa.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/pxa.h
20
+++ b/include/hw/arm/pxa.h
21
@@ -XXX,XX +XXX,XX @@ struct PXA2xxI2SState {
22
23
PXA2xxState *pxa270_init(MemoryRegion *address_space, unsigned int sdram_size,
24
const char *revision);
25
-PXA2xxState *pxa255_init(MemoryRegion *address_space, unsigned int sdram_size);
26
+PXA2xxState *pxa255_init(unsigned int sdram_size);
27
28
#endif /* PXA_H */
29
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/arm/gumstix.c
32
+++ b/hw/arm/gumstix.c
33
@@ -XXX,XX +XXX,XX @@ static void connex_init(MachineState *machine)
34
{
35
PXA2xxState *cpu;
36
DriveInfo *dinfo;
37
- MemoryRegion *address_space_mem = get_system_memory();
38
39
uint32_t connex_rom = 0x01000000;
40
uint32_t connex_ram = 0x04000000;
41
42
- cpu = pxa255_init(address_space_mem, connex_ram);
43
+ cpu = pxa255_init(connex_ram);
44
45
dinfo = drive_get(IF_PFLASH, 0, 0);
46
if (!dinfo && !qtest_enabled()) {
47
diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/arm/pxa2xx.c
50
+++ b/hw/arm/pxa2xx.c
51
@@ -XXX,XX +XXX,XX @@
52
#include "qemu/error-report.h"
53
#include "qemu/module.h"
54
#include "qapi/error.h"
55
+#include "exec/address-spaces.h"
56
#include "cpu.h"
57
#include "hw/sysbus.h"
58
#include "migration/vmstate.h"
59
@@ -XXX,XX +XXX,XX @@ PXA2xxState *pxa270_init(MemoryRegion *address_space,
60
}
61
62
/* Initialise a PXA255 integrated chip (ARM based core). */
63
-PXA2xxState *pxa255_init(MemoryRegion *address_space, unsigned int sdram_size)
64
+PXA2xxState *pxa255_init(unsigned int sdram_size)
65
{
66
+ MemoryRegion *address_space = get_system_memory();
67
PXA2xxState *s;
68
int i;
69
DriveInfo *dinfo;
70
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
71
index XXXXXXX..XXXXXXX 100644
72
--- a/hw/arm/tosa.c
73
+++ b/hw/arm/tosa.c
74
@@ -XXX,XX +XXX,XX @@ static void tosa_init(MachineState *machine)
75
TC6393xbState *tmio;
76
DeviceState *scp0, *scp1;
77
78
- mpu = pxa255_init(address_space_mem, tosa_binfo.ram_size);
79
+ mpu = pxa255_init(tosa_binfo.ram_size);
80
81
memory_region_init_rom(rom, NULL, "tosa.rom", TOSA_ROM, &error_fatal);
82
memory_region_add_subregion(address_space_mem, 0, rom);
83
--
84
2.34.1
85
86
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
2
3
Since pxa270_init() must map the device in the system memory,
4
there is no point in passing get_system_memory() by argument.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20230109115316.2235-3-philmd@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/arm/pxa.h | 3 +--
12
hw/arm/gumstix.c | 3 +--
13
hw/arm/mainstone.c | 10 ++++------
14
hw/arm/pxa2xx.c | 4 ++--
15
hw/arm/spitz.c | 6 ++----
16
hw/arm/z2.c | 3 +--
17
6 files changed, 11 insertions(+), 18 deletions(-)
18
19
diff --git a/include/hw/arm/pxa.h b/include/hw/arm/pxa.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/arm/pxa.h
22
+++ b/include/hw/arm/pxa.h
23
@@ -XXX,XX +XXX,XX @@ struct PXA2xxI2SState {
24
25
# define PA_FMT            "0x%08lx"
26
27
-PXA2xxState *pxa270_init(MemoryRegion *address_space, unsigned int sdram_size,
28
- const char *revision);
29
+PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision);
30
PXA2xxState *pxa255_init(unsigned int sdram_size);
31
32
#endif /* PXA_H */
33
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/gumstix.c
36
+++ b/hw/arm/gumstix.c
37
@@ -XXX,XX +XXX,XX @@ static void verdex_init(MachineState *machine)
38
{
39
PXA2xxState *cpu;
40
DriveInfo *dinfo;
41
- MemoryRegion *address_space_mem = get_system_memory();
42
43
uint32_t verdex_rom = 0x02000000;
44
uint32_t verdex_ram = 0x10000000;
45
46
- cpu = pxa270_init(address_space_mem, verdex_ram, machine->cpu_type);
47
+ cpu = pxa270_init(verdex_ram, machine->cpu_type);
48
49
dinfo = drive_get(IF_PFLASH, 0, 0);
50
if (!dinfo && !qtest_enabled()) {
51
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/hw/arm/mainstone.c
54
+++ b/hw/arm/mainstone.c
55
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info mainstone_binfo = {
56
.ram_size = 0x04000000,
57
};
58
59
-static void mainstone_common_init(MemoryRegion *address_space_mem,
60
- MachineState *machine,
61
+static void mainstone_common_init(MachineState *machine,
62
enum mainstone_model_e model, int arm_id)
63
{
64
uint32_t sector_len = 256 * 1024;
65
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MemoryRegion *address_space_mem,
66
MemoryRegion *rom = g_new(MemoryRegion, 1);
67
68
/* Setup CPU & memory */
69
- mpu = pxa270_init(address_space_mem, mainstone_binfo.ram_size,
70
- machine->cpu_type);
71
+ mpu = pxa270_init(mainstone_binfo.ram_size, machine->cpu_type);
72
memory_region_init_rom(rom, NULL, "mainstone.rom", MAINSTONE_ROM,
73
&error_fatal);
74
- memory_region_add_subregion(address_space_mem, 0, rom);
75
+ memory_region_add_subregion(get_system_memory(), 0x00000000, rom);
76
77
/* There are two 32MiB flash devices on the board */
78
for (i = 0; i < 2; i ++) {
79
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MemoryRegion *address_space_mem,
80
81
static void mainstone_init(MachineState *machine)
82
{
83
- mainstone_common_init(get_system_memory(), machine, mainstone, 0x196);
84
+ mainstone_common_init(machine, mainstone, 0x196);
85
}
86
87
static void mainstone2_machine_init(MachineClass *mc)
88
diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
89
index XXXXXXX..XXXXXXX 100644
90
--- a/hw/arm/pxa2xx.c
91
+++ b/hw/arm/pxa2xx.c
92
@@ -XXX,XX +XXX,XX @@ static void pxa2xx_reset(void *opaque, int line, int level)
93
}
94
95
/* Initialise a PXA270 integrated chip (ARM based core). */
96
-PXA2xxState *pxa270_init(MemoryRegion *address_space,
97
- unsigned int sdram_size, const char *cpu_type)
98
+PXA2xxState *pxa270_init(unsigned int sdram_size, const char *cpu_type)
99
{
100
+ MemoryRegion *address_space = get_system_memory();
101
PXA2xxState *s;
102
int i;
103
DriveInfo *dinfo;
104
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
105
index XXXXXXX..XXXXXXX 100644
106
--- a/hw/arm/spitz.c
107
+++ b/hw/arm/spitz.c
108
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
109
SpitzMachineState *sms = SPITZ_MACHINE(machine);
110
enum spitz_model_e model = smc->model;
111
PXA2xxState *mpu;
112
- MemoryRegion *address_space_mem = get_system_memory();
113
MemoryRegion *rom = g_new(MemoryRegion, 1);
114
115
/* Setup CPU & memory */
116
- mpu = pxa270_init(address_space_mem, spitz_binfo.ram_size,
117
- machine->cpu_type);
118
+ mpu = pxa270_init(spitz_binfo.ram_size, machine->cpu_type);
119
sms->mpu = mpu;
120
121
sl_flash_register(mpu, (model == spitz) ? FLASH_128M : FLASH_1024M);
122
123
memory_region_init_rom(rom, NULL, "spitz.rom", SPITZ_ROM, &error_fatal);
124
- memory_region_add_subregion(address_space_mem, 0, rom);
125
+ memory_region_add_subregion(get_system_memory(), 0, rom);
126
127
/* Setup peripherals */
128
spitz_keyboard_register(mpu);
129
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
130
index XXXXXXX..XXXXXXX 100644
131
--- a/hw/arm/z2.c
132
+++ b/hw/arm/z2.c
133
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aer915_info = {
134
135
static void z2_init(MachineState *machine)
136
{
137
- MemoryRegion *address_space_mem = get_system_memory();
138
uint32_t sector_len = 0x10000;
139
PXA2xxState *mpu;
140
DriveInfo *dinfo;
141
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
142
DeviceState *wm;
143
144
/* Setup CPU & memory */
145
- mpu = pxa270_init(address_space_mem, z2_binfo.ram_size, machine->cpu_type);
146
+ mpu = pxa270_init(z2_binfo.ram_size, machine->cpu_type);
147
148
dinfo = drive_get(IF_PFLASH, 0, 0);
149
if (!pflash_cfi01_register(Z2_FLASH_BASE, "z2.flash0", Z2_FLASH_SIZE,
150
--
151
2.34.1
152
153
diff view generated by jsdifflib
1
The guest can use the semihosting API to open a handle
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
corresponding to QEMU's own stdin, stdout, or stderr.
3
When the guest closes this handle, we should not
4
close the underlying host stdin/stdout/stderr
5
the way we would do if the handle corresponded to
6
a host fd we'd opened on behalf of the guest in SYS_OPEN.
7
2
3
IEC binary prefixes ease code review: the unit is explicit.
4
5
Add definitions for RAM / Flash / Flash blocksize.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109115316.2235-4-philmd@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20200124172954.28481-1-peter.maydell@linaro.org
12
---
11
---
13
target/arm/arm-semi.c | 9 +++++++++
12
hw/arm/collie.c | 16 ++++++++++------
14
1 file changed, 9 insertions(+)
13
1 file changed, 10 insertions(+), 6 deletions(-)
15
14
16
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
15
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/arm-semi.c
17
--- a/hw/arm/collie.c
19
+++ b/target/arm/arm-semi.c
18
+++ b/hw/arm/collie.c
20
@@ -XXX,XX +XXX,XX @@ static uint32_t host_closefn(ARMCPU *cpu, GuestFD *gf)
19
@@ -XXX,XX +XXX,XX @@
21
{
20
#include "cpu.h"
22
CPUARMState *env = &cpu->env;
21
#include "qom/object.h"
23
22
24
+ /*
23
+#define RAM_SIZE (512 * MiB)
25
+ * Only close the underlying host fd if it's one we opened on behalf
24
+#define FLASH_SIZE (32 * MiB)
26
+ * of the guest in SYS_OPEN.
25
+#define FLASH_SECTOR_SIZE (64 * KiB)
27
+ */
26
+
28
+ if (gf->hostfd == STDIN_FILENO ||
27
struct CollieMachineState {
29
+ gf->hostfd == STDOUT_FILENO ||
28
MachineState parent;
30
+ gf->hostfd == STDERR_FILENO) {
29
31
+ return 0;
30
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(CollieMachineState, COLLIE_MACHINE)
32
+ }
31
33
return set_swi_errno(env, close(gf->hostfd));
32
static struct arm_boot_info collie_binfo = {
33
.loader_start = SA_SDCS0,
34
- .ram_size = 0x20000000,
35
+ .ram_size = RAM_SIZE,
36
};
37
38
static void collie_init(MachineState *machine)
39
@@ -XXX,XX +XXX,XX @@ static void collie_init(MachineState *machine)
40
memory_region_add_subregion(get_system_memory(), SA_SDCS0, machine->ram);
41
42
dinfo = drive_get(IF_PFLASH, 0, 0);
43
- pflash_cfi01_register(SA_CS0, "collie.fl1", 0x02000000,
44
+ pflash_cfi01_register(SA_CS0, "collie.fl1", FLASH_SIZE,
45
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
46
- 64 * KiB, 4, 0x00, 0x00, 0x00, 0x00, 0);
47
+ FLASH_SECTOR_SIZE, 4, 0x00, 0x00, 0x00, 0x00, 0);
48
49
dinfo = drive_get(IF_PFLASH, 0, 1);
50
- pflash_cfi01_register(SA_CS1, "collie.fl2", 0x02000000,
51
+ pflash_cfi01_register(SA_CS1, "collie.fl2", FLASH_SIZE,
52
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
53
- 64 * KiB, 4, 0x00, 0x00, 0x00, 0x00, 0);
54
+ FLASH_SECTOR_SIZE, 4, 0x00, 0x00, 0x00, 0x00, 0);
55
56
sysbus_create_simple("scoop", 0x40800000, NULL);
57
58
@@ -XXX,XX +XXX,XX @@ static void collie_machine_class_init(ObjectClass *oc, void *data)
59
mc->init = collie_init;
60
mc->ignore_memory_transaction_failures = true;
61
mc->default_cpu_type = ARM_CPU_TYPE_NAME("sa1110");
62
- mc->default_ram_size = 0x20000000;
63
+ mc->default_ram_size = RAM_SIZE;
64
mc->default_ram_id = "strongarm.sdram";
34
}
65
}
35
66
36
--
67
--
37
2.20.1
68
2.34.1
38
69
39
70
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Add the missing GENERIC_TIMER feature to kvm64 cpus.
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
5
We don't currently use these registers when KVM is enabled, but it's
6
probably best we add the feature flag for consistency and potential
7
future use. There's also precedent, as we add the PMU feature flag to
8
KVM enabled guests, even though we don't use those registers either.
9
10
This change was originally posted as a hunk of a different, never
11
merged patch from Bijan Mottahedeh.
12
13
Signed-off-by: Andrew Jones <drjones@redhat.com>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20200120101023.16030-4-drjones@redhat.com
5
Message-id: 20230109115316.2235-5-philmd@linaro.org
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
7
---
18
target/arm/kvm64.c | 1 +
8
hw/arm/collie.c | 17 +++++++----------
19
1 file changed, 1 insertion(+)
9
1 file changed, 7 insertions(+), 10 deletions(-)
20
10
21
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
11
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
22
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/kvm64.c
13
--- a/hw/arm/collie.c
24
+++ b/target/arm/kvm64.c
14
+++ b/hw/arm/collie.c
25
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
15
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info collie_binfo = {
26
set_feature(&features, ARM_FEATURE_NEON);
16
27
set_feature(&features, ARM_FEATURE_AARCH64);
17
static void collie_init(MachineState *machine)
28
set_feature(&features, ARM_FEATURE_PMU);
18
{
29
+ set_feature(&features, ARM_FEATURE_GENERIC_TIMER);
19
- DriveInfo *dinfo;
30
20
MachineClass *mc = MACHINE_GET_CLASS(machine);
31
ahcf->features = features;
21
CollieMachineState *cms = COLLIE_MACHINE(machine);
22
23
@@ -XXX,XX +XXX,XX @@ static void collie_init(MachineState *machine)
24
25
memory_region_add_subregion(get_system_memory(), SA_SDCS0, machine->ram);
26
27
- dinfo = drive_get(IF_PFLASH, 0, 0);
28
- pflash_cfi01_register(SA_CS0, "collie.fl1", FLASH_SIZE,
29
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
30
- FLASH_SECTOR_SIZE, 4, 0x00, 0x00, 0x00, 0x00, 0);
31
-
32
- dinfo = drive_get(IF_PFLASH, 0, 1);
33
- pflash_cfi01_register(SA_CS1, "collie.fl2", FLASH_SIZE,
34
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
35
- FLASH_SECTOR_SIZE, 4, 0x00, 0x00, 0x00, 0x00, 0);
36
+ for (unsigned i = 0; i < 2; i++) {
37
+ DriveInfo *dinfo = drive_get(IF_PFLASH, 0, i);
38
+ pflash_cfi01_register(i ? SA_CS1 : SA_CS0,
39
+ i ? "collie.fl2" : "collie.fl1", FLASH_SIZE,
40
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
41
+ FLASH_SECTOR_SIZE, 4, 0x00, 0x00, 0x00, 0x00, 0);
42
+ }
43
44
sysbus_create_simple("scoop", 0x40800000, NULL);
32
45
33
--
46
--
34
2.20.1
47
2.34.1
35
48
36
49
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
Add a comment describing the Connex uses a Numonyx RC28F128J3F75
4
flash, and the Verdex uses a Micron RC28F256P30TFA.
5
6
Correct the Verdex machine description (we model the 'Pro' board).
7
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20230109115316.2235-6-philmd@linaro.org
11
Message-Id: <20200223231044.8003-3-philmd@redhat.com>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/gumstix.c | 6 ++++--
15
1 file changed, 4 insertions(+), 2 deletions(-)
16
17
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/gumstix.c
20
+++ b/hw/arm/gumstix.c
21
@@ -XXX,XX +XXX,XX @@
22
* Contributions after 2012-01-13 are licensed under the terms of the
23
* GNU GPL, version 2 or (at your option) any later version.
24
*/
25
-
26
+
27
/*
28
* Example usage:
29
*
30
@@ -XXX,XX +XXX,XX @@ static void connex_init(MachineState *machine)
31
exit(1);
32
}
33
34
+ /* Numonyx RC28F128J3F75 */
35
if (!pflash_cfi01_register(0x00000000, "connext.rom", connex_rom,
36
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
37
sector_len, 2, 0, 0, 0, 0, 0)) {
38
@@ -XXX,XX +XXX,XX @@ static void verdex_init(MachineState *machine)
39
exit(1);
40
}
41
42
+ /* Micron RC28F256P30TFA */
43
if (!pflash_cfi01_register(0x00000000, "verdex.rom", verdex_rom,
44
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
45
sector_len, 2, 0, 0, 0, 0, 0)) {
46
@@ -XXX,XX +XXX,XX @@ static void verdex_class_init(ObjectClass *oc, void *data)
47
{
48
MachineClass *mc = MACHINE_CLASS(oc);
49
50
- mc->desc = "Gumstix Verdex (PXA270)";
51
+ mc->desc = "Gumstix Verdex Pro XL6P COMs (PXA270)";
52
mc->init = verdex_init;
53
mc->ignore_memory_transaction_failures = true;
54
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
55
--
56
2.34.1
57
58
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Since we enabled parallel TCG code generation for softmmu (see
3
IEC binary prefixes ease code review: the unit is explicit.
4
commit 3468b59 "tcg: enable multiple TCG contexts in softmmu")
5
and its subsequent fix (commit 72649619 "add .min_cpus and
6
.default_cpus fields to machine_class"), the raspi machines are
7
restricted to always use their 4 cores:
8
4
9
See in hw/arm/raspi2 (with BCM283X_NCPUS set to 4):
5
Add definitions for RAM / Flash / Flash blocksize.
10
6
11
222 static void raspi2_machine_init(MachineClass *mc)
12
223 {
13
224 mc->desc = "Raspberry Pi 2";
14
230 mc->max_cpus = BCM283X_NCPUS;
15
231 mc->min_cpus = BCM283X_NCPUS;
16
232 mc->default_cpus = BCM283X_NCPUS;
17
235 };
18
236 DEFINE_MACHINE("raspi2", raspi2_machine_init)
19
20
We can no longer use the -smp option, as we get:
21
22
$ qemu-system-arm -M raspi2 -smp 1
23
qemu-system-arm: Invalid SMP CPUs 1. The min CPUs supported by machine 'raspi2' is 4
24
25
Since we can not set the TYPE_BCM283x SOC "enabled-cpus" with -smp,
26
remove the unuseful code.
27
28
We can achieve the same by using the '-global bcm2836.enabled-cpus=1'
29
option.
30
31
Reported-by: Laurent Bonnans <laurent.bonnans@here.com>
32
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
33
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
34
Message-id: 20200120235159.18510-2-f4bug@amsat.org
9
Message-id: 20230109115316.2235-7-philmd@linaro.org
10
Message-Id: <20200223231044.8003-3-philmd@redhat.com>
35
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
36
---
12
---
37
hw/arm/raspi.c | 2 --
13
hw/arm/gumstix.c | 27 ++++++++++++++-------------
38
1 file changed, 2 deletions(-)
14
1 file changed, 14 insertions(+), 13 deletions(-)
39
15
40
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
16
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
41
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/arm/raspi.c
18
--- a/hw/arm/gumstix.c
43
+++ b/hw/arm/raspi.c
19
+++ b/hw/arm/gumstix.c
44
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
20
@@ -XXX,XX +XXX,XX @@
45
/* Setup the SOC */
21
*/
46
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
22
47
&error_abort);
23
#include "qemu/osdep.h"
48
- object_property_set_int(OBJECT(&s->soc), machine->smp.cpus, "enabled-cpus",
24
+#include "qemu/units.h"
49
- &error_abort);
25
#include "qemu/error-report.h"
50
int board_rev = version == 3 ? 0xa02082 : 0xa21041;
26
#include "hw/arm/pxa.h"
51
object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
27
#include "net/net.h"
52
&error_abort);
28
@@ -XXX,XX +XXX,XX @@
29
#include "sysemu/qtest.h"
30
#include "cpu.h"
31
32
-static const int sector_len = 128 * 1024;
33
+#define CONNEX_FLASH_SIZE (16 * MiB)
34
+#define CONNEX_RAM_SIZE (64 * MiB)
35
+
36
+#define VERDEX_FLASH_SIZE (32 * MiB)
37
+#define VERDEX_RAM_SIZE (256 * MiB)
38
+
39
+#define FLASH_SECTOR_SIZE (128 * KiB)
40
41
static void connex_init(MachineState *machine)
42
{
43
PXA2xxState *cpu;
44
DriveInfo *dinfo;
45
46
- uint32_t connex_rom = 0x01000000;
47
- uint32_t connex_ram = 0x04000000;
48
-
49
- cpu = pxa255_init(connex_ram);
50
+ cpu = pxa255_init(CONNEX_RAM_SIZE);
51
52
dinfo = drive_get(IF_PFLASH, 0, 0);
53
if (!dinfo && !qtest_enabled()) {
54
@@ -XXX,XX +XXX,XX @@ static void connex_init(MachineState *machine)
55
}
56
57
/* Numonyx RC28F128J3F75 */
58
- if (!pflash_cfi01_register(0x00000000, "connext.rom", connex_rom,
59
+ if (!pflash_cfi01_register(0x00000000, "connext.rom", CONNEX_FLASH_SIZE,
60
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
61
- sector_len, 2, 0, 0, 0, 0, 0)) {
62
+ FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0)) {
63
error_report("Error registering flash memory");
64
exit(1);
65
}
66
@@ -XXX,XX +XXX,XX @@ static void verdex_init(MachineState *machine)
67
PXA2xxState *cpu;
68
DriveInfo *dinfo;
69
70
- uint32_t verdex_rom = 0x02000000;
71
- uint32_t verdex_ram = 0x10000000;
72
-
73
- cpu = pxa270_init(verdex_ram, machine->cpu_type);
74
+ cpu = pxa270_init(VERDEX_RAM_SIZE, machine->cpu_type);
75
76
dinfo = drive_get(IF_PFLASH, 0, 0);
77
if (!dinfo && !qtest_enabled()) {
78
@@ -XXX,XX +XXX,XX @@ static void verdex_init(MachineState *machine)
79
}
80
81
/* Micron RC28F256P30TFA */
82
- if (!pflash_cfi01_register(0x00000000, "verdex.rom", verdex_rom,
83
+ if (!pflash_cfi01_register(0x00000000, "verdex.rom", VERDEX_FLASH_SIZE,
84
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
85
- sector_len, 2, 0, 0, 0, 0, 0)) {
86
+ FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0)) {
87
error_report("Error registering flash memory");
88
exit(1);
89
}
53
--
90
--
54
2.20.1
91
2.34.1
55
92
56
93
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
If we know what the default value should be then we can test for
3
IEC binary prefixes ease code review: the unit is explicit.
4
that as well as the feature existence.
5
4
6
Signed-off-by: Andrew Jones <drjones@redhat.com>
5
Add the FLASH_SECTOR_SIZE definition.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200120101023.16030-5-drjones@redhat.com
9
Message-id: 20230109115316.2235-8-philmd@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
tests/qtest/arm-cpu-features.c | 37 +++++++++++++++++++++++++---------
12
hw/arm/mainstone.c | 18 ++++++++++--------
12
1 file changed, 28 insertions(+), 9 deletions(-)
13
1 file changed, 10 insertions(+), 8 deletions(-)
13
14
14
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
15
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/tests/qtest/arm-cpu-features.c
17
--- a/hw/arm/mainstone.c
17
+++ b/tests/qtest/arm-cpu-features.c
18
+++ b/hw/arm/mainstone.c
18
@@ -XXX,XX +XXX,XX @@ static bool resp_get_feature(QDict *resp, const char *feature)
19
@@ -XXX,XX +XXX,XX @@
19
qobject_unref(_resp); \
20
* GNU GPL, version 2 or (at your option) any later version.
20
})
21
*/
21
22
#include "qemu/osdep.h"
22
+#define assert_feature(qts, cpu_type, feature, expected_value) \
23
+#include "qemu/units.h"
23
+({ \
24
#include "qemu/error-report.h"
24
+ QDict *_resp, *_props; \
25
#include "qapi/error.h"
25
+ \
26
#include "hw/arm/pxa.h"
26
+ _resp = do_query_no_props(qts, cpu_type); \
27
@@ -XXX,XX +XXX,XX @@ static const struct keymap map[0xE0] = {
27
+ g_assert(_resp); \
28
28
+ g_assert(resp_has_props(_resp)); \
29
enum mainstone_model_e { mainstone };
29
+ _props = resp_get_props(_resp); \
30
30
+ g_assert(qdict_get(_props, feature)); \
31
-#define MAINSTONE_RAM    0x04000000
31
+ g_assert(qdict_get_bool(_props, feature) == (expected_value)); \
32
-#define MAINSTONE_ROM    0x00800000
32
+ qobject_unref(_resp); \
33
-#define MAINSTONE_FLASH    0x02000000
33
+})
34
+#define MAINSTONE_RAM_SIZE (64 * MiB)
35
+#define MAINSTONE_ROM_SIZE (8 * MiB)
36
+#define MAINSTONE_FLASH_SIZE (32 * MiB)
37
38
static struct arm_boot_info mainstone_binfo = {
39
.loader_start = PXA2XX_SDRAM_BASE,
40
- .ram_size = 0x04000000,
41
+ .ram_size = MAINSTONE_RAM_SIZE,
42
};
43
44
+#define FLASH_SECTOR_SIZE (256 * KiB)
34
+
45
+
35
+#define assert_has_feature_enabled(qts, cpu_type, feature) \
46
static void mainstone_common_init(MachineState *machine,
36
+ assert_feature(qts, cpu_type, feature, true)
47
enum mainstone_model_e model, int arm_id)
37
+
38
+#define assert_has_feature_disabled(qts, cpu_type, feature) \
39
+ assert_feature(qts, cpu_type, feature, false)
40
+
41
static void assert_type_full(QTestState *qts)
42
{
48
{
43
const char *error;
49
- uint32_t sector_len = 256 * 1024;
44
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion(const void *data)
50
hwaddr mainstone_flash_base[] = { MST_FLASH_0, MST_FLASH_1 };
45
assert_error(qts, "host", "The CPU type 'host' requires KVM", NULL);
51
PXA2xxState *mpu;
46
52
DeviceState *mst_irq;
47
/* Test expected feature presence/absence for some cpu types */
53
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MachineState *machine,
48
- assert_has_feature(qts, "max", "pmu");
54
49
- assert_has_feature(qts, "cortex-a15", "pmu");
55
/* Setup CPU & memory */
50
+ assert_has_feature_enabled(qts, "max", "pmu");
56
mpu = pxa270_init(mainstone_binfo.ram_size, machine->cpu_type);
51
+ assert_has_feature_enabled(qts, "cortex-a15", "pmu");
57
- memory_region_init_rom(rom, NULL, "mainstone.rom", MAINSTONE_ROM,
52
assert_has_not_feature(qts, "cortex-a15", "aarch64");
58
+ memory_region_init_rom(rom, NULL, "mainstone.rom", MAINSTONE_ROM_SIZE,
53
59
&error_fatal);
54
if (g_str_equal(qtest_get_arch(), "aarch64")) {
60
memory_region_add_subregion(get_system_memory(), 0x00000000, rom);
55
- assert_has_feature(qts, "max", "aarch64");
61
56
- assert_has_feature(qts, "max", "sve");
62
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MachineState *machine,
57
- assert_has_feature(qts, "max", "sve128");
63
dinfo = drive_get(IF_PFLASH, 0, i);
58
- assert_has_feature(qts, "cortex-a57", "pmu");
64
if (!pflash_cfi01_register(mainstone_flash_base[i],
59
- assert_has_feature(qts, "cortex-a57", "aarch64");
65
i ? "mainstone.flash1" : "mainstone.flash0",
60
+ assert_has_feature_enabled(qts, "max", "aarch64");
66
- MAINSTONE_FLASH,
61
+ assert_has_feature_enabled(qts, "max", "sve");
67
+ MAINSTONE_FLASH_SIZE,
62
+ assert_has_feature_enabled(qts, "max", "sve128");
68
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
63
+ assert_has_feature_enabled(qts, "cortex-a57", "pmu");
69
- sector_len, 4, 0, 0, 0, 0, 0)) {
64
+ assert_has_feature_enabled(qts, "cortex-a57", "aarch64");
70
+ FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
65
71
error_report("Error registering flash memory");
66
sve_tests_default(qts, "max");
72
exit(1);
67
73
}
68
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion_kvm(const void *data)
69
QDict *resp;
70
char *error;
71
72
- assert_has_feature(qts, "host", "aarch64");
73
- assert_has_feature(qts, "host", "pmu");
74
+ assert_has_feature_enabled(qts, "host", "aarch64");
75
+ assert_has_feature_enabled(qts, "host", "pmu");
76
77
assert_error(qts, "cortex-a15",
78
"We cannot guarantee the CPU type 'cortex-a15' works "
79
--
74
--
80
2.20.1
75
2.34.1
81
76
82
77
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Andrew Jones <drjones@redhat.com>
3
IEC binary prefixes ease code review: the unit is explicit.
4
Message-id: 20200120101023.16030-3-drjones@redhat.com
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Add the FLASH_SECTOR_SIZE definition.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109115316.2235-9-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
hw/arm/virt.c | 1 +
12
hw/arm/musicpal.c | 9 ++++++---
9
1 file changed, 1 insertion(+)
13
1 file changed, 6 insertions(+), 3 deletions(-)
10
14
11
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
15
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/virt.c
17
--- a/hw/arm/musicpal.c
14
+++ b/hw/arm/virt.c
18
+++ b/hw/arm/musicpal.c
15
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 0)
19
@@ -XXX,XX +XXX,XX @@
16
20
*/
17
static void virt_machine_4_2_options(MachineClass *mc)
21
18
{
22
#include "qemu/osdep.h"
19
+ virt_machine_5_0_options(mc);
23
+#include "qemu/units.h"
20
compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
24
#include "qapi/error.h"
21
}
25
#include "cpu.h"
22
DEFINE_VIRT_MACHINE(4, 2)
26
#include "hw/sysbus.h"
27
@@ -XXX,XX +XXX,XX @@ static const TypeInfo musicpal_key_info = {
28
.class_init = musicpal_key_class_init,
29
};
30
31
+#define FLASH_SECTOR_SIZE (64 * KiB)
32
+
33
static struct arm_boot_info musicpal_binfo = {
34
.loader_start = 0x0,
35
.board_id = 0x20e,
36
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
37
BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
38
39
flash_size = blk_getlength(blk);
40
- if (flash_size != 8*1024*1024 && flash_size != 16*1024*1024 &&
41
- flash_size != 32*1024*1024) {
42
+ if (flash_size != 8 * MiB && flash_size != 16 * MiB &&
43
+ flash_size != 32 * MiB) {
44
error_report("Invalid flash image size");
45
exit(1);
46
}
47
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
48
*/
49
pflash_cfi02_register(0x100000000ULL - MP_FLASH_SIZE_MAX,
50
"musicpal.flash", flash_size,
51
- blk, 0x10000,
52
+ blk, FLASH_SECTOR_SIZE,
53
MP_FLASH_SIZE_MAX / flash_size,
54
2, 0x00BF, 0x236D, 0x0000, 0x0000,
55
0x5555, 0x2AAA, 0);
23
--
56
--
24
2.20.1
57
2.34.1
25
58
26
59
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Andrew Jones <drjones@redhat.com>
3
The total_ram_v1/total_ram_v2 definitions were never used.
4
Message-id: 20200120101023.16030-2-drjones@redhat.com
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20230109115316.2235-10-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
9
---
8
target/arm/kvm_arm.h | 46 ++++++++++++++++++++++++++------------------
10
hw/arm/omap_sx1.c | 2 --
9
1 file changed, 27 insertions(+), 19 deletions(-)
11
1 file changed, 2 deletions(-)
10
12
11
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
13
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/kvm_arm.h
15
--- a/hw/arm/omap_sx1.c
14
+++ b/target/arm/kvm_arm.h
16
+++ b/hw/arm/omap_sx1.c
15
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps static_ops = {
16
int kvm_arm_vcpu_init(CPUState *cs);
18
#define flash0_size    (16 * 1024 * 1024)
17
19
#define flash1_size    ( 8 * 1024 * 1024)
18
/**
20
#define flash2_size    (32 * 1024 * 1024)
19
- * kvm_arm_vcpu_finalize
21
-#define total_ram_v1    (sdram_size + flash0_size + flash1_size + OMAP15XX_SRAM_SIZE)
20
+ * kvm_arm_vcpu_finalize:
22
-#define total_ram_v2    (sdram_size + flash2_size + OMAP15XX_SRAM_SIZE)
21
* @cs: CPUState
23
22
- * @feature: int
24
static struct arm_boot_info sx1_binfo = {
23
+ * @feature: feature to finalize
25
.loader_start = OMAP_EMIFF_BASE,
24
*
25
* Finalizes the configuration of the specified VCPU feature by
26
* invoking the KVM_ARM_VCPU_FINALIZE ioctl. Features requiring
27
@@ -XXX,XX +XXX,XX @@ void kvm_arm_register_device(MemoryRegion *mr, uint64_t devid, uint64_t group,
28
int kvm_arm_init_cpreg_list(ARMCPU *cpu);
29
30
/**
31
- * kvm_arm_reg_syncs_via_cpreg_list
32
- * regidx: KVM register index
33
+ * kvm_arm_reg_syncs_via_cpreg_list:
34
+ * @regidx: KVM register index
35
*
36
* Return true if this KVM register should be synchronized via the
37
* cpreg list of arbitrary system registers, false if it is synchronized
38
@@ -XXX,XX +XXX,XX @@ int kvm_arm_init_cpreg_list(ARMCPU *cpu);
39
bool kvm_arm_reg_syncs_via_cpreg_list(uint64_t regidx);
40
41
/**
42
- * kvm_arm_cpreg_level
43
- * regidx: KVM register index
44
+ * kvm_arm_cpreg_level:
45
+ * @regidx: KVM register index
46
*
47
* Return the level of this coprocessor/system register. Return value is
48
* either KVM_PUT_RUNTIME_STATE, KVM_PUT_RESET_STATE, or KVM_PUT_FULL_STATE.
49
@@ -XXX,XX +XXX,XX @@ void kvm_arm_init_serror_injection(CPUState *cs);
50
* @cpu: ARMCPU
51
*
52
* Get VCPU related state from kvm.
53
+ *
54
+ * Returns: 0 if success else < 0 error code
55
*/
56
int kvm_get_vcpu_events(ARMCPU *cpu);
57
58
@@ -XXX,XX +XXX,XX @@ int kvm_get_vcpu_events(ARMCPU *cpu);
59
* @cpu: ARMCPU
60
*
61
* Put VCPU related state to kvm.
62
+ *
63
+ * Returns: 0 if success else < 0 error code
64
*/
65
int kvm_put_vcpu_events(ARMCPU *cpu);
66
67
@@ -XXX,XX +XXX,XX @@ typedef struct ARMHostCPUFeatures {
68
69
/**
70
* kvm_arm_get_host_cpu_features:
71
- * @ahcc: ARMHostCPUClass to fill in
72
+ * @ahcf: ARMHostCPUClass to fill in
73
*
74
* Probe the capabilities of the host kernel's preferred CPU and fill
75
* in the ARMHostCPUClass struct accordingly.
76
+ *
77
+ * Returns true on success and false otherwise.
78
*/
79
bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf);
80
81
@@ -XXX,XX +XXX,XX @@ void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu);
82
bool kvm_arm_aarch32_supported(CPUState *cs);
83
84
/**
85
- * bool kvm_arm_pmu_supported:
86
+ * kvm_arm_pmu_supported:
87
* @cs: CPUState
88
*
89
* Returns: true if the KVM VCPU can enable its PMU
90
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_aarch32_supported(CPUState *cs);
91
bool kvm_arm_pmu_supported(CPUState *cs);
92
93
/**
94
- * bool kvm_arm_sve_supported:
95
+ * kvm_arm_sve_supported:
96
* @cs: CPUState
97
*
98
* Returns true if the KVM VCPU can enable SVE and false otherwise.
99
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_pmu_supported(CPUState *cs);
100
bool kvm_arm_sve_supported(CPUState *cs);
101
102
/**
103
- * kvm_arm_get_max_vm_ipa_size - Returns the number of bits in the
104
- * IPA address space supported by KVM
105
- *
106
+ * kvm_arm_get_max_vm_ipa_size:
107
* @ms: Machine state handle
108
+ *
109
+ * Returns the number of bits in the IPA address space supported by KVM
110
*/
111
int kvm_arm_get_max_vm_ipa_size(MachineState *ms);
112
113
/**
114
- * kvm_arm_sync_mpstate_to_kvm
115
+ * kvm_arm_sync_mpstate_to_kvm:
116
* @cpu: ARMCPU
117
*
118
* If supported set the KVM MP_STATE based on QEMU's model.
119
+ *
120
+ * Returns 0 on success and -1 on failure.
121
*/
122
int kvm_arm_sync_mpstate_to_kvm(ARMCPU *cpu);
123
124
/**
125
- * kvm_arm_sync_mpstate_to_qemu
126
+ * kvm_arm_sync_mpstate_to_qemu:
127
* @cpu: ARMCPU
128
*
129
* If supported get the MP_STATE from KVM and store in QEMU's model.
130
+ *
131
+ * Returns 0 on success and aborts on failure.
132
*/
133
int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu);
134
135
@@ -XXX,XX +XXX,XX @@ int kvm_arm_set_irq(int cpu, int irqtype, int irq, int level);
136
137
static inline void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
138
{
139
- /* This should never actually be called in the "not KVM" case,
140
+ /*
141
+ * This should never actually be called in the "not KVM" case,
142
* but set up the fields to indicate an error anyway.
143
*/
144
cpu->kvm_target = QEMU_KVM_ARM_TARGET_NONE;
145
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit);
146
*
147
* Return: TRUE if any hardware breakpoints in use.
148
*/
149
-
150
bool kvm_arm_hw_debug_active(CPUState *cs);
151
152
/**
153
* kvm_arm_copy_hw_debug_data:
154
- *
155
* @ptr: kvm_guest_debug_arch structure
156
*
157
* Copy the architecture specific debug registers into the
158
* kvm_guest_debug ioctl structure.
159
*/
160
struct kvm_guest_debug_arch;
161
-
162
void kvm_arm_copy_hw_debug_data(struct kvm_guest_debug_arch *ptr);
163
164
/**
165
- * its_class_name
166
+ * its_class_name:
167
*
168
* Return the ITS class name to use depending on whether KVM acceleration
169
* and KVM CAP_SIGNAL_MSI are supported
170
--
26
--
171
2.20.1
27
2.34.1
172
28
173
29
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The overhead for the OpenBMC firmware images using the a custom U-Boot
3
IEC binary prefixes ease code review: the unit is explicit.
4
is around 2 seconds, which is fine, but with a U-Boot from mainline,
5
it takes an extra 50 seconds or so to reach Linux. A quick survey on
6
the number of reads performed on the flash memory region gives the
7
following figures :
8
4
9
OpenBMC U-Boot 922478 (~ 3.5 MBytes)
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Mainline U-Boot 20569977 (~ 80 MBytes)
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
7
Message-id: 20230109115316.2235-11-philmd@linaro.org
12
QEMU must be trashing the TCG TBs and reloading text very often. Some
13
addresses are read more than 250.000 times. Until we find a solution
14
to improve boot time, execution from MMIO is not activated by default.
15
16
Setting this option also breaks migration compatibility.
17
18
Signed-off-by: Cédric Le Goater <clg@kaod.org>
19
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
21
Message-id: 20200114103433.30534-5-clg@kaod.org
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
---
9
---
24
include/hw/arm/aspeed.h | 2 ++
10
hw/arm/omap_sx1.c | 33 +++++++++++++++++----------------
25
hw/arm/aspeed.c | 44 ++++++++++++++++++++++++++++++++++++-----
11
1 file changed, 17 insertions(+), 16 deletions(-)
26
2 files changed, 41 insertions(+), 5 deletions(-)
27
12
28
diff --git a/include/hw/arm/aspeed.h b/include/hw/arm/aspeed.h
13
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
29
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
30
--- a/include/hw/arm/aspeed.h
15
--- a/hw/arm/omap_sx1.c
31
+++ b/include/hw/arm/aspeed.h
16
+++ b/hw/arm/omap_sx1.c
32
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedBoardState AspeedBoardState;
17
@@ -XXX,XX +XXX,XX @@
33
18
* with this program; if not, see <http://www.gnu.org/licenses/>.
34
typedef struct AspeedMachine {
19
*/
35
MachineState parent_obj;
20
#include "qemu/osdep.h"
36
+
21
+#include "qemu/units.h"
37
+ bool mmio_exec;
22
#include "qapi/error.h"
38
} AspeedMachine;
23
#include "ui/console.h"
39
24
#include "hw/arm/omap.h"
40
#define ASPEED_MACHINE_CLASS(klass) \
25
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps static_ops = {
41
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
26
.endianness = DEVICE_NATIVE_ENDIAN,
42
index XXXXXXX..XXXXXXX 100644
27
};
43
--- a/hw/arm/aspeed.c
28
44
+++ b/hw/arm/aspeed.c
29
-#define sdram_size    0x02000000
45
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
30
-#define sector_size    (128 * 1024)
46
* SoC and 128MB for the AST2500 SoC, which is twice as big as
31
-#define flash0_size    (16 * 1024 * 1024)
47
* needed by the flash modules of the Aspeed machines.
32
-#define flash1_size    ( 8 * 1024 * 1024)
48
*/
33
-#define flash2_size    (32 * 1024 * 1024)
49
- memory_region_init_rom(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
34
+#define SDRAM_SIZE (32 * MiB)
50
- fl->size, &error_abort);
35
+#define SECTOR_SIZE (128 * KiB)
51
- memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
36
+#define FLASH0_SIZE (16 * MiB)
52
- boot_rom);
37
+#define FLASH1_SIZE (8 * MiB)
53
- write_boot_rom(drive0, FIRMWARE_ADDR, fl->size, &error_abort);
38
+#define FLASH2_SIZE (32 * MiB)
54
+ if (ASPEED_MACHINE(machine)->mmio_exec) {
39
55
+ memory_region_init_alias(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
40
static struct arm_boot_info sx1_binfo = {
56
+ &fl->mmio, 0, fl->size);
41
.loader_start = OMAP_EMIFF_BASE,
57
+ memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
42
- .ram_size = sdram_size,
58
+ boot_rom);
43
+ .ram_size = SDRAM_SIZE,
59
+ } else {
44
.board_id = 0x265,
60
+ memory_region_init_rom(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
45
};
61
+ fl->size, &error_abort);
46
62
+ memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
47
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
63
+ boot_rom);
48
static uint32_t cs3val = 0x00001139;
64
+ write_boot_rom(drive0, FIRMWARE_ADDR, fl->size, &error_abort);
49
DriveInfo *dinfo;
65
+ }
50
int fl_idx;
51
- uint32_t flash_size = flash0_size;
52
+ uint32_t flash_size = FLASH0_SIZE;
53
54
if (machine->ram_size != mc->default_ram_size) {
55
char *sz = size_to_str(mc->default_ram_size);
56
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
66
}
57
}
67
58
68
aspeed_board_binfo.ram_size = ram_size;
59
if (version == 2) {
69
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
60
- flash_size = flash2_size;
70
/* Bus 11: TODO ucd90160@64 */
61
+ flash_size = FLASH2_SIZE;
62
}
63
64
memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, machine->ram);
65
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
66
if (!pflash_cfi01_register(OMAP_CS0_BASE,
67
"omap_sx1.flash0-1", flash_size,
68
blk_by_legacy_dinfo(dinfo),
69
- sector_size, 4, 0, 0, 0, 0, 0)) {
70
+ SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
71
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
72
fl_idx);
73
}
74
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
75
(dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
76
MemoryRegion *flash_1 = g_new(MemoryRegion, 1);
77
memory_region_init_rom(flash_1, NULL, "omap_sx1.flash1-0",
78
- flash1_size, &error_fatal);
79
+ FLASH1_SIZE, &error_fatal);
80
memory_region_add_subregion(address_space, OMAP_CS1_BASE, flash_1);
81
82
memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val,
83
- "sx1.cs1", OMAP_CS1_SIZE - flash1_size);
84
+ "sx1.cs1", OMAP_CS1_SIZE - FLASH1_SIZE);
85
memory_region_add_subregion(address_space,
86
- OMAP_CS1_BASE + flash1_size, &cs[1]);
87
+ OMAP_CS1_BASE + FLASH1_SIZE, &cs[1]);
88
89
if (!pflash_cfi01_register(OMAP_CS1_BASE,
90
- "omap_sx1.flash1-1", flash1_size,
91
+ "omap_sx1.flash1-1", FLASH1_SIZE,
92
blk_by_legacy_dinfo(dinfo),
93
- sector_size, 4, 0, 0, 0, 0, 0)) {
94
+ SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
95
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
96
fl_idx);
97
}
98
@@ -XXX,XX +XXX,XX @@ static void sx1_machine_v2_class_init(ObjectClass *oc, void *data)
99
mc->init = sx1_init_v2;
100
mc->ignore_memory_transaction_failures = true;
101
mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
102
- mc->default_ram_size = sdram_size;
103
+ mc->default_ram_size = SDRAM_SIZE;
104
mc->default_ram_id = "omap1.dram";
71
}
105
}
72
106
73
+static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
107
@@ -XXX,XX +XXX,XX @@ static void sx1_machine_v1_class_init(ObjectClass *oc, void *data)
74
+{
108
mc->init = sx1_init_v1;
75
+ return ASPEED_MACHINE(obj)->mmio_exec;
109
mc->ignore_memory_transaction_failures = true;
76
+}
110
mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
77
+
111
- mc->default_ram_size = sdram_size;
78
+static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
112
+ mc->default_ram_size = SDRAM_SIZE;
79
+{
113
mc->default_ram_id = "omap1.dram";
80
+ ASPEED_MACHINE(obj)->mmio_exec = value;
81
+}
82
+
83
+static void aspeed_machine_instance_init(Object *obj)
84
+{
85
+ ASPEED_MACHINE(obj)->mmio_exec = false;
86
+}
87
+
88
+static void aspeed_machine_class_props_init(ObjectClass *oc)
89
+{
90
+ object_class_property_add_bool(oc, "execute-in-place",
91
+ aspeed_get_mmio_exec,
92
+ aspeed_set_mmio_exec, &error_abort);
93
+ object_class_property_set_description(oc, "execute-in-place",
94
+ "boot directly from CE0 flash device", &error_abort);
95
+}
96
+
97
static void aspeed_machine_class_init(ObjectClass *oc, void *data)
98
{
99
MachineClass *mc = MACHINE_CLASS(oc);
100
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
101
mc->no_floppy = 1;
102
mc->no_cdrom = 1;
103
mc->no_parallel = 1;
104
+
105
+ aspeed_machine_class_props_init(oc);
106
}
114
}
107
115
108
static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
109
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_machine_types[] = {
110
.name = TYPE_ASPEED_MACHINE,
111
.parent = TYPE_MACHINE,
112
.instance_size = sizeof(AspeedMachine),
113
+ .instance_init = aspeed_machine_instance_init,
114
.class_size = sizeof(AspeedMachineClass),
115
.class_init = aspeed_machine_class_init,
116
.abstract = true,
117
--
116
--
118
2.20.1
117
2.34.1
119
118
120
119
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
This commit make use of the resettable API to reset the device being
3
IEC binary prefixes ease code review: the unit is explicit.
4
hotplugged when it is realized. Also it ensures it is put in a reset
5
state coherent with the parent it is plugged into.
6
4
7
Note that there is a difference in the reset. Instead of resetting
5
Add the FLASH_SECTOR_SIZE definition.
8
only the hotplugged device, we reset also its subtree (switch to
9
resettable API). This is not expected to be a problem because
10
sub-buses are just realized too. If a hotplugged device has any
11
sub-buses it is logical to reset them too at this point.
12
6
13
The recently added should_be_hidden and PCI's partially_hotplugged
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
14
mechanisms do not interfere with realize operation:
15
+ In the should_be_hidden use case, device creation is
16
delayed.
17
+ The partially_hotplugged mechanism prevents a device to be
18
unplugged and unrealized from qdev POV and unrealized.
19
20
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
21
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
22
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20230109115316.2235-12-philmd@linaro.org
23
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
24
Message-id: 20200123132823.1117486-8-damien.hedde@greensocs.com
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
---
11
---
27
include/hw/resettable.h | 11 +++++++++++
12
hw/arm/z2.c | 6 ++++--
28
hw/core/qdev.c | 15 ++++++++++++++-
13
1 file changed, 4 insertions(+), 2 deletions(-)
29
2 files changed, 25 insertions(+), 1 deletion(-)
30
14
31
diff --git a/include/hw/resettable.h b/include/hw/resettable.h
15
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
32
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
33
--- a/include/hw/resettable.h
17
--- a/hw/arm/z2.c
34
+++ b/include/hw/resettable.h
18
+++ b/hw/arm/z2.c
35
@@ -XXX,XX +XXX,XX @@ struct ResettableState {
19
@@ -XXX,XX +XXX,XX @@
36
bool exit_phase_in_progress;
20
*/
21
22
#include "qemu/osdep.h"
23
+#include "qemu/units.h"
24
#include "hw/arm/pxa.h"
25
#include "hw/arm/boot.h"
26
#include "hw/i2c/i2c.h"
27
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aer915_info = {
28
.class_init = aer915_class_init,
37
};
29
};
38
30
39
+/**
31
+#define FLASH_SECTOR_SIZE (64 * KiB)
40
+ * resettable_state_clear:
41
+ * Clear the state. It puts the state to the initial (zeroed) state required
42
+ * to reuse an object. Typically used in realize step of base classes
43
+ * implementing the interface.
44
+ */
45
+static inline void resettable_state_clear(ResettableState *state)
46
+{
47
+ memset(state, 0, sizeof(ResettableState));
48
+}
49
+
32
+
50
/**
33
static void z2_init(MachineState *machine)
51
* resettable_reset:
34
{
52
* Trigger a reset on an object @obj of type @type. @obj must implement
35
- uint32_t sector_len = 0x10000;
53
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
36
PXA2xxState *mpu;
54
index XXXXXXX..XXXXXXX 100644
37
DriveInfo *dinfo;
55
--- a/hw/core/qdev.c
38
void *z2_lcd;
56
+++ b/hw/core/qdev.c
39
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
57
@@ -XXX,XX +XXX,XX @@ static void device_set_realized(Object *obj, bool value, Error **errp)
40
dinfo = drive_get(IF_PFLASH, 0, 0);
58
}
41
if (!pflash_cfi01_register(Z2_FLASH_BASE, "z2.flash0", Z2_FLASH_SIZE,
59
}
42
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
60
43
- sector_len, 4, 0, 0, 0, 0, 0)) {
61
+ /*
44
+ FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
62
+ * Clear the reset state, in case the object was previously unrealized
45
error_report("Error registering flash memory");
63
+ * with a dirty state.
46
exit(1);
64
+ */
47
}
65
+ resettable_state_clear(&dev->reset);
66
+
67
QLIST_FOREACH(bus, &dev->child_bus, sibling) {
68
object_property_set_bool(OBJECT(bus), true, "realized",
69
&local_err);
70
@@ -XXX,XX +XXX,XX @@ static void device_set_realized(Object *obj, bool value, Error **errp)
71
}
72
}
73
if (dev->hotplugged) {
74
- device_legacy_reset(dev);
75
+ /*
76
+ * Reset the device, as well as its subtree which, at this point,
77
+ * should be realized too.
78
+ */
79
+ resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
80
+ resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
81
+ NULL);
82
+ resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
83
}
84
dev->pending_deleted_event = false;
85
86
--
48
--
87
2.20.1
49
2.34.1
88
50
89
51
diff view generated by jsdifflib
1
From: Zenghui Yu <yuzenghui@huawei.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
If LPIs are disabled, KVM will just ignore the GICR_PENDBASER.PTZ bit when
3
Upon introduction in commit b8433303fb ("Set proper device-width
4
restoring GICR_CTLR. Setting PTZ here makes littlt sense in "reduce GIC
4
for vexpress flash"), ve_pflash_cfi01_register() was calling
5
initialization time".
5
qdev_init_nofail() which can not fail. This call was later
6
converted with a script to use &error_fatal, still unable to
7
fail. Remove the unreachable code.
6
8
7
And what's worse, PTZ is generally programmed by guest to indicate to the
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Redistributor whether the LPI Pending table is zero when enabling LPIs.
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
If migration is triggered when the PTZ has just been cleared by guest (and
11
Message-id: 20230109115316.2235-13-philmd@linaro.org
10
before enabling LPIs), we will see PTZ==1 on the destination side, which
11
is not as expected. Let's just drop this hackish userspace behavior.
12
13
Also take this chance to refine the comment a bit.
14
15
Fixes: 367b9f527bec ("hw/intc/arm_gicv3_kvm: Implement get/put functions")
16
Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
17
Message-id: 20200119133051.642-1-yuzenghui@huawei.com
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
13
---
21
hw/intc/arm_gicv3_kvm.c | 11 ++++-------
14
hw/arm/vexpress.c | 10 +---------
22
1 file changed, 4 insertions(+), 7 deletions(-)
15
1 file changed, 1 insertion(+), 9 deletions(-)
23
16
24
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
17
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
25
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/intc/arm_gicv3_kvm.c
19
--- a/hw/arm/vexpress.c
27
+++ b/hw/intc/arm_gicv3_kvm.c
20
+++ b/hw/arm/vexpress.c
28
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_put(GICv3State *s)
21
@@ -XXX,XX +XXX,XX @@ static void vexpress_common_init(MachineState *machine)
29
kvm_gicd_access(s, GICD_CTLR, &reg, true);
22
dinfo = drive_get(IF_PFLASH, 0, 0);
30
23
pflash0 = ve_pflash_cfi01_register(map[VE_NORFLASH0], "vexpress.flash0",
31
if (redist_typer & GICR_TYPER_PLPIS) {
24
dinfo);
32
- /* Set base addresses before LPIs are enabled by GICR_CTLR write */
25
- if (!pflash0) {
33
+ /*
26
- error_report("vexpress: error registering flash 0");
34
+ * Restore base addresses before LPIs are potentially enabled by
27
- exit(1);
35
+ * GICR_CTLR write
28
- }
36
+ */
29
37
for (ncpu = 0; ncpu < s->num_cpu; ncpu++) {
30
if (map[VE_NORFLASHALIAS] != -1) {
38
GICv3CPUState *c = &s->cpu[ncpu];
31
/* Map flash 0 as an alias into low memory */
39
32
@@ -XXX,XX +XXX,XX @@ static void vexpress_common_init(MachineState *machine)
40
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_put(GICv3State *s)
33
}
41
kvm_gicr_access(s, GICR_PROPBASER + 4, ncpu, &regh, true);
34
42
35
dinfo = drive_get(IF_PFLASH, 0, 1);
43
reg64 = c->gicr_pendbaser;
36
- if (!ve_pflash_cfi01_register(map[VE_NORFLASH1], "vexpress.flash1",
44
- if (!(c->gicr_ctlr & GICR_CTLR_ENABLE_LPIS)) {
37
- dinfo)) {
45
- /* Setting PTZ is advised if LPIs are disabled, to reduce
38
- error_report("vexpress: error registering flash 1");
46
- * GIC initialization time.
39
- exit(1);
47
- */
40
- }
48
- reg64 |= GICR_PENDBASER_PTZ;
41
+ ve_pflash_cfi01_register(map[VE_NORFLASH1], "vexpress.flash1", dinfo);
49
- }
42
50
regl = (uint32_t)reg64;
43
sram_size = 0x2000000;
51
kvm_gicr_access(s, GICR_PENDBASER, ncpu, &regl, true);
44
memory_region_init_ram(sram, NULL, "vexpress.sram", sram_size,
52
regh = (uint32_t)(reg64 >> 32);
53
--
45
--
54
2.20.1
46
2.34.1
55
47
56
48
diff view generated by jsdifflib
1
From: Andrew Jeffery <andrew@aj.id.au>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The AST2600 includes a second cut-down version of the SD/MMC controller
3
Since its QOM'ification in commit 368a354f02 ("pflash_cfi0x:
4
found in the AST2500, named the eMMC controller. It's cut down in the
4
QOMified") the pflash_cfi01_register() function does not fail.
5
sense that it only supports one slot rather than two, but it brings the
6
total number of slots supported by the AST2600 to three.
7
5
8
The existing code assumed that the SD controller always provided two
6
This call was later converted with a script to use &error_fatal,
9
slots. Rework the SDHCI object to expose the number of slots as a
7
still unable to fail. Remove the unreachable code.
10
property to be set by the SoC configuration.
11
8
12
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Message-id: 20230109115316.2235-14-philmd@linaro.org
15
Signed-off-by: Cédric Le Goater <clg@kaod.org>
16
Message-id: 20200114103433.30534-2-clg@kaod.org
17
[PMM: fixed up to use device_class_set_props()]
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
13
---
20
include/hw/sd/aspeed_sdhci.h | 1 +
14
hw/arm/gumstix.c | 18 ++++++------------
21
hw/arm/aspeed.c | 2 +-
15
hw/arm/mainstone.c | 13 +++++--------
22
hw/arm/aspeed_ast2600.c | 2 ++
16
hw/arm/omap_sx1.c | 22 ++++++++--------------
23
hw/arm/aspeed_soc.c | 2 ++
17
hw/arm/versatilepb.c | 6 ++----
24
hw/sd/aspeed_sdhci.c | 11 +++++++++--
18
hw/arm/z2.c | 9 +++------
25
5 files changed, 15 insertions(+), 3 deletions(-)
19
5 files changed, 24 insertions(+), 44 deletions(-)
26
20
27
diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
21
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
28
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
29
--- a/include/hw/sd/aspeed_sdhci.h
23
--- a/hw/arm/gumstix.c
30
+++ b/include/hw/sd/aspeed_sdhci.h
24
+++ b/hw/arm/gumstix.c
31
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSDHCIState {
25
@@ -XXX,XX +XXX,XX @@ static void connex_init(MachineState *machine)
32
SysBusDevice parent;
26
}
33
27
34
SDHCIState slots[ASPEED_SDHCI_NUM_SLOTS];
28
/* Numonyx RC28F128J3F75 */
35
+ uint8_t num_slots;
29
- if (!pflash_cfi01_register(0x00000000, "connext.rom", CONNEX_FLASH_SIZE,
36
30
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
37
MemoryRegion iomem;
31
- FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0)) {
38
qemu_irq irq;
32
- error_report("Error registering flash memory");
39
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
33
- exit(1);
34
- }
35
+ pflash_cfi01_register(0x00000000, "connext.rom", CONNEX_FLASH_SIZE,
36
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
37
+ FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0);
38
39
/* Interrupt line of NIC is connected to GPIO line 36 */
40
smc91c111_init(&nd_table[0], 0x04000300,
41
@@ -XXX,XX +XXX,XX @@ static void verdex_init(MachineState *machine)
42
}
43
44
/* Micron RC28F256P30TFA */
45
- if (!pflash_cfi01_register(0x00000000, "verdex.rom", VERDEX_FLASH_SIZE,
46
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
47
- FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0)) {
48
- error_report("Error registering flash memory");
49
- exit(1);
50
- }
51
+ pflash_cfi01_register(0x00000000, "verdex.rom", VERDEX_FLASH_SIZE,
52
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
53
+ FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0);
54
55
/* Interrupt line of NIC is connected to GPIO line 99 */
56
smc91c111_init(&nd_table[0], 0x04000300,
57
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
40
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
41
--- a/hw/arm/aspeed.c
59
--- a/hw/arm/mainstone.c
42
+++ b/hw/arm/aspeed.c
60
+++ b/hw/arm/mainstone.c
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
61
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MachineState *machine,
44
amc->i2c_init(bmc);
62
/* There are two 32MiB flash devices on the board */
63
for (i = 0; i < 2; i ++) {
64
dinfo = drive_get(IF_PFLASH, 0, i);
65
- if (!pflash_cfi01_register(mainstone_flash_base[i],
66
- i ? "mainstone.flash1" : "mainstone.flash0",
67
- MAINSTONE_FLASH_SIZE,
68
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
69
- FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
70
- error_report("Error registering flash memory");
71
- exit(1);
72
- }
73
+ pflash_cfi01_register(mainstone_flash_base[i],
74
+ i ? "mainstone.flash1" : "mainstone.flash0",
75
+ MAINSTONE_FLASH_SIZE,
76
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
77
+ FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
45
}
78
}
46
79
47
- for (i = 0; i < ARRAY_SIZE(bmc->soc.sdhci.slots); i++) {
80
mst_irq = sysbus_create_simple("mainstone-fpga", MST_FPGA_PHYS,
48
+ for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
81
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
49
SDHCIState *sdhci = &bmc->soc.sdhci.slots[i];
50
DriveInfo *dinfo = drive_get_next(IF_SD);
51
BlockBackend *blk;
52
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
53
index XXXXXXX..XXXXXXX 100644
82
index XXXXXXX..XXXXXXX 100644
54
--- a/hw/arm/aspeed_ast2600.c
83
--- a/hw/arm/omap_sx1.c
55
+++ b/hw/arm/aspeed_ast2600.c
84
+++ b/hw/arm/omap_sx1.c
56
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
85
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
57
sysbus_init_child_obj(obj, "sdc", OBJECT(&s->sdhci), sizeof(s->sdhci),
86
58
TYPE_ASPEED_SDHCI);
87
fl_idx = 0;
59
88
if ((dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
60
+ object_property_set_int(OBJECT(&s->sdhci), 2, "num-slots", &error_abort);
89
- if (!pflash_cfi01_register(OMAP_CS0_BASE,
61
+
90
- "omap_sx1.flash0-1", flash_size,
62
/* Init sd card slot class here so that they're under the correct parent */
91
- blk_by_legacy_dinfo(dinfo),
63
for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
92
- SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
64
sysbus_init_child_obj(obj, "sdhci[*]", OBJECT(&s->sdhci.slots[i]),
93
- fprintf(stderr, "qemu: Error registering flash memory %d.\n",
65
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
94
- fl_idx);
95
- }
96
+ pflash_cfi01_register(OMAP_CS0_BASE,
97
+ "omap_sx1.flash0-1", flash_size,
98
+ blk_by_legacy_dinfo(dinfo),
99
+ SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
100
fl_idx++;
101
}
102
103
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
104
memory_region_add_subregion(address_space,
105
OMAP_CS1_BASE + FLASH1_SIZE, &cs[1]);
106
107
- if (!pflash_cfi01_register(OMAP_CS1_BASE,
108
- "omap_sx1.flash1-1", FLASH1_SIZE,
109
- blk_by_legacy_dinfo(dinfo),
110
- SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
111
- fprintf(stderr, "qemu: Error registering flash memory %d.\n",
112
- fl_idx);
113
- }
114
+ pflash_cfi01_register(OMAP_CS1_BASE,
115
+ "omap_sx1.flash1-1", FLASH1_SIZE,
116
+ blk_by_legacy_dinfo(dinfo),
117
+ SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
118
fl_idx++;
119
} else {
120
memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val,
121
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
66
index XXXXXXX..XXXXXXX 100644
122
index XXXXXXX..XXXXXXX 100644
67
--- a/hw/arm/aspeed_soc.c
123
--- a/hw/arm/versatilepb.c
68
+++ b/hw/arm/aspeed_soc.c
124
+++ b/hw/arm/versatilepb.c
69
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
125
@@ -XXX,XX +XXX,XX @@ static void versatile_init(MachineState *machine, int board_id)
70
sysbus_init_child_obj(obj, "sdc", OBJECT(&s->sdhci), sizeof(s->sdhci),
126
/* 0x34000000 NOR Flash */
71
TYPE_ASPEED_SDHCI);
127
72
128
dinfo = drive_get(IF_PFLASH, 0, 0);
73
+ object_property_set_int(OBJECT(&s->sdhci), 2, "num-slots", &error_abort);
129
- if (!pflash_cfi01_register(VERSATILE_FLASH_ADDR, "versatile.flash",
74
+
130
+ pflash_cfi01_register(VERSATILE_FLASH_ADDR, "versatile.flash",
75
/* Init sd card slot class here so that they're under the correct parent */
131
VERSATILE_FLASH_SIZE,
76
for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
132
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
77
sysbus_init_child_obj(obj, "sdhci[*]", OBJECT(&s->sdhci.slots[i]),
133
VERSATILE_FLASH_SECT_SIZE,
78
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
134
- 4, 0x0089, 0x0018, 0x0000, 0x0, 0)) {
135
- fprintf(stderr, "qemu: Error registering flash memory.\n");
136
- }
137
+ 4, 0x0089, 0x0018, 0x0000, 0x0, 0);
138
139
versatile_binfo.ram_size = machine->ram_size;
140
versatile_binfo.board_id = board_id;
141
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
79
index XXXXXXX..XXXXXXX 100644
142
index XXXXXXX..XXXXXXX 100644
80
--- a/hw/sd/aspeed_sdhci.c
143
--- a/hw/arm/z2.c
81
+++ b/hw/sd/aspeed_sdhci.c
144
+++ b/hw/arm/z2.c
82
@@ -XXX,XX +XXX,XX @@
145
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
83
#include "qapi/error.h"
146
mpu = pxa270_init(z2_binfo.ram_size, machine->cpu_type);
84
#include "hw/irq.h"
147
85
#include "migration/vmstate.h"
148
dinfo = drive_get(IF_PFLASH, 0, 0);
86
+#include "hw/qdev-properties.h"
149
- if (!pflash_cfi01_register(Z2_FLASH_BASE, "z2.flash0", Z2_FLASH_SIZE,
87
150
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
88
#define ASPEED_SDHCI_INFO 0x00
151
- FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
89
#define ASPEED_SDHCI_INFO_RESET 0x00030000
152
- error_report("Error registering flash memory");
90
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
153
- exit(1);
91
154
- }
92
/* Create input irqs for the slots */
155
+ pflash_cfi01_register(Z2_FLASH_BASE, "z2.flash0", Z2_FLASH_SIZE,
93
qdev_init_gpio_in_named_with_opaque(DEVICE(sbd), aspeed_sdhci_set_irq,
156
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
94
- sdhci, NULL, ASPEED_SDHCI_NUM_SLOTS);
157
+ FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
95
+ sdhci, NULL, sdhci->num_slots);
158
96
159
/* setup keypad */
97
sysbus_init_irq(sbd, &sdhci->irq);
160
pxa27x_register_keypad(mpu->kp, map, 0x100);
98
memory_region_init_io(&sdhci->iomem, OBJECT(sdhci), &aspeed_sdhci_ops,
99
sdhci, TYPE_ASPEED_SDHCI, 0x1000);
100
sysbus_init_mmio(sbd, &sdhci->iomem);
101
102
- for (int i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
103
+ for (int i = 0; i < sdhci->num_slots; ++i) {
104
Object *sdhci_slot = OBJECT(&sdhci->slots[i]);
105
SysBusDevice *sbd_slot = SYS_BUS_DEVICE(&sdhci->slots[i]);
106
107
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_sdhci = {
108
},
109
};
110
111
+static Property aspeed_sdhci_properties[] = {
112
+ DEFINE_PROP_UINT8("num-slots", AspeedSDHCIState, num_slots, 0),
113
+ DEFINE_PROP_END_OF_LIST(),
114
+};
115
+
116
static void aspeed_sdhci_class_init(ObjectClass *classp, void *data)
117
{
118
DeviceClass *dc = DEVICE_CLASS(classp);
119
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_class_init(ObjectClass *classp, void *data)
120
dc->realize = aspeed_sdhci_realize;
121
dc->reset = aspeed_sdhci_reset;
122
dc->vmsd = &vmstate_aspeed_sdhci;
123
+ device_class_set_props(dc, aspeed_sdhci_properties);
124
}
125
126
static TypeInfo aspeed_sdhci_info = {
127
--
161
--
128
2.20.1
162
2.34.1
129
163
130
164
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Replace deprecated qdev_reset_all by resettable_cold_reset_fn for
3
To avoid forward-declaring PXA2xxI2CState, declare
4
the ipl registration in the main reset handlers.
4
PXA2XX_I2C before its use in pxa2xx_i2c_init() prototype.
5
5
6
This does not impact the behavior for the following reasons:
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
+ at this point resettable just call the old reset methods of devices
8
and buses in the same order than qdev/qbus.
9
+ resettable handlers registered with qemu_register_reset are
10
serialized; there is no interleaving.
11
+ eventual explicit calls to legacy reset API (device_reset or
12
qdev/qbus_reset) inside this reset handler will not be masked out
13
by resettable mechanism; they do not go through resettable api.
14
15
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
16
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Message-id: 20200123132823.1117486-12-damien.hedde@greensocs.com
8
Message-id: 20230109140306.23161-2-philmd@linaro.org
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
10
---
23
hw/s390x/ipl.c | 10 +++++++++-
11
include/hw/arm/pxa.h | 6 +++---
24
1 file changed, 9 insertions(+), 1 deletion(-)
12
1 file changed, 3 insertions(+), 3 deletions(-)
25
13
26
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
14
diff --git a/include/hw/arm/pxa.h b/include/hw/arm/pxa.h
27
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/s390x/ipl.c
16
--- a/include/hw/arm/pxa.h
29
+++ b/hw/s390x/ipl.c
17
+++ b/include/hw/arm/pxa.h
30
@@ -XXX,XX +XXX,XX @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
18
@@ -XXX,XX +XXX,XX @@ void pxa27x_register_keypad(PXA2xxKeyPadState *kp,
31
*/
19
const struct keymap *map, int size);
32
ipl->compat_start_addr = ipl->start_addr;
20
33
ipl->compat_bios_start_addr = ipl->bios_start_addr;
21
/* pxa2xx.c */
34
- qemu_register_reset(qdev_reset_all_fn, dev);
22
-typedef struct PXA2xxI2CState PXA2xxI2CState;
35
+ /*
23
+#define TYPE_PXA2XX_I2C "pxa2xx_i2c"
36
+ * Because this Device is not on any bus in the qbus tree (it is
24
+OBJECT_DECLARE_SIMPLE_TYPE(PXA2xxI2CState, PXA2XX_I2C)
37
+ * not a sysbus device and it's not on some other bus like a PCI
25
+
38
+ * bus) it will not be automatically reset by the 'reset the
26
PXA2xxI2CState *pxa2xx_i2c_init(hwaddr base,
39
+ * sysbus' hook registered by vl.c like most devices. So we must
27
qemu_irq irq, uint32_t page_size);
40
+ * manually register a reset hook for it.
28
I2CBus *pxa2xx_i2c_bus(PXA2xxI2CState *s);
41
+ * TODO: there should be a better way to do this.
29
42
+ */
30
-#define TYPE_PXA2XX_I2C "pxa2xx_i2c"
43
+ qemu_register_reset(resettable_cold_reset_fn, dev);
31
typedef struct PXA2xxI2SState PXA2xxI2SState;
44
error:
32
-OBJECT_DECLARE_SIMPLE_TYPE(PXA2xxI2CState, PXA2XX_I2C)
45
error_propagate(errp, err);
33
46
}
34
#define TYPE_PXA2XX_FIR "pxa2xx-fir"
35
OBJECT_DECLARE_SIMPLE_TYPE(PXA2xxFIrState, PXA2XX_FIR)
47
--
36
--
48
2.20.1
37
2.34.1
49
38
50
39
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Replace deprecated qbus_reset_all by resettable_cold_reset_fn for
3
Add a local 'struct omap_gpif_s *' variable to improve readability.
4
the sysbus reset registration.
4
(This also eases next commit conversion).
5
5
6
Apart for the raspi machines, this does not impact the behavior
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
because:
8
+ at this point resettable just calls the old reset methods of devices
9
and buses in the same order as qdev/qbus.
10
+ resettable handlers registered with qemu_register_reset are
11
serialized; there is no interleaving.
12
+ eventual explicit calls to legacy reset API (device_reset or
13
qdev/qbus_reset) inside this reset handler will not be masked out
14
by resettable mechanism; they do not go through resettable api.
15
16
For the raspi machines, during the sysbus reset the sd-card is not
17
reset twice anymore but only once. This is a consequence of switching
18
both sysbus reset and changing parent to resettable; it detects the
19
second reset is not needed. This has no impact on the state after
20
reset; the sd-card reset method only reset local state and query
21
information from the block backend.
22
23
The raspi reset change can be observed by using the following command
24
(reset will occurs, then do Ctrl-C to end qemu; no firmware is
25
given here).
26
qemu-system-aarch64 -M raspi3 \
27
-trace resettable_phase_hold_exec \
28
-trace qdev_update_parent_bus \
29
-trace resettable_change_parent \
30
-trace qdev_reset -trace qbus_reset
31
32
Before the patch, the qdev/qbus_reset traces show when reset method are
33
called. After the patch, the resettable_phase_hold_exec show when reset
34
method are called.
35
36
The traced reset order of the raspi3 is listed below. I've added empty
37
lines and the tree structure.
38
39
+->bcm2835-peripherals reset
40
|
41
| +->sd-card reset
42
| +->sd-bus reset
43
+->bcm2835_gpio reset
44
| -> dev_update_parent_bus (move the sd-card on the sdhci-bus)
45
| -> resettable_change_parent
46
|
47
+->bcm2835-dma reset
48
|
49
| +->bcm2835-sdhost-bus reset
50
+->bcm2835-sdhost reset
51
|
52
| +->sd-card (reset ONLY BEFORE BEFORE THE PATCH)
53
| +->sdhci-bus reset
54
+->generic-sdhci reset
55
|
56
+->bcm2835-rng reset
57
+->bcm2835-property reset
58
+->bcm2835-fb reset
59
+->bcm2835-mbox reset
60
+->bcm2835-aux reset
61
+->pl011 reset
62
+->bcm2835-ic reset
63
+->bcm2836-control reset
64
System reset
65
66
In both case, the sd-card is reset (being on bcm2835_gpio/sd-bus) then moved
67
to generic-sdhci/sdhci-bus by the bcm2835_gpio reset method.
68
69
Before the patch, it is then reset again being part of generic-sdhci/sdhci-bus.
70
After the patch, it considered again for reset but its reset method is not
71
called because it is already flagged as reset.
72
73
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
74
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
75
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
76
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20230109140306.23161-3-philmd@linaro.org
77
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
78
Message-id: 20200123132823.1117486-11-damien.hedde@greensocs.com
79
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
80
---
10
---
81
vl.c | 10 +++++++++-
11
hw/gpio/omap_gpio.c | 3 ++-
82
1 file changed, 9 insertions(+), 1 deletion(-)
12
1 file changed, 2 insertions(+), 1 deletion(-)
83
13
84
diff --git a/vl.c b/vl.c
14
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
85
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
86
--- a/vl.c
16
--- a/hw/gpio/omap_gpio.c
87
+++ b/vl.c
17
+++ b/hw/gpio/omap_gpio.c
88
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv, char **envp)
18
@@ -XXX,XX +XXX,XX @@ struct omap_gpif_s {
89
19
/* General-Purpose I/O of OMAP1 */
90
/* TODO: once all bus devices are qdevified, this should be done
20
static void omap_gpio_set(void *opaque, int line, int level)
91
* when bus is created by qdev.c */
21
{
92
- qemu_register_reset(qbus_reset_all_fn, sysbus_get_default());
22
- struct omap_gpio_s *s = &((struct omap_gpif_s *) opaque)->omap1;
93
+ /*
23
+ struct omap_gpif_s *p = opaque;
94
+ * TODO: If we had a main 'reset container' that the whole system
24
+ struct omap_gpio_s *s = &p->omap1;
95
+ * lived in, we could reset that using the multi-phase reset
25
uint16_t prev = s->inputs;
96
+ * APIs. For the moment, we just reset the sysbus, which will cause
26
97
+ * all devices hanging off it (and all their child buses, recursively)
27
if (level)
98
+ * to be reset. Note that this will *not* reset any Device objects
99
+ * which are not attached to some part of the qbus tree!
100
+ */
101
+ qemu_register_reset(resettable_cold_reset_fn, sysbus_get_default());
102
qemu_run_machine_init_done_notifiers();
103
104
if (rom_check_and_register_reset() != 0) {
105
--
28
--
106
2.20.1
29
2.34.1
107
30
108
31
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Provide a temporary device_legacy_reset function doing what
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
device_reset does to prepare for the transition with Resettable
5
API.
6
7
All occurrence of device_reset in the code tree are also replaced
8
by device_legacy_reset.
9
10
The new resettable API has different prototype and semantics
11
(resetting child buses as well as the specified device). Subsequent
12
commits will make the changeover for each call site individually; once
13
that is complete device_legacy_reset() will be removed.
14
15
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Acked-by: David Gibson <david@gibson.dropbear.id.au>
5
Message-id: 20230109140306.23161-4-philmd@linaro.org
19
Acked-by: Cornelia Huck <cohuck@redhat.com>
20
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
21
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
22
Message-id: 20200123132823.1117486-2-damien.hedde@greensocs.com
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
7
---
25
include/hw/qdev-core.h | 4 ++--
8
hw/arm/omap1.c | 115 ++++++++++++++++++--------------------
26
hw/audio/intel-hda.c | 2 +-
9
hw/arm/omap2.c | 40 ++++++-------
27
hw/core/qdev.c | 6 +++---
10
hw/arm/omap_sx1.c | 2 +-
28
hw/hyperv/hyperv.c | 2 +-
11
hw/arm/palm.c | 2 +-
29
hw/i386/microvm.c | 2 +-
12
hw/char/omap_uart.c | 7 +--
30
hw/i386/pc.c | 2 +-
13
hw/display/omap_dss.c | 15 +++--
31
hw/ide/microdrive.c | 8 ++++----
14
hw/display/omap_lcdc.c | 9 ++-
32
hw/intc/spapr_xive.c | 2 +-
15
hw/dma/omap_dma.c | 15 +++--
33
hw/ppc/pnv_psi.c | 4 ++--
16
hw/gpio/omap_gpio.c | 15 +++--
34
hw/ppc/spapr_pci.c | 2 +-
17
hw/intc/omap_intc.c | 12 ++--
35
hw/ppc/spapr_vio.c | 2 +-
18
hw/misc/omap_gpmc.c | 12 ++--
36
hw/s390x/s390-pci-inst.c | 2 +-
19
hw/misc/omap_l4.c | 7 +--
37
hw/scsi/vmw_pvscsi.c | 2 +-
20
hw/misc/omap_sdrc.c | 7 +--
38
hw/sd/omap_mmc.c | 2 +-
21
hw/misc/omap_tap.c | 5 +-
39
hw/sd/pl181.c | 2 +-
22
hw/sd/omap_mmc.c | 9 ++-
40
15 files changed, 22 insertions(+), 22 deletions(-)
23
hw/ssi/omap_spi.c | 7 +--
24
hw/timer/omap_gptimer.c | 22 ++++----
25
hw/timer/omap_synctimer.c | 4 +-
26
18 files changed, 142 insertions(+), 163 deletions(-)
41
27
42
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
28
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
43
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
44
--- a/include/hw/qdev-core.h
30
--- a/hw/arm/omap1.c
45
+++ b/include/hw/qdev-core.h
31
+++ b/hw/arm/omap1.c
46
@@ -XXX,XX +XXX,XX @@ char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev);
32
@@ -XXX,XX +XXX,XX @@ static void omap_timer_fire(void *opaque)
47
void qdev_machine_init(void);
33
48
34
static void omap_timer_tick(void *opaque)
49
/**
35
{
50
- * @device_reset
36
- struct omap_mpu_timer_s *timer = (struct omap_mpu_timer_s *) opaque;
51
+ * device_legacy_reset:
37
+ struct omap_mpu_timer_s *timer = opaque;
52
*
38
53
* Reset a single device (by calling the reset method).
39
omap_timer_sync(timer);
54
*/
40
omap_timer_fire(timer);
55
-void device_reset(DeviceState *dev);
41
@@ -XXX,XX +XXX,XX @@ static void omap_timer_tick(void *opaque)
56
+void device_legacy_reset(DeviceState *dev);
42
57
43
static void omap_timer_clk_update(void *opaque, int line, int on)
58
void device_class_set_props(DeviceClass *dc, Property *props);
44
{
59
45
- struct omap_mpu_timer_s *timer = (struct omap_mpu_timer_s *) opaque;
60
diff --git a/hw/audio/intel-hda.c b/hw/audio/intel-hda.c
46
+ struct omap_mpu_timer_s *timer = opaque;
61
index XXXXXXX..XXXXXXX 100644
47
62
--- a/hw/audio/intel-hda.c
48
omap_timer_sync(timer);
63
+++ b/hw/audio/intel-hda.c
49
timer->rate = on ? omap_clk_getrate(timer->clk) : 0;
64
@@ -XXX,XX +XXX,XX @@ static void intel_hda_reset(DeviceState *dev)
50
@@ -XXX,XX +XXX,XX @@ static void omap_timer_clk_setup(struct omap_mpu_timer_s *timer)
65
QTAILQ_FOREACH(kid, &d->codecs.qbus.children, sibling) {
51
static uint64_t omap_mpu_timer_read(void *opaque, hwaddr addr,
66
DeviceState *qdev = kid->child;
52
unsigned size)
67
cdev = HDA_CODEC_DEVICE(qdev);
53
{
68
- device_reset(DEVICE(cdev));
54
- struct omap_mpu_timer_s *s = (struct omap_mpu_timer_s *) opaque;
69
+ device_legacy_reset(DEVICE(cdev));
55
+ struct omap_mpu_timer_s *s = opaque;
70
d->state_sts |= (1 << cdev->cad);
56
57
if (size != 4) {
58
return omap_badwidth_read32(opaque, addr);
59
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_mpu_timer_read(void *opaque, hwaddr addr,
60
static void omap_mpu_timer_write(void *opaque, hwaddr addr,
61
uint64_t value, unsigned size)
62
{
63
- struct omap_mpu_timer_s *s = (struct omap_mpu_timer_s *) opaque;
64
+ struct omap_mpu_timer_s *s = opaque;
65
66
if (size != 4) {
67
omap_badwidth_write32(opaque, addr, value);
68
@@ -XXX,XX +XXX,XX @@ struct omap_watchdog_timer_s {
69
static uint64_t omap_wd_timer_read(void *opaque, hwaddr addr,
70
unsigned size)
71
{
72
- struct omap_watchdog_timer_s *s = (struct omap_watchdog_timer_s *) opaque;
73
+ struct omap_watchdog_timer_s *s = opaque;
74
75
if (size != 2) {
76
return omap_badwidth_read16(opaque, addr);
77
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_wd_timer_read(void *opaque, hwaddr addr,
78
static void omap_wd_timer_write(void *opaque, hwaddr addr,
79
uint64_t value, unsigned size)
80
{
81
- struct omap_watchdog_timer_s *s = (struct omap_watchdog_timer_s *) opaque;
82
+ struct omap_watchdog_timer_s *s = opaque;
83
84
if (size != 2) {
85
omap_badwidth_write16(opaque, addr, value);
86
@@ -XXX,XX +XXX,XX @@ struct omap_32khz_timer_s {
87
static uint64_t omap_os_timer_read(void *opaque, hwaddr addr,
88
unsigned size)
89
{
90
- struct omap_32khz_timer_s *s = (struct omap_32khz_timer_s *) opaque;
91
+ struct omap_32khz_timer_s *s = opaque;
92
int offset = addr & OMAP_MPUI_REG_MASK;
93
94
if (size != 4) {
95
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_os_timer_read(void *opaque, hwaddr addr,
96
static void omap_os_timer_write(void *opaque, hwaddr addr,
97
uint64_t value, unsigned size)
98
{
99
- struct omap_32khz_timer_s *s = (struct omap_32khz_timer_s *) opaque;
100
+ struct omap_32khz_timer_s *s = opaque;
101
int offset = addr & OMAP_MPUI_REG_MASK;
102
103
if (size != 4) {
104
@@ -XXX,XX +XXX,XX @@ static struct omap_32khz_timer_s *omap_os_timer_init(MemoryRegion *memory,
105
static uint64_t omap_ulpd_pm_read(void *opaque, hwaddr addr,
106
unsigned size)
107
{
108
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
109
+ struct omap_mpu_state_s *s = opaque;
110
uint16_t ret;
111
112
if (size != 2) {
113
@@ -XXX,XX +XXX,XX @@ static inline void omap_ulpd_req_update(struct omap_mpu_state_s *s,
114
static void omap_ulpd_pm_write(void *opaque, hwaddr addr,
115
uint64_t value, unsigned size)
116
{
117
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
118
+ struct omap_mpu_state_s *s = opaque;
119
int64_t now, ticks;
120
int div, mult;
121
static const int bypass_div[4] = { 1, 2, 4, 4 };
122
@@ -XXX,XX +XXX,XX @@ static void omap_ulpd_pm_init(MemoryRegion *system_memory,
123
static uint64_t omap_pin_cfg_read(void *opaque, hwaddr addr,
124
unsigned size)
125
{
126
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
127
+ struct omap_mpu_state_s *s = opaque;
128
129
if (size != 4) {
130
return omap_badwidth_read32(opaque, addr);
131
@@ -XXX,XX +XXX,XX @@ static inline void omap_pin_modconf1_update(struct omap_mpu_state_s *s,
132
static void omap_pin_cfg_write(void *opaque, hwaddr addr,
133
uint64_t value, unsigned size)
134
{
135
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
136
+ struct omap_mpu_state_s *s = opaque;
137
uint32_t diff;
138
139
if (size != 4) {
140
@@ -XXX,XX +XXX,XX @@ static void omap_pin_cfg_init(MemoryRegion *system_memory,
141
static uint64_t omap_id_read(void *opaque, hwaddr addr,
142
unsigned size)
143
{
144
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
145
+ struct omap_mpu_state_s *s = opaque;
146
147
if (size != 4) {
148
return omap_badwidth_read32(opaque, addr);
149
@@ -XXX,XX +XXX,XX @@ static void omap_id_init(MemoryRegion *memory, struct omap_mpu_state_s *mpu)
150
static uint64_t omap_mpui_read(void *opaque, hwaddr addr,
151
unsigned size)
152
{
153
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
154
+ struct omap_mpu_state_s *s = opaque;
155
156
if (size != 4) {
157
return omap_badwidth_read32(opaque, addr);
158
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_mpui_read(void *opaque, hwaddr addr,
159
static void omap_mpui_write(void *opaque, hwaddr addr,
160
uint64_t value, unsigned size)
161
{
162
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
163
+ struct omap_mpu_state_s *s = opaque;
164
165
if (size != 4) {
166
omap_badwidth_write32(opaque, addr, value);
167
@@ -XXX,XX +XXX,XX @@ struct omap_tipb_bridge_s {
168
static uint64_t omap_tipb_bridge_read(void *opaque, hwaddr addr,
169
unsigned size)
170
{
171
- struct omap_tipb_bridge_s *s = (struct omap_tipb_bridge_s *) opaque;
172
+ struct omap_tipb_bridge_s *s = opaque;
173
174
if (size < 2) {
175
return omap_badwidth_read16(opaque, addr);
176
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_tipb_bridge_read(void *opaque, hwaddr addr,
177
static void omap_tipb_bridge_write(void *opaque, hwaddr addr,
178
uint64_t value, unsigned size)
179
{
180
- struct omap_tipb_bridge_s *s = (struct omap_tipb_bridge_s *) opaque;
181
+ struct omap_tipb_bridge_s *s = opaque;
182
183
if (size < 2) {
184
omap_badwidth_write16(opaque, addr, value);
185
@@ -XXX,XX +XXX,XX @@ static struct omap_tipb_bridge_s *omap_tipb_bridge_init(
186
static uint64_t omap_tcmi_read(void *opaque, hwaddr addr,
187
unsigned size)
188
{
189
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
190
+ struct omap_mpu_state_s *s = opaque;
191
uint32_t ret;
192
193
if (size != 4) {
194
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_tcmi_read(void *opaque, hwaddr addr,
195
static void omap_tcmi_write(void *opaque, hwaddr addr,
196
uint64_t value, unsigned size)
197
{
198
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
199
+ struct omap_mpu_state_s *s = opaque;
200
201
if (size != 4) {
202
omap_badwidth_write32(opaque, addr, value);
203
@@ -XXX,XX +XXX,XX @@ struct dpll_ctl_s {
204
static uint64_t omap_dpll_read(void *opaque, hwaddr addr,
205
unsigned size)
206
{
207
- struct dpll_ctl_s *s = (struct dpll_ctl_s *) opaque;
208
+ struct dpll_ctl_s *s = opaque;
209
210
if (size != 2) {
211
return omap_badwidth_read16(opaque, addr);
212
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_dpll_read(void *opaque, hwaddr addr,
213
static void omap_dpll_write(void *opaque, hwaddr addr,
214
uint64_t value, unsigned size)
215
{
216
- struct dpll_ctl_s *s = (struct dpll_ctl_s *) opaque;
217
+ struct dpll_ctl_s *s = opaque;
218
uint16_t diff;
219
static const int bypass_div[4] = { 1, 2, 4, 4 };
220
int div, mult;
221
@@ -XXX,XX +XXX,XX @@ static struct dpll_ctl_s *omap_dpll_init(MemoryRegion *memory,
222
static uint64_t omap_clkm_read(void *opaque, hwaddr addr,
223
unsigned size)
224
{
225
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
226
+ struct omap_mpu_state_s *s = opaque;
227
228
if (size != 2) {
229
return omap_badwidth_read16(opaque, addr);
230
@@ -XXX,XX +XXX,XX @@ static inline void omap_clkm_ckout1_update(struct omap_mpu_state_s *s,
231
static void omap_clkm_write(void *opaque, hwaddr addr,
232
uint64_t value, unsigned size)
233
{
234
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
235
+ struct omap_mpu_state_s *s = opaque;
236
uint16_t diff;
237
omap_clk clk;
238
static const char *clkschemename[8] = {
239
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap_clkm_ops = {
240
static uint64_t omap_clkdsp_read(void *opaque, hwaddr addr,
241
unsigned size)
242
{
243
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
244
+ struct omap_mpu_state_s *s = opaque;
245
CPUState *cpu = CPU(s->cpu);
246
247
if (size != 2) {
248
@@ -XXX,XX +XXX,XX @@ static inline void omap_clkdsp_idlect2_update(struct omap_mpu_state_s *s,
249
static void omap_clkdsp_write(void *opaque, hwaddr addr,
250
uint64_t value, unsigned size)
251
{
252
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
253
+ struct omap_mpu_state_s *s = opaque;
254
uint16_t diff;
255
256
if (size != 2) {
257
@@ -XXX,XX +XXX,XX @@ struct omap_mpuio_s {
258
259
static void omap_mpuio_set(void *opaque, int line, int level)
260
{
261
- struct omap_mpuio_s *s = (struct omap_mpuio_s *) opaque;
262
+ struct omap_mpuio_s *s = opaque;
263
uint16_t prev = s->inputs;
264
265
if (level)
266
@@ -XXX,XX +XXX,XX @@ static void omap_mpuio_kbd_update(struct omap_mpuio_s *s)
267
static uint64_t omap_mpuio_read(void *opaque, hwaddr addr,
268
unsigned size)
269
{
270
- struct omap_mpuio_s *s = (struct omap_mpuio_s *) opaque;
271
+ struct omap_mpuio_s *s = opaque;
272
int offset = addr & OMAP_MPUI_REG_MASK;
273
uint16_t ret;
274
275
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_mpuio_read(void *opaque, hwaddr addr,
276
static void omap_mpuio_write(void *opaque, hwaddr addr,
277
uint64_t value, unsigned size)
278
{
279
- struct omap_mpuio_s *s = (struct omap_mpuio_s *) opaque;
280
+ struct omap_mpuio_s *s = opaque;
281
int offset = addr & OMAP_MPUI_REG_MASK;
282
uint16_t diff;
283
int ln;
284
@@ -XXX,XX +XXX,XX @@ static void omap_mpuio_reset(struct omap_mpuio_s *s)
285
286
static void omap_mpuio_onoff(void *opaque, int line, int on)
287
{
288
- struct omap_mpuio_s *s = (struct omap_mpuio_s *) opaque;
289
+ struct omap_mpuio_s *s = opaque;
290
291
s->clk = on;
292
if (on)
293
@@ -XXX,XX +XXX,XX @@ static void omap_uwire_transfer_start(struct omap_uwire_s *s)
71
}
294
}
72
intel_hda_update_irq(d);
295
}
73
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
296
74
index XXXXXXX..XXXXXXX 100644
297
-static uint64_t omap_uwire_read(void *opaque, hwaddr addr,
75
--- a/hw/core/qdev.c
298
- unsigned size)
76
+++ b/hw/core/qdev.c
299
+static uint64_t omap_uwire_read(void *opaque, hwaddr addr, unsigned size)
77
@@ -XXX,XX +XXX,XX @@ HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
300
{
78
301
- struct omap_uwire_s *s = (struct omap_uwire_s *) opaque;
79
static int qdev_reset_one(DeviceState *dev, void *opaque)
302
+ struct omap_uwire_s *s = opaque;
80
{
303
int offset = addr & OMAP_MPUI_REG_MASK;
81
- device_reset(dev);
304
82
+ device_legacy_reset(dev);
305
if (size != 2) {
83
306
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_uwire_read(void *opaque, hwaddr addr,
307
static void omap_uwire_write(void *opaque, hwaddr addr,
308
uint64_t value, unsigned size)
309
{
310
- struct omap_uwire_s *s = (struct omap_uwire_s *) opaque;
311
+ struct omap_uwire_s *s = opaque;
312
int offset = addr & OMAP_MPUI_REG_MASK;
313
314
if (size != 2) {
315
@@ -XXX,XX +XXX,XX @@ static void omap_pwl_update(struct omap_pwl_s *s)
316
}
317
}
318
319
-static uint64_t omap_pwl_read(void *opaque, hwaddr addr,
320
- unsigned size)
321
+static uint64_t omap_pwl_read(void *opaque, hwaddr addr, unsigned size)
322
{
323
- struct omap_pwl_s *s = (struct omap_pwl_s *) opaque;
324
+ struct omap_pwl_s *s = opaque;
325
int offset = addr & OMAP_MPUI_REG_MASK;
326
327
if (size != 1) {
328
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_pwl_read(void *opaque, hwaddr addr,
329
static void omap_pwl_write(void *opaque, hwaddr addr,
330
uint64_t value, unsigned size)
331
{
332
- struct omap_pwl_s *s = (struct omap_pwl_s *) opaque;
333
+ struct omap_pwl_s *s = opaque;
334
int offset = addr & OMAP_MPUI_REG_MASK;
335
336
if (size != 1) {
337
@@ -XXX,XX +XXX,XX @@ static void omap_pwl_reset(struct omap_pwl_s *s)
338
339
static void omap_pwl_clk_update(void *opaque, int line, int on)
340
{
341
- struct omap_pwl_s *s = (struct omap_pwl_s *) opaque;
342
+ struct omap_pwl_s *s = opaque;
343
344
s->clk = on;
345
omap_pwl_update(s);
346
@@ -XXX,XX +XXX,XX @@ struct omap_pwt_s {
347
omap_clk clk;
348
};
349
350
-static uint64_t omap_pwt_read(void *opaque, hwaddr addr,
351
- unsigned size)
352
+static uint64_t omap_pwt_read(void *opaque, hwaddr addr, unsigned size)
353
{
354
- struct omap_pwt_s *s = (struct omap_pwt_s *) opaque;
355
+ struct omap_pwt_s *s = opaque;
356
int offset = addr & OMAP_MPUI_REG_MASK;
357
358
if (size != 1) {
359
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_pwt_read(void *opaque, hwaddr addr,
360
static void omap_pwt_write(void *opaque, hwaddr addr,
361
uint64_t value, unsigned size)
362
{
363
- struct omap_pwt_s *s = (struct omap_pwt_s *) opaque;
364
+ struct omap_pwt_s *s = opaque;
365
int offset = addr & OMAP_MPUI_REG_MASK;
366
367
if (size != 1) {
368
@@ -XXX,XX +XXX,XX @@ static void omap_rtc_alarm_update(struct omap_rtc_s *s)
369
printf("%s: conversion failed\n", __func__);
370
}
371
372
-static uint64_t omap_rtc_read(void *opaque, hwaddr addr,
373
- unsigned size)
374
+static uint64_t omap_rtc_read(void *opaque, hwaddr addr, unsigned size)
375
{
376
- struct omap_rtc_s *s = (struct omap_rtc_s *) opaque;
377
+ struct omap_rtc_s *s = opaque;
378
int offset = addr & OMAP_MPUI_REG_MASK;
379
uint8_t i;
380
381
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_rtc_read(void *opaque, hwaddr addr,
382
static void omap_rtc_write(void *opaque, hwaddr addr,
383
uint64_t value, unsigned size)
384
{
385
- struct omap_rtc_s *s = (struct omap_rtc_s *) opaque;
386
+ struct omap_rtc_s *s = opaque;
387
int offset = addr & OMAP_MPUI_REG_MASK;
388
struct tm new_tm;
389
time_t ti[2];
390
@@ -XXX,XX +XXX,XX @@ static void omap_mcbsp_rx_newdata(struct omap_mcbsp_s *s)
391
392
static void omap_mcbsp_source_tick(void *opaque)
393
{
394
- struct omap_mcbsp_s *s = (struct omap_mcbsp_s *) opaque;
395
+ struct omap_mcbsp_s *s = opaque;
396
static const int bps[8] = { 0, 1, 1, 2, 2, 2, -255, -255 };
397
398
if (!s->rx_rate)
399
@@ -XXX,XX +XXX,XX @@ static void omap_mcbsp_tx_newdata(struct omap_mcbsp_s *s)
400
401
static void omap_mcbsp_sink_tick(void *opaque)
402
{
403
- struct omap_mcbsp_s *s = (struct omap_mcbsp_s *) opaque;
404
+ struct omap_mcbsp_s *s = opaque;
405
static const int bps[8] = { 0, 1, 1, 2, 2, 2, -255, -255 };
406
407
if (!s->tx_rate)
408
@@ -XXX,XX +XXX,XX @@ static void omap_mcbsp_req_update(struct omap_mcbsp_s *s)
409
static uint64_t omap_mcbsp_read(void *opaque, hwaddr addr,
410
unsigned size)
411
{
412
- struct omap_mcbsp_s *s = (struct omap_mcbsp_s *) opaque;
413
+ struct omap_mcbsp_s *s = opaque;
414
int offset = addr & OMAP_MPUI_REG_MASK;
415
uint16_t ret;
416
417
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_mcbsp_read(void *opaque, hwaddr addr,
418
static void omap_mcbsp_writeh(void *opaque, hwaddr addr,
419
uint32_t value)
420
{
421
- struct omap_mcbsp_s *s = (struct omap_mcbsp_s *) opaque;
422
+ struct omap_mcbsp_s *s = opaque;
423
int offset = addr & OMAP_MPUI_REG_MASK;
424
425
switch (offset) {
426
@@ -XXX,XX +XXX,XX @@ static void omap_mcbsp_writeh(void *opaque, hwaddr addr,
427
static void omap_mcbsp_writew(void *opaque, hwaddr addr,
428
uint32_t value)
429
{
430
- struct omap_mcbsp_s *s = (struct omap_mcbsp_s *) opaque;
431
+ struct omap_mcbsp_s *s = opaque;
432
int offset = addr & OMAP_MPUI_REG_MASK;
433
434
if (offset == 0x04) {                /* DXR */
435
@@ -XXX,XX +XXX,XX @@ static struct omap_mcbsp_s *omap_mcbsp_init(MemoryRegion *system_memory,
436
437
static void omap_mcbsp_i2s_swallow(void *opaque, int line, int level)
438
{
439
- struct omap_mcbsp_s *s = (struct omap_mcbsp_s *) opaque;
440
+ struct omap_mcbsp_s *s = opaque;
441
442
if (s->rx_rate) {
443
s->rx_req = s->codec->in.len;
444
@@ -XXX,XX +XXX,XX @@ static void omap_mcbsp_i2s_swallow(void *opaque, int line, int level)
445
446
static void omap_mcbsp_i2s_start(void *opaque, int line, int level)
447
{
448
- struct omap_mcbsp_s *s = (struct omap_mcbsp_s *) opaque;
449
+ struct omap_mcbsp_s *s = opaque;
450
451
if (s->tx_rate) {
452
s->tx_req = s->codec->out.size;
453
@@ -XXX,XX +XXX,XX @@ static void omap_lpg_reset(struct omap_lpg_s *s)
454
omap_lpg_update(s);
455
}
456
457
-static uint64_t omap_lpg_read(void *opaque, hwaddr addr,
458
- unsigned size)
459
+static uint64_t omap_lpg_read(void *opaque, hwaddr addr, unsigned size)
460
{
461
- struct omap_lpg_s *s = (struct omap_lpg_s *) opaque;
462
+ struct omap_lpg_s *s = opaque;
463
int offset = addr & OMAP_MPUI_REG_MASK;
464
465
if (size != 1) {
466
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_lpg_read(void *opaque, hwaddr addr,
467
static void omap_lpg_write(void *opaque, hwaddr addr,
468
uint64_t value, unsigned size)
469
{
470
- struct omap_lpg_s *s = (struct omap_lpg_s *) opaque;
471
+ struct omap_lpg_s *s = opaque;
472
int offset = addr & OMAP_MPUI_REG_MASK;
473
474
if (size != 1) {
475
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap_lpg_ops = {
476
477
static void omap_lpg_clk_update(void *opaque, int line, int on)
478
{
479
- struct omap_lpg_s *s = (struct omap_lpg_s *) opaque;
480
+ struct omap_lpg_s *s = opaque;
481
482
s->clk = on;
483
omap_lpg_update(s);
484
@@ -XXX,XX +XXX,XX @@ static void omap_setup_mpui_io(MemoryRegion *system_memory,
485
/* General chip reset */
486
static void omap1_mpu_reset(void *opaque)
487
{
488
- struct omap_mpu_state_s *mpu = (struct omap_mpu_state_s *) opaque;
489
+ struct omap_mpu_state_s *mpu = opaque;
490
491
omap_dma_reset(mpu->dma);
492
omap_mpu_timer_reset(mpu->timer[0]);
493
@@ -XXX,XX +XXX,XX @@ static void omap_setup_dsp_mapping(MemoryRegion *system_memory,
494
495
void omap_mpu_wakeup(void *opaque, int irq, int req)
496
{
497
- struct omap_mpu_state_s *mpu = (struct omap_mpu_state_s *) opaque;
498
+ struct omap_mpu_state_s *mpu = opaque;
499
CPUState *cpu = CPU(mpu->cpu);
500
501
if (cpu->halted) {
502
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
503
index XXXXXXX..XXXXXXX 100644
504
--- a/hw/arm/omap2.c
505
+++ b/hw/arm/omap2.c
506
@@ -XXX,XX +XXX,XX @@ static inline void omap_eac_out_empty(struct omap_eac_s *s)
507
508
static void omap_eac_in_cb(void *opaque, int avail_b)
509
{
510
- struct omap_eac_s *s = (struct omap_eac_s *) opaque;
511
+ struct omap_eac_s *s = opaque;
512
513
s->codec.rxavail = avail_b >> 2;
514
omap_eac_in_refill(s);
515
@@ -XXX,XX +XXX,XX @@ static void omap_eac_in_cb(void *opaque, int avail_b)
516
517
static void omap_eac_out_cb(void *opaque, int free_b)
518
{
519
- struct omap_eac_s *s = (struct omap_eac_s *) opaque;
520
+ struct omap_eac_s *s = opaque;
521
522
s->codec.txavail = free_b >> 2;
523
if (s->codec.txlen)
524
@@ -XXX,XX +XXX,XX @@ static void omap_eac_reset(struct omap_eac_s *s)
525
omap_eac_interrupt_update(s);
526
}
527
528
-static uint64_t omap_eac_read(void *opaque, hwaddr addr,
529
- unsigned size)
530
+static uint64_t omap_eac_read(void *opaque, hwaddr addr, unsigned size)
531
{
532
- struct omap_eac_s *s = (struct omap_eac_s *) opaque;
533
+ struct omap_eac_s *s = opaque;
534
uint32_t ret;
535
536
if (size != 2) {
537
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_eac_read(void *opaque, hwaddr addr,
538
static void omap_eac_write(void *opaque, hwaddr addr,
539
uint64_t value, unsigned size)
540
{
541
- struct omap_eac_s *s = (struct omap_eac_s *) opaque;
542
+ struct omap_eac_s *s = opaque;
543
544
if (size != 2) {
545
omap_badwidth_write16(opaque, addr, value);
546
@@ -XXX,XX +XXX,XX @@ static void omap_sti_reset(struct omap_sti_s *s)
547
static uint64_t omap_sti_read(void *opaque, hwaddr addr,
548
unsigned size)
549
{
550
- struct omap_sti_s *s = (struct omap_sti_s *) opaque;
551
+ struct omap_sti_s *s = opaque;
552
553
if (size != 4) {
554
return omap_badwidth_read32(opaque, addr);
555
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_sti_read(void *opaque, hwaddr addr,
556
static void omap_sti_write(void *opaque, hwaddr addr,
557
uint64_t value, unsigned size)
558
{
559
- struct omap_sti_s *s = (struct omap_sti_s *) opaque;
560
+ struct omap_sti_s *s = opaque;
561
562
if (size != 4) {
563
omap_badwidth_write32(opaque, addr, value);
564
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap_sti_ops = {
565
.endianness = DEVICE_NATIVE_ENDIAN,
566
};
567
568
-static uint64_t omap_sti_fifo_read(void *opaque, hwaddr addr,
569
- unsigned size)
570
+static uint64_t omap_sti_fifo_read(void *opaque, hwaddr addr, unsigned size)
571
{
572
OMAP_BAD_REG(addr);
84
return 0;
573
return 0;
85
}
574
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_sti_fifo_read(void *opaque, hwaddr addr,
86
@@ -XXX,XX +XXX,XX @@ static void device_set_realized(Object *obj, bool value, Error **errp)
575
static void omap_sti_fifo_write(void *opaque, hwaddr addr,
87
}
576
uint64_t value, unsigned size)
88
}
577
{
89
if (dev->hotplugged) {
578
- struct omap_sti_s *s = (struct omap_sti_s *) opaque;
90
- device_reset(dev);
579
+ struct omap_sti_s *s = opaque;
91
+ device_legacy_reset(dev);
580
int ch = addr >> 6;
92
}
581
uint8_t byte = value;
93
dev->pending_deleted_event = false;
582
94
583
@@ -XXX,XX +XXX,XX @@ static void omap_prcm_int_update(struct omap_prcm_s *s, int dom)
95
@@ -XXX,XX +XXX,XX @@ void device_class_set_parent_unrealize(DeviceClass *dc,
584
static uint64_t omap_prcm_read(void *opaque, hwaddr addr,
96
dc->unrealize = dev_unrealize;
585
unsigned size)
97
}
586
{
98
587
- struct omap_prcm_s *s = (struct omap_prcm_s *) opaque;
99
-void device_reset(DeviceState *dev)
588
+ struct omap_prcm_s *s = opaque;
100
+void device_legacy_reset(DeviceState *dev)
589
uint32_t ret;
101
{
590
102
DeviceClass *klass = DEVICE_GET_CLASS(dev);
591
if (size != 4) {
103
592
@@ -XXX,XX +XXX,XX @@ static void omap_prcm_dpll_update(struct omap_prcm_s *s)
104
diff --git a/hw/hyperv/hyperv.c b/hw/hyperv/hyperv.c
593
static void omap_prcm_write(void *opaque, hwaddr addr,
105
index XXXXXXX..XXXXXXX 100644
594
uint64_t value, unsigned size)
106
--- a/hw/hyperv/hyperv.c
595
{
107
+++ b/hw/hyperv/hyperv.c
596
- struct omap_prcm_s *s = (struct omap_prcm_s *) opaque;
108
@@ -XXX,XX +XXX,XX @@ void hyperv_synic_reset(CPUState *cs)
597
+ struct omap_prcm_s *s = opaque;
109
SynICState *synic = get_synic(cs);
598
110
599
if (size != 4) {
111
if (synic) {
600
omap_badwidth_write32(opaque, addr, value);
112
- device_reset(DEVICE(synic));
601
@@ -XXX,XX +XXX,XX @@ struct omap_sysctl_s {
113
+ device_legacy_reset(DEVICE(synic));
602
static uint32_t omap_sysctl_read8(void *opaque, hwaddr addr)
603
{
604
605
- struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque;
606
+ struct omap_sysctl_s *s = opaque;
607
int pad_offset, byte_offset;
608
int value;
609
610
@@ -XXX,XX +XXX,XX @@ static uint32_t omap_sysctl_read8(void *opaque, hwaddr addr)
611
612
static uint32_t omap_sysctl_read(void *opaque, hwaddr addr)
613
{
614
- struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque;
615
+ struct omap_sysctl_s *s = opaque;
616
617
switch (addr) {
618
case 0x000:    /* CONTROL_REVISION */
619
@@ -XXX,XX +XXX,XX @@ static uint32_t omap_sysctl_read(void *opaque, hwaddr addr)
620
return 0;
621
}
622
623
-static void omap_sysctl_write8(void *opaque, hwaddr addr,
624
- uint32_t value)
625
+static void omap_sysctl_write8(void *opaque, hwaddr addr, uint32_t value)
626
{
627
- struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque;
628
+ struct omap_sysctl_s *s = opaque;
629
int pad_offset, byte_offset;
630
int prev_value;
631
632
@@ -XXX,XX +XXX,XX @@ static void omap_sysctl_write8(void *opaque, hwaddr addr,
114
}
633
}
115
}
634
}
116
635
117
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
636
-static void omap_sysctl_write(void *opaque, hwaddr addr,
118
index XXXXXXX..XXXXXXX 100644
637
- uint32_t value)
119
--- a/hw/i386/microvm.c
638
+static void omap_sysctl_write(void *opaque, hwaddr addr, uint32_t value)
120
+++ b/hw/i386/microvm.c
639
{
121
@@ -XXX,XX +XXX,XX @@ static void microvm_machine_reset(MachineState *machine)
640
- struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque;
122
cpu = X86_CPU(cs);
641
+ struct omap_sysctl_s *s = opaque;
123
642
124
if (cpu->apic_state) {
643
switch (addr) {
125
- device_reset(cpu->apic_state);
644
case 0x000:    /* CONTROL_REVISION */
126
+ device_legacy_reset(cpu->apic_state);
645
@@ -XXX,XX +XXX,XX @@ static struct omap_sysctl_s *omap_sysctl_init(struct omap_target_agent_s *ta,
127
}
646
/* General chip reset */
647
static void omap2_mpu_reset(void *opaque)
648
{
649
- struct omap_mpu_state_s *mpu = (struct omap_mpu_state_s *) opaque;
650
+ struct omap_mpu_state_s *mpu = opaque;
651
652
omap_dma_reset(mpu->dma);
653
omap_prcm_reset(mpu->prcm);
654
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
655
index XXXXXXX..XXXXXXX 100644
656
--- a/hw/arm/omap_sx1.c
657
+++ b/hw/arm/omap_sx1.c
658
@@ -XXX,XX +XXX,XX @@
659
static uint64_t static_read(void *opaque, hwaddr offset,
660
unsigned size)
661
{
662
- uint32_t *val = (uint32_t *) opaque;
663
+ uint32_t *val = opaque;
664
uint32_t mask = (4 / size) - 1;
665
666
return *val >> ((offset & mask) << 3);
667
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
668
index XXXXXXX..XXXXXXX 100644
669
--- a/hw/arm/palm.c
670
+++ b/hw/arm/palm.c
671
@@ -XXX,XX +XXX,XX @@ static struct {
672
673
static void palmte_button_event(void *opaque, int keycode)
674
{
675
- struct omap_mpu_state_s *cpu = (struct omap_mpu_state_s *) opaque;
676
+ struct omap_mpu_state_s *cpu = opaque;
677
678
if (palmte_keymap[keycode & 0x7f].row != -1)
679
omap_mpuio_key(cpu->mpuio,
680
diff --git a/hw/char/omap_uart.c b/hw/char/omap_uart.c
681
index XXXXXXX..XXXXXXX 100644
682
--- a/hw/char/omap_uart.c
683
+++ b/hw/char/omap_uart.c
684
@@ -XXX,XX +XXX,XX @@ struct omap_uart_s *omap_uart_init(hwaddr base,
685
return s;
686
}
687
688
-static uint64_t omap_uart_read(void *opaque, hwaddr addr,
689
- unsigned size)
690
+static uint64_t omap_uart_read(void *opaque, hwaddr addr, unsigned size)
691
{
692
- struct omap_uart_s *s = (struct omap_uart_s *) opaque;
693
+ struct omap_uart_s *s = opaque;
694
695
if (size == 4) {
696
return omap_badwidth_read8(opaque, addr);
697
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_uart_read(void *opaque, hwaddr addr,
698
static void omap_uart_write(void *opaque, hwaddr addr,
699
uint64_t value, unsigned size)
700
{
701
- struct omap_uart_s *s = (struct omap_uart_s *) opaque;
702
+ struct omap_uart_s *s = opaque;
703
704
if (size == 4) {
705
omap_badwidth_write8(opaque, addr, value);
706
diff --git a/hw/display/omap_dss.c b/hw/display/omap_dss.c
707
index XXXXXXX..XXXXXXX 100644
708
--- a/hw/display/omap_dss.c
709
+++ b/hw/display/omap_dss.c
710
@@ -XXX,XX +XXX,XX @@ void omap_dss_reset(struct omap_dss_s *s)
711
static uint64_t omap_diss_read(void *opaque, hwaddr addr,
712
unsigned size)
713
{
714
- struct omap_dss_s *s = (struct omap_dss_s *) opaque;
715
+ struct omap_dss_s *s = opaque;
716
717
if (size != 4) {
718
return omap_badwidth_read32(opaque, addr);
719
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_diss_read(void *opaque, hwaddr addr,
720
static void omap_diss_write(void *opaque, hwaddr addr,
721
uint64_t value, unsigned size)
722
{
723
- struct omap_dss_s *s = (struct omap_dss_s *) opaque;
724
+ struct omap_dss_s *s = opaque;
725
726
if (size != 4) {
727
omap_badwidth_write32(opaque, addr, value);
728
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap_diss_ops = {
729
static uint64_t omap_disc_read(void *opaque, hwaddr addr,
730
unsigned size)
731
{
732
- struct omap_dss_s *s = (struct omap_dss_s *) opaque;
733
+ struct omap_dss_s *s = opaque;
734
735
if (size != 4) {
736
return omap_badwidth_read32(opaque, addr);
737
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_disc_read(void *opaque, hwaddr addr,
738
static void omap_disc_write(void *opaque, hwaddr addr,
739
uint64_t value, unsigned size)
740
{
741
- struct omap_dss_s *s = (struct omap_dss_s *) opaque;
742
+ struct omap_dss_s *s = opaque;
743
744
if (size != 4) {
745
omap_badwidth_write32(opaque, addr, value);
746
@@ -XXX,XX +XXX,XX @@ static void omap_rfbi_transfer_start(struct omap_dss_s *s)
747
omap_dispc_interrupt_update(s);
748
}
749
750
-static uint64_t omap_rfbi_read(void *opaque, hwaddr addr,
751
- unsigned size)
752
+static uint64_t omap_rfbi_read(void *opaque, hwaddr addr, unsigned size)
753
{
754
- struct omap_dss_s *s = (struct omap_dss_s *) opaque;
755
+ struct omap_dss_s *s = opaque;
756
757
if (size != 4) {
758
return omap_badwidth_read32(opaque, addr);
759
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_rfbi_read(void *opaque, hwaddr addr,
760
static void omap_rfbi_write(void *opaque, hwaddr addr,
761
uint64_t value, unsigned size)
762
{
763
- struct omap_dss_s *s = (struct omap_dss_s *) opaque;
764
+ struct omap_dss_s *s = opaque;
765
766
if (size != 4) {
767
omap_badwidth_write32(opaque, addr, value);
768
diff --git a/hw/display/omap_lcdc.c b/hw/display/omap_lcdc.c
769
index XXXXXXX..XXXXXXX 100644
770
--- a/hw/display/omap_lcdc.c
771
+++ b/hw/display/omap_lcdc.c
772
@@ -XXX,XX +XXX,XX @@ static void draw_line16_32(void *opaque, uint8_t *d, const uint8_t *s,
773
774
static void omap_update_display(void *opaque)
775
{
776
- struct omap_lcd_panel_s *omap_lcd = (struct omap_lcd_panel_s *) opaque;
777
+ struct omap_lcd_panel_s *omap_lcd = opaque;
778
DisplaySurface *surface;
779
drawfn draw_line;
780
int size, height, first, last;
781
@@ -XXX,XX +XXX,XX @@ static void omap_lcd_update(struct omap_lcd_panel_s *s) {
128
}
782
}
129
}
783
}
130
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
784
131
index XXXXXXX..XXXXXXX 100644
785
-static uint64_t omap_lcdc_read(void *opaque, hwaddr addr,
132
--- a/hw/i386/pc.c
786
- unsigned size)
133
+++ b/hw/i386/pc.c
787
+static uint64_t omap_lcdc_read(void *opaque, hwaddr addr, unsigned size)
134
@@ -XXX,XX +XXX,XX @@ static void pc_machine_reset(MachineState *machine)
788
{
135
cpu = X86_CPU(cs);
789
- struct omap_lcd_panel_s *s = (struct omap_lcd_panel_s *) opaque;
136
790
+ struct omap_lcd_panel_s *s = opaque;
137
if (cpu->apic_state) {
791
138
- device_reset(cpu->apic_state);
792
switch (addr) {
139
+ device_legacy_reset(cpu->apic_state);
793
case 0x00:    /* LCD_CONTROL */
140
}
794
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_lcdc_read(void *opaque, hwaddr addr,
141
}
795
static void omap_lcdc_write(void *opaque, hwaddr addr,
142
}
796
uint64_t value, unsigned size)
143
diff --git a/hw/ide/microdrive.c b/hw/ide/microdrive.c
797
{
144
index XXXXXXX..XXXXXXX 100644
798
- struct omap_lcd_panel_s *s = (struct omap_lcd_panel_s *) opaque;
145
--- a/hw/ide/microdrive.c
799
+ struct omap_lcd_panel_s *s = opaque;
146
+++ b/hw/ide/microdrive.c
800
147
@@ -XXX,XX +XXX,XX @@ static void md_attr_write(PCMCIACardState *card, uint32_t at, uint8_t value)
801
switch (addr) {
148
case 0x00:    /* Configuration Option Register */
802
case 0x00:    /* LCD_CONTROL */
149
s->opt = value & 0xcf;
803
diff --git a/hw/dma/omap_dma.c b/hw/dma/omap_dma.c
150
if (value & OPT_SRESET) {
804
index XXXXXXX..XXXXXXX 100644
151
- device_reset(DEVICE(s));
805
--- a/hw/dma/omap_dma.c
152
+ device_legacy_reset(DEVICE(s));
806
+++ b/hw/dma/omap_dma.c
153
}
807
@@ -XXX,XX +XXX,XX @@ static int omap_dma_sys_read(struct omap_dma_s *s, int offset,
154
md_interrupt_update(s);
155
break;
156
@@ -XXX,XX +XXX,XX @@ static void md_common_write(PCMCIACardState *card, uint32_t at, uint16_t value)
157
case 0xe:    /* Device Control */
158
s->ctrl = value;
159
if (value & CTRL_SRST) {
160
- device_reset(DEVICE(s));
161
+ device_legacy_reset(DEVICE(s));
162
}
163
md_interrupt_update(s);
164
break;
165
@@ -XXX,XX +XXX,XX @@ static int dscm1xxxx_attach(PCMCIACardState *card)
166
md->attr_base = pcc->cis[0x74] | (pcc->cis[0x76] << 8);
167
md->io_base = 0x0;
168
169
- device_reset(DEVICE(md));
170
+ device_legacy_reset(DEVICE(md));
171
md_interrupt_update(md);
172
173
return 0;
808
return 0;
174
@@ -XXX,XX +XXX,XX @@ static int dscm1xxxx_detach(PCMCIACardState *card)
809
}
175
{
810
176
MicroDriveState *md = MICRODRIVE(card);
811
-static uint64_t omap_dma_read(void *opaque, hwaddr addr,
177
812
- unsigned size)
178
- device_reset(DEVICE(md));
813
+static uint64_t omap_dma_read(void *opaque, hwaddr addr, unsigned size)
179
+ device_legacy_reset(DEVICE(md));
814
{
180
return 0;
815
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
181
}
816
+ struct omap_dma_s *s = opaque;
182
817
int reg, ch;
183
diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
818
uint16_t ret;
184
index XXXXXXX..XXXXXXX 100644
819
185
--- a/hw/intc/spapr_xive.c
820
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_dma_read(void *opaque, hwaddr addr,
186
+++ b/hw/intc/spapr_xive.c
821
static void omap_dma_write(void *opaque, hwaddr addr,
187
@@ -XXX,XX +XXX,XX @@ static target_ulong h_int_reset(PowerPCCPU *cpu,
822
uint64_t value, unsigned size)
188
return H_PARAMETER;
823
{
189
}
824
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
190
825
+ struct omap_dma_s *s = opaque;
191
- device_reset(DEVICE(xive));
826
int reg, ch;
192
+ device_legacy_reset(DEVICE(xive));
827
193
828
if (size != 2) {
194
if (kvm_irqchip_in_kernel()) {
829
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap_dma_ops = {
195
Error *local_err = NULL;
830
196
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
831
static void omap_dma_request(void *opaque, int drq, int req)
197
index XXXXXXX..XXXXXXX 100644
832
{
198
--- a/hw/ppc/pnv_psi.c
833
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
199
+++ b/hw/ppc/pnv_psi.c
834
+ struct omap_dma_s *s = opaque;
200
@@ -XXX,XX +XXX,XX @@ static void pnv_psi_reset(DeviceState *dev)
835
/* The request pins are level triggered in QEMU. */
201
836
if (req) {
202
static void pnv_psi_reset_handler(void *dev)
837
if (~s->dma->drqbmp & (1ULL << drq)) {
203
{
838
@@ -XXX,XX +XXX,XX @@ static void omap_dma_request(void *opaque, int drq, int req)
204
- device_reset(DEVICE(dev));
839
/* XXX: this won't be needed once soc_dma knows about clocks. */
205
+ device_legacy_reset(DEVICE(dev));
840
static void omap_dma_clk_update(void *opaque, int line, int on)
206
}
841
{
207
842
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
208
static void pnv_psi_realize(DeviceState *dev, Error **errp)
843
+ struct omap_dma_s *s = opaque;
209
@@ -XXX,XX +XXX,XX @@ static void pnv_psi_p9_mmio_write(void *opaque, hwaddr addr,
844
int i;
210
break;
845
211
case PSIHB9_INTERRUPT_CONTROL:
846
s->dma->freq = omap_clk_getrate(s->clk);
212
if (val & PSIHB9_IRQ_RESET) {
847
@@ -XXX,XX +XXX,XX @@ static void omap_dma_interrupts_4_update(struct omap_dma_s *s)
213
- device_reset(DEVICE(&psi9->source));
848
static uint64_t omap_dma4_read(void *opaque, hwaddr addr,
214
+ device_legacy_reset(DEVICE(&psi9->source));
849
unsigned size)
215
}
850
{
216
psi->regs[reg] = val;
851
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
217
break;
852
+ struct omap_dma_s *s = opaque;
218
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
853
int irqn = 0, chnum;
219
index XXXXXXX..XXXXXXX 100644
854
struct omap_dma_channel_s *ch;
220
--- a/hw/ppc/spapr_pci.c
855
221
+++ b/hw/ppc/spapr_pci.c
856
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_dma4_read(void *opaque, hwaddr addr,
222
@@ -XXX,XX +XXX,XX @@ static int spapr_phb_children_reset(Object *child, void *opaque)
857
static void omap_dma4_write(void *opaque, hwaddr addr,
223
DeviceState *dev = (DeviceState *) object_dynamic_cast(child, TYPE_DEVICE);
858
uint64_t value, unsigned size)
224
859
{
225
if (dev) {
860
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
226
- device_reset(dev);
861
+ struct omap_dma_s *s = opaque;
227
+ device_legacy_reset(dev);
862
int chnum, irqn = 0;
228
}
863
struct omap_dma_channel_s *ch;
229
864
230
return 0;
865
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
231
diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
866
index XXXXXXX..XXXXXXX 100644
232
index XXXXXXX..XXXXXXX 100644
867
--- a/hw/gpio/omap_gpio.c
233
--- a/hw/ppc/spapr_vio.c
868
+++ b/hw/gpio/omap_gpio.c
234
+++ b/hw/ppc/spapr_vio.c
869
@@ -XXX,XX +XXX,XX @@ static void omap_gpio_set(void *opaque, int line, int level)
235
@@ -XXX,XX +XXX,XX @@ int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq)
870
static uint64_t omap_gpio_read(void *opaque, hwaddr addr,
236
static void spapr_vio_quiesce_one(SpaprVioDevice *dev)
871
unsigned size)
237
{
872
{
238
if (dev->tcet) {
873
- struct omap_gpio_s *s = (struct omap_gpio_s *) opaque;
239
- device_reset(DEVICE(dev->tcet));
874
+ struct omap_gpio_s *s = opaque;
240
+ device_legacy_reset(DEVICE(dev->tcet));
875
int offset = addr & OMAP_MPUI_REG_MASK;
241
}
876
242
free_crq(dev);
877
if (size != 2) {
243
}
878
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_gpio_read(void *opaque, hwaddr addr,
244
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
879
static void omap_gpio_write(void *opaque, hwaddr addr,
245
index XXXXXXX..XXXXXXX 100644
880
uint64_t value, unsigned size)
246
--- a/hw/s390x/s390-pci-inst.c
881
{
247
+++ b/hw/s390x/s390-pci-inst.c
882
- struct omap_gpio_s *s = (struct omap_gpio_s *) opaque;
248
@@ -XXX,XX +XXX,XX @@ int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_t ra)
883
+ struct omap_gpio_s *s = opaque;
249
stw_p(&ressetpci->hdr.rsp, CLP_RC_SETPCIFN_FHOP);
884
int offset = addr & OMAP_MPUI_REG_MASK;
250
goto out;
885
uint16_t diff;
251
}
886
int ln;
252
- device_reset(DEVICE(pbdev));
887
@@ -XXX,XX +XXX,XX @@ static void omap2_gpio_module_reset(struct omap2_gpio_s *s)
253
+ device_legacy_reset(DEVICE(pbdev));
888
254
pbdev->fh &= ~FH_MASK_ENABLE;
889
static uint32_t omap2_gpio_module_read(void *opaque, hwaddr addr)
255
pbdev->state = ZPCI_FS_DISABLED;
890
{
256
stl_p(&ressetpci->fh, pbdev->fh);
891
- struct omap2_gpio_s *s = (struct omap2_gpio_s *) opaque;
257
diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
892
+ struct omap2_gpio_s *s = opaque;
258
index XXXXXXX..XXXXXXX 100644
893
259
--- a/hw/scsi/vmw_pvscsi.c
894
switch (addr) {
260
+++ b/hw/scsi/vmw_pvscsi.c
895
case 0x00:    /* GPIO_REVISION */
261
@@ -XXX,XX +XXX,XX @@ pvscsi_on_cmd_reset_device(PVSCSIState *s)
896
@@ -XXX,XX +XXX,XX @@ static uint32_t omap2_gpio_module_read(void *opaque, hwaddr addr)
262
897
static void omap2_gpio_module_write(void *opaque, hwaddr addr,
263
if (sdev != NULL) {
898
uint32_t value)
264
s->resetting++;
899
{
265
- device_reset(&sdev->qdev);
900
- struct omap2_gpio_s *s = (struct omap2_gpio_s *) opaque;
266
+ device_legacy_reset(&sdev->qdev);
901
+ struct omap2_gpio_s *s = opaque;
267
s->resetting--;
902
uint32_t diff;
268
return PVSCSI_COMMAND_PROCESSING_SUCCEEDED;
903
int ln;
269
}
904
905
@@ -XXX,XX +XXX,XX @@ static void omap2_gpif_reset(DeviceState *dev)
906
s->gpo = 0;
907
}
908
909
-static uint64_t omap2_gpif_top_read(void *opaque, hwaddr addr,
910
- unsigned size)
911
+static uint64_t omap2_gpif_top_read(void *opaque, hwaddr addr, unsigned size)
912
{
913
- struct omap2_gpif_s *s = (struct omap2_gpif_s *) opaque;
914
+ struct omap2_gpif_s *s = opaque;
915
916
switch (addr) {
917
case 0x00:    /* IPGENERICOCPSPL_REVISION */
918
@@ -XXX,XX +XXX,XX @@ static uint64_t omap2_gpif_top_read(void *opaque, hwaddr addr,
919
static void omap2_gpif_top_write(void *opaque, hwaddr addr,
920
uint64_t value, unsigned size)
921
{
922
- struct omap2_gpif_s *s = (struct omap2_gpif_s *) opaque;
923
+ struct omap2_gpif_s *s = opaque;
924
925
switch (addr) {
926
case 0x00:    /* IPGENERICOCPSPL_REVISION */
927
diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
928
index XXXXXXX..XXXXXXX 100644
929
--- a/hw/intc/omap_intc.c
930
+++ b/hw/intc/omap_intc.c
931
@@ -XXX,XX +XXX,XX @@ static inline void omap_inth_update(struct omap_intr_handler_s *s, int is_fiq)
932
933
static void omap_set_intr(void *opaque, int irq, int req)
934
{
935
- struct omap_intr_handler_s *ih = (struct omap_intr_handler_s *) opaque;
936
+ struct omap_intr_handler_s *ih = opaque;
937
uint32_t rise;
938
939
struct omap_intr_handler_bank_s *bank = &ih->bank[irq >> 5];
940
@@ -XXX,XX +XXX,XX @@ static void omap_set_intr(void *opaque, int irq, int req)
941
/* Simplified version with no edge detection */
942
static void omap_set_intr_noedge(void *opaque, int irq, int req)
943
{
944
- struct omap_intr_handler_s *ih = (struct omap_intr_handler_s *) opaque;
945
+ struct omap_intr_handler_s *ih = opaque;
946
uint32_t rise;
947
948
struct omap_intr_handler_bank_s *bank = &ih->bank[irq >> 5];
949
@@ -XXX,XX +XXX,XX @@ static void omap_set_intr_noedge(void *opaque, int irq, int req)
950
static uint64_t omap_inth_read(void *opaque, hwaddr addr,
951
unsigned size)
952
{
953
- struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque;
954
+ struct omap_intr_handler_s *s = opaque;
955
int i, offset = addr;
956
int bank_no = offset >> 8;
957
int line_no;
958
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_inth_read(void *opaque, hwaddr addr,
959
static void omap_inth_write(void *opaque, hwaddr addr,
960
uint64_t value, unsigned size)
961
{
962
- struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque;
963
+ struct omap_intr_handler_s *s = opaque;
964
int i, offset = addr;
965
int bank_no = offset >> 8;
966
struct omap_intr_handler_bank_s *bank = &s->bank[bank_no];
967
@@ -XXX,XX +XXX,XX @@ static const TypeInfo omap_intc_info = {
968
static uint64_t omap2_inth_read(void *opaque, hwaddr addr,
969
unsigned size)
970
{
971
- struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque;
972
+ struct omap_intr_handler_s *s = opaque;
973
int offset = addr;
974
int bank_no, line_no;
975
struct omap_intr_handler_bank_s *bank = NULL;
976
@@ -XXX,XX +XXX,XX @@ static uint64_t omap2_inth_read(void *opaque, hwaddr addr,
977
static void omap2_inth_write(void *opaque, hwaddr addr,
978
uint64_t value, unsigned size)
979
{
980
- struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque;
981
+ struct omap_intr_handler_s *s = opaque;
982
int offset = addr;
983
int bank_no, line_no;
984
struct omap_intr_handler_bank_s *bank = NULL;
985
diff --git a/hw/misc/omap_gpmc.c b/hw/misc/omap_gpmc.c
986
index XXXXXXX..XXXXXXX 100644
987
--- a/hw/misc/omap_gpmc.c
988
+++ b/hw/misc/omap_gpmc.c
989
@@ -XXX,XX +XXX,XX @@ static void omap_gpmc_dma_update(struct omap_gpmc_s *s, int value)
990
static uint64_t omap_nand_read(void *opaque, hwaddr addr,
991
unsigned size)
992
{
993
- struct omap_gpmc_cs_file_s *f = (struct omap_gpmc_cs_file_s *)opaque;
994
+ struct omap_gpmc_cs_file_s *f = opaque;
995
uint64_t v;
996
nand_setpins(f->dev, 0, 0, 0, 1, 0);
997
switch (omap_gpmc_devsize(f)) {
998
@@ -XXX,XX +XXX,XX @@ static void omap_nand_setio(DeviceState *dev, uint64_t value,
999
static void omap_nand_write(void *opaque, hwaddr addr,
1000
uint64_t value, unsigned size)
1001
{
1002
- struct omap_gpmc_cs_file_s *f = (struct omap_gpmc_cs_file_s *)opaque;
1003
+ struct omap_gpmc_cs_file_s *f = opaque;
1004
nand_setpins(f->dev, 0, 0, 0, 1, 0);
1005
omap_nand_setio(f->dev, value, omap_gpmc_devsize(f), size);
1006
}
1007
@@ -XXX,XX +XXX,XX @@ static void fill_prefetch_fifo(struct omap_gpmc_s *s)
1008
static uint64_t omap_gpmc_prefetch_read(void *opaque, hwaddr addr,
1009
unsigned size)
1010
{
1011
- struct omap_gpmc_s *s = (struct omap_gpmc_s *) opaque;
1012
+ struct omap_gpmc_s *s = opaque;
1013
uint32_t data;
1014
if (s->prefetch.config1 & 1) {
1015
/* The TRM doesn't define the behaviour if you read from the
1016
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_gpmc_prefetch_read(void *opaque, hwaddr addr,
1017
static void omap_gpmc_prefetch_write(void *opaque, hwaddr addr,
1018
uint64_t value, unsigned size)
1019
{
1020
- struct omap_gpmc_s *s = (struct omap_gpmc_s *) opaque;
1021
+ struct omap_gpmc_s *s = opaque;
1022
int cs = prefetch_cs(s->prefetch.config1);
1023
if ((s->prefetch.config1 & 1) == 0) {
1024
/* The TRM doesn't define the behaviour of writing to the
1025
@@ -XXX,XX +XXX,XX @@ static int gpmc_wordaccess_only(hwaddr addr)
1026
static uint64_t omap_gpmc_read(void *opaque, hwaddr addr,
1027
unsigned size)
1028
{
1029
- struct omap_gpmc_s *s = (struct omap_gpmc_s *) opaque;
1030
+ struct omap_gpmc_s *s = opaque;
1031
int cs;
1032
struct omap_gpmc_cs_file_s *f;
1033
1034
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_gpmc_read(void *opaque, hwaddr addr,
1035
static void omap_gpmc_write(void *opaque, hwaddr addr,
1036
uint64_t value, unsigned size)
1037
{
1038
- struct omap_gpmc_s *s = (struct omap_gpmc_s *) opaque;
1039
+ struct omap_gpmc_s *s = opaque;
1040
int cs;
1041
struct omap_gpmc_cs_file_s *f;
1042
1043
diff --git a/hw/misc/omap_l4.c b/hw/misc/omap_l4.c
1044
index XXXXXXX..XXXXXXX 100644
1045
--- a/hw/misc/omap_l4.c
1046
+++ b/hw/misc/omap_l4.c
1047
@@ -XXX,XX +XXX,XX @@ hwaddr omap_l4_region_size(struct omap_target_agent_s *ta,
1048
return ta->start[region].size;
1049
}
1050
1051
-static uint64_t omap_l4ta_read(void *opaque, hwaddr addr,
1052
- unsigned size)
1053
+static uint64_t omap_l4ta_read(void *opaque, hwaddr addr, unsigned size)
1054
{
1055
- struct omap_target_agent_s *s = (struct omap_target_agent_s *) opaque;
1056
+ struct omap_target_agent_s *s = opaque;
1057
1058
if (size != 2) {
1059
return omap_badwidth_read16(opaque, addr);
1060
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_l4ta_read(void *opaque, hwaddr addr,
1061
static void omap_l4ta_write(void *opaque, hwaddr addr,
1062
uint64_t value, unsigned size)
1063
{
1064
- struct omap_target_agent_s *s = (struct omap_target_agent_s *) opaque;
1065
+ struct omap_target_agent_s *s = opaque;
1066
1067
if (size != 4) {
1068
omap_badwidth_write32(opaque, addr, value);
1069
diff --git a/hw/misc/omap_sdrc.c b/hw/misc/omap_sdrc.c
1070
index XXXXXXX..XXXXXXX 100644
1071
--- a/hw/misc/omap_sdrc.c
1072
+++ b/hw/misc/omap_sdrc.c
1073
@@ -XXX,XX +XXX,XX @@ void omap_sdrc_reset(struct omap_sdrc_s *s)
1074
s->config = 0x10;
1075
}
1076
1077
-static uint64_t omap_sdrc_read(void *opaque, hwaddr addr,
1078
- unsigned size)
1079
+static uint64_t omap_sdrc_read(void *opaque, hwaddr addr, unsigned size)
1080
{
1081
- struct omap_sdrc_s *s = (struct omap_sdrc_s *) opaque;
1082
+ struct omap_sdrc_s *s = opaque;
1083
1084
if (size != 4) {
1085
return omap_badwidth_read32(opaque, addr);
1086
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_sdrc_read(void *opaque, hwaddr addr,
1087
static void omap_sdrc_write(void *opaque, hwaddr addr,
1088
uint64_t value, unsigned size)
1089
{
1090
- struct omap_sdrc_s *s = (struct omap_sdrc_s *) opaque;
1091
+ struct omap_sdrc_s *s = opaque;
1092
1093
if (size != 4) {
1094
omap_badwidth_write32(opaque, addr, value);
1095
diff --git a/hw/misc/omap_tap.c b/hw/misc/omap_tap.c
1096
index XXXXXXX..XXXXXXX 100644
1097
--- a/hw/misc/omap_tap.c
1098
+++ b/hw/misc/omap_tap.c
1099
@@ -XXX,XX +XXX,XX @@
1100
#include "hw/arm/omap.h"
1101
1102
/* TEST-Chip-level TAP */
1103
-static uint64_t omap_tap_read(void *opaque, hwaddr addr,
1104
- unsigned size)
1105
+static uint64_t omap_tap_read(void *opaque, hwaddr addr, unsigned size)
1106
{
1107
- struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;
1108
+ struct omap_mpu_state_s *s = opaque;
1109
1110
if (size != 4) {
1111
return omap_badwidth_read32(opaque, addr);
270
diff --git a/hw/sd/omap_mmc.c b/hw/sd/omap_mmc.c
1112
diff --git a/hw/sd/omap_mmc.c b/hw/sd/omap_mmc.c
271
index XXXXXXX..XXXXXXX 100644
1113
index XXXXXXX..XXXXXXX 100644
272
--- a/hw/sd/omap_mmc.c
1114
--- a/hw/sd/omap_mmc.c
273
+++ b/hw/sd/omap_mmc.c
1115
+++ b/hw/sd/omap_mmc.c
274
@@ -XXX,XX +XXX,XX @@ void omap_mmc_reset(struct omap_mmc_s *host)
1116
@@ -XXX,XX +XXX,XX @@ void omap_mmc_reset(struct omap_mmc_s *host)
275
* into any bus, and we must reset it manually. When omap_mmc is
1117
device_cold_reset(DEVICE(host->card));
276
* QOMified this must move into the QOM reset function.
1118
}
277
*/
1119
278
- device_reset(DEVICE(host->card));
1120
-static uint64_t omap_mmc_read(void *opaque, hwaddr offset,
279
+ device_legacy_reset(DEVICE(host->card));
1121
- unsigned size)
280
}
1122
+static uint64_t omap_mmc_read(void *opaque, hwaddr offset, unsigned size)
281
1123
{
282
static uint64_t omap_mmc_read(void *opaque, hwaddr offset,
1124
uint16_t i;
283
diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
1125
- struct omap_mmc_s *s = (struct omap_mmc_s *) opaque;
284
index XXXXXXX..XXXXXXX 100644
1126
+ struct omap_mmc_s *s = opaque;
285
--- a/hw/sd/pl181.c
1127
286
+++ b/hw/sd/pl181.c
1128
if (size != 2) {
287
@@ -XXX,XX +XXX,XX @@ static void pl181_reset(DeviceState *d)
1129
return omap_badwidth_read16(opaque, offset);
288
/* Since we're still using the legacy SD API the card is not plugged
1130
@@ -XXX,XX +XXX,XX @@ static void omap_mmc_write(void *opaque, hwaddr offset,
289
* into any bus, and we must reset it manually.
1131
uint64_t value, unsigned size)
290
*/
1132
{
291
- device_reset(DEVICE(s->card));
1133
int i;
292
+ device_legacy_reset(DEVICE(s->card));
1134
- struct omap_mmc_s *s = (struct omap_mmc_s *) opaque;
293
}
1135
+ struct omap_mmc_s *s = opaque;
294
1136
295
static void pl181_init(Object *obj)
1137
if (size != 2) {
1138
omap_badwidth_write16(opaque, offset, value);
1139
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap_mmc_ops = {
1140
1141
static void omap_mmc_cover_cb(void *opaque, int line, int level)
1142
{
1143
- struct omap_mmc_s *host = (struct omap_mmc_s *) opaque;
1144
+ struct omap_mmc_s *host = opaque;
1145
1146
if (!host->cdet_state && level) {
1147
host->status |= 0x0002;
1148
diff --git a/hw/ssi/omap_spi.c b/hw/ssi/omap_spi.c
1149
index XXXXXXX..XXXXXXX 100644
1150
--- a/hw/ssi/omap_spi.c
1151
+++ b/hw/ssi/omap_spi.c
1152
@@ -XXX,XX +XXX,XX @@ void omap_mcspi_reset(struct omap_mcspi_s *s)
1153
omap_mcspi_interrupt_update(s);
1154
}
1155
1156
-static uint64_t omap_mcspi_read(void *opaque, hwaddr addr,
1157
- unsigned size)
1158
+static uint64_t omap_mcspi_read(void *opaque, hwaddr addr, unsigned size)
1159
{
1160
- struct omap_mcspi_s *s = (struct omap_mcspi_s *) opaque;
1161
+ struct omap_mcspi_s *s = opaque;
1162
int ch = 0;
1163
uint32_t ret;
1164
1165
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_mcspi_read(void *opaque, hwaddr addr,
1166
static void omap_mcspi_write(void *opaque, hwaddr addr,
1167
uint64_t value, unsigned size)
1168
{
1169
- struct omap_mcspi_s *s = (struct omap_mcspi_s *) opaque;
1170
+ struct omap_mcspi_s *s = opaque;
1171
int ch = 0;
1172
1173
if (size != 4) {
1174
diff --git a/hw/timer/omap_gptimer.c b/hw/timer/omap_gptimer.c
1175
index XXXXXXX..XXXXXXX 100644
1176
--- a/hw/timer/omap_gptimer.c
1177
+++ b/hw/timer/omap_gptimer.c
1178
@@ -XXX,XX +XXX,XX @@ static inline void omap_gp_timer_trigger(struct omap_gp_timer_s *timer)
1179
1180
static void omap_gp_timer_tick(void *opaque)
1181
{
1182
- struct omap_gp_timer_s *timer = (struct omap_gp_timer_s *) opaque;
1183
+ struct omap_gp_timer_s *timer = opaque;
1184
1185
if (!timer->ar) {
1186
timer->st = 0;
1187
@@ -XXX,XX +XXX,XX @@ static void omap_gp_timer_tick(void *opaque)
1188
1189
static void omap_gp_timer_match(void *opaque)
1190
{
1191
- struct omap_gp_timer_s *timer = (struct omap_gp_timer_s *) opaque;
1192
+ struct omap_gp_timer_s *timer = opaque;
1193
1194
if (timer->trigger == gpt_trigger_both)
1195
omap_gp_timer_trigger(timer);
1196
@@ -XXX,XX +XXX,XX @@ static void omap_gp_timer_match(void *opaque)
1197
1198
static void omap_gp_timer_input(void *opaque, int line, int on)
1199
{
1200
- struct omap_gp_timer_s *s = (struct omap_gp_timer_s *) opaque;
1201
+ struct omap_gp_timer_s *s = opaque;
1202
int trigger;
1203
1204
switch (s->capture) {
1205
@@ -XXX,XX +XXX,XX @@ static void omap_gp_timer_input(void *opaque, int line, int on)
1206
1207
static void omap_gp_timer_clk_update(void *opaque, int line, int on)
1208
{
1209
- struct omap_gp_timer_s *timer = (struct omap_gp_timer_s *) opaque;
1210
+ struct omap_gp_timer_s *timer = opaque;
1211
1212
omap_gp_timer_sync(timer);
1213
timer->rate = on ? omap_clk_getrate(timer->clk) : 0;
1214
@@ -XXX,XX +XXX,XX @@ void omap_gp_timer_reset(struct omap_gp_timer_s *s)
1215
1216
static uint32_t omap_gp_timer_readw(void *opaque, hwaddr addr)
1217
{
1218
- struct omap_gp_timer_s *s = (struct omap_gp_timer_s *) opaque;
1219
+ struct omap_gp_timer_s *s = opaque;
1220
1221
switch (addr) {
1222
case 0x00:    /* TIDR */
1223
@@ -XXX,XX +XXX,XX @@ static uint32_t omap_gp_timer_readw(void *opaque, hwaddr addr)
1224
1225
static uint32_t omap_gp_timer_readh(void *opaque, hwaddr addr)
1226
{
1227
- struct omap_gp_timer_s *s = (struct omap_gp_timer_s *) opaque;
1228
+ struct omap_gp_timer_s *s = opaque;
1229
uint32_t ret;
1230
1231
if (addr & 2)
1232
@@ -XXX,XX +XXX,XX @@ static uint32_t omap_gp_timer_readh(void *opaque, hwaddr addr)
1233
}
1234
}
1235
1236
-static void omap_gp_timer_write(void *opaque, hwaddr addr,
1237
- uint32_t value)
1238
+static void omap_gp_timer_write(void *opaque, hwaddr addr, uint32_t value)
1239
{
1240
- struct omap_gp_timer_s *s = (struct omap_gp_timer_s *) opaque;
1241
+ struct omap_gp_timer_s *s = opaque;
1242
1243
switch (addr) {
1244
case 0x00:    /* TIDR */
1245
@@ -XXX,XX +XXX,XX @@ static void omap_gp_timer_write(void *opaque, hwaddr addr,
1246
}
1247
}
1248
1249
-static void omap_gp_timer_writeh(void *opaque, hwaddr addr,
1250
- uint32_t value)
1251
+static void omap_gp_timer_writeh(void *opaque, hwaddr addr, uint32_t value)
1252
{
1253
- struct omap_gp_timer_s *s = (struct omap_gp_timer_s *) opaque;
1254
+ struct omap_gp_timer_s *s = opaque;
1255
1256
if (addr & 2)
1257
omap_gp_timer_write(opaque, addr, (value << 16) | s->writeh);
1258
diff --git a/hw/timer/omap_synctimer.c b/hw/timer/omap_synctimer.c
1259
index XXXXXXX..XXXXXXX 100644
1260
--- a/hw/timer/omap_synctimer.c
1261
+++ b/hw/timer/omap_synctimer.c
1262
@@ -XXX,XX +XXX,XX @@ void omap_synctimer_reset(struct omap_synctimer_s *s)
1263
1264
static uint32_t omap_synctimer_readw(void *opaque, hwaddr addr)
1265
{
1266
- struct omap_synctimer_s *s = (struct omap_synctimer_s *) opaque;
1267
+ struct omap_synctimer_s *s = opaque;
1268
1269
switch (addr) {
1270
case 0x00:    /* 32KSYNCNT_REV */
1271
@@ -XXX,XX +XXX,XX @@ static uint32_t omap_synctimer_readw(void *opaque, hwaddr addr)
1272
1273
static uint32_t omap_synctimer_readh(void *opaque, hwaddr addr)
1274
{
1275
- struct omap_synctimer_s *s = (struct omap_synctimer_s *) opaque;
1276
+ struct omap_synctimer_s *s = opaque;
1277
uint32_t ret;
1278
1279
if (addr & 2)
296
--
1280
--
297
2.20.1
1281
2.34.1
298
1282
299
1283
diff view generated by jsdifflib
1
From: Andrew Jeffery <andrew@aj.id.au>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Initialise another SDHCI model instance for the AST2600's eMMC
3
Following docs/devel/style.rst guidelines, rename omap_gpif_s ->
4
controller and use the SDHCI's num_slots value introduced previously to
4
Omap1GpioState. This also remove a use of 'struct' in the
5
determine whether we should create an SD card instance for the new slot.
5
DECLARE_INSTANCE_CHECKER() macro call.
6
6
7
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20230109140306.23161-5-philmd@linaro.org
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
Message-id: 20200114103433.30534-3-clg@kaod.org
12
[ clg : - removed ternary operator from sdhci_attach_drive()
13
- renamed SDHCI objects with a '-controller' prefix ]
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
11
---
17
include/hw/arm/aspeed_soc.h | 2 ++
12
include/hw/arm/omap.h | 6 +++---
18
hw/arm/aspeed.c | 26 +++++++++++++++++---------
13
hw/gpio/omap_gpio.c | 16 ++++++++--------
19
hw/arm/aspeed_ast2600.c | 29 ++++++++++++++++++++++++++---
14
2 files changed, 11 insertions(+), 11 deletions(-)
20
3 files changed, 45 insertions(+), 12 deletions(-)
21
15
22
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
16
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
23
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/aspeed_soc.h
18
--- a/include/hw/arm/omap.h
25
+++ b/include/hw/arm/aspeed_soc.h
19
+++ b/include/hw/arm/omap.h
26
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCState {
20
@@ -XXX,XX +XXX,XX @@ void omap_i2c_set_fclk(OMAPI2CState *i2c, omap_clk clk);
27
AspeedGPIOState gpio;
21
28
AspeedGPIOState gpio_1_8v;
22
/* omap_gpio.c */
29
AspeedSDHCIState sdhci;
23
#define TYPE_OMAP1_GPIO "omap-gpio"
30
+ AspeedSDHCIState emmc;
24
-DECLARE_INSTANCE_CHECKER(struct omap_gpif_s, OMAP1_GPIO,
31
} AspeedSoCState;
25
+typedef struct Omap1GpioState Omap1GpioState;
32
26
+DECLARE_INSTANCE_CHECKER(Omap1GpioState, OMAP1_GPIO,
33
#define TYPE_ASPEED_SOC "aspeed-soc"
27
TYPE_OMAP1_GPIO)
34
@@ -XXX,XX +XXX,XX @@ enum {
28
35
ASPEED_MII4,
29
#define TYPE_OMAP2_GPIO "omap2-gpio"
36
ASPEED_SDRAM,
30
DECLARE_INSTANCE_CHECKER(struct omap2_gpif_s, OMAP2_GPIO,
37
ASPEED_XDMA,
31
TYPE_OMAP2_GPIO)
38
+ ASPEED_EMMC,
32
33
-typedef struct omap_gpif_s omap_gpif;
34
typedef struct omap2_gpif_s omap2_gpif;
35
36
/* TODO: clock framework (see above) */
37
-void omap_gpio_set_clk(omap_gpif *gpio, omap_clk clk);
38
+void omap_gpio_set_clk(Omap1GpioState *gpio, omap_clk clk);
39
40
void omap2_gpio_set_iclk(omap2_gpif *gpio, omap_clk clk);
41
void omap2_gpio_set_fclk(omap2_gpif *gpio, uint8_t i, omap_clk clk);
42
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/hw/gpio/omap_gpio.c
45
+++ b/hw/gpio/omap_gpio.c
46
@@ -XXX,XX +XXX,XX @@ struct omap_gpio_s {
47
uint16_t pins;
39
};
48
};
40
49
41
#endif /* ASPEED_SOC_H */
50
-struct omap_gpif_s {
42
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
51
+struct Omap1GpioState {
43
index XXXXXXX..XXXXXXX 100644
52
SysBusDevice parent_obj;
44
--- a/hw/arm/aspeed.c
53
45
+++ b/hw/arm/aspeed.c
54
MemoryRegion iomem;
46
@@ -XXX,XX +XXX,XX @@ static void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
55
@@ -XXX,XX +XXX,XX @@ struct omap_gpif_s {
56
/* General-Purpose I/O of OMAP1 */
57
static void omap_gpio_set(void *opaque, int line, int level)
58
{
59
- struct omap_gpif_s *p = opaque;
60
+ Omap1GpioState *p = opaque;
61
struct omap_gpio_s *s = &p->omap1;
62
uint16_t prev = s->inputs;
63
64
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap2_gpio_module_ops = {
65
66
static void omap_gpif_reset(DeviceState *dev)
67
{
68
- struct omap_gpif_s *s = OMAP1_GPIO(dev);
69
+ Omap1GpioState *s = OMAP1_GPIO(dev);
70
71
omap_gpio_reset(&s->omap1);
72
}
73
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap2_gpif_top_ops = {
74
static void omap_gpio_init(Object *obj)
75
{
76
DeviceState *dev = DEVICE(obj);
77
- struct omap_gpif_s *s = OMAP1_GPIO(obj);
78
+ Omap1GpioState *s = OMAP1_GPIO(obj);
79
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
80
81
qdev_init_gpio_in(dev, omap_gpio_set, 16);
82
@@ -XXX,XX +XXX,XX @@ static void omap_gpio_init(Object *obj)
83
84
static void omap_gpio_realize(DeviceState *dev, Error **errp)
85
{
86
- struct omap_gpif_s *s = OMAP1_GPIO(dev);
87
+ Omap1GpioState *s = OMAP1_GPIO(dev);
88
89
if (!s->clk) {
90
error_setg(errp, "omap-gpio: clk not connected");
91
@@ -XXX,XX +XXX,XX @@ static void omap2_gpio_realize(DeviceState *dev, Error **errp)
47
}
92
}
48
}
93
}
49
94
50
+static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
95
-void omap_gpio_set_clk(omap_gpif *gpio, omap_clk clk)
51
+{
96
+void omap_gpio_set_clk(Omap1GpioState *gpio, omap_clk clk)
52
+ DeviceState *card;
53
+
54
+ card = qdev_create(qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
55
+ TYPE_SD_CARD);
56
+ if (dinfo) {
57
+ qdev_prop_set_drive(card, "drive", blk_by_legacy_dinfo(dinfo),
58
+ &error_fatal);
59
+ }
60
+ object_property_set_bool(OBJECT(card), true, "realized", &error_fatal);
61
+}
62
+
63
static void aspeed_machine_init(MachineState *machine)
64
{
97
{
65
AspeedBoardState *bmc;
98
gpio->clk = clk;
66
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
67
}
68
69
for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
70
- SDHCIState *sdhci = &bmc->soc.sdhci.slots[i];
71
- DriveInfo *dinfo = drive_get_next(IF_SD);
72
- BlockBackend *blk;
73
- DeviceState *card;
74
+ sdhci_attach_drive(&bmc->soc.sdhci.slots[i], drive_get_next(IF_SD));
75
+ }
76
77
- blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
78
- card = qdev_create(qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
79
- TYPE_SD_CARD);
80
- qdev_prop_set_drive(card, "drive", blk, &error_fatal);
81
- object_property_set_bool(OBJECT(card), true, "realized", &error_fatal);
82
+ if (bmc->soc.emmc.num_slots) {
83
+ sdhci_attach_drive(&bmc->soc.emmc.slots[0], drive_get_next(IF_SD));
84
}
85
86
arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
87
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
88
index XXXXXXX..XXXXXXX 100644
89
--- a/hw/arm/aspeed_ast2600.c
90
+++ b/hw/arm/aspeed_ast2600.c
91
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2600_memmap[] = {
92
[ASPEED_ADC] = 0x1E6E9000,
93
[ASPEED_VIDEO] = 0x1E700000,
94
[ASPEED_SDHCI] = 0x1E740000,
95
+ [ASPEED_EMMC] = 0x1E750000,
96
[ASPEED_GPIO] = 0x1E780000,
97
[ASPEED_GPIO_1_8V] = 0x1E780800,
98
[ASPEED_RTC] = 0x1E781000,
99
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2600_memmap[] = {
100
101
#define ASPEED_SOC_AST2600_MAX_IRQ 128
102
103
+/* Shared Peripheral Interrupt values below are offset by -32 from datasheet */
104
static const int aspeed_soc_ast2600_irqmap[] = {
105
[ASPEED_UART1] = 47,
106
[ASPEED_UART2] = 48,
107
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2600_irqmap[] = {
108
[ASPEED_ADC] = 78,
109
[ASPEED_XDMA] = 6,
110
[ASPEED_SDHCI] = 43,
111
+ [ASPEED_EMMC] = 15,
112
[ASPEED_GPIO] = 40,
113
[ASPEED_GPIO_1_8V] = 11,
114
[ASPEED_RTC] = 13,
115
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
116
sysbus_init_child_obj(obj, "gpio_1_8v", OBJECT(&s->gpio_1_8v),
117
sizeof(s->gpio_1_8v), typename);
118
119
- sysbus_init_child_obj(obj, "sdc", OBJECT(&s->sdhci), sizeof(s->sdhci),
120
- TYPE_ASPEED_SDHCI);
121
+ sysbus_init_child_obj(obj, "sd-controller", OBJECT(&s->sdhci),
122
+ sizeof(s->sdhci), TYPE_ASPEED_SDHCI);
123
124
object_property_set_int(OBJECT(&s->sdhci), 2, "num-slots", &error_abort);
125
126
/* Init sd card slot class here so that they're under the correct parent */
127
for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
128
- sysbus_init_child_obj(obj, "sdhci[*]", OBJECT(&s->sdhci.slots[i]),
129
+ sysbus_init_child_obj(obj, "sd-controller.sdhci[*]",
130
+ OBJECT(&s->sdhci.slots[i]),
131
sizeof(s->sdhci.slots[i]), TYPE_SYSBUS_SDHCI);
132
}
133
+
134
+ sysbus_init_child_obj(obj, "emmc-controller", OBJECT(&s->emmc),
135
+ sizeof(s->emmc), TYPE_ASPEED_SDHCI);
136
+
137
+ object_property_set_int(OBJECT(&s->emmc), 1, "num-slots", &error_abort);
138
+
139
+ sysbus_init_child_obj(obj, "emmc-controller.sdhci",
140
+ OBJECT(&s->emmc.slots[0]), sizeof(s->emmc.slots[0]),
141
+ TYPE_SYSBUS_SDHCI);
142
}
99
}
143
100
144
/*
101
static Property omap_gpio_properties[] = {
145
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
102
- DEFINE_PROP_INT32("mpu_model", struct omap_gpif_s, mpu_model, 0),
146
sc->memmap[ASPEED_SDHCI]);
103
+ DEFINE_PROP_INT32("mpu_model", Omap1GpioState, mpu_model, 0),
147
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
104
DEFINE_PROP_END_OF_LIST(),
148
aspeed_soc_get_irq(s, ASPEED_SDHCI));
105
};
149
+
106
150
+ /* eMMC */
107
@@ -XXX,XX +XXX,XX @@ static void omap_gpio_class_init(ObjectClass *klass, void *data)
151
+ object_property_set_bool(OBJECT(&s->emmc), true, "realized", &err);
108
static const TypeInfo omap_gpio_info = {
152
+ if (err) {
109
.name = TYPE_OMAP1_GPIO,
153
+ error_propagate(errp, err);
110
.parent = TYPE_SYS_BUS_DEVICE,
154
+ return;
111
- .instance_size = sizeof(struct omap_gpif_s),
155
+ }
112
+ .instance_size = sizeof(Omap1GpioState),
156
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->emmc), 0, sc->memmap[ASPEED_EMMC]);
113
.instance_init = omap_gpio_init,
157
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->emmc), 0,
114
.class_init = omap_gpio_class_init,
158
+ aspeed_soc_get_irq(s, ASPEED_EMMC));
115
};
159
}
160
161
static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
162
--
116
--
163
2.20.1
117
2.34.1
164
118
165
119
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
kvm-no-adjvtime is a KVM specific CPU property and a first of its
3
Following docs/devel/style.rst guidelines, rename omap2_gpif_s ->
4
kind. To accommodate it we also add kvm_arm_add_vcpu_properties()
4
Omap2GpioState. This also remove a use of 'struct' in the
5
and a KVM specific CPU properties description to the CPU features
5
DECLARE_INSTANCE_CHECKER() macro call.
6
document.
7
6
8
Signed-off-by: Andrew Jones <drjones@redhat.com>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Message-id: 20200120101023.16030-7-drjones@redhat.com
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20230109140306.23161-6-philmd@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
11
---
13
include/hw/arm/virt.h | 1 +
12
include/hw/arm/omap.h | 9 ++++-----
14
target/arm/kvm_arm.h | 11 ++++++++++
13
hw/gpio/omap_gpio.c | 20 ++++++++++----------
15
hw/arm/virt.c | 8 ++++++++
14
2 files changed, 14 insertions(+), 15 deletions(-)
16
target/arm/cpu.c | 2 ++
17
target/arm/cpu64.c | 1 +
18
target/arm/kvm.c | 28 +++++++++++++++++++++++++
19
target/arm/monitor.c | 1 +
20
tests/qtest/arm-cpu-features.c | 4 ++++
21
docs/arm-cpu-features.rst | 37 +++++++++++++++++++++++++++++++++-
22
9 files changed, 92 insertions(+), 1 deletion(-)
23
15
24
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
16
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/arm/virt.h
18
--- a/include/hw/arm/omap.h
27
+++ b/include/hw/arm/virt.h
19
+++ b/include/hw/arm/omap.h
28
@@ -XXX,XX +XXX,XX @@ typedef struct {
20
@@ -XXX,XX +XXX,XX @@ DECLARE_INSTANCE_CHECKER(Omap1GpioState, OMAP1_GPIO,
29
bool smbios_old_sys_ver;
21
TYPE_OMAP1_GPIO)
30
bool no_highmem_ecam;
22
31
bool no_ged; /* Machines < 4.2 has no support for ACPI GED device */
23
#define TYPE_OMAP2_GPIO "omap2-gpio"
32
+ bool kvm_no_adjvtime;
24
-DECLARE_INSTANCE_CHECKER(struct omap2_gpif_s, OMAP2_GPIO,
33
} VirtMachineClass;
25
+typedef struct Omap2GpioState Omap2GpioState;
34
26
+DECLARE_INSTANCE_CHECKER(Omap2GpioState, OMAP2_GPIO,
35
typedef struct {
27
TYPE_OMAP2_GPIO)
36
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
28
29
-typedef struct omap2_gpif_s omap2_gpif;
30
-
31
/* TODO: clock framework (see above) */
32
void omap_gpio_set_clk(Omap1GpioState *gpio, omap_clk clk);
33
34
-void omap2_gpio_set_iclk(omap2_gpif *gpio, omap_clk clk);
35
-void omap2_gpio_set_fclk(omap2_gpif *gpio, uint8_t i, omap_clk clk);
36
+void omap2_gpio_set_iclk(Omap2GpioState *gpio, omap_clk clk);
37
+void omap2_gpio_set_fclk(Omap2GpioState *gpio, uint8_t i, omap_clk clk);
38
39
/* OMAP2 l4 Interconnect */
40
struct omap_l4_s;
41
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
37
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/kvm_arm.h
43
--- a/hw/gpio/omap_gpio.c
39
+++ b/target/arm/kvm_arm.h
44
+++ b/hw/gpio/omap_gpio.c
40
@@ -XXX,XX +XXX,XX @@ void kvm_arm_sve_get_vls(CPUState *cs, unsigned long *map);
45
@@ -XXX,XX +XXX,XX @@ struct omap2_gpio_s {
41
*/
46
uint8_t delay;
42
void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu);
47
};
43
48
44
+/**
49
-struct omap2_gpif_s {
45
+ * kvm_arm_add_vcpu_properties:
50
+struct Omap2GpioState {
46
+ * @obj: The CPU object to add the properties to
51
SysBusDevice parent_obj;
47
+ *
52
48
+ * Add all KVM specific CPU properties to the CPU object. These
53
MemoryRegion iomem;
49
+ * are the CPU properties with "kvm-" prefixed names.
54
@@ -XXX,XX +XXX,XX @@ static inline void omap2_gpio_module_int(struct omap2_gpio_s *s, int line)
50
+ */
55
51
+void kvm_arm_add_vcpu_properties(Object *obj);
56
static void omap2_gpio_set(void *opaque, int line, int level)
52
+
57
{
53
/**
58
- struct omap2_gpif_s *p = opaque;
54
* kvm_arm_aarch32_supported:
59
+ Omap2GpioState *p = opaque;
55
* @cs: CPUState
60
struct omap2_gpio_s *s = &p->modules[line >> 5];
56
@@ -XXX,XX +XXX,XX @@ static inline void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
61
57
cpu->host_cpu_probe_failed = true;
62
line &= 31;
63
@@ -XXX,XX +XXX,XX @@ static void omap_gpif_reset(DeviceState *dev)
64
65
static void omap2_gpif_reset(DeviceState *dev)
66
{
67
- struct omap2_gpif_s *s = OMAP2_GPIO(dev);
68
+ Omap2GpioState *s = OMAP2_GPIO(dev);
69
int i;
70
71
for (i = 0; i < s->modulecount; i++) {
72
@@ -XXX,XX +XXX,XX @@ static void omap2_gpif_reset(DeviceState *dev)
73
74
static uint64_t omap2_gpif_top_read(void *opaque, hwaddr addr, unsigned size)
75
{
76
- struct omap2_gpif_s *s = opaque;
77
+ Omap2GpioState *s = opaque;
78
79
switch (addr) {
80
case 0x00:    /* IPGENERICOCPSPL_REVISION */
81
@@ -XXX,XX +XXX,XX @@ static uint64_t omap2_gpif_top_read(void *opaque, hwaddr addr, unsigned size)
82
static void omap2_gpif_top_write(void *opaque, hwaddr addr,
83
uint64_t value, unsigned size)
84
{
85
- struct omap2_gpif_s *s = opaque;
86
+ Omap2GpioState *s = opaque;
87
88
switch (addr) {
89
case 0x00:    /* IPGENERICOCPSPL_REVISION */
90
@@ -XXX,XX +XXX,XX @@ static void omap_gpio_realize(DeviceState *dev, Error **errp)
91
92
static void omap2_gpio_realize(DeviceState *dev, Error **errp)
93
{
94
- struct omap2_gpif_s *s = OMAP2_GPIO(dev);
95
+ Omap2GpioState *s = OMAP2_GPIO(dev);
96
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
97
int i;
98
99
@@ -XXX,XX +XXX,XX @@ static const TypeInfo omap_gpio_info = {
100
.class_init = omap_gpio_class_init,
101
};
102
103
-void omap2_gpio_set_iclk(omap2_gpif *gpio, omap_clk clk)
104
+void omap2_gpio_set_iclk(Omap2GpioState *gpio, omap_clk clk)
105
{
106
gpio->iclk = clk;
58
}
107
}
59
108
60
+static inline void kvm_arm_add_vcpu_properties(Object *obj) {}
109
-void omap2_gpio_set_fclk(omap2_gpif *gpio, uint8_t i, omap_clk clk)
61
+
110
+void omap2_gpio_set_fclk(Omap2GpioState *gpio, uint8_t i, omap_clk clk)
62
static inline bool kvm_arm_aarch32_supported(CPUState *cs)
63
{
111
{
64
return false;
112
assert(i <= 5);
65
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
113
gpio->fclk[i] = clk;
66
index XXXXXXX..XXXXXXX 100644
67
--- a/hw/arm/virt.c
68
+++ b/hw/arm/virt.c
69
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
70
}
71
}
72
73
+ if (vmc->kvm_no_adjvtime &&
74
+ object_property_find(cpuobj, "kvm-no-adjvtime", NULL)) {
75
+ object_property_set_bool(cpuobj, true, "kvm-no-adjvtime", NULL);
76
+ }
77
+
78
if (vmc->no_pmu && object_property_find(cpuobj, "pmu", NULL)) {
79
object_property_set_bool(cpuobj, false, "pmu", NULL);
80
}
81
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 0)
82
83
static void virt_machine_4_2_options(MachineClass *mc)
84
{
85
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
86
+
87
virt_machine_5_0_options(mc);
88
compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
89
+ vmc->kvm_no_adjvtime = true;
90
}
114
}
91
DEFINE_VIRT_MACHINE(4, 2)
115
92
116
static Property omap2_gpio_properties[] = {
93
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
117
- DEFINE_PROP_INT32("mpu_model", struct omap2_gpif_s, mpu_model, 0),
94
index XXXXXXX..XXXXXXX 100644
118
+ DEFINE_PROP_INT32("mpu_model", Omap2GpioState, mpu_model, 0),
95
--- a/target/arm/cpu.c
119
DEFINE_PROP_END_OF_LIST(),
96
+++ b/target/arm/cpu.c
97
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
98
99
if (kvm_enabled()) {
100
kvm_arm_set_cpu_features_from_host(cpu);
101
+ kvm_arm_add_vcpu_properties(obj);
102
} else {
103
cortex_a15_initfn(obj);
104
105
@@ -XXX,XX +XXX,XX @@ static void arm_host_initfn(Object *obj)
106
if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
107
aarch64_add_sve_properties(obj);
108
}
109
+ kvm_arm_add_vcpu_properties(obj);
110
arm_cpu_post_init(obj);
111
}
112
113
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
114
index XXXXXXX..XXXXXXX 100644
115
--- a/target/arm/cpu64.c
116
+++ b/target/arm/cpu64.c
117
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
118
119
if (kvm_enabled()) {
120
kvm_arm_set_cpu_features_from_host(cpu);
121
+ kvm_arm_add_vcpu_properties(obj);
122
} else {
123
uint64_t t;
124
uint32_t u;
125
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
126
index XXXXXXX..XXXXXXX 100644
127
--- a/target/arm/kvm.c
128
+++ b/target/arm/kvm.c
129
@@ -XXX,XX +XXX,XX @@
130
#include "qemu/timer.h"
131
#include "qemu/error-report.h"
132
#include "qemu/main-loop.h"
133
+#include "qom/object.h"
134
+#include "qapi/error.h"
135
#include "sysemu/sysemu.h"
136
#include "sysemu/kvm.h"
137
#include "sysemu/kvm_int.h"
138
@@ -XXX,XX +XXX,XX @@ void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
139
env->features = arm_host_cpu_features.features;
140
}
141
142
+static bool kvm_no_adjvtime_get(Object *obj, Error **errp)
143
+{
144
+ return !ARM_CPU(obj)->kvm_adjvtime;
145
+}
146
+
147
+static void kvm_no_adjvtime_set(Object *obj, bool value, Error **errp)
148
+{
149
+ ARM_CPU(obj)->kvm_adjvtime = !value;
150
+}
151
+
152
+/* KVM VCPU properties should be prefixed with "kvm-". */
153
+void kvm_arm_add_vcpu_properties(Object *obj)
154
+{
155
+ if (!kvm_enabled()) {
156
+ return;
157
+ }
158
+
159
+ ARM_CPU(obj)->kvm_adjvtime = true;
160
+ object_property_add_bool(obj, "kvm-no-adjvtime", kvm_no_adjvtime_get,
161
+ kvm_no_adjvtime_set, &error_abort);
162
+ object_property_set_description(obj, "kvm-no-adjvtime",
163
+ "Set on to disable the adjustment of "
164
+ "the virtual counter. VM stopped time "
165
+ "will be counted.", &error_abort);
166
+}
167
+
168
bool kvm_arm_pmu_supported(CPUState *cpu)
169
{
170
return kvm_check_extension(cpu->kvm_state, KVM_CAP_ARM_PMU_V3);
171
diff --git a/target/arm/monitor.c b/target/arm/monitor.c
172
index XXXXXXX..XXXXXXX 100644
173
--- a/target/arm/monitor.c
174
+++ b/target/arm/monitor.c
175
@@ -XXX,XX +XXX,XX @@ static const char *cpu_model_advertised_features[] = {
176
"sve128", "sve256", "sve384", "sve512",
177
"sve640", "sve768", "sve896", "sve1024", "sve1152", "sve1280",
178
"sve1408", "sve1536", "sve1664", "sve1792", "sve1920", "sve2048",
179
+ "kvm-no-adjvtime",
180
NULL
181
};
120
};
182
121
183
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
122
@@ -XXX,XX +XXX,XX @@ static void omap2_gpio_class_init(ObjectClass *klass, void *data)
184
index XXXXXXX..XXXXXXX 100644
123
static const TypeInfo omap2_gpio_info = {
185
--- a/tests/qtest/arm-cpu-features.c
124
.name = TYPE_OMAP2_GPIO,
186
+++ b/tests/qtest/arm-cpu-features.c
125
.parent = TYPE_SYS_BUS_DEVICE,
187
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion(const void *data)
126
- .instance_size = sizeof(struct omap2_gpif_s),
188
assert_has_feature_enabled(qts, "cortex-a15", "pmu");
127
+ .instance_size = sizeof(Omap2GpioState),
189
assert_has_not_feature(qts, "cortex-a15", "aarch64");
128
.class_init = omap2_gpio_class_init,
190
129
};
191
+ assert_has_not_feature(qts, "max", "kvm-no-adjvtime");
192
+
193
if (g_str_equal(qtest_get_arch(), "aarch64")) {
194
assert_has_feature_enabled(qts, "max", "aarch64");
195
assert_has_feature_enabled(qts, "max", "sve");
196
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion_kvm(const void *data)
197
return;
198
}
199
200
+ assert_has_feature_disabled(qts, "host", "kvm-no-adjvtime");
201
+
202
if (g_str_equal(qtest_get_arch(), "aarch64")) {
203
bool kvm_supports_sve;
204
char max_name[8], name[8];
205
diff --git a/docs/arm-cpu-features.rst b/docs/arm-cpu-features.rst
206
index XXXXXXX..XXXXXXX 100644
207
--- a/docs/arm-cpu-features.rst
208
+++ b/docs/arm-cpu-features.rst
209
@@ -XXX,XX +XXX,XX @@ supporting the feature or only supporting the feature under certain
210
configurations. For example, the `aarch64` CPU feature, which, when
211
disabled, enables the optional AArch32 CPU feature, is only supported
212
when using the KVM accelerator and when running on a host CPU type that
213
-supports the feature.
214
+supports the feature. While `aarch64` currently only works with KVM,
215
+it could work with TCG. CPU features that are specific to KVM are
216
+prefixed with "kvm-" and are described in "KVM VCPU Features".
217
218
CPU Feature Probing
219
===================
220
@@ -XXX,XX +XXX,XX @@ disabling many SVE vector lengths would be quite verbose, the `sve<N>` CPU
221
properties have special semantics (see "SVE CPU Property Parsing
222
Semantics").
223
224
+KVM VCPU Features
225
+=================
226
+
227
+KVM VCPU features are CPU features that are specific to KVM, such as
228
+paravirt features or features that enable CPU virtualization extensions.
229
+The features' CPU properties are only available when KVM is enabled and
230
+are named with the prefix "kvm-". KVM VCPU features may be probed,
231
+enabled, and disabled in the same way as other CPU features. Below is
232
+the list of KVM VCPU features and their descriptions.
233
+
234
+ kvm-no-adjvtime By default kvm-no-adjvtime is disabled. This
235
+ means that by default the virtual time
236
+ adjustment is enabled (vtime is *not not*
237
+ adjusted).
238
+
239
+ When virtual time adjustment is enabled each
240
+ time the VM transitions back to running state
241
+ the VCPU's virtual counter is updated to ensure
242
+ stopped time is not counted. This avoids time
243
+ jumps surprising guest OSes and applications,
244
+ as long as they use the virtual counter for
245
+ timekeeping. However it has the side effect of
246
+ the virtual and physical counters diverging.
247
+ All timekeeping based on the virtual counter
248
+ will appear to lag behind any timekeeping that
249
+ does not subtract VM stopped time. The guest
250
+ may resynchronize its virtual counter with
251
+ other time sources as needed.
252
+
253
+ Enable kvm-no-adjvtime to disable virtual time
254
+ adjustment, also restoring the legacy (pre-5.0)
255
+ behavior.
256
+
257
SVE CPU Properties
258
==================
259
130
260
--
131
--
261
2.20.1
132
2.34.1
262
133
263
134
diff view generated by jsdifflib
New patch
1
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
3
Following docs/devel/style.rst guidelines, rename
4
omap_intr_handler_s -> OMAPIntcState. This also remove a
5
use of 'struct' in the DECLARE_INSTANCE_CHECKER() macro call.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109140306.23161-7-philmd@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
include/hw/arm/omap.h | 9 ++++-----
13
hw/intc/omap_intc.c | 38 +++++++++++++++++++-------------------
14
2 files changed, 23 insertions(+), 24 deletions(-)
15
16
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/omap.h
19
+++ b/include/hw/arm/omap.h
20
@@ -XXX,XX +XXX,XX @@ void omap_clk_reparent(omap_clk clk, omap_clk parent);
21
22
/* omap_intc.c */
23
#define TYPE_OMAP_INTC "common-omap-intc"
24
-typedef struct omap_intr_handler_s omap_intr_handler;
25
-DECLARE_INSTANCE_CHECKER(omap_intr_handler, OMAP_INTC,
26
- TYPE_OMAP_INTC)
27
+typedef struct OMAPIntcState OMAPIntcState;
28
+DECLARE_INSTANCE_CHECKER(OMAPIntcState, OMAP_INTC, TYPE_OMAP_INTC)
29
30
31
/*
32
@@ -XXX,XX +XXX,XX @@ DECLARE_INSTANCE_CHECKER(omap_intr_handler, OMAP_INTC,
33
* (ie the struct omap_mpu_state_s*) to do the clockname to pointer
34
* translation.)
35
*/
36
-void omap_intc_set_iclk(omap_intr_handler *intc, omap_clk clk);
37
-void omap_intc_set_fclk(omap_intr_handler *intc, omap_clk clk);
38
+void omap_intc_set_iclk(OMAPIntcState *intc, omap_clk clk);
39
+void omap_intc_set_fclk(OMAPIntcState *intc, omap_clk clk);
40
41
/* omap_i2c.c */
42
#define TYPE_OMAP_I2C "omap_i2c"
43
diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/intc/omap_intc.c
46
+++ b/hw/intc/omap_intc.c
47
@@ -XXX,XX +XXX,XX @@ struct omap_intr_handler_bank_s {
48
unsigned char priority[32];
49
};
50
51
-struct omap_intr_handler_s {
52
+struct OMAPIntcState {
53
SysBusDevice parent_obj;
54
55
qemu_irq *pins;
56
@@ -XXX,XX +XXX,XX @@ struct omap_intr_handler_s {
57
struct omap_intr_handler_bank_s bank[3];
58
};
59
60
-static void omap_inth_sir_update(struct omap_intr_handler_s *s, int is_fiq)
61
+static void omap_inth_sir_update(OMAPIntcState *s, int is_fiq)
62
{
63
int i, j, sir_intr, p_intr, p;
64
uint32_t level;
65
@@ -XXX,XX +XXX,XX @@ static void omap_inth_sir_update(struct omap_intr_handler_s *s, int is_fiq)
66
s->sir_intr[is_fiq] = sir_intr;
67
}
68
69
-static inline void omap_inth_update(struct omap_intr_handler_s *s, int is_fiq)
70
+static inline void omap_inth_update(OMAPIntcState *s, int is_fiq)
71
{
72
int i;
73
uint32_t has_intr = 0;
74
@@ -XXX,XX +XXX,XX @@ static inline void omap_inth_update(struct omap_intr_handler_s *s, int is_fiq)
75
76
static void omap_set_intr(void *opaque, int irq, int req)
77
{
78
- struct omap_intr_handler_s *ih = opaque;
79
+ OMAPIntcState *ih = opaque;
80
uint32_t rise;
81
82
struct omap_intr_handler_bank_s *bank = &ih->bank[irq >> 5];
83
@@ -XXX,XX +XXX,XX @@ static void omap_set_intr(void *opaque, int irq, int req)
84
/* Simplified version with no edge detection */
85
static void omap_set_intr_noedge(void *opaque, int irq, int req)
86
{
87
- struct omap_intr_handler_s *ih = opaque;
88
+ OMAPIntcState *ih = opaque;
89
uint32_t rise;
90
91
struct omap_intr_handler_bank_s *bank = &ih->bank[irq >> 5];
92
@@ -XXX,XX +XXX,XX @@ static void omap_set_intr_noedge(void *opaque, int irq, int req)
93
static uint64_t omap_inth_read(void *opaque, hwaddr addr,
94
unsigned size)
95
{
96
- struct omap_intr_handler_s *s = opaque;
97
+ OMAPIntcState *s = opaque;
98
int i, offset = addr;
99
int bank_no = offset >> 8;
100
int line_no;
101
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_inth_read(void *opaque, hwaddr addr,
102
static void omap_inth_write(void *opaque, hwaddr addr,
103
uint64_t value, unsigned size)
104
{
105
- struct omap_intr_handler_s *s = opaque;
106
+ OMAPIntcState *s = opaque;
107
int i, offset = addr;
108
int bank_no = offset >> 8;
109
struct omap_intr_handler_bank_s *bank = &s->bank[bank_no];
110
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap_inth_mem_ops = {
111
112
static void omap_inth_reset(DeviceState *dev)
113
{
114
- struct omap_intr_handler_s *s = OMAP_INTC(dev);
115
+ OMAPIntcState *s = OMAP_INTC(dev);
116
int i;
117
118
for (i = 0; i < s->nbanks; ++i){
119
@@ -XXX,XX +XXX,XX @@ static void omap_inth_reset(DeviceState *dev)
120
static void omap_intc_init(Object *obj)
121
{
122
DeviceState *dev = DEVICE(obj);
123
- struct omap_intr_handler_s *s = OMAP_INTC(obj);
124
+ OMAPIntcState *s = OMAP_INTC(obj);
125
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
126
127
s->nbanks = 1;
128
@@ -XXX,XX +XXX,XX @@ static void omap_intc_init(Object *obj)
129
130
static void omap_intc_realize(DeviceState *dev, Error **errp)
131
{
132
- struct omap_intr_handler_s *s = OMAP_INTC(dev);
133
+ OMAPIntcState *s = OMAP_INTC(dev);
134
135
if (!s->iclk) {
136
error_setg(errp, "omap-intc: clk not connected");
137
}
138
}
139
140
-void omap_intc_set_iclk(omap_intr_handler *intc, omap_clk clk)
141
+void omap_intc_set_iclk(OMAPIntcState *intc, omap_clk clk)
142
{
143
intc->iclk = clk;
144
}
145
146
-void omap_intc_set_fclk(omap_intr_handler *intc, omap_clk clk)
147
+void omap_intc_set_fclk(OMAPIntcState *intc, omap_clk clk)
148
{
149
intc->fclk = clk;
150
}
151
152
static Property omap_intc_properties[] = {
153
- DEFINE_PROP_UINT32("size", struct omap_intr_handler_s, size, 0x100),
154
+ DEFINE_PROP_UINT32("size", OMAPIntcState, size, 0x100),
155
DEFINE_PROP_END_OF_LIST(),
156
};
157
158
@@ -XXX,XX +XXX,XX @@ static const TypeInfo omap_intc_info = {
159
static uint64_t omap2_inth_read(void *opaque, hwaddr addr,
160
unsigned size)
161
{
162
- struct omap_intr_handler_s *s = opaque;
163
+ OMAPIntcState *s = opaque;
164
int offset = addr;
165
int bank_no, line_no;
166
struct omap_intr_handler_bank_s *bank = NULL;
167
@@ -XXX,XX +XXX,XX @@ static uint64_t omap2_inth_read(void *opaque, hwaddr addr,
168
static void omap2_inth_write(void *opaque, hwaddr addr,
169
uint64_t value, unsigned size)
170
{
171
- struct omap_intr_handler_s *s = opaque;
172
+ OMAPIntcState *s = opaque;
173
int offset = addr;
174
int bank_no, line_no;
175
struct omap_intr_handler_bank_s *bank = NULL;
176
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap2_inth_mem_ops = {
177
static void omap2_intc_init(Object *obj)
178
{
179
DeviceState *dev = DEVICE(obj);
180
- struct omap_intr_handler_s *s = OMAP_INTC(obj);
181
+ OMAPIntcState *s = OMAP_INTC(obj);
182
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
183
184
s->level_only = 1;
185
@@ -XXX,XX +XXX,XX @@ static void omap2_intc_init(Object *obj)
186
187
static void omap2_intc_realize(DeviceState *dev, Error **errp)
188
{
189
- struct omap_intr_handler_s *s = OMAP_INTC(dev);
190
+ OMAPIntcState *s = OMAP_INTC(dev);
191
192
if (!s->iclk) {
193
error_setg(errp, "omap2-intc: iclk not connected");
194
@@ -XXX,XX +XXX,XX @@ static void omap2_intc_realize(DeviceState *dev, Error **errp)
195
}
196
197
static Property omap2_intc_properties[] = {
198
- DEFINE_PROP_UINT8("revision", struct omap_intr_handler_s,
199
+ DEFINE_PROP_UINT8("revision", OMAPIntcState,
200
revision, 0x21),
201
DEFINE_PROP_END_OF_LIST(),
202
};
203
@@ -XXX,XX +XXX,XX @@ static const TypeInfo omap2_intc_info = {
204
static const TypeInfo omap_intc_type_info = {
205
.name = TYPE_OMAP_INTC,
206
.parent = TYPE_SYS_BUS_DEVICE,
207
- .instance_size = sizeof(omap_intr_handler),
208
+ .instance_size = sizeof(OMAPIntcState),
209
.abstract = true,
210
};
211
212
--
213
2.34.1
214
215
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
In qdev_set_parent_bus(), when changing the parent bus of a
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
realized device, if the source and destination buses are not in the
5
same reset state, some adaptations are required. This patch adds
6
needed call to resettable_change_parent() to make sure a device reset
7
state stays coherent with its parent bus.
8
9
The addition is a no-op if:
10
1. the device being parented is not realized.
11
2. the device is realized, but both buses are not under reset.
12
13
Case 2 means that as long as qdev_set_parent_bus() is called
14
during the machine realization procedure (which is before the
15
machine reset so nothing is in reset), it is a no op.
16
17
There are 52 call sites of qdev_set_parent_bus(). All but one fall
18
into the no-op case:
19
+ 29 trivial calls related to virtio (in hw/{s390x,display,virtio}/
20
{vhost,virtio}-xxx.c) to set a vdev(or vgpu) composing device
21
parent bus just before realizing the same vdev(vgpu).
22
+ hw/core/qdev.c: when creating a device in qdev_try_create()
23
+ hw/core/sysbus.c: when initializing a device in the sysbus
24
+ hw/i386/amd_iommu.c: before realizing AMDVIState/pci
25
+ hw/isa/piix4.c: before realizing PIIX4State/rtc
26
+ hw/misc/auxbus.c: when creating an AUXBus
27
+ hw/misc/auxbus.c: when creating an AUXBus child
28
+ hw/misc/macio/macio.c: when initializing a MACIOState child
29
+ hw/misc/macio/macio.c: before realizing NewWorldMacIOState/pmu
30
+ hw/misc/macio/macio.c: before realizing NewWorldMacIOState/cuda
31
+ hw/net/virtio-net.c: Used for migration when using the failover
32
mechanism to migration a vfio-pci/net. It is
33
a no-op because at this point the device is
34
already on the bus.
35
+ hw/pci-host/designware.c: before realizing DesignwarePCIEHost/root
36
+ hw/pci-host/gpex.c: before realizing GPEXHost/root
37
+ hw/pci-host/prep.c: when initialiazing PREPPCIState/pci_dev
38
+ hw/pci-host/q35.c: before realizing Q35PCIHost/mch
39
+ hw/pci-host/versatile.c: when initializing PCIVPBState/pci_dev
40
+ hw/pci-host/xilinx-pcie.c: before realizing XilinxPCIEHost/root
41
+ hw/s390x/event-facility.c: when creating SCLPEventFacility/
42
TYPE_SCLP_QUIESCE
43
+ hw/s390x/event-facility.c: ditto with SCLPEventFacility/
44
TYPE_SCLP_CPU_HOTPLUG
45
+ hw/s390x/sclp.c: Not trivial because it is called on a SLCPDevice
46
just after realizing it. Ok because at this point the destination
47
bus (sysbus) is not in reset; the realize step is before the
48
machine reset.
49
+ hw/sd/core.c: Not OK. Used in sdbus_reparent_card(). See below.
50
+ hw/ssi/ssi.c: Used to put spi slave on spi bus and connect the cs
51
line in ssi_auto_connect_slave(). Ok because this function is only
52
used in realize step in hw/ssi/aspeed_smc.ci, hw/ssi/imx_spi.c,
53
hw/ssi/mss-spi.c, hw/ssi/xilinx_spi.c and hw/ssi/xilinx_spips.c.
54
+ hw/xen/xen-legacy-backend.c: when creating a XenLegacyDevice device
55
+ qdev-monitor.c: in device hotplug creation procedure before realize
56
57
Note that this commit alone will have no effect, right now there is no
58
use of resettable API to reset anything. So a bus will never be tagged
59
as in-reset by this same API.
60
61
The one place where side-effect will occurs is in hw/sd/core.c in
62
sdbus_reparent_card(). This function is only used in the raspi machines,
63
including during the sysbus reset procedure. This case will be
64
carrefully handled when doing the multiple phase reset transition.
65
66
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
67
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
68
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
69
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
5
Message-id: 20230109140306.23161-8-philmd@linaro.org
70
Message-id: 20200123132823.1117486-7-damien.hedde@greensocs.com
71
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
72
---
7
---
73
hw/core/qdev.c | 16 +++++++++++-----
8
hw/arm/stellaris.c | 6 +++---
74
1 file changed, 11 insertions(+), 5 deletions(-)
9
1 file changed, 3 insertions(+), 3 deletions(-)
75
10
76
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
11
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
77
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
78
--- a/hw/core/qdev.c
13
--- a/hw/arm/stellaris.c
79
+++ b/hw/core/qdev.c
14
+++ b/hw/arm/stellaris.c
80
@@ -XXX,XX +XXX,XX @@ static void bus_add_child(BusState *bus, DeviceState *child)
15
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_update(stellaris_adc_state *s)
81
16
82
void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
17
static void stellaris_adc_trigger(void *opaque, int irq, int level)
83
{
18
{
84
- bool replugging = dev->parent_bus != NULL;
19
- stellaris_adc_state *s = (stellaris_adc_state *)opaque;
85
+ BusState *old_parent_bus = dev->parent_bus;
20
+ stellaris_adc_state *s = opaque;
86
21
int n;
87
- if (replugging) {
22
88
+ if (old_parent_bus) {
23
for (n = 0; n < 4; n++) {
89
trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
24
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_reset(stellaris_adc_state *s)
90
- dev->parent_bus, object_get_typename(OBJECT(dev->parent_bus)),
25
static uint64_t stellaris_adc_read(void *opaque, hwaddr offset,
91
+ old_parent_bus, object_get_typename(OBJECT(old_parent_bus)),
26
unsigned size)
92
OBJECT(bus), object_get_typename(OBJECT(bus)));
27
{
93
/*
28
- stellaris_adc_state *s = (stellaris_adc_state *)opaque;
94
* Keep a reference to the device while it's not plugged into
29
+ stellaris_adc_state *s = opaque;
95
* any bus, to avoid it potentially evaporating when it is
30
96
* dereffed in bus_remove_child().
31
/* TODO: Implement this. */
97
+ * Also keep the ref of the parent bus until the end, so that
32
if (offset >= 0x40 && offset < 0xc0) {
98
+ * we can safely call resettable_change_parent() below.
33
@@ -XXX,XX +XXX,XX @@ static uint64_t stellaris_adc_read(void *opaque, hwaddr offset,
99
*/
34
static void stellaris_adc_write(void *opaque, hwaddr offset,
100
object_ref(OBJECT(dev));
35
uint64_t value, unsigned size)
101
bus_remove_child(dev->parent_bus, dev);
36
{
102
- object_unref(OBJECT(dev->parent_bus));
37
- stellaris_adc_state *s = (stellaris_adc_state *)opaque;
103
}
38
+ stellaris_adc_state *s = opaque;
104
dev->parent_bus = bus;
39
105
object_ref(OBJECT(bus));
40
/* TODO: Implement this. */
106
bus_add_child(bus, dev);
41
if (offset >= 0x40 && offset < 0xc0) {
107
- if (replugging) {
108
+ if (dev->realized) {
109
+ resettable_change_parent(OBJECT(dev), OBJECT(bus),
110
+ OBJECT(old_parent_bus));
111
+ }
112
+ if (old_parent_bus) {
113
+ object_unref(OBJECT(old_parent_bus));
114
object_unref(OBJECT(dev));
115
}
116
}
117
--
42
--
118
2.20.1
43
2.34.1
119
44
120
45
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Deprecate device_legacy_reset(), qdev_reset_all() and
3
Following docs/devel/style.rst guidelines, rename
4
qbus_reset_all() to be replaced by new functions
4
stellaris_adc_state -> StellarisADCState. This also remove a
5
device_cold_reset() and bus_cold_reset() which uses resettable API.
5
use of 'struct' in the DECLARE_INSTANCE_CHECKER() macro call.
6
6
7
Also introduce resettable_cold_reset_fn() which may be used as a
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
replacement for qdev_reset_all_fn and qbus_reset_all_fn().
9
10
Following patches will be needed to look at legacy reset call sites
11
and switch to resettable api. The legacy functions will be removed
12
when unused.
13
14
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
15
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20230109140306.23161-9-philmd@linaro.org
19
Message-id: 20200123132823.1117486-9-damien.hedde@greensocs.com
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
11
---
22
include/hw/qdev-core.h | 27 +++++++++++++++++++++++++++
12
hw/arm/stellaris.c | 73 +++++++++++++++++++++++-----------------------
23
include/hw/resettable.h | 9 +++++++++
13
1 file changed, 36 insertions(+), 37 deletions(-)
24
hw/core/bus.c | 5 +++++
25
hw/core/qdev.c | 5 +++++
26
hw/core/resettable.c | 5 +++++
27
5 files changed, 51 insertions(+)
28
14
29
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
15
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
30
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
31
--- a/include/hw/qdev-core.h
17
--- a/hw/arm/stellaris.c
32
+++ b/include/hw/qdev-core.h
18
+++ b/hw/arm/stellaris.c
33
@@ -XXX,XX +XXX,XX @@ int qdev_walk_children(DeviceState *dev,
19
@@ -XXX,XX +XXX,XX @@ static void stellaris_i2c_init(Object *obj)
34
qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
20
#define STELLARIS_ADC_FIFO_FULL 0x1000
35
void *opaque);
21
36
22
#define TYPE_STELLARIS_ADC "stellaris-adc"
37
+/**
23
-typedef struct StellarisADCState stellaris_adc_state;
38
+ * @qdev_reset_all:
24
-DECLARE_INSTANCE_CHECKER(stellaris_adc_state, STELLARIS_ADC,
39
+ * Reset @dev. See @qbus_reset_all() for more details.
25
- TYPE_STELLARIS_ADC)
40
+ *
26
+typedef struct StellarisADCState StellarisADCState;
41
+ * Note: This function is deprecated and will be removed when it becomes unused.
27
+DECLARE_INSTANCE_CHECKER(StellarisADCState, STELLARIS_ADC, TYPE_STELLARIS_ADC)
42
+ * Please use device_cold_reset() now.
28
43
+ */
29
struct StellarisADCState {
44
void qdev_reset_all(DeviceState *dev);
30
SysBusDevice parent_obj;
45
void qdev_reset_all_fn(void *opaque);
31
@@ -XXX,XX +XXX,XX @@ struct StellarisADCState {
46
32
qemu_irq irq[4];
47
@@ -XXX,XX +XXX,XX @@ void qdev_reset_all_fn(void *opaque);
33
};
48
* hard reset means that qbus_reset_all will reset all state of the device.
34
49
* For PCI devices, for example, this will include the base address registers
35
-static uint32_t stellaris_adc_fifo_read(stellaris_adc_state *s, int n)
50
* or configuration space.
36
+static uint32_t stellaris_adc_fifo_read(StellarisADCState *s, int n)
51
+ *
37
{
52
+ * Note: This function is deprecated and will be removed when it becomes unused.
38
int tail;
53
+ * Please use bus_cold_reset() now.
39
54
*/
40
@@ -XXX,XX +XXX,XX @@ static uint32_t stellaris_adc_fifo_read(stellaris_adc_state *s, int n)
55
void qbus_reset_all(BusState *bus);
41
return s->fifo[n].data[tail];
56
void qbus_reset_all_fn(void *opaque);
57
58
+/**
59
+ * device_cold_reset:
60
+ * Reset device @dev and perform a recursive processing using the resettable
61
+ * interface. It triggers a RESET_TYPE_COLD.
62
+ */
63
+void device_cold_reset(DeviceState *dev);
64
+
65
+/**
66
+ * bus_cold_reset:
67
+ *
68
+ * Reset bus @bus and perform a recursive processing using the resettable
69
+ * interface. It triggers a RESET_TYPE_COLD.
70
+ */
71
+void bus_cold_reset(BusState *bus);
72
+
73
/**
74
* device_is_in_reset:
75
* Return true if the device @dev is currently being reset.
76
@@ -XXX,XX +XXX,XX @@ void qdev_machine_init(void);
77
* device_legacy_reset:
78
*
79
* Reset a single device (by calling the reset method).
80
+ * Note: This function is deprecated and will be removed when it becomes unused.
81
+ * Please use device_cold_reset() now.
82
*/
83
void device_legacy_reset(DeviceState *dev);
84
85
diff --git a/include/hw/resettable.h b/include/hw/resettable.h
86
index XXXXXXX..XXXXXXX 100644
87
--- a/include/hw/resettable.h
88
+++ b/include/hw/resettable.h
89
@@ -XXX,XX +XXX,XX @@ bool resettable_is_in_reset(Object *obj);
90
*/
91
void resettable_change_parent(Object *obj, Object *newp, Object *oldp);
92
93
+/**
94
+ * resettable_cold_reset_fn:
95
+ * Helper to call resettable_reset((Object *) opaque, RESET_TYPE_COLD).
96
+ *
97
+ * This function is typically useful to register a reset handler with
98
+ * qemu_register_reset.
99
+ */
100
+void resettable_cold_reset_fn(void *opaque);
101
+
102
/**
103
* resettable_class_set_parent_phases:
104
*
105
diff --git a/hw/core/bus.c b/hw/core/bus.c
106
index XXXXXXX..XXXXXXX 100644
107
--- a/hw/core/bus.c
108
+++ b/hw/core/bus.c
109
@@ -XXX,XX +XXX,XX @@ int qbus_walk_children(BusState *bus,
110
return 0;
111
}
42
}
112
43
113
+void bus_cold_reset(BusState *bus)
44
-static void stellaris_adc_fifo_write(stellaris_adc_state *s, int n,
114
+{
45
+static void stellaris_adc_fifo_write(StellarisADCState *s, int n,
115
+ resettable_reset(OBJECT(bus), RESET_TYPE_COLD);
46
uint32_t value)
116
+}
117
+
118
bool bus_is_in_reset(BusState *bus)
119
{
47
{
120
return resettable_is_in_reset(OBJECT(bus));
48
int head;
121
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
49
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_fifo_write(stellaris_adc_state *s, int n,
122
index XXXXXXX..XXXXXXX 100644
50
s->fifo[n].state |= STELLARIS_ADC_FIFO_FULL;
123
--- a/hw/core/qdev.c
124
+++ b/hw/core/qdev.c
125
@@ -XXX,XX +XXX,XX @@ void qbus_reset_all_fn(void *opaque)
126
qbus_reset_all(bus);
127
}
51
}
128
52
129
+void device_cold_reset(DeviceState *dev)
53
-static void stellaris_adc_update(stellaris_adc_state *s)
130
+{
54
+static void stellaris_adc_update(StellarisADCState *s)
131
+ resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
132
+}
133
+
134
bool device_is_in_reset(DeviceState *dev)
135
{
55
{
136
return resettable_is_in_reset(OBJECT(dev));
56
int level;
137
diff --git a/hw/core/resettable.c b/hw/core/resettable.c
57
int n;
138
index XXXXXXX..XXXXXXX 100644
58
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_update(stellaris_adc_state *s)
139
--- a/hw/core/resettable.c
59
140
+++ b/hw/core/resettable.c
60
static void stellaris_adc_trigger(void *opaque, int irq, int level)
141
@@ -XXX,XX +XXX,XX @@ void resettable_change_parent(Object *obj, Object *newp, Object *oldp)
61
{
62
- stellaris_adc_state *s = opaque;
63
+ StellarisADCState *s = opaque;
64
int n;
65
66
for (n = 0; n < 4; n++) {
67
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_trigger(void *opaque, int irq, int level)
142
}
68
}
143
}
69
}
144
70
145
+void resettable_cold_reset_fn(void *opaque)
71
-static void stellaris_adc_reset(stellaris_adc_state *s)
146
+{
72
+static void stellaris_adc_reset(StellarisADCState *s)
147
+ resettable_reset((Object *) opaque, RESET_TYPE_COLD);
73
{
148
+}
74
int n;
149
+
75
150
void resettable_class_set_parent_phases(ResettableClass *rc,
76
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_reset(stellaris_adc_state *s)
151
ResettableEnterPhase enter,
77
static uint64_t stellaris_adc_read(void *opaque, hwaddr offset,
152
ResettableHoldPhase hold,
78
unsigned size)
79
{
80
- stellaris_adc_state *s = opaque;
81
+ StellarisADCState *s = opaque;
82
83
/* TODO: Implement this. */
84
if (offset >= 0x40 && offset < 0xc0) {
85
@@ -XXX,XX +XXX,XX @@ static uint64_t stellaris_adc_read(void *opaque, hwaddr offset,
86
static void stellaris_adc_write(void *opaque, hwaddr offset,
87
uint64_t value, unsigned size)
88
{
89
- stellaris_adc_state *s = opaque;
90
+ StellarisADCState *s = opaque;
91
92
/* TODO: Implement this. */
93
if (offset >= 0x40 && offset < 0xc0) {
94
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_stellaris_adc = {
95
.version_id = 1,
96
.minimum_version_id = 1,
97
.fields = (VMStateField[]) {
98
- VMSTATE_UINT32(actss, stellaris_adc_state),
99
- VMSTATE_UINT32(ris, stellaris_adc_state),
100
- VMSTATE_UINT32(im, stellaris_adc_state),
101
- VMSTATE_UINT32(emux, stellaris_adc_state),
102
- VMSTATE_UINT32(ostat, stellaris_adc_state),
103
- VMSTATE_UINT32(ustat, stellaris_adc_state),
104
- VMSTATE_UINT32(sspri, stellaris_adc_state),
105
- VMSTATE_UINT32(sac, stellaris_adc_state),
106
- VMSTATE_UINT32(fifo[0].state, stellaris_adc_state),
107
- VMSTATE_UINT32_ARRAY(fifo[0].data, stellaris_adc_state, 16),
108
- VMSTATE_UINT32(ssmux[0], stellaris_adc_state),
109
- VMSTATE_UINT32(ssctl[0], stellaris_adc_state),
110
- VMSTATE_UINT32(fifo[1].state, stellaris_adc_state),
111
- VMSTATE_UINT32_ARRAY(fifo[1].data, stellaris_adc_state, 16),
112
- VMSTATE_UINT32(ssmux[1], stellaris_adc_state),
113
- VMSTATE_UINT32(ssctl[1], stellaris_adc_state),
114
- VMSTATE_UINT32(fifo[2].state, stellaris_adc_state),
115
- VMSTATE_UINT32_ARRAY(fifo[2].data, stellaris_adc_state, 16),
116
- VMSTATE_UINT32(ssmux[2], stellaris_adc_state),
117
- VMSTATE_UINT32(ssctl[2], stellaris_adc_state),
118
- VMSTATE_UINT32(fifo[3].state, stellaris_adc_state),
119
- VMSTATE_UINT32_ARRAY(fifo[3].data, stellaris_adc_state, 16),
120
- VMSTATE_UINT32(ssmux[3], stellaris_adc_state),
121
- VMSTATE_UINT32(ssctl[3], stellaris_adc_state),
122
- VMSTATE_UINT32(noise, stellaris_adc_state),
123
+ VMSTATE_UINT32(actss, StellarisADCState),
124
+ VMSTATE_UINT32(ris, StellarisADCState),
125
+ VMSTATE_UINT32(im, StellarisADCState),
126
+ VMSTATE_UINT32(emux, StellarisADCState),
127
+ VMSTATE_UINT32(ostat, StellarisADCState),
128
+ VMSTATE_UINT32(ustat, StellarisADCState),
129
+ VMSTATE_UINT32(sspri, StellarisADCState),
130
+ VMSTATE_UINT32(sac, StellarisADCState),
131
+ VMSTATE_UINT32(fifo[0].state, StellarisADCState),
132
+ VMSTATE_UINT32_ARRAY(fifo[0].data, StellarisADCState, 16),
133
+ VMSTATE_UINT32(ssmux[0], StellarisADCState),
134
+ VMSTATE_UINT32(ssctl[0], StellarisADCState),
135
+ VMSTATE_UINT32(fifo[1].state, StellarisADCState),
136
+ VMSTATE_UINT32_ARRAY(fifo[1].data, StellarisADCState, 16),
137
+ VMSTATE_UINT32(ssmux[1], StellarisADCState),
138
+ VMSTATE_UINT32(ssctl[1], StellarisADCState),
139
+ VMSTATE_UINT32(fifo[2].state, StellarisADCState),
140
+ VMSTATE_UINT32_ARRAY(fifo[2].data, StellarisADCState, 16),
141
+ VMSTATE_UINT32(ssmux[2], StellarisADCState),
142
+ VMSTATE_UINT32(ssctl[2], StellarisADCState),
143
+ VMSTATE_UINT32(fifo[3].state, StellarisADCState),
144
+ VMSTATE_UINT32_ARRAY(fifo[3].data, StellarisADCState, 16),
145
+ VMSTATE_UINT32(ssmux[3], StellarisADCState),
146
+ VMSTATE_UINT32(ssctl[3], StellarisADCState),
147
+ VMSTATE_UINT32(noise, StellarisADCState),
148
VMSTATE_END_OF_LIST()
149
}
150
};
151
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_stellaris_adc = {
152
static void stellaris_adc_init(Object *obj)
153
{
154
DeviceState *dev = DEVICE(obj);
155
- stellaris_adc_state *s = STELLARIS_ADC(obj);
156
+ StellarisADCState *s = STELLARIS_ADC(obj);
157
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
158
int n;
159
160
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_class_init(ObjectClass *klass, void *data)
161
static const TypeInfo stellaris_adc_info = {
162
.name = TYPE_STELLARIS_ADC,
163
.parent = TYPE_SYS_BUS_DEVICE,
164
- .instance_size = sizeof(stellaris_adc_state),
165
+ .instance_size = sizeof(StellarisADCState),
166
.instance_init = stellaris_adc_init,
167
.class_init = stellaris_adc_class_init,
168
};
153
--
169
--
154
2.20.1
170
2.34.1
155
171
156
172
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
These buffers should be aligned on 16 bytes.
3
The typedef and definitions are generated by the OBJECT_DECLARE_TYPE
4
macro in "hw/arm/bcm2836.h":
4
5
5
Ignore invalid RX and TX buffer addresses and log an error. All
6
20 #define TYPE_BCM283X "bcm283x"
6
incoming and outgoing traffic will be dropped because no valid RX or
7
21 OBJECT_DECLARE_TYPE(BCM283XState, BCM283XClass, BCM283X)
7
TX descriptors will be available.
8
8
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
The script ran in commit a489d1951c ("Use OBJECT_DECLARE_TYPE when
10
Message-id: 20200114103433.30534-4-clg@kaod.org
10
possible") missed them because they are declared in a different
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
file unit. Remove them.
12
13
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20230109140306.23161-10-philmd@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
17
---
14
hw/net/ftgmac100.c | 13 +++++++++++++
18
hw/arm/bcm2836.c | 9 ++-------
15
1 file changed, 13 insertions(+)
19
1 file changed, 2 insertions(+), 7 deletions(-)
16
20
17
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
21
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
18
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/net/ftgmac100.c
23
--- a/hw/arm/bcm2836.c
20
+++ b/hw/net/ftgmac100.c
24
+++ b/hw/arm/bcm2836.c
21
@@ -XXX,XX +XXX,XX @@ typedef struct {
25
@@ -XXX,XX +XXX,XX @@
22
uint32_t des3;
26
#include "hw/arm/raspi_platform.h"
23
} FTGMAC100Desc;
27
#include "hw/sysbus.h"
24
28
25
+#define FTGMAC100_DESC_ALIGNMENT 16
29
-typedef struct BCM283XClass {
26
+
30
+struct BCM283XClass {
27
/*
31
/*< private >*/
28
* Specific RTL8211E MII Registers
32
DeviceClass parent_class;
29
*/
33
/*< public >*/
30
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_write(void *opaque, hwaddr addr,
34
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XClass {
31
s->itc = value;
35
hwaddr peri_base; /* Peripheral base address seen by the CPU */
32
break;
36
hwaddr ctrl_base; /* Interrupt controller and mailboxes etc. */
33
case FTGMAC100_RXR_BADR: /* Ring buffer address */
37
int clusterid;
34
+ if (!QEMU_IS_ALIGNED(value, FTGMAC100_DESC_ALIGNMENT)) {
38
-} BCM283XClass;
35
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad RX buffer alignment 0x%"
39
-
36
+ HWADDR_PRIx "\n", __func__, value);
40
-#define BCM283X_CLASS(klass) \
37
+ return;
41
- OBJECT_CLASS_CHECK(BCM283XClass, (klass), TYPE_BCM283X)
38
+ }
42
-#define BCM283X_GET_CLASS(obj) \
39
+
43
- OBJECT_GET_CLASS(BCM283XClass, (obj), TYPE_BCM283X)
40
s->rx_ring = value;
44
+};
41
s->rx_descriptor = s->rx_ring;
45
42
break;
46
static Property bcm2836_enabled_cores_property =
43
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_write(void *opaque, hwaddr addr,
47
DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus, 0);
44
break;
45
46
case FTGMAC100_NPTXR_BADR: /* Transmit buffer address */
47
+ if (!QEMU_IS_ALIGNED(value, FTGMAC100_DESC_ALIGNMENT)) {
48
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad TX buffer alignment 0x%"
49
+ HWADDR_PRIx "\n", __func__, value);
50
+ return;
51
+ }
52
s->tx_ring = value;
53
s->tx_descriptor = s->tx_ring;
54
break;
55
--
48
--
56
2.20.1
49
2.34.1
57
50
58
51
diff view generated by jsdifflib
New patch
1
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
3
NPCM7XX models have been commited after the conversion from
4
commit 8063396bf3 ("Use OBJECT_DECLARE_SIMPLE_TYPE when possible").
5
Manually convert them.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109140306.23161-11-philmd@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
include/hw/adc/npcm7xx_adc.h | 7 +++----
13
include/hw/arm/npcm7xx.h | 18 ++++++------------
14
include/hw/i2c/npcm7xx_smbus.h | 7 +++----
15
include/hw/misc/npcm7xx_clk.h | 2 +-
16
include/hw/misc/npcm7xx_gcr.h | 6 +++---
17
include/hw/misc/npcm7xx_mft.h | 7 +++----
18
include/hw/misc/npcm7xx_pwm.h | 3 +--
19
include/hw/misc/npcm7xx_rng.h | 6 +++---
20
include/hw/net/npcm7xx_emc.h | 5 +----
21
include/hw/sd/npcm7xx_sdhci.h | 4 ++--
22
10 files changed, 26 insertions(+), 39 deletions(-)
23
24
diff --git a/include/hw/adc/npcm7xx_adc.h b/include/hw/adc/npcm7xx_adc.h
25
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/adc/npcm7xx_adc.h
27
+++ b/include/hw/adc/npcm7xx_adc.h
28
@@ -XXX,XX +XXX,XX @@
29
* @iref: The internal reference voltage, initialized at launch time.
30
* @rv: The calibrated output values of 0.5V and 1.5V for the ADC.
31
*/
32
-typedef struct {
33
+struct NPCM7xxADCState {
34
SysBusDevice parent;
35
36
MemoryRegion iomem;
37
@@ -XXX,XX +XXX,XX @@ typedef struct {
38
uint32_t iref;
39
40
uint16_t calibration_r_values[NPCM7XX_ADC_NUM_CALIB];
41
-} NPCM7xxADCState;
42
+};
43
44
#define TYPE_NPCM7XX_ADC "npcm7xx-adc"
45
-#define NPCM7XX_ADC(obj) \
46
- OBJECT_CHECK(NPCM7xxADCState, (obj), TYPE_NPCM7XX_ADC)
47
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxADCState, NPCM7XX_ADC)
48
49
#endif /* NPCM7XX_ADC_H */
50
diff --git a/include/hw/arm/npcm7xx.h b/include/hw/arm/npcm7xx.h
51
index XXXXXXX..XXXXXXX 100644
52
--- a/include/hw/arm/npcm7xx.h
53
+++ b/include/hw/arm/npcm7xx.h
54
@@ -XXX,XX +XXX,XX @@
55
56
#define NPCM7XX_NR_PWM_MODULES 2
57
58
-typedef struct NPCM7xxMachine {
59
+struct NPCM7xxMachine {
60
MachineState parent;
61
/*
62
* PWM fan splitter. each splitter connects to one PWM output and
63
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxMachine {
64
*/
65
SplitIRQ fan_splitter[NPCM7XX_NR_PWM_MODULES *
66
NPCM7XX_PWM_PER_MODULE];
67
-} NPCM7xxMachine;
68
+};
69
70
#define TYPE_NPCM7XX_MACHINE MACHINE_TYPE_NAME("npcm7xx")
71
-#define NPCM7XX_MACHINE(obj) \
72
- OBJECT_CHECK(NPCM7xxMachine, (obj), TYPE_NPCM7XX_MACHINE)
73
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxMachine, NPCM7XX_MACHINE)
74
75
typedef struct NPCM7xxMachineClass {
76
MachineClass parent;
77
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxMachineClass {
78
#define NPCM7XX_MACHINE_GET_CLASS(obj) \
79
OBJECT_GET_CLASS(NPCM7xxMachineClass, (obj), TYPE_NPCM7XX_MACHINE)
80
81
-typedef struct NPCM7xxState {
82
+struct NPCM7xxState {
83
DeviceState parent;
84
85
ARMCPU cpu[NPCM7XX_MAX_NUM_CPUS];
86
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxState {
87
NPCM7xxFIUState fiu[2];
88
NPCM7xxEMCState emc[2];
89
NPCM7xxSDHCIState mmc;
90
-} NPCM7xxState;
91
+};
92
93
#define TYPE_NPCM7XX "npcm7xx"
94
-#define NPCM7XX(obj) OBJECT_CHECK(NPCM7xxState, (obj), TYPE_NPCM7XX)
95
+OBJECT_DECLARE_TYPE(NPCM7xxState, NPCM7xxClass, NPCM7XX)
96
97
#define TYPE_NPCM730 "npcm730"
98
#define TYPE_NPCM750 "npcm750"
99
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxClass {
100
uint32_t num_cpus;
101
} NPCM7xxClass;
102
103
-#define NPCM7XX_CLASS(klass) \
104
- OBJECT_CLASS_CHECK(NPCM7xxClass, (klass), TYPE_NPCM7XX)
105
-#define NPCM7XX_GET_CLASS(obj) \
106
- OBJECT_GET_CLASS(NPCM7xxClass, (obj), TYPE_NPCM7XX)
107
-
108
/**
109
* npcm7xx_load_kernel - Loads memory with everything needed to boot
110
* @machine - The machine containing the SoC to be booted.
111
diff --git a/include/hw/i2c/npcm7xx_smbus.h b/include/hw/i2c/npcm7xx_smbus.h
112
index XXXXXXX..XXXXXXX 100644
113
--- a/include/hw/i2c/npcm7xx_smbus.h
114
+++ b/include/hw/i2c/npcm7xx_smbus.h
115
@@ -XXX,XX +XXX,XX @@ typedef enum NPCM7xxSMBusStatus {
116
* @rx_cur: The current position of rx_fifo.
117
* @status: The current status of the SMBus.
118
*/
119
-typedef struct NPCM7xxSMBusState {
120
+struct NPCM7xxSMBusState {
121
SysBusDevice parent;
122
123
MemoryRegion iomem;
124
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxSMBusState {
125
uint8_t rx_cur;
126
127
NPCM7xxSMBusStatus status;
128
-} NPCM7xxSMBusState;
129
+};
130
131
#define TYPE_NPCM7XX_SMBUS "npcm7xx-smbus"
132
-#define NPCM7XX_SMBUS(obj) OBJECT_CHECK(NPCM7xxSMBusState, (obj), \
133
- TYPE_NPCM7XX_SMBUS)
134
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxSMBusState, NPCM7XX_SMBUS)
135
136
#endif /* NPCM7XX_SMBUS_H */
137
diff --git a/include/hw/misc/npcm7xx_clk.h b/include/hw/misc/npcm7xx_clk.h
138
index XXXXXXX..XXXXXXX 100644
139
--- a/include/hw/misc/npcm7xx_clk.h
140
+++ b/include/hw/misc/npcm7xx_clk.h
141
@@ -XXX,XX +XXX,XX @@ struct NPCM7xxCLKState {
142
};
143
144
#define TYPE_NPCM7XX_CLK "npcm7xx-clk"
145
-#define NPCM7XX_CLK(obj) OBJECT_CHECK(NPCM7xxCLKState, (obj), TYPE_NPCM7XX_CLK)
146
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxCLKState, NPCM7XX_CLK)
147
148
#endif /* NPCM7XX_CLK_H */
149
diff --git a/include/hw/misc/npcm7xx_gcr.h b/include/hw/misc/npcm7xx_gcr.h
150
index XXXXXXX..XXXXXXX 100644
151
--- a/include/hw/misc/npcm7xx_gcr.h
152
+++ b/include/hw/misc/npcm7xx_gcr.h
153
@@ -XXX,XX +XXX,XX @@
154
*/
155
#define NPCM7XX_GCR_NR_REGS (0x148 / sizeof(uint32_t))
156
157
-typedef struct NPCM7xxGCRState {
158
+struct NPCM7xxGCRState {
159
SysBusDevice parent;
160
161
MemoryRegion iomem;
162
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxGCRState {
163
uint32_t reset_pwron;
164
uint32_t reset_mdlr;
165
uint32_t reset_intcr3;
166
-} NPCM7xxGCRState;
167
+};
168
169
#define TYPE_NPCM7XX_GCR "npcm7xx-gcr"
170
-#define NPCM7XX_GCR(obj) OBJECT_CHECK(NPCM7xxGCRState, (obj), TYPE_NPCM7XX_GCR)
171
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxGCRState, NPCM7XX_GCR)
172
173
#endif /* NPCM7XX_GCR_H */
174
diff --git a/include/hw/misc/npcm7xx_mft.h b/include/hw/misc/npcm7xx_mft.h
175
index XXXXXXX..XXXXXXX 100644
176
--- a/include/hw/misc/npcm7xx_mft.h
177
+++ b/include/hw/misc/npcm7xx_mft.h
178
@@ -XXX,XX +XXX,XX @@
179
* @max_rpm: The maximum rpm for fans. Order: A0, B0, A1, B1.
180
* @duty: The duty cycles for fans, relative to NPCM7XX_PWM_MAX_DUTY.
181
*/
182
-typedef struct NPCM7xxMFTState {
183
+struct NPCM7xxMFTState {
184
SysBusDevice parent;
185
186
MemoryRegion iomem;
187
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxMFTState {
188
189
uint32_t max_rpm[NPCM7XX_MFT_FANIN_COUNT];
190
uint32_t duty[NPCM7XX_MFT_FANIN_COUNT];
191
-} NPCM7xxMFTState;
192
+};
193
194
#define TYPE_NPCM7XX_MFT "npcm7xx-mft"
195
-#define NPCM7XX_MFT(obj) \
196
- OBJECT_CHECK(NPCM7xxMFTState, (obj), TYPE_NPCM7XX_MFT)
197
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxMFTState, NPCM7XX_MFT)
198
199
#endif /* NPCM7XX_MFT_H */
200
diff --git a/include/hw/misc/npcm7xx_pwm.h b/include/hw/misc/npcm7xx_pwm.h
201
index XXXXXXX..XXXXXXX 100644
202
--- a/include/hw/misc/npcm7xx_pwm.h
203
+++ b/include/hw/misc/npcm7xx_pwm.h
204
@@ -XXX,XX +XXX,XX @@ struct NPCM7xxPWMState {
205
};
206
207
#define TYPE_NPCM7XX_PWM "npcm7xx-pwm"
208
-#define NPCM7XX_PWM(obj) \
209
- OBJECT_CHECK(NPCM7xxPWMState, (obj), TYPE_NPCM7XX_PWM)
210
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxPWMState, NPCM7XX_PWM)
211
212
#endif /* NPCM7XX_PWM_H */
213
diff --git a/include/hw/misc/npcm7xx_rng.h b/include/hw/misc/npcm7xx_rng.h
214
index XXXXXXX..XXXXXXX 100644
215
--- a/include/hw/misc/npcm7xx_rng.h
216
+++ b/include/hw/misc/npcm7xx_rng.h
217
@@ -XXX,XX +XXX,XX @@
218
219
#include "hw/sysbus.h"
220
221
-typedef struct NPCM7xxRNGState {
222
+struct NPCM7xxRNGState {
223
SysBusDevice parent;
224
225
MemoryRegion iomem;
226
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxRNGState {
227
uint8_t rngcs;
228
uint8_t rngd;
229
uint8_t rngmode;
230
-} NPCM7xxRNGState;
231
+};
232
233
#define TYPE_NPCM7XX_RNG "npcm7xx-rng"
234
-#define NPCM7XX_RNG(obj) OBJECT_CHECK(NPCM7xxRNGState, (obj), TYPE_NPCM7XX_RNG)
235
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxRNGState, NPCM7XX_RNG)
236
237
#endif /* NPCM7XX_RNG_H */
238
diff --git a/include/hw/net/npcm7xx_emc.h b/include/hw/net/npcm7xx_emc.h
239
index XXXXXXX..XXXXXXX 100644
240
--- a/include/hw/net/npcm7xx_emc.h
241
+++ b/include/hw/net/npcm7xx_emc.h
242
@@ -XXX,XX +XXX,XX @@ struct NPCM7xxEMCState {
243
bool rx_active;
244
};
245
246
-typedef struct NPCM7xxEMCState NPCM7xxEMCState;
247
-
248
#define TYPE_NPCM7XX_EMC "npcm7xx-emc"
249
-#define NPCM7XX_EMC(obj) \
250
- OBJECT_CHECK(NPCM7xxEMCState, (obj), TYPE_NPCM7XX_EMC)
251
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxEMCState, NPCM7XX_EMC)
252
253
#endif /* NPCM7XX_EMC_H */
254
diff --git a/include/hw/sd/npcm7xx_sdhci.h b/include/hw/sd/npcm7xx_sdhci.h
255
index XXXXXXX..XXXXXXX 100644
256
--- a/include/hw/sd/npcm7xx_sdhci.h
257
+++ b/include/hw/sd/npcm7xx_sdhci.h
258
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxRegs {
259
uint32_t boottoctrl;
260
} NPCM7xxRegisters;
261
262
-typedef struct NPCM7xxSDHCIState {
263
+struct NPCM7xxSDHCIState {
264
SysBusDevice parent;
265
266
MemoryRegion container;
267
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxSDHCIState {
268
NPCM7xxRegisters regs;
269
270
SDHCIState sdhci;
271
-} NPCM7xxSDHCIState;
272
+};
273
274
#endif /* NPCM7XX_SDHCI_H */
275
--
276
2.34.1
277
278
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Adds trace events to reset procedure and when updating the parent
3
The structure is named SECUREECState. Rename the type accordingly.
4
bus of a device.
5
4
6
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Message-id: 20230109140306.23161-12-philmd@linaro.org
9
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
10
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20200123132823.1117486-3-damien.hedde@greensocs.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
9
---
14
hw/core/qdev.c | 29 ++++++++++++++++++++++++++---
10
hw/misc/sbsa_ec.c | 13 +++++++------
15
hw/core/trace-events | 9 +++++++++
11
1 file changed, 7 insertions(+), 6 deletions(-)
16
2 files changed, 35 insertions(+), 3 deletions(-)
17
12
18
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
13
diff --git a/hw/misc/sbsa_ec.c b/hw/misc/sbsa_ec.c
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/core/qdev.c
15
--- a/hw/misc/sbsa_ec.c
21
+++ b/hw/core/qdev.c
16
+++ b/hw/misc/sbsa_ec.c
22
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@
23
#include "hw/boards.h"
24
#include "hw/sysbus.h"
18
#include "hw/sysbus.h"
25
#include "migration/vmstate.h"
19
#include "sysemu/runstate.h"
26
+#include "trace.h"
20
27
21
-typedef struct {
28
bool qdev_hotplug = false;
22
+typedef struct SECUREECState {
29
static bool qdev_hot_added = false;
23
SysBusDevice parent_obj;
30
@@ -XXX,XX +XXX,XX @@ void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
24
MemoryRegion iomem;
31
bool replugging = dev->parent_bus != NULL;
25
} SECUREECState;
32
26
33
if (replugging) {
27
-#define TYPE_SBSA_EC "sbsa-ec"
34
- /* Keep a reference to the device while it's not plugged into
28
-#define SECURE_EC(obj) OBJECT_CHECK(SECUREECState, (obj), TYPE_SBSA_EC)
35
+ trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
29
+#define TYPE_SBSA_SECURE_EC "sbsa-ec"
36
+ dev->parent_bus, object_get_typename(OBJECT(dev->parent_bus)),
30
+#define SBSA_SECURE_EC(obj) \
37
+ OBJECT(bus), object_get_typename(OBJECT(bus)));
31
+ OBJECT_CHECK(SECUREECState, (obj), TYPE_SBSA_SECURE_EC)
38
+ /*
32
39
+ * Keep a reference to the device while it's not plugged into
33
enum sbsa_ec_powerstates {
40
* any bus, to avoid it potentially evaporating when it is
34
SBSA_EC_CMD_POWEROFF = 0x01,
41
* dereffed in bus_remove_child().
35
@@ -XXX,XX +XXX,XX @@ static uint64_t sbsa_ec_read(void *opaque, hwaddr offset, unsigned size)
42
*/
43
@@ -XXX,XX +XXX,XX @@ HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
44
return hotplug_ctrl;
45
}
36
}
46
37
47
+static int qdev_prereset(DeviceState *dev, void *opaque)
38
static void sbsa_ec_write(void *opaque, hwaddr offset,
48
+{
39
- uint64_t value, unsigned size)
49
+ trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev)));
40
+ uint64_t value, unsigned size)
50
+ return 0;
51
+}
52
+
53
+static int qbus_prereset(BusState *bus, void *opaque)
54
+{
55
+ trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus)));
56
+ return 0;
57
+}
58
+
59
static int qdev_reset_one(DeviceState *dev, void *opaque)
60
{
41
{
61
device_legacy_reset(dev);
42
if (offset == 0) { /* PSCI machine power command register */
62
@@ -XXX,XX +XXX,XX @@ static int qdev_reset_one(DeviceState *dev, void *opaque)
43
switch (value) {
63
static int qbus_reset_one(BusState *bus, void *opaque)
44
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps sbsa_ec_ops = {
45
46
static void sbsa_ec_init(Object *obj)
64
{
47
{
65
BusClass *bc = BUS_GET_CLASS(bus);
48
- SECUREECState *s = SECURE_EC(obj);
66
+ trace_qbus_reset(bus, object_get_typename(OBJECT(bus)));
49
+ SECUREECState *s = SBSA_SECURE_EC(obj);
67
if (bc->reset) {
50
SysBusDevice *dev = SYS_BUS_DEVICE(obj);
68
bc->reset(bus);
51
69
}
52
memory_region_init_io(&s->iomem, obj, &sbsa_ec_ops, s, "sbsa-ec",
70
@@ -XXX,XX +XXX,XX @@ static int qbus_reset_one(BusState *bus, void *opaque)
53
@@ -XXX,XX +XXX,XX @@ static void sbsa_ec_class_init(ObjectClass *klass, void *data)
71
72
void qdev_reset_all(DeviceState *dev)
73
{
74
- qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
75
+ trace_qdev_reset_all(dev, object_get_typename(OBJECT(dev)));
76
+ qdev_walk_children(dev, qdev_prereset, qbus_prereset,
77
+ qdev_reset_one, qbus_reset_one, NULL);
78
}
54
}
79
55
80
void qdev_reset_all_fn(void *opaque)
56
static const TypeInfo sbsa_ec_info = {
81
@@ -XXX,XX +XXX,XX @@ void qdev_reset_all_fn(void *opaque)
57
- .name = TYPE_SBSA_EC,
82
58
+ .name = TYPE_SBSA_SECURE_EC,
83
void qbus_reset_all(BusState *bus)
59
.parent = TYPE_SYS_BUS_DEVICE,
84
{
60
.instance_size = sizeof(SECUREECState),
85
- qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
61
.instance_init = sbsa_ec_init,
86
+ trace_qbus_reset_all(bus, object_get_typename(OBJECT(bus)));
87
+ qbus_walk_children(bus, qdev_prereset, qbus_prereset,
88
+ qdev_reset_one, qbus_reset_one, NULL);
89
}
90
91
void qbus_reset_all_fn(void *opaque)
92
@@ -XXX,XX +XXX,XX @@ void device_legacy_reset(DeviceState *dev)
93
{
94
DeviceClass *klass = DEVICE_GET_CLASS(dev);
95
96
+ trace_qdev_reset(dev, object_get_typename(OBJECT(dev)));
97
if (klass->reset) {
98
klass->reset(dev);
99
}
100
diff --git a/hw/core/trace-events b/hw/core/trace-events
101
index XXXXXXX..XXXXXXX 100644
102
--- a/hw/core/trace-events
103
+++ b/hw/core/trace-events
104
@@ -XXX,XX +XXX,XX @@
105
# loader.c
106
loader_write_rom(const char *name, uint64_t gpa, uint64_t size, bool isrom) "%s: @0x%"PRIx64" size=0x%"PRIx64" ROM=%d"
107
+
108
+# qdev.c
109
+qdev_reset(void *obj, const char *objtype) "obj=%p(%s)"
110
+qdev_reset_all(void *obj, const char *objtype) "obj=%p(%s)"
111
+qdev_reset_tree(void *obj, const char *objtype) "obj=%p(%s)"
112
+qbus_reset(void *obj, const char *objtype) "obj=%p(%s)"
113
+qbus_reset_all(void *obj, const char *objtype) "obj=%p(%s)"
114
+qbus_reset_tree(void *obj, const char *objtype) "obj=%p(%s)"
115
+qdev_update_parent_bus(void *obj, const char *objtype, void *oldp, const char *oldptype, void *newp, const char *newptype) "obj=%p(%s) old_parent=%p(%s) new_parent=%p(%s)"
116
--
62
--
117
2.20.1
63
2.34.1
118
64
119
65
diff view generated by jsdifflib
1
The num-lines property of the TYPE_OR_GATE device sets the number
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
of input lines it has. An assert() in or_irq_realize() restricts
3
this to the maximum supported by the implementation. However we
4
got the condition in the assert wrong: it should be using <=,
5
because num-lines == MAX_OR_LINES is permitted, and means that
6
all entries from 0 to MAX_OR_LINES-1 in the s->levels[] array
7
are used.
8
2
9
We didn't notice this previously because no user has so far
3
This model was merged few days before the QOM cleanup from
10
needed that many input lines.
4
commit 8063396bf3 ("Use OBJECT_DECLARE_SIMPLE_TYPE when possible")
5
was pulled and merged. Manually adapt.
11
6
12
Reported-by: Guenter Roeck <linux@roeck-us.net>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109140306.23161-13-philmd@linaro.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
16
Message-id: 20200120142235.10432-1-peter.maydell@linaro.org
17
---
11
---
18
hw/core/or-irq.c | 2 +-
12
hw/misc/sbsa_ec.c | 3 +--
19
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 1 insertion(+), 2 deletions(-)
20
14
21
diff --git a/hw/core/or-irq.c b/hw/core/or-irq.c
15
diff --git a/hw/misc/sbsa_ec.c b/hw/misc/sbsa_ec.c
22
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/core/or-irq.c
17
--- a/hw/misc/sbsa_ec.c
24
+++ b/hw/core/or-irq.c
18
+++ b/hw/misc/sbsa_ec.c
25
@@ -XXX,XX +XXX,XX @@ static void or_irq_realize(DeviceState *dev, Error **errp)
19
@@ -XXX,XX +XXX,XX @@ typedef struct SECUREECState {
26
{
20
} SECUREECState;
27
qemu_or_irq *s = OR_IRQ(dev);
21
28
22
#define TYPE_SBSA_SECURE_EC "sbsa-ec"
29
- assert(s->num_lines < MAX_OR_LINES);
23
-#define SBSA_SECURE_EC(obj) \
30
+ assert(s->num_lines <= MAX_OR_LINES);
24
- OBJECT_CHECK(SECUREECState, (obj), TYPE_SBSA_SECURE_EC)
31
25
+OBJECT_DECLARE_SIMPLE_TYPE(SECUREECState, SBSA_SECURE_EC)
32
qdev_init_gpio_in(dev, or_irq_handler, s->num_lines);
26
33
}
27
enum sbsa_ec_powerstates {
28
SBSA_EC_CMD_POWEROFF = 0x01,
34
--
29
--
35
2.20.1
30
2.34.1
36
31
37
32
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
When a VM is stopped (such as when it's paused) guest virtual time
3
This remove a use of 'struct' in the DECLARE_INSTANCE_CHECKER()
4
should stop counting. Otherwise, when the VM is resumed it will
4
macro call, to avoid after a QOM refactor:
5
experience time jumps and its kernel may report soft lockups. Not
6
counting virtual time while the VM is stopped has the side effect
7
of making the guest's time appear to lag when compared with real
8
time, and even with time derived from the physical counter. For
9
this reason, this change, which is enabled by default, comes with
10
a KVM CPU feature allowing it to be disabled, restoring legacy
11
behavior.
12
5
13
This patch only provides the implementation of the virtual time
6
hw/intc/xilinx_intc.c:45:1: error: declaration of anonymous struct must be a definition
14
adjustment. A subsequent patch will provide the CPU property
7
DECLARE_INSTANCE_CHECKER(struct xlx_pic, XILINX_INTC,
15
allowing the change to be enabled and disabled.
8
^
16
9
17
Reported-by: Bijan Mottahedeh <bijan.mottahedeh@oracle.com>
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
18
Signed-off-by: Andrew Jones <drjones@redhat.com>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-id: 20200120101023.16030-6-drjones@redhat.com
12
Reviewed-by: Edgar E. Iglesias <edgar@zeroasic.com>
20
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Message-id: 20230109140306.23161-14-philmd@linaro.org
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
15
---
23
target/arm/cpu.h | 7 ++++
16
hw/intc/xilinx_intc.c | 28 +++++++++++++---------------
24
target/arm/kvm_arm.h | 38 ++++++++++++++++++
17
1 file changed, 13 insertions(+), 15 deletions(-)
25
target/arm/kvm.c | 92 ++++++++++++++++++++++++++++++++++++++++++++
26
target/arm/kvm32.c | 3 ++
27
target/arm/kvm64.c | 3 ++
28
target/arm/machine.c | 7 ++++
29
6 files changed, 150 insertions(+)
30
18
31
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
diff --git a/hw/intc/xilinx_intc.c b/hw/intc/xilinx_intc.c
32
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/cpu.h
21
--- a/hw/intc/xilinx_intc.c
34
+++ b/target/arm/cpu.h
22
+++ b/hw/intc/xilinx_intc.c
35
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
23
@@ -XXX,XX +XXX,XX @@
36
/* KVM init features for this CPU */
24
#define R_MAX 8
37
uint32_t kvm_init_features[7];
25
38
26
#define TYPE_XILINX_INTC "xlnx.xps-intc"
39
+ /* KVM CPU state */
27
-DECLARE_INSTANCE_CHECKER(struct xlx_pic, XILINX_INTC,
40
+
28
- TYPE_XILINX_INTC)
41
+ /* KVM virtual time adjustment */
29
+typedef struct XpsIntc XpsIntc;
42
+ bool kvm_adjvtime;
30
+DECLARE_INSTANCE_CHECKER(XpsIntc, XILINX_INTC, TYPE_XILINX_INTC)
43
+ bool kvm_vtime_dirty;
31
44
+ uint64_t kvm_vtime;
32
-struct xlx_pic
45
+
33
+struct XpsIntc
46
/* Uniprocessor system with MP extensions */
34
{
47
bool mp_is_up;
35
SysBusDevice parent_obj;
48
36
49
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
37
@@ -XXX,XX +XXX,XX @@ struct xlx_pic
50
index XXXXXXX..XXXXXXX 100644
38
uint32_t irq_pin_state;
51
--- a/target/arm/kvm_arm.h
39
};
52
+++ b/target/arm/kvm_arm.h
40
53
@@ -XXX,XX +XXX,XX @@ bool write_list_to_kvmstate(ARMCPU *cpu, int level);
41
-static void update_irq(struct xlx_pic *p)
54
*/
42
+static void update_irq(XpsIntc *p)
55
bool write_kvmstate_to_list(ARMCPU *cpu);
43
{
56
44
uint32_t i;
57
+/**
45
58
+ * kvm_arm_cpu_pre_save:
46
@@ -XXX,XX +XXX,XX @@ static void update_irq(struct xlx_pic *p)
59
+ * @cpu: ARMCPU
47
qemu_set_irq(p->parent_irq, (p->regs[R_MER] & 1) && p->regs[R_IPR]);
60
+ *
61
+ * Called after write_kvmstate_to_list() from cpu_pre_save() to update
62
+ * the cpreg list with KVM CPU state.
63
+ */
64
+void kvm_arm_cpu_pre_save(ARMCPU *cpu);
65
+
66
+/**
67
+ * kvm_arm_cpu_post_load:
68
+ * @cpu: ARMCPU
69
+ *
70
+ * Called from cpu_post_load() to update KVM CPU state from the cpreg list.
71
+ */
72
+void kvm_arm_cpu_post_load(ARMCPU *cpu);
73
+
74
/**
75
* kvm_arm_reset_vcpu:
76
* @cpu: ARMCPU
77
@@ -XXX,XX +XXX,XX @@ int kvm_arm_sync_mpstate_to_kvm(ARMCPU *cpu);
78
*/
79
int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu);
80
81
+/**
82
+ * kvm_arm_get_virtual_time:
83
+ * @cs: CPUState
84
+ *
85
+ * Gets the VCPU's virtual counter and stores it in the KVM CPU state.
86
+ */
87
+void kvm_arm_get_virtual_time(CPUState *cs);
88
+
89
+/**
90
+ * kvm_arm_put_virtual_time:
91
+ * @cs: CPUState
92
+ *
93
+ * Sets the VCPU's virtual counter to the value stored in the KVM CPU state.
94
+ */
95
+void kvm_arm_put_virtual_time(CPUState *cs);
96
+
97
+void kvm_arm_vm_state_change(void *opaque, int running, RunState state);
98
+
99
int kvm_arm_vgic_probe(void);
100
101
void kvm_arm_pmu_set_irq(CPUState *cs, int irq);
102
@@ -XXX,XX +XXX,XX @@ static inline void kvm_arm_pmu_set_irq(CPUState *cs, int irq) {}
103
static inline void kvm_arm_pmu_init(CPUState *cs) {}
104
105
static inline void kvm_arm_sve_get_vls(CPUState *cs, unsigned long *map) {}
106
+
107
+static inline void kvm_arm_get_virtual_time(CPUState *cs) {}
108
+static inline void kvm_arm_put_virtual_time(CPUState *cs) {}
109
#endif
110
111
static inline const char *gic_class_name(void)
112
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
113
index XXXXXXX..XXXXXXX 100644
114
--- a/target/arm/kvm.c
115
+++ b/target/arm/kvm.c
116
@@ -XXX,XX +XXX,XX @@ static int compare_u64(const void *a, const void *b)
117
return 0;
118
}
48
}
119
49
120
+/*
50
-static uint64_t
121
+ * cpreg_values are sorted in ascending order by KVM register ID
51
-pic_read(void *opaque, hwaddr addr, unsigned int size)
122
+ * (see kvm_arm_init_cpreg_list). This allows us to cheaply find
52
+static uint64_t pic_read(void *opaque, hwaddr addr, unsigned int size)
123
+ * the storage for a KVM register by ID with a binary search.
53
{
124
+ */
54
- struct xlx_pic *p = opaque;
125
+static uint64_t *kvm_arm_get_cpreg_ptr(ARMCPU *cpu, uint64_t regidx)
55
+ XpsIntc *p = opaque;
126
+{
56
uint32_t r = 0;
127
+ uint64_t *res;
57
128
+
58
addr >>= 2;
129
+ res = bsearch(&regidx, cpu->cpreg_indexes, cpu->cpreg_array_len,
59
@@ -XXX,XX +XXX,XX @@ pic_read(void *opaque, hwaddr addr, unsigned int size)
130
+ sizeof(uint64_t), compare_u64);
60
return r;
131
+ assert(res);
132
+
133
+ return &cpu->cpreg_values[res - cpu->cpreg_indexes];
134
+}
135
+
136
/* Initialize the ARMCPU cpreg list according to the kernel's
137
* definition of what CPU registers it knows about (and throw away
138
* the previous TCG-created cpreg list).
139
@@ -XXX,XX +XXX,XX @@ bool write_list_to_kvmstate(ARMCPU *cpu, int level)
140
return ok;
141
}
61
}
142
62
143
+void kvm_arm_cpu_pre_save(ARMCPU *cpu)
63
-static void
144
+{
64
-pic_write(void *opaque, hwaddr addr,
145
+ /* KVM virtual time adjustment */
65
- uint64_t val64, unsigned int size)
146
+ if (cpu->kvm_vtime_dirty) {
66
+static void pic_write(void *opaque, hwaddr addr,
147
+ *kvm_arm_get_cpreg_ptr(cpu, KVM_REG_ARM_TIMER_CNT) = cpu->kvm_vtime;
67
+ uint64_t val64, unsigned int size)
148
+ }
149
+}
150
+
151
+void kvm_arm_cpu_post_load(ARMCPU *cpu)
152
+{
153
+ /* KVM virtual time adjustment */
154
+ if (cpu->kvm_adjvtime) {
155
+ cpu->kvm_vtime = *kvm_arm_get_cpreg_ptr(cpu, KVM_REG_ARM_TIMER_CNT);
156
+ cpu->kvm_vtime_dirty = true;
157
+ }
158
+}
159
+
160
void kvm_arm_reset_vcpu(ARMCPU *cpu)
161
{
68
{
162
int ret;
69
- struct xlx_pic *p = opaque;
163
@@ -XXX,XX +XXX,XX @@ int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu)
70
+ XpsIntc *p = opaque;
164
return 0;
71
uint32_t value = val64;
72
73
addr >>= 2;
74
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps pic_ops = {
75
76
static void irq_handler(void *opaque, int irq, int level)
77
{
78
- struct xlx_pic *p = opaque;
79
+ XpsIntc *p = opaque;
80
81
/* edge triggered interrupt */
82
if (p->c_kind_of_intr & (1 << irq) && p->regs[R_MER] & 2) {
83
@@ -XXX,XX +XXX,XX @@ static void irq_handler(void *opaque, int irq, int level)
84
85
static void xilinx_intc_init(Object *obj)
86
{
87
- struct xlx_pic *p = XILINX_INTC(obj);
88
+ XpsIntc *p = XILINX_INTC(obj);
89
90
qdev_init_gpio_in(DEVICE(obj), irq_handler, 32);
91
sysbus_init_irq(SYS_BUS_DEVICE(obj), &p->parent_irq);
92
@@ -XXX,XX +XXX,XX @@ static void xilinx_intc_init(Object *obj)
165
}
93
}
166
94
167
+void kvm_arm_get_virtual_time(CPUState *cs)
95
static Property xilinx_intc_properties[] = {
168
+{
96
- DEFINE_PROP_UINT32("kind-of-intr", struct xlx_pic, c_kind_of_intr, 0),
169
+ ARMCPU *cpu = ARM_CPU(cs);
97
+ DEFINE_PROP_UINT32("kind-of-intr", XpsIntc, c_kind_of_intr, 0),
170
+ struct kvm_one_reg reg = {
98
DEFINE_PROP_END_OF_LIST(),
171
+ .id = KVM_REG_ARM_TIMER_CNT,
99
};
172
+ .addr = (uintptr_t)&cpu->kvm_vtime,
100
173
+ };
101
@@ -XXX,XX +XXX,XX @@ static void xilinx_intc_class_init(ObjectClass *klass, void *data)
174
+ int ret;
102
static const TypeInfo xilinx_intc_info = {
175
+
103
.name = TYPE_XILINX_INTC,
176
+ if (cpu->kvm_vtime_dirty) {
104
.parent = TYPE_SYS_BUS_DEVICE,
177
+ return;
105
- .instance_size = sizeof(struct xlx_pic),
178
+ }
106
+ .instance_size = sizeof(XpsIntc),
179
+
107
.instance_init = xilinx_intc_init,
180
+ ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
108
.class_init = xilinx_intc_class_init,
181
+ if (ret) {
109
};
182
+ error_report("Failed to get KVM_REG_ARM_TIMER_CNT");
183
+ abort();
184
+ }
185
+
186
+ cpu->kvm_vtime_dirty = true;
187
+}
188
+
189
+void kvm_arm_put_virtual_time(CPUState *cs)
190
+{
191
+ ARMCPU *cpu = ARM_CPU(cs);
192
+ struct kvm_one_reg reg = {
193
+ .id = KVM_REG_ARM_TIMER_CNT,
194
+ .addr = (uintptr_t)&cpu->kvm_vtime,
195
+ };
196
+ int ret;
197
+
198
+ if (!cpu->kvm_vtime_dirty) {
199
+ return;
200
+ }
201
+
202
+ ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
203
+ if (ret) {
204
+ error_report("Failed to set KVM_REG_ARM_TIMER_CNT");
205
+ abort();
206
+ }
207
+
208
+ cpu->kvm_vtime_dirty = false;
209
+}
210
+
211
int kvm_put_vcpu_events(ARMCPU *cpu)
212
{
213
CPUARMState *env = &cpu->env;
214
@@ -XXX,XX +XXX,XX @@ MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
215
return MEMTXATTRS_UNSPECIFIED;
216
}
217
218
+void kvm_arm_vm_state_change(void *opaque, int running, RunState state)
219
+{
220
+ CPUState *cs = opaque;
221
+ ARMCPU *cpu = ARM_CPU(cs);
222
+
223
+ if (running) {
224
+ if (cpu->kvm_adjvtime) {
225
+ kvm_arm_put_virtual_time(cs);
226
+ }
227
+ } else {
228
+ if (cpu->kvm_adjvtime) {
229
+ kvm_arm_get_virtual_time(cs);
230
+ }
231
+ }
232
+}
233
234
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
235
{
236
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
237
index XXXXXXX..XXXXXXX 100644
238
--- a/target/arm/kvm32.c
239
+++ b/target/arm/kvm32.c
240
@@ -XXX,XX +XXX,XX @@
241
#include "qemu-common.h"
242
#include "cpu.h"
243
#include "qemu/timer.h"
244
+#include "sysemu/runstate.h"
245
#include "sysemu/kvm.h"
246
#include "kvm_arm.h"
247
#include "internals.h"
248
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init_vcpu(CPUState *cs)
249
return -EINVAL;
250
}
251
252
+ qemu_add_vm_change_state_handler(kvm_arm_vm_state_change, cs);
253
+
254
/* Determine init features for this CPU */
255
memset(cpu->kvm_init_features, 0, sizeof(cpu->kvm_init_features));
256
if (cpu->start_powered_off) {
257
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
258
index XXXXXXX..XXXXXXX 100644
259
--- a/target/arm/kvm64.c
260
+++ b/target/arm/kvm64.c
261
@@ -XXX,XX +XXX,XX @@
262
#include "qemu/host-utils.h"
263
#include "qemu/main-loop.h"
264
#include "exec/gdbstub.h"
265
+#include "sysemu/runstate.h"
266
#include "sysemu/kvm.h"
267
#include "sysemu/kvm_int.h"
268
#include "kvm_arm.h"
269
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init_vcpu(CPUState *cs)
270
return -EINVAL;
271
}
272
273
+ qemu_add_vm_change_state_handler(kvm_arm_vm_state_change, cs);
274
+
275
/* Determine init features for this CPU */
276
memset(cpu->kvm_init_features, 0, sizeof(cpu->kvm_init_features));
277
if (cpu->start_powered_off) {
278
diff --git a/target/arm/machine.c b/target/arm/machine.c
279
index XXXXXXX..XXXXXXX 100644
280
--- a/target/arm/machine.c
281
+++ b/target/arm/machine.c
282
@@ -XXX,XX +XXX,XX @@ static int cpu_pre_save(void *opaque)
283
/* This should never fail */
284
abort();
285
}
286
+
287
+ /*
288
+ * kvm_arm_cpu_pre_save() must be called after
289
+ * write_kvmstate_to_list()
290
+ */
291
+ kvm_arm_cpu_pre_save(cpu);
292
} else {
293
if (!write_cpustate_to_list(cpu, false)) {
294
/* This should never fail. */
295
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
296
* we're using it.
297
*/
298
write_list_to_cpustate(cpu);
299
+ kvm_arm_cpu_post_load(cpu);
300
} else {
301
if (!write_list_to_cpustate(cpu)) {
302
return -1;
303
--
110
--
304
2.20.1
111
2.34.1
305
112
306
113
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
This commit adds support of Resettable interface to buses and devices:
3
This remove a use of 'struct' in the DECLARE_INSTANCE_CHECKER()
4
+ ResettableState structure is added in the Bus/Device state
4
macro call, to avoid after a QOM refactor:
5
+ Resettable methods are implemented.
6
+ device/bus_is_in_reset function defined
7
5
8
This commit allows to transition the objects to the new
6
hw/timer/xilinx_timer.c:65:1: error: declaration of anonymous struct must be a definition
9
multi-phase interface without changing the reset behavior at all.
7
DECLARE_INSTANCE_CHECKER(struct timerblock, XILINX_TIMER,
10
Object single reset method can be split into the 3 different phases
8
^
11
but the 3 phases are still executed in a row for a given object.
12
From the qdev/qbus reset api point of view, nothing is changed.
13
qdev_reset_all() and qbus_reset_all() are not modified as well as
14
device_legacy_reset().
15
9
16
Transition of an object must be done from parent class to child class.
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
17
Care has been taken to allow the transition of a parent class
18
without requiring the child classes to be transitioned at the same
19
time. Note that SysBus and SysBusDevice class do not need any transition
20
because they do not override the legacy reset method.
21
22
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
23
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
24
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Edgar E. Iglesias <edgar@zeroasic.com>
25
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20230109140306.23161-15-philmd@linaro.org
26
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
27
Message-id: 20200123132823.1117486-5-damien.hedde@greensocs.com
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
---
15
---
30
tests/Makefile.include | 1 +
16
hw/timer/xilinx_timer.c | 27 +++++++++++++--------------
31
include/hw/qdev-core.h | 27 ++++++++++++
17
1 file changed, 13 insertions(+), 14 deletions(-)
32
hw/core/bus.c | 97 ++++++++++++++++++++++++++++++++++++++++++
33
hw/core/qdev.c | 93 ++++++++++++++++++++++++++++++++++++++++
34
4 files changed, 218 insertions(+)
35
18
36
diff --git a/tests/Makefile.include b/tests/Makefile.include
19
diff --git a/hw/timer/xilinx_timer.c b/hw/timer/xilinx_timer.c
37
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
38
--- a/tests/Makefile.include
21
--- a/hw/timer/xilinx_timer.c
39
+++ b/tests/Makefile.include
22
+++ b/hw/timer/xilinx_timer.c
40
@@ -XXX,XX +XXX,XX @@ tests/fp/%:
23
@@ -XXX,XX +XXX,XX @@ struct xlx_timer
41
tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \
42
    hw/core/qdev.o hw/core/qdev-properties.o hw/core/hotplug.o\
43
    hw/core/bus.o \
44
+    hw/core/resettable.o \
45
    hw/core/irq.o \
46
    hw/core/fw-path-provider.o \
47
    hw/core/reset.o \
48
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
49
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/qdev-core.h
51
+++ b/include/hw/qdev-core.h
52
@@ -XXX,XX +XXX,XX @@
53
#include "qemu/bitmap.h"
54
#include "qom/object.h"
55
#include "hw/hotplug.h"
56
+#include "hw/resettable.h"
57
58
enum {
59
DEV_NVECTORS_UNSPECIFIED = -1,
60
@@ -XXX,XX +XXX,XX @@ typedef struct DeviceClass {
61
bool hotpluggable;
62
63
/* callbacks */
64
+ /*
65
+ * Reset method here is deprecated and replaced by methods in the
66
+ * resettable class interface to implement a multi-phase reset.
67
+ * TODO: remove once every reset callback is unused
68
+ */
69
DeviceReset reset;
70
DeviceRealize realize;
71
DeviceUnrealize unrealize;
72
@@ -XXX,XX +XXX,XX @@ struct NamedGPIOList {
73
/**
74
* DeviceState:
75
* @realized: Indicates whether the device has been fully constructed.
76
+ * @reset: ResettableState for the device; handled by Resettable interface.
77
*
78
* This structure should not be accessed directly. We declare it here
79
* so that it can be embedded in individual device state structures.
80
@@ -XXX,XX +XXX,XX @@ struct DeviceState {
81
int num_child_bus;
82
int instance_id_alias;
83
int alias_required_for_version;
84
+ ResettableState reset;
85
};
24
};
86
25
87
struct DeviceListener {
26
#define TYPE_XILINX_TIMER "xlnx.xps-timer"
88
@@ -XXX,XX +XXX,XX @@ typedef struct BusChild {
27
-DECLARE_INSTANCE_CHECKER(struct timerblock, XILINX_TIMER,
89
/**
28
- TYPE_XILINX_TIMER)
90
* BusState:
29
+typedef struct XpsTimerState XpsTimerState;
91
* @hotplug_handler: link to a hotplug handler associated with bus.
30
+DECLARE_INSTANCE_CHECKER(XpsTimerState, XILINX_TIMER, TYPE_XILINX_TIMER)
92
+ * @reset: ResettableState for the bus; handled by Resettable interface.
31
93
*/
32
-struct timerblock
94
struct BusState {
33
+struct XpsTimerState
95
Object obj;
34
{
96
@@ -XXX,XX +XXX,XX @@ struct BusState {
35
SysBusDevice parent_obj;
97
int num_children;
36
98
QTAILQ_HEAD(, BusChild) children;
37
@@ -XXX,XX +XXX,XX @@ struct timerblock
99
QLIST_ENTRY(BusState) sibling;
38
struct xlx_timer *timers;
100
+ ResettableState reset;
101
};
39
};
102
40
103
/**
41
-static inline unsigned int num_timers(struct timerblock *t)
104
@@ -XXX,XX +XXX,XX @@ void qdev_reset_all_fn(void *opaque);
42
+static inline unsigned int num_timers(XpsTimerState *t)
105
void qbus_reset_all(BusState *bus);
43
{
106
void qbus_reset_all_fn(void *opaque);
44
return 2 - t->one_timer_only;
107
108
+/**
109
+ * device_is_in_reset:
110
+ * Return true if the device @dev is currently being reset.
111
+ */
112
+bool device_is_in_reset(DeviceState *dev);
113
+
114
+/**
115
+ * bus_is_in_reset:
116
+ * Return true if the bus @bus is currently being reset.
117
+ */
118
+bool bus_is_in_reset(BusState *bus);
119
+
120
/* This should go away once we get rid of the NULL bus hack */
121
BusState *sysbus_get_default(void);
122
123
@@ -XXX,XX +XXX,XX @@ void device_legacy_reset(DeviceState *dev);
124
125
void device_class_set_props(DeviceClass *dc, Property *props);
126
127
+/**
128
+ * device_class_set_parent_reset:
129
+ * TODO: remove the function when DeviceClass's reset method
130
+ * is not used anymore.
131
+ */
132
void device_class_set_parent_reset(DeviceClass *dc,
133
DeviceReset dev_reset,
134
DeviceReset *parent_reset);
135
diff --git a/hw/core/bus.c b/hw/core/bus.c
136
index XXXXXXX..XXXXXXX 100644
137
--- a/hw/core/bus.c
138
+++ b/hw/core/bus.c
139
@@ -XXX,XX +XXX,XX @@ int qbus_walk_children(BusState *bus,
140
return 0;
141
}
45
}
142
46
@@ -XXX,XX +XXX,XX @@ static inline unsigned int timer_from_addr(hwaddr addr)
143
+bool bus_is_in_reset(BusState *bus)
47
return addr >> 2;
144
+{
48
}
145
+ return resettable_is_in_reset(OBJECT(bus));
49
146
+}
50
-static void timer_update_irq(struct timerblock *t)
147
+
51
+static void timer_update_irq(XpsTimerState *t)
148
+static ResettableState *bus_get_reset_state(Object *obj)
149
+{
150
+ BusState *bus = BUS(obj);
151
+ return &bus->reset;
152
+}
153
+
154
+static void bus_reset_child_foreach(Object *obj, ResettableChildCallback cb,
155
+ void *opaque, ResetType type)
156
+{
157
+ BusState *bus = BUS(obj);
158
+ BusChild *kid;
159
+
160
+ QTAILQ_FOREACH(kid, &bus->children, sibling) {
161
+ cb(OBJECT(kid->child), opaque, type);
162
+ }
163
+}
164
+
165
static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
166
{
52
{
167
const char *typename = object_get_typename(OBJECT(bus));
53
unsigned int i, irq = 0;
168
@@ -XXX,XX +XXX,XX @@ static char *default_bus_get_fw_dev_path(DeviceState *dev)
54
uint32_t csr;
169
return g_strdup(object_get_typename(OBJECT(dev)));
55
@@ -XXX,XX +XXX,XX @@ static void timer_update_irq(struct timerblock *t)
56
static uint64_t
57
timer_read(void *opaque, hwaddr addr, unsigned int size)
58
{
59
- struct timerblock *t = opaque;
60
+ XpsTimerState *t = opaque;
61
struct xlx_timer *xt;
62
uint32_t r = 0;
63
unsigned int timer;
64
@@ -XXX,XX +XXX,XX @@ static void
65
timer_write(void *opaque, hwaddr addr,
66
uint64_t val64, unsigned int size)
67
{
68
- struct timerblock *t = opaque;
69
+ XpsTimerState *t = opaque;
70
struct xlx_timer *xt;
71
unsigned int timer;
72
uint32_t value = val64;
73
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps timer_ops = {
74
static void timer_hit(void *opaque)
75
{
76
struct xlx_timer *xt = opaque;
77
- struct timerblock *t = xt->parent;
78
+ XpsTimerState *t = xt->parent;
79
D(fprintf(stderr, "%s %d\n", __func__, xt->nr));
80
xt->regs[R_TCSR] |= TCSR_TINT;
81
82
@@ -XXX,XX +XXX,XX @@ static void timer_hit(void *opaque)
83
84
static void xilinx_timer_realize(DeviceState *dev, Error **errp)
85
{
86
- struct timerblock *t = XILINX_TIMER(dev);
87
+ XpsTimerState *t = XILINX_TIMER(dev);
88
unsigned int i;
89
90
/* Init all the ptimers. */
91
@@ -XXX,XX +XXX,XX @@ static void xilinx_timer_realize(DeviceState *dev, Error **errp)
92
93
static void xilinx_timer_init(Object *obj)
94
{
95
- struct timerblock *t = XILINX_TIMER(obj);
96
+ XpsTimerState *t = XILINX_TIMER(obj);
97
98
/* All timers share a single irq line. */
99
sysbus_init_irq(SYS_BUS_DEVICE(obj), &t->irq);
170
}
100
}
171
101
172
+/**
102
static Property xilinx_timer_properties[] = {
173
+ * bus_phases_reset:
103
- DEFINE_PROP_UINT32("clock-frequency", struct timerblock, freq_hz,
174
+ * Transition reset method for buses to allow moving
104
- 62 * 1000000),
175
+ * smoothly from legacy reset method to multi-phases
105
- DEFINE_PROP_UINT8("one-timer-only", struct timerblock, one_timer_only, 0),
176
+ */
106
+ DEFINE_PROP_UINT32("clock-frequency", XpsTimerState, freq_hz, 62 * 1000000),
177
+static void bus_phases_reset(BusState *bus)
107
+ DEFINE_PROP_UINT8("one-timer-only", XpsTimerState, one_timer_only, 0),
178
+{
108
DEFINE_PROP_END_OF_LIST(),
179
+ ResettableClass *rc = RESETTABLE_GET_CLASS(bus);
180
+
181
+ if (rc->phases.enter) {
182
+ rc->phases.enter(OBJECT(bus), RESET_TYPE_COLD);
183
+ }
184
+ if (rc->phases.hold) {
185
+ rc->phases.hold(OBJECT(bus));
186
+ }
187
+ if (rc->phases.exit) {
188
+ rc->phases.exit(OBJECT(bus));
189
+ }
190
+}
191
+
192
+static void bus_transitional_reset(Object *obj)
193
+{
194
+ BusClass *bc = BUS_GET_CLASS(obj);
195
+
196
+ /*
197
+ * This will call either @bus_phases_reset (for multi-phases transitioned
198
+ * buses) or a bus's specific method for not-yet transitioned buses.
199
+ * In both case, it does not reset children.
200
+ */
201
+ if (bc->reset) {
202
+ bc->reset(BUS(obj));
203
+ }
204
+}
205
+
206
+/**
207
+ * bus_get_transitional_reset:
208
+ * check if the bus's class is ready for multi-phase
209
+ */
210
+static ResettableTrFunction bus_get_transitional_reset(Object *obj)
211
+{
212
+ BusClass *dc = BUS_GET_CLASS(obj);
213
+ if (dc->reset != bus_phases_reset) {
214
+ /*
215
+ * dc->reset has been overridden by a subclass,
216
+ * the bus is not ready for multi phase yet.
217
+ */
218
+ return bus_transitional_reset;
219
+ }
220
+ return NULL;
221
+}
222
+
223
static void bus_class_init(ObjectClass *class, void *data)
224
{
225
BusClass *bc = BUS_CLASS(class);
226
+ ResettableClass *rc = RESETTABLE_CLASS(class);
227
228
class->unparent = bus_unparent;
229
bc->get_fw_dev_path = default_bus_get_fw_dev_path;
230
+
231
+ rc->get_state = bus_get_reset_state;
232
+ rc->child_foreach = bus_reset_child_foreach;
233
+
234
+ /*
235
+ * @bus_phases_reset is put as the default reset method below, allowing
236
+ * to do the multi-phase transition from base classes to leaf classes. It
237
+ * allows a legacy-reset Bus class to extend a multi-phases-reset
238
+ * Bus class for the following reason:
239
+ * + If a base class B has been moved to multi-phase, then it does not
240
+ * override this default reset method and may have defined phase methods.
241
+ * + A child class C (extending class B) which uses
242
+ * bus_class_set_parent_reset() (or similar means) to override the
243
+ * reset method will still work as expected. @bus_phases_reset function
244
+ * will be registered as the parent reset method and effectively call
245
+ * parent reset phases.
246
+ */
247
+ bc->reset = bus_phases_reset;
248
+ rc->get_transitional_function = bus_get_transitional_reset;
249
}
250
251
static void qbus_finalize(Object *obj)
252
@@ -XXX,XX +XXX,XX @@ static const TypeInfo bus_info = {
253
.instance_init = qbus_initfn,
254
.instance_finalize = qbus_finalize,
255
.class_init = bus_class_init,
256
+ .interfaces = (InterfaceInfo[]) {
257
+ { TYPE_RESETTABLE_INTERFACE },
258
+ { }
259
+ },
260
};
109
};
261
110
262
static void bus_register_types(void)
111
@@ -XXX,XX +XXX,XX @@ static void xilinx_timer_class_init(ObjectClass *klass, void *data)
263
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
112
static const TypeInfo xilinx_timer_info = {
264
index XXXXXXX..XXXXXXX 100644
113
.name = TYPE_XILINX_TIMER,
265
--- a/hw/core/qdev.c
114
.parent = TYPE_SYS_BUS_DEVICE,
266
+++ b/hw/core/qdev.c
115
- .instance_size = sizeof(struct timerblock),
267
@@ -XXX,XX +XXX,XX @@ void qbus_reset_all_fn(void *opaque)
116
+ .instance_size = sizeof(XpsTimerState),
268
qbus_reset_all(bus);
117
.instance_init = xilinx_timer_init,
269
}
118
.class_init = xilinx_timer_class_init,
270
271
+bool device_is_in_reset(DeviceState *dev)
272
+{
273
+ return resettable_is_in_reset(OBJECT(dev));
274
+}
275
+
276
+static ResettableState *device_get_reset_state(Object *obj)
277
+{
278
+ DeviceState *dev = DEVICE(obj);
279
+ return &dev->reset;
280
+}
281
+
282
+static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
283
+ void *opaque, ResetType type)
284
+{
285
+ DeviceState *dev = DEVICE(obj);
286
+ BusState *bus;
287
+
288
+ QLIST_FOREACH(bus, &dev->child_bus, sibling) {
289
+ cb(OBJECT(bus), opaque, type);
290
+ }
291
+}
292
+
293
/* can be used as ->unplug() callback for the simple cases */
294
void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
295
DeviceState *dev, Error **errp)
296
@@ -XXX,XX +XXX,XX @@ device_vmstate_if_get_id(VMStateIf *obj)
297
return qdev_get_dev_path(dev);
298
}
299
300
+/**
301
+ * device_phases_reset:
302
+ * Transition reset method for devices to allow moving
303
+ * smoothly from legacy reset method to multi-phases
304
+ */
305
+static void device_phases_reset(DeviceState *dev)
306
+{
307
+ ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
308
+
309
+ if (rc->phases.enter) {
310
+ rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
311
+ }
312
+ if (rc->phases.hold) {
313
+ rc->phases.hold(OBJECT(dev));
314
+ }
315
+ if (rc->phases.exit) {
316
+ rc->phases.exit(OBJECT(dev));
317
+ }
318
+}
319
+
320
+static void device_transitional_reset(Object *obj)
321
+{
322
+ DeviceClass *dc = DEVICE_GET_CLASS(obj);
323
+
324
+ /*
325
+ * This will call either @device_phases_reset (for multi-phases transitioned
326
+ * devices) or a device's specific method for not-yet transitioned devices.
327
+ * In both case, it does not reset children.
328
+ */
329
+ if (dc->reset) {
330
+ dc->reset(DEVICE(obj));
331
+ }
332
+}
333
+
334
+/**
335
+ * device_get_transitional_reset:
336
+ * check if the device's class is ready for multi-phase
337
+ */
338
+static ResettableTrFunction device_get_transitional_reset(Object *obj)
339
+{
340
+ DeviceClass *dc = DEVICE_GET_CLASS(obj);
341
+ if (dc->reset != device_phases_reset) {
342
+ /*
343
+ * dc->reset has been overridden by a subclass,
344
+ * the device is not ready for multi phase yet.
345
+ */
346
+ return device_transitional_reset;
347
+ }
348
+ return NULL;
349
+}
350
+
351
static void device_class_init(ObjectClass *class, void *data)
352
{
353
DeviceClass *dc = DEVICE_CLASS(class);
354
VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
355
+ ResettableClass *rc = RESETTABLE_CLASS(class);
356
357
class->unparent = device_unparent;
358
359
@@ -XXX,XX +XXX,XX @@ static void device_class_init(ObjectClass *class, void *data)
360
dc->hotpluggable = true;
361
dc->user_creatable = true;
362
vc->get_id = device_vmstate_if_get_id;
363
+ rc->get_state = device_get_reset_state;
364
+ rc->child_foreach = device_reset_child_foreach;
365
+
366
+ /*
367
+ * @device_phases_reset is put as the default reset method below, allowing
368
+ * to do the multi-phase transition from base classes to leaf classes. It
369
+ * allows a legacy-reset Device class to extend a multi-phases-reset
370
+ * Device class for the following reason:
371
+ * + If a base class B has been moved to multi-phase, then it does not
372
+ * override this default reset method and may have defined phase methods.
373
+ * + A child class C (extending class B) which uses
374
+ * device_class_set_parent_reset() (or similar means) to override the
375
+ * reset method will still work as expected. @device_phases_reset function
376
+ * will be registered as the parent reset method and effectively call
377
+ * parent reset phases.
378
+ */
379
+ dc->reset = device_phases_reset;
380
+ rc->get_transitional_function = device_get_transitional_reset;
381
382
object_class_property_add_bool(class, "realized",
383
device_get_realized, device_set_realized,
384
@@ -XXX,XX +XXX,XX @@ static const TypeInfo device_type_info = {
385
.class_size = sizeof(DeviceClass),
386
.interfaces = (InterfaceInfo[]) {
387
{ TYPE_VMSTATE_IF },
388
+ { TYPE_RESETTABLE_INTERFACE },
389
{ }
390
}
391
};
119
};
392
--
120
--
393
2.20.1
121
2.34.1
394
122
395
123
diff view generated by jsdifflib
New patch
1
From: Evgeny Iakovlev <eiakovlev@linux.microsoft.com>
1
2
3
ARM trusted firmware, when built with FEAT_HCX support, sets SCR_EL3.HXEn bit
4
to allow EL2 to modify HCRX_EL2 register without trapping it in EL3. Qemu
5
uses a valid mask to clear unsupported SCR_EL3 bits when emulating SCR_EL3
6
write, and that mask doesn't include SCR_EL3.HXEn bit even if FEAT_HCX is
7
enabled and exposed to the guest. As a result EL3 writes of that bit are
8
ignored.
9
10
Cc: qemu-stable@nongnu.org
11
Signed-off-by: Evgeny Iakovlev <eiakovlev@linux.microsoft.com>
12
Message-id: 20230105221251.17896-4-eiakovlev@linux.microsoft.com
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
target/arm/helper.c | 3 +++
17
1 file changed, 3 insertions(+)
18
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/helper.c
22
+++ b/target/arm/helper.c
23
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
24
if (cpu_isar_feature(aa64_sme, cpu)) {
25
valid_mask |= SCR_ENTP2;
26
}
27
+ if (cpu_isar_feature(aa64_hcx, cpu)) {
28
+ valid_mask |= SCR_HXEN;
29
+ }
30
} else {
31
valid_mask &= ~(SCR_RW | SCR_ST);
32
if (cpu_isar_feature(aa32_ras, cpu)) {
33
--
34
2.34.1
diff view generated by jsdifflib