1
The following changes since commit 3db29dcac23da85486704ef9e7a8e7217f7829cd:
1
Hi; here's a target-arm pullreq. Mostly this is RTH's FEAT_RME
2
series; there are also a handful of bug fixes including some
3
which aren't arm-specific but which it's convenient to include
4
here.
2
5
3
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging (2023-01-12 13:51:36 +0000)
6
thanks
7
-- PMM
8
9
The following changes since commit b455ce4c2f300c8ba47cba7232dd03261368a4cb:
10
11
Merge tag 'q800-for-8.1-pull-request' of https://github.com/vivier/qemu-m68k into staging (2023-06-22 10:18:32 +0200)
4
12
5
are available in the Git repository at:
13
are available in the Git repository at:
6
14
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230113
15
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230623
8
16
9
for you to fetch changes up to 08899b5c68a55a3780d707e2464073c8f2670d31:
17
for you to fetch changes up to 497fad38979c16b6412388927401e577eba43d26:
10
18
11
target/arm: allow writes to SCR_EL3.HXEn bit when FEAT_HCX is enabled (2023-01-13 13:19:36 +0000)
19
pc-bios/keymaps: Use the official xkb name for Arabic layout, not the legacy synonym (2023-06-23 11:46:02 +0100)
12
20
13
----------------------------------------------------------------
21
----------------------------------------------------------------
14
target-arm queue:
22
target-arm queue:
15
hw/arm/stm32f405: correctly describe the memory layout
23
* Add (experimental) support for FEAT_RME
16
hw/arm: Add Olimex H405 board
24
* host-utils: Avoid using __builtin_subcll on buggy versions of Apple Clang
17
cubieboard: Support booting from an SD card image with u-boot on it
25
* target/arm: Restructure has_vfp_d32 test
18
target/arm: Fix sve_probe_page
26
* hw/arm/sbsa-ref: add ITS support in SBSA GIC
19
target/arm: allow writes to SCR_EL3.HXEn bit when FEAT_HCX is enabled
27
* target/arm: Fix sve predicate store, 8 <= VQ <= 15
20
various code cleanups
28
* pc-bios/keymaps: Use the official xkb name for Arabic layout, not the legacy synonym
21
29
22
----------------------------------------------------------------
30
----------------------------------------------------------------
23
Evgeny Iakovlev (1):
31
Peter Maydell (2):
24
target/arm: allow writes to SCR_EL3.HXEn bit when FEAT_HCX is enabled
32
host-utils: Avoid using __builtin_subcll on buggy versions of Apple Clang
33
pc-bios/keymaps: Use the official xkb name for Arabic layout, not the legacy synonym
25
34
26
Felipe Balbi (2):
35
Richard Henderson (23):
27
hw/arm/stm32f405: correctly describe the memory layout
36
target/arm: Add isar_feature_aa64_rme
28
hw/arm: Add Olimex H405
37
target/arm: Update SCR and HCR for RME
38
target/arm: SCR_EL3.NS may be RES1
39
target/arm: Add RME cpregs
40
target/arm: Introduce ARMSecuritySpace
41
include/exec/memattrs: Add two bits of space to MemTxAttrs
42
target/arm: Adjust the order of Phys and Stage2 ARMMMUIdx
43
target/arm: Introduce ARMMMUIdx_Phys_{Realm,Root}
44
target/arm: Remove __attribute__((nonnull)) from ptw.c
45
target/arm: Pipe ARMSecuritySpace through ptw.c
46
target/arm: NSTable is RES0 for the RME EL3 regime
47
target/arm: Handle Block and Page bits for security space
48
target/arm: Handle no-execute for Realm and Root regimes
49
target/arm: Use get_phys_addr_with_struct in S1_ptw_translate
50
target/arm: Move s1_is_el0 into S1Translate
51
target/arm: Use get_phys_addr_with_struct for stage2
52
target/arm: Add GPC syndrome
53
target/arm: Implement GPC exceptions
54
target/arm: Implement the granule protection check
55
target/arm: Add cpu properties for enabling FEAT_RME
56
docs/system/arm: Document FEAT_RME
57
target/arm: Restructure has_vfp_d32 test
58
target/arm: Fix sve predicate store, 8 <= VQ <= 15
29
59
30
Philippe Mathieu-Daudé (27):
60
Shashi Mallela (1):
31
hw/arm/pxa2xx: Simplify pxa255_init()
61
hw/arm/sbsa-ref: add ITS support in SBSA GIC
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'
58
62
59
Richard Henderson (1):
63
docs/system/arm/cpu-features.rst | 23 ++
60
target/arm: Fix sve_probe_page
64
docs/system/arm/emulation.rst | 1 +
61
65
docs/system/arm/sbsa.rst | 14 +
62
Strahinja Jankovic (7):
66
include/exec/memattrs.h | 9 +-
63
hw/misc: Allwinner-A10 Clock Controller Module Emulation
67
include/qemu/compiler.h | 13 +
64
hw/misc: Allwinner A10 DRAM Controller Emulation
68
include/qemu/host-utils.h | 2 +-
65
{hw/i2c,docs/system/arm}: Allwinner TWI/I2C Emulation
69
target/arm/cpu.h | 151 ++++++++---
66
hw/misc: AXP209 PMU Emulation
70
target/arm/internals.h | 27 ++
67
hw/arm: Add AXP209 to Cubieboard
71
target/arm/syndrome.h | 10 +
68
hw/arm: Allwinner A10 enable SPL load from MMC
72
hw/arm/sbsa-ref.c | 33 ++-
69
tests/avocado: Add SD boot test to Cubieboard
73
target/arm/cpu.c | 32 ++-
70
74
target/arm/helper.c | 162 ++++++++++-
71
docs/system/arm/cubieboard.rst | 1 +
75
target/arm/ptw.c | 570 +++++++++++++++++++++++++++++++--------
72
docs/system/arm/orangepi.rst | 1 +
76
target/arm/tcg/cpu64.c | 53 ++++
73
docs/system/arm/stm32.rst | 1 +
77
target/arm/tcg/tlb_helper.c | 96 ++++++-
74
configs/devices/arm-softmmu/default.mak | 1 +
78
target/arm/tcg/translate-sve.c | 2 +-
75
include/hw/adc/npcm7xx_adc.h | 7 +-
79
pc-bios/keymaps/meson.build | 2 +-
76
include/hw/arm/allwinner-a10.h | 27 ++
80
17 files changed, 1034 insertions(+), 166 deletions(-)
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
156
diff view generated by jsdifflib
Deleted patch
1
From: Felipe Balbi <balbi@kernel.org>
2
1
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: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
SPL Boot for Cubieboard expects AXP209 connected to I2C0 bus.
3
Add the missing field for ID_AA64PFR0, and the predicate.
4
4
Disable it if EL3 is forced off by the board or command-line.
5
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
6
5
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Message-id: 20221226220303.14420-6-strahinja.p.jankovic@gmail.com
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230620124418.805717-2-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
hw/arm/cubieboard.c | 6 ++++++
12
target/arm/cpu.h | 6 ++++++
12
hw/arm/Kconfig | 1 +
13
target/arm/cpu.c | 4 ++++
13
2 files changed, 7 insertions(+)
14
2 files changed, 10 insertions(+)
14
15
15
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/cubieboard.c
18
--- a/target/arm/cpu.h
18
+++ b/hw/arm/cubieboard.c
19
+++ b/target/arm/cpu.h
19
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ FIELD(ID_AA64PFR0, SEL2, 36, 4)
20
#include "hw/boards.h"
21
FIELD(ID_AA64PFR0, MPAM, 40, 4)
21
#include "hw/qdev-properties.h"
22
FIELD(ID_AA64PFR0, AMU, 44, 4)
22
#include "hw/arm/allwinner-a10.h"
23
FIELD(ID_AA64PFR0, DIT, 48, 4)
23
+#include "hw/i2c/i2c.h"
24
+FIELD(ID_AA64PFR0, RME, 52, 4)
24
25
FIELD(ID_AA64PFR0, CSV2, 56, 4)
25
static struct arm_boot_info cubieboard_binfo = {
26
FIELD(ID_AA64PFR0, CSV3, 60, 4)
26
.loader_start = AW_A10_SDRAM_BASE,
27
27
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
28
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_sel2(const ARMISARegisters *id)
28
BlockBackend *blk;
29
return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, SEL2) != 0;
29
BusState *bus;
30
}
30
DeviceState *carddev;
31
31
+ I2CBus *i2c;
32
+static inline bool isar_feature_aa64_rme(const ARMISARegisters *id)
32
33
+{
33
/* BIOS is not supported by this board */
34
+ return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, RME) != 0;
34
if (machine->firmware) {
35
+}
35
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
36
+
36
exit(1);
37
static inline bool isar_feature_aa64_vh(const ARMISARegisters *id)
38
{
39
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, VH) != 0;
40
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/cpu.c
43
+++ b/target/arm/cpu.c
44
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
45
cpu->isar.id_dfr0 = FIELD_DP32(cpu->isar.id_dfr0, ID_DFR0, COPSDBG, 0);
46
cpu->isar.id_aa64pfr0 = FIELD_DP64(cpu->isar.id_aa64pfr0,
47
ID_AA64PFR0, EL3, 0);
48
+
49
+ /* Disable the realm management extension, which requires EL3. */
50
+ cpu->isar.id_aa64pfr0 = FIELD_DP64(cpu->isar.id_aa64pfr0,
51
+ ID_AA64PFR0, RME, 0);
37
}
52
}
38
53
39
+ /* Connect AXP 209 */
54
if (!cpu->has_el2) {
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
--
55
--
59
2.34.1
56
2.34.1
60
57
61
58
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Don't dereference CPUTLBEntryFull until we verify that
3
Define the missing SCR and HCR bits, allow SCR_NSE and {SCR,HCR}_GPF
4
the page is valid. Move the other user-only info field
4
to be set, and invalidate TLBs when NSE changes.
5
updates after the valid check to match.
6
5
7
Cc: qemu-stable@nongnu.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1412
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Message-id: 20230620124418.805717-3-richard.henderson@linaro.org
11
Message-id: 20230104190056.305143-1-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
10
---
14
target/arm/sve_helper.c | 14 +++++++++-----
11
target/arm/cpu.h | 5 +++--
15
1 file changed, 9 insertions(+), 5 deletions(-)
12
target/arm/helper.c | 10 ++++++++--
13
2 files changed, 11 insertions(+), 4 deletions(-)
16
14
17
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/sve_helper.c
17
--- a/target/arm/cpu.h
20
+++ b/target/arm/sve_helper.c
18
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ bool sve_probe_page(SVEHostPage *info, bool nofault, CPUARMState *env,
19
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
22
#ifdef CONFIG_USER_ONLY
20
#define HCR_TERR (1ULL << 36)
23
flags = probe_access_flags(env, addr, access_type, mmu_idx, nofault,
21
#define HCR_TEA (1ULL << 37)
24
&info->host, retaddr);
22
#define HCR_MIOCNCE (1ULL << 38)
25
- memset(&info->attrs, 0, sizeof(info->attrs));
23
-/* RES0 bit 39 */
26
- /* Require both ANON and MTE; see allocation_tag_mem(). */
24
+#define HCR_TME (1ULL << 39)
27
- info->tagged = (flags & PAGE_ANON) && (flags & PAGE_MTE);
25
#define HCR_APK (1ULL << 40)
28
#else
26
#define HCR_API (1ULL << 41)
29
CPUTLBEntryFull *full;
27
#define HCR_NV (1ULL << 42)
30
flags = probe_access_full(env, addr, access_type, mmu_idx, nofault,
28
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
31
&info->host, &full, retaddr);
29
#define HCR_NV2 (1ULL << 45)
32
- info->attrs = full->attrs;
30
#define HCR_FWB (1ULL << 46)
33
- info->tagged = full->pte_attrs == 0xf0;
31
#define HCR_FIEN (1ULL << 47)
34
#endif
32
-/* RES0 bit 48 */
35
info->flags = flags;
33
+#define HCR_GPF (1ULL << 48)
36
34
#define HCR_TID4 (1ULL << 49)
37
@@ -XXX,XX +XXX,XX @@ bool sve_probe_page(SVEHostPage *info, bool nofault, CPUARMState *env,
35
#define HCR_TICAB (1ULL << 50)
38
return false;
36
#define HCR_AMVOFFEN (1ULL << 51)
37
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
38
#define SCR_TRNDR (1ULL << 40)
39
#define SCR_ENTP2 (1ULL << 41)
40
#define SCR_GPF (1ULL << 48)
41
+#define SCR_NSE (1ULL << 62)
42
43
#define HSTR_TTEE (1 << 16)
44
#define HSTR_TJDBX (1 << 17)
45
diff --git a/target/arm/helper.c b/target/arm/helper.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/arm/helper.c
48
+++ b/target/arm/helper.c
49
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
50
if (cpu_isar_feature(aa64_fgt, cpu)) {
51
valid_mask |= SCR_FGTEN;
52
}
53
+ if (cpu_isar_feature(aa64_rme, cpu)) {
54
+ valid_mask |= SCR_NSE | SCR_GPF;
55
+ }
56
} else {
57
valid_mask &= ~(SCR_RW | SCR_ST);
58
if (cpu_isar_feature(aa32_ras, cpu)) {
59
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
60
env->cp15.scr_el3 = value;
61
62
/*
63
- * If SCR_EL3.NS changes, i.e. arm_is_secure_below_el3, then
64
+ * If SCR_EL3.{NS,NSE} changes, i.e. change of security state,
65
* we must invalidate all TLBs below EL3.
66
*/
67
- if (changed & SCR_NS) {
68
+ if (changed & (SCR_NS | SCR_NSE)) {
69
tlb_flush_by_mmuidx(env_cpu(env), (ARMMMUIdxBit_E10_0 |
70
ARMMMUIdxBit_E20_0 |
71
ARMMMUIdxBit_E10_1 |
72
@@ -XXX,XX +XXX,XX @@ static void do_hcr_write(CPUARMState *env, uint64_t value, uint64_t valid_mask)
73
if (cpu_isar_feature(aa64_fwb, cpu)) {
74
valid_mask |= HCR_FWB;
75
}
76
+ if (cpu_isar_feature(aa64_rme, cpu)) {
77
+ valid_mask |= HCR_GPF;
78
+ }
39
}
79
}
40
80
41
+#ifdef CONFIG_USER_ONLY
81
if (cpu_isar_feature(any_evt, cpu)) {
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
--
82
--
54
2.34.1
83
2.34.1
55
56
diff view generated by jsdifflib
1
From: Evgeny Iakovlev <eiakovlev@linux.microsoft.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
ARM trusted firmware, when built with FEAT_HCX support, sets SCR_EL3.HXEn bit
3
With RME, SEL2 must also be present to support secure state.
4
to allow EL2 to modify HCRX_EL2 register without trapping it in EL3. Qemu
4
The NS bit is RES1 if SEL2 is not present.
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
5
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>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20230620124418.805717-4-richard.henderson@linaro.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
10
---
16
target/arm/helper.c | 3 +++
11
target/arm/helper.c | 3 +++
17
1 file changed, 3 insertions(+)
12
1 file changed, 3 insertions(+)
18
13
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/helper.c
16
--- a/target/arm/helper.c
22
+++ b/target/arm/helper.c
17
+++ b/target/arm/helper.c
23
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
18
@@ -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
}
19
}
27
+ if (cpu_isar_feature(aa64_hcx, cpu)) {
20
if (cpu_isar_feature(aa64_sel2, cpu)) {
28
+ valid_mask |= SCR_HXEN;
21
valid_mask |= SCR_EEL2;
29
+ }
22
+ } else if (cpu_isar_feature(aa64_rme, cpu)) {
30
} else {
23
+ /* With RME and without SEL2, NS is RES1 (R_GSWWH, I_DJJQJ). */
31
valid_mask &= ~(SCR_RW | SCR_ST);
24
+ value |= SCR_NS;
32
if (cpu_isar_feature(aa32_ras, cpu)) {
25
}
26
if (cpu_isar_feature(aa64_mte, cpu)) {
27
valid_mask |= SCR_ATA;
33
--
28
--
34
2.34.1
29
2.34.1
diff view generated by jsdifflib
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This patch enables copying of SPL from MMC if `-kernel` parameter is not
3
This includes GPCCR, GPTBR, MFAR, the TLB flush insns PAALL, PAALLOS,
4
passed when starting QEMU. SPL is copied to SRAM_A.
4
RPALOS, RPAOS, and the cache flush insns CIPAPA and CIGDPAPA.
5
5
6
The approach is reused from Allwinner H3 implementation.
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested with Armbian and custom Yocto image.
8
Message-id: 20230620124418.805717-5-richard.henderson@linaro.org
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>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
10
---
16
include/hw/arm/allwinner-a10.h | 21 +++++++++++++++++++++
11
target/arm/cpu.h | 19 ++++++++++
17
hw/arm/allwinner-a10.c | 18 ++++++++++++++++++
12
target/arm/helper.c | 84 +++++++++++++++++++++++++++++++++++++++++++++
18
hw/arm/cubieboard.c | 5 +++++
13
2 files changed, 103 insertions(+)
19
3 files changed, 44 insertions(+)
20
14
21
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
22
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/arm/allwinner-a10.h
17
--- a/target/arm/cpu.h
24
+++ b/include/hw/arm/allwinner-a10.h
18
+++ b/target/arm/cpu.h
25
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
26
#include "hw/misc/allwinner-a10-ccm.h"
20
uint64_t fgt_read[2]; /* HFGRTR, HDFGRTR */
27
#include "hw/misc/allwinner-a10-dramc.h"
21
uint64_t fgt_write[2]; /* HFGWTR, HDFGWTR */
28
#include "hw/i2c/allwinner-i2c.h"
22
uint64_t fgt_exec[1]; /* HFGITR */
29
+#include "sysemu/block-backend.h"
23
+
30
24
+ /* RME registers */
31
#include "target/arm/cpu.h"
25
+ uint64_t gpccr_el3;
32
#include "qom/object.h"
26
+ uint64_t gptbr_el3;
33
@@ -XXX,XX +XXX,XX @@ struct AwA10State {
27
+ uint64_t mfar_el3;
34
OHCISysBusState ohci[AW_A10_NUM_USB];
28
} cp15;
29
30
struct {
31
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
32
uint64_t reset_cbar;
33
uint32_t reset_auxcr;
34
bool reset_hivecs;
35
+ uint8_t reset_l0gptsz;
36
37
/*
38
* Intermediate values used during property parsing.
39
@@ -XXX,XX +XXX,XX @@ FIELD(MVFR1, SIMDFMAC, 28, 4)
40
FIELD(MVFR2, SIMDMISC, 0, 4)
41
FIELD(MVFR2, FPMISC, 4, 4)
42
43
+FIELD(GPCCR, PPS, 0, 3)
44
+FIELD(GPCCR, IRGN, 8, 2)
45
+FIELD(GPCCR, ORGN, 10, 2)
46
+FIELD(GPCCR, SH, 12, 2)
47
+FIELD(GPCCR, PGS, 14, 2)
48
+FIELD(GPCCR, GPC, 16, 1)
49
+FIELD(GPCCR, GPCP, 17, 1)
50
+FIELD(GPCCR, L0GPTSZ, 20, 4)
51
+
52
+FIELD(MFAR, FPA, 12, 40)
53
+FIELD(MFAR, NSE, 62, 1)
54
+FIELD(MFAR, NS, 63, 1)
55
+
56
QEMU_BUILD_BUG_ON(ARRAY_SIZE(((ARMCPU *)0)->ccsidr) <= R_V7M_CSSELR_INDEX_MASK);
57
58
/* If adding a feature bit which corresponds to a Linux ELF
59
diff --git a/target/arm/helper.c b/target/arm/helper.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/arm/helper.c
62
+++ b/target/arm/helper.c
63
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo sme_reginfo[] = {
64
.access = PL2_RW, .accessfn = access_esm,
65
.type = ARM_CP_CONST, .resetvalue = 0 },
35
};
66
};
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
+
67
+
57
#endif
68
+static void tlbi_aa64_paall_write(CPUARMState *env, const ARMCPRegInfo *ri,
58
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
69
+ uint64_t value)
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
+{
70
+{
78
+ const int64_t rom_size = 32 * KiB;
71
+ CPUState *cs = env_cpu(env);
79
+ g_autofree uint8_t *buffer = g_new0(uint8_t, rom_size);
80
+
72
+
81
+ if (blk_pread(blk, 8 * KiB, rom_size, buffer, 0) < 0) {
73
+ tlb_flush(cs);
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
+}
74
+}
91
+
75
+
92
static void aw_a10_init(Object *obj)
76
+static void gpccr_write(CPUARMState *env, const ARMCPRegInfo *ri,
93
{
77
+ uint64_t value)
94
AwA10State *s = AW_A10(obj);
78
+{
95
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
79
+ /* L0GPTSZ is RO; other bits not mentioned are RES0. */
96
index XXXXXXX..XXXXXXX 100644
80
+ uint64_t rw_mask = R_GPCCR_PPS_MASK | R_GPCCR_IRGN_MASK |
97
--- a/hw/arm/cubieboard.c
81
+ R_GPCCR_ORGN_MASK | R_GPCCR_SH_MASK | R_GPCCR_PGS_MASK |
98
+++ b/hw/arm/cubieboard.c
82
+ R_GPCCR_GPC_MASK | R_GPCCR_GPCP_MASK;
99
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
83
+
100
memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
84
+ env->cp15.gpccr_el3 = (value & rw_mask) | (env->cp15.gpccr_el3 & ~rw_mask);
101
machine->ram);
85
+}
102
86
+
103
+ /* Load target kernel or start using BootROM */
87
+static void gpccr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
104
+ if (!machine->kernel_filename && blk && blk_is_available(blk)) {
88
+{
105
+ /* Use Boot ROM to copy data from SD card to SRAM */
89
+ env->cp15.gpccr_el3 = FIELD_DP64(0, GPCCR, L0GPTSZ,
106
+ allwinner_a10_bootrom_setup(a10, blk);
90
+ env_archcpu(env)->reset_l0gptsz);
91
+}
92
+
93
+static void tlbi_aa64_paallos_write(CPUARMState *env, const ARMCPRegInfo *ri,
94
+ uint64_t value)
95
+{
96
+ CPUState *cs = env_cpu(env);
97
+
98
+ tlb_flush_all_cpus_synced(cs);
99
+}
100
+
101
+static const ARMCPRegInfo rme_reginfo[] = {
102
+ { .name = "GPCCR_EL3", .state = ARM_CP_STATE_AA64,
103
+ .opc0 = 3, .opc1 = 6, .crn = 2, .crm = 1, .opc2 = 6,
104
+ .access = PL3_RW, .writefn = gpccr_write, .resetfn = gpccr_reset,
105
+ .fieldoffset = offsetof(CPUARMState, cp15.gpccr_el3) },
106
+ { .name = "GPTBR_EL3", .state = ARM_CP_STATE_AA64,
107
+ .opc0 = 3, .opc1 = 6, .crn = 2, .crm = 1, .opc2 = 4,
108
+ .access = PL3_RW, .fieldoffset = offsetof(CPUARMState, cp15.gptbr_el3) },
109
+ { .name = "MFAR_EL3", .state = ARM_CP_STATE_AA64,
110
+ .opc0 = 3, .opc1 = 6, .crn = 6, .crm = 0, .opc2 = 5,
111
+ .access = PL3_RW, .fieldoffset = offsetof(CPUARMState, cp15.mfar_el3) },
112
+ { .name = "TLBI_PAALL", .state = ARM_CP_STATE_AA64,
113
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 4,
114
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
115
+ .writefn = tlbi_aa64_paall_write },
116
+ { .name = "TLBI_PAALLOS", .state = ARM_CP_STATE_AA64,
117
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 4,
118
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
119
+ .writefn = tlbi_aa64_paallos_write },
120
+ /*
121
+ * QEMU does not have a way to invalidate by physical address, thus
122
+ * invalidating a range of physical addresses is accomplished by
123
+ * flushing all tlb entries in the outer sharable domain,
124
+ * just like PAALLOS.
125
+ */
126
+ { .name = "TLBI_RPALOS", .state = ARM_CP_STATE_AA64,
127
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 7,
128
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
129
+ .writefn = tlbi_aa64_paallos_write },
130
+ { .name = "TLBI_RPAOS", .state = ARM_CP_STATE_AA64,
131
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 3,
132
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
133
+ .writefn = tlbi_aa64_paallos_write },
134
+ { .name = "DC_CIPAPA", .state = ARM_CP_STATE_AA64,
135
+ .opc0 = 1, .opc1 = 6, .crn = 7, .crm = 14, .opc2 = 1,
136
+ .access = PL3_W, .type = ARM_CP_NOP },
137
+};
138
+
139
+static const ARMCPRegInfo rme_mte_reginfo[] = {
140
+ { .name = "DC_CIGDPAPA", .state = ARM_CP_STATE_AA64,
141
+ .opc0 = 1, .opc1 = 6, .crn = 7, .crm = 14, .opc2 = 5,
142
+ .access = PL3_W, .type = ARM_CP_NOP },
143
+};
144
#endif /* TARGET_AARCH64 */
145
146
static void define_pmu_regs(ARMCPU *cpu)
147
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
148
if (cpu_isar_feature(aa64_fgt, cpu)) {
149
define_arm_cp_regs(cpu, fgt_reginfo);
150
}
151
+
152
+ if (cpu_isar_feature(aa64_rme, cpu)) {
153
+ define_arm_cp_regs(cpu, rme_reginfo);
154
+ if (cpu_isar_feature(aa64_mte, cpu)) {
155
+ define_arm_cp_regs(cpu, rme_mte_reginfo);
156
+ }
107
+ }
157
+ }
108
/* TODO create and connect IDE devices for ide_drive_get() */
158
#endif
109
159
110
cubieboard_binfo.ram_size = machine->ram_size;
160
if (cpu_isar_feature(any_predinv, cpu)) {
111
--
161
--
112
2.34.1
162
2.34.1
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Following docs/devel/style.rst guidelines, rename
3
Introduce both the enumeration and functions to retrieve
4
stellaris_adc_state -> StellarisADCState. This also remove a
4
the current state, and state outside of EL3.
5
use of 'struct' in the DECLARE_INSTANCE_CHECKER() macro call.
6
5
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109140306.23161-9-philmd@linaro.org
8
Message-id: 20230620124418.805717-6-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
hw/arm/stellaris.c | 73 +++++++++++++++++++++++-----------------------
11
target/arm/cpu.h | 89 ++++++++++++++++++++++++++++++++++-----------
13
1 file changed, 36 insertions(+), 37 deletions(-)
12
target/arm/helper.c | 60 ++++++++++++++++++++++++++++++
13
2 files changed, 127 insertions(+), 22 deletions(-)
14
14
15
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/stellaris.c
17
--- a/target/arm/cpu.h
18
+++ b/hw/arm/stellaris.c
18
+++ b/target/arm/cpu.h
19
@@ -XXX,XX +XXX,XX @@ static void stellaris_i2c_init(Object *obj)
19
@@ -XXX,XX +XXX,XX @@ static inline int arm_feature(CPUARMState *env, int feature)
20
#define STELLARIS_ADC_FIFO_FULL 0x1000
20
21
21
void arm_cpu_finalize_features(ARMCPU *cpu, Error **errp);
22
#define TYPE_STELLARIS_ADC "stellaris-adc"
22
23
-typedef struct StellarisADCState stellaris_adc_state;
23
-#if !defined(CONFIG_USER_ONLY)
24
-DECLARE_INSTANCE_CHECKER(stellaris_adc_state, STELLARIS_ADC,
24
/*
25
- TYPE_STELLARIS_ADC)
25
+ * ARM v9 security states.
26
+typedef struct StellarisADCState StellarisADCState;
26
+ * The ordering of the enumeration corresponds to the low 2 bits
27
+DECLARE_INSTANCE_CHECKER(StellarisADCState, STELLARIS_ADC, TYPE_STELLARIS_ADC)
27
+ * of the GPI value, and (except for Root) the concat of NSE:NS.
28
28
+ */
29
struct StellarisADCState {
29
+
30
SysBusDevice parent_obj;
30
+typedef enum ARMSecuritySpace {
31
@@ -XXX,XX +XXX,XX @@ struct StellarisADCState {
31
+ ARMSS_Secure = 0,
32
qemu_irq irq[4];
32
+ ARMSS_NonSecure = 1,
33
};
33
+ ARMSS_Root = 2,
34
34
+ ARMSS_Realm = 3,
35
-static uint32_t stellaris_adc_fifo_read(stellaris_adc_state *s, int n)
35
+} ARMSecuritySpace;
36
+static uint32_t stellaris_adc_fifo_read(StellarisADCState *s, int n)
36
+
37
{
37
+/* Return true if @space is secure, in the pre-v9 sense. */
38
int tail;
38
+static inline bool arm_space_is_secure(ARMSecuritySpace space)
39
39
+{
40
@@ -XXX,XX +XXX,XX @@ static uint32_t stellaris_adc_fifo_read(stellaris_adc_state *s, int n)
40
+ return space == ARMSS_Secure || space == ARMSS_Root;
41
return s->fifo[n].data[tail];
41
+}
42
}
42
+
43
43
+/* Return the ARMSecuritySpace for @secure, assuming !RME or EL[0-2]. */
44
-static void stellaris_adc_fifo_write(stellaris_adc_state *s, int n,
44
+static inline ARMSecuritySpace arm_secure_to_space(bool secure)
45
+static void stellaris_adc_fifo_write(StellarisADCState *s, int n,
45
+{
46
uint32_t value)
46
+ return secure ? ARMSS_Secure : ARMSS_NonSecure;
47
{
47
+}
48
int head;
48
+
49
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_fifo_write(stellaris_adc_state *s, int n,
49
+#if !defined(CONFIG_USER_ONLY)
50
s->fifo[n].state |= STELLARIS_ADC_FIFO_FULL;
50
+/**
51
}
51
+ * arm_security_space_below_el3:
52
52
+ * @env: cpu context
53
-static void stellaris_adc_update(stellaris_adc_state *s)
53
+ *
54
+static void stellaris_adc_update(StellarisADCState *s)
54
+ * Return the security space of exception levels below EL3, following
55
{
55
+ * an exception return to those levels. Unlike arm_security_space,
56
int level;
56
+ * this doesn't care about the current EL.
57
int n;
57
+ */
58
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_update(stellaris_adc_state *s)
58
+ARMSecuritySpace arm_security_space_below_el3(CPUARMState *env);
59
59
+
60
static void stellaris_adc_trigger(void *opaque, int irq, int level)
60
+/**
61
{
61
+ * arm_is_secure_below_el3:
62
- stellaris_adc_state *s = opaque;
62
+ * @env: cpu context
63
+ StellarisADCState *s = opaque;
63
+ *
64
int n;
64
* Return true if exception levels below EL3 are in secure state,
65
65
- * or would be following an exception return to that level.
66
for (n = 0; n < 4; n++) {
66
- * Unlike arm_is_secure() (which is always a question about the
67
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_trigger(void *opaque, int irq, int level)
67
- * _current_ state of the CPU) this doesn't care about the current
68
- * EL or mode.
69
+ * or would be following an exception return to those levels.
70
*/
71
static inline bool arm_is_secure_below_el3(CPUARMState *env)
72
{
73
- assert(!arm_feature(env, ARM_FEATURE_M));
74
- if (arm_feature(env, ARM_FEATURE_EL3)) {
75
- return !(env->cp15.scr_el3 & SCR_NS);
76
- } else {
77
- /* If EL3 is not supported then the secure state is implementation
78
- * defined, in which case QEMU defaults to non-secure.
79
- */
80
- return false;
81
- }
82
+ ARMSecuritySpace ss = arm_security_space_below_el3(env);
83
+ return ss == ARMSS_Secure;
84
}
85
86
/* Return true if the CPU is AArch64 EL3 or AArch32 Mon */
87
@@ -XXX,XX +XXX,XX @@ static inline bool arm_is_el3_or_mon(CPUARMState *env)
88
return false;
89
}
90
91
-/* Return true if the processor is in secure state */
92
+/**
93
+ * arm_security_space:
94
+ * @env: cpu context
95
+ *
96
+ * Return the current security space of the cpu.
97
+ */
98
+ARMSecuritySpace arm_security_space(CPUARMState *env);
99
+
100
+/**
101
+ * arm_is_secure:
102
+ * @env: cpu context
103
+ *
104
+ * Return true if the processor is in secure state.
105
+ */
106
static inline bool arm_is_secure(CPUARMState *env)
107
{
108
- if (arm_feature(env, ARM_FEATURE_M)) {
109
- return env->v7m.secure;
110
- }
111
- if (arm_is_el3_or_mon(env)) {
112
- return true;
113
- }
114
- return arm_is_secure_below_el3(env);
115
+ return arm_space_is_secure(arm_security_space(env));
116
}
117
118
/*
119
@@ -XXX,XX +XXX,XX @@ static inline bool arm_is_el2_enabled(CPUARMState *env)
120
}
121
122
#else
123
+static inline ARMSecuritySpace arm_security_space_below_el3(CPUARMState *env)
124
+{
125
+ return ARMSS_NonSecure;
126
+}
127
+
128
static inline bool arm_is_secure_below_el3(CPUARMState *env)
129
{
130
return false;
131
}
132
133
+static inline ARMSecuritySpace arm_security_space(CPUARMState *env)
134
+{
135
+ return ARMSS_NonSecure;
136
+}
137
+
138
static inline bool arm_is_secure(CPUARMState *env)
139
{
140
return false;
141
diff --git a/target/arm/helper.c b/target/arm/helper.c
142
index XXXXXXX..XXXXXXX 100644
143
--- a/target/arm/helper.c
144
+++ b/target/arm/helper.c
145
@@ -XXX,XX +XXX,XX @@ void aarch64_sve_change_el(CPUARMState *env, int old_el,
68
}
146
}
69
}
147
}
70
148
#endif
71
-static void stellaris_adc_reset(stellaris_adc_state *s)
149
+
72
+static void stellaris_adc_reset(StellarisADCState *s)
150
+#ifndef CONFIG_USER_ONLY
73
{
151
+ARMSecuritySpace arm_security_space(CPUARMState *env)
74
int n;
152
+{
75
153
+ if (arm_feature(env, ARM_FEATURE_M)) {
76
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_reset(stellaris_adc_state *s)
154
+ return arm_secure_to_space(env->v7m.secure);
77
static uint64_t stellaris_adc_read(void *opaque, hwaddr offset,
155
+ }
78
unsigned size)
156
+
79
{
157
+ /*
80
- stellaris_adc_state *s = opaque;
158
+ * If EL3 is not supported then the secure state is implementation
81
+ StellarisADCState *s = opaque;
159
+ * defined, in which case QEMU defaults to non-secure.
82
160
+ */
83
/* TODO: Implement this. */
161
+ if (!arm_feature(env, ARM_FEATURE_EL3)) {
84
if (offset >= 0x40 && offset < 0xc0) {
162
+ return ARMSS_NonSecure;
85
@@ -XXX,XX +XXX,XX @@ static uint64_t stellaris_adc_read(void *opaque, hwaddr offset,
163
+ }
86
static void stellaris_adc_write(void *opaque, hwaddr offset,
164
+
87
uint64_t value, unsigned size)
165
+ /* Check for AArch64 EL3 or AArch32 Mon. */
88
{
166
+ if (is_a64(env)) {
89
- stellaris_adc_state *s = opaque;
167
+ if (extract32(env->pstate, 2, 2) == 3) {
90
+ StellarisADCState *s = opaque;
168
+ if (cpu_isar_feature(aa64_rme, env_archcpu(env))) {
91
169
+ return ARMSS_Root;
92
/* TODO: Implement this. */
170
+ } else {
93
if (offset >= 0x40 && offset < 0xc0) {
171
+ return ARMSS_Secure;
94
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_stellaris_adc = {
172
+ }
95
.version_id = 1,
173
+ }
96
.minimum_version_id = 1,
174
+ } else {
97
.fields = (VMStateField[]) {
175
+ if ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_MON) {
98
- VMSTATE_UINT32(actss, stellaris_adc_state),
176
+ return ARMSS_Secure;
99
- VMSTATE_UINT32(ris, stellaris_adc_state),
177
+ }
100
- VMSTATE_UINT32(im, stellaris_adc_state),
178
+ }
101
- VMSTATE_UINT32(emux, stellaris_adc_state),
179
+
102
- VMSTATE_UINT32(ostat, stellaris_adc_state),
180
+ return arm_security_space_below_el3(env);
103
- VMSTATE_UINT32(ustat, stellaris_adc_state),
181
+}
104
- VMSTATE_UINT32(sspri, stellaris_adc_state),
182
+
105
- VMSTATE_UINT32(sac, stellaris_adc_state),
183
+ARMSecuritySpace arm_security_space_below_el3(CPUARMState *env)
106
- VMSTATE_UINT32(fifo[0].state, stellaris_adc_state),
184
+{
107
- VMSTATE_UINT32_ARRAY(fifo[0].data, stellaris_adc_state, 16),
185
+ assert(!arm_feature(env, ARM_FEATURE_M));
108
- VMSTATE_UINT32(ssmux[0], stellaris_adc_state),
186
+
109
- VMSTATE_UINT32(ssctl[0], stellaris_adc_state),
187
+ /*
110
- VMSTATE_UINT32(fifo[1].state, stellaris_adc_state),
188
+ * If EL3 is not supported then the secure state is implementation
111
- VMSTATE_UINT32_ARRAY(fifo[1].data, stellaris_adc_state, 16),
189
+ * defined, in which case QEMU defaults to non-secure.
112
- VMSTATE_UINT32(ssmux[1], stellaris_adc_state),
190
+ */
113
- VMSTATE_UINT32(ssctl[1], stellaris_adc_state),
191
+ if (!arm_feature(env, ARM_FEATURE_EL3)) {
114
- VMSTATE_UINT32(fifo[2].state, stellaris_adc_state),
192
+ return ARMSS_NonSecure;
115
- VMSTATE_UINT32_ARRAY(fifo[2].data, stellaris_adc_state, 16),
193
+ }
116
- VMSTATE_UINT32(ssmux[2], stellaris_adc_state),
194
+
117
- VMSTATE_UINT32(ssctl[2], stellaris_adc_state),
195
+ /*
118
- VMSTATE_UINT32(fifo[3].state, stellaris_adc_state),
196
+ * Note NSE cannot be set without RME, and NSE & !NS is Reserved.
119
- VMSTATE_UINT32_ARRAY(fifo[3].data, stellaris_adc_state, 16),
197
+ * Ignoring NSE when !NS retains consistency without having to
120
- VMSTATE_UINT32(ssmux[3], stellaris_adc_state),
198
+ * modify other predicates.
121
- VMSTATE_UINT32(ssctl[3], stellaris_adc_state),
199
+ */
122
- VMSTATE_UINT32(noise, stellaris_adc_state),
200
+ if (!(env->cp15.scr_el3 & SCR_NS)) {
123
+ VMSTATE_UINT32(actss, StellarisADCState),
201
+ return ARMSS_Secure;
124
+ VMSTATE_UINT32(ris, StellarisADCState),
202
+ } else if (env->cp15.scr_el3 & SCR_NSE) {
125
+ VMSTATE_UINT32(im, StellarisADCState),
203
+ return ARMSS_Realm;
126
+ VMSTATE_UINT32(emux, StellarisADCState),
204
+ } else {
127
+ VMSTATE_UINT32(ostat, StellarisADCState),
205
+ return ARMSS_NonSecure;
128
+ VMSTATE_UINT32(ustat, StellarisADCState),
206
+ }
129
+ VMSTATE_UINT32(sspri, StellarisADCState),
207
+}
130
+ VMSTATE_UINT32(sac, StellarisADCState),
208
+#endif /* !CONFIG_USER_ONLY */
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
};
169
--
209
--
170
2.34.1
210
2.34.1
171
172
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This remove a use of 'struct' in the DECLARE_INSTANCE_CHECKER()
3
We will need 2 bits to represent ARMSecurityState.
4
macro call, to avoid after a QOM refactor:
5
4
6
hw/timer/xilinx_timer.c:65:1: error: declaration of anonymous struct must be a definition
5
Do not attempt to replace or widen secure, even though it
7
DECLARE_INSTANCE_CHECKER(struct timerblock, XILINX_TIMER,
6
logically overlaps the new field -- there are uses within
8
^
7
e.g. hw/block/pflash_cfi01.c, which don't know anything
8
specific about ARM.
9
9
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Edgar E. Iglesias <edgar@zeroasic.com>
12
Message-id: 20230620124418.805717-7-richard.henderson@linaro.org
13
Message-id: 20230109140306.23161-15-philmd@linaro.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
14
---
16
hw/timer/xilinx_timer.c | 27 +++++++++++++--------------
15
include/exec/memattrs.h | 9 ++++++++-
17
1 file changed, 13 insertions(+), 14 deletions(-)
16
1 file changed, 8 insertions(+), 1 deletion(-)
18
17
19
diff --git a/hw/timer/xilinx_timer.c b/hw/timer/xilinx_timer.c
18
diff --git a/include/exec/memattrs.h b/include/exec/memattrs.h
20
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/timer/xilinx_timer.c
20
--- a/include/exec/memattrs.h
22
+++ b/hw/timer/xilinx_timer.c
21
+++ b/include/exec/memattrs.h
23
@@ -XXX,XX +XXX,XX @@ struct xlx_timer
22
@@ -XXX,XX +XXX,XX @@ typedef struct MemTxAttrs {
24
};
23
* "didn't specify" if necessary.
25
24
*/
26
#define TYPE_XILINX_TIMER "xlnx.xps-timer"
25
unsigned int unspecified:1;
27
-DECLARE_INSTANCE_CHECKER(struct timerblock, XILINX_TIMER,
26
- /* ARM/AMBA: TrustZone Secure access
28
- TYPE_XILINX_TIMER)
27
+ /*
29
+typedef struct XpsTimerState XpsTimerState;
28
+ * ARM/AMBA: TrustZone Secure access
30
+DECLARE_INSTANCE_CHECKER(XpsTimerState, XILINX_TIMER, TYPE_XILINX_TIMER)
29
* x86: System Management Mode access
31
30
*/
32
-struct timerblock
31
unsigned int secure:1;
33
+struct XpsTimerState
32
+ /*
34
{
33
+ * ARM: ArmSecuritySpace. This partially overlaps secure, but it is
35
SysBusDevice parent_obj;
34
+ * easier to have both fields to assist code that does not understand
36
35
+ * ARMv9 RME, or no specific knowledge of ARM at all (e.g. pflash).
37
@@ -XXX,XX +XXX,XX @@ struct timerblock
36
+ */
38
struct xlx_timer *timers;
37
+ unsigned int space:2;
39
};
38
/* Memory access is usermode (unprivileged) */
40
39
unsigned int user:1;
41
-static inline unsigned int num_timers(struct timerblock *t)
40
/*
42
+static inline unsigned int num_timers(XpsTimerState *t)
43
{
44
return 2 - t->one_timer_only;
45
}
46
@@ -XXX,XX +XXX,XX @@ static inline unsigned int timer_from_addr(hwaddr addr)
47
return addr >> 2;
48
}
49
50
-static void timer_update_irq(struct timerblock *t)
51
+static void timer_update_irq(XpsTimerState *t)
52
{
53
unsigned int i, irq = 0;
54
uint32_t csr;
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);
100
}
101
102
static Property xilinx_timer_properties[] = {
103
- DEFINE_PROP_UINT32("clock-frequency", struct timerblock, freq_hz,
104
- 62 * 1000000),
105
- DEFINE_PROP_UINT8("one-timer-only", struct timerblock, one_timer_only, 0),
106
+ DEFINE_PROP_UINT32("clock-frequency", XpsTimerState, freq_hz, 62 * 1000000),
107
+ DEFINE_PROP_UINT8("one-timer-only", XpsTimerState, one_timer_only, 0),
108
DEFINE_PROP_END_OF_LIST(),
109
};
110
111
@@ -XXX,XX +XXX,XX @@ static void xilinx_timer_class_init(ObjectClass *klass, void *data)
112
static const TypeInfo xilinx_timer_info = {
113
.name = TYPE_XILINX_TIMER,
114
.parent = TYPE_SYS_BUS_DEVICE,
115
- .instance_size = sizeof(struct timerblock),
116
+ .instance_size = sizeof(XpsTimerState),
117
.instance_init = xilinx_timer_init,
118
.class_init = xilinx_timer_class_init,
119
};
120
--
41
--
121
2.34.1
42
2.34.1
122
123
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This remove a use of 'struct' in the DECLARE_INSTANCE_CHECKER()
3
It will be helpful to have ARMMMUIdx_Phys_* to be in the same
4
macro call, to avoid after a QOM refactor:
4
relative order as ARMSecuritySpace enumerators. This requires
5
the adjustment to the nstable check. While there, check for being
6
in secure state rather than rely on clearing the low bit making
7
no change to non-secure state.
5
8
6
hw/intc/xilinx_intc.c:45:1: error: declaration of anonymous struct must be a definition
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
DECLARE_INSTANCE_CHECKER(struct xlx_pic, XILINX_INTC,
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
^
11
Message-id: 20230620124418.805717-8-richard.henderson@linaro.org
9
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Edgar E. Iglesias <edgar@zeroasic.com>
13
Message-id: 20230109140306.23161-14-philmd@linaro.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
13
---
16
hw/intc/xilinx_intc.c | 28 +++++++++++++---------------
14
target/arm/cpu.h | 12 ++++++------
17
1 file changed, 13 insertions(+), 15 deletions(-)
15
target/arm/ptw.c | 12 +++++-------
16
2 files changed, 11 insertions(+), 13 deletions(-)
18
17
19
diff --git a/hw/intc/xilinx_intc.c b/hw/intc/xilinx_intc.c
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
20
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/intc/xilinx_intc.c
20
--- a/target/arm/cpu.h
22
+++ b/hw/intc/xilinx_intc.c
21
+++ b/target/arm/cpu.h
23
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
24
#define R_MAX 8
23
ARMMMUIdx_E2 = 6 | ARM_MMU_IDX_A,
25
24
ARMMMUIdx_E3 = 7 | ARM_MMU_IDX_A,
26
#define TYPE_XILINX_INTC "xlnx.xps-intc"
25
27
-DECLARE_INSTANCE_CHECKER(struct xlx_pic, XILINX_INTC,
26
- /* TLBs with 1-1 mapping to the physical address spaces. */
28
- TYPE_XILINX_INTC)
27
- ARMMMUIdx_Phys_NS = 8 | ARM_MMU_IDX_A,
29
+typedef struct XpsIntc XpsIntc;
28
- ARMMMUIdx_Phys_S = 9 | ARM_MMU_IDX_A,
30
+DECLARE_INSTANCE_CHECKER(XpsIntc, XILINX_INTC, TYPE_XILINX_INTC)
29
-
31
30
/*
32
-struct xlx_pic
31
* Used for second stage of an S12 page table walk, or for descriptor
33
+struct XpsIntc
32
* loads during first stage of an S1 page table walk. Note that both
34
{
33
* are in use simultaneously for SecureEL2: the security state for
35
SysBusDevice parent_obj;
34
* the S2 ptw is selected by the NS bit from the S1 ptw.
36
35
*/
37
@@ -XXX,XX +XXX,XX @@ struct xlx_pic
36
- ARMMMUIdx_Stage2 = 10 | ARM_MMU_IDX_A,
38
uint32_t irq_pin_state;
37
- ARMMMUIdx_Stage2_S = 11 | ARM_MMU_IDX_A,
39
};
38
+ ARMMMUIdx_Stage2_S = 8 | ARM_MMU_IDX_A,
40
39
+ ARMMMUIdx_Stage2 = 9 | ARM_MMU_IDX_A,
41
-static void update_irq(struct xlx_pic *p)
40
+
42
+static void update_irq(XpsIntc *p)
41
+ /* TLBs with 1-1 mapping to the physical address spaces. */
43
{
42
+ ARMMMUIdx_Phys_S = 10 | ARM_MMU_IDX_A,
44
uint32_t i;
43
+ ARMMMUIdx_Phys_NS = 11 | ARM_MMU_IDX_A,
45
44
46
@@ -XXX,XX +XXX,XX @@ static void update_irq(struct xlx_pic *p)
45
/*
47
qemu_set_irq(p->parent_irq, (p->regs[R_MER] & 1) && p->regs[R_IPR]);
46
* These are not allocated TLBs and are used only for AT system
48
}
47
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
49
48
index XXXXXXX..XXXXXXX 100644
50
-static uint64_t
49
--- a/target/arm/ptw.c
51
-pic_read(void *opaque, hwaddr addr, unsigned int size)
50
+++ b/target/arm/ptw.c
52
+static uint64_t pic_read(void *opaque, hwaddr addr, unsigned int size)
51
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
53
{
52
descaddr |= (address >> (stride * (4 - level))) & indexmask;
54
- struct xlx_pic *p = opaque;
53
descaddr &= ~7ULL;
55
+ XpsIntc *p = opaque;
54
nstable = !regime_is_stage2(mmu_idx) && extract32(tableattrs, 4, 1);
56
uint32_t r = 0;
55
- if (nstable) {
57
56
+ if (nstable && ptw->in_secure) {
58
addr >>= 2;
57
/*
59
@@ -XXX,XX +XXX,XX @@ pic_read(void *opaque, hwaddr addr, unsigned int size)
58
* Stage2_S -> Stage2 or Phys_S -> Phys_NS
60
return r;
59
- * Assert that the non-secure idx are even, and relative order.
61
}
60
+ * Assert the relative order of the secure/non-secure indexes.
62
61
*/
63
-static void
62
- QEMU_BUILD_BUG_ON((ARMMMUIdx_Phys_NS & 1) != 0);
64
-pic_write(void *opaque, hwaddr addr,
63
- QEMU_BUILD_BUG_ON((ARMMMUIdx_Stage2 & 1) != 0);
65
- uint64_t val64, unsigned int size)
64
- QEMU_BUILD_BUG_ON(ARMMMUIdx_Phys_NS + 1 != ARMMMUIdx_Phys_S);
66
+static void pic_write(void *opaque, hwaddr addr,
65
- QEMU_BUILD_BUG_ON(ARMMMUIdx_Stage2 + 1 != ARMMMUIdx_Stage2_S);
67
+ uint64_t val64, unsigned int size)
66
- ptw->in_ptw_idx &= ~1;
68
{
67
+ QEMU_BUILD_BUG_ON(ARMMMUIdx_Phys_S + 1 != ARMMMUIdx_Phys_NS);
69
- struct xlx_pic *p = opaque;
68
+ QEMU_BUILD_BUG_ON(ARMMMUIdx_Stage2_S + 1 != ARMMMUIdx_Stage2);
70
+ XpsIntc *p = opaque;
69
+ ptw->in_ptw_idx += 1;
71
uint32_t value = val64;
70
ptw->in_secure = false;
72
71
}
73
addr >>= 2;
72
if (!S1_ptw_translate(env, ptw, descaddr, fi)) {
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)
93
}
94
95
static Property xilinx_intc_properties[] = {
96
- DEFINE_PROP_UINT32("kind-of-intr", struct xlx_pic, c_kind_of_intr, 0),
97
+ DEFINE_PROP_UINT32("kind-of-intr", XpsIntc, c_kind_of_intr, 0),
98
DEFINE_PROP_END_OF_LIST(),
99
};
100
101
@@ -XXX,XX +XXX,XX @@ static void xilinx_intc_class_init(ObjectClass *klass, void *data)
102
static const TypeInfo xilinx_intc_info = {
103
.name = TYPE_XILINX_INTC,
104
.parent = TYPE_SYS_BUS_DEVICE,
105
- .instance_size = sizeof(struct xlx_pic),
106
+ .instance_size = sizeof(XpsIntc),
107
.instance_init = xilinx_intc_init,
108
.class_init = xilinx_intc_class_init,
109
};
110
--
73
--
111
2.34.1
74
2.34.1
112
113
diff view generated by jsdifflib
1
From: Felipe Balbi <balbi@kernel.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Olimex makes a series of low-cost STM32 boards. This commit introduces
3
With FEAT_RME, there are four physical address spaces.
4
the minimum setup to support SMT32-H405. See [1] for details
4
For now, just define the symbols, and mention them in
5
the same spots as the other Phys indexes in ptw.c.
5
6
6
[1] https://www.olimex.com/Products/ARM/ST/STM32-H405/
7
8
Signed-off-by: Felipe Balbi <balbi@kernel.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20221230145733.200496-3-balbi@kernel.org
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20230620124418.805717-9-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
12
---
14
docs/system/arm/stm32.rst | 1 +
13
target/arm/cpu.h | 23 +++++++++++++++++++++--
15
configs/devices/arm-softmmu/default.mak | 1 +
14
target/arm/ptw.c | 10 ++++++++--
16
hw/arm/olimex-stm32-h405.c | 69 +++++++++++++++++++++++++
15
2 files changed, 29 insertions(+), 4 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
22
16
23
diff --git a/docs/system/arm/stm32.rst b/docs/system/arm/stm32.rst
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
24
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
25
--- a/docs/system/arm/stm32.rst
19
--- a/target/arm/cpu.h
26
+++ b/docs/system/arm/stm32.rst
20
+++ b/target/arm/cpu.h
27
@@ -XXX,XX +XXX,XX @@ The STM32F4 series is based on ARM Cortex-M4F core. This series is pin-to-pin
21
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
28
compatible with STM32F2 series. The following machines are based on this chip :
22
ARMMMUIdx_Stage2 = 9 | ARM_MMU_IDX_A,
29
23
30
- ``netduinoplus2`` Netduino Plus 2 board with STM32F405RGT6 microcontroller
24
/* TLBs with 1-1 mapping to the physical address spaces. */
31
+- ``olimex-stm32-h405`` Olimex STM32 H405 board with STM32F405RGT6 microcontroller
25
- ARMMMUIdx_Phys_S = 10 | ARM_MMU_IDX_A,
32
26
- ARMMMUIdx_Phys_NS = 11 | ARM_MMU_IDX_A,
33
There are many other STM32 series that are currently not supported by QEMU.
27
+ ARMMMUIdx_Phys_S = 10 | ARM_MMU_IDX_A,
34
28
+ ARMMMUIdx_Phys_NS = 11 | ARM_MMU_IDX_A,
35
diff --git a/configs/devices/arm-softmmu/default.mak b/configs/devices/arm-softmmu/default.mak
29
+ ARMMMUIdx_Phys_Root = 12 | ARM_MMU_IDX_A,
36
index XXXXXXX..XXXXXXX 100644
30
+ ARMMMUIdx_Phys_Realm = 13 | ARM_MMU_IDX_A,
37
--- a/configs/devices/arm-softmmu/default.mak
31
38
+++ b/configs/devices/arm-softmmu/default.mak
32
/*
39
@@ -XXX,XX +XXX,XX @@ CONFIG_COLLIE=y
33
* These are not allocated TLBs and are used only for AT system
40
CONFIG_ASPEED_SOC=y
34
@@ -XXX,XX +XXX,XX @@ typedef enum ARMASIdx {
41
CONFIG_NETDUINO2=y
35
ARMASIdx_TagS = 3,
42
CONFIG_NETDUINOPLUS2=y
36
} ARMASIdx;
43
+CONFIG_OLIMEX_STM32_H405=y
37
44
CONFIG_MPS2=y
38
+static inline ARMMMUIdx arm_space_to_phys(ARMSecuritySpace space)
45
CONFIG_RASPI=y
39
+{
46
CONFIG_DIGIC=y
40
+ /* Assert the relative order of the physical mmu indexes. */
47
diff --git a/hw/arm/olimex-stm32-h405.c b/hw/arm/olimex-stm32-h405.c
41
+ QEMU_BUILD_BUG_ON(ARMSS_Secure != 0);
48
new file mode 100644
42
+ QEMU_BUILD_BUG_ON(ARMMMUIdx_Phys_NS != ARMMMUIdx_Phys_S + ARMSS_NonSecure);
49
index XXXXXXX..XXXXXXX
43
+ QEMU_BUILD_BUG_ON(ARMMMUIdx_Phys_Root != ARMMMUIdx_Phys_S + ARMSS_Root);
50
--- /dev/null
44
+ QEMU_BUILD_BUG_ON(ARMMMUIdx_Phys_Realm != ARMMMUIdx_Phys_S + ARMSS_Realm);
51
+++ b/hw/arm/olimex-stm32-h405.c
52
@@ -XXX,XX +XXX,XX @@
53
+/*
54
+ * ST STM32VLDISCOVERY machine
55
+ * Olimex STM32-H405 machine
56
+ *
57
+ * Copyright (c) 2022 Felipe Balbi <balbi@kernel.org>
58
+ *
59
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
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.
76
+ */
77
+
45
+
78
+#include "qemu/osdep.h"
46
+ return ARMMMUIdx_Phys_S + space;
79
+#include "qapi/error.h"
80
+#include "hw/boards.h"
81
+#include "hw/qdev-properties.h"
82
+#include "hw/qdev-clock.h"
83
+#include "qemu/error-report.h"
84
+#include "hw/arm/stm32f405_soc.h"
85
+#include "hw/arm/boot.h"
86
+
87
+/* olimex-stm32-h405 implementation is derived from netduinoplus2 */
88
+
89
+/* Main SYSCLK frequency in Hz (168MHz) */
90
+#define SYSCLK_FRQ 168000000ULL
91
+
92
+static void olimex_stm32_h405_init(MachineState *machine)
93
+{
94
+ DeviceState *dev;
95
+ Clock *sysclk;
96
+
97
+ /* This clock doesn't need migration because it is fixed-frequency */
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);
109
+}
47
+}
110
+
48
+
111
+static void olimex_stm32_h405_machine_init(MachineClass *mc)
49
+static inline ARMSecuritySpace arm_phys_to_space(ARMMMUIdx idx)
112
+{
50
+{
113
+ mc->desc = "Olimex STM32-H405 (Cortex-M4)";
51
+ assert(idx >= ARMMMUIdx_Phys_S && idx <= ARMMMUIdx_Phys_Realm);
114
+ mc->init = olimex_stm32_h405_init;
52
+ return idx - ARMMMUIdx_Phys_S;
115
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m4");
116
+
117
+ /* SRAM pre-allocated as part of the SoC instantiation */
118
+ mc->default_ram_size = 0;
119
+}
53
+}
120
+
54
+
121
+DEFINE_MACHINE("olimex-stm32-h405", olimex_stm32_h405_machine_init)
55
static inline bool arm_v7m_csselr_razwi(ARMCPU *cpu)
122
diff --git a/MAINTAINERS b/MAINTAINERS
56
{
57
/* If all the CLIDR.Ctypem bits are 0 there are no caches, and
58
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
123
index XXXXXXX..XXXXXXX 100644
59
index XXXXXXX..XXXXXXX 100644
124
--- a/MAINTAINERS
60
--- a/target/arm/ptw.c
125
+++ b/MAINTAINERS
61
+++ b/target/arm/ptw.c
126
@@ -XXX,XX +XXX,XX @@ L: qemu-arm@nongnu.org
62
@@ -XXX,XX +XXX,XX @@ static bool regime_translation_disabled(CPUARMState *env, ARMMMUIdx mmu_idx,
127
S: Maintained
63
case ARMMMUIdx_E3:
128
F: hw/arm/netduinoplus2.c
64
break;
129
65
130
+Olimex STM32 H405
66
- case ARMMMUIdx_Phys_NS:
131
+M: Felipe Balbi <balbi@kernel.org>
67
case ARMMMUIdx_Phys_S:
132
+L: qemu-arm@nongnu.org
68
+ case ARMMMUIdx_Phys_NS:
133
+S: Maintained
69
+ case ARMMMUIdx_Phys_Root:
134
+F: hw/arm/olimex-stm32-h405.c
70
+ case ARMMMUIdx_Phys_Realm:
135
+
71
/* No translation for physical address spaces. */
136
SmartFusion2
72
return true;
137
M: Subbaraya Sundeep <sundeep.lkml@gmail.com>
73
138
M: Peter Maydell <peter.maydell@linaro.org>
74
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_disabled(CPUARMState *env, target_ulong address,
139
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
75
switch (mmu_idx) {
140
index XXXXXXX..XXXXXXX 100644
76
case ARMMMUIdx_Stage2:
141
--- a/hw/arm/Kconfig
77
case ARMMMUIdx_Stage2_S:
142
+++ b/hw/arm/Kconfig
78
- case ARMMMUIdx_Phys_NS:
143
@@ -XXX,XX +XXX,XX @@ config NETDUINOPLUS2
79
case ARMMMUIdx_Phys_S:
144
bool
80
+ case ARMMMUIdx_Phys_NS:
145
select STM32F405_SOC
81
+ case ARMMMUIdx_Phys_Root:
146
82
+ case ARMMMUIdx_Phys_Realm:
147
+config OLIMEX_STM32_H405
83
break;
148
+ bool
84
149
+ select STM32F405_SOC
85
default:
150
+
86
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
151
config NSERIES
87
switch (mmu_idx) {
152
bool
88
case ARMMMUIdx_Phys_S:
153
select OMAP
89
case ARMMMUIdx_Phys_NS:
154
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
90
+ case ARMMMUIdx_Phys_Root:
155
index XXXXXXX..XXXXXXX 100644
91
+ case ARMMMUIdx_Phys_Realm:
156
--- a/hw/arm/meson.build
92
/* Checking Phys early avoids special casing later vs regime_el. */
157
+++ b/hw/arm/meson.build
93
return get_phys_addr_disabled(env, address, access_type, mmu_idx,
158
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_MICROBIT', if_true: files('microbit.c'))
94
is_secure, result, fi);
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'))
166
--
95
--
167
2.34.1
96
2.34.1
168
97
169
98
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This model was merged few days before the QOM cleanup from
3
This was added in 7e98e21c098 as part of a reorg in which
4
commit 8063396bf3 ("Use OBJECT_DECLARE_SIMPLE_TYPE when possible")
4
one of the argument had been legally NULL, and this caught
5
was pulled and merged. Manually adapt.
5
actual instances. Now that the reorg is complete, this
6
serves little purpose.
6
7
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Message-id: 20230109140306.23161-13-philmd@linaro.org
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20230620124418.805717-10-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
13
---
12
hw/misc/sbsa_ec.c | 3 +--
14
target/arm/ptw.c | 6 ++----
13
1 file changed, 1 insertion(+), 2 deletions(-)
15
1 file changed, 2 insertions(+), 4 deletions(-)
14
16
15
diff --git a/hw/misc/sbsa_ec.c b/hw/misc/sbsa_ec.c
17
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/misc/sbsa_ec.c
19
--- a/target/arm/ptw.c
18
+++ b/hw/misc/sbsa_ec.c
20
+++ b/target/arm/ptw.c
19
@@ -XXX,XX +XXX,XX @@ typedef struct SECUREECState {
21
@@ -XXX,XX +XXX,XX @@ typedef struct S1Translate {
20
} SECUREECState;
22
static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
21
23
uint64_t address,
22
#define TYPE_SBSA_SECURE_EC "sbsa-ec"
24
MMUAccessType access_type, bool s1_is_el0,
23
-#define SBSA_SECURE_EC(obj) \
25
- GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
24
- OBJECT_CHECK(SECUREECState, (obj), TYPE_SBSA_SECURE_EC)
26
- __attribute__((nonnull));
25
+OBJECT_DECLARE_SIMPLE_TYPE(SECUREECState, SBSA_SECURE_EC)
27
+ GetPhysAddrResult *result, ARMMMUFaultInfo *fi);
26
28
27
enum sbsa_ec_powerstates {
29
static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
28
SBSA_EC_CMD_POWEROFF = 0x01,
30
target_ulong address,
31
MMUAccessType access_type,
32
GetPhysAddrResult *result,
33
- ARMMMUFaultInfo *fi)
34
- __attribute__((nonnull));
35
+ ARMMMUFaultInfo *fi);
36
37
/* This mapping is common between ID_AA64MMFR0.PARANGE and TCR_ELx.{I}PS. */
38
static const uint8_t pamax_map[] = {
29
--
39
--
30
2.34.1
40
2.34.1
31
41
32
42
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The structure is named SECUREECState. Rename the type accordingly.
3
Add input and output space members to S1Translate. Set and adjust
4
them in S1_ptw_translate, and the various points at which we drop
5
secure state. Initialize the space in get_phys_addr; for now leave
6
get_phys_addr_with_secure considering only secure vs non-secure spaces.
4
7
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20230109140306.23161-12-philmd@linaro.org
10
Message-id: 20230620124418.805717-11-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
12
---
10
hw/misc/sbsa_ec.c | 13 +++++++------
13
target/arm/ptw.c | 86 +++++++++++++++++++++++++++++++++++++++---------
11
1 file changed, 7 insertions(+), 6 deletions(-)
14
1 file changed, 71 insertions(+), 15 deletions(-)
12
15
13
diff --git a/hw/misc/sbsa_ec.c b/hw/misc/sbsa_ec.c
16
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/misc/sbsa_ec.c
18
--- a/target/arm/ptw.c
16
+++ b/hw/misc/sbsa_ec.c
19
+++ b/target/arm/ptw.c
17
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
18
#include "hw/sysbus.h"
21
typedef struct S1Translate {
19
#include "sysemu/runstate.h"
22
ARMMMUIdx in_mmu_idx;
20
23
ARMMMUIdx in_ptw_idx;
21
-typedef struct {
24
+ ARMSecuritySpace in_space;
22
+typedef struct SECUREECState {
25
bool in_secure;
23
SysBusDevice parent_obj;
26
bool in_debug;
24
MemoryRegion iomem;
27
bool out_secure;
25
} SECUREECState;
28
bool out_rw;
26
29
bool out_be;
27
-#define TYPE_SBSA_EC "sbsa-ec"
30
+ ARMSecuritySpace out_space;
28
-#define SECURE_EC(obj) OBJECT_CHECK(SECUREECState, (obj), TYPE_SBSA_EC)
31
hwaddr out_virt;
29
+#define TYPE_SBSA_SECURE_EC "sbsa-ec"
32
hwaddr out_phys;
30
+#define SBSA_SECURE_EC(obj) \
33
void *out_host;
31
+ OBJECT_CHECK(SECUREECState, (obj), TYPE_SBSA_SECURE_EC)
34
@@ -XXX,XX +XXX,XX @@ static bool S2_attrs_are_device(uint64_t hcr, uint8_t attrs)
32
35
static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
33
enum sbsa_ec_powerstates {
36
hwaddr addr, ARMMMUFaultInfo *fi)
34
SBSA_EC_CMD_POWEROFF = 0x01,
37
{
35
@@ -XXX,XX +XXX,XX @@ static uint64_t sbsa_ec_read(void *opaque, hwaddr offset, unsigned size)
38
+ ARMSecuritySpace space = ptw->in_space;
39
bool is_secure = ptw->in_secure;
40
ARMMMUIdx mmu_idx = ptw->in_mmu_idx;
41
ARMMMUIdx s2_mmu_idx = ptw->in_ptw_idx;
42
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
43
.in_mmu_idx = s2_mmu_idx,
44
.in_ptw_idx = ptw_idx_for_stage_2(env, s2_mmu_idx),
45
.in_secure = s2_mmu_idx == ARMMMUIdx_Stage2_S,
46
+ .in_space = (s2_mmu_idx == ARMMMUIdx_Stage2_S ? ARMSS_Secure
47
+ : space == ARMSS_Realm ? ARMSS_Realm
48
+ : ARMSS_NonSecure),
49
.in_debug = true,
50
};
51
GetPhysAddrResult s2 = { };
52
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
53
ptw->out_phys = s2.f.phys_addr;
54
pte_attrs = s2.cacheattrs.attrs;
55
ptw->out_secure = s2.f.attrs.secure;
56
+ ptw->out_space = s2.f.attrs.space;
57
} else {
58
/* Regime is physical. */
59
ptw->out_phys = addr;
60
pte_attrs = 0;
61
ptw->out_secure = s2_mmu_idx == ARMMMUIdx_Phys_S;
62
+ ptw->out_space = (s2_mmu_idx == ARMMMUIdx_Phys_S ? ARMSS_Secure
63
+ : space == ARMSS_Realm ? ARMSS_Realm
64
+ : ARMSS_NonSecure);
65
}
66
ptw->out_host = NULL;
67
ptw->out_rw = false;
68
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
69
ptw->out_rw = full->prot & PAGE_WRITE;
70
pte_attrs = full->pte_attrs;
71
ptw->out_secure = full->attrs.secure;
72
+ ptw->out_space = full->attrs.space;
73
#else
74
g_assert_not_reached();
75
#endif
76
@@ -XXX,XX +XXX,XX @@ static uint32_t arm_ldl_ptw(CPUARMState *env, S1Translate *ptw,
77
}
78
} else {
79
/* Page tables are in MMIO. */
80
- MemTxAttrs attrs = { .secure = ptw->out_secure };
81
+ MemTxAttrs attrs = {
82
+ .secure = ptw->out_secure,
83
+ .space = ptw->out_space,
84
+ };
85
AddressSpace *as = arm_addressspace(cs, attrs);
86
MemTxResult result = MEMTX_OK;
87
88
@@ -XXX,XX +XXX,XX @@ static uint64_t arm_ldq_ptw(CPUARMState *env, S1Translate *ptw,
89
#endif
90
} else {
91
/* Page tables are in MMIO. */
92
- MemTxAttrs attrs = { .secure = ptw->out_secure };
93
+ MemTxAttrs attrs = {
94
+ .secure = ptw->out_secure,
95
+ .space = ptw->out_space,
96
+ };
97
AddressSpace *as = arm_addressspace(cs, attrs);
98
MemTxResult result = MEMTX_OK;
99
100
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, S1Translate *ptw,
101
* regime, because the attribute will already be non-secure.
102
*/
103
result->f.attrs.secure = false;
104
+ result->f.attrs.space = ARMSS_NonSecure;
105
}
106
result->f.phys_addr = phys_addr;
107
return false;
108
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
109
* regime, because the attribute will already be non-secure.
110
*/
111
result->f.attrs.secure = false;
112
+ result->f.attrs.space = ARMSS_NonSecure;
113
}
114
115
if (regime_is_stage2(mmu_idx)) {
116
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
117
*/
118
if (sattrs.ns) {
119
result->f.attrs.secure = false;
120
+ result->f.attrs.space = ARMSS_NonSecure;
121
} else if (!secure) {
122
/*
123
* NS access to S memory must fault.
124
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
125
bool is_secure = ptw->in_secure;
126
bool ret, ipa_secure;
127
ARMCacheAttrs cacheattrs1;
128
+ ARMSecuritySpace ipa_space;
129
bool is_el0;
130
uint64_t hcr;
131
132
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
133
134
ipa = result->f.phys_addr;
135
ipa_secure = result->f.attrs.secure;
136
+ ipa_space = result->f.attrs.space;
137
138
is_el0 = ptw->in_mmu_idx == ARMMMUIdx_Stage1_E0;
139
ptw->in_mmu_idx = ipa_secure ? ARMMMUIdx_Stage2_S : ARMMMUIdx_Stage2;
140
ptw->in_secure = ipa_secure;
141
+ ptw->in_space = ipa_space;
142
ptw->in_ptw_idx = ptw_idx_for_stage_2(env, ptw->in_mmu_idx);
143
144
/*
145
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
146
ARMMMUIdx s1_mmu_idx;
147
148
/*
149
- * The page table entries may downgrade secure to non-secure, but
150
- * cannot upgrade an non-secure translation regime's attributes
151
- * to secure.
152
+ * The page table entries may downgrade Secure to NonSecure, but
153
+ * cannot upgrade a NonSecure translation regime's attributes
154
+ * to Secure or Realm.
155
*/
156
result->f.attrs.secure = is_secure;
157
+ result->f.attrs.space = ptw->in_space;
158
159
switch (mmu_idx) {
160
case ARMMMUIdx_Phys_S:
161
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
162
163
default:
164
/* Single stage uses physical for ptw. */
165
- ptw->in_ptw_idx = is_secure ? ARMMMUIdx_Phys_S : ARMMMUIdx_Phys_NS;
166
+ ptw->in_ptw_idx = arm_space_to_phys(ptw->in_space);
167
break;
168
}
169
170
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr_with_secure(CPUARMState *env, target_ulong address,
171
S1Translate ptw = {
172
.in_mmu_idx = mmu_idx,
173
.in_secure = is_secure,
174
+ .in_space = arm_secure_to_space(is_secure),
175
};
176
return get_phys_addr_with_struct(env, &ptw, address, access_type,
177
result, fi);
178
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
179
MMUAccessType access_type, ARMMMUIdx mmu_idx,
180
GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
181
{
182
- bool is_secure;
183
+ S1Translate ptw = {
184
+ .in_mmu_idx = mmu_idx,
185
+ };
186
+ ARMSecuritySpace ss;
187
188
switch (mmu_idx) {
189
case ARMMMUIdx_E10_0:
190
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
191
case ARMMMUIdx_Stage1_E1:
192
case ARMMMUIdx_Stage1_E1_PAN:
193
case ARMMMUIdx_E2:
194
- is_secure = arm_is_secure_below_el3(env);
195
+ ss = arm_security_space_below_el3(env);
196
break;
197
case ARMMMUIdx_Stage2:
198
+ /*
199
+ * For Secure EL2, we need this index to be NonSecure;
200
+ * otherwise this will already be NonSecure or Realm.
201
+ */
202
+ ss = arm_security_space_below_el3(env);
203
+ if (ss == ARMSS_Secure) {
204
+ ss = ARMSS_NonSecure;
205
+ }
206
+ break;
207
case ARMMMUIdx_Phys_NS:
208
case ARMMMUIdx_MPrivNegPri:
209
case ARMMMUIdx_MUserNegPri:
210
case ARMMMUIdx_MPriv:
211
case ARMMMUIdx_MUser:
212
- is_secure = false;
213
+ ss = ARMSS_NonSecure;
214
break;
215
- case ARMMMUIdx_E3:
216
case ARMMMUIdx_Stage2_S:
217
case ARMMMUIdx_Phys_S:
218
case ARMMMUIdx_MSPrivNegPri:
219
case ARMMMUIdx_MSUserNegPri:
220
case ARMMMUIdx_MSPriv:
221
case ARMMMUIdx_MSUser:
222
- is_secure = true;
223
+ ss = ARMSS_Secure;
224
+ break;
225
+ case ARMMMUIdx_E3:
226
+ if (arm_feature(env, ARM_FEATURE_AARCH64) &&
227
+ cpu_isar_feature(aa64_rme, env_archcpu(env))) {
228
+ ss = ARMSS_Root;
229
+ } else {
230
+ ss = ARMSS_Secure;
231
+ }
232
+ break;
233
+ case ARMMMUIdx_Phys_Root:
234
+ ss = ARMSS_Root;
235
+ break;
236
+ case ARMMMUIdx_Phys_Realm:
237
+ ss = ARMSS_Realm;
238
break;
239
default:
240
g_assert_not_reached();
241
}
242
- return get_phys_addr_with_secure(env, address, access_type, mmu_idx,
243
- is_secure, result, fi);
244
+
245
+ ptw.in_space = ss;
246
+ ptw.in_secure = arm_space_is_secure(ss);
247
+ return get_phys_addr_with_struct(env, &ptw, address, access_type,
248
+ result, fi);
36
}
249
}
37
250
38
static void sbsa_ec_write(void *opaque, hwaddr offset,
251
hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
39
- uint64_t value, unsigned size)
252
@@ -XXX,XX +XXX,XX @@ hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
40
+ uint64_t value, unsigned size)
41
{
253
{
42
if (offset == 0) { /* PSCI machine power command register */
254
ARMCPU *cpu = ARM_CPU(cs);
43
switch (value) {
255
CPUARMState *env = &cpu->env;
44
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps sbsa_ec_ops = {
256
+ ARMMMUIdx mmu_idx = arm_mmu_idx(env);
45
257
+ ARMSecuritySpace ss = arm_security_space(env);
46
static void sbsa_ec_init(Object *obj)
258
S1Translate ptw = {
47
{
259
- .in_mmu_idx = arm_mmu_idx(env),
48
- SECUREECState *s = SECURE_EC(obj);
260
- .in_secure = arm_is_secure(env),
49
+ SECUREECState *s = SBSA_SECURE_EC(obj);
261
+ .in_mmu_idx = mmu_idx,
50
SysBusDevice *dev = SYS_BUS_DEVICE(obj);
262
+ .in_space = ss,
51
263
+ .in_secure = arm_space_is_secure(ss),
52
memory_region_init_io(&s->iomem, obj, &sbsa_ec_ops, s, "sbsa-ec",
264
.in_debug = true,
53
@@ -XXX,XX +XXX,XX @@ static void sbsa_ec_class_init(ObjectClass *klass, void *data)
265
};
54
}
266
GetPhysAddrResult res = {};
55
56
static const TypeInfo sbsa_ec_info = {
57
- .name = TYPE_SBSA_EC,
58
+ .name = TYPE_SBSA_SECURE_EC,
59
.parent = TYPE_SYS_BUS_DEVICE,
60
.instance_size = sizeof(SECUREECState),
61
.instance_init = sbsa_ec_init,
62
--
267
--
63
2.34.1
268
2.34.1
64
65
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
NPCM7XX models have been commited after the conversion from
3
Test in_space instead of in_secure so that we don't
4
commit 8063396bf3 ("Use OBJECT_DECLARE_SIMPLE_TYPE when possible").
4
switch out of Root space.
5
Manually convert them.
6
5
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109140306.23161-11-philmd@linaro.org
8
Message-id: 20230620124418.805717-12-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
include/hw/adc/npcm7xx_adc.h | 7 +++----
11
target/arm/ptw.c | 28 ++++++++++++++--------------
13
include/hw/arm/npcm7xx.h | 18 ++++++------------
12
1 file changed, 14 insertions(+), 14 deletions(-)
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
13
24
diff --git a/include/hw/adc/npcm7xx_adc.h b/include/hw/adc/npcm7xx_adc.h
14
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
25
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/adc/npcm7xx_adc.h
16
--- a/target/arm/ptw.c
27
+++ b/include/hw/adc/npcm7xx_adc.h
17
+++ b/target/arm/ptw.c
28
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
29
* @iref: The internal reference voltage, initialized at launch time.
19
{
30
* @rv: The calibrated output values of 0.5V and 1.5V for the ADC.
20
ARMCPU *cpu = env_archcpu(env);
31
*/
21
ARMMMUIdx mmu_idx = ptw->in_mmu_idx;
32
-typedef struct {
22
- bool is_secure = ptw->in_secure;
33
+struct NPCM7xxADCState {
23
int32_t level;
34
SysBusDevice parent;
24
ARMVAParameters param;
35
25
uint64_t ttbr;
36
MemoryRegion iomem;
26
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
37
@@ -XXX,XX +XXX,XX @@ typedef struct {
27
uint64_t descaddrmask;
38
uint32_t iref;
28
bool aarch64 = arm_el_is_aa64(env, el);
39
29
uint64_t descriptor, new_descriptor;
40
uint16_t calibration_r_values[NPCM7XX_ADC_NUM_CALIB];
30
- bool nstable;
41
-} NPCM7xxADCState;
31
42
+};
32
/* TODO: This code does not support shareability levels. */
43
33
if (aarch64) {
44
#define TYPE_NPCM7XX_ADC "npcm7xx-adc"
34
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
45
-#define NPCM7XX_ADC(obj) \
35
descaddrmask = MAKE_64BIT_MASK(0, 40);
46
- OBJECT_CHECK(NPCM7xxADCState, (obj), TYPE_NPCM7XX_ADC)
36
}
47
+OBJECT_DECLARE_SIMPLE_TYPE(NPCM7xxADCState, NPCM7XX_ADC)
37
descaddrmask &= ~indexmask_grainsize;
48
38
-
49
#endif /* NPCM7XX_ADC_H */
39
- /*
50
diff --git a/include/hw/arm/npcm7xx.h b/include/hw/arm/npcm7xx.h
40
- * Secure stage 1 accesses start with the page table in secure memory and
51
index XXXXXXX..XXXXXXX 100644
41
- * can be downgraded to non-secure at any step. Non-secure accesses
52
--- a/include/hw/arm/npcm7xx.h
42
- * remain non-secure. We implement this by just ORing in the NSTable/NS
53
+++ b/include/hw/arm/npcm7xx.h
43
- * bits at each step.
54
@@ -XXX,XX +XXX,XX @@
44
- * Stage 2 never gets this kind of downgrade.
55
45
- */
56
#define NPCM7XX_NR_PWM_MODULES 2
46
- tableattrs = is_secure ? 0 : (1 << 4);
57
47
+ tableattrs = 0;
58
-typedef struct NPCM7xxMachine {
48
59
+struct NPCM7xxMachine {
49
next_level:
60
MachineState parent;
50
descaddr |= (address >> (stride * (4 - level))) & indexmask;
61
/*
51
descaddr &= ~7ULL;
62
* PWM fan splitter. each splitter connects to one PWM output and
52
- nstable = !regime_is_stage2(mmu_idx) && extract32(tableattrs, 4, 1);
63
@@ -XXX,XX +XXX,XX @@ typedef struct NPCM7xxMachine {
53
- if (nstable && ptw->in_secure) {
54
+
55
+ /*
56
+ * Process the NSTable bit from the previous level. This changes
57
+ * the table address space and the output space from Secure to
58
+ * NonSecure. With RME, the EL3 translation regime does not change
59
+ * from Root to NonSecure.
60
+ */
61
+ if (ptw->in_space == ARMSS_Secure
62
+ && !regime_is_stage2(mmu_idx)
63
+ && extract32(tableattrs, 4, 1)) {
64
/*
65
* Stage2_S -> Stage2 or Phys_S -> Phys_NS
66
* Assert the relative order of the secure/non-secure indexes.
67
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
68
QEMU_BUILD_BUG_ON(ARMMMUIdx_Stage2_S + 1 != ARMMMUIdx_Stage2);
69
ptw->in_ptw_idx += 1;
70
ptw->in_secure = false;
71
+ ptw->in_space = ARMSS_NonSecure;
72
}
73
+
74
if (!S1_ptw_translate(env, ptw, descaddr, fi)) {
75
goto do_fault;
76
}
77
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
64
*/
78
*/
65
SplitIRQ fan_splitter[NPCM7XX_NR_PWM_MODULES *
79
attrs = new_descriptor & (MAKE_64BIT_MASK(2, 10) | MAKE_64BIT_MASK(50, 14));
66
NPCM7XX_PWM_PER_MODULE];
80
if (!regime_is_stage2(mmu_idx)) {
67
-} NPCM7xxMachine;
81
- attrs |= nstable << 5; /* NS */
68
+};
82
+ attrs |= !ptw->in_secure << 5; /* NS */
69
83
if (!param.hpd) {
70
#define TYPE_NPCM7XX_MACHINE MACHINE_TYPE_NAME("npcm7xx")
84
attrs |= extract64(tableattrs, 0, 2) << 53; /* XN, PXN */
71
-#define NPCM7XX_MACHINE(obj) \
85
/*
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
--
86
--
276
2.34.1
87
2.34.1
277
278
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Add a comment describing the Connex uses a Numonyx RC28F128J3F75
3
With Realm security state, bit 55 of a block or page descriptor during
4
flash, and the Verdex uses a Micron RC28F256P30TFA.
4
the stage2 walk becomes the NS bit; during the stage1 walk the bit 5
5
NS bit is RES0. With Root security state, bit 11 of the block or page
6
descriptor during the stage1 walk becomes the NSE bit.
5
7
6
Correct the Verdex machine description (we model the 'Pro' board).
8
Rather than collecting an NS bit and applying it later, compute the
9
output pa space from the input pa space and unconditionally assign.
10
This means that we no longer need to adjust the output space earlier
11
for the NSTable bit.
7
12
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20230109115316.2235-6-philmd@linaro.org
15
Message-id: 20230620124418.805717-13-richard.henderson@linaro.org
11
Message-Id: <20200223231044.8003-3-philmd@redhat.com>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
17
---
14
hw/arm/gumstix.c | 6 ++++--
18
target/arm/ptw.c | 89 +++++++++++++++++++++++++++++++++++++++---------
15
1 file changed, 4 insertions(+), 2 deletions(-)
19
1 file changed, 73 insertions(+), 16 deletions(-)
16
20
17
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
21
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
18
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/gumstix.c
23
--- a/target/arm/ptw.c
20
+++ b/hw/arm/gumstix.c
24
+++ b/target/arm/ptw.c
21
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@ static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
22
* Contributions after 2012-01-13 are licensed under the terms of the
26
* @mmu_idx: MMU index indicating required translation regime
23
* GNU GPL, version 2 or (at your option) any later version.
27
* @is_aa64: TRUE if AArch64
28
* @ap: The 2-bit simple AP (AP[2:1])
29
- * @ns: NS (non-secure) bit
30
* @xn: XN (execute-never) bit
31
* @pxn: PXN (privileged execute-never) bit
32
+ * @in_pa: The original input pa space
33
+ * @out_pa: The output pa space, modified by NSTable, NS, and NSE
24
*/
34
*/
25
-
35
static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
36
- int ap, int ns, int xn, int pxn)
37
+ int ap, int xn, int pxn,
38
+ ARMSecuritySpace in_pa, ARMSecuritySpace out_pa)
39
{
40
ARMCPU *cpu = env_archcpu(env);
41
bool is_user = regime_is_user(env, mmu_idx);
42
@@ -XXX,XX +XXX,XX @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
43
}
44
}
45
46
- if (ns && arm_is_secure(env) && (env->cp15.scr_el3 & SCR_SIF)) {
47
+ if (out_pa == ARMSS_NonSecure && in_pa == ARMSS_Secure &&
48
+ (env->cp15.scr_el3 & SCR_SIF)) {
49
return prot_rw;
50
}
51
52
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
53
int32_t stride;
54
int addrsize, inputsize, outputsize;
55
uint64_t tcr = regime_tcr(env, mmu_idx);
56
- int ap, ns, xn, pxn;
57
+ int ap, xn, pxn;
58
uint32_t el = regime_el(env, mmu_idx);
59
uint64_t descaddrmask;
60
bool aarch64 = arm_el_is_aa64(env, el);
61
uint64_t descriptor, new_descriptor;
62
+ ARMSecuritySpace out_space;
63
64
/* TODO: This code does not support shareability levels. */
65
if (aarch64) {
66
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
67
}
68
69
ap = extract32(attrs, 6, 2);
70
+ out_space = ptw->in_space;
71
if (regime_is_stage2(mmu_idx)) {
72
- ns = mmu_idx == ARMMMUIdx_Stage2;
73
+ /*
74
+ * R_GYNXY: For stage2 in Realm security state, bit 55 is NS.
75
+ * The bit remains ignored for other security states.
76
+ */
77
+ if (out_space == ARMSS_Realm && extract64(attrs, 55, 1)) {
78
+ out_space = ARMSS_NonSecure;
79
+ }
80
xn = extract64(attrs, 53, 2);
81
result->f.prot = get_S2prot(env, ap, xn, s1_is_el0);
82
} else {
83
- ns = extract32(attrs, 5, 1);
84
+ int nse, ns = extract32(attrs, 5, 1);
85
+ switch (out_space) {
86
+ case ARMSS_Root:
87
+ /*
88
+ * R_GVZML: Bit 11 becomes the NSE field in the EL3 regime.
89
+ * R_XTYPW: NSE and NS together select the output pa space.
90
+ */
91
+ nse = extract32(attrs, 11, 1);
92
+ out_space = (nse << 1) | ns;
93
+ if (out_space == ARMSS_Secure &&
94
+ !cpu_isar_feature(aa64_sel2, cpu)) {
95
+ out_space = ARMSS_NonSecure;
96
+ }
97
+ break;
98
+ case ARMSS_Secure:
99
+ if (ns) {
100
+ out_space = ARMSS_NonSecure;
101
+ }
102
+ break;
103
+ case ARMSS_Realm:
104
+ switch (mmu_idx) {
105
+ case ARMMMUIdx_Stage1_E0:
106
+ case ARMMMUIdx_Stage1_E1:
107
+ case ARMMMUIdx_Stage1_E1_PAN:
108
+ /* I_CZPRF: For Realm EL1&0 stage1, NS bit is RES0. */
109
+ break;
110
+ case ARMMMUIdx_E2:
111
+ case ARMMMUIdx_E20_0:
112
+ case ARMMMUIdx_E20_2:
113
+ case ARMMMUIdx_E20_2_PAN:
114
+ /*
115
+ * R_LYKFZ, R_WGRZN: For Realm EL2 and EL2&1,
116
+ * NS changes the output to non-secure space.
117
+ */
118
+ if (ns) {
119
+ out_space = ARMSS_NonSecure;
120
+ }
121
+ break;
122
+ default:
123
+ g_assert_not_reached();
124
+ }
125
+ break;
126
+ case ARMSS_NonSecure:
127
+ /* R_QRMFF: For NonSecure state, the NS bit is RES0. */
128
+ break;
129
+ default:
130
+ g_assert_not_reached();
131
+ }
132
xn = extract64(attrs, 54, 1);
133
pxn = extract64(attrs, 53, 1);
134
- result->f.prot = get_S1prot(env, mmu_idx, aarch64, ap, ns, xn, pxn);
26
+
135
+
27
/*
136
+ /*
28
* Example usage:
137
+ * Note that we modified ptw->in_space earlier for NSTable, but
29
*
138
+ * result->f.attrs retains a copy of the original security space.
30
@@ -XXX,XX +XXX,XX @@ static void connex_init(MachineState *machine)
139
+ */
31
exit(1);
140
+ result->f.prot = get_S1prot(env, mmu_idx, aarch64, ap, xn, pxn,
141
+ result->f.attrs.space, out_space);
32
}
142
}
33
143
34
+ /* Numonyx RC28F128J3F75 */
144
if (!(result->f.prot & (1 << access_type))) {
35
if (!pflash_cfi01_register(0x00000000, "connext.rom", connex_rom,
145
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
36
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
146
}
37
sector_len, 2, 0, 0, 0, 0, 0)) {
38
@@ -XXX,XX +XXX,XX @@ static void verdex_init(MachineState *machine)
39
exit(1);
40
}
147
}
41
148
42
+ /* Micron RC28F256P30TFA */
149
- if (ns) {
43
if (!pflash_cfi01_register(0x00000000, "verdex.rom", verdex_rom,
150
- /*
44
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
151
- * The NS bit will (as required by the architecture) have no effect if
45
sector_len, 2, 0, 0, 0, 0, 0)) {
152
- * the CPU doesn't support TZ or this is a non-secure translation
46
@@ -XXX,XX +XXX,XX @@ static void verdex_class_init(ObjectClass *oc, void *data)
153
- * regime, because the attribute will already be non-secure.
47
{
154
- */
48
MachineClass *mc = MACHINE_CLASS(oc);
155
- result->f.attrs.secure = false;
49
156
- result->f.attrs.space = ARMSS_NonSecure;
50
- mc->desc = "Gumstix Verdex (PXA270)";
157
- }
51
+ mc->desc = "Gumstix Verdex Pro XL6P COMs (PXA270)";
158
+ result->f.attrs.space = out_space;
52
mc->init = verdex_init;
159
+ result->f.attrs.secure = arm_space_is_secure(out_space);
53
mc->ignore_memory_transaction_failures = true;
160
54
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
161
if (regime_is_stage2(mmu_idx)) {
162
result->cacheattrs.is_s2_format = true;
55
--
163
--
56
2.34.1
164
2.34.1
57
58
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Since its QOM'ification in commit 368a354f02 ("pflash_cfi0x:
3
While Root and Realm may read and write data from other spaces,
4
QOMified") the pflash_cfi01_register() function does not fail.
4
neither may execute from other pa spaces.
5
5
6
This call was later converted with a script to use &error_fatal,
6
This happens for Stage1 EL3, EL2, EL2&0, and Stage2 EL1&0.
7
still unable to fail. Remove the unreachable code.
8
7
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20230109115316.2235-14-philmd@linaro.org
10
Message-id: 20230620124418.805717-14-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
12
---
14
hw/arm/gumstix.c | 18 ++++++------------
13
target/arm/ptw.c | 52 ++++++++++++++++++++++++++++++++++++++++++------
15
hw/arm/mainstone.c | 13 +++++--------
14
1 file changed, 46 insertions(+), 6 deletions(-)
16
hw/arm/omap_sx1.c | 22 ++++++++--------------
17
hw/arm/versatilepb.c | 6 ++----
18
hw/arm/z2.c | 9 +++------
19
5 files changed, 24 insertions(+), 44 deletions(-)
20
15
21
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
16
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
22
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/arm/gumstix.c
18
--- a/target/arm/ptw.c
24
+++ b/hw/arm/gumstix.c
19
+++ b/target/arm/ptw.c
25
@@ -XXX,XX +XXX,XX @@ static void connex_init(MachineState *machine)
20
@@ -XXX,XX +XXX,XX @@ do_fault:
21
* @xn: XN (execute-never) bits
22
* @s1_is_el0: true if this is S2 of an S1+2 walk for EL0
23
*/
24
-static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
25
+static int get_S2prot_noexecute(int s2ap)
26
{
27
int prot = 0;
28
29
@@ -XXX,XX +XXX,XX @@ static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
30
if (s2ap & 2) {
31
prot |= PAGE_WRITE;
26
}
32
}
27
33
+ return prot;
28
/* Numonyx RC28F128J3F75 */
34
+}
29
- if (!pflash_cfi01_register(0x00000000, "connext.rom", CONNEX_FLASH_SIZE,
35
+
30
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
36
+static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
31
- FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0)) {
37
+{
32
- error_report("Error registering flash memory");
38
+ int prot = get_S2prot_noexecute(s2ap);
33
- exit(1);
39
34
- }
40
if (cpu_isar_feature(any_tts2uxn, env_archcpu(env))) {
35
+ pflash_cfi01_register(0x00000000, "connext.rom", CONNEX_FLASH_SIZE,
41
switch (xn) {
36
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
42
@@ -XXX,XX +XXX,XX @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
37
+ FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0);
43
}
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
}
44
}
43
45
44
/* Micron RC28F256P30TFA */
46
- if (out_pa == ARMSS_NonSecure && in_pa == ARMSS_Secure &&
45
- if (!pflash_cfi01_register(0x00000000, "verdex.rom", VERDEX_FLASH_SIZE,
47
- (env->cp15.scr_el3 & SCR_SIF)) {
46
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
48
- return prot_rw;
47
- FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0)) {
49
+ if (in_pa != out_pa) {
48
- error_report("Error registering flash memory");
50
+ switch (in_pa) {
49
- exit(1);
51
+ case ARMSS_Root:
50
- }
52
+ /*
51
+ pflash_cfi01_register(0x00000000, "verdex.rom", VERDEX_FLASH_SIZE,
53
+ * R_ZWRVD: permission fault for insn fetched from non-Root,
52
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
54
+ * I_WWBFB: SIF has no effect in EL3.
53
+ FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0);
55
+ */
54
56
+ return prot_rw;
55
/* Interrupt line of NIC is connected to GPIO line 99 */
57
+ case ARMSS_Realm:
56
smc91c111_init(&nd_table[0], 0x04000300,
58
+ /*
57
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
59
+ * R_PKTDS: permission fault for insn fetched from non-Realm,
58
index XXXXXXX..XXXXXXX 100644
60
+ * for Realm EL2 or EL2&0. The corresponding fault for EL1&0
59
--- a/hw/arm/mainstone.c
61
+ * happens during any stage2 translation.
60
+++ b/hw/arm/mainstone.c
62
+ */
61
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MachineState *machine,
63
+ switch (mmu_idx) {
62
/* There are two 32MiB flash devices on the board */
64
+ case ARMMMUIdx_E2:
63
for (i = 0; i < 2; i ++) {
65
+ case ARMMMUIdx_E20_0:
64
dinfo = drive_get(IF_PFLASH, 0, i);
66
+ case ARMMMUIdx_E20_2:
65
- if (!pflash_cfi01_register(mainstone_flash_base[i],
67
+ case ARMMMUIdx_E20_2_PAN:
66
- i ? "mainstone.flash1" : "mainstone.flash0",
68
+ return prot_rw;
67
- MAINSTONE_FLASH_SIZE,
69
+ default:
68
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
70
+ break;
69
- FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
71
+ }
70
- error_report("Error registering flash memory");
72
+ break;
71
- exit(1);
73
+ case ARMSS_Secure:
72
- }
74
+ if (env->cp15.scr_el3 & SCR_SIF) {
73
+ pflash_cfi01_register(mainstone_flash_base[i],
75
+ return prot_rw;
74
+ i ? "mainstone.flash1" : "mainstone.flash0",
76
+ }
75
+ MAINSTONE_FLASH_SIZE,
77
+ break;
76
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
78
+ default:
77
+ FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
79
+ /* Input NonSecure must have output NonSecure. */
80
+ g_assert_not_reached();
81
+ }
78
}
82
}
79
83
80
mst_irq = sysbus_create_simple("mainstone-fpga", MST_FPGA_PHYS,
84
/* TODO have_wxn should be replaced with
81
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
85
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
82
index XXXXXXX..XXXXXXX 100644
86
/*
83
--- a/hw/arm/omap_sx1.c
87
* R_GYNXY: For stage2 in Realm security state, bit 55 is NS.
84
+++ b/hw/arm/omap_sx1.c
88
* The bit remains ignored for other security states.
85
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
89
+ * R_YMCSL: Executing an insn fetched from non-Realm causes
86
90
+ * a stage2 permission fault.
87
fl_idx = 0;
91
*/
88
if ((dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
92
if (out_space == ARMSS_Realm && extract64(attrs, 55, 1)) {
89
- if (!pflash_cfi01_register(OMAP_CS0_BASE,
93
out_space = ARMSS_NonSecure;
90
- "omap_sx1.flash0-1", flash_size,
94
+ result->f.prot = get_S2prot_noexecute(ap);
91
- blk_by_legacy_dinfo(dinfo),
95
+ } else {
92
- SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
96
+ xn = extract64(attrs, 53, 2);
93
- fprintf(stderr, "qemu: Error registering flash memory %d.\n",
97
+ result->f.prot = get_S2prot(env, ap, xn, s1_is_el0);
94
- fl_idx);
98
}
95
- }
99
- xn = extract64(attrs, 53, 2);
96
+ pflash_cfi01_register(OMAP_CS0_BASE,
100
- result->f.prot = get_S2prot(env, ap, xn, s1_is_el0);
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 {
101
} else {
120
memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val,
102
int nse, ns = extract32(attrs, 5, 1);
121
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
103
switch (out_space) {
122
index XXXXXXX..XXXXXXX 100644
123
--- a/hw/arm/versatilepb.c
124
+++ b/hw/arm/versatilepb.c
125
@@ -XXX,XX +XXX,XX @@ static void versatile_init(MachineState *machine, int board_id)
126
/* 0x34000000 NOR Flash */
127
128
dinfo = drive_get(IF_PFLASH, 0, 0);
129
- if (!pflash_cfi01_register(VERSATILE_FLASH_ADDR, "versatile.flash",
130
+ pflash_cfi01_register(VERSATILE_FLASH_ADDR, "versatile.flash",
131
VERSATILE_FLASH_SIZE,
132
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
133
VERSATILE_FLASH_SECT_SIZE,
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
142
index XXXXXXX..XXXXXXX 100644
143
--- a/hw/arm/z2.c
144
+++ b/hw/arm/z2.c
145
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
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
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
151
- FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
152
- error_report("Error registering flash memory");
153
- exit(1);
154
- }
155
+ pflash_cfi01_register(Z2_FLASH_BASE, "z2.flash0", Z2_FLASH_SIZE,
156
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
157
+ FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
158
159
/* setup keypad */
160
pxa27x_register_keypad(mpu->kp, map, 0x100);
161
--
104
--
162
2.34.1
105
2.34.1
163
164
diff view generated by jsdifflib
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Cubieboard now can boot directly from SD card, without the need to pass
3
Do not provide a fast-path for physical addresses,
4
`-kernel` parameter. Update Avocado tests to cover this functionality.
4
as those will need to be validated for GPC.
5
5
6
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Message-id: 20230620124418.805717-15-richard.henderson@linaro.org
9
Message-id: 20221226220303.14420-8-strahinja.p.jankovic@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
tests/avocado/boot_linux_console.py | 47 +++++++++++++++++++++++++++++
11
target/arm/ptw.c | 44 +++++++++++++++++---------------------------
13
1 file changed, 47 insertions(+)
12
1 file changed, 17 insertions(+), 27 deletions(-)
14
13
15
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
14
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/avocado/boot_linux_console.py
16
--- a/target/arm/ptw.c
18
+++ b/tests/avocado/boot_linux_console.py
17
+++ b/target/arm/ptw.c
19
@@ -XXX,XX +XXX,XX @@ def test_arm_cubieboard_sata(self):
18
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
20
'sda')
19
* From gdbstub, do not use softmmu so that we don't modify the
21
# cubieboard's reboot is not functioning; omit reboot test.
20
* state of the cpu at all, including softmmu tlb contents.
22
21
*/
23
+ @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
22
- if (regime_is_stage2(s2_mmu_idx)) {
24
+ def test_arm_cubieboard_openwrt_22_03_2(self):
23
- S1Translate s2ptw = {
25
+ """
24
- .in_mmu_idx = s2_mmu_idx,
26
+ :avocado: tags=arch:arm
25
- .in_ptw_idx = ptw_idx_for_stage_2(env, s2_mmu_idx),
27
+ :avocado: tags=machine:cubieboard
26
- .in_secure = s2_mmu_idx == ARMMMUIdx_Stage2_S,
28
+ :avocado: tags=device:sd
27
- .in_space = (s2_mmu_idx == ARMMMUIdx_Stage2_S ? ARMSS_Secure
29
+ """
28
- : space == ARMSS_Realm ? ARMSS_Realm
30
+
29
- : ARMSS_NonSecure),
31
+ # This test download a 7.5 MiB compressed image and expand it
30
- .in_debug = true,
32
+ # to 126 MiB.
31
- };
33
+ image_url = ('https://downloads.openwrt.org/releases/22.03.2/targets/'
32
- GetPhysAddrResult s2 = { };
34
+ 'sunxi/cortexa8/openwrt-22.03.2-sunxi-cortexa8-'
33
+ S1Translate s2ptw = {
35
+ 'cubietech_a10-cubieboard-ext4-sdcard.img.gz')
34
+ .in_mmu_idx = s2_mmu_idx,
36
+ image_hash = ('94b5ecbfbc0b3b56276e5146b899eafa'
35
+ .in_ptw_idx = ptw_idx_for_stage_2(env, s2_mmu_idx),
37
+ '2ac5dc2d08733d6705af9f144f39f554')
36
+ .in_secure = s2_mmu_idx == ARMMMUIdx_Stage2_S,
38
+ image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash,
37
+ .in_space = (s2_mmu_idx == ARMMMUIdx_Stage2_S ? ARMSS_Secure
39
+ algorithm='sha256')
38
+ : space == ARMSS_Realm ? ARMSS_Realm
40
+ image_path = archive.extract(image_path_gz, self.workdir)
39
+ : ARMSS_NonSecure),
41
+ image_pow2ceil_expand(image_path)
40
+ .in_debug = true,
42
+
41
+ };
43
+ self.vm.set_console()
42
+ GetPhysAddrResult s2 = { };
44
+ self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw',
43
45
+ '-nic', 'user',
44
- if (get_phys_addr_lpae(env, &s2ptw, addr, MMU_DATA_LOAD,
46
+ '-no-reboot')
45
- false, &s2, fi)) {
47
+ self.vm.launch()
46
- goto fail;
48
+
47
- }
49
+ kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
48
- ptw->out_phys = s2.f.phys_addr;
50
+ 'usbcore.nousb '
49
- pte_attrs = s2.cacheattrs.attrs;
51
+ 'noreboot')
50
- ptw->out_secure = s2.f.attrs.secure;
52
+
51
- ptw->out_space = s2.f.attrs.space;
53
+ self.wait_for_console_pattern('U-Boot SPL')
52
- } else {
54
+
53
- /* Regime is physical. */
55
+ interrupt_interactive_console_until_pattern(
54
- ptw->out_phys = addr;
56
+ self, 'Hit any key to stop autoboot:', '=>')
55
- pte_attrs = 0;
57
+ exec_command_and_wait_for_pattern(self, "setenv extraargs '" +
56
- ptw->out_secure = s2_mmu_idx == ARMMMUIdx_Phys_S;
58
+ kernel_command_line + "'", '=>')
57
- ptw->out_space = (s2_mmu_idx == ARMMMUIdx_Phys_S ? ARMSS_Secure
59
+ exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...');
58
- : space == ARMSS_Realm ? ARMSS_Realm
60
+
59
- : ARMSS_NonSecure);
61
+ self.wait_for_console_pattern(
60
+ if (get_phys_addr_with_struct(env, &s2ptw, addr,
62
+ 'Please press Enter to activate this console.')
61
+ MMU_DATA_LOAD, &s2, fi)) {
63
+
62
+ goto fail;
64
+ exec_command_and_wait_for_pattern(self, ' ', 'root@')
63
}
65
+
64
+ ptw->out_phys = s2.f.phys_addr;
66
+ exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
65
+ pte_attrs = s2.cacheattrs.attrs;
67
+ 'Allwinner sun4i/sun5i')
66
ptw->out_host = NULL;
68
+ # cubieboard's reboot is not functioning; omit reboot test.
67
ptw->out_rw = false;
69
+
68
+ ptw->out_secure = s2.f.attrs.secure;
70
@skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
69
+ ptw->out_space = s2.f.attrs.space;
71
def test_arm_quanta_gsj(self):
70
} else {
72
"""
71
#ifdef CONFIG_TCG
72
CPUTLBEntryFull *full;
73
--
73
--
74
2.34.1
74
2.34.1
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
IEC binary prefixes ease code review: the unit is explicit.
3
Instead of passing this to get_phys_addr_lpae, stash it
4
in the S1Translate structure.
4
5
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20230109115316.2235-11-philmd@linaro.org
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230620124418.805717-16-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
11
---
10
hw/arm/omap_sx1.c | 33 +++++++++++++++++----------------
12
target/arm/ptw.c | 27 ++++++++++++---------------
11
1 file changed, 17 insertions(+), 16 deletions(-)
13
1 file changed, 12 insertions(+), 15 deletions(-)
12
14
13
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
15
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/omap_sx1.c
17
--- a/target/arm/ptw.c
16
+++ b/hw/arm/omap_sx1.c
18
+++ b/target/arm/ptw.c
17
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ typedef struct S1Translate {
18
* with this program; if not, see <http://www.gnu.org/licenses/>.
20
ARMSecuritySpace in_space;
21
bool in_secure;
22
bool in_debug;
23
+ /*
24
+ * If this is stage 2 of a stage 1+2 page table walk, then this must
25
+ * be true if stage 1 is an EL0 access; otherwise this is ignored.
26
+ * Stage 2 is indicated by in_mmu_idx set to ARMMMUIdx_Stage2{,_S}.
27
+ */
28
+ bool in_s1_is_el0;
29
bool out_secure;
30
bool out_rw;
31
bool out_be;
32
@@ -XXX,XX +XXX,XX @@ typedef struct S1Translate {
33
} S1Translate;
34
35
static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
36
- uint64_t address,
37
- MMUAccessType access_type, bool s1_is_el0,
38
+ uint64_t address, MMUAccessType access_type,
39
GetPhysAddrResult *result, ARMMMUFaultInfo *fi);
40
41
static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
42
@@ -XXX,XX +XXX,XX @@ static int check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, uint64_t tcr,
43
* @ptw: Current and next stage parameters for the walk.
44
* @address: virtual address to get physical address for
45
* @access_type: MMU_DATA_LOAD, MMU_DATA_STORE or MMU_INST_FETCH
46
- * @s1_is_el0: if @ptw->in_mmu_idx is ARMMMUIdx_Stage2
47
- * (so this is a stage 2 page table walk),
48
- * must be true if this is stage 2 of a stage 1+2
49
- * walk for an EL0 access. If @mmu_idx is anything else,
50
- * @s1_is_el0 is ignored.
51
* @result: set on translation success,
52
* @fi: set to fault info if the translation fails
19
*/
53
*/
20
#include "qemu/osdep.h"
54
static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
21
+#include "qemu/units.h"
55
uint64_t address,
22
#include "qapi/error.h"
56
- MMUAccessType access_type, bool s1_is_el0,
23
#include "ui/console.h"
57
+ MMUAccessType access_type,
24
#include "hw/arm/omap.h"
58
GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
25
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps static_ops = {
59
{
26
.endianness = DEVICE_NATIVE_ENDIAN,
60
ARMCPU *cpu = env_archcpu(env);
27
};
61
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
28
62
result->f.prot = get_S2prot_noexecute(ap);
29
-#define sdram_size    0x02000000
63
} else {
30
-#define sector_size    (128 * 1024)
64
xn = extract64(attrs, 53, 2);
31
-#define flash0_size    (16 * 1024 * 1024)
65
- result->f.prot = get_S2prot(env, ap, xn, s1_is_el0);
32
-#define flash1_size    ( 8 * 1024 * 1024)
66
+ result->f.prot = get_S2prot(env, ap, xn, ptw->in_s1_is_el0);
33
-#define flash2_size    (32 * 1024 * 1024)
67
}
34
+#define SDRAM_SIZE (32 * MiB)
68
} else {
35
+#define SECTOR_SIZE (128 * KiB)
69
int nse, ns = extract32(attrs, 5, 1);
36
+#define FLASH0_SIZE (16 * MiB)
70
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
37
+#define FLASH1_SIZE (8 * MiB)
71
bool ret, ipa_secure;
38
+#define FLASH2_SIZE (32 * MiB)
72
ARMCacheAttrs cacheattrs1;
39
73
ARMSecuritySpace ipa_space;
40
static struct arm_boot_info sx1_binfo = {
74
- bool is_el0;
41
.loader_start = OMAP_EMIFF_BASE,
75
uint64_t hcr;
42
- .ram_size = sdram_size,
76
43
+ .ram_size = SDRAM_SIZE,
77
ret = get_phys_addr_with_struct(env, ptw, address, access_type, result, fi);
44
.board_id = 0x265,
78
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
45
};
79
ipa_secure = result->f.attrs.secure;
46
80
ipa_space = result->f.attrs.space;
47
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
81
48
static uint32_t cs3val = 0x00001139;
82
- is_el0 = ptw->in_mmu_idx == ARMMMUIdx_Stage1_E0;
49
DriveInfo *dinfo;
83
+ ptw->in_s1_is_el0 = ptw->in_mmu_idx == ARMMMUIdx_Stage1_E0;
50
int fl_idx;
84
ptw->in_mmu_idx = ipa_secure ? ARMMMUIdx_Stage2_S : ARMMMUIdx_Stage2;
51
- uint32_t flash_size = flash0_size;
85
ptw->in_secure = ipa_secure;
52
+ uint32_t flash_size = FLASH0_SIZE;
86
ptw->in_space = ipa_space;
53
87
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
54
if (machine->ram_size != mc->default_ram_size) {
88
ret = get_phys_addr_pmsav8(env, ipa, access_type,
55
char *sz = size_to_str(mc->default_ram_size);
89
ptw->in_mmu_idx, is_secure, result, fi);
56
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
90
} else {
91
- ret = get_phys_addr_lpae(env, ptw, ipa, access_type,
92
- is_el0, result, fi);
93
+ ret = get_phys_addr_lpae(env, ptw, ipa, access_type, result, fi);
57
}
94
}
58
95
fi->s2addr = ipa;
59
if (version == 2) {
96
60
- flash_size = flash2_size;
97
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
61
+ flash_size = FLASH2_SIZE;
62
}
98
}
63
99
64
memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, machine->ram);
100
if (regime_using_lpae_format(env, mmu_idx)) {
65
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
101
- return get_phys_addr_lpae(env, ptw, address, access_type, false,
66
if (!pflash_cfi01_register(OMAP_CS0_BASE,
102
- result, fi);
67
"omap_sx1.flash0-1", flash_size,
103
+ return get_phys_addr_lpae(env, ptw, address, access_type, result, fi);
68
blk_by_legacy_dinfo(dinfo),
104
} else if (arm_feature(env, ARM_FEATURE_V7) ||
69
- sector_size, 4, 0, 0, 0, 0, 0)) {
105
regime_sctlr(env, mmu_idx) & SCTLR_XP) {
70
+ SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
106
return get_phys_addr_v6(env, ptw, address, access_type, result, fi);
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";
105
}
106
107
@@ -XXX,XX +XXX,XX @@ static void sx1_machine_v1_class_init(ObjectClass *oc, void *data)
108
mc->init = sx1_init_v1;
109
mc->ignore_memory_transaction_failures = true;
110
mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
111
- mc->default_ram_size = sdram_size;
112
+ mc->default_ram_size = SDRAM_SIZE;
113
mc->default_ram_id = "omap1.dram";
114
}
115
116
--
107
--
117
2.34.1
108
2.34.1
118
109
119
110
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The typedef and definitions are generated by the OBJECT_DECLARE_TYPE
3
This fixes a bug in which we failed to initialize
4
macro in "hw/arm/bcm2836.h":
4
the result attributes properly after the memset.
5
5
6
20 #define TYPE_BCM283X "bcm283x"
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
21 OBJECT_DECLARE_TYPE(BCM283XState, BCM283XClass, BCM283X)
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
The script ran in commit a489d1951c ("Use OBJECT_DECLARE_TYPE when
9
Message-id: 20230620124418.805717-17-richard.henderson@linaro.org
10
possible") missed them because they are declared in a different
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
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
11
---
18
hw/arm/bcm2836.c | 9 ++-------
12
target/arm/ptw.c | 11 +----------
19
1 file changed, 2 insertions(+), 7 deletions(-)
13
1 file changed, 1 insertion(+), 10 deletions(-)
20
14
21
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
15
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
22
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/arm/bcm2836.c
17
--- a/target/arm/ptw.c
24
+++ b/hw/arm/bcm2836.c
18
+++ b/target/arm/ptw.c
25
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ typedef struct S1Translate {
26
#include "hw/arm/raspi_platform.h"
20
void *out_host;
27
#include "hw/sysbus.h"
21
} S1Translate;
28
22
29
-typedef struct BCM283XClass {
23
-static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
30
+struct BCM283XClass {
24
- uint64_t address, MMUAccessType access_type,
31
/*< private >*/
25
- GetPhysAddrResult *result, ARMMMUFaultInfo *fi);
32
DeviceClass parent_class;
33
/*< public >*/
34
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XClass {
35
hwaddr peri_base; /* Peripheral base address seen by the CPU */
36
hwaddr ctrl_base; /* Interrupt controller and mailboxes etc. */
37
int clusterid;
38
-} BCM283XClass;
39
-
26
-
40
-#define BCM283X_CLASS(klass) \
27
static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
41
- OBJECT_CLASS_CHECK(BCM283XClass, (klass), TYPE_BCM283X)
28
target_ulong address,
42
-#define BCM283X_GET_CLASS(obj) \
29
MMUAccessType access_type,
43
- OBJECT_GET_CLASS(BCM283XClass, (obj), TYPE_BCM283X)
30
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
44
+};
31
cacheattrs1 = result->cacheattrs;
45
32
memset(result, 0, sizeof(*result));
46
static Property bcm2836_enabled_cores_property =
33
47
DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus, 0);
34
- if (arm_feature(env, ARM_FEATURE_PMSA)) {
35
- ret = get_phys_addr_pmsav8(env, ipa, access_type,
36
- ptw->in_mmu_idx, is_secure, result, fi);
37
- } else {
38
- ret = get_phys_addr_lpae(env, ptw, ipa, access_type, result, fi);
39
- }
40
+ ret = get_phys_addr_with_struct(env, ptw, ipa, access_type, result, fi);
41
fi->s2addr = ipa;
42
43
/* Combine the S1 and S2 perms. */
48
--
44
--
49
2.34.1
45
2.34.1
50
46
51
47
diff view generated by jsdifflib
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
During SPL boot several DRAM Controller registers are used. Most
3
The function takes the fields as filled in by
4
important registers are those related to DRAM initialization and
4
the Arm ARM pseudocode for TakeGPCException.
5
calibration, where SPL initiates process and waits until certain bit is
6
set/cleared.
7
5
8
This patch adds these registers, initializes reset values from user's
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
guide and updates state of registers as SPL expects it.
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
8
Message-id: 20230620124418.805717-18-richard.henderson@linaro.org
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>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
10
---
17
include/hw/arm/allwinner-a10.h | 2 +
11
target/arm/syndrome.h | 10 ++++++++++
18
include/hw/misc/allwinner-a10-dramc.h | 68 ++++++++++
12
1 file changed, 10 insertions(+)
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
13
28
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
14
diff --git a/target/arm/syndrome.h b/target/arm/syndrome.h
29
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
30
--- a/include/hw/arm/allwinner-a10.h
16
--- a/target/arm/syndrome.h
31
+++ b/include/hw/arm/allwinner-a10.h
17
+++ b/target/arm/syndrome.h
32
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ enum arm_exception_class {
33
#include "hw/usb/hcd-ehci.h"
19
EC_SVEACCESSTRAP = 0x19,
34
#include "hw/rtc/allwinner-rtc.h"
20
EC_ERETTRAP = 0x1a,
35
#include "hw/misc/allwinner-a10-ccm.h"
21
EC_SMETRAP = 0x1d,
36
+#include "hw/misc/allwinner-a10-dramc.h"
22
+ EC_GPC = 0x1e,
37
23
EC_INSNABORT = 0x20,
38
#include "target/arm/cpu.h"
24
EC_INSNABORT_SAME_EL = 0x21,
39
#include "qom/object.h"
25
EC_PCALIGNMENT = 0x22,
40
@@ -XXX,XX +XXX,XX @@ struct AwA10State {
26
@@ -XXX,XX +XXX,XX @@ static inline uint32_t syn_bxjtrap(int cv, int cond, int rm)
41
27
(cv << 24) | (cond << 20) | rm;
42
ARMCPU cpu;
28
}
43
AwA10ClockCtlState ccm;
29
44
+ AwA10DramControllerState dramc;
30
+static inline uint32_t syn_gpc(int s2ptw, int ind, int gpcsc,
45
AwA10PITState timer;
31
+ int cm, int s1ptw, int wnr, int fsc)
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
+{
32
+{
218
+ const AwA10DramControllerState *s = AW_A10_DRAMC(opaque);
33
+ /* TODO: FEAT_NV2 adds VNCR */
219
+ const uint32_t idx = REG_INDEX(offset);
34
+ return (EC_GPC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (s2ptw << 21)
220
+
35
+ | (ind << 20) | (gpcsc << 14) | (cm << 8) | (s1ptw << 7)
221
+ switch (offset) {
36
+ | (wnr << 6) | fsc;
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
+}
37
+}
238
+
38
+
239
+static void allwinner_a10_dramc_write(void *opaque, hwaddr offset,
39
static inline uint32_t syn_insn_abort(int same_el, int ea, int s1ptw, int fsc)
240
+ uint64_t val, unsigned size)
40
{
241
+{
41
return (EC_INSNABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
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
--
42
--
376
2.34.1
43
2.34.1
diff view generated by jsdifflib
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
During SPL boot several Clock Controller Module (CCM) registers are
3
Handle GPC Fault types in arm_deliver_fault, reporting as
4
read, most important are PLL and Tuning, as well as divisor registers.
4
either a GPC exception at EL3, or falling through to insn
5
or data aborts at various exception levels.
5
6
6
This patch adds these registers and initializes reset values from user's
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
guide.
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
9
Message-id: 20230620124418.805717-19-richard.henderson@linaro.org
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
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
11
---
15
include/hw/arm/allwinner-a10.h | 2 +
12
target/arm/cpu.h | 1 +
16
include/hw/misc/allwinner-a10-ccm.h | 67 +++++++++
13
target/arm/internals.h | 27 +++++++++++
17
hw/arm/allwinner-a10.c | 7 +
14
target/arm/helper.c | 5 ++
18
hw/misc/allwinner-a10-ccm.c | 224 ++++++++++++++++++++++++++++
15
target/arm/tcg/tlb_helper.c | 96 +++++++++++++++++++++++++++++++++++--
19
hw/arm/Kconfig | 1 +
16
4 files changed, 126 insertions(+), 3 deletions(-)
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
25
17
26
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
27
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/allwinner-a10.h
20
--- a/target/arm/cpu.h
29
+++ b/include/hw/arm/allwinner-a10.h
21
+++ b/target/arm/cpu.h
30
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
31
#include "hw/usb/hcd-ohci.h"
23
#define EXCP_UNALIGNED 22 /* v7M UNALIGNED UsageFault */
32
#include "hw/usb/hcd-ehci.h"
24
#define EXCP_DIVBYZERO 23 /* v7M DIVBYZERO UsageFault */
33
#include "hw/rtc/allwinner-rtc.h"
25
#define EXCP_VSERR 24
34
+#include "hw/misc/allwinner-a10-ccm.h"
26
+#define EXCP_GPC 25 /* v9 Granule Protection Check Fault */
35
27
/* NB: add new EXCP_ defines to the array in arm_log_exception() too */
36
#include "target/arm/cpu.h"
28
37
#include "qom/object.h"
29
#define ARMV7M_EXCP_RESET 1
38
@@ -XXX,XX +XXX,XX @@ struct AwA10State {
30
diff --git a/target/arm/internals.h b/target/arm/internals.h
39
/*< public >*/
31
index XXXXXXX..XXXXXXX 100644
40
32
--- a/target/arm/internals.h
41
ARMCPU cpu;
33
+++ b/target/arm/internals.h
42
+ AwA10ClockCtlState ccm;
34
@@ -XXX,XX +XXX,XX @@ typedef enum ARMFaultType {
43
AwA10PITState timer;
35
ARMFault_ICacheMaint,
44
AwA10PICState intc;
36
ARMFault_QEMU_NSCExec, /* v8M: NS executing in S&NSC memory */
45
AwEmacState emac;
37
ARMFault_QEMU_SFault, /* v8M: SecureFault INVTRAN, INVEP or AUVIOL */
46
diff --git a/include/hw/misc/allwinner-a10-ccm.h b/include/hw/misc/allwinner-a10-ccm.h
38
+ ARMFault_GPCFOnWalk,
47
new file mode 100644
39
+ ARMFault_GPCFOnOutput,
48
index XXXXXXX..XXXXXXX
40
} ARMFaultType;
49
--- /dev/null
41
50
+++ b/include/hw/misc/allwinner-a10-ccm.h
42
+typedef enum ARMGPCF {
51
@@ -XXX,XX +XXX,XX @@
43
+ GPCF_None,
52
+/*
44
+ GPCF_AddressSize,
53
+ * Allwinner A10 Clock Control Module emulation
45
+ GPCF_Walk,
54
+ *
46
+ GPCF_EABT,
55
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
47
+ GPCF_Fail,
56
+ *
48
+} ARMGPCF;
57
+ * This file is derived from Allwinner H3 CCU,
49
+
58
+ * by Niek Linnenbank.
50
/**
59
+ *
51
* ARMMMUFaultInfo: Information describing an ARM MMU Fault
60
+ * This program is free software: you can redistribute it and/or modify
52
* @type: Type of fault
61
+ * it under the terms of the GNU General Public License as published by
53
+ * @gpcf: Subtype of ARMFault_GPCFOn{Walk,Output}.
62
+ * the Free Software Foundation, either version 2 of the License, or
54
* @level: Table walk level (for translation, access flag and permission faults)
63
+ * (at your option) any later version.
55
* @domain: Domain of the fault address (for non-LPAE CPUs only)
64
+ *
56
* @s2addr: Address that caused a fault at stage 2
65
+ * This program is distributed in the hope that it will be useful,
57
+ * @paddr: physical address that caused a fault for gpc
66
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
58
+ * @paddr_space: physical address space that caused a fault for gpc
67
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
59
* @stage2: True if we faulted at stage 2
68
+ * GNU General Public License for more details.
60
* @s1ptw: True if we faulted at stage 2 while doing a stage 1 page-table walk
69
+ *
61
* @s1ns: True if we faulted on a non-secure IPA while in secure state
70
+ * You should have received a copy of the GNU General Public License
62
@@ -XXX,XX +XXX,XX @@ typedef enum ARMFaultType {
71
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
63
typedef struct ARMMMUFaultInfo ARMMMUFaultInfo;
72
+ */
64
struct ARMMMUFaultInfo {
73
+
65
ARMFaultType type;
74
+#ifndef HW_MISC_ALLWINNER_A10_CCM_H
66
+ ARMGPCF gpcf;
75
+#define HW_MISC_ALLWINNER_A10_CCM_H
67
target_ulong s2addr;
76
+
68
+ target_ulong paddr;
77
+#include "qom/object.h"
69
+ ARMSecuritySpace paddr_space;
78
+#include "hw/sysbus.h"
70
int level;
79
+
71
int domain;
80
+/**
72
bool stage2;
81
+ * @name Constants
73
@@ -XXX,XX +XXX,XX @@ static inline uint32_t arm_fi_to_lfsc(ARMMMUFaultInfo *fi)
82
+ * @{
74
case ARMFault_Exclusive:
83
+ */
75
fsc = 0x35;
84
+
76
break;
85
+/** Size of register I/O address space used by CCM device */
77
+ case ARMFault_GPCFOnWalk:
86
+#define AW_A10_CCM_IOSIZE (0x400)
78
+ assert(fi->level >= -1 && fi->level <= 3);
87
+
79
+ if (fi->level < 0) {
88
+/** Total number of known registers */
80
+ fsc = 0b100011;
89
+#define AW_A10_CCM_REGS_NUM (AW_A10_CCM_IOSIZE / sizeof(uint32_t))
81
+ } else {
90
+
82
+ fsc = 0b100100 | fi->level;
91
+/** @} */
83
+ }
92
+
84
+ break;
93
+/**
85
+ case ARMFault_GPCFOnOutput:
94
+ * @name Object model
86
+ fsc = 0b101000;
95
+ * @{
87
+ break;
96
+ */
88
default:
97
+
89
/* Other faults can't occur in a context that requires a
98
+#define TYPE_AW_A10_CCM "allwinner-a10-ccm"
90
* long-format status code.
99
+OBJECT_DECLARE_SIMPLE_TYPE(AwA10ClockCtlState, AW_A10_CCM)
91
diff --git a/target/arm/helper.c b/target/arm/helper.c
100
+
92
index XXXXXXX..XXXXXXX 100644
101
+/** @} */
93
--- a/target/arm/helper.c
102
+
94
+++ b/target/arm/helper.c
103
+/**
95
@@ -XXX,XX +XXX,XX @@ void arm_log_exception(CPUState *cs)
104
+ * Allwinner A10 CCM object instance state.
96
[EXCP_UNALIGNED] = "v7M UNALIGNED UsageFault",
105
+ */
97
[EXCP_DIVBYZERO] = "v7M DIVBYZERO UsageFault",
106
+struct AwA10ClockCtlState {
98
[EXCP_VSERR] = "Virtual SERR",
107
+ /*< private >*/
99
+ [EXCP_GPC] = "Granule Protection Check",
108
+ SysBusDevice parent_obj;
100
};
109
+ /*< public >*/
101
110
+
102
if (idx >= 0 && idx < ARRAY_SIZE(excnames)) {
111
+ /** Maps I/O registers in physical memory */
103
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
112
+ MemoryRegion iomem;
104
}
113
+
105
114
+ /** Array of hardware registers */
106
switch (cs->exception_index) {
115
+ uint32_t regs[AW_A10_CCM_REGS_NUM];
107
+ case EXCP_GPC:
116
+};
108
+ qemu_log_mask(CPU_LOG_INT, "...with MFAR 0x%" PRIx64 "\n",
117
+
109
+ env->cp15.mfar_el3);
118
+#endif /* HW_MISC_ALLWINNER_H3_CCU_H */
110
+ /* fall through */
119
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
111
case EXCP_PREFETCH_ABORT:
120
index XXXXXXX..XXXXXXX 100644
112
case EXCP_DATA_ABORT:
121
--- a/hw/arm/allwinner-a10.c
113
/*
122
+++ b/hw/arm/allwinner-a10.c
114
diff --git a/target/arm/tcg/tlb_helper.c b/target/arm/tcg/tlb_helper.c
123
@@ -XXX,XX +XXX,XX @@
115
index XXXXXXX..XXXXXXX 100644
124
#include "hw/usb/hcd-ohci.h"
116
--- a/target/arm/tcg/tlb_helper.c
125
117
+++ b/target/arm/tcg/tlb_helper.c
126
#define AW_A10_MMC0_BASE 0x01c0f000
118
@@ -XXX,XX +XXX,XX @@ static uint32_t compute_fsr_fsc(CPUARMState *env, ARMMMUFaultInfo *fi,
127
+#define AW_A10_CCM_BASE 0x01c20000
119
return fsr;
128
#define AW_A10_PIC_REG_BASE 0x01c20400
120
}
129
#define AW_A10_PIT_REG_BASE 0x01c20c00
121
130
#define AW_A10_UART0_REG_BASE 0x01c28000
122
+static bool report_as_gpc_exception(ARMCPU *cpu, int current_el,
131
@@ -XXX,XX +XXX,XX @@ static void aw_a10_init(Object *obj)
123
+ ARMMMUFaultInfo *fi)
132
133
object_initialize_child(obj, "timer", &s->timer, TYPE_AW_A10_PIT);
134
135
+ object_initialize_child(obj, "ccm", &s->ccm, TYPE_AW_A10_CCM);
136
+
137
object_initialize_child(obj, "emac", &s->emac, TYPE_AW_EMAC);
138
139
object_initialize_child(obj, "sata", &s->sata, TYPE_ALLWINNER_AHCI);
140
@@ -XXX,XX +XXX,XX @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
141
memory_region_add_subregion(get_system_memory(), 0x00000000, &s->sram_a);
142
create_unimplemented_device("a10-sram-ctrl", 0x01c00000, 4 * KiB);
143
144
+ /* Clock Control Module */
145
+ sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &error_fatal);
146
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, AW_A10_CCM_BASE);
147
+
148
/* FIXME use qdev NIC properties instead of nd_table[] */
149
if (nd_table[0].used) {
150
qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC);
151
diff --git a/hw/misc/allwinner-a10-ccm.c b/hw/misc/allwinner-a10-ccm.c
152
new file mode 100644
153
index XXXXXXX..XXXXXXX
154
--- /dev/null
155
+++ b/hw/misc/allwinner-a10-ccm.c
156
@@ -XXX,XX +XXX,XX @@
157
+/*
158
+ * Allwinner A10 Clock Control Module emulation
159
+ *
160
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
161
+ *
162
+ * This file is derived from Allwinner H3 CCU,
163
+ * by Niek Linnenbank.
164
+ *
165
+ * This program is free software: you can redistribute it and/or modify
166
+ * it under the terms of the GNU General Public License as published by
167
+ * the Free Software Foundation, either version 2 of the License, or
168
+ * (at your option) any later version.
169
+ *
170
+ * This program is distributed in the hope that it will be useful,
171
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
172
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
173
+ * GNU General Public License for more details.
174
+ *
175
+ * You should have received a copy of the GNU General Public License
176
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
177
+ */
178
+
179
+#include "qemu/osdep.h"
180
+#include "qemu/units.h"
181
+#include "hw/sysbus.h"
182
+#include "migration/vmstate.h"
183
+#include "qemu/log.h"
184
+#include "qemu/module.h"
185
+#include "hw/misc/allwinner-a10-ccm.h"
186
+
187
+/* CCM register offsets */
188
+enum {
189
+ REG_PLL1_CFG = 0x0000, /* PLL1 Control */
190
+ REG_PLL1_TUN = 0x0004, /* PLL1 Tuning */
191
+ REG_PLL2_CFG = 0x0008, /* PLL2 Control */
192
+ REG_PLL2_TUN = 0x000C, /* PLL2 Tuning */
193
+ REG_PLL3_CFG = 0x0010, /* PLL3 Control */
194
+ REG_PLL4_CFG = 0x0018, /* PLL4 Control */
195
+ REG_PLL5_CFG = 0x0020, /* PLL5 Control */
196
+ REG_PLL5_TUN = 0x0024, /* PLL5 Tuning */
197
+ REG_PLL6_CFG = 0x0028, /* PLL6 Control */
198
+ REG_PLL6_TUN = 0x002C, /* PLL6 Tuning */
199
+ REG_PLL7_CFG = 0x0030, /* PLL7 Control */
200
+ REG_PLL1_TUN2 = 0x0038, /* PLL1 Tuning2 */
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
+{
124
+{
232
+ const AwA10ClockCtlState *s = AW_A10_CCM(opaque);
125
+ bool ret;
233
+ const uint32_t idx = REG_INDEX(offset);
126
+
234
+
127
+ switch (fi->gpcf) {
235
+ switch (offset) {
128
+ case GPCF_None:
236
+ case REG_PLL1_CFG:
129
+ return false;
237
+ case REG_PLL1_TUN:
130
+ case GPCF_AddressSize:
238
+ case REG_PLL2_CFG:
131
+ case GPCF_Walk:
239
+ case REG_PLL2_TUN:
132
+ case GPCF_EABT:
240
+ case REG_PLL3_CFG:
133
+ /* R_PYTGX: GPT faults are reported as GPC. */
241
+ case REG_PLL4_CFG:
134
+ ret = true;
242
+ case REG_PLL5_CFG:
135
+ break;
243
+ case REG_PLL5_TUN:
136
+ case GPCF_Fail:
244
+ case REG_PLL6_CFG:
137
+ /*
245
+ case REG_PLL6_TUN:
138
+ * R_BLYPM: A GPF at EL3 is reported as insn or data abort.
246
+ case REG_PLL7_CFG:
139
+ * R_VBZMW, R_LXHQR: A GPF at EL[0-2] is reported as a GPC
247
+ case REG_PLL1_TUN2:
140
+ * if SCR_EL3.GPF is set, otherwise an insn or data abort.
248
+ case REG_PLL5_TUN2:
141
+ */
249
+ case REG_PLL8_CFG:
142
+ ret = (cpu->env.cp15.scr_el3 & SCR_GPF) && current_el != 3;
250
+ case REG_OSC24M_CFG:
143
+ break;
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:
144
+ default:
258
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented read offset 0x%04x\n",
145
+ g_assert_not_reached();
259
+ __func__, (uint32_t)offset);
146
+ }
260
+ return 0;
147
+
261
+ }
148
+ assert(cpu_isar_feature(aa64_rme, cpu));
262
+
149
+ assert(fi->type == ARMFault_GPCFOnWalk ||
263
+ return s->regs[idx];
150
+ fi->type == ARMFault_GPCFOnOutput);
151
+ if (fi->gpcf == GPCF_AddressSize) {
152
+ assert(fi->level == 0);
153
+ } else {
154
+ assert(fi->level >= 0 && fi->level <= 1);
155
+ }
156
+
157
+ return ret;
264
+}
158
+}
265
+
159
+
266
+static void allwinner_a10_ccm_write(void *opaque, hwaddr offset,
160
+static unsigned encode_gpcsc(ARMMMUFaultInfo *fi)
267
+ uint64_t val, unsigned size)
268
+{
161
+{
269
+ AwA10ClockCtlState *s = AW_A10_CCM(opaque);
162
+ static uint8_t const gpcsc[] = {
270
+ const uint32_t idx = REG_INDEX(offset);
163
+ [GPCF_AddressSize] = 0b000000,
271
+
164
+ [GPCF_Walk] = 0b000100,
272
+ switch (offset) {
165
+ [GPCF_Fail] = 0b001100,
273
+ case REG_PLL1_CFG:
166
+ [GPCF_EABT] = 0b010100,
274
+ case REG_PLL1_TUN:
167
+ };
275
+ case REG_PLL2_CFG:
168
+
276
+ case REG_PLL2_TUN:
169
+ /* Note that we've validated fi->gpcf and fi->level above. */
277
+ case REG_PLL3_CFG:
170
+ return gpcsc[fi->gpcf] | fi->level;
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;
298
+ }
299
+
300
+ s->regs[idx] = (uint32_t) val;
301
+}
171
+}
302
+
172
+
303
+static const MemoryRegionOps allwinner_a10_ccm_ops = {
173
static G_NORETURN
304
+ .read = allwinner_a10_ccm_read,
174
void arm_deliver_fault(ARMCPU *cpu, vaddr addr,
305
+ .write = allwinner_a10_ccm_write,
175
MMUAccessType access_type,
306
+ .endianness = DEVICE_NATIVE_ENDIAN,
176
int mmu_idx, ARMMMUFaultInfo *fi)
307
+ .valid = {
177
{
308
+ .min_access_size = 4,
178
CPUARMState *env = &cpu->env;
309
+ .max_access_size = 4,
179
- int target_el;
310
+ },
180
+ int target_el = exception_target_el(env);
311
+ .impl.min_access_size = 4,
181
+ int current_el = arm_current_el(env);
312
+};
182
bool same_el;
313
+
183
uint32_t syn, exc, fsr, fsc;
314
+static void allwinner_a10_ccm_reset_enter(Object *obj, ResetType type)
184
315
+{
185
- target_el = exception_target_el(env);
316
+ AwA10ClockCtlState *s = AW_A10_CCM(obj);
186
+ if (report_as_gpc_exception(cpu, current_el, fi)) {
317
+
187
+ target_el = 3;
318
+ /* Set default values for registers */
188
+
319
+ s->regs[REG_INDEX(REG_PLL1_CFG)] = REG_PLL1_CFG_RST;
189
+ fsr = compute_fsr_fsc(env, fi, target_el, mmu_idx, &fsc);
320
+ s->regs[REG_INDEX(REG_PLL1_TUN)] = REG_PLL1_TUN_RST;
190
+
321
+ s->regs[REG_INDEX(REG_PLL2_CFG)] = REG_PLL2_CFG_RST;
191
+ syn = syn_gpc(fi->stage2 && fi->type == ARMFault_GPCFOnWalk,
322
+ s->regs[REG_INDEX(REG_PLL2_TUN)] = REG_PLL2_TUN_RST;
192
+ access_type == MMU_INST_FETCH,
323
+ s->regs[REG_INDEX(REG_PLL3_CFG)] = REG_PLL3_CFG_RST;
193
+ encode_gpcsc(fi), 0, fi->s1ptw,
324
+ s->regs[REG_INDEX(REG_PLL4_CFG)] = REG_PLL4_CFG_RST;
194
+ access_type == MMU_DATA_STORE, fsc);
325
+ s->regs[REG_INDEX(REG_PLL5_CFG)] = REG_PLL5_CFG_RST;
195
+
326
+ s->regs[REG_INDEX(REG_PLL5_TUN)] = REG_PLL5_TUN_RST;
196
+ env->cp15.mfar_el3 = fi->paddr;
327
+ s->regs[REG_INDEX(REG_PLL6_CFG)] = REG_PLL6_CFG_RST;
197
+ switch (fi->paddr_space) {
328
+ s->regs[REG_INDEX(REG_PLL6_TUN)] = REG_PLL6_TUN_RST;
198
+ case ARMSS_Secure:
329
+ s->regs[REG_INDEX(REG_PLL7_CFG)] = REG_PLL7_CFG_RST;
199
+ break;
330
+ s->regs[REG_INDEX(REG_PLL1_TUN2)] = REG_PLL1_TUN2_RST;
200
+ case ARMSS_NonSecure:
331
+ s->regs[REG_INDEX(REG_PLL5_TUN2)] = REG_PLL5_TUN2_RST;
201
+ env->cp15.mfar_el3 |= R_MFAR_NS_MASK;
332
+ s->regs[REG_INDEX(REG_PLL8_CFG)] = REG_PLL8_CFG_RST;
202
+ break;
333
+ s->regs[REG_INDEX(REG_OSC24M_CFG)] = REG_OSC24M_CFG_RST;
203
+ case ARMSS_Root:
334
+ s->regs[REG_INDEX(REG_CPU_AHB_APB0_CFG)] = REG_CPU_AHB_APB0_CFG_RST;
204
+ env->cp15.mfar_el3 |= R_MFAR_NSE_MASK;
335
+}
205
+ break;
336
+
206
+ case ARMSS_Realm:
337
+static void allwinner_a10_ccm_init(Object *obj)
207
+ env->cp15.mfar_el3 |= R_MFAR_NSE_MASK | R_MFAR_NS_MASK;
338
+{
208
+ break;
339
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
209
+ default:
340
+ AwA10ClockCtlState *s = AW_A10_CCM(obj);
210
+ g_assert_not_reached();
341
+
211
+ }
342
+ /* Memory mapping */
212
+
343
+ memory_region_init_io(&s->iomem, OBJECT(s), &allwinner_a10_ccm_ops, s,
213
+ exc = EXCP_GPC;
344
+ TYPE_AW_A10_CCM, AW_A10_CCM_IOSIZE);
214
+ goto do_raise;
345
+ sysbus_init_mmio(sbd, &s->iomem);
215
+ }
346
+}
216
+
347
+
217
+ /* If SCR_EL3.GPF is unset, GPF may still be routed to EL2. */
348
+static const VMStateDescription allwinner_a10_ccm_vmstate = {
218
+ if (fi->gpcf == GPCF_Fail && target_el < 2) {
349
+ .name = "allwinner-a10-ccm",
219
+ if (arm_hcr_el2_eff(env) & HCR_GPF) {
350
+ .version_id = 1,
220
+ target_el = 2;
351
+ .minimum_version_id = 1,
221
+ }
352
+ .fields = (VMStateField[]) {
222
+ }
353
+ VMSTATE_UINT32_ARRAY(regs, AwA10ClockCtlState, AW_A10_CCM_REGS_NUM),
223
+
354
+ VMSTATE_END_OF_LIST()
224
if (fi->stage2) {
355
+ }
225
target_el = 2;
356
+};
226
env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
357
+
227
@@ -XXX,XX +XXX,XX @@ void arm_deliver_fault(ARMCPU *cpu, vaddr addr,
358
+static void allwinner_a10_ccm_class_init(ObjectClass *klass, void *data)
228
env->cp15.hpfar_el2 |= HPFAR_NS;
359
+{
229
}
360
+ DeviceClass *dc = DEVICE_CLASS(klass);
230
}
361
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
231
- same_el = (arm_current_el(env) == target_el);
362
+
232
363
+ rc->phases.enter = allwinner_a10_ccm_reset_enter;
233
+ same_el = current_el == target_el;
364
+ dc->vmsd = &allwinner_a10_ccm_vmstate;
234
fsr = compute_fsr_fsc(env, fi, target_el, mmu_idx, &fsc);
365
+}
235
366
+
236
if (access_type == MMU_INST_FETCH) {
367
+static const TypeInfo allwinner_a10_ccm_info = {
237
@@ -XXX,XX +XXX,XX @@ void arm_deliver_fault(ARMCPU *cpu, vaddr addr,
368
+ .name = TYPE_AW_A10_CCM,
238
exc = EXCP_DATA_ABORT;
369
+ .parent = TYPE_SYS_BUS_DEVICE,
239
}
370
+ .instance_init = allwinner_a10_ccm_init,
240
371
+ .instance_size = sizeof(AwA10ClockCtlState),
241
+ do_raise:
372
+ .class_init = allwinner_a10_ccm_class_init,
242
env->exception.vaddress = addr;
373
+};
243
env->exception.fsr = fsr;
374
+
244
raise_exception(env, exc, syn, target_el);
375
+static void allwinner_a10_ccm_register(void)
376
+{
377
+ type_register_static(&allwinner_a10_ccm_info);
378
+}
379
+
380
+type_init(allwinner_a10_ccm_register)
381
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
382
index XXXXXXX..XXXXXXX 100644
383
--- a/hw/arm/Kconfig
384
+++ b/hw/arm/Kconfig
385
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_A10
386
select AHCI
387
select ALLWINNER_A10_PIT
388
select ALLWINNER_A10_PIC
389
+ select ALLWINNER_A10_CCM
390
select ALLWINNER_EMAC
391
select SERIAL
392
select UNIMP
393
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
394
index XXXXXXX..XXXXXXX 100644
395
--- a/hw/misc/Kconfig
396
+++ b/hw/misc/Kconfig
397
@@ -XXX,XX +XXX,XX @@ config VIRT_CTRL
398
config LASI
399
bool
400
401
+config ALLWINNER_A10_CCM
402
+ bool
403
+
404
source macio/Kconfig
405
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
406
index XXXXXXX..XXXXXXX 100644
407
--- a/hw/misc/meson.build
408
+++ b/hw/misc/meson.build
409
@@ -XXX,XX +XXX,XX @@ subdir('macio')
410
411
softmmu_ss.add(when: 'CONFIG_IVSHMEM_DEVICE', if_true: files('ivshmem.c'))
412
413
+softmmu_ss.add(when: 'CONFIG_ALLWINNER_A10_CCM', if_true: files('allwinner-a10-ccm.c'))
414
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-h3-ccu.c'))
415
specific_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-cpucfg.c'))
416
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-h3-dramc.c'))
417
--
245
--
418
2.34.1
246
2.34.1
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Following docs/devel/style.rst guidelines, rename
3
Place the check at the end of get_phys_addr_with_struct,
4
omap_intr_handler_s -> OMAPIntcState. This also remove a
4
so that we check all physical results.
5
use of 'struct' in the DECLARE_INSTANCE_CHECKER() macro call.
6
5
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109140306.23161-7-philmd@linaro.org
8
Message-id: 20230620124418.805717-20-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
include/hw/arm/omap.h | 9 ++++-----
11
target/arm/ptw.c | 249 +++++++++++++++++++++++++++++++++++++++++++----
13
hw/intc/omap_intc.c | 38 +++++++++++++++++++-------------------
12
1 file changed, 232 insertions(+), 17 deletions(-)
14
2 files changed, 23 insertions(+), 24 deletions(-)
15
13
16
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
14
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/omap.h
16
--- a/target/arm/ptw.c
19
+++ b/include/hw/arm/omap.h
17
+++ b/target/arm/ptw.c
20
@@ -XXX,XX +XXX,XX @@ void omap_clk_reparent(omap_clk clk, omap_clk parent);
18
@@ -XXX,XX +XXX,XX @@ typedef struct S1Translate {
21
19
void *out_host;
22
/* omap_intc.c */
20
} S1Translate;
23
#define TYPE_OMAP_INTC "common-omap-intc"
21
24
-typedef struct omap_intr_handler_s omap_intr_handler;
22
-static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
25
-DECLARE_INSTANCE_CHECKER(omap_intr_handler, OMAP_INTC,
23
- target_ulong address,
26
- TYPE_OMAP_INTC)
24
- MMUAccessType access_type,
27
+typedef struct OMAPIntcState OMAPIntcState;
25
- GetPhysAddrResult *result,
28
+DECLARE_INSTANCE_CHECKER(OMAPIntcState, OMAP_INTC, TYPE_OMAP_INTC)
26
- ARMMMUFaultInfo *fi);
29
27
+static bool get_phys_addr_nogpc(CPUARMState *env, S1Translate *ptw,
30
28
+ target_ulong address,
31
/*
29
+ MMUAccessType access_type,
32
@@ -XXX,XX +XXX,XX @@ DECLARE_INSTANCE_CHECKER(omap_intr_handler, OMAP_INTC,
30
+ GetPhysAddrResult *result,
33
* (ie the struct omap_mpu_state_s*) to do the clockname to pointer
31
+ ARMMMUFaultInfo *fi);
34
* translation.)
32
+
35
*/
33
+static bool get_phys_addr_gpc(CPUARMState *env, S1Translate *ptw,
36
-void omap_intc_set_iclk(omap_intr_handler *intc, omap_clk clk);
34
+ target_ulong address,
37
-void omap_intc_set_fclk(omap_intr_handler *intc, omap_clk clk);
35
+ MMUAccessType access_type,
38
+void omap_intc_set_iclk(OMAPIntcState *intc, omap_clk clk);
36
+ GetPhysAddrResult *result,
39
+void omap_intc_set_fclk(OMAPIntcState *intc, omap_clk clk);
37
+ ARMMMUFaultInfo *fi);
40
38
41
/* omap_i2c.c */
39
/* This mapping is common between ID_AA64MMFR0.PARANGE and TCR_ELx.{I}PS. */
42
#define TYPE_OMAP_I2C "omap_i2c"
40
static const uint8_t pamax_map[] = {
43
diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
41
@@ -XXX,XX +XXX,XX @@ static bool regime_translation_disabled(CPUARMState *env, ARMMMUIdx mmu_idx,
44
index XXXXXXX..XXXXXXX 100644
42
return (regime_sctlr(env, mmu_idx) & SCTLR_M) == 0;
45
--- a/hw/intc/omap_intc.c
43
}
46
+++ b/hw/intc/omap_intc.c
44
47
@@ -XXX,XX +XXX,XX @@ struct omap_intr_handler_bank_s {
45
+static bool granule_protection_check(CPUARMState *env, uint64_t paddress,
48
unsigned char priority[32];
46
+ ARMSecuritySpace pspace,
49
};
47
+ ARMMMUFaultInfo *fi)
50
48
+{
51
-struct omap_intr_handler_s {
49
+ MemTxAttrs attrs = {
52
+struct OMAPIntcState {
50
+ .secure = true,
53
SysBusDevice parent_obj;
51
+ .space = ARMSS_Root,
54
52
+ };
55
qemu_irq *pins;
53
+ ARMCPU *cpu = env_archcpu(env);
56
@@ -XXX,XX +XXX,XX @@ struct omap_intr_handler_s {
54
+ uint64_t gpccr = env->cp15.gpccr_el3;
57
struct omap_intr_handler_bank_s bank[3];
55
+ unsigned pps, pgs, l0gptsz, level = 0;
58
};
56
+ uint64_t tableaddr, pps_mask, align, entry, index;
59
57
+ AddressSpace *as;
60
-static void omap_inth_sir_update(struct omap_intr_handler_s *s, int is_fiq)
58
+ MemTxResult result;
61
+static void omap_inth_sir_update(OMAPIntcState *s, int is_fiq)
59
+ int gpi;
60
+
61
+ if (!FIELD_EX64(gpccr, GPCCR, GPC)) {
62
+ return true;
63
+ }
64
+
65
+ /*
66
+ * GPC Priority 1 (R_GMGRR):
67
+ * R_JWCSM: If the configuration of GPCCR_EL3 is invalid,
68
+ * the access fails as GPT walk fault at level 0.
69
+ */
70
+
71
+ /*
72
+ * Configuration of PPS to a value exceeding the implemented
73
+ * physical address size is invalid.
74
+ */
75
+ pps = FIELD_EX64(gpccr, GPCCR, PPS);
76
+ if (pps > FIELD_EX64(cpu->isar.id_aa64mmfr0, ID_AA64MMFR0, PARANGE)) {
77
+ goto fault_walk;
78
+ }
79
+ pps = pamax_map[pps];
80
+ pps_mask = MAKE_64BIT_MASK(0, pps);
81
+
82
+ switch (FIELD_EX64(gpccr, GPCCR, SH)) {
83
+ case 0b10: /* outer shareable */
84
+ break;
85
+ case 0b00: /* non-shareable */
86
+ case 0b11: /* inner shareable */
87
+ /* Inner and Outer non-cacheable requires Outer shareable. */
88
+ if (FIELD_EX64(gpccr, GPCCR, ORGN) == 0 &&
89
+ FIELD_EX64(gpccr, GPCCR, IRGN) == 0) {
90
+ goto fault_walk;
91
+ }
92
+ break;
93
+ default: /* reserved */
94
+ goto fault_walk;
95
+ }
96
+
97
+ switch (FIELD_EX64(gpccr, GPCCR, PGS)) {
98
+ case 0b00: /* 4KB */
99
+ pgs = 12;
100
+ break;
101
+ case 0b01: /* 64KB */
102
+ pgs = 16;
103
+ break;
104
+ case 0b10: /* 16KB */
105
+ pgs = 14;
106
+ break;
107
+ default: /* reserved */
108
+ goto fault_walk;
109
+ }
110
+
111
+ /* Note this field is read-only and fixed at reset. */
112
+ l0gptsz = 30 + FIELD_EX64(gpccr, GPCCR, L0GPTSZ);
113
+
114
+ /*
115
+ * GPC Priority 2: Secure, Realm or Root address exceeds PPS.
116
+ * R_CPDSB: A NonSecure physical address input exceeding PPS
117
+ * does not experience any fault.
118
+ */
119
+ if (paddress & ~pps_mask) {
120
+ if (pspace == ARMSS_NonSecure) {
121
+ return true;
122
+ }
123
+ goto fault_size;
124
+ }
125
+
126
+ /* GPC Priority 3: the base address of GPTBR_EL3 exceeds PPS. */
127
+ tableaddr = env->cp15.gptbr_el3 << 12;
128
+ if (tableaddr & ~pps_mask) {
129
+ goto fault_size;
130
+ }
131
+
132
+ /*
133
+ * BADDR is aligned per a function of PPS and L0GPTSZ.
134
+ * These bits of GPTBR_EL3 are RES0, but are not a configuration error,
135
+ * unlike the RES0 bits of the GPT entries (R_XNKFZ).
136
+ */
137
+ align = MAX(pps - l0gptsz + 3, 12);
138
+ align = MAKE_64BIT_MASK(0, align);
139
+ tableaddr &= ~align;
140
+
141
+ as = arm_addressspace(env_cpu(env), attrs);
142
+
143
+ /* Level 0 lookup. */
144
+ index = extract64(paddress, l0gptsz, pps - l0gptsz);
145
+ tableaddr += index * 8;
146
+ entry = address_space_ldq_le(as, tableaddr, attrs, &result);
147
+ if (result != MEMTX_OK) {
148
+ goto fault_eabt;
149
+ }
150
+
151
+ switch (extract32(entry, 0, 4)) {
152
+ case 1: /* block descriptor */
153
+ if (entry >> 8) {
154
+ goto fault_walk; /* RES0 bits not 0 */
155
+ }
156
+ gpi = extract32(entry, 4, 4);
157
+ goto found;
158
+ case 3: /* table descriptor */
159
+ tableaddr = entry & ~0xf;
160
+ align = MAX(l0gptsz - pgs - 1, 12);
161
+ align = MAKE_64BIT_MASK(0, align);
162
+ if (tableaddr & (~pps_mask | align)) {
163
+ goto fault_walk; /* RES0 bits not 0 */
164
+ }
165
+ break;
166
+ default: /* invalid */
167
+ goto fault_walk;
168
+ }
169
+
170
+ /* Level 1 lookup */
171
+ level = 1;
172
+ index = extract64(paddress, pgs + 4, l0gptsz - pgs - 4);
173
+ tableaddr += index * 8;
174
+ entry = address_space_ldq_le(as, tableaddr, attrs, &result);
175
+ if (result != MEMTX_OK) {
176
+ goto fault_eabt;
177
+ }
178
+
179
+ switch (extract32(entry, 0, 4)) {
180
+ case 1: /* contiguous descriptor */
181
+ if (entry >> 10) {
182
+ goto fault_walk; /* RES0 bits not 0 */
183
+ }
184
+ /*
185
+ * Because the softmmu tlb only works on units of TARGET_PAGE_SIZE,
186
+ * and because we cannot invalidate by pa, and thus will always
187
+ * flush entire tlbs, we don't actually care about the range here
188
+ * and can simply extract the GPI as the result.
189
+ */
190
+ if (extract32(entry, 8, 2) == 0) {
191
+ goto fault_walk; /* reserved contig */
192
+ }
193
+ gpi = extract32(entry, 4, 4);
194
+ break;
195
+ default:
196
+ index = extract64(paddress, pgs, 4);
197
+ gpi = extract64(entry, index * 4, 4);
198
+ break;
199
+ }
200
+
201
+ found:
202
+ switch (gpi) {
203
+ case 0b0000: /* no access */
204
+ break;
205
+ case 0b1111: /* all access */
206
+ return true;
207
+ case 0b1000:
208
+ case 0b1001:
209
+ case 0b1010:
210
+ case 0b1011:
211
+ if (pspace == (gpi & 3)) {
212
+ return true;
213
+ }
214
+ break;
215
+ default:
216
+ goto fault_walk; /* reserved */
217
+ }
218
+
219
+ fi->gpcf = GPCF_Fail;
220
+ goto fault_common;
221
+ fault_eabt:
222
+ fi->gpcf = GPCF_EABT;
223
+ goto fault_common;
224
+ fault_size:
225
+ fi->gpcf = GPCF_AddressSize;
226
+ goto fault_common;
227
+ fault_walk:
228
+ fi->gpcf = GPCF_Walk;
229
+ fault_common:
230
+ fi->level = level;
231
+ fi->paddr = paddress;
232
+ fi->paddr_space = pspace;
233
+ return false;
234
+}
235
+
236
static bool S2_attrs_are_device(uint64_t hcr, uint8_t attrs)
62
{
237
{
63
int i, j, sir_intr, p_intr, p;
238
/*
64
uint32_t level;
239
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
65
@@ -XXX,XX +XXX,XX @@ static void omap_inth_sir_update(struct omap_intr_handler_s *s, int is_fiq)
240
};
66
s->sir_intr[is_fiq] = sir_intr;
241
GetPhysAddrResult s2 = { };
67
}
242
68
243
- if (get_phys_addr_with_struct(env, &s2ptw, addr,
69
-static inline void omap_inth_update(struct omap_intr_handler_s *s, int is_fiq)
244
- MMU_DATA_LOAD, &s2, fi)) {
70
+static inline void omap_inth_update(OMAPIntcState *s, int is_fiq)
245
+ if (get_phys_addr_gpc(env, &s2ptw, addr, MMU_DATA_LOAD, &s2, fi)) {
246
goto fail;
247
}
248
+
249
ptw->out_phys = s2.f.phys_addr;
250
pte_attrs = s2.cacheattrs.attrs;
251
ptw->out_host = NULL;
252
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
253
254
fail:
255
assert(fi->type != ARMFault_None);
256
+ if (fi->type == ARMFault_GPCFOnOutput) {
257
+ fi->type = ARMFault_GPCFOnWalk;
258
+ }
259
fi->s2addr = addr;
260
fi->stage2 = true;
261
fi->s1ptw = true;
262
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_disabled(CPUARMState *env, target_ulong address,
263
ARMMMUFaultInfo *fi)
71
{
264
{
72
int i;
265
uint8_t memattr = 0x00; /* Device nGnRnE */
73
uint32_t has_intr = 0;
266
- uint8_t shareability = 0; /* non-sharable */
74
@@ -XXX,XX +XXX,XX @@ static inline void omap_inth_update(struct omap_intr_handler_s *s, int is_fiq)
267
+ uint8_t shareability = 0; /* non-shareable */
75
268
int r_el;
76
static void omap_set_intr(void *opaque, int irq, int req)
269
77
{
270
switch (mmu_idx) {
78
- struct omap_intr_handler_s *ih = opaque;
271
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_disabled(CPUARMState *env, target_ulong address,
79
+ OMAPIntcState *ih = opaque;
272
} else {
80
uint32_t rise;
273
memattr = 0x44; /* Normal, NC, No */
81
274
}
82
struct omap_intr_handler_bank_s *bank = &ih->bank[irq >> 5];
275
- shareability = 2; /* outer sharable */
83
@@ -XXX,XX +XXX,XX @@ static void omap_set_intr(void *opaque, int irq, int req)
276
+ shareability = 2; /* outer shareable */
84
/* Simplified version with no edge detection */
277
}
85
static void omap_set_intr_noedge(void *opaque, int irq, int req)
278
result->cacheattrs.is_s2_format = false;
86
{
279
break;
87
- struct omap_intr_handler_s *ih = opaque;
280
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
88
+ OMAPIntcState *ih = opaque;
281
ARMSecuritySpace ipa_space;
89
uint32_t rise;
282
uint64_t hcr;
90
283
91
struct omap_intr_handler_bank_s *bank = &ih->bank[irq >> 5];
284
- ret = get_phys_addr_with_struct(env, ptw, address, access_type, result, fi);
92
@@ -XXX,XX +XXX,XX @@ static void omap_set_intr_noedge(void *opaque, int irq, int req)
285
+ ret = get_phys_addr_nogpc(env, ptw, address, access_type, result, fi);
93
static uint64_t omap_inth_read(void *opaque, hwaddr addr,
286
94
unsigned size)
287
/* If S1 fails, return early. */
95
{
288
if (ret) {
96
- struct omap_intr_handler_s *s = opaque;
289
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
97
+ OMAPIntcState *s = opaque;
290
cacheattrs1 = result->cacheattrs;
98
int i, offset = addr;
291
memset(result, 0, sizeof(*result));
99
int bank_no = offset >> 8;
292
100
int line_no;
293
- ret = get_phys_addr_with_struct(env, ptw, ipa, access_type, result, fi);
101
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_inth_read(void *opaque, hwaddr addr,
294
+ ret = get_phys_addr_nogpc(env, ptw, ipa, access_type, result, fi);
102
static void omap_inth_write(void *opaque, hwaddr addr,
295
fi->s2addr = ipa;
103
uint64_t value, unsigned size)
296
104
{
297
/* Combine the S1 and S2 perms. */
105
- struct omap_intr_handler_s *s = opaque;
298
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
106
+ OMAPIntcState *s = opaque;
299
return false;
107
int i, offset = addr;
300
}
108
int bank_no = offset >> 8;
301
109
struct omap_intr_handler_bank_s *bank = &s->bank[bank_no];
302
-static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
110
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap_inth_mem_ops = {
303
+static bool get_phys_addr_nogpc(CPUARMState *env, S1Translate *ptw,
111
304
target_ulong address,
112
static void omap_inth_reset(DeviceState *dev)
305
MMUAccessType access_type,
113
{
306
GetPhysAddrResult *result,
114
- struct omap_intr_handler_s *s = OMAP_INTC(dev);
307
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
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
}
308
}
138
}
309
}
139
310
140
-void omap_intc_set_iclk(omap_intr_handler *intc, omap_clk clk)
311
+static bool get_phys_addr_gpc(CPUARMState *env, S1Translate *ptw,
141
+void omap_intc_set_iclk(OMAPIntcState *intc, omap_clk clk)
312
+ target_ulong address,
142
{
313
+ MMUAccessType access_type,
143
intc->iclk = clk;
314
+ GetPhysAddrResult *result,
144
}
315
+ ARMMMUFaultInfo *fi)
145
316
+{
146
-void omap_intc_set_fclk(omap_intr_handler *intc, omap_clk clk)
317
+ if (get_phys_addr_nogpc(env, ptw, address, access_type, result, fi)) {
147
+void omap_intc_set_fclk(OMAPIntcState *intc, omap_clk clk)
318
+ return true;
148
{
319
+ }
149
intc->fclk = clk;
320
+ if (!granule_protection_check(env, result->f.phys_addr,
150
}
321
+ result->f.attrs.space, fi)) {
151
322
+ fi->type = ARMFault_GPCFOnOutput;
152
static Property omap_intc_properties[] = {
323
+ return true;
153
- DEFINE_PROP_UINT32("size", struct omap_intr_handler_s, size, 0x100),
324
+ }
154
+ DEFINE_PROP_UINT32("size", OMAPIntcState, size, 0x100),
325
+ return false;
155
DEFINE_PROP_END_OF_LIST(),
326
+}
156
};
327
+
157
328
bool get_phys_addr_with_secure(CPUARMState *env, target_ulong address,
158
@@ -XXX,XX +XXX,XX @@ static const TypeInfo omap_intc_info = {
329
MMUAccessType access_type, ARMMMUIdx mmu_idx,
159
static uint64_t omap2_inth_read(void *opaque, hwaddr addr,
330
bool is_secure, GetPhysAddrResult *result,
160
unsigned size)
331
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr_with_secure(CPUARMState *env, target_ulong address,
161
{
332
.in_secure = is_secure,
162
- struct omap_intr_handler_s *s = opaque;
333
.in_space = arm_secure_to_space(is_secure),
163
+ OMAPIntcState *s = opaque;
334
};
164
int offset = addr;
335
- return get_phys_addr_with_struct(env, &ptw, address, access_type,
165
int bank_no, line_no;
336
- result, fi);
166
struct omap_intr_handler_bank_s *bank = NULL;
337
+ return get_phys_addr_gpc(env, &ptw, address, access_type, result, fi);
167
@@ -XXX,XX +XXX,XX @@ static uint64_t omap2_inth_read(void *opaque, hwaddr addr,
338
}
168
static void omap2_inth_write(void *opaque, hwaddr addr,
339
169
uint64_t value, unsigned size)
340
bool get_phys_addr(CPUARMState *env, target_ulong address,
170
{
341
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
171
- struct omap_intr_handler_s *s = opaque;
342
172
+ OMAPIntcState *s = opaque;
343
ptw.in_space = ss;
173
int offset = addr;
344
ptw.in_secure = arm_space_is_secure(ss);
174
int bank_no, line_no;
345
- return get_phys_addr_with_struct(env, &ptw, address, access_type,
175
struct omap_intr_handler_bank_s *bank = NULL;
346
- result, fi);
176
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap2_inth_mem_ops = {
347
+ return get_phys_addr_gpc(env, &ptw, address, access_type, result, fi);
177
static void omap2_intc_init(Object *obj)
348
}
178
{
349
179
DeviceState *dev = DEVICE(obj);
350
hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
180
- struct omap_intr_handler_s *s = OMAP_INTC(obj);
351
@@ -XXX,XX +XXX,XX @@ hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
181
+ OMAPIntcState *s = OMAP_INTC(obj);
352
ARMMMUFaultInfo fi = {};
182
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
353
bool ret;
183
354
184
s->level_only = 1;
355
- ret = get_phys_addr_with_struct(env, &ptw, addr, MMU_DATA_LOAD, &res, &fi);
185
@@ -XXX,XX +XXX,XX @@ static void omap2_intc_init(Object *obj)
356
+ ret = get_phys_addr_gpc(env, &ptw, addr, MMU_DATA_LOAD, &res, &fi);
186
357
*attrs = res.f.attrs;
187
static void omap2_intc_realize(DeviceState *dev, Error **errp)
358
188
{
359
if (ret) {
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
--
360
--
213
2.34.1
361
2.34.1
214
215
diff view generated by jsdifflib
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This patch implements Allwinner TWI/I2C controller emulation. Only
3
Add an x-rme cpu property to enable FEAT_RME.
4
master-mode functionality is implemented.
4
Add an x-l0gptsz property to set GPCCR_EL3.L0GPTSZ,
5
for testing various possible configurations.
5
6
6
The SPL boot for Cubieboard expects AXP209 PMIC on TWI0/I2C0 bus, so this is
7
We're not currently completely sure whether FEAT_RME will
7
first part enabling the TWI/I2C bus operation.
8
be OK to enable purely as a CPU-level property, or if it will
9
need board co-operation, so we're making these experimental
10
x- properties, so that the people developing the system
11
level software for RME can try to start using this and let
12
us know how it goes. The command line syntax for enabling
13
this will change in future, without backwards-compatibility.
8
14
9
Since both Allwinner A10 and H3 use the same module, it is added for
15
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
both boards.
16
Message-id: 20230620124418.805717-21-richard.henderson@linaro.org
11
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Docs are also updated for Cubieboard and Orangepi-PC board to indicate
13
I2C availability.
14
15
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
16
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
17
Message-id: 20221226220303.14420-4-strahinja.p.jankovic@gmail.com
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
19
---
20
docs/system/arm/cubieboard.rst | 1 +
20
target/arm/tcg/cpu64.c | 53 ++++++++++++++++++++++++++++++++++++++++++
21
docs/system/arm/orangepi.rst | 1 +
21
1 file changed, 53 insertions(+)
22
include/hw/arm/allwinner-a10.h | 2 +
23
include/hw/arm/allwinner-h3.h | 3 +
24
include/hw/i2c/allwinner-i2c.h | 55 ++++
25
hw/arm/allwinner-a10.c | 8 +
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
35
22
36
diff --git a/docs/system/arm/cubieboard.rst b/docs/system/arm/cubieboard.rst
23
diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
37
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
38
--- a/docs/system/arm/cubieboard.rst
25
--- a/target/arm/tcg/cpu64.c
39
+++ b/docs/system/arm/cubieboard.rst
26
+++ b/target/arm/tcg/cpu64.c
40
@@ -XXX,XX +XXX,XX @@ Emulated devices:
27
@@ -XXX,XX +XXX,XX @@ static void cpu_max_set_sve_max_vq(Object *obj, Visitor *v, const char *name,
41
- SDHCI
28
cpu->sve_max_vq = max_vq;
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
61
@@ -XXX,XX +XXX,XX @@
62
#include "hw/rtc/allwinner-rtc.h"
63
#include "hw/misc/allwinner-a10-ccm.h"
64
#include "hw/misc/allwinner-a10-dramc.h"
65
+#include "hw/i2c/allwinner-i2c.h"
66
67
#include "target/arm/cpu.h"
68
#include "qom/object.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
106
new file mode 100644
107
index XXXXXXX..XXXXXXX
108
--- /dev/null
109
+++ b/include/hw/i2c/allwinner-i2c.h
110
@@ -XXX,XX +XXX,XX @@
111
+/*
112
+ * Allwinner I2C Bus Serial Interface registers definition
113
+ *
114
+ * Copyright (C) 2022 Strahinja Jankovic. <strahinja.p.jankovic@gmail.com>
115
+ *
116
+ * This file is derived from IMX I2C controller,
117
+ * by Jean-Christophe DUBOIS .
118
+ *
119
+ * This program is free software; you can redistribute it and/or modify it
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
+ *
132
+ */
133
+
134
+#ifndef ALLWINNER_I2C_H
135
+#define ALLWINNER_I2C_H
136
+
137
+#include "hw/sysbus.h"
138
+#include "qom/object.h"
139
+
140
+#define TYPE_AW_I2C "allwinner.i2c"
141
+OBJECT_DECLARE_SIMPLE_TYPE(AWI2CState, AW_I2C)
142
+
143
+#define AW_I2C_MEM_SIZE 0x24
144
+
145
+struct AWI2CState {
146
+ /*< private >*/
147
+ SysBusDevice parent_obj;
148
+
149
+ /*< public >*/
150
+ MemoryRegion iomem;
151
+ I2CBus *bus;
152
+ qemu_irq irq;
153
+
154
+ uint8_t addr;
155
+ uint8_t xaddr;
156
+ uint8_t data;
157
+ uint8_t cntr;
158
+ uint8_t stat;
159
+ uint8_t ccr;
160
+ uint8_t srst;
161
+ uint8_t efr;
162
+ uint8_t lcr;
163
+};
164
+
165
+#endif /* ALLWINNER_I2C_H */
166
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
167
index XXXXXXX..XXXXXXX 100644
168
--- a/hw/arm/allwinner-a10.c
169
+++ b/hw/arm/allwinner-a10.c
170
@@ -XXX,XX +XXX,XX @@
171
#define AW_A10_OHCI_BASE 0x01c14400
172
#define AW_A10_SATA_BASE 0x01c18000
173
#define AW_A10_RTC_BASE 0x01c20d00
174
+#define AW_A10_I2C0_BASE 0x01c2ac00
175
176
static void aw_a10_init(Object *obj)
177
{
178
@@ -XXX,XX +XXX,XX @@ static void aw_a10_init(Object *obj)
179
180
object_initialize_child(obj, "sata", &s->sata, TYPE_ALLWINNER_AHCI);
181
182
+ object_initialize_child(obj, "i2c0", &s->i2c0, TYPE_AW_I2C);
183
+
184
if (machine_usb(current_machine)) {
185
int i;
186
187
@@ -XXX,XX +XXX,XX @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
188
/* RTC */
189
sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &error_fatal);
190
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->rtc), 0, AW_A10_RTC_BASE, 10);
191
+
192
+ /* I2C */
193
+ sysbus_realize(SYS_BUS_DEVICE(&s->i2c0), &error_fatal);
194
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c0), 0, AW_A10_I2C0_BASE);
195
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c0), 0, qdev_get_gpio_in(dev, 7));
196
}
29
}
197
30
198
static void aw_a10_class_init(ObjectClass *oc, void *data)
31
+static bool cpu_arm_get_rme(Object *obj, Error **errp)
199
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
200
index XXXXXXX..XXXXXXX 100644
201
--- a/hw/arm/allwinner-h3.c
202
+++ b/hw/arm/allwinner-h3.c
203
@@ -XXX,XX +XXX,XX @@ const hwaddr allwinner_h3_memmap[] = {
204
[AW_H3_DEV_UART1] = 0x01c28400,
205
[AW_H3_DEV_UART2] = 0x01c28800,
206
[AW_H3_DEV_UART3] = 0x01c28c00,
207
+ [AW_H3_DEV_TWI0] = 0x01c2ac00,
208
[AW_H3_DEV_EMAC] = 0x01c30000,
209
[AW_H3_DEV_DRAMCOM] = 0x01c62000,
210
[AW_H3_DEV_DRAMCTL] = 0x01c63000,
211
@@ -XXX,XX +XXX,XX @@ struct AwH3Unimplemented {
212
{ "uart1", 0x01c28400, 1 * KiB },
213
{ "uart2", 0x01c28800, 1 * KiB },
214
{ "uart3", 0x01c28c00, 1 * KiB },
215
- { "twi0", 0x01c2ac00, 1 * KiB },
216
{ "twi1", 0x01c2b000, 1 * KiB },
217
{ "twi2", 0x01c2b400, 1 * KiB },
218
{ "scr", 0x01c2c400, 1 * KiB },
219
@@ -XXX,XX +XXX,XX @@ enum {
220
AW_H3_GIC_SPI_UART1 = 1,
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
250
new file mode 100644
251
index XXXXXXX..XXXXXXX
252
--- /dev/null
253
+++ b/hw/i2c/allwinner-i2c.c
254
@@ -XXX,XX +XXX,XX @@
255
+/*
256
+ * Allwinner I2C Bus Serial Interface Emulation
257
+ *
258
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
259
+ *
260
+ * This file is derived from IMX I2C controller,
261
+ * by Jean-Christophe DUBOIS .
262
+ *
263
+ * This program is free software; you can redistribute it and/or modify it
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
277
+ */
278
+
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"
286
+#include "qemu/module.h"
287
+
288
+/* Allwinner I2C memory map */
289
+#define TWI_ADDR_REG 0x00 /* slave address register */
290
+#define TWI_XADDR_REG 0x04 /* extended slave address register */
291
+#define TWI_DATA_REG 0x08 /* data register */
292
+#define TWI_CNTR_REG 0x0c /* control register */
293
+#define TWI_STAT_REG 0x10 /* status register */
294
+#define TWI_CCR_REG 0x14 /* clock control register */
295
+#define TWI_SRST_REG 0x18 /* software reset register */
296
+#define TWI_EFR_REG 0x1c /* enhance feature register */
297
+#define TWI_LCR_REG 0x20 /* line control register */
298
+
299
+/* Used only in slave mode, do not set */
300
+#define TWI_ADDR_RESET 0
301
+#define TWI_XADDR_RESET 0
302
+
303
+/* Data register */
304
+#define TWI_DATA_MASK 0xFF
305
+#define TWI_DATA_RESET 0
306
+
307
+/* Control register */
308
+#define TWI_CNTR_INT_EN (1 << 7)
309
+#define TWI_CNTR_BUS_EN (1 << 6)
310
+#define TWI_CNTR_M_STA (1 << 5)
311
+#define TWI_CNTR_M_STP (1 << 4)
312
+#define TWI_CNTR_INT_FLAG (1 << 3)
313
+#define TWI_CNTR_A_ACK (1 << 2)
314
+#define TWI_CNTR_MASK 0xFC
315
+#define TWI_CNTR_RESET 0
316
+
317
+/* Status register */
318
+#define TWI_STAT_MASK 0xF8
319
+#define TWI_STAT_RESET 0xF8
320
+
321
+/* Clock register */
322
+#define TWI_CCR_CLK_M_MASK 0x78
323
+#define TWI_CCR_CLK_N_MASK 0x07
324
+#define TWI_CCR_MASK 0x7F
325
+#define TWI_CCR_RESET 0
326
+
327
+/* Soft reset */
328
+#define TWI_SRST_MASK 0x01
329
+#define TWI_SRST_RESET 0
330
+
331
+/* Enhance feature */
332
+#define TWI_EFR_MASK 0x03
333
+#define TWI_EFR_RESET 0
334
+
335
+/* Line control */
336
+#define TWI_LCR_SCL_STATE (1 << 5)
337
+#define TWI_LCR_SDA_STATE (1 << 4)
338
+#define TWI_LCR_SCL_CTL (1 << 3)
339
+#define TWI_LCR_SCL_CTL_EN (1 << 2)
340
+#define TWI_LCR_SDA_CTL (1 << 1)
341
+#define TWI_LCR_SDA_CTL_EN (1 << 0)
342
+#define TWI_LCR_MASK 0x3F
343
+#define TWI_LCR_RESET 0x3A
344
+
345
+/* Status value in STAT register is shifted by 3 bits */
346
+#define TWI_STAT_SHIFT 3
347
+#define STAT_FROM_STA(x) ((x) << TWI_STAT_SHIFT)
348
+#define STAT_TO_STA(x) ((x) >> TWI_STAT_SHIFT)
349
+
350
+enum {
351
+ STAT_BUS_ERROR = 0,
352
+ /* Master mode */
353
+ STAT_M_STA_TX,
354
+ STAT_M_RSTA_TX,
355
+ STAT_M_ADDR_WR_ACK,
356
+ STAT_M_ADDR_WR_NACK,
357
+ STAT_M_DATA_TX_ACK,
358
+ STAT_M_DATA_TX_NACK,
359
+ STAT_M_ARB_LOST,
360
+ STAT_M_ADDR_RD_ACK,
361
+ STAT_M_ADDR_RD_NACK,
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
+{
32
+{
388
+ switch (offset) {
33
+ ARMCPU *cpu = ARM_CPU(obj);
389
+ case TWI_ADDR_REG:
34
+ return cpu_isar_feature(aa64_rme, cpu);
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 "[?]";
409
+ }
410
+}
35
+}
411
+
36
+
412
+static inline bool allwinner_i2c_is_reset(AWI2CState *s)
37
+static void cpu_arm_set_rme(Object *obj, bool value, Error **errp)
413
+{
38
+{
414
+ return s->srst & TWI_SRST_MASK;
39
+ ARMCPU *cpu = ARM_CPU(obj);
40
+ uint64_t t;
41
+
42
+ t = cpu->isar.id_aa64pfr0;
43
+ t = FIELD_DP64(t, ID_AA64PFR0, RME, value);
44
+ cpu->isar.id_aa64pfr0 = t;
415
+}
45
+}
416
+
46
+
417
+static inline bool allwinner_i2c_bus_is_enabled(AWI2CState *s)
47
+static void cpu_max_set_l0gptsz(Object *obj, Visitor *v, const char *name,
48
+ void *opaque, Error **errp)
418
+{
49
+{
419
+ return s->cntr & TWI_CNTR_BUS_EN;
50
+ ARMCPU *cpu = ARM_CPU(obj);
420
+}
51
+ uint32_t value;
421
+
52
+
422
+static inline bool allwinner_i2c_interrupt_is_enabled(AWI2CState *s)
53
+ if (!visit_type_uint32(v, name, &value, errp)) {
423
+{
54
+ return;
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);
433
+ }
55
+ }
434
+
56
+
435
+ s->addr = TWI_ADDR_RESET;
57
+ /* Encode the value for the GPCCR_EL3 field. */
436
+ s->xaddr = TWI_XADDR_RESET;
58
+ switch (value) {
437
+ s->data = TWI_DATA_RESET;
59
+ case 30:
438
+ s->cntr = TWI_CNTR_RESET;
60
+ case 34:
439
+ s->stat = TWI_STAT_RESET;
61
+ case 36:
440
+ s->ccr = TWI_CCR_RESET;
62
+ case 39:
441
+ s->srst = TWI_SRST_RESET;
63
+ cpu->reset_l0gptsz = value - 30;
442
+ s->efr = TWI_EFR_RESET;
443
+ s->lcr = TWI_LCR_RESET;
444
+}
445
+
446
+static inline void allwinner_i2c_raise_interrupt(AWI2CState *s)
447
+{
448
+ /*
449
+ * Raise an interrupt if the device is not reset and it is configured
450
+ * to generate some interrupts.
451
+ */
452
+ if (!allwinner_i2c_is_reset(s) && allwinner_i2c_bus_is_enabled(s)) {
453
+ if (STAT_TO_STA(s->stat) != STAT_IDLE) {
454
+ s->cntr |= TWI_CNTR_INT_FLAG;
455
+ if (allwinner_i2c_interrupt_is_enabled(s)) {
456
+ qemu_irq_raise(s->irq);
457
+ }
458
+ }
459
+ }
460
+}
461
+
462
+static uint64_t allwinner_i2c_read(void *opaque, hwaddr offset,
463
+ unsigned size)
464
+{
465
+ uint16_t value;
466
+ AWI2CState *s = AW_I2C(opaque);
467
+
468
+ switch (offset) {
469
+ case TWI_ADDR_REG:
470
+ value = s->addr;
471
+ break;
472
+ case TWI_XADDR_REG:
473
+ value = s->xaddr;
474
+ break;
475
+ case TWI_DATA_REG:
476
+ if ((STAT_TO_STA(s->stat) == STAT_M_ADDR_RD_ACK) ||
477
+ (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_ACK) ||
478
+ (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_NACK)) {
479
+ /* Get the next byte */
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);
488
+ }
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;
64
+ break;
521
+ default:
65
+ default:
522
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad address at offset 0x%"
66
+ error_setg(errp, "invalid value for l0gptsz");
523
+ HWADDR_PRIx "\n", TYPE_AW_I2C, __func__, offset);
67
+ error_append_hint(errp, "valid values are 30, 34, 36, 39\n");
524
+ value = 0;
525
+ break;
526
+ }
527
+
528
+ trace_allwinner_i2c_read(allwinner_i2c_get_regname(offset), offset, value);
529
+
530
+ return (uint64_t)value;
531
+}
532
+
533
+static void allwinner_i2c_write(void *opaque, hwaddr offset,
534
+ uint64_t value, unsigned size)
535
+{
536
+ AWI2CState *s = AW_I2C(opaque);
537
+
538
+ value &= 0xff;
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;
68
+ break;
651
+ }
69
+ }
652
+}
70
+}
653
+
71
+
654
+static const MemoryRegionOps allwinner_i2c_ops = {
72
+static void cpu_max_get_l0gptsz(Object *obj, Visitor *v, const char *name,
655
+ .read = allwinner_i2c_read,
73
+ void *opaque, Error **errp)
656
+ .write = allwinner_i2c_write,
74
+{
657
+ .valid.min_access_size = 1,
75
+ ARMCPU *cpu = ARM_CPU(obj);
658
+ .valid.max_access_size = 4,
76
+ uint32_t value = cpu->reset_l0gptsz + 30;
659
+ .endianness = DEVICE_NATIVE_ENDIAN,
660
+};
661
+
77
+
662
+static const VMStateDescription allwinner_i2c_vmstate = {
78
+ visit_type_uint32(v, name, &value, errp);
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()
676
+ }
677
+};
678
+
679
+static void allwinner_i2c_realize(DeviceState *dev, Error **errp)
680
+{
681
+ AWI2CState *s = AW_I2C(dev);
682
+
683
+ memory_region_init_io(&s->iomem, OBJECT(s), &allwinner_i2c_ops, s,
684
+ TYPE_AW_I2C, AW_I2C_MEM_SIZE);
685
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
686
+ sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
687
+ s->bus = i2c_init_bus(dev, "i2c");
688
+}
79
+}
689
+
80
+
690
+static void allwinner_i2c_class_init(ObjectClass *klass, void *data)
81
static Property arm_cpu_lpa2_property =
691
+{
82
DEFINE_PROP_BOOL("lpa2", ARMCPU, prop_lpa2, true);
692
+ DeviceClass *dc = DEVICE_CLASS(klass);
83
693
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
84
@@ -XXX,XX +XXX,XX @@ void aarch64_max_tcg_initfn(Object *obj)
694
+
85
aarch64_add_sme_properties(obj);
695
+ rc->phases.hold = allwinner_i2c_reset_hold;
86
object_property_add(obj, "sve-max-vq", "uint32", cpu_max_get_sve_max_vq,
696
+ dc->vmsd = &allwinner_i2c_vmstate;
87
cpu_max_set_sve_max_vq, NULL, NULL);
697
+ dc->realize = allwinner_i2c_realize;
88
+ object_property_add_bool(obj, "x-rme", cpu_arm_get_rme, cpu_arm_set_rme);
698
+ dc->desc = "Allwinner I2C Controller";
89
+ object_property_add(obj, "x-l0gptsz", "uint32", cpu_max_get_l0gptsz,
699
+}
90
+ cpu_max_set_l0gptsz, NULL, NULL);
700
+
91
qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property);
701
+static const TypeInfo allwinner_i2c_type_info = {
92
}
702
+ .name = TYPE_AW_I2C,
93
703
+ .parent = TYPE_SYS_BUS_DEVICE,
704
+ .instance_size = sizeof(AWI2CState),
705
+ .class_init = allwinner_i2c_class_init,
706
+};
707
+
708
+static void allwinner_i2c_register_types(void)
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"
777
--
94
--
778
2.34.1
95
2.34.1
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Message-id: 20230109140306.23161-8-philmd@linaro.org
5
Message-id: 20230622143046.1578160-1-richard.henderson@linaro.org
6
[PMM: fixed typo; note experimental status in emulation.rst too]
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
---
8
hw/arm/stellaris.c | 6 +++---
9
docs/system/arm/cpu-features.rst | 23 +++++++++++++++++++++++
9
1 file changed, 3 insertions(+), 3 deletions(-)
10
docs/system/arm/emulation.rst | 1 +
11
2 files changed, 24 insertions(+)
10
12
11
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
13
diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/stellaris.c
15
--- a/docs/system/arm/cpu-features.rst
14
+++ b/hw/arm/stellaris.c
16
+++ b/docs/system/arm/cpu-features.rst
15
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_update(stellaris_adc_state *s)
17
@@ -XXX,XX +XXX,XX @@ As with ``sve-default-vector-length``, if the default length is larger
16
18
than the maximum vector length enabled, the actual vector length will
17
static void stellaris_adc_trigger(void *opaque, int irq, int level)
19
be reduced. If this property is set to ``-1`` then the default vector
18
{
20
length is set to the maximum possible length.
19
- stellaris_adc_state *s = (stellaris_adc_state *)opaque;
21
+
20
+ stellaris_adc_state *s = opaque;
22
+RME CPU Properties
21
int n;
23
+==================
22
24
+
23
for (n = 0; n < 4; n++) {
25
+The status of RME support with QEMU is experimental. At this time we
24
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_reset(stellaris_adc_state *s)
26
+only support RME within the CPU proper, not within the SMMU or GIC.
25
static uint64_t stellaris_adc_read(void *opaque, hwaddr offset,
27
+The feature is enabled by the CPU property ``x-rme``, with the ``x-``
26
unsigned size)
28
+prefix present as a reminder of the experimental status, and defaults off.
27
{
29
+
28
- stellaris_adc_state *s = (stellaris_adc_state *)opaque;
30
+The method for enabling RME will change in some future QEMU release
29
+ stellaris_adc_state *s = opaque;
31
+without notice or backward compatibility.
30
32
+
31
/* TODO: Implement this. */
33
+RME Level 0 GPT Size Property
32
if (offset >= 0x40 && offset < 0xc0) {
34
+-----------------------------
33
@@ -XXX,XX +XXX,XX @@ static uint64_t stellaris_adc_read(void *opaque, hwaddr offset,
35
+
34
static void stellaris_adc_write(void *opaque, hwaddr offset,
36
+To aid firmware developers in testing different possible CPU
35
uint64_t value, unsigned size)
37
+configurations, ``x-l0gptsz=S`` may be used to specify the value
36
{
38
+to encode into ``GPCCR_EL3.L0GPTSZ``, a read-only field that
37
- stellaris_adc_state *s = (stellaris_adc_state *)opaque;
39
+specifies the size of the Level 0 Granule Protection Table.
38
+ stellaris_adc_state *s = opaque;
40
+Legal values for ``S`` are 30, 34, 36, and 39; the default is 30.
39
41
+
40
/* TODO: Implement this. */
42
+As with ``x-rme``, the ``x-l0gptsz`` property may be renamed or
41
if (offset >= 0x40 && offset < 0xc0) {
43
+removed in some future QEMU release.
44
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
45
index XXXXXXX..XXXXXXX 100644
46
--- a/docs/system/arm/emulation.rst
47
+++ b/docs/system/arm/emulation.rst
48
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
49
- FEAT_RAS (Reliability, availability, and serviceability)
50
- FEAT_RASv1p1 (RAS Extension v1.1)
51
- FEAT_RDM (Advanced SIMD rounding double multiply accumulate instructions)
52
+- FEAT_RME (Realm Management Extension) (NB: support status in QEMU is experimental)
53
- FEAT_RNG (Random number generator)
54
- FEAT_S2FWB (Stage 2 forced Write-Back)
55
- FEAT_SB (Speculation Barrier)
42
--
56
--
43
2.34.1
57
2.34.1
44
58
45
59
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
We use __builtin_subcll() to do a 64-bit subtract with borrow-in and
2
borrow-out when the host compiler supports it. Unfortunately some
3
versions of Apple Clang have a bug in their implementation of this
4
intrinsic which means it returns the wrong value. The effect is that
5
a QEMU built with the affected compiler will hang when emulating x86
6
or m68k float80 division.
2
7
3
Following docs/devel/style.rst guidelines, rename omap2_gpif_s ->
8
The upstream LLVM issue is:
4
Omap2GpioState. This also remove a use of 'struct' in the
9
https://github.com/llvm/llvm-project/issues/55253
5
DECLARE_INSTANCE_CHECKER() macro call.
6
10
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
The commit that introduced the bug apparently never made it into an
12
upstream LLVM release without the subsequent fix
13
https://github.com/llvm/llvm-project/commit/fffb6e6afdbaba563189c1f715058ed401fbc88d
14
but unfortunately it did make it into Apple Clang 14.0, as shipped
15
in Xcode 14.3 (14.2 is reported to be OK). The Apple bug number is
16
FB12210478.
17
18
Add ifdefs to avoid use of __builtin_subcll() on Apple Clang version
19
14 or greater. There is not currently a version of Apple Clang which
20
has the bug fix -- when one appears we should be able to add an upper
21
bound to the ifdef condition so we can start using the builtin again.
22
We make the lower bound a conservative "any Apple clang with major
23
version 14 or greater" because the consequences of incorrectly
24
disabling the builtin when it would work are pretty small and the
25
consequences of not disabling it when we should are pretty bad.
26
27
Many thanks to those users who both reported this bug and also
28
did a lot of work in identifying the root cause; in particular
29
to Daniel Bertalan and osy.
30
31
Cc: qemu-stable@nongnu.org
32
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1631
33
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1659
34
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
35
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109140306.23161-6-philmd@linaro.org
36
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
37
Tested-by: Daniel Bertalan <dani@danielbertalan.dev>
38
Tested-by: Tested-By: Solra Bizna <solra@bizna.name>
39
Message-id: 20230622130823.1631719-1-peter.maydell@linaro.org
11
---
40
---
12
include/hw/arm/omap.h | 9 ++++-----
41
include/qemu/compiler.h | 13 +++++++++++++
13
hw/gpio/omap_gpio.c | 20 ++++++++++----------
42
include/qemu/host-utils.h | 2 +-
14
2 files changed, 14 insertions(+), 15 deletions(-)
43
2 files changed, 14 insertions(+), 1 deletion(-)
15
44
16
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
45
diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h
17
index XXXXXXX..XXXXXXX 100644
46
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/omap.h
47
--- a/include/qemu/compiler.h
19
+++ b/include/hw/arm/omap.h
48
+++ b/include/qemu/compiler.h
20
@@ -XXX,XX +XXX,XX @@ DECLARE_INSTANCE_CHECKER(Omap1GpioState, OMAP1_GPIO,
49
@@ -XXX,XX +XXX,XX @@
21
TYPE_OMAP1_GPIO)
50
#define QEMU_DISABLE_CFI
22
51
#endif
23
#define TYPE_OMAP2_GPIO "omap2-gpio"
52
24
-DECLARE_INSTANCE_CHECKER(struct omap2_gpif_s, OMAP2_GPIO,
53
+/*
25
+typedef struct Omap2GpioState Omap2GpioState;
54
+ * Apple clang version 14 has a bug in its __builtin_subcll(); define
26
+DECLARE_INSTANCE_CHECKER(Omap2GpioState, OMAP2_GPIO,
55
+ * BUILTIN_SUBCLL_BROKEN for the offending versions so we can avoid it.
27
TYPE_OMAP2_GPIO)
56
+ * When a version of Apple clang which has this bug fixed is released
28
57
+ * we can add an upper bound to this check.
29
-typedef struct omap2_gpif_s omap2_gpif;
58
+ * See https://gitlab.com/qemu-project/qemu/-/issues/1631
30
-
59
+ * and https://gitlab.com/qemu-project/qemu/-/issues/1659 for details.
31
/* TODO: clock framework (see above) */
60
+ * The bug never made it into any upstream LLVM releases, only Apple ones.
32
void omap_gpio_set_clk(Omap1GpioState *gpio, omap_clk clk);
61
+ */
33
62
+#if defined(__apple_build_version__) && __clang_major__ >= 14
34
-void omap2_gpio_set_iclk(omap2_gpif *gpio, omap_clk clk);
63
+#define BUILTIN_SUBCLL_BROKEN
35
-void omap2_gpio_set_fclk(omap2_gpif *gpio, uint8_t i, omap_clk clk);
64
+#endif
36
+void omap2_gpio_set_iclk(Omap2GpioState *gpio, omap_clk clk);
65
+
37
+void omap2_gpio_set_fclk(Omap2GpioState *gpio, uint8_t i, omap_clk clk);
66
#endif /* COMPILER_H */
38
67
diff --git a/include/qemu/host-utils.h b/include/qemu/host-utils.h
39
/* OMAP2 l4 Interconnect */
40
struct omap_l4_s;
41
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
42
index XXXXXXX..XXXXXXX 100644
68
index XXXXXXX..XXXXXXX 100644
43
--- a/hw/gpio/omap_gpio.c
69
--- a/include/qemu/host-utils.h
44
+++ b/hw/gpio/omap_gpio.c
70
+++ b/include/qemu/host-utils.h
45
@@ -XXX,XX +XXX,XX @@ struct omap2_gpio_s {
71
@@ -XXX,XX +XXX,XX @@ static inline uint64_t uadd64_carry(uint64_t x, uint64_t y, bool *pcarry)
46
uint8_t delay;
72
*/
47
};
73
static inline uint64_t usub64_borrow(uint64_t x, uint64_t y, bool *pborrow)
48
49
-struct omap2_gpif_s {
50
+struct Omap2GpioState {
51
SysBusDevice parent_obj;
52
53
MemoryRegion iomem;
54
@@ -XXX,XX +XXX,XX @@ static inline void omap2_gpio_module_int(struct omap2_gpio_s *s, int line)
55
56
static void omap2_gpio_set(void *opaque, int line, int level)
57
{
74
{
58
- struct omap2_gpif_s *p = opaque;
75
-#if __has_builtin(__builtin_subcll)
59
+ Omap2GpioState *p = opaque;
76
+#if __has_builtin(__builtin_subcll) && !defined(BUILTIN_SUBCLL_BROKEN)
60
struct omap2_gpio_s *s = &p->modules[line >> 5];
77
unsigned long long b = *pborrow;
61
78
x = __builtin_subcll(x, y, b, &b);
62
line &= 31;
79
*pborrow = b & 1;
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;
107
}
108
109
-void omap2_gpio_set_fclk(omap2_gpif *gpio, uint8_t i, omap_clk clk)
110
+void omap2_gpio_set_fclk(Omap2GpioState *gpio, uint8_t i, omap_clk clk)
111
{
112
assert(i <= 5);
113
gpio->fclk[i] = clk;
114
}
115
116
static Property omap2_gpio_properties[] = {
117
- DEFINE_PROP_INT32("mpu_model", struct omap2_gpif_s, mpu_model, 0),
118
+ DEFINE_PROP_INT32("mpu_model", Omap2GpioState, mpu_model, 0),
119
DEFINE_PROP_END_OF_LIST(),
120
};
121
122
@@ -XXX,XX +XXX,XX @@ static void omap2_gpio_class_init(ObjectClass *klass, void *data)
123
static const TypeInfo omap2_gpio_info = {
124
.name = TYPE_OMAP2_GPIO,
125
.parent = TYPE_SYS_BUS_DEVICE,
126
- .instance_size = sizeof(struct omap2_gpif_s),
127
+ .instance_size = sizeof(Omap2GpioState),
128
.class_init = omap2_gpio_class_init,
129
};
130
131
--
80
--
132
2.34.1
81
2.34.1
133
82
134
83
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Following docs/devel/style.rst guidelines, rename omap_gpif_s ->
3
One cannot test for feature aa32_simd_r32 without first
4
Omap1GpioState. This also remove a use of 'struct' in the
4
testing if AArch32 mode is supported at all. This leads to
5
DECLARE_INSTANCE_CHECKER() macro call.
6
5
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
qemu-system-aarch64: ARM CPUs must have both VFP-D32 and Neon or neither
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
9
Message-id: 20230109140306.23161-5-philmd@linaro.org
8
for Apple M1 cpus.
9
10
We already have a check for ARMv8-A never setting vfp-d32 true,
11
so restructure the code so that AArch64 avoids the test entirely.
12
13
Reported-by: Mads Ynddal <mads@ynddal.dk>
14
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
15
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
16
Tested-by: Mads Ynddal <m.ynddal@samsung.com>
17
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
18
Reviewed-by: Cédric Le Goater <clg@kaod.org>
19
Reviewed-by: Mads Ynddal <m.ynddal@samsung.com>
20
Message-id: 20230619140216.402530-1-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
22
---
12
include/hw/arm/omap.h | 6 +++---
23
target/arm/cpu.c | 28 +++++++++++++++-------------
13
hw/gpio/omap_gpio.c | 16 ++++++++--------
24
1 file changed, 15 insertions(+), 13 deletions(-)
14
2 files changed, 11 insertions(+), 11 deletions(-)
15
25
16
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
26
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
17
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/omap.h
28
--- a/target/arm/cpu.c
19
+++ b/include/hw/arm/omap.h
29
+++ b/target/arm/cpu.c
20
@@ -XXX,XX +XXX,XX @@ void omap_i2c_set_fclk(OMAPI2CState *i2c, omap_clk clk);
30
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
21
31
* KVM does not currently allow us to lie to the guest about its
22
/* omap_gpio.c */
32
* ID/feature registers, so the guest always sees what the host has.
23
#define TYPE_OMAP1_GPIO "omap-gpio"
33
*/
24
-DECLARE_INSTANCE_CHECKER(struct omap_gpif_s, OMAP1_GPIO,
34
- if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)
25
+typedef struct Omap1GpioState Omap1GpioState;
35
- ? cpu_isar_feature(aa64_fp_simd, cpu)
26
+DECLARE_INSTANCE_CHECKER(Omap1GpioState, OMAP1_GPIO,
36
- : cpu_isar_feature(aa32_vfp, cpu)) {
27
TYPE_OMAP1_GPIO)
37
- cpu->has_vfp = true;
28
38
- if (!kvm_enabled()) {
29
#define TYPE_OMAP2_GPIO "omap2-gpio"
39
- qdev_property_add_static(DEVICE(obj), &arm_cpu_has_vfp_property);
30
DECLARE_INSTANCE_CHECKER(struct omap2_gpif_s, OMAP2_GPIO,
40
+ if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
31
TYPE_OMAP2_GPIO)
41
+ if (cpu_isar_feature(aa64_fp_simd, cpu)) {
32
42
+ cpu->has_vfp = true;
33
-typedef struct omap_gpif_s omap_gpif;
43
+ cpu->has_vfp_d32 = true;
34
typedef struct omap2_gpif_s omap2_gpif;
44
+ if (tcg_enabled() || qtest_enabled()) {
35
45
+ qdev_property_add_static(DEVICE(obj),
36
/* TODO: clock framework (see above) */
46
+ &arm_cpu_has_vfp_property);
37
-void omap_gpio_set_clk(omap_gpif *gpio, omap_clk clk);
47
+ }
38
+void omap_gpio_set_clk(Omap1GpioState *gpio, omap_clk clk);
48
}
39
49
- }
40
void omap2_gpio_set_iclk(omap2_gpif *gpio, omap_clk clk);
50
-
41
void omap2_gpio_set_fclk(omap2_gpif *gpio, uint8_t i, omap_clk clk);
51
- if (cpu->has_vfp && cpu_isar_feature(aa32_simd_r32, cpu)) {
42
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
52
- cpu->has_vfp_d32 = true;
43
index XXXXXXX..XXXXXXX 100644
53
- if (!kvm_enabled()) {
44
--- a/hw/gpio/omap_gpio.c
54
+ } else if (cpu_isar_feature(aa32_vfp, cpu)) {
45
+++ b/hw/gpio/omap_gpio.c
55
+ cpu->has_vfp = true;
46
@@ -XXX,XX +XXX,XX @@ struct omap_gpio_s {
56
+ if (cpu_isar_feature(aa32_simd_r32, cpu)) {
47
uint16_t pins;
57
+ cpu->has_vfp_d32 = true;
48
};
58
/*
49
59
* The permitted values of the SIMDReg bits [3:0] on
50
-struct omap_gpif_s {
60
* Armv8-A are either 0b0000 and 0b0010. On such CPUs,
51
+struct Omap1GpioState {
61
* make sure that has_vfp_d32 can not be set to false.
52
SysBusDevice parent_obj;
62
*/
53
63
- if (!(arm_feature(&cpu->env, ARM_FEATURE_V8) &&
54
MemoryRegion iomem;
64
- !arm_feature(&cpu->env, ARM_FEATURE_M))) {
55
@@ -XXX,XX +XXX,XX @@ struct omap_gpif_s {
65
+ if ((tcg_enabled() || qtest_enabled())
56
/* General-Purpose I/O of OMAP1 */
66
+ && !(arm_feature(&cpu->env, ARM_FEATURE_V8)
57
static void omap_gpio_set(void *opaque, int line, int level)
67
+ && !arm_feature(&cpu->env, ARM_FEATURE_M))) {
58
{
68
qdev_property_add_static(DEVICE(obj),
59
- struct omap_gpif_s *p = opaque;
69
&arm_cpu_has_vfp_d32_property);
60
+ Omap1GpioState *p = opaque;
70
}
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)
92
}
93
}
94
95
-void omap_gpio_set_clk(omap_gpif *gpio, omap_clk clk)
96
+void omap_gpio_set_clk(Omap1GpioState *gpio, omap_clk clk)
97
{
98
gpio->clk = clk;
99
}
100
101
static Property omap_gpio_properties[] = {
102
- DEFINE_PROP_INT32("mpu_model", struct omap_gpif_s, mpu_model, 0),
103
+ DEFINE_PROP_INT32("mpu_model", Omap1GpioState, mpu_model, 0),
104
DEFINE_PROP_END_OF_LIST(),
105
};
106
107
@@ -XXX,XX +XXX,XX @@ static void omap_gpio_class_init(ObjectClass *klass, void *data)
108
static const TypeInfo omap_gpio_info = {
109
.name = TYPE_OMAP1_GPIO,
110
.parent = TYPE_SYS_BUS_DEVICE,
111
- .instance_size = sizeof(struct omap_gpif_s),
112
+ .instance_size = sizeof(Omap1GpioState),
113
.instance_init = omap_gpio_init,
114
.class_init = omap_gpio_class_init,
115
};
116
--
71
--
117
2.34.1
72
2.34.1
118
73
119
74
diff view generated by jsdifflib
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
From: Shashi Mallela <shashi.mallela@linaro.org>
2
2
3
This patch adds minimal support for AXP-209 PMU.
3
Create ITS as part of SBSA platform GIC initialization.
4
Most important is chip ID since U-Boot SPL expects version 0x1. Besides
5
the chip ID register, reset values for two more registers used by A10
6
U-Boot SPL are covered.
7
4
8
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
5
GIC ITS information is in DeviceTree so TF-A can pass it to EDK2.
9
Message-id: 20221226220303.14420-5-strahinja.p.jankovic@gmail.com
6
7
Bumping platform version to 0.2 as this is important hardware change.
8
9
Signed-off-by: Shashi Mallela <shashi.mallela@linaro.org>
10
Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
11
Message-id: 20230619170913.517373-2-marcin.juszkiewicz@linaro.org
12
Co-authored-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
13
Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
16
---
13
hw/misc/axp209.c | 238 +++++++++++++++++++++++++++++++++++++++++++
17
docs/system/arm/sbsa.rst | 14 ++++++++++++++
14
MAINTAINERS | 2 +
18
hw/arm/sbsa-ref.c | 33 ++++++++++++++++++++++++++++++---
15
hw/misc/Kconfig | 4 +
19
2 files changed, 44 insertions(+), 3 deletions(-)
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
20
20
21
diff --git a/hw/misc/axp209.c b/hw/misc/axp209.c
21
diff --git a/docs/system/arm/sbsa.rst b/docs/system/arm/sbsa.rst
22
new file mode 100644
22
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX
23
--- a/docs/system/arm/sbsa.rst
24
--- /dev/null
24
+++ b/docs/system/arm/sbsa.rst
25
+++ b/hw/misc/axp209.c
25
@@ -XXX,XX +XXX,XX @@ to be a complete compliant DT. It currently reports:
26
@@ -XXX,XX +XXX,XX @@
26
- platform version
27
+/*
27
- GIC addresses
28
+ * AXP-209 PMU Emulation
28
29
+ *
29
+Platform version
30
+ * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
30
+''''''''''''''''
31
+ *
32
+ * Permission is hereby granted, free of charge, to any person obtaining a
33
+ * copy of this software and associated documentation files (the "Software"),
34
+ * to deal in the Software without restriction, including without limitation
35
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
36
+ * and/or sell copies of the Software, and to permit persons to whom the
37
+ * Software is furnished to do so, subject to the following conditions:
38
+ *
39
+ * The above copyright notice and this permission notice shall be included in
40
+ * all copies or substantial portions of the Software.
41
+ *
42
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
43
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
44
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
45
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
46
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
47
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
48
+ * DEALINGS IN THE SOFTWARE.
49
+ *
50
+ * SPDX-License-Identifier: MIT
51
+ */
52
+
31
+
53
+#include "qemu/osdep.h"
32
The platform version is only for informing platform firmware about
54
+#include "qemu/log.h"
33
what kind of ``sbsa-ref`` board it is running on. It is neither
55
+#include "trace.h"
34
a QEMU versioned machine type nor a reflection of the level of the
56
+#include "hw/i2c/i2c.h"
35
@@ -XXX,XX +XXX,XX @@ SBSA/SystemReady SR support provided.
57
+#include "migration/vmstate.h"
36
The ``machine-version-major`` value is updated when changes breaking
37
fw compatibility are introduced. The ``machine-version-minor`` value
38
is updated when features are added that don't break fw compatibility.
58
+
39
+
59
+#define TYPE_AXP209_PMU "axp209_pmu"
40
+Platform version changes:
60
+
41
+
61
+#define AXP209(obj) \
42
+0.0
62
+ OBJECT_CHECK(AXP209I2CState, (obj), TYPE_AXP209_PMU)
43
+ Devicetree holds information about CPUs, memory and platform version.
63
+
44
+
64
+/* registers */
45
+0.1
65
+enum {
46
+ GIC information is present in devicetree.
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
+
47
+
153
+#define AXP209_CHIP_VERSION_ID (0x01)
48
+0.2
154
+#define AXP209_DC_DC2_OUT_V_CTRL_RESET (0x16)
49
+ GIC ITS information is present in devicetree.
155
+#define AXP209_IRQ_BANK_1_CTRL_RESET (0xd8)
50
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/sbsa-ref.c
53
+++ b/hw/arm/sbsa-ref.c
54
@@ -XXX,XX +XXX,XX @@ enum {
55
SBSA_CPUPERIPHS,
56
SBSA_GIC_DIST,
57
SBSA_GIC_REDIST,
58
+ SBSA_GIC_ITS,
59
SBSA_SECURE_EC,
60
SBSA_GWDT_WS0,
61
SBSA_GWDT_REFRESH,
62
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry sbsa_ref_memmap[] = {
63
[SBSA_CPUPERIPHS] = { 0x40000000, 0x00040000 },
64
[SBSA_GIC_DIST] = { 0x40060000, 0x00010000 },
65
[SBSA_GIC_REDIST] = { 0x40080000, 0x04000000 },
66
+ [SBSA_GIC_ITS] = { 0x44081000, 0x00020000 },
67
[SBSA_SECURE_EC] = { 0x50000000, 0x00001000 },
68
[SBSA_GWDT_REFRESH] = { 0x50010000, 0x00001000 },
69
[SBSA_GWDT_CONTROL] = { 0x50011000, 0x00001000 },
70
@@ -XXX,XX +XXX,XX @@ static void sbsa_fdt_add_gic_node(SBSAMachineState *sms)
71
2, sbsa_ref_memmap[SBSA_GIC_REDIST].base,
72
2, sbsa_ref_memmap[SBSA_GIC_REDIST].size);
73
74
+ nodename = g_strdup_printf("/intc/its");
75
+ qemu_fdt_add_subnode(sms->fdt, nodename);
76
+ qemu_fdt_setprop_sized_cells(sms->fdt, nodename, "reg",
77
+ 2, sbsa_ref_memmap[SBSA_GIC_ITS].base,
78
+ 2, sbsa_ref_memmap[SBSA_GIC_ITS].size);
156
+
79
+
157
+/* A simple I2C slave which returns values of ID or CNT register. */
80
g_free(nodename);
158
+typedef struct AXP209I2CState {
81
}
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
+
82
+
167
+/* Reset all counters and load ID register */
83
/*
168
+static void axp209_reset_enter(Object *obj, ResetType type)
84
* Firmware on this machine only uses ACPI table to load OS, these limited
85
* device tree nodes are just to let firmware know the info which varies from
86
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SBSAMachineState *sms)
87
* fw compatibility.
88
*/
89
qemu_fdt_setprop_cell(fdt, "/", "machine-version-major", 0);
90
- qemu_fdt_setprop_cell(fdt, "/", "machine-version-minor", 1);
91
+ qemu_fdt_setprop_cell(fdt, "/", "machine-version-minor", 2);
92
93
if (ms->numa_state->have_numa_distance) {
94
int size = nb_numa_nodes * nb_numa_nodes * 3 * sizeof(uint32_t);
95
@@ -XXX,XX +XXX,XX @@ static void create_secure_ram(SBSAMachineState *sms,
96
memory_region_add_subregion(secure_sysmem, base, secram);
97
}
98
99
-static void create_gic(SBSAMachineState *sms)
100
+static void create_its(SBSAMachineState *sms)
169
+{
101
+{
170
+ AXP209I2CState *s = AXP209(obj);
102
+ const char *itsclass = its_class_name();
103
+ DeviceState *dev;
171
+
104
+
172
+ memset(s->regs, 0, NR_REGS);
105
+ dev = qdev_new(itsclass);
173
+ s->ptr = 0;
106
+
174
+ s->count = 0;
107
+ object_property_set_link(OBJECT(dev), "parent-gicv3", OBJECT(sms->gic),
175
+ s->regs[REG_CHIP_VERSION] = AXP209_CHIP_VERSION_ID;
108
+ &error_abort);
176
+ s->regs[REG_DC_DC2_OUT_V_CTRL] = AXP209_DC_DC2_OUT_V_CTRL_RESET;
109
+ sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
177
+ s->regs[REG_IRQ_BANK_1_CTRL] = AXP209_IRQ_BANK_1_CTRL_RESET;
110
+ sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, sbsa_ref_memmap[SBSA_GIC_ITS].base);
178
+}
111
+}
179
+
112
+
180
+/* Handle events from master. */
113
+static void create_gic(SBSAMachineState *sms, MemoryRegion *mem)
181
+static int axp209_event(I2CSlave *i2c, enum i2c_event event)
114
{
182
+{
115
unsigned int smp_cpus = MACHINE(sms)->smp.cpus;
183
+ AXP209I2CState *s = AXP209(i2c);
116
SysBusDevice *gicbusdev;
117
@@ -XXX,XX +XXX,XX @@ static void create_gic(SBSAMachineState *sms)
118
qdev_prop_set_uint32(sms->gic, "len-redist-region-count", 1);
119
qdev_prop_set_uint32(sms->gic, "redist-region-count[0]", redist0_count);
120
121
+ object_property_set_link(OBJECT(sms->gic), "sysmem",
122
+ OBJECT(mem), &error_fatal);
123
+ qdev_prop_set_bit(sms->gic, "has-lpi", true);
184
+
124
+
185
+ s->count = 0;
125
gicbusdev = SYS_BUS_DEVICE(sms->gic);
186
+
126
sysbus_realize_and_unref(gicbusdev, &error_fatal);
187
+ return 0;
127
sysbus_mmio_map(gicbusdev, 0, sbsa_ref_memmap[SBSA_GIC_DIST].base);
188
+}
128
@@ -XXX,XX +XXX,XX @@ static void create_gic(SBSAMachineState *sms)
189
+
129
sysbus_connect_irq(gicbusdev, i + 3 * smp_cpus,
190
+/* Called when master requests read */
130
qdev_get_gpio_in(cpudev, ARM_CPU_VFIQ));
191
+static uint8_t axp209_rx(I2CSlave *i2c)
131
}
192
+{
132
+ create_its(sms);
193
+ AXP209I2CState *s = AXP209(i2c);
133
}
194
+ uint8_t ret = 0xff;
134
195
+
135
static void create_uart(const SBSAMachineState *sms, int uart,
196
+ if (s->ptr < NR_REGS) {
136
@@ -XXX,XX +XXX,XX @@ static void sbsa_ref_init(MachineState *machine)
197
+ ret = s->regs[s->ptr++];
137
198
+ }
138
create_secure_ram(sms, secure_sysmem);
199
+
139
200
+ trace_axp209_rx(s->ptr - 1, ret);
140
- create_gic(sms);
201
+
141
+ create_gic(sms, sysmem);
202
+ return ret;
142
203
+}
143
create_uart(sms, SBSA_UART, sysmem, serial_hd(0));
204
+
144
create_uart(sms, SBSA_SECURE_UART, secure_sysmem, serial_hd(1));
205
+/*
206
+ * Called when master sends write.
207
+ * Update ptr with byte 0, then perform write with second byte.
208
+ */
209
+static int axp209_tx(I2CSlave *i2c, uint8_t data)
210
+{
211
+ AXP209I2CState *s = AXP209(i2c);
212
+
213
+ if (s->count == 0) {
214
+ /* Store register address */
215
+ s->ptr = data;
216
+ s->count++;
217
+ trace_axp209_select(data);
218
+ } else {
219
+ trace_axp209_tx(s->ptr, data);
220
+ if (s->ptr == REG_DC_DC2_OUT_V_CTRL) {
221
+ s->regs[s->ptr++] = data;
222
+ }
223
+ }
224
+
225
+ return 0;
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()
236
+ }
237
+};
238
+
239
+static void axp209_class_init(ObjectClass *oc, void *data)
240
+{
241
+ DeviceClass *dc = DEVICE_CLASS(oc);
242
+ I2CSlaveClass *isc = I2C_SLAVE_CLASS(oc);
243
+ ResettableClass *rc = RESETTABLE_CLASS(oc);
244
+
245
+ rc->phases.enter = axp209_reset_enter;
246
+ dc->vmsd = &vmstate_axp209;
247
+ isc->event = axp209_event;
248
+ isc->recv = axp209_rx;
249
+ isc->send = axp209_tx;
250
+}
251
+
252
+static const TypeInfo axp209_info = {
253
+ .name = TYPE_AXP209_PMU,
254
+ .parent = TYPE_I2C_SLAVE,
255
+ .instance_size = sizeof(AXP209I2CState),
256
+ .class_init = axp209_class_init
257
+};
258
+
259
+static void axp209_register_devices(void)
260
+{
261
+ type_register_static(&axp209_info);
262
+}
263
+
264
+type_init(axp209_register_devices);
265
diff --git a/MAINTAINERS b/MAINTAINERS
266
index XXXXXXX..XXXXXXX 100644
267
--- a/MAINTAINERS
268
+++ b/MAINTAINERS
269
@@ -XXX,XX +XXX,XX @@ ARM Machines
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"
325
--
145
--
326
2.34.1
146
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
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
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
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
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
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
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/collie.c | 16 ++++++++++------
13
1 file changed, 10 insertions(+), 6 deletions(-)
14
15
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/collie.c
18
+++ b/hw/arm/collie.c
19
@@ -XXX,XX +XXX,XX @@
20
#include "cpu.h"
21
#include "qom/object.h"
22
23
+#define RAM_SIZE (512 * MiB)
24
+#define FLASH_SIZE (32 * MiB)
25
+#define FLASH_SECTOR_SIZE (64 * KiB)
26
+
27
struct CollieMachineState {
28
MachineState parent;
29
30
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(CollieMachineState, COLLIE_MACHINE)
31
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";
65
}
66
67
--
68
2.34.1
69
70
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20230109115316.2235-5-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
hw/arm/collie.c | 17 +++++++----------
9
1 file changed, 7 insertions(+), 10 deletions(-)
10
11
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/collie.c
14
+++ b/hw/arm/collie.c
15
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info collie_binfo = {
16
17
static void collie_init(MachineState *machine)
18
{
19
- DriveInfo *dinfo;
20
MachineClass *mc = MACHINE_GET_CLASS(machine);
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);
45
46
--
47
2.34.1
48
49
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
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é <f4bug@amsat.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230109115316.2235-7-philmd@linaro.org
10
Message-Id: <20200223231044.8003-3-philmd@redhat.com>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/arm/gumstix.c | 27 ++++++++++++++-------------
14
1 file changed, 14 insertions(+), 13 deletions(-)
15
16
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/gumstix.c
19
+++ b/hw/arm/gumstix.c
20
@@ -XXX,XX +XXX,XX @@
21
*/
22
23
#include "qemu/osdep.h"
24
+#include "qemu/units.h"
25
#include "qemu/error-report.h"
26
#include "hw/arm/pxa.h"
27
#include "net/net.h"
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
}
90
--
91
2.34.1
92
93
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
3
IEC binary prefixes ease code review: the unit is explicit.
4
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-8-philmd@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/mainstone.c | 18 ++++++++++--------
13
1 file changed, 10 insertions(+), 8 deletions(-)
14
15
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/mainstone.c
18
+++ b/hw/arm/mainstone.c
19
@@ -XXX,XX +XXX,XX @@
20
* GNU GPL, version 2 or (at your option) any later version.
21
*/
22
#include "qemu/osdep.h"
23
+#include "qemu/units.h"
24
#include "qemu/error-report.h"
25
#include "qapi/error.h"
26
#include "hw/arm/pxa.h"
27
@@ -XXX,XX +XXX,XX @@ static const struct keymap map[0xE0] = {
28
29
enum mainstone_model_e { mainstone };
30
31
-#define MAINSTONE_RAM    0x04000000
32
-#define MAINSTONE_ROM    0x00800000
33
-#define MAINSTONE_FLASH    0x02000000
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)
45
+
46
static void mainstone_common_init(MachineState *machine,
47
enum mainstone_model_e model, int arm_id)
48
{
49
- uint32_t sector_len = 256 * 1024;
50
hwaddr mainstone_flash_base[] = { MST_FLASH_0, MST_FLASH_1 };
51
PXA2xxState *mpu;
52
DeviceState *mst_irq;
53
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MachineState *machine,
54
55
/* Setup CPU & memory */
56
mpu = pxa270_init(mainstone_binfo.ram_size, machine->cpu_type);
57
- memory_region_init_rom(rom, NULL, "mainstone.rom", MAINSTONE_ROM,
58
+ memory_region_init_rom(rom, NULL, "mainstone.rom", MAINSTONE_ROM_SIZE,
59
&error_fatal);
60
memory_region_add_subregion(get_system_memory(), 0x00000000, rom);
61
62
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MachineState *machine,
63
dinfo = drive_get(IF_PFLASH, 0, i);
64
if (!pflash_cfi01_register(mainstone_flash_base[i],
65
i ? "mainstone.flash1" : "mainstone.flash0",
66
- MAINSTONE_FLASH,
67
+ MAINSTONE_FLASH_SIZE,
68
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
69
- sector_len, 4, 0, 0, 0, 0, 0)) {
70
+ FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
71
error_report("Error registering flash memory");
72
exit(1);
73
}
74
--
75
2.34.1
76
77
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
3
IEC binary prefixes ease code review: the unit is explicit.
4
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
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/musicpal.c | 9 ++++++---
13
1 file changed, 6 insertions(+), 3 deletions(-)
14
15
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/musicpal.c
18
+++ b/hw/arm/musicpal.c
19
@@ -XXX,XX +XXX,XX @@
20
*/
21
22
#include "qemu/osdep.h"
23
+#include "qemu/units.h"
24
#include "qapi/error.h"
25
#include "cpu.h"
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);
56
--
57
2.34.1
58
59
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
3
The total_ram_v1/total_ram_v2 definitions were never used.
4
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
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
hw/arm/omap_sx1.c | 2 --
11
1 file changed, 2 deletions(-)
12
13
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/omap_sx1.c
16
+++ b/hw/arm/omap_sx1.c
17
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps static_ops = {
18
#define flash0_size    (16 * 1024 * 1024)
19
#define flash1_size    ( 8 * 1024 * 1024)
20
#define flash2_size    (32 * 1024 * 1024)
21
-#define total_ram_v1    (sdram_size + flash0_size + flash1_size + OMAP15XX_SRAM_SIZE)
22
-#define total_ram_v2    (sdram_size + flash2_size + OMAP15XX_SRAM_SIZE)
23
24
static struct arm_boot_info sx1_binfo = {
25
.loader_start = OMAP_EMIFF_BASE,
26
--
27
2.34.1
28
29
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
3
IEC binary prefixes ease code review: the unit is explicit.
4
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-12-philmd@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/z2.c | 6 ++++--
13
1 file changed, 4 insertions(+), 2 deletions(-)
14
15
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/z2.c
18
+++ b/hw/arm/z2.c
19
@@ -XXX,XX +XXX,XX @@
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,
29
};
30
31
+#define FLASH_SECTOR_SIZE (64 * KiB)
32
+
33
static void z2_init(MachineState *machine)
34
{
35
- uint32_t sector_len = 0x10000;
36
PXA2xxState *mpu;
37
DriveInfo *dinfo;
38
void *z2_lcd;
39
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
40
dinfo = drive_get(IF_PFLASH, 0, 0);
41
if (!pflash_cfi01_register(Z2_FLASH_BASE, "z2.flash0", Z2_FLASH_SIZE,
42
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
43
- sector_len, 4, 0, 0, 0, 0, 0)) {
44
+ FLASH_SECTOR_SIZE, 4, 0, 0, 0, 0, 0)) {
45
error_report("Error registering flash memory");
46
exit(1);
47
}
48
--
49
2.34.1
50
51
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
3
Upon introduction in commit b8433303fb ("Set proper device-width
4
for vexpress flash"), ve_pflash_cfi01_register() was calling
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.
8
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20230109115316.2235-13-philmd@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/vexpress.c | 10 +---------
15
1 file changed, 1 insertion(+), 9 deletions(-)
16
17
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/vexpress.c
20
+++ b/hw/arm/vexpress.c
21
@@ -XXX,XX +XXX,XX @@ static void vexpress_common_init(MachineState *machine)
22
dinfo = drive_get(IF_PFLASH, 0, 0);
23
pflash0 = ve_pflash_cfi01_register(map[VE_NORFLASH0], "vexpress.flash0",
24
dinfo);
25
- if (!pflash0) {
26
- error_report("vexpress: error registering flash 0");
27
- exit(1);
28
- }
29
30
if (map[VE_NORFLASHALIAS] != -1) {
31
/* Map flash 0 as an alias into low memory */
32
@@ -XXX,XX +XXX,XX @@ static void vexpress_common_init(MachineState *machine)
33
}
34
35
dinfo = drive_get(IF_PFLASH, 0, 1);
36
- if (!ve_pflash_cfi01_register(map[VE_NORFLASH1], "vexpress.flash1",
37
- dinfo)) {
38
- error_report("vexpress: error registering flash 1");
39
- exit(1);
40
- }
41
+ ve_pflash_cfi01_register(map[VE_NORFLASH1], "vexpress.flash1", dinfo);
42
43
sram_size = 0x2000000;
44
memory_region_init_ram(sram, NULL, "vexpress.sram", sram_size,
45
--
46
2.34.1
47
48
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
3
To avoid forward-declaring PXA2xxI2CState, declare
4
PXA2XX_I2C before its use in pxa2xx_i2c_init() prototype.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20230109140306.23161-2-philmd@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/arm/pxa.h | 6 +++---
12
1 file changed, 3 insertions(+), 3 deletions(-)
13
14
diff --git a/include/hw/arm/pxa.h b/include/hw/arm/pxa.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/include/hw/arm/pxa.h
17
+++ b/include/hw/arm/pxa.h
18
@@ -XXX,XX +XXX,XX @@ void pxa27x_register_keypad(PXA2xxKeyPadState *kp,
19
const struct keymap *map, int size);
20
21
/* pxa2xx.c */
22
-typedef struct PXA2xxI2CState PXA2xxI2CState;
23
+#define TYPE_PXA2XX_I2C "pxa2xx_i2c"
24
+OBJECT_DECLARE_SIMPLE_TYPE(PXA2xxI2CState, PXA2XX_I2C)
25
+
26
PXA2xxI2CState *pxa2xx_i2c_init(hwaddr base,
27
qemu_irq irq, uint32_t page_size);
28
I2CBus *pxa2xx_i2c_bus(PXA2xxI2CState *s);
29
30
-#define TYPE_PXA2XX_I2C "pxa2xx_i2c"
31
typedef struct PXA2xxI2SState PXA2xxI2SState;
32
-OBJECT_DECLARE_SIMPLE_TYPE(PXA2xxI2CState, PXA2XX_I2C)
33
34
#define TYPE_PXA2XX_FIR "pxa2xx-fir"
35
OBJECT_DECLARE_SIMPLE_TYPE(PXA2xxFIrState, PXA2XX_FIR)
36
--
37
2.34.1
38
39
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Brown bag time: store instead of load results in uninitialized temp.
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
5
Message-id: 20230109140306.23161-4-philmd@linaro.org
5
6
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1704
7
Reported-by: Mark Rutland <mark.rutland@arm.com>
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20230620134659.817559-1-richard.henderson@linaro.org
11
Fixes: e6dd5e782be ("target/arm: Use tcg_gen_qemu_{ld, st}_i128 in gen_sve_{ld, st}r")
12
Tested-by: Alex Bennée <alex.bennee@linaro.org>
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
16
---
8
hw/arm/omap1.c | 115 ++++++++++++++++++--------------------
17
target/arm/tcg/translate-sve.c | 2 +-
9
hw/arm/omap2.c | 40 ++++++-------
18
1 file changed, 1 insertion(+), 1 deletion(-)
10
hw/arm/omap_sx1.c | 2 +-
11
hw/arm/palm.c | 2 +-
12
hw/char/omap_uart.c | 7 +--
13
hw/display/omap_dss.c | 15 +++--
14
hw/display/omap_lcdc.c | 9 ++-
15
hw/dma/omap_dma.c | 15 +++--
16
hw/gpio/omap_gpio.c | 15 +++--
17
hw/intc/omap_intc.c | 12 ++--
18
hw/misc/omap_gpmc.c | 12 ++--
19
hw/misc/omap_l4.c | 7 +--
20
hw/misc/omap_sdrc.c | 7 +--
21
hw/misc/omap_tap.c | 5 +-
22
hw/sd/omap_mmc.c | 9 ++-
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(-)
27
19
28
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
20
diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
29
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/arm/omap1.c
22
--- a/target/arm/tcg/translate-sve.c
31
+++ b/hw/arm/omap1.c
23
+++ b/target/arm/tcg/translate-sve.c
32
@@ -XXX,XX +XXX,XX @@ static void omap_timer_fire(void *opaque)
24
@@ -XXX,XX +XXX,XX @@ void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs,
33
25
/* Predicate register stores can be any multiple of 2. */
34
static void omap_timer_tick(void *opaque)
26
if (len_remain >= 8) {
35
{
27
t0 = tcg_temp_new_i64();
36
- struct omap_mpu_timer_s *timer = (struct omap_mpu_timer_s *) opaque;
28
- tcg_gen_st_i64(t0, base, vofs + len_align);
37
+ struct omap_mpu_timer_s *timer = opaque;
29
+ tcg_gen_ld_i64(t0, base, vofs + len_align);
38
30
tcg_gen_qemu_st_i64(t0, clean_addr, midx, MO_LEUQ | MO_ATOM_NONE);
39
omap_timer_sync(timer);
31
len_remain -= 8;
40
omap_timer_fire(timer);
32
len_align += 8;
41
@@ -XXX,XX +XXX,XX @@ static void omap_timer_tick(void *opaque)
42
43
static void omap_timer_clk_update(void *opaque, int line, int on)
44
{
45
- struct omap_mpu_timer_s *timer = (struct omap_mpu_timer_s *) opaque;
46
+ struct omap_mpu_timer_s *timer = opaque;
47
48
omap_timer_sync(timer);
49
timer->rate = on ? omap_clk_getrate(timer->clk) : 0;
50
@@ -XXX,XX +XXX,XX @@ static void omap_timer_clk_setup(struct omap_mpu_timer_s *timer)
51
static uint64_t omap_mpu_timer_read(void *opaque, hwaddr addr,
52
unsigned size)
53
{
54
- struct omap_mpu_timer_s *s = (struct omap_mpu_timer_s *) opaque;
55
+ struct omap_mpu_timer_s *s = opaque;
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)
294
}
295
}
296
297
-static uint64_t omap_uwire_read(void *opaque, hwaddr addr,
298
- unsigned size)
299
+static uint64_t omap_uwire_read(void *opaque, hwaddr addr, unsigned size)
300
{
301
- struct omap_uwire_s *s = (struct omap_uwire_s *) opaque;
302
+ struct omap_uwire_s *s = opaque;
303
int offset = addr & OMAP_MPUI_REG_MASK;
304
305
if (size != 2) {
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);
573
return 0;
574
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_sti_fifo_read(void *opaque, hwaddr addr,
575
static void omap_sti_fifo_write(void *opaque, hwaddr addr,
576
uint64_t value, unsigned size)
577
{
578
- struct omap_sti_s *s = (struct omap_sti_s *) opaque;
579
+ struct omap_sti_s *s = opaque;
580
int ch = addr >> 6;
581
uint8_t byte = value;
582
583
@@ -XXX,XX +XXX,XX @@ static void omap_prcm_int_update(struct omap_prcm_s *s, int dom)
584
static uint64_t omap_prcm_read(void *opaque, hwaddr addr,
585
unsigned size)
586
{
587
- struct omap_prcm_s *s = (struct omap_prcm_s *) opaque;
588
+ struct omap_prcm_s *s = opaque;
589
uint32_t ret;
590
591
if (size != 4) {
592
@@ -XXX,XX +XXX,XX @@ static void omap_prcm_dpll_update(struct omap_prcm_s *s)
593
static void omap_prcm_write(void *opaque, hwaddr addr,
594
uint64_t value, unsigned size)
595
{
596
- struct omap_prcm_s *s = (struct omap_prcm_s *) opaque;
597
+ struct omap_prcm_s *s = opaque;
598
599
if (size != 4) {
600
omap_badwidth_write32(opaque, addr, value);
601
@@ -XXX,XX +XXX,XX @@ struct omap_sysctl_s {
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,
633
}
634
}
635
636
-static void omap_sysctl_write(void *opaque, hwaddr addr,
637
- uint32_t value)
638
+static void omap_sysctl_write(void *opaque, hwaddr addr, uint32_t value)
639
{
640
- struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque;
641
+ struct omap_sysctl_s *s = opaque;
642
643
switch (addr) {
644
case 0x000:    /* CONTROL_REVISION */
645
@@ -XXX,XX +XXX,XX @@ static struct omap_sysctl_s *omap_sysctl_init(struct omap_target_agent_s *ta,
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) {
782
}
783
}
784
785
-static uint64_t omap_lcdc_read(void *opaque, hwaddr addr,
786
- unsigned size)
787
+static uint64_t omap_lcdc_read(void *opaque, hwaddr addr, unsigned size)
788
{
789
- struct omap_lcd_panel_s *s = (struct omap_lcd_panel_s *) opaque;
790
+ struct omap_lcd_panel_s *s = opaque;
791
792
switch (addr) {
793
case 0x00:    /* LCD_CONTROL */
794
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_lcdc_read(void *opaque, hwaddr addr,
795
static void omap_lcdc_write(void *opaque, hwaddr addr,
796
uint64_t value, unsigned size)
797
{
798
- struct omap_lcd_panel_s *s = (struct omap_lcd_panel_s *) opaque;
799
+ struct omap_lcd_panel_s *s = opaque;
800
801
switch (addr) {
802
case 0x00:    /* LCD_CONTROL */
803
diff --git a/hw/dma/omap_dma.c b/hw/dma/omap_dma.c
804
index XXXXXXX..XXXXXXX 100644
805
--- a/hw/dma/omap_dma.c
806
+++ b/hw/dma/omap_dma.c
807
@@ -XXX,XX +XXX,XX @@ static int omap_dma_sys_read(struct omap_dma_s *s, int offset,
808
return 0;
809
}
810
811
-static uint64_t omap_dma_read(void *opaque, hwaddr addr,
812
- unsigned size)
813
+static uint64_t omap_dma_read(void *opaque, hwaddr addr, unsigned size)
814
{
815
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
816
+ struct omap_dma_s *s = opaque;
817
int reg, ch;
818
uint16_t ret;
819
820
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_dma_read(void *opaque, hwaddr addr,
821
static void omap_dma_write(void *opaque, hwaddr addr,
822
uint64_t value, unsigned size)
823
{
824
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
825
+ struct omap_dma_s *s = opaque;
826
int reg, ch;
827
828
if (size != 2) {
829
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps omap_dma_ops = {
830
831
static void omap_dma_request(void *opaque, int drq, int req)
832
{
833
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
834
+ struct omap_dma_s *s = opaque;
835
/* The request pins are level triggered in QEMU. */
836
if (req) {
837
if (~s->dma->drqbmp & (1ULL << drq)) {
838
@@ -XXX,XX +XXX,XX @@ static void omap_dma_request(void *opaque, int drq, int req)
839
/* XXX: this won't be needed once soc_dma knows about clocks. */
840
static void omap_dma_clk_update(void *opaque, int line, int on)
841
{
842
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
843
+ struct omap_dma_s *s = opaque;
844
int i;
845
846
s->dma->freq = omap_clk_getrate(s->clk);
847
@@ -XXX,XX +XXX,XX @@ static void omap_dma_interrupts_4_update(struct omap_dma_s *s)
848
static uint64_t omap_dma4_read(void *opaque, hwaddr addr,
849
unsigned size)
850
{
851
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
852
+ struct omap_dma_s *s = opaque;
853
int irqn = 0, chnum;
854
struct omap_dma_channel_s *ch;
855
856
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_dma4_read(void *opaque, hwaddr addr,
857
static void omap_dma4_write(void *opaque, hwaddr addr,
858
uint64_t value, unsigned size)
859
{
860
- struct omap_dma_s *s = (struct omap_dma_s *) opaque;
861
+ struct omap_dma_s *s = opaque;
862
int chnum, irqn = 0;
863
struct omap_dma_channel_s *ch;
864
865
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
866
index XXXXXXX..XXXXXXX 100644
867
--- a/hw/gpio/omap_gpio.c
868
+++ b/hw/gpio/omap_gpio.c
869
@@ -XXX,XX +XXX,XX @@ static void omap_gpio_set(void *opaque, int line, int level)
870
static uint64_t omap_gpio_read(void *opaque, hwaddr addr,
871
unsigned size)
872
{
873
- struct omap_gpio_s *s = (struct omap_gpio_s *) opaque;
874
+ struct omap_gpio_s *s = opaque;
875
int offset = addr & OMAP_MPUI_REG_MASK;
876
877
if (size != 2) {
878
@@ -XXX,XX +XXX,XX @@ static uint64_t omap_gpio_read(void *opaque, hwaddr addr,
879
static void omap_gpio_write(void *opaque, hwaddr addr,
880
uint64_t value, unsigned size)
881
{
882
- struct omap_gpio_s *s = (struct omap_gpio_s *) opaque;
883
+ struct omap_gpio_s *s = opaque;
884
int offset = addr & OMAP_MPUI_REG_MASK;
885
uint16_t diff;
886
int ln;
887
@@ -XXX,XX +XXX,XX @@ static void omap2_gpio_module_reset(struct omap2_gpio_s *s)
888
889
static uint32_t omap2_gpio_module_read(void *opaque, hwaddr addr)
890
{
891
- struct omap2_gpio_s *s = (struct omap2_gpio_s *) opaque;
892
+ struct omap2_gpio_s *s = opaque;
893
894
switch (addr) {
895
case 0x00:    /* GPIO_REVISION */
896
@@ -XXX,XX +XXX,XX @@ static uint32_t omap2_gpio_module_read(void *opaque, hwaddr addr)
897
static void omap2_gpio_module_write(void *opaque, hwaddr addr,
898
uint32_t value)
899
{
900
- struct omap2_gpio_s *s = (struct omap2_gpio_s *) opaque;
901
+ struct omap2_gpio_s *s = opaque;
902
uint32_t diff;
903
int ln;
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);
1112
diff --git a/hw/sd/omap_mmc.c b/hw/sd/omap_mmc.c
1113
index XXXXXXX..XXXXXXX 100644
1114
--- a/hw/sd/omap_mmc.c
1115
+++ b/hw/sd/omap_mmc.c
1116
@@ -XXX,XX +XXX,XX @@ void omap_mmc_reset(struct omap_mmc_s *host)
1117
device_cold_reset(DEVICE(host->card));
1118
}
1119
1120
-static uint64_t omap_mmc_read(void *opaque, hwaddr offset,
1121
- unsigned size)
1122
+static uint64_t omap_mmc_read(void *opaque, hwaddr offset, unsigned size)
1123
{
1124
uint16_t i;
1125
- struct omap_mmc_s *s = (struct omap_mmc_s *) opaque;
1126
+ struct omap_mmc_s *s = opaque;
1127
1128
if (size != 2) {
1129
return omap_badwidth_read16(opaque, offset);
1130
@@ -XXX,XX +XXX,XX @@ static void omap_mmc_write(void *opaque, hwaddr offset,
1131
uint64_t value, unsigned size)
1132
{
1133
int i;
1134
- struct omap_mmc_s *s = (struct omap_mmc_s *) opaque;
1135
+ struct omap_mmc_s *s = opaque;
1136
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)
1280
--
33
--
1281
2.34.1
34
2.34.1
1282
35
1283
36
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
The xkb official name for the Arabic keyboard layout is 'ara'.
2
However xkb has for at least the past 15 years also permitted it to
3
be named via the legacy synonym 'ar'. In xkeyboard-config 2.39 this
4
synoynm was removed, which breaks compilation of QEMU:
2
5
3
Add a local 'struct omap_gpif_s *' variable to improve readability.
6
FAILED: pc-bios/keymaps/ar
4
(This also eases next commit conversion).
7
/home/fred/qemu-git/src/qemu/build-full/qemu-keymap -f pc-bios/keymaps/ar -l ar
8
xkbcommon: ERROR: Couldn't find file "symbols/ar" in include paths
9
xkbcommon: ERROR: 1 include paths searched:
10
xkbcommon: ERROR:     /usr/share/X11/xkb
11
xkbcommon: ERROR: 3 include paths could not be added:
12
xkbcommon: ERROR:     /home/fred/.config/xkb
13
xkbcommon: ERROR:     /home/fred/.xkb
14
xkbcommon: ERROR:     /etc/xkb
15
xkbcommon: ERROR: Abandoning symbols file "(unnamed)"
16
xkbcommon: ERROR: Failed to compile xkb_symbols
17
xkbcommon: ERROR: Failed to compile keymap
5
18
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
19
The upstream xkeyboard-config change removing the compat
20
mapping is:
21
https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config/-/commit/470ad2cd8fea84d7210377161d86b31999bb5ea6
22
23
Make QEMU always ask for the 'ara' xkb layout, which should work on
24
both older and newer xkeyboard-config. We leave the QEMU name for
25
this keyboard layout as 'ar'; it is not the only one where our name
26
for it deviates from the xkb standard name.
27
28
Cc: qemu-stable@nongnu.org
29
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
30
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20230109140306.23161-3-philmd@linaro.org
31
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
33
Message-id: 20230620162024.1132013-1-peter.maydell@linaro.org
34
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1709
10
---
35
---
11
hw/gpio/omap_gpio.c | 3 ++-
36
pc-bios/keymaps/meson.build | 2 +-
12
1 file changed, 2 insertions(+), 1 deletion(-)
37
1 file changed, 1 insertion(+), 1 deletion(-)
13
38
14
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
39
diff --git a/pc-bios/keymaps/meson.build b/pc-bios/keymaps/meson.build
15
index XXXXXXX..XXXXXXX 100644
40
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/gpio/omap_gpio.c
41
--- a/pc-bios/keymaps/meson.build
17
+++ b/hw/gpio/omap_gpio.c
42
+++ b/pc-bios/keymaps/meson.build
18
@@ -XXX,XX +XXX,XX @@ struct omap_gpif_s {
43
@@ -XXX,XX +XXX,XX @@
19
/* General-Purpose I/O of OMAP1 */
44
keymaps = {
20
static void omap_gpio_set(void *opaque, int line, int level)
45
- 'ar': '-l ar',
21
{
46
+ 'ar': '-l ara',
22
- struct omap_gpio_s *s = &((struct omap_gpif_s *) opaque)->omap1;
47
'bepo': '-l fr -v dvorak',
23
+ struct omap_gpif_s *p = opaque;
48
'cz': '-l cz',
24
+ struct omap_gpio_s *s = &p->omap1;
49
'da': '-l dk',
25
uint16_t prev = s->inputs;
26
27
if (level)
28
--
50
--
29
2.34.1
51
2.34.1
30
52
31
53
diff view generated by jsdifflib