1
One last arm pullreq before I stop work for the end of the year...
1
Hi; here's the first target-arm pullreq for the 8.1 cycle.
2
Nothing particularly huge in here, just the various things
3
that had accumulated during the freeze.
2
4
5
thanks
3
-- PMM
6
-- PMM
4
7
5
The following changes since commit 8e5943260a8f765216674ee87ce8588cc4e7463e:
8
The following changes since commit 2d82c32b2ceaca3dc3da5e36e10976f34bfcb598:
6
9
7
Merge remote-tracking branch 'remotes/vivier2/tags/trivial-branch-pull-request' into staging (2019-12-20 12:46:10 +0000)
10
Open 8.1 development tree (2023-04-20 10:05:25 +0100)
8
11
9
are available in the Git repository at:
12
are available in the Git repository at:
10
13
11
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20191220
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230420
12
15
13
for you to fetch changes up to c8fa6079eb35888587f1be27c1590da4edcc5098:
16
for you to fetch changes up to 1ed1f338520cda0574b7e04f5e8e85e049740548:
14
17
15
arm/arm-powerctl: rebuild hflags after setting CP15 bits in arm_set_cpu_on() (2019-12-20 14:03:00 +0000)
18
arm/mcimx7d-sabre: Set fec2-phy-connected property to false (2023-04-20 10:46:43 +0100)
16
19
17
----------------------------------------------------------------
20
----------------------------------------------------------------
18
target-arm queue:
21
target-arm queue:
19
* Support emulating the generic timers at frequencies other than 62.5MHz
22
* hw/arm: Fix some typos in comments (most found by codespell)
20
* Various fixes for SMMUv3 emulation bugs
23
* exynos: Fix out-of-bounds access in exynos4210_gcomp_find debug printf
21
* Improve assert error message for hflags mismatches
24
* Orangepi-PC, Cubieboard: add Allwinner WDT watchdog emulation
22
* arm-powerctl: rebuild hflags after setting CP15 bits in arm_set_cpu_on()
25
* tests/avocado: Add reboot tests to Cubieboard
26
* hw/timer/imx_epit: Fix bugs in timer limit checking
27
* target/arm: Remove KVM AArch32 CPU definitions
28
* hw/arm/virt: Restrict Cortex-A7 check to TCG
29
* target/arm: Initialize debug capabilities only once
30
* target/arm: Implement FEAT_PAN3
31
* docs/devel/kconfig.rst: Fix incorrect markup
32
* target/arm: Report pauth information to gdb as 'pauth_v2'
33
* mcimxd7-sabre, mcimx6ul-evk: Correctly model the way the PHY
34
on the second ethernet device must be configured via the
35
first one
23
36
24
----------------------------------------------------------------
37
----------------------------------------------------------------
25
Andrew Jeffery (4):
38
Akihiko Odaki (1):
26
target/arm: Remove redundant scaling of nexttick
39
target/arm: Initialize debug capabilities only once
27
target/arm: Abstract the generic timer frequency
28
target/arm: Prepare generic timer for per-platform CNTFRQ
29
ast2600: Configure CNTFRQ at 1125MHz
30
40
31
Niek Linnenbank (1):
41
Axel Heider (2):
32
arm/arm-powerctl: rebuild hflags after setting CP15 bits in arm_set_cpu_on()
42
hw/timer/imx_epit: don't shadow variable
43
hw/timer/imx_epit: fix limit check
33
44
34
Philippe Mathieu-Daudé (1):
45
Feng Jiang (1):
35
target/arm: Display helpful message when hflags mismatch
46
exynos: Fix out-of-bounds access in exynos4210_gcomp_find debug printf
36
47
37
Simon Veith (6):
48
Guenter Roeck (5):
38
hw/arm/smmuv3: Apply address mask to linear strtab base address
49
hw/net/imx_fec: Support two Ethernet interfaces connected to single MDIO bus
39
hw/arm/smmuv3: Correct SMMU_BASE_ADDR_MASK value
50
fsl-imx6ul: Add fec[12]-phy-connected properties
40
hw/arm/smmuv3: Check stream IDs against actual table LOG2SIZE
51
arm/mcimx6ul-evk: Set fec1-phy-connected property to false
41
hw/arm/smmuv3: Align stream table base address to table size
52
fsl-imx7: Add fec[12]-phy-connected properties
42
hw/arm/smmuv3: Use correct bit positions in EVT_SET_ADDR2 macro
53
arm/mcimx7d-sabre: Set fec2-phy-connected property to false
43
hw/arm/smmuv3: Report F_STE_FETCH fault address in correct word position
44
54
45
hw/arm/smmuv3-internal.h | 6 ++---
55
Peter Maydell (5):
46
target/arm/cpu.h | 5 ++++
56
target/arm: Pass ARMMMUFaultInfo to merge_syn_data_abort()
47
hw/arm/aspeed_ast2600.c | 3 +++
57
target/arm: Don't set ISV when reporting stage 1 faults in ESR_EL2
48
hw/arm/smmuv3.c | 28 +++++++++++++++-----
58
target/arm: Implement FEAT_PAN3
49
target/arm/arm-powerctl.c | 3 +++
59
docs/devel/kconfig.rst: Fix incorrect markup
50
target/arm/cpu.c | 65 +++++++++++++++++++++++++++++++++++++++++------
60
target/arm: Report pauth information to gdb as 'pauth_v2'
51
target/arm/helper.c | 42 +++++++++++++++++++++++-------
52
7 files changed, 125 insertions(+), 27 deletions(-)
53
61
62
Philippe Mathieu-Daudé (2):
63
target/arm: Remove KVM AArch32 CPU definitions
64
hw/arm/virt: Restrict Cortex-A7 check to TCG
65
66
Stefan Weil (1):
67
hw/arm: Fix some typos in comments (most found by codespell)
68
69
Strahinja Jankovic (4):
70
hw/watchdog: Allwinner WDT emulation for system reset
71
hw/arm: Add WDT to Allwinner-A10 and Cubieboard
72
hw/arm: Add WDT to Allwinner-H3 and Orangepi-PC
73
tests/avocado: Add reboot tests to Cubieboard
74
75
docs/devel/kconfig.rst | 2 +-
76
docs/system/arm/cubieboard.rst | 1 +
77
docs/system/arm/emulation.rst | 1 +
78
docs/system/arm/orangepi.rst | 1 +
79
include/hw/arm/allwinner-a10.h | 2 +
80
include/hw/arm/allwinner-h3.h | 5 +-
81
include/hw/arm/fsl-imx6ul.h | 1 +
82
include/hw/arm/fsl-imx7.h | 1 +
83
include/hw/net/imx_fec.h | 2 +
84
include/hw/watchdog/allwinner-wdt.h | 123 +++++++++++
85
target/arm/cpu.h | 5 +
86
target/arm/kvm-consts.h | 9 +-
87
target/arm/kvm_arm.h | 8 +
88
hw/arm/allwinner-a10.c | 7 +
89
hw/arm/allwinner-h3.c | 8 +
90
hw/arm/exynos4210.c | 4 +-
91
hw/arm/fsl-imx6ul.c | 20 ++
92
hw/arm/fsl-imx7.c | 20 ++
93
hw/arm/mcimx6ul-evk.c | 2 +
94
hw/arm/mcimx7d-sabre.c | 2 +
95
hw/arm/musicpal.c | 2 +-
96
hw/arm/omap1.c | 2 +-
97
hw/arm/omap2.c | 2 +-
98
hw/arm/virt-acpi-build.c | 2 +-
99
hw/arm/virt.c | 4 +-
100
hw/arm/xlnx-versal-virt.c | 2 +-
101
hw/net/imx_fec.c | 27 ++-
102
hw/timer/exynos4210_mct.c | 13 +-
103
hw/timer/imx_epit.c | 2 +-
104
hw/watchdog/allwinner-wdt.c | 416 ++++++++++++++++++++++++++++++++++++
105
target/arm/cpu64.c | 2 +-
106
target/arm/cpu_tcg.c | 2 -
107
target/arm/gdbstub.c | 9 +-
108
target/arm/kvm.c | 2 +
109
target/arm/kvm64.c | 18 +-
110
target/arm/ptw.c | 14 +-
111
target/arm/tcg/tlb_helper.c | 26 ++-
112
gdb-xml/aarch64-pauth.xml | 2 +-
113
hw/arm/Kconfig | 4 +-
114
hw/watchdog/Kconfig | 4 +
115
hw/watchdog/meson.build | 1 +
116
hw/watchdog/trace-events | 7 +
117
tests/avocado/boot_linux_console.py | 15 +-
118
43 files changed, 738 insertions(+), 64 deletions(-)
119
create mode 100644 include/hw/watchdog/allwinner-wdt.h
120
create mode 100644 hw/watchdog/allwinner-wdt.c
121
diff view generated by jsdifflib
1
From: Simon Veith <sveith@amazon.de>
1
From: Stefan Weil <sw@weilnetz.de>
2
2
3
The bit offsets in the EVT_SET_ADDR2 macro do not match those specified
3
Signed-off-by: Stefan Weil <sw@weilnetz.de>
4
in the ARM SMMUv3 Architecture Specification. In all events that use
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
this macro, e.g. F_WALK_EABT, the faulting fetch address or IPA actually
5
Message-id: 20230409200526.1156456-1-sw@weilnetz.de
6
occupies the 32-bit words 6 and 7 in the event record contiguously, with
7
the upper and lower unused bits clear due to alignment or maximum
8
supported address bits. How many bits are clear depends on the
9
individual event type.
10
11
Update the macro to write to the correct words in the event record so
12
that guest drivers can obtain accurate address information on events.
13
14
ref. ARM IHI 0070C, sections 7.3.12 through 7.3.16.
15
16
Signed-off-by: Simon Veith <sveith@amazon.de>
17
Acked-by: Eric Auger <eric.auger@redhat.com>
18
Tested-by: Eric Auger <eric.auger@redhat.com>
19
Message-id: 1576509312-13083-6-git-send-email-sveith@amazon.de
20
Cc: Eric Auger <eric.auger@redhat.com>
21
Cc: qemu-devel@nongnu.org
22
Cc: qemu-arm@nongnu.org
23
Acked-by: Eric Auger <eric.auger@redhat.com>
24
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
---
7
---
27
hw/arm/smmuv3-internal.h | 4 ++--
8
hw/arm/exynos4210.c | 4 ++--
28
1 file changed, 2 insertions(+), 2 deletions(-)
9
hw/arm/musicpal.c | 2 +-
10
hw/arm/omap1.c | 2 +-
11
hw/arm/omap2.c | 2 +-
12
hw/arm/virt-acpi-build.c | 2 +-
13
hw/arm/virt.c | 2 +-
14
hw/arm/xlnx-versal-virt.c | 2 +-
15
hw/arm/Kconfig | 2 +-
16
8 files changed, 9 insertions(+), 9 deletions(-)
29
17
30
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
18
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
31
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/arm/smmuv3-internal.h
20
--- a/hw/arm/exynos4210.c
33
+++ b/hw/arm/smmuv3-internal.h
21
+++ b/hw/arm/exynos4210.c
34
@@ -XXX,XX +XXX,XX @@ typedef struct SMMUEventInfo {
22
@@ -XXX,XX +XXX,XX @@ static int mapline_size(const int *mapline)
35
} while (0)
23
36
#define EVT_SET_ADDR2(x, addr) \
24
/*
37
do { \
25
* Initialize board IRQs.
38
- (x)->word[7] = deposit32((x)->word[7], 3, 29, addr >> 16); \
26
- * These IRQs contain splitted Int/External Combiner and External Gic IRQs.
39
- (x)->word[7] = deposit32((x)->word[7], 0, 16, addr & 0xffff);\
27
+ * These IRQs contain split Int/External Combiner and External Gic IRQs.
40
+ (x)->word[7] = (uint32_t)(addr >> 32); \
28
*/
41
+ (x)->word[6] = (uint32_t)(addr & 0xffffffff); \
29
static void exynos4210_init_board_irqs(Exynos4210State *s)
42
} while (0)
30
{
43
31
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
44
void smmuv3_record_event(SMMUv3State *s, SMMUEventInfo *event);
32
* - SDMA
33
* - ADMA2
34
*
35
- * As this part of the Exynos4210 is not publically available,
36
+ * As this part of the Exynos4210 is not publicly available,
37
* we used the "HS-MMC Controller S3C2416X RISC Microprocessor"
38
* public datasheet which is very similar (implementing
39
* MMC Specification Version 4.0 being the only difference noted)
40
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/arm/musicpal.c
43
+++ b/hw/arm/musicpal.c
44
@@ -XXX,XX +XXX,XX @@
45
#define MP_LCD_SPI_CMD 0x00104011
46
#define MP_LCD_SPI_INVALID 0x00000000
47
48
-/* Commmands */
49
+/* Commands */
50
#define MP_LCD_INST_SETPAGE0 0xB0
51
/* ... */
52
#define MP_LCD_INST_SETPAGE7 0xB7
53
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/arm/omap1.c
56
+++ b/hw/arm/omap1.c
57
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
58
s->led[1] = omap_lpg_init(system_memory,
59
0xfffbd800, omap_findclk(s, "clk32-kHz"));
60
61
- /* Register mappings not currenlty implemented:
62
+ /* Register mappings not currently implemented:
63
* MCSI2 Comm    fffb2000 - fffb27ff (not mapped on OMAP310)
64
* MCSI1 Bluetooth    fffb2800 - fffb2fff (not mapped on OMAP310)
65
* USB W2FC        fffb4000 - fffb47ff
66
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/arm/omap2.c
69
+++ b/hw/arm/omap2.c
70
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
71
omap_findclk(s, "func_96m_clk"),
72
omap_findclk(s, "core_l4_iclk"));
73
74
- /* All register mappings (includin those not currenlty implemented):
75
+ /* All register mappings (including those not currently implemented):
76
* SystemControlMod    48000000 - 48000fff
77
* SystemControlL4    48001000 - 48001fff
78
* 32kHz Timer Mod    48004000 - 48004fff
79
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
80
index XXXXXXX..XXXXXXX 100644
81
--- a/hw/arm/virt-acpi-build.c
82
+++ b/hw/arm/virt-acpi-build.c
83
@@ -XXX,XX +XXX,XX @@ static void build_append_gicr(GArray *table_data, uint64_t base, uint32_t size)
84
build_append_int_noprefix(table_data, 0xE, 1); /* Type */
85
build_append_int_noprefix(table_data, 16, 1); /* Length */
86
build_append_int_noprefix(table_data, 0, 2); /* Reserved */
87
- /* Discovery Range Base Addres */
88
+ /* Discovery Range Base Address */
89
build_append_int_noprefix(table_data, base, 8);
90
build_append_int_noprefix(table_data, size, 4); /* Discovery Range Length */
91
}
92
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
93
index XXXXXXX..XXXXXXX 100644
94
--- a/hw/arm/virt.c
95
+++ b/hw/arm/virt.c
96
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
97
int pa_bits;
98
99
/*
100
- * Instanciate a temporary CPU object to find out about what
101
+ * Instantiate a temporary CPU object to find out about what
102
* we are about to deal with. Once this is done, get rid of
103
* the object.
104
*/
105
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
106
index XXXXXXX..XXXXXXX 100644
107
--- a/hw/arm/xlnx-versal-virt.c
108
+++ b/hw/arm/xlnx-versal-virt.c
109
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
110
fdt_add_clk_node(s, "/clk25", 25000000, s->phandle.clk_25Mhz);
111
112
/* Make the APU cpu address space visible to virtio and other
113
- * modules unaware of muliple address-spaces. */
114
+ * modules unaware of multiple address-spaces. */
115
memory_region_add_subregion_overlap(get_system_memory(),
116
0, &s->soc.fpd.apu.mr, 0);
117
118
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
119
index XXXXXXX..XXXXXXX 100644
120
--- a/hw/arm/Kconfig
121
+++ b/hw/arm/Kconfig
122
@@ -XXX,XX +XXX,XX @@ config OLIMEX_STM32_H405
123
config NSERIES
124
bool
125
select OMAP
126
- select TMP105 # tempature sensor
127
+ select TMP105 # temperature sensor
128
select BLIZZARD # LCD/TV controller
129
select ONENAND
130
select TSC210X # touchscreen/sensors/audio
45
--
131
--
46
2.20.1
132
2.34.1
47
133
48
134
diff view generated by jsdifflib
New patch
1
From: Feng Jiang <jiangfeng@kylinos.cn>
1
2
3
One of the debug printfs in exynos4210_gcomp_find() will
4
access outside the 's->g_timer.reg.comp[]' array if there
5
was no active comparator and 'res' is -1. Add a conditional
6
to avoid this.
7
8
This doesn't happen in normal use because the debug printfs
9
are by default not compiled in.
10
11
Signed-off-by: Feng Jiang <jiangfeng@kylinos.cn>
12
Message-id: 20230404074506.112615-1-jiangfeng@kylinos.cn
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
[PMM: Adjusted commit message to clarify that the overrun
15
only happens if you've enabled debug printfs]
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/timer/exynos4210_mct.c | 13 ++++++++-----
19
1 file changed, 8 insertions(+), 5 deletions(-)
20
21
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/timer/exynos4210_mct.c
24
+++ b/hw/timer/exynos4210_mct.c
25
@@ -XXX,XX +XXX,XX @@ static int32_t exynos4210_gcomp_find(Exynos4210MCTState *s)
26
res = min_comp_i;
27
}
28
29
- DPRINTF("found comparator %d: comp 0x%llx distance 0x%llx, gfrc 0x%llx\n",
30
- res,
31
- s->g_timer.reg.comp[res],
32
- distance_min,
33
- gfrc);
34
+ if (res >= 0) {
35
+ DPRINTF("found comparator %d: "
36
+ "comp 0x%llx distance 0x%llx, gfrc 0x%llx\n",
37
+ res,
38
+ s->g_timer.reg.comp[res],
39
+ distance_min,
40
+ gfrc);
41
+ }
42
43
return res;
44
}
45
--
46
2.34.1
diff view generated by jsdifflib
New patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
2
3
This patch adds basic support for Allwinner WDT.
4
Both sun4i and sun6i variants are supported.
5
However, interrupt generation is not supported, so WDT can be used only to trigger system reset.
6
7
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
8
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
9
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
10
Message-id: 20230326202256.22980-2-strahinja.p.jankovic@gmail.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
include/hw/watchdog/allwinner-wdt.h | 123 ++++++++
14
hw/watchdog/allwinner-wdt.c | 416 ++++++++++++++++++++++++++++
15
hw/watchdog/Kconfig | 4 +
16
hw/watchdog/meson.build | 1 +
17
hw/watchdog/trace-events | 7 +
18
5 files changed, 551 insertions(+)
19
create mode 100644 include/hw/watchdog/allwinner-wdt.h
20
create mode 100644 hw/watchdog/allwinner-wdt.c
21
22
diff --git a/include/hw/watchdog/allwinner-wdt.h b/include/hw/watchdog/allwinner-wdt.h
23
new file mode 100644
24
index XXXXXXX..XXXXXXX
25
--- /dev/null
26
+++ b/include/hw/watchdog/allwinner-wdt.h
27
@@ -XXX,XX +XXX,XX @@
28
+/*
29
+ * Allwinner Watchdog emulation
30
+ *
31
+ * Copyright (C) 2023 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
32
+ *
33
+ * This file is derived from Allwinner RTC,
34
+ * by Niek Linnenbank.
35
+ *
36
+ * This program is free software: you can redistribute it and/or modify
37
+ * it under the terms of the GNU General Public License as published by
38
+ * the Free Software Foundation, either version 2 of the License, or
39
+ * (at your option) any later version.
40
+ *
41
+ * This program is distributed in the hope that it will be useful,
42
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
43
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
44
+ * GNU General Public License for more details.
45
+ *
46
+ * You should have received a copy of the GNU General Public License
47
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
48
+ */
49
+
50
+#ifndef HW_WATCHDOG_ALLWINNER_WDT_H
51
+#define HW_WATCHDOG_ALLWINNER_WDT_H
52
+
53
+#include "qom/object.h"
54
+#include "hw/ptimer.h"
55
+#include "hw/sysbus.h"
56
+
57
+/*
58
+ * This is a model of the Allwinner watchdog.
59
+ * Since watchdog registers belong to the timer module (and are shared with the
60
+ * RTC module), the interrupt line from watchdog is not handled right now.
61
+ * In QEMU, we just wire up the watchdog reset to watchdog_perform_action(),
62
+ * at least for the moment.
63
+ */
64
+
65
+#define TYPE_AW_WDT "allwinner-wdt"
66
+
67
+/** Allwinner WDT sun4i family (A10, A12), also sun7i (A20) */
68
+#define TYPE_AW_WDT_SUN4I TYPE_AW_WDT "-sun4i"
69
+
70
+/** Allwinner WDT sun6i family and newer (A31, H2+, H3, etc) */
71
+#define TYPE_AW_WDT_SUN6I TYPE_AW_WDT "-sun6i"
72
+
73
+/** Number of WDT registers */
74
+#define AW_WDT_REGS_NUM (5)
75
+
76
+OBJECT_DECLARE_TYPE(AwWdtState, AwWdtClass, AW_WDT)
77
+
78
+/**
79
+ * Allwinner WDT object instance state.
80
+ */
81
+struct AwWdtState {
82
+ /*< private >*/
83
+ SysBusDevice parent_obj;
84
+
85
+ /*< public >*/
86
+ MemoryRegion iomem;
87
+ struct ptimer_state *timer;
88
+
89
+ uint32_t regs[AW_WDT_REGS_NUM];
90
+};
91
+
92
+/**
93
+ * Allwinner WDT class-level struct.
94
+ *
95
+ * This struct is filled by each sunxi device specific code
96
+ * such that the generic code can use this struct to support
97
+ * all devices.
98
+ */
99
+struct AwWdtClass {
100
+ /*< private >*/
101
+ SysBusDeviceClass parent_class;
102
+ /*< public >*/
103
+
104
+ /** Defines device specific register map */
105
+ const uint8_t *regmap;
106
+
107
+ /** Size of the regmap in bytes */
108
+ size_t regmap_size;
109
+
110
+ /**
111
+ * Read device specific register
112
+ *
113
+ * @offset: register offset to read
114
+ * @return true if register read successful, false otherwise
115
+ */
116
+ bool (*read)(AwWdtState *s, uint32_t offset);
117
+
118
+ /**
119
+ * Write device specific register
120
+ *
121
+ * @offset: register offset to write
122
+ * @data: value to set in register
123
+ * @return true if register write successful, false otherwise
124
+ */
125
+ bool (*write)(AwWdtState *s, uint32_t offset, uint32_t data);
126
+
127
+ /**
128
+ * Check if watchdog can generate system reset
129
+ *
130
+ * @return true if watchdog can generate system reset
131
+ */
132
+ bool (*can_reset_system)(AwWdtState *s);
133
+
134
+ /**
135
+ * Check if provided key is valid
136
+ *
137
+ * @value: value written to register
138
+ * @return true if key is valid, false otherwise
139
+ */
140
+ bool (*is_key_valid)(AwWdtState *s, uint32_t val);
141
+
142
+ /**
143
+ * Get current INTV_VALUE setting
144
+ *
145
+ * @return current INTV_VALUE (0-15)
146
+ */
147
+ uint8_t (*get_intv_value)(AwWdtState *s);
148
+};
149
+
150
+#endif /* HW_WATCHDOG_ALLWINNER_WDT_H */
151
diff --git a/hw/watchdog/allwinner-wdt.c b/hw/watchdog/allwinner-wdt.c
152
new file mode 100644
153
index XXXXXXX..XXXXXXX
154
--- /dev/null
155
+++ b/hw/watchdog/allwinner-wdt.c
156
@@ -XXX,XX +XXX,XX @@
157
+/*
158
+ * Allwinner Watchdog emulation
159
+ *
160
+ * Copyright (C) 2023 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
161
+ *
162
+ * This file is derived from Allwinner RTC,
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/log.h"
181
+#include "qemu/units.h"
182
+#include "qemu/module.h"
183
+#include "trace.h"
184
+#include "hw/sysbus.h"
185
+#include "hw/registerfields.h"
186
+#include "hw/watchdog/allwinner-wdt.h"
187
+#include "sysemu/watchdog.h"
188
+#include "migration/vmstate.h"
189
+
190
+/* WDT registers */
191
+enum {
192
+ REG_IRQ_EN = 0, /* Watchdog interrupt enable */
193
+ REG_IRQ_STA, /* Watchdog interrupt status */
194
+ REG_CTRL, /* Watchdog control register */
195
+ REG_CFG, /* Watchdog configuration register */
196
+ REG_MODE, /* Watchdog mode register */
197
+};
198
+
199
+/* Universal WDT register flags */
200
+#define WDT_RESTART_MASK (1 << 0)
201
+#define WDT_EN_MASK (1 << 0)
202
+
203
+/* sun4i specific WDT register flags */
204
+#define RST_EN_SUN4I_MASK (1 << 1)
205
+#define INTV_VALUE_SUN4I_SHIFT (3)
206
+#define INTV_VALUE_SUN4I_MASK (0xfu << INTV_VALUE_SUN4I_SHIFT)
207
+
208
+/* sun6i specific WDT register flags */
209
+#define RST_EN_SUN6I_MASK (1 << 0)
210
+#define KEY_FIELD_SUN6I_SHIFT (1)
211
+#define KEY_FIELD_SUN6I_MASK (0xfffu << KEY_FIELD_SUN6I_SHIFT)
212
+#define KEY_FIELD_SUN6I (0xA57u)
213
+#define INTV_VALUE_SUN6I_SHIFT (4)
214
+#define INTV_VALUE_SUN6I_MASK (0xfu << INTV_VALUE_SUN6I_SHIFT)
215
+
216
+/* Map of INTV_VALUE to 0.5s units. */
217
+static const uint8_t allwinner_wdt_count_map[] = {
218
+ 1,
219
+ 2,
220
+ 4,
221
+ 6,
222
+ 8,
223
+ 10,
224
+ 12,
225
+ 16,
226
+ 20,
227
+ 24,
228
+ 28,
229
+ 32
230
+};
231
+
232
+/* WDT sun4i register map (offset to name) */
233
+const uint8_t allwinner_wdt_sun4i_regmap[] = {
234
+ [0x0000] = REG_CTRL,
235
+ [0x0004] = REG_MODE,
236
+};
237
+
238
+/* WDT sun6i register map (offset to name) */
239
+const uint8_t allwinner_wdt_sun6i_regmap[] = {
240
+ [0x0000] = REG_IRQ_EN,
241
+ [0x0004] = REG_IRQ_STA,
242
+ [0x0010] = REG_CTRL,
243
+ [0x0014] = REG_CFG,
244
+ [0x0018] = REG_MODE,
245
+};
246
+
247
+static bool allwinner_wdt_sun4i_read(AwWdtState *s, uint32_t offset)
248
+{
249
+ /* no sun4i specific registers currently implemented */
250
+ return false;
251
+}
252
+
253
+static bool allwinner_wdt_sun4i_write(AwWdtState *s, uint32_t offset,
254
+ uint32_t data)
255
+{
256
+ /* no sun4i specific registers currently implemented */
257
+ return false;
258
+}
259
+
260
+static bool allwinner_wdt_sun4i_can_reset_system(AwWdtState *s)
261
+{
262
+ if (s->regs[REG_MODE] & RST_EN_SUN4I_MASK) {
263
+ return true;
264
+ } else {
265
+ return false;
266
+ }
267
+}
268
+
269
+static bool allwinner_wdt_sun4i_is_key_valid(AwWdtState *s, uint32_t val)
270
+{
271
+ /* sun4i has no key */
272
+ return true;
273
+}
274
+
275
+static uint8_t allwinner_wdt_sun4i_get_intv_value(AwWdtState *s)
276
+{
277
+ return ((s->regs[REG_MODE] & INTV_VALUE_SUN4I_MASK) >>
278
+ INTV_VALUE_SUN4I_SHIFT);
279
+}
280
+
281
+static bool allwinner_wdt_sun6i_read(AwWdtState *s, uint32_t offset)
282
+{
283
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
284
+
285
+ switch (c->regmap[offset]) {
286
+ case REG_IRQ_EN:
287
+ case REG_IRQ_STA:
288
+ case REG_CFG:
289
+ return true;
290
+ default:
291
+ break;
292
+ }
293
+ return false;
294
+}
295
+
296
+static bool allwinner_wdt_sun6i_write(AwWdtState *s, uint32_t offset,
297
+ uint32_t data)
298
+{
299
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
300
+
301
+ switch (c->regmap[offset]) {
302
+ case REG_IRQ_EN:
303
+ case REG_IRQ_STA:
304
+ case REG_CFG:
305
+ return true;
306
+ default:
307
+ break;
308
+ }
309
+ return false;
310
+}
311
+
312
+static bool allwinner_wdt_sun6i_can_reset_system(AwWdtState *s)
313
+{
314
+ if (s->regs[REG_CFG] & RST_EN_SUN6I_MASK) {
315
+ return true;
316
+ } else {
317
+ return false;
318
+ }
319
+}
320
+
321
+static bool allwinner_wdt_sun6i_is_key_valid(AwWdtState *s, uint32_t val)
322
+{
323
+ uint16_t key = (val & KEY_FIELD_SUN6I_MASK) >> KEY_FIELD_SUN6I_SHIFT;
324
+ return (key == KEY_FIELD_SUN6I);
325
+}
326
+
327
+static uint8_t allwinner_wdt_sun6i_get_intv_value(AwWdtState *s)
328
+{
329
+ return ((s->regs[REG_MODE] & INTV_VALUE_SUN6I_MASK) >>
330
+ INTV_VALUE_SUN6I_SHIFT);
331
+}
332
+
333
+static void allwinner_wdt_update_timer(AwWdtState *s)
334
+{
335
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
336
+ uint8_t count = c->get_intv_value(s);
337
+
338
+ ptimer_transaction_begin(s->timer);
339
+ ptimer_stop(s->timer);
340
+
341
+ /* Use map to convert. */
342
+ if (count < sizeof(allwinner_wdt_count_map)) {
343
+ ptimer_set_count(s->timer, allwinner_wdt_count_map[count]);
344
+ } else {
345
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: incorrect INTV_VALUE 0x%02x\n",
346
+ __func__, count);
347
+ }
348
+
349
+ ptimer_run(s->timer, 1);
350
+ ptimer_transaction_commit(s->timer);
351
+
352
+ trace_allwinner_wdt_update_timer(count);
353
+}
354
+
355
+static uint64_t allwinner_wdt_read(void *opaque, hwaddr offset,
356
+ unsigned size)
357
+{
358
+ AwWdtState *s = AW_WDT(opaque);
359
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
360
+ uint64_t r;
361
+
362
+ if (offset >= c->regmap_size) {
363
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: out-of-bounds offset 0x%04x\n",
364
+ __func__, (uint32_t)offset);
365
+ return 0;
366
+ }
367
+
368
+ switch (c->regmap[offset]) {
369
+ case REG_CTRL:
370
+ case REG_MODE:
371
+ r = s->regs[c->regmap[offset]];
372
+ break;
373
+ default:
374
+ if (!c->read(s, offset)) {
375
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented register 0x%04x\n",
376
+ __func__, (uint32_t)offset);
377
+ return 0;
378
+ }
379
+ r = s->regs[c->regmap[offset]];
380
+ break;
381
+ }
382
+
383
+ trace_allwinner_wdt_read(offset, r, size);
384
+
385
+ return r;
386
+}
387
+
388
+static void allwinner_wdt_write(void *opaque, hwaddr offset,
389
+ uint64_t val, unsigned size)
390
+{
391
+ AwWdtState *s = AW_WDT(opaque);
392
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
393
+ uint32_t old_val;
394
+
395
+ if (offset >= c->regmap_size) {
396
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: out-of-bounds offset 0x%04x\n",
397
+ __func__, (uint32_t)offset);
398
+ return;
399
+ }
400
+
401
+ trace_allwinner_wdt_write(offset, val, size);
402
+
403
+ switch (c->regmap[offset]) {
404
+ case REG_CTRL:
405
+ if (c->is_key_valid(s, val)) {
406
+ if (val & WDT_RESTART_MASK) {
407
+ /* Kick timer */
408
+ allwinner_wdt_update_timer(s);
409
+ }
410
+ }
411
+ break;
412
+ case REG_MODE:
413
+ old_val = s->regs[REG_MODE];
414
+ s->regs[REG_MODE] = (uint32_t)val;
415
+
416
+ /* Check for rising edge on WDOG_MODE_EN */
417
+ if ((s->regs[REG_MODE] & ~old_val) & WDT_EN_MASK) {
418
+ allwinner_wdt_update_timer(s);
419
+ }
420
+ break;
421
+ default:
422
+ if (!c->write(s, offset, val)) {
423
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented register 0x%04x\n",
424
+ __func__, (uint32_t)offset);
425
+ }
426
+ s->regs[c->regmap[offset]] = (uint32_t)val;
427
+ break;
428
+ }
429
+}
430
+
431
+static const MemoryRegionOps allwinner_wdt_ops = {
432
+ .read = allwinner_wdt_read,
433
+ .write = allwinner_wdt_write,
434
+ .endianness = DEVICE_NATIVE_ENDIAN,
435
+ .valid = {
436
+ .min_access_size = 4,
437
+ .max_access_size = 4,
438
+ },
439
+ .impl.min_access_size = 4,
440
+};
441
+
442
+static void allwinner_wdt_expired(void *opaque)
443
+{
444
+ AwWdtState *s = AW_WDT(opaque);
445
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
446
+
447
+ bool enabled = s->regs[REG_MODE] & WDT_EN_MASK;
448
+ bool reset_enabled = c->can_reset_system(s);
449
+
450
+ trace_allwinner_wdt_expired(enabled, reset_enabled);
451
+
452
+ /* Perform watchdog action if watchdog is enabled and can trigger reset */
453
+ if (enabled && reset_enabled) {
454
+ watchdog_perform_action();
455
+ }
456
+}
457
+
458
+static void allwinner_wdt_reset_enter(Object *obj, ResetType type)
459
+{
460
+ AwWdtState *s = AW_WDT(obj);
461
+
462
+ trace_allwinner_wdt_reset_enter();
463
+
464
+ /* Clear registers */
465
+ memset(s->regs, 0, sizeof(s->regs));
466
+}
467
+
468
+static const VMStateDescription allwinner_wdt_vmstate = {
469
+ .name = "allwinner-wdt",
470
+ .version_id = 1,
471
+ .minimum_version_id = 1,
472
+ .fields = (VMStateField[]) {
473
+ VMSTATE_PTIMER(timer, AwWdtState),
474
+ VMSTATE_UINT32_ARRAY(regs, AwWdtState, AW_WDT_REGS_NUM),
475
+ VMSTATE_END_OF_LIST()
476
+ }
477
+};
478
+
479
+static void allwinner_wdt_init(Object *obj)
480
+{
481
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
482
+ AwWdtState *s = AW_WDT(obj);
483
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
484
+
485
+ /* Memory mapping */
486
+ memory_region_init_io(&s->iomem, OBJECT(s), &allwinner_wdt_ops, s,
487
+ TYPE_AW_WDT, c->regmap_size * 4);
488
+ sysbus_init_mmio(sbd, &s->iomem);
489
+}
490
+
491
+static void allwinner_wdt_realize(DeviceState *dev, Error **errp)
492
+{
493
+ AwWdtState *s = AW_WDT(dev);
494
+
495
+ s->timer = ptimer_init(allwinner_wdt_expired, s,
496
+ PTIMER_POLICY_NO_IMMEDIATE_TRIGGER |
497
+ PTIMER_POLICY_NO_IMMEDIATE_RELOAD |
498
+ PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
499
+
500
+ ptimer_transaction_begin(s->timer);
501
+ /* Set to 2Hz (0.5s period); other periods are multiples of 0.5s. */
502
+ ptimer_set_freq(s->timer, 2);
503
+ ptimer_set_limit(s->timer, 0xff, 1);
504
+ ptimer_transaction_commit(s->timer);
505
+}
506
+
507
+static void allwinner_wdt_class_init(ObjectClass *klass, void *data)
508
+{
509
+ DeviceClass *dc = DEVICE_CLASS(klass);
510
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
511
+
512
+ rc->phases.enter = allwinner_wdt_reset_enter;
513
+ dc->realize = allwinner_wdt_realize;
514
+ dc->vmsd = &allwinner_wdt_vmstate;
515
+}
516
+
517
+static void allwinner_wdt_sun4i_class_init(ObjectClass *klass, void *data)
518
+{
519
+ AwWdtClass *awc = AW_WDT_CLASS(klass);
520
+
521
+ awc->regmap = allwinner_wdt_sun4i_regmap;
522
+ awc->regmap_size = sizeof(allwinner_wdt_sun4i_regmap);
523
+ awc->read = allwinner_wdt_sun4i_read;
524
+ awc->write = allwinner_wdt_sun4i_write;
525
+ awc->can_reset_system = allwinner_wdt_sun4i_can_reset_system;
526
+ awc->is_key_valid = allwinner_wdt_sun4i_is_key_valid;
527
+ awc->get_intv_value = allwinner_wdt_sun4i_get_intv_value;
528
+}
529
+
530
+static void allwinner_wdt_sun6i_class_init(ObjectClass *klass, void *data)
531
+{
532
+ AwWdtClass *awc = AW_WDT_CLASS(klass);
533
+
534
+ awc->regmap = allwinner_wdt_sun6i_regmap;
535
+ awc->regmap_size = sizeof(allwinner_wdt_sun6i_regmap);
536
+ awc->read = allwinner_wdt_sun6i_read;
537
+ awc->write = allwinner_wdt_sun6i_write;
538
+ awc->can_reset_system = allwinner_wdt_sun6i_can_reset_system;
539
+ awc->is_key_valid = allwinner_wdt_sun6i_is_key_valid;
540
+ awc->get_intv_value = allwinner_wdt_sun6i_get_intv_value;
541
+}
542
+
543
+static const TypeInfo allwinner_wdt_info = {
544
+ .name = TYPE_AW_WDT,
545
+ .parent = TYPE_SYS_BUS_DEVICE,
546
+ .instance_init = allwinner_wdt_init,
547
+ .instance_size = sizeof(AwWdtState),
548
+ .class_init = allwinner_wdt_class_init,
549
+ .class_size = sizeof(AwWdtClass),
550
+ .abstract = true,
551
+};
552
+
553
+static const TypeInfo allwinner_wdt_sun4i_info = {
554
+ .name = TYPE_AW_WDT_SUN4I,
555
+ .parent = TYPE_AW_WDT,
556
+ .class_init = allwinner_wdt_sun4i_class_init,
557
+};
558
+
559
+static const TypeInfo allwinner_wdt_sun6i_info = {
560
+ .name = TYPE_AW_WDT_SUN6I,
561
+ .parent = TYPE_AW_WDT,
562
+ .class_init = allwinner_wdt_sun6i_class_init,
563
+};
564
+
565
+static void allwinner_wdt_register(void)
566
+{
567
+ type_register_static(&allwinner_wdt_info);
568
+ type_register_static(&allwinner_wdt_sun4i_info);
569
+ type_register_static(&allwinner_wdt_sun6i_info);
570
+}
571
+
572
+type_init(allwinner_wdt_register)
573
diff --git a/hw/watchdog/Kconfig b/hw/watchdog/Kconfig
574
index XXXXXXX..XXXXXXX 100644
575
--- a/hw/watchdog/Kconfig
576
+++ b/hw/watchdog/Kconfig
577
@@ -XXX,XX +XXX,XX @@ config WDT_IMX2
578
579
config WDT_SBSA
580
bool
581
+
582
+config ALLWINNER_WDT
583
+ bool
584
+ select PTIMER
585
diff --git a/hw/watchdog/meson.build b/hw/watchdog/meson.build
586
index XXXXXXX..XXXXXXX 100644
587
--- a/hw/watchdog/meson.build
588
+++ b/hw/watchdog/meson.build
589
@@ -XXX,XX +XXX,XX @@
590
softmmu_ss.add(files('watchdog.c'))
591
+softmmu_ss.add(when: 'CONFIG_ALLWINNER_WDT', if_true: files('allwinner-wdt.c'))
592
softmmu_ss.add(when: 'CONFIG_CMSDK_APB_WATCHDOG', if_true: files('cmsdk-apb-watchdog.c'))
593
softmmu_ss.add(when: 'CONFIG_WDT_IB6300ESB', if_true: files('wdt_i6300esb.c'))
594
softmmu_ss.add(when: 'CONFIG_WDT_IB700', if_true: files('wdt_ib700.c'))
595
diff --git a/hw/watchdog/trace-events b/hw/watchdog/trace-events
596
index XXXXXXX..XXXXXXX 100644
597
--- a/hw/watchdog/trace-events
598
+++ b/hw/watchdog/trace-events
599
@@ -XXX,XX +XXX,XX @@
600
# See docs/devel/tracing.rst for syntax documentation.
601
602
+# allwinner-wdt.c
603
+allwinner_wdt_read(uint64_t offset, uint64_t data, unsigned size) "Allwinner watchdog read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
604
+allwinner_wdt_write(uint64_t offset, uint64_t data, unsigned size) "Allwinner watchdog write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
605
+allwinner_wdt_reset_enter(void) "Allwinner watchdog: reset"
606
+allwinner_wdt_update_timer(uint8_t count) "Allwinner watchdog: count %" PRIu8
607
+allwinner_wdt_expired(bool enabled, bool reset_enabled) "Allwinner watchdog: enabled %u reset_enabled %u"
608
+
609
# cmsdk-apb-watchdog.c
610
cmsdk_apb_watchdog_read(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB watchdog read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
611
cmsdk_apb_watchdog_write(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB watchdog write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
612
--
613
2.34.1
diff view generated by jsdifflib
New patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
2
3
This patch adds WDT to Allwinner-A10 and Cubieboard.
4
WDT is added as an overlay to the Timer module memory map.
5
6
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
7
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Message-id: 20230326202256.22980-3-strahinja.p.jankovic@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
docs/system/arm/cubieboard.rst | 1 +
12
include/hw/arm/allwinner-a10.h | 2 ++
13
hw/arm/allwinner-a10.c | 7 +++++++
14
hw/arm/Kconfig | 1 +
15
4 files changed, 11 insertions(+)
16
17
diff --git a/docs/system/arm/cubieboard.rst b/docs/system/arm/cubieboard.rst
18
index XXXXXXX..XXXXXXX 100644
19
--- a/docs/system/arm/cubieboard.rst
20
+++ b/docs/system/arm/cubieboard.rst
21
@@ -XXX,XX +XXX,XX @@ Emulated devices:
22
- USB controller
23
- SATA controller
24
- TWI (I2C) controller
25
+- Watchdog timer
26
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
27
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/allwinner-a10.h
29
+++ b/include/hw/arm/allwinner-a10.h
30
@@ -XXX,XX +XXX,XX @@
31
#include "hw/misc/allwinner-a10-ccm.h"
32
#include "hw/misc/allwinner-a10-dramc.h"
33
#include "hw/i2c/allwinner-i2c.h"
34
+#include "hw/watchdog/allwinner-wdt.h"
35
#include "sysemu/block-backend.h"
36
37
#include "target/arm/cpu.h"
38
@@ -XXX,XX +XXX,XX @@ struct AwA10State {
39
AwSdHostState mmc0;
40
AWI2CState i2c0;
41
AwRtcState rtc;
42
+ AwWdtState wdt;
43
MemoryRegion sram_a;
44
EHCISysBusState ehci[AW_A10_NUM_USB];
45
OHCISysBusState ohci[AW_A10_NUM_USB];
46
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/allwinner-a10.c
49
+++ b/hw/arm/allwinner-a10.c
50
@@ -XXX,XX +XXX,XX @@
51
#define AW_A10_EHCI_BASE 0x01c14000
52
#define AW_A10_OHCI_BASE 0x01c14400
53
#define AW_A10_SATA_BASE 0x01c18000
54
+#define AW_A10_WDT_BASE 0x01c20c90
55
#define AW_A10_RTC_BASE 0x01c20d00
56
#define AW_A10_I2C0_BASE 0x01c2ac00
57
58
@@ -XXX,XX +XXX,XX @@ static void aw_a10_init(Object *obj)
59
object_initialize_child(obj, "mmc0", &s->mmc0, TYPE_AW_SDHOST_SUN4I);
60
61
object_initialize_child(obj, "rtc", &s->rtc, TYPE_AW_RTC_SUN4I);
62
+
63
+ object_initialize_child(obj, "wdt", &s->wdt, TYPE_AW_WDT_SUN4I);
64
}
65
66
static void aw_a10_realize(DeviceState *dev, Error **errp)
67
@@ -XXX,XX +XXX,XX @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
68
sysbus_realize(SYS_BUS_DEVICE(&s->i2c0), &error_fatal);
69
sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c0), 0, AW_A10_I2C0_BASE);
70
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c0), 0, qdev_get_gpio_in(dev, 7));
71
+
72
+ /* WDT */
73
+ sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &error_fatal);
74
+ sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->wdt), 0, AW_A10_WDT_BASE, 1);
75
}
76
77
static void aw_a10_class_init(ObjectClass *oc, void *data)
78
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
79
index XXXXXXX..XXXXXXX 100644
80
--- a/hw/arm/Kconfig
81
+++ b/hw/arm/Kconfig
82
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_A10
83
select ALLWINNER_A10_PIC
84
select ALLWINNER_A10_CCM
85
select ALLWINNER_A10_DRAMC
86
+ select ALLWINNER_WDT
87
select ALLWINNER_EMAC
88
select ALLWINNER_I2C
89
select AXP209_PMU
90
--
91
2.34.1
diff view generated by jsdifflib
New patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
2
3
This patch adds WDT to Allwinner-H3 and Orangepi-PC.
4
WDT is added as an overlay to the Timer module memory area.
5
6
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
7
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Message-id: 20230326202256.22980-4-strahinja.p.jankovic@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
docs/system/arm/orangepi.rst | 1 +
12
include/hw/arm/allwinner-h3.h | 5 ++++-
13
hw/arm/allwinner-h3.c | 8 ++++++++
14
hw/arm/Kconfig | 1 +
15
4 files changed, 14 insertions(+), 1 deletion(-)
16
17
diff --git a/docs/system/arm/orangepi.rst b/docs/system/arm/orangepi.rst
18
index XXXXXXX..XXXXXXX 100644
19
--- a/docs/system/arm/orangepi.rst
20
+++ b/docs/system/arm/orangepi.rst
21
@@ -XXX,XX +XXX,XX @@ The Orange Pi PC machine supports the following devices:
22
* System Control module
23
* Security Identifier device
24
* TWI (I2C)
25
+ * Watchdog timer
26
27
Limitations
28
"""""""""""
29
diff --git a/include/hw/arm/allwinner-h3.h b/include/hw/arm/allwinner-h3.h
30
index XXXXXXX..XXXXXXX 100644
31
--- a/include/hw/arm/allwinner-h3.h
32
+++ b/include/hw/arm/allwinner-h3.h
33
@@ -XXX,XX +XXX,XX @@
34
#include "hw/net/allwinner-sun8i-emac.h"
35
#include "hw/rtc/allwinner-rtc.h"
36
#include "hw/i2c/allwinner-i2c.h"
37
+#include "hw/watchdog/allwinner-wdt.h"
38
#include "target/arm/cpu.h"
39
#include "sysemu/block-backend.h"
40
41
@@ -XXX,XX +XXX,XX @@ enum {
42
AW_H3_DEV_RTC,
43
AW_H3_DEV_CPUCFG,
44
AW_H3_DEV_R_TWI,
45
- AW_H3_DEV_SDRAM
46
+ AW_H3_DEV_SDRAM,
47
+ AW_H3_DEV_WDT
48
};
49
50
/** Total number of CPU cores in the H3 SoC */
51
@@ -XXX,XX +XXX,XX @@ struct AwH3State {
52
AWI2CState r_twi;
53
AwSun8iEmacState emac;
54
AwRtcState rtc;
55
+ AwWdtState wdt;
56
GICState gic;
57
MemoryRegion sram_a1;
58
MemoryRegion sram_a2;
59
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/arm/allwinner-h3.c
62
+++ b/hw/arm/allwinner-h3.c
63
@@ -XXX,XX +XXX,XX @@ const hwaddr allwinner_h3_memmap[] = {
64
[AW_H3_DEV_OHCI3] = 0x01c1d400,
65
[AW_H3_DEV_CCU] = 0x01c20000,
66
[AW_H3_DEV_PIT] = 0x01c20c00,
67
+ [AW_H3_DEV_WDT] = 0x01c20ca0,
68
[AW_H3_DEV_UART0] = 0x01c28000,
69
[AW_H3_DEV_UART1] = 0x01c28400,
70
[AW_H3_DEV_UART2] = 0x01c28800,
71
@@ -XXX,XX +XXX,XX @@ static void allwinner_h3_init(Object *obj)
72
object_initialize_child(obj, "twi1", &s->i2c1, TYPE_AW_I2C_SUN6I);
73
object_initialize_child(obj, "twi2", &s->i2c2, TYPE_AW_I2C_SUN6I);
74
object_initialize_child(obj, "r_twi", &s->r_twi, TYPE_AW_I2C_SUN6I);
75
+
76
+ object_initialize_child(obj, "wdt", &s->wdt, TYPE_AW_WDT_SUN6I);
77
}
78
79
static void allwinner_h3_realize(DeviceState *dev, Error **errp)
80
@@ -XXX,XX +XXX,XX @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
81
sysbus_connect_irq(SYS_BUS_DEVICE(&s->r_twi), 0,
82
qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_R_TWI));
83
84
+ /* WDT */
85
+ sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &error_fatal);
86
+ sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->wdt), 0,
87
+ s->memmap[AW_H3_DEV_WDT], 1);
88
+
89
/* Unimplemented devices */
90
for (i = 0; i < ARRAY_SIZE(unimplemented); i++) {
91
create_unimplemented_device(unimplemented[i].device_name,
92
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
93
index XXXXXXX..XXXXXXX 100644
94
--- a/hw/arm/Kconfig
95
+++ b/hw/arm/Kconfig
96
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_H3
97
select ALLWINNER_A10_PIT
98
select ALLWINNER_SUN8I_EMAC
99
select ALLWINNER_I2C
100
+ select ALLWINNER_WDT
101
select SERIAL
102
select ARM_TIMER
103
select ARM_GIC
104
--
105
2.34.1
diff view generated by jsdifflib
New patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
2
3
Cubieboard tests end with comment "reboot not functioning; omit test".
4
Fix this so reboot is done at the end of each test.
5
6
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
7
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
9
Message-id: 20230326202256.22980-5-strahinja.p.jankovic@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
tests/avocado/boot_linux_console.py | 15 ++++++++++++---
13
1 file changed, 12 insertions(+), 3 deletions(-)
14
15
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/avocado/boot_linux_console.py
18
+++ b/tests/avocado/boot_linux_console.py
19
@@ -XXX,XX +XXX,XX @@ def test_arm_cubieboard_initrd(self):
20
'Allwinner sun4i/sun5i')
21
exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
22
'system-control@1c00000')
23
- # cubieboard's reboot is not functioning; omit reboot test.
24
+ exec_command_and_wait_for_pattern(self, 'reboot',
25
+ 'reboot: Restarting system')
26
+ # Wait for VM to shut down gracefully
27
+ self.vm.wait()
28
29
def test_arm_cubieboard_sata(self):
30
"""
31
@@ -XXX,XX +XXX,XX @@ def test_arm_cubieboard_sata(self):
32
'Allwinner sun4i/sun5i')
33
exec_command_and_wait_for_pattern(self, 'cat /proc/partitions',
34
'sda')
35
- # cubieboard's reboot is not functioning; omit reboot test.
36
+ exec_command_and_wait_for_pattern(self, 'reboot',
37
+ 'reboot: Restarting system')
38
+ # Wait for VM to shut down gracefully
39
+ self.vm.wait()
40
41
@skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
42
def test_arm_cubieboard_openwrt_22_03_2(self):
43
@@ -XXX,XX +XXX,XX @@ def test_arm_cubieboard_openwrt_22_03_2(self):
44
45
exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
46
'Allwinner sun4i/sun5i')
47
- # cubieboard's reboot is not functioning; omit reboot test.
48
+ exec_command_and_wait_for_pattern(self, 'reboot',
49
+ 'reboot: Restarting system')
50
+ # Wait for VM to shut down gracefully
51
+ self.vm.wait()
52
53
@skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
54
def test_arm_quanta_gsj(self):
55
--
56
2.34.1
diff view generated by jsdifflib
1
From: Simon Veith <sveith@amazon.de>
1
From: Axel Heider <axel.heider@hensoldt.net>
2
2
3
The smmuv3_record_event() function that generates the F_STE_FETCH error
3
Fix issue reported by Coverity.
4
uses the EVT_SET_ADDR macro to record the fetch address, placing it in
5
32-bit words 4 and 5.
6
4
7
The correct position for this address is in words 6 and 7, per the
5
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
8
SMMUv3 Architecture Specification.
6
Message-id: 168070611775.20412.2883242077302841473-1@git.sr.ht
9
10
Update the function to use the EVT_SET_ADDR2 macro instead, which is the
11
macro intended for writing to these words.
12
13
ref. ARM IHI 0070C, section 7.3.4.
14
15
Signed-off-by: Simon Veith <sveith@amazon.de>
16
Acked-by: Eric Auger <eric.auger@redhat.com>
17
Tested-by: Eric Auger <eric.auger@redhat.com>
18
Message-id: 1576509312-13083-7-git-send-email-sveith@amazon.de
19
Cc: Eric Auger <eric.auger@redhat.com>
20
Cc: qemu-devel@nongnu.org
21
Cc: qemu-arm@nongnu.org
22
Acked-by: Eric Auger <eric.auger@redhat.com>
23
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
9
---
26
hw/arm/smmuv3.c | 2 +-
10
hw/timer/imx_epit.c | 2 +-
27
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
28
12
29
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
13
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
30
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/arm/smmuv3.c
15
--- a/hw/timer/imx_epit.c
32
+++ b/hw/arm/smmuv3.c
16
+++ b/hw/timer/imx_epit.c
33
@@ -XXX,XX +XXX,XX @@ void smmuv3_record_event(SMMUv3State *s, SMMUEventInfo *info)
17
@@ -XXX,XX +XXX,XX @@ static void imx_epit_update_compare_timer(IMXEPITState *s)
34
case SMMU_EVT_F_STE_FETCH:
18
* the compare value. Otherwise it may fire at most once in the
35
EVT_SET_SSID(&evt, info->u.f_ste_fetch.ssid);
19
* current round.
36
EVT_SET_SSV(&evt, info->u.f_ste_fetch.ssv);
20
*/
37
- EVT_SET_ADDR(&evt, info->u.f_ste_fetch.addr);
21
- bool is_oneshot = (limit >= s->cmp);
38
+ EVT_SET_ADDR2(&evt, info->u.f_ste_fetch.addr);
22
+ is_oneshot = (limit >= s->cmp);
39
break;
23
if (counter >= s->cmp) {
40
case SMMU_EVT_C_BAD_STE:
24
/* The compare timer fires in the current round. */
41
EVT_SET_SSID(&evt, info->u.c_bad_ste.ssid);
25
counter -= s->cmp;
42
--
26
--
43
2.20.1
27
2.34.1
44
45
diff view generated by jsdifflib
1
From: Simon Veith <sveith@amazon.de>
1
From: Axel Heider <axel.heider@hensoldt.net>
2
2
3
There are two issues with the current value of SMMU_BASE_ADDR_MASK:
3
Fix the limit check. If the limit is less than the compare value,
4
the timer can never reach this value, thus it will never fire.
4
5
5
- At the lower end, we are clearing bits [4:0]. Per the SMMUv3 spec,
6
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1491
6
we should also be treating bit 5 as zero in the base address.
7
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
7
- At the upper end, we are clearing bits [63:48]. Per the SMMUv3 spec,
8
Message-id: 168070611775.20412.2883242077302841473-2@git.sr.ht
8
only bits [63:52] must be explicitly treated as zero.
9
10
Update the SMMU_BASE_ADDR_MASK value to mask out bits [63:52] and [5:0].
11
12
ref. ARM IHI 0070C, section 6.3.23.
13
14
Signed-off-by: Simon Veith <sveith@amazon.de>
15
Acked-by: Eric Auger <eric.auger@redhat.com>
16
Tested-by: Eric Auger <eric.auger@redhat.com>
17
Message-id: 1576509312-13083-3-git-send-email-sveith@amazon.de
18
Cc: Eric Auger <eric.auger@redhat.com>
19
Cc: qemu-devel@nongnu.org
20
Cc: qemu-arm@nongnu.org
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
---
11
---
24
hw/arm/smmuv3-internal.h | 2 +-
12
hw/timer/imx_epit.c | 2 +-
25
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 1 insertion(+), 1 deletion(-)
26
14
27
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
15
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
28
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/smmuv3-internal.h
17
--- a/hw/timer/imx_epit.c
30
+++ b/hw/arm/smmuv3-internal.h
18
+++ b/hw/timer/imx_epit.c
31
@@ -XXX,XX +XXX,XX @@ REG32(GERROR_IRQ_CFG2, 0x74)
19
@@ -XXX,XX +XXX,XX @@ static void imx_epit_update_compare_timer(IMXEPITState *s)
32
20
* the compare value. Otherwise it may fire at most once in the
33
#define A_STRTAB_BASE 0x80 /* 64b */
21
* current round.
34
22
*/
35
-#define SMMU_BASE_ADDR_MASK 0xffffffffffe0
23
- is_oneshot = (limit >= s->cmp);
36
+#define SMMU_BASE_ADDR_MASK 0xfffffffffffc0
24
+ is_oneshot = (limit < s->cmp);
37
25
if (counter >= s->cmp) {
38
REG32(STRTAB_BASE_CFG, 0x88)
26
/* The compare timer fires in the current round. */
39
FIELD(STRTAB_BASE_CFG, FMT, 16, 2)
27
counter -= s->cmp;
40
--
28
--
41
2.20.1
29
2.34.1
42
43
diff view generated by jsdifflib
1
From: Andrew Jeffery <andrew@aj.id.au>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
This matches the configuration set by u-boot on the AST2600.
3
Missed in commit 80485d88f9 ("target/arm: Restrict
4
v7A TCG cpus to TCG accel").
4
5
5
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Message-id: 20230405100848.76145-2-philmd@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 080ca1267a09381c43cf3c50d434fb6c186f2b6e.1576215453.git-series.andrew@aj.id.au
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/aspeed_ast2600.c | 3 +++
11
target/arm/kvm-consts.h | 9 +++------
13
1 file changed, 3 insertions(+)
12
target/arm/cpu_tcg.c | 2 --
13
2 files changed, 3 insertions(+), 8 deletions(-)
14
14
15
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
15
diff --git a/target/arm/kvm-consts.h b/target/arm/kvm-consts.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed_ast2600.c
17
--- a/target/arm/kvm-consts.h
18
+++ b/hw/arm/aspeed_ast2600.c
18
+++ b/target/arm/kvm-consts.h
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
19
@@ -XXX,XX +XXX,XX @@ MISMATCH_CHECK(QEMU_PSCI_RET_INTERNAL_FAILURE, PSCI_RET_INTERNAL_FAILURE);
20
object_property_set_int(OBJECT(&s->cpu[i]), aspeed_calc_affinity(i),
20
MISMATCH_CHECK(QEMU_PSCI_RET_NOT_PRESENT, PSCI_RET_NOT_PRESENT);
21
"mp-affinity", &error_abort);
21
MISMATCH_CHECK(QEMU_PSCI_RET_DISABLED, PSCI_RET_DISABLED);
22
22
23
+ object_property_set_int(OBJECT(&s->cpu[i]), 1125000000, "cntfrq",
23
-/* Note that KVM uses overlapping values for AArch32 and AArch64
24
+ &error_abort);
24
- * target CPU numbers. AArch32 targets:
25
+
25
+/*
26
/*
26
+ * Note that KVM uses overlapping values for AArch32 and AArch64
27
* TODO: the secondary CPUs are started and a boot helper
27
+ * target CPU numbers. AArch64 targets:
28
* is needed when using -kernel
28
*/
29
-#define QEMU_KVM_ARM_TARGET_CORTEX_A15 0
30
-#define QEMU_KVM_ARM_TARGET_CORTEX_A7 1
31
-
32
-/* AArch64 targets: */
33
#define QEMU_KVM_ARM_TARGET_AEM_V8 0
34
#define QEMU_KVM_ARM_TARGET_FOUNDATION_V8 1
35
#define QEMU_KVM_ARM_TARGET_CORTEX_A57 2
36
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/cpu_tcg.c
39
+++ b/target/arm/cpu_tcg.c
40
@@ -XXX,XX +XXX,XX @@ static void cortex_a7_initfn(Object *obj)
41
set_feature(&cpu->env, ARM_FEATURE_EL2);
42
set_feature(&cpu->env, ARM_FEATURE_EL3);
43
set_feature(&cpu->env, ARM_FEATURE_PMU);
44
- cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A7;
45
cpu->midr = 0x410fc075;
46
cpu->reset_fpsid = 0x41023075;
47
cpu->isar.mvfr0 = 0x10110222;
48
@@ -XXX,XX +XXX,XX @@ static void cortex_a15_initfn(Object *obj)
49
set_feature(&cpu->env, ARM_FEATURE_EL2);
50
set_feature(&cpu->env, ARM_FEATURE_EL3);
51
set_feature(&cpu->env, ARM_FEATURE_PMU);
52
- cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A15;
53
/* r4p0 cpu, not requiring expensive tlb flush errata */
54
cpu->midr = 0x414fc0f0;
55
cpu->revidr = 0x0;
29
--
56
--
30
2.20.1
57
2.34.1
31
58
32
59
diff view generated by jsdifflib
1
From: Andrew Jeffery <andrew@aj.id.au>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The corner-case codepath was adjusting nexttick such that overflow
3
The Cortex-A7 core is only available when TCG is enabled (see
4
wouldn't occur when timer_mod() scaled the value back up. Remove a use
4
commit 80485d88f9 "target/arm: Restrict v7A TCG cpus to TCG accel").
5
of GTIMER_SCALE and avoid unnecessary operations by calling
6
timer_mod_ns() directly.
7
5
8
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Message-id: 20230405100848.76145-3-philmd@linaro.org
11
Message-id: f8c680720e3abe55476e6d9cb604ad27fdbeb2e0.1576215453.git-series.andrew@aj.id.au
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/helper.c | 5 +++--
11
hw/arm/virt.c | 2 ++
15
1 file changed, 3 insertions(+), 2 deletions(-)
12
1 file changed, 2 insertions(+)
16
13
17
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/helper.c
16
--- a/hw/arm/virt.c
20
+++ b/target/arm/helper.c
17
+++ b/hw/arm/virt.c
21
@@ -XXX,XX +XXX,XX @@ static void gt_recalc_timer(ARMCPU *cpu, int timeridx)
18
@@ -XXX,XX +XXX,XX @@ static const int a15irqmap[] = {
22
* timer expires we will reset the timer for any remaining period.
19
};
23
*/
20
24
if (nexttick > INT64_MAX / GTIMER_SCALE) {
21
static const char *valid_cpus[] = {
25
- nexttick = INT64_MAX / GTIMER_SCALE;
22
+#ifdef CONFIG_TCG
26
+ timer_mod_ns(cpu->gt_timer[timeridx], INT64_MAX);
23
ARM_CPU_TYPE_NAME("cortex-a7"),
27
+ } else {
24
+#endif
28
+ timer_mod(cpu->gt_timer[timeridx], nexttick);
25
ARM_CPU_TYPE_NAME("cortex-a15"),
29
}
26
ARM_CPU_TYPE_NAME("cortex-a35"),
30
- timer_mod(cpu->gt_timer[timeridx], nexttick);
27
ARM_CPU_TYPE_NAME("cortex-a53"),
31
trace_arm_gt_recalc(timeridx, irqstate, nexttick);
32
} else {
33
/* Timer disabled: ISTATUS and timer output always clear */
34
--
28
--
35
2.20.1
29
2.34.1
36
30
37
31
diff view generated by jsdifflib
1
From: Andrew Jeffery <andrew@aj.id.au>
1
From: Akihiko Odaki <akihiko.odaki@daynix.com>
2
2
3
The ASPEED AST2600 clocks the generic timer at the rate of HPLL. On
3
kvm_arm_init_debug() used to be called several times on a SMP system as
4
recent firmwares this is at 1125MHz, which is considerably quicker than
4
kvm_arch_init_vcpu() calls it. Move the call to kvm_arch_init() to make
5
the assumed 62.5MHz of the current generic timer implementation. The
5
sure it will be called only once; otherwise it will overwrite pointers
6
delta between the value as read from CNTFRQ and the true rate of the
6
to memory allocated with the previous call and leak it.
7
underlying QEMUTimer leads to sticky behaviour in AST2600 guests.
8
7
9
Add a feature-gated property exposing CNTFRQ for ARM CPUs providing the
8
Fixes: e4482ab7e3 ("target-arm: kvm - add support for HW assisted debug")
10
generic timer. This allows platforms to configure CNTFRQ (and the
9
Suggested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
associated QEMUTimer) to the appropriate frequency prior to starting the
10
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
12
guest.
11
Message-id: 20230405153644.25300-1-akihiko.odaki@daynix.com
13
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
As the platform can now determine the rate of CNTFRQ we're exposed to
15
limitations of QEMUTimer that didn't previously materialise: In the
16
course of emulation we need to arbitrarily and accurately convert
17
between guest ticks and time, but we're constrained by QEMUTimer's use
18
of an integer scaling factor. The effect is QEMUTimer cannot exactly
19
capture the period of frequencies that do not cleanly divide
20
NANOSECONDS_PER_SECOND for scaling ticks to time. As such, provide an
21
equally inaccurate scaling factor for scaling time to ticks so at least
22
a self-consistent inverse relationship holds.
23
24
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
25
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
26
Message-id: a22db9325f96e39f76e3c2baddcb712149f46bf2.1576215453.git-series.andrew@aj.id.au
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
---
14
---
29
target/arm/cpu.c | 61 +++++++++++++++++++++++++++++++++++++--------
15
target/arm/kvm_arm.h | 8 ++++++++
30
target/arm/helper.c | 9 ++++++-
16
target/arm/kvm.c | 2 ++
31
2 files changed, 59 insertions(+), 11 deletions(-)
17
target/arm/kvm64.c | 18 ++++--------------
18
3 files changed, 14 insertions(+), 14 deletions(-)
32
19
33
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
20
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
34
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/cpu.c
22
--- a/target/arm/kvm_arm.h
36
+++ b/target/arm/cpu.c
23
+++ b/target/arm/kvm_arm.h
37
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_initfn(Object *obj)
24
@@ -XXX,XX +XXX,XX @@
38
if (tcg_enabled()) {
25
#define KVM_ARM_VGIC_V2 (1 << 0)
39
cpu->psci_version = 2; /* TCG implements PSCI 0.2 */
26
#define KVM_ARM_VGIC_V3 (1 << 1)
40
}
27
41
-
28
+/**
42
- cpu->gt_cntfrq_hz = NANOSECONDS_PER_SECOND / GTIMER_SCALE;
29
+ * kvm_arm_init_debug() - initialize guest debug capabilities
43
}
30
+ * @s: KVMState
44
31
+ *
45
+static Property arm_cpu_gt_cntfrq_property =
32
+ * Should be called only once before using guest debug capabilities.
46
+ DEFINE_PROP_UINT64("cntfrq", ARMCPU, gt_cntfrq_hz,
33
+ */
47
+ NANOSECONDS_PER_SECOND / GTIMER_SCALE);
34
+void kvm_arm_init_debug(KVMState *s);
48
+
35
+
49
static Property arm_cpu_reset_cbar_property =
36
/**
50
DEFINE_PROP_UINT64("reset-cbar", ARMCPU, reset_cbar, 0);
37
* kvm_arm_vcpu_init:
51
38
* @cs: CPUState
52
@@ -XXX,XX +XXX,XX @@ static void arm_set_init_svtor(Object *obj, Visitor *v, const char *name,
39
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
53
40
index XXXXXXX..XXXXXXX 100644
54
unsigned int gt_cntfrq_period_ns(ARMCPU *cpu)
41
--- a/target/arm/kvm.c
55
{
42
+++ b/target/arm/kvm.c
56
+ /*
43
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init(MachineState *ms, KVMState *s)
57
+ * The exact approach to calculating guest ticks is:
58
+ *
59
+ * muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), cpu->gt_cntfrq_hz,
60
+ * NANOSECONDS_PER_SECOND);
61
+ *
62
+ * We don't do that. Rather we intentionally use integer division
63
+ * truncation below and in the caller for the conversion of host monotonic
64
+ * time to guest ticks to provide the exact inverse for the semantics of
65
+ * the QEMUTimer scale factor. QEMUTimer's scale facter is an integer, so
66
+ * it loses precision when representing frequencies where
67
+ * `(NANOSECONDS_PER_SECOND % cpu->gt_cntfrq) > 0` holds. Failing to
68
+ * provide an exact inverse leads to scheduling timers with negative
69
+ * periods, which in turn leads to sticky behaviour in the guest.
70
+ *
71
+ * Finally, CNTFRQ is effectively capped at 1GHz to ensure our scale factor
72
+ * cannot become zero.
73
+ */
74
return NANOSECONDS_PER_SECOND > cpu->gt_cntfrq_hz ?
75
NANOSECONDS_PER_SECOND / cpu->gt_cntfrq_hz : 1;
76
}
77
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
78
79
qdev_property_add_static(DEVICE(obj), &arm_cpu_cfgend_property,
80
&error_abort);
81
+
82
+ if (arm_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER)) {
83
+ qdev_property_add_static(DEVICE(cpu), &arm_cpu_gt_cntfrq_property,
84
+ &error_abort);
85
+ }
86
}
87
88
static void arm_cpu_finalizefn(Object *obj)
89
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
90
}
44
}
91
}
45
}
92
46
93
- cpu->gt_timer[GTIMER_PHYS] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
47
+ kvm_arm_init_debug(s);
94
- arm_gt_ptimer_cb, cpu);
95
- cpu->gt_timer[GTIMER_VIRT] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
96
- arm_gt_vtimer_cb, cpu);
97
- cpu->gt_timer[GTIMER_HYP] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
98
- arm_gt_htimer_cb, cpu);
99
- cpu->gt_timer[GTIMER_SEC] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
100
- arm_gt_stimer_cb, cpu);
101
+
48
+
102
+ {
49
return ret;
103
+ uint64_t scale;
50
}
104
+
51
105
+ if (arm_feature(env, ARM_FEATURE_GENERIC_TIMER)) {
52
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
106
+ if (!cpu->gt_cntfrq_hz) {
107
+ error_setg(errp, "Invalid CNTFRQ: %"PRId64"Hz",
108
+ cpu->gt_cntfrq_hz);
109
+ return;
110
+ }
111
+ scale = gt_cntfrq_period_ns(cpu);
112
+ } else {
113
+ scale = GTIMER_SCALE;
114
+ }
115
+
116
+ cpu->gt_timer[GTIMER_PHYS] = timer_new(QEMU_CLOCK_VIRTUAL, scale,
117
+ arm_gt_ptimer_cb, cpu);
118
+ cpu->gt_timer[GTIMER_VIRT] = timer_new(QEMU_CLOCK_VIRTUAL, scale,
119
+ arm_gt_vtimer_cb, cpu);
120
+ cpu->gt_timer[GTIMER_HYP] = timer_new(QEMU_CLOCK_VIRTUAL, scale,
121
+ arm_gt_htimer_cb, cpu);
122
+ cpu->gt_timer[GTIMER_SEC] = timer_new(QEMU_CLOCK_VIRTUAL, scale,
123
+ arm_gt_stimer_cb, cpu);
124
+ }
125
#endif
126
127
cpu_exec_realizefn(cs, &local_err);
128
diff --git a/target/arm/helper.c b/target/arm/helper.c
129
index XXXXXXX..XXXXXXX 100644
53
index XXXXXXX..XXXXXXX 100644
130
--- a/target/arm/helper.c
54
--- a/target/arm/kvm64.c
131
+++ b/target/arm/helper.c
55
+++ b/target/arm/kvm64.c
132
@@ -XXX,XX +XXX,XX @@ void arm_gt_stimer_cb(void *opaque)
56
@@ -XXX,XX +XXX,XX @@ GArray *hw_breakpoints, *hw_watchpoints;
133
gt_recalc_timer(cpu, GTIMER_SEC);
57
#define get_hw_bp(i) (&g_array_index(hw_breakpoints, HWBreakpoint, i))
134
}
58
#define get_hw_wp(i) (&g_array_index(hw_watchpoints, HWWatchpoint, i))
135
59
136
+static void arm_gt_cntfrq_reset(CPUARMState *env, const ARMCPRegInfo *opaque)
60
-/**
137
+{
61
- * kvm_arm_init_debug() - check for guest debug capabilities
138
+ ARMCPU *cpu = env_archcpu(env);
62
- * @cs: CPUState
139
+
63
- *
140
+ cpu->env.cp15.c14_cntfrq = cpu->gt_cntfrq_hz;
64
- * kvm_check_extension returns the number of debug registers we have
141
+}
65
- * or 0 if we have none.
142
+
66
- *
143
static const ARMCPRegInfo generic_timer_cp_reginfo[] = {
67
- */
144
/* Note that CNTFRQ is purely reads-as-written for the benefit
68
-static void kvm_arm_init_debug(CPUState *cs)
145
* of software; writing it doesn't actually change the timer frequency.
69
+void kvm_arm_init_debug(KVMState *s)
146
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo generic_timer_cp_reginfo[] = {
70
{
147
.opc0 = 3, .opc1 = 3, .crn = 14, .crm = 0, .opc2 = 0,
71
- have_guest_debug = kvm_check_extension(cs->kvm_state,
148
.access = PL1_RW | PL0_R, .accessfn = gt_cntfrq_access,
72
+ have_guest_debug = kvm_check_extension(s,
149
.fieldoffset = offsetof(CPUARMState, cp15.c14_cntfrq),
73
KVM_CAP_SET_GUEST_DEBUG);
150
- .resetvalue = (1000 * 1000 * 1000) / GTIMER_SCALE,
74
151
+ .resetfn = arm_gt_cntfrq_reset,
75
- max_hw_wps = kvm_check_extension(cs->kvm_state, KVM_CAP_GUEST_DEBUG_HW_WPS);
152
},
76
+ max_hw_wps = kvm_check_extension(s, KVM_CAP_GUEST_DEBUG_HW_WPS);
153
/* overall control: mostly access permissions */
77
hw_watchpoints = g_array_sized_new(true, true,
154
{ .name = "CNTKCTL", .state = ARM_CP_STATE_BOTH,
78
sizeof(HWWatchpoint), max_hw_wps);
79
80
- max_hw_bps = kvm_check_extension(cs->kvm_state, KVM_CAP_GUEST_DEBUG_HW_BPS);
81
+ max_hw_bps = kvm_check_extension(s, KVM_CAP_GUEST_DEBUG_HW_BPS);
82
hw_breakpoints = g_array_sized_new(true, true,
83
sizeof(HWBreakpoint), max_hw_bps);
84
return;
85
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init_vcpu(CPUState *cs)
86
}
87
cpu->mp_affinity = mpidr & ARM64_AFFINITY_MASK;
88
89
- kvm_arm_init_debug(cs);
90
-
91
/* Check whether user space can specify guest syndrome value */
92
kvm_arm_init_serror_injection(cs);
93
155
--
94
--
156
2.20.1
95
2.34.1
157
96
158
97
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
We already pass merge_syn_data_abort() two fields from the
2
ARMMMUFaultInfo struct, and we're about to want to use a third field.
3
Refactor to just pass a pointer to the fault info.
2
4
3
Instead of crashing in a confuse way, give some hint to the user
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
about why we aborted. He might report the issue without having
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
to use a debugger.
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Message-id: 20230331145045.2584941-2-peter.maydell@linaro.org
9
---
10
target/arm/tcg/tlb_helper.c | 15 +++++++--------
11
1 file changed, 7 insertions(+), 8 deletions(-)
6
12
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
diff --git a/target/arm/tcg/tlb_helper.c b/target/arm/tcg/tlb_helper.c
8
Message-id: 20191209134552.27733-1-philmd@redhat.com
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/helper.c | 18 +++++++++++++++---
14
1 file changed, 15 insertions(+), 3 deletions(-)
15
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
17
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/helper.c
15
--- a/target/arm/tcg/tlb_helper.c
19
+++ b/target/arm/helper.c
16
+++ b/target/arm/tcg/tlb_helper.c
20
@@ -XXX,XX +XXX,XX @@ void HELPER(rebuild_hflags_a64)(CPUARMState *env, int el)
17
@@ -XXX,XX +XXX,XX @@ bool arm_s1_regime_using_lpae_format(CPUARMState *env, ARMMMUIdx mmu_idx)
21
env->hflags = rebuild_hflags_a64(env, el, fp_el, mmu_idx);
22
}
18
}
23
19
24
+static inline void assert_hflags_rebuild_correctly(CPUARMState *env)
20
static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
25
+{
21
+ ARMMMUFaultInfo *fi,
26
+#ifdef CONFIG_DEBUG_TCG
22
unsigned int target_el,
27
+ uint32_t env_flags_current = env->hflags;
23
- bool same_el, bool ea,
28
+ uint32_t env_flags_rebuilt = rebuild_hflags_internal(env);
24
- bool s1ptw, bool is_write,
29
+
25
+ bool same_el, bool is_write,
30
+ if (unlikely(env_flags_current != env_flags_rebuilt)) {
26
int fsc)
31
+ fprintf(stderr, "TCG hflags mismatch (current:0x%08x rebuilt:0x%08x)\n",
32
+ env_flags_current, env_flags_rebuilt);
33
+ abort();
34
+ }
35
+#endif
36
+}
37
+
38
void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
39
target_ulong *cs_base, uint32_t *pflags)
40
{
27
{
41
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
28
uint32_t syn;
42
uint32_t pstate_for_ss;
29
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
43
30
* ISS encoding for an exception from a Data Abort, the
44
*cs_base = 0;
31
* ISV field.
45
-#ifdef CONFIG_DEBUG_TCG
32
*/
46
- assert(flags == rebuild_hflags_internal(env));
33
- if (!(template_syn & ARM_EL_ISV) || target_el != 2 || s1ptw) {
47
-#endif
34
+ if (!(template_syn & ARM_EL_ISV) || target_el != 2 || fi->s1ptw) {
48
+ assert_hflags_rebuild_correctly(env);
35
syn = syn_data_abort_no_iss(same_el, 0,
49
36
- ea, 0, s1ptw, is_write, fsc);
50
if (FIELD_EX32(flags, TBFLAG_ANY, AARCH64_STATE)) {
37
+ fi->ea, 0, fi->s1ptw, is_write, fsc);
51
*pc = env->pc;
38
} else {
39
/*
40
* Fields: IL, ISV, SAS, SSE, SRT, SF and AR come from the template
41
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
42
*/
43
syn = syn_data_abort_with_iss(same_el,
44
0, 0, 0, 0, 0,
45
- ea, 0, s1ptw, is_write, fsc,
46
+ fi->ea, 0, fi->s1ptw, is_write, fsc,
47
true);
48
/* Merge the runtime syndrome with the template syndrome. */
49
syn |= template_syn;
50
@@ -XXX,XX +XXX,XX @@ void arm_deliver_fault(ARMCPU *cpu, vaddr addr,
51
syn = syn_insn_abort(same_el, fi->ea, fi->s1ptw, fsc);
52
exc = EXCP_PREFETCH_ABORT;
53
} else {
54
- syn = merge_syn_data_abort(env->exception.syndrome, target_el,
55
- same_el, fi->ea, fi->s1ptw,
56
- access_type == MMU_DATA_STORE,
57
+ syn = merge_syn_data_abort(env->exception.syndrome, fi, target_el,
58
+ same_el, access_type == MMU_DATA_STORE,
59
fsc);
60
if (access_type == MMU_DATA_STORE
61
&& arm_feature(env, ARM_FEATURE_V6)) {
52
--
62
--
53
2.20.1
63
2.34.1
54
64
55
65
diff view generated by jsdifflib
New patch
1
The syndrome value reported to ESR_EL2 should only contain the
2
detailed instruction syndrome information when the fault has been
3
caused by a stage 2 abort, not when the fault was a stage 1 abort
4
(i.e. caused by execution at EL2). We were getting this wrong and
5
reporting the detailed ISV information all the time.
1
6
7
Fix the bug by checking fi->stage2. Add a TODO comment noting the
8
cases where we'll have to come back and revisit this when we
9
implement FEAT_LS64 and friends.
10
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20230331145045.2584941-3-peter.maydell@linaro.org
14
---
15
target/arm/tcg/tlb_helper.c | 13 ++++++++++---
16
1 file changed, 10 insertions(+), 3 deletions(-)
17
18
diff --git a/target/arm/tcg/tlb_helper.c b/target/arm/tcg/tlb_helper.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/tcg/tlb_helper.c
21
+++ b/target/arm/tcg/tlb_helper.c
22
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
23
uint32_t syn;
24
25
/*
26
- * ISV is only set for data aborts routed to EL2 and
27
- * never for stage-1 page table walks faulting on stage 2.
28
+ * ISV is only set for stage-2 data aborts routed to EL2 and
29
+ * never for stage-1 page table walks faulting on stage 2
30
+ * or for stage-1 faults.
31
*
32
* Furthermore, ISV is only set for certain kinds of load/stores.
33
* If the template syndrome does not have ISV set, we should leave
34
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
35
* See ARMv8 specs, D7-1974:
36
* ISS encoding for an exception from a Data Abort, the
37
* ISV field.
38
+ *
39
+ * TODO: FEAT_LS64/FEAT_LS64_V/FEAT_SL64_ACCDATA: Translation,
40
+ * Access Flag, and Permission faults caused by LD64B, ST64B,
41
+ * ST64BV, or ST64BV0 insns report syndrome info even for stage-1
42
+ * faults and regardless of the target EL.
43
*/
44
- if (!(template_syn & ARM_EL_ISV) || target_el != 2 || fi->s1ptw) {
45
+ if (!(template_syn & ARM_EL_ISV) || target_el != 2
46
+ || fi->s1ptw || !fi->stage2) {
47
syn = syn_data_abort_no_iss(same_el, 0,
48
fi->ea, 0, fi->s1ptw, is_write, fsc);
49
} else {
50
--
51
2.34.1
diff view generated by jsdifflib
1
From: Andrew Jeffery <andrew@aj.id.au>
1
FEAT_PAN3 adds an EPAN bit to SCTLR_EL1 and SCTLR_EL2, which allows
2
the PAN bit to make memory non-privileged-read/write if it is
3
user-executable as well as if it is user-read/write.
2
4
3
Prepare for SoCs such as the ASPEED AST2600 whose firmware configures
5
Implement this feature and enable it in the AArch64 'max' CPU.
4
CNTFRQ to values significantly larger than the static 62.5MHz value
5
currently derived from GTIMER_SCALE. As the OS potentially derives its
6
timer periods from the CNTFRQ value the lack of support for running
7
QEMUTimers at the appropriate rate leads to sticky behaviour in the
8
guest.
9
6
10
Substitute the GTIMER_SCALE constant with use of a helper to derive the
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
period from gt_cntfrq_hz stored in struct ARMCPU. Initially set
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
gt_cntfrq_hz to the frequency associated with GTIMER_SCALE so current
9
Message-id: 20230331145045.2584941-4-peter.maydell@linaro.org
13
behaviour is maintained.
10
---
11
docs/system/arm/emulation.rst | 1 +
12
target/arm/cpu.h | 5 +++++
13
target/arm/cpu64.c | 2 +-
14
target/arm/ptw.c | 14 +++++++++++++-
15
4 files changed, 20 insertions(+), 2 deletions(-)
14
16
15
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
17
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
index XXXXXXX..XXXXXXX 100644
17
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
19
--- a/docs/system/arm/emulation.rst
18
Message-id: 40bd8df043f66e1ccfb3e9482999d099ac72bb2e.1576215453.git-series.andrew@aj.id.au
20
+++ b/docs/system/arm/emulation.rst
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
20
---
22
- FEAT_MTE3 (MTE Asymmetric Fault Handling)
21
target/arm/cpu.h | 5 +++++
23
- FEAT_PAN (Privileged access never)
22
target/arm/cpu.c | 8 ++++++++
24
- FEAT_PAN2 (AT S1E1R and AT S1E1W instruction variants affected by PSTATE.PAN)
23
target/arm/helper.c | 10 +++++++---
25
+- FEAT_PAN3 (Support for SCTLR_ELx.EPAN)
24
3 files changed, 20 insertions(+), 3 deletions(-)
26
- FEAT_PAuth (Pointer authentication)
25
27
- FEAT_PMULL (PMULL, PMULL2 instructions)
28
- FEAT_PMUv3p1 (PMU Extensions v3.1)
26
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
29
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
27
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
28
--- a/target/arm/cpu.h
31
--- a/target/arm/cpu.h
29
+++ b/target/arm/cpu.h
32
+++ b/target/arm/cpu.h
30
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
33
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id)
31
*/
34
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2;
32
DECLARE_BITMAP(sve_vq_map, ARM_MAX_VQ);
33
DECLARE_BITMAP(sve_vq_init, ARM_MAX_VQ);
34
+
35
+ /* Generic timer counter frequency, in Hz */
36
+ uint64_t gt_cntfrq_hz;
37
};
38
39
+unsigned int gt_cntfrq_period_ns(ARMCPU *cpu);
40
+
41
void arm_cpu_post_init(Object *obj);
42
43
uint64_t arm_cpu_mp_affinity(int idx, uint8_t clustersz);
44
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/cpu.c
47
+++ b/target/arm/cpu.c
48
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_initfn(Object *obj)
49
if (tcg_enabled()) {
50
cpu->psci_version = 2; /* TCG implements PSCI 0.2 */
51
}
52
+
53
+ cpu->gt_cntfrq_hz = NANOSECONDS_PER_SECOND / GTIMER_SCALE;
54
}
35
}
55
36
56
static Property arm_cpu_reset_cbar_property =
37
+static inline bool isar_feature_aa64_pan3(const ARMISARegisters *id)
57
@@ -XXX,XX +XXX,XX @@ static void arm_set_init_svtor(Object *obj, Visitor *v, const char *name,
58
visit_type_uint32(v, name, &cpu->init_svtor, errp);
59
}
60
61
+unsigned int gt_cntfrq_period_ns(ARMCPU *cpu)
62
+{
38
+{
63
+ return NANOSECONDS_PER_SECOND > cpu->gt_cntfrq_hz ?
39
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 3;
64
+ NANOSECONDS_PER_SECOND / cpu->gt_cntfrq_hz : 1;
65
+}
40
+}
66
+
41
+
67
void arm_cpu_post_init(Object *obj)
42
static inline bool isar_feature_aa64_hcx(const ARMISARegisters *id)
68
{
43
{
69
ARMCPU *cpu = ARM_CPU(obj);
44
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, HCX) != 0;
70
diff --git a/target/arm/helper.c b/target/arm/helper.c
45
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
71
index XXXXXXX..XXXXXXX 100644
46
index XXXXXXX..XXXXXXX 100644
72
--- a/target/arm/helper.c
47
--- a/target/arm/cpu64.c
73
+++ b/target/arm/helper.c
48
+++ b/target/arm/cpu64.c
74
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gt_stimer_access(CPUARMState *env,
49
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
75
50
t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1); /* FEAT_VHE */
76
static uint64_t gt_get_countervalue(CPUARMState *env)
51
t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* FEAT_HPDS */
77
{
52
t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1); /* FEAT_LOR */
78
- return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) / GTIMER_SCALE;
53
- t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* FEAT_PAN2 */
79
+ ARMCPU *cpu = env_archcpu(env);
54
+ t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 3); /* FEAT_PAN3 */
80
+
55
t = FIELD_DP64(t, ID_AA64MMFR1, XNX, 1); /* FEAT_XNX */
81
+ return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) / gt_cntfrq_period_ns(cpu);
56
t = FIELD_DP64(t, ID_AA64MMFR1, ETS, 1); /* FEAT_ETS */
82
}
57
t = FIELD_DP64(t, ID_AA64MMFR1, HCX, 1); /* FEAT_HCX */
83
58
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
84
static void gt_recalc_timer(ARMCPU *cpu, int timeridx)
59
index XXXXXXX..XXXXXXX 100644
85
@@ -XXX,XX +XXX,XX @@ static void gt_recalc_timer(ARMCPU *cpu, int timeridx)
60
--- a/target/arm/ptw.c
86
* set the timer for as far in the future as possible. When the
61
+++ b/target/arm/ptw.c
87
* timer expires we will reset the timer for any remaining period.
62
@@ -XXX,XX +XXX,XX @@ static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
88
*/
63
static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
89
- if (nexttick > INT64_MAX / GTIMER_SCALE) {
64
int ap, int ns, int xn, int pxn)
90
+ if (nexttick > INT64_MAX / gt_cntfrq_period_ns(cpu)) {
91
timer_mod_ns(cpu->gt_timer[timeridx], INT64_MAX);
92
} else {
93
timer_mod(cpu->gt_timer[timeridx], nexttick);
94
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo generic_timer_cp_reginfo[] = {
95
96
static uint64_t gt_virt_cnt_read(CPUARMState *env, const ARMCPRegInfo *ri)
97
{
65
{
98
+ ARMCPU *cpu = env_archcpu(env);
66
+ ARMCPU *cpu = env_archcpu(env);
99
+
67
bool is_user = regime_is_user(env, mmu_idx);
100
/* Currently we have no support for QEMUTimer in linux-user so we
68
int prot_rw, user_rw;
101
* can't call gt_get_countervalue(env), instead we directly
69
bool have_wxn;
102
* call the lower level functions.
70
@@ -XXX,XX +XXX,XX @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
103
*/
71
if (is_user) {
104
- return cpu_get_clock() / GTIMER_SCALE;
72
prot_rw = user_rw;
105
+ return cpu_get_clock() / gt_cntfrq_period_ns(cpu);
73
} else {
106
}
74
+ /*
107
75
+ * PAN controls can forbid data accesses but don't affect insn fetch.
108
static const ARMCPRegInfo generic_timer_cp_reginfo[] = {
76
+ * Plain PAN forbids data accesses if EL0 has data permissions;
77
+ * PAN3 forbids data accesses if EL0 has either data or exec perms.
78
+ * Note that for AArch64 the 'user can exec' case is exactly !xn.
79
+ * We make the IMPDEF choices that SCR_EL3.SIF and Realm EL2&0
80
+ * do not affect EPAN.
81
+ */
82
if (user_rw && regime_is_pan(env, mmu_idx)) {
83
- /* PAN forbids data accesses but doesn't affect insn fetch */
84
+ prot_rw = 0;
85
+ } else if (cpu_isar_feature(aa64_pan3, cpu) && is_aa64 &&
86
+ regime_is_pan(env, mmu_idx) &&
87
+ (regime_sctlr(env, mmu_idx) & SCTLR_EPAN) && !xn) {
88
prot_rw = 0;
89
} else {
90
prot_rw = simple_ap_to_rw_prot_is_user(ap, false);
109
--
91
--
110
2.20.1
92
2.34.1
111
112
diff view generated by jsdifflib
1
From: Simon Veith <sveith@amazon.de>
1
In rST markup syntax, the inline markup (*italics*, **bold** and
2
``monospaced``) must be separated from the surrending text by
3
non-word characters, otherwise it is not interpreted as markup.
4
To force interpretation as markup in the middle of a word,
5
you need to use a backslash-escaped space (which will not
6
appear as a space in the output).
2
7
3
In the SMMU_STRTAB_BASE register, the stream table base address only
8
Fix a missing backslash-space in this file, which meant that the ``
4
occupies bits [51:6]. Other bits, such as RA (bit [62]), must be masked
9
after "select" was output literally and the monospacing was
5
out to obtain the base address.
10
incorrectly extended all the way to the end of the next monospaced
11
word.
6
12
7
The branch for 2-level stream tables correctly applies this mask by way
8
of SMMU_BASE_ADDR_MASK, but the one for linear stream tables does not.
9
10
Apply the missing mask in that case as well so that the correct stream
11
base address is used by guests which configure a linear stream table.
12
13
Linux guests are unaffected by this change because they choose a 2-level
14
stream table layout for the QEMU SMMUv3, based on the size of its stream
15
ID space.
16
17
ref. ARM IHI 0070C, section 6.3.23.
18
19
Signed-off-by: Simon Veith <sveith@amazon.de>
20
Acked-by: Eric Auger <eric.auger@redhat.com>
21
Tested-by: Eric Auger <eric.auger@redhat.com>
22
Message-id: 1576509312-13083-2-git-send-email-sveith@amazon.de
23
Cc: Eric Auger <eric.auger@redhat.com>
24
Cc: qemu-devel@nongnu.org
25
Cc: qemu-arm@nongnu.org
26
Acked-by: Eric Auger <eric.auger@redhat.com>
27
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
16
Message-id: 20230411105424.3994585-1-peter.maydell@linaro.org
29
---
17
---
30
hw/arm/smmuv3.c | 2 +-
18
docs/devel/kconfig.rst | 2 +-
31
1 file changed, 1 insertion(+), 1 deletion(-)
19
1 file changed, 1 insertion(+), 1 deletion(-)
32
20
33
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
21
diff --git a/docs/devel/kconfig.rst b/docs/devel/kconfig.rst
34
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/smmuv3.c
23
--- a/docs/devel/kconfig.rst
36
+++ b/hw/arm/smmuv3.c
24
+++ b/docs/devel/kconfig.rst
37
@@ -XXX,XX +XXX,XX @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
25
@@ -XXX,XX +XXX,XX @@ or commenting out lines in the second group.
38
}
26
39
addr = l2ptr + l2_ste_offset * sizeof(*ste);
27
It is also possible to run QEMU's configure script with the
40
} else {
28
``--without-default-devices`` option. When this is done, everything defaults
41
- addr = s->strtab_base + sid * sizeof(*ste);
29
-to ``n`` unless it is ``select``ed or explicitly switched on in the
42
+ addr = (s->strtab_base & SMMU_BASE_ADDR_MASK) + sid * sizeof(*ste);
30
+to ``n`` unless it is ``select``\ ed or explicitly switched on in the
43
}
31
``.mak`` files. In other words, ``default`` and ``imply`` directives
44
32
are disabled. When QEMU is built with this option, the user will probably
45
if (smmu_get_ste(s, addr, ste, event)) {
33
want to change some lines in the first group, for example like this::
46
--
34
--
47
2.20.1
35
2.34.1
48
36
49
37
diff view generated by jsdifflib
New patch
1
So that we can avoid the "older gdb crashes" problem described in
2
commit 5787d17a42f7af4 and which caused us to disable reporting pauth
3
information via the gdbstub, newer gdb is going to implement support
4
for recognizing the pauth information via a new feature name:
5
org.gnu.gdb.aarch64.pauth_v2
1
6
7
Older gdb won't recognize this feature name, so we can re-enable the
8
pauth support under the new name without risking them crashing.
9
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20230406150827.3322670-1-peter.maydell@linaro.org
13
---
14
target/arm/gdbstub.c | 9 ++++-----
15
gdb-xml/aarch64-pauth.xml | 2 +-
16
2 files changed, 5 insertions(+), 6 deletions(-)
17
18
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/gdbstub.c
21
+++ b/target/arm/gdbstub.c
22
@@ -XXX,XX +XXX,XX @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
23
aarch64_gdb_set_fpu_reg,
24
34, "aarch64-fpu.xml", 0);
25
}
26
-#if 0
27
/*
28
- * GDB versions 9 through 12 have a bug which means they will
29
- * crash if they see this XML from QEMU; disable it for the 8.0
30
- * release, pending a better solution.
31
+ * Note that we report pauth information via the feature name
32
+ * org.gnu.gdb.aarch64.pauth_v2, not org.gnu.gdb.aarch64.pauth.
33
+ * GDB versions 9 through 12 have a bug where they will crash
34
+ * if they see the latter XML from QEMU.
35
*/
36
if (isar_feature_aa64_pauth(&cpu->isar)) {
37
gdb_register_coprocessor(cs, aarch64_gdb_get_pauth_reg,
38
aarch64_gdb_set_pauth_reg,
39
4, "aarch64-pauth.xml", 0);
40
}
41
-#endif
42
#endif
43
} else {
44
if (arm_feature(env, ARM_FEATURE_NEON)) {
45
diff --git a/gdb-xml/aarch64-pauth.xml b/gdb-xml/aarch64-pauth.xml
46
index XXXXXXX..XXXXXXX 100644
47
--- a/gdb-xml/aarch64-pauth.xml
48
+++ b/gdb-xml/aarch64-pauth.xml
49
@@ -XXX,XX +XXX,XX @@
50
notice and this notice are preserved. -->
51
52
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
53
-<feature name="org.gnu.gdb.aarch64.pauth">
54
+<feature name="org.gnu.gdb.aarch64.pauth_v2">
55
<reg name="pauth_dmask" bitsize="64"/>
56
<reg name="pauth_cmask" bitsize="64"/>
57
<reg name="pauth_dmask_high" bitsize="64"/>
58
--
59
2.34.1
diff view generated by jsdifflib
1
From: Niek Linnenbank <nieklinnenbank@gmail.com>
1
From: Guenter Roeck <linux@roeck-us.net>
2
2
3
After setting CP15 bits in arm_set_cpu_on() the cached hflags must
3
The SOC on i.MX6UL and i.MX7 has 2 Ethernet interfaces. The PHY on each may
4
be rebuild to reflect the changed processor state. Without rebuilding,
4
be connected to separate MDIO busses, or both may be connected on the same
5
the cached hflags would be inconsistent until the next call to
5
MDIO bus using different PHY addresses. Commit 461c51ad4275 ("Add a phy-num
6
arm_rebuild_hflags(). When QEMU is compiled with debugging enabled
6
property to the i.MX FEC emulator") added support for specifying PHY
7
(--enable-debug), this problem is captured shortly after the first
7
addresses, but it did not provide support for linking the second PHY on
8
call to arm_set_cpu_on() for CPUs running in ARM 32-bit non-secure mode:
8
a given MDIO bus to the other Ethernet interface.
9
9
10
qemu-system-arm: target/arm/helper.c:11359: cpu_get_tb_cpu_state:
10
To be able to support two PHY instances on a single MDIO bus, two properties
11
Assertion `flags == rebuild_hflags_internal(env)' failed.
11
are needed: First, there needs to be a flag indicating if the MDIO bus on
12
Aborted (core dumped)
12
a given Ethernet interface is connected. If not, attempts to read from this
13
bus must always return 0xffff. Implement this property as phy-connected.
14
Second, if the MDIO bus on an interface is active, it needs a link to the
15
consumer interface to be able to provide PHY access for it. Implement this
16
property as phy-consumer.
13
17
14
Fixes: 0c7f8c43daf65
18
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
15
Cc: qemu-stable@nongnu.org
19
Message-id: 20230315145248.1639364-2-linux@roeck-us.net
16
Signed-off-by: Niek Linnenbank <nieklinnenbank@gmail.com>
20
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
22
---
20
target/arm/arm-powerctl.c | 3 +++
23
include/hw/net/imx_fec.h | 2 ++
21
1 file changed, 3 insertions(+)
24
hw/net/imx_fec.c | 27 +++++++++++++++++++++++----
25
2 files changed, 25 insertions(+), 4 deletions(-)
22
26
23
diff --git a/target/arm/arm-powerctl.c b/target/arm/arm-powerctl.c
27
diff --git a/include/hw/net/imx_fec.h b/include/hw/net/imx_fec.h
24
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/arm-powerctl.c
29
--- a/include/hw/net/imx_fec.h
26
+++ b/target/arm/arm-powerctl.c
30
+++ b/include/hw/net/imx_fec.h
27
@@ -XXX,XX +XXX,XX @@ static void arm_set_cpu_on_async_work(CPUState *target_cpu_state,
31
@@ -XXX,XX +XXX,XX @@ struct IMXFECState {
28
target_cpu->env.regs[0] = info->context_id;
32
uint32_t phy_int;
33
uint32_t phy_int_mask;
34
uint32_t phy_num;
35
+ bool phy_connected;
36
+ struct IMXFECState *phy_consumer;
37
38
bool is_fec;
39
40
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/net/imx_fec.c
43
+++ b/hw/net/imx_fec.c
44
@@ -XXX,XX +XXX,XX @@ static uint32_t imx_phy_read(IMXFECState *s, int reg)
45
uint32_t val;
46
uint32_t phy = reg / 32;
47
48
- if (phy != s->phy_num) {
49
- trace_imx_phy_read_num(phy, s->phy_num);
50
+ if (!s->phy_connected) {
51
return 0xffff;
29
}
52
}
30
53
31
+ /* CP15 update requires rebuilding hflags */
54
+ if (phy != s->phy_num) {
32
+ arm_rebuild_hflags(&target_cpu->env);
55
+ if (s->phy_consumer && phy == s->phy_consumer->phy_num) {
56
+ s = s->phy_consumer;
57
+ } else {
58
+ trace_imx_phy_read_num(phy, s->phy_num);
59
+ return 0xffff;
60
+ }
61
+ }
33
+
62
+
34
/* Start the new CPU at the requested address */
63
reg %= 32;
35
cpu_set_pc(target_cpu_state, info->entry);
64
65
switch (reg) {
66
@@ -XXX,XX +XXX,XX @@ static void imx_phy_write(IMXFECState *s, int reg, uint32_t val)
67
{
68
uint32_t phy = reg / 32;
69
70
- if (phy != s->phy_num) {
71
- trace_imx_phy_write_num(phy, s->phy_num);
72
+ if (!s->phy_connected) {
73
return;
74
}
75
76
+ if (phy != s->phy_num) {
77
+ if (s->phy_consumer && phy == s->phy_consumer->phy_num) {
78
+ s = s->phy_consumer;
79
+ } else {
80
+ trace_imx_phy_write_num(phy, s->phy_num);
81
+ return;
82
+ }
83
+ }
84
+
85
reg %= 32;
86
87
trace_imx_phy_write(val, phy, reg);
88
@@ -XXX,XX +XXX,XX @@ static Property imx_eth_properties[] = {
89
DEFINE_NIC_PROPERTIES(IMXFECState, conf),
90
DEFINE_PROP_UINT32("tx-ring-num", IMXFECState, tx_ring_num, 1),
91
DEFINE_PROP_UINT32("phy-num", IMXFECState, phy_num, 0),
92
+ DEFINE_PROP_BOOL("phy-connected", IMXFECState, phy_connected, true),
93
+ DEFINE_PROP_LINK("phy-consumer", IMXFECState, phy_consumer, TYPE_IMX_FEC,
94
+ IMXFECState *),
95
DEFINE_PROP_END_OF_LIST(),
96
};
36
97
37
--
98
--
38
2.20.1
99
2.34.1
39
40
diff view generated by jsdifflib
New patch
1
From: Guenter Roeck <linux@roeck-us.net>
1
2
3
Add fec[12]-phy-connected properties and use it to set phy-connected
4
and phy-consumer properties for imx_fec.
5
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
7
Message-id: 20230315145248.1639364-3-linux@roeck-us.net
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/arm/fsl-imx6ul.h | 1 +
12
hw/arm/fsl-imx6ul.c | 20 ++++++++++++++++++++
13
2 files changed, 21 insertions(+)
14
15
diff --git a/include/hw/arm/fsl-imx6ul.h b/include/hw/arm/fsl-imx6ul.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/fsl-imx6ul.h
18
+++ b/include/hw/arm/fsl-imx6ul.h
19
@@ -XXX,XX +XXX,XX @@ struct FslIMX6ULState {
20
MemoryRegion ocram_alias;
21
22
uint32_t phy_num[FSL_IMX6UL_NUM_ETHS];
23
+ bool phy_connected[FSL_IMX6UL_NUM_ETHS];
24
};
25
26
enum FslIMX6ULMemoryMap {
27
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/fsl-imx6ul.c
30
+++ b/hw/arm/fsl-imx6ul.c
31
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
32
33
/*
34
* Ethernet
35
+ *
36
+ * We must use two loops since phy_connected affects the other interface
37
+ * and we have to set all properties before calling sysbus_realize().
38
*/
39
+ for (i = 0; i < FSL_IMX6UL_NUM_ETHS; i++) {
40
+ object_property_set_bool(OBJECT(&s->eth[i]), "phy-connected",
41
+ s->phy_connected[i], &error_abort);
42
+ /*
43
+ * If the MDIO bus on this controller is not connected, assume the
44
+ * other controller provides support for it.
45
+ */
46
+ if (!s->phy_connected[i]) {
47
+ object_property_set_link(OBJECT(&s->eth[1 - i]), "phy-consumer",
48
+ OBJECT(&s->eth[i]), &error_abort);
49
+ }
50
+ }
51
+
52
for (i = 0; i < FSL_IMX6UL_NUM_ETHS; i++) {
53
static const hwaddr FSL_IMX6UL_ENETn_ADDR[FSL_IMX6UL_NUM_ETHS] = {
54
FSL_IMX6UL_ENET1_ADDR,
55
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
56
static Property fsl_imx6ul_properties[] = {
57
DEFINE_PROP_UINT32("fec1-phy-num", FslIMX6ULState, phy_num[0], 0),
58
DEFINE_PROP_UINT32("fec2-phy-num", FslIMX6ULState, phy_num[1], 1),
59
+ DEFINE_PROP_BOOL("fec1-phy-connected", FslIMX6ULState, phy_connected[0],
60
+ true),
61
+ DEFINE_PROP_BOOL("fec2-phy-connected", FslIMX6ULState, phy_connected[1],
62
+ true),
63
DEFINE_PROP_END_OF_LIST(),
64
};
65
66
--
67
2.34.1
diff view generated by jsdifflib
New patch
1
From: Guenter Roeck <linux@roeck-us.net>
1
2
3
On mcimx6ul-evk, the MDIO bus is connected to the second Ethernet
4
interface. Set fec1-phy-connected to false to reflect this.
5
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
7
Message-id: 20230315145248.1639364-4-linux@roeck-us.net
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/mcimx6ul-evk.c | 2 ++
12
1 file changed, 2 insertions(+)
13
14
diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/mcimx6ul-evk.c
17
+++ b/hw/arm/mcimx6ul-evk.c
18
@@ -XXX,XX +XXX,XX @@ static void mcimx6ul_evk_init(MachineState *machine)
19
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
20
object_property_set_uint(OBJECT(s), "fec1-phy-num", 2, &error_fatal);
21
object_property_set_uint(OBJECT(s), "fec2-phy-num", 1, &error_fatal);
22
+ object_property_set_bool(OBJECT(s), "fec1-phy-connected", false,
23
+ &error_fatal);
24
qdev_realize(DEVICE(s), NULL, &error_fatal);
25
26
memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
27
--
28
2.34.1
diff view generated by jsdifflib
1
From: Simon Veith <sveith@amazon.de>
1
From: Guenter Roeck <linux@roeck-us.net>
2
2
3
Per the specification, and as observed in hardware, the SMMUv3 aligns
3
Add fec[12]-phy-connected properties and use it to set phy-connected
4
the SMMU_STRTAB_BASE address to the size of the table by masking out the
4
and phy-consumer properties for imx_fec.
5
respective least significant bits in the ADDR field.
6
5
7
Apply this masking logic to our smmu_find_ste() lookup function per the
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
8
specification.
7
Message-id: 20230315145248.1639364-5-linux@roeck-us.net
9
10
ref. ARM IHI 0070C, section 6.3.23.
11
12
Signed-off-by: Simon Veith <sveith@amazon.de>
13
Acked-by: Eric Auger <eric.auger@redhat.com>
14
Tested-by: Eric Auger <eric.auger@redhat.com>
15
Message-id: 1576509312-13083-5-git-send-email-sveith@amazon.de
16
Cc: Eric Auger <eric.auger@redhat.com>
17
Cc: qemu-devel@nongnu.org
18
Cc: qemu-arm@nongnu.org
19
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
10
---
22
hw/arm/smmuv3.c | 18 ++++++++++++++----
11
include/hw/arm/fsl-imx7.h | 1 +
23
1 file changed, 14 insertions(+), 4 deletions(-)
12
hw/arm/fsl-imx7.c | 20 ++++++++++++++++++++
13
2 files changed, 21 insertions(+)
24
14
25
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
15
diff --git a/include/hw/arm/fsl-imx7.h b/include/hw/arm/fsl-imx7.h
26
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/arm/smmuv3.c
17
--- a/include/hw/arm/fsl-imx7.h
28
+++ b/hw/arm/smmuv3.c
18
+++ b/include/hw/arm/fsl-imx7.h
29
@@ -XXX,XX +XXX,XX @@ bad_ste:
19
@@ -XXX,XX +XXX,XX @@ struct FslIMX7State {
30
static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
20
ChipideaState usb[FSL_IMX7_NUM_USBS];
31
SMMUEventInfo *event)
21
DesignwarePCIEHost pcie;
32
{
22
uint32_t phy_num[FSL_IMX7_NUM_ETHS];
33
- dma_addr_t addr;
23
+ bool phy_connected[FSL_IMX7_NUM_ETHS];
34
+ dma_addr_t addr, strtab_base;
24
};
35
uint32_t log2size;
25
36
+ int strtab_size_shift;
26
enum FslIMX7MemoryMap {
37
int ret;
27
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
38
28
index XXXXXXX..XXXXXXX 100644
39
trace_smmuv3_find_ste(sid, s->features, s->sid_split);
29
--- a/hw/arm/fsl-imx7.c
40
@@ -XXX,XX +XXX,XX @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
30
+++ b/hw/arm/fsl-imx7.c
41
}
31
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
42
if (s->features & SMMU_FEATURE_2LVL_STE) {
32
43
int l1_ste_offset, l2_ste_offset, max_l2_ste, span;
33
/*
44
- dma_addr_t strtab_base, l1ptr, l2ptr;
34
* Ethernet
45
+ dma_addr_t l1ptr, l2ptr;
35
+ *
46
STEDesc l1std;
36
+ * We must use two loops since phy_connected affects the other interface
47
37
+ * and we have to set all properties before calling sysbus_realize().
48
- strtab_base = s->strtab_base & SMMU_BASE_ADDR_MASK;
38
*/
39
+ for (i = 0; i < FSL_IMX7_NUM_ETHS; i++) {
40
+ object_property_set_bool(OBJECT(&s->eth[i]), "phy-connected",
41
+ s->phy_connected[i], &error_abort);
49
+ /*
42
+ /*
50
+ * Align strtab base address to table size. For this purpose, assume it
43
+ * If the MDIO bus on this controller is not connected, assume the
51
+ * is not bounded by SMMU_IDR1_SIDSIZE.
44
+ * other controller provides support for it.
52
+ */
45
+ */
53
+ strtab_size_shift = MAX(5, (int)log2size - s->sid_split - 1 + 3);
46
+ if (!s->phy_connected[i]) {
54
+ strtab_base = s->strtab_base & SMMU_BASE_ADDR_MASK &
47
+ object_property_set_link(OBJECT(&s->eth[1 - i]), "phy-consumer",
55
+ ~MAKE_64BIT_MASK(0, strtab_size_shift);
48
+ OBJECT(&s->eth[i]), &error_abort);
56
l1_ste_offset = sid >> s->sid_split;
49
+ }
57
l2_ste_offset = sid & ((1 << s->sid_split) - 1);
50
+ }
58
l1ptr = (dma_addr_t)(strtab_base + l1_ste_offset * sizeof(l1std));
51
+
59
@@ -XXX,XX +XXX,XX @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
52
for (i = 0; i < FSL_IMX7_NUM_ETHS; i++) {
60
}
53
static const hwaddr FSL_IMX7_ENETn_ADDR[FSL_IMX7_NUM_ETHS] = {
61
addr = l2ptr + l2_ste_offset * sizeof(*ste);
54
FSL_IMX7_ENET1_ADDR,
62
} else {
55
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
63
- addr = (s->strtab_base & SMMU_BASE_ADDR_MASK) + sid * sizeof(*ste);
56
static Property fsl_imx7_properties[] = {
64
+ strtab_size_shift = log2size + 5;
57
DEFINE_PROP_UINT32("fec1-phy-num", FslIMX7State, phy_num[0], 0),
65
+ strtab_base = s->strtab_base & SMMU_BASE_ADDR_MASK &
58
DEFINE_PROP_UINT32("fec2-phy-num", FslIMX7State, phy_num[1], 1),
66
+ ~MAKE_64BIT_MASK(0, strtab_size_shift);
59
+ DEFINE_PROP_BOOL("fec1-phy-connected", FslIMX7State, phy_connected[0],
67
+ addr = strtab_base + sid * sizeof(*ste);
60
+ true),
68
}
61
+ DEFINE_PROP_BOOL("fec2-phy-connected", FslIMX7State, phy_connected[1],
69
62
+ true),
70
if (smmu_get_ste(s, addr, ste, event)) {
63
DEFINE_PROP_END_OF_LIST(),
64
};
65
71
--
66
--
72
2.20.1
67
2.34.1
73
74
diff view generated by jsdifflib
1
From: Simon Veith <sveith@amazon.de>
1
From: Guenter Roeck <linux@roeck-us.net>
2
2
3
When checking whether a stream ID is in range of the stream table, we
3
On mcimx7d-sabre, the MDIO bus is connected to the first Ethernet
4
have so far been only checking it against our implementation limit
4
interface. Set fec2-phy-connected to false to reflect this.
5
(SMMU_IDR1_SIDSIZE). However, the guest can program the
6
STRTAB_BASE_CFG.LOG2SIZE field to a size that is smaller than this
7
limit.
8
5
9
Check the stream ID against this limit as well to match the hardware
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
10
behavior of raising C_BAD_STREAMID events in case the limit is exceeded.
7
Message-id: 20230315145248.1639364-6-linux@roeck-us.net
11
Also, ensure that we do not go one entry beyond the end of the table by
12
checking that its index is strictly smaller than the table size.
13
14
ref. ARM IHI 0070C, section 6.3.24.
15
16
Signed-off-by: Simon Veith <sveith@amazon.de>
17
Acked-by: Eric Auger <eric.auger@redhat.com>
18
Tested-by: Eric Auger <eric.auger@redhat.com>
19
Message-id: 1576509312-13083-4-git-send-email-sveith@amazon.de
20
Cc: Eric Auger <eric.auger@redhat.com>
21
Cc: qemu-devel@nongnu.org
22
Cc: qemu-arm@nongnu.org
23
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
10
---
26
hw/arm/smmuv3.c | 8 ++++++--
11
hw/arm/mcimx7d-sabre.c | 2 ++
27
1 file changed, 6 insertions(+), 2 deletions(-)
12
1 file changed, 2 insertions(+)
28
13
29
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
14
diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
30
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/arm/smmuv3.c
16
--- a/hw/arm/mcimx7d-sabre.c
32
+++ b/hw/arm/smmuv3.c
17
+++ b/hw/arm/mcimx7d-sabre.c
33
@@ -XXX,XX +XXX,XX @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
18
@@ -XXX,XX +XXX,XX @@ static void mcimx7d_sabre_init(MachineState *machine)
34
SMMUEventInfo *event)
19
35
{
20
s = FSL_IMX7(object_new(TYPE_FSL_IMX7));
36
dma_addr_t addr;
21
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
37
+ uint32_t log2size;
22
+ object_property_set_bool(OBJECT(s), "fec2-phy-connected", false,
38
int ret;
23
+ &error_fatal);
39
24
qdev_realize(DEVICE(s), NULL, &error_fatal);
40
trace_smmuv3_find_ste(sid, s->features, s->sid_split);
25
41
- /* Check SID range */
26
memory_region_add_subregion(get_system_memory(), FSL_IMX7_MMDC_ADDR,
42
- if (sid > (1 << SMMU_IDR1_SIDSIZE)) {
43
+ log2size = FIELD_EX32(s->strtab_base_cfg, STRTAB_BASE_CFG, LOG2SIZE);
44
+ /*
45
+ * Check SID range against both guest-configured and implementation limits
46
+ */
47
+ if (sid >= (1 << MIN(log2size, SMMU_IDR1_SIDSIZE))) {
48
event->type = SMMU_EVT_C_BAD_STREAMID;
49
return -EINVAL;
50
}
51
--
27
--
52
2.20.1
28
2.34.1
53
54
diff view generated by jsdifflib