1
Arm patch queue -- these are all bug fix patches but we might
1
Hi; this target-arm pull request has a collection of generally
2
as well put them in to rc0...
2
fairly minor bugs to sneak in before 3.0 rc0 tomorrow...
3
3
4
thanks
4
thanks
5
-- PMM
5
-- PMM
6
6
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
7
The following changes since commit a98ff0ec2ba3538dd766b349518ee18d03942ed8:
8
8
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
9
Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-3.0-20180709' into staging (2018-07-09 11:00:45 +0100)
10
10
11
are available in the Git repository at:
11
are available in the Git repository at:
12
12
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180709
14
14
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
15
for you to fetch changes up to 8fad0a65582c0a6e324580f45516461e9b6aa439:
16
16
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
17
hw/net/dp8393x: don't make prom region 'nomigrate' (2018-07-09 14:51:35 +0100)
18
18
19
----------------------------------------------------------------
19
----------------------------------------------------------------
20
target-arm queue:
20
target-arm queue:
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
21
* hw/net/dp8393x: don't make prom region 'nomigrate'
22
* dump: Update correct kdump phys_base field for AArch64
22
* boards.h: Remove doc comment reference to nonexistent function
23
* char: i.MX: Add support for "TX complete" interrupt
23
* hw/sd/omap_mmc: Split 'pseudo-reset' from 'power-on-reset'
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
24
* target/arm: Fix do_predset for large VL
25
to boot a Debian Linux kernel on raspi3
25
* tcg: Restrict check_size_impl to multiples of the line size
26
* target/arm: Suppress Coverity warning for PRF
27
* hw/timer/cmsdk-apb-timer: fix minor corner-case bugs and
28
suppress spurious warnings when running Linux's timer driver
29
* hw/arm/smmu-common: Fix devfn computation in smmu_iommu_mr
26
30
27
----------------------------------------------------------------
31
----------------------------------------------------------------
28
Andrey Smirnov (2):
32
Eric Auger (1):
29
char: i.MX: Simplify imx_update()
33
hw/arm/smmu-common: Fix devfn computation in smmu_iommu_mr
30
char: i.MX: Add support for "TX complete" interrupt
31
34
32
Guenter Roeck (1):
35
Guenter Roeck (1):
33
fsl-imx6: Swap Ethernet interrupt defines
36
hw/timer/cmsdk-apb-timer: Correctly identify and set one-shot mode
34
37
35
Peter Maydell (9):
38
Peter Maydell (5):
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
39
ptimer: Add TRIGGER_ONLY_ON_DECREMENT policy option
37
hw/arm/boot: assert that secure_boot and secure_board_setup are false for AArch64
40
hw/timer/cmsdk-apb-timer: Correct ptimer policy settings
38
hw/arm/boot: If booting a kernel in EL2, set SCR_EL3.HCE
41
hw/timer/cmsdk-apb-timer: run or stop timer on writes to RELOAD and VALUE
39
hw/arm/bcm2386: Fix parent type of bcm2386
42
boards.h: Remove doc comment reference to nonexistent function
40
hw/arm/bcm2836: Rename bcm2836 type/struct to bcm283x
43
hw/net/dp8393x: don't make prom region 'nomigrate'
41
hw/arm/bcm2836: Create proper bcm2837 device
42
hw/arm/bcm2836: Use correct affinity values for BCM2837
43
hw/arm/bcm2836: Hardcode correct CPU type
44
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs
45
44
46
Wei Huang (1):
45
Philippe Mathieu-Daudé (1):
47
dump: Update correct kdump phys_base field for AArch64
46
hw/sd/omap_mmc: Split 'pseudo-reset' from 'power-on-reset'
48
47
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
48
Richard Henderson (3):
50
include/hw/arm/fsl-imx6.h | 4 +-
49
target/arm: Suppress Coverity warning for PRF
51
include/hw/char/imx_serial.h | 3 ++
50
tcg: Restrict check_size_impl to multiples of the line size
52
dump.c | 14 +++++--
51
target/arm: Fix do_predset for large VL
53
hw/arm/bcm2836.c | 87 +++++++++++++++++++++++++++++++-------------
54
hw/arm/boot.c | 12 ++++++
55
hw/arm/raspi.c | 77 +++++++++++++++++++++++++++++++--------
56
hw/char/imx_serial.c | 44 ++++++++++++++++------
57
hw/net/imx_fec.c | 28 +++++++++++++-
58
9 files changed, 237 insertions(+), 63 deletions(-)
59
52
53
include/hw/arm/smmu-common.h | 1 +
54
include/hw/boards.h | 3 +--
55
include/hw/ptimer.h | 9 +++++++++
56
hw/arm/smmu-common.c | 2 +-
57
hw/core/ptimer.c | 22 +++++++++++++++++++++-
58
hw/net/dp8393x.c | 2 +-
59
hw/sd/omap_mmc.c | 14 +++++++++++---
60
hw/timer/cmsdk-apb-timer.c | 20 ++++++++++++++++++--
61
target/arm/translate-sve.c | 14 ++++----------
62
tcg/tcg-op-gvec.c | 7 +++++--
63
tests/ptimer-test.c | 25 +++++++++++++++++++------
64
11 files changed, 91 insertions(+), 28 deletions(-)
65
diff view generated by jsdifflib
1
Now we have separate types for BCM2386 and BCM2387, we might as well
1
From: Eric Auger <eric.auger@redhat.com>
2
just hard-code the CPU type they use rather than having it passed
3
through as an object property. This then lets us put the initialization
4
of the CPU object in init rather than realize.
5
2
6
Note that this change means that it's no longer possible on
3
smmu_iommu_mr() aims at returning the IOMMUMemoryRegion corresponding
7
the command line to use -cpu to ask for a different kind of
4
to a given sid. The function extracts both the PCIe bus number and
8
CPU than the SoC supports. This was never a supported thing to
5
the devfn to return this data. Current computation of devfn is wrong
9
do anyway; we were just not sanity-checking the command line.
6
as it only returns the PCIe function instead of slot | function.
10
7
11
This does require us to only build the bcm2837 object on
8
Fixes 32cfd7f39e08 ("hw/arm/smmuv3: Cache/invalidate config data")
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
13
due to the missing cortex-a53 device and "make check" will fail.
14
9
10
Signed-off-by: Eric Auger <eric.auger@redhat.com>
11
Message-id: 1530775623-32399-1-git-send-email-eric.auger@redhat.com
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20180313153458.26822-9-peter.maydell@linaro.org
19
---
14
---
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
15
include/hw/arm/smmu-common.h | 1 +
21
hw/arm/raspi.c | 2 --
16
hw/arm/smmu-common.c | 2 +-
22
2 files changed, 15 insertions(+), 11 deletions(-)
17
2 files changed, 2 insertions(+), 1 deletion(-)
23
18
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
19
diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
25
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/bcm2836.c
21
--- a/include/hw/arm/smmu-common.h
27
+++ b/hw/arm/bcm2836.c
22
+++ b/include/hw/arm/smmu-common.h
28
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@
29
24
30
struct BCM283XInfo {
25
#define SMMU_PCI_BUS_MAX 256
31
const char *name;
26
#define SMMU_PCI_DEVFN_MAX 256
32
+ const char *cpu_type;
27
+#define SMMU_PCI_DEVFN(sid) (sid & 0xFF)
33
int clusterid;
28
34
};
29
#define SMMU_MAX_VA_BITS 48
35
30
36
static const BCM283XInfo bcm283x_socs[] = {
31
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
37
{
38
.name = TYPE_BCM2836,
39
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a15"),
40
.clusterid = 0xf,
41
},
42
+#ifdef TARGET_AARCH64
43
{
44
.name = TYPE_BCM2837,
45
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a53"),
46
.clusterid = 0x0,
47
},
48
+#endif
49
};
50
51
static void bcm2836_init(Object *obj)
52
{
53
BCM283XState *s = BCM283X(obj);
54
+ BCM283XClass *bc = BCM283X_GET_CLASS(obj);
55
+ const BCM283XInfo *info = bc->info;
56
+ int n;
57
+
58
+ for (n = 0; n < BCM283X_NCPUS; n++) {
59
+ object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
60
+ info->cpu_type);
61
+ object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
62
+ &error_abort);
63
+ }
64
65
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
66
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
67
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
68
69
/* common peripherals from bcm2835 */
70
71
- obj = OBJECT(dev);
72
- for (n = 0; n < BCM283X_NCPUS; n++) {
73
- object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
74
- s->cpu_type);
75
- object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
76
- &error_abort);
77
- }
78
-
79
obj = object_property_get_link(OBJECT(dev), "ram", &err);
80
if (obj == NULL) {
81
error_setg(errp, "%s: required ram link not found: %s",
82
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
83
}
84
85
static Property bcm2836_props[] = {
86
- DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
87
DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
88
BCM283X_NCPUS),
89
DEFINE_PROP_END_OF_LIST()
90
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
91
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
92
--- a/hw/arm/raspi.c
33
--- a/hw/arm/smmu-common.c
93
+++ b/hw/arm/raspi.c
34
+++ b/hw/arm/smmu-common.c
94
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
35
@@ -XXX,XX +XXX,XX @@ IOMMUMemoryRegion *smmu_iommu_mr(SMMUState *s, uint32_t sid)
95
/* Setup the SOC */
36
bus_n = PCI_BUS_NUM(sid);
96
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
37
smmu_bus = smmu_find_smmu_pcibus(s, bus_n);
97
&error_abort);
38
if (smmu_bus) {
98
- object_property_set_str(OBJECT(&s->soc), machine->cpu_type, "cpu-type",
39
- devfn = sid & 0x7;
99
- &error_abort);
40
+ devfn = SMMU_PCI_DEVFN(sid);
100
object_property_set_int(OBJECT(&s->soc), smp_cpus, "enabled-cpus",
41
smmu = smmu_bus->pbdev[devfn];
101
&error_abort);
42
if (smmu) {
102
int board_rev = version == 3 ? 0xa02082 : 0xa21041;
43
return &smmu->iommu;
103
--
44
--
104
2.16.2
45
2.17.1
105
46
106
47
diff view generated by jsdifflib
1
The raspi3 has AArch64 CPUs, which means that our smpboot
1
The CMSDK timer behaviour is that an interrupt is triggered when the
2
code for keeping the secondary CPUs in a pen needs to have
2
counter counts down from 1 to 0; however one is not triggered if the
3
a version for A64 as well as A32. Without this, the
3
counter is manually set to 0 by a guest write to the counter register.
4
secondary CPUs go into an infinite loop of taking undefined
4
Currently ptimer can't handle this; add a policy option to allow
5
instruction exceptions.
5
a ptimer user to request this behaviour.
6
6
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180313153458.26822-10-peter.maydell@linaro.org
9
Tested-by: Guenter Roeck <linux@roeck-us.net>
10
Message-id: 20180703171044.9503-2-peter.maydell@linaro.org
10
---
11
---
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
12
include/hw/ptimer.h | 9 +++++++++
12
1 file changed, 40 insertions(+), 1 deletion(-)
13
hw/core/ptimer.c | 22 +++++++++++++++++++++-
14
tests/ptimer-test.c | 25 +++++++++++++++++++------
15
3 files changed, 49 insertions(+), 7 deletions(-)
13
16
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
diff --git a/include/hw/ptimer.h b/include/hw/ptimer.h
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
19
--- a/include/hw/ptimer.h
17
+++ b/hw/arm/raspi.c
20
+++ b/include/hw/ptimer.h
18
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@
19
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
22
* not the one less. */
20
#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
23
#define PTIMER_POLICY_NO_COUNTER_ROUND_DOWN (1 << 4)
21
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
24
22
+#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
25
+/*
23
26
+ * Starting to run with a zero counter, or setting the counter to "0" via
24
/* Table of Linux board IDs for different Pi versions */
27
+ * ptimer_set_count() or ptimer_set_limit() will not trigger the timer
25
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
28
+ * (though it will cause a reload). Only a counter decrement to "0"
26
@@ -XXX,XX +XXX,XX @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
29
+ * will cause a trigger. Not compatible with NO_IMMEDIATE_TRIGGER;
27
info->smp_loader_start);
30
+ * ptimer_init() will assert() that you don't set both.
31
+ */
32
+#define PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT (1 << 5)
33
+
34
/* ptimer.c */
35
typedef struct ptimer_state ptimer_state;
36
typedef void (*ptimer_cb)(void *opaque);
37
diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/core/ptimer.c
40
+++ b/hw/core/ptimer.c
41
@@ -XXX,XX +XXX,XX @@ static void ptimer_reload(ptimer_state *s, int delta_adjust)
42
uint32_t period_frac = s->period_frac;
43
uint64_t period = s->period;
44
uint64_t delta = s->delta;
45
+ bool suppress_trigger = false;
46
47
- if (delta == 0 && !(s->policy_mask & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER)) {
48
+ /*
49
+ * Note that if delta_adjust is 0 then we must be here because of
50
+ * a count register write or timer start, not because of timer expiry.
51
+ * In that case the policy might require us to suppress the timer trigger
52
+ * that we would otherwise generate for a zero delta.
53
+ */
54
+ if (delta_adjust == 0 &&
55
+ (s->policy_mask & PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT)) {
56
+ suppress_trigger = true;
57
+ }
58
+ if (delta == 0 && !(s->policy_mask & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER)
59
+ && !suppress_trigger) {
60
ptimer_trigger(s);
61
}
62
63
@@ -XXX,XX +XXX,XX @@ ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask)
64
s->bh = bh;
65
s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, ptimer_tick, s);
66
s->policy_mask = policy_mask;
67
+
68
+ /*
69
+ * These two policies are incompatible -- trigger-on-decrement implies
70
+ * a timer trigger when the count becomes 0, but no-immediate-trigger
71
+ * implies a trigger when the count stops being 0.
72
+ */
73
+ assert(!((policy_mask & PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT) &&
74
+ (policy_mask & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER)));
75
return s;
28
}
76
}
29
77
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
78
diff --git a/tests/ptimer-test.c b/tests/ptimer-test.c
31
+{
79
index XXXXXXX..XXXXXXX 100644
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
80
--- a/tests/ptimer-test.c
33
+ * The mechanism for doing the spin-table is also entirely different.
81
+++ b/tests/ptimer-test.c
34
+ * We must have four 64-bit fields at absolute addresses
82
@@ -XXX,XX +XXX,XX @@ static void check_periodic(gconstpointer arg)
35
+ * 0xd8, 0xe0, 0xe8, 0xf0 in RAM, which are the flag variables for
83
bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER);
36
+ * our CPUs, and which we must ensure are zero initialized before
84
bool no_immediate_reload = (*policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD);
37
+ * the primary CPU goes into the kernel. We put these variables inside
85
bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
38
+ * a rom blob, so that the reset for ROM contents zeroes them for us.
86
+ bool trig_only_on_dec = (*policy & PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT);
39
+ */
87
40
+ static const uint32_t smpboot[] = {
88
triggered = false;
41
+ 0xd2801b05, /* mov x5, 0xd8 */
89
42
+ 0xd53800a6, /* mrs x6, mpidr_el1 */
90
@@ -XXX,XX +XXX,XX @@ static void check_periodic(gconstpointer arg)
43
+ 0x924004c6, /* and x6, x6, #0x3 */
91
g_assert_cmpuint(ptimer_get_count(ptimer), ==,
44
+ 0xd503205f, /* spin: wfe */
92
no_immediate_reload ? 0 : 10);
45
+ 0xf86678a4, /* ldr x4, [x5,x6,lsl #3] */
93
46
+ 0xb4ffffc4, /* cbz x4, spin */
94
- if (no_immediate_trigger) {
47
+ 0xd2800000, /* mov x0, #0x0 */
95
+ if (no_immediate_trigger || trig_only_on_dec) {
48
+ 0xd2800001, /* mov x1, #0x0 */
96
g_assert_false(triggered);
49
+ 0xd2800002, /* mov x2, #0x0 */
97
} else {
50
+ 0xd2800003, /* mov x3, #0x0 */
98
g_assert_true(triggered);
51
+ 0xd61f0080, /* br x4 */
99
@@ -XXX,XX +XXX,XX @@ static void check_run_with_delta_0(gconstpointer arg)
52
+ };
100
bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER);
101
bool no_immediate_reload = (*policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD);
102
bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
103
+ bool trig_only_on_dec = (*policy & PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT);
104
105
triggered = false;
106
107
@@ -XXX,XX +XXX,XX @@ static void check_run_with_delta_0(gconstpointer arg)
108
g_assert_cmpuint(ptimer_get_count(ptimer), ==,
109
no_immediate_reload ? 0 : 99);
110
111
- if (no_immediate_trigger) {
112
+ if (no_immediate_trigger || trig_only_on_dec) {
113
g_assert_false(triggered);
114
} else {
115
g_assert_true(triggered);
116
@@ -XXX,XX +XXX,XX @@ static void check_run_with_delta_0(gconstpointer arg)
117
g_assert_cmpuint(ptimer_get_count(ptimer), ==,
118
no_immediate_reload ? 0 : 99);
119
120
- if (no_immediate_trigger) {
121
+ if (no_immediate_trigger || trig_only_on_dec) {
122
g_assert_false(triggered);
123
} else {
124
g_assert_true(triggered);
125
@@ -XXX,XX +XXX,XX @@ static void check_periodic_with_load_0(gconstpointer arg)
126
ptimer_state *ptimer = ptimer_init(bh, *policy);
127
bool continuous_trigger = (*policy & PTIMER_POLICY_CONTINUOUS_TRIGGER);
128
bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER);
129
+ bool trig_only_on_dec = (*policy & PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT);
130
131
triggered = false;
132
133
@@ -XXX,XX +XXX,XX @@ static void check_periodic_with_load_0(gconstpointer arg)
134
135
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
136
137
- if (no_immediate_trigger) {
138
+ if (no_immediate_trigger || trig_only_on_dec) {
139
g_assert_false(triggered);
140
} else {
141
g_assert_true(triggered);
142
@@ -XXX,XX +XXX,XX @@ static void check_oneshot_with_load_0(gconstpointer arg)
143
QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
144
ptimer_state *ptimer = ptimer_init(bh, *policy);
145
bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER);
146
+ bool trig_only_on_dec = (*policy & PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT);
147
148
triggered = false;
149
150
@@ -XXX,XX +XXX,XX @@ static void check_oneshot_with_load_0(gconstpointer arg)
151
152
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
153
154
- if (no_immediate_trigger) {
155
+ if (no_immediate_trigger || trig_only_on_dec) {
156
g_assert_false(triggered);
157
} else {
158
g_assert_true(triggered);
159
@@ -XXX,XX +XXX,XX @@ static void add_ptimer_tests(uint8_t policy)
160
g_strlcat(policy_name, "no_counter_rounddown,", 256);
161
}
162
163
+ if (policy & PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT) {
164
+ g_strlcat(policy_name, "trigger_only_on_decrement,", 256);
165
+ }
53
+
166
+
54
+ static const uint64_t spintables[] = {
167
g_test_add_data_func_full(
55
+ 0, 0, 0, 0
168
tmp = g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
56
+ };
169
g_memdup(&policy, 1), check_set_count, g_free);
57
+
170
@@ -XXX,XX +XXX,XX @@ static void add_ptimer_tests(uint8_t policy)
58
+ rom_add_blob_fixed("raspi_smpboot", smpboot, sizeof(smpboot),
171
59
+ info->smp_loader_start);
172
static void add_all_ptimer_policies_comb_tests(void)
60
+ rom_add_blob_fixed("raspi_spintables", spintables, sizeof(spintables),
61
+ SPINTABLE_ADDR);
62
+}
63
+
64
static void write_board_setup(ARMCPU *cpu, const struct arm_boot_info *info)
65
{
173
{
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
174
- int last_policy = PTIMER_POLICY_NO_COUNTER_ROUND_DOWN;
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
175
+ int last_policy = PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT;
68
/* Pi2 and Pi3 requires SMP setup */
176
int policy = PTIMER_POLICY_DEFAULT;
69
if (version >= 2) {
177
70
binfo.smp_loader_start = SMPBOOT_ADDR;
178
for (; policy < (last_policy << 1); policy++) {
71
- binfo.write_secondary_boot = write_smpboot;
179
+ if ((policy & PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT) &&
72
+ if (version == 2) {
180
+ (policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER)) {
73
+ binfo.write_secondary_boot = write_smpboot;
181
+ /* Incompatible policy flag settings -- don't try to test them */
74
+ } else {
182
+ continue;
75
+ binfo.write_secondary_boot = write_smpboot64;
76
+ }
183
+ }
77
binfo.secondary_cpu_reset_hook = reset_secondary;
184
add_ptimer_tests(policy);
78
}
185
}
79
186
}
80
--
187
--
81
2.16.2
188
2.17.1
82
189
83
190
diff view generated by jsdifflib
1
The bcm2837 is pretty similar to the bcm2836, but it does have
1
The CMSDK timer interrupt triggers when the counter goes from 1 to 0,
2
some differences. Notably, the MPIDR affinity aff1 values it
2
so we want to trigger immediately, rather than waiting for a
3
sets for the CPUs are 0x0, rather than the 0xf that the bcm2836
3
clock cycle. Drop the incorrect NO_IMMEDIATE_TRIGGER setting.
4
uses, and if this is wrong Linux will not boot.
4
We also do not want to get an interrupt if the guest sets the
5
5
counter directly to zero, so use the new TRIGGER_ONLY_ON_DECREMENT
6
Rather than trying to have one device with properties that
6
policy.
7
configure it differently for the two cases, create two
8
separate QOM devices for the two SoCs. We use the same approach
9
as hw/arm/aspeed_soc.c and share code and have a data table
10
that might differ per-SoC. For the moment the two types don't
11
actually have different behaviour.
12
7
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20180313153458.26822-7-peter.maydell@linaro.org
10
Tested-by: Guenter Roeck <linux@roeck-us.net>
11
Message-id: 20180703171044.9503-3-peter.maydell@linaro.org
16
---
12
---
17
include/hw/arm/bcm2836.h | 19 +++++++++++++++++++
13
hw/timer/cmsdk-apb-timer.c | 2 +-
18
hw/arm/bcm2836.c | 37 ++++++++++++++++++++++++++++++++-----
14
1 file changed, 1 insertion(+), 1 deletion(-)
19
hw/arm/raspi.c | 3 ++-
20
3 files changed, 53 insertions(+), 6 deletions(-)
21
15
22
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
16
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
23
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/bcm2836.h
18
--- a/hw/timer/cmsdk-apb-timer.c
25
+++ b/include/hw/arm/bcm2836.h
19
+++ b/hw/timer/cmsdk-apb-timer.c
26
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
27
21
bh = qemu_bh_new(cmsdk_apb_timer_tick, s);
28
#define BCM283X_NCPUS 4
22
s->timer = ptimer_init(bh,
29
23
PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD |
30
+/* These type names are for specific SoCs; other than instantiating
24
- PTIMER_POLICY_NO_IMMEDIATE_TRIGGER |
31
+ * them, code using these devices should always handle them via the
25
+ PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT |
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
26
PTIMER_POLICY_NO_IMMEDIATE_RELOAD |
33
+ */
27
PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
34
+#define TYPE_BCM2836 "bcm2836"
35
+#define TYPE_BCM2837 "bcm2837"
36
+
37
typedef struct BCM283XState {
38
/*< private >*/
39
DeviceState parent_obj;
40
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
41
BCM2835PeripheralState peripherals;
42
} BCM283XState;
43
44
+typedef struct BCM283XInfo BCM283XInfo;
45
+
46
+typedef struct BCM283XClass {
47
+ DeviceClass parent_class;
48
+ const BCM283XInfo *info;
49
+} BCM283XClass;
50
+
51
+#define BCM283X_CLASS(klass) \
52
+ OBJECT_CLASS_CHECK(BCM283XClass, (klass), TYPE_BCM283X)
53
+#define BCM283X_GET_CLASS(obj) \
54
+ OBJECT_GET_CLASS(BCM283XClass, (obj), TYPE_BCM283X)
55
+
56
#endif /* BCM2836_H */
57
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/arm/bcm2836.c
60
+++ b/hw/arm/bcm2836.c
61
@@ -XXX,XX +XXX,XX @@
62
/* "QA7" (Pi2) interrupt controller and mailboxes etc. */
63
#define BCM2836_CONTROL_BASE 0x40000000
64
65
+struct BCM283XInfo {
66
+ const char *name;
67
+};
68
+
69
+static const BCM283XInfo bcm283x_socs[] = {
70
+ {
71
+ .name = TYPE_BCM2836,
72
+ },
73
+ {
74
+ .name = TYPE_BCM2837,
75
+ },
76
+};
77
+
78
static void bcm2836_init(Object *obj)
79
{
80
BCM283XState *s = BCM283X(obj);
81
@@ -XXX,XX +XXX,XX @@ static Property bcm2836_props[] = {
82
DEFINE_PROP_END_OF_LIST()
83
};
84
85
-static void bcm2836_class_init(ObjectClass *oc, void *data)
86
+static void bcm283x_class_init(ObjectClass *oc, void *data)
87
{
88
DeviceClass *dc = DEVICE_CLASS(oc);
89
+ BCM283XClass *bc = BCM283X_CLASS(oc);
90
91
- dc->props = bcm2836_props;
92
+ bc->info = data;
93
dc->realize = bcm2836_realize;
94
+ dc->props = bcm2836_props;
95
}
96
97
-static const TypeInfo bcm2836_type_info = {
98
+static const TypeInfo bcm283x_type_info = {
99
.name = TYPE_BCM283X,
100
.parent = TYPE_DEVICE,
101
.instance_size = sizeof(BCM283XState),
102
.instance_init = bcm2836_init,
103
- .class_init = bcm2836_class_init,
104
+ .class_size = sizeof(BCM283XClass),
105
+ .abstract = true,
106
};
107
108
static void bcm2836_register_types(void)
109
{
110
- type_register_static(&bcm2836_type_info);
111
+ int i;
112
+
113
+ type_register_static(&bcm283x_type_info);
114
+ for (i = 0; i < ARRAY_SIZE(bcm283x_socs); i++) {
115
+ TypeInfo ti = {
116
+ .name = bcm283x_socs[i].name,
117
+ .parent = TYPE_BCM283X,
118
+ .class_init = bcm283x_class_init,
119
+ .class_data = (void *) &bcm283x_socs[i],
120
+ };
121
+ type_register(&ti);
122
+ }
123
}
124
125
type_init(bcm2836_register_types)
126
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
127
index XXXXXXX..XXXXXXX 100644
128
--- a/hw/arm/raspi.c
129
+++ b/hw/arm/raspi.c
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
131
BusState *bus;
132
DeviceState *carddev;
133
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
135
+ object_initialize(&s->soc, sizeof(s->soc),
136
+ version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
137
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
138
&error_abort);
139
28
140
--
29
--
141
2.16.2
30
2.17.1
142
31
143
32
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Guenter Roeck <linux@roeck-us.net>
2
2
3
The sabrelite machine model used by qemu-system-arm is based on the
3
The CMSDK APB timer is currently always configured as periodic timer.
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
4
This results in the following messages when trying to boot Linux.
5
controller which is supported in QEMU using the imx_fec.c module
6
(actually called imx.enet for this model.)
7
5
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
6
Timer with delta zero, disabling
9
imx.enet device like this:
10
7
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
8
If the timer limit set with the RELOAD command is 0, the timer
12
#define FSL_IMX6_ENET_MAC_IRQ 119
9
needs to be enabled as one-shot timer.
13
10
14
According to https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf,
15
page 225, in Table 3-1. ARM Cortex A9 domain interrupt summary,
16
interrupts are as follows.
17
18
150 ENET MAC 0 IRQ
19
151 ENET MAC 0 1588 Timer interrupt
20
21
where
22
23
150 - 32 == 118
24
151 - 32 == 119
25
26
In other words, the vector definitions in the fsl-imx6.h file are reversed.
27
28
Fixing the interrupts alone causes problems with older Linux kernels:
29
The Ethernet interface will fail to probe with Linux v4.9 and earlier.
30
Linux v4.1 and earlier will crash due to a bug in Ethernet driver probe
31
error handling. This is a Linux kernel problem, not a qemu problem:
32
the Linux kernel only worked by accident since it requested both interrupts.
33
34
For backward compatibility, generate the Ethernet interrupt on both interrupt
35
lines. This was shown to work from all Linux kernel releases starting with
36
v3.16.
37
38
Link: https://bugs.launchpad.net/qemu/+bug/1753309
39
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
11
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
40
Message-id: 1520723090-22130-1-git-send-email-linux@roeck-us.net
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
41
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Tested-by: Guenter Roeck <linux@roeck-us.net>
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
16
---
44
include/hw/arm/fsl-imx6.h | 4 ++--
17
hw/timer/cmsdk-apb-timer.c | 2 +-
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
18
1 file changed, 1 insertion(+), 1 deletion(-)
46
2 files changed, 29 insertions(+), 3 deletions(-)
47
19
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
20
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
49
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/fsl-imx6.h
22
--- a/hw/timer/cmsdk-apb-timer.c
51
+++ b/include/hw/arm/fsl-imx6.h
23
+++ b/hw/timer/cmsdk-apb-timer.c
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
24
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_write(void *opaque, hwaddr offset, uint64_t value,
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
25
}
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
26
s->ctrl = value & 0xf;
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
27
if (s->ctrl & R_CTRL_EN_MASK) {
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
28
- ptimer_run(s->timer, 0);
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
29
+ ptimer_run(s->timer, ptimer_get_limit(s->timer) == 0);
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
30
} else {
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
31
ptimer_stop(s->timer);
60
#define FSL_IMX6_PCIE1_IRQ 120
32
}
61
#define FSL_IMX6_PCIE2_IRQ 121
62
#define FSL_IMX6_PCIE3_IRQ 122
63
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/net/imx_fec.c
66
+++ b/hw/net/imx_fec.c
67
@@ -XXX,XX +XXX,XX @@ static void imx_enet_write_bd(IMXENETBufDesc *bd, dma_addr_t addr)
68
69
static void imx_eth_update(IMXFECState *s)
70
{
71
- if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] & ENET_INT_TS_TIMER) {
72
+ /*
73
+ * Previous versions of qemu had the ENET_INT_MAC and ENET_INT_TS_TIMER
74
+ * interrupts swapped. This worked with older versions of Linux (4.14
75
+ * and older) since Linux associated both interrupt lines with Ethernet
76
+ * MAC interrupts. Specifically,
77
+ * - Linux 4.15 and later have separate interrupt handlers for the MAC and
78
+ * timer interrupts. Those versions of Linux fail with versions of QEMU
79
+ * with swapped interrupt assignments.
80
+ * - In linux 4.14, both interrupt lines were registered with the Ethernet
81
+ * MAC interrupt handler. As a result, all versions of qemu happen to
82
+ * work, though that is accidental.
83
+ * - In Linux 4.9 and older, the timer interrupt was registered directly
84
+ * with the Ethernet MAC interrupt handler. The MAC interrupt was
85
+ * redirected to a GPIO interrupt to work around erratum ERR006687.
86
+ * This was implemented using the SOC's IOMUX block. In qemu, this GPIO
87
+ * interrupt never fired since IOMUX is currently not supported in qemu.
88
+ * Linux instead received MAC interrupts on the timer interrupt.
89
+ * As a result, qemu versions with the swapped interrupt assignment work,
90
+ * albeit accidentally, but qemu versions with the correct interrupt
91
+ * assignment fail.
92
+ *
93
+ * To ensure that all versions of Linux work, generate ENET_INT_MAC
94
+ * interrrupts on both interrupt lines. This should be changed if and when
95
+ * qemu supports IOMUX.
96
+ */
97
+ if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] &
98
+ (ENET_INT_MAC | ENET_INT_TS_TIMER)) {
99
qemu_set_irq(s->irq[1], 1);
100
} else {
101
qemu_set_irq(s->irq[1], 0);
102
--
33
--
103
2.16.2
34
2.17.1
104
35
105
36
diff view generated by jsdifflib
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
1
If the CMSDK APB timer is set up with a zero RELOAD value
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
2
then it will count down to zero, fire once and then stay
3
is required for Linux to boot.
3
at zero. From the point of view of the ptimer system, the
4
timer is disabled; but the enable bit in the CTRL register
5
is still set and if the guest subsequently writes to the
6
RELOAD or VALUE registers this should cause the timer to
7
start counting down again.
8
9
Add code to the write paths for RELOAD and VALUE so that
10
we correctly restart the timer in this situation.
11
12
Conversely, if the new RELOAD and VALUE are both zero,
13
we should stop the ptimer.
4
14
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Tested-by: Guenter Roeck <linux@roeck-us.net>
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
18
Message-id: 20180703171044.9503-5-peter.maydell@linaro.org
9
---
19
---
10
hw/arm/bcm2836.c | 11 +++++++----
20
hw/timer/cmsdk-apb-timer.c | 16 ++++++++++++++++
11
1 file changed, 7 insertions(+), 4 deletions(-)
21
1 file changed, 16 insertions(+)
12
22
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
23
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
14
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/bcm2836.c
25
--- a/hw/timer/cmsdk-apb-timer.c
16
+++ b/hw/arm/bcm2836.c
26
+++ b/hw/timer/cmsdk-apb-timer.c
17
@@ -XXX,XX +XXX,XX @@
27
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_write(void *opaque, hwaddr offset, uint64_t value,
18
28
break;
19
struct BCM283XInfo {
29
case A_RELOAD:
20
const char *name;
30
/* Writing to reload also sets the current timer value */
21
+ int clusterid;
31
+ if (!value) {
22
};
32
+ ptimer_stop(s->timer);
23
33
+ }
24
static const BCM283XInfo bcm283x_socs[] = {
34
ptimer_set_limit(s->timer, value, 1);
25
{
35
+ if (value && (s->ctrl & R_CTRL_EN_MASK)) {
26
.name = TYPE_BCM2836,
36
+ /*
27
+ .clusterid = 0xf,
37
+ * Make sure timer is running (it might have stopped if this
28
},
38
+ * was an expired one-shot timer)
29
{
39
+ */
30
.name = TYPE_BCM2837,
40
+ ptimer_run(s->timer, 0);
31
+ .clusterid = 0x0,
41
+ }
32
},
42
break;
33
};
43
case A_VALUE:
34
44
+ if (!value && !ptimer_get_limit(s->timer)) {
35
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
45
+ ptimer_stop(s->timer);
36
static void bcm2836_realize(DeviceState *dev, Error **errp)
46
+ }
37
{
47
ptimer_set_count(s->timer, value);
38
BCM283XState *s = BCM283X(dev);
48
+ if (value && (s->ctrl & R_CTRL_EN_MASK)) {
39
+ BCM283XClass *bc = BCM283X_GET_CLASS(dev);
49
+ ptimer_run(s->timer, ptimer_get_limit(s->timer) == 0);
40
+ const BCM283XInfo *info = bc->info;
50
+ }
41
Object *obj;
51
break;
42
Error *err = NULL;
52
case A_INTSTATUS:
43
int n;
53
/* Just one bit, which is W1C. */
44
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
45
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
46
47
for (n = 0; n < BCM283X_NCPUS; n++) {
48
- /* Mirror bcm2836, which has clusterid set to 0xf
49
- * TODO: this should be converted to a property of ARM_CPU
50
- */
51
- s->cpus[n].mp_affinity = 0xF00 | n;
52
+ /* TODO: this should be converted to a property of ARM_CPU */
53
+ s->cpus[n].mp_affinity = (info->clusterid << 8) | n;
54
55
/* set periphbase/CBAR value for CPU-local registers */
56
object_property_set_int(OBJECT(&s->cpus[n]),
57
--
54
--
58
2.16.2
55
2.17.1
59
56
60
57
diff view generated by jsdifflib
1
Our BCM2836 type is really a generic one that can be any of
1
From: Richard Henderson <richard.henderson@linaro.org>
2
the bcm283x family. Rename it accordingly. We change only
3
the names which are visible via the header file to the
4
rest of the QEMU code, leaving private function names
5
in bcm2836.c as they are.
6
2
7
This is a preliminary to making bcm283x be an abstract
3
These instructions must perform the sve_access_check, but
8
parent class to specific types for the bcm2836 and bcm2837.
4
since they are implemented as NOPs there is no generated
5
code to elide when the access check fails.
9
6
7
Fixes: Coverity issues 1393780 & 1393779.
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180313153458.26822-6-peter.maydell@linaro.org
14
---
11
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
12
target/arm/translate-sve.c | 4 ++--
16
hw/arm/bcm2836.c | 17 +++++++++--------
13
1 file changed, 2 insertions(+), 2 deletions(-)
17
hw/arm/raspi.c | 16 ++++++++--------
18
3 files changed, 23 insertions(+), 22 deletions(-)
19
14
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/bcm2836.h
17
--- a/target/arm/translate-sve.c
23
+++ b/include/hw/arm/bcm2836.h
18
+++ b/target/arm/translate-sve.c
24
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static bool trans_ST1_zpiz(DisasContext *s, arg_ST1_zpiz *a, uint32_t insn)
25
#include "hw/arm/bcm2835_peripherals.h"
20
static bool trans_PRF(DisasContext *s, arg_PRF *a, uint32_t insn)
26
#include "hw/intc/bcm2836_control.h"
27
28
-#define TYPE_BCM2836 "bcm2836"
29
-#define BCM2836(obj) OBJECT_CHECK(BCM2836State, (obj), TYPE_BCM2836)
30
+#define TYPE_BCM283X "bcm283x"
31
+#define BCM283X(obj) OBJECT_CHECK(BCM283XState, (obj), TYPE_BCM283X)
32
33
-#define BCM2836_NCPUS 4
34
+#define BCM283X_NCPUS 4
35
36
-typedef struct BCM2836State {
37
+typedef struct BCM283XState {
38
/*< private >*/
39
DeviceState parent_obj;
40
/*< public >*/
41
@@ -XXX,XX +XXX,XX @@ typedef struct BCM2836State {
42
char *cpu_type;
43
uint32_t enabled_cpus;
44
45
- ARMCPU cpus[BCM2836_NCPUS];
46
+ ARMCPU cpus[BCM283X_NCPUS];
47
BCM2836ControlState control;
48
BCM2835PeripheralState peripherals;
49
-} BCM2836State;
50
+} BCM283XState;
51
52
#endif /* BCM2836_H */
53
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/arm/bcm2836.c
56
+++ b/hw/arm/bcm2836.c
57
@@ -XXX,XX +XXX,XX @@
58
59
static void bcm2836_init(Object *obj)
60
{
21
{
61
- BCM2836State *s = BCM2836(obj);
22
/* Prefetch is a nop within QEMU. */
62
+ BCM283XState *s = BCM283X(obj);
23
- sve_access_check(s);
63
24
+ (void)sve_access_check(s);
64
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
25
return true;
65
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
66
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
67
68
static void bcm2836_realize(DeviceState *dev, Error **errp)
69
{
70
- BCM2836State *s = BCM2836(dev);
71
+ BCM283XState *s = BCM283X(dev);
72
Object *obj;
73
Error *err = NULL;
74
int n;
75
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
76
/* common peripherals from bcm2835 */
77
78
obj = OBJECT(dev);
79
- for (n = 0; n < BCM2836_NCPUS; n++) {
80
+ for (n = 0; n < BCM283X_NCPUS; n++) {
81
object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
82
s->cpu_type);
83
object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
84
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
85
sysbus_connect_irq(SYS_BUS_DEVICE(&s->peripherals), 1,
86
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
87
88
- for (n = 0; n < BCM2836_NCPUS; n++) {
89
+ for (n = 0; n < BCM283X_NCPUS; n++) {
90
/* Mirror bcm2836, which has clusterid set to 0xf
91
* TODO: this should be converted to a property of ARM_CPU
92
*/
93
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
94
}
26
}
95
27
96
static Property bcm2836_props[] = {
28
@@ -XXX,XX +XXX,XX @@ static bool trans_PRF_rr(DisasContext *s, arg_PRF_rr *a, uint32_t insn)
97
- DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
29
return false;
98
- DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
30
}
99
+ DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
31
/* Prefetch is a nop within QEMU. */
100
+ DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
32
- sve_access_check(s);
101
+ BCM283X_NCPUS),
33
+ (void)sve_access_check(s);
102
DEFINE_PROP_END_OF_LIST()
34
return true;
103
};
104
105
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
106
}
35
}
107
36
108
static const TypeInfo bcm2836_type_info = {
109
- .name = TYPE_BCM2836,
110
+ .name = TYPE_BCM283X,
111
.parent = TYPE_DEVICE,
112
- .instance_size = sizeof(BCM2836State),
113
+ .instance_size = sizeof(BCM283XState),
114
.instance_init = bcm2836_init,
115
.class_init = bcm2836_class_init,
116
};
117
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
118
index XXXXXXX..XXXXXXX 100644
119
--- a/hw/arm/raspi.c
120
+++ b/hw/arm/raspi.c
121
@@ -XXX,XX +XXX,XX @@
122
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
123
124
typedef struct RasPiState {
125
- BCM2836State soc;
126
+ BCM283XState soc;
127
MemoryRegion ram;
128
} RasPiState;
129
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
131
BusState *bus;
132
DeviceState *carddev;
133
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM2836);
135
+ object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
136
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
137
&error_abort);
138
139
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
140
mc->no_floppy = 1;
141
mc->no_cdrom = 1;
142
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
143
- mc->max_cpus = BCM2836_NCPUS;
144
- mc->min_cpus = BCM2836_NCPUS;
145
- mc->default_cpus = BCM2836_NCPUS;
146
+ mc->max_cpus = BCM283X_NCPUS;
147
+ mc->min_cpus = BCM283X_NCPUS;
148
+ mc->default_cpus = BCM283X_NCPUS;
149
mc->default_ram_size = 1024 * 1024 * 1024;
150
mc->ignore_memory_transaction_failures = true;
151
};
152
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_init(MachineClass *mc)
153
mc->no_floppy = 1;
154
mc->no_cdrom = 1;
155
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53");
156
- mc->max_cpus = BCM2836_NCPUS;
157
- mc->min_cpus = BCM2836_NCPUS;
158
- mc->default_cpus = BCM2836_NCPUS;
159
+ mc->max_cpus = BCM283X_NCPUS;
160
+ mc->min_cpus = BCM283X_NCPUS;
161
+ mc->default_cpus = BCM283X_NCPUS;
162
mc->default_ram_size = 1024 * 1024 * 1024;
163
}
164
DEFINE_MACHINE("raspi3", raspi3_machine_init)
165
--
37
--
166
2.16.2
38
2.17.1
167
39
168
40
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Code of imx_update() is slightly confusing since the "flags" variable
3
Normally this is automatic in the size restrictions that are placed
4
doesn't really corespond to anything in real hardware and server as a
4
on vector sizes coming from the implementation. However, for the
5
kitchensink accumulating events normally reported via USR1 and USR2
5
legitimate size tuple [oprsz=8, maxsz=32], we need to clear the final
6
registers.
6
24 bytes of the vector register. Without this check, do_dup selects
7
TCG_TYPE_V128 and clears only 16 bytes.
7
8
8
Change the code to explicitly evaluate state of interrupts reported
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
via USR1 and USR2 against corresponding masking bits and use the to
10
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
detemine if IRQ line should be asserted or not.
11
Tested-by: Alex Bennée <alex.bennee@linaro.org>
11
12
Message-id: 20180705191929.30773-2-richard.henderson@linaro.org
12
NOTE: Check for UTS1_TXEMPTY being set has been dropped for two
13
reasons:
14
15
1. Emulation code implements a single character FIFO, so this flag
16
will always be set since characters are trasmitted as a part of
17
the code emulating "push" into the FIFO
18
19
2. imx_update() is really just a function doing ORing and maksing
20
of reported events, so checking for UTS1_TXEMPTY should happen,
21
if it's ever really needed should probably happen outside of
22
it.
23
24
Cc: qemu-devel@nongnu.org
25
Cc: qemu-arm@nongnu.org
26
Cc: Bill Paul <wpaul@windriver.com>
27
Cc: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
29
Message-id: 20180315191141.6789-1-andrew.smirnov@gmail.com
30
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
---
14
---
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
15
tcg/tcg-op-gvec.c | 7 +++++--
34
1 file changed, 16 insertions(+), 8 deletions(-)
16
1 file changed, 5 insertions(+), 2 deletions(-)
35
17
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
18
diff --git a/tcg/tcg-op-gvec.c b/tcg/tcg-op-gvec.c
37
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/char/imx_serial.c
20
--- a/tcg/tcg-op-gvec.c
39
+++ b/hw/char/imx_serial.c
21
+++ b/tcg/tcg-op-gvec.c
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
22
@@ -XXX,XX +XXX,XX @@ void tcg_gen_gvec_4_ptr(uint32_t dofs, uint32_t aofs, uint32_t bofs,
41
23
in units of LNSZ. This limits the expansion of inline code. */
42
static void imx_update(IMXSerialState *s)
24
static inline bool check_size_impl(uint32_t oprsz, uint32_t lnsz)
43
{
25
{
44
- uint32_t flags;
26
- uint32_t lnct = oprsz / lnsz;
45
+ uint32_t usr1;
27
- return lnct >= 1 && lnct <= MAX_UNROLL;
46
+ uint32_t usr2;
28
+ if (oprsz % lnsz == 0) {
47
+ uint32_t mask;
29
+ uint32_t lnct = oprsz / lnsz;
48
30
+ return lnct >= 1 && lnct <= MAX_UNROLL;
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
31
+ }
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
32
+ return false;
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
52
- } else {
53
- flags &= ~USR1_TRDY;
54
- }
55
+ /*
56
+ * Lucky for us TRDY and RRDY has the same offset in both USR1 and
57
+ * UCR1, so we can get away with something as simple as the
58
+ * following:
59
+ */
60
+ usr1 = s->usr1 & s->ucr1 & (USR1_TRDY | USR1_RRDY);
61
+ /*
62
+ * Bits that we want in USR2 are not as conveniently laid out,
63
+ * unfortunately.
64
+ */
65
+ mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
66
+ usr2 = s->usr2 & mask;
67
68
- qemu_set_irq(s->irq, !!flags);
69
+ qemu_set_irq(s->irq, usr1 || usr2);
70
}
33
}
71
34
72
static void imx_serial_reset(IMXSerialState *s)
35
static void expand_clr(uint32_t dofs, uint32_t maxsz);
73
--
36
--
74
2.16.2
37
2.17.1
75
38
76
39
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
3
Use MAKE_64BIT_MASK instead of open-coding. Remove an odd
4
it is needed to support guests other than Linux.
4
vector size check that is unlikely to be more profitable
5
than 3 64-bit integer stores. Correct the iteration for WORD
6
to avoid writing too much data.
5
7
6
Based on the patch by Bill Paul as found here:
8
Fixes RISU tests of PTRUE for VL 256.
7
https://bugs.launchpad.net/qemu/+bug/1753314
8
9
9
Cc: qemu-devel@nongnu.org
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Cc: qemu-arm@nongnu.org
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
11
Cc: Bill Paul <wpaul@windriver.com>
12
Tested-by: Alex Bennée <alex.bennee@linaro.org>
12
Cc: Peter Maydell <peter.maydell@linaro.org>
13
Message-id: 20180705191929.30773-3-richard.henderson@linaro.org
13
Signed-off-by: Bill Paul <wpaul@windriver.com>
14
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
15
Message-id: 20180315191141.6789-2-andrew.smirnov@gmail.com
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
15
---
19
include/hw/char/imx_serial.h | 3 +++
16
target/arm/translate-sve.c | 10 ++--------
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
17
1 file changed, 2 insertions(+), 8 deletions(-)
21
2 files changed, 20 insertions(+), 3 deletions(-)
22
18
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
19
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
24
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/char/imx_serial.h
21
--- a/target/arm/translate-sve.c
26
+++ b/include/hw/char/imx_serial.h
22
+++ b/target/arm/translate-sve.c
27
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ static bool do_predset(DisasContext *s, int esz, int rd, int pat, bool setflag)
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
24
setsz = numelem << esz;
29
#define UCR2_SRST (1<<0) /* Reset complete */
25
lastword = word = pred_esz_masks[esz];
30
26
if (setsz % 64) {
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
27
- lastword &= ~(-1ull << (setsz % 64));
32
+
28
+ lastword &= MAKE_64BIT_MASK(0, setsz % 64);
33
#define UTS1_TXEMPTY (1<<6)
34
#define UTS1_RXEMPTY (1<<5)
35
#define UTS1_TXFULL (1<<4)
36
@@ -XXX,XX +XXX,XX @@ typedef struct IMXSerialState {
37
uint32_t ubmr;
38
uint32_t ubrc;
39
uint32_t ucr3;
40
+ uint32_t ucr4;
41
42
qemu_irq irq;
43
CharBackend chr;
44
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/char/imx_serial.c
47
+++ b/hw/char/imx_serial.c
48
@@ -XXX,XX +XXX,XX @@
49
50
static const VMStateDescription vmstate_imx_serial = {
51
.name = TYPE_IMX_SERIAL,
52
- .version_id = 1,
53
- .minimum_version_id = 1,
54
+ .version_id = 2,
55
+ .minimum_version_id = 2,
56
.fields = (VMStateField[]) {
57
VMSTATE_INT32(readbuff, IMXSerialState),
58
VMSTATE_UINT32(usr1, IMXSerialState),
59
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
60
VMSTATE_UINT32(ubmr, IMXSerialState),
61
VMSTATE_UINT32(ubrc, IMXSerialState),
62
VMSTATE_UINT32(ucr3, IMXSerialState),
63
+ VMSTATE_UINT32(ucr4, IMXSerialState),
64
VMSTATE_END_OF_LIST()
65
},
66
};
67
@@ -XXX,XX +XXX,XX @@ static void imx_update(IMXSerialState *s)
68
* unfortunately.
69
*/
70
mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
71
+ /*
72
+ * TCEN and TXDC are both bit 3
73
+ */
74
+ mask |= s->ucr4 & UCR4_TCEN;
75
+
76
usr2 = s->usr2 & mask;
77
78
qemu_set_irq(s->irq, usr1 || usr2);
79
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_serial_read(void *opaque, hwaddr offset,
80
return s->ucr3;
81
82
case 0x23: /* UCR4 */
83
+ return s->ucr4;
84
+
85
case 0x29: /* BRM Incremental */
86
return 0x0; /* TODO */
87
88
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
89
* qemu_chr_fe_write and background I/O callbacks */
90
qemu_chr_fe_write_all(&s->chr, &ch, 1);
91
s->usr1 &= ~USR1_TRDY;
92
+ s->usr2 &= ~USR2_TXDC;
93
imx_update(s);
94
s->usr1 |= USR1_TRDY;
95
+ s->usr2 |= USR2_TXDC;
96
imx_update(s);
97
}
29
}
98
break;
30
}
99
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
31
100
s->ucr3 = value & 0xffff;
32
@@ -XXX,XX +XXX,XX @@ static bool do_predset(DisasContext *s, int esz, int rd, int pat, bool setflag)
101
break;
33
tcg_gen_gvec_dup64i(ofs, oprsz, maxsz, word);
102
34
goto done;
103
- case 0x2d: /* UTS1 */
35
}
104
case 0x23: /* UCR4 */
36
- if (oprsz * 8 == setsz + 8) {
105
+ s->ucr4 = value & 0xffff;
37
- tcg_gen_gvec_dup64i(ofs, oprsz, maxsz, word);
106
+ imx_update(s);
38
- tcg_gen_movi_i64(t, 0);
107
+ break;
39
- tcg_gen_st_i64(t, cpu_env, ofs + oprsz - 8);
108
+
40
- goto done;
109
+ case 0x2d: /* UTS1 */
41
- }
110
qemu_log_mask(LOG_UNIMP, "[%s]%s: Unimplemented reg 0x%"
42
}
111
HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
43
112
/* TODO */
44
setsz /= 8;
45
fullsz /= 8;
46
47
tcg_gen_movi_i64(t, word);
48
- for (i = 0; i < setsz; i += 8) {
49
+ for (i = 0; i < QEMU_ALIGN_DOWN(setsz, 8); i += 8) {
50
tcg_gen_st_i64(t, cpu_env, ofs + i);
51
}
52
if (lastword != word) {
113
--
53
--
114
2.16.2
54
2.17.1
115
55
116
56
diff view generated by jsdifflib
1
From: Wei Huang <wei@redhat.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
For guest kernel that supports KASLR, the load address can change every
3
DeviceClass::reset models a "cold power-on" reset which can
4
time when guest VM runs. To find the physical base address correctly,
4
also be used to powercycle a device; but there is no "hot reset"
5
current QEMU dump searches VMCOREINFO for the string "NUMBER(phys_base)=".
5
(a.k.a. soft-reset) method available.
6
However this string pattern is only available on x86_64. AArch64 uses a
7
different field, called "NUMBER(PHYS_OFFSET)=". This patch makes sure
8
QEMU dump uses the correct string on AArch64.
9
6
10
Signed-off-by: Wei Huang <wei@redhat.com>
7
The OMAP MMC Power-Up Control bit is not designed to powercycle
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
8
a card, but to disable it without powering it off (pseudo-reset):
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.com
9
10
Multimedia Card (MMC/SD/SDIO) Interface [SPRU765A]
11
12
MMC_CON[11] Power-Up Control (POW)
13
This bit must be set to 1 before any valid transaction to either
14
MMC/SD or SPI memory cards.
15
When 1, the card is considered powered-up and the controller core
16
is enabled.
17
When 0, the card is considered powered-down (system dependent),
18
and the controller core logic is in pseudo-reset state. This is,
19
the MMC_STAT flags and the FIFO pointers are reset, any access to
20
MMC_DATA[DATA] has no effect, a write into the MMC.CMD register
21
is ignored, and a setting of MMC_SPI[STR] to 1 is ignored.
22
23
By splitting the 'pseudo-reset' code out of the 'power-on' reset
24
function, this patch fixes a latent bug in omap_mmc_write(MMC_CON)i
25
recently exposed by ecd219f7abb.
26
27
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
28
Message-id: 20180706162155.8432-2-f4bug@amsat.org
29
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
30
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
31
---
15
dump.c | 14 +++++++++++---
32
hw/sd/omap_mmc.c | 14 +++++++++++---
16
1 file changed, 11 insertions(+), 3 deletions(-)
33
1 file changed, 11 insertions(+), 3 deletions(-)
17
34
18
diff --git a/dump.c b/dump.c
35
diff --git a/hw/sd/omap_mmc.c b/hw/sd/omap_mmc.c
19
index XXXXXXX..XXXXXXX 100644
36
index XXXXXXX..XXXXXXX 100644
20
--- a/dump.c
37
--- a/hw/sd/omap_mmc.c
21
+++ b/dump.c
38
+++ b/hw/sd/omap_mmc.c
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
39
@@ -XXX,XX +XXX,XX @@
23
40
/*
24
lines = g_strsplit((char *)vmci, "\n", -1);
41
* OMAP on-chip MMC/SD host emulation.
25
for (i = 0; lines[i]; i++) {
42
*
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
43
+ * Datasheet: TI Multimedia Card (MMC/SD/SDIO) Interface (SPRU765A)
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
44
+ *
28
+ const char *prefix = NULL;
45
* Copyright (C) 2006-2007 Andrzej Zaborowski <balrog@zabor.org>
46
*
47
* This program is free software; you can redistribute it and/or
48
@@ -XXX,XX +XXX,XX @@ static void omap_mmc_update(void *opaque)
49
omap_mmc_interrupts_update(s);
50
}
51
52
+static void omap_mmc_pseudo_reset(struct omap_mmc_s *host)
53
+{
54
+ host->status = 0;
55
+ host->fifo_len = 0;
56
+}
29
+
57
+
30
+ if (s->dump_info.d_machine == EM_X86_64) {
58
void omap_mmc_reset(struct omap_mmc_s *host)
31
+ prefix = "NUMBER(phys_base)=";
59
{
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
60
host->last_cmd = 0;
33
+ prefix = "NUMBER(PHYS_OFFSET)=";
61
@@ -XXX,XX +XXX,XX @@ void omap_mmc_reset(struct omap_mmc_s *host)
34
+ }
62
host->dw = 0;
63
host->mode = 0;
64
host->enable = 0;
65
- host->status = 0;
66
host->mask = 0;
67
host->cto = 0;
68
host->dto = 0;
69
- host->fifo_len = 0;
70
host->blen = 0;
71
host->blen_counter = 0;
72
host->nblk = 0;
73
@@ -XXX,XX +XXX,XX @@ void omap_mmc_reset(struct omap_mmc_s *host)
74
qemu_set_irq(host->coverswitch, host->cdet_state);
75
host->clkdiv = 0;
76
77
+ omap_mmc_pseudo_reset(host);
35
+
78
+
36
+ if (prefix && g_str_has_prefix(lines[i], prefix)) {
79
/* Since we're still using the legacy SD API the card is not plugged
37
+ if (qemu_strtou64(lines[i] + strlen(prefix), NULL, 16,
80
* into any bus, and we must reset it manually. When omap_mmc is
38
&phys_base) < 0) {
81
* QOMified this must move into the QOM reset function.
39
- warn_report("Failed to read NUMBER(phys_base)=");
82
@@ -XXX,XX +XXX,XX @@ static void omap_mmc_write(void *opaque, hwaddr offset,
40
+ warn_report("Failed to read %s", prefix);
83
if (s->dw != 0 && s->lines < 4)
41
} else {
84
printf("4-bit SD bus enabled\n");
42
s->dump_info.phys_base = phys_base;
85
if (!s->enable)
43
}
86
- omap_mmc_reset(s);
87
+ omap_mmc_pseudo_reset(s);
88
break;
89
90
case 0x10:    /* MMC_STAT */
44
--
91
--
45
2.16.2
92
2.17.1
46
93
47
94
diff view generated by jsdifflib
Deleted patch
1
For the rpi1 and 2 we want to boot the Linux kernel via some
2
custom setup code that makes sure that the SMC instruction
3
acts as a no-op, because it's used for cache maintenance.
4
The rpi3 boots AArch64 kernels, which don't need SMC for
5
cache maintenance and always expect to be booted non-secure.
6
Don't fill in the aarch32-specific parts of the binfo struct.
7
1
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20180313153458.26822-2-peter.maydell@linaro.org
12
---
13
hw/arm/raspi.c | 17 +++++++++++++----
14
1 file changed, 13 insertions(+), 4 deletions(-)
15
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
19
+++ b/hw/arm/raspi.c
20
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
21
binfo.board_id = raspi_boardid[version];
22
binfo.ram_size = ram_size;
23
binfo.nb_cpus = smp_cpus;
24
- binfo.board_setup_addr = BOARDSETUP_ADDR;
25
- binfo.write_board_setup = write_board_setup;
26
- binfo.secure_board_setup = true;
27
- binfo.secure_boot = true;
28
+
29
+ if (version <= 2) {
30
+ /* The rpi1 and 2 require some custom setup code to run in Secure
31
+ * mode before booting a kernel (to set up the SMC vectors so
32
+ * that we get a no-op SMC; this is used by Linux to call the
33
+ * firmware for some cache maintenance operations.
34
+ * The rpi3 doesn't need this.
35
+ */
36
+ binfo.board_setup_addr = BOARDSETUP_ADDR;
37
+ binfo.write_board_setup = write_board_setup;
38
+ binfo.secure_board_setup = true;
39
+ binfo.secure_boot = true;
40
+ }
41
42
/* Pi2 and Pi3 requires SMP setup */
43
if (version >= 2) {
44
--
45
2.16.2
46
47
diff view generated by jsdifflib
Deleted patch
1
Add some assertions that if we're about to boot an AArch64 kernel,
2
the board code has not mistakenly set either secure_boot or
3
secure_board_setup. It doesn't make sense to set secure_boot,
4
because all AArch64 kernels must be booted in non-secure mode.
5
1
6
It might in theory make sense to set secure_board_setup, but
7
we don't currently support that, because only the AArch32
8
bootloader[] code calls this hook; bootloader_aarch64[] does not.
9
Since we don't have a current need for this functionality, just
10
assert that we don't try to use it. If it's needed we'll add
11
it later.
12
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20180313153458.26822-3-peter.maydell@linaro.org
16
---
17
hw/arm/boot.c | 7 +++++++
18
1 file changed, 7 insertions(+)
19
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
23
+++ b/hw/arm/boot.c
24
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
25
} else {
26
env->pstate = PSTATE_MODE_EL1h;
27
}
28
+ /* AArch64 kernels never boot in secure mode */
29
+ assert(!info->secure_boot);
30
+ /* This hook is only supported for AArch32 currently:
31
+ * bootloader_aarch64[] will not call the hook, and
32
+ * the code above has already dropped us into EL2 or EL1.
33
+ */
34
+ assert(!info->secure_board_setup);
35
}
36
37
/* Set to non-secure if not a secure boot */
38
--
39
2.16.2
40
41
diff view generated by jsdifflib
1
If we're directly booting a Linux kernel and the CPU supports both
1
commit b08199c6fbea1 accidentally added a reference to a doc
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
2
comment to a nonexistent memory_region_allocate_aux_memory().
3
set the SCR_EL3.HCE bit in this situation, so that the HVC
3
This was a leftover from a previous version of the patchset
4
instruction is enabled rather than UNDEFing. Otherwise at least some
4
which defined memory_region_allocate_aux_memory() for
5
kernels will panic when trying to initialize KVM in the guest.
5
"allocate RAM MemoryRegion and register it for migration"
6
and left "memory_region_init_ram()" with its original semantics
7
of "allocate RAM MR but do not register for migration". In
8
the end we decided on the approach of "memory_region_init_ram()
9
registers the MR for migration, and memory_region_init_ram_nomigrate()
10
is a new function which does not", but this comment change
11
got left in by mistake. Revert that part of the commit.
6
12
13
Reported-by: Thomas Huth <huth@tuxfamily.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
15
Message-id: 20180702130605.13611-1-peter.maydell@linaro.org
9
---
16
---
10
hw/arm/boot.c | 5 +++++
17
include/hw/boards.h | 3 +--
11
1 file changed, 5 insertions(+)
18
1 file changed, 1 insertion(+), 2 deletions(-)
12
19
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
20
diff --git a/include/hw/boards.h b/include/hw/boards.h
14
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/boot.c
22
--- a/include/hw/boards.h
16
+++ b/hw/arm/boot.c
23
+++ b/include/hw/boards.h
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
24
@@ -XXX,XX +XXX,XX @@
18
assert(!info->secure_board_setup);
25
*
19
}
26
* Smaller pieces of memory (display RAM, static RAMs, etc) don't need
20
27
* to be backed via the -mem-path memory backend and can simply
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
28
- * be created via memory_region_allocate_aux_memory() or
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
29
- * memory_region_init_ram().
23
+ env->cp15.scr_el3 |= SCR_HCE;
30
+ * be created via memory_region_init_ram().
24
+ }
31
*/
25
+
32
void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
26
/* Set to non-secure if not a secure boot */
33
const char *name,
27
if (!info->secure_boot &&
28
(cs != first_cpu || !info->secure_board_setup)) {
29
--
34
--
30
2.16.2
35
2.17.1
31
36
32
37
diff view generated by jsdifflib
1
The TypeInfo and state struct for bcm2386 disagree about what the
1
Currently we use memory_region_init_rom_nomigrate() to create
2
parent class is -- the TypeInfo says it's TYPE_SYS_BUS_DEVICE,
2
the "dp3893x-prom" memory region, and we don't manually register
3
but the BCM2386State struct only defines the parent_obj field
3
it with vmstate_register_ram(). This currently means that its
4
as DeviceState. This would have caused problems if anything
4
contents are migrated but as a ram block whose name is the empty
5
actually tried to treat the object as a TYPE_SYS_BUS_DEVICE.
5
string; in future it may mean they are not migrated at all. Use
6
Fix the TypeInfo to use TYPE_DEVICE as the parent, since we don't
6
memory_region_init_ram() instead.
7
need any of the additional functionality TYPE_SYS_BUS_DEVICE
7
8
provides.
8
Note that this is a a cross-version migration compatibility break
9
for the MIPS "magnum" and "pica61" machines.
9
10
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
12
Reviewed-by: Aleksandar Markovic <aleksandar.markovic@wavecomp.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180706174309.27110-1-peter.maydell@linaro.org
13
Message-id: 20180313153458.26822-5-peter.maydell@linaro.org
14
---
14
---
15
hw/arm/bcm2836.c | 2 +-
15
hw/net/dp8393x.c | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
16
1 file changed, 1 insertion(+), 1 deletion(-)
17
17
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
18
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
19
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/bcm2836.c
20
--- a/hw/net/dp8393x.c
21
+++ b/hw/arm/bcm2836.c
21
+++ b/hw/net/dp8393x.c
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
22
@@ -XXX,XX +XXX,XX @@ static void dp8393x_realize(DeviceState *dev, Error **errp)
23
23
s->watchdog = timer_new_ns(QEMU_CLOCK_VIRTUAL, dp8393x_watchdog, s);
24
static const TypeInfo bcm2836_type_info = {
24
s->regs[SONIC_SR] = 0x0004; /* only revision recognized by Linux */
25
.name = TYPE_BCM2836,
25
26
- .parent = TYPE_SYS_BUS_DEVICE,
26
- memory_region_init_ram_nomigrate(&s->prom, OBJECT(dev),
27
+ .parent = TYPE_DEVICE,
27
+ memory_region_init_ram(&s->prom, OBJECT(dev),
28
.instance_size = sizeof(BCM2836State),
28
"dp8393x-prom", SONIC_PROM_SIZE, &local_err);
29
.instance_init = bcm2836_init,
29
if (local_err) {
30
.class_init = bcm2836_class_init,
30
error_propagate(errp, local_err);
31
--
31
--
32
2.16.2
32
2.17.1
33
33
34
34
diff view generated by jsdifflib