1
Arm patch queue -- these are all bug fix patches but we might
1
target-arm queue: a smallish set of patches for rc1 tomorrow.
2
as well put them in to rc0...
2
I've included the tcg patches because RTH has no others that
3
would merit a pullreq.
4
5
I haven't included Thomas Huth's 17-patch set to deal with
6
the introspection crashes, to give that a little more time
7
on-list for review.
3
8
4
thanks
9
thanks
5
-- PMM
10
-- PMM
6
11
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
12
The following changes since commit 102ad0a80f5110483efd06877c29c4236be267f9:
8
13
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
14
Merge remote-tracking branch 'remotes/armbru/tags/pull-misc-2018-07-16' into staging (2018-07-16 15:34:38 +0100)
10
15
11
are available in the Git repository at:
16
are available in the Git repository at:
12
17
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
18
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180716
14
19
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
20
for you to fetch changes up to 3474c98a2a2afcefa7c665f02ad2bed2a43ab0f7:
16
21
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
22
accel/tcg: Assert that tlb fill gave us a valid TLB entry (2018-07-16 17:26:01 +0100)
18
23
19
----------------------------------------------------------------
24
----------------------------------------------------------------
20
target-arm queue:
25
target-arm queue:
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
26
* accel/tcg: Use correct test when looking in victim TLB for code
22
* dump: Update correct kdump phys_base field for AArch64
27
* bcm2835_aux: Swap RX and TX interrupt assignments
23
* char: i.MX: Add support for "TX complete" interrupt
28
* hw/arm/bcm2836: Mark the bcm2836 / bcm2837 devices with user_creatable = false
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
29
* hw/intc/arm_gic: Fix handling of GICD_ITARGETSR
25
to boot a Debian Linux kernel on raspi3
30
* hw/intc/arm_gic: Check interrupt number in gic_deactivate_irq()
31
* aspeed: Implement write-1-{set, clear} for AST2500 strapping
32
* target/arm: Fix LD1W and LDFF1W (scalar plus vector)
26
33
27
----------------------------------------------------------------
34
----------------------------------------------------------------
28
Andrey Smirnov (2):
35
Andrew Jeffery (1):
29
char: i.MX: Simplify imx_update()
36
aspeed: Implement write-1-{set, clear} for AST2500 strapping
30
char: i.MX: Add support for "TX complete" interrupt
31
37
32
Guenter Roeck (1):
38
Guenter Roeck (1):
33
fsl-imx6: Swap Ethernet interrupt defines
39
bcm2835_aux: Swap RX and TX interrupt assignments
34
40
35
Peter Maydell (9):
41
Peter Maydell (4):
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
42
hw/intc/arm_gic: Check interrupt number in gic_deactivate_irq()
37
hw/arm/boot: assert that secure_boot and secure_board_setup are false for AArch64
43
hw/intc/arm_gic: Fix handling of GICD_ITARGETSR
38
hw/arm/boot: If booting a kernel in EL2, set SCR_EL3.HCE
44
accel/tcg: Use correct test when looking in victim TLB for code
39
hw/arm/bcm2386: Fix parent type of bcm2386
45
accel/tcg: Assert that tlb fill gave us a valid TLB entry
40
hw/arm/bcm2836: Rename bcm2836 type/struct to bcm283x
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
46
46
Wei Huang (1):
47
Richard Henderson (1):
47
dump: Update correct kdump phys_base field for AArch64
48
target/arm: Fix LD1W and LDFF1W (scalar plus vector)
48
49
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
50
Thomas Huth (1):
50
include/hw/arm/fsl-imx6.h | 4 +-
51
hw/arm/bcm2836: Mark the bcm2836 / bcm2837 devices with user_creatable = false
51
include/hw/char/imx_serial.h | 3 ++
52
dump.c | 14 +++++--
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/misc/aspeed_scu.h | 2 ++
54
accel/tcg/cputlb.c | 6 +++---
55
hw/arm/bcm2836.c | 2 ++
56
hw/char/bcm2835_aux.c | 4 ++--
57
hw/intc/arm_gic.c | 22 +++++++++++++++++++---
58
hw/misc/aspeed_scu.c | 19 +++++++++++++++++--
59
target/arm/sve_helper.c | 4 ++--
60
7 files changed, 47 insertions(+), 12 deletions(-)
61
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
'I' was being double-incremented; correctly within the inner loop
4
doesn't really corespond to anything in real hardware and server as a
4
and incorrectly within the outer loop.
5
kitchensink accumulating events normally reported via USR1 and USR2
6
registers.
7
5
8
Change the code to explicitly evaluate state of interrupts reported
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
via USR1 and USR2 against corresponding masking bits and use the to
7
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
detemine if IRQ line should be asserted or not.
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
11
9
Tested-by: Alex Bennée <alex.bennee@linaro.org>
12
NOTE: Check for UTS1_TXEMPTY being set has been dropped for two
10
Message-id: 20180711103957.3040-1-richard.henderson@linaro.org
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>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
---
12
---
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
13
target/arm/sve_helper.c | 4 ++--
34
1 file changed, 16 insertions(+), 8 deletions(-)
14
1 file changed, 2 insertions(+), 2 deletions(-)
35
15
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
16
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
37
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/char/imx_serial.c
18
--- a/target/arm/sve_helper.c
39
+++ b/hw/char/imx_serial.c
19
+++ b/target/arm/sve_helper.c
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
20
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(CPUARMState *env, void *vd, void *vg, void *vm, \
41
21
intptr_t i, oprsz = simd_oprsz(desc); \
42
static void imx_update(IMXSerialState *s)
22
unsigned scale = simd_data(desc); \
43
{
23
uintptr_t ra = GETPC(); \
44
- uint32_t flags;
24
- for (i = 0; i < oprsz; i++) { \
45
+ uint32_t usr1;
25
+ for (i = 0; i < oprsz; ) { \
46
+ uint32_t usr2;
26
uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
47
+ uint32_t mask;
27
do { \
48
28
TYPEM m = 0; \
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
29
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(CPUARMState *env, void *vd, void *vg, void *vm, \
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
30
uintptr_t ra = GETPC(); \
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
31
bool first = true; \
52
- } else {
32
mmap_lock(); \
53
- flags &= ~USR1_TRDY;
33
- for (i = 0; i < oprsz; i++) { \
54
- }
34
+ for (i = 0; i < oprsz; ) { \
55
+ /*
35
uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
56
+ * Lucky for us TRDY and RRDY has the same offset in both USR1 and
36
do { \
57
+ * UCR1, so we can get away with something as simple as the
37
TYPEM m = 0; \
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
}
71
72
static void imx_serial_reset(IMXSerialState *s)
73
--
38
--
74
2.16.2
39
2.17.1
75
40
76
41
diff view generated by jsdifflib
1
From: Wei Huang <wei@redhat.com>
1
From: Andrew Jeffery <andrew@aj.id.au>
2
2
3
For guest kernel that supports KASLR, the load address can change every
3
The AST2500 SoC family changes the runtime behaviour of the hardware
4
time when guest VM runs. To find the physical base address correctly,
4
strapping register (SCU70) to write-1-set/write-1-clear, with
5
current QEMU dump searches VMCOREINFO for the string "NUMBER(phys_base)=".
5
write-1-clear implemented on the "read-only" SoC revision register
6
However this string pattern is only available on x86_64. AArch64 uses a
6
(SCU7C). For the the AST2400, the hardware strapping is
7
different field, called "NUMBER(PHYS_OFFSET)=". This patch makes sure
7
runtime-configured with read-modify-write semantics.
8
QEMU dump uses the correct string on AArch64.
9
8
10
Signed-off-by: Wei Huang <wei@redhat.com>
9
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
10
Reviewed-by: Joel Stanley <joel@jms.id.au>
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.com
11
Message-id: 20180709143524.17480-1-andrew@aj.id.au
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
13
---
15
dump.c | 14 +++++++++++---
14
include/hw/misc/aspeed_scu.h | 2 ++
16
1 file changed, 11 insertions(+), 3 deletions(-)
15
hw/misc/aspeed_scu.c | 19 +++++++++++++++++--
16
2 files changed, 19 insertions(+), 2 deletions(-)
17
17
18
diff --git a/dump.c b/dump.c
18
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
19
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
20
--- a/dump.c
20
--- a/include/hw/misc/aspeed_scu.h
21
+++ b/dump.c
21
+++ b/include/hw/misc/aspeed_scu.h
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
22
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSCUState {
23
23
#define AST2500_A0_SILICON_REV 0x04000303U
24
lines = g_strsplit((char *)vmci, "\n", -1);
24
#define AST2500_A1_SILICON_REV 0x04010303U
25
for (i = 0; lines[i]; i++) {
25
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
26
+#define ASPEED_IS_AST2500(si_rev) ((((si_rev) >> 24) & 0xff) == 0x04)
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
28
+ const char *prefix = NULL;
29
+
27
+
30
+ if (s->dump_info.d_machine == EM_X86_64) {
28
extern bool is_supported_silicon_rev(uint32_t silicon_rev);
31
+ prefix = "NUMBER(phys_base)=";
29
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
30
#define ASPEED_SCU_PROT_KEY 0x1688A8A8
33
+ prefix = "NUMBER(PHYS_OFFSET)=";
31
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/misc/aspeed_scu.c
34
+++ b/hw/misc/aspeed_scu.c
35
@@ -XXX,XX +XXX,XX @@ static void aspeed_scu_write(void *opaque, hwaddr offset, uint64_t data,
36
s->regs[reg] = data;
37
aspeed_scu_set_apb_freq(s);
38
break;
39
-
40
+ case HW_STRAP1:
41
+ if (ASPEED_IS_AST2500(s->regs[SILICON_REV])) {
42
+ s->regs[HW_STRAP1] |= data;
43
+ return;
34
+ }
44
+ }
35
+
45
+ /* Jump to assignment below */
36
+ if (prefix && g_str_has_prefix(lines[i], prefix)) {
46
+ break;
37
+ if (qemu_strtou64(lines[i] + strlen(prefix), NULL, 16,
47
+ case SILICON_REV:
38
&phys_base) < 0) {
48
+ if (ASPEED_IS_AST2500(s->regs[SILICON_REV])) {
39
- warn_report("Failed to read NUMBER(phys_base)=");
49
+ s->regs[HW_STRAP1] &= ~data;
40
+ warn_report("Failed to read %s", prefix);
50
+ } else {
41
} else {
51
+ qemu_log_mask(LOG_GUEST_ERROR,
42
s->dump_info.phys_base = phys_base;
52
+ "%s: Write to read-only offset 0x%" HWADDR_PRIx "\n",
43
}
53
+ __func__, offset);
54
+ }
55
+ /* Avoid assignment below, we've handled everything */
56
+ return;
57
case FREQ_CNTR_EVAL:
58
case VGA_SCRATCH1 ... VGA_SCRATCH8:
59
case RNG_DATA:
60
- case SILICON_REV:
61
case FREE_CNTR4:
62
case FREE_CNTR4_EXT:
63
qemu_log_mask(LOG_GUEST_ERROR,
44
--
64
--
45
2.16.2
65
2.17.1
46
66
47
67
diff view generated by jsdifflib
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
1
In gic_deactivate_irq() the interrupt number comes from the guest
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
2
(on a write to the GICC_DIR register), so we need to sanity check
3
is required for Linux to boot.
3
that it isn't out of range before we use it as an array index.
4
Handle this in a similar manner to the check we do in
5
gic_complete_irq() for the GICC_EOI register.
6
7
The array overrun is not disastrous because the calling code
8
uses (value & 0x3ff) to extract the interrupt field, so the
9
only out-of-range values possible are 1020..1023, which allow
10
overrunning only from irq_state[] into the following
11
irq_target[] array which the guest can already manipulate.
4
12
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
16
Message-id: 20180712154152.32183-2-peter.maydell@linaro.org
9
---
17
---
10
hw/arm/bcm2836.c | 11 +++++++----
18
hw/intc/arm_gic.c | 16 +++++++++++++++-
11
1 file changed, 7 insertions(+), 4 deletions(-)
19
1 file changed, 15 insertions(+), 1 deletion(-)
12
20
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
21
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
14
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/bcm2836.c
23
--- a/hw/intc/arm_gic.c
16
+++ b/hw/arm/bcm2836.c
24
+++ b/hw/intc/arm_gic.c
17
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@ static bool gic_eoi_split(GICState *s, int cpu, MemTxAttrs attrs)
18
26
static void gic_deactivate_irq(GICState *s, int cpu, int irq, MemTxAttrs attrs)
19
struct BCM283XInfo {
20
const char *name;
21
+ int clusterid;
22
};
23
24
static const BCM283XInfo bcm283x_socs[] = {
25
{
26
.name = TYPE_BCM2836,
27
+ .clusterid = 0xf,
28
},
29
{
30
.name = TYPE_BCM2837,
31
+ .clusterid = 0x0,
32
},
33
};
34
35
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
36
static void bcm2836_realize(DeviceState *dev, Error **errp)
37
{
27
{
38
BCM283XState *s = BCM283X(dev);
28
int cm = 1 << cpu;
39
+ BCM283XClass *bc = BCM283X_GET_CLASS(dev);
29
- int group = gic_has_groups(s) && GIC_TEST_GROUP(irq, cm);
40
+ const BCM283XInfo *info = bc->info;
30
+ int group;
41
Object *obj;
31
+
42
Error *err = NULL;
32
+ if (irq >= s->num_irq) {
43
int n;
33
+ /*
44
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
34
+ * This handles two cases:
45
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
35
+ * 1. If software writes the ID of a spurious interrupt [ie 1023]
46
36
+ * to the GICC_DIR, the GIC ignores that write.
47
for (n = 0; n < BCM283X_NCPUS; n++) {
37
+ * 2. If software writes the number of a non-existent interrupt
48
- /* Mirror bcm2836, which has clusterid set to 0xf
38
+ * this must be a subcase of "value written is not an active interrupt"
49
- * TODO: this should be converted to a property of ARM_CPU
39
+ * and so this is UNPREDICTABLE. We choose to ignore it.
50
- */
40
+ */
51
- s->cpus[n].mp_affinity = 0xF00 | n;
41
+ return;
52
+ /* TODO: this should be converted to a property of ARM_CPU */
42
+ }
53
+ s->cpus[n].mp_affinity = (info->clusterid << 8) | n;
43
+
54
44
+ group = gic_has_groups(s) && GIC_TEST_GROUP(irq, cm);
55
/* set periphbase/CBAR value for CPU-local registers */
45
56
object_property_set_int(OBJECT(&s->cpus[n]),
46
if (!gic_eoi_split(s, cpu, attrs)) {
47
/* This is UNPREDICTABLE; we choose to ignore it */
57
--
48
--
58
2.16.2
49
2.17.1
59
50
60
51
diff view generated by jsdifflib
1
The bcm2837 is pretty similar to the bcm2836, but it does have
1
The GICD_ITARGETSR implementation still has some 11MPCore behaviour
2
some differences. Notably, the MPIDR affinity aff1 values it
2
that we were incorrectly using in our GICv1 and GICv2 implementations
3
sets for the CPUs are 0x0, rather than the 0xf that the bcm2836
3
for the case where the interrupt number is less than GIC_INTERNAL.
4
uses, and if this is wrong Linux will not boot.
4
The desired behaviour here is:
5
* for 11MPCore: RAZ/WI for irqs 0..28; read a number matching the
6
CPU doing the read for irqs 29..31
7
* for GICv1 and v2: RAZ/WI if uniprocessor; otherwise read a
8
number matching the CPU doing the read for all irqs < 32
5
9
6
Rather than trying to have one device with properties that
10
Stop squashing GICD_ITARGETSR to 0 for IRQs 0..28 unless this
7
configure it differently for the two cases, create two
11
is an 11MPCore GIC.
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
12
13
Reported-by: Jan Kiszka <jan.kiszka@web.de>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20180313153458.26822-7-peter.maydell@linaro.org
16
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
17
Message-id: 20180712154152.32183-3-peter.maydell@linaro.org
16
---
18
---
17
include/hw/arm/bcm2836.h | 19 +++++++++++++++++++
19
hw/intc/arm_gic.c | 6 ++++--
18
hw/arm/bcm2836.c | 37 ++++++++++++++++++++++++++++++++-----
20
1 file changed, 4 insertions(+), 2 deletions(-)
19
hw/arm/raspi.c | 3 ++-
20
3 files changed, 53 insertions(+), 6 deletions(-)
21
21
22
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
22
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
23
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/bcm2836.h
24
--- a/hw/intc/arm_gic.c
25
+++ b/include/hw/arm/bcm2836.h
25
+++ b/hw/intc/arm_gic.c
26
@@ -XXX,XX +XXX,XX @@
26
@@ -XXX,XX +XXX,XX @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset, MemTxAttrs attrs)
27
27
if (irq >= s->num_irq) {
28
#define BCM283X_NCPUS 4
28
goto bad_reg;
29
29
}
30
+/* These type names are for specific SoCs; other than instantiating
30
- if (irq >= 29 && irq <= 31) {
31
+ * them, code using these devices should always handle them via the
31
+ if (irq < 29 && s->revision == REV_11MPCORE) {
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
32
+ res = 0;
33
+ */
33
+ } else if (irq < GIC_INTERNAL) {
34
+#define TYPE_BCM2836 "bcm2836"
34
res = cm;
35
+#define TYPE_BCM2837 "bcm2837"
35
} else {
36
+
36
res = GIC_TARGET(irq);
37
typedef struct BCM283XState {
37
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
38
/*< private >*/
38
if (irq >= s->num_irq) {
39
DeviceState parent_obj;
39
goto bad_reg;
40
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
40
}
41
BCM2835PeripheralState peripherals;
41
- if (irq < 29) {
42
} BCM283XState;
42
+ if (irq < 29 && s->revision == REV_11MPCORE) {
43
43
value = 0;
44
+typedef struct BCM283XInfo BCM283XInfo;
44
} else if (irq < GIC_INTERNAL) {
45
+
45
value = ALL_CPU_MASK;
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
140
--
46
--
141
2.16.2
47
2.17.1
142
48
143
49
diff view generated by jsdifflib
1
Now we have separate types for BCM2386 and BCM2387, we might as well
1
From: Thomas Huth <thuth@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
These devices are currently causing some problems when a user is trying
7
the command line to use -cpu to ask for a different kind of
4
to hot-plug or introspect them during runtime. Since these devices can
8
CPU than the SoC supports. This was never a supported thing to
5
not be instantiated by the user at all (they need to be wired up in code
9
do anyway; we were just not sanity-checking the command line.
6
instead), we should mark them with user_creatable = false anyway, then we
7
avoid at least the crashes with the hot-plugging. The introspection problem
8
will be handled by a separate patch.
10
9
11
This does require us to only build the bcm2837 object on
10
Signed-off-by: Thomas Huth <thuth@redhat.com>
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
11
Message-id: 1531415537-26037-1-git-send-email-thuth@redhat.com
13
due to the missing cortex-a53 device and "make check" will fail.
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
13
Reviewed-by: Markus Armbruster <armbru@redhat.com>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
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
---
15
---
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
16
hw/arm/bcm2836.c | 2 ++
21
hw/arm/raspi.c | 2 --
17
1 file changed, 2 insertions(+)
22
2 files changed, 15 insertions(+), 11 deletions(-)
23
18
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
19
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
25
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/bcm2836.c
21
--- a/hw/arm/bcm2836.c
27
+++ b/hw/arm/bcm2836.c
22
+++ b/hw/arm/bcm2836.c
28
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ static void bcm283x_class_init(ObjectClass *oc, void *data)
29
24
bc->info = data;
30
struct BCM283XInfo {
25
dc->realize = bcm2836_realize;
31
const char *name;
26
dc->props = bcm2836_props;
32
+ const char *cpu_type;
27
+ /* Reason: Must be wired up in code (see raspi_init() function) */
33
int clusterid;
28
+ dc->user_creatable = false;
34
};
35
36
static const BCM283XInfo bcm283x_socs[] = {
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
}
29
}
84
30
85
static Property bcm2836_props[] = {
31
static const TypeInfo bcm283x_type_info = {
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
92
--- a/hw/arm/raspi.c
93
+++ b/hw/arm/raspi.c
94
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
95
/* Setup the SOC */
96
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
97
&error_abort);
98
- object_property_set_str(OBJECT(&s->soc), machine->cpu_type, "cpu-type",
99
- &error_abort);
100
object_property_set_int(OBJECT(&s->soc), smp_cpus, "enabled-cpus",
101
&error_abort);
102
int board_rev = version == 3 ? 0xa02082 : 0xa21041;
103
--
32
--
104
2.16.2
33
2.17.1
105
34
106
35
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
RX and TX interrupt bits were reversed, resulting in an endless sequence
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
4
of serial interupts in the emulated system and the following repeated
5
controller which is supported in QEMU using the imx_fec.c module
5
error message when booting Linux.
6
(actually called imx.enet for this model.)
7
6
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
7
serial8250: too much work for irq61
9
imx.enet device like this:
10
8
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
9
This results in a boot failure most of the time.
12
#define FSL_IMX6_ENET_MAC_IRQ 119
13
10
14
According to https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf,
11
Qemu command line used to reproduce the problem:
15
page 225, in Table 3-1. ARM Cortex A9 domain interrupt summary,
16
interrupts are as follows.
17
12
18
150 ENET MAC 0 IRQ
13
    qemu-system-aarch64 -M raspi3 -m 1024 \
19
151 ENET MAC 0 1588 Timer interrupt
14
    -kernel arch/arm64/boot/Image \
15
    --append "rdinit=/sbin/init console=ttyS1,115200"
16
    -initrd rootfs.cpio \
17
    -dtb arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dtb \
18
    -nographic -monitor null -serial null -serial stdio
20
19
21
where
20
This is with arm64:defconfig. The root file system was generated using
21
buildroot.
22
22
23
150 - 32 == 118
23
NB that this error likely arises from an erratum in the
24
151 - 32 == 119
24
BCM2835 datasheet where the TX and RX bits were swapped
25
in the AU_MU_IER_REG description (but correct for IIR):
26
https://elinux.org/BCM2835_datasheet_errata#p12
25
27
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>
28
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
40
Message-id: 1520723090-22130-1-git-send-email-linux@roeck-us.net
29
Message-id: 1529355846-25102-1-git-send-email-linux@roeck-us.net
41
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
30
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
31
[PMM: added NB about datasheet]
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
33
---
44
include/hw/arm/fsl-imx6.h | 4 ++--
34
hw/char/bcm2835_aux.c | 4 ++--
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
35
1 file changed, 2 insertions(+), 2 deletions(-)
46
2 files changed, 29 insertions(+), 3 deletions(-)
47
36
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
37
diff --git a/hw/char/bcm2835_aux.c b/hw/char/bcm2835_aux.c
49
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/fsl-imx6.h
39
--- a/hw/char/bcm2835_aux.c
51
+++ b/include/hw/arm/fsl-imx6.h
40
+++ b/hw/char/bcm2835_aux.c
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
41
@@ -XXX,XX +XXX,XX @@
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
42
#define AUX_MU_BAUD_REG 0x68
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
43
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
44
/* bits in IER/IIR registers */
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
45
-#define TX_INT 0x1
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
46
-#define RX_INT 0x2
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
47
+#define RX_INT 0x1
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
48
+#define TX_INT 0x2
60
#define FSL_IMX6_PCIE1_IRQ 120
49
61
#define FSL_IMX6_PCIE2_IRQ 121
50
static void bcm2835_aux_update(BCM2835AuxState *s)
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
{
51
{
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
--
52
--
103
2.16.2
53
2.17.1
104
54
105
55
diff view generated by jsdifflib
Deleted patch
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
2
1
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
4
it is needed to support guests other than Linux.
5
6
Based on the patch by Bill Paul as found here:
7
https://bugs.launchpad.net/qemu/+bug/1753314
8
9
Cc: qemu-devel@nongnu.org
10
Cc: qemu-arm@nongnu.org
11
Cc: Bill Paul <wpaul@windriver.com>
12
Cc: Peter Maydell <peter.maydell@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>
18
---
19
include/hw/char/imx_serial.h | 3 +++
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
21
2 files changed, 20 insertions(+), 3 deletions(-)
22
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
24
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/char/imx_serial.h
26
+++ b/include/hw/char/imx_serial.h
27
@@ -XXX,XX +XXX,XX @@
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
29
#define UCR2_SRST (1<<0) /* Reset complete */
30
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
32
+
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
}
98
break;
99
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
100
s->ucr3 = value & 0xffff;
101
break;
102
103
- case 0x2d: /* UTS1 */
104
case 0x23: /* UCR4 */
105
+ s->ucr4 = value & 0xffff;
106
+ imx_update(s);
107
+ break;
108
+
109
+ case 0x2d: /* UTS1 */
110
qemu_log_mask(LOG_UNIMP, "[%s]%s: Unimplemented reg 0x%"
111
HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
112
/* TODO */
113
--
114
2.16.2
115
116
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
Deleted patch
1
If we're directly booting a Linux kernel and the CPU supports both
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
3
set the SCR_EL3.HCE bit in this situation, so that the HVC
4
instruction is enabled rather than UNDEFing. Otherwise at least some
5
kernels will panic when trying to initialize KVM in the guest.
6
1
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
9
---
10
hw/arm/boot.c | 5 +++++
11
1 file changed, 5 insertions(+)
12
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/boot.c
16
+++ b/hw/arm/boot.c
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
18
assert(!info->secure_board_setup);
19
}
20
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
23
+ env->cp15.scr_el3 |= SCR_HCE;
24
+ }
25
+
26
/* Set to non-secure if not a secure boot */
27
if (!info->secure_boot &&
28
(cs != first_cpu || !info->secure_board_setup)) {
29
--
30
2.16.2
31
32
diff view generated by jsdifflib
1
The TypeInfo and state struct for bcm2386 disagree about what the
1
In get_page_addr_code(), we were incorrectly looking in the victim
2
parent class is -- the TypeInfo says it's TYPE_SYS_BUS_DEVICE,
2
TLB for an entry which matched the target address for reads, not
3
but the BCM2386State struct only defines the parent_obj field
3
for code accesses. This meant that we could hit on a victim TLB
4
as DeviceState. This would have caused problems if anything
4
entry that indicated that the address was readable but not
5
actually tried to treat the object as a TYPE_SYS_BUS_DEVICE.
5
executable, and incorrectly bypass the call to tlb_fill() which
6
Fix the TypeInfo to use TYPE_DEVICE as the parent, since we don't
6
should generate the guest MMU exception. Fix this bug.
7
need any of the additional functionality TYPE_SYS_BUS_DEVICE
8
provides.
9
7
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20180713141636.18665-2-peter.maydell@linaro.org
13
Message-id: 20180313153458.26822-5-peter.maydell@linaro.org
14
---
11
---
15
hw/arm/bcm2836.c | 2 +-
12
accel/tcg/cputlb.c | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 1 insertion(+), 1 deletion(-)
17
14
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
15
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
19
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/bcm2836.c
17
--- a/accel/tcg/cputlb.c
21
+++ b/hw/arm/bcm2836.c
18
+++ b/accel/tcg/cputlb.c
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
19
@@ -XXX,XX +XXX,XX @@ tb_page_addr_t get_page_addr_code(CPUArchState *env, target_ulong addr)
23
20
index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
24
static const TypeInfo bcm2836_type_info = {
21
mmu_idx = cpu_mmu_index(env, true);
25
.name = TYPE_BCM2836,
22
if (unlikely(!tlb_hit(env->tlb_table[mmu_idx][index].addr_code, addr))) {
26
- .parent = TYPE_SYS_BUS_DEVICE,
23
- if (!VICTIM_TLB_HIT(addr_read, addr)) {
27
+ .parent = TYPE_DEVICE,
24
+ if (!VICTIM_TLB_HIT(addr_code, addr)) {
28
.instance_size = sizeof(BCM2836State),
25
tlb_fill(ENV_GET_CPU(env), addr, 0, MMU_INST_FETCH, mmu_idx, 0);
29
.instance_init = bcm2836_init,
26
}
30
.class_init = bcm2836_class_init,
27
}
31
--
28
--
32
2.16.2
29
2.17.1
33
30
34
31
diff view generated by jsdifflib
Deleted patch
1
Our BCM2836 type is really a generic one that can be any of
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
1
7
This is a preliminary to making bcm283x be an abstract
8
parent class to specific types for the bcm2836 and bcm2837.
9
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
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
16
hw/arm/bcm2836.c | 17 +++++++++--------
17
hw/arm/raspi.c | 16 ++++++++--------
18
3 files changed, 23 insertions(+), 22 deletions(-)
19
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/bcm2836.h
23
+++ b/include/hw/arm/bcm2836.h
24
@@ -XXX,XX +XXX,XX @@
25
#include "hw/arm/bcm2835_peripherals.h"
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
{
61
- BCM2836State *s = BCM2836(obj);
62
+ BCM283XState *s = BCM283X(obj);
63
64
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
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
}
95
96
static Property bcm2836_props[] = {
97
- DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
98
- DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
99
+ DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
100
+ DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
101
+ BCM283X_NCPUS),
102
DEFINE_PROP_END_OF_LIST()
103
};
104
105
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
106
}
107
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
--
166
2.16.2
167
168
diff view generated by jsdifflib
1
The raspi3 has AArch64 CPUs, which means that our smpboot
1
In commit 4b1a3e1e34ad97 we added a check for whether the TLB entry
2
code for keeping the secondary CPUs in a pen needs to have
2
we had following a tlb_fill had the INVALID bit set. This could
3
a version for A64 as well as A32. Without this, the
3
happen in some circumstances because a stale or wrong TLB entry was
4
secondary CPUs go into an infinite loop of taking undefined
4
pulled out of the victim cache. However, after commit
5
instruction exceptions.
5
68fea038553039e (which prevents stale entries being in the victim
6
cache) and the previous commit (which ensures we don't incorrectly
7
hit in the victim cache)) this should never be possible.
8
9
Drop the check on TLB_INVALID_MASK from the "is this a TLB_RECHECK?"
10
condition, and instead assert that the tlb fill procedure has given
11
us a valid TLB entry (or longjumped out with a guest exception).
6
12
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180313153458.26822-10-peter.maydell@linaro.org
15
Message-id: 20180713141636.18665-3-peter.maydell@linaro.org
10
---
16
---
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
17
accel/tcg/cputlb.c | 4 ++--
12
1 file changed, 40 insertions(+), 1 deletion(-)
18
1 file changed, 2 insertions(+), 2 deletions(-)
13
19
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
20
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
15
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
22
--- a/accel/tcg/cputlb.c
17
+++ b/hw/arm/raspi.c
23
+++ b/accel/tcg/cputlb.c
18
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ tb_page_addr_t get_page_addr_code(CPUArchState *env, target_ulong addr)
19
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
25
if (!VICTIM_TLB_HIT(addr_code, addr)) {
20
#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
26
tlb_fill(ENV_GET_CPU(env), addr, 0, MMU_INST_FETCH, mmu_idx, 0);
21
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
27
}
22
+#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
28
+ assert(tlb_hit(env->tlb_table[mmu_idx][index].addr_code, addr));
23
24
/* Table of Linux board IDs for different Pi versions */
25
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
26
@@ -XXX,XX +XXX,XX @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
27
info->smp_loader_start);
28
}
29
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
31
+{
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
33
+ * The mechanism for doing the spin-table is also entirely different.
34
+ * We must have four 64-bit fields at absolute addresses
35
+ * 0xd8, 0xe0, 0xe8, 0xf0 in RAM, which are the flag variables for
36
+ * our CPUs, and which we must ensure are zero initialized before
37
+ * the primary CPU goes into the kernel. We put these variables inside
38
+ * a rom blob, so that the reset for ROM contents zeroes them for us.
39
+ */
40
+ static const uint32_t smpboot[] = {
41
+ 0xd2801b05, /* mov x5, 0xd8 */
42
+ 0xd53800a6, /* mrs x6, mpidr_el1 */
43
+ 0x924004c6, /* and x6, x6, #0x3 */
44
+ 0xd503205f, /* spin: wfe */
45
+ 0xf86678a4, /* ldr x4, [x5,x6,lsl #3] */
46
+ 0xb4ffffc4, /* cbz x4, spin */
47
+ 0xd2800000, /* mov x0, #0x0 */
48
+ 0xd2800001, /* mov x1, #0x0 */
49
+ 0xd2800002, /* mov x2, #0x0 */
50
+ 0xd2800003, /* mov x3, #0x0 */
51
+ 0xd61f0080, /* br x4 */
52
+ };
53
+
54
+ static const uint64_t spintables[] = {
55
+ 0, 0, 0, 0
56
+ };
57
+
58
+ rom_add_blob_fixed("raspi_smpboot", smpboot, sizeof(smpboot),
59
+ info->smp_loader_start);
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
{
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
68
/* Pi2 and Pi3 requires SMP setup */
69
if (version >= 2) {
70
binfo.smp_loader_start = SMPBOOT_ADDR;
71
- binfo.write_secondary_boot = write_smpboot;
72
+ if (version == 2) {
73
+ binfo.write_secondary_boot = write_smpboot;
74
+ } else {
75
+ binfo.write_secondary_boot = write_smpboot64;
76
+ }
77
binfo.secondary_cpu_reset_hook = reset_secondary;
78
}
29
}
79
30
31
- if (unlikely((env->tlb_table[mmu_idx][index].addr_code &
32
- (TLB_RECHECK | TLB_INVALID_MASK)) == TLB_RECHECK)) {
33
+ if (unlikely(env->tlb_table[mmu_idx][index].addr_code & TLB_RECHECK)) {
34
/*
35
* This is a TLB_RECHECK access, where the MMU protection
36
* covers a smaller range than a target page, and we must
80
--
37
--
81
2.16.2
38
2.17.1
82
39
83
40
diff view generated by jsdifflib