1
Some arm patches; my to-review queue is by no means empty, but
1
I might squeeze in another pullreq before softfreeze, but the
2
this is a big enough set of patches to be getting on with...
2
queue was already big enough that I wanted to send this lot out now.
3
3
4
-- PMM
4
-- PMM
5
5
6
The following changes since commit cb9c6a8e5ad6a1f0ce164d352e3102df46986e22:
6
The following changes since commit 4abf70a661a5df3886ac9d7c19c3617fa92b922a:
7
7
8
.gitlab-ci.d/windows: Work-around timeout and OpenGL problems of the MSYS2 jobs (2023-01-04 18:58:33 +0000)
8
Merge remote-tracking branch 'remotes/maxreitz/tags/pull-block-2020-06-24' into staging (2020-07-03 15:34:45 +0100)
9
9
10
are available in the Git repository at:
10
are available in the Git repository at:
11
11
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230105
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200703
13
13
14
for you to fetch changes up to 93c9678de9dc7d2e68f9e8477da072bac30ef132:
14
for you to fetch changes up to 0f10bf84a9d489259a5b11c6aa1b05c1175b76ea:
15
15
16
hw/net: Fix read of uninitialized memory in imx_fec. (2023-01-05 15:33:00 +0000)
16
Deprecate TileGX port (2020-07-03 16:59:46 +0100)
17
17
18
----------------------------------------------------------------
18
----------------------------------------------------------------
19
target-arm queue:
19
target-arm queue:
20
* Implement AArch32 ARMv8-R support
20
* i.MX6UL EVK board: put PHYs in the correct places
21
* Add Cortex-R52 CPU
21
* hw/arm/virt: Let the virtio-iommu bypass MSIs
22
* fix handling of HLT semihosting in system mode
22
* target/arm: kvm: Handle DABT with no valid ISS
23
* hw/timer/ixm_epit: cleanup and fix bug in compare handling
23
* hw/arm/virt-acpi-build: Only expose flash on older machine types
24
* target/arm: Coding style fixes
24
* target/arm: Fix temp double-free in sve ldr/str
25
* target/arm: Clean up includes
25
* hw/display/bcm2835_fb.c: Initialize all fields of struct
26
* nseries: minor code cleanups
26
* hw/arm/spitz: Code cleanup to fix Coverity-detected memory leak
27
* target/arm: align exposed ID registers with Linux
27
* Deprecate TileGX port
28
* hw/arm/smmu-common: remove unnecessary inlines
29
* i.MX7D: Handle GPT timers
30
* i.MX7D: Connect IRQs to GPIO devices
31
* i.MX6UL: Add a specific GPT timer instance
32
* hw/net: Fix read of uninitialized memory in imx_fec
33
28
34
----------------------------------------------------------------
29
----------------------------------------------------------------
35
Alex Bennée (1):
30
Andrew Jones (4):
36
target/arm: fix handling of HLT semihosting in system mode
31
tests/acpi: remove stale allowed tables
32
tests/acpi: virt: allow DSDT acpi table changes
33
hw/arm/virt-acpi-build: Only expose flash on older machine types
34
tests/acpi: virt: update golden masters for DSDT
37
35
38
Axel Heider (8):
36
Beata Michalska (2):
39
hw/timer/imx_epit: improve comments
37
target/arm: kvm: Handle DABT with no valid ISS
40
hw/timer/imx_epit: cleanup CR defines
38
target/arm: kvm: Handle misconfigured dabt injection
41
hw/timer/imx_epit: define SR_OCIF
42
hw/timer/imx_epit: update interrupt state on CR write access
43
hw/timer/imx_epit: hard reset initializes CR with 0
44
hw/timer/imx_epit: factor out register write handlers
45
hw/timer/imx_epit: remove explicit fields cnt and freq
46
hw/timer/imx_epit: fix compare timer handling
47
39
48
Claudio Fontana (1):
40
Eric Auger (5):
49
target/arm: cleanup cpu includes
41
qdev: Introduce DEFINE_PROP_RESERVED_REGION
42
virtio-iommu: Implement RESV_MEM probe request
43
virtio-iommu: Handle reserved regions in the translation process
44
virtio-iommu-pci: Add array of Interval properties
45
hw/arm/virt: Let the virtio-iommu bypass MSIs
50
46
51
Fabiano Rosas (5):
47
Jean-Christophe Dubois (3):
52
target/arm: Fix checkpatch comment style warnings in helper.c
48
Add a phy-num property to the i.MX FEC emulator
53
target/arm: Fix checkpatch space errors in helper.c
49
Add the ability to select a different PHY for each i.MX6UL FEC interface
54
target/arm: Fix checkpatch brace errors in helper.c
50
Select MDIO device 2 and 1 as PHY devices for i.MX6UL EVK board.
55
target/arm: Remove unused includes from m_helper.c
56
target/arm: Remove unused includes from helper.c
57
51
58
Jean-Christophe Dubois (4):
52
Peter Maydell (19):
59
i.MX7D: Connect GPT timers to IRQ
53
hw/display/bcm2835_fb.c: Initialize all fields of struct
60
i.MX7D: Compute clock frequency for the fixed frequency clocks.
54
hw/arm/spitz: Detabify
61
i.MX6UL: Add a specific GPT timer instance for the i.MX6UL
55
hw/arm/spitz: Create SpitzMachineClass abstract base class
62
i.MX7D: Connect IRQs to GPIO devices.
56
hw/arm/spitz: Keep pointers to MPU and SSI devices in SpitzMachineState
57
hw/arm/spitz: Keep pointers to scp0, scp1 in SpitzMachineState
58
hw/arm/spitz: Implement inbound GPIO lines for bit5 and power signals
59
hw/misc/max111x: provide QOM properties for setting initial values
60
hw/misc/max111x: Don't use vmstate_register()
61
ssi: Add ssi_realize_and_unref()
62
hw/arm/spitz: Use max111x properties to set initial values
63
hw/misc/max111x: Use GPIO lines rather than max111x_set_input()
64
hw/misc/max111x: Create header file for documentation, TYPE_ macros
65
hw/arm/spitz: Encapsulate misc GPIO handling in a device
66
hw/gpio/zaurus.c: Use LOG_GUEST_ERROR for bad guest register accesses
67
hw/arm/spitz: Use LOG_GUEST_ERROR for bad guest register accesses
68
hw/arm/pxa2xx_pic: Use LOG_GUEST_ERROR for bad guest register accesses
69
hw/arm/spitz: Provide usual QOM macros for corgi-ssp and spitz-lcdtg
70
Replace uses of FROM_SSI_SLAVE() macro with QOM casts
71
Deprecate TileGX port
63
72
64
Peter Maydell (1):
73
Richard Henderson (1):
65
target/arm:Set lg_page_size to 0 if either S1 or S2 asks for it
74
target/arm: Fix temp double-free in sve ldr/str
66
75
67
Philippe Mathieu-Daudé (5):
76
docs/system/deprecated.rst | 11 +
68
hw/input/tsc2xxx: Constify set_transform()'s MouseTransformInfo arg
77
include/exec/memory.h | 6 +
69
hw/arm/nseries: Constify various read-only arrays
78
include/hw/arm/fsl-imx6ul.h | 2 +
70
hw/arm/nseries: Silent -Wmissing-field-initializers warning
79
include/hw/arm/pxa.h | 1 -
71
hw/arm/smmu-common: Reduce smmu_inv_notifiers_mr() scope
80
include/hw/arm/sharpsl.h | 3 -
72
hw/arm/smmu-common: Avoid using inlined functions with external linkage
81
include/hw/arm/virt.h | 8 +
82
include/hw/misc/max111x.h | 56 +++
83
include/hw/net/imx_fec.h | 1 +
84
include/hw/qdev-properties.h | 3 +
85
include/hw/ssi/ssi.h | 31 +-
86
include/hw/virtio/virtio-iommu.h | 2 +
87
include/qemu/typedefs.h | 1 +
88
target/arm/cpu.h | 2 +
89
target/arm/kvm_arm.h | 10 +
90
target/arm/translate-a64.h | 1 +
91
tests/qtest/bios-tables-test-allowed-diff.h | 18 -
92
hw/arm/fsl-imx6ul.c | 10 +
93
hw/arm/mcimx6ul-evk.c | 2 +
94
hw/arm/pxa2xx_pic.c | 9 +-
95
hw/arm/spitz.c | 507 ++++++++++++++++------------
96
hw/arm/virt-acpi-build.c | 5 +-
97
hw/arm/virt.c | 33 ++
98
hw/arm/z2.c | 11 +-
99
hw/core/qdev-properties.c | 89 +++++
100
hw/display/ads7846.c | 9 +-
101
hw/display/bcm2835_fb.c | 4 +
102
hw/display/ssd0323.c | 10 +-
103
hw/gpio/zaurus.c | 12 +-
104
hw/misc/max111x.c | 86 +++--
105
hw/net/imx_fec.c | 24 +-
106
hw/sd/ssi-sd.c | 4 +-
107
hw/ssi/ssi.c | 7 +-
108
hw/virtio/virtio-iommu-pci.c | 11 +
109
hw/virtio/virtio-iommu.c | 114 ++++++-
110
target/arm/kvm.c | 80 +++++
111
target/arm/kvm32.c | 34 ++
112
target/arm/kvm64.c | 49 +++
113
target/arm/translate-a64.c | 6 +
114
target/arm/translate-sve.c | 8 +-
115
MAINTAINERS | 1 +
116
hw/net/trace-events | 4 +-
117
hw/virtio/trace-events | 1 +
118
tests/data/acpi/virt/DSDT | Bin 5307 -> 5205 bytes
119
tests/data/acpi/virt/DSDT.memhp | Bin 6668 -> 6566 bytes
120
tests/data/acpi/virt/DSDT.numamem | Bin 5307 -> 5205 bytes
121
45 files changed, 974 insertions(+), 312 deletions(-)
122
create mode 100644 include/hw/misc/max111x.h
73
123
74
Stephen Longfield (1):
75
hw/net: Fix read of uninitialized memory in imx_fec.
76
77
Tobias Röhmel (7):
78
target/arm: Don't add all MIDR aliases for cores that implement PMSA
79
target/arm: Make RVBAR available for all ARMv8 CPUs
80
target/arm: Make stage_2_format for cache attributes optional
81
target/arm: Enable TTBCR_EAE for ARMv8-R AArch32
82
target/arm: Add PMSAv8r registers
83
target/arm: Add PMSAv8r functionality
84
target/arm: Add ARM Cortex-R52 CPU
85
86
Zhuojia Shen (1):
87
target/arm: align exposed ID registers with Linux
88
89
include/hw/arm/fsl-imx7.h | 20 +
90
include/hw/arm/smmu-common.h | 3 -
91
include/hw/input/tsc2xxx.h | 4 +-
92
include/hw/timer/imx_epit.h | 8 +-
93
include/hw/timer/imx_gpt.h | 1 +
94
target/arm/cpu.h | 6 +
95
target/arm/internals.h | 4 +
96
hw/arm/fsl-imx6ul.c | 2 +-
97
hw/arm/fsl-imx7.c | 41 +-
98
hw/arm/nseries.c | 28 +-
99
hw/arm/smmu-common.c | 15 +-
100
hw/input/tsc2005.c | 2 +-
101
hw/input/tsc210x.c | 3 +-
102
hw/misc/imx6ul_ccm.c | 6 -
103
hw/misc/imx7_ccm.c | 49 ++-
104
hw/net/imx_fec.c | 8 +-
105
hw/timer/imx_epit.c | 376 +++++++++-------
106
hw/timer/imx_gpt.c | 25 ++
107
target/arm/cpu.c | 35 +-
108
target/arm/cpu64.c | 6 -
109
target/arm/cpu_tcg.c | 42 ++
110
target/arm/debug_helper.c | 3 +
111
target/arm/helper.c | 871 +++++++++++++++++++++++++++++---------
112
target/arm/m_helper.c | 16 -
113
target/arm/machine.c | 28 ++
114
target/arm/ptw.c | 152 +++++--
115
target/arm/tlb_helper.c | 4 +
116
target/arm/translate.c | 2 +-
117
tests/tcg/aarch64/sysregs.c | 24 +-
118
tests/tcg/aarch64/Makefile.target | 7 +-
119
30 files changed, 1330 insertions(+), 461 deletions(-)
120
diff view generated by jsdifflib
1
From: Stephen Longfield <slongfield@google.com>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
Size is used at lines 1088/1188 for the loop, which reads the last 4
3
We need a solution to use an Ethernet PHY that is not the first device
4
bytes from the crc_ptr so it does need to get increased, however it
4
on the MDIO bus (device 0 on MDIO bus).
5
shouldn't be increased before the buffer is passed to CRC computation,
6
or the crc32 function will access uninitialized memory.
7
5
8
This was pointed out to me by clg@kaod.org during the code review of
6
As an example with the i.MX6UL the NXP SOC has 2 Ethernet devices but
9
a similar patch to hw/net/ftgmac100.c
7
only one MDIO bus on which the 2 related PHY are connected but at unique
8
addresses.
10
9
11
Change-Id: Ib0464303b191af1e28abeb2f5105eb25aadb5e9b
10
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
12
Signed-off-by: Stephen Longfield <slongfield@google.com>
11
Message-id: a1a5c0e139d1c763194b8020573dcb6025daeefa.1593296112.git.jcd@tribudubois.net
13
Reviewed-by: Patrick Venture <venture@google.com>
14
Message-id: 20221221183202.3788132-1-slongfield@google.com
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
14
---
18
hw/net/imx_fec.c | 8 ++++----
15
include/hw/net/imx_fec.h | 1 +
19
1 file changed, 4 insertions(+), 4 deletions(-)
16
hw/net/imx_fec.c | 24 +++++++++++++++++-------
17
hw/net/trace-events | 4 ++--
18
3 files changed, 20 insertions(+), 9 deletions(-)
20
19
20
diff --git a/include/hw/net/imx_fec.h b/include/hw/net/imx_fec.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/net/imx_fec.h
23
+++ b/include/hw/net/imx_fec.h
24
@@ -XXX,XX +XXX,XX @@ typedef struct IMXFECState {
25
uint32_t phy_advertise;
26
uint32_t phy_int;
27
uint32_t phy_int_mask;
28
+ uint32_t phy_num;
29
30
bool is_fec;
31
21
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
32
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
22
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/net/imx_fec.c
34
--- a/hw/net/imx_fec.c
24
+++ b/hw/net/imx_fec.c
35
+++ b/hw/net/imx_fec.c
25
@@ -XXX,XX +XXX,XX @@ static ssize_t imx_fec_receive(NetClientState *nc, const uint8_t *buf,
36
@@ -XXX,XX +XXX,XX @@ static void imx_phy_reset(IMXFECState *s)
37
static uint32_t imx_phy_read(IMXFECState *s, int reg)
38
{
39
uint32_t val;
40
+ uint32_t phy = reg / 32;
41
42
- if (reg > 31) {
43
- /* we only advertise one phy */
44
+ if (phy != s->phy_num) {
45
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s.phy]%s: Bad phy num %u\n",
46
+ TYPE_IMX_FEC, __func__, phy);
26
return 0;
47
return 0;
27
}
48
}
28
49
29
- /* 4 bytes for the CRC. */
50
+ reg %= 32;
30
- size += 4;
51
+
31
crc = cpu_to_be32(crc32(~0, buf, size));
52
switch (reg) {
32
+ /* Increase size by 4, loop below reads the last 4 bytes from crc_ptr. */
53
case 0: /* Basic Control */
33
+ size += 4;
54
val = s->phy_control;
34
crc_ptr = (uint8_t *) &crc;
55
@@ -XXX,XX +XXX,XX @@ static uint32_t imx_phy_read(IMXFECState *s, int reg)
35
56
break;
36
/* Huge frames are truncated. */
37
@@ -XXX,XX +XXX,XX @@ static ssize_t imx_enet_receive(NetClientState *nc, const uint8_t *buf,
38
return 0;
39
}
57
}
40
58
41
- /* 4 bytes for the CRC. */
59
- trace_imx_phy_read(val, reg);
42
- size += 4;
60
+ trace_imx_phy_read(val, phy, reg);
43
crc = cpu_to_be32(crc32(~0, buf, size));
61
44
+ /* Increase size by 4, loop below reads the last 4 bytes from crc_ptr. */
62
return val;
45
+ size += 4;
63
}
46
crc_ptr = (uint8_t *) &crc;
64
47
65
static void imx_phy_write(IMXFECState *s, int reg, uint32_t val)
48
if (shift16) {
66
{
67
- trace_imx_phy_write(val, reg);
68
+ uint32_t phy = reg / 32;
69
70
- if (reg > 31) {
71
- /* we only advertise one phy */
72
+ if (phy != s->phy_num) {
73
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s.phy]%s: Bad phy num %u\n",
74
+ TYPE_IMX_FEC, __func__, phy);
75
return;
76
}
77
78
+ reg %= 32;
79
+
80
+ trace_imx_phy_write(val, phy, reg);
81
+
82
switch (reg) {
83
case 0: /* Basic Control */
84
if (val & 0x8000) {
85
@@ -XXX,XX +XXX,XX @@ static void imx_eth_write(void *opaque, hwaddr offset, uint64_t value,
86
extract32(value,
87
18, 10)));
88
} else {
89
- /* This a write operation */
90
+ /* This is a write operation */
91
imx_phy_write(s, extract32(value, 18, 10), extract32(value, 0, 16));
92
}
93
/* raise the interrupt as the PHY operation is done */
94
@@ -XXX,XX +XXX,XX @@ static void imx_eth_realize(DeviceState *dev, Error **errp)
95
static Property imx_eth_properties[] = {
96
DEFINE_NIC_PROPERTIES(IMXFECState, conf),
97
DEFINE_PROP_UINT32("tx-ring-num", IMXFECState, tx_ring_num, 1),
98
+ DEFINE_PROP_UINT32("phy-num", IMXFECState, phy_num, 0),
99
DEFINE_PROP_END_OF_LIST(),
100
};
101
102
diff --git a/hw/net/trace-events b/hw/net/trace-events
103
index XXXXXXX..XXXXXXX 100644
104
--- a/hw/net/trace-events
105
+++ b/hw/net/trace-events
106
@@ -XXX,XX +XXX,XX @@ i82596_set_multicast(uint16_t count) "Added %d multicast entries"
107
i82596_channel_attention(void *s) "%p: Received CHANNEL ATTENTION"
108
109
# imx_fec.c
110
-imx_phy_read(uint32_t val, int reg) "0x%04"PRIx32" <= reg[%d]"
111
-imx_phy_write(uint32_t val, int reg) "0x%04"PRIx32" => reg[%d]"
112
+imx_phy_read(uint32_t val, int phy, int reg) "0x%04"PRIx32" <= phy[%d].reg[%d]"
113
+imx_phy_write(uint32_t val, int phy, int reg) "0x%04"PRIx32" => phy[%d].reg[%d]"
114
imx_phy_update_link(const char *s) "%s"
115
imx_phy_reset(void) ""
116
imx_fec_read_bd(uint64_t addr, int flags, int len, int data) "tx_bd 0x%"PRIx64" flags 0x%04x len %d data 0x%08x"
49
--
117
--
50
2.25.1
118
2.20.1
119
120
diff view generated by jsdifflib
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
IRQs were not associated to the various GPIO devices inside i.MX7D.
3
Add properties to the i.MX6UL processor to be able to select a
4
This patch brings the i.MX7D on par with i.MX6.
4
particular PHY on the MDIO bus for each FEC device.
5
5
6
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
6
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
7
Message-id: 20221226101418.415170-1-jcd@tribudubois.net
7
Message-id: ea1d604198b6b73ea6521676e45bacfc597aba53.1593296112.git.jcd@tribudubois.net
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
include/hw/arm/fsl-imx7.h | 15 +++++++++++++++
11
include/hw/arm/fsl-imx6ul.h | 2 ++
12
hw/arm/fsl-imx7.c | 31 ++++++++++++++++++++++++++++++-
12
hw/arm/fsl-imx6ul.c | 10 ++++++++++
13
2 files changed, 45 insertions(+), 1 deletion(-)
13
2 files changed, 12 insertions(+)
14
14
15
diff --git a/include/hw/arm/fsl-imx7.h b/include/hw/arm/fsl-imx7.h
15
diff --git a/include/hw/arm/fsl-imx6ul.h b/include/hw/arm/fsl-imx6ul.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/fsl-imx7.h
17
--- a/include/hw/arm/fsl-imx6ul.h
18
+++ b/include/hw/arm/fsl-imx7.h
18
+++ b/include/hw/arm/fsl-imx6ul.h
19
@@ -XXX,XX +XXX,XX @@ enum FslIMX7IRQs {
19
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6ULState {
20
FSL_IMX7_GPT3_IRQ = 53,
20
MemoryRegion caam;
21
FSL_IMX7_GPT4_IRQ = 52,
21
MemoryRegion ocram;
22
22
MemoryRegion ocram_alias;
23
+ FSL_IMX7_GPIO1_LOW_IRQ = 64,
24
+ FSL_IMX7_GPIO1_HIGH_IRQ = 65,
25
+ FSL_IMX7_GPIO2_LOW_IRQ = 66,
26
+ FSL_IMX7_GPIO2_HIGH_IRQ = 67,
27
+ FSL_IMX7_GPIO3_LOW_IRQ = 68,
28
+ FSL_IMX7_GPIO3_HIGH_IRQ = 69,
29
+ FSL_IMX7_GPIO4_LOW_IRQ = 70,
30
+ FSL_IMX7_GPIO4_HIGH_IRQ = 71,
31
+ FSL_IMX7_GPIO5_LOW_IRQ = 72,
32
+ FSL_IMX7_GPIO5_HIGH_IRQ = 73,
33
+ FSL_IMX7_GPIO6_LOW_IRQ = 74,
34
+ FSL_IMX7_GPIO6_HIGH_IRQ = 75,
35
+ FSL_IMX7_GPIO7_LOW_IRQ = 76,
36
+ FSL_IMX7_GPIO7_HIGH_IRQ = 77,
37
+
23
+
38
FSL_IMX7_WDOG1_IRQ = 78,
24
+ uint32_t phy_num[FSL_IMX6UL_NUM_ETHS];
39
FSL_IMX7_WDOG2_IRQ = 79,
25
} FslIMX6ULState;
40
FSL_IMX7_WDOG3_IRQ = 10,
26
41
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
27
enum FslIMX6ULMemoryMap {
28
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
42
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
43
--- a/hw/arm/fsl-imx7.c
30
--- a/hw/arm/fsl-imx6ul.c
44
+++ b/hw/arm/fsl-imx7.c
31
+++ b/hw/arm/fsl-imx6ul.c
45
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
32
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
46
FSL_IMX7_GPIO7_ADDR,
33
FSL_IMX6UL_ENET2_TIMER_IRQ,
47
};
34
};
48
35
49
+ static const int FSL_IMX7_GPIOn_LOW_IRQ[FSL_IMX7_NUM_GPIOS] = {
36
+ object_property_set_uint(OBJECT(&s->eth[i]),
50
+ FSL_IMX7_GPIO1_LOW_IRQ,
37
+ s->phy_num[i],
51
+ FSL_IMX7_GPIO2_LOW_IRQ,
38
+ "phy-num", &error_abort);
52
+ FSL_IMX7_GPIO3_LOW_IRQ,
39
object_property_set_uint(OBJECT(&s->eth[i]),
53
+ FSL_IMX7_GPIO4_LOW_IRQ,
40
FSL_IMX6UL_ETH_NUM_TX_RINGS,
54
+ FSL_IMX7_GPIO5_LOW_IRQ,
41
"tx-ring-num", &error_abort);
55
+ FSL_IMX7_GPIO6_LOW_IRQ,
42
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
56
+ FSL_IMX7_GPIO7_LOW_IRQ,
43
FSL_IMX6UL_OCRAM_ALIAS_ADDR, &s->ocram_alias);
57
+ };
44
}
45
46
+static Property fsl_imx6ul_properties[] = {
47
+ DEFINE_PROP_UINT32("fec1-phy-num", FslIMX6ULState, phy_num[0], 0),
48
+ DEFINE_PROP_UINT32("fec2-phy-num", FslIMX6ULState, phy_num[1], 1),
49
+ DEFINE_PROP_END_OF_LIST(),
50
+};
58
+
51
+
59
+ static const int FSL_IMX7_GPIOn_HIGH_IRQ[FSL_IMX7_NUM_GPIOS] = {
52
static void fsl_imx6ul_class_init(ObjectClass *oc, void *data)
60
+ FSL_IMX7_GPIO1_HIGH_IRQ,
53
{
61
+ FSL_IMX7_GPIO2_HIGH_IRQ,
54
DeviceClass *dc = DEVICE_CLASS(oc);
62
+ FSL_IMX7_GPIO3_HIGH_IRQ,
55
63
+ FSL_IMX7_GPIO4_HIGH_IRQ,
56
+ device_class_set_props(dc, fsl_imx6ul_properties);
64
+ FSL_IMX7_GPIO5_HIGH_IRQ,
57
dc->realize = fsl_imx6ul_realize;
65
+ FSL_IMX7_GPIO6_HIGH_IRQ,
58
dc->desc = "i.MX6UL SOC";
66
+ FSL_IMX7_GPIO7_HIGH_IRQ,
59
/* Reason: Uses serial_hds and nd_table in realize() directly */
67
+ };
68
+
69
sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &error_abort);
70
- sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, FSL_IMX7_GPIOn_ADDR[i]);
71
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0,
72
+ FSL_IMX7_GPIOn_ADDR[i]);
73
+
74
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0,
75
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
76
+ FSL_IMX7_GPIOn_LOW_IRQ[i]));
77
+
78
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 1,
79
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
80
+ FSL_IMX7_GPIOn_HIGH_IRQ[i]));
81
}
82
83
/*
84
--
60
--
85
2.25.1
61
2.20.1
62
63
diff view generated by jsdifflib
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
So far the GPT timers were unable to raise IRQs to the processor.
3
The i.MX6UL EVK 14x14 board uses:
4
- PHY 2 for FEC 1
5
- PHY 1 for FEC 2
4
6
5
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
7
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
8
Message-id: fb41992126c091a71d76ab3d1898959091f60583.1593296112.git.jcd@tribudubois.net
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
11
---
9
include/hw/arm/fsl-imx7.h | 5 +++++
12
hw/arm/mcimx6ul-evk.c | 2 ++
10
hw/arm/fsl-imx7.c | 10 ++++++++++
13
1 file changed, 2 insertions(+)
11
2 files changed, 15 insertions(+)
12
14
13
diff --git a/include/hw/arm/fsl-imx7.h b/include/hw/arm/fsl-imx7.h
15
diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/arm/fsl-imx7.h
17
--- a/hw/arm/mcimx6ul-evk.c
16
+++ b/include/hw/arm/fsl-imx7.h
18
+++ b/hw/arm/mcimx6ul-evk.c
17
@@ -XXX,XX +XXX,XX @@ enum FslIMX7IRQs {
19
@@ -XXX,XX +XXX,XX @@ static void mcimx6ul_evk_init(MachineState *machine)
18
FSL_IMX7_USB2_IRQ = 42,
20
19
FSL_IMX7_USB3_IRQ = 40,
21
s = FSL_IMX6UL(object_new(TYPE_FSL_IMX6UL));
20
22
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
21
+ FSL_IMX7_GPT1_IRQ = 55,
23
+ object_property_set_uint(OBJECT(s), 2, "fec1-phy-num", &error_fatal);
22
+ FSL_IMX7_GPT2_IRQ = 54,
24
+ object_property_set_uint(OBJECT(s), 1, "fec2-phy-num", &error_fatal);
23
+ FSL_IMX7_GPT3_IRQ = 53,
25
qdev_realize(DEVICE(s), NULL, &error_fatal);
24
+ FSL_IMX7_GPT4_IRQ = 52,
26
25
+
27
memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
26
FSL_IMX7_WDOG1_IRQ = 78,
27
FSL_IMX7_WDOG2_IRQ = 79,
28
FSL_IMX7_WDOG3_IRQ = 10,
29
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/arm/fsl-imx7.c
32
+++ b/hw/arm/fsl-imx7.c
33
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
34
FSL_IMX7_GPT4_ADDR,
35
};
36
37
+ static const int FSL_IMX7_GPTn_IRQ[FSL_IMX7_NUM_GPTS] = {
38
+ FSL_IMX7_GPT1_IRQ,
39
+ FSL_IMX7_GPT2_IRQ,
40
+ FSL_IMX7_GPT3_IRQ,
41
+ FSL_IMX7_GPT4_IRQ,
42
+ };
43
+
44
s->gpt[i].ccm = IMX_CCM(&s->ccm);
45
sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), &error_abort);
46
sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt[i]), 0, FSL_IMX7_GPTn_ADDR[i]);
47
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpt[i]), 0,
48
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
49
+ FSL_IMX7_GPTn_IRQ[i]));
50
}
51
52
for (i = 0; i < FSL_IMX7_NUM_GPIOS; i++) {
53
--
28
--
54
2.25.1
29
2.20.1
30
31
diff view generated by jsdifflib
1
From: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Signed-off-by: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
3
Introduce a new property defining a reserved region:
4
Message-id: 20221206102504.165775-6-tobias.roehmel@rwth-aachen.de
4
<low address>:<high address>:<type>.
5
6
This will be used to encode reserved IOVA regions.
7
8
For instance, in virtio-iommu use case, reserved IOVA regions
9
will be passed by the machine code to the virtio-iommu-pci
10
device (an array of those). The type of the reserved region
11
will match the virtio_iommu_probe_resv_mem subtype value:
12
- VIRTIO_IOMMU_RESV_MEM_T_RESERVED (0)
13
- VIRTIO_IOMMU_RESV_MEM_T_MSI (1)
14
15
on PC/Q35 machine, this will be used to inform the
16
virtio-iommu-pci device it should bypass the MSI region.
17
The reserved region will be: 0xfee00000:0xfeefffff:1.
18
19
On ARM, we can declare the ITS MSI doorbell as an MSI
20
region to prevent MSIs from being mapped on guest side.
21
22
Signed-off-by: Eric Auger <eric.auger@redhat.com>
23
Reviewed-by: Markus Armbruster <armbru@redhat.com>
24
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
25
Message-id: 20200629070404.10969-2-eric.auger@redhat.com
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
27
---
7
target/arm/cpu.h | 6 +
28
include/exec/memory.h | 6 +++
8
target/arm/cpu.c | 28 +++-
29
include/hw/qdev-properties.h | 3 ++
9
target/arm/helper.c | 302 +++++++++++++++++++++++++++++++++++++++++++
30
include/qemu/typedefs.h | 1 +
10
target/arm/machine.c | 28 ++++
31
hw/core/qdev-properties.c | 89 ++++++++++++++++++++++++++++++++++++
11
4 files changed, 360 insertions(+), 4 deletions(-)
32
4 files changed, 99 insertions(+)
12
33
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
34
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu.h
36
--- a/include/exec/memory.h
16
+++ b/target/arm/cpu.h
37
+++ b/include/exec/memory.h
17
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
38
@@ -XXX,XX +XXX,XX @@ extern bool global_dirty_log;
18
};
39
19
uint64_t sctlr_el[4];
40
typedef struct MemoryRegionOps MemoryRegionOps;
20
};
41
21
+ uint64_t vsctlr; /* Virtualization System control register. */
42
+struct ReservedRegion {
22
uint64_t cpacr_el1; /* Architectural feature access control register */
43
+ hwaddr low;
23
uint64_t cptr_el[4]; /* ARMv8 feature trap registers */
44
+ hwaddr high;
24
uint32_t c1_xscaleauxcr; /* XScale auxiliary control register. */
45
+ unsigned type;
25
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
46
+};
26
*/
47
+
27
uint32_t *rbar[M_REG_NUM_BANKS];
48
typedef struct IOMMUTLBEntry IOMMUTLBEntry;
28
uint32_t *rlar[M_REG_NUM_BANKS];
49
29
+ uint32_t *hprbar;
50
/* See address_space_translate: bit 0 is read, bit 1 is write. */
30
+ uint32_t *hprlar;
51
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
31
uint32_t mair0[M_REG_NUM_BANKS];
32
uint32_t mair1[M_REG_NUM_BANKS];
33
+ uint32_t hprselr;
34
} pmsav8;
35
36
/* v8M SAU */
37
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
38
bool has_mpu;
39
/* PMSAv7 MPU number of supported regions */
40
uint32_t pmsav7_dregion;
41
+ /* PMSAv8 MPU number of supported hyp regions */
42
+ uint32_t pmsav8r_hdregion;
43
/* v8M SAU number of supported regions */
44
uint32_t sau_sregion;
45
46
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
47
index XXXXXXX..XXXXXXX 100644
52
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/cpu.c
53
--- a/include/hw/qdev-properties.h
49
+++ b/target/arm/cpu.c
54
+++ b/include/hw/qdev-properties.h
50
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset_hold(Object *obj)
55
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_string;
51
sizeof(*env->pmsav7.dracr) * cpu->pmsav7_dregion);
56
extern const PropertyInfo qdev_prop_chr;
52
}
57
extern const PropertyInfo qdev_prop_tpm;
53
}
58
extern const PropertyInfo qdev_prop_macaddr;
59
+extern const PropertyInfo qdev_prop_reserved_region;
60
extern const PropertyInfo qdev_prop_on_off_auto;
61
extern const PropertyInfo qdev_prop_multifd_compression;
62
extern const PropertyInfo qdev_prop_losttickpolicy;
63
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_pcie_link_width;
64
DEFINE_PROP(_n, _s, _f, qdev_prop_drive_iothread, BlockBackend *)
65
#define DEFINE_PROP_MACADDR(_n, _s, _f) \
66
DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr)
67
+#define DEFINE_PROP_RESERVED_REGION(_n, _s, _f) \
68
+ DEFINE_PROP(_n, _s, _f, qdev_prop_reserved_region, ReservedRegion)
69
#define DEFINE_PROP_ON_OFF_AUTO(_n, _s, _f, _d) \
70
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto)
71
#define DEFINE_PROP_MULTIFD_COMPRESSION(_n, _s, _f, _d) \
72
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
73
index XXXXXXX..XXXXXXX 100644
74
--- a/include/qemu/typedefs.h
75
+++ b/include/qemu/typedefs.h
76
@@ -XXX,XX +XXX,XX @@ typedef struct ISABus ISABus;
77
typedef struct ISADevice ISADevice;
78
typedef struct IsaDma IsaDma;
79
typedef struct MACAddr MACAddr;
80
+typedef struct ReservedRegion ReservedRegion;
81
typedef struct MachineClass MachineClass;
82
typedef struct MachineState MachineState;
83
typedef struct MemoryListener MemoryListener;
84
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/hw/core/qdev-properties.c
87
+++ b/hw/core/qdev-properties.c
88
@@ -XXX,XX +XXX,XX @@
89
#include "chardev/char.h"
90
#include "qemu/uuid.h"
91
#include "qemu/units.h"
92
+#include "qemu/cutils.h"
93
94
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
95
Error **errp)
96
@@ -XXX,XX +XXX,XX @@ const PropertyInfo qdev_prop_macaddr = {
97
.set = set_mac,
98
};
99
100
+/* --- Reserved Region --- */
54
+
101
+
55
+ if (cpu->pmsav8r_hdregion > 0) {
102
+/*
56
+ memset(env->pmsav8.hprbar, 0,
103
+ * Accepted syntax:
57
+ sizeof(*env->pmsav8.hprbar) * cpu->pmsav8r_hdregion);
104
+ * <low address>:<high address>:<type>
58
+ memset(env->pmsav8.hprlar, 0,
105
+ * where low/high addresses are uint64_t in hexadecimal
59
+ sizeof(*env->pmsav8.hprlar) * cpu->pmsav8r_hdregion);
106
+ * and type is a non-negative decimal integer
60
+ }
107
+ */
108
+static void get_reserved_region(Object *obj, Visitor *v, const char *name,
109
+ void *opaque, Error **errp)
110
+{
111
+ DeviceState *dev = DEVICE(obj);
112
+ Property *prop = opaque;
113
+ ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
114
+ char buffer[64];
115
+ char *p = buffer;
116
+ int rc;
61
+
117
+
62
env->pmsav7.rnr[M_REG_NS] = 0;
118
+ rc = snprintf(buffer, sizeof(buffer), "0x%"PRIx64":0x%"PRIx64":%u",
63
env->pmsav7.rnr[M_REG_S] = 0;
119
+ rr->low, rr->high, rr->type);
64
env->pmsav8.mair0[M_REG_NS] = 0;
120
+ assert(rc < sizeof(buffer));
65
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
66
/* MPU can be configured out of a PMSA CPU either by setting has-mpu
67
* to false or by setting pmsav7-dregion to 0.
68
*/
69
- if (!cpu->has_mpu) {
70
- cpu->pmsav7_dregion = 0;
71
- }
72
- if (cpu->pmsav7_dregion == 0) {
73
+ if (!cpu->has_mpu || cpu->pmsav7_dregion == 0) {
74
cpu->has_mpu = false;
75
+ cpu->pmsav7_dregion = 0;
76
+ cpu->pmsav8r_hdregion = 0;
77
}
78
79
if (arm_feature(env, ARM_FEATURE_PMSA) &&
80
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
81
env->pmsav7.dracr = g_new0(uint32_t, nr);
82
}
83
}
84
+
121
+
85
+ if (cpu->pmsav8r_hdregion > 0xff) {
122
+ visit_type_str(v, name, &p, errp);
86
+ error_setg(errp, "PMSAv8 MPU EL2 #regions invalid %" PRIu32,
87
+ cpu->pmsav8r_hdregion);
88
+ return;
89
+ }
90
+
91
+ if (cpu->pmsav8r_hdregion) {
92
+ env->pmsav8.hprbar = g_new0(uint32_t,
93
+ cpu->pmsav8r_hdregion);
94
+ env->pmsav8.hprlar = g_new0(uint32_t,
95
+ cpu->pmsav8r_hdregion);
96
+ }
97
}
98
99
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
100
diff --git a/target/arm/helper.c b/target/arm/helper.c
101
index XXXXXXX..XXXXXXX 100644
102
--- a/target/arm/helper.c
103
+++ b/target/arm/helper.c
104
@@ -XXX,XX +XXX,XX @@ static void pmsav7_rgnr_write(CPUARMState *env, const ARMCPRegInfo *ri,
105
raw_write(env, ri, value);
106
}
107
108
+static void prbar_write(CPUARMState *env, const ARMCPRegInfo *ri,
109
+ uint64_t value)
110
+{
111
+ ARMCPU *cpu = env_archcpu(env);
112
+
113
+ tlb_flush(CPU(cpu)); /* Mappings may have changed - purge! */
114
+ env->pmsav8.rbar[M_REG_NS][env->pmsav7.rnr[M_REG_NS]] = value;
115
+}
123
+}
116
+
124
+
117
+static uint64_t prbar_read(CPUARMState *env, const ARMCPRegInfo *ri)
125
+static void set_reserved_region(Object *obj, Visitor *v, const char *name,
126
+ void *opaque, Error **errp)
118
+{
127
+{
119
+ return env->pmsav8.rbar[M_REG_NS][env->pmsav7.rnr[M_REG_NS]];
128
+ DeviceState *dev = DEVICE(obj);
120
+}
129
+ Property *prop = opaque;
130
+ ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
131
+ Error *local_err = NULL;
132
+ const char *endptr;
133
+ char *str;
134
+ int ret;
121
+
135
+
122
+static void prlar_write(CPUARMState *env, const ARMCPRegInfo *ri,
136
+ if (dev->realized) {
123
+ uint64_t value)
137
+ qdev_prop_set_after_realize(dev, name, errp);
124
+{
125
+ ARMCPU *cpu = env_archcpu(env);
126
+
127
+ tlb_flush(CPU(cpu)); /* Mappings may have changed - purge! */
128
+ env->pmsav8.rlar[M_REG_NS][env->pmsav7.rnr[M_REG_NS]] = value;
129
+}
130
+
131
+static uint64_t prlar_read(CPUARMState *env, const ARMCPRegInfo *ri)
132
+{
133
+ return env->pmsav8.rlar[M_REG_NS][env->pmsav7.rnr[M_REG_NS]];
134
+}
135
+
136
+static void prselr_write(CPUARMState *env, const ARMCPRegInfo *ri,
137
+ uint64_t value)
138
+{
139
+ ARMCPU *cpu = env_archcpu(env);
140
+
141
+ /*
142
+ * Ignore writes that would select not implemented region.
143
+ * This is architecturally UNPREDICTABLE.
144
+ */
145
+ if (value >= cpu->pmsav7_dregion) {
146
+ return;
138
+ return;
147
+ }
139
+ }
148
+
140
+
149
+ env->pmsav7.rnr[M_REG_NS] = value;
141
+ visit_type_str(v, name, &str, &local_err);
150
+}
142
+ if (local_err) {
151
+
143
+ error_propagate(errp, local_err);
152
+static void hprbar_write(CPUARMState *env, const ARMCPRegInfo *ri,
153
+ uint64_t value)
154
+{
155
+ ARMCPU *cpu = env_archcpu(env);
156
+
157
+ tlb_flush(CPU(cpu)); /* Mappings may have changed - purge! */
158
+ env->pmsav8.hprbar[env->pmsav8.hprselr] = value;
159
+}
160
+
161
+static uint64_t hprbar_read(CPUARMState *env, const ARMCPRegInfo *ri)
162
+{
163
+ return env->pmsav8.hprbar[env->pmsav8.hprselr];
164
+}
165
+
166
+static void hprlar_write(CPUARMState *env, const ARMCPRegInfo *ri,
167
+ uint64_t value)
168
+{
169
+ ARMCPU *cpu = env_archcpu(env);
170
+
171
+ tlb_flush(CPU(cpu)); /* Mappings may have changed - purge! */
172
+ env->pmsav8.hprlar[env->pmsav8.hprselr] = value;
173
+}
174
+
175
+static uint64_t hprlar_read(CPUARMState *env, const ARMCPRegInfo *ri)
176
+{
177
+ return env->pmsav8.hprlar[env->pmsav8.hprselr];
178
+}
179
+
180
+static void hprenr_write(CPUARMState *env, const ARMCPRegInfo *ri,
181
+ uint64_t value)
182
+{
183
+ uint32_t n;
184
+ uint32_t bit;
185
+ ARMCPU *cpu = env_archcpu(env);
186
+
187
+ /* Ignore writes to unimplemented regions */
188
+ int rmax = MIN(cpu->pmsav8r_hdregion, 32);
189
+ value &= MAKE_64BIT_MASK(0, rmax);
190
+
191
+ tlb_flush(CPU(cpu)); /* Mappings may have changed - purge! */
192
+
193
+ /* Register alias is only valid for first 32 indexes */
194
+ for (n = 0; n < rmax; ++n) {
195
+ bit = extract32(value, n, 1);
196
+ env->pmsav8.hprlar[n] = deposit32(
197
+ env->pmsav8.hprlar[n], 0, 1, bit);
198
+ }
199
+}
200
+
201
+static uint64_t hprenr_read(CPUARMState *env, const ARMCPRegInfo *ri)
202
+{
203
+ uint32_t n;
204
+ uint32_t result = 0x0;
205
+ ARMCPU *cpu = env_archcpu(env);
206
+
207
+ /* Register alias is only valid for first 32 indexes */
208
+ for (n = 0; n < MIN(cpu->pmsav8r_hdregion, 32); ++n) {
209
+ if (env->pmsav8.hprlar[n] & 0x1) {
210
+ result |= (0x1 << n);
211
+ }
212
+ }
213
+ return result;
214
+}
215
+
216
+static void hprselr_write(CPUARMState *env, const ARMCPRegInfo *ri,
217
+ uint64_t value)
218
+{
219
+ ARMCPU *cpu = env_archcpu(env);
220
+
221
+ /*
222
+ * Ignore writes that would select not implemented region.
223
+ * This is architecturally UNPREDICTABLE.
224
+ */
225
+ if (value >= cpu->pmsav8r_hdregion) {
226
+ return;
144
+ return;
227
+ }
145
+ }
228
+
146
+
229
+ env->pmsav8.hprselr = value;
147
+ ret = qemu_strtou64(str, &endptr, 16, &rr->low);
148
+ if (ret) {
149
+ error_setg(errp, "start address of '%s'"
150
+ " must be a hexadecimal integer", name);
151
+ goto out;
152
+ }
153
+ if (*endptr != ':') {
154
+ goto separator_error;
155
+ }
156
+
157
+ ret = qemu_strtou64(endptr + 1, &endptr, 16, &rr->high);
158
+ if (ret) {
159
+ error_setg(errp, "end address of '%s'"
160
+ " must be a hexadecimal integer", name);
161
+ goto out;
162
+ }
163
+ if (*endptr != ':') {
164
+ goto separator_error;
165
+ }
166
+
167
+ ret = qemu_strtoui(endptr + 1, &endptr, 10, &rr->type);
168
+ if (ret) {
169
+ error_setg(errp, "type of '%s'"
170
+ " must be a non-negative decimal integer", name);
171
+ }
172
+ goto out;
173
+
174
+separator_error:
175
+ error_setg(errp, "reserved region fields must be separated with ':'");
176
+out:
177
+ g_free(str);
178
+ return;
230
+}
179
+}
231
+
180
+
232
+static void pmsav8r_regn_write(CPUARMState *env, const ARMCPRegInfo *ri,
181
+const PropertyInfo qdev_prop_reserved_region = {
233
+ uint64_t value)
182
+ .name = "reserved_region",
234
+{
183
+ .description = "Reserved Region, example: 0xFEE00000:0xFEEFFFFF:0",
235
+ ARMCPU *cpu = env_archcpu(env);
184
+ .get = get_reserved_region,
236
+ uint8_t index = (extract32(ri->opc0, 0, 1) << 4) |
185
+ .set = set_reserved_region,
237
+ (extract32(ri->crm, 0, 3) << 1) | extract32(ri->opc2, 2, 1);
238
+
239
+ tlb_flush(CPU(cpu)); /* Mappings may have changed - purge! */
240
+
241
+ if (ri->opc1 & 4) {
242
+ if (index >= cpu->pmsav8r_hdregion) {
243
+ return;
244
+ }
245
+ if (ri->opc2 & 0x1) {
246
+ env->pmsav8.hprlar[index] = value;
247
+ } else {
248
+ env->pmsav8.hprbar[index] = value;
249
+ }
250
+ } else {
251
+ if (index >= cpu->pmsav7_dregion) {
252
+ return;
253
+ }
254
+ if (ri->opc2 & 0x1) {
255
+ env->pmsav8.rlar[M_REG_NS][index] = value;
256
+ } else {
257
+ env->pmsav8.rbar[M_REG_NS][index] = value;
258
+ }
259
+ }
260
+}
261
+
262
+static uint64_t pmsav8r_regn_read(CPUARMState *env, const ARMCPRegInfo *ri)
263
+{
264
+ ARMCPU *cpu = env_archcpu(env);
265
+ uint8_t index = (extract32(ri->opc0, 0, 1) << 4) |
266
+ (extract32(ri->crm, 0, 3) << 1) | extract32(ri->opc2, 2, 1);
267
+
268
+ if (ri->opc1 & 4) {
269
+ if (index >= cpu->pmsav8r_hdregion) {
270
+ return 0x0;
271
+ }
272
+ if (ri->opc2 & 0x1) {
273
+ return env->pmsav8.hprlar[index];
274
+ } else {
275
+ return env->pmsav8.hprbar[index];
276
+ }
277
+ } else {
278
+ if (index >= cpu->pmsav7_dregion) {
279
+ return 0x0;
280
+ }
281
+ if (ri->opc2 & 0x1) {
282
+ return env->pmsav8.rlar[M_REG_NS][index];
283
+ } else {
284
+ return env->pmsav8.rbar[M_REG_NS][index];
285
+ }
286
+ }
287
+}
288
+
289
+static const ARMCPRegInfo pmsav8r_cp_reginfo[] = {
290
+ { .name = "PRBAR",
291
+ .cp = 15, .opc1 = 0, .crn = 6, .crm = 3, .opc2 = 0,
292
+ .access = PL1_RW, .type = ARM_CP_NO_RAW,
293
+ .accessfn = access_tvm_trvm,
294
+ .readfn = prbar_read, .writefn = prbar_write },
295
+ { .name = "PRLAR",
296
+ .cp = 15, .opc1 = 0, .crn = 6, .crm = 3, .opc2 = 1,
297
+ .access = PL1_RW, .type = ARM_CP_NO_RAW,
298
+ .accessfn = access_tvm_trvm,
299
+ .readfn = prlar_read, .writefn = prlar_write },
300
+ { .name = "PRSELR", .resetvalue = 0,
301
+ .cp = 15, .opc1 = 0, .crn = 6, .crm = 2, .opc2 = 1,
302
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
303
+ .writefn = prselr_write,
304
+ .fieldoffset = offsetof(CPUARMState, pmsav7.rnr[M_REG_NS]) },
305
+ { .name = "HPRBAR", .resetvalue = 0,
306
+ .cp = 15, .opc1 = 4, .crn = 6, .crm = 3, .opc2 = 0,
307
+ .access = PL2_RW, .type = ARM_CP_NO_RAW,
308
+ .readfn = hprbar_read, .writefn = hprbar_write },
309
+ { .name = "HPRLAR",
310
+ .cp = 15, .opc1 = 4, .crn = 6, .crm = 3, .opc2 = 1,
311
+ .access = PL2_RW, .type = ARM_CP_NO_RAW,
312
+ .readfn = hprlar_read, .writefn = hprlar_write },
313
+ { .name = "HPRSELR", .resetvalue = 0,
314
+ .cp = 15, .opc1 = 4, .crn = 6, .crm = 2, .opc2 = 1,
315
+ .access = PL2_RW,
316
+ .writefn = hprselr_write,
317
+ .fieldoffset = offsetof(CPUARMState, pmsav8.hprselr) },
318
+ { .name = "HPRENR",
319
+ .cp = 15, .opc1 = 4, .crn = 6, .crm = 1, .opc2 = 1,
320
+ .access = PL2_RW, .type = ARM_CP_NO_RAW,
321
+ .readfn = hprenr_read, .writefn = hprenr_write },
322
+};
186
+};
323
+
187
+
324
static const ARMCPRegInfo pmsav7_cp_reginfo[] = {
188
/* --- on/off/auto --- */
325
/* Reset for all these registers is handled in arm_cpu_reset(),
189
326
* because the PMSAv7 is also used by M-profile CPUs, which do
190
const PropertyInfo qdev_prop_on_off_auto = {
327
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
328
.access = PL1_R, .type = ARM_CP_CONST,
329
.resetvalue = cpu->pmsav7_dregion << 8
330
};
331
+ /* HMPUIR is specific to PMSA V8 */
332
+ ARMCPRegInfo id_hmpuir_reginfo = {
333
+ .name = "HMPUIR",
334
+ .cp = 15, .opc1 = 4, .crn = 0, .crm = 0, .opc2 = 4,
335
+ .access = PL2_R, .type = ARM_CP_CONST,
336
+ .resetvalue = cpu->pmsav8r_hdregion
337
+ };
338
static const ARMCPRegInfo crn0_wi_reginfo = {
339
.name = "CRN0_WI", .cp = 15, .crn = 0, .crm = CP_ANY,
340
.opc1 = CP_ANY, .opc2 = CP_ANY, .access = PL1_W,
341
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
342
define_arm_cp_regs(cpu, id_cp_reginfo);
343
if (!arm_feature(env, ARM_FEATURE_PMSA)) {
344
define_one_arm_cp_reg(cpu, &id_tlbtr_reginfo);
345
+ } else if (arm_feature(env, ARM_FEATURE_PMSA) &&
346
+ arm_feature(env, ARM_FEATURE_V8)) {
347
+ uint32_t i = 0;
348
+ char *tmp_string;
349
+
350
+ define_one_arm_cp_reg(cpu, &id_mpuir_reginfo);
351
+ define_one_arm_cp_reg(cpu, &id_hmpuir_reginfo);
352
+ define_arm_cp_regs(cpu, pmsav8r_cp_reginfo);
353
+
354
+ /* Register alias is only valid for first 32 indexes */
355
+ for (i = 0; i < MIN(cpu->pmsav7_dregion, 32); ++i) {
356
+ uint8_t crm = 0b1000 | extract32(i, 1, 3);
357
+ uint8_t opc1 = extract32(i, 4, 1);
358
+ uint8_t opc2 = extract32(i, 0, 1) << 2;
359
+
360
+ tmp_string = g_strdup_printf("PRBAR%u", i);
361
+ ARMCPRegInfo tmp_prbarn_reginfo = {
362
+ .name = tmp_string, .type = ARM_CP_ALIAS | ARM_CP_NO_RAW,
363
+ .cp = 15, .opc1 = opc1, .crn = 6, .crm = crm, .opc2 = opc2,
364
+ .access = PL1_RW, .resetvalue = 0,
365
+ .accessfn = access_tvm_trvm,
366
+ .writefn = pmsav8r_regn_write, .readfn = pmsav8r_regn_read
367
+ };
368
+ define_one_arm_cp_reg(cpu, &tmp_prbarn_reginfo);
369
+ g_free(tmp_string);
370
+
371
+ opc2 = extract32(i, 0, 1) << 2 | 0x1;
372
+ tmp_string = g_strdup_printf("PRLAR%u", i);
373
+ ARMCPRegInfo tmp_prlarn_reginfo = {
374
+ .name = tmp_string, .type = ARM_CP_ALIAS | ARM_CP_NO_RAW,
375
+ .cp = 15, .opc1 = opc1, .crn = 6, .crm = crm, .opc2 = opc2,
376
+ .access = PL1_RW, .resetvalue = 0,
377
+ .accessfn = access_tvm_trvm,
378
+ .writefn = pmsav8r_regn_write, .readfn = pmsav8r_regn_read
379
+ };
380
+ define_one_arm_cp_reg(cpu, &tmp_prlarn_reginfo);
381
+ g_free(tmp_string);
382
+ }
383
+
384
+ /* Register alias is only valid for first 32 indexes */
385
+ for (i = 0; i < MIN(cpu->pmsav8r_hdregion, 32); ++i) {
386
+ uint8_t crm = 0b1000 | extract32(i, 1, 3);
387
+ uint8_t opc1 = 0b100 | extract32(i, 4, 1);
388
+ uint8_t opc2 = extract32(i, 0, 1) << 2;
389
+
390
+ tmp_string = g_strdup_printf("HPRBAR%u", i);
391
+ ARMCPRegInfo tmp_hprbarn_reginfo = {
392
+ .name = tmp_string,
393
+ .type = ARM_CP_NO_RAW,
394
+ .cp = 15, .opc1 = opc1, .crn = 6, .crm = crm, .opc2 = opc2,
395
+ .access = PL2_RW, .resetvalue = 0,
396
+ .writefn = pmsav8r_regn_write, .readfn = pmsav8r_regn_read
397
+ };
398
+ define_one_arm_cp_reg(cpu, &tmp_hprbarn_reginfo);
399
+ g_free(tmp_string);
400
+
401
+ opc2 = extract32(i, 0, 1) << 2 | 0x1;
402
+ tmp_string = g_strdup_printf("HPRLAR%u", i);
403
+ ARMCPRegInfo tmp_hprlarn_reginfo = {
404
+ .name = tmp_string,
405
+ .type = ARM_CP_NO_RAW,
406
+ .cp = 15, .opc1 = opc1, .crn = 6, .crm = crm, .opc2 = opc2,
407
+ .access = PL2_RW, .resetvalue = 0,
408
+ .writefn = pmsav8r_regn_write, .readfn = pmsav8r_regn_read
409
+ };
410
+ define_one_arm_cp_reg(cpu, &tmp_hprlarn_reginfo);
411
+ g_free(tmp_string);
412
+ }
413
} else if (arm_feature(env, ARM_FEATURE_V7)) {
414
define_one_arm_cp_reg(cpu, &id_mpuir_reginfo);
415
}
416
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
417
sctlr.type |= ARM_CP_SUPPRESS_TB_END;
418
}
419
define_one_arm_cp_reg(cpu, &sctlr);
420
+
421
+ if (arm_feature(env, ARM_FEATURE_PMSA) &&
422
+ arm_feature(env, ARM_FEATURE_V8)) {
423
+ ARMCPRegInfo vsctlr = {
424
+ .name = "VSCTLR", .state = ARM_CP_STATE_AA32,
425
+ .cp = 15, .opc1 = 4, .crn = 2, .crm = 0, .opc2 = 0,
426
+ .access = PL2_RW, .resetvalue = 0x0,
427
+ .fieldoffset = offsetoflow32(CPUARMState, cp15.vsctlr),
428
+ };
429
+ define_one_arm_cp_reg(cpu, &vsctlr);
430
+ }
431
}
432
433
if (cpu_isar_feature(aa64_lor, cpu)) {
434
diff --git a/target/arm/machine.c b/target/arm/machine.c
435
index XXXXXXX..XXXXXXX 100644
436
--- a/target/arm/machine.c
437
+++ b/target/arm/machine.c
438
@@ -XXX,XX +XXX,XX @@ static bool pmsav8_needed(void *opaque)
439
arm_feature(env, ARM_FEATURE_V8);
440
}
441
442
+static bool pmsav8r_needed(void *opaque)
443
+{
444
+ ARMCPU *cpu = opaque;
445
+ CPUARMState *env = &cpu->env;
446
+
447
+ return arm_feature(env, ARM_FEATURE_PMSA) &&
448
+ arm_feature(env, ARM_FEATURE_V8) &&
449
+ !arm_feature(env, ARM_FEATURE_M);
450
+}
451
+
452
+static const VMStateDescription vmstate_pmsav8r = {
453
+ .name = "cpu/pmsav8/pmsav8r",
454
+ .version_id = 1,
455
+ .minimum_version_id = 1,
456
+ .needed = pmsav8r_needed,
457
+ .fields = (VMStateField[]) {
458
+ VMSTATE_VARRAY_UINT32(env.pmsav8.hprbar, ARMCPU,
459
+ pmsav8r_hdregion, 0, vmstate_info_uint32, uint32_t),
460
+ VMSTATE_VARRAY_UINT32(env.pmsav8.hprlar, ARMCPU,
461
+ pmsav8r_hdregion, 0, vmstate_info_uint32, uint32_t),
462
+ VMSTATE_END_OF_LIST()
463
+ },
464
+};
465
+
466
static const VMStateDescription vmstate_pmsav8 = {
467
.name = "cpu/pmsav8",
468
.version_id = 1,
469
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pmsav8 = {
470
VMSTATE_UINT32(env.pmsav8.mair0[M_REG_NS], ARMCPU),
471
VMSTATE_UINT32(env.pmsav8.mair1[M_REG_NS], ARMCPU),
472
VMSTATE_END_OF_LIST()
473
+ },
474
+ .subsections = (const VMStateDescription * []) {
475
+ &vmstate_pmsav8r,
476
+ NULL
477
}
478
};
479
480
--
191
--
481
2.25.1
192
2.20.1
482
193
483
194
diff view generated by jsdifflib
1
From: Zhuojia Shen <chaosdefinition@hotmail.com>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
In CPUID registers exposed to userspace, some registers were missing
3
This patch implements the PROBE request. At the moment,
4
and some fields were not exposed. This patch aligns exposed ID
4
only THE RESV_MEM property is handled. The first goal is
5
registers and their fields with what the upstream kernel currently
5
to report iommu wide reserved regions such as the MSI regions
6
exposes.
6
set by the machine code. On x86 this will be the IOAPIC MSI
7
7
region, [0xFEE00000 - 0xFEEFFFFF], on ARM this may be the ITS
8
Specifically, the following new ID registers/fields are exposed to
8
doorbell.
9
userspace:
9
10
10
In the future we may introduce per device reserved regions.
11
ID_AA64PFR1_EL1.BT: bits 3-0
11
This will be useful when protecting host assigned devices
12
ID_AA64PFR1_EL1.MTE: bits 11-8
12
which may expose their own reserved regions
13
ID_AA64PFR1_EL1.SME: bits 27-24
13
14
14
Signed-off-by: Eric Auger <eric.auger@redhat.com>
15
ID_AA64ZFR0_EL1.SVEver: bits 3-0
15
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
16
ID_AA64ZFR0_EL1.AES: bits 7-4
16
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
17
ID_AA64ZFR0_EL1.BitPerm: bits 19-16
17
Message-id: 20200629070404.10969-3-eric.auger@redhat.com
18
ID_AA64ZFR0_EL1.BF16: bits 23-20
19
ID_AA64ZFR0_EL1.SHA3: bits 35-32
20
ID_AA64ZFR0_EL1.SM4: bits 43-40
21
ID_AA64ZFR0_EL1.I8MM: bits 47-44
22
ID_AA64ZFR0_EL1.F32MM: bits 55-52
23
ID_AA64ZFR0_EL1.F64MM: bits 59-56
24
25
ID_AA64SMFR0_EL1.F32F32: bit 32
26
ID_AA64SMFR0_EL1.B16F32: bit 34
27
ID_AA64SMFR0_EL1.F16F32: bit 35
28
ID_AA64SMFR0_EL1.I8I32: bits 39-36
29
ID_AA64SMFR0_EL1.F64F64: bit 48
30
ID_AA64SMFR0_EL1.I16I64: bits 55-52
31
ID_AA64SMFR0_EL1.FA64: bit 63
32
33
ID_AA64MMFR0_EL1.ECV: bits 63-60
34
35
ID_AA64MMFR1_EL1.AFP: bits 47-44
36
37
ID_AA64MMFR2_EL1.AT: bits 35-32
38
39
ID_AA64ISAR0_EL1.RNDR: bits 63-60
40
41
ID_AA64ISAR1_EL1.FRINTTS: bits 35-32
42
ID_AA64ISAR1_EL1.BF16: bits 47-44
43
ID_AA64ISAR1_EL1.DGH: bits 51-48
44
ID_AA64ISAR1_EL1.I8MM: bits 55-52
45
46
ID_AA64ISAR2_EL1.WFxT: bits 3-0
47
ID_AA64ISAR2_EL1.RPRES: bits 7-4
48
ID_AA64ISAR2_EL1.GPA3: bits 11-8
49
ID_AA64ISAR2_EL1.APA3: bits 15-12
50
51
The code is also refactored to use symbolic names for ID register fields
52
for better readability and maintainability.
53
54
The test case in tests/tcg/aarch64/sysregs.c is also updated to match
55
the intended behavior.
56
57
Signed-off-by: Zhuojia Shen <chaosdefinition@hotmail.com>
58
Message-id: DS7PR12MB6309FB585E10772928F14271ACE79@DS7PR12MB6309.namprd12.prod.outlook.com
59
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
60
[PMM: use Sn_n_Cn_Cn_n syntax to work with older assemblers
61
that don't recognize id_aa64isar2_el1 and id_aa64mmfr2_el1]
62
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
63
---
19
---
64
target/arm/helper.c | 96 +++++++++++++++++++++++++------
20
include/hw/virtio/virtio-iommu.h | 2 +
65
tests/tcg/aarch64/sysregs.c | 24 ++++++--
21
hw/virtio/virtio-iommu.c | 94 ++++++++++++++++++++++++++++++--
66
tests/tcg/aarch64/Makefile.target | 7 ++-
22
hw/virtio/trace-events | 1 +
67
3 files changed, 103 insertions(+), 24 deletions(-)
23
3 files changed, 93 insertions(+), 4 deletions(-)
68
24
69
diff --git a/target/arm/helper.c b/target/arm/helper.c
25
diff --git a/include/hw/virtio/virtio-iommu.h b/include/hw/virtio/virtio-iommu.h
70
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
71
--- a/target/arm/helper.c
27
--- a/include/hw/virtio/virtio-iommu.h
72
+++ b/target/arm/helper.c
28
+++ b/include/hw/virtio/virtio-iommu.h
73
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
29
@@ -XXX,XX +XXX,XX @@ typedef struct VirtIOIOMMU {
74
#ifdef CONFIG_USER_ONLY
30
GHashTable *as_by_busptr;
75
static const ARMCPRegUserSpaceInfo v8_user_idregs[] = {
31
IOMMUPciBus *iommu_pcibus_by_bus_num[PCI_BUS_MAX];
76
{ .name = "ID_AA64PFR0_EL1",
32
PCIBus *primary_bus;
77
- .exported_bits = 0x000f000f00ff0000,
33
+ ReservedRegion *reserved_regions;
78
- .fixed_bits = 0x0000000000000011 },
34
+ uint32_t nb_reserved_regions;
79
+ .exported_bits = R_ID_AA64PFR0_FP_MASK |
35
GTree *domains;
80
+ R_ID_AA64PFR0_ADVSIMD_MASK |
36
QemuMutex mutex;
81
+ R_ID_AA64PFR0_SVE_MASK |
37
GTree *endpoints;
82
+ R_ID_AA64PFR0_DIT_MASK,
38
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
83
+ .fixed_bits = (0x1u << R_ID_AA64PFR0_EL0_SHIFT) |
84
+ (0x1u << R_ID_AA64PFR0_EL1_SHIFT) },
85
{ .name = "ID_AA64PFR1_EL1",
86
- .exported_bits = 0x00000000000000f0 },
87
+ .exported_bits = R_ID_AA64PFR1_BT_MASK |
88
+ R_ID_AA64PFR1_SSBS_MASK |
89
+ R_ID_AA64PFR1_MTE_MASK |
90
+ R_ID_AA64PFR1_SME_MASK },
91
{ .name = "ID_AA64PFR*_EL1_RESERVED",
92
- .is_glob = true },
93
- { .name = "ID_AA64ZFR0_EL1" },
94
+ .is_glob = true },
95
+ { .name = "ID_AA64ZFR0_EL1",
96
+ .exported_bits = R_ID_AA64ZFR0_SVEVER_MASK |
97
+ R_ID_AA64ZFR0_AES_MASK |
98
+ R_ID_AA64ZFR0_BITPERM_MASK |
99
+ R_ID_AA64ZFR0_BFLOAT16_MASK |
100
+ R_ID_AA64ZFR0_SHA3_MASK |
101
+ R_ID_AA64ZFR0_SM4_MASK |
102
+ R_ID_AA64ZFR0_I8MM_MASK |
103
+ R_ID_AA64ZFR0_F32MM_MASK |
104
+ R_ID_AA64ZFR0_F64MM_MASK },
105
+ { .name = "ID_AA64SMFR0_EL1",
106
+ .exported_bits = R_ID_AA64SMFR0_F32F32_MASK |
107
+ R_ID_AA64SMFR0_B16F32_MASK |
108
+ R_ID_AA64SMFR0_F16F32_MASK |
109
+ R_ID_AA64SMFR0_I8I32_MASK |
110
+ R_ID_AA64SMFR0_F64F64_MASK |
111
+ R_ID_AA64SMFR0_I16I64_MASK |
112
+ R_ID_AA64SMFR0_FA64_MASK },
113
{ .name = "ID_AA64MMFR0_EL1",
114
- .fixed_bits = 0x00000000ff000000 },
115
- { .name = "ID_AA64MMFR1_EL1" },
116
+ .exported_bits = R_ID_AA64MMFR0_ECV_MASK,
117
+ .fixed_bits = (0xfu << R_ID_AA64MMFR0_TGRAN64_SHIFT) |
118
+ (0xfu << R_ID_AA64MMFR0_TGRAN4_SHIFT) },
119
+ { .name = "ID_AA64MMFR1_EL1",
120
+ .exported_bits = R_ID_AA64MMFR1_AFP_MASK },
121
+ { .name = "ID_AA64MMFR2_EL1",
122
+ .exported_bits = R_ID_AA64MMFR2_AT_MASK },
123
{ .name = "ID_AA64MMFR*_EL1_RESERVED",
124
- .is_glob = true },
125
+ .is_glob = true },
126
{ .name = "ID_AA64DFR0_EL1",
127
- .fixed_bits = 0x0000000000000006 },
128
- { .name = "ID_AA64DFR1_EL1" },
129
+ .fixed_bits = (0x6u << R_ID_AA64DFR0_DEBUGVER_SHIFT) },
130
+ { .name = "ID_AA64DFR1_EL1" },
131
{ .name = "ID_AA64DFR*_EL1_RESERVED",
132
- .is_glob = true },
133
+ .is_glob = true },
134
{ .name = "ID_AA64AFR*",
135
- .is_glob = true },
136
+ .is_glob = true },
137
{ .name = "ID_AA64ISAR0_EL1",
138
- .exported_bits = 0x00fffffff0fffff0 },
139
+ .exported_bits = R_ID_AA64ISAR0_AES_MASK |
140
+ R_ID_AA64ISAR0_SHA1_MASK |
141
+ R_ID_AA64ISAR0_SHA2_MASK |
142
+ R_ID_AA64ISAR0_CRC32_MASK |
143
+ R_ID_AA64ISAR0_ATOMIC_MASK |
144
+ R_ID_AA64ISAR0_RDM_MASK |
145
+ R_ID_AA64ISAR0_SHA3_MASK |
146
+ R_ID_AA64ISAR0_SM3_MASK |
147
+ R_ID_AA64ISAR0_SM4_MASK |
148
+ R_ID_AA64ISAR0_DP_MASK |
149
+ R_ID_AA64ISAR0_FHM_MASK |
150
+ R_ID_AA64ISAR0_TS_MASK |
151
+ R_ID_AA64ISAR0_RNDR_MASK },
152
{ .name = "ID_AA64ISAR1_EL1",
153
- .exported_bits = 0x000000f0ffffffff },
154
+ .exported_bits = R_ID_AA64ISAR1_DPB_MASK |
155
+ R_ID_AA64ISAR1_APA_MASK |
156
+ R_ID_AA64ISAR1_API_MASK |
157
+ R_ID_AA64ISAR1_JSCVT_MASK |
158
+ R_ID_AA64ISAR1_FCMA_MASK |
159
+ R_ID_AA64ISAR1_LRCPC_MASK |
160
+ R_ID_AA64ISAR1_GPA_MASK |
161
+ R_ID_AA64ISAR1_GPI_MASK |
162
+ R_ID_AA64ISAR1_FRINTTS_MASK |
163
+ R_ID_AA64ISAR1_SB_MASK |
164
+ R_ID_AA64ISAR1_BF16_MASK |
165
+ R_ID_AA64ISAR1_DGH_MASK |
166
+ R_ID_AA64ISAR1_I8MM_MASK },
167
+ { .name = "ID_AA64ISAR2_EL1",
168
+ .exported_bits = R_ID_AA64ISAR2_WFXT_MASK |
169
+ R_ID_AA64ISAR2_RPRES_MASK |
170
+ R_ID_AA64ISAR2_GPA3_MASK |
171
+ R_ID_AA64ISAR2_APA3_MASK },
172
{ .name = "ID_AA64ISAR*_EL1_RESERVED",
173
- .is_glob = true },
174
+ .is_glob = true },
175
};
176
modify_arm_cp_regs(v8_idregs, v8_user_idregs);
177
#endif
178
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
179
#ifdef CONFIG_USER_ONLY
180
static const ARMCPRegUserSpaceInfo id_v8_user_midr_cp_reginfo[] = {
181
{ .name = "MIDR_EL1",
182
- .exported_bits = 0x00000000ffffffff },
183
- { .name = "REVIDR_EL1" },
184
+ .exported_bits = R_MIDR_EL1_REVISION_MASK |
185
+ R_MIDR_EL1_PARTNUM_MASK |
186
+ R_MIDR_EL1_ARCHITECTURE_MASK |
187
+ R_MIDR_EL1_VARIANT_MASK |
188
+ R_MIDR_EL1_IMPLEMENTER_MASK },
189
+ { .name = "REVIDR_EL1" },
190
};
191
modify_arm_cp_regs(id_v8_midr_cp_reginfo, id_v8_user_midr_cp_reginfo);
192
#endif
193
diff --git a/tests/tcg/aarch64/sysregs.c b/tests/tcg/aarch64/sysregs.c
194
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
195
--- a/tests/tcg/aarch64/sysregs.c
40
--- a/hw/virtio/virtio-iommu.c
196
+++ b/tests/tcg/aarch64/sysregs.c
41
+++ b/hw/virtio/virtio-iommu.c
197
@@ -XXX,XX +XXX,XX @@
42
@@ -XXX,XX +XXX,XX @@
198
#define HWCAP_CPUID (1 << 11)
43
199
#endif
44
/* Max size */
200
45
#define VIOMMU_DEFAULT_QUEUE_SIZE 256
201
+/*
46
+#define VIOMMU_PROBE_SIZE 512
202
+ * Older assemblers don't recognize newer system register names,
47
203
+ * but we can still access them by the Sn_n_Cn_Cn_n syntax.
48
typedef struct VirtIOIOMMUDomain {
49
uint32_t id;
50
@@ -XXX,XX +XXX,XX @@ static int virtio_iommu_unmap(VirtIOIOMMU *s,
51
return ret;
52
}
53
54
+static ssize_t virtio_iommu_fill_resv_mem_prop(VirtIOIOMMU *s, uint32_t ep,
55
+ uint8_t *buf, size_t free)
56
+{
57
+ struct virtio_iommu_probe_resv_mem prop = {};
58
+ size_t size = sizeof(prop), length = size - sizeof(prop.head), total;
59
+ int i;
60
+
61
+ total = size * s->nb_reserved_regions;
62
+
63
+ if (total > free) {
64
+ return -ENOSPC;
65
+ }
66
+
67
+ for (i = 0; i < s->nb_reserved_regions; i++) {
68
+ unsigned subtype = s->reserved_regions[i].type;
69
+
70
+ assert(subtype == VIRTIO_IOMMU_RESV_MEM_T_RESERVED ||
71
+ subtype == VIRTIO_IOMMU_RESV_MEM_T_MSI);
72
+ prop.head.type = cpu_to_le16(VIRTIO_IOMMU_PROBE_T_RESV_MEM);
73
+ prop.head.length = cpu_to_le16(length);
74
+ prop.subtype = subtype;
75
+ prop.start = cpu_to_le64(s->reserved_regions[i].low);
76
+ prop.end = cpu_to_le64(s->reserved_regions[i].high);
77
+
78
+ memcpy(buf, &prop, size);
79
+
80
+ trace_virtio_iommu_fill_resv_property(ep, prop.subtype,
81
+ prop.start, prop.end);
82
+ buf += size;
83
+ }
84
+ return total;
85
+}
86
+
87
+/**
88
+ * virtio_iommu_probe - Fill the probe request buffer with
89
+ * the properties the device is able to return
204
+ */
90
+ */
205
+#define SYS_ID_AA64ISAR2_EL1 S3_0_C0_C6_2
91
+static int virtio_iommu_probe(VirtIOIOMMU *s,
206
+#define SYS_ID_AA64MMFR2_EL1 S3_0_C0_C7_2
92
+ struct virtio_iommu_req_probe *req,
207
+
93
+ uint8_t *buf)
208
int failed_bit_count;
94
+{
209
95
+ uint32_t ep_id = le32_to_cpu(req->endpoint);
210
/* Read and print system register `id' value */
96
+ size_t free = VIOMMU_PROBE_SIZE;
211
@@ -XXX,XX +XXX,XX @@ int main(void)
97
+ ssize_t count;
212
* minimum valid fields - for the purposes of this check allowed
98
+
213
* to have non-zero values.
99
+ if (!virtio_iommu_mr(s, ep_id)) {
214
*/
100
+ return VIRTIO_IOMMU_S_NOENT;
215
- get_cpu_reg_check_mask(id_aa64isar0_el1, _m(00ff,ffff,f0ff,fff0));
101
+ }
216
- get_cpu_reg_check_mask(id_aa64isar1_el1, _m(0000,00f0,ffff,ffff));
102
+
217
+ get_cpu_reg_check_mask(id_aa64isar0_el1, _m(f0ff,ffff,f0ff,fff0));
103
+ count = virtio_iommu_fill_resv_mem_prop(s, ep_id, buf, free);
218
+ get_cpu_reg_check_mask(id_aa64isar1_el1, _m(00ff,f0ff,ffff,ffff));
104
+ if (count < 0) {
219
+ get_cpu_reg_check_mask(SYS_ID_AA64ISAR2_EL1, _m(0000,0000,0000,ffff));
105
+ return VIRTIO_IOMMU_S_INVAL;
220
/* TGran4 & TGran64 as pegged to -1 */
106
+ }
221
- get_cpu_reg_check_mask(id_aa64mmfr0_el1, _m(0000,0000,ff00,0000));
107
+ buf += count;
222
- get_cpu_reg_check_zero(id_aa64mmfr1_el1);
108
+ free -= count;
223
+ get_cpu_reg_check_mask(id_aa64mmfr0_el1, _m(f000,0000,ff00,0000));
109
+
224
+ get_cpu_reg_check_mask(id_aa64mmfr1_el1, _m(0000,f000,0000,0000));
110
+ return VIRTIO_IOMMU_S_OK;
225
+ get_cpu_reg_check_mask(SYS_ID_AA64MMFR2_EL1, _m(0000,000f,0000,0000));
111
+}
226
/* EL1/EL0 reported as AA64 only */
112
+
227
get_cpu_reg_check_mask(id_aa64pfr0_el1, _m(000f,000f,00ff,0011));
113
static int virtio_iommu_iov_to_req(struct iovec *iov,
228
- get_cpu_reg_check_mask(id_aa64pfr1_el1, _m(0000,0000,0000,00f0));
114
unsigned int iov_cnt,
229
+ get_cpu_reg_check_mask(id_aa64pfr1_el1, _m(0000,0000,0f00,0fff));
115
void *req, size_t req_sz)
230
/* all hidden, DebugVer fixed to 0x6 (ARMv8 debug architecture) */
116
@@ -XXX,XX +XXX,XX @@ virtio_iommu_handle_req(detach)
231
get_cpu_reg_check_mask(id_aa64dfr0_el1, _m(0000,0000,0000,0006));
117
virtio_iommu_handle_req(map)
232
get_cpu_reg_check_zero(id_aa64dfr1_el1);
118
virtio_iommu_handle_req(unmap)
233
- get_cpu_reg_check_zero(id_aa64zfr0_el1);
119
234
+ get_cpu_reg_check_mask(id_aa64zfr0_el1, _m(0ff0,ff0f,00ff,00ff));
120
+static int virtio_iommu_handle_probe(VirtIOIOMMU *s,
235
+#ifdef HAS_ARMV9_SME
121
+ struct iovec *iov,
236
+ get_cpu_reg_check_mask(id_aa64smfr0_el1, _m(80f1,00fd,0000,0000));
122
+ unsigned int iov_cnt,
237
+#endif
123
+ uint8_t *buf)
238
124
+{
239
get_cpu_reg_check_zero(id_aa64afr0_el1);
125
+ struct virtio_iommu_req_probe req;
240
get_cpu_reg_check_zero(id_aa64afr1_el1);
126
+ int ret = virtio_iommu_iov_to_req(iov, iov_cnt, &req, sizeof(req));
241
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
127
+
128
+ return ret ? ret : virtio_iommu_probe(s, &req, buf);
129
+}
130
+
131
static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
132
{
133
VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
134
struct virtio_iommu_req_head head;
135
struct virtio_iommu_req_tail tail = {};
136
+ size_t output_size = sizeof(tail), sz;
137
VirtQueueElement *elem;
138
unsigned int iov_cnt;
139
struct iovec *iov;
140
- size_t sz;
141
+ void *buf = NULL;
142
143
for (;;) {
144
elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
145
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
146
case VIRTIO_IOMMU_T_UNMAP:
147
tail.status = virtio_iommu_handle_unmap(s, iov, iov_cnt);
148
break;
149
+ case VIRTIO_IOMMU_T_PROBE:
150
+ {
151
+ struct virtio_iommu_req_tail *ptail;
152
+
153
+ output_size = s->config.probe_size + sizeof(tail);
154
+ buf = g_malloc0(output_size);
155
+
156
+ ptail = (struct virtio_iommu_req_tail *)
157
+ (buf + s->config.probe_size);
158
+ ptail->status = virtio_iommu_handle_probe(s, iov, iov_cnt, buf);
159
+ }
160
default:
161
tail.status = VIRTIO_IOMMU_S_UNSUPP;
162
}
163
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
164
165
out:
166
sz = iov_from_buf(elem->in_sg, elem->in_num, 0,
167
- &tail, sizeof(tail));
168
- assert(sz == sizeof(tail));
169
+ buf ? buf : &tail, output_size);
170
+ assert(sz == output_size);
171
172
- virtqueue_push(vq, elem, sizeof(tail));
173
+ virtqueue_push(vq, elem, sz);
174
virtio_notify(vdev, vq);
175
g_free(elem);
176
+ g_free(buf);
177
}
178
}
179
180
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_device_realize(DeviceState *dev, Error **errp)
181
s->config.page_size_mask = TARGET_PAGE_MASK;
182
s->config.input_range.end = -1UL;
183
s->config.domain_range.end = 32;
184
+ s->config.probe_size = VIOMMU_PROBE_SIZE;
185
186
virtio_add_feature(&s->features, VIRTIO_RING_F_EVENT_IDX);
187
virtio_add_feature(&s->features, VIRTIO_RING_F_INDIRECT_DESC);
188
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_device_realize(DeviceState *dev, Error **errp)
189
virtio_add_feature(&s->features, VIRTIO_IOMMU_F_MAP_UNMAP);
190
virtio_add_feature(&s->features, VIRTIO_IOMMU_F_BYPASS);
191
virtio_add_feature(&s->features, VIRTIO_IOMMU_F_MMIO);
192
+ virtio_add_feature(&s->features, VIRTIO_IOMMU_F_PROBE);
193
194
qemu_mutex_init(&s->mutex);
195
196
diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events
242
index XXXXXXX..XXXXXXX 100644
197
index XXXXXXX..XXXXXXX 100644
243
--- a/tests/tcg/aarch64/Makefile.target
198
--- a/hw/virtio/trace-events
244
+++ b/tests/tcg/aarch64/Makefile.target
199
+++ b/hw/virtio/trace-events
245
@@ -XXX,XX +XXX,XX @@ config-cc.mak: Makefile
200
@@ -XXX,XX +XXX,XX @@ virtio_iommu_get_domain(uint32_t domain_id) "Alloc domain=%d"
246
     $(call cc-option,-march=armv8.1-a+sve2, CROSS_CC_HAS_SVE2); \
201
virtio_iommu_put_domain(uint32_t domain_id) "Free domain=%d"
247
     $(call cc-option,-march=armv8.3-a, CROSS_CC_HAS_ARMV8_3); \
202
virtio_iommu_translate_out(uint64_t virt_addr, uint64_t phys_addr, uint32_t sid) "0x%"PRIx64" -> 0x%"PRIx64 " for sid=%d"
248
     $(call cc-option,-mbranch-protection=standard, CROSS_CC_HAS_ARMV8_BTI); \
203
virtio_iommu_report_fault(uint8_t reason, uint32_t flags, uint32_t endpoint, uint64_t addr) "FAULT reason=%d flags=%d endpoint=%d address =0x%"PRIx64
249
-     $(call cc-option,-march=armv8.5-a+memtag, CROSS_CC_HAS_ARMV8_MTE)) 3> config-cc.mak
204
+virtio_iommu_fill_resv_property(uint32_t devid, uint8_t subtype, uint64_t start, uint64_t end) "dev= %d, type=%d start=0x%"PRIx64" end=0x%"PRIx64
250
+     $(call cc-option,-march=armv8.5-a+memtag, CROSS_CC_HAS_ARMV8_MTE); \
251
+     $(call cc-option,-march=armv9-a+sme, CROSS_CC_HAS_ARMV9_SME)) 3> config-cc.mak
252
-include config-cc.mak
253
254
# Pauth Tests
255
@@ -XXX,XX +XXX,XX @@ endif
256
ifneq ($(CROSS_CC_HAS_SVE),)
257
# System Registers Tests
258
AARCH64_TESTS += sysregs
259
+ifneq ($(CROSS_CC_HAS_ARMV9_SME),)
260
+sysregs: CFLAGS+=-march=armv9-a+sme -DHAS_ARMV9_SME
261
+else
262
sysregs: CFLAGS+=-march=armv8.1-a+sve
263
+endif
264
265
# SVE ioctl test
266
AARCH64_TESTS += sve-ioctls
267
--
205
--
268
2.25.1
206
2.20.1
207
208
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
The pointed MouseTransformInfo structure is accessed read-only.
3
When translating an address we need to check if it belongs to
4
a reserved virtual address range. If it does, there are 2 cases:
4
5
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
- it belongs to a RESERVED region: the guest should neither use
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
this address in a MAP not instruct the end-point to DMA on
7
Message-id: 20221220142520.24094-2-philmd@linaro.org
8
them. We report an error
9
10
- It belongs to an MSI region: we bypass the translation.
11
12
Signed-off-by: Eric Auger <eric.auger@redhat.com>
13
Reviewed-by: Peter Xu <peterx@redhat.com>
14
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
15
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
16
Message-id: 20200629070404.10969-4-eric.auger@redhat.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
18
---
10
include/hw/input/tsc2xxx.h | 4 ++--
19
hw/virtio/virtio-iommu.c | 20 ++++++++++++++++++++
11
hw/input/tsc2005.c | 2 +-
20
1 file changed, 20 insertions(+)
12
hw/input/tsc210x.c | 3 +--
13
3 files changed, 4 insertions(+), 5 deletions(-)
14
21
15
diff --git a/include/hw/input/tsc2xxx.h b/include/hw/input/tsc2xxx.h
22
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
16
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/input/tsc2xxx.h
24
--- a/hw/virtio/virtio-iommu.c
18
+++ b/include/hw/input/tsc2xxx.h
25
+++ b/hw/virtio/virtio-iommu.c
19
@@ -XXX,XX +XXX,XX @@ uWireSlave *tsc2102_init(qemu_irq pint);
26
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry virtio_iommu_translate(IOMMUMemoryRegion *mr, hwaddr addr,
20
uWireSlave *tsc2301_init(qemu_irq penirq, qemu_irq kbirq, qemu_irq dav);
27
uint32_t sid, flags;
21
I2SCodec *tsc210x_codec(uWireSlave *chip);
28
bool bypass_allowed;
22
uint32_t tsc210x_txrx(void *opaque, uint32_t value, int len);
29
bool found;
23
-void tsc210x_set_transform(uWireSlave *chip, MouseTransformInfo *info);
30
+ int i;
24
+void tsc210x_set_transform(uWireSlave *chip, const MouseTransformInfo *info);
31
25
void tsc210x_key_event(uWireSlave *chip, int key, int down);
32
interval.low = addr;
26
33
interval.high = addr + 1;
27
/* tsc2005.c */
34
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry virtio_iommu_translate(IOMMUMemoryRegion *mr, hwaddr addr,
28
void *tsc2005_init(qemu_irq pintdav);
35
goto unlock;
29
uint32_t tsc2005_txrx(void *opaque, uint32_t value, int len);
36
}
30
-void tsc2005_set_transform(void *opaque, MouseTransformInfo *info);
37
31
+void tsc2005_set_transform(void *opaque, const MouseTransformInfo *info);
38
+ for (i = 0; i < s->nb_reserved_regions; i++) {
32
39
+ ReservedRegion *reg = &s->reserved_regions[i];
33
#endif
40
+
34
diff --git a/hw/input/tsc2005.c b/hw/input/tsc2005.c
41
+ if (addr >= reg->low && addr <= reg->high) {
35
index XXXXXXX..XXXXXXX 100644
42
+ switch (reg->type) {
36
--- a/hw/input/tsc2005.c
43
+ case VIRTIO_IOMMU_RESV_MEM_T_MSI:
37
+++ b/hw/input/tsc2005.c
44
+ entry.perm = flag;
38
@@ -XXX,XX +XXX,XX @@ void *tsc2005_init(qemu_irq pintdav)
45
+ break;
39
* from the touchscreen. Assuming 12-bit precision was used during
46
+ case VIRTIO_IOMMU_RESV_MEM_T_RESERVED:
40
* tslib calibration.
47
+ default:
41
*/
48
+ virtio_iommu_report_fault(s, VIRTIO_IOMMU_FAULT_R_MAPPING,
42
-void tsc2005_set_transform(void *opaque, MouseTransformInfo *info)
49
+ VIRTIO_IOMMU_FAULT_F_ADDRESS,
43
+void tsc2005_set_transform(void *opaque, const MouseTransformInfo *info)
50
+ sid, addr);
44
{
51
+ break;
45
TSC2005State *s = (TSC2005State *) opaque;
52
+ }
46
53
+ goto unlock;
47
diff --git a/hw/input/tsc210x.c b/hw/input/tsc210x.c
54
+ }
48
index XXXXXXX..XXXXXXX 100644
55
+ }
49
--- a/hw/input/tsc210x.c
56
+
50
+++ b/hw/input/tsc210x.c
57
if (!ep->domain) {
51
@@ -XXX,XX +XXX,XX @@ I2SCodec *tsc210x_codec(uWireSlave *chip)
58
if (!bypass_allowed) {
52
* from the touchscreen. Assuming 12-bit precision was used during
59
error_report_once("%s %02x:%02x.%01x not attached to any domain",
53
* tslib calibration.
54
*/
55
-void tsc210x_set_transform(uWireSlave *chip,
56
- MouseTransformInfo *info)
57
+void tsc210x_set_transform(uWireSlave *chip, const MouseTransformInfo *info)
58
{
59
TSC210xState *s = (TSC210xState *) chip->opaque;
60
#if 0
61
--
60
--
62
2.25.1
61
2.20.1
63
62
64
63
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Silent when compiling with -Wextra:
3
The machine may need to pass reserved regions to the
4
virtio-iommu-pci device (such as the MSI window on x86
5
or the MSI doorbells on ARM).
4
6
5
../hw/arm/nseries.c:1081:12: warning: missing field 'line' initializer [-Wmissing-field-initializers]
7
So let's add an array of Interval properties.
6
{ NULL }
7
^
8
8
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Note: if some reserved regions are already set by the
10
Message-id: 20221220142520.24094-4-philmd@linaro.org
10
machine code - which should be the case in general -,
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
the length of the property array is already set and
12
prevents the end-user from modifying them. For example,
13
attempting to use:
14
15
-device virtio-iommu-pci,\
16
len-reserved-regions=1,reserved-regions[0]=0xfee00000:0xfeefffff:1
17
18
would result in the following error message:
19
20
qemu-system-aarch64: -device virtio-iommu-pci,addr=0xa,
21
len-reserved-regions=1,reserved-regions[0]=0xfee00000:0xfeefffff:1:
22
array size property len-reserved-regions may not be set more than once
23
24
Otherwise, for example, adding two reserved regions is achieved
25
using the following options:
26
27
-device virtio-iommu-pci,addr=0xa,len-reserved-regions=2,\
28
reserved-regions[0]=0xfee00000:0xfeefffff:1,\
29
reserved-regions[1]=0x1000000:100ffff:1
30
31
Signed-off-by: Eric Auger <eric.auger@redhat.com>
32
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
33
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
34
Reviewed-by: Peter Xu <peterx@redhat.com>
35
Message-id: 20200629070404.10969-5-eric.auger@redhat.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
36
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
37
---
14
hw/arm/nseries.c | 10 ++++------
38
hw/virtio/virtio-iommu-pci.c | 11 +++++++++++
15
1 file changed, 4 insertions(+), 6 deletions(-)
39
1 file changed, 11 insertions(+)
16
40
17
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
41
diff --git a/hw/virtio/virtio-iommu-pci.c b/hw/virtio/virtio-iommu-pci.c
18
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/nseries.c
43
--- a/hw/virtio/virtio-iommu-pci.c
20
+++ b/hw/arm/nseries.c
44
+++ b/hw/virtio/virtio-iommu-pci.c
21
@@ -XXX,XX +XXX,XX @@ static const struct omap_gpiosw_info_s {
45
@@ -XXX,XX +XXX,XX @@ struct VirtIOIOMMUPCI {
22
"headphone", N8X0_HEADPHONE_GPIO,
46
23
OMAP_GPIOSW_TYPE_CONNECTION | OMAP_GPIOSW_INVERTED,
47
static Property virtio_iommu_pci_properties[] = {
24
},
48
DEFINE_PROP_UINT32("class", VirtIOPCIProxy, class_code, 0),
25
- { NULL }
49
+ DEFINE_PROP_ARRAY("reserved-regions", VirtIOIOMMUPCI,
26
+ { /* end of list */ }
50
+ vdev.nb_reserved_regions, vdev.reserved_regions,
27
}, n810_gpiosw_info[] = {
51
+ qdev_prop_reserved_region, ReservedRegion),
28
{
52
DEFINE_PROP_END_OF_LIST(),
29
"gps_reset", N810_GPS_RESET_GPIO,
30
@@ -XXX,XX +XXX,XX @@ static const struct omap_gpiosw_info_s {
31
"slide", N810_SLIDE_GPIO,
32
OMAP_GPIOSW_TYPE_COVER | OMAP_GPIOSW_INVERTED,
33
},
34
- { NULL }
35
+ { /* end of list */ }
36
};
53
};
37
54
38
static const struct omap_partition_info_s {
55
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
39
@@ -XXX,XX +XXX,XX @@ static const struct omap_partition_info_s {
56
{
40
{ 0x00080000, 0x00200000, 0x0, "kernel" },
57
VirtIOIOMMUPCI *dev = VIRTIO_IOMMU_PCI(vpci_dev);
41
{ 0x00280000, 0x00200000, 0x3, "initfs" },
58
DeviceState *vdev = DEVICE(&dev->vdev);
42
{ 0x00480000, 0x0fb80000, 0x3, "rootfs" },
59
+ VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
43
-
60
44
- { 0, 0, 0, NULL }
61
if (!qdev_get_machine_hotplug_handler(DEVICE(vpci_dev))) {
45
+ { /* end of list */ }
62
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
46
}, n810_part_info[] = {
63
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
47
{ 0x00000000, 0x00020000, 0x3, "bootloader" },
64
"-no-acpi\n");
48
{ 0x00020000, 0x00060000, 0x0, "config" },
65
return;
49
{ 0x00080000, 0x00220000, 0x0, "kernel" },
66
}
50
{ 0x002a0000, 0x00400000, 0x0, "initfs" },
67
+ for (int i = 0; i < s->nb_reserved_regions; i++) {
51
{ 0x006a0000, 0x0f960000, 0x0, "rootfs" },
68
+ if (s->reserved_regions[i].type != VIRTIO_IOMMU_RESV_MEM_T_RESERVED &&
52
-
69
+ s->reserved_regions[i].type != VIRTIO_IOMMU_RESV_MEM_T_MSI) {
53
- { 0, 0, 0, NULL }
70
+ error_setg(errp, "reserved region %d has an invalid type", i);
54
+ { /* end of list */ }
71
+ error_append_hint(errp, "Valid values are 0 and 1\n");
55
};
72
+ }
56
73
+ }
57
static const uint8_t n8x0_bd_addr[6] = { N8X0_BD_ADDR };
74
object_property_set_link(OBJECT(dev),
75
OBJECT(pci_get_bus(&vpci_dev->pci_dev)),
76
"primary-bus", &error_abort);
58
--
77
--
59
2.25.1
78
2.20.1
60
79
61
80
diff view generated by jsdifflib
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
CCM derived clocks will have to be added later.
3
At the moment the virtio-iommu translates MSI transactions.
4
This behavior is inherited from ARM SMMU. The virt machine
5
code knows where the guest MSI doorbells are so we can easily
6
declare those regions as VIRTIO_IOMMU_RESV_MEM_T_MSI. With that
7
setting the guest will not map MSIs through the IOMMU and those
8
transactions will be simply bypassed.
4
9
5
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
10
Depending on which MSI controller is in use (ITS or GICV2M),
11
we declare either:
12
- the ITS interrupt translation space (ITS_base + 0x10000),
13
containing the GITS_TRANSLATOR or
14
- The GICV2M single frame, containing the MSI_SETSP_NS register.
15
16
Signed-off-by: Eric Auger <eric.auger@redhat.com>
17
Message-id: 20200629070404.10969-6-eric.auger@redhat.com
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
20
---
9
hw/misc/imx7_ccm.c | 49 +++++++++++++++++++++++++++++++++++++---------
21
include/hw/arm/virt.h | 7 +++++++
10
1 file changed, 40 insertions(+), 9 deletions(-)
22
hw/arm/virt.c | 30 ++++++++++++++++++++++++++++++
23
2 files changed, 37 insertions(+)
11
24
12
diff --git a/hw/misc/imx7_ccm.c b/hw/misc/imx7_ccm.c
25
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
13
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/misc/imx7_ccm.c
27
--- a/include/hw/arm/virt.h
15
+++ b/hw/misc/imx7_ccm.c
28
+++ b/include/hw/arm/virt.h
16
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@ typedef enum VirtIOMMUType {
17
#include "hw/misc/imx7_ccm.h"
30
VIRT_IOMMU_VIRTIO,
18
#include "migration/vmstate.h"
31
} VirtIOMMUType;
19
32
20
+#include "trace.h"
33
+typedef enum VirtMSIControllerType {
34
+ VIRT_MSI_CTRL_NONE,
35
+ VIRT_MSI_CTRL_GICV2M,
36
+ VIRT_MSI_CTRL_ITS,
37
+} VirtMSIControllerType;
21
+
38
+
22
+#define CKIH_FREQ 24000000 /* 24MHz crystal input */
39
typedef enum VirtGICType {
40
VIRT_GIC_VERSION_MAX,
41
VIRT_GIC_VERSION_HOST,
42
@@ -XXX,XX +XXX,XX @@ typedef struct {
43
OnOffAuto acpi;
44
VirtGICType gic_version;
45
VirtIOMMUType iommu;
46
+ VirtMSIControllerType msi_controller;
47
uint16_t virtio_iommu_bdf;
48
struct arm_boot_info bootinfo;
49
MemMapEntry *memmap;
50
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/virt.c
53
+++ b/hw/arm/virt.c
54
@@ -XXX,XX +XXX,XX @@ static void create_its(VirtMachineState *vms)
55
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base);
56
57
fdt_add_its_gic_node(vms);
58
+ vms->msi_controller = VIRT_MSI_CTRL_ITS;
59
}
60
61
static void create_v2m(VirtMachineState *vms)
62
@@ -XXX,XX +XXX,XX @@ static void create_v2m(VirtMachineState *vms)
63
}
64
65
fdt_add_v2m_gic_node(vms);
66
+ vms->msi_controller = VIRT_MSI_CTRL_GICV2M;
67
}
68
69
static void create_gic(VirtMachineState *vms)
70
@@ -XXX,XX +XXX,XX @@ out:
71
static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
72
DeviceState *dev, Error **errp)
73
{
74
+ VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
23
+
75
+
24
static void imx7_analog_reset(DeviceState *dev)
76
if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
25
{
77
virt_memory_pre_plug(hotplug_dev, dev, errp);
26
IMX7AnalogState *s = IMX7_ANALOG(dev);
78
+ } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
27
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx7_ccm = {
79
+ hwaddr db_start = 0, db_end = 0;
28
static uint32_t imx7_ccm_get_clock_frequency(IMXCCMState *dev, IMXClk clock)
80
+ char *resv_prop_str;
29
{
30
/*
31
- * This function is "consumed" by GPT emulation code, however on
32
- * i.MX7 each GPT block can have their own clock root. This means
33
- * that this functions needs somehow to know requester's identity
34
- * and the way to pass it: be it via additional IMXClk constants
35
- * or by adding another argument to this method needs to be
36
- * figured out
37
+ * This function is "consumed" by GPT emulation code. Some clocks
38
+ * have fixed frequencies and we can provide requested frequency
39
+ * easily. However for CCM provided clocks (like IPG) each GPT
40
+ * timer can have its own clock root.
41
+ * This means we need additionnal information when calling this
42
+ * function to know the requester's identity.
43
*/
44
- qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Not implemented\n",
45
- TYPE_IMX7_CCM, __func__);
46
- return 0;
47
+ uint32_t freq = 0;
48
+
81
+
49
+ switch (clock) {
82
+ switch (vms->msi_controller) {
50
+ case CLK_NONE:
83
+ case VIRT_MSI_CTRL_NONE:
51
+ break;
84
+ return;
52
+ case CLK_32k:
85
+ case VIRT_MSI_CTRL_ITS:
53
+ freq = CKIL_FREQ;
86
+ /* GITS_TRANSLATER page */
54
+ break;
87
+ db_start = base_memmap[VIRT_GIC_ITS].base + 0x10000;
55
+ case CLK_HIGH:
88
+ db_end = base_memmap[VIRT_GIC_ITS].base +
56
+ freq = CKIH_FREQ;
89
+ base_memmap[VIRT_GIC_ITS].size - 1;
57
+ break;
90
+ break;
58
+ case CLK_IPG:
91
+ case VIRT_MSI_CTRL_GICV2M:
59
+ case CLK_IPG_HIGH:
92
+ /* MSI_SETSPI_NS page */
60
+ /*
93
+ db_start = base_memmap[VIRT_GIC_V2M].base;
61
+ * For now we don't have a way to figure out the device this
94
+ db_end = db_start + base_memmap[VIRT_GIC_V2M].size - 1;
62
+ * function is called for. Until then the IPG derived clocks
95
+ break;
63
+ * are left unimplemented.
96
+ }
64
+ */
97
+ resv_prop_str = g_strdup_printf("0x%"PRIx64":0x%"PRIx64":%u",
65
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Clock %d Not implemented\n",
98
+ db_start, db_end,
66
+ TYPE_IMX7_CCM, __func__, clock);
99
+ VIRTIO_IOMMU_RESV_MEM_T_MSI);
67
+ break;
68
+ default:
69
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: unsupported clock %d\n",
70
+ TYPE_IMX7_CCM, __func__, clock);
71
+ break;
72
+ }
73
+
100
+
74
+ trace_ccm_clock_freq(clock, freq);
101
+ qdev_prop_set_uint32(dev, "len-reserved-regions", 1);
75
+
102
+ qdev_prop_set_string(dev, "reserved-regions[0]", resv_prop_str);
76
+ return freq;
103
+ g_free(resv_prop_str);
104
}
77
}
105
}
78
106
79
static void imx7_ccm_class_init(ObjectClass *klass, void *data)
80
--
107
--
81
2.25.1
108
2.20.1
109
110
diff view generated by jsdifflib
1
From: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
1
From: Beata Michalska <beata.michalska@linaro.org>
2
2
3
Add PMSAv8r translation.
3
On ARMv7 & ARMv8 some load/store instructions might trigger a data abort
4
exception with no valid ISS info to be decoded. The lack of decode info
5
makes it at least tricky to emulate those instruction which is one of the
6
(many) reasons why KVM will not even try to do so.
4
7
5
Signed-off-by: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
8
Add support for handling those by requesting KVM to inject external
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
dabt into the quest.
7
Message-id: 20221206102504.165775-7-tobias.roehmel@rwth-aachen.de
10
11
Signed-off-by: Beata Michalska <beata.michalska@linaro.org>
12
Reviewed-by: Andrew Jones <drjones@redhat.com>
13
Message-id: 20200629114110.30723-2-beata.michalska@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
15
---
10
target/arm/ptw.c | 126 ++++++++++++++++++++++++++++++++++++++---------
16
target/arm/kvm.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
11
1 file changed, 104 insertions(+), 22 deletions(-)
17
1 file changed, 52 insertions(+)
12
18
13
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
19
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
14
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/ptw.c
21
--- a/target/arm/kvm.c
16
+++ b/target/arm/ptw.c
22
+++ b/target/arm/kvm.c
17
@@ -XXX,XX +XXX,XX @@ static bool pmsav7_use_background_region(ARMCPU *cpu, ARMMMUIdx mmu_idx,
23
@@ -XXX,XX +XXX,XX @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
18
24
19
if (arm_feature(env, ARM_FEATURE_M)) {
25
static bool cap_has_mp_state;
20
return env->v7m.mpu_ctrl[is_secure] & R_V7M_MPU_CTRL_PRIVDEFENA_MASK;
26
static bool cap_has_inject_serror_esr;
21
- } else {
27
+static bool cap_has_inject_ext_dabt;
22
- return regime_sctlr(env, mmu_idx) & SCTLR_BR;
28
29
static ARMHostCPUFeatures arm_host_cpu_features;
30
31
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init(MachineState *ms, KVMState *s)
32
ret = -EINVAL;
23
}
33
}
24
+
34
25
+ if (mmu_idx == ARMMMUIdx_Stage2) {
35
+ if (kvm_check_extension(s, KVM_CAP_ARM_NISV_TO_USER)) {
26
+ return false;
36
+ if (kvm_vm_enable_cap(s, KVM_CAP_ARM_NISV_TO_USER, 0)) {
37
+ error_report("Failed to enable KVM_CAP_ARM_NISV_TO_USER cap");
38
+ } else {
39
+ /* Set status for supporting the external dabt injection */
40
+ cap_has_inject_ext_dabt = kvm_check_extension(s,
41
+ KVM_CAP_ARM_INJECT_EXT_DABT);
42
+ }
27
+ }
43
+ }
28
+
44
+
29
+ return regime_sctlr(env, mmu_idx) & SCTLR_BR;
45
return ret;
30
}
46
}
31
47
32
static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
48
@@ -XXX,XX +XXX,XX @@ void kvm_arm_vm_state_change(void *opaque, int running, RunState state)
33
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
49
}
34
return !(result->f.prot & (1 << access_type));
35
}
50
}
36
51
37
+static uint32_t *regime_rbar(CPUARMState *env, ARMMMUIdx mmu_idx,
52
+/**
38
+ uint32_t secure)
53
+ * kvm_arm_handle_dabt_nisv:
54
+ * @cs: CPUState
55
+ * @esr_iss: ISS encoding (limited) for the exception from Data Abort
56
+ * ISV bit set to '0b0' -> no valid instruction syndrome
57
+ * @fault_ipa: faulting address for the synchronous data abort
58
+ *
59
+ * Returns: 0 if the exception has been handled, < 0 otherwise
60
+ */
61
+static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
62
+ uint64_t fault_ipa)
39
+{
63
+{
40
+ if (regime_el(env, mmu_idx) == 2) {
64
+ /*
41
+ return env->pmsav8.hprbar;
65
+ * Request KVM to inject the external data abort into the guest
66
+ */
67
+ if (cap_has_inject_ext_dabt) {
68
+ struct kvm_vcpu_events events = { };
69
+ /*
70
+ * The external data abort event will be handled immediately by KVM
71
+ * using the address fault that triggered the exit on given VCPU.
72
+ * Requesting injection of the external data abort does not rely
73
+ * on any other VCPU state. Therefore, in this particular case, the VCPU
74
+ * synchronization can be exceptionally skipped.
75
+ */
76
+ events.exception.ext_dabt_pending = 1;
77
+ /* KVM_CAP_ARM_INJECT_EXT_DABT implies KVM_CAP_VCPU_EVENTS */
78
+ return kvm_vcpu_ioctl(cs, KVM_SET_VCPU_EVENTS, &events);
42
+ } else {
79
+ } else {
43
+ return env->pmsav8.rbar[secure];
80
+ error_report("Data abort exception triggered by guest memory access "
81
+ "at physical address: 0x" TARGET_FMT_lx,
82
+ (target_ulong)fault_ipa);
83
+ error_printf("KVM unable to emulate faulting instruction.\n");
44
+ }
84
+ }
85
+ return -1;
45
+}
86
+}
46
+
87
+
47
+static uint32_t *regime_rlar(CPUARMState *env, ARMMMUIdx mmu_idx,
88
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
48
+ uint32_t secure)
89
{
49
+{
90
int ret = 0;
50
+ if (regime_el(env, mmu_idx) == 2) {
91
@@ -XXX,XX +XXX,XX @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
51
+ return env->pmsav8.hprlar;
92
ret = EXCP_DEBUG;
52
+ } else {
93
} /* otherwise return to guest */
53
+ return env->pmsav8.rlar[secure];
94
break;
54
+ }
95
+ case KVM_EXIT_ARM_NISV:
55
+}
96
+ /* External DABT with no valid iss to decode */
56
+
97
+ ret = kvm_arm_handle_dabt_nisv(cs, run->arm_nisv.esr_iss,
57
bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
98
+ run->arm_nisv.fault_ipa);
58
MMUAccessType access_type, ARMMMUIdx mmu_idx,
99
+ break;
59
bool secure, GetPhysAddrResult *result,
100
default:
60
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
101
qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n",
61
bool hit = false;
102
__func__, run->exit_reason);
62
uint32_t addr_page_base = address & TARGET_PAGE_MASK;
63
uint32_t addr_page_limit = addr_page_base + (TARGET_PAGE_SIZE - 1);
64
+ int region_counter;
65
+
66
+ if (regime_el(env, mmu_idx) == 2) {
67
+ region_counter = cpu->pmsav8r_hdregion;
68
+ } else {
69
+ region_counter = cpu->pmsav7_dregion;
70
+ }
71
72
result->f.lg_page_size = TARGET_PAGE_BITS;
73
result->f.phys_addr = address;
74
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
75
*mregion = -1;
76
}
77
78
+ if (mmu_idx == ARMMMUIdx_Stage2) {
79
+ fi->stage2 = true;
80
+ }
81
+
82
/*
83
* Unlike the ARM ARM pseudocode, we don't need to check whether this
84
* was an exception vector read from the vector table (which is always
85
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
86
hit = true;
87
}
88
89
- for (n = (int)cpu->pmsav7_dregion - 1; n >= 0; n--) {
90
+ uint32_t bitmask;
91
+ if (arm_feature(env, ARM_FEATURE_M)) {
92
+ bitmask = 0x1f;
93
+ } else {
94
+ bitmask = 0x3f;
95
+ fi->level = 0;
96
+ }
97
+
98
+ for (n = region_counter - 1; n >= 0; n--) {
99
/* region search */
100
/*
101
- * Note that the base address is bits [31:5] from the register
102
- * with bits [4:0] all zeroes, but the limit address is bits
103
- * [31:5] from the register with bits [4:0] all ones.
104
+ * Note that the base address is bits [31:x] from the register
105
+ * with bits [x-1:0] all zeroes, but the limit address is bits
106
+ * [31:x] from the register with bits [x:0] all ones. Where x is
107
+ * 5 for Cortex-M and 6 for Cortex-R
108
*/
109
- uint32_t base = env->pmsav8.rbar[secure][n] & ~0x1f;
110
- uint32_t limit = env->pmsav8.rlar[secure][n] | 0x1f;
111
+ uint32_t base = regime_rbar(env, mmu_idx, secure)[n] & ~bitmask;
112
+ uint32_t limit = regime_rlar(env, mmu_idx, secure)[n] | bitmask;
113
114
- if (!(env->pmsav8.rlar[secure][n] & 0x1)) {
115
+ if (!(regime_rlar(env, mmu_idx, secure)[n] & 0x1)) {
116
/* Region disabled */
117
continue;
118
}
119
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
120
* PMSAv7 where highest-numbered-region wins)
121
*/
122
fi->type = ARMFault_Permission;
123
- fi->level = 1;
124
+ if (arm_feature(env, ARM_FEATURE_M)) {
125
+ fi->level = 1;
126
+ }
127
return true;
128
}
129
130
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
131
}
132
133
if (!hit) {
134
- /* background fault */
135
- fi->type = ARMFault_Background;
136
+ if (arm_feature(env, ARM_FEATURE_M)) {
137
+ fi->type = ARMFault_Background;
138
+ } else {
139
+ fi->type = ARMFault_Permission;
140
+ }
141
return true;
142
}
143
144
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
145
/* hit using the background region */
146
get_phys_addr_pmsav7_default(env, mmu_idx, address, &result->f.prot);
147
} else {
148
- uint32_t ap = extract32(env->pmsav8.rbar[secure][matchregion], 1, 2);
149
- uint32_t xn = extract32(env->pmsav8.rbar[secure][matchregion], 0, 1);
150
+ uint32_t matched_rbar = regime_rbar(env, mmu_idx, secure)[matchregion];
151
+ uint32_t matched_rlar = regime_rlar(env, mmu_idx, secure)[matchregion];
152
+ uint32_t ap = extract32(matched_rbar, 1, 2);
153
+ uint32_t xn = extract32(matched_rbar, 0, 1);
154
bool pxn = false;
155
156
if (arm_feature(env, ARM_FEATURE_V8_1M)) {
157
- pxn = extract32(env->pmsav8.rlar[secure][matchregion], 4, 1);
158
+ pxn = extract32(matched_rlar, 4, 1);
159
}
160
161
if (m_is_system_region(env, address)) {
162
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
163
xn = 1;
164
}
165
166
- result->f.prot = simple_ap_to_rw_prot(env, mmu_idx, ap);
167
+ if (regime_el(env, mmu_idx) == 2) {
168
+ result->f.prot = simple_ap_to_rw_prot_is_user(ap,
169
+ mmu_idx != ARMMMUIdx_E2);
170
+ } else {
171
+ result->f.prot = simple_ap_to_rw_prot(env, mmu_idx, ap);
172
+ }
173
+
174
+ if (!arm_feature(env, ARM_FEATURE_M)) {
175
+ uint8_t attrindx = extract32(matched_rlar, 1, 3);
176
+ uint64_t mair = env->cp15.mair_el[regime_el(env, mmu_idx)];
177
+ uint8_t sh = extract32(matched_rlar, 3, 2);
178
+
179
+ if (regime_sctlr(env, mmu_idx) & SCTLR_WXN &&
180
+ result->f.prot & PAGE_WRITE && mmu_idx != ARMMMUIdx_Stage2) {
181
+ xn = 0x1;
182
+ }
183
+
184
+ if ((regime_el(env, mmu_idx) == 1) &&
185
+ regime_sctlr(env, mmu_idx) & SCTLR_UWXN && ap == 0x1) {
186
+ pxn = 0x1;
187
+ }
188
+
189
+ result->cacheattrs.is_s2_format = false;
190
+ result->cacheattrs.attrs = extract64(mair, attrindx * 8, 8);
191
+ result->cacheattrs.shareability = sh;
192
+ }
193
+
194
if (result->f.prot && !xn && !(pxn && !is_user)) {
195
result->f.prot |= PAGE_EXEC;
196
}
197
- /*
198
- * We don't need to look the attribute up in the MAIR0/MAIR1
199
- * registers because that only tells us about cacheability.
200
- */
201
+
202
if (mregion) {
203
*mregion = matchregion;
204
}
205
}
206
207
fi->type = ARMFault_Permission;
208
- fi->level = 1;
209
+ if (arm_feature(env, ARM_FEATURE_M)) {
210
+ fi->level = 1;
211
+ }
212
return !(result->f.prot & (1 << access_type));
213
}
214
215
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
216
cacheattrs1 = result->cacheattrs;
217
memset(result, 0, sizeof(*result));
218
219
- ret = get_phys_addr_lpae(env, ptw, ipa, access_type, is_el0, result, fi);
220
+ if (arm_feature(env, ARM_FEATURE_PMSA)) {
221
+ ret = get_phys_addr_pmsav8(env, ipa, access_type,
222
+ ptw->in_mmu_idx, is_secure, result, fi);
223
+ } else {
224
+ ret = get_phys_addr_lpae(env, ptw, ipa, access_type,
225
+ is_el0, result, fi);
226
+ }
227
fi->s2addr = ipa;
228
229
/* Combine the S1 and S2 perms. */
230
--
103
--
231
2.25.1
104
2.20.1
232
105
233
106
diff view generated by jsdifflib
1
From: Axel Heider <axel.heider@hensoldt.net>
1
From: Beata Michalska <beata.michalska@linaro.org>
2
2
3
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
3
Injecting external data abort through KVM might trigger
4
an issue on kernels that do not get updated to include the KVM fix.
5
For those and aarch32 guests, the injected abort gets misconfigured
6
to be an implementation defined exception. This leads to the guest
7
repeatedly re-running the faulting instruction.
8
9
Add support for handling that case.
10
11
[
12
Fixed-by: 018f22f95e8a
13
    ('KVM: arm: Fix DFSR setting for non-LPAE aarch32 guests')
14
Fixed-by: 21aecdbd7f3a
15
    ('KVM: arm: Make inject_abt32() inject an external abort instead')
16
]
17
18
Signed-off-by: Beata Michalska <beata.michalska@linaro.org>
19
Acked-by: Andrew Jones <drjones@redhat.com>
20
Message-id: 20200629114110.30723-3-beata.michalska@linaro.org
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
23
---
7
hw/timer/imx_epit.c | 215 ++++++++++++++++++++++++--------------------
24
target/arm/cpu.h | 2 ++
8
1 file changed, 117 insertions(+), 98 deletions(-)
25
target/arm/kvm_arm.h | 10 +++++++++
9
26
target/arm/kvm.c | 30 ++++++++++++++++++++++++++-
10
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
27
target/arm/kvm32.c | 34 ++++++++++++++++++++++++++++++
11
index XXXXXXX..XXXXXXX 100644
28
target/arm/kvm64.c | 49 ++++++++++++++++++++++++++++++++++++++++++++
12
--- a/hw/timer/imx_epit.c
29
5 files changed, 124 insertions(+), 1 deletion(-)
13
+++ b/hw/timer/imx_epit.c
30
14
@@ -XXX,XX +XXX,XX @@ static void imx_epit_reload_compare_timer(IMXEPITState *s)
31
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
}
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/cpu.h
34
+++ b/target/arm/cpu.h
35
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
36
uint64_t esr;
37
} serror;
38
39
+ uint8_t ext_dabt_raised; /* Tracking/verifying injection of ext DABT */
40
+
41
/* State of our input IRQ/FIQ/VIRQ/VFIQ lines */
42
uint32_t irq_line_state;
43
44
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/kvm_arm.h
47
+++ b/target/arm/kvm_arm.h
48
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_hw_debug_active(CPUState *cs);
49
struct kvm_guest_debug_arch;
50
void kvm_arm_copy_hw_debug_data(struct kvm_guest_debug_arch *ptr);
51
52
+/**
53
+ * kvm_arm_verify_ext_dabt_pending:
54
+ * @cs: CPUState
55
+ *
56
+ * Verify the fault status code wrt the Ext DABT injection
57
+ *
58
+ * Returns: true if the fault status code is as expected, false otherwise
59
+ */
60
+bool kvm_arm_verify_ext_dabt_pending(CPUState *cs);
61
+
62
/**
63
* its_class_name:
64
*
65
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/target/arm/kvm.c
68
+++ b/target/arm/kvm.c
69
@@ -XXX,XX +XXX,XX @@ int kvm_get_vcpu_events(ARMCPU *cpu)
70
71
void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run)
72
{
73
+ ARMCPU *cpu = ARM_CPU(cs);
74
+ CPUARMState *env = &cpu->env;
75
+
76
+ if (unlikely(env->ext_dabt_raised)) {
77
+ /*
78
+ * Verifying that the ext DABT has been properly injected,
79
+ * otherwise risking indefinitely re-running the faulting instruction
80
+ * Covering a very narrow case for kernels 5.5..5.5.4
81
+ * when injected abort was misconfigured to be
82
+ * an IMPLEMENTATION DEFINED exception (for 32-bit EL1)
83
+ */
84
+ if (!arm_feature(env, ARM_FEATURE_AARCH64) &&
85
+ unlikely(!kvm_arm_verify_ext_dabt_pending(cs))) {
86
+
87
+ error_report("Data abort exception with no valid ISS generated by "
88
+ "guest memory access. KVM unable to emulate faulting "
89
+ "instruction. Failed to inject an external data abort "
90
+ "into the guest.");
91
+ abort();
92
+ }
93
+ /* Clear the status */
94
+ env->ext_dabt_raised = 0;
95
+ }
16
}
96
}
17
97
18
+static void imx_epit_write_cr(IMXEPITState *s, uint32_t value)
98
MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
99
@@ -XXX,XX +XXX,XX @@ void kvm_arm_vm_state_change(void *opaque, int running, RunState state)
100
static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
101
uint64_t fault_ipa)
102
{
103
+ ARMCPU *cpu = ARM_CPU(cs);
104
+ CPUARMState *env = &cpu->env;
105
/*
106
* Request KVM to inject the external data abort into the guest
107
*/
108
@@ -XXX,XX +XXX,XX @@ static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
109
*/
110
events.exception.ext_dabt_pending = 1;
111
/* KVM_CAP_ARM_INJECT_EXT_DABT implies KVM_CAP_VCPU_EVENTS */
112
- return kvm_vcpu_ioctl(cs, KVM_SET_VCPU_EVENTS, &events);
113
+ if (!kvm_vcpu_ioctl(cs, KVM_SET_VCPU_EVENTS, &events)) {
114
+ env->ext_dabt_raised = 1;
115
+ return 0;
116
+ }
117
} else {
118
error_report("Data abort exception triggered by guest memory access "
119
"at physical address: 0x" TARGET_FMT_lx,
120
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
121
index XXXXXXX..XXXXXXX 100644
122
--- a/target/arm/kvm32.c
123
+++ b/target/arm/kvm32.c
124
@@ -XXX,XX +XXX,XX @@ void kvm_arm_pmu_init(CPUState *cs)
125
{
126
qemu_log_mask(LOG_UNIMP, "%s: not implemented\n", __func__);
127
}
128
+
129
+#define ARM_REG_DFSR ARM_CP15_REG32(0, 5, 0, 0)
130
+#define ARM_REG_TTBCR ARM_CP15_REG32(0, 2, 0, 2)
131
+/*
132
+ *DFSR:
133
+ * TTBCR.EAE == 0
134
+ * FS[4] - DFSR[10]
135
+ * FS[3:0] - DFSR[3:0]
136
+ * TTBCR.EAE == 1
137
+ * FS, bits [5:0]
138
+ */
139
+#define DFSR_FSC(lpae, v) \
140
+ ((lpae) ? ((v) & 0x3F) : (((v) >> 6) | ((v) & 0x1F)))
141
+
142
+#define DFSC_EXTABT(lpae) ((lpae) ? 0x10 : 0x08)
143
+
144
+bool kvm_arm_verify_ext_dabt_pending(CPUState *cs)
19
+{
145
+{
20
+ uint32_t oldcr = s->cr;
146
+ uint32_t dfsr_val;
21
+
147
+
22
+ s->cr = value & 0x03ffffff;
148
+ if (!kvm_get_one_reg(cs, ARM_REG_DFSR, &dfsr_val)) {
23
+
149
+ ARMCPU *cpu = ARM_CPU(cs);
24
+ if (s->cr & CR_SWR) {
150
+ CPUARMState *env = &cpu->env;
25
+ /* handle the reset */
151
+ uint32_t ttbcr;
26
+ imx_epit_reset(s, false);
152
+ int lpae = 0;
153
+
154
+ if (!kvm_get_one_reg(cs, ARM_REG_TTBCR, &ttbcr)) {
155
+ lpae = arm_feature(env, ARM_FEATURE_LPAE) && (ttbcr & TTBCR_EAE);
156
+ }
157
+ /* The verification is based on FS filed of the DFSR reg only*/
158
+ return (DFSR_FSC(lpae, dfsr_val) == DFSC_EXTABT(lpae));
27
+ }
159
+ }
28
+
160
+ return false;
29
+ /*
161
+}
30
+ * The interrupt state can change due to:
162
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
31
+ * - reset clears both SR.OCIF and CR.OCIE
163
index XXXXXXX..XXXXXXX 100644
32
+ * - write to CR.EN or CR.OCIE
164
--- a/target/arm/kvm64.c
33
+ */
165
+++ b/target/arm/kvm64.c
34
+ imx_epit_update_int(s);
166
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit)
35
+
167
36
+ /*
168
return false;
37
+ * TODO: could we 'break' here for reset? following operations appear
169
}
38
+ * to duplicate the work imx_epit_reset() already did.
170
+
39
+ */
171
+#define ARM64_REG_ESR_EL1 ARM64_SYS_REG(3, 0, 5, 2, 0)
40
+
172
+#define ARM64_REG_TCR_EL1 ARM64_SYS_REG(3, 0, 2, 0, 2)
41
+ ptimer_transaction_begin(s->timer_cmp);
173
+
42
+ ptimer_transaction_begin(s->timer_reload);
174
+/*
43
+
175
+ * ESR_EL1
44
+ /* Update the frequency. Has been done already in case of a reset. */
176
+ * ISS encoding
45
+ if (!(s->cr & CR_SWR)) {
177
+ * AARCH64: DFSC, bits [5:0]
46
+ imx_epit_set_freq(s);
178
+ * AARCH32:
47
+ }
179
+ * TTBCR.EAE == 0
48
+
180
+ * FS[4] - DFSR[10]
49
+ if (s->freq && (s->cr & CR_EN) && !(oldcr & CR_EN)) {
181
+ * FS[3:0] - DFSR[3:0]
50
+ if (s->cr & CR_ENMOD) {
182
+ * TTBCR.EAE == 1
51
+ if (s->cr & CR_RLD) {
183
+ * FS, bits [5:0]
52
+ ptimer_set_limit(s->timer_reload, s->lr, 1);
184
+ */
53
+ ptimer_set_limit(s->timer_cmp, s->lr, 1);
185
+#define ESR_DFSC(aarch64, lpae, v) \
54
+ } else {
186
+ ((aarch64 || (lpae)) ? ((v) & 0x3F) \
55
+ ptimer_set_limit(s->timer_reload, EPIT_TIMER_MAX, 1);
187
+ : (((v) >> 6) | ((v) & 0x1F)))
56
+ ptimer_set_limit(s->timer_cmp, EPIT_TIMER_MAX, 1);
188
+
189
+#define ESR_DFSC_EXTABT(aarch64, lpae) \
190
+ ((aarch64) ? 0x10 : (lpae) ? 0x10 : 0x8)
191
+
192
+bool kvm_arm_verify_ext_dabt_pending(CPUState *cs)
193
+{
194
+ uint64_t dfsr_val;
195
+
196
+ if (!kvm_get_one_reg(cs, ARM64_REG_ESR_EL1, &dfsr_val)) {
197
+ ARMCPU *cpu = ARM_CPU(cs);
198
+ CPUARMState *env = &cpu->env;
199
+ int aarch64_mode = arm_feature(env, ARM_FEATURE_AARCH64);
200
+ int lpae = 0;
201
+
202
+ if (!aarch64_mode) {
203
+ uint64_t ttbcr;
204
+
205
+ if (!kvm_get_one_reg(cs, ARM64_REG_TCR_EL1, &ttbcr)) {
206
+ lpae = arm_feature(env, ARM_FEATURE_LPAE)
207
+ && (ttbcr & TTBCR_EAE);
57
+ }
208
+ }
58
+ }
209
+ }
59
+
210
+ /*
60
+ imx_epit_reload_compare_timer(s);
211
+ * The verification here is based on the DFSC bits
61
+ ptimer_run(s->timer_reload, 0);
212
+ * of the ESR_EL1 reg only
62
+ if (s->cr & CR_OCIEN) {
213
+ */
63
+ ptimer_run(s->timer_cmp, 0);
214
+ return (ESR_DFSC(aarch64_mode, lpae, dfsr_val) ==
64
+ } else {
215
+ ESR_DFSC_EXTABT(aarch64_mode, lpae));
65
+ ptimer_stop(s->timer_cmp);
66
+ }
67
+ } else if (!(s->cr & CR_EN)) {
68
+ /* stop both timers */
69
+ ptimer_stop(s->timer_reload);
70
+ ptimer_stop(s->timer_cmp);
71
+ } else if (s->cr & CR_OCIEN) {
72
+ if (!(oldcr & CR_OCIEN)) {
73
+ imx_epit_reload_compare_timer(s);
74
+ ptimer_run(s->timer_cmp, 0);
75
+ }
76
+ } else {
77
+ ptimer_stop(s->timer_cmp);
78
+ }
216
+ }
79
+
217
+ return false;
80
+ ptimer_transaction_commit(s->timer_cmp);
81
+ ptimer_transaction_commit(s->timer_reload);
82
+}
218
+}
83
+
84
+static void imx_epit_write_sr(IMXEPITState *s, uint32_t value)
85
+{
86
+ /* writing 1 to SR.OCIF clears this bit and turns the interrupt off */
87
+ if (value & SR_OCIF) {
88
+ s->sr = 0; /* SR.OCIF is the only bit in this register anyway */
89
+ imx_epit_update_int(s);
90
+ }
91
+}
92
+
93
+static void imx_epit_write_lr(IMXEPITState *s, uint32_t value)
94
+{
95
+ s->lr = value;
96
+
97
+ ptimer_transaction_begin(s->timer_cmp);
98
+ ptimer_transaction_begin(s->timer_reload);
99
+ if (s->cr & CR_RLD) {
100
+ /* Also set the limit if the LRD bit is set */
101
+ /* If IOVW bit is set then set the timer value */
102
+ ptimer_set_limit(s->timer_reload, s->lr, s->cr & CR_IOVW);
103
+ ptimer_set_limit(s->timer_cmp, s->lr, 0);
104
+ } else if (s->cr & CR_IOVW) {
105
+ /* If IOVW bit is set then set the timer value */
106
+ ptimer_set_count(s->timer_reload, s->lr);
107
+ }
108
+ /*
109
+ * Commit the change to s->timer_reload, so it can propagate. Otherwise
110
+ * the timer interrupt may not fire properly. The commit must happen
111
+ * before calling imx_epit_reload_compare_timer(), which reads
112
+ * s->timer_reload internally again.
113
+ */
114
+ ptimer_transaction_commit(s->timer_reload);
115
+ imx_epit_reload_compare_timer(s);
116
+ ptimer_transaction_commit(s->timer_cmp);
117
+}
118
+
119
+static void imx_epit_write_cmp(IMXEPITState *s, uint32_t value)
120
+{
121
+ s->cmp = value;
122
+
123
+ ptimer_transaction_begin(s->timer_cmp);
124
+ imx_epit_reload_compare_timer(s);
125
+ ptimer_transaction_commit(s->timer_cmp);
126
+}
127
+
128
static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value,
129
unsigned size)
130
{
131
IMXEPITState *s = IMX_EPIT(opaque);
132
- uint64_t oldcr;
133
134
DPRINTF("(%s, value = 0x%08x)\n", imx_epit_reg_name(offset >> 2),
135
(uint32_t)value);
136
137
switch (offset >> 2) {
138
case 0: /* CR */
139
-
140
- oldcr = s->cr;
141
- s->cr = value & 0x03ffffff;
142
- if (s->cr & CR_SWR) {
143
- /* handle the reset */
144
- imx_epit_reset(s, false);
145
- }
146
-
147
- /*
148
- * The interrupt state can change due to:
149
- * - reset clears both SR.OCIF and CR.OCIE
150
- * - write to CR.EN or CR.OCIE
151
- */
152
- imx_epit_update_int(s);
153
-
154
- /*
155
- * TODO: could we 'break' here for reset? following operations appear
156
- * to duplicate the work imx_epit_reset() already did.
157
- */
158
-
159
- ptimer_transaction_begin(s->timer_cmp);
160
- ptimer_transaction_begin(s->timer_reload);
161
-
162
- /* Update the frequency. Has been done already in case of a reset. */
163
- if (!(s->cr & CR_SWR)) {
164
- imx_epit_set_freq(s);
165
- }
166
-
167
- if (s->freq && (s->cr & CR_EN) && !(oldcr & CR_EN)) {
168
- if (s->cr & CR_ENMOD) {
169
- if (s->cr & CR_RLD) {
170
- ptimer_set_limit(s->timer_reload, s->lr, 1);
171
- ptimer_set_limit(s->timer_cmp, s->lr, 1);
172
- } else {
173
- ptimer_set_limit(s->timer_reload, EPIT_TIMER_MAX, 1);
174
- ptimer_set_limit(s->timer_cmp, EPIT_TIMER_MAX, 1);
175
- }
176
- }
177
-
178
- imx_epit_reload_compare_timer(s);
179
- ptimer_run(s->timer_reload, 0);
180
- if (s->cr & CR_OCIEN) {
181
- ptimer_run(s->timer_cmp, 0);
182
- } else {
183
- ptimer_stop(s->timer_cmp);
184
- }
185
- } else if (!(s->cr & CR_EN)) {
186
- /* stop both timers */
187
- ptimer_stop(s->timer_reload);
188
- ptimer_stop(s->timer_cmp);
189
- } else if (s->cr & CR_OCIEN) {
190
- if (!(oldcr & CR_OCIEN)) {
191
- imx_epit_reload_compare_timer(s);
192
- ptimer_run(s->timer_cmp, 0);
193
- }
194
- } else {
195
- ptimer_stop(s->timer_cmp);
196
- }
197
-
198
- ptimer_transaction_commit(s->timer_cmp);
199
- ptimer_transaction_commit(s->timer_reload);
200
+ imx_epit_write_cr(s, (uint32_t)value);
201
break;
202
203
- case 1: /* SR - ACK*/
204
- /* writing 1 to SR.OCIF clears this bit and turns the interrupt off */
205
- if (value & SR_OCIF) {
206
- s->sr = 0; /* SR.OCIF is the only bit in this register anyway */
207
- imx_epit_update_int(s);
208
- }
209
+ case 1: /* SR */
210
+ imx_epit_write_sr(s, (uint32_t)value);
211
break;
212
213
- case 2: /* LR - set ticks */
214
- s->lr = value;
215
-
216
- ptimer_transaction_begin(s->timer_cmp);
217
- ptimer_transaction_begin(s->timer_reload);
218
- if (s->cr & CR_RLD) {
219
- /* Also set the limit if the LRD bit is set */
220
- /* If IOVW bit is set then set the timer value */
221
- ptimer_set_limit(s->timer_reload, s->lr, s->cr & CR_IOVW);
222
- ptimer_set_limit(s->timer_cmp, s->lr, 0);
223
- } else if (s->cr & CR_IOVW) {
224
- /* If IOVW bit is set then set the timer value */
225
- ptimer_set_count(s->timer_reload, s->lr);
226
- }
227
- /*
228
- * Commit the change to s->timer_reload, so it can propagate. Otherwise
229
- * the timer interrupt may not fire properly. The commit must happen
230
- * before calling imx_epit_reload_compare_timer(), which reads
231
- * s->timer_reload internally again.
232
- */
233
- ptimer_transaction_commit(s->timer_reload);
234
- imx_epit_reload_compare_timer(s);
235
- ptimer_transaction_commit(s->timer_cmp);
236
+ case 2: /* LR */
237
+ imx_epit_write_lr(s, (uint32_t)value);
238
break;
239
240
case 3: /* CMP */
241
- s->cmp = value;
242
-
243
- ptimer_transaction_begin(s->timer_cmp);
244
- imx_epit_reload_compare_timer(s);
245
- ptimer_transaction_commit(s->timer_cmp);
246
-
247
+ imx_epit_write_cmp(s, (uint32_t)value);
248
break;
249
250
default:
251
qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad register at offset 0x%"
252
HWADDR_PRIx "\n", TYPE_IMX_EPIT, __func__, offset);
253
-
254
break;
255
}
256
}
257
+
258
static void imx_epit_cmp(void *opaque)
259
{
260
IMXEPITState *s = IMX_EPIT(opaque);
261
--
219
--
262
2.25.1
220
2.20.1
221
222
diff view generated by jsdifflib
1
From: Fabiano Rosas <farosas@suse.de>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
Signed-off-by: Fabiano Rosas <farosas@suse.de>
3
Fixes: 93dd625f8bf7 ("tests/acpi: update expected data files")
4
Reviewed-by: Claudio Fontana <cfontana@suse.de>
4
Signed-off-by: Andrew Jones <drjones@redhat.com>
5
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
5
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
6
Message-id: 20221213190537.511-6-farosas@suse.de
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Message-id: 20200629140938.17566-2-drjones@redhat.com
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
---
9
target/arm/helper.c | 7 -------
10
tests/qtest/bios-tables-test-allowed-diff.h | 18 ------------------
10
1 file changed, 7 deletions(-)
11
1 file changed, 18 deletions(-)
11
12
12
diff --git a/target/arm/helper.c b/target/arm/helper.c
13
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/helper.c
15
--- a/tests/qtest/bios-tables-test-allowed-diff.h
15
+++ b/target/arm/helper.c
16
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
16
@@ -XXX,XX +XXX,XX @@
17
@@ -1,19 +1 @@
17
*/
18
/* List of comma-separated changed AML files to ignore */
18
19
-"tests/data/acpi/pc/DSDT",
19
#include "qemu/osdep.h"
20
-"tests/data/acpi/pc/DSDT.acpihmat",
20
-#include "qemu/units.h"
21
-"tests/data/acpi/pc/DSDT.bridge",
21
#include "qemu/log.h"
22
-"tests/data/acpi/pc/DSDT.cphp",
22
#include "trace.h"
23
-"tests/data/acpi/pc/DSDT.dimmpxm",
23
#include "cpu.h"
24
-"tests/data/acpi/pc/DSDT.ipmikcs",
24
#include "internals.h"
25
-"tests/data/acpi/pc/DSDT.memhp",
25
#include "exec/helper-proto.h"
26
-"tests/data/acpi/pc/DSDT.numamem",
26
-#include "qemu/host-utils.h"
27
-"tests/data/acpi/q35/DSDT",
27
#include "qemu/main-loop.h"
28
-"tests/data/acpi/q35/DSDT.acpihmat",
28
#include "qemu/timer.h"
29
-"tests/data/acpi/q35/DSDT.bridge",
29
#include "qemu/bitops.h"
30
-"tests/data/acpi/q35/DSDT.cphp",
30
@@ -XXX,XX +XXX,XX @@
31
-"tests/data/acpi/q35/DSDT.dimmpxm",
31
#include "exec/exec-all.h"
32
-"tests/data/acpi/q35/DSDT.ipmibt",
32
#include <zlib.h> /* For crc32 */
33
-"tests/data/acpi/q35/DSDT.memhp",
33
#include "hw/irq.h"
34
-"tests/data/acpi/q35/DSDT.mmio64",
34
-#include "semihosting/semihost.h"
35
-"tests/data/acpi/q35/DSDT.numamem",
35
-#include "sysemu/cpus.h"
36
-"tests/data/acpi/q35/DSDT.tis",
36
#include "sysemu/cpu-timers.h"
37
#include "sysemu/kvm.h"
38
-#include "qemu/range.h"
39
#include "qapi/qapi-commands-machine-target.h"
40
#include "qapi/error.h"
41
#include "qemu/guest-random.h"
42
#ifdef CONFIG_TCG
43
-#include "arm_ldst.h"
44
-#include "exec/cpu_ldst.h"
45
#include "semihosting/common-semi.h"
46
#endif
47
#include "cpregs.h"
48
--
37
--
49
2.25.1
38
2.20.1
39
40
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
The check semihosting_enabled() wants to know if the guest is
3
Signed-off-by: Andrew Jones <drjones@redhat.com>
4
currently in user mode. Unlike the other cases the test was inverted
4
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
5
causing us to block semihosting calls in non-EL0 modes.
5
Reviewed-by: Eric Auger <eric.auger@redhat.com>
6
6
Message-id: 20200629140938.17566-3-drjones@redhat.com
7
Cc: qemu-stable@nongnu.org
8
Fixes: 19b26317e9 (target/arm: Honour -semihosting-config userspace=on)
9
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
8
---
13
target/arm/translate.c | 2 +-
9
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
14
1 file changed, 1 insertion(+), 1 deletion(-)
10
1 file changed, 3 insertions(+)
15
11
16
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
17
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate.c
14
--- a/tests/qtest/bios-tables-test-allowed-diff.h
19
+++ b/target/arm/translate.c
15
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
20
@@ -XXX,XX +XXX,XX @@ static inline void gen_hlt(DisasContext *s, int imm)
16
@@ -1 +1,4 @@
21
* semihosting, to provide some semblance of security
17
/* List of comma-separated changed AML files to ignore */
22
* (and for consistency with our 32-bit semihosting).
18
+"tests/data/acpi/virt/DSDT",
23
*/
19
+"tests/data/acpi/virt/DSDT.memhp",
24
- if (semihosting_enabled(s->current_el != 0) &&
20
+"tests/data/acpi/virt/DSDT.numamem",
25
+ if (semihosting_enabled(s->current_el == 0) &&
26
(imm == (s->thumb ? 0x3c : 0xf000))) {
27
gen_exception_internal_insn(s, EXCP_SEMIHOST);
28
return;
29
--
21
--
30
2.25.1
22
2.20.1
31
23
32
24
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
This function is not used anywhere outside this file,
3
The flash device is exclusively for the host-controlled firmware, so
4
so we can make the function "static void".
4
we should not expose it to the OS. Exposing it risks the OS messing
5
with it, which could break firmware runtime services and surprise the
6
OS when all its changes disappear after reboot.
5
7
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
As firmware needs the device and uses DT, we leave the device exposed
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
there. It's up to firmware to remove the nodes from DT before sending
10
it on to the OS. However, there's no need to force firmware to remove
11
tables from ACPI (which it doesn't know how to do anyway), so we
12
simply don't add the tables in the first place. But, as we've been
13
adding the tables for quite some time and don't want to change the
14
default hardware exposed to versioned machines, then we only stop
15
exposing the flash device tables for 5.1 and later machine types.
16
17
Suggested-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
18
Suggested-by: Laszlo Ersek <lersek@redhat.com>
19
Signed-off-by: Andrew Jones <drjones@redhat.com>
20
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
21
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Message-id: 20221216214924.4711-2-philmd@linaro.org
22
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
23
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
24
Message-id: 20200629140938.17566-4-drjones@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
26
---
12
include/hw/arm/smmu-common.h | 3 ---
27
include/hw/arm/virt.h | 1 +
13
hw/arm/smmu-common.c | 2 +-
28
hw/arm/virt-acpi-build.c | 5 ++++-
14
2 files changed, 1 insertion(+), 4 deletions(-)
29
hw/arm/virt.c | 3 +++
30
3 files changed, 8 insertions(+), 1 deletion(-)
15
31
16
diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
32
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
17
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/smmu-common.h
34
--- a/include/hw/arm/virt.h
19
+++ b/include/hw/arm/smmu-common.h
35
+++ b/include/hw/arm/virt.h
20
@@ -XXX,XX +XXX,XX @@ void smmu_iotlb_inv_iova(SMMUState *s, int asid, dma_addr_t iova,
36
@@ -XXX,XX +XXX,XX @@ typedef struct {
21
/* Unmap the range of all the notifiers registered to any IOMMU mr */
37
bool no_highmem_ecam;
22
void smmu_inv_notifiers_all(SMMUState *s);
38
bool no_ged; /* Machines < 4.2 has no support for ACPI GED device */
23
39
bool kvm_no_adjvtime;
24
-/* Unmap the range of all the notifiers registered to @mr */
40
+ bool acpi_expose_flash;
25
-void smmu_inv_notifiers_mr(IOMMUMemoryRegion *mr);
41
} VirtMachineClass;
26
-
42
27
#endif /* HW_ARM_SMMU_COMMON_H */
43
typedef struct {
28
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
44
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
29
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/arm/smmu-common.c
46
--- a/hw/arm/virt-acpi-build.c
31
+++ b/hw/arm/smmu-common.c
47
+++ b/hw/arm/virt-acpi-build.c
32
@@ -XXX,XX +XXX,XX @@ static void smmu_unmap_notifier_range(IOMMUNotifier *n)
48
@@ -XXX,XX +XXX,XX @@ static void build_fadt_rev5(GArray *table_data, BIOSLinker *linker,
49
static void
50
build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
51
{
52
+ VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
53
Aml *scope, *dsdt;
54
MachineState *ms = MACHINE(vms);
55
const MemMapEntry *memmap = vms->memmap;
56
@@ -XXX,XX +XXX,XX @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
57
acpi_dsdt_add_cpus(scope, vms->smp_cpus);
58
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART],
59
(irqmap[VIRT_UART] + ARM_SPI_BASE));
60
- acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
61
+ if (vmc->acpi_expose_flash) {
62
+ acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
63
+ }
64
acpi_dsdt_add_fw_cfg(scope, &memmap[VIRT_FW_CFG]);
65
acpi_dsdt_add_virtio(scope, &memmap[VIRT_MMIO],
66
(irqmap[VIRT_MMIO] + ARM_SPI_BASE), NUM_VIRTIO_TRANSPORTS);
67
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/hw/arm/virt.c
70
+++ b/hw/arm/virt.c
71
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 1)
72
73
static void virt_machine_5_0_options(MachineClass *mc)
74
{
75
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
76
+
77
virt_machine_5_1_options(mc);
78
compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
79
mc->numa_mem_supported = true;
80
+ vmc->acpi_expose_flash = true;
33
}
81
}
34
82
DEFINE_VIRT_MACHINE(5, 0)
35
/* Unmap all notifiers attached to @mr */
36
-inline void smmu_inv_notifiers_mr(IOMMUMemoryRegion *mr)
37
+static void smmu_inv_notifiers_mr(IOMMUMemoryRegion *mr)
38
{
39
IOMMUNotifier *n;
40
83
41
--
84
--
42
2.25.1
85
2.20.1
43
86
44
87
diff view generated by jsdifflib
1
From: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
ARMv8-R AArch32 CPUs behave as if TTBCR.EAE is always 1 even
3
Differences between disassembled ASL files for DSDT:
4
tough they don't have the TTBCR register.
5
See ARM Architecture Reference Manual Supplement - ARMv8, for the ARMv8-R
6
AArch32 architecture profile Version:A.c section C1.2.
7
4
8
Signed-off-by: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
5
@@ -XXX,XX +XXX,XX @@
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
*
10
Message-id: 20221206102504.165775-5-tobias.roehmel@rwth-aachen.de
7
* Disassembling to symbolic ASL+ operators
8
*
9
- * Disassembly of a, Mon Jun 29 09:50:01 2020
10
+ * Disassembly of b, Mon Jun 29 09:50:03 2020
11
*
12
* Original Table Header:
13
* Signature "DSDT"
14
- * Length 0x000014BB (5307)
15
+ * Length 0x00001455 (5205)
16
* Revision 0x02
17
- * Checksum 0xD1
18
+ * Checksum 0xE1
19
* OEM ID "BOCHS "
20
* OEM Table ID "BXPCDSDT"
21
* OEM Revision 0x00000001 (1)
22
@@ -XXX,XX +XXX,XX @@
23
})
24
}
25
26
- Device (FLS0)
27
- {
28
- Name (_HID, "LNRO0015") // _HID: Hardware ID
29
- Name (_UID, Zero) // _UID: Unique ID
30
- Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
31
- {
32
- Memory32Fixed (ReadWrite,
33
- 0x00000000, // Address Base
34
- 0x04000000, // Address Length
35
- )
36
- })
37
- }
38
-
39
- Device (FLS1)
40
- {
41
- Name (_HID, "LNRO0015") // _HID: Hardware ID
42
- Name (_UID, One) // _UID: Unique ID
43
- Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
44
- {
45
- Memory32Fixed (ReadWrite,
46
- 0x04000000, // Address Base
47
- 0x04000000, // Address Length
48
- )
49
- })
50
- }
51
-
52
Device (FWCF)
53
{
54
Name (_HID, "QEMU0002") // _HID: Hardware ID
55
56
The other two binaries have the same changes (the removal of the
57
flash devices).
58
59
Signed-off-by: Andrew Jones <drjones@redhat.com>
60
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
61
Reviewed-by: Eric Auger <eric.auger@redhat.com>
62
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
63
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
64
Message-id: 20200629140938.17566-5-drjones@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
65
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
66
---
13
target/arm/internals.h | 4 ++++
67
tests/qtest/bios-tables-test-allowed-diff.h | 3 ---
14
target/arm/debug_helper.c | 3 +++
68
tests/data/acpi/virt/DSDT | Bin 5307 -> 5205 bytes
15
target/arm/tlb_helper.c | 4 ++++
69
tests/data/acpi/virt/DSDT.memhp | Bin 6668 -> 6566 bytes
16
3 files changed, 11 insertions(+)
70
tests/data/acpi/virt/DSDT.numamem | Bin 5307 -> 5205 bytes
71
4 files changed, 3 deletions(-)
17
72
18
diff --git a/target/arm/internals.h b/target/arm/internals.h
73
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
19
index XXXXXXX..XXXXXXX 100644
74
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/internals.h
75
--- a/tests/qtest/bios-tables-test-allowed-diff.h
21
+++ b/target/arm/internals.h
76
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
22
@@ -XXX,XX +XXX,XX @@ unsigned int arm_pamax(ARMCPU *cpu);
77
@@ -1,4 +1 @@
23
static inline bool extended_addresses_enabled(CPUARMState *env)
78
/* List of comma-separated changed AML files to ignore */
24
{
79
-"tests/data/acpi/virt/DSDT",
25
uint64_t tcr = env->cp15.tcr_el[arm_is_secure(env) ? 3 : 1];
80
-"tests/data/acpi/virt/DSDT.memhp",
26
+ if (arm_feature(env, ARM_FEATURE_PMSA) &&
81
-"tests/data/acpi/virt/DSDT.numamem",
27
+ arm_feature(env, ARM_FEATURE_V8)) {
82
diff --git a/tests/data/acpi/virt/DSDT b/tests/data/acpi/virt/DSDT
28
+ return true;
29
+ }
30
return arm_el_is_aa64(env, 1) ||
31
(arm_feature(env, ARM_FEATURE_LPAE) && (tcr & TTBCR_EAE));
32
}
33
diff --git a/target/arm/debug_helper.c b/target/arm/debug_helper.c
34
index XXXXXXX..XXXXXXX 100644
83
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/debug_helper.c
84
GIT binary patch
36
+++ b/target/arm/debug_helper.c
85
delta 28
37
@@ -XXX,XX +XXX,XX @@ static uint32_t arm_debug_exception_fsr(CPUARMState *env)
86
kcmdn3c~yhUCD<h-RD^+n>ET2!X{H9}iRuX(-<}f&0DgxFc>n+a
38
87
39
if (target_el == 2 || arm_el_is_aa64(env, target_el)) {
88
delta 156
40
using_lpae = true;
89
zcmcbrv0IbNCD<iow+I6R)5VEg(oAih6V(&y4c&Z#4LIUGJY9Hw{DS-q3=B;fIO0P+
41
+ } else if (arm_feature(env, ARM_FEATURE_PMSA) &&
90
zU4W!>P_UpN7hfAE10w?juv9WcH-WSmV$;Hiu7w4t3#`S$E!^1+q9xGPH`KtuzzAr5
42
+ arm_feature(env, ARM_FEATURE_V8)) {
91
LaERl^1zUvy_;n(J
43
+ using_lpae = true;
92
44
} else {
93
diff --git a/tests/data/acpi/virt/DSDT.memhp b/tests/data/acpi/virt/DSDT.memhp
45
if (arm_feature(env, ARM_FEATURE_LPAE) &&
46
(env->cp15.tcr_el[target_el] & TTBCR_EAE)) {
47
diff --git a/target/arm/tlb_helper.c b/target/arm/tlb_helper.c
48
index XXXXXXX..XXXXXXX 100644
94
index XXXXXXX..XXXXXXX 100644
49
--- a/target/arm/tlb_helper.c
95
GIT binary patch
50
+++ b/target/arm/tlb_helper.c
96
delta 28
51
@@ -XXX,XX +XXX,XX @@ bool regime_using_lpae_format(CPUARMState *env, ARMMMUIdx mmu_idx)
97
kcmeA%S!T@T66_MPOp<|tiD@F2G*jb@iRuX(-^xn@0CHUjRR910
52
if (el == 2 || arm_el_is_aa64(env, el)) {
98
53
return true;
99
delta 156
54
}
100
zcmZ2x++)J!66_MfBgMeL^l>7WG*kP$iRuaUhHgH=1|0Doo-VvTenI{Q28N~#9Py!^
55
+ if (arm_feature(env, ARM_FEATURE_PMSA) &&
101
zE<n;bC|FRCi?5B7fsp|MSSlH!n?PC&v1wsM*TMqS1=eEW7Vhi@(GuwD8){%+U<5Qj
56
+ arm_feature(env, ARM_FEATURE_V8)) {
102
LIK*+|0yaqism~!^
57
+ return true;
103
58
+ }
104
diff --git a/tests/data/acpi/virt/DSDT.numamem b/tests/data/acpi/virt/DSDT.numamem
59
if (arm_feature(env, ARM_FEATURE_LPAE)
105
index XXXXXXX..XXXXXXX 100644
60
&& (regime_tcr(env, mmu_idx) & TTBCR_EAE)) {
106
GIT binary patch
61
return true;
107
delta 28
108
kcmdn3c~yhUCD<h-RD^+n>ET2!X{H9}iRuX(-<}f&0DgxFc>n+a
109
110
delta 156
111
zcmcbrv0IbNCD<iow+I6R)5VEg(oAih6V(&y4c&Z#4LIUGJY9Hw{DS-q3=B;fIO0P+
112
zU4W!>P_UpN7hfAE10w?juv9WcH-WSmV$;Hiu7w4t3#`S$E!^1+q9xGPH`KtuzzAr5
113
LaERl^1zUvy_;n(J
114
62
--
115
--
63
2.25.1
116
2.20.1
64
117
65
118
diff view generated by jsdifflib
1
From: Axel Heider <axel.heider@hensoldt.net>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
3
The temp that gets assigned to clean_addr has been allocated with
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
new_tmp_a64, which means that it will be freed at the end of the
5
instruction. Freeing it earlier leads to assertion failure.
6
7
The loop creates a complication, in which we allocate a new local
8
temp, which does need freeing, and the final code path is shared
9
between the loop and non-loop.
10
11
Fix this complication by adding new_tmp_a64_local so that the new
12
local temp is freed at the end, and can be treated exactly like
13
the non-loop path.
14
15
Fixes: bba87d0a0f4
16
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20200702175605.1987125-1-richard.henderson@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
20
---
7
hw/timer/imx_epit.c | 20 ++++++++++++++------
21
target/arm/translate-a64.h | 1 +
8
1 file changed, 14 insertions(+), 6 deletions(-)
22
target/arm/translate-a64.c | 6 ++++++
23
target/arm/translate-sve.c | 8 ++------
24
3 files changed, 9 insertions(+), 6 deletions(-)
9
25
10
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
26
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
11
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/timer/imx_epit.c
28
--- a/target/arm/translate-a64.h
13
+++ b/hw/timer/imx_epit.c
29
+++ b/target/arm/translate-a64.h
14
@@ -XXX,XX +XXX,XX @@ static void imx_epit_set_freq(IMXEPITState *s)
30
@@ -XXX,XX +XXX,XX @@ void unallocated_encoding(DisasContext *s);
15
/*
31
} while (0)
16
* This is called both on hardware (device) reset and software reset.
32
17
*/
33
TCGv_i64 new_tmp_a64(DisasContext *s);
18
-static void imx_epit_reset(DeviceState *dev)
34
+TCGv_i64 new_tmp_a64_local(DisasContext *s);
19
+static void imx_epit_reset(IMXEPITState *s, bool is_hard_reset)
35
TCGv_i64 new_tmp_a64_zero(DisasContext *s);
20
{
36
TCGv_i64 cpu_reg(DisasContext *s, int reg);
21
- IMXEPITState *s = IMX_EPIT(dev);
37
TCGv_i64 cpu_reg_sp(DisasContext *s, int reg);
22
-
38
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
23
/* Soft reset doesn't touch some bits; hard reset clears them */
39
index XXXXXXX..XXXXXXX 100644
24
- s->cr &= (CR_EN|CR_ENMOD|CR_STOPEN|CR_DOZEN|CR_WAITEN|CR_DBGEN);
40
--- a/target/arm/translate-a64.c
25
+ if (is_hard_reset) {
41
+++ b/target/arm/translate-a64.c
26
+ s->cr = 0;
42
@@ -XXX,XX +XXX,XX @@ TCGv_i64 new_tmp_a64(DisasContext *s)
27
+ } else {
43
return s->tmp_a64[s->tmp_a64_count++] = tcg_temp_new_i64();
28
+ s->cr &= (CR_EN|CR_ENMOD|CR_STOPEN|CR_DOZEN|CR_WAITEN|CR_DBGEN);
29
+ }
30
s->sr = 0;
31
s->lr = EPIT_TIMER_MAX;
32
s->cmp = 0;
33
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value,
34
s->cr = value & 0x03ffffff;
35
if (s->cr & CR_SWR) {
36
/* handle the reset */
37
- imx_epit_reset(DEVICE(s));
38
+ imx_epit_reset(s, false);
39
}
40
41
/*
42
@@ -XXX,XX +XXX,XX @@ static void imx_epit_realize(DeviceState *dev, Error **errp)
43
s->timer_cmp = ptimer_init(imx_epit_cmp, s, PTIMER_POLICY_LEGACY);
44
}
44
}
45
45
46
+static void imx_epit_dev_reset(DeviceState *dev)
46
+TCGv_i64 new_tmp_a64_local(DisasContext *s)
47
+{
47
+{
48
+ IMXEPITState *s = IMX_EPIT(dev);
48
+ assert(s->tmp_a64_count < TMP_A64_MAX);
49
+ imx_epit_reset(s, true);
49
+ return s->tmp_a64[s->tmp_a64_count++] = tcg_temp_local_new_i64();
50
+}
50
+}
51
+
51
+
52
static void imx_epit_class_init(ObjectClass *klass, void *data)
52
TCGv_i64 new_tmp_a64_zero(DisasContext *s)
53
{
53
{
54
DeviceClass *dc = DEVICE_CLASS(klass);
54
TCGv_i64 t = new_tmp_a64(s);
55
55
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
56
dc->realize = imx_epit_realize;
56
index XXXXXXX..XXXXXXX 100644
57
- dc->reset = imx_epit_reset;
57
--- a/target/arm/translate-sve.c
58
+ dc->reset = imx_epit_dev_reset;
58
+++ b/target/arm/translate-sve.c
59
dc->vmsd = &vmstate_imx_timer_epit;
59
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
60
dc->desc = "i.MX periodic timer";
60
61
/* Copy the clean address into a local temp, live across the loop. */
62
t0 = clean_addr;
63
- clean_addr = tcg_temp_local_new_i64();
64
+ clean_addr = new_tmp_a64_local(s);
65
tcg_gen_mov_i64(clean_addr, t0);
66
- tcg_temp_free_i64(t0);
67
68
gen_set_label(loop);
69
70
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
71
tcg_gen_st_i64(t0, cpu_env, vofs + len_align);
72
tcg_temp_free_i64(t0);
73
}
74
- tcg_temp_free_i64(clean_addr);
61
}
75
}
76
77
/* Similarly for stores. */
78
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
79
80
/* Copy the clean address into a local temp, live across the loop. */
81
t0 = clean_addr;
82
- clean_addr = tcg_temp_local_new_i64();
83
+ clean_addr = new_tmp_a64_local(s);
84
tcg_gen_mov_i64(clean_addr, t0);
85
- tcg_temp_free_i64(t0);
86
87
gen_set_label(loop);
88
89
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
90
}
91
tcg_temp_free_i64(t0);
92
}
93
- tcg_temp_free_i64(clean_addr);
94
}
95
96
static bool trans_LDR_zri(DisasContext *s, arg_rri *a)
62
--
97
--
63
2.25.1
98
2.20.1
99
100
diff view generated by jsdifflib
1
From: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
1
In bcm2835_fb_mbox_push(), Coverity complains (CID 1429989) that we
2
pass a pointer to a local struct to another function without
3
initializing all its fields. This is a real bug:
4
bcm2835_fb_reconfigure() copies the whole of our new BCM2385FBConfig
5
struct into s->config, so any fields we don't initialize will corrupt
6
the state of the device.
2
7
3
The v8R PMSAv8 has a two-stage MPU translation process, but, unlike
8
Copy the two fields which we don't want to update (pixo and alpha)
4
VMSAv8, the stage 2 attributes are in the same format as the stage 1
9
from the existing config so we don't accidentally change them.
5
attributes (8-bit MAIR format). Rather than converting the MAIR
6
format to the format used for VMSA stage 2 (bits [5:2] of a VMSA
7
stage 2 descriptor) and then converting back to do the attribute
8
combination, allow combined_attrs_nofwb() to accept s2 attributes
9
that are already in the MAIR format.
10
10
11
We move the assert() to combined_attrs_fwb(), because that function
11
Fixes: cfb7ba983857e40e88
12
really does require a VMSA stage 2 attribute format. (We will never
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
get there for v8R, because PMSAv8 does not implement FEAT_S2FWB.)
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20200628195436.27582-1-peter.maydell@linaro.org
15
---
16
hw/display/bcm2835_fb.c | 4 ++++
17
1 file changed, 4 insertions(+)
14
18
15
Signed-off-by: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
19
diff --git a/hw/display/bcm2835_fb.c b/hw/display/bcm2835_fb.c
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Message-id: 20221206102504.165775-4-tobias.roehmel@rwth-aachen.de
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
20
target/arm/ptw.c | 10 ++++++++--
21
1 file changed, 8 insertions(+), 2 deletions(-)
22
23
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
24
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/ptw.c
21
--- a/hw/display/bcm2835_fb.c
26
+++ b/target/arm/ptw.c
22
+++ b/hw/display/bcm2835_fb.c
27
@@ -XXX,XX +XXX,XX @@ static uint8_t combined_attrs_nofwb(uint64_t hcr,
23
@@ -XXX,XX +XXX,XX @@ static void bcm2835_fb_mbox_push(BCM2835FBState *s, uint32_t value)
28
{
24
newconf.base = s->vcram_base | (value & 0xc0000000);
29
uint8_t s1lo, s2lo, s1hi, s2hi, s2_mair_attrs, ret_attrs;
25
newconf.base += BCM2835_FB_OFFSET;
30
26
31
- s2_mair_attrs = convert_stage2_attrs(hcr, s2.attrs);
27
+ /* Copy fields which we don't want to change from the existing config */
32
+ if (s2.is_s2_format) {
28
+ newconf.pixo = s->config.pixo;
33
+ s2_mair_attrs = convert_stage2_attrs(hcr, s2.attrs);
29
+ newconf.alpha = s->config.alpha;
34
+ } else {
35
+ s2_mair_attrs = s2.attrs;
36
+ }
37
38
s1lo = extract32(s1.attrs, 0, 4);
39
s2lo = extract32(s2_mair_attrs, 0, 4);
40
@@ -XXX,XX +XXX,XX @@ static uint8_t force_cacheattr_nibble_wb(uint8_t attr)
41
*/
42
static uint8_t combined_attrs_fwb(ARMCacheAttrs s1, ARMCacheAttrs s2)
43
{
44
+ assert(s2.is_s2_format && !s1.is_s2_format);
45
+
30
+
46
switch (s2.attrs) {
31
bcm2835_fb_validate_config(&newconf);
47
case 7:
32
48
/* Use stage 1 attributes */
33
pitch = bcm2835_fb_get_pitch(&newconf);
49
@@ -XXX,XX +XXX,XX @@ static ARMCacheAttrs combine_cacheattrs(uint64_t hcr,
50
ARMCacheAttrs ret;
51
bool tagged = false;
52
53
- assert(s2.is_s2_format && !s1.is_s2_format);
54
+ assert(!s1.is_s2_format);
55
ret.is_s2_format = false;
56
57
if (s1.attrs == 0xf0) {
58
--
34
--
59
2.25.1
35
2.20.1
60
36
61
37
diff view generated by jsdifflib
1
From: Axel Heider <axel.heider@hensoldt.net>
1
The spitz board has been around a long time, and still has a fair number
2
2
of hard-coded tab characters in it. We're about to do some work on
3
Fix typos, add background information
3
this source file, so start out by expanding out the tabs.
4
4
5
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
5
This commit is a pure whitespace only change.
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20200628142429.17111-2-peter.maydell@linaro.org
8
---
11
---
9
hw/timer/imx_epit.c | 20 ++++++++++++++++----
12
hw/arm/spitz.c | 156 ++++++++++++++++++++++++-------------------------
10
1 file changed, 16 insertions(+), 4 deletions(-)
13
1 file changed, 78 insertions(+), 78 deletions(-)
11
14
12
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
15
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/timer/imx_epit.c
17
--- a/hw/arm/spitz.c
15
+++ b/hw/timer/imx_epit.c
18
+++ b/hw/arm/spitz.c
16
@@ -XXX,XX +XXX,XX @@ static void imx_epit_set_freq(IMXEPITState *s)
19
@@ -XXX,XX +XXX,XX @@
20
#include "cpu.h"
21
22
#undef REG_FMT
23
-#define REG_FMT            "0x%02lx"
24
+#define REG_FMT "0x%02lx"
25
26
/* Spitz Flash */
27
-#define FLASH_BASE        0x0c000000
28
-#define FLASH_ECCLPLB        0x00    /* Line parity 7 - 0 bit */
29
-#define FLASH_ECCLPUB        0x04    /* Line parity 15 - 8 bit */
30
-#define FLASH_ECCCP        0x08    /* Column parity 5 - 0 bit */
31
-#define FLASH_ECCCNTR        0x0c    /* ECC byte counter */
32
-#define FLASH_ECCCLRR        0x10    /* Clear ECC */
33
-#define FLASH_FLASHIO        0x14    /* Flash I/O */
34
-#define FLASH_FLASHCTL        0x18    /* Flash Control */
35
+#define FLASH_BASE 0x0c000000
36
+#define FLASH_ECCLPLB 0x00 /* Line parity 7 - 0 bit */
37
+#define FLASH_ECCLPUB 0x04 /* Line parity 15 - 8 bit */
38
+#define FLASH_ECCCP 0x08 /* Column parity 5 - 0 bit */
39
+#define FLASH_ECCCNTR 0x0c /* ECC byte counter */
40
+#define FLASH_ECCCLRR 0x10 /* Clear ECC */
41
+#define FLASH_FLASHIO 0x14 /* Flash I/O */
42
+#define FLASH_FLASHCTL 0x18 /* Flash Control */
43
44
-#define FLASHCTL_CE0        (1 << 0)
45
-#define FLASHCTL_CLE        (1 << 1)
46
-#define FLASHCTL_ALE        (1 << 2)
47
-#define FLASHCTL_WP        (1 << 3)
48
-#define FLASHCTL_CE1        (1 << 4)
49
-#define FLASHCTL_RYBY        (1 << 5)
50
-#define FLASHCTL_NCE        (FLASHCTL_CE0 | FLASHCTL_CE1)
51
+#define FLASHCTL_CE0 (1 << 0)
52
+#define FLASHCTL_CLE (1 << 1)
53
+#define FLASHCTL_ALE (1 << 2)
54
+#define FLASHCTL_WP (1 << 3)
55
+#define FLASHCTL_CE1 (1 << 4)
56
+#define FLASHCTL_RYBY (1 << 5)
57
+#define FLASHCTL_NCE (FLASHCTL_CE0 | FLASHCTL_CE1)
58
59
#define TYPE_SL_NAND "sl-nand"
60
#define SL_NAND(obj) OBJECT_CHECK(SLNANDState, (obj), TYPE_SL_NAND)
61
@@ -XXX,XX +XXX,XX @@ static uint64_t sl_read(void *opaque, hwaddr addr, unsigned size)
62
int ryby;
63
64
switch (addr) {
65
-#define BSHR(byte, from, to)    ((s->ecc.lp[byte] >> (from - to)) & (1 << to))
66
+#define BSHR(byte, from, to) ((s->ecc.lp[byte] >> (from - to)) & (1 << to))
67
case FLASH_ECCLPLB:
68
return BSHR(0, 4, 0) | BSHR(0, 5, 2) | BSHR(0, 6, 4) | BSHR(0, 7, 6) |
69
BSHR(1, 4, 1) | BSHR(1, 5, 3) | BSHR(1, 6, 5) | BSHR(1, 7, 7);
70
71
-#define BSHL(byte, from, to)    ((s->ecc.lp[byte] << (to - from)) & (1 << to))
72
+#define BSHL(byte, from, to) ((s->ecc.lp[byte] << (to - from)) & (1 << to))
73
case FLASH_ECCLPUB:
74
return BSHL(0, 0, 0) | BSHL(0, 1, 2) | BSHL(0, 2, 4) | BSHL(0, 3, 6) |
75
BSHL(1, 0, 1) | BSHL(1, 1, 3) | BSHL(1, 2, 5) | BSHL(1, 3, 7);
76
@@ -XXX,XX +XXX,XX @@ static void sl_nand_realize(DeviceState *dev, Error **errp)
77
78
/* Spitz Keyboard */
79
80
-#define SPITZ_KEY_STROBE_NUM    11
81
-#define SPITZ_KEY_SENSE_NUM    7
82
+#define SPITZ_KEY_STROBE_NUM 11
83
+#define SPITZ_KEY_SENSE_NUM 7
84
85
static const int spitz_gpio_key_sense[SPITZ_KEY_SENSE_NUM] = {
86
12, 17, 91, 34, 36, 38, 39
87
@@ -XXX,XX +XXX,XX @@ static int spitz_keymap[SPITZ_KEY_SENSE_NUM + 1][SPITZ_KEY_STROBE_NUM] = {
88
{ 0x52, 0x43, 0x01, 0x47, 0x49, -1 , -1 , -1 , -1 , -1 , -1 },
89
};
90
91
-#define SPITZ_GPIO_AK_INT    13    /* Remote control */
92
-#define SPITZ_GPIO_SYNC        16    /* Sync button */
93
-#define SPITZ_GPIO_ON_KEY    95    /* Power button */
94
-#define SPITZ_GPIO_SWA        97    /* Lid */
95
-#define SPITZ_GPIO_SWB        96    /* Tablet mode */
96
+#define SPITZ_GPIO_AK_INT 13 /* Remote control */
97
+#define SPITZ_GPIO_SYNC 16 /* Sync button */
98
+#define SPITZ_GPIO_ON_KEY 95 /* Power button */
99
+#define SPITZ_GPIO_SWA 97 /* Lid */
100
+#define SPITZ_GPIO_SWB 96 /* Tablet mode */
101
102
/* The special buttons are mapped to unused keys */
103
static const int spitz_gpiomap[5] = {
104
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_keydown(SpitzKeyboardState *s, int keycode)
105
#define SPITZ_MOD_CTRL (1 << 8)
106
#define SPITZ_MOD_FN (1 << 9)
107
108
-#define QUEUE_KEY(c)    s->fifo[(s->fifopos + s->fifolen ++) & 0xf] = c
109
+#define QUEUE_KEY(c) s->fifo[(s->fifopos + s->fifolen ++) & 0xf] = c
110
111
static void spitz_keyboard_handler(void *opaque, int keycode)
112
{
113
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_handler(void *opaque, int keycode)
114
uint16_t code;
115
int mapcode;
116
switch (keycode) {
117
- case 0x2a:    /* Left Shift */
118
+ case 0x2a: /* Left Shift */
119
s->modifiers |= 1;
120
break;
121
case 0xaa:
122
s->modifiers &= ~1;
123
break;
124
- case 0x36:    /* Right Shift */
125
+ case 0x36: /* Right Shift */
126
s->modifiers |= 2;
127
break;
128
case 0xb6:
129
s->modifiers &= ~2;
130
break;
131
- case 0x1d:    /* Control */
132
+ case 0x1d: /* Control */
133
s->modifiers |= 4;
134
break;
135
case 0x9d:
136
s->modifiers &= ~4;
137
break;
138
- case 0x38:    /* Alt */
139
+ case 0x38: /* Alt */
140
s->modifiers |= 8;
141
break;
142
case 0xb8:
143
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_realize(DeviceState *dev, Error **errp)
144
145
/* LCD backlight controller */
146
147
-#define LCDTG_RESCTL    0x00
148
-#define LCDTG_PHACTRL    0x01
149
-#define LCDTG_DUTYCTRL    0x02
150
-#define LCDTG_POWERREG0    0x03
151
-#define LCDTG_POWERREG1    0x04
152
-#define LCDTG_GPOR3    0x05
153
-#define LCDTG_PICTRL    0x06
154
-#define LCDTG_POLCTRL    0x07
155
+#define LCDTG_RESCTL 0x00
156
+#define LCDTG_PHACTRL 0x01
157
+#define LCDTG_DUTYCTRL 0x02
158
+#define LCDTG_POWERREG0 0x03
159
+#define LCDTG_POWERREG1 0x04
160
+#define LCDTG_GPOR3 0x05
161
+#define LCDTG_PICTRL 0x06
162
+#define LCDTG_POLCTRL 0x07
163
164
typedef struct {
165
SSISlave ssidev;
166
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_realize(SSISlave *dev, Error **errp)
167
168
/* SSP devices */
169
170
-#define CORGI_SSP_PORT        2
171
+#define CORGI_SSP_PORT 2
172
173
-#define SPITZ_GPIO_LCDCON_CS    53
174
-#define SPITZ_GPIO_ADS7846_CS    14
175
-#define SPITZ_GPIO_MAX1111_CS    20
176
-#define SPITZ_GPIO_TP_INT    11
177
+#define SPITZ_GPIO_LCDCON_CS 53
178
+#define SPITZ_GPIO_ADS7846_CS 14
179
+#define SPITZ_GPIO_MAX1111_CS 20
180
+#define SPITZ_GPIO_TP_INT 11
181
182
static DeviceState *max1111;
183
184
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
185
s->enable[line] = !level;
186
}
187
188
-#define MAX1111_BATT_VOLT    1
189
-#define MAX1111_BATT_TEMP    2
190
-#define MAX1111_ACIN_VOLT    3
191
+#define MAX1111_BATT_VOLT 1
192
+#define MAX1111_BATT_TEMP 2
193
+#define MAX1111_ACIN_VOLT 3
194
195
-#define SPITZ_BATTERY_TEMP    0xe0    /* About 2.9V */
196
-#define SPITZ_BATTERY_VOLT    0xd0    /* About 4.0V */
197
-#define SPITZ_CHARGEON_ACIN    0x80    /* About 5.0V */
198
+#define SPITZ_BATTERY_TEMP 0xe0 /* About 2.9V */
199
+#define SPITZ_BATTERY_VOLT 0xd0 /* About 4.0V */
200
+#define SPITZ_CHARGEON_ACIN 0x80 /* About 5.0V */
201
202
static void spitz_adc_temp_on(void *opaque, int line, int level)
203
{
204
@@ -XXX,XX +XXX,XX @@ static void spitz_microdrive_attach(PXA2xxState *cpu, int slot)
205
206
/* Wm8750 and Max7310 on I2C */
207
208
-#define AKITA_MAX_ADDR    0x18
209
-#define SPITZ_WM_ADDRL    0x1b
210
-#define SPITZ_WM_ADDRH    0x1a
211
+#define AKITA_MAX_ADDR 0x18
212
+#define SPITZ_WM_ADDRL 0x1b
213
+#define SPITZ_WM_ADDRH 0x1a
214
215
-#define SPITZ_GPIO_WM    5
216
+#define SPITZ_GPIO_WM 5
217
218
static void spitz_wm8750_addr(void *opaque, int line, int level)
219
{
220
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
17
}
221
}
18
}
222
}
19
223
20
+/*
224
-#define SPITZ_SCP_LED_GREEN        1
21
+ * This is called both on hardware (device) reset and software reset.
225
-#define SPITZ_SCP_JK_B            2
22
+ */
226
-#define SPITZ_SCP_CHRG_ON        3
23
static void imx_epit_reset(DeviceState *dev)
227
-#define SPITZ_SCP_MUTE_L        4
24
{
228
-#define SPITZ_SCP_MUTE_R        5
25
IMXEPITState *s = IMX_EPIT(dev);
229
-#define SPITZ_SCP_CF_POWER        6
26
230
-#define SPITZ_SCP_LED_ORANGE        7
27
- /*
231
-#define SPITZ_SCP_JK_A            8
28
- * Soft reset doesn't touch some bits; hard reset clears them
232
-#define SPITZ_SCP_ADC_TEMP_ON        9
29
- */
233
-#define SPITZ_SCP2_IR_ON        1
30
+ /* Soft reset doesn't touch some bits; hard reset clears them */
234
-#define SPITZ_SCP2_AKIN_PULLUP        2
31
s->cr &= (CR_EN|CR_ENMOD|CR_STOPEN|CR_DOZEN|CR_WAITEN|CR_DBGEN);
235
-#define SPITZ_SCP2_BACKLIGHT_CONT    7
32
s->sr = 0;
236
-#define SPITZ_SCP2_BACKLIGHT_ON        8
33
s->lr = EPIT_TIMER_MAX;
237
-#define SPITZ_SCP2_MIC_BIAS        9
34
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value,
238
+#define SPITZ_SCP_LED_GREEN 1
35
ptimer_transaction_begin(s->timer_cmp);
239
+#define SPITZ_SCP_JK_B 2
36
ptimer_transaction_begin(s->timer_reload);
240
+#define SPITZ_SCP_CHRG_ON 3
37
241
+#define SPITZ_SCP_MUTE_L 4
38
+ /* Update the frequency. Has been done already in case of a reset. */
242
+#define SPITZ_SCP_MUTE_R 5
39
if (!(s->cr & CR_SWR)) {
243
+#define SPITZ_SCP_CF_POWER 6
40
imx_epit_set_freq(s);
244
+#define SPITZ_SCP_LED_ORANGE 7
41
}
245
+#define SPITZ_SCP_JK_A 8
42
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value,
246
+#define SPITZ_SCP_ADC_TEMP_ON 9
43
break;
247
+#define SPITZ_SCP2_IR_ON 1
44
248
+#define SPITZ_SCP2_AKIN_PULLUP 2
45
case 1: /* SR - ACK*/
249
+#define SPITZ_SCP2_BACKLIGHT_CONT 7
46
- /* writing 1 to OCIF clear the OCIF bit */
250
+#define SPITZ_SCP2_BACKLIGHT_ON 8
47
+ /* writing 1 to OCIF clears the OCIF bit */
251
+#define SPITZ_SCP2_MIC_BIAS 9
48
if (value & 0x01) {
252
49
s->sr = 0;
253
static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
50
imx_epit_update_int(s);
254
DeviceState *scp0, DeviceState *scp1)
51
@@ -XXX,XX +XXX,XX @@ static void imx_epit_realize(DeviceState *dev, Error **errp)
255
@@ -XXX,XX +XXX,XX @@ static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
52
0x00001000);
256
qdev_connect_gpio_out(scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
53
sysbus_init_mmio(sbd, &s->iomem);
54
55
+ /*
56
+ * The reload timer keeps running when the peripheral is enabled. It is a
57
+ * kind of wall clock that does not generate any interrupts. The callback
58
+ * needs to be provided, but it does nothing as the ptimer already supports
59
+ * all necessary reloading functionality.
60
+ */
61
s->timer_reload = ptimer_init(imx_epit_reload, s, PTIMER_POLICY_LEGACY);
62
63
+ /*
64
+ * The compare timer is running only when the peripheral configuration is
65
+ * in a state that will generate compare interrupts.
66
+ */
67
s->timer_cmp = ptimer_init(imx_epit_cmp, s, PTIMER_POLICY_LEGACY);
68
}
257
}
69
258
259
-#define SPITZ_GPIO_HSYNC        22
260
-#define SPITZ_GPIO_SD_DETECT        9
261
-#define SPITZ_GPIO_SD_WP        81
262
-#define SPITZ_GPIO_ON_RESET        89
263
-#define SPITZ_GPIO_BAT_COVER        90
264
-#define SPITZ_GPIO_CF1_IRQ        105
265
-#define SPITZ_GPIO_CF1_CD        94
266
-#define SPITZ_GPIO_CF2_IRQ        106
267
-#define SPITZ_GPIO_CF2_CD        93
268
+#define SPITZ_GPIO_HSYNC 22
269
+#define SPITZ_GPIO_SD_DETECT 9
270
+#define SPITZ_GPIO_SD_WP 81
271
+#define SPITZ_GPIO_ON_RESET 89
272
+#define SPITZ_GPIO_BAT_COVER 90
273
+#define SPITZ_GPIO_CF1_IRQ 105
274
+#define SPITZ_GPIO_CF1_CD 94
275
+#define SPITZ_GPIO_CF2_IRQ 106
276
+#define SPITZ_GPIO_CF2_CD 93
277
278
static int spitz_hsync;
279
280
@@ -XXX,XX +XXX,XX @@ static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
281
/* Board init. */
282
enum spitz_model_e { spitz, akita, borzoi, terrier };
283
284
-#define SPITZ_RAM    0x04000000
285
-#define SPITZ_ROM    0x00800000
286
+#define SPITZ_RAM 0x04000000
287
+#define SPITZ_ROM 0x00800000
288
289
static struct arm_boot_info spitz_binfo = {
290
.loader_start = PXA2XX_SDRAM_BASE,
70
--
291
--
71
2.25.1
292
2.20.1
293
294
diff view generated by jsdifflib
1
From: Axel Heider <axel.heider@hensoldt.net>
1
For the four Spitz-family machines (akita, borzoi, spitz, terrier)
2
2
create a proper abstract class SpitzMachineClass which encapsulates
3
remove unused defines, add needed defines
3
the common behaviour, rather than having them all derive directly
4
4
from TYPE_MACHINE:
5
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
5
* instead of each machine class setting mc->init to a wrapper
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
function which calls spitz_common_init() with parameters,
7
put that data in the SpitzMachineClass and make spitz_common_init
8
the SpitzMachineClass machine-init function
9
* move the settings of mc->block_default_type and
10
mc->ignore_memory_transaction_failures into the SpitzMachineClass
11
class init rather than repeating them in each machine's class init
12
13
(The motivation is that we're going to want to keep some state in
14
the SpitzMachineState so we can connect GPIOs between devices created
15
in one sub-function of the machine init to devices created in a
16
different sub-function.)
17
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
Message-id: 20200628142429.17111-3-peter.maydell@linaro.org
8
---
21
---
9
include/hw/timer/imx_epit.h | 4 ++--
22
hw/arm/spitz.c | 91 ++++++++++++++++++++++++++++++--------------------
10
hw/timer/imx_epit.c | 4 ++--
23
1 file changed, 55 insertions(+), 36 deletions(-)
11
2 files changed, 4 insertions(+), 4 deletions(-)
24
12
25
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
13
diff --git a/include/hw/timer/imx_epit.h b/include/hw/timer/imx_epit.h
14
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/timer/imx_epit.h
27
--- a/hw/arm/spitz.c
16
+++ b/include/hw/timer/imx_epit.h
28
+++ b/hw/arm/spitz.c
17
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@
18
#define CR_OCIEN (1 << 2)
30
#include "exec/address-spaces.h"
19
#define CR_RLD (1 << 3)
31
#include "cpu.h"
20
#define CR_PRESCALE_SHIFT (4)
32
21
-#define CR_PRESCALE_MASK (0xfff)
33
+enum spitz_model_e { spitz, akita, borzoi, terrier };
22
+#define CR_PRESCALE_BITS (12)
34
+
23
#define CR_SWR (1 << 16)
35
+typedef struct {
24
#define CR_IOVW (1 << 17)
36
+ MachineClass parent;
25
#define CR_DBGEN (1 << 18)
37
+ enum spitz_model_e model;
26
@@ -XXX,XX +XXX,XX @@
38
+ int arm_id;
27
#define CR_DOZEN (1 << 20)
39
+} SpitzMachineClass;
28
#define CR_STOPEN (1 << 21)
40
+
29
#define CR_CLKSRC_SHIFT (24)
41
+typedef struct {
30
-#define CR_CLKSRC_MASK (0x3 << CR_CLKSRC_SHIFT)
42
+ MachineState parent;
31
+#define CR_CLKSRC_BITS (2)
43
+} SpitzMachineState;
32
44
+
33
#define EPIT_TIMER_MAX 0XFFFFFFFFUL
45
+#define TYPE_SPITZ_MACHINE "spitz-common"
34
46
+#define SPITZ_MACHINE(obj) \
35
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
47
+ OBJECT_CHECK(SpitzMachineState, obj, TYPE_SPITZ_MACHINE)
36
index XXXXXXX..XXXXXXX 100644
48
+#define SPITZ_MACHINE_GET_CLASS(obj) \
37
--- a/hw/timer/imx_epit.c
49
+ OBJECT_GET_CLASS(SpitzMachineClass, obj, TYPE_SPITZ_MACHINE)
38
+++ b/hw/timer/imx_epit.c
50
+#define SPITZ_MACHINE_CLASS(klass) \
39
@@ -XXX,XX +XXX,XX @@ static void imx_epit_set_freq(IMXEPITState *s)
51
+ OBJECT_CLASS_CHECK(SpitzMachineClass, klass, TYPE_SPITZ_MACHINE)
40
uint32_t clksrc;
52
+
41
uint32_t prescaler;
53
#undef REG_FMT
42
54
#define REG_FMT "0x%02lx"
43
- clksrc = extract32(s->cr, CR_CLKSRC_SHIFT, 2);
55
44
- prescaler = 1 + extract32(s->cr, CR_PRESCALE_SHIFT, 12);
56
@@ -XXX,XX +XXX,XX @@ static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
45
+ clksrc = extract32(s->cr, CR_CLKSRC_SHIFT, CR_CLKSRC_BITS);
57
}
46
+ prescaler = 1 + extract32(s->cr, CR_PRESCALE_SHIFT, CR_PRESCALE_BITS);
58
47
59
/* Board init. */
48
s->freq = imx_ccm_get_clock_frequency(s->ccm,
60
-enum spitz_model_e { spitz, akita, borzoi, terrier };
49
imx_epit_clocks[clksrc]) / prescaler;
61
-
62
#define SPITZ_RAM 0x04000000
63
#define SPITZ_ROM 0x00800000
64
65
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info spitz_binfo = {
66
.ram_size = 0x04000000,
67
};
68
69
-static void spitz_common_init(MachineState *machine,
70
- enum spitz_model_e model, int arm_id)
71
+static void spitz_common_init(MachineState *machine)
72
{
73
+ SpitzMachineClass *smc = SPITZ_MACHINE_GET_CLASS(machine);
74
+ enum spitz_model_e model = smc->model;
75
PXA2xxState *mpu;
76
DeviceState *scp0, *scp1 = NULL;
77
MemoryRegion *address_space_mem = get_system_memory();
78
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine,
79
/* A 4.0 GB microdrive is permanently sitting in CF slot 0. */
80
spitz_microdrive_attach(mpu, 0);
81
82
- spitz_binfo.board_id = arm_id;
83
+ spitz_binfo.board_id = smc->arm_id;
84
arm_load_kernel(mpu->cpu, machine, &spitz_binfo);
85
sl_bootparam_write(SL_PXA_PARAM_BASE);
86
}
87
88
-static void spitz_init(MachineState *machine)
89
+static void spitz_common_class_init(ObjectClass *oc, void *data)
90
{
91
- spitz_common_init(machine, spitz, 0x2c9);
92
+ MachineClass *mc = MACHINE_CLASS(oc);
93
+
94
+ mc->block_default_type = IF_IDE;
95
+ mc->ignore_memory_transaction_failures = true;
96
+ mc->init = spitz_common_init;
97
}
98
99
-static void borzoi_init(MachineState *machine)
100
-{
101
- spitz_common_init(machine, borzoi, 0x33f);
102
-}
103
-
104
-static void akita_init(MachineState *machine)
105
-{
106
- spitz_common_init(machine, akita, 0x2e8);
107
-}
108
-
109
-static void terrier_init(MachineState *machine)
110
-{
111
- spitz_common_init(machine, terrier, 0x33f);
112
-}
113
+static const TypeInfo spitz_common_info = {
114
+ .name = TYPE_SPITZ_MACHINE,
115
+ .parent = TYPE_MACHINE,
116
+ .abstract = true,
117
+ .instance_size = sizeof(SpitzMachineState),
118
+ .class_size = sizeof(SpitzMachineClass),
119
+ .class_init = spitz_common_class_init,
120
+};
121
122
static void akitapda_class_init(ObjectClass *oc, void *data)
123
{
124
MachineClass *mc = MACHINE_CLASS(oc);
125
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
126
127
mc->desc = "Sharp SL-C1000 (Akita) PDA (PXA270)";
128
- mc->init = akita_init;
129
- mc->ignore_memory_transaction_failures = true;
130
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
131
+ smc->model = akita;
132
+ smc->arm_id = 0x2e8;
133
}
134
135
static const TypeInfo akitapda_type = {
136
.name = MACHINE_TYPE_NAME("akita"),
137
- .parent = TYPE_MACHINE,
138
+ .parent = TYPE_SPITZ_MACHINE,
139
.class_init = akitapda_class_init,
140
};
141
142
static void spitzpda_class_init(ObjectClass *oc, void *data)
143
{
144
MachineClass *mc = MACHINE_CLASS(oc);
145
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
146
147
mc->desc = "Sharp SL-C3000 (Spitz) PDA (PXA270)";
148
- mc->init = spitz_init;
149
- mc->block_default_type = IF_IDE;
150
- mc->ignore_memory_transaction_failures = true;
151
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
152
+ smc->model = spitz;
153
+ smc->arm_id = 0x2c9;
154
}
155
156
static const TypeInfo spitzpda_type = {
157
.name = MACHINE_TYPE_NAME("spitz"),
158
- .parent = TYPE_MACHINE,
159
+ .parent = TYPE_SPITZ_MACHINE,
160
.class_init = spitzpda_class_init,
161
};
162
163
static void borzoipda_class_init(ObjectClass *oc, void *data)
164
{
165
MachineClass *mc = MACHINE_CLASS(oc);
166
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
167
168
mc->desc = "Sharp SL-C3100 (Borzoi) PDA (PXA270)";
169
- mc->init = borzoi_init;
170
- mc->block_default_type = IF_IDE;
171
- mc->ignore_memory_transaction_failures = true;
172
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
173
+ smc->model = borzoi;
174
+ smc->arm_id = 0x33f;
175
}
176
177
static const TypeInfo borzoipda_type = {
178
.name = MACHINE_TYPE_NAME("borzoi"),
179
- .parent = TYPE_MACHINE,
180
+ .parent = TYPE_SPITZ_MACHINE,
181
.class_init = borzoipda_class_init,
182
};
183
184
static void terrierpda_class_init(ObjectClass *oc, void *data)
185
{
186
MachineClass *mc = MACHINE_CLASS(oc);
187
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
188
189
mc->desc = "Sharp SL-C3200 (Terrier) PDA (PXA270)";
190
- mc->init = terrier_init;
191
- mc->block_default_type = IF_IDE;
192
- mc->ignore_memory_transaction_failures = true;
193
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c5");
194
+ smc->model = terrier;
195
+ smc->arm_id = 0x33f;
196
}
197
198
static const TypeInfo terrierpda_type = {
199
.name = MACHINE_TYPE_NAME("terrier"),
200
- .parent = TYPE_MACHINE,
201
+ .parent = TYPE_SPITZ_MACHINE,
202
.class_init = terrierpda_class_init,
203
};
204
205
static void spitz_machine_init(void)
206
{
207
+ type_register_static(&spitz_common_info);
208
type_register_static(&akitapda_type);
209
type_register_static(&spitzpda_type);
210
type_register_static(&borzoipda_type);
50
--
211
--
51
2.25.1
212
2.20.1
213
214
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Keep pointers to the MPU and the SSI devices in SpitzMachineState.
2
We're going to want to make GPIO connections between some of the
3
SSI devices and the SCPs, so we want to keep hold of a pointer to
4
those; putting the MPU into the struct allows us to pass just
5
one thing to spitz_ssp_attach() rather than two.
2
6
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
We have to retain the setting of the global "max1111" variable
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
for the moment as it is used in spitz_adc_temp_on(); later in
5
Message-id: 20221220142520.24094-3-philmd@linaro.org
9
this series of commits we will be able to remove it.
10
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-id: 20200628142429.17111-4-peter.maydell@linaro.org
7
---
14
---
8
hw/arm/nseries.c | 18 +++++++++---------
15
hw/arm/spitz.c | 50 ++++++++++++++++++++++++++++----------------------
9
1 file changed, 9 insertions(+), 9 deletions(-)
16
1 file changed, 28 insertions(+), 22 deletions(-)
10
17
11
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
18
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
12
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/nseries.c
20
--- a/hw/arm/spitz.c
14
+++ b/hw/arm/nseries.c
21
+++ b/hw/arm/spitz.c
15
@@ -XXX,XX +XXX,XX @@ static void n8x0_i2c_setup(struct n800_s *s)
22
@@ -XXX,XX +XXX,XX @@ typedef struct {
23
24
typedef struct {
25
MachineState parent;
26
+ PXA2xxState *mpu;
27
+ DeviceState *mux;
28
+ DeviceState *lcdtg;
29
+ DeviceState *ads7846;
30
+ DeviceState *max1111;
31
} SpitzMachineState;
32
33
#define TYPE_SPITZ_MACHINE "spitz-common"
34
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_realize(SSISlave *d, Error **errp)
35
s->bus[2] = ssi_create_bus(dev, "ssi2");
16
}
36
}
17
37
18
/* Touchscreen and keypad controller */
38
-static void spitz_ssp_attach(PXA2xxState *cpu)
19
-static MouseTransformInfo n800_pointercal = {
39
+static void spitz_ssp_attach(SpitzMachineState *sms)
20
+static const MouseTransformInfo n800_pointercal = {
21
.x = 800,
22
.y = 480,
23
.a = { 14560, -68, -3455208, -39, -9621, 35152972, 65536 },
24
};
25
26
-static MouseTransformInfo n810_pointercal = {
27
+static const MouseTransformInfo n810_pointercal = {
28
.x = 800,
29
.y = 480,
30
.a = { 15041, 148, -4731056, 171, -10238, 35933380, 65536 },
31
@@ -XXX,XX +XXX,XX @@ static void n810_key_event(void *opaque, int keycode)
32
33
#define M    0
34
35
-static int n810_keys[0x80] = {
36
+static const int n810_keys[0x80] = {
37
[0x01] = 16,    /* Q */
38
[0x02] = 37,    /* K */
39
[0x03] = 24,    /* O */
40
@@ -XXX,XX +XXX,XX @@ static void n8x0_usb_setup(struct n800_s *s)
41
/* Setup done before the main bootloader starts by some early setup code
42
* - used when we want to run the main bootloader in emulation. This
43
* isn't documented. */
44
-static uint32_t n800_pinout[104] = {
45
+static const uint32_t n800_pinout[104] = {
46
0x080f00d8, 0x00d40808, 0x03080808, 0x080800d0,
47
0x00dc0808, 0x0b0f0f00, 0x080800b4, 0x00c00808,
48
0x08080808, 0x180800c4, 0x00b80000, 0x08080808,
49
@@ -XXX,XX +XXX,XX @@ static void n8x0_boot_init(void *opaque)
50
#define OMAP_TAG_CBUS        0x4e03
51
#define OMAP_TAG_EM_ASIC_BB5    0x4e04
52
53
-static struct omap_gpiosw_info_s {
54
+static const struct omap_gpiosw_info_s {
55
const char *name;
56
int line;
57
int type;
58
@@ -XXX,XX +XXX,XX @@ static struct omap_gpiosw_info_s {
59
{ NULL }
60
};
61
62
-static struct omap_partition_info_s {
63
+static const struct omap_partition_info_s {
64
uint32_t offset;
65
uint32_t size;
66
int mask;
67
@@ -XXX,XX +XXX,XX @@ static struct omap_partition_info_s {
68
{ 0, 0, 0, NULL }
69
};
70
71
-static uint8_t n8x0_bd_addr[6] = { N8X0_BD_ADDR };
72
+static const uint8_t n8x0_bd_addr[6] = { N8X0_BD_ADDR };
73
74
static int n8x0_atag_setup(void *p, int model)
75
{
40
{
76
uint8_t *b;
41
- DeviceState *mux;
77
uint16_t *w;
42
- DeviceState *dev;
78
uint32_t *l;
43
void *bus;
79
- struct omap_gpiosw_info_s *gpiosw;
44
80
- struct omap_partition_info_s *partition;
45
- mux = ssi_create_slave(cpu->ssp[CORGI_SSP_PORT - 1], "corgi-ssp");
81
+ const struct omap_gpiosw_info_s *gpiosw;
46
+ sms->mux = ssi_create_slave(sms->mpu->ssp[CORGI_SSP_PORT - 1], "corgi-ssp");
82
+ const struct omap_partition_info_s *partition;
47
83
const char *tag;
48
- bus = qdev_get_child_bus(mux, "ssi0");
84
49
- ssi_create_slave(bus, "spitz-lcdtg");
85
w = p;
50
+ bus = qdev_get_child_bus(sms->mux, "ssi0");
51
+ sms->lcdtg = ssi_create_slave(bus, "spitz-lcdtg");
52
53
- bus = qdev_get_child_bus(mux, "ssi1");
54
- dev = ssi_create_slave(bus, "ads7846");
55
- qdev_connect_gpio_out(dev, 0,
56
- qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_TP_INT));
57
+ bus = qdev_get_child_bus(sms->mux, "ssi1");
58
+ sms->ads7846 = ssi_create_slave(bus, "ads7846");
59
+ qdev_connect_gpio_out(sms->ads7846, 0,
60
+ qdev_get_gpio_in(sms->mpu->gpio, SPITZ_GPIO_TP_INT));
61
62
- bus = qdev_get_child_bus(mux, "ssi2");
63
- max1111 = ssi_create_slave(bus, "max1111");
64
- max111x_set_input(max1111, MAX1111_BATT_VOLT, SPITZ_BATTERY_VOLT);
65
- max111x_set_input(max1111, MAX1111_BATT_TEMP, 0);
66
- max111x_set_input(max1111, MAX1111_ACIN_VOLT, SPITZ_CHARGEON_ACIN);
67
+ bus = qdev_get_child_bus(sms->mux, "ssi2");
68
+ sms->max1111 = ssi_create_slave(bus, "max1111");
69
+ max1111 = sms->max1111;
70
+ max111x_set_input(sms->max1111, MAX1111_BATT_VOLT, SPITZ_BATTERY_VOLT);
71
+ max111x_set_input(sms->max1111, MAX1111_BATT_TEMP, 0);
72
+ max111x_set_input(sms->max1111, MAX1111_ACIN_VOLT, SPITZ_CHARGEON_ACIN);
73
74
- qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_LCDCON_CS,
75
- qdev_get_gpio_in(mux, 0));
76
- qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_ADS7846_CS,
77
- qdev_get_gpio_in(mux, 1));
78
- qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_MAX1111_CS,
79
- qdev_get_gpio_in(mux, 2));
80
+ qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_LCDCON_CS,
81
+ qdev_get_gpio_in(sms->mux, 0));
82
+ qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_ADS7846_CS,
83
+ qdev_get_gpio_in(sms->mux, 1));
84
+ qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_MAX1111_CS,
85
+ qdev_get_gpio_in(sms->mux, 2));
86
}
87
88
/* CF Microdrive */
89
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info spitz_binfo = {
90
static void spitz_common_init(MachineState *machine)
91
{
92
SpitzMachineClass *smc = SPITZ_MACHINE_GET_CLASS(machine);
93
+ SpitzMachineState *sms = SPITZ_MACHINE(machine);
94
enum spitz_model_e model = smc->model;
95
PXA2xxState *mpu;
96
DeviceState *scp0, *scp1 = NULL;
97
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
98
/* Setup CPU & memory */
99
mpu = pxa270_init(address_space_mem, spitz_binfo.ram_size,
100
machine->cpu_type);
101
+ sms->mpu = mpu;
102
103
sl_flash_register(mpu, (model == spitz) ? FLASH_128M : FLASH_1024M);
104
105
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
106
/* Setup peripherals */
107
spitz_keyboard_register(mpu);
108
109
- spitz_ssp_attach(mpu);
110
+ spitz_ssp_attach(sms);
111
112
scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
113
if (model != akita) {
86
--
114
--
87
2.25.1
115
2.20.1
88
116
89
117
diff view generated by jsdifflib
1
From: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
1
Keep pointers to scp0, scp1 in SpitzMachineState, and just pass
2
that to spitz_scoop_gpio_setup().
2
3
3
RVBAR shadows RVBAR_ELx where x is the highest exception
4
(We'll want to use some of the other fields in SpitzMachineState
4
level if the highest EL is not EL3. This patch also allows
5
in that function in the next commit.)
5
ARMv8 CPUs to change the reset address with
6
the rvbar property.
7
6
8
Signed-off-by: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Message-id: 20221206102504.165775-3-tobias.roehmel@rwth-aachen.de
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20200628142429.17111-5-peter.maydell@linaro.org
12
---
10
---
13
target/arm/cpu.c | 6 +++++-
11
hw/arm/spitz.c | 34 +++++++++++++++++++---------------
14
target/arm/helper.c | 21 ++++++++++++++-------
12
1 file changed, 19 insertions(+), 15 deletions(-)
15
2 files changed, 19 insertions(+), 8 deletions(-)
16
13
17
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
14
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.c
16
--- a/hw/arm/spitz.c
20
+++ b/target/arm/cpu.c
17
+++ b/hw/arm/spitz.c
21
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset_hold(Object *obj)
18
@@ -XXX,XX +XXX,XX @@ typedef struct {
22
env->cp15.cpacr_el1 = FIELD_DP64(env->cp15.cpacr_el1,
19
DeviceState *lcdtg;
23
CPACR, CP11, 3);
20
DeviceState *ads7846;
24
#endif
21
DeviceState *max1111;
25
+ if (arm_feature(env, ARM_FEATURE_V8)) {
22
+ DeviceState *scp0;
26
+ env->cp15.rvbar = cpu->rvbar_prop;
23
+ DeviceState *scp1;
27
+ env->regs[15] = cpu->rvbar_prop;
24
} SpitzMachineState;
28
+ }
25
26
#define TYPE_SPITZ_MACHINE "spitz-common"
27
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
28
#define SPITZ_SCP2_BACKLIGHT_ON 8
29
#define SPITZ_SCP2_MIC_BIAS 9
30
31
-static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
32
- DeviceState *scp0, DeviceState *scp1)
33
+static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
34
{
35
- qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, cpu, 8);
36
+ qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, sms->mpu, 8);
37
38
- qdev_connect_gpio_out(scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
39
- qdev_connect_gpio_out(scp0, SPITZ_SCP_JK_B, outsignals[1]);
40
- qdev_connect_gpio_out(scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
41
- qdev_connect_gpio_out(scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
42
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
43
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_JK_B, outsignals[1]);
44
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
45
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
46
47
- if (scp1) {
48
- qdev_connect_gpio_out(scp1, SPITZ_SCP2_BACKLIGHT_CONT, outsignals[4]);
49
- qdev_connect_gpio_out(scp1, SPITZ_SCP2_BACKLIGHT_ON, outsignals[5]);
50
+ if (sms->scp1) {
51
+ qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_CONT,
52
+ outsignals[4]);
53
+ qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_ON,
54
+ outsignals[5]);
29
}
55
}
30
56
31
#if defined(CONFIG_USER_ONLY)
57
- qdev_connect_gpio_out(scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
32
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
58
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
33
qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_hivecs_property);
59
}
60
61
#define SPITZ_GPIO_HSYNC 22
62
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
63
SpitzMachineState *sms = SPITZ_MACHINE(machine);
64
enum spitz_model_e model = smc->model;
65
PXA2xxState *mpu;
66
- DeviceState *scp0, *scp1 = NULL;
67
MemoryRegion *address_space_mem = get_system_memory();
68
MemoryRegion *rom = g_new(MemoryRegion, 1);
69
70
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
71
72
spitz_ssp_attach(sms);
73
74
- scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
75
+ sms->scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
76
if (model != akita) {
77
- scp1 = sysbus_create_simple("scoop", 0x08800040, NULL);
78
+ sms->scp1 = sysbus_create_simple("scoop", 0x08800040, NULL);
79
+ } else {
80
+ sms->scp1 = NULL;
34
}
81
}
35
82
36
- if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
83
- spitz_scoop_gpio_setup(mpu, scp0, scp1);
37
+ if (arm_feature(&cpu->env, ARM_FEATURE_V8)) {
84
+ spitz_scoop_gpio_setup(sms);
38
object_property_add_uint64_ptr(obj, "rvbar",
85
39
&cpu->rvbar_prop,
86
spitz_gpio_setup(mpu, (model == akita) ? 1 : 2);
40
OBJ_PROP_FLAG_READWRITE);
41
diff --git a/target/arm/helper.c b/target/arm/helper.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/helper.c
44
+++ b/target/arm/helper.c
45
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
46
if (!arm_feature(env, ARM_FEATURE_EL3) &&
47
!arm_feature(env, ARM_FEATURE_EL2)) {
48
ARMCPRegInfo rvbar = {
49
- .name = "RVBAR_EL1", .state = ARM_CP_STATE_AA64,
50
+ .name = "RVBAR_EL1", .state = ARM_CP_STATE_BOTH,
51
.opc0 = 3, .opc1 = 0, .crn = 12, .crm = 0, .opc2 = 1,
52
.access = PL1_R,
53
.fieldoffset = offsetof(CPUARMState, cp15.rvbar),
54
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
55
}
56
/* RVBAR_EL2 is only implemented if EL2 is the highest EL */
57
if (!arm_feature(env, ARM_FEATURE_EL3)) {
58
- ARMCPRegInfo rvbar = {
59
- .name = "RVBAR_EL2", .state = ARM_CP_STATE_AA64,
60
- .opc0 = 3, .opc1 = 4, .crn = 12, .crm = 0, .opc2 = 1,
61
- .access = PL2_R,
62
- .fieldoffset = offsetof(CPUARMState, cp15.rvbar),
63
+ ARMCPRegInfo rvbar[] = {
64
+ {
65
+ .name = "RVBAR_EL2", .state = ARM_CP_STATE_AA64,
66
+ .opc0 = 3, .opc1 = 4, .crn = 12, .crm = 0, .opc2 = 1,
67
+ .access = PL2_R,
68
+ .fieldoffset = offsetof(CPUARMState, cp15.rvbar),
69
+ },
70
+ { .name = "RVBAR", .type = ARM_CP_ALIAS,
71
+ .cp = 15, .opc1 = 0, .crn = 12, .crm = 0, .opc2 = 1,
72
+ .access = PL2_R,
73
+ .fieldoffset = offsetof(CPUARMState, cp15.rvbar),
74
+ },
75
};
76
- define_one_arm_cp_reg(cpu, &rvbar);
77
+ define_arm_cp_regs(cpu, rvbar);
78
}
79
}
80
87
81
--
88
--
82
2.25.1
89
2.20.1
83
90
84
91
diff view generated by jsdifflib
1
From: Fabiano Rosas <farosas@suse.de>
1
Currently the Spitz board uses a nasty hack for the GPIO lines
2
that pass "bit5" and "power" information to the LCD controller:
3
the lcdtg realize function sets a global variable to point to
4
the instance it just realized, and then the functions spitz_bl_power()
5
and spitz_bl_bit5() use that to find the device they are changing
6
the internal state of. There is a comment reading:
7
FIXME: Implement GPIO properly and remove this hack.
8
which was added in 2009.
2
9
3
Fix these:
10
Implement GPIO properly and remove this hack.
4
11
5
WARNING: Block comments use a leading /* on a separate line
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
WARNING: Block comments use * on subsequent lines
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
WARNING: Block comments use a trailing */ on a separate line
14
Message-id: 20200628142429.17111-6-peter.maydell@linaro.org
15
---
16
hw/arm/spitz.c | 28 ++++++++++++----------------
17
1 file changed, 12 insertions(+), 16 deletions(-)
8
18
9
Signed-off-by: Fabiano Rosas <farosas@suse.de>
19
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
10
Reviewed-by: Claudio Fontana <cfontana@suse.de>
11
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
12
Message-id: 20221213190537.511-2-farosas@suse.de
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
target/arm/helper.c | 323 +++++++++++++++++++++++++++++---------------
16
1 file changed, 215 insertions(+), 108 deletions(-)
17
18
diff --git a/target/arm/helper.c b/target/arm/helper.c
19
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/helper.c
21
--- a/hw/arm/spitz.c
21
+++ b/target/arm/helper.c
22
+++ b/hw/arm/spitz.c
22
@@ -XXX,XX +XXX,XX @@ uint64_t read_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri)
23
@@ -XXX,XX +XXX,XX @@ static void spitz_bl_update(SpitzLCDTG *s)
23
static void write_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri,
24
zaurus_printf("LCD Backlight now off\n");
24
uint64_t v)
25
}
26
27
-/* FIXME: Implement GPIO properly and remove this hack. */
28
-static SpitzLCDTG *spitz_lcdtg;
29
-
30
static inline void spitz_bl_bit5(void *opaque, int line, int level)
25
{
31
{
26
- /* Raw write of a coprocessor register (as needed for migration, etc).
32
- SpitzLCDTG *s = spitz_lcdtg;
27
+ /*
33
+ SpitzLCDTG *s = opaque;
28
+ * Raw write of a coprocessor register (as needed for migration, etc).
34
int prev = s->bl_intensity;
29
* Note that constant registers are treated as write-ignored; the
35
30
* caller should check for success by whether a readback gives the
36
if (level)
31
* value written.
37
@@ -XXX,XX +XXX,XX @@ static inline void spitz_bl_bit5(void *opaque, int line, int level)
32
@@ -XXX,XX +XXX,XX @@ static void write_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri,
38
33
39
static inline void spitz_bl_power(void *opaque, int line, int level)
34
static bool raw_accessors_invalid(const ARMCPRegInfo *ri)
35
{
40
{
36
- /* Return true if the regdef would cause an assertion if you called
41
- SpitzLCDTG *s = spitz_lcdtg;
37
+ /*
42
+ SpitzLCDTG *s = opaque;
38
+ * Return true if the regdef would cause an assertion if you called
43
s->bl_power = !!level;
39
* read_raw_cp_reg() or write_raw_cp_reg() on it (ie if it is a
44
spitz_bl_update(s);
40
* program bug for it not to have the NO_RAW flag).
45
}
41
* NB that returning false here doesn't necessarily mean that calling
46
@@ -XXX,XX +XXX,XX @@ static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
42
@@ -XXX,XX +XXX,XX @@ bool write_list_to_cpustate(ARMCPU *cpu)
47
return 0;
43
if (ri->type & ARM_CP_NO_RAW) {
48
}
44
continue;
49
45
}
50
-static void spitz_lcdtg_realize(SSISlave *dev, Error **errp)
46
- /* Write value and confirm it reads back as written
51
+static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
47
+ /*
48
+ * Write value and confirm it reads back as written
49
* (to catch read-only registers and partially read-only
50
* registers where the incoming migration value doesn't match)
51
*/
52
@@ -XXX,XX +XXX,XX @@ static gint cpreg_key_compare(gconstpointer a, gconstpointer b)
53
54
void init_cpreg_list(ARMCPU *cpu)
55
{
52
{
56
- /* Initialise the cpreg_tuples[] array based on the cp_regs hash.
53
- SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, dev);
57
+ /*
54
+ SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, ssi);
58
+ * Initialise the cpreg_tuples[] array based on the cp_regs hash.
55
+ DeviceState *dev = DEVICE(s);
59
* Note that we require cpreg_tuples[] to be sorted by key ID.
56
60
*/
57
- spitz_lcdtg = s;
61
GList *keys;
58
s->bl_power = 0;
62
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_el3_aa32ns(CPUARMState *env,
59
s->bl_intensity = 0x20;
63
return CP_ACCESS_OK;
60
+
61
+ qdev_init_gpio_in_named(dev, spitz_bl_bit5, "bl_bit5", 1);
62
+ qdev_init_gpio_in_named(dev, spitz_bl_power, "bl_power", 1);
64
}
63
}
65
64
66
-/* Some secure-only AArch32 registers trap to EL3 if used from
65
/* SSP devices */
67
+/*
66
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
68
+ * Some secure-only AArch32 registers trap to EL3 if used from
67
case 3:
69
* Secure EL1 (but are just ordinary UNDEF in other non-EL3 contexts).
68
zaurus_printf("Orange LED %s.\n", level ? "on" : "off");
70
* Note that an access from Secure EL1 can only happen if EL3 is AArch64.
69
break;
71
* We assume that the .access field is set to PL1_RW.
70
- case 4:
72
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_trap_aa32s_el1(CPUARMState *env,
71
- spitz_bl_bit5(opaque, line, level);
73
return CP_ACCESS_TRAP_UNCATEGORIZED;
72
- break;
74
}
73
- case 5:
75
74
- spitz_bl_power(opaque, line, level);
76
-/* Check for traps to performance monitor registers, which are controlled
75
- break;
77
+/*
76
case 6:
78
+ * Check for traps to performance monitor registers, which are controlled
77
spitz_adc_temp_on(opaque, line, level);
79
* by MDCR_EL2.TPM for EL2 and MDCR_EL3.TPM for EL3.
78
break;
80
*/
79
+ default:
81
static CPAccessResult access_tpm(CPUARMState *env, const ARMCPRegInfo *ri,
80
+ g_assert_not_reached();
82
@@ -XXX,XX +XXX,XX @@ static void fcse_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
83
ARMCPU *cpu = env_archcpu(env);
84
85
if (raw_read(env, ri) != value) {
86
- /* Unlike real hardware the qemu TLB uses virtual addresses,
87
+ /*
88
+ * Unlike real hardware the qemu TLB uses virtual addresses,
89
* not modified virtual addresses, so this causes a TLB flush.
90
*/
91
tlb_flush(CPU(cpu));
92
@@ -XXX,XX +XXX,XX @@ static void contextidr_write(CPUARMState *env, const ARMCPRegInfo *ri,
93
94
if (raw_read(env, ri) != value && !arm_feature(env, ARM_FEATURE_PMSA)
95
&& !extended_addresses_enabled(env)) {
96
- /* For VMSA (when not using the LPAE long descriptor page table
97
+ /*
98
+ * For VMSA (when not using the LPAE long descriptor page table
99
* format) this register includes the ASID, so do a TLB flush.
100
* For PMSA it is purely a process ID and no action is needed.
101
*/
102
@@ -XXX,XX +XXX,XX @@ static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
103
}
104
105
static const ARMCPRegInfo cp_reginfo[] = {
106
- /* Define the secure and non-secure FCSE identifier CP registers
107
+ /*
108
+ * Define the secure and non-secure FCSE identifier CP registers
109
* separately because there is no secure bank in V8 (no _EL3). This allows
110
* the secure register to be properly reset and migrated. There is also no
111
* v8 EL1 version of the register so the non-secure instance stands alone.
112
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo cp_reginfo[] = {
113
.access = PL1_RW, .secure = ARM_CP_SECSTATE_S,
114
.fieldoffset = offsetof(CPUARMState, cp15.fcseidr_s),
115
.resetvalue = 0, .writefn = fcse_write, .raw_writefn = raw_write, },
116
- /* Define the secure and non-secure context identifier CP registers
117
+ /*
118
+ * Define the secure and non-secure context identifier CP registers
119
* separately because there is no secure bank in V8 (no _EL3). This allows
120
* the secure register to be properly reset and migrated. In the
121
* non-secure case, the 32-bit register will have reset and migration
122
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo cp_reginfo[] = {
123
};
124
125
static const ARMCPRegInfo not_v8_cp_reginfo[] = {
126
- /* NB: Some of these registers exist in v8 but with more precise
127
+ /*
128
+ * NB: Some of these registers exist in v8 but with more precise
129
* definitions that don't use CP_ANY wildcards (mostly in v8_cp_reginfo[]).
130
*/
131
/* MMU Domain access control / MPU write buffer control */
132
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo not_v8_cp_reginfo[] = {
133
.writefn = dacr_write, .raw_writefn = raw_write,
134
.bank_fieldoffsets = { offsetoflow32(CPUARMState, cp15.dacr_s),
135
offsetoflow32(CPUARMState, cp15.dacr_ns) } },
136
- /* ARMv7 allocates a range of implementation defined TLB LOCKDOWN regs.
137
+ /*
138
+ * ARMv7 allocates a range of implementation defined TLB LOCKDOWN regs.
139
* For v6 and v5, these mappings are overly broad.
140
*/
141
{ .name = "TLB_LOCKDOWN", .cp = 15, .crn = 10, .crm = 0,
142
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo not_v8_cp_reginfo[] = {
143
};
144
145
static const ARMCPRegInfo not_v6_cp_reginfo[] = {
146
- /* Not all pre-v6 cores implemented this WFI, so this is slightly
147
+ /*
148
+ * Not all pre-v6 cores implemented this WFI, so this is slightly
149
* over-broad.
150
*/
151
{ .name = "WFI_v5", .cp = 15, .crn = 7, .crm = 8, .opc1 = 0, .opc2 = 2,
152
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo not_v6_cp_reginfo[] = {
153
};
154
155
static const ARMCPRegInfo not_v7_cp_reginfo[] = {
156
- /* Standard v6 WFI (also used in some pre-v6 cores); not in v7 (which
157
+ /*
158
+ * Standard v6 WFI (also used in some pre-v6 cores); not in v7 (which
159
* is UNPREDICTABLE; we choose to NOP as most implementations do).
160
*/
161
{ .name = "WFI_v6", .cp = 15, .crn = 7, .crm = 0, .opc1 = 0, .opc2 = 4,
162
.access = PL1_W, .type = ARM_CP_WFI },
163
- /* L1 cache lockdown. Not architectural in v6 and earlier but in practice
164
+ /*
165
+ * L1 cache lockdown. Not architectural in v6 and earlier but in practice
166
* implemented in 926, 946, 1026, 1136, 1176 and 11MPCore. StrongARM and
167
* OMAPCP will override this space.
168
*/
169
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo not_v7_cp_reginfo[] = {
170
{ .name = "DUMMY", .cp = 15, .crn = 0, .crm = 0, .opc1 = 1, .opc2 = CP_ANY,
171
.access = PL1_R, .type = ARM_CP_CONST | ARM_CP_NO_RAW,
172
.resetvalue = 0 },
173
- /* We don't implement pre-v7 debug but most CPUs had at least a DBGDIDR;
174
+ /*
175
+ * We don't implement pre-v7 debug but most CPUs had at least a DBGDIDR;
176
* implementing it as RAZ means the "debug architecture version" bits
177
* will read as a reserved value, which should cause Linux to not try
178
* to use the debug hardware.
179
*/
180
{ .name = "DBGDIDR", .cp = 14, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 0,
181
.access = PL0_R, .type = ARM_CP_CONST, .resetvalue = 0 },
182
- /* MMU TLB control. Note that the wildcarding means we cover not just
183
+ /*
184
+ * MMU TLB control. Note that the wildcarding means we cover not just
185
* the unified TLB ops but also the dside/iside/inner-shareable variants.
186
*/
187
{ .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY,
188
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
189
190
/* In ARMv8 most bits of CPACR_EL1 are RES0. */
191
if (!arm_feature(env, ARM_FEATURE_V8)) {
192
- /* ARMv7 defines bits for unimplemented coprocessors as RAZ/WI.
193
+ /*
194
+ * ARMv7 defines bits for unimplemented coprocessors as RAZ/WI.
195
* ASEDIS [31] and D32DIS [30] are both UNK/SBZP without VFP.
196
* TRCDIS [28] is RAZ/WI since we do not implement a trace macrocell.
197
*/
198
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
199
value |= R_CPACR_ASEDIS_MASK;
200
}
201
202
- /* VFPv3 and upwards with NEON implement 32 double precision
203
+ /*
204
+ * VFPv3 and upwards with NEON implement 32 double precision
205
* registers (D0-D31).
206
*/
207
if (!cpu_isar_feature(aa32_simd_r32, env_archcpu(env))) {
208
@@ -XXX,XX +XXX,XX @@ static uint64_t cpacr_read(CPUARMState *env, const ARMCPRegInfo *ri)
209
210
static void cpacr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
211
{
212
- /* Call cpacr_write() so that we reset with the correct RAO bits set
213
+ /*
214
+ * Call cpacr_write() so that we reset with the correct RAO bits set
215
* for our CPU features.
216
*/
217
cpacr_write(env, ri, 0);
218
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
219
{ .name = "MVA_prefetch",
220
.cp = 15, .crn = 7, .crm = 13, .opc1 = 0, .opc2 = 1,
221
.access = PL1_W, .type = ARM_CP_NOP },
222
- /* We need to break the TB after ISB to execute self-modifying code
223
+ /*
224
+ * We need to break the TB after ISB to execute self-modifying code
225
* correctly and also to take any pending interrupts immediately.
226
* So use arm_cp_write_ignore() function instead of ARM_CP_NOP flag.
227
*/
228
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
229
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.ifar_s),
230
offsetof(CPUARMState, cp15.ifar_ns) },
231
.resetvalue = 0, },
232
- /* Watchpoint Fault Address Register : should actually only be present
233
+ /*
234
+ * Watchpoint Fault Address Register : should actually only be present
235
* for 1136, 1176, 11MPCore.
236
*/
237
{ .name = "WFAR", .cp = 15, .crn = 6, .crm = 0, .opc1 = 0, .opc2 = 1,
238
@@ -XXX,XX +XXX,XX @@ static bool event_supported(uint16_t number)
239
static CPAccessResult pmreg_access(CPUARMState *env, const ARMCPRegInfo *ri,
240
bool isread)
241
{
242
- /* Performance monitor registers user accessibility is controlled
243
+ /*
244
+ * Performance monitor registers user accessibility is controlled
245
* by PMUSERENR. MDCR_EL2.TPM and MDCR_EL3.TPM allow configurable
246
* trapping to EL2 or EL3 for other accesses.
247
*/
248
@@ -XXX,XX +XXX,XX @@ static CPAccessResult pmreg_access_ccntr(CPUARMState *env,
249
(MDCR_HPME | MDCR_HPMD | MDCR_HPMN | MDCR_HCCD | MDCR_HLP)
250
#define MDCR_EL3_PMU_ENABLE_BITS (MDCR_SPME | MDCR_SCCD)
251
252
-/* Returns true if the counter (pass 31 for PMCCNTR) should count events using
253
+/*
254
+ * Returns true if the counter (pass 31 for PMCCNTR) should count events using
255
* the current EL, security state, and register configuration.
256
*/
257
static bool pmu_counter_enabled(CPUARMState *env, uint8_t counter)
258
@@ -XXX,XX +XXX,XX @@ static uint64_t pmccntr_read(CPUARMState *env, const ARMCPRegInfo *ri)
259
static void pmselr_write(CPUARMState *env, const ARMCPRegInfo *ri,
260
uint64_t value)
261
{
262
- /* The value of PMSELR.SEL affects the behavior of PMXEVTYPER and
263
+ /*
264
+ * The value of PMSELR.SEL affects the behavior of PMXEVTYPER and
265
* PMXEVCNTR. We allow [0..31] to be written to PMSELR here; in the
266
* meanwhile, we check PMSELR.SEL when PMXEVTYPER and PMXEVCNTR are
267
* accessed.
268
@@ -XXX,XX +XXX,XX @@ static void pmevtyper_write(CPUARMState *env, const ARMCPRegInfo *ri,
269
env->cp15.c14_pmevtyper[counter] = value & PMXEVTYPER_MASK;
270
pmevcntr_op_finish(env, counter);
271
}
272
- /* Attempts to access PMXEVTYPER are CONSTRAINED UNPREDICTABLE when
273
+ /*
274
+ * Attempts to access PMXEVTYPER are CONSTRAINED UNPREDICTABLE when
275
* PMSELR value is equal to or greater than the number of implemented
276
* counters, but not equal to 0x1f. We opt to behave as a RAZ/WI.
277
*/
278
@@ -XXX,XX +XXX,XX @@ static uint64_t pmevcntr_read(CPUARMState *env, const ARMCPRegInfo *ri,
279
}
280
return ret;
281
} else {
282
- /* We opt to behave as a RAZ/WI when attempts to access PM[X]EVCNTR
283
- * are CONSTRAINED UNPREDICTABLE. */
284
+ /*
285
+ * We opt to behave as a RAZ/WI when attempts to access PM[X]EVCNTR
286
+ * are CONSTRAINED UNPREDICTABLE.
287
+ */
288
return 0;
289
}
81
}
290
}
82
}
291
@@ -XXX,XX +XXX,XX @@ static void pmintenclr_write(CPUARMState *env, const ARMCPRegInfo *ri,
83
292
static void vbar_write(CPUARMState *env, const ARMCPRegInfo *ri,
84
@@ -XXX,XX +XXX,XX @@ static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
293
uint64_t value)
85
294
{
86
if (sms->scp1) {
295
- /* Note that even though the AArch64 view of this register has bits
87
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_CONT,
296
+ /*
88
- outsignals[4]);
297
+ * Note that even though the AArch64 view of this register has bits
89
+ qdev_get_gpio_in_named(sms->lcdtg, "bl_bit5", 0));
298
* [10:0] all RES0 we can only mask the bottom 5, to comply with the
90
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_ON,
299
* architectural requirements for bits which are RES0 only in some
91
- outsignals[5]);
300
* contexts. (ARMv8 would permit us to do no masking at all, but ARMv7
92
+ qdev_get_gpio_in_named(sms->lcdtg, "bl_power", 0));
301
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
302
if (!arm_feature(env, ARM_FEATURE_EL2)) {
303
valid_mask &= ~SCR_HCE;
304
305
- /* On ARMv7, SMD (or SCD as it is called in v7) is only
306
+ /*
307
+ * On ARMv7, SMD (or SCD as it is called in v7) is only
308
* supported if EL2 exists. The bit is UNK/SBZP when
309
* EL2 is unavailable. In QEMU ARMv7, we force it to always zero
310
* when EL2 is unavailable.
311
@@ -XXX,XX +XXX,XX @@ static uint64_t ccsidr_read(CPUARMState *env, const ARMCPRegInfo *ri)
312
{
313
ARMCPU *cpu = env_archcpu(env);
314
315
- /* Acquire the CSSELR index from the bank corresponding to the CCSIDR
316
+ /*
317
+ * Acquire the CSSELR index from the bank corresponding to the CCSIDR
318
* bank
319
*/
320
uint32_t index = A32_BANKED_REG_GET(env, csselr,
321
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
322
/* the old v6 WFI, UNPREDICTABLE in v7 but we choose to NOP */
323
{ .name = "NOP", .cp = 15, .crn = 7, .crm = 0, .opc1 = 0, .opc2 = 4,
324
.access = PL1_W, .type = ARM_CP_NOP },
325
- /* Performance monitors are implementation defined in v7,
326
+ /*
327
+ * Performance monitors are implementation defined in v7,
328
* but with an ARM recommended set of registers, which we
329
* follow.
330
*
331
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
332
.writefn = csselr_write, .resetvalue = 0,
333
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.csselr_s),
334
offsetof(CPUARMState, cp15.csselr_ns) } },
335
- /* Auxiliary ID register: this actually has an IMPDEF value but for now
336
+ /*
337
+ * Auxiliary ID register: this actually has an IMPDEF value but for now
338
* just RAZ for all cores:
339
*/
340
{ .name = "AIDR", .state = ARM_CP_STATE_BOTH,
341
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
342
.access = PL1_R, .type = ARM_CP_CONST,
343
.accessfn = access_aa64_tid1,
344
.resetvalue = 0 },
345
- /* Auxiliary fault status registers: these also are IMPDEF, and we
346
+ /*
347
+ * Auxiliary fault status registers: these also are IMPDEF, and we
348
* choose to RAZ/WI for all cores.
349
*/
350
{ .name = "AFSR0_EL1", .state = ARM_CP_STATE_BOTH,
351
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
352
.opc0 = 3, .opc1 = 0, .crn = 5, .crm = 1, .opc2 = 1,
353
.access = PL1_RW, .accessfn = access_tvm_trvm,
354
.type = ARM_CP_CONST, .resetvalue = 0 },
355
- /* MAIR can just read-as-written because we don't implement caches
356
+ /*
357
+ * MAIR can just read-as-written because we don't implement caches
358
* and so don't need to care about memory attributes.
359
*/
360
{ .name = "MAIR_EL1", .state = ARM_CP_STATE_AA64,
361
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
362
.opc0 = 3, .opc1 = 6, .crn = 10, .crm = 2, .opc2 = 0,
363
.access = PL3_RW, .fieldoffset = offsetof(CPUARMState, cp15.mair_el[3]),
364
.resetvalue = 0 },
365
- /* For non-long-descriptor page tables these are PRRR and NMRR;
366
+ /*
367
+ * For non-long-descriptor page tables these are PRRR and NMRR;
368
* regardless they still act as reads-as-written for QEMU.
369
*/
370
- /* MAIR0/1 are defined separately from their 64-bit counterpart which
371
+ /*
372
+ * MAIR0/1 are defined separately from their 64-bit counterpart which
373
* allows them to assign the correct fieldoffset based on the endianness
374
* handled in the field definitions.
375
*/
376
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6k_cp_reginfo[] = {
377
static CPAccessResult gt_cntfrq_access(CPUARMState *env, const ARMCPRegInfo *ri,
378
bool isread)
379
{
380
- /* CNTFRQ: not visible from PL0 if both PL0PCTEN and PL0VCTEN are zero.
381
+ /*
382
+ * CNTFRQ: not visible from PL0 if both PL0PCTEN and PL0VCTEN are zero.
383
* Writable only at the highest implemented exception level.
384
*/
385
int el = arm_current_el(env);
386
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gt_stimer_access(CPUARMState *env,
387
const ARMCPRegInfo *ri,
388
bool isread)
389
{
390
- /* The AArch64 register view of the secure physical timer is
391
+ /*
392
+ * The AArch64 register view of the secure physical timer is
393
* always accessible from EL3, and configurably accessible from
394
* Secure EL1.
395
*/
396
@@ -XXX,XX +XXX,XX @@ static void gt_recalc_timer(ARMCPU *cpu, int timeridx)
397
ARMGenericTimer *gt = &cpu->env.cp15.c14_timer[timeridx];
398
399
if (gt->ctl & 1) {
400
- /* Timer enabled: calculate and set current ISTATUS, irq, and
401
+ /*
402
+ * Timer enabled: calculate and set current ISTATUS, irq, and
403
* reset timer to when ISTATUS next has to change
404
*/
405
uint64_t offset = timeridx == GTIMER_VIRT ?
406
@@ -XXX,XX +XXX,XX @@ static void gt_recalc_timer(ARMCPU *cpu, int timeridx)
407
/* Next transition is when we hit cval */
408
nexttick = gt->cval + offset;
409
}
410
- /* Note that the desired next expiry time might be beyond the
411
+ /*
412
+ * Note that the desired next expiry time might be beyond the
413
* signed-64-bit range of a QEMUTimer -- in this case we just
414
* set the timer for as far in the future as possible. When the
415
* timer expires we will reset the timer for any remaining period.
416
@@ -XXX,XX +XXX,XX @@ static void gt_ctl_write(CPUARMState *env, const ARMCPRegInfo *ri,
417
/* Enable toggled */
418
gt_recalc_timer(cpu, timeridx);
419
} else if ((oldval ^ value) & 2) {
420
- /* IMASK toggled: don't need to recalculate,
421
+ /*
422
+ * IMASK toggled: don't need to recalculate,
423
* just set the interrupt line based on ISTATUS
424
*/
425
int irqstate = (oldval & 4) && !(value & 2);
426
@@ -XXX,XX +XXX,XX @@ static void arm_gt_cntfrq_reset(CPUARMState *env, const ARMCPRegInfo *opaque)
427
}
428
429
static const ARMCPRegInfo generic_timer_cp_reginfo[] = {
430
- /* Note that CNTFRQ is purely reads-as-written for the benefit
431
+ /*
432
+ * Note that CNTFRQ is purely reads-as-written for the benefit
433
* of software; writing it doesn't actually change the timer frequency.
434
* Our reset value matches the fixed frequency we implement the timer at.
435
*/
436
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo generic_timer_cp_reginfo[] = {
437
.readfn = gt_virt_redir_cval_read, .raw_readfn = raw_read,
438
.writefn = gt_virt_redir_cval_write, .raw_writefn = raw_write,
439
},
440
- /* Secure timer -- this is actually restricted to only EL3
441
+ /*
442
+ * Secure timer -- this is actually restricted to only EL3
443
* and configurably Secure-EL1 via the accessfn.
444
*/
445
{ .name = "CNTPS_TVAL_EL1", .state = ARM_CP_STATE_AA64,
446
@@ -XXX,XX +XXX,XX @@ static CPAccessResult e2h_access(CPUARMState *env, const ARMCPRegInfo *ri,
447
448
#else
449
450
-/* In user-mode most of the generic timer registers are inaccessible
451
+/*
452
+ * In user-mode most of the generic timer registers are inaccessible
453
* however modern kernels (4.12+) allow access to cntvct_el0
454
*/
455
456
@@ -XXX,XX +XXX,XX @@ static uint64_t gt_virt_cnt_read(CPUARMState *env, const ARMCPRegInfo *ri)
457
{
458
ARMCPU *cpu = env_archcpu(env);
459
460
- /* Currently we have no support for QEMUTimer in linux-user so we
461
+ /*
462
+ * Currently we have no support for QEMUTimer in linux-user so we
463
* can't call gt_get_countervalue(env), instead we directly
464
* call the lower level functions.
465
*/
466
@@ -XXX,XX +XXX,XX @@ static CPAccessResult ats_access(CPUARMState *env, const ARMCPRegInfo *ri,
467
bool isread)
468
{
469
if (ri->opc2 & 4) {
470
- /* The ATS12NSO* operations must trap to EL3 or EL2 if executed in
471
+ /*
472
+ * The ATS12NSO* operations must trap to EL3 or EL2 if executed in
473
* Secure EL1 (which can only happen if EL3 is AArch64).
474
* They are simply UNDEF if executed from NS EL1.
475
* They function normally from EL2 or EL3.
476
@@ -XXX,XX +XXX,XX @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
477
}
478
}
479
} else {
480
- /* fsr is a DFSR/IFSR value for the short descriptor
481
+ /*
482
+ * fsr is a DFSR/IFSR value for the short descriptor
483
* translation table format (with WnR always clear).
484
* Convert it to a 32-bit PAR.
485
*/
486
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo pmsav8r_cp_reginfo[] = {
487
};
488
489
static const ARMCPRegInfo pmsav7_cp_reginfo[] = {
490
- /* Reset for all these registers is handled in arm_cpu_reset(),
491
+ /*
492
+ * Reset for all these registers is handled in arm_cpu_reset(),
493
* because the PMSAv7 is also used by M-profile CPUs, which do
494
* not register cpregs but still need the state to be reset.
495
*/
496
@@ -XXX,XX +XXX,XX @@ static void vmsa_ttbcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
497
}
93
}
498
94
499
if (arm_feature(env, ARM_FEATURE_LPAE)) {
95
qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
500
- /* With LPAE the TTBCR could result in a change of ASID
501
+ /*
502
+ * With LPAE the TTBCR could result in a change of ASID
503
* via the TTBCR.A1 bit, so do a TLB flush.
504
*/
505
tlb_flush(CPU(cpu));
506
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vmsa_cp_reginfo[] = {
507
offsetoflow32(CPUARMState, cp15.tcr_el[1])} },
508
};
509
510
-/* Note that unlike TTBCR, writing to TTBCR2 does not require flushing
511
+/*
512
+ * Note that unlike TTBCR, writing to TTBCR2 does not require flushing
513
* qemu tlbs nor adjusting cached masks.
514
*/
515
static const ARMCPRegInfo ttbcr2_reginfo = {
516
@@ -XXX,XX +XXX,XX @@ static void omap_wfi_write(CPUARMState *env, const ARMCPRegInfo *ri,
517
static void omap_cachemaint_write(CPUARMState *env, const ARMCPRegInfo *ri,
518
uint64_t value)
519
{
520
- /* On OMAP there are registers indicating the max/min index of dcache lines
521
+ /*
522
+ * On OMAP there are registers indicating the max/min index of dcache lines
523
* containing a dirty line; cache flush operations have to reset these.
524
*/
525
env->cp15.c15_i_max = 0x000;
526
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo omap_cp_reginfo[] = {
527
.crm = 8, .opc1 = 0, .opc2 = 0, .access = PL1_RW,
528
.type = ARM_CP_NO_RAW,
529
.readfn = arm_cp_read_zero, .writefn = omap_wfi_write, },
530
- /* TODO: Peripheral port remap register:
531
+ /*
532
+ * TODO: Peripheral port remap register:
533
* On OMAP2 mcr p15, 0, rn, c15, c2, 4 sets up the interrupt controller
534
* base address at $rn & ~0xfff and map size of 0x200 << ($rn & 0xfff),
535
* when MMU is off.
536
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo xscale_cp_reginfo[] = {
537
.cp = 15, .crn = 1, .crm = 0, .opc1 = 0, .opc2 = 1, .access = PL1_RW,
538
.fieldoffset = offsetof(CPUARMState, cp15.c1_xscaleauxcr),
539
.resetvalue = 0, },
540
- /* XScale specific cache-lockdown: since we have no cache we NOP these
541
+ /*
542
+ * XScale specific cache-lockdown: since we have no cache we NOP these
543
* and hope the guest does not really rely on cache behaviour.
544
*/
545
{ .name = "XSCALE_LOCK_ICACHE_LINE",
546
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo xscale_cp_reginfo[] = {
547
};
548
549
static const ARMCPRegInfo dummy_c15_cp_reginfo[] = {
550
- /* RAZ/WI the whole crn=15 space, when we don't have a more specific
551
+ /*
552
+ * RAZ/WI the whole crn=15 space, when we don't have a more specific
553
* implementation of this implementation-defined space.
554
* Ideally this should eventually disappear in favour of actually
555
* implementing the correct behaviour for all cores.
556
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo cache_block_ops_cp_reginfo[] = {
557
};
558
559
static const ARMCPRegInfo cache_test_clean_cp_reginfo[] = {
560
- /* The cache test-and-clean instructions always return (1 << 30)
561
+ /*
562
+ * The cache test-and-clean instructions always return (1 << 30)
563
* to indicate that there are no dirty cache lines.
564
*/
565
{ .name = "TC_DCACHE", .cp = 15, .crn = 7, .crm = 10, .opc1 = 0, .opc2 = 3,
566
@@ -XXX,XX +XXX,XX @@ static uint64_t mpidr_read_val(CPUARMState *env)
567
568
if (arm_feature(env, ARM_FEATURE_V7MP)) {
569
mpidr |= (1U << 31);
570
- /* Cores which are uniprocessor (non-coherent)
571
+ /*
572
+ * Cores which are uniprocessor (non-coherent)
573
* but still implement the MP extensions set
574
* bit 30. (For instance, Cortex-R5).
575
*/
576
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tocu(CPUARMState *env, const ARMCPRegInfo *ri,
577
return do_cacheop_pou_access(env, HCR_TOCU | HCR_TPU);
578
}
579
580
-/* See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
581
+/*
582
+ * See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
583
* Page D4-1736 (DDI0487A.b)
584
*/
585
586
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
587
static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
588
uint64_t value)
589
{
590
- /* Invalidate by VA, EL2
591
+ /*
592
+ * Invalidate by VA, EL2
593
* Currently handles both VAE2 and VALE2, since we don't support
594
* flush-last-level-only.
595
*/
596
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
597
static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
598
uint64_t value)
599
{
600
- /* Invalidate by VA, EL3
601
+ /*
602
+ * Invalidate by VA, EL3
603
* Currently handles both VAE3 and VALE3, since we don't support
604
* flush-last-level-only.
605
*/
606
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
607
static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
608
uint64_t value)
609
{
610
- /* Invalidate by VA, EL1&0 (AArch64 version).
611
+ /*
612
+ * Invalidate by VA, EL1&0 (AArch64 version).
613
* Currently handles all of VAE1, VAAE1, VAALE1 and VALE1,
614
* since we don't support flush-for-specific-ASID-only or
615
* flush-last-level-only.
616
@@ -XXX,XX +XXX,XX @@ static CPAccessResult sp_el0_access(CPUARMState *env, const ARMCPRegInfo *ri,
617
bool isread)
618
{
619
if (!(env->pstate & PSTATE_SP)) {
620
- /* Access to SP_EL0 is undefined if it's being used as
621
+ /*
622
+ * Access to SP_EL0 is undefined if it's being used as
623
* the stack pointer.
624
*/
625
return CP_ACCESS_TRAP_UNCATEGORIZED;
626
@@ -XXX,XX +XXX,XX @@ static void sctlr_write(CPUARMState *env, const ARMCPRegInfo *ri,
627
}
628
629
if (raw_read(env, ri) == value) {
630
- /* Skip the TLB flush if nothing actually changed; Linux likes
631
+ /*
632
+ * Skip the TLB flush if nothing actually changed; Linux likes
633
* to do a lot of pointless SCTLR writes.
634
*/
635
return;
636
@@ -XXX,XX +XXX,XX @@ static void mdcr_el2_write(CPUARMState *env, const ARMCPRegInfo *ri,
637
}
638
639
static const ARMCPRegInfo v8_cp_reginfo[] = {
640
- /* Minimal set of EL0-visible registers. This will need to be expanded
641
+ /*
642
+ * Minimal set of EL0-visible registers. This will need to be expanded
643
* significantly for system emulation of AArch64 CPUs.
644
*/
645
{ .name = "NZCV", .state = ARM_CP_STATE_AA64,
646
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
647
.opc0 = 3, .opc1 = 0, .crn = 4, .crm = 0, .opc2 = 0,
648
.access = PL1_RW,
649
.fieldoffset = offsetof(CPUARMState, banked_spsr[BANK_SVC]) },
650
- /* We rely on the access checks not allowing the guest to write to the
651
+ /*
652
+ * We rely on the access checks not allowing the guest to write to the
653
* state field when SPSel indicates that it's being used as the stack
654
* pointer.
655
*/
656
@@ -XXX,XX +XXX,XX @@ static void do_hcr_write(CPUARMState *env, uint64_t value, uint64_t valid_mask)
657
if (arm_feature(env, ARM_FEATURE_EL3)) {
658
valid_mask &= ~HCR_HCD;
659
} else if (cpu->psci_conduit != QEMU_PSCI_CONDUIT_SMC) {
660
- /* Architecturally HCR.TSC is RES0 if EL3 is not implemented.
661
+ /*
662
+ * Architecturally HCR.TSC is RES0 if EL3 is not implemented.
663
* However, if we're using the SMC PSCI conduit then QEMU is
664
* effectively acting like EL3 firmware and so the guest at
665
* EL2 should retain the ability to prevent EL1 from being
666
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
667
.access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
668
.writefn = tlbi_aa64_vae2is_write },
669
#ifndef CONFIG_USER_ONLY
670
- /* Unlike the other EL2-related AT operations, these must
671
+ /*
672
+ * Unlike the other EL2-related AT operations, these must
673
* UNDEF from EL3 if EL2 is not implemented, which is why we
674
* define them here rather than with the rest of the AT ops.
675
*/
676
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
677
.access = PL2_W, .accessfn = at_s1e2_access,
678
.type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC | ARM_CP_EL3_NO_EL2_UNDEF,
679
.writefn = ats_write64 },
680
- /* The AArch32 ATS1H* operations are CONSTRAINED UNPREDICTABLE
681
+ /*
682
+ * The AArch32 ATS1H* operations are CONSTRAINED UNPREDICTABLE
683
* if EL2 is not implemented; we choose to UNDEF. Behaviour at EL3
684
* with SCR.NS == 0 outside Monitor mode is UNPREDICTABLE; we choose
685
* to behave as if SCR.NS was 1.
686
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
687
.writefn = ats1h_write, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC },
688
{ .name = "CNTHCTL_EL2", .state = ARM_CP_STATE_BOTH,
689
.opc0 = 3, .opc1 = 4, .crn = 14, .crm = 1, .opc2 = 0,
690
- /* ARMv7 requires bit 0 and 1 to reset to 1. ARMv8 defines the
691
+ /*
692
+ * ARMv7 requires bit 0 and 1 to reset to 1. ARMv8 defines the
693
* reset values as IMPDEF. We choose to reset to 3 to comply with
694
* both ARMv7 and ARMv8.
695
*/
696
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_sec_cp_reginfo[] = {
697
static CPAccessResult nsacr_access(CPUARMState *env, const ARMCPRegInfo *ri,
698
bool isread)
699
{
700
- /* The NSACR is RW at EL3, and RO for NS EL1 and NS EL2.
701
+ /*
702
+ * The NSACR is RW at EL3, and RO for NS EL1 and NS EL2.
703
* At Secure EL1 it traps to EL3 or EL2.
704
*/
705
if (arm_current_el(env) == 3) {
706
@@ -XXX,XX +XXX,XX @@ static void define_pmu_regs(ARMCPU *cpu)
707
}
708
}
709
710
-/* We don't know until after realize whether there's a GICv3
711
+/*
712
+ * We don't know until after realize whether there's a GICv3
713
* attached, and that is what registers the gicv3 sysregs.
714
* So we have to fill in the GIC fields in ID_PFR/ID_PFR1_EL1/ID_AA64PFR0_EL1
715
* at runtime.
716
@@ -XXX,XX +XXX,XX @@ static uint64_t id_aa64pfr0_read(CPUARMState *env, const ARMCPRegInfo *ri)
717
}
718
#endif
719
720
-/* Shared logic between LORID and the rest of the LOR* registers.
721
+/*
722
+ * Shared logic between LORID and the rest of the LOR* registers.
723
* Secure state exclusion has already been dealt with.
724
*/
725
static CPAccessResult access_lor_ns(CPUARMState *env,
726
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
727
728
define_arm_cp_regs(cpu, cp_reginfo);
729
if (!arm_feature(env, ARM_FEATURE_V8)) {
730
- /* Must go early as it is full of wildcards that may be
731
+ /*
732
+ * Must go early as it is full of wildcards that may be
733
* overridden by later definitions.
734
*/
735
define_arm_cp_regs(cpu, not_v8_cp_reginfo);
736
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
737
.access = PL1_R, .type = ARM_CP_CONST,
738
.accessfn = access_aa32_tid3,
739
.resetvalue = cpu->isar.id_pfr0 },
740
- /* ID_PFR1 is not a plain ARM_CP_CONST because we don't know
741
+ /*
742
+ * ID_PFR1 is not a plain ARM_CP_CONST because we don't know
743
* the value of the GIC field until after we define these regs.
744
*/
745
{ .name = "ID_PFR1", .state = ARM_CP_STATE_BOTH,
746
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
747
748
define_arm_cp_regs(cpu, el3_regs);
749
}
750
- /* The behaviour of NSACR is sufficiently various that we don't
751
+ /*
752
+ * The behaviour of NSACR is sufficiently various that we don't
753
* try to describe it in a single reginfo:
754
* if EL3 is 64 bit, then trap to EL3 from S EL1,
755
* reads as constant 0xc00 from NS EL1 and NS EL2
756
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
757
if (cpu_isar_feature(aa32_jazelle, cpu)) {
758
define_arm_cp_regs(cpu, jazelle_regs);
759
}
760
- /* Slightly awkwardly, the OMAP and StrongARM cores need all of
761
+ /*
762
+ * Slightly awkwardly, the OMAP and StrongARM cores need all of
763
* cp15 crn=0 to be writes-ignored, whereas for other cores they should
764
* be read-only (ie write causes UNDEF exception).
765
*/
766
{
767
ARMCPRegInfo id_pre_v8_midr_cp_reginfo[] = {
768
- /* Pre-v8 MIDR space.
769
+ /*
770
+ * Pre-v8 MIDR space.
771
* Note that the MIDR isn't a simple constant register because
772
* of the TI925 behaviour where writes to another register can
773
* cause the MIDR value to change.
774
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
775
if (arm_feature(env, ARM_FEATURE_OMAPCP) ||
776
arm_feature(env, ARM_FEATURE_STRONGARM)) {
777
size_t i;
778
- /* Register the blanket "writes ignored" value first to cover the
779
+ /*
780
+ * Register the blanket "writes ignored" value first to cover the
781
* whole space. Then update the specific ID registers to allow write
782
* access, so that they ignore writes rather than causing them to
783
* UNDEF.
784
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
785
.raw_writefn = raw_write,
786
};
787
if (arm_feature(env, ARM_FEATURE_XSCALE)) {
788
- /* Normally we would always end the TB on an SCTLR write, but Linux
789
+ /*
790
+ * Normally we would always end the TB on an SCTLR write, but Linux
791
* arch/arm/mach-pxa/sleep.S expects two instructions following
792
* an MMU enable to execute from cache. Imitate this behaviour.
793
*/
794
@@ -XXX,XX +XXX,XX @@ static void add_cpreg_to_hashtable(ARMCPU *cpu, const ARMCPRegInfo *r,
795
void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu,
796
const ARMCPRegInfo *r, void *opaque)
797
{
798
- /* Define implementations of coprocessor registers.
799
+ /*
800
+ * Define implementations of coprocessor registers.
801
* We store these in a hashtable because typically
802
* there are less than 150 registers in a space which
803
* is 16*16*16*8*8 = 262144 in size.
804
@@ -XXX,XX +XXX,XX @@ void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu,
805
default:
806
g_assert_not_reached();
807
}
808
- /* The AArch64 pseudocode CheckSystemAccess() specifies that op1
809
+ /*
810
+ * The AArch64 pseudocode CheckSystemAccess() specifies that op1
811
* encodes a minimum access level for the register. We roll this
812
* runtime check into our general permission check code, so check
813
* here that the reginfo's specified permissions are strict enough
814
@@ -XXX,XX +XXX,XX @@ void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu,
815
assert((r->access & ~mask) == 0);
816
}
817
818
- /* Check that the register definition has enough info to handle
819
+ /*
820
+ * Check that the register definition has enough info to handle
821
* reads and writes if they are permitted.
822
*/
823
if (!(r->type & (ARM_CP_SPECIAL_MASK | ARM_CP_CONST))) {
824
@@ -XXX,XX +XXX,XX @@ void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu,
825
continue;
826
}
827
if (state == ARM_CP_STATE_AA32) {
828
- /* Under AArch32 CP registers can be common
829
+ /*
830
+ * Under AArch32 CP registers can be common
831
* (same for secure and non-secure world) or banked.
832
*/
833
char *name;
834
@@ -XXX,XX +XXX,XX @@ void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu,
835
g_assert_not_reached();
836
}
837
} else {
838
- /* AArch64 registers get mapped to non-secure instance
839
- * of AArch32 */
840
+ /*
841
+ * AArch64 registers get mapped to non-secure instance
842
+ * of AArch32
843
+ */
844
add_cpreg_to_hashtable(cpu, r, opaque, state,
845
ARM_CP_SECSTATE_NS,
846
crm, opc1, opc2, r->name);
847
@@ -XXX,XX +XXX,XX @@ void arm_cp_reset_ignore(CPUARMState *env, const ARMCPRegInfo *opaque)
848
849
static int bad_mode_switch(CPUARMState *env, int mode, CPSRWriteType write_type)
850
{
851
- /* Return true if it is not valid for us to switch to
852
+ /*
853
+ * Return true if it is not valid for us to switch to
854
* this CPU mode (ie all the UNPREDICTABLE cases in
855
* the ARM ARM CPSRWriteByInstr pseudocode).
856
*/
857
@@ -XXX,XX +XXX,XX @@ static int bad_mode_switch(CPUARMState *env, int mode, CPSRWriteType write_type)
858
case ARM_CPU_MODE_UND:
859
case ARM_CPU_MODE_IRQ:
860
case ARM_CPU_MODE_FIQ:
861
- /* Note that we don't implement the IMPDEF NSACR.RFR which in v7
862
+ /*
863
+ * Note that we don't implement the IMPDEF NSACR.RFR which in v7
864
* allows FIQ mode to be Secure-only. (In v8 this doesn't exist.)
865
*/
866
- /* If HCR.TGE is set then changes from Monitor to NS PL1 via MSR
867
+ /*
868
+ * If HCR.TGE is set then changes from Monitor to NS PL1 via MSR
869
* and CPS are treated as illegal mode changes.
870
*/
871
if (write_type == CPSRWriteByInstr &&
872
@@ -XXX,XX +XXX,XX @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
873
env->GE = (val >> 16) & 0xf;
874
}
875
876
- /* In a V7 implementation that includes the security extensions but does
877
+ /*
878
+ * In a V7 implementation that includes the security extensions but does
879
* not include Virtualization Extensions the SCR.FW and SCR.AW bits control
880
* whether non-secure software is allowed to change the CPSR_F and CPSR_A
881
* bits respectively.
882
@@ -XXX,XX +XXX,XX @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
883
changed_daif = (env->daif ^ val) & mask;
884
885
if (changed_daif & CPSR_A) {
886
- /* Check to see if we are allowed to change the masking of async
887
+ /*
888
+ * Check to see if we are allowed to change the masking of async
889
* abort exceptions from a non-secure state.
890
*/
891
if (!(env->cp15.scr_el3 & SCR_AW)) {
892
@@ -XXX,XX +XXX,XX @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
893
}
894
895
if (changed_daif & CPSR_F) {
896
- /* Check to see if we are allowed to change the masking of FIQ
897
+ /*
898
+ * Check to see if we are allowed to change the masking of FIQ
899
* exceptions from a non-secure state.
900
*/
901
if (!(env->cp15.scr_el3 & SCR_FW)) {
902
@@ -XXX,XX +XXX,XX @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
903
mask &= ~CPSR_F;
904
}
905
906
- /* Check whether non-maskable FIQ (NMFI) support is enabled.
907
+ /*
908
+ * Check whether non-maskable FIQ (NMFI) support is enabled.
909
* If this bit is set software is not allowed to mask
910
* FIQs, but is allowed to set CPSR_F to 0.
911
*/
912
@@ -XXX,XX +XXX,XX @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
913
if (write_type != CPSRWriteRaw &&
914
((env->uncached_cpsr ^ val) & mask & CPSR_M)) {
915
if ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR) {
916
- /* Note that we can only get here in USR mode if this is a
917
+ /*
918
+ * Note that we can only get here in USR mode if this is a
919
* gdb stub write; for this case we follow the architectural
920
* behaviour for guest writes in USR mode of ignoring an attempt
921
* to switch mode. (Those are caught by translate.c for writes
922
@@ -XXX,XX +XXX,XX @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
923
*/
924
mask &= ~CPSR_M;
925
} else if (bad_mode_switch(env, val & CPSR_M, write_type)) {
926
- /* Attempt to switch to an invalid mode: this is UNPREDICTABLE in
927
+ /*
928
+ * Attempt to switch to an invalid mode: this is UNPREDICTABLE in
929
* v7, and has defined behaviour in v8:
930
* + leave CPSR.M untouched
931
* + allow changes to the other CPSR fields
932
@@ -XXX,XX +XXX,XX @@ static void switch_mode(CPUARMState *env, int mode)
933
env->regs[14] = env->banked_r14[r14_bank_number(mode)];
934
}
935
936
-/* Physical Interrupt Target EL Lookup Table
937
+/*
938
+ * Physical Interrupt Target EL Lookup Table
939
*
940
* [ From ARM ARM section G1.13.4 (Table G1-15) ]
941
*
942
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
943
if (arm_feature(env, ARM_FEATURE_EL3)) {
944
rw = ((env->cp15.scr_el3 & SCR_RW) == SCR_RW);
945
} else {
946
- /* Either EL2 is the highest EL (and so the EL2 register width
947
+ /*
948
+ * Either EL2 is the highest EL (and so the EL2 register width
949
* is given by is64); or there is no EL2 or EL3, in which case
950
* the value of 'rw' does not affect the table lookup anyway.
951
*/
952
@@ -XXX,XX +XXX,XX @@ void aarch64_sync_64_to_32(CPUARMState *env)
953
env->banked_r13[bank_number(ARM_CPU_MODE_UND)] = env->xregs[23];
954
}
955
956
- /* Registers x24-x30 are mapped to r8-r14 in FIQ mode. If we are in FIQ
957
+ /*
958
+ * Registers x24-x30 are mapped to r8-r14 in FIQ mode. If we are in FIQ
959
* mode, then we can copy to r8-r14. Otherwise, we copy to the
960
* FIQ bank for r8-r14.
961
*/
962
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch32(CPUState *cs)
963
/* High vectors. When enabled, base address cannot be remapped. */
964
addr += 0xffff0000;
965
} else {
966
- /* ARM v7 architectures provide a vector base address register to remap
967
+ /*
968
+ * ARM v7 architectures provide a vector base address register to remap
969
* the interrupt vector table.
970
* This register is only followed in non-monitor mode, and is banked.
971
* Note: only bits 31:5 are valid.
972
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
973
aarch64_sve_change_el(env, cur_el, new_el, is_a64(env));
974
975
if (cur_el < new_el) {
976
- /* Entry vector offset depends on whether the implemented EL
977
+ /*
978
+ * Entry vector offset depends on whether the implemented EL
979
* immediately lower than the target level is using AArch32 or AArch64
980
*/
981
bool is_aa64;
982
@@ -XXX,XX +XXX,XX @@ static void handle_semihosting(CPUState *cs)
983
}
984
#endif
985
986
-/* Handle a CPU exception for A and R profile CPUs.
987
+/*
988
+ * Handle a CPU exception for A and R profile CPUs.
989
* Do any appropriate logging, handle PSCI calls, and then hand off
990
* to the AArch64-entry or AArch32-entry function depending on the
991
* target exception level's register width.
992
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
993
}
994
#endif
995
996
- /* Hooks may change global state so BQL should be held, also the
997
+ /*
998
+ * Hooks may change global state so BQL should be held, also the
999
* BQL needs to be held for any modification of
1000
* cs->interrupt_request.
1001
*/
1002
@@ -XXX,XX +XXX,XX @@ ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va,
1003
};
1004
}
1005
1006
-/* Note that signed overflow is undefined in C. The following routines are
1007
- careful to use unsigned types where modulo arithmetic is required.
1008
- Failure to do so _will_ break on newer gcc. */
1009
+/*
1010
+ * Note that signed overflow is undefined in C. The following routines are
1011
+ * careful to use unsigned types where modulo arithmetic is required.
1012
+ * Failure to do so _will_ break on newer gcc.
1013
+ */
1014
1015
/* Signed saturating arithmetic. */
1016
1017
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(sel_flags)(uint32_t flags, uint32_t a, uint32_t b)
1018
return (a & mask) | (b & ~mask);
1019
}
1020
1021
-/* CRC helpers.
1022
+/*
1023
+ * CRC helpers.
1024
* The upper bytes of val (above the number specified by 'bytes') must have
1025
* been zeroed out by the caller.
1026
*/
1027
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(crc32c)(uint32_t acc, uint32_t val, uint32_t bytes)
1028
return crc32c(acc, buf, bytes) ^ 0xffffffff;
1029
}
1030
1031
-/* Return the exception level to which FP-disabled exceptions should
1032
+/*
1033
+ * Return the exception level to which FP-disabled exceptions should
1034
* be taken, or 0 if FP is enabled.
1035
*/
1036
int fp_exception_el(CPUARMState *env, int cur_el)
1037
@@ -XXX,XX +XXX,XX @@ int fp_exception_el(CPUARMState *env, int cur_el)
1038
#ifndef CONFIG_USER_ONLY
1039
uint64_t hcr_el2;
1040
1041
- /* CPACR and the CPTR registers don't exist before v6, so FP is
1042
+ /*
1043
+ * CPACR and the CPTR registers don't exist before v6, so FP is
1044
* always accessible
1045
*/
1046
if (!arm_feature(env, ARM_FEATURE_V6)) {
1047
@@ -XXX,XX +XXX,XX @@ int fp_exception_el(CPUARMState *env, int cur_el)
1048
1049
hcr_el2 = arm_hcr_el2_eff(env);
1050
1051
- /* The CPACR controls traps to EL1, or PL1 if we're 32 bit:
1052
+ /*
1053
+ * The CPACR controls traps to EL1, or PL1 if we're 32 bit:
1054
* 0, 2 : trap EL0 and EL1/PL1 accesses
1055
* 1 : trap only EL0 accesses
1056
* 3 : trap no accesses
1057
--
96
--
1058
2.25.1
97
2.20.1
98
99
diff view generated by jsdifflib
1
From: Axel Heider <axel.heider@hensoldt.net>
1
Add some QOM properties to the max111x ADC device to allow the
2
initial values to be configured. Currently this is done by
3
board code calling max111x_set_input() after it creates the
4
device, which doesn't work on system reset.
2
5
3
- fix #1263 for CR writes
6
This requires us to implement a reset method for this device,
4
- rework compare time handling
7
so while we're doing that make sure we reset the other parts
5
- The compare timer has to run even if CR.OCIEN is not set,
8
of the device state.
6
as SR.OCIF must be updated.
7
- The compare timer fires exactly once when the
8
compare value is less than the current value, but the
9
reload values is less than the compare value.
10
- The compare timer will never fire if the reload value is
11
less than the compare value. Disable it in this case.
12
9
13
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
14
[PMM: fixed minor style nits]
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-id: 20200628142429.17111-7-peter.maydell@linaro.org
17
---
14
---
18
hw/timer/imx_epit.c | 192 ++++++++++++++++++++++++++------------------
15
hw/misc/max111x.c | 57 ++++++++++++++++++++++++++++++++++++++---------
19
1 file changed, 116 insertions(+), 76 deletions(-)
16
1 file changed, 47 insertions(+), 10 deletions(-)
20
17
21
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
18
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
22
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/timer/imx_epit.c
20
--- a/hw/misc/max111x.c
24
+++ b/hw/timer/imx_epit.c
21
+++ b/hw/misc/max111x.c
25
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
26
* Originally written by Hans Jiang
23
#include "hw/ssi/ssi.h"
27
* Updated by Peter Chubb
24
#include "migration/vmstate.h"
28
* Updated by Jean-Christophe Dubois <jcd@tribudubois.net>
25
#include "qemu/module.h"
29
+ * Updated by Axel Heider
26
+#include "hw/qdev-properties.h"
30
*
27
31
* This code is licensed under GPL version 2 or later. See
28
typedef struct {
32
* the COPYING file in the top-level directory.
29
SSISlave parent_obj;
33
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_epit_read(void *opaque, hwaddr offset, unsigned size)
30
34
return reg_value;
31
qemu_irq interrupt;
32
+ /* Values of inputs at system reset (settable by QOM property) */
33
+ uint8_t reset_input[8];
34
+
35
uint8_t tb1, rb2, rb3;
36
int cycle;
37
38
@@ -XXX,XX +XXX,XX @@ static int max111x_init(SSISlave *d, int inputs)
39
qdev_init_gpio_out(dev, &s->interrupt, 1);
40
41
s->inputs = inputs;
42
- /* TODO: add a user interface for setting these */
43
- s->input[0] = 0xf0;
44
- s->input[1] = 0xe0;
45
- s->input[2] = 0xd0;
46
- s->input[3] = 0xc0;
47
- s->input[4] = 0xb0;
48
- s->input[5] = 0xa0;
49
- s->input[6] = 0x90;
50
- s->input[7] = 0x80;
51
- s->com = 0;
52
53
vmstate_register(VMSTATE_IF(dev), VMSTATE_INSTANCE_ID_ANY,
54
&vmstate_max111x, s);
55
@@ -XXX,XX +XXX,XX @@ void max111x_set_input(DeviceState *dev, int line, uint8_t value)
56
s->input[line] = value;
35
}
57
}
36
58
37
-/* Must be called from ptimer_transaction_begin/commit block for s->timer_cmp */
59
+static void max111x_reset(DeviceState *dev)
38
-static void imx_epit_reload_compare_timer(IMXEPITState *s)
60
+{
39
+/*
61
+ MAX111xState *s = MAX_111X(dev);
40
+ * Must be called from a ptimer_transaction_begin/commit block for
62
+ int i;
41
+ * s->timer_cmp, but outside of a transaction block of s->timer_reload,
63
+
42
+ * so the proper counter value is read.
64
+ for (i = 0; i < s->inputs; i++) {
43
+ */
65
+ s->input[i] = s->reset_input[i];
44
+static void imx_epit_update_compare_timer(IMXEPITState *s)
66
+ }
67
+ s->com = 0;
68
+ s->tb1 = 0;
69
+ s->rb2 = 0;
70
+ s->rb3 = 0;
71
+ s->cycle = 0;
72
+}
73
+
74
+static Property max1110_properties[] = {
75
+ /* Reset values for ADC inputs */
76
+ DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
77
+ DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
78
+ DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
79
+ DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
80
+ DEFINE_PROP_END_OF_LIST(),
81
+};
82
+
83
+static Property max1111_properties[] = {
84
+ /* Reset values for ADC inputs */
85
+ DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
86
+ DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
87
+ DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
88
+ DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
89
+ DEFINE_PROP_UINT8("input4", MAX111xState, reset_input[4], 0xb0),
90
+ DEFINE_PROP_UINT8("input5", MAX111xState, reset_input[5], 0xa0),
91
+ DEFINE_PROP_UINT8("input6", MAX111xState, reset_input[6], 0x90),
92
+ DEFINE_PROP_UINT8("input7", MAX111xState, reset_input[7], 0x80),
93
+ DEFINE_PROP_END_OF_LIST(),
94
+};
95
+
96
static void max111x_class_init(ObjectClass *klass, void *data)
45
{
97
{
46
- if ((s->cr & (CR_EN | CR_OCIEN)) == (CR_EN | CR_OCIEN)) {
98
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
47
- /* if the compare feature is on and timers are running */
99
+ DeviceClass *dc = DEVICE_CLASS(klass);
48
- uint32_t tmp = ptimer_get_count(s->timer_reload);
100
49
- uint64_t next;
101
k->transfer = max111x_transfer;
50
- if (tmp > s->cmp) {
102
+ dc->reset = max111x_reset;
51
- /* It'll fire in this round of the timer */
52
- next = tmp - s->cmp;
53
- } else { /* catch it next time around */
54
- next = tmp - s->cmp + ((s->cr & CR_RLD) ? EPIT_TIMER_MAX : s->lr);
55
+ uint64_t counter = 0;
56
+ bool is_oneshot = false;
57
+ /*
58
+ * The compare timer only has to run if the timer peripheral is active
59
+ * and there is an input clock, Otherwise it can be switched off.
60
+ */
61
+ bool is_active = (s->cr & CR_EN) && imx_epit_get_freq(s);
62
+ if (is_active) {
63
+ /*
64
+ * Calculate next timeout for compare timer. Reading the reload
65
+ * counter returns proper results only if pending transactions
66
+ * on it are committed here. Otherwise stale values are be read.
67
+ */
68
+ counter = ptimer_get_count(s->timer_reload);
69
+ uint64_t limit = ptimer_get_limit(s->timer_cmp);
70
+ /*
71
+ * The compare timer is a periodic timer if the limit is at least
72
+ * the compare value. Otherwise it may fire at most once in the
73
+ * current round.
74
+ */
75
+ bool is_oneshot = (limit >= s->cmp);
76
+ if (counter >= s->cmp) {
77
+ /* The compare timer fires in the current round. */
78
+ counter -= s->cmp;
79
+ } else if (!is_oneshot) {
80
+ /*
81
+ * The compare timer fires after a reload, as it is below the
82
+ * compare value already in this round. Note that the counter
83
+ * value calculated below can be above the 32-bit limit, which
84
+ * is legal here because the compare timer is an internal
85
+ * helper ptimer only.
86
+ */
87
+ counter += limit - s->cmp;
88
+ } else {
89
+ /*
90
+ * The compare timer won't fire in this round, and the limit is
91
+ * set to a value below the compare value. This practically means
92
+ * it will never fire, so it can be switched off.
93
+ */
94
+ is_active = false;
95
}
96
- ptimer_set_count(s->timer_cmp, next);
97
}
98
+
99
+ /*
100
+ * Set the compare timer and let it run, or stop it. This is agnostic
101
+ * of CR.OCIEN bit, as this bit affects interrupt generation only. The
102
+ * compare timer needs to run even if no interrupts are to be generated,
103
+ * because the SR.OCIF bit must be updated also.
104
+ * Note that the timer might already be stopped or be running with
105
+ * counter values. However, finding out when an update is needed and
106
+ * when not is not trivial. It's much easier applying the setting again,
107
+ * as this does not harm either and the overhead is negligible.
108
+ */
109
+ if (is_active) {
110
+ ptimer_set_count(s->timer_cmp, counter);
111
+ ptimer_run(s->timer_cmp, is_oneshot ? 1 : 0);
112
+ } else {
113
+ ptimer_stop(s->timer_cmp);
114
+ }
115
+
116
}
103
}
117
104
118
static void imx_epit_write_cr(IMXEPITState *s, uint32_t value)
105
static const TypeInfo max111x_info = {
106
@@ -XXX,XX +XXX,XX @@ static const TypeInfo max111x_info = {
107
static void max1110_class_init(ObjectClass *klass, void *data)
119
{
108
{
120
- uint32_t freq = 0;
109
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
121
uint32_t oldcr = s->cr;
110
+ DeviceClass *dc = DEVICE_CLASS(klass);
122
111
123
s->cr = value & 0x03ffffff;
112
k->realize = max1110_realize;
124
113
+ device_class_set_props(dc, max1110_properties);
125
if (s->cr & CR_SWR) {
126
- /* handle the reset */
127
+ /*
128
+ * Reset clears CR.SWR again. It does not touch CR.EN, but the timers
129
+ * are still stopped because the input clock is disabled.
130
+ */
131
imx_epit_reset(s, false);
132
+ } else {
133
+ uint32_t freq;
134
+ uint32_t toggled_cr_bits = oldcr ^ s->cr;
135
+ /* re-initialize the limits if CR.RLD has changed */
136
+ bool set_limit = toggled_cr_bits & CR_RLD;
137
+ /* set the counter if the timer got just enabled and CR.ENMOD is set */
138
+ bool is_switched_on = (toggled_cr_bits & s->cr) & CR_EN;
139
+ bool set_counter = is_switched_on && (s->cr & CR_ENMOD);
140
+
141
+ ptimer_transaction_begin(s->timer_cmp);
142
+ ptimer_transaction_begin(s->timer_reload);
143
+ freq = imx_epit_get_freq(s);
144
+ if (freq) {
145
+ ptimer_set_freq(s->timer_reload, freq);
146
+ ptimer_set_freq(s->timer_cmp, freq);
147
+ }
148
+
149
+ if (set_limit || set_counter) {
150
+ uint64_t limit = (s->cr & CR_RLD) ? s->lr : EPIT_TIMER_MAX;
151
+ ptimer_set_limit(s->timer_reload, limit, set_counter ? 1 : 0);
152
+ if (set_limit) {
153
+ ptimer_set_limit(s->timer_cmp, limit, 0);
154
+ }
155
+ }
156
+ /*
157
+ * If there is an input clock and the peripheral is enabled, then
158
+ * ensure the wall clock timer is ticking. Otherwise stop the timers.
159
+ * The compare timer will be updated later.
160
+ */
161
+ if (freq && (s->cr & CR_EN)) {
162
+ ptimer_run(s->timer_reload, 0);
163
+ } else {
164
+ ptimer_stop(s->timer_reload);
165
+ }
166
+ /* Commit changes to reload timer, so they can propagate. */
167
+ ptimer_transaction_commit(s->timer_reload);
168
+ /* Update compare timer based on the committed reload timer value. */
169
+ imx_epit_update_compare_timer(s);
170
+ ptimer_transaction_commit(s->timer_cmp);
171
}
172
173
/*
174
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write_cr(IMXEPITState *s, uint32_t value)
175
* - write to CR.EN or CR.OCIE
176
*/
177
imx_epit_update_int(s);
178
-
179
- /*
180
- * TODO: could we 'break' here for reset? following operations appear
181
- * to duplicate the work imx_epit_reset() already did.
182
- */
183
-
184
- ptimer_transaction_begin(s->timer_cmp);
185
- ptimer_transaction_begin(s->timer_reload);
186
-
187
- /*
188
- * Update the frequency. In case of a reset the input clock was
189
- * switched off, so this can be skipped.
190
- */
191
- if (!(s->cr & CR_SWR)) {
192
- freq = imx_epit_get_freq(s);
193
- if (freq) {
194
- ptimer_set_freq(s->timer_reload, freq);
195
- ptimer_set_freq(s->timer_cmp, freq);
196
- }
197
- }
198
-
199
- if (freq && (s->cr & CR_EN) && !(oldcr & CR_EN)) {
200
- if (s->cr & CR_ENMOD) {
201
- if (s->cr & CR_RLD) {
202
- ptimer_set_limit(s->timer_reload, s->lr, 1);
203
- ptimer_set_limit(s->timer_cmp, s->lr, 1);
204
- } else {
205
- ptimer_set_limit(s->timer_reload, EPIT_TIMER_MAX, 1);
206
- ptimer_set_limit(s->timer_cmp, EPIT_TIMER_MAX, 1);
207
- }
208
- }
209
-
210
- imx_epit_reload_compare_timer(s);
211
- ptimer_run(s->timer_reload, 0);
212
- if (s->cr & CR_OCIEN) {
213
- ptimer_run(s->timer_cmp, 0);
214
- } else {
215
- ptimer_stop(s->timer_cmp);
216
- }
217
- } else if (!(s->cr & CR_EN)) {
218
- /* stop both timers */
219
- ptimer_stop(s->timer_reload);
220
- ptimer_stop(s->timer_cmp);
221
- } else if (s->cr & CR_OCIEN) {
222
- if (!(oldcr & CR_OCIEN)) {
223
- imx_epit_reload_compare_timer(s);
224
- ptimer_run(s->timer_cmp, 0);
225
- }
226
- } else {
227
- ptimer_stop(s->timer_cmp);
228
- }
229
-
230
- ptimer_transaction_commit(s->timer_cmp);
231
- ptimer_transaction_commit(s->timer_reload);
232
}
114
}
233
115
234
static void imx_epit_write_sr(IMXEPITState *s, uint32_t value)
116
static const TypeInfo max1110_info = {
235
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write_lr(IMXEPITState *s, uint32_t value)
117
@@ -XXX,XX +XXX,XX @@ static const TypeInfo max1110_info = {
236
/* If IOVW bit is set then set the timer value */
118
static void max1111_class_init(ObjectClass *klass, void *data)
237
ptimer_set_count(s->timer_reload, s->lr);
119
{
238
}
120
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
239
- /*
121
+ DeviceClass *dc = DEVICE_CLASS(klass);
240
- * Commit the change to s->timer_reload, so it can propagate. Otherwise
122
241
- * the timer interrupt may not fire properly. The commit must happen
123
k->realize = max1111_realize;
242
- * before calling imx_epit_reload_compare_timer(), which reads
124
+ device_class_set_props(dc, max1111_properties);
243
- * s->timer_reload internally again.
244
- */
245
+ /* Commit the changes to s->timer_reload, so they can propagate. */
246
ptimer_transaction_commit(s->timer_reload);
247
- imx_epit_reload_compare_timer(s);
248
+ /* Update the compare timer based on the committed reload timer value. */
249
+ imx_epit_update_compare_timer(s);
250
ptimer_transaction_commit(s->timer_cmp);
251
}
125
}
252
126
253
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write_cmp(IMXEPITState *s, uint32_t value)
127
static const TypeInfo max1111_info = {
254
{
255
s->cmp = value;
256
257
+ /* Update the compare timer based on the committed reload timer value. */
258
ptimer_transaction_begin(s->timer_cmp);
259
- imx_epit_reload_compare_timer(s);
260
+ imx_epit_update_compare_timer(s);
261
ptimer_transaction_commit(s->timer_cmp);
262
}
263
264
@@ -XXX,XX +XXX,XX @@ static void imx_epit_cmp(void *opaque)
265
{
266
IMXEPITState *s = IMX_EPIT(opaque);
267
268
+ /* The cmp ptimer can't be running when the peripheral is disabled */
269
+ assert(s->cr & CR_EN);
270
+
271
DPRINTF("sr was %d\n", s->sr);
272
/* Set interrupt status bit SR.OCIF and update the interrupt state */
273
s->sr |= SR_OCIF;
274
--
128
--
275
2.25.1
129
2.20.1
130
131
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
The max111x is a proper qdev device; we can use dc->vmsd rather than
2
directly calling vmstate_register().
2
3
3
When using Clang ("Apple clang version 14.0.0 (clang-1400.0.29.202)")
4
It's possible that this is a migration compat break, but the only
4
and building with -Wall we get:
5
boards that use this device are the spitz-family ('akita', 'borzoi',
6
'spitz', 'terrier').
5
7
6
hw/arm/smmu-common.c:173:33: warning: static function 'smmu_hash_remove_by_asid_iova' is used in an inline function with external linkage [-Wstatic-in-inline]
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
hw/arm/smmu-common.h:170:1: note: use 'static' to give inline function 'smmu_iotlb_inv_iova' internal linkage
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
void smmu_iotlb_inv_iova(SMMUState *s, int asid, dma_addr_t iova,
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
^
11
Message-id: 20200628142429.17111-8-peter.maydell@linaro.org
10
static
12
---
13
hw/misc/max111x.c | 3 +--
14
1 file changed, 1 insertion(+), 2 deletions(-)
11
15
12
None of our code base require / use inlined functions with external
16
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
13
linkage. Some places use internal inlining in the hot path. These
14
two functions are certainly not in any hot path and don't justify
15
any inlining, so these are likely oversights rather than intentional.
16
17
Reported-by: Stefan Weil <sw@weilnetz.de>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Reviewed-by: Eric Auger <eric.auger@redhat.com>
22
Message-id: 20221216214924.4711-3-philmd@linaro.org
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
25
hw/arm/smmu-common.c | 13 ++++++-------
26
1 file changed, 6 insertions(+), 7 deletions(-)
27
28
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
29
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/arm/smmu-common.c
18
--- a/hw/misc/max111x.c
31
+++ b/hw/arm/smmu-common.c
19
+++ b/hw/misc/max111x.c
32
@@ -XXX,XX +XXX,XX @@ void smmu_iotlb_insert(SMMUState *bs, SMMUTransCfg *cfg, SMMUTLBEntry *new)
20
@@ -XXX,XX +XXX,XX @@ static int max111x_init(SSISlave *d, int inputs)
33
g_hash_table_insert(bs->iotlb, key, new);
21
22
s->inputs = inputs;
23
24
- vmstate_register(VMSTATE_IF(dev), VMSTATE_INSTANCE_ID_ANY,
25
- &vmstate_max111x, s);
26
return 0;
34
}
27
}
35
28
36
-inline void smmu_iotlb_inv_all(SMMUState *s)
29
@@ -XXX,XX +XXX,XX @@ static void max111x_class_init(ObjectClass *klass, void *data)
37
+void smmu_iotlb_inv_all(SMMUState *s)
30
38
{
31
k->transfer = max111x_transfer;
39
trace_smmu_iotlb_inv_all();
32
dc->reset = max111x_reset;
40
g_hash_table_remove_all(s->iotlb);
33
+ dc->vmsd = &vmstate_max111x;
41
@@ -XXX,XX +XXX,XX @@ static gboolean smmu_hash_remove_by_asid_iova(gpointer key, gpointer value,
42
((entry->iova & ~info->mask) == info->iova);
43
}
34
}
44
35
45
-inline void
36
static const TypeInfo max111x_info = {
46
-smmu_iotlb_inv_iova(SMMUState *s, int asid, dma_addr_t iova,
47
- uint8_t tg, uint64_t num_pages, uint8_t ttl)
48
+void smmu_iotlb_inv_iova(SMMUState *s, int asid, dma_addr_t iova,
49
+ uint8_t tg, uint64_t num_pages, uint8_t ttl)
50
{
51
/* if tg is not set we use 4KB range invalidation */
52
uint8_t granule = tg ? tg * 2 + 10 : 12;
53
@@ -XXX,XX +XXX,XX @@ smmu_iotlb_inv_iova(SMMUState *s, int asid, dma_addr_t iova,
54
&info);
55
}
56
57
-inline void smmu_iotlb_inv_asid(SMMUState *s, uint16_t asid)
58
+void smmu_iotlb_inv_asid(SMMUState *s, uint16_t asid)
59
{
60
trace_smmu_iotlb_inv_asid(asid);
61
g_hash_table_foreach_remove(s->iotlb, smmu_hash_remove_by_asid, &asid);
62
@@ -XXX,XX +XXX,XX @@ error:
63
*
64
* return 0 on success
65
*/
66
-inline int smmu_ptw(SMMUTransCfg *cfg, dma_addr_t iova, IOMMUAccessFlags perm,
67
- SMMUTLBEntry *tlbe, SMMUPTWEventInfo *info)
68
+int smmu_ptw(SMMUTransCfg *cfg, dma_addr_t iova, IOMMUAccessFlags perm,
69
+ SMMUTLBEntry *tlbe, SMMUPTWEventInfo *info)
70
{
71
if (!cfg->aa64) {
72
/*
73
--
37
--
74
2.25.1
38
2.20.1
75
39
76
40
diff view generated by jsdifflib
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
1
Add an ssi_realize_and_unref(), for the benefit of callers
2
who want to be able to create an SSI device, set QOM properties
3
on it, and then do the realize-and-unref afterwards.
2
4
3
The i.MX6UL doesn't support CLK_HIGH ou CLK_HIGH_DIV clock source.
5
The API works on the same principle as the recently added
6
qdev_realize_and_undef(), sysbus_realize_and_undef(), etc.
4
7
5
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 20200628142429.17111-9-peter.maydell@linaro.org
8
---
12
---
9
include/hw/timer/imx_gpt.h | 1 +
13
include/hw/ssi/ssi.h | 26 ++++++++++++++++++++++++++
10
hw/arm/fsl-imx6ul.c | 2 +-
14
hw/ssi/ssi.c | 7 ++++++-
11
hw/misc/imx6ul_ccm.c | 6 ------
15
2 files changed, 32 insertions(+), 1 deletion(-)
12
hw/timer/imx_gpt.c | 25 +++++++++++++++++++++++++
13
4 files changed, 27 insertions(+), 7 deletions(-)
14
16
15
diff --git a/include/hw/timer/imx_gpt.h b/include/hw/timer/imx_gpt.h
17
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/timer/imx_gpt.h
19
--- a/include/hw/ssi/ssi.h
18
+++ b/include/hw/timer/imx_gpt.h
20
+++ b/include/hw/ssi/ssi.h
19
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ extern const VMStateDescription vmstate_ssi_slave;
20
#define TYPE_IMX25_GPT "imx25.gpt"
22
}
21
#define TYPE_IMX31_GPT "imx31.gpt"
23
22
#define TYPE_IMX6_GPT "imx6.gpt"
24
DeviceState *ssi_create_slave(SSIBus *bus, const char *name);
23
+#define TYPE_IMX6UL_GPT "imx6ul.gpt"
25
+/**
24
#define TYPE_IMX7_GPT "imx7.gpt"
26
+ * ssi_realize_and_unref: realize and unref an SSI slave device
25
27
+ * @dev: SSI slave device to realize
26
#define TYPE_IMX_GPT TYPE_IMX25_GPT
28
+ * @bus: SSI bus to put it on
27
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
29
+ * @errp: error pointer
30
+ *
31
+ * Call 'realize' on @dev, put it on the specified @bus, and drop the
32
+ * reference to it. Errors are reported via @errp and by returning
33
+ * false.
34
+ *
35
+ * This function is useful if you have created @dev via qdev_new()
36
+ * (which takes a reference to the device it returns to you), so that
37
+ * you can set properties on it before realizing it. If you don't need
38
+ * to set properties then ssi_create_slave() is probably better (as it
39
+ * does the create, init and realize in one step).
40
+ *
41
+ * If you are embedding the SSI slave into another QOM device and
42
+ * initialized it via some variant on object_initialize_child() then
43
+ * do not use this function, because that family of functions arrange
44
+ * for the only reference to the child device to be held by the parent
45
+ * via the child<> property, and so the reference-count-drop done here
46
+ * would be incorrect. (Instead you would want ssi_realize(), which
47
+ * doesn't currently exist but would be trivial to create if we had
48
+ * any code that wanted it.)
49
+ */
50
+bool ssi_realize_and_unref(DeviceState *dev, SSIBus *bus, Error **errp);
51
52
/* Master interface. */
53
SSIBus *ssi_create_bus(DeviceState *parent, const char *name);
54
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
28
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/fsl-imx6ul.c
56
--- a/hw/ssi/ssi.c
30
+++ b/hw/arm/fsl-imx6ul.c
57
+++ b/hw/ssi/ssi.c
31
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_init(Object *obj)
58
@@ -XXX,XX +XXX,XX @@ static const TypeInfo ssi_slave_info = {
32
*/
59
.abstract = true,
33
for (i = 0; i < FSL_IMX6UL_NUM_GPTS; i++) {
34
snprintf(name, NAME_SIZE, "gpt%d", i);
35
- object_initialize_child(obj, name, &s->gpt[i], TYPE_IMX7_GPT);
36
+ object_initialize_child(obj, name, &s->gpt[i], TYPE_IMX6UL_GPT);
37
}
38
39
/*
40
diff --git a/hw/misc/imx6ul_ccm.c b/hw/misc/imx6ul_ccm.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/misc/imx6ul_ccm.c
43
+++ b/hw/misc/imx6ul_ccm.c
44
@@ -XXX,XX +XXX,XX @@ static uint32_t imx6ul_ccm_get_clock_frequency(IMXCCMState *dev, IMXClk clock)
45
case CLK_32k:
46
freq = CKIL_FREQ;
47
break;
48
- case CLK_HIGH:
49
- freq = CKIH_FREQ;
50
- break;
51
- case CLK_HIGH_DIV:
52
- freq = CKIH_FREQ / 8;
53
- break;
54
default:
55
qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: unsupported clock %d\n",
56
TYPE_IMX6UL_CCM, __func__, clock);
57
diff --git a/hw/timer/imx_gpt.c b/hw/timer/imx_gpt.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/timer/imx_gpt.c
60
+++ b/hw/timer/imx_gpt.c
61
@@ -XXX,XX +XXX,XX @@ static const IMXClk imx6_gpt_clocks[] = {
62
CLK_HIGH, /* 111 reference clock */
63
};
60
};
64
61
65
+static const IMXClk imx6ul_gpt_clocks[] = {
62
+bool ssi_realize_and_unref(DeviceState *dev, SSIBus *bus, Error **errp)
66
+ CLK_NONE, /* 000 No clock source */
67
+ CLK_IPG, /* 001 ipg_clk, 532MHz*/
68
+ CLK_IPG_HIGH, /* 010 ipg_clk_highfreq */
69
+ CLK_EXT, /* 011 External clock */
70
+ CLK_32k, /* 100 ipg_clk_32k */
71
+ CLK_NONE, /* 101 not defined */
72
+ CLK_NONE, /* 110 not defined */
73
+ CLK_NONE, /* 111 not defined */
74
+};
75
+
76
static const IMXClk imx7_gpt_clocks[] = {
77
CLK_NONE, /* 000 No clock source */
78
CLK_IPG, /* 001 ipg_clk, 532MHz*/
79
@@ -XXX,XX +XXX,XX @@ static void imx6_gpt_init(Object *obj)
80
s->clocks = imx6_gpt_clocks;
81
}
82
83
+static void imx6ul_gpt_init(Object *obj)
84
+{
63
+{
85
+ IMXGPTState *s = IMX_GPT(obj);
64
+ return qdev_realize_and_unref(dev, &bus->parent_obj, errp);
86
+
87
+ s->clocks = imx6ul_gpt_clocks;
88
+}
65
+}
89
+
66
+
90
static void imx7_gpt_init(Object *obj)
67
DeviceState *ssi_create_slave(SSIBus *bus, const char *name)
91
{
68
{
92
IMXGPTState *s = IMX_GPT(obj);
69
DeviceState *dev = qdev_new(name);
93
@@ -XXX,XX +XXX,XX @@ static const TypeInfo imx6_gpt_info = {
70
94
.instance_init = imx6_gpt_init,
71
- qdev_realize_and_unref(dev, &bus->parent_obj, &error_fatal);
95
};
72
+ ssi_realize_and_unref(dev, bus, &error_fatal);
96
73
return dev;
97
+static const TypeInfo imx6ul_gpt_info = {
98
+ .name = TYPE_IMX6UL_GPT,
99
+ .parent = TYPE_IMX25_GPT,
100
+ .instance_init = imx6ul_gpt_init,
101
+};
102
+
103
static const TypeInfo imx7_gpt_info = {
104
.name = TYPE_IMX7_GPT,
105
.parent = TYPE_IMX25_GPT,
106
@@ -XXX,XX +XXX,XX @@ static void imx_gpt_register_types(void)
107
type_register_static(&imx25_gpt_info);
108
type_register_static(&imx31_gpt_info);
109
type_register_static(&imx6_gpt_info);
110
+ type_register_static(&imx6ul_gpt_info);
111
type_register_static(&imx7_gpt_info);
112
}
74
}
113
75
114
--
76
--
115
2.25.1
77
2.20.1
78
79
diff view generated by jsdifflib
1
From: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
1
Use the new max111x qdev properties to set the initial input
2
values rather than calling max111x_set_input(); this means that
3
on system reset the inputs will correctly return to their initial
4
values.
2
5
3
Cores with PMSA have the MPUIR register which has the
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
same encoding as the MIDR alias with opc2=4. So we only
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
add that alias if we are not realizing a core that
8
Message-id: 20200628142429.17111-10-peter.maydell@linaro.org
6
implements PMSA.
9
---
10
hw/arm/spitz.c | 11 +++++++----
11
1 file changed, 7 insertions(+), 4 deletions(-)
7
12
8
Signed-off-by: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
13
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20221206102504.165775-2-tobias.roehmel@rwth-aachen.de
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
target/arm/helper.c | 13 +++++++++----
15
1 file changed, 9 insertions(+), 4 deletions(-)
16
17
diff --git a/target/arm/helper.c b/target/arm/helper.c
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/helper.c
15
--- a/hw/arm/spitz.c
20
+++ b/target/arm/helper.c
16
+++ b/hw/arm/spitz.c
21
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
17
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
22
.access = PL1_R, .type = ARM_CP_NO_RAW, .resetvalue = cpu->midr,
18
qdev_get_gpio_in(sms->mpu->gpio, SPITZ_GPIO_TP_INT));
23
.fieldoffset = offsetof(CPUARMState, cp15.c0_cpuid),
19
24
.readfn = midr_read },
20
bus = qdev_get_child_bus(sms->mux, "ssi2");
25
- /* crn = 0 op1 = 0 crm = 0 op2 = 4,7 : AArch32 aliases of MIDR */
21
- sms->max1111 = ssi_create_slave(bus, "max1111");
26
- { .name = "MIDR", .type = ARM_CP_ALIAS | ARM_CP_CONST,
22
+ sms->max1111 = qdev_new("max1111");
27
- .cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 4,
23
max1111 = sms->max1111;
28
- .access = PL1_R, .resetvalue = cpu->midr },
24
- max111x_set_input(sms->max1111, MAX1111_BATT_VOLT, SPITZ_BATTERY_VOLT);
29
+ /* crn = 0 op1 = 0 crm = 0 op2 = 7 : AArch32 aliases of MIDR */
25
- max111x_set_input(sms->max1111, MAX1111_BATT_TEMP, 0);
30
{ .name = "MIDR", .type = ARM_CP_ALIAS | ARM_CP_CONST,
26
- max111x_set_input(sms->max1111, MAX1111_ACIN_VOLT, SPITZ_CHARGEON_ACIN);
31
.cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 7,
27
+ qdev_prop_set_uint8(sms->max1111, "input1" /* BATT_VOLT */,
32
.access = PL1_R, .resetvalue = cpu->midr },
28
+ SPITZ_BATTERY_VOLT);
33
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
29
+ qdev_prop_set_uint8(sms->max1111, "input2" /* BATT_TEMP */, 0);
34
.accessfn = access_aa64_tid1,
30
+ qdev_prop_set_uint8(sms->max1111, "input3" /* ACIN_VOLT */,
35
.type = ARM_CP_CONST, .resetvalue = cpu->revidr },
31
+ SPITZ_CHARGEON_ACIN);
36
};
32
+ ssi_realize_and_unref(sms->max1111, bus, &error_fatal);
37
+ ARMCPRegInfo id_v8_midr_alias_cp_reginfo = {
33
38
+ .name = "MIDR", .type = ARM_CP_ALIAS | ARM_CP_CONST,
34
qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_LCDCON_CS,
39
+ .cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 4,
35
qdev_get_gpio_in(sms->mux, 0));
40
+ .access = PL1_R, .resetvalue = cpu->midr
41
+ };
42
ARMCPRegInfo id_cp_reginfo[] = {
43
/* These are common to v8 and pre-v8 */
44
{ .name = "CTR",
45
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
46
}
47
if (arm_feature(env, ARM_FEATURE_V8)) {
48
define_arm_cp_regs(cpu, id_v8_midr_cp_reginfo);
49
+ if (!arm_feature(env, ARM_FEATURE_PMSA)) {
50
+ define_one_arm_cp_reg(cpu, &id_v8_midr_alias_cp_reginfo);
51
+ }
52
} else {
53
define_arm_cp_regs(cpu, id_pre_v8_midr_cp_reginfo);
54
}
55
--
36
--
56
2.25.1
37
2.20.1
57
38
58
39
diff view generated by jsdifflib
1
From: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
1
The max111x ADC device model allows other code to set the level on
2
the 8 ADC inputs using the max111x_set_input() function. Replace
3
this with generic qdev GPIO inputs, which also allow inputs to be set
4
to arbitrary values.
2
5
3
All constants are taken from the ARM Cortex-R52 Processor TRM Revision: r1p3
6
Using GPIO lines will make it easier for board code to wire things
7
up, so that if device A wants to set the ADC input it doesn't need to
8
have a direct pointer to the max111x but can just set that value on
9
its output GPIO, which is then wired up by the board to the
10
appropriate max111x input.
4
11
5
Signed-off-by: Tobias Röhmel <tobias.roehmel@rwth-aachen.de>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20221206102504.165775-8-tobias.roehmel@rwth-aachen.de
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Message-id: 20200628142429.17111-11-peter.maydell@linaro.org
9
---
15
---
10
target/arm/cpu_tcg.c | 42 ++++++++++++++++++++++++++++++++++++++++++
16
include/hw/ssi/ssi.h | 3 ---
11
1 file changed, 42 insertions(+)
17
hw/arm/spitz.c | 9 +++++----
18
hw/misc/max111x.c | 16 +++++++++-------
19
3 files changed, 14 insertions(+), 14 deletions(-)
12
20
13
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
21
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
14
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu_tcg.c
23
--- a/include/hw/ssi/ssi.h
16
+++ b/target/arm/cpu_tcg.c
24
+++ b/include/hw/ssi/ssi.h
17
@@ -XXX,XX +XXX,XX @@ static void cortex_r5_initfn(Object *obj)
25
@@ -XXX,XX +XXX,XX @@ SSIBus *ssi_create_bus(DeviceState *parent, const char *name);
18
define_arm_cp_regs(cpu, cortexr5_cp_reginfo);
26
27
uint32_t ssi_transfer(SSIBus *bus, uint32_t val);
28
29
-/* max111x.c */
30
-void max111x_set_input(DeviceState *dev, int line, uint8_t value);
31
-
32
#endif
33
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/spitz.c
36
+++ b/hw/arm/spitz.c
37
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
38
39
static void spitz_adc_temp_on(void *opaque, int line, int level)
40
{
41
+ int batt_temp;
42
+
43
if (!max1111)
44
return;
45
46
- if (level)
47
- max111x_set_input(max1111, MAX1111_BATT_TEMP, SPITZ_BATTERY_TEMP);
48
- else
49
- max111x_set_input(max1111, MAX1111_BATT_TEMP, 0);
50
+ batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
51
+
52
+ qemu_set_irq(qdev_get_gpio_in(max1111, MAX1111_BATT_TEMP), batt_temp);
19
}
53
}
20
54
21
+static void cortex_r52_initfn(Object *obj)
55
static void corgi_ssp_realize(SSISlave *d, Error **errp)
56
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/misc/max111x.c
59
+++ b/hw/misc/max111x.c
60
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_max111x = {
61
}
62
};
63
64
+static void max111x_input_set(void *opaque, int line, int value)
22
+{
65
+{
23
+ ARMCPU *cpu = ARM_CPU(obj);
66
+ MAX111xState *s = MAX_111X(opaque);
24
+
67
+
25
+ set_feature(&cpu->env, ARM_FEATURE_V8);
68
+ assert(line >= 0 && line < s->inputs);
26
+ set_feature(&cpu->env, ARM_FEATURE_EL2);
69
+ s->input[line] = value;
27
+ set_feature(&cpu->env, ARM_FEATURE_PMSA);
28
+ set_feature(&cpu->env, ARM_FEATURE_NEON);
29
+ set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
30
+ cpu->midr = 0x411fd133; /* r1p3 */
31
+ cpu->revidr = 0x00000000;
32
+ cpu->reset_fpsid = 0x41034023;
33
+ cpu->isar.mvfr0 = 0x10110222;
34
+ cpu->isar.mvfr1 = 0x12111111;
35
+ cpu->isar.mvfr2 = 0x00000043;
36
+ cpu->ctr = 0x8144c004;
37
+ cpu->reset_sctlr = 0x30c50838;
38
+ cpu->isar.id_pfr0 = 0x00000131;
39
+ cpu->isar.id_pfr1 = 0x10111001;
40
+ cpu->isar.id_dfr0 = 0x03010006;
41
+ cpu->id_afr0 = 0x00000000;
42
+ cpu->isar.id_mmfr0 = 0x00211040;
43
+ cpu->isar.id_mmfr1 = 0x40000000;
44
+ cpu->isar.id_mmfr2 = 0x01200000;
45
+ cpu->isar.id_mmfr3 = 0xf0102211;
46
+ cpu->isar.id_mmfr4 = 0x00000010;
47
+ cpu->isar.id_isar0 = 0x02101110;
48
+ cpu->isar.id_isar1 = 0x13112111;
49
+ cpu->isar.id_isar2 = 0x21232142;
50
+ cpu->isar.id_isar3 = 0x01112131;
51
+ cpu->isar.id_isar4 = 0x00010142;
52
+ cpu->isar.id_isar5 = 0x00010001;
53
+ cpu->isar.dbgdidr = 0x77168000;
54
+ cpu->clidr = (1 << 27) | (1 << 24) | 0x3;
55
+ cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */
56
+ cpu->ccsidr[1] = 0x201fe00a; /* 32KB L1 icache */
57
+
58
+ cpu->pmsav7_dregion = 16;
59
+ cpu->pmsav8r_hdregion = 16;
60
+}
70
+}
61
+
71
+
62
static void cortex_r5f_initfn(Object *obj)
72
static int max111x_init(SSISlave *d, int inputs)
63
{
73
{
64
ARMCPU *cpu = ARM_CPU(obj);
74
DeviceState *dev = DEVICE(d);
65
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo arm_tcg_cpus[] = {
75
MAX111xState *s = MAX_111X(dev);
66
.class_init = arm_v7m_class_init },
76
67
{ .name = "cortex-r5", .initfn = cortex_r5_initfn },
77
qdev_init_gpio_out(dev, &s->interrupt, 1);
68
{ .name = "cortex-r5f", .initfn = cortex_r5f_initfn },
78
+ qdev_init_gpio_in(dev, max111x_input_set, inputs);
69
+ { .name = "cortex-r52", .initfn = cortex_r52_initfn },
79
70
{ .name = "ti925t", .initfn = ti925t_initfn },
80
s->inputs = inputs;
71
{ .name = "sa1100", .initfn = sa1100_initfn },
81
72
{ .name = "sa1110", .initfn = sa1110_initfn },
82
@@ -XXX,XX +XXX,XX @@ static void max1111_realize(SSISlave *dev, Error **errp)
83
max111x_init(dev, 4);
84
}
85
86
-void max111x_set_input(DeviceState *dev, int line, uint8_t value)
87
-{
88
- MAX111xState *s = MAX_111X(dev);
89
- assert(line >= 0 && line < s->inputs);
90
- s->input[line] = value;
91
-}
92
-
93
static void max111x_reset(DeviceState *dev)
94
{
95
MAX111xState *s = MAX_111X(dev);
73
--
96
--
74
2.25.1
97
2.20.1
75
98
76
99
diff view generated by jsdifflib
1
From: Fabiano Rosas <farosas@suse.de>
1
Create a header file for the hw/misc/max111x device, in the
2
usual modern style for QOM devices:
3
* definition of the TYPE_ constants and macros
4
* definition of the device's state struct so that it can
5
be embedded in other structs if desired
6
* documentation of the interface
2
7
3
Signed-off-by: Fabiano Rosas <farosas@suse.de>
8
This allows us to use TYPE_MAX_1111 in the spitz.c code rather
4
Reviewed-by: Claudio Fontana <cfontana@suse.de>
9
than the string "max1111".
5
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
10
6
Message-id: 20221213190537.511-5-farosas@suse.de
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20200628142429.17111-12-peter.maydell@linaro.org
8
---
14
---
9
target/arm/m_helper.c | 16 ----------------
15
include/hw/misc/max111x.h | 56 +++++++++++++++++++++++++++++++++++++++
10
1 file changed, 16 deletions(-)
16
hw/arm/spitz.c | 3 ++-
17
hw/misc/max111x.c | 24 +----------------
18
MAINTAINERS | 1 +
19
4 files changed, 60 insertions(+), 24 deletions(-)
20
create mode 100644 include/hw/misc/max111x.h
11
21
12
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
22
diff --git a/include/hw/misc/max111x.h b/include/hw/misc/max111x.h
23
new file mode 100644
24
index XXXXXXX..XXXXXXX
25
--- /dev/null
26
+++ b/include/hw/misc/max111x.h
27
@@ -XXX,XX +XXX,XX @@
28
+/*
29
+ * Maxim MAX1110/1111 ADC chip emulation.
30
+ *
31
+ * Copyright (c) 2006 Openedhand Ltd.
32
+ * Written by Andrzej Zaborowski <balrog@zabor.org>
33
+ *
34
+ * This code is licensed under the GNU GPLv2.
35
+ *
36
+ * Contributions after 2012-01-13 are licensed under the terms of the
37
+ * GNU GPL, version 2 or (at your option) any later version.
38
+ */
39
+
40
+#ifndef HW_MISC_MAX111X_H
41
+#define HW_MISC_MAX111X_H
42
+
43
+#include "hw/ssi/ssi.h"
44
+
45
+/*
46
+ * This is a model of the Maxim MAX1110/1111 ADC chip, which for QEMU
47
+ * is an SSI slave device. It has either 4 (max1110) or 8 (max1111)
48
+ * 8-bit ADC channels.
49
+ *
50
+ * QEMU interface:
51
+ * + GPIO inputs 0..3 (for max1110) or 0..7 (for max1111): set the value
52
+ * of each ADC input, as an unsigned 8-bit value
53
+ * + GPIO output 0: interrupt line
54
+ * + Properties "input0" to "input3" (max1110) or "input0" to "input7"
55
+ * (max1111): initial reset values for ADC inputs.
56
+ *
57
+ * Known bugs:
58
+ * + the interrupt line is not correctly implemented, and will never
59
+ * be lowered once it has been asserted.
60
+ */
61
+typedef struct {
62
+ SSISlave parent_obj;
63
+
64
+ qemu_irq interrupt;
65
+ /* Values of inputs at system reset (settable by QOM property) */
66
+ uint8_t reset_input[8];
67
+
68
+ uint8_t tb1, rb2, rb3;
69
+ int cycle;
70
+
71
+ uint8_t input[8];
72
+ int inputs, com;
73
+} MAX111xState;
74
+
75
+#define TYPE_MAX_111X "max111x"
76
+
77
+#define MAX_111X(obj) \
78
+ OBJECT_CHECK(MAX111xState, (obj), TYPE_MAX_111X)
79
+
80
+#define TYPE_MAX_1110 "max1110"
81
+#define TYPE_MAX_1111 "max1111"
82
+
83
+#endif
84
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
13
index XXXXXXX..XXXXXXX 100644
85
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/m_helper.c
86
--- a/hw/arm/spitz.c
15
+++ b/target/arm/m_helper.c
87
+++ b/hw/arm/spitz.c
88
@@ -XXX,XX +XXX,XX @@
89
#include "audio/audio.h"
90
#include "hw/boards.h"
91
#include "hw/sysbus.h"
92
+#include "hw/misc/max111x.h"
93
#include "migration/vmstate.h"
94
#include "exec/address-spaces.h"
95
#include "cpu.h"
96
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
97
qdev_get_gpio_in(sms->mpu->gpio, SPITZ_GPIO_TP_INT));
98
99
bus = qdev_get_child_bus(sms->mux, "ssi2");
100
- sms->max1111 = qdev_new("max1111");
101
+ sms->max1111 = qdev_new(TYPE_MAX_1111);
102
max1111 = sms->max1111;
103
qdev_prop_set_uint8(sms->max1111, "input1" /* BATT_VOLT */,
104
SPITZ_BATTERY_VOLT);
105
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
106
index XXXXXXX..XXXXXXX 100644
107
--- a/hw/misc/max111x.c
108
+++ b/hw/misc/max111x.c
16
@@ -XXX,XX +XXX,XX @@
109
@@ -XXX,XX +XXX,XX @@
17
*/
110
*/
18
111
19
#include "qemu/osdep.h"
112
#include "qemu/osdep.h"
20
-#include "qemu/units.h"
113
+#include "hw/misc/max111x.h"
21
-#include "target/arm/idau.h"
114
#include "hw/irq.h"
22
-#include "trace.h"
115
-#include "hw/ssi/ssi.h"
23
#include "cpu.h"
116
#include "migration/vmstate.h"
24
#include "internals.h"
117
#include "qemu/module.h"
25
-#include "exec/gdbstub.h"
118
#include "hw/qdev-properties.h"
26
#include "exec/helper-proto.h"
119
27
-#include "qemu/host-utils.h"
120
-typedef struct {
28
#include "qemu/main-loop.h"
121
- SSISlave parent_obj;
29
#include "qemu/bitops.h"
122
-
30
-#include "qemu/crc32c.h"
123
- qemu_irq interrupt;
31
-#include "qemu/qemu-print.h"
124
- /* Values of inputs at system reset (settable by QOM property) */
32
#include "qemu/log.h"
125
- uint8_t reset_input[8];
33
#include "exec/exec-all.h"
126
-
34
-#include <zlib.h> /* For crc32 */
127
- uint8_t tb1, rb2, rb3;
35
-#include "semihosting/semihost.h"
128
- int cycle;
36
-#include "sysemu/cpus.h"
129
-
37
-#include "sysemu/kvm.h"
130
- uint8_t input[8];
38
-#include "qemu/range.h"
131
- int inputs, com;
39
-#include "qapi/qapi-commands-machine-target.h"
132
-} MAX111xState;
40
-#include "qapi/error.h"
133
-
41
-#include "qemu/guest-random.h"
134
-#define TYPE_MAX_111X "max111x"
42
#ifdef CONFIG_TCG
135
-
43
-#include "arm_ldst.h"
136
-#define MAX_111X(obj) \
44
#include "exec/cpu_ldst.h"
137
- OBJECT_CHECK(MAX111xState, (obj), TYPE_MAX_111X)
45
#include "semihosting/common-semi.h"
138
-
46
#endif
139
-#define TYPE_MAX_1110 "max1110"
140
-#define TYPE_MAX_1111 "max1111"
141
-
142
/* Control-byte bitfields */
143
#define CB_PD0        (1 << 0)
144
#define CB_PD1        (1 << 1)
145
diff --git a/MAINTAINERS b/MAINTAINERS
146
index XXXXXXX..XXXXXXX 100644
147
--- a/MAINTAINERS
148
+++ b/MAINTAINERS
149
@@ -XXX,XX +XXX,XX @@ F: hw/gpio/max7310.c
150
F: hw/gpio/zaurus.c
151
F: hw/misc/mst_fpga.c
152
F: hw/misc/max111x.c
153
+F: include/hw/misc/max111x.h
154
F: include/hw/arm/pxa.h
155
F: include/hw/arm/sharpsl.h
156
F: include/hw/display/tc6393xb.h
47
--
157
--
48
2.25.1
158
2.20.1
159
160
diff view generated by jsdifflib
1
From: Fabiano Rosas <farosas@suse.de>
1
Currently we have a free-floating set of IRQs and a function
2
2
spitz_out_switch() which handle some miscellaneous GPIO lines for the
3
Fix the following:
3
spitz board. Encapsulate this behaviour in a simple QOM device.
4
4
5
ERROR: spaces required around that '|' (ctx:VxV)
5
At this point we can finally remove the 'max1111' global, because the
6
ERROR: space required before the open parenthesis '('
6
ADC battery-temperature value is now handled by the misc-gpio device
7
ERROR: spaces required around that '+' (ctx:VxB)
7
writing the value to its outbound "adc-temp" GPIO, which the board
8
ERROR: space prohibited between function name and open parenthesis '('
8
code wires up to the appropriate inbound GPIO line on the max1111.
9
9
10
(the last two still have some occurrences in macros which I left
10
This commit also fixes Coverity issue CID 1421913 (which pointed out
11
behind because it might impact readability)
11
that the 'outsignals' in spitz_scoop_gpio_setup() were leaked),
12
12
because it removes the use of the qemu_allocate_irqs() API from this
13
Signed-off-by: Fabiano Rosas <farosas@suse.de>
13
code entirely.
14
Reviewed-by: Claudio Fontana <cfontana@suse.de>
14
15
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
16
Message-id: 20221213190537.511-3-farosas@suse.de
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
18
Message-id: 20200628142429.17111-13-peter.maydell@linaro.org
18
---
19
---
19
target/arm/helper.c | 42 +++++++++++++++++++++---------------------
20
hw/arm/spitz.c | 129 +++++++++++++++++++++++++++++++++----------------
20
1 file changed, 21 insertions(+), 21 deletions(-)
21
1 file changed, 87 insertions(+), 42 deletions(-)
21
22
22
diff --git a/target/arm/helper.c b/target/arm/helper.c
23
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
23
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
24
--- a/target/arm/helper.c
25
--- a/hw/arm/spitz.c
25
+++ b/target/arm/helper.c
26
+++ b/hw/arm/spitz.c
26
@@ -XXX,XX +XXX,XX @@ static void add_cpreg_to_list(gpointer key, gpointer opaque)
27
@@ -XXX,XX +XXX,XX @@ typedef struct {
27
uint32_t regidx = (uintptr_t)key;
28
DeviceState *max1111;
28
const ARMCPRegInfo *ri = get_arm_cp_reginfo(cpu->cp_regs, regidx);
29
DeviceState *scp0;
29
30
DeviceState *scp1;
30
- if (!(ri->type & (ARM_CP_NO_RAW|ARM_CP_ALIAS))) {
31
+ DeviceState *misc_gpio;
31
+ if (!(ri->type & (ARM_CP_NO_RAW | ARM_CP_ALIAS))) {
32
} SpitzMachineState;
32
cpu->cpreg_indexes[cpu->cpreg_array_len] = cpreg_to_kvm_id(regidx);
33
33
/* The value array need not be initialized at this point */
34
#define TYPE_SPITZ_MACHINE "spitz-common"
34
cpu->cpreg_array_len++;
35
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
35
@@ -XXX,XX +XXX,XX @@ static void count_cpreg(gpointer key, gpointer opaque)
36
#define SPITZ_GPIO_MAX1111_CS 20
36
37
#define SPITZ_GPIO_TP_INT 11
37
ri = g_hash_table_lookup(cpu->cp_regs, key);
38
38
39
-static DeviceState *max1111;
39
- if (!(ri->type & (ARM_CP_NO_RAW|ARM_CP_ALIAS))) {
40
-
40
+ if (!(ri->type & (ARM_CP_NO_RAW | ARM_CP_ALIAS))) {
41
/* "Demux" the signal based on current chipselect */
41
cpu->cpreg_array_len++;
42
typedef struct {
43
SSISlave ssidev;
44
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
45
#define SPITZ_BATTERY_VOLT 0xd0 /* About 4.0V */
46
#define SPITZ_CHARGEON_ACIN 0x80 /* About 5.0V */
47
48
-static void spitz_adc_temp_on(void *opaque, int line, int level)
49
-{
50
- int batt_temp;
51
-
52
- if (!max1111)
53
- return;
54
-
55
- batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
56
-
57
- qemu_set_irq(qdev_get_gpio_in(max1111, MAX1111_BATT_TEMP), batt_temp);
58
-}
59
-
60
static void corgi_ssp_realize(SSISlave *d, Error **errp)
61
{
62
DeviceState *dev = DEVICE(d);
63
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
64
65
bus = qdev_get_child_bus(sms->mux, "ssi2");
66
sms->max1111 = qdev_new(TYPE_MAX_1111);
67
- max1111 = sms->max1111;
68
qdev_prop_set_uint8(sms->max1111, "input1" /* BATT_VOLT */,
69
SPITZ_BATTERY_VOLT);
70
qdev_prop_set_uint8(sms->max1111, "input2" /* BATT_TEMP */, 0);
71
@@ -XXX,XX +XXX,XX @@ static void spitz_akita_i2c_setup(PXA2xxState *cpu)
72
73
/* Other peripherals */
74
75
-static void spitz_out_switch(void *opaque, int line, int level)
76
+/*
77
+ * Encapsulation of some miscellaneous GPIO line behaviour for the Spitz boards.
78
+ *
79
+ * QEMU interface:
80
+ * + named GPIO inputs "green-led", "orange-led", "charging", "discharging":
81
+ * these currently just print messages that the line has been signalled
82
+ * + named GPIO input "adc-temp-on": set to cause the battery-temperature
83
+ * value to be passed to the max111x ADC
84
+ * + named GPIO output "adc-temp": the ADC value, to be wired up to the max111x
85
+ */
86
+#define TYPE_SPITZ_MISC_GPIO "spitz-misc-gpio"
87
+#define SPITZ_MISC_GPIO(obj) \
88
+ OBJECT_CHECK(SpitzMiscGPIOState, (obj), TYPE_SPITZ_MISC_GPIO)
89
+
90
+typedef struct SpitzMiscGPIOState {
91
+ SysBusDevice parent_obj;
92
+
93
+ qemu_irq adc_value;
94
+} SpitzMiscGPIOState;
95
+
96
+static void spitz_misc_charging(void *opaque, int n, int level)
97
{
98
- switch (line) {
99
- case 0:
100
- zaurus_printf("Charging %s.\n", level ? "off" : "on");
101
- break;
102
- case 1:
103
- zaurus_printf("Discharging %s.\n", level ? "on" : "off");
104
- break;
105
- case 2:
106
- zaurus_printf("Green LED %s.\n", level ? "on" : "off");
107
- break;
108
- case 3:
109
- zaurus_printf("Orange LED %s.\n", level ? "on" : "off");
110
- break;
111
- case 6:
112
- spitz_adc_temp_on(opaque, line, level);
113
- break;
114
- default:
115
- g_assert_not_reached();
116
- }
117
+ zaurus_printf("Charging %s.\n", level ? "off" : "on");
118
+}
119
+
120
+static void spitz_misc_discharging(void *opaque, int n, int level)
121
+{
122
+ zaurus_printf("Discharging %s.\n", level ? "off" : "on");
123
+}
124
+
125
+static void spitz_misc_green_led(void *opaque, int n, int level)
126
+{
127
+ zaurus_printf("Green LED %s.\n", level ? "off" : "on");
128
+}
129
+
130
+static void spitz_misc_orange_led(void *opaque, int n, int level)
131
+{
132
+ zaurus_printf("Orange LED %s.\n", level ? "off" : "on");
133
+}
134
+
135
+static void spitz_misc_adc_temp(void *opaque, int n, int level)
136
+{
137
+ SpitzMiscGPIOState *s = SPITZ_MISC_GPIO(opaque);
138
+ int batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
139
+
140
+ qemu_set_irq(s->adc_value, batt_temp);
141
+}
142
+
143
+static void spitz_misc_gpio_init(Object *obj)
144
+{
145
+ SpitzMiscGPIOState *s = SPITZ_MISC_GPIO(obj);
146
+ DeviceState *dev = DEVICE(obj);
147
+
148
+ qdev_init_gpio_in_named(dev, spitz_misc_charging, "charging", 1);
149
+ qdev_init_gpio_in_named(dev, spitz_misc_discharging, "discharging", 1);
150
+ qdev_init_gpio_in_named(dev, spitz_misc_green_led, "green-led", 1);
151
+ qdev_init_gpio_in_named(dev, spitz_misc_orange_led, "orange-led", 1);
152
+ qdev_init_gpio_in_named(dev, spitz_misc_adc_temp, "adc-temp-on", 1);
153
+
154
+ qdev_init_gpio_out_named(dev, &s->adc_value, "adc-temp", 1);
155
}
156
157
#define SPITZ_SCP_LED_GREEN 1
158
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
159
160
static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
161
{
162
- qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, sms->mpu, 8);
163
+ DeviceState *miscdev = sysbus_create_simple(TYPE_SPITZ_MISC_GPIO, -1, NULL);
164
165
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
166
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_JK_B, outsignals[1]);
167
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
168
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
169
+ sms->misc_gpio = miscdev;
170
+
171
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_CHRG_ON,
172
+ qdev_get_gpio_in_named(miscdev, "charging", 0));
173
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_JK_B,
174
+ qdev_get_gpio_in_named(miscdev, "discharging", 0));
175
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_GREEN,
176
+ qdev_get_gpio_in_named(miscdev, "green-led", 0));
177
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_ORANGE,
178
+ qdev_get_gpio_in_named(miscdev, "orange-led", 0));
179
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON,
180
+ qdev_get_gpio_in_named(miscdev, "adc-temp-on", 0));
181
+ qdev_connect_gpio_out_named(miscdev, "adc-temp", 0,
182
+ qdev_get_gpio_in(sms->max1111, MAX1111_BATT_TEMP));
183
184
if (sms->scp1) {
185
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_CONT,
186
@@ -XXX,XX +XXX,XX @@ static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
187
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_ON,
188
qdev_get_gpio_in_named(sms->lcdtg, "bl_power", 0));
42
}
189
}
190
-
191
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
43
}
192
}
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6k_cp_reginfo[] = {
193
45
.resetfn = arm_cp_reset_ignore },
194
#define SPITZ_GPIO_HSYNC 22
46
{ .name = "TPIDRRO_EL0", .state = ARM_CP_STATE_AA64,
195
@@ -XXX,XX +XXX,XX @@ static const TypeInfo spitz_lcdtg_info = {
47
.opc0 = 3, .opc1 = 3, .opc2 = 3, .crn = 13, .crm = 0,
196
.class_init = spitz_lcdtg_class_init,
48
- .access = PL0_R|PL1_W,
49
+ .access = PL0_R | PL1_W,
50
.fieldoffset = offsetof(CPUARMState, cp15.tpidrro_el[0]),
51
.resetvalue = 0},
52
{ .name = "TPIDRURO", .cp = 15, .crn = 13, .crm = 0, .opc1 = 0, .opc2 = 3,
53
- .access = PL0_R|PL1_W,
54
+ .access = PL0_R | PL1_W,
55
.bank_fieldoffsets = { offsetoflow32(CPUARMState, cp15.tpidruro_s),
56
offsetoflow32(CPUARMState, cp15.tpidruro_ns) },
57
.resetfn = arm_cp_reset_ignore },
58
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo cache_block_ops_cp_reginfo[] = {
59
.resetvalue = 0 },
60
/* The cache ops themselves: these all NOP for QEMU */
61
{ .name = "IICR", .cp = 15, .crm = 5, .opc1 = 0,
62
- .access = PL1_W, .type = ARM_CP_NOP|ARM_CP_64BIT },
63
+ .access = PL1_W, .type = ARM_CP_NOP | ARM_CP_64BIT },
64
{ .name = "IDCR", .cp = 15, .crm = 6, .opc1 = 0,
65
- .access = PL1_W, .type = ARM_CP_NOP|ARM_CP_64BIT },
66
+ .access = PL1_W, .type = ARM_CP_NOP | ARM_CP_64BIT },
67
{ .name = "CDCR", .cp = 15, .crm = 12, .opc1 = 0,
68
- .access = PL0_W, .type = ARM_CP_NOP|ARM_CP_64BIT },
69
+ .access = PL0_W, .type = ARM_CP_NOP | ARM_CP_64BIT },
70
{ .name = "PIR", .cp = 15, .crm = 12, .opc1 = 1,
71
- .access = PL0_W, .type = ARM_CP_NOP|ARM_CP_64BIT },
72
+ .access = PL0_W, .type = ARM_CP_NOP | ARM_CP_64BIT },
73
{ .name = "PDR", .cp = 15, .crm = 12, .opc1 = 2,
74
- .access = PL0_W, .type = ARM_CP_NOP|ARM_CP_64BIT },
75
+ .access = PL0_W, .type = ARM_CP_NOP | ARM_CP_64BIT },
76
{ .name = "CIDCR", .cp = 15, .crm = 14, .opc1 = 0,
77
- .access = PL1_W, .type = ARM_CP_NOP|ARM_CP_64BIT },
78
+ .access = PL1_W, .type = ARM_CP_NOP | ARM_CP_64BIT },
79
};
197
};
80
198
81
static const ARMCPRegInfo cache_test_clean_cp_reginfo[] = {
199
+static const TypeInfo spitz_misc_gpio_info = {
82
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
200
+ .name = TYPE_SPITZ_MISC_GPIO,
83
ARMCPRegInfo cbar = {
201
+ .parent = TYPE_SYS_BUS_DEVICE,
84
.name = "CBAR",
202
+ .instance_size = sizeof(SpitzMiscGPIOState),
85
.cp = 15, .crn = 15, .crm = 0, .opc1 = 4, .opc2 = 0,
203
+ .instance_init = spitz_misc_gpio_init,
86
- .access = PL1_R|PL3_W, .resetvalue = cpu->reset_cbar,
204
+ /*
87
+ .access = PL1_R | PL3_W, .resetvalue = cpu->reset_cbar,
205
+ * No class_init required: device has no internal state so does not
88
.fieldoffset = offsetof(CPUARMState,
206
+ * need to set up reset or vmstate, and does not have a realize method.
89
cp15.c15_config_base_address)
207
+ */
90
};
208
+};
91
@@ -XXX,XX +XXX,XX @@ static void switch_mode(CPUARMState *env, int mode)
209
+
92
return;
210
static void spitz_register_types(void)
93
211
{
94
if (old_mode == ARM_CPU_MODE_FIQ) {
212
type_register_static(&corgi_ssp_info);
95
- memcpy (env->fiq_regs, env->regs + 8, 5 * sizeof(uint32_t));
213
type_register_static(&spitz_lcdtg_info);
96
- memcpy (env->regs + 8, env->usr_regs, 5 * sizeof(uint32_t));
214
type_register_static(&spitz_keyboard_info);
97
+ memcpy(env->fiq_regs, env->regs + 8, 5 * sizeof(uint32_t));
215
type_register_static(&sl_nand_info);
98
+ memcpy(env->regs + 8, env->usr_regs, 5 * sizeof(uint32_t));
216
+ type_register_static(&spitz_misc_gpio_info);
99
} else if (mode == ARM_CPU_MODE_FIQ) {
217
}
100
- memcpy (env->usr_regs, env->regs + 8, 5 * sizeof(uint32_t));
218
101
- memcpy (env->regs + 8, env->fiq_regs, 5 * sizeof(uint32_t));
219
type_init(spitz_register_types)
102
+ memcpy(env->usr_regs, env->regs + 8, 5 * sizeof(uint32_t));
103
+ memcpy(env->regs + 8, env->fiq_regs, 5 * sizeof(uint32_t));
104
}
105
106
i = bank_number(old_mode);
107
@@ -XXX,XX +XXX,XX @@ static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
108
RESULT(sum, n, 16); \
109
if (sum >= 0) \
110
ge |= 3 << (n * 2); \
111
- } while(0)
112
+ } while (0)
113
114
#define SARITH8(a, b, n, op) do { \
115
int32_t sum; \
116
@@ -XXX,XX +XXX,XX @@ static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
117
RESULT(sum, n, 8); \
118
if (sum >= 0) \
119
ge |= 1 << n; \
120
- } while(0)
121
+ } while (0)
122
123
124
#define ADD16(a, b, n) SARITH16(a, b, n, +)
125
@@ -XXX,XX +XXX,XX @@ static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
126
RESULT(sum, n, 16); \
127
if ((sum >> 16) == 1) \
128
ge |= 3 << (n * 2); \
129
- } while(0)
130
+ } while (0)
131
132
#define ADD8(a, b, n) do { \
133
uint32_t sum; \
134
@@ -XXX,XX +XXX,XX @@ static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
135
RESULT(sum, n, 8); \
136
if ((sum >> 8) == 1) \
137
ge |= 1 << n; \
138
- } while(0)
139
+ } while (0)
140
141
#define SUB16(a, b, n) do { \
142
uint32_t sum; \
143
@@ -XXX,XX +XXX,XX @@ static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
144
RESULT(sum, n, 16); \
145
if ((sum >> 16) == 0) \
146
ge |= 3 << (n * 2); \
147
- } while(0)
148
+ } while (0)
149
150
#define SUB8(a, b, n) do { \
151
uint32_t sum; \
152
@@ -XXX,XX +XXX,XX @@ static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
153
RESULT(sum, n, 8); \
154
if ((sum >> 8) == 0) \
155
ge |= 1 << n; \
156
- } while(0)
157
+ } while (0)
158
159
#define PFX u
160
#define ARITH_GE
161
--
220
--
162
2.25.1
221
2.20.1
222
223
diff view generated by jsdifflib
1
In get_phys_addr_twostage() we set the lg_page_size of the result to
1
Instead of logging guest accesses to invalid register offsets in this
2
the maximum of the stage 1 and stage 2 page sizes. This works for
2
device using zaurus_printf() (which just prints to stderr), use the
3
the case where we do want to create a TLB entry, because we know the
3
usual qemu_log_mask(LOG_GUEST_ERROR,...).
4
common TLB code only creates entries of the TARGET_PAGE_SIZE and
5
asking for a size larger than that only means that invalidations
6
invalidate the whole larger area. However, if lg_page_size is
7
smaller than TARGET_PAGE_SIZE this effectively means "don't create a
8
TLB entry"; in this case if either S1 or S2 said "this covers less
9
than a page and can't go in a TLB" then the final result also should
10
be marked that way. Set the resulting page size to 0 if either
11
stage asked for a less-than-a-page entry, and expand the comment
12
to explain what's going on.
13
4
14
This has no effect for VMSA because currently the VMSA lookup always
5
Since this was the only use of the zaurus_printf() macro outside
15
returns results that cover at least TARGET_PAGE_SIZE; however when we
6
spitz.c, we can move the definition of that macro from sharpsl.h
16
add v8R support it will reuse this code path, and for v8R the S1 and
7
to spitz.c.
17
S2 results can be smaller than TARGET_PAGE_SIZE.
18
8
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Message-id: 20221212142708.610090-1-peter.maydell@linaro.org
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-id: 20200628142429.17111-14-peter.maydell@linaro.org
22
---
13
---
23
target/arm/ptw.c | 16 +++++++++++++---
14
include/hw/arm/sharpsl.h | 3 ---
24
1 file changed, 13 insertions(+), 3 deletions(-)
15
hw/arm/spitz.c | 3 +++
16
hw/gpio/zaurus.c | 12 +++++++-----
17
3 files changed, 10 insertions(+), 8 deletions(-)
25
18
26
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
19
diff --git a/include/hw/arm/sharpsl.h b/include/hw/arm/sharpsl.h
27
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
28
--- a/target/arm/ptw.c
21
--- a/include/hw/arm/sharpsl.h
29
+++ b/target/arm/ptw.c
22
+++ b/include/hw/arm/sharpsl.h
30
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
23
@@ -XXX,XX +XXX,XX @@
24
25
#include "exec/hwaddr.h"
26
27
-#define zaurus_printf(format, ...)    \
28
- fprintf(stderr, "%s: " format, __func__, ##__VA_ARGS__)
29
-
30
/* zaurus.c */
31
32
#define SL_PXA_PARAM_BASE    0xa0000a00
33
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/spitz.c
36
+++ b/hw/arm/spitz.c
37
@@ -XXX,XX +XXX,XX @@ typedef struct {
38
#define SPITZ_MACHINE_CLASS(klass) \
39
OBJECT_CLASS_CHECK(SpitzMachineClass, klass, TYPE_SPITZ_MACHINE)
40
41
+#define zaurus_printf(format, ...) \
42
+ fprintf(stderr, "%s: " format, __func__, ##__VA_ARGS__)
43
+
44
#undef REG_FMT
45
#define REG_FMT "0x%02lx"
46
47
diff --git a/hw/gpio/zaurus.c b/hw/gpio/zaurus.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/gpio/zaurus.c
50
+++ b/hw/gpio/zaurus.c
51
@@ -XXX,XX +XXX,XX @@
52
#include "hw/sysbus.h"
53
#include "migration/vmstate.h"
54
#include "qemu/module.h"
55
-
56
-#undef REG_FMT
57
-#define REG_FMT            "0x%02lx"
58
+#include "qemu/log.h"
59
60
/* SCOOP devices */
61
62
@@ -XXX,XX +XXX,XX @@ static uint64_t scoop_read(void *opaque, hwaddr addr,
63
case SCOOP_GPRR:
64
return s->gpio_level;
65
default:
66
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
67
+ qemu_log_mask(LOG_GUEST_ERROR,
68
+ "scoop_read: bad register offset 0x%02" HWADDR_PRIx "\n",
69
+ addr);
31
}
70
}
32
71
33
/*
72
return 0;
34
- * Use the maximum of the S1 & S2 page size, so that invalidation
73
@@ -XXX,XX +XXX,XX @@ static void scoop_write(void *opaque, hwaddr addr,
35
- * of pages > TARGET_PAGE_SIZE works correctly.
74
scoop_gpio_handler_update(s);
36
+ * If either S1 or S2 returned a result smaller than TARGET_PAGE_SIZE,
75
break;
37
+ * this means "don't put this in the TLB"; in this case, return a
76
default:
38
+ * result with lg_page_size == 0 to achieve that. Otherwise,
77
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
39
+ * use the maximum of the S1 & S2 page size, so that invalidation
78
+ qemu_log_mask(LOG_GUEST_ERROR,
40
+ * of pages > TARGET_PAGE_SIZE works correctly. (This works even though
79
+ "scoop_write: bad register offset 0x%02" HWADDR_PRIx "\n",
41
+ * we know the combined result permissions etc only cover the minimum
80
+ addr);
42
+ * of the S1 and S2 page size, because we know that the common TLB code
43
+ * never actually creates TLB entries bigger than TARGET_PAGE_SIZE,
44
+ * and passing a larger page size value only affects invalidations.)
45
*/
46
- if (result->f.lg_page_size < s1_lgpgsz) {
47
+ if (result->f.lg_page_size < TARGET_PAGE_BITS ||
48
+ s1_lgpgsz < TARGET_PAGE_BITS) {
49
+ result->f.lg_page_size = 0;
50
+ } else if (result->f.lg_page_size < s1_lgpgsz) {
51
result->f.lg_page_size = s1_lgpgsz;
52
}
81
}
82
}
53
83
54
--
84
--
55
2.25.1
85
2.20.1
86
87
diff view generated by jsdifflib
1
From: Axel Heider <axel.heider@hensoldt.net>
1
Instead of logging guest accesses to invalid register offsets in the
2
Spitz flash device with zaurus_printf() (which just prints to stderr),
3
use the usual qemu_log_mask(LOG_GUEST_ERROR,...).
2
4
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20200628142429.17111-15-peter.maydell@linaro.org
5
---
9
---
6
include/hw/timer/imx_epit.h | 2 ++
10
hw/arm/spitz.c | 12 +++++++-----
7
hw/timer/imx_epit.c | 12 ++++++------
11
1 file changed, 7 insertions(+), 5 deletions(-)
8
2 files changed, 8 insertions(+), 6 deletions(-)
9
12
10
diff --git a/include/hw/timer/imx_epit.h b/include/hw/timer/imx_epit.h
13
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
11
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
12
--- a/include/hw/timer/imx_epit.h
15
--- a/hw/arm/spitz.c
13
+++ b/include/hw/timer/imx_epit.h
16
+++ b/hw/arm/spitz.c
14
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@
15
#define CR_CLKSRC_SHIFT (24)
18
#include "hw/ssi/ssi.h"
16
#define CR_CLKSRC_BITS (2)
19
#include "hw/block/flash.h"
17
20
#include "qemu/timer.h"
18
+#define SR_OCIF (1 << 0)
21
+#include "qemu/log.h"
19
+
22
#include "hw/arm/sharpsl.h"
20
#define EPIT_TIMER_MAX 0XFFFFFFFFUL
23
#include "ui/console.h"
21
24
#include "hw/audio/wm8750.h"
22
#define TYPE_IMX_EPIT "imx.epit"
25
@@ -XXX,XX +XXX,XX @@ typedef struct {
23
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
26
#define zaurus_printf(format, ...) \
24
index XXXXXXX..XXXXXXX 100644
27
fprintf(stderr, "%s: " format, __func__, ##__VA_ARGS__)
25
--- a/hw/timer/imx_epit.c
28
26
+++ b/hw/timer/imx_epit.c
29
-#undef REG_FMT
27
@@ -XXX,XX +XXX,XX @@ static const IMXClk imx_epit_clocks[] = {
30
-#define REG_FMT "0x%02lx"
28
*/
31
-
29
static void imx_epit_update_int(IMXEPITState *s)
32
/* Spitz Flash */
30
{
33
#define FLASH_BASE 0x0c000000
31
- if (s->sr && (s->cr & CR_OCIEN) && (s->cr & CR_EN)) {
34
#define FLASH_ECCLPLB 0x00 /* Line parity 7 - 0 bit */
32
+ if ((s->sr & SR_OCIF) && (s->cr & CR_OCIEN) && (s->cr & CR_EN)) {
35
@@ -XXX,XX +XXX,XX @@ static uint64_t sl_read(void *opaque, hwaddr addr, unsigned size)
33
qemu_irq_raise(s->irq);
36
return ecc_digest(&s->ecc, nand_getio(s->nand));
34
} else {
37
35
qemu_irq_lower(s->irq);
38
default:
36
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value,
39
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
40
+ qemu_log_mask(LOG_GUEST_ERROR,
41
+ "sl_read: bad register offset 0x%02" HWADDR_PRIx "\n",
42
+ addr);
43
}
44
return 0;
45
}
46
@@ -XXX,XX +XXX,XX @@ static void sl_write(void *opaque, hwaddr addr,
37
break;
47
break;
38
48
39
case 1: /* SR - ACK*/
49
default:
40
- /* writing 1 to OCIF clears the OCIF bit */
50
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
41
- if (value & 0x01) {
51
+ qemu_log_mask(LOG_GUEST_ERROR,
42
- s->sr = 0;
52
+ "sl_write: bad register offset 0x%02" HWADDR_PRIx "\n",
43
+ /* writing 1 to SR.OCIF clears this bit and turns the interrupt off */
53
+ addr);
44
+ if (value & SR_OCIF) {
54
}
45
+ s->sr = 0; /* SR.OCIF is the only bit in this register anyway */
46
imx_epit_update_int(s);
47
}
48
break;
49
@@ -XXX,XX +XXX,XX @@ static void imx_epit_cmp(void *opaque)
50
IMXEPITState *s = IMX_EPIT(opaque);
51
52
DPRINTF("sr was %d\n", s->sr);
53
-
54
- s->sr = 1;
55
+ /* Set interrupt status bit SR.OCIF and update the interrupt state */
56
+ s->sr |= SR_OCIF;
57
imx_epit_update_int(s);
58
}
55
}
59
56
60
--
57
--
61
2.25.1
58
2.20.1
59
60
diff view generated by jsdifflib
1
From: Claudio Fontana <cfontana@suse.de>
1
Instead of using printf() for logging guest accesses to invalid
2
register offsets in the pxa2xx PIC device, use the usual
3
qemu_log_mask(LOG_GUEST_ERROR,...).
2
4
3
Remove some unused headers.
5
This was the only user of the REG_FMT macro in pxa.h, so we can
6
remove that.
4
7
5
Signed-off-by: Claudio Fontana <cfontana@suse.de>
6
Acked-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Claudio Fontana <cfontana@suse.de>
8
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
9
Signed-off-by: Fabiano Rosas <farosas@suse.de>
10
Message-id: 20221213190537.511-7-farosas@suse.de
11
[added back some includes that are still needed at this point]
12
Signed-off-by: Fabiano Rosas <farosas@suse.de>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 20200628142429.17111-16-peter.maydell@linaro.org
14
---
12
---
15
target/arm/cpu.c | 1 -
13
include/hw/arm/pxa.h | 1 -
16
target/arm/cpu64.c | 6 ------
14
hw/arm/pxa2xx_pic.c | 9 +++++++--
17
2 files changed, 7 deletions(-)
15
2 files changed, 7 insertions(+), 3 deletions(-)
18
16
19
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
17
diff --git a/include/hw/arm/pxa.h b/include/hw/arm/pxa.h
20
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/cpu.c
19
--- a/include/hw/arm/pxa.h
22
+++ b/target/arm/cpu.c
20
+++ b/include/hw/arm/pxa.h
23
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ struct PXA2xxI2SState {
24
#include "target/arm/idau.h"
22
};
25
#include "qemu/module.h"
23
26
#include "qapi/error.h"
24
# define PA_FMT            "0x%08lx"
27
-#include "qapi/visitor.h"
25
-# define REG_FMT        "0x" TARGET_FMT_plx
28
#include "cpu.h"
26
29
#ifdef CONFIG_TCG
27
PXA2xxState *pxa270_init(MemoryRegion *address_space, unsigned int sdram_size,
30
#include "hw/core/tcg-cpu-ops.h"
28
const char *revision);
31
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
29
diff --git a/hw/arm/pxa2xx_pic.c b/hw/arm/pxa2xx_pic.c
32
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/cpu64.c
31
--- a/hw/arm/pxa2xx_pic.c
34
+++ b/target/arm/cpu64.c
32
+++ b/hw/arm/pxa2xx_pic.c
35
@@ -XXX,XX +XXX,XX @@
33
@@ -XXX,XX +XXX,XX @@
36
#include "qemu/osdep.h"
34
#include "qemu/osdep.h"
37
#include "qapi/error.h"
35
#include "qapi/error.h"
36
#include "qemu/module.h"
37
+#include "qemu/log.h"
38
#include "cpu.h"
38
#include "cpu.h"
39
-#ifdef CONFIG_TCG
39
#include "hw/arm/pxa.h"
40
-#include "hw/core/tcg-cpu-ops.h"
40
#include "hw/sysbus.h"
41
-#endif /* CONFIG_TCG */
41
@@ -XXX,XX +XXX,XX @@ static uint64_t pxa2xx_pic_mem_read(void *opaque, hwaddr offset,
42
#include "qemu/module.h"
42
case ICHP:    /* Highest Priority register */
43
-#if !defined(CONFIG_USER_ONLY)
43
return pxa2xx_pic_highest(s);
44
-#include "hw/loader.h"
44
default:
45
-#endif
45
- printf("%s: Bad register offset " REG_FMT "\n", __func__, offset);
46
#include "sysemu/kvm.h"
46
+ qemu_log_mask(LOG_GUEST_ERROR,
47
#include "sysemu/hvf.h"
47
+ "pxa2xx_pic_mem_read: bad register offset 0x%" HWADDR_PRIx
48
#include "kvm_arm.h"
48
+ "\n", offset);
49
return 0;
50
}
51
}
52
@@ -XXX,XX +XXX,XX @@ static void pxa2xx_pic_mem_write(void *opaque, hwaddr offset,
53
s->priority[32 + ((offset - IPR32) >> 2)] = value & 0x8000003f;
54
break;
55
default:
56
- printf("%s: Bad register offset " REG_FMT "\n", __func__, offset);
57
+ qemu_log_mask(LOG_GUEST_ERROR,
58
+ "pxa2xx_pic_mem_write: bad register offset 0x%"
59
+ HWADDR_PRIx "\n", offset);
60
return;
61
}
62
pxa2xx_pic_update(opaque);
49
--
63
--
50
2.25.1
64
2.20.1
65
66
diff view generated by jsdifflib
1
From: Fabiano Rosas <farosas@suse.de>
1
The QOM types "spitz-lcdtg" and "corgi-ssp" are missing the
2
usual QOM TYPE and casting macros; provide and use them.
2
3
3
Fix this:
4
In particular, we can safely use the QOM cast macros instead of
4
ERROR: braces {} are necessary for all arms of this statement
5
FROM_SSI_SLAVE() because in both cases the 'ssidev' field of
6
the instance state struct is the first field in it.
5
7
6
Signed-off-by: Fabiano Rosas <farosas@suse.de>
7
Reviewed-by: Claudio Fontana <cfontana@suse.de>
8
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
9
Message-id: 20221213190537.511-4-farosas@suse.de
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 20200628142429.17111-17-peter.maydell@linaro.org
11
---
12
---
12
target/arm/helper.c | 67 ++++++++++++++++++++++++++++-----------------
13
hw/arm/spitz.c | 23 +++++++++++++++--------
13
1 file changed, 42 insertions(+), 25 deletions(-)
14
1 file changed, 15 insertions(+), 8 deletions(-)
14
15
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
18
--- a/hw/arm/spitz.c
18
+++ b/target/arm/helper.c
19
+++ b/hw/arm/spitz.c
19
@@ -XXX,XX +XXX,XX @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
20
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_realize(DeviceState *dev, Error **errp)
20
env->CF = (val >> 29) & 1;
21
#define LCDTG_PICTRL 0x06
21
env->VF = (val << 3) & 0x80000000;
22
#define LCDTG_POLCTRL 0x07
22
}
23
23
- if (mask & CPSR_Q)
24
+#define TYPE_SPITZ_LCDTG "spitz-lcdtg"
24
+ if (mask & CPSR_Q) {
25
+#define SPITZ_LCDTG(obj) OBJECT_CHECK(SpitzLCDTG, (obj), TYPE_SPITZ_LCDTG)
25
env->QF = ((val & CPSR_Q) != 0);
26
+
26
- if (mask & CPSR_T)
27
typedef struct {
27
+ }
28
SSISlave ssidev;
28
+ if (mask & CPSR_T) {
29
uint32_t bl_intensity;
29
env->thumb = ((val & CPSR_T) != 0);
30
@@ -XXX,XX +XXX,XX @@ static inline void spitz_bl_power(void *opaque, int line, int level)
30
+ }
31
31
if (mask & CPSR_IT_0_1) {
32
static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
32
env->condexec_bits &= ~3;
33
{
33
env->condexec_bits |= (val >> 25) & 3;
34
- SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, dev);
34
@@ -XXX,XX +XXX,XX @@ static void switch_mode(CPUARMState *env, int mode)
35
+ SpitzLCDTG *s = SPITZ_LCDTG(dev);
36
int addr;
37
addr = value >> 5;
38
value &= 0x1f;
39
@@ -XXX,XX +XXX,XX @@ static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
40
41
static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
42
{
43
- SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, ssi);
44
+ SpitzLCDTG *s = SPITZ_LCDTG(ssi);
45
DeviceState *dev = DEVICE(s);
46
47
s->bl_power = 0;
48
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
49
#define SPITZ_GPIO_MAX1111_CS 20
50
#define SPITZ_GPIO_TP_INT 11
51
52
+#define TYPE_CORGI_SSP "corgi-ssp"
53
+#define CORGI_SSP(obj) OBJECT_CHECK(CorgiSSPState, (obj), TYPE_CORGI_SSP)
54
+
55
/* "Demux" the signal based on current chipselect */
56
typedef struct {
57
SSISlave ssidev;
58
@@ -XXX,XX +XXX,XX @@ typedef struct {
59
60
static uint32_t corgi_ssp_transfer(SSISlave *dev, uint32_t value)
61
{
62
- CorgiSSPState *s = FROM_SSI_SLAVE(CorgiSSPState, dev);
63
+ CorgiSSPState *s = CORGI_SSP(dev);
35
int i;
64
int i;
36
65
37
old_mode = env->uncached_cpsr & CPSR_M;
66
for (i = 0; i < 3; i++) {
38
- if (mode == old_mode)
67
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
39
+ if (mode == old_mode) {
68
static void corgi_ssp_realize(SSISlave *d, Error **errp)
40
return;
69
{
41
+ }
70
DeviceState *dev = DEVICE(d);
42
71
- CorgiSSPState *s = FROM_SSI_SLAVE(CorgiSSPState, d);
43
if (old_mode == ARM_CPU_MODE_FIQ) {
72
+ CorgiSSPState *s = CORGI_SSP(d);
44
memcpy(env->fiq_regs, env->regs + 8, 5 * sizeof(uint32_t));
73
45
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch32(CPUState *cs)
74
qdev_init_gpio_in(dev, corgi_ssp_gpio_cs, 3);
46
new_mode = ARM_CPU_MODE_UND;
75
s->bus[0] = ssi_create_bus(dev, "ssi0");
47
addr = 0x04;
76
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
48
mask = CPSR_I;
77
{
49
- if (env->thumb)
78
void *bus;
50
+ if (env->thumb) {
79
51
offset = 2;
80
- sms->mux = ssi_create_slave(sms->mpu->ssp[CORGI_SSP_PORT - 1], "corgi-ssp");
52
- else
81
+ sms->mux = ssi_create_slave(sms->mpu->ssp[CORGI_SSP_PORT - 1],
53
+ } else {
82
+ TYPE_CORGI_SSP);
54
offset = 4;
83
55
+ }
84
bus = qdev_get_child_bus(sms->mux, "ssi0");
56
break;
85
- sms->lcdtg = ssi_create_slave(bus, "spitz-lcdtg");
57
case EXCP_SWI:
86
+ sms->lcdtg = ssi_create_slave(bus, TYPE_SPITZ_LCDTG);
58
new_mode = ARM_CPU_MODE_SVC;
87
59
@@ -XXX,XX +XXX,XX @@ static inline uint16_t add16_sat(uint16_t a, uint16_t b)
88
bus = qdev_get_child_bus(sms->mux, "ssi1");
60
89
sms->ads7846 = ssi_create_slave(bus, "ads7846");
61
res = a + b;
90
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_class_init(ObjectClass *klass, void *data)
62
if (((res ^ a) & 0x8000) && !((a ^ b) & 0x8000)) {
63
- if (a & 0x8000)
64
+ if (a & 0x8000) {
65
res = 0x8000;
66
- else
67
+ } else {
68
res = 0x7fff;
69
+ }
70
}
71
return res;
72
}
91
}
73
@@ -XXX,XX +XXX,XX @@ static inline uint8_t add8_sat(uint8_t a, uint8_t b)
92
74
93
static const TypeInfo corgi_ssp_info = {
75
res = a + b;
94
- .name = "corgi-ssp",
76
if (((res ^ a) & 0x80) && !((a ^ b) & 0x80)) {
95
+ .name = TYPE_CORGI_SSP,
77
- if (a & 0x80)
96
.parent = TYPE_SSI_SLAVE,
78
+ if (a & 0x80) {
97
.instance_size = sizeof(CorgiSSPState),
79
res = 0x80;
98
.class_init = corgi_ssp_class_init,
80
- else
99
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_class_init(ObjectClass *klass, void *data)
81
+ } else {
82
res = 0x7f;
83
+ }
84
}
85
return res;
86
}
100
}
87
@@ -XXX,XX +XXX,XX @@ static inline uint16_t sub16_sat(uint16_t a, uint16_t b)
101
88
102
static const TypeInfo spitz_lcdtg_info = {
89
res = a - b;
103
- .name = "spitz-lcdtg",
90
if (((res ^ a) & 0x8000) && ((a ^ b) & 0x8000)) {
104
+ .name = TYPE_SPITZ_LCDTG,
91
- if (a & 0x8000)
105
.parent = TYPE_SSI_SLAVE,
92
+ if (a & 0x8000) {
106
.instance_size = sizeof(SpitzLCDTG),
93
res = 0x8000;
107
.class_init = spitz_lcdtg_class_init,
94
- else
95
+ } else {
96
res = 0x7fff;
97
+ }
98
}
99
return res;
100
}
101
@@ -XXX,XX +XXX,XX @@ static inline uint8_t sub8_sat(uint8_t a, uint8_t b)
102
103
res = a - b;
104
if (((res ^ a) & 0x80) && ((a ^ b) & 0x80)) {
105
- if (a & 0x80)
106
+ if (a & 0x80) {
107
res = 0x80;
108
- else
109
+ } else {
110
res = 0x7f;
111
+ }
112
}
113
return res;
114
}
115
@@ -XXX,XX +XXX,XX @@ static inline uint16_t add16_usat(uint16_t a, uint16_t b)
116
{
117
uint16_t res;
118
res = a + b;
119
- if (res < a)
120
+ if (res < a) {
121
res = 0xffff;
122
+ }
123
return res;
124
}
125
126
static inline uint16_t sub16_usat(uint16_t a, uint16_t b)
127
{
128
- if (a > b)
129
+ if (a > b) {
130
return a - b;
131
- else
132
+ } else {
133
return 0;
134
+ }
135
}
136
137
static inline uint8_t add8_usat(uint8_t a, uint8_t b)
138
{
139
uint8_t res;
140
res = a + b;
141
- if (res < a)
142
+ if (res < a) {
143
res = 0xff;
144
+ }
145
return res;
146
}
147
148
static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
149
{
150
- if (a > b)
151
+ if (a > b) {
152
return a - b;
153
- else
154
+ } else {
155
return 0;
156
+ }
157
}
158
159
#define ADD16(a, b, n) RESULT(add16_usat(a, b), n, 16);
160
@@ -XXX,XX +XXX,XX @@ static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
161
162
static inline uint8_t do_usad(uint8_t a, uint8_t b)
163
{
164
- if (a > b)
165
+ if (a > b) {
166
return a - b;
167
- else
168
+ } else {
169
return b - a;
170
+ }
171
}
172
173
/* Unsigned sum of absolute byte differences. */
174
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(sel_flags)(uint32_t flags, uint32_t a, uint32_t b)
175
uint32_t mask;
176
177
mask = 0;
178
- if (flags & 1)
179
+ if (flags & 1) {
180
mask |= 0xff;
181
- if (flags & 2)
182
+ }
183
+ if (flags & 2) {
184
mask |= 0xff00;
185
- if (flags & 4)
186
+ }
187
+ if (flags & 4) {
188
mask |= 0xff0000;
189
- if (flags & 8)
190
+ }
191
+ if (flags & 8) {
192
mask |= 0xff000000;
193
+ }
194
return (a & mask) | (b & ~mask);
195
}
196
197
--
108
--
198
2.25.1
109
2.20.1
110
111
diff view generated by jsdifflib
1
From: Axel Heider <axel.heider@hensoldt.net>
1
The FROM_SSI_SLAVE() macro predates QOM and is used as a typesafe way
2
to cast from an SSISlave* to the instance struct of a subtype of
3
TYPE_SSI_SLAVE. Switch to using the QOM cast macros instead, which
4
have the same effect (by writing the QOM macros if the types were
5
previously missing them.)
2
6
3
The CNT register is a read-only register. There is no need to
7
(The FROM_SSI_SLAVE() macro allows the SSISlave member of the
4
store it's value, it can be calculated on demand.
8
subtype's struct to be anywhere as long as it is named "ssidev",
5
The calculated frequency is needed temporarily only.
9
whereas a QOM cast macro insists that it is the first thing in the
10
subtype's struct. This is true for all the types we convert here.)
6
11
7
Note that this is a migration compatibility break for all boards
12
This removes all the uses of FROM_SSI_SLAVE() so we can delete the
8
types that use the EPIT peripheral.
13
definition.
9
14
10
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
18
Message-id: 20200628142429.17111-18-peter.maydell@linaro.org
13
---
19
---
14
include/hw/timer/imx_epit.h | 2 -
20
include/hw/ssi/ssi.h | 2 --
15
hw/timer/imx_epit.c | 73 ++++++++++++++-----------------------
21
hw/arm/z2.c | 11 +++++++----
16
2 files changed, 28 insertions(+), 47 deletions(-)
22
hw/display/ads7846.c | 9 ++++++---
23
hw/display/ssd0323.c | 10 +++++++---
24
hw/sd/ssi-sd.c | 4 ++--
25
5 files changed, 22 insertions(+), 14 deletions(-)
17
26
18
diff --git a/include/hw/timer/imx_epit.h b/include/hw/timer/imx_epit.h
27
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
19
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/timer/imx_epit.h
29
--- a/include/hw/ssi/ssi.h
21
+++ b/include/hw/timer/imx_epit.h
30
+++ b/include/hw/ssi/ssi.h
22
@@ -XXX,XX +XXX,XX @@ struct IMXEPITState {
31
@@ -XXX,XX +XXX,XX @@ struct SSISlave {
23
uint32_t sr;
32
bool cs;
24
uint32_t lr;
25
uint32_t cmp;
26
- uint32_t cnt;
27
28
- uint32_t freq;
29
qemu_irq irq;
30
};
33
};
31
34
32
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
35
-#define FROM_SSI_SLAVE(type, dev) DO_UPCAST(type, ssidev, dev)
36
-
37
extern const VMStateDescription vmstate_ssi_slave;
38
39
#define VMSTATE_SSI_SLAVE(_field, _state) { \
40
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
33
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/timer/imx_epit.c
42
--- a/hw/arm/z2.c
35
+++ b/hw/timer/imx_epit.c
43
+++ b/hw/arm/z2.c
36
@@ -XXX,XX +XXX,XX @@ static void imx_epit_update_int(IMXEPITState *s)
44
@@ -XXX,XX +XXX,XX @@ typedef struct {
37
}
45
int pos;
46
} ZipitLCD;
47
48
+#define TYPE_ZIPIT_LCD "zipit-lcd"
49
+#define ZIPIT_LCD(obj) OBJECT_CHECK(ZipitLCD, (obj), TYPE_ZIPIT_LCD)
50
+
51
static uint32_t zipit_lcd_transfer(SSISlave *dev, uint32_t value)
52
{
53
- ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
54
+ ZipitLCD *z = ZIPIT_LCD(dev);
55
uint16_t val;
56
if (z->selected) {
57
z->buf[z->pos] = value & 0xff;
58
@@ -XXX,XX +XXX,XX @@ static void z2_lcd_cs(void *opaque, int line, int level)
59
60
static void zipit_lcd_realize(SSISlave *dev, Error **errp)
61
{
62
- ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
63
+ ZipitLCD *z = ZIPIT_LCD(dev);
64
z->selected = 0;
65
z->enabled = 0;
66
z->pos = 0;
67
@@ -XXX,XX +XXX,XX @@ static void zipit_lcd_class_init(ObjectClass *klass, void *data)
38
}
68
}
39
69
40
-/*
70
static const TypeInfo zipit_lcd_info = {
41
- * Must be called from within a ptimer_transaction_begin/commit block
71
- .name = "zipit-lcd",
42
- * for both s->timer_cmp and s->timer_reload.
72
+ .name = TYPE_ZIPIT_LCD,
43
- */
73
.parent = TYPE_SSI_SLAVE,
44
-static void imx_epit_set_freq(IMXEPITState *s)
74
.instance_size = sizeof(ZipitLCD),
45
+static uint32_t imx_epit_get_freq(IMXEPITState *s)
75
.class_init = zipit_lcd_class_init,
76
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
77
78
type_register_static(&zipit_lcd_info);
79
type_register_static(&aer915_info);
80
- z2_lcd = ssi_create_slave(mpu->ssp[1], "zipit-lcd");
81
+ z2_lcd = ssi_create_slave(mpu->ssp[1], TYPE_ZIPIT_LCD);
82
bus = pxa2xx_i2c_bus(mpu->i2c[0]);
83
i2c_create_slave(bus, TYPE_AER915, 0x55);
84
wm = i2c_create_slave(bus, TYPE_WM8750, 0x1b);
85
diff --git a/hw/display/ads7846.c b/hw/display/ads7846.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/hw/display/ads7846.c
88
+++ b/hw/display/ads7846.c
89
@@ -XXX,XX +XXX,XX @@ typedef struct {
90
int output;
91
} ADS7846State;
92
93
+#define TYPE_ADS7846 "ads7846"
94
+#define ADS7846(obj) OBJECT_CHECK(ADS7846State, (obj), TYPE_ADS7846)
95
+
96
/* Control-byte bitfields */
97
#define CB_PD0        (1 << 0)
98
#define CB_PD1        (1 << 1)
99
@@ -XXX,XX +XXX,XX @@ static void ads7846_int_update(ADS7846State *s)
100
101
static uint32_t ads7846_transfer(SSISlave *dev, uint32_t value)
46
{
102
{
47
- uint32_t clksrc;
103
- ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, dev);
48
- uint32_t prescaler;
104
+ ADS7846State *s = ADS7846(dev);
49
-
105
50
- clksrc = extract32(s->cr, CR_CLKSRC_SHIFT, CR_CLKSRC_BITS);
106
switch (s->cycle ++) {
51
- prescaler = 1 + extract32(s->cr, CR_PRESCALE_SHIFT, CR_PRESCALE_BITS);
107
case 0:
52
-
108
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_ads7846 = {
53
- s->freq = imx_ccm_get_clock_frequency(s->ccm,
109
static void ads7846_realize(SSISlave *d, Error **errp)
54
- imx_epit_clocks[clksrc]) / prescaler;
110
{
55
-
111
DeviceState *dev = DEVICE(d);
56
- DPRINTF("Setting ptimer frequency to %u\n", s->freq);
112
- ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, d);
57
-
113
+ ADS7846State *s = ADS7846(d);
58
- if (s->freq) {
114
59
- ptimer_set_freq(s->timer_reload, s->freq);
115
qdev_init_gpio_out(dev, &s->interrupt, 1);
60
- ptimer_set_freq(s->timer_cmp, s->freq);
116
61
- }
117
@@ -XXX,XX +XXX,XX @@ static void ads7846_class_init(ObjectClass *klass, void *data)
62
+ uint32_t clksrc = extract32(s->cr, CR_CLKSRC_SHIFT, CR_CLKSRC_BITS);
63
+ uint32_t prescaler = 1 + extract32(s->cr, CR_PRESCALE_SHIFT, CR_PRESCALE_BITS);
64
+ uint32_t f_in = imx_ccm_get_clock_frequency(s->ccm, imx_epit_clocks[clksrc]);
65
+ uint32_t freq = f_in / prescaler;
66
+ DPRINTF("ptimer frequency is %u\n", freq);
67
+ return freq;
68
}
118
}
69
119
70
/*
120
static const TypeInfo ads7846_info = {
71
@@ -XXX,XX +XXX,XX @@ static void imx_epit_reset(IMXEPITState *s, bool is_hard_reset)
121
- .name = "ads7846",
72
s->sr = 0;
122
+ .name = TYPE_ADS7846,
73
s->lr = EPIT_TIMER_MAX;
123
.parent = TYPE_SSI_SLAVE,
74
s->cmp = 0;
124
.instance_size = sizeof(ADS7846State),
75
- s->cnt = 0;
125
.class_init = ads7846_class_init,
76
ptimer_transaction_begin(s->timer_cmp);
126
diff --git a/hw/display/ssd0323.c b/hw/display/ssd0323.c
77
ptimer_transaction_begin(s->timer_reload);
127
index XXXXXXX..XXXXXXX 100644
78
- /* stop both timers */
128
--- a/hw/display/ssd0323.c
129
+++ b/hw/display/ssd0323.c
130
@@ -XXX,XX +XXX,XX @@ typedef struct {
131
uint8_t framebuffer[128 * 80 / 2];
132
} ssd0323_state;
133
134
+#define TYPE_SSD0323 "ssd0323"
135
+#define SSD0323(obj) OBJECT_CHECK(ssd0323_state, (obj), TYPE_SSD0323)
79
+
136
+
80
+ /*
137
+
81
+ * The reset switches off the input clock, so even if the CR.EN is still
138
static uint32_t ssd0323_transfer(SSISlave *dev, uint32_t data)
82
+ * set, the timers are no longer running.
139
{
83
+ */
140
- ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, dev);
84
+ assert(imx_epit_get_freq(s) == 0);
141
+ ssd0323_state *s = SSD0323(dev);
85
ptimer_stop(s->timer_cmp);
142
86
ptimer_stop(s->timer_reload);
143
switch (s->mode) {
87
- /* compute new frequency */
144
case SSD0323_DATA:
88
- imx_epit_set_freq(s);
145
@@ -XXX,XX +XXX,XX @@ static const GraphicHwOps ssd0323_ops = {
89
/* init both timers to EPIT_TIMER_MAX */
146
static void ssd0323_realize(SSISlave *d, Error **errp)
90
ptimer_set_limit(s->timer_cmp, EPIT_TIMER_MAX, 1);
147
{
91
ptimer_set_limit(s->timer_reload, EPIT_TIMER_MAX, 1);
148
DeviceState *dev = DEVICE(d);
92
- if (s->freq && (s->cr & CR_EN)) {
149
- ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, d);
93
- /* if the timer is still enabled, restart it */
150
+ ssd0323_state *s = SSD0323(d);
94
- ptimer_run(s->timer_reload, 0);
151
95
- }
152
s->col_end = 63;
96
ptimer_transaction_commit(s->timer_cmp);
153
s->row_end = 79;
97
ptimer_transaction_commit(s->timer_reload);
154
@@ -XXX,XX +XXX,XX @@ static void ssd0323_class_init(ObjectClass *klass, void *data)
98
}
155
}
99
156
100
-static uint32_t imx_epit_update_count(IMXEPITState *s)
157
static const TypeInfo ssd0323_info = {
101
-{
158
- .name = "ssd0323",
102
- s->cnt = ptimer_get_count(s->timer_reload);
159
+ .name = TYPE_SSD0323,
103
-
160
.parent = TYPE_SSI_SLAVE,
104
- return s->cnt;
161
.instance_size = sizeof(ssd0323_state),
105
-}
162
.class_init = ssd0323_class_init,
106
-
163
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
107
static uint64_t imx_epit_read(void *opaque, hwaddr offset, unsigned size)
164
index XXXXXXX..XXXXXXX 100644
165
--- a/hw/sd/ssi-sd.c
166
+++ b/hw/sd/ssi-sd.c
167
@@ -XXX,XX +XXX,XX @@ typedef struct {
168
169
static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
108
{
170
{
109
IMXEPITState *s = IMX_EPIT(opaque);
171
- ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, dev);
110
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_epit_read(void *opaque, hwaddr offset, unsigned size)
172
+ ssi_sd_state *s = SSI_SD(dev);
111
break;
173
112
174
/* Special case: allow CMD12 (STOP TRANSMISSION) while reading data. */
113
case 4: /* CNT */
175
if (s->mode == SSI_SD_DATA_READ && val == 0x4d) {
114
- imx_epit_update_count(s);
176
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_ssi_sd = {
115
- reg_value = s->cnt;
177
116
+ reg_value = ptimer_get_count(s->timer_reload);
178
static void ssi_sd_realize(SSISlave *d, Error **errp)
117
break;
118
119
default:
120
@@ -XXX,XX +XXX,XX @@ static void imx_epit_reload_compare_timer(IMXEPITState *s)
121
{
179
{
122
if ((s->cr & (CR_EN | CR_OCIEN)) == (CR_EN | CR_OCIEN)) {
180
- ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, d);
123
/* if the compare feature is on and timers are running */
181
+ ssi_sd_state *s = SSI_SD(d);
124
- uint32_t tmp = imx_epit_update_count(s);
182
DeviceState *carddev;
125
+ uint32_t tmp = ptimer_get_count(s->timer_reload);
183
DriveInfo *dinfo;
126
uint64_t next;
184
Error *err = NULL;
127
if (tmp > s->cmp) {
128
/* It'll fire in this round of the timer */
129
@@ -XXX,XX +XXX,XX @@ static void imx_epit_reload_compare_timer(IMXEPITState *s)
130
131
static void imx_epit_write_cr(IMXEPITState *s, uint32_t value)
132
{
133
+ uint32_t freq = 0;
134
uint32_t oldcr = s->cr;
135
136
s->cr = value & 0x03ffffff;
137
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write_cr(IMXEPITState *s, uint32_t value)
138
ptimer_transaction_begin(s->timer_cmp);
139
ptimer_transaction_begin(s->timer_reload);
140
141
- /* Update the frequency. Has been done already in case of a reset. */
142
+ /*
143
+ * Update the frequency. In case of a reset the input clock was
144
+ * switched off, so this can be skipped.
145
+ */
146
if (!(s->cr & CR_SWR)) {
147
- imx_epit_set_freq(s);
148
+ freq = imx_epit_get_freq(s);
149
+ if (freq) {
150
+ ptimer_set_freq(s->timer_reload, freq);
151
+ ptimer_set_freq(s->timer_cmp, freq);
152
+ }
153
}
154
155
- if (s->freq && (s->cr & CR_EN) && !(oldcr & CR_EN)) {
156
+ if (freq && (s->cr & CR_EN) && !(oldcr & CR_EN)) {
157
if (s->cr & CR_ENMOD) {
158
if (s->cr & CR_RLD) {
159
ptimer_set_limit(s->timer_reload, s->lr, 1);
160
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps imx_epit_ops = {
161
162
static const VMStateDescription vmstate_imx_timer_epit = {
163
.name = TYPE_IMX_EPIT,
164
- .version_id = 2,
165
- .minimum_version_id = 2,
166
+ .version_id = 3,
167
+ .minimum_version_id = 3,
168
.fields = (VMStateField[]) {
169
VMSTATE_UINT32(cr, IMXEPITState),
170
VMSTATE_UINT32(sr, IMXEPITState),
171
VMSTATE_UINT32(lr, IMXEPITState),
172
VMSTATE_UINT32(cmp, IMXEPITState),
173
- VMSTATE_UINT32(cnt, IMXEPITState),
174
- VMSTATE_UINT32(freq, IMXEPITState),
175
VMSTATE_PTIMER(timer_reload, IMXEPITState),
176
VMSTATE_PTIMER(timer_cmp, IMXEPITState),
177
VMSTATE_END_OF_LIST()
178
--
185
--
179
2.25.1
186
2.20.1
187
188
diff view generated by jsdifflib
1
From: Axel Heider <axel.heider@hensoldt.net>
1
Deprecate our TileGX target support:
2
* we have no active maintainer for it
3
* it has had essentially no contributions (other than tree-wide cleanups
4
and similar) since it was first added
5
* the Linux kernel dropped support in 2018, as has glibc
2
6
3
The interrupt state can change due to:
7
Note the deprecation in the manual, but don't try to print a warning
4
- reset clears both SR.OCIF and CR.OCIE
8
when QEMU runs -- printing unsuppressable messages is more obtrusive
5
- write to CR.EN or CR.OCIE
9
for linux-user mode than it would be for system-emulation mode, and
10
it doesn't seem worth trying to invent a new suppressible-error
11
system for linux-user just for this.
6
12
7
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Reviewed-by: Thomas Huth <thuth@redhat.com>
17
Message-id: 20200619154831.26319-1-peter.maydell@linaro.org
10
---
18
---
11
hw/timer/imx_epit.c | 16 ++++++++++++----
19
docs/system/deprecated.rst | 11 +++++++++++
12
1 file changed, 12 insertions(+), 4 deletions(-)
20
1 file changed, 11 insertions(+)
13
21
14
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
22
diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst
15
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/timer/imx_epit.c
24
--- a/docs/system/deprecated.rst
17
+++ b/hw/timer/imx_epit.c
25
+++ b/docs/system/deprecated.rst
18
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value,
26
@@ -XXX,XX +XXX,XX @@ The above, converted to the current supported format::
19
if (s->cr & CR_SWR) {
27
20
/* handle the reset */
28
json:{"file.driver":"rbd", "file.pool":"rbd", "file.image":"name"}
21
imx_epit_reset(DEVICE(s));
29
22
- /*
30
+linux-user mode CPUs
23
- * TODO: could we 'break' here? following operations appear
31
+--------------------
24
- * to duplicate the work imx_epit_reset() already did.
25
- */
26
}
27
28
+ /*
29
+ * The interrupt state can change due to:
30
+ * - reset clears both SR.OCIF and CR.OCIE
31
+ * - write to CR.EN or CR.OCIE
32
+ */
33
+ imx_epit_update_int(s);
34
+
32
+
35
+ /*
33
+``tilegx`` CPUs (since 5.1.0)
36
+ * TODO: could we 'break' here for reset? following operations appear
34
+'''''''''''''''''''''''''''''
37
+ * to duplicate the work imx_epit_reset() already did.
38
+ */
39
+
35
+
40
ptimer_transaction_begin(s->timer_cmp);
36
+The ``tilegx`` guest CPU support (which was only implemented in
41
ptimer_transaction_begin(s->timer_reload);
37
+linux-user mode) is deprecated and will be removed in a future version
38
+of QEMU. Support for this CPU was removed from the upstream Linux
39
+kernel in 2018, and has also been dropped from glibc.
40
+
41
Related binaries
42
----------------
42
43
43
--
44
--
44
2.25.1
45
2.20.1
46
47
diff view generated by jsdifflib