1
target-arm queue: aspeed patches from Cédric, and
1
Arm queue. I still have a lot of stuff in my to-review queue, so
2
cleanup and sd card patches from Philippe.
2
won't be long til the next one.
3
4
I've thrown in a couple of minor non-arm patches (a xen code
5
cleanup and a vl.c codestyle issue).
3
6
4
thanks
7
thanks
5
-- PMM
8
-- PMM
6
9
7
The following changes since commit bac5ba3dc5da706f52c149fa6c0bd1dc96899bec:
10
The following changes since commit de44c044420d1139480fa50c2d5be19223391218:
8
11
9
Merge remote-tracking branch 'remotes/thibault/tags/samuel-thibault' into staging (2018-06-08 10:26:16 +0100)
12
Merge remote-tracking branch 'remotes/stsquad/tags/pull-tcg-testing-revivial-210618-2' into staging (2018-06-22 10:57:47 +0100)
10
13
11
are available in the Git repository at:
14
are available in the Git repository at:
12
15
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180608
16
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180622
14
17
15
for you to fetch changes up to 113f31c06c6bf16451892b2459d83c9b9c5e9844:
18
for you to fetch changes up to 6dad8260e82b69bd278685ee25209f5824360455:
16
19
17
sdcard: Disable CMD19/CMD23 for Spec v2 (2018-06-08 13:15:34 +0100)
20
xen: Don't use memory_region_init_ram_nomigrate() in pci_assign_dev_load_option_rom() (2018-06-22 13:28:42 +0100)
18
21
19
----------------------------------------------------------------
22
----------------------------------------------------------------
20
target-arm queue:
23
target-arm queue:
21
* arm_gicv3_kvm: fix migration of registers corresponding to
24
* hw/intc/arm_gicv3: fix wrong values when reading IPRIORITYR
22
IRQs 992 to 1020 in the KVM GIC
25
* target/arm: fix read of freed memory in kvm_arm_machine_init_done()
23
* aspeed: remove ignore_memory_transaction_failures on all boards
26
* virt: support up to 512 CPUs
24
* aspeed: add support for the witherspoon-bmc board
27
* virt: support 256MB ECAM PCI region (for more PCI devices)
25
* aspeed: add an I2C RTC device and EEPROM I2C devices
28
* xlnx-zynqmp: Use Cortex-R5F, not Cortex-R5
26
* aspeed: add the pc9552 chips to the witherspoon machine
29
* mps2-tz: Implement and use the TrustZone Memory Protection Controller
27
* ftgmac100: fix various bugs
30
* target/arm: enforce alignment checking for v6M cores
28
* hw/arm: Remove the deprecated xlnx-ep108 machine
31
* xen: Don't use memory_region_init_ram_nomigrate() in pci_assign_dev_load_option_rom()
29
* hw/i2c: Add trace events
32
* vl.c: Don't zero-initialize statics for serial_hds
30
* add missing '\n' on various qemu_log() logging strings
31
* sdcard: clean up spec version support so we report the
32
right spec version to the guest and only implement the
33
commands that are supposed to be present in that version
34
33
35
----------------------------------------------------------------
34
----------------------------------------------------------------
36
Cédric Le Goater (11):
35
Amol Surati (1):
37
aspeed: remove ignore_memory_transaction_failures on all boards
36
hw/intc/arm_gicv3: fix an extra left-shift when reading IPRIORITYR
38
aspeed: add support for the witherspoon-bmc board
39
aspeed: add an I2C RTC device to all machines
40
smbus: add a smbus_eeprom_init_one() routine
41
aspeed: Add EEPROM I2C devices
42
misc: add pca9552 LED blinker model
43
aspeed: add the pc9552 chips to the witherspoon machine
44
ftgmac100: compute maximum frame size depending on the protocol
45
ftgmac100: add IEEE 802.1Q VLAN support
46
ftgmac100: fix multicast hash routine
47
ftgmac100: remove check on runt messages
48
37
49
Philippe Mathieu-Daudé (18):
38
Edgar E. Iglesias (2):
50
hw/i2c: Add trace events
39
target-arm: Add the Cortex-R5F
51
hw/sd/milkymist-memcard: Add trailing '\n' to qemu_log() call
40
xlnx-zynqmp: Swap Cortex-R5 for Cortex-R5F
52
hw/digic: Add trailing '\n' to qemu_log() calls
53
xilinx-dp: Add trailing '\n' to qemu_log() call
54
ppc/pnv: Add trailing '\n' to qemu_log() calls
55
hw/core/register: Add trailing '\n' to qemu_log() call
56
hw/mips/boston: Add trailing '\n' to qemu_log() calls
57
stellaris: Add trailing '\n' to qemu_log() calls
58
target/arm: Add trailing '\n' to qemu_log() calls
59
target/m68k: Add trailing '\n' to qemu_log() call
60
RISC-V: Add trailing '\n' to qemu_log() calls
61
target/xtensa: Add trailing '\n' to qemu_log() calls
62
sdcard: Update the Configuration Register (SCR) to Spec Version 1.10
63
sdcard: Allow commands valid in SPI mode
64
sdcard: Add a 'spec_version' property, default to Spec v2.00
65
sdcard: Disable SEND_IF_COND (CMD8) for Spec v1
66
sdcard: Reflect when the Spec v3 is supported in the Config Register (SCR)
67
sdcard: Disable CMD19/CMD23 for Spec v2
68
41
69
Shannon Zhao (1):
42
Eric Auger (11):
70
arm_gicv3_kvm: kvm_dist_get/put: skip the registers banked by GICR
43
linux-headers: Update to kernel mainline commit b357bf602
44
target/arm: Allow KVM device address overwriting
45
hw/intc/arm_gicv3: Introduce redist-region-count array property
46
hw/intc/arm_gicv3_kvm: Get prepared to handle multiple redist regions
47
hw/arm/virt: GICv3 DT node with one or two redistributor regions
48
hw/arm/virt-acpi-build: Advertise one or two GICR structures
49
hw/arm/virt: Register two redistributor regions when necessary
50
hw/arm/virt: Add a new 256MB ECAM region
51
hw/arm/virt: Add virt-3.0 machine type
52
hw/arm/virt: Use 256MB ECAM region by default
53
hw/arm/virt: Increase max_cpus to 512
71
54
72
Thomas Huth (1):
55
Julia Suvorova (3):
73
hw/arm: Remove the deprecated xlnx-ep108 machine
56
target/arm: Minor cleanup for ARMv6-M 32-bit instructions
57
target/arm: Introduce ARM_FEATURE_M_MAIN
58
target/arm: Strict alignment for ARMv6-M and ARMv8-M Baseline
74
59
75
Makefile.objs | 1 +
60
Peter Maydell (10):
76
hw/misc/Makefile.objs | 1 +
61
hw/misc/tz-mpc.c: Implement the Arm TrustZone Memory Protection Controller
77
tests/Makefile.include | 2 +
62
hw/misc/tz-mpc.c: Implement registers
78
include/hw/i2c/smbus.h | 1 +
63
hw/misc/tz-mpc.c: Implement correct blocked-access behaviour
79
include/hw/intc/arm_gicv3_common.h | 1 +
64
hw/misc/tz_mpc.c: Honour the BLK_LUT settings in translate
80
include/hw/misc/pca9552.h | 32 +++++
65
hw/misc/iotkit-secctl.c: Implement SECMPCINTSTATUS
81
include/hw/misc/pca9552_regs.h | 32 +++++
66
hw/arm/iotkit: Instantiate MPC
82
include/hw/net/ftgmac100.h | 7 +-
67
hw/arm/iotkit: Wire up MPC interrupt lines
83
include/hw/sd/sd.h | 6 +
68
hw/arm/mps2-tz.c: Instantiate MPCs
84
tests/libqos/i2c.h | 2 +
69
vl.c: Don't zero-initialize statics for serial_hds
85
hw/arm/aspeed.c | 88 +++++++++++++-
70
xen: Don't use memory_region_init_ram_nomigrate() in pci_assign_dev_load_option_rom()
86
hw/arm/stellaris.c | 11 +-
87
hw/arm/xlnx-zcu102.c | 62 +---------
88
hw/char/digic-uart.c | 4 +-
89
hw/core/register.c | 2 +-
90
hw/display/xlnx_dp.c | 4 +-
91
hw/i2c/core.c | 25 ++--
92
hw/i2c/smbus_eeprom.c | 16 ++-
93
hw/intc/arm_gicv3_common.c | 79 ++++++++++++
94
hw/intc/arm_gicv3_kvm.c | 38 ++++++
95
hw/mips/boston.c | 8 +-
96
hw/misc/pca9552.c | 240 +++++++++++++++++++++++++++++++++++++
97
hw/net/ftgmac100.c | 64 ++++++----
98
hw/ppc/pnv_core.c | 4 +-
99
hw/sd/milkymist-memcard.c | 2 +-
100
hw/sd/sd.c | 50 +++++---
101
hw/timer/digic-timer.c | 4 +-
102
target/arm/helper.c | 4 +-
103
target/m68k/translate.c | 2 +-
104
target/riscv/op_helper.c | 6 +-
105
target/xtensa/translate.c | 6 +-
106
tests/pca9552-test.c | 116 ++++++++++++++++++
107
tests/tmp105-test.c | 2 -
108
default-configs/arm-softmmu.mak | 1 +
109
hw/i2c/trace-events | 7 ++
110
qemu-doc.texi | 5 -
111
36 files changed, 788 insertions(+), 147 deletions(-)
112
create mode 100644 include/hw/misc/pca9552.h
113
create mode 100644 include/hw/misc/pca9552_regs.h
114
create mode 100644 hw/misc/pca9552.c
115
create mode 100644 tests/pca9552-test.c
116
create mode 100644 hw/i2c/trace-events
117
71
72
Zheng Xiang (1):
73
target-arm: fix a segmentation fault due to illegal memory access
74
75
hw/misc/Makefile.objs | 1 +
76
hw/xen/xen_pt.h | 2 +-
77
include/hw/arm/iotkit.h | 8 +
78
include/hw/arm/virt.h | 19 +
79
include/hw/intc/arm_gicv3_common.h | 8 +-
80
include/hw/misc/iotkit-secctl.h | 8 +
81
include/hw/misc/tz-mpc.h | 80 +++
82
include/standard-headers/linux/pci_regs.h | 8 +
83
include/standard-headers/linux/virtio_gpu.h | 1 +
84
include/standard-headers/linux/virtio_net.h | 3 +
85
linux-headers/asm-arm/kvm.h | 1 +
86
linux-headers/asm-arm/unistd-common.h | 1 +
87
linux-headers/asm-arm64/kvm.h | 1 +
88
linux-headers/asm-generic/unistd.h | 4 +-
89
linux-headers/asm-powerpc/unistd.h | 1 +
90
linux-headers/asm-x86/unistd_32.h | 2 +
91
linux-headers/asm-x86/unistd_64.h | 2 +
92
linux-headers/asm-x86/unistd_x32.h | 2 +
93
linux-headers/linux/kvm.h | 5 +-
94
linux-headers/linux/psp-sev.h | 12 +
95
target/arm/cpu.h | 1 +
96
target/arm/kvm_arm.h | 3 +-
97
hw/arm/iotkit.c | 112 +++-
98
hw/arm/mps2-tz.c | 71 ++-
99
hw/arm/virt-acpi-build.c | 30 +-
100
hw/arm/virt.c | 100 +++-
101
hw/arm/xlnx-zcu102.c | 2 +-
102
hw/arm/xlnx-zynqmp.c | 2 +-
103
hw/intc/arm_gic_kvm.c | 4 +-
104
hw/intc/arm_gicv3.c | 12 +-
105
hw/intc/arm_gicv3_common.c | 38 +-
106
hw/intc/arm_gicv3_dist.c | 3 +-
107
hw/intc/arm_gicv3_its_kvm.c | 2 +-
108
hw/intc/arm_gicv3_kvm.c | 44 +-
109
hw/intc/arm_gicv3_redist.c | 3 +-
110
hw/misc/iotkit-secctl.c | 38 +-
111
hw/misc/tz-mpc.c | 628 +++++++++++++++++++++
112
hw/xen/xen_pt_graphics.c | 2 +-
113
hw/xen/xen_pt_load_rom.c | 6 +-
114
target/arm/cpu.c | 12 +
115
target/arm/kvm.c | 11 +-
116
target/arm/translate.c | 45 +-
117
vl.c | 4 +-
118
MAINTAINERS | 2 +
119
default-configs/arm-softmmu.mak | 1 +
120
hw/misc/trace-events | 8 +
121
.../LICENSES/exceptions/Linux-syscall-note | 2 +-
122
linux-headers/LICENSES/preferred/GPL-2.0 | 6 +
123
48 files changed, 1250 insertions(+), 111 deletions(-)
124
create mode 100644 include/hw/misc/tz-mpc.h
125
create mode 100644 hw/misc/tz-mpc.c
126
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Amol Surati <suratiamol@gmail.com>
2
2
3
These commands got introduced by Spec v3
3
When either GICD_IPRIORITYR or GICR_IPRIORITYR is read as a 32-bit
4
(see 0c3fb03f7ec and 4481bbc79d2).
4
register, the post left-shift operator in the for loop causes an
5
extra shift after the least significant byte has been placed.
5
6
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
The 32-bit value actually returned is therefore the expected value
7
Message-id: 20180607180641.874-7-f4bug@amsat.org
8
shifted left by 8 bits.
9
10
Signed-off-by: Amol Surati <suratiamol@gmail.com>
11
Message-id: 20180614054857.26248-1-suratiamol@gmail.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
14
---
11
hw/sd/sd.c | 6 ++++++
15
hw/intc/arm_gicv3_dist.c | 3 ++-
12
1 file changed, 6 insertions(+)
16
hw/intc/arm_gicv3_redist.c | 3 ++-
17
2 files changed, 4 insertions(+), 2 deletions(-)
13
18
14
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
19
diff --git a/hw/intc/arm_gicv3_dist.c b/hw/intc/arm_gicv3_dist.c
15
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/sd/sd.c
21
--- a/hw/intc/arm_gicv3_dist.c
17
+++ b/hw/sd/sd.c
22
+++ b/hw/intc/arm_gicv3_dist.c
18
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
23
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicd_readl(GICv3State *s, hwaddr offset,
19
break;
24
int i, irq = offset - GICD_IPRIORITYR;
20
25
uint32_t value = 0;
21
case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
26
22
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
27
- for (i = irq + 3; i >= irq; i--, value <<= 8) {
23
+ break;
28
+ for (i = irq + 3; i >= irq; i--) {
24
+ }
29
+ value <<= 8;
25
if (sd->state == sd_transfer_state) {
30
value |= gicd_read_ipriorityr(s, attrs, i);
26
sd->state = sd_sendingdata_state;
31
}
27
sd->data_offset = 0;
32
*data = value;
28
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
33
diff --git a/hw/intc/arm_gicv3_redist.c b/hw/intc/arm_gicv3_redist.c
29
break;
34
index XXXXXXX..XXXXXXX 100644
30
35
--- a/hw/intc/arm_gicv3_redist.c
31
case 23: /* CMD23: SET_BLOCK_COUNT */
36
+++ b/hw/intc/arm_gicv3_redist.c
32
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
37
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicr_readl(GICv3CPUState *cs, hwaddr offset,
33
+ break;
38
int i, irq = offset - GICR_IPRIORITYR;
34
+ }
39
uint32_t value = 0;
35
switch (sd->state) {
40
36
case sd_transfer_state:
41
- for (i = irq + 3; i >= irq; i--, value <<= 8) {
37
sd->multi_blk_cnt = req.arg;
42
+ for (i = irq + 3; i >= irq; i--) {
43
+ value <<= 8;
44
value |= gicr_read_ipriorityr(cs, attrs, i);
45
}
46
*data = value;
38
--
47
--
39
2.17.1
48
2.17.1
40
49
41
50
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Julia Suvorova <jusual@mail.ru>
2
2
3
CMD8 is "Reserved" in Spec v1.10.
3
The arrays were made static, "if" was simplified because V7M and V8M
4
define V6 feature.
4
5
5
Spec v2.00 introduces the SEND_IF_COND command:
6
Signed-off-by: Julia Suvorova <jusual@mail.ru>
6
7
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
7
6.4.1 Power Up
8
Message-id: 20180618214604.6777-1-jusual@mail.ru
8
9
CMD8 is newly added in the Physical Layer Specification Version
10
2.00 to support multiple voltage ranges and used to check whether
11
the card supports supplied voltage. The version 2.00 or later host
12
shall issue CMD8 and verify voltage before card initialization.
13
The host that does not support CMD8 shall supply high voltage range.
14
15
Message-Id: 201204252110.20873.paul@codesourcery.com
16
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20180607180641.874-5-f4bug@amsat.org
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
11
---
21
hw/sd/sd.c | 4 +++-
12
target/arm/translate.c | 27 +++++++++++++--------------
22
1 file changed, 3 insertions(+), 1 deletion(-)
13
1 file changed, 13 insertions(+), 14 deletions(-)
23
14
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
15
diff --git a/target/arm/translate.c b/target/arm/translate.c
25
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/sd/sd.c
17
--- a/target/arm/translate.c
27
+++ b/hw/sd/sd.c
18
+++ b/target/arm/translate.c
28
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
19
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
29
break;
20
!arm_dc_feature(s, ARM_FEATURE_V7)) {
30
21
int i;
31
case 8:    /* CMD8: SEND_IF_COND */
22
bool found = false;
32
- /* Physical Layer Specification Version 2.00 command */
23
- const uint32_t armv6m_insn[] = {0xf3808000 /* msr */,
33
+ if (sd->spec_version < SD_PHY_SPECv2_00_VERS) {
24
- 0xf3b08040 /* dsb */,
34
+ break;
25
- 0xf3b08050 /* dmb */,
35
+ }
26
- 0xf3b08060 /* isb */,
36
if (sd->state != sd_idle_state) {
27
- 0xf3e08000 /* mrs */,
37
break;
28
- 0xf000d000 /* bl */};
38
}
29
- const uint32_t armv6m_mask[] = {0xffe0d000,
30
- 0xfff0d0f0,
31
- 0xfff0d0f0,
32
- 0xfff0d0f0,
33
- 0xffe0d000,
34
- 0xf800d000};
35
+ static const uint32_t armv6m_insn[] = {0xf3808000 /* msr */,
36
+ 0xf3b08040 /* dsb */,
37
+ 0xf3b08050 /* dmb */,
38
+ 0xf3b08060 /* isb */,
39
+ 0xf3e08000 /* mrs */,
40
+ 0xf000d000 /* bl */};
41
+ static const uint32_t armv6m_mask[] = {0xffe0d000,
42
+ 0xfff0d0f0,
43
+ 0xfff0d0f0,
44
+ 0xfff0d0f0,
45
+ 0xffe0d000,
46
+ 0xf800d000};
47
48
for (i = 0; i < ARRAY_SIZE(armv6m_insn); i++) {
49
if ((insn & armv6m_mask[i]) == armv6m_insn[i]) {
50
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
51
break;
52
case 3: /* Special control operations. */
53
if (!arm_dc_feature(s, ARM_FEATURE_V7) &&
54
- !(arm_dc_feature(s, ARM_FEATURE_V6) &&
55
- arm_dc_feature(s, ARM_FEATURE_M))) {
56
+ !arm_dc_feature(s, ARM_FEATURE_M)) {
57
goto illegal_op;
58
}
59
op = (insn >> 4) & 0xf;
39
--
60
--
40
2.17.1
61
2.17.1
41
62
42
63
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Zheng Xiang <xiang.zheng@linaro.org>
2
2
3
From the "Physical Layer Simplified Specification Version 1.10"
3
The elements of kvm_devices_head list are freed in kvm_arm_machine_init_done(),
4
Chapter 7.3 "SPI Mode Transaction Packets"
4
but we still access these illegal memory in kvm_arm_devlistener_del().
5
Table 57: "Commands and arguments"
6
5
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
This will cause segment fault when booting guest with MALLOC_PERTURB_=1.
8
Acked-by: Alistair Francis <alistair.francis@wdc.com>
7
9
Message-id: 20180607180641.874-3-f4bug@amsat.org
8
Signed-off-by: Zheng Xiang <xiang.zheng@linaro.org>
9
Message-id: 20180619075821.9884-1-zhengxiang9@huawei.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
12
---
13
hw/sd/sd.c | 14 --------------
13
target/arm/kvm.c | 1 +
14
1 file changed, 14 deletions(-)
14
1 file changed, 1 insertion(+)
15
15
16
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
16
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/sd/sd.c
18
--- a/target/arm/kvm.c
19
+++ b/hw/sd/sd.c
19
+++ b/target/arm/kvm.c
20
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
20
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_machine_init_done(Notifier *notifier, void *data)
21
return sd_illegal;
21
kvm_arm_set_device_addr(kd);
22
22
}
23
case 6:    /* CMD6: SWITCH_FUNCTION */
23
memory_region_unref(kd->mr);
24
- if (sd->spi)
24
+ QSLIST_REMOVE_HEAD(&kvm_devices_head, entries);
25
- goto bad_cmd;
25
g_free(kd);
26
switch (sd->mode) {
26
}
27
case sd_data_transfer_mode:
27
memory_listener_unregister(&devlistener);
28
sd_function_switch(sd, req.arg);
29
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
30
31
/* Block write commands (Class 4) */
32
case 24:    /* CMD24: WRITE_SINGLE_BLOCK */
33
- if (sd->spi) {
34
- goto unimplemented_spi_cmd;
35
- }
36
switch (sd->state) {
37
case sd_transfer_state:
38
/* Writing in SPI mode not implemented. */
39
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
40
break;
41
42
case 25:    /* CMD25: WRITE_MULTIPLE_BLOCK */
43
- if (sd->spi) {
44
- goto unimplemented_spi_cmd;
45
- }
46
switch (sd->state) {
47
case sd_transfer_state:
48
/* Writing in SPI mode not implemented. */
49
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
50
break;
51
52
case 27:    /* CMD27: PROGRAM_CSD */
53
- if (sd->spi) {
54
- goto unimplemented_spi_cmd;
55
- }
56
switch (sd->state) {
57
case sd_transfer_state:
58
sd->state = sd_receivingdata_state;
59
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
60
61
/* Lock card commands (Class 7) */
62
case 42:    /* CMD42: LOCK_UNLOCK */
63
- if (sd->spi) {
64
- goto unimplemented_spi_cmd;
65
- }
66
switch (sd->state) {
67
case sd_transfer_state:
68
sd->state = sd_receivingdata_state;
69
--
28
--
70
2.17.1
29
2.17.1
71
30
72
31
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Update our kernel headers to mainline commit
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
b357bf6023a948cf6a9472f07a1b0caac0e4f8e8
5
Message-id: 20180607180641.874-6-f4bug@amsat.org
5
("Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm")
6
7
Signed-off-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 1529072910-16156-2-git-send-email-eric.auger@redhat.com
9
[PMM: clarified commit message]
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
include/hw/sd/sd.h | 1 +
12
include/standard-headers/linux/pci_regs.h | 8 ++++++++
9
hw/sd/sd.c | 7 +++++--
13
include/standard-headers/linux/virtio_gpu.h | 1 +
10
2 files changed, 6 insertions(+), 2 deletions(-)
14
include/standard-headers/linux/virtio_net.h | 3 +++
11
15
linux-headers/asm-arm/kvm.h | 1 +
12
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
16
linux-headers/asm-arm/unistd-common.h | 1 +
13
index XXXXXXX..XXXXXXX 100644
17
linux-headers/asm-arm64/kvm.h | 1 +
14
--- a/include/hw/sd/sd.h
18
linux-headers/asm-generic/unistd.h | 4 +++-
15
+++ b/include/hw/sd/sd.h
19
linux-headers/asm-powerpc/unistd.h | 1 +
16
@@ -XXX,XX +XXX,XX @@
20
linux-headers/asm-x86/unistd_32.h | 2 ++
17
enum SDPhySpecificationVersion {
21
linux-headers/asm-x86/unistd_64.h | 2 ++
18
SD_PHY_SPECv1_10_VERS = 1,
22
linux-headers/asm-x86/unistd_x32.h | 2 ++
19
SD_PHY_SPECv2_00_VERS = 2,
23
linux-headers/linux/kvm.h | 5 +++--
20
+ SD_PHY_SPECv3_01_VERS = 3,
24
linux-headers/linux/psp-sev.h | 12 ++++++++++++
25
linux-headers/LICENSES/exceptions/Linux-syscall-note | 2 +-
26
linux-headers/LICENSES/preferred/GPL-2.0 | 6 ++++++
27
15 files changed, 47 insertions(+), 4 deletions(-)
28
29
diff --git a/include/standard-headers/linux/pci_regs.h b/include/standard-headers/linux/pci_regs.h
30
index XXXXXXX..XXXXXXX 100644
31
--- a/include/standard-headers/linux/pci_regs.h
32
+++ b/include/standard-headers/linux/pci_regs.h
33
@@ -XXX,XX +XXX,XX @@
34
#define PCI_EXP_DEVCTL_READRQ_256B 0x1000 /* 256 Bytes */
35
#define PCI_EXP_DEVCTL_READRQ_512B 0x2000 /* 512 Bytes */
36
#define PCI_EXP_DEVCTL_READRQ_1024B 0x3000 /* 1024 Bytes */
37
+#define PCI_EXP_DEVCTL_READRQ_2048B 0x4000 /* 2048 Bytes */
38
+#define PCI_EXP_DEVCTL_READRQ_4096B 0x5000 /* 4096 Bytes */
39
#define PCI_EXP_DEVCTL_BCR_FLR 0x8000 /* Bridge Configuration Retry / FLR */
40
#define PCI_EXP_DEVSTA        10    /* Device Status */
41
#define PCI_EXP_DEVSTA_CED    0x0001    /* Correctable Error Detected */
42
@@ -XXX,XX +XXX,XX @@
43
#define PCI_EXP_LNKCAP2_SLS_16_0GB    0x00000010 /* Supported Speed 16GT/s */
44
#define PCI_EXP_LNKCAP2_CROSSLINK    0x00000100 /* Crosslink supported */
45
#define PCI_EXP_LNKCTL2        48    /* Link Control 2 */
46
+#define PCI_EXP_LNKCTL2_TLS        0x000f
47
+#define PCI_EXP_LNKCTL2_TLS_2_5GT    0x0001 /* Supported Speed 2.5GT/s */
48
+#define PCI_EXP_LNKCTL2_TLS_5_0GT    0x0002 /* Supported Speed 5GT/s */
49
+#define PCI_EXP_LNKCTL2_TLS_8_0GT    0x0003 /* Supported Speed 8GT/s */
50
+#define PCI_EXP_LNKCTL2_TLS_16_0GT    0x0004 /* Supported Speed 16GT/s */
51
#define PCI_EXP_LNKSTA2        50    /* Link Status 2 */
52
#define PCI_CAP_EXP_ENDPOINT_SIZEOF_V2    52    /* v2 endpoints with link end here */
53
#define PCI_EXP_SLTCAP2        52    /* Slot Capabilities 2 */
54
@@ -XXX,XX +XXX,XX @@
55
#define PCI_EXP_DPC_CAP_DL_ACTIVE    0x1000    /* ERR_COR signal on DL_Active supported */
56
57
#define PCI_EXP_DPC_CTL            6    /* DPC control */
58
+#define PCI_EXP_DPC_CTL_EN_FATAL     0x0001    /* Enable trigger on ERR_FATAL message */
59
#define PCI_EXP_DPC_CTL_EN_NONFATAL     0x0002    /* Enable trigger on ERR_NONFATAL message */
60
#define PCI_EXP_DPC_CTL_INT_EN     0x0008    /* DPC Interrupt Enable */
61
62
diff --git a/include/standard-headers/linux/virtio_gpu.h b/include/standard-headers/linux/virtio_gpu.h
63
index XXXXXXX..XXXXXXX 100644
64
--- a/include/standard-headers/linux/virtio_gpu.h
65
+++ b/include/standard-headers/linux/virtio_gpu.h
66
@@ -XXX,XX +XXX,XX @@ struct virtio_gpu_cmd_submit {
21
};
67
};
22
68
23
typedef enum {
69
#define VIRTIO_GPU_CAPSET_VIRGL 1
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
70
+#define VIRTIO_GPU_CAPSET_VIRGL2 2
25
index XXXXXXX..XXXXXXX 100644
71
26
--- a/hw/sd/sd.c
72
/* VIRTIO_GPU_CMD_GET_CAPSET_INFO */
27
+++ b/hw/sd/sd.c
73
struct virtio_gpu_get_capset_info {
28
@@ -XXX,XX +XXX,XX @@ static void sd_set_scr(SDState *sd)
74
diff --git a/include/standard-headers/linux/virtio_net.h b/include/standard-headers/linux/virtio_net.h
29
if (sd->spec_version == SD_PHY_SPECv1_10_VERS) {
75
index XXXXXXX..XXXXXXX 100644
30
sd->scr[0] |= 1; /* Spec Version 1.10 */
76
--- a/include/standard-headers/linux/virtio_net.h
31
} else {
77
+++ b/include/standard-headers/linux/virtio_net.h
32
- sd->scr[0] |= 2; /* Spec Version 2.00 */
78
@@ -XXX,XX +XXX,XX @@
33
+ sd->scr[0] |= 2; /* Spec Version 2.00 or Version 3.0X */
79
                     * Steering */
34
}
80
#define VIRTIO_NET_F_CTRL_MAC_ADDR 23    /* Set MAC address */
35
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
81
36
| 0b0101; /* 1-bit or 4-bit width bus modes */
82
+#define VIRTIO_NET_F_STANDBY     62    /* Act as standby for another device
37
sd->scr[2] = 0x00; /* Extended Security is not supported. */
83
+                     * with the same MAC.
38
+ if (sd->spec_version >= SD_PHY_SPECv3_01_VERS) {
84
+                     */
39
+ sd->scr[2] |= 1 << 7; /* Spec Version 3.0X */
85
#define VIRTIO_NET_F_SPEED_DUPLEX 63    /* Device set linkspeed and duplex */
40
+ }
86
41
sd->scr[3] = 0x00;
87
#ifndef VIRTIO_NET_NO_LEGACY
42
/* reserved for manufacturer usage */
88
diff --git a/linux-headers/asm-arm/kvm.h b/linux-headers/asm-arm/kvm.h
43
sd->scr[4] = 0x00;
89
index XXXXXXX..XXXXXXX 100644
44
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
90
--- a/linux-headers/asm-arm/kvm.h
45
91
+++ b/linux-headers/asm-arm/kvm.h
46
switch (sd->spec_version) {
92
@@ -XXX,XX +XXX,XX @@ struct kvm_regs {
47
case SD_PHY_SPECv1_10_VERS
93
#define KVM_VGIC_V3_ADDR_TYPE_DIST    2
48
- ... SD_PHY_SPECv2_00_VERS:
94
#define KVM_VGIC_V3_ADDR_TYPE_REDIST    3
49
+ ... SD_PHY_SPECv3_01_VERS:
95
#define KVM_VGIC_ITS_ADDR_TYPE        4
50
break;
96
+#define KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION    5
51
default:
97
52
error_setg(errp, "Invalid SD card Spec version: %u", sd->spec_version);
98
#define KVM_VGIC_V3_DIST_SIZE        SZ_64K
99
#define KVM_VGIC_V3_REDIST_SIZE        (2 * SZ_64K)
100
diff --git a/linux-headers/asm-arm/unistd-common.h b/linux-headers/asm-arm/unistd-common.h
101
index XXXXXXX..XXXXXXX 100644
102
--- a/linux-headers/asm-arm/unistd-common.h
103
+++ b/linux-headers/asm-arm/unistd-common.h
104
@@ -XXX,XX +XXX,XX @@
105
#define __NR_pkey_alloc (__NR_SYSCALL_BASE + 395)
106
#define __NR_pkey_free (__NR_SYSCALL_BASE + 396)
107
#define __NR_statx (__NR_SYSCALL_BASE + 397)
108
+#define __NR_rseq (__NR_SYSCALL_BASE + 398)
109
110
#endif /* _ASM_ARM_UNISTD_COMMON_H */
111
diff --git a/linux-headers/asm-arm64/kvm.h b/linux-headers/asm-arm64/kvm.h
112
index XXXXXXX..XXXXXXX 100644
113
--- a/linux-headers/asm-arm64/kvm.h
114
+++ b/linux-headers/asm-arm64/kvm.h
115
@@ -XXX,XX +XXX,XX @@ struct kvm_regs {
116
#define KVM_VGIC_V3_ADDR_TYPE_DIST    2
117
#define KVM_VGIC_V3_ADDR_TYPE_REDIST    3
118
#define KVM_VGIC_ITS_ADDR_TYPE        4
119
+#define KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION    5
120
121
#define KVM_VGIC_V3_DIST_SIZE        SZ_64K
122
#define KVM_VGIC_V3_REDIST_SIZE        (2 * SZ_64K)
123
diff --git a/linux-headers/asm-generic/unistd.h b/linux-headers/asm-generic/unistd.h
124
index XXXXXXX..XXXXXXX 100644
125
--- a/linux-headers/asm-generic/unistd.h
126
+++ b/linux-headers/asm-generic/unistd.h
127
@@ -XXX,XX +XXX,XX @@ __SYSCALL(__NR_pkey_alloc, sys_pkey_alloc)
128
__SYSCALL(__NR_pkey_free, sys_pkey_free)
129
#define __NR_statx 291
130
__SYSCALL(__NR_statx, sys_statx)
131
+#define __NR_io_pgetevents 292
132
+__SC_COMP(__NR_io_pgetevents, sys_io_pgetevents, compat_sys_io_pgetevents)
133
134
#undef __NR_syscalls
135
-#define __NR_syscalls 292
136
+#define __NR_syscalls 293
137
138
/*
139
* 32 bit systems traditionally used different
140
diff --git a/linux-headers/asm-powerpc/unistd.h b/linux-headers/asm-powerpc/unistd.h
141
index XXXXXXX..XXXXXXX 100644
142
--- a/linux-headers/asm-powerpc/unistd.h
143
+++ b/linux-headers/asm-powerpc/unistd.h
144
@@ -XXX,XX +XXX,XX @@
145
#define __NR_pkey_alloc        384
146
#define __NR_pkey_free        385
147
#define __NR_pkey_mprotect    386
148
+#define __NR_rseq        387
149
150
#endif /* _ASM_POWERPC_UNISTD_H_ */
151
diff --git a/linux-headers/asm-x86/unistd_32.h b/linux-headers/asm-x86/unistd_32.h
152
index XXXXXXX..XXXXXXX 100644
153
--- a/linux-headers/asm-x86/unistd_32.h
154
+++ b/linux-headers/asm-x86/unistd_32.h
155
@@ -XXX,XX +XXX,XX @@
156
#define __NR_pkey_free 382
157
#define __NR_statx 383
158
#define __NR_arch_prctl 384
159
+#define __NR_io_pgetevents 385
160
+#define __NR_rseq 386
161
162
#endif /* _ASM_X86_UNISTD_32_H */
163
diff --git a/linux-headers/asm-x86/unistd_64.h b/linux-headers/asm-x86/unistd_64.h
164
index XXXXXXX..XXXXXXX 100644
165
--- a/linux-headers/asm-x86/unistd_64.h
166
+++ b/linux-headers/asm-x86/unistd_64.h
167
@@ -XXX,XX +XXX,XX @@
168
#define __NR_pkey_alloc 330
169
#define __NR_pkey_free 331
170
#define __NR_statx 332
171
+#define __NR_io_pgetevents 333
172
+#define __NR_rseq 334
173
174
#endif /* _ASM_X86_UNISTD_64_H */
175
diff --git a/linux-headers/asm-x86/unistd_x32.h b/linux-headers/asm-x86/unistd_x32.h
176
index XXXXXXX..XXXXXXX 100644
177
--- a/linux-headers/asm-x86/unistd_x32.h
178
+++ b/linux-headers/asm-x86/unistd_x32.h
179
@@ -XXX,XX +XXX,XX @@
180
#define __NR_pkey_alloc (__X32_SYSCALL_BIT + 330)
181
#define __NR_pkey_free (__X32_SYSCALL_BIT + 331)
182
#define __NR_statx (__X32_SYSCALL_BIT + 332)
183
+#define __NR_io_pgetevents (__X32_SYSCALL_BIT + 333)
184
+#define __NR_rseq (__X32_SYSCALL_BIT + 334)
185
#define __NR_rt_sigaction (__X32_SYSCALL_BIT + 512)
186
#define __NR_rt_sigreturn (__X32_SYSCALL_BIT + 513)
187
#define __NR_ioctl (__X32_SYSCALL_BIT + 514)
188
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
189
index XXXXXXX..XXXXXXX 100644
190
--- a/linux-headers/linux/kvm.h
191
+++ b/linux-headers/linux/kvm.h
192
@@ -XXX,XX +XXX,XX @@ struct kvm_ioeventfd {
193
};
194
195
#define KVM_X86_DISABLE_EXITS_MWAIT (1 << 0)
196
-#define KVM_X86_DISABLE_EXITS_HTL (1 << 1)
197
+#define KVM_X86_DISABLE_EXITS_HLT (1 << 1)
198
#define KVM_X86_DISABLE_EXITS_PAUSE (1 << 2)
199
#define KVM_X86_DISABLE_VALID_EXITS (KVM_X86_DISABLE_EXITS_MWAIT | \
200
- KVM_X86_DISABLE_EXITS_HTL | \
201
+ KVM_X86_DISABLE_EXITS_HLT | \
202
KVM_X86_DISABLE_EXITS_PAUSE)
203
204
/* for KVM_ENABLE_CAP */
205
@@ -XXX,XX +XXX,XX @@ struct kvm_ppc_resize_hpt {
206
#define KVM_CAP_S390_BPB 152
207
#define KVM_CAP_GET_MSR_FEATURES 153
208
#define KVM_CAP_HYPERV_EVENTFD 154
209
+#define KVM_CAP_HYPERV_TLBFLUSH 155
210
211
#ifdef KVM_CAP_IRQ_ROUTING
212
213
diff --git a/linux-headers/linux/psp-sev.h b/linux-headers/linux/psp-sev.h
214
index XXXXXXX..XXXXXXX 100644
215
--- a/linux-headers/linux/psp-sev.h
216
+++ b/linux-headers/linux/psp-sev.h
217
@@ -XXX,XX +XXX,XX @@ enum {
218
    SEV_PDH_GEN,
219
    SEV_PDH_CERT_EXPORT,
220
    SEV_PEK_CERT_IMPORT,
221
+    SEV_GET_ID,
222
223
    SEV_MAX,
224
};
225
@@ -XXX,XX +XXX,XX @@ struct sev_user_data_pdh_cert_export {
226
    __u32 cert_chain_len;            /* In/Out */
227
} __attribute__((packed));
228
229
+/**
230
+ * struct sev_user_data_get_id - GET_ID command parameters
231
+ *
232
+ * @socket1: Buffer to pass unique ID of first socket
233
+ * @socket2: Buffer to pass unique ID of second socket
234
+ */
235
+struct sev_user_data_get_id {
236
+    __u8 socket1[64];            /* Out */
237
+    __u8 socket2[64];            /* Out */
238
+} __attribute__((packed));
239
+
240
/**
241
* struct sev_issue_cmd - SEV ioctl parameters
242
*
243
diff --git a/linux-headers/LICENSES/exceptions/Linux-syscall-note b/linux-headers/LICENSES/exceptions/Linux-syscall-note
244
index XXXXXXX..XXXXXXX 100644
245
--- a/linux-headers/LICENSES/exceptions/Linux-syscall-note
246
+++ b/linux-headers/LICENSES/exceptions/Linux-syscall-note
247
@@ -XXX,XX +XXX,XX @@
248
SPDX-Exception-Identifier: Linux-syscall-note
249
SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html
250
-SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+
251
+SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+, GPL-2.0-only, GPL-2.0-or-later
252
Usage-Guide:
253
This exception is used together with one of the above SPDX-Licenses
254
to mark user space API (uapi) header files so they can be included
255
diff --git a/linux-headers/LICENSES/preferred/GPL-2.0 b/linux-headers/LICENSES/preferred/GPL-2.0
256
index XXXXXXX..XXXXXXX 100644
257
--- a/linux-headers/LICENSES/preferred/GPL-2.0
258
+++ b/linux-headers/LICENSES/preferred/GPL-2.0
259
@@ -XXX,XX +XXX,XX @@
260
Valid-License-Identifier: GPL-2.0
261
+Valid-License-Identifier: GPL-2.0-only
262
Valid-License-Identifier: GPL-2.0+
263
+Valid-License-Identifier: GPL-2.0-or-later
264
SPDX-URL: https://spdx.org/licenses/GPL-2.0.html
265
Usage-Guide:
266
To use this license in source code, put one of the following SPDX
267
@@ -XXX,XX +XXX,XX @@ Usage-Guide:
268
guidelines in the licensing rules documentation.
269
For 'GNU General Public License (GPL) version 2 only' use:
270
SPDX-License-Identifier: GPL-2.0
271
+ or
272
+ SPDX-License-Identifier: GPL-2.0-only
273
For 'GNU General Public License (GPL) version 2 or any later version' use:
274
SPDX-License-Identifier: GPL-2.0+
275
+ or
276
+ SPDX-License-Identifier: GPL-2.0-or-later
277
License-Text:
278
279
         GNU GENERAL PUBLIC LICENSE
53
--
280
--
54
2.17.1
281
2.17.1
55
282
56
283
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
for KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION attribute, the attribute
4
Acked-by: Max Filippov <jcmvbkbc@gmail.com>
4
data pointed to by kvm_device_attr.addr is a OR of the
5
Message-id: 20180606152128.449-12-f4bug@amsat.org
5
redistributor region address and other fields such as the index
6
of the redistributor region and the number of redistributors the
7
region can contain.
8
9
The existing machine init done notifier framework sets the address
10
field to the actual address of the device and does not allow to OR
11
this value with other fields.
12
13
This patch extends the KVMDevice struct with a new kda_addr_ormask
14
member. Its value is passed at registration time and OR'ed with the
15
resolved address on kvm_arm_set_device_addr().
16
17
Signed-off-by: Eric Auger <eric.auger@redhat.com>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Message-id: 1529072910-16156-3-git-send-email-eric.auger@redhat.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
21
---
8
target/xtensa/translate.c | 6 +++---
22
target/arm/kvm_arm.h | 3 ++-
9
1 file changed, 3 insertions(+), 3 deletions(-)
23
hw/intc/arm_gic_kvm.c | 4 ++--
24
hw/intc/arm_gicv3_its_kvm.c | 2 +-
25
hw/intc/arm_gicv3_kvm.c | 4 ++--
26
target/arm/kvm.c | 10 +++++++++-
27
5 files changed, 16 insertions(+), 7 deletions(-)
10
28
11
diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
29
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
12
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
13
--- a/target/xtensa/translate.c
31
--- a/target/arm/kvm_arm.h
14
+++ b/target/xtensa/translate.c
32
+++ b/target/arm/kvm_arm.h
15
@@ -XXX,XX +XXX,XX @@ static void translate_rur(DisasContext *dc, const uint32_t arg[],
33
@@ -XXX,XX +XXX,XX @@ int kvm_arm_vcpu_init(CPUState *cs);
16
if (uregnames[par[0]].name) {
34
* @group: device control API group for setting addresses
17
tcg_gen_mov_i32(cpu_R[arg[0]], cpu_UR[par[0]]);
35
* @attr: device control API address type
18
} else {
36
* @dev_fd: device control device file descriptor (or -1 if not supported)
19
- qemu_log_mask(LOG_UNIMP, "RUR %d not implemented, ", par[0]);
37
+ * @addr_ormask: value to be OR'ed with resolved address
20
+ qemu_log_mask(LOG_UNIMP, "RUR %d not implemented\n", par[0]);
38
*
21
}
39
* Remember the memory region @mr, and when it is mapped by the
22
}
40
* machine model, tell the kernel that base address using the
23
}
41
@@ -XXX,XX +XXX,XX @@ int kvm_arm_vcpu_init(CPUState *cs);
24
@@ -XXX,XX +XXX,XX @@ static void translate_slli(DisasContext *dc, const uint32_t arg[],
42
* address at the point where machine init is complete.
43
*/
44
void kvm_arm_register_device(MemoryRegion *mr, uint64_t devid, uint64_t group,
45
- uint64_t attr, int dev_fd);
46
+ uint64_t attr, int dev_fd, uint64_t addr_ormask);
47
48
/**
49
* kvm_arm_init_cpreg_list:
50
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/intc/arm_gic_kvm.c
53
+++ b/hw/intc/arm_gic_kvm.c
54
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
55
| KVM_VGIC_V2_ADDR_TYPE_DIST,
56
KVM_DEV_ARM_VGIC_GRP_ADDR,
57
KVM_VGIC_V2_ADDR_TYPE_DIST,
58
- s->dev_fd);
59
+ s->dev_fd, 0);
60
/* CPU interface for current core. Unlike arm_gic, we don't
61
* provide the "interface for core #N" memory regions, because
62
* cores with a VGIC don't have those.
63
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
64
| KVM_VGIC_V2_ADDR_TYPE_CPU,
65
KVM_DEV_ARM_VGIC_GRP_ADDR,
66
KVM_VGIC_V2_ADDR_TYPE_CPU,
67
- s->dev_fd);
68
+ s->dev_fd, 0);
69
70
if (kvm_has_gsi_routing()) {
71
/* set up irq routing */
72
diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/intc/arm_gicv3_its_kvm.c
75
+++ b/hw/intc/arm_gicv3_its_kvm.c
76
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
77
78
/* register the base address */
79
kvm_arm_register_device(&s->iomem_its_cntrl, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
80
- KVM_VGIC_ITS_ADDR_TYPE, s->dev_fd);
81
+ KVM_VGIC_ITS_ADDR_TYPE, s->dev_fd, 0);
82
83
gicv3_its_init_mmio(s, NULL);
84
85
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/hw/intc/arm_gicv3_kvm.c
88
+++ b/hw/intc/arm_gicv3_kvm.c
89
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
90
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true, &error_abort);
91
92
kvm_arm_register_device(&s->iomem_dist, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
93
- KVM_VGIC_V3_ADDR_TYPE_DIST, s->dev_fd);
94
+ KVM_VGIC_V3_ADDR_TYPE_DIST, s->dev_fd, 0);
95
kvm_arm_register_device(&s->iomem_redist, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
96
- KVM_VGIC_V3_ADDR_TYPE_REDIST, s->dev_fd);
97
+ KVM_VGIC_V3_ADDR_TYPE_REDIST, s->dev_fd, 0);
98
99
if (kvm_has_gsi_routing()) {
100
/* set up irq routing */
101
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
102
index XXXXXXX..XXXXXXX 100644
103
--- a/target/arm/kvm.c
104
+++ b/target/arm/kvm.c
105
@@ -XXX,XX +XXX,XX @@ unsigned long kvm_arch_vcpu_id(CPUState *cpu)
106
* We use a MemoryListener to track mapping and unmapping of
107
* the regions during board creation, so the board models don't
108
* need to do anything special for the KVM case.
109
+ *
110
+ * Sometimes the address must be OR'ed with some other fields
111
+ * (for example for KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION).
112
+ * @kda_addr_ormask aims at storing the value of those fields.
113
*/
114
typedef struct KVMDevice {
115
struct kvm_arm_device_addr kda;
116
struct kvm_device_attr kdattr;
117
+ uint64_t kda_addr_ormask;
118
MemoryRegion *mr;
119
QSLIST_ENTRY(KVMDevice) entries;
120
int dev_fd;
121
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_set_device_addr(KVMDevice *kd)
122
*/
123
if (kd->dev_fd >= 0) {
124
uint64_t addr = kd->kda.addr;
125
+
126
+ addr |= kd->kda_addr_ormask;
127
attr->addr = (uintptr_t)&addr;
128
ret = kvm_device_ioctl(kd->dev_fd, KVM_SET_DEVICE_ATTR, attr);
129
} else {
130
@@ -XXX,XX +XXX,XX @@ static Notifier notify = {
131
};
132
133
void kvm_arm_register_device(MemoryRegion *mr, uint64_t devid, uint64_t group,
134
- uint64_t attr, int dev_fd)
135
+ uint64_t attr, int dev_fd, uint64_t addr_ormask)
25
{
136
{
26
if (gen_window_check2(dc, arg[0], arg[1])) {
137
KVMDevice *kd;
27
if (arg[2] == 32) {
138
28
- qemu_log_mask(LOG_GUEST_ERROR, "slli a%d, a%d, 32 is undefined",
139
@@ -XXX,XX +XXX,XX @@ void kvm_arm_register_device(MemoryRegion *mr, uint64_t devid, uint64_t group,
29
+ qemu_log_mask(LOG_GUEST_ERROR, "slli a%d, a%d, 32 is undefined\n",
140
kd->kdattr.group = group;
30
arg[0], arg[1]);
141
kd->kdattr.attr = attr;
31
}
142
kd->dev_fd = dev_fd;
32
tcg_gen_shli_i32(cpu_R[arg[0]], cpu_R[arg[1]], arg[2] & 0x1f);
143
+ kd->kda_addr_ormask = addr_ormask;
33
@@ -XXX,XX +XXX,XX @@ static void translate_wur(DisasContext *dc, const uint32_t arg[],
144
QSLIST_INSERT_HEAD(&kvm_devices_head, kd, entries);
34
if (uregnames[par[0]].name) {
145
memory_region_ref(kd->mr);
35
gen_wur(par[0], cpu_R[arg[0]]);
36
} else {
37
- qemu_log_mask(LOG_UNIMP, "WUR %d not implemented, ", par[0]);
38
+ qemu_log_mask(LOG_UNIMP, "WUR %d not implemented\n", par[0]);
39
}
40
}
41
}
146
}
42
--
147
--
43
2.17.1
148
2.17.1
44
149
45
150
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
While we skip the GIC_INTERNAL irqs, we don't change the register offset
3
To prepare for multiple redistributor regions, we introduce
4
accordingly. This will overlap the GICR registers value and leave the
4
an array of uint32_t properties that stores the redistributor
5
last GIC_INTERNAL irq's registers out of update.
5
count of each redistributor region.
6
6
7
Fix this by skipping the registers banked by GICR.
7
Non accelerated VGICv3 only supports a single redistributor region.
8
8
The capacity of all redist regions is checked against the number of
9
Also for migration compatibility if the migration source (old version
9
vcpus.
10
qemu) doesn't send gicd_no_migration_shift_bug = 1 to destination, then
10
11
we shift the data of PPI to get the right data for SPI.
11
Machvirt is updated to set those properties, ie. a single
12
12
redistributor region with count set to the number of vcpus
13
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
13
capped by 123.
14
Cc: qemu-stable@nongnu.org
14
15
Reviewed-by: Eric Auger <eric.auger@redhat.com>
15
Signed-off-by: Eric Auger <eric.auger@redhat.com>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Andrew Jones <drjones@redhat.com>
17
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
17
Message-id: 1529072910-16156-4-git-send-email-eric.auger@redhat.com
18
Message-id: 1527816987-16108-1-git-send-email-zhaoshenglong@huawei.com
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
19
---
21
include/hw/intc/arm_gicv3_common.h | 1 +
20
include/hw/intc/arm_gicv3_common.h | 8 +++++--
22
hw/intc/arm_gicv3_common.c | 79 ++++++++++++++++++++++++++++++
21
hw/arm/virt.c | 11 ++++++++-
23
hw/intc/arm_gicv3_kvm.c | 38 ++++++++++++++
22
hw/intc/arm_gicv3.c | 12 +++++++++-
24
3 files changed, 118 insertions(+)
23
hw/intc/arm_gicv3_common.c | 38 ++++++++++++++++++++++++++----
24
hw/intc/arm_gicv3_kvm.c | 9 +++++--
25
5 files changed, 67 insertions(+), 11 deletions(-)
25
26
26
diff --git a/include/hw/intc/arm_gicv3_common.h b/include/hw/intc/arm_gicv3_common.h
27
diff --git a/include/hw/intc/arm_gicv3_common.h b/include/hw/intc/arm_gicv3_common.h
27
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/intc/arm_gicv3_common.h
29
--- a/include/hw/intc/arm_gicv3_common.h
29
+++ b/include/hw/intc/arm_gicv3_common.h
30
+++ b/include/hw/intc/arm_gicv3_common.h
31
@@ -XXX,XX +XXX,XX @@
32
#define GICV3_MAXIRQ 1020
33
#define GICV3_MAXSPI (GICV3_MAXIRQ - GIC_INTERNAL)
34
35
+#define GICV3_REDIST_SIZE 0x20000
36
+
37
/* Number of SGI target-list bits */
38
#define GICV3_TARGETLIST_BITS 16
39
30
@@ -XXX,XX +XXX,XX @@ struct GICv3State {
40
@@ -XXX,XX +XXX,XX @@ struct GICv3State {
31
uint32_t revision;
41
/*< public >*/
32
bool security_extn;
42
33
bool irq_reset_nonsecure;
43
MemoryRegion iomem_dist; /* Distributor */
34
+ bool gicd_no_migration_shift_bug;
44
- MemoryRegion iomem_redist; /* Redistributors */
35
45
+ MemoryRegion *iomem_redist; /* Redistributor Regions */
36
int dev_fd; /* kvm device fd if backed by kvm vgic support */
46
+ uint32_t *redist_region_count; /* redistributor count within each region */
37
Error *migration_blocker;
47
+ uint32_t nb_redist_regions; /* number of redist regions */
48
49
uint32_t num_cpu;
50
uint32_t num_irq;
51
@@ -XXX,XX +XXX,XX @@ typedef struct ARMGICv3CommonClass {
52
} ARMGICv3CommonClass;
53
54
void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
55
- const MemoryRegionOps *ops);
56
+ const MemoryRegionOps *ops, Error **errp);
57
58
#endif
59
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/arm/virt.c
62
+++ b/hw/arm/virt.c
63
@@ -XXX,XX +XXX,XX @@ static void create_gic(VirtMachineState *vms, qemu_irq *pic)
64
if (!kvm_irqchip_in_kernel()) {
65
qdev_prop_set_bit(gicdev, "has-security-extensions", vms->secure);
66
}
67
+
68
+ if (type == 3) {
69
+ uint32_t redist0_capacity =
70
+ vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;
71
+ uint32_t redist0_count = MIN(smp_cpus, redist0_capacity);
72
+
73
+ qdev_prop_set_uint32(gicdev, "len-redist-region-count", 1);
74
+ qdev_prop_set_uint32(gicdev, "redist-region-count[0]", redist0_count);
75
+ }
76
qdev_init_nofail(gicdev);
77
gicbusdev = SYS_BUS_DEVICE(gicdev);
78
sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base);
79
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
80
* many redistributors we can fit into the memory map.
81
*/
82
if (vms->gic_version == 3) {
83
- virt_max_cpus = vms->memmap[VIRT_GIC_REDIST].size / 0x20000;
84
+ virt_max_cpus = vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;
85
} else {
86
virt_max_cpus = GIC_NCPU;
87
}
88
diff --git a/hw/intc/arm_gicv3.c b/hw/intc/arm_gicv3.c
89
index XXXXXXX..XXXXXXX 100644
90
--- a/hw/intc/arm_gicv3.c
91
+++ b/hw/intc/arm_gicv3.c
92
@@ -XXX,XX +XXX,XX @@ static void arm_gic_realize(DeviceState *dev, Error **errp)
93
return;
94
}
95
96
- gicv3_init_irqs_and_mmio(s, gicv3_set_irq, gic_ops);
97
+ if (s->nb_redist_regions != 1) {
98
+ error_setg(errp, "VGICv3 redist region number(%d) not equal to 1",
99
+ s->nb_redist_regions);
100
+ return;
101
+ }
102
+
103
+ gicv3_init_irqs_and_mmio(s, gicv3_set_irq, gic_ops, &local_err);
104
+ if (local_err) {
105
+ error_propagate(errp, local_err);
106
+ return;
107
+ }
108
109
gicv3_init_cpuif(s);
110
}
38
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
111
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
39
index XXXXXXX..XXXXXXX 100644
112
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/intc/arm_gicv3_common.c
113
--- a/hw/intc/arm_gicv3_common.c
41
+++ b/hw/intc/arm_gicv3_common.c
114
+++ b/hw/intc/arm_gicv3_common.c
42
@@ -XXX,XX +XXX,XX @@
115
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_gicv3 = {
43
#include "hw/intc/arm_gicv3_common.h"
116
};
44
#include "gicv3_internal.h"
117
45
#include "hw/arm/linux-boot-if.h"
118
void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
46
+#include "sysemu/kvm.h"
119
- const MemoryRegionOps *ops)
47
120
+ const MemoryRegionOps *ops, Error **errp)
48
static int gicv3_pre_save(void *opaque)
49
{
121
{
50
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_gicv3_cpu = {
122
SysBusDevice *sbd = SYS_BUS_DEVICE(s);
51
}
123
+ int rdist_capacity = 0;
124
int i;
125
126
+ for (i = 0; i < s->nb_redist_regions; i++) {
127
+ rdist_capacity += s->redist_region_count[i];
128
+ }
129
+ if (rdist_capacity < s->num_cpu) {
130
+ error_setg(errp, "Capacity of the redist regions(%d) "
131
+ "is less than number of vcpus(%d)",
132
+ rdist_capacity, s->num_cpu);
133
+ return;
134
+ }
135
+
136
/* For the GIC, also expose incoming GPIO lines for PPIs for each CPU.
137
* GPIO array layout is thus:
138
* [0..N-1] spi
139
@@ -XXX,XX +XXX,XX @@ void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
140
141
memory_region_init_io(&s->iomem_dist, OBJECT(s), ops, s,
142
"gicv3_dist", 0x10000);
143
- memory_region_init_io(&s->iomem_redist, OBJECT(s), ops ? &ops[1] : NULL, s,
144
- "gicv3_redist", 0x20000 * s->num_cpu);
145
-
146
sysbus_init_mmio(sbd, &s->iomem_dist);
147
- sysbus_init_mmio(sbd, &s->iomem_redist);
148
+
149
+ s->iomem_redist = g_new0(MemoryRegion, s->nb_redist_regions);
150
+ for (i = 0; i < s->nb_redist_regions; i++) {
151
+ char *name = g_strdup_printf("gicv3_redist_region[%d]", i);
152
+
153
+ memory_region_init_io(&s->iomem_redist[i], OBJECT(s),
154
+ ops ? &ops[1] : NULL, s, name,
155
+ s->redist_region_count[i] * GICV3_REDIST_SIZE);
156
+ sysbus_init_mmio(sbd, &s->iomem_redist[i]);
157
+ g_free(name);
158
+ }
159
}
160
161
static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
162
@@ -XXX,XX +XXX,XX @@ static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
163
}
164
}
165
166
+static void arm_gicv3_finalize(Object *obj)
167
+{
168
+ GICv3State *s = ARM_GICV3_COMMON(obj);
169
+
170
+ g_free(s->redist_region_count);
171
+}
172
+
173
static void arm_gicv3_common_reset(DeviceState *dev)
174
{
175
GICv3State *s = ARM_GICV3_COMMON(dev);
176
@@ -XXX,XX +XXX,XX @@ static Property arm_gicv3_common_properties[] = {
177
DEFINE_PROP_UINT32("num-irq", GICv3State, num_irq, 32),
178
DEFINE_PROP_UINT32("revision", GICv3State, revision, 3),
179
DEFINE_PROP_BOOL("has-security-extensions", GICv3State, security_extn, 0),
180
+ DEFINE_PROP_ARRAY("redist-region-count", GICv3State, nb_redist_regions,
181
+ redist_region_count, qdev_prop_uint32, uint32_t),
182
DEFINE_PROP_END_OF_LIST(),
52
};
183
};
53
184
54
+static int gicv3_gicd_no_migration_shift_bug_pre_load(void *opaque)
185
@@ -XXX,XX +XXX,XX @@ static const TypeInfo arm_gicv3_common_type = {
55
+{
186
.instance_size = sizeof(GICv3State),
56
+ GICv3State *cs = opaque;
187
.class_size = sizeof(ARMGICv3CommonClass),
57
+
188
.class_init = arm_gicv3_common_class_init,
58
+ /*
189
+ .instance_finalize = arm_gicv3_finalize,
59
+ * The gicd_no_migration_shift_bug flag is used for migration compatibility
190
.abstract = true,
60
+ * for old version QEMU which may have the GICD bmp shift bug under KVM mode.
191
.interfaces = (InterfaceInfo []) {
61
+ * Strictly, what we want to know is whether the migration source is using
192
{ TYPE_ARM_LINUX_BOOT_IF },
62
+ * KVM. Since we don't have any way to determine that, we look at whether the
63
+ * destination is using KVM; this is close enough because for the older QEMU
64
+ * versions with this bug KVM -> TCG migration didn't work anyway. If the
65
+ * source is a newer QEMU without this bug it will transmit the migration
66
+ * subsection which sets the flag to true; otherwise it will remain set to
67
+ * the value we select here.
68
+ */
69
+ if (kvm_enabled()) {
70
+ cs->gicd_no_migration_shift_bug = false;
71
+ }
72
+
73
+ return 0;
74
+}
75
+
76
+static int gicv3_gicd_no_migration_shift_bug_post_load(void *opaque,
77
+ int version_id)
78
+{
79
+ GICv3State *cs = opaque;
80
+
81
+ if (cs->gicd_no_migration_shift_bug) {
82
+ return 0;
83
+ }
84
+
85
+ /* Older versions of QEMU had a bug in the handling of state save/restore
86
+ * to the KVM GICv3: they got the offset in the bitmap arrays wrong,
87
+ * so that instead of the data for external interrupts 32 and up
88
+ * starting at bit position 32 in the bitmap, it started at bit
89
+ * position 64. If we're receiving data from a QEMU with that bug,
90
+ * we must move the data down into the right place.
91
+ */
92
+ memmove(cs->group, (uint8_t *)cs->group + GIC_INTERNAL / 8,
93
+ sizeof(cs->group) - GIC_INTERNAL / 8);
94
+ memmove(cs->grpmod, (uint8_t *)cs->grpmod + GIC_INTERNAL / 8,
95
+ sizeof(cs->grpmod) - GIC_INTERNAL / 8);
96
+ memmove(cs->enabled, (uint8_t *)cs->enabled + GIC_INTERNAL / 8,
97
+ sizeof(cs->enabled) - GIC_INTERNAL / 8);
98
+ memmove(cs->pending, (uint8_t *)cs->pending + GIC_INTERNAL / 8,
99
+ sizeof(cs->pending) - GIC_INTERNAL / 8);
100
+ memmove(cs->active, (uint8_t *)cs->active + GIC_INTERNAL / 8,
101
+ sizeof(cs->active) - GIC_INTERNAL / 8);
102
+ memmove(cs->edge_trigger, (uint8_t *)cs->edge_trigger + GIC_INTERNAL / 8,
103
+ sizeof(cs->edge_trigger) - GIC_INTERNAL / 8);
104
+
105
+ /*
106
+ * While this new version QEMU doesn't have this kind of bug as we fix it,
107
+ * so it needs to set the flag to true to indicate that and it's necessary
108
+ * for next migration to work from this new version QEMU.
109
+ */
110
+ cs->gicd_no_migration_shift_bug = true;
111
+
112
+ return 0;
113
+}
114
+
115
+const VMStateDescription vmstate_gicv3_gicd_no_migration_shift_bug = {
116
+ .name = "arm_gicv3/gicd_no_migration_shift_bug",
117
+ .version_id = 1,
118
+ .minimum_version_id = 1,
119
+ .pre_load = gicv3_gicd_no_migration_shift_bug_pre_load,
120
+ .post_load = gicv3_gicd_no_migration_shift_bug_post_load,
121
+ .fields = (VMStateField[]) {
122
+ VMSTATE_BOOL(gicd_no_migration_shift_bug, GICv3State),
123
+ VMSTATE_END_OF_LIST()
124
+ }
125
+};
126
+
127
static const VMStateDescription vmstate_gicv3 = {
128
.name = "arm_gicv3",
129
.version_id = 1,
130
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_gicv3 = {
131
VMSTATE_STRUCT_VARRAY_POINTER_UINT32(cpu, GICv3State, num_cpu,
132
vmstate_gicv3_cpu, GICv3CPUState),
133
VMSTATE_END_OF_LIST()
134
+ },
135
+ .subsections = (const VMStateDescription * []) {
136
+ &vmstate_gicv3_gicd_no_migration_shift_bug,
137
+ NULL
138
}
139
};
140
141
@@ -XXX,XX +XXX,XX @@ static void arm_gicv3_common_reset(DeviceState *dev)
142
gicv3_gicd_group_set(s, i);
143
}
144
}
145
+ s->gicd_no_migration_shift_bug = true;
146
}
147
148
static void arm_gic_common_linux_init(ARMLinuxBootIf *obj,
149
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
193
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
150
index XXXXXXX..XXXXXXX 100644
194
index XXXXXXX..XXXXXXX 100644
151
--- a/hw/intc/arm_gicv3_kvm.c
195
--- a/hw/intc/arm_gicv3_kvm.c
152
+++ b/hw/intc/arm_gicv3_kvm.c
196
+++ b/hw/intc/arm_gicv3_kvm.c
153
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_get_edge_trigger(GICv3State *s, uint32_t offset,
197
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
154
uint32_t reg;
198
return;
155
int irq;
199
}
156
200
157
+ /* For the KVM GICv3, affinity routing is always enabled, and the first 2
201
- gicv3_init_irqs_and_mmio(s, kvm_arm_gicv3_set_irq, NULL);
158
+ * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
202
+ gicv3_init_irqs_and_mmio(s, kvm_arm_gicv3_set_irq, NULL, &local_err);
159
+ * functionality is replaced by GICR_ICFGR<n>. It doesn't need to sync
203
+ if (local_err) {
160
+ * them. So it should increase the offset to skip GIC_INTERNAL irqs.
204
+ error_propagate(errp, local_err);
161
+ * This matches the for_each_dist_irq_reg() macro which also skips the
205
+ return;
162
+ * first GIC_INTERNAL irqs.
206
+ }
163
+ */
207
164
+ offset += (GIC_INTERNAL * 2) / 8;
208
for (i = 0; i < s->num_cpu; i++) {
165
for_each_dist_irq_reg(irq, s->num_irq, 2) {
209
ARMCPU *cpu = ARM_CPU(qemu_get_cpu(i));
166
kvm_gicd_access(s, offset, &reg, false);
210
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
167
reg = half_unshuffle32(reg >> 1);
211
168
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_put_edge_trigger(GICv3State *s, uint32_t offset,
212
kvm_arm_register_device(&s->iomem_dist, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
169
uint32_t reg;
213
KVM_VGIC_V3_ADDR_TYPE_DIST, s->dev_fd, 0);
170
int irq;
214
- kvm_arm_register_device(&s->iomem_redist, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
171
215
+ kvm_arm_register_device(&s->iomem_redist[0], -1,
172
+ /* For the KVM GICv3, affinity routing is always enabled, and the first 2
216
+ KVM_DEV_ARM_VGIC_GRP_ADDR,
173
+ * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
217
KVM_VGIC_V3_ADDR_TYPE_REDIST, s->dev_fd, 0);
174
+ * functionality is replaced by GICR_ICFGR<n>. It doesn't need to sync
218
175
+ * them. So it should increase the offset to skip GIC_INTERNAL irqs.
219
if (kvm_has_gsi_routing()) {
176
+ * This matches the for_each_dist_irq_reg() macro which also skips the
177
+ * first GIC_INTERNAL irqs.
178
+ */
179
+ offset += (GIC_INTERNAL * 2) / 8;
180
for_each_dist_irq_reg(irq, s->num_irq, 2) {
181
reg = *gic_bmp_ptr32(bmp, irq);
182
if (irq % 32 != 0) {
183
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_getbmp(GICv3State *s, uint32_t offset, uint32_t *bmp)
184
uint32_t reg;
185
int irq;
186
187
+ /* For the KVM GICv3, affinity routing is always enabled, and the
188
+ * GICD_IGROUPR0/GICD_IGRPMODR0/GICD_ISENABLER0/GICD_ISPENDR0/
189
+ * GICD_ISACTIVER0 registers are always RAZ/WI. The corresponding
190
+ * functionality is replaced by the GICR registers. It doesn't need to sync
191
+ * them. So it should increase the offset to skip GIC_INTERNAL irqs.
192
+ * This matches the for_each_dist_irq_reg() macro which also skips the
193
+ * first GIC_INTERNAL irqs.
194
+ */
195
+ offset += (GIC_INTERNAL * 1) / 8;
196
for_each_dist_irq_reg(irq, s->num_irq, 1) {
197
kvm_gicd_access(s, offset, &reg, false);
198
*gic_bmp_ptr32(bmp, irq) = reg;
199
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
200
uint32_t reg;
201
int irq;
202
203
+ /* For the KVM GICv3, affinity routing is always enabled, and the
204
+ * GICD_IGROUPR0/GICD_IGRPMODR0/GICD_ISENABLER0/GICD_ISPENDR0/
205
+ * GICD_ISACTIVER0 registers are always RAZ/WI. The corresponding
206
+ * functionality is replaced by the GICR registers. It doesn't need to sync
207
+ * them. So it should increase the offset and clroffset to skip GIC_INTERNAL
208
+ * irqs. This matches the for_each_dist_irq_reg() macro which also skips the
209
+ * first GIC_INTERNAL irqs.
210
+ */
211
+ offset += (GIC_INTERNAL * 1) / 8;
212
+ if (clroffset != 0) {
213
+ clroffset += (GIC_INTERNAL * 1) / 8;
214
+ }
215
+
216
for_each_dist_irq_reg(irq, s->num_irq, 1) {
217
/* If this bitmap is a set/clear register pair, first write to the
218
* clear-reg to clear all bits before using the set-reg to write
219
--
220
--
220
2.17.1
221
2.17.1
221
222
222
223
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
As of this commit, the Spec v1 is not working, and all controllers
3
Let's check if KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION is supported.
4
expect the cards to be conformant to Spec v2.
4
If not, we check the number of redist region is equal to 1 and use the
5
legacy KVM_VGIC_V3_ADDR_TYPE_REDIST attribute. Otherwise we use
6
the new attribute and allow to register multiple regions to the
7
KVM device.
5
8
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180607180641.874-4-f4bug@amsat.org
11
Reviewed-by: Andrew Jones <drjones@redhat.com>
12
Message-id: 1529072910-16156-5-git-send-email-eric.auger@redhat.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
14
---
11
include/hw/sd/sd.h | 5 +++++
15
hw/intc/arm_gicv3_kvm.c | 37 ++++++++++++++++++++++++++++++++++---
12
hw/sd/sd.c | 23 ++++++++++++++++++++---
16
1 file changed, 34 insertions(+), 3 deletions(-)
13
2 files changed, 25 insertions(+), 3 deletions(-)
14
17
15
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
18
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/sd/sd.h
20
--- a/hw/intc/arm_gicv3_kvm.c
18
+++ b/include/hw/sd/sd.h
21
+++ b/hw/intc/arm_gicv3_kvm.c
19
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
20
#define APP_CMD            (1 << 5)
23
{
21
#define AKE_SEQ_ERROR        (1 << 3)
24
GICv3State *s = KVM_ARM_GICV3(dev);
22
25
KVMARMGICv3Class *kgc = KVM_ARM_GICV3_GET_CLASS(s);
23
+enum SDPhySpecificationVersion {
26
+ bool multiple_redist_region_allowed;
24
+ SD_PHY_SPECv1_10_VERS = 1,
27
Error *local_err = NULL;
25
+ SD_PHY_SPECv2_00_VERS = 2,
28
int i;
26
+};
29
30
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
31
return;
32
}
33
34
+ multiple_redist_region_allowed =
35
+ kvm_device_check_attr(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
36
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION);
27
+
37
+
28
typedef enum {
38
+ if (!multiple_redist_region_allowed && s->nb_redist_regions > 1) {
29
SD_VOLTAGE_0_4V = 400, /* currently not supported */
39
+ error_setg(errp, "Multiple VGICv3 redistributor regions are not "
30
SD_VOLTAGE_1_8V = 1800,
40
+ "supported by this host kernel");
31
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
41
+ error_append_hint(errp, "A maximum of %d VCPUs can be used",
32
index XXXXXXX..XXXXXXX 100644
42
+ s->redist_region_count[0]);
33
--- a/hw/sd/sd.c
34
+++ b/hw/sd/sd.c
35
@@ -XXX,XX +XXX,XX @@
36
/*
37
* SD Memory Card emulation as defined in the "SD Memory Card Physical
38
- * layer specification, Version 1.10."
39
+ * layer specification, Version 2.00."
40
*
41
* Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
42
* Copyright (c) 2007 CodeSourcery
43
+ * Copyright (c) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
44
*
45
* Redistribution and use in source and binary forms, with or without
46
* modification, are permitted provided that the following conditions
47
@@ -XXX,XX +XXX,XX @@ struct SDState {
48
uint8_t sd_status[64];
49
50
/* Configurable properties */
51
+ uint8_t spec_version;
52
BlockBackend *blk;
53
bool spi;
54
55
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
56
57
static void sd_set_scr(SDState *sd)
58
{
59
- sd->scr[0] = (0 << 4) /* SCR structure version 1.0 */
60
- | 1; /* Spec Version 1.10 */
61
+ sd->scr[0] = 0 << 4; /* SCR structure version 1.0 */
62
+ if (sd->spec_version == SD_PHY_SPECv1_10_VERS) {
63
+ sd->scr[0] |= 1; /* Spec Version 1.10 */
64
+ } else {
65
+ sd->scr[0] |= 2; /* Spec Version 2.00 */
66
+ }
67
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
68
| 0b0101; /* 1-bit or 4-bit width bus modes */
69
sd->scr[2] = 0x00; /* Extended Security is not supported. */
70
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
71
72
sd->proto_name = sd->spi ? "SPI" : "SD";
73
74
+ switch (sd->spec_version) {
75
+ case SD_PHY_SPECv1_10_VERS
76
+ ... SD_PHY_SPECv2_00_VERS:
77
+ break;
78
+ default:
79
+ error_setg(errp, "Invalid SD card Spec version: %u", sd->spec_version);
80
+ return;
43
+ return;
81
+ }
44
+ }
82
+
45
+
83
if (sd->blk && blk_is_read_only(sd->blk)) {
46
kvm_device_access(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_NR_IRQS,
84
error_setg(errp, "Cannot use read-only drive as SD card");
47
0, &s->num_irq, true, &error_abort);
85
return;
48
86
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
49
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
87
}
50
88
51
kvm_arm_register_device(&s->iomem_dist, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
89
static Property sd_properties[] = {
52
KVM_VGIC_V3_ADDR_TYPE_DIST, s->dev_fd, 0);
90
+ DEFINE_PROP_UINT8("spec_version", SDState,
53
- kvm_arm_register_device(&s->iomem_redist[0], -1,
91
+ spec_version, SD_PHY_SPECv2_00_VERS),
54
- KVM_DEV_ARM_VGIC_GRP_ADDR,
92
DEFINE_PROP_DRIVE("drive", SDState, blk),
55
- KVM_VGIC_V3_ADDR_TYPE_REDIST, s->dev_fd, 0);
93
/* We do not model the chip select pin, so allow the board to select
56
+
94
* whether card should be in SSI or MMC/SD mode. It is also up to the
57
+ if (!multiple_redist_region_allowed) {
58
+ kvm_arm_register_device(&s->iomem_redist[0], -1,
59
+ KVM_DEV_ARM_VGIC_GRP_ADDR,
60
+ KVM_VGIC_V3_ADDR_TYPE_REDIST, s->dev_fd, 0);
61
+ } else {
62
+ /* we register regions in reverse order as "devices" are inserted at
63
+ * the head of a QSLIST and the list is then popped from the head
64
+ * onwards by kvm_arm_machine_init_done()
65
+ */
66
+ for (i = s->nb_redist_regions - 1; i >= 0; i--) {
67
+ /* Address mask made of the rdist region index and count */
68
+ uint64_t addr_ormask =
69
+ i | ((uint64_t)s->redist_region_count[i] << 52);
70
+
71
+ kvm_arm_register_device(&s->iomem_redist[i], -1,
72
+ KVM_DEV_ARM_VGIC_GRP_ADDR,
73
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION,
74
+ s->dev_fd, addr_ormask);
75
+ }
76
+ }
77
78
if (kvm_has_gsi_routing()) {
79
/* set up irq routing */
95
--
80
--
96
2.17.1
81
2.17.1
97
82
98
83
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
The initial implementation is based on the Specs v1.10 (see a1bb27b1e98).
3
This patch allows the creation of a GICv3 node with 1 or 2
4
redistributor regions depending on the number of smu_cpus.
5
The second redistributor region is located just after the
6
existing RAM region, at 256GB and contains up to up to 512 vcpus.
4
7
5
However the SCR is anouncing the card being v1.01.
8
Please refer to kernel documentation for further node details:
9
Documentation/devicetree/bindings/interrupt-controller/arm,gic-v3.txt
6
10
7
The new chapters added in version 1.10 are:
11
Signed-off-by: Eric Auger <eric.auger@redhat.com>
8
12
Reviewed-by: Andrew Jones <drjones@redhat.com>
9
4.3.10 Switch function command
13
Message-id: 1529072910-16156-6-git-send-email-eric.auger@redhat.com
10
11
Switch function command (CMD6) 1 is used to switch or expand
12
memory card functions. [...]
13
This is a new feature, introduced in SD physical Layer
14
Specification Version 1.10. Therefore, cards that are
15
compatible with earlier versions of the spec do not support
16
it. The host shall check the "SD_SPEC" field in the SCR
17
register to recognize what version of the spec the card
18
complies with before using CMD6. It is mandatory for SD
19
memory card of Ver1.10 to support CMD6.
20
21
4.3.11 High-Speed mode (25MB/sec interface speed)
22
23
Though the Rev 1.01 SD memory card supports up to 12.5MB/sec
24
interface speed, the speed of 25MB/sec is necessary to support
25
increasing performance needs of the host and because of memory
26
size which continues to grow.
27
To achieve 25MB/sec interface speed, clock rate is increased to
28
50MHz and CLK/CMD/DAT signal timing and circuit conditions are
29
reconsidered and changed from Physical Layer Specification
30
Version 1.01.
31
32
4.3.12 Command system (This chapter is newly added in version 1.10)
33
34
SD commands CMD34-37, CMD50, CMD57 are reserved for SD command
35
system expansion via the switch command.
36
[These commands] will be considered as illegal commands (as
37
defined in revision 1.01 of the SD physical layer specification).
38
39
The SWITCH_FUNCTION is implemented since the first commit, a1bb27b1e98.
40
41
The 25MB/sec High-Speed mode was already updated in d7ecb867529.
42
43
The current implementation does not implements CMD34-37, CMD50 and
44
CMD57, thus these commands already return ILLEGAL.
45
46
With this patch, the SCR register now matches the description of the header:
47
48
* SD Memory Card emulation as defined in the "SD Memory Card Physical
49
* layer specification, Version 1.10."
50
51
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
52
Message-id: 20180607180641.874-2-f4bug@amsat.org
53
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
54
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
55
---
15
---
56
hw/sd/sd.c | 4 ++--
16
include/hw/arm/virt.h | 14 ++++++++++++++
57
1 file changed, 2 insertions(+), 2 deletions(-)
17
hw/arm/virt.c | 29 ++++++++++++++++++++++++-----
18
2 files changed, 38 insertions(+), 5 deletions(-)
58
19
59
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
20
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
60
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/sd/sd.c
22
--- a/include/hw/arm/virt.h
62
+++ b/hw/sd/sd.c
23
+++ b/include/hw/arm/virt.h
63
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
24
@@ -XXX,XX +XXX,XX @@
64
25
#include "qemu/notify.h"
65
static void sd_set_scr(SDState *sd)
26
#include "hw/boards.h"
66
{
27
#include "hw/arm/arm.h"
67
- sd->scr[0] = (0 << 4) /* SCR version 1.0 */
28
+#include "sysemu/kvm.h"
68
- | 0; /* Spec Versions 1.0 and 1.01 */
29
+#include "hw/intc/arm_gicv3_common.h"
69
+ sd->scr[0] = (0 << 4) /* SCR structure version 1.0 */
30
70
+ | 1; /* Spec Version 1.10 */
31
#define NUM_GICV2M_SPIS 64
71
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
32
#define NUM_VIRTIO_TRANSPORTS 32
72
| 0b0101; /* 1-bit or 4-bit width bus modes */
33
@@ -XXX,XX +XXX,XX @@ enum {
73
sd->scr[2] = 0x00; /* Extended Security is not supported. */
34
VIRT_GIC_V2M,
35
VIRT_GIC_ITS,
36
VIRT_GIC_REDIST,
37
+ VIRT_GIC_REDIST2,
38
VIRT_SMMU,
39
VIRT_UART,
40
VIRT_MMIO,
41
@@ -XXX,XX +XXX,XX @@ typedef struct {
42
43
void virt_acpi_setup(VirtMachineState *vms);
44
45
+/* Return the number of used redistributor regions */
46
+static inline int virt_gicv3_redist_region_count(VirtMachineState *vms)
47
+{
48
+ uint32_t redist0_capacity =
49
+ vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;
50
+
51
+ assert(vms->gic_version == 3);
52
+
53
+ return vms->smp_cpus > redist0_capacity ? 2 : 1;
54
+}
55
+
56
#endif /* QEMU_ARM_VIRT_H */
57
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/arm/virt.c
60
+++ b/hw/arm/virt.c
61
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry a15memmap[] = {
62
[VIRT_PCIE_PIO] = { 0x3eff0000, 0x00010000 },
63
[VIRT_PCIE_ECAM] = { 0x3f000000, 0x01000000 },
64
[VIRT_MEM] = { 0x40000000, RAMLIMIT_BYTES },
65
+ /* Additional 64 MB redist region (can contain up to 512 redistributors) */
66
+ [VIRT_GIC_REDIST2] = { 0x4000000000ULL, 0x4000000 },
67
/* Second PCIe window, 512GB wide at the 512GB boundary */
68
[VIRT_PCIE_MMIO_HIGH] = { 0x8000000000ULL, 0x8000000000ULL },
69
};
70
@@ -XXX,XX +XXX,XX @@ static void fdt_add_gic_node(VirtMachineState *vms)
71
qemu_fdt_setprop_cell(vms->fdt, "/intc", "#size-cells", 0x2);
72
qemu_fdt_setprop(vms->fdt, "/intc", "ranges", NULL, 0);
73
if (vms->gic_version == 3) {
74
+ int nb_redist_regions = virt_gicv3_redist_region_count(vms);
75
+
76
qemu_fdt_setprop_string(vms->fdt, "/intc", "compatible",
77
"arm,gic-v3");
78
- qemu_fdt_setprop_sized_cells(vms->fdt, "/intc", "reg",
79
- 2, vms->memmap[VIRT_GIC_DIST].base,
80
- 2, vms->memmap[VIRT_GIC_DIST].size,
81
- 2, vms->memmap[VIRT_GIC_REDIST].base,
82
- 2, vms->memmap[VIRT_GIC_REDIST].size);
83
+
84
+ qemu_fdt_setprop_cell(vms->fdt, "/intc",
85
+ "#redistributor-regions", nb_redist_regions);
86
+
87
+ if (nb_redist_regions == 1) {
88
+ qemu_fdt_setprop_sized_cells(vms->fdt, "/intc", "reg",
89
+ 2, vms->memmap[VIRT_GIC_DIST].base,
90
+ 2, vms->memmap[VIRT_GIC_DIST].size,
91
+ 2, vms->memmap[VIRT_GIC_REDIST].base,
92
+ 2, vms->memmap[VIRT_GIC_REDIST].size);
93
+ } else {
94
+ qemu_fdt_setprop_sized_cells(vms->fdt, "/intc", "reg",
95
+ 2, vms->memmap[VIRT_GIC_DIST].base,
96
+ 2, vms->memmap[VIRT_GIC_DIST].size,
97
+ 2, vms->memmap[VIRT_GIC_REDIST].base,
98
+ 2, vms->memmap[VIRT_GIC_REDIST].size,
99
+ 2, vms->memmap[VIRT_GIC_REDIST2].base,
100
+ 2, vms->memmap[VIRT_GIC_REDIST2].size);
101
+ }
102
+
103
if (vms->virt) {
104
qemu_fdt_setprop_cells(vms->fdt, "/intc", "interrupts",
105
GIC_FDT_IRQ_TYPE_PPI, ARCH_GICV3_MAINT_IRQ,
74
--
106
--
75
2.17.1
107
2.17.1
76
108
77
109
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
The ftgmac100 NIC supports VLAN tag insertion and the MAC engine also
3
Depending on the number of smp_cpus we now register one or two
4
has a control to remove VLAN tags from received packets.
4
GICR structures.
5
5
6
The VLAN control bits and VLAN tag information are contained in the
6
Signed-off-by: Eric Auger <eric.auger@redhat.com>
7
second word of the transmit and receive descriptors. The Insert VLAN
7
Reviewed-by: Andrew Jones <drjones@redhat.com>
8
bit and the VLAN Tag available bit are only valid in the first segment
8
Message-id: 1529072910-16156-7-git-send-email-eric.auger@redhat.com
9
of the packet.
10
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180530061711.23673-3-clg@kaod.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
10
---
16
hw/net/ftgmac100.c | 31 ++++++++++++++++++++++++++++++-
11
hw/arm/virt-acpi-build.c | 9 +++++++++
17
1 file changed, 30 insertions(+), 1 deletion(-)
12
1 file changed, 9 insertions(+)
18
13
19
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
14
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/net/ftgmac100.c
16
--- a/hw/arm/virt-acpi-build.c
22
+++ b/hw/net/ftgmac100.c
17
+++ b/hw/arm/virt-acpi-build.c
23
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
18
@@ -XXX,XX +XXX,XX @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
24
break;
19
25
}
20
if (vms->gic_version == 3) {
26
21
AcpiMadtGenericTranslator *gic_its;
27
+ /* Check for VLAN */
22
+ int nb_redist_regions = virt_gicv3_redist_region_count(vms);
28
+ if (bd.des0 & FTGMAC100_TXDES0_FTS &&
23
AcpiMadtGenericRedistributor *gicr = acpi_data_push(table_data,
29
+ bd.des1 & FTGMAC100_TXDES1_INS_VLANTAG &&
24
sizeof *gicr);
30
+ be16_to_cpu(PKT_GET_ETH_HDR(ptr)->h_proto) != ETH_P_VLAN) {
25
31
+ if (frame_size + len + 4 > sizeof(s->frame)) {
26
@@ -XXX,XX +XXX,XX @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
32
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %d bytes\n",
27
gicr->base_address = cpu_to_le64(memmap[VIRT_GIC_REDIST].base);
33
+ __func__, len);
28
gicr->range_length = cpu_to_le32(memmap[VIRT_GIC_REDIST].size);
34
+ s->isr |= FTGMAC100_INT_XPKT_LOST;
29
35
+ len = sizeof(s->frame) - frame_size - 4;
30
+ if (nb_redist_regions == 2) {
36
+ }
31
+ gicr = acpi_data_push(table_data, sizeof(*gicr));
37
+ memmove(ptr + 16, ptr + 12, len - 12);
32
+ gicr->type = ACPI_APIC_GENERIC_REDISTRIBUTOR;
38
+ stw_be_p(ptr + 12, ETH_P_VLAN);
33
+ gicr->length = sizeof(*gicr);
39
+ stw_be_p(ptr + 14, bd.des1);
34
+ gicr->base_address = cpu_to_le64(memmap[VIRT_GIC_REDIST2].base);
40
+ len += 4;
35
+ gicr->range_length = cpu_to_le32(memmap[VIRT_GIC_REDIST2].size);
41
+ }
36
+ }
42
+
37
+
43
ptr += len;
38
if (its_class_name() && !vmc->no_its) {
44
frame_size += len;
39
gic_its = acpi_data_push(table_data, sizeof *gic_its);
45
if (bd.des0 & FTGMAC100_TXDES0_LTS) {
40
gic_its->type = ACPI_APIC_GENERIC_TRANSLATOR;
46
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
47
buf_len += size - 4;
48
}
49
buf_addr = bd.des3;
50
- dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
51
+ if (first && proto == ETH_P_VLAN && buf_len >= 18) {
52
+ bd.des1 = lduw_be_p(buf + 14) | FTGMAC100_RXDES1_VLANTAG_AVAIL;
53
+
54
+ if (s->maccr & FTGMAC100_MACCR_RM_VLAN) {
55
+ dma_memory_write(&address_space_memory, buf_addr, buf, 12);
56
+ dma_memory_write(&address_space_memory, buf_addr + 12, buf + 16,
57
+ buf_len - 16);
58
+ } else {
59
+ dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
60
+ }
61
+ } else {
62
+ bd.des1 = 0;
63
+ dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
64
+ }
65
buf += buf_len;
66
if (size < 4) {
67
dma_memory_write(&address_space_memory, buf_addr + buf_len,
68
--
41
--
69
2.17.1
42
2.17.1
70
43
71
44
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
This is a ethernet wire limitation not needed in emulation. It breaks
3
With a VGICv3 KVM device, if the number of vcpus exceeds the
4
U-Boot n/w stack also.
4
capacity of the legacy redistributor region (123 redistributors),
5
we now attempt to register a second redistributor region. Up to
6
512 redistributors can fit in this latter on top of the 123 allowed
7
by the legacy redistributor region.
5
8
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Registering this second redistributor region is possible if the
7
Message-id: 20180530061711.23673-5-clg@kaod.org
10
host kernel supports the following VGICv3 KVM device group/attribute:
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
KVM_DEV_ARM_VGIC_GRP_ADDR/KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION.
12
13
In case the host kernel does not support the registration of several
14
redistributor regions and the requested number of vcpus exceeds the
15
capacity of the legacy redistributor region, the GICv3 device
16
initialization fails with a proper error message and qemu exits.
17
18
At the moment the max number of vcpus still is capped by the
19
virt machine class max_cpus.
20
21
Signed-off-by: Eric Auger <eric.auger@redhat.com>
22
Reviewed-by: Andrew Jones <drjones@redhat.com>
23
Message-id: 1529072910-16156-8-git-send-email-eric.auger@redhat.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
25
---
11
hw/net/ftgmac100.c | 6 ------
26
hw/arm/virt.c | 18 +++++++++++++++++-
12
1 file changed, 6 deletions(-)
27
1 file changed, 17 insertions(+), 1 deletion(-)
13
28
14
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
29
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
15
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/net/ftgmac100.c
31
--- a/hw/arm/virt.c
17
+++ b/hw/net/ftgmac100.c
32
+++ b/hw/arm/virt.c
18
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
33
@@ -XXX,XX +XXX,XX @@ static void create_gic(VirtMachineState *vms, qemu_irq *pic)
19
return size;
34
SysBusDevice *gicbusdev;
35
const char *gictype;
36
int type = vms->gic_version, i;
37
+ uint32_t nb_redist_regions = 0;
38
39
gictype = (type == 3) ? gicv3_class_name() : gic_class_name();
40
41
@@ -XXX,XX +XXX,XX @@ static void create_gic(VirtMachineState *vms, qemu_irq *pic)
42
vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;
43
uint32_t redist0_count = MIN(smp_cpus, redist0_capacity);
44
45
- qdev_prop_set_uint32(gicdev, "len-redist-region-count", 1);
46
+ nb_redist_regions = virt_gicv3_redist_region_count(vms);
47
+
48
+ qdev_prop_set_uint32(gicdev, "len-redist-region-count",
49
+ nb_redist_regions);
50
qdev_prop_set_uint32(gicdev, "redist-region-count[0]", redist0_count);
51
+
52
+ if (nb_redist_regions == 2) {
53
+ uint32_t redist1_capacity =
54
+ vms->memmap[VIRT_GIC_REDIST2].size / GICV3_REDIST_SIZE;
55
+
56
+ qdev_prop_set_uint32(gicdev, "redist-region-count[1]",
57
+ MIN(smp_cpus - redist0_count, redist1_capacity));
58
+ }
20
}
59
}
21
60
qdev_init_nofail(gicdev);
22
- if (size < 64 && !(s->maccr & FTGMAC100_MACCR_RX_RUNT)) {
61
gicbusdev = SYS_BUS_DEVICE(gicdev);
23
- qemu_log_mask(LOG_GUEST_ERROR, "%s: dropped runt frame of %zd bytes\n",
62
sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base);
24
- __func__, size);
63
if (type == 3) {
25
- return size;
64
sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_REDIST].base);
26
- }
65
+ if (nb_redist_regions == 2) {
27
-
66
+ sysbus_mmio_map(gicbusdev, 2, vms->memmap[VIRT_GIC_REDIST2].base);
28
if (!ftgmac100_filter(s, buf, size)) {
67
+ }
29
return size;
68
} else {
69
sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_CPU].base);
70
}
71
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
72
*/
73
if (vms->gic_version == 3) {
74
virt_max_cpus = vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;
75
+ virt_max_cpus += vms->memmap[VIRT_GIC_REDIST2].size / GICV3_REDIST_SIZE;
76
} else {
77
virt_max_cpus = GIC_NCPU;
30
}
78
}
31
--
79
--
32
2.17.1
80
2.17.1
33
81
34
82
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
The pca9552 LED blinkers on the Witherspoon machine are used for leds
3
This patch defines a new ECAM region located after the 256GB limit.
4
but also as GPIOs to control fans and GPUs.
5
4
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
The virt machine state is augmented with a new highmem_ecam field
7
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
6
which guards the usage of this new ECAM region instead of the legacy
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
16MB one. With the highmem ECAM region, up to 256 PCIe buses can be
9
Message-id: 20180530064049.27976-8-clg@kaod.org
8
used.
9
10
Signed-off-by: Eric Auger <eric.auger@redhat.com>
11
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
12
Reviewed-by: Andrew Jones <drjones@redhat.com>
13
Message-id: 1529072910-16156-9-git-send-email-eric.auger@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
15
---
12
hw/arm/aspeed.c | 4 ++++
16
include/hw/arm/virt.h | 4 ++++
13
1 file changed, 4 insertions(+)
17
hw/arm/virt-acpi-build.c | 21 +++++++++++++--------
18
hw/arm/virt.c | 12 ++++++++----
19
3 files changed, 25 insertions(+), 12 deletions(-)
14
20
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
21
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
16
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed.c
23
--- a/include/hw/arm/virt.h
18
+++ b/hw/arm/aspeed.c
24
+++ b/include/hw/arm/virt.h
19
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
25
@@ -XXX,XX +XXX,XX @@ enum {
20
AspeedSoCState *soc = &bmc->soc;
26
VIRT_PCIE_MMIO,
21
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
27
VIRT_PCIE_PIO,
22
28
VIRT_PCIE_ECAM,
23
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 3), "pca9552", 0x60);
29
+ VIRT_PCIE_ECAM_HIGH,
30
VIRT_PLATFORM_BUS,
31
VIRT_PCIE_MMIO_HIGH,
32
VIRT_GPIO,
33
@@ -XXX,XX +XXX,XX @@ typedef struct {
34
FWCfgState *fw_cfg;
35
bool secure;
36
bool highmem;
37
+ bool highmem_ecam;
38
bool its;
39
bool virt;
40
int32_t gic_version;
41
@@ -XXX,XX +XXX,XX @@ typedef struct {
42
int psci_conduit;
43
} VirtMachineState;
44
45
+#define VIRT_ECAM_ID(high) (high ? VIRT_PCIE_ECAM_HIGH : VIRT_PCIE_ECAM)
24
+
46
+
25
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
47
#define TYPE_VIRT_MACHINE MACHINE_TYPE_NAME("virt")
26
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
48
#define VIRT_MACHINE(obj) \
27
49
OBJECT_CHECK(VirtMachineState, (obj), TYPE_VIRT_MACHINE)
28
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
50
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
29
51
index XXXXXXX..XXXXXXX 100644
30
smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), 0x51,
52
--- a/hw/arm/virt-acpi-build.c
31
eeprom_buf);
53
+++ b/hw/arm/virt-acpi-build.c
32
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "pca9552",
54
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_virtio(Aml *scope,
33
+ 0x60);
34
}
55
}
35
56
36
static void witherspoon_bmc_init(MachineState *machine)
57
static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
58
- uint32_t irq, bool use_highmem)
59
+ uint32_t irq, bool use_highmem, bool highmem_ecam)
60
{
61
+ int ecam_id = VIRT_ECAM_ID(highmem_ecam);
62
Aml *method, *crs, *ifctx, *UUID, *ifctx1, *elsectx, *buf;
63
int i, bus_no;
64
hwaddr base_mmio = memmap[VIRT_PCIE_MMIO].base;
65
hwaddr size_mmio = memmap[VIRT_PCIE_MMIO].size;
66
hwaddr base_pio = memmap[VIRT_PCIE_PIO].base;
67
hwaddr size_pio = memmap[VIRT_PCIE_PIO].size;
68
- hwaddr base_ecam = memmap[VIRT_PCIE_ECAM].base;
69
- hwaddr size_ecam = memmap[VIRT_PCIE_ECAM].size;
70
+ hwaddr base_ecam = memmap[ecam_id].base;
71
+ hwaddr size_ecam = memmap[ecam_id].size;
72
int nr_pcie_buses = size_ecam / PCIE_MMCFG_SIZE_MIN;
73
74
Aml *dev = aml_device("%s", "PCI0");
75
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
76
aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
77
78
/* Declare the PCI Routing Table. */
79
- Aml *rt_pkg = aml_package(nr_pcie_buses * PCI_NUM_PINS);
80
+ Aml *rt_pkg = aml_varpackage(nr_pcie_buses * PCI_NUM_PINS);
81
for (bus_no = 0; bus_no < nr_pcie_buses; bus_no++) {
82
for (i = 0; i < PCI_NUM_PINS; i++) {
83
int gsi = (i + bus_no) % PCI_NUM_PINS;
84
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
85
Aml *dev_res0 = aml_device("%s", "RES0");
86
aml_append(dev_res0, aml_name_decl("_HID", aml_string("PNP0C02")));
87
crs = aml_resource_template();
88
- aml_append(crs, aml_memory32_fixed(base_ecam, size_ecam, AML_READ_WRITE));
89
+ aml_append(crs,
90
+ aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED,
91
+ AML_NON_CACHEABLE, AML_READ_WRITE, 0x0000, base_ecam,
92
+ base_ecam + size_ecam - 1, 0x0000, size_ecam));
93
aml_append(dev_res0, aml_name_decl("_CRS", crs));
94
aml_append(dev, dev_res0);
95
aml_append(scope, dev);
96
@@ -XXX,XX +XXX,XX @@ build_mcfg(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
97
{
98
AcpiTableMcfg *mcfg;
99
const MemMapEntry *memmap = vms->memmap;
100
+ int ecam_id = VIRT_ECAM_ID(vms->highmem_ecam);
101
int len = sizeof(*mcfg) + sizeof(mcfg->allocation[0]);
102
int mcfg_start = table_data->len;
103
104
mcfg = acpi_data_push(table_data, len);
105
- mcfg->allocation[0].address = cpu_to_le64(memmap[VIRT_PCIE_ECAM].base);
106
+ mcfg->allocation[0].address = cpu_to_le64(memmap[ecam_id].base);
107
108
/* Only a single allocation so no need to play with segments */
109
mcfg->allocation[0].pci_segment = cpu_to_le16(0);
110
mcfg->allocation[0].start_bus_number = 0;
111
- mcfg->allocation[0].end_bus_number = (memmap[VIRT_PCIE_ECAM].size
112
+ mcfg->allocation[0].end_bus_number = (memmap[ecam_id].size
113
/ PCIE_MMCFG_SIZE_MIN) - 1;
114
115
build_header(linker, table_data, (void *)(table_data->data + mcfg_start),
116
@@ -XXX,XX +XXX,XX @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
117
acpi_dsdt_add_virtio(scope, &memmap[VIRT_MMIO],
118
(irqmap[VIRT_MMIO] + ARM_SPI_BASE), NUM_VIRTIO_TRANSPORTS);
119
acpi_dsdt_add_pci(scope, memmap, (irqmap[VIRT_PCIE] + ARM_SPI_BASE),
120
- vms->highmem);
121
+ vms->highmem, vms->highmem_ecam);
122
acpi_dsdt_add_gpio(scope, &memmap[VIRT_GPIO],
123
(irqmap[VIRT_GPIO] + ARM_SPI_BASE));
124
acpi_dsdt_add_power_button(scope);
125
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
126
index XXXXXXX..XXXXXXX 100644
127
--- a/hw/arm/virt.c
128
+++ b/hw/arm/virt.c
129
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry a15memmap[] = {
130
[VIRT_MEM] = { 0x40000000, RAMLIMIT_BYTES },
131
/* Additional 64 MB redist region (can contain up to 512 redistributors) */
132
[VIRT_GIC_REDIST2] = { 0x4000000000ULL, 0x4000000 },
133
+ [VIRT_PCIE_ECAM_HIGH] = { 0x4010000000ULL, 0x10000000 },
134
/* Second PCIe window, 512GB wide at the 512GB boundary */
135
[VIRT_PCIE_MMIO_HIGH] = { 0x8000000000ULL, 0x8000000000ULL },
136
};
137
@@ -XXX,XX +XXX,XX @@ static void create_pcie(VirtMachineState *vms, qemu_irq *pic)
138
hwaddr size_mmio_high = vms->memmap[VIRT_PCIE_MMIO_HIGH].size;
139
hwaddr base_pio = vms->memmap[VIRT_PCIE_PIO].base;
140
hwaddr size_pio = vms->memmap[VIRT_PCIE_PIO].size;
141
- hwaddr base_ecam = vms->memmap[VIRT_PCIE_ECAM].base;
142
- hwaddr size_ecam = vms->memmap[VIRT_PCIE_ECAM].size;
143
+ hwaddr base_ecam, size_ecam;
144
hwaddr base = base_mmio;
145
- int nr_pcie_buses = size_ecam / PCIE_MMCFG_SIZE_MIN;
146
+ int nr_pcie_buses;
147
int irq = vms->irqmap[VIRT_PCIE];
148
MemoryRegion *mmio_alias;
149
MemoryRegion *mmio_reg;
150
@@ -XXX,XX +XXX,XX @@ static void create_pcie(VirtMachineState *vms, qemu_irq *pic)
151
MemoryRegion *ecam_reg;
152
DeviceState *dev;
153
char *nodename;
154
- int i;
155
+ int i, ecam_id;
156
PCIHostState *pci;
157
158
dev = qdev_create(NULL, TYPE_GPEX_HOST);
159
qdev_init_nofail(dev);
160
161
+ ecam_id = VIRT_ECAM_ID(vms->highmem_ecam);
162
+ base_ecam = vms->memmap[ecam_id].base;
163
+ size_ecam = vms->memmap[ecam_id].size;
164
+ nr_pcie_buses = size_ecam / PCIE_MMCFG_SIZE_MIN;
165
/* Map only the first size_ecam bytes of ECAM space */
166
ecam_alias = g_new0(MemoryRegion, 1);
167
ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
37
--
168
--
38
2.17.1
169
2.17.1
39
170
40
171
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Add virt-3.0 machine type.
4
Message-id: 20180606152128.449-11-f4bug@amsat.org
4
5
Signed-off-by: Eric Auger <eric.auger@redhat.com>
6
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
7
Reviewed-by: Andrew Jones <drjones@redhat.com>
8
Message-id: 1529072910-16156-10-git-send-email-eric.auger@redhat.com
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
10
---
7
target/riscv/op_helper.c | 6 ++++--
11
hw/arm/virt.c | 15 +++++++++++++--
8
1 file changed, 4 insertions(+), 2 deletions(-)
12
1 file changed, 13 insertions(+), 2 deletions(-)
9
13
10
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
14
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
11
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
12
--- a/target/riscv/op_helper.c
16
--- a/hw/arm/virt.c
13
+++ b/target/riscv/op_helper.c
17
+++ b/hw/arm/virt.c
14
@@ -XXX,XX +XXX,XX @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
18
@@ -XXX,XX +XXX,XX @@ type_init(machvirt_machine_init);
15
if ((val_to_write & 3) == 0) {
19
#define VIRT_COMPAT_2_12 \
16
env->stvec = val_to_write >> 2 << 2;
20
HW_COMPAT_2_12
17
} else {
21
18
- qemu_log_mask(LOG_UNIMP, "CSR_STVEC: vectored traps not supported");
22
-static void virt_2_12_instance_init(Object *obj)
19
+ qemu_log_mask(LOG_UNIMP,
23
+static void virt_3_0_instance_init(Object *obj)
20
+ "CSR_STVEC: vectored traps not supported\n");
24
{
21
}
25
VirtMachineState *vms = VIRT_MACHINE(obj);
22
break;
26
VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
23
case CSR_SCOUNTEREN:
27
@@ -XXX,XX +XXX,XX @@ static void virt_2_12_instance_init(Object *obj)
24
@@ -XXX,XX +XXX,XX @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
28
vms->irqmap = a15irqmap;
25
if ((val_to_write & 3) == 0) {
29
}
26
env->mtvec = val_to_write >> 2 << 2;
30
27
} else {
31
+static void virt_machine_3_0_options(MachineClass *mc)
28
- qemu_log_mask(LOG_UNIMP, "CSR_MTVEC: vectored traps not supported");
32
+{
29
+ qemu_log_mask(LOG_UNIMP,
33
+}
30
+ "CSR_MTVEC: vectored traps not supported\n");
34
+DEFINE_VIRT_MACHINE_AS_LATEST(3, 0)
31
}
35
+
32
break;
36
+static void virt_2_12_instance_init(Object *obj)
33
case CSR_MCOUNTEREN:
37
+{
38
+ virt_3_0_instance_init(obj);
39
+}
40
+
41
static void virt_machine_2_12_options(MachineClass *mc)
42
{
43
+ virt_machine_3_0_options(mc);
44
SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_12);
45
}
46
-DEFINE_VIRT_MACHINE_AS_LATEST(2, 12)
47
+DEFINE_VIRT_MACHINE(2, 12)
48
49
#define VIRT_COMPAT_2_11 \
50
HW_COMPAT_2_11
34
--
51
--
35
2.17.1
52
2.17.1
36
53
37
54
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
With this patch, virt-3.0 machine uses a new 256MB ECAM region
4
Acked-by: David Gibson <david@gibson.dropbear.id.au>
4
by default instead of the legacy 16MB one, if highmem is set
5
Message-id: 20180606152128.449-5-f4bug@amsat.org
5
(LPAE supported by the guest) and (!firmware_loaded || aarch64).
6
7
Indeed aarch32 mode FW may not support this high ECAM region.
8
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
10
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
11
Reviewed-by: Andrew Jones <drjones@redhat.com>
12
Message-id: 1529072910-16156-11-git-send-email-eric.auger@redhat.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
14
---
8
hw/ppc/pnv_core.c | 4 ++--
15
include/hw/arm/virt.h | 1 +
9
1 file changed, 2 insertions(+), 2 deletions(-)
16
hw/arm/virt.c | 10 ++++++++++
17
2 files changed, 11 insertions(+)
10
18
11
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
19
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
12
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/ppc/pnv_core.c
21
--- a/include/hw/arm/virt.h
14
+++ b/hw/ppc/pnv_core.c
22
+++ b/include/hw/arm/virt.h
15
@@ -XXX,XX +XXX,XX @@ static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr,
23
@@ -XXX,XX +XXX,XX @@ typedef struct {
16
val = 0x24f000000000000ull;
24
bool no_pmu;
17
break;
25
bool claim_edge_triggered_timers;
18
default:
26
bool smbios_old_sys_ver;
19
- qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx,
27
+ bool no_highmem_ecam;
20
+ qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx "\n",
28
} VirtMachineClass;
21
addr);
29
30
typedef struct {
31
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/arm/virt.c
34
+++ b/hw/arm/virt.c
35
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
36
int n, virt_max_cpus;
37
MemoryRegion *ram = g_new(MemoryRegion, 1);
38
bool firmware_loaded = bios_name || drive_get(IF_PFLASH, 0, 0);
39
+ bool aarch64 = true;
40
41
/* We can probe only here because during property set
42
* KVM is not available yet
43
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
44
numa_cpu_pre_plug(&possible_cpus->cpus[cs->cpu_index], DEVICE(cpuobj),
45
&error_fatal);
46
47
+ aarch64 &= object_property_get_bool(cpuobj, "aarch64", NULL);
48
+
49
if (!vms->secure) {
50
object_property_set_bool(cpuobj, false, "has_el3", NULL);
51
}
52
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
53
create_uart(vms, pic, VIRT_SECURE_UART, secure_sysmem, serial_hd(1));
22
}
54
}
23
55
24
@@ -XXX,XX +XXX,XX @@ static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr,
56
+ vms->highmem_ecam &= vms->highmem && (!firmware_loaded || aarch64);
25
static void pnv_core_xscom_write(void *opaque, hwaddr addr, uint64_t val,
57
+
26
unsigned int width)
58
create_rtc(vms, pic);
59
60
create_pcie(vms, pic);
61
@@ -XXX,XX +XXX,XX @@ static void virt_3_0_instance_init(Object *obj)
62
"Set GIC version. "
63
"Valid values are 2, 3 and host", NULL);
64
65
+ vms->highmem_ecam = !vmc->no_highmem_ecam;
66
+
67
if (vmc->no_its) {
68
vms->its = false;
69
} else {
70
@@ -XXX,XX +XXX,XX @@ static void virt_2_12_instance_init(Object *obj)
71
72
static void virt_machine_2_12_options(MachineClass *mc)
27
{
73
{
28
- qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx,
74
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
29
+ qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx "\n",
75
+
30
addr);
76
virt_machine_3_0_options(mc);
77
SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_12);
78
+ vmc->no_highmem_ecam = true;
31
}
79
}
80
DEFINE_VIRT_MACHINE(2, 12)
32
81
33
--
82
--
34
2.17.1
83
2.17.1
35
84
36
85
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
virt 3.0 now allows up to 512 vcpus whereas for earlier machine
4
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
4
types, max_cpus was set to 255 and any attempt to start the
5
Message-id: 20180606152128.449-10-f4bug@amsat.org
5
machine with vcpus > 255 was rejected at a very early stage,
6
in vl.c/main level.
7
8
512 is the max supported by KVM. Anyway the actual vcpu count
9
that can be achieved depends on other parameters such as the
10
acceleration mode, the vgic version, the host kernel version.
11
Those are discovered later on.
12
13
Signed-off-by: Eric Auger <eric.auger@redhat.com>
14
Reviewed-by: Andrew Jones <drjones@redhat.com>
15
Message-id: 1529072910-16156-12-git-send-email-eric.auger@redhat.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
17
---
8
target/m68k/translate.c | 2 +-
18
hw/arm/virt.c | 7 ++++---
9
1 file changed, 1 insertion(+), 1 deletion(-)
19
1 file changed, 4 insertions(+), 3 deletions(-)
10
20
11
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
21
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
12
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
13
--- a/target/m68k/translate.c
23
--- a/hw/arm/virt.c
14
+++ b/target/m68k/translate.c
24
+++ b/hw/arm/virt.c
15
@@ -XXX,XX +XXX,XX @@ DISAS_INSN(undef)
25
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
16
/* ??? This is both instructions that are as yet unimplemented
26
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
17
for the 680x0 series, as well as those that are implemented
27
18
but actually illegal for CPU32 or pre-68020. */
28
mc->init = machvirt_init;
19
- qemu_log_mask(LOG_UNIMP, "Illegal instruction: %04x @ %08x",
29
- /* Start max_cpus at the maximum QEMU supports. We'll further restrict
20
+ qemu_log_mask(LOG_UNIMP, "Illegal instruction: %04x @ %08x\n",
30
- * it later in machvirt_init, where we have more information about the
21
insn, s->insn_pc);
31
+ /* Start with max_cpus set to 512, which is the maximum supported by KVM.
22
gen_exception(s, s->insn_pc, EXCP_UNSUPPORTED);
32
+ * The value may be reduced later when we have more information about the
33
* configuration of the particular instance.
34
*/
35
- mc->max_cpus = 255;
36
+ mc->max_cpus = 512;
37
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_CALXEDA_XGMAC);
38
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE);
39
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
40
@@ -XXX,XX +XXX,XX @@ static void virt_machine_2_12_options(MachineClass *mc)
41
virt_machine_3_0_options(mc);
42
SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_12);
43
vmc->no_highmem_ecam = true;
44
+ mc->max_cpus = 255;
23
}
45
}
46
DEFINE_VIRT_MACHINE(2, 12)
47
24
--
48
--
25
2.17.1
49
2.17.1
26
50
27
51
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Add the Cortex-R5F with the optional FPU enabled.
4
Message-id: 20180606152128.449-9-f4bug@amsat.org
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
10
Message-id: 20180529124707.3025-2-edgar.iglesias@gmail.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
target/arm/helper.c | 4 ++--
13
target/arm/cpu.c | 9 +++++++++
9
1 file changed, 2 insertions(+), 2 deletions(-)
14
1 file changed, 9 insertions(+)
10
15
11
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/helper.c
18
--- a/target/arm/cpu.c
14
+++ b/target/arm/helper.c
19
+++ b/target/arm/cpu.c
15
@@ -XXX,XX +XXX,XX @@ void hw_breakpoint_update(ARMCPU *cpu, int n)
20
@@ -XXX,XX +XXX,XX @@ static void cortex_r5_initfn(Object *obj)
16
case 4: /* unlinked address mismatch (reserved if AArch64) */
21
define_arm_cp_regs(cpu, cortexr5_cp_reginfo);
17
case 5: /* linked address mismatch (reserved if AArch64) */
22
}
18
qemu_log_mask(LOG_UNIMP,
23
19
- "arm: address mismatch breakpoint types not implemented");
24
+static void cortex_r5f_initfn(Object *obj)
20
+ "arm: address mismatch breakpoint types not implemented\n");
25
+{
21
return;
26
+ ARMCPU *cpu = ARM_CPU(obj);
22
case 0: /* unlinked address match */
27
+
23
case 1: /* linked address match */
28
+ cortex_r5_initfn(obj);
24
@@ -XXX,XX +XXX,XX @@ void hw_breakpoint_update(ARMCPU *cpu, int n)
29
+ set_feature(&cpu->env, ARM_FEATURE_VFP3);
25
case 8: /* unlinked VMID match (reserved if no EL2) */
30
+}
26
case 10: /* unlinked context ID and VMID match (reserved if no EL2) */
31
+
27
qemu_log_mask(LOG_UNIMP,
32
static const ARMCPRegInfo cortexa8_cp_reginfo[] = {
28
- "arm: unlinked context breakpoint types not implemented");
33
{ .name = "L2LOCKDOWN", .cp = 15, .crn = 9, .crm = 0, .opc1 = 1, .opc2 = 0,
29
+ "arm: unlinked context breakpoint types not implemented\n");
34
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
30
return;
35
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo arm_cpus[] = {
31
case 9: /* linked VMID match (reserved if no EL2) */
36
{ .name = "cortex-m33", .initfn = cortex_m33_initfn,
32
case 11: /* linked context ID and VMID match (reserved if no EL2) */
37
.class_init = arm_v7m_class_init },
38
{ .name = "cortex-r5", .initfn = cortex_r5_initfn },
39
+ { .name = "cortex-r5f", .initfn = cortex_r5f_initfn },
40
{ .name = "cortex-a7", .initfn = cortex_a7_initfn },
41
{ .name = "cortex-a8", .initfn = cortex_a8_initfn },
42
{ .name = "cortex-a9", .initfn = cortex_a9_initfn },
33
--
43
--
34
2.17.1
44
2.17.1
35
45
36
46
diff view generated by jsdifflib
1
From: Thomas Huth <thuth@redhat.com>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
It has been marked as deprecated since QEMU v2.11, so it is time to
3
The ZynqMP has Cortex-R5Fs with the optional FPU enabled.
4
remove this now. The xlnx-zcu102 machine is very much the same and
5
can be used as a replacement instead.
6
4
7
Signed-off-by: Thomas Huth <thuth@redhat.com>
5
Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
10
Message-id: 20180529124707.3025-3-edgar.iglesias@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
12
---
11
hw/arm/xlnx-zcu102.c | 62 ++------------------------------------------
13
hw/arm/xlnx-zcu102.c | 2 +-
12
qemu-doc.texi | 5 ----
14
hw/arm/xlnx-zynqmp.c | 2 +-
13
2 files changed, 2 insertions(+), 65 deletions(-)
15
2 files changed, 2 insertions(+), 2 deletions(-)
14
16
15
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
17
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-zcu102.c
19
--- a/hw/arm/xlnx-zcu102.c
18
+++ b/hw/arm/xlnx-zcu102.c
20
+++ b/hw/arm/xlnx-zcu102.c
19
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZCU102 {
21
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
20
#define ZCU102_MACHINE(obj) \
21
OBJECT_CHECK(XlnxZCU102, (obj), TYPE_ZCU102_MACHINE)
22
23
-#define TYPE_EP108_MACHINE MACHINE_TYPE_NAME("xlnx-ep108")
24
-#define EP108_MACHINE(obj) \
25
- OBJECT_CHECK(XlnxZCU102, (obj), TYPE_EP108_MACHINE)
26
-
27
static struct arm_boot_info xlnx_zcu102_binfo;
28
29
static bool zcu102_get_secure(Object *obj, Error **errp)
30
@@ -XXX,XX +XXX,XX @@ static void zcu102_set_virt(Object *obj, bool value, Error **errp)
31
s->virt = value;
32
}
33
34
-static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
35
+static void xlnx_zcu102_init(MachineState *machine)
36
{
22
{
37
+ XlnxZCU102 *s = ZCU102_MACHINE(machine);
23
MachineClass *mc = MACHINE_CLASS(oc);
38
int i;
24
39
uint64_t ram_size = machine->ram_size;
25
- mc->desc = "Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5s based on " \
40
26
+ mc->desc = "Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5Fs based on " \
41
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
27
"the value of smp";
42
arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_zcu102_binfo);
28
mc->init = xlnx_zcu102_init;
43
}
29
mc->block_default_type = IF_IDE;
44
30
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
45
-static void xlnx_ep108_init(MachineState *machine)
46
-{
47
- XlnxZCU102 *s = EP108_MACHINE(machine);
48
-
49
- if (!qtest_enabled()) {
50
- info_report("The Xilinx EP108 machine is deprecated, please use the "
51
- "ZCU102 machine (which has the same features) instead.");
52
- }
53
-
54
- xlnx_zynqmp_init(s, machine);
55
-}
56
-
57
-static void xlnx_ep108_machine_instance_init(Object *obj)
58
-{
59
- XlnxZCU102 *s = EP108_MACHINE(obj);
60
-
61
- /* EP108, we don't support setting secure or virt */
62
- s->secure = false;
63
- s->virt = false;
64
-}
65
-
66
-static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
67
-{
68
- MachineClass *mc = MACHINE_CLASS(oc);
69
-
70
- mc->desc = "Xilinx ZynqMP EP108 board (Deprecated, please use xlnx-zcu102)";
71
- mc->init = xlnx_ep108_init;
72
- mc->block_default_type = IF_IDE;
73
- mc->units_per_default_bus = 1;
74
- mc->ignore_memory_transaction_failures = true;
75
- mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS;
76
- mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS;
77
-}
78
-
79
-static const TypeInfo xlnx_ep108_machine_init_typeinfo = {
80
- .name = MACHINE_TYPE_NAME("xlnx-ep108"),
81
- .parent = TYPE_MACHINE,
82
- .class_init = xlnx_ep108_machine_class_init,
83
- .instance_init = xlnx_ep108_machine_instance_init,
84
- .instance_size = sizeof(XlnxZCU102),
85
-};
86
-
87
-static void xlnx_ep108_machine_init_register_types(void)
88
-{
89
- type_register_static(&xlnx_ep108_machine_init_typeinfo);
90
-}
91
-
92
-static void xlnx_zcu102_init(MachineState *machine)
93
-{
94
- XlnxZCU102 *s = ZCU102_MACHINE(machine);
95
-
96
- xlnx_zynqmp_init(s, machine);
97
-}
98
-
99
static void xlnx_zcu102_machine_instance_init(Object *obj)
100
{
101
XlnxZCU102 *s = ZCU102_MACHINE(obj);
102
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_init_register_types(void)
103
}
104
105
type_init(xlnx_zcu102_machine_init_register_types)
106
-type_init(xlnx_ep108_machine_init_register_types)
107
diff --git a/qemu-doc.texi b/qemu-doc.texi
108
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
109
--- a/qemu-doc.texi
32
--- a/hw/arm/xlnx-zynqmp.c
110
+++ b/qemu-doc.texi
33
+++ b/hw/arm/xlnx-zynqmp.c
111
@@ -XXX,XX +XXX,XX @@ support page sizes < 4096 any longer.
34
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_rpu(XlnxZynqMPState *s, const char *boot_cpu,
112
35
char *name;
113
@section System emulator machines
36
114
37
object_initialize(&s->rpu_cpu[i], sizeof(s->rpu_cpu[i]),
115
-@subsection Xilinx EP108 (since 2.11.0)
38
- "cortex-r5-" TYPE_ARM_CPU);
116
-
39
+ "cortex-r5f-" TYPE_ARM_CPU);
117
-The ``xlnx-ep108'' machine has been replaced by the ``xlnx-zcu102'' machine.
40
object_property_add_child(OBJECT(s), "rpu-cpu[*]",
118
-The ``xlnx-zcu102'' machine has the same features and capabilites in QEMU.
41
OBJECT(&s->rpu_cpu[i]), &error_abort);
119
-
42
120
@section Block device options
121
122
@subsection "backing": "" (since 2.12.0)
123
--
43
--
124
2.17.1
44
2.17.1
125
45
126
46
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
Implement the Arm TrustZone Memory Protection Controller, which sits
2
in front of RAM and allows secure software to configure it to either
3
pass through or reject transactions.
2
4
3
Specs are available here :
5
We implement the MPC as a QEMU IOMMU, which will direct transactions
6
either through to the devices and memory behind it or to a special
7
"never works" AddressSpace if they are blocked.
4
8
5
https://www.nxp.com/docs/en/application-note/AN264.pdf
9
This initial commit implements the skeleton of the device:
10
* it always permits accesses
11
* it doesn't implement most of the registers
12
* it doesn't implement the interrupt or other behaviour
13
for blocked transactions
6
14
7
This is a simple model supporting the basic registers for led and GPIO
8
mode. The device also supports two blinking rates but not the model
9
yet.
10
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20180530064049.27976-7-clg@kaod.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
17
Reviewed-by: Eric Auger <eric.auger@redhat.com>
18
Message-id: 20180620132032.28865-2-peter.maydell@linaro.org
16
---
19
---
17
hw/misc/Makefile.objs | 1 +
20
hw/misc/Makefile.objs | 1 +
18
tests/Makefile.include | 2 +
21
include/hw/misc/tz-mpc.h | 70 ++++++
19
include/hw/misc/pca9552.h | 32 +++++
22
hw/misc/tz-mpc.c | 399 ++++++++++++++++++++++++++++++++
20
include/hw/misc/pca9552_regs.h | 32 +++++
23
MAINTAINERS | 2 +
21
tests/libqos/i2c.h | 2 +
22
hw/misc/pca9552.c | 240 ++++++++++++++++++++++++++++++++
23
tests/pca9552-test.c | 116 +++++++++++++++
24
tests/tmp105-test.c | 2 -
25
default-configs/arm-softmmu.mak | 1 +
24
default-configs/arm-softmmu.mak | 1 +
26
9 files changed, 426 insertions(+), 2 deletions(-)
25
hw/misc/trace-events | 7 +
27
create mode 100644 include/hw/misc/pca9552.h
26
6 files changed, 480 insertions(+)
28
create mode 100644 include/hw/misc/pca9552_regs.h
27
create mode 100644 include/hw/misc/tz-mpc.h
29
create mode 100644 hw/misc/pca9552.c
28
create mode 100644 hw/misc/tz-mpc.c
30
create mode 100644 tests/pca9552-test.c
31
29
32
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
30
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
33
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/misc/Makefile.objs
32
--- a/hw/misc/Makefile.objs
35
+++ b/hw/misc/Makefile.objs
33
+++ b/hw/misc/Makefile.objs
36
@@ -XXX,XX +XXX,XX @@ common-obj-$(CONFIG_SGA) += sga.o
34
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_MIPS_ITU) += mips_itu.o
37
common-obj-$(CONFIG_ISA_TESTDEV) += pc-testdev.o
35
obj-$(CONFIG_MPS2_FPGAIO) += mps2-fpgaio.o
38
common-obj-$(CONFIG_PCI_TESTDEV) += pci-testdev.o
36
obj-$(CONFIG_MPS2_SCC) += mps2-scc.o
39
common-obj-$(CONFIG_EDU) += edu.o
37
40
+common-obj-$(CONFIG_PCA9552) += pca9552.o
38
+obj-$(CONFIG_TZ_MPC) += tz-mpc.o
41
39
obj-$(CONFIG_TZ_PPC) += tz-ppc.o
42
common-obj-y += unimp.o
40
obj-$(CONFIG_IOTKIT_SECCTL) += iotkit-secctl.o
43
common-obj-$(CONFIG_FW_CFG_DMA) += vmcoreinfo.o
41
44
diff --git a/tests/Makefile.include b/tests/Makefile.include
42
diff --git a/include/hw/misc/tz-mpc.h b/include/hw/misc/tz-mpc.h
45
index XXXXXXX..XXXXXXX 100644
46
--- a/tests/Makefile.include
47
+++ b/tests/Makefile.include
48
@@ -XXX,XX +XXX,XX @@ check-qtest-sparc64-y += tests/prom-env-test$(EXESUF)
49
check-qtest-sparc64-y += tests/boot-serial-test$(EXESUF)
50
51
check-qtest-arm-y = tests/tmp105-test$(EXESUF)
52
+check-qtest-arm-y += tests/pca9552-test$(EXESUF)
53
check-qtest-arm-y += tests/ds1338-test$(EXESUF)
54
check-qtest-arm-y += tests/m25p80-test$(EXESUF)
55
gcov-files-arm-y += hw/misc/tmp105.c
56
@@ -XXX,XX +XXX,XX @@ tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \
57
    tests/boot-sector.o tests/acpi-utils.o $(libqos-obj-y)
58
tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y)
59
tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y)
60
+tests/pca9552-test$(EXESUF): tests/pca9552-test.o $(libqos-omap-obj-y)
61
tests/ds1338-test$(EXESUF): tests/ds1338-test.o $(libqos-imx-obj-y)
62
tests/m25p80-test$(EXESUF): tests/m25p80-test.o
63
tests/i440fx-test$(EXESUF): tests/i440fx-test.o $(libqos-pc-obj-y)
64
diff --git a/include/hw/misc/pca9552.h b/include/hw/misc/pca9552.h
65
new file mode 100644
43
new file mode 100644
66
index XXXXXXX..XXXXXXX
44
index XXXXXXX..XXXXXXX
67
--- /dev/null
45
--- /dev/null
68
+++ b/include/hw/misc/pca9552.h
46
+++ b/include/hw/misc/tz-mpc.h
69
@@ -XXX,XX +XXX,XX @@
47
@@ -XXX,XX +XXX,XX @@
70
+/*
48
+/*
71
+ * PCA9552 I2C LED blinker
49
+ * ARM AHB5 TrustZone Memory Protection Controller emulation
72
+ *
50
+ *
73
+ * Copyright (c) 2017-2018, IBM Corporation.
51
+ * Copyright (c) 2018 Linaro Limited
74
+ *
52
+ * Written by Peter Maydell
75
+ * This work is licensed under the terms of the GNU GPL, version 2 or
53
+ *
76
+ * later. See the COPYING file in the top-level directory.
54
+ * This program is free software; you can redistribute it and/or modify
55
+ * it under the terms of the GNU General Public License version 2 or
56
+ * (at your option) any later version.
77
+ */
57
+ */
78
+#ifndef PCA9552_H
58
+
79
+#define PCA9552_H
59
+/* This is a model of the TrustZone memory protection controller (MPC).
80
+
60
+ * It is documented in the ARM CoreLink SIE-200 System IP for Embedded TRM
81
+#include "hw/i2c/i2c.h"
61
+ * (DDI 0571G):
82
+
62
+ * https://developer.arm.com/products/architecture/m-profile/docs/ddi0571/g
83
+#define TYPE_PCA9552 "pca9552"
63
+ *
84
+#define PCA9552(obj) OBJECT_CHECK(PCA9552State, (obj), TYPE_PCA9552)
64
+ * The MPC sits in front of memory and allows secure software to
85
+
65
+ * configure it to either pass through or reject transactions.
86
+#define PCA9552_NR_REGS 10
66
+ * Rejected transactions may be configured to either be aborted, or to
87
+
67
+ * behave as RAZ/WI. An interrupt can be signalled for a rejected transaction.
88
+typedef struct PCA9552State {
68
+ *
69
+ * The MPC has a register interface which the guest uses to configure it.
70
+ *
71
+ * QEMU interface:
72
+ * + sysbus MMIO region 0: MemoryRegion for the MPC's config registers
73
+ * + sysbus MMIO region 1: MemoryRegion for the upstream end of the MPC
74
+ * + Property "downstream": MemoryRegion defining the downstream memory
75
+ * + Named GPIO output "irq": set for a transaction-failed interrupt
76
+ */
77
+
78
+#ifndef TZ_MPC_H
79
+#define TZ_MPC_H
80
+
81
+#include "hw/sysbus.h"
82
+
83
+#define TYPE_TZ_MPC "tz-mpc"
84
+#define TZ_MPC(obj) OBJECT_CHECK(TZMPC, (obj), TYPE_TZ_MPC)
85
+
86
+#define TZ_NUM_PORTS 16
87
+
88
+#define TYPE_TZ_MPC_IOMMU_MEMORY_REGION "tz-mpc-iommu-memory-region"
89
+
90
+typedef struct TZMPC TZMPC;
91
+
92
+struct TZMPC {
89
+ /*< private >*/
93
+ /*< private >*/
90
+ I2CSlave i2c;
94
+ SysBusDevice parent_obj;
95
+
91
+ /*< public >*/
96
+ /*< public >*/
92
+
97
+
93
+ uint8_t len;
98
+ qemu_irq irq;
94
+ uint8_t pointer;
99
+
95
+
100
+ /* Properties */
96
+ uint8_t regs[PCA9552_NR_REGS];
101
+ MemoryRegion *downstream;
97
+ uint8_t max_reg;
102
+
98
+ uint8_t nr_leds;
103
+ hwaddr blocksize;
99
+} PCA9552State;
104
+ uint32_t blk_max;
105
+
106
+ /* MemoryRegions exposed to user */
107
+ MemoryRegion regmr;
108
+ IOMMUMemoryRegion upstream;
109
+
110
+ /* MemoryRegion used internally */
111
+ MemoryRegion blocked_io;
112
+
113
+ AddressSpace downstream_as;
114
+ AddressSpace blocked_io_as;
115
+};
100
+
116
+
101
+#endif
117
+#endif
102
diff --git a/include/hw/misc/pca9552_regs.h b/include/hw/misc/pca9552_regs.h
118
diff --git a/hw/misc/tz-mpc.c b/hw/misc/tz-mpc.c
103
new file mode 100644
119
new file mode 100644
104
index XXXXXXX..XXXXXXX
120
index XXXXXXX..XXXXXXX
105
--- /dev/null
121
--- /dev/null
106
+++ b/include/hw/misc/pca9552_regs.h
122
+++ b/hw/misc/tz-mpc.c
107
@@ -XXX,XX +XXX,XX @@
123
@@ -XXX,XX +XXX,XX @@
108
+/*
124
+/*
109
+ * PCA9552 I2C LED blinker registers
125
+ * ARM AHB5 TrustZone Memory Protection Controller emulation
110
+ *
126
+ *
111
+ * Copyright (c) 2017-2018, IBM Corporation.
127
+ * Copyright (c) 2018 Linaro Limited
112
+ *
128
+ * Written by Peter Maydell
113
+ * This work is licensed under the terms of the GNU GPL, version 2 or
129
+ *
114
+ * later. See the COPYING file in the top-level directory.
130
+ * This program is free software; you can redistribute it and/or modify
115
+ */
131
+ * it under the terms of the GNU General Public License version 2 or
116
+#ifndef PCA9552_REGS_H
132
+ * (at your option) any later version.
117
+#define PCA9552_REGS_H
118
+
119
+/*
120
+ * Bits [0:3] are used to address a specific register.
121
+ */
122
+#define PCA9552_INPUT0 0 /* read only input register 0 */
123
+#define PCA9552_INPUT1 1 /* read only input register 1 */
124
+#define PCA9552_PSC0 2 /* read/write frequency prescaler 0 */
125
+#define PCA9552_PWM0 3 /* read/write PWM register 0 */
126
+#define PCA9552_PSC1 4 /* read/write frequency prescaler 1 */
127
+#define PCA9552_PWM1 5 /* read/write PWM register 1 */
128
+#define PCA9552_LS0 6 /* read/write LED0 to LED3 selector */
129
+#define PCA9552_LS1 7 /* read/write LED4 to LED7 selector */
130
+#define PCA9552_LS2 8 /* read/write LED8 to LED11 selector */
131
+#define PCA9552_LS3 9 /* read/write LED12 to LED15 selector */
132
+
133
+/*
134
+ * Bit [4] is used to activate the Auto-Increment option of the
135
+ * register address
136
+ */
137
+#define PCA9552_AUTOINC (1 << 4)
138
+
139
+#endif
140
diff --git a/tests/libqos/i2c.h b/tests/libqos/i2c.h
141
index XXXXXXX..XXXXXXX 100644
142
--- a/tests/libqos/i2c.h
143
+++ b/tests/libqos/i2c.h
144
@@ -XXX,XX +XXX,XX @@ struct I2CAdapter {
145
QTestState *qts;
146
};
147
148
+#define OMAP2_I2C_1_BASE 0x48070000
149
+
150
void i2c_send(I2CAdapter *i2c, uint8_t addr,
151
const uint8_t *buf, uint16_t len);
152
void i2c_recv(I2CAdapter *i2c, uint8_t addr,
153
diff --git a/hw/misc/pca9552.c b/hw/misc/pca9552.c
154
new file mode 100644
155
index XXXXXXX..XXXXXXX
156
--- /dev/null
157
+++ b/hw/misc/pca9552.c
158
@@ -XXX,XX +XXX,XX @@
159
+/*
160
+ * PCA9552 I2C LED blinker
161
+ *
162
+ * https://www.nxp.com/docs/en/application-note/AN264.pdf
163
+ *
164
+ * Copyright (c) 2017-2018, IBM Corporation.
165
+ *
166
+ * This work is licensed under the terms of the GNU GPL, version 2 or
167
+ * later. See the COPYING file in the top-level directory.
168
+ */
133
+ */
169
+
134
+
170
+#include "qemu/osdep.h"
135
+#include "qemu/osdep.h"
171
+#include "qemu/log.h"
136
+#include "qemu/log.h"
172
+#include "hw/hw.h"
137
+#include "qapi/error.h"
173
+#include "hw/misc/pca9552.h"
138
+#include "trace.h"
174
+#include "hw/misc/pca9552_regs.h"
139
+#include "hw/sysbus.h"
175
+
140
+#include "hw/registerfields.h"
176
+#define PCA9552_LED_ON 0x0
141
+#include "hw/misc/tz-mpc.h"
177
+#define PCA9552_LED_OFF 0x1
142
+
178
+#define PCA9552_LED_PWM0 0x2
143
+/* Our IOMMU has two IOMMU indexes, one for secure transactions and one for
179
+#define PCA9552_LED_PWM1 0x3
144
+ * non-secure transactions.
180
+
145
+ */
181
+static uint8_t pca9552_pin_get_config(PCA9552State *s, int pin)
146
+enum {
182
+{
147
+ IOMMU_IDX_S,
183
+ uint8_t reg = PCA9552_LS0 + (pin / 4);
148
+ IOMMU_IDX_NS,
184
+ uint8_t shift = (pin % 4) << 1;
149
+ IOMMU_NUM_INDEXES,
185
+
150
+};
186
+ return extract32(s->regs[reg], shift, 2);
151
+
187
+}
152
+/* Config registers */
188
+
153
+REG32(CTRL, 0x00)
189
+static void pca9552_update_pin_input(PCA9552State *s)
154
+REG32(BLK_MAX, 0x10)
190
+{
155
+REG32(BLK_CFG, 0x14)
191
+ int i;
156
+REG32(BLK_IDX, 0x18)
192
+
157
+REG32(BLK_LUT, 0x1c)
193
+ for (i = 0; i < s->nr_leds; i++) {
158
+REG32(INT_STAT, 0x20)
194
+ uint8_t input_reg = PCA9552_INPUT0 + (i / 8);
159
+REG32(INT_CLEAR, 0x24)
195
+ uint8_t input_shift = (i % 8);
160
+REG32(INT_EN, 0x28)
196
+ uint8_t config = pca9552_pin_get_config(s, i);
161
+REG32(INT_INFO1, 0x2c)
197
+
162
+REG32(INT_INFO2, 0x30)
198
+ switch (config) {
163
+REG32(INT_SET, 0x34)
199
+ case PCA9552_LED_ON:
164
+REG32(PIDR4, 0xfd0)
200
+ s->regs[input_reg] |= 1 << input_shift;
165
+REG32(PIDR5, 0xfd4)
201
+ break;
166
+REG32(PIDR6, 0xfd8)
202
+ case PCA9552_LED_OFF:
167
+REG32(PIDR7, 0xfdc)
203
+ s->regs[input_reg] &= ~(1 << input_shift);
168
+REG32(PIDR0, 0xfe0)
204
+ break;
169
+REG32(PIDR1, 0xfe4)
205
+ case PCA9552_LED_PWM0:
170
+REG32(PIDR2, 0xfe8)
206
+ case PCA9552_LED_PWM1:
171
+REG32(PIDR3, 0xfec)
207
+ /* TODO */
172
+REG32(CIDR0, 0xff0)
173
+REG32(CIDR1, 0xff4)
174
+REG32(CIDR2, 0xff8)
175
+REG32(CIDR3, 0xffc)
176
+
177
+static const uint8_t tz_mpc_idregs[] = {
178
+ 0x04, 0x00, 0x00, 0x00,
179
+ 0x60, 0xb8, 0x1b, 0x00,
180
+ 0x0d, 0xf0, 0x05, 0xb1,
181
+};
182
+
183
+static MemTxResult tz_mpc_reg_read(void *opaque, hwaddr addr,
184
+ uint64_t *pdata,
185
+ unsigned size, MemTxAttrs attrs)
186
+{
187
+ uint64_t r;
188
+ uint32_t offset = addr & ~0x3;
189
+
190
+ if (!attrs.secure && offset < A_PIDR4) {
191
+ /* NS accesses can only see the ID registers */
192
+ qemu_log_mask(LOG_GUEST_ERROR,
193
+ "TZ MPC register read: NS access to offset 0x%x\n",
194
+ offset);
195
+ r = 0;
196
+ goto read_out;
197
+ }
198
+
199
+ switch (offset) {
200
+ case A_PIDR4:
201
+ case A_PIDR5:
202
+ case A_PIDR6:
203
+ case A_PIDR7:
204
+ case A_PIDR0:
205
+ case A_PIDR1:
206
+ case A_PIDR2:
207
+ case A_PIDR3:
208
+ case A_CIDR0:
209
+ case A_CIDR1:
210
+ case A_CIDR2:
211
+ case A_CIDR3:
212
+ r = tz_mpc_idregs[(offset - A_PIDR4) / 4];
213
+ break;
214
+ case A_INT_CLEAR:
215
+ case A_INT_SET:
216
+ qemu_log_mask(LOG_GUEST_ERROR,
217
+ "TZ MPC register read: write-only offset 0x%x\n",
218
+ offset);
219
+ r = 0;
220
+ break;
221
+ default:
222
+ qemu_log_mask(LOG_GUEST_ERROR,
223
+ "TZ MPC register read: bad offset 0x%x\n", offset);
224
+ r = 0;
225
+ break;
226
+ }
227
+
228
+ if (size != 4) {
229
+ /* None of our registers are read-sensitive (except BLK_LUT,
230
+ * which can special case the "size not 4" case), so just
231
+ * pull the right bytes out of the word read result.
232
+ */
233
+ r = extract32(r, (addr & 3) * 8, size * 8);
234
+ }
235
+
236
+read_out:
237
+ trace_tz_mpc_reg_read(addr, r, size);
238
+ *pdata = r;
239
+ return MEMTX_OK;
240
+}
241
+
242
+static MemTxResult tz_mpc_reg_write(void *opaque, hwaddr addr,
243
+ uint64_t value,
244
+ unsigned size, MemTxAttrs attrs)
245
+{
246
+ uint32_t offset = addr & ~0x3;
247
+
248
+ trace_tz_mpc_reg_write(addr, value, size);
249
+
250
+ if (!attrs.secure && offset < A_PIDR4) {
251
+ /* NS accesses can only see the ID registers */
252
+ qemu_log_mask(LOG_GUEST_ERROR,
253
+ "TZ MPC register write: NS access to offset 0x%x\n",
254
+ offset);
255
+ return MEMTX_OK;
256
+ }
257
+
258
+ if (size != 4) {
259
+ /* Expand the byte or halfword write to a full word size.
260
+ * In most cases we can do this with zeroes; the exceptions
261
+ * are CTRL, BLK_IDX and BLK_LUT.
262
+ */
263
+ uint32_t oldval;
264
+
265
+ switch (offset) {
266
+ /* As we add support for registers which need expansions
267
+ * other than zeroes we'll fill in cases here.
268
+ */
208
+ default:
269
+ default:
270
+ oldval = 0;
209
+ break;
271
+ break;
210
+ }
272
+ }
211
+ }
273
+ value = deposit32(oldval, (addr & 3) * 8, size * 8, value);
212
+}
274
+ }
213
+
275
+
214
+static uint8_t pca9552_read(PCA9552State *s, uint8_t reg)
276
+ switch (offset) {
215
+{
277
+ case A_PIDR4:
216
+ switch (reg) {
278
+ case A_PIDR5:
217
+ case PCA9552_INPUT0:
279
+ case A_PIDR6:
218
+ case PCA9552_INPUT1:
280
+ case A_PIDR7:
219
+ case PCA9552_PSC0:
281
+ case A_PIDR0:
220
+ case PCA9552_PWM0:
282
+ case A_PIDR1:
221
+ case PCA9552_PSC1:
283
+ case A_PIDR2:
222
+ case PCA9552_PWM1:
284
+ case A_PIDR3:
223
+ case PCA9552_LS0:
285
+ case A_CIDR0:
224
+ case PCA9552_LS1:
286
+ case A_CIDR1:
225
+ case PCA9552_LS2:
287
+ case A_CIDR2:
226
+ case PCA9552_LS3:
288
+ case A_CIDR3:
227
+ return s->regs[reg];
289
+ qemu_log_mask(LOG_GUEST_ERROR,
290
+ "TZ MPC register write: read-only offset 0x%x\n", offset);
291
+ break;
228
+ default:
292
+ default:
229
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: unexpected read to register %d\n",
293
+ qemu_log_mask(LOG_GUEST_ERROR,
230
+ __func__, reg);
294
+ "TZ MPC register write: bad offset 0x%x\n", offset);
231
+ return 0xFF;
232
+ }
233
+}
234
+
235
+static void pca9552_write(PCA9552State *s, uint8_t reg, uint8_t data)
236
+{
237
+ switch (reg) {
238
+ case PCA9552_PSC0:
239
+ case PCA9552_PWM0:
240
+ case PCA9552_PSC1:
241
+ case PCA9552_PWM1:
242
+ s->regs[reg] = data;
243
+ break;
295
+ break;
244
+
296
+ }
245
+ case PCA9552_LS0:
297
+
246
+ case PCA9552_LS1:
298
+ return MEMTX_OK;
247
+ case PCA9552_LS2:
299
+}
248
+ case PCA9552_LS3:
300
+
249
+ s->regs[reg] = data;
301
+static const MemoryRegionOps tz_mpc_reg_ops = {
250
+ pca9552_update_pin_input(s);
302
+ .read_with_attrs = tz_mpc_reg_read,
251
+ break;
303
+ .write_with_attrs = tz_mpc_reg_write,
252
+
304
+ .endianness = DEVICE_LITTLE_ENDIAN,
253
+ case PCA9552_INPUT0:
305
+ .valid.min_access_size = 1,
254
+ case PCA9552_INPUT1:
306
+ .valid.max_access_size = 4,
255
+ default:
307
+ .impl.min_access_size = 1,
256
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: unexpected write to register %d\n",
308
+ .impl.max_access_size = 4,
257
+ __func__, reg);
309
+};
258
+ }
310
+
259
+}
311
+/* Accesses only reach these read and write functions if the MPC is
260
+
312
+ * blocking them; non-blocked accesses go directly to the downstream
261
+/*
313
+ * memory region without passing through this code.
262
+ * When Auto-Increment is on, the register address is incremented
263
+ * after each byte is sent to or received by the device. The index
264
+ * rollovers to 0 when the maximum register address is reached.
265
+ */
314
+ */
266
+static void pca9552_autoinc(PCA9552State *s)
315
+static MemTxResult tz_mpc_mem_blocked_read(void *opaque, hwaddr addr,
267
+{
316
+ uint64_t *pdata,
268
+ if (s->pointer != 0xFF && s->pointer & PCA9552_AUTOINC) {
317
+ unsigned size, MemTxAttrs attrs)
269
+ uint8_t reg = s->pointer & 0xf;
318
+{
270
+
319
+ trace_tz_mpc_mem_blocked_read(addr, size, attrs.secure);
271
+ reg = (reg + 1) % (s->max_reg + 1);
320
+
272
+ s->pointer = reg | PCA9552_AUTOINC;
321
+ *pdata = 0;
273
+ }
322
+ return MEMTX_OK;
274
+}
323
+}
275
+
324
+
276
+static int pca9552_recv(I2CSlave *i2c)
325
+static MemTxResult tz_mpc_mem_blocked_write(void *opaque, hwaddr addr,
277
+{
326
+ uint64_t value,
278
+ PCA9552State *s = PCA9552(i2c);
327
+ unsigned size, MemTxAttrs attrs)
279
+ uint8_t ret;
328
+{
280
+
329
+ trace_tz_mpc_mem_blocked_write(addr, value, size, attrs.secure);
281
+ ret = pca9552_read(s, s->pointer & 0xf);
330
+
282
+
331
+ return MEMTX_OK;
283
+ /*
332
+}
284
+ * From the Specs:
333
+
285
+ *
334
+static const MemoryRegionOps tz_mpc_mem_blocked_ops = {
286
+ * Important Note: When a Read sequence is initiated and the
335
+ .read_with_attrs = tz_mpc_mem_blocked_read,
287
+ * AI bit is set to Logic Level 1, the Read Sequence MUST
336
+ .write_with_attrs = tz_mpc_mem_blocked_write,
288
+ * start by a register different from 0.
337
+ .endianness = DEVICE_LITTLE_ENDIAN,
289
+ *
338
+ .valid.min_access_size = 1,
290
+ * I don't know what should be done in this case, so throw an
339
+ .valid.max_access_size = 8,
291
+ * error.
340
+ .impl.min_access_size = 1,
341
+ .impl.max_access_size = 8,
342
+};
343
+
344
+static IOMMUTLBEntry tz_mpc_translate(IOMMUMemoryRegion *iommu,
345
+ hwaddr addr, IOMMUAccessFlags flags,
346
+ int iommu_idx)
347
+{
348
+ TZMPC *s = TZ_MPC(container_of(iommu, TZMPC, upstream));
349
+ bool ok;
350
+
351
+ IOMMUTLBEntry ret = {
352
+ .iova = addr & ~(s->blocksize - 1),
353
+ .translated_addr = addr & ~(s->blocksize - 1),
354
+ .addr_mask = s->blocksize - 1,
355
+ .perm = IOMMU_RW,
356
+ };
357
+
358
+ /* Look at the per-block configuration for this address, and
359
+ * return a TLB entry directing the transaction at either
360
+ * downstream_as or blocked_io_as, as appropriate.
361
+ * For the moment, always permit accesses.
292
+ */
362
+ */
293
+ if (s->pointer == PCA9552_AUTOINC) {
363
+ ok = true;
294
+ qemu_log_mask(LOG_GUEST_ERROR,
364
+
295
+ "%s: Autoincrement read starting with register 0\n",
365
+ trace_tz_mpc_translate(addr, flags,
296
+ __func__);
366
+ iommu_idx == IOMMU_IDX_S ? "S" : "NS",
297
+ }
367
+ ok ? "pass" : "block");
298
+
368
+
299
+ pca9552_autoinc(s);
369
+ ret.target_as = ok ? &s->downstream_as : &s->blocked_io_as;
300
+
301
+ return ret;
370
+ return ret;
302
+}
371
+}
303
+
372
+
304
+static int pca9552_send(I2CSlave *i2c, uint8_t data)
373
+static int tz_mpc_attrs_to_index(IOMMUMemoryRegion *iommu, MemTxAttrs attrs)
305
+{
374
+{
306
+ PCA9552State *s = PCA9552(i2c);
375
+ /* We treat unspecified attributes like secure. Transactions with
307
+
376
+ * unspecified attributes come from places like
308
+ /* First byte sent by is the register address */
377
+ * cpu_physical_memory_write_rom() for initial image load, and we want
309
+ if (s->len == 0) {
378
+ * those to pass through the from-reset "everything is secure" config.
310
+ s->pointer = data;
379
+ * All the real during-emulation transactions from the CPU will
311
+ s->len++;
380
+ * specify attributes.
312
+ } else {
381
+ */
313
+ pca9552_write(s, s->pointer & 0xf, data);
382
+ return (attrs.unspecified || attrs.secure) ? IOMMU_IDX_S : IOMMU_IDX_NS;
314
+
383
+}
315
+ pca9552_autoinc(s);
384
+
316
+ }
385
+static int tz_mpc_num_indexes(IOMMUMemoryRegion *iommu)
317
+
386
+{
318
+ return 0;
387
+ return IOMMU_NUM_INDEXES;
319
+}
388
+}
320
+
389
+
321
+static int pca9552_event(I2CSlave *i2c, enum i2c_event event)
390
+static void tz_mpc_reset(DeviceState *dev)
322
+{
391
+{
323
+ PCA9552State *s = PCA9552(i2c);
392
+}
324
+
393
+
325
+ s->len = 0;
394
+static void tz_mpc_init(Object *obj)
326
+ return 0;
395
+{
327
+}
396
+ DeviceState *dev = DEVICE(obj);
328
+
397
+ TZMPC *s = TZ_MPC(obj);
329
+static const VMStateDescription pca9552_vmstate = {
398
+
330
+ .name = "PCA9552",
399
+ qdev_init_gpio_out_named(dev, &s->irq, "irq", 1);
331
+ .version_id = 0,
400
+}
332
+ .minimum_version_id = 0,
401
+
402
+static void tz_mpc_realize(DeviceState *dev, Error **errp)
403
+{
404
+ Object *obj = OBJECT(dev);
405
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
406
+ TZMPC *s = TZ_MPC(dev);
407
+ uint64_t size;
408
+
409
+ /* We can't create the upstream end of the port until realize,
410
+ * as we don't know the size of the MR used as the downstream until then.
411
+ * We insist on having a downstream, to avoid complicating the code
412
+ * with handling the "don't know how big this is" case. It's easy
413
+ * enough for the user to create an unimplemented_device as downstream
414
+ * if they have nothing else to plug into this.
415
+ */
416
+ if (!s->downstream) {
417
+ error_setg(errp, "MPC 'downstream' link not set");
418
+ return;
419
+ }
420
+
421
+ size = memory_region_size(s->downstream);
422
+
423
+ memory_region_init_iommu(&s->upstream, sizeof(s->upstream),
424
+ TYPE_TZ_MPC_IOMMU_MEMORY_REGION,
425
+ obj, "tz-mpc-upstream", size);
426
+
427
+ /* In real hardware the block size is configurable. In QEMU we could
428
+ * make it configurable but will need it to be at least as big as the
429
+ * target page size so we can execute out of the resulting MRs. Guest
430
+ * software is supposed to check the block size using the BLK_CFG
431
+ * register, so make it fixed at the page size.
432
+ */
433
+ s->blocksize = memory_region_iommu_get_min_page_size(&s->upstream);
434
+ if (size % s->blocksize != 0) {
435
+ error_setg(errp,
436
+ "MPC 'downstream' size %" PRId64
437
+ " is not a multiple of %" HWADDR_PRIx " bytes",
438
+ size, s->blocksize);
439
+ object_unref(OBJECT(&s->upstream));
440
+ return;
441
+ }
442
+
443
+ /* BLK_MAX is the max value of BLK_IDX, which indexes an array of 32-bit
444
+ * words, each bit of which indicates one block.
445
+ */
446
+ s->blk_max = DIV_ROUND_UP(size / s->blocksize, 32);
447
+
448
+ memory_region_init_io(&s->regmr, obj, &tz_mpc_reg_ops,
449
+ s, "tz-mpc-regs", 0x1000);
450
+ sysbus_init_mmio(sbd, &s->regmr);
451
+
452
+ sysbus_init_mmio(sbd, MEMORY_REGION(&s->upstream));
453
+
454
+ /* This memory region is not exposed to users of this device as a
455
+ * sysbus MMIO region, but is instead used internally as something
456
+ * that our IOMMU translate function might direct accesses to.
457
+ */
458
+ memory_region_init_io(&s->blocked_io, obj, &tz_mpc_mem_blocked_ops,
459
+ s, "tz-mpc-blocked-io", size);
460
+
461
+ address_space_init(&s->downstream_as, s->downstream,
462
+ "tz-mpc-downstream");
463
+ address_space_init(&s->blocked_io_as, &s->blocked_io,
464
+ "tz-mpc-blocked-io");
465
+}
466
+
467
+static const VMStateDescription tz_mpc_vmstate = {
468
+ .name = "tz-mpc",
469
+ .version_id = 1,
470
+ .minimum_version_id = 1,
333
+ .fields = (VMStateField[]) {
471
+ .fields = (VMStateField[]) {
334
+ VMSTATE_UINT8(len, PCA9552State),
335
+ VMSTATE_UINT8(pointer, PCA9552State),
336
+ VMSTATE_UINT8_ARRAY(regs, PCA9552State, PCA9552_NR_REGS),
337
+ VMSTATE_I2C_SLAVE(i2c, PCA9552State),
338
+ VMSTATE_END_OF_LIST()
472
+ VMSTATE_END_OF_LIST()
339
+ }
473
+ }
340
+};
474
+};
341
+
475
+
342
+static void pca9552_reset(DeviceState *dev)
476
+static Property tz_mpc_properties[] = {
343
+{
477
+ DEFINE_PROP_LINK("downstream", TZMPC, downstream,
344
+ PCA9552State *s = PCA9552(dev);
478
+ TYPE_MEMORY_REGION, MemoryRegion *),
345
+
479
+ DEFINE_PROP_END_OF_LIST(),
346
+ s->regs[PCA9552_PSC0] = 0xFF;
480
+};
347
+ s->regs[PCA9552_PWM0] = 0x80;
481
+
348
+ s->regs[PCA9552_PSC1] = 0xFF;
482
+static void tz_mpc_class_init(ObjectClass *klass, void *data)
349
+ s->regs[PCA9552_PWM1] = 0x80;
350
+ s->regs[PCA9552_LS0] = 0x55; /* all OFF */
351
+ s->regs[PCA9552_LS1] = 0x55;
352
+ s->regs[PCA9552_LS2] = 0x55;
353
+ s->regs[PCA9552_LS3] = 0x55;
354
+
355
+ pca9552_update_pin_input(s);
356
+
357
+ s->pointer = 0xFF;
358
+ s->len = 0;
359
+}
360
+
361
+static void pca9552_initfn(Object *obj)
362
+{
363
+ PCA9552State *s = PCA9552(obj);
364
+
365
+ /* If support for the other PCA955X devices are implemented, these
366
+ * constant values might be part of class structure describing the
367
+ * PCA955X device
368
+ */
369
+ s->max_reg = PCA9552_LS3;
370
+ s->nr_leds = 16;
371
+}
372
+
373
+static void pca9552_class_init(ObjectClass *klass, void *data)
374
+{
483
+{
375
+ DeviceClass *dc = DEVICE_CLASS(klass);
484
+ DeviceClass *dc = DEVICE_CLASS(klass);
376
+ I2CSlaveClass *k = I2C_SLAVE_CLASS(klass);
485
+
377
+
486
+ dc->realize = tz_mpc_realize;
378
+ k->event = pca9552_event;
487
+ dc->vmsd = &tz_mpc_vmstate;
379
+ k->recv = pca9552_recv;
488
+ dc->reset = tz_mpc_reset;
380
+ k->send = pca9552_send;
489
+ dc->props = tz_mpc_properties;
381
+ dc->reset = pca9552_reset;
490
+}
382
+ dc->vmsd = &pca9552_vmstate;
491
+
383
+}
492
+static const TypeInfo tz_mpc_info = {
384
+
493
+ .name = TYPE_TZ_MPC,
385
+static const TypeInfo pca9552_info = {
494
+ .parent = TYPE_SYS_BUS_DEVICE,
386
+ .name = TYPE_PCA9552,
495
+ .instance_size = sizeof(TZMPC),
387
+ .parent = TYPE_I2C_SLAVE,
496
+ .instance_init = tz_mpc_init,
388
+ .instance_init = pca9552_initfn,
497
+ .class_init = tz_mpc_class_init,
389
+ .instance_size = sizeof(PCA9552State),
498
+};
390
+ .class_init = pca9552_class_init,
499
+
391
+};
500
+static void tz_mpc_iommu_memory_region_class_init(ObjectClass *klass,
392
+
501
+ void *data)
393
+static void pca9552_register_types(void)
502
+{
394
+{
503
+ IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_CLASS(klass);
395
+ type_register_static(&pca9552_info);
504
+
396
+}
505
+ imrc->translate = tz_mpc_translate;
397
+
506
+ imrc->attrs_to_index = tz_mpc_attrs_to_index;
398
+type_init(pca9552_register_types)
507
+ imrc->num_indexes = tz_mpc_num_indexes;
399
diff --git a/tests/pca9552-test.c b/tests/pca9552-test.c
508
+}
400
new file mode 100644
509
+
401
index XXXXXXX..XXXXXXX
510
+static const TypeInfo tz_mpc_iommu_memory_region_info = {
402
--- /dev/null
511
+ .name = TYPE_TZ_MPC_IOMMU_MEMORY_REGION,
403
+++ b/tests/pca9552-test.c
512
+ .parent = TYPE_IOMMU_MEMORY_REGION,
404
@@ -XXX,XX +XXX,XX @@
513
+ .class_init = tz_mpc_iommu_memory_region_class_init,
405
+/*
514
+};
406
+ * QTest testcase for the PCA9552 LED blinker
515
+
407
+ *
516
+static void tz_mpc_register_types(void)
408
+ * Copyright (c) 2017-2018, IBM Corporation.
517
+{
409
+ *
518
+ type_register_static(&tz_mpc_info);
410
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
519
+ type_register_static(&tz_mpc_iommu_memory_region_info);
411
+ * See the COPYING file in the top-level directory.
520
+}
412
+ */
521
+
413
+
522
+type_init(tz_mpc_register_types);
414
+#include "qemu/osdep.h"
523
diff --git a/MAINTAINERS b/MAINTAINERS
415
+
416
+#include "libqtest.h"
417
+#include "libqos/i2c.h"
418
+#include "hw/misc/pca9552_regs.h"
419
+
420
+#define PCA9552_TEST_ID "pca9552-test"
421
+#define PCA9552_TEST_ADDR 0x60
422
+
423
+static I2CAdapter *i2c;
424
+
425
+static uint8_t pca9552_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
426
+{
427
+ uint8_t resp[1];
428
+ i2c_send(i2c, addr, &reg, 1);
429
+ i2c_recv(i2c, addr, resp, 1);
430
+ return resp[0];
431
+}
432
+
433
+static void pca9552_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
434
+ uint8_t value)
435
+{
436
+ uint8_t cmd[2];
437
+ uint8_t resp[1];
438
+
439
+ cmd[0] = reg;
440
+ cmd[1] = value;
441
+ i2c_send(i2c, addr, cmd, 2);
442
+ i2c_recv(i2c, addr, resp, 1);
443
+ g_assert_cmphex(resp[0], ==, cmd[1]);
444
+}
445
+
446
+static void receive_autoinc(void)
447
+{
448
+ uint8_t resp;
449
+ uint8_t reg = PCA9552_LS0 | PCA9552_AUTOINC;
450
+
451
+ i2c_send(i2c, PCA9552_TEST_ADDR, &reg, 1);
452
+
453
+ /* PCA9552_LS0 */
454
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
455
+ g_assert_cmphex(resp, ==, 0x54);
456
+
457
+ /* PCA9552_LS1 */
458
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
459
+ g_assert_cmphex(resp, ==, 0x55);
460
+
461
+ /* PCA9552_LS2 */
462
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
463
+ g_assert_cmphex(resp, ==, 0x55);
464
+
465
+ /* PCA9552_LS3 */
466
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
467
+ g_assert_cmphex(resp, ==, 0x54);
468
+}
469
+
470
+static void send_and_receive(void)
471
+{
472
+ uint8_t value;
473
+
474
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
475
+ g_assert_cmphex(value, ==, 0x55);
476
+
477
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
478
+ g_assert_cmphex(value, ==, 0x0);
479
+
480
+ /* Switch on LED 0 */
481
+ pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0, 0x54);
482
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
483
+ g_assert_cmphex(value, ==, 0x54);
484
+
485
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
486
+ g_assert_cmphex(value, ==, 0x01);
487
+
488
+ /* Switch on LED 12 */
489
+ pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3, 0x54);
490
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3);
491
+ g_assert_cmphex(value, ==, 0x54);
492
+
493
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT1);
494
+ g_assert_cmphex(value, ==, 0x10);
495
+}
496
+
497
+int main(int argc, char **argv)
498
+{
499
+ QTestState *s = NULL;
500
+ int ret;
501
+
502
+ g_test_init(&argc, &argv, NULL);
503
+
504
+ s = qtest_start("-machine n800 "
505
+ "-device pca9552,bus=i2c-bus.0,id=" PCA9552_TEST_ID
506
+ ",address=0x60");
507
+ i2c = omap_i2c_create(s, OMAP2_I2C_1_BASE);
508
+
509
+ qtest_add_func("/pca9552/tx-rx", send_and_receive);
510
+ qtest_add_func("/pca9552/rx-autoinc", receive_autoinc);
511
+
512
+ ret = g_test_run();
513
+
514
+ if (s) {
515
+ qtest_quit(s);
516
+ }
517
+ g_free(i2c);
518
+
519
+ return ret;
520
+}
521
diff --git a/tests/tmp105-test.c b/tests/tmp105-test.c
522
index XXXXXXX..XXXXXXX 100644
524
index XXXXXXX..XXXXXXX 100644
523
--- a/tests/tmp105-test.c
525
--- a/MAINTAINERS
524
+++ b/tests/tmp105-test.c
526
+++ b/MAINTAINERS
525
@@ -XXX,XX +XXX,XX @@
527
@@ -XXX,XX +XXX,XX @@ F: hw/char/cmsdk-apb-uart.c
526
#include "qapi/qmp/qdict.h"
528
F: include/hw/char/cmsdk-apb-uart.h
527
#include "hw/misc/tmp105_regs.h"
529
F: hw/misc/tz-ppc.c
528
530
F: include/hw/misc/tz-ppc.h
529
-#define OMAP2_I2C_1_BASE 0x48070000
531
+F: hw/misc/tz-mpc.c
530
-
532
+F: include/hw/misc/tz-mpc.h
531
#define TMP105_TEST_ID "tmp105-test"
533
532
#define TMP105_TEST_ADDR 0x49
534
ARM cores
533
535
M: Peter Maydell <peter.maydell@linaro.org>
534
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
536
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
535
index XXXXXXX..XXXXXXX 100644
537
index XXXXXXX..XXXXXXX 100644
536
--- a/default-configs/arm-softmmu.mak
538
--- a/default-configs/arm-softmmu.mak
537
+++ b/default-configs/arm-softmmu.mak
539
+++ b/default-configs/arm-softmmu.mak
538
@@ -XXX,XX +XXX,XX @@ CONFIG_TSC2005=y
540
@@ -XXX,XX +XXX,XX @@ CONFIG_CMSDK_APB_UART=y
539
CONFIG_LM832X=y
541
CONFIG_MPS2_FPGAIO=y
540
CONFIG_TMP105=y
542
CONFIG_MPS2_SCC=y
541
CONFIG_TMP421=y
543
542
+CONFIG_PCA9552=y
544
+CONFIG_TZ_MPC=y
543
CONFIG_STELLARIS=y
545
CONFIG_TZ_PPC=y
544
CONFIG_STELLARIS_INPUT=y
546
CONFIG_IOTKIT=y
545
CONFIG_STELLARIS_ENET=y
547
CONFIG_IOTKIT_SECCTL=y
548
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
549
index XXXXXXX..XXXXXXX 100644
550
--- a/hw/misc/trace-events
551
+++ b/hw/misc/trace-events
552
@@ -XXX,XX +XXX,XX @@ mos6522_set_sr_int(void) "set sr_int"
553
mos6522_write(uint64_t addr, uint64_t val) "reg=0x%"PRIx64 " val=0x%"PRIx64
554
mos6522_read(uint64_t addr, unsigned val) "reg=0x%"PRIx64 " val=0x%x"
555
556
+# hw/misc/tz-mpc.c
557
+tz_mpc_reg_read(uint32_t offset, uint64_t data, unsigned size) "TZ MPC regs read: offset 0x%x data 0x%" PRIx64 " size %u"
558
+tz_mpc_reg_write(uint32_t offset, uint64_t data, unsigned size) "TZ MPC regs write: offset 0x%x data 0x%" PRIx64 " size %u"
559
+tz_mpc_mem_blocked_read(uint64_t addr, unsigned size, bool secure) "TZ MPC blocked read: offset 0x%" PRIx64 " size %u secure %d"
560
+tz_mpc_mem_blocked_write(uint64_t addr, uint64_t data, unsigned size, bool secure) "TZ MPC blocked write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u secure %d"
561
+tz_mpc_translate(uint64_t addr, int flags, const char *idx, const char *res) "TZ MPC translate: addr 0x%" PRIx64 " flags 0x%x iommu_idx %s: %s"
562
+
563
# hw/misc/tz-ppc.c
564
tz_ppc_reset(void) "TZ PPC: reset"
565
tz_ppc_cfg_nonsec(int n, int level) "TZ PPC: cfg_nonsec[%d] = %d"
546
--
566
--
547
2.17.1
567
2.17.1
548
568
549
569
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
Implement the missing registers for the TZ MPC.
2
2
3
This is an helper routine to add a single EEPROM on an I2C bus. It can
4
be directly used by smbus_eeprom_init() which adds a certain number of
5
EEPROMs on mips and x86 machines.
6
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180530064049.27976-5-clg@kaod.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Eric Auger <eric.auger@redhat.com>
5
Message-id: 20180620132032.28865-3-peter.maydell@linaro.org
11
---
6
---
12
include/hw/i2c/smbus.h | 1 +
7
include/hw/misc/tz-mpc.h | 10 +++
13
hw/i2c/smbus_eeprom.c | 16 +++++++++++-----
8
hw/misc/tz-mpc.c | 140 ++++++++++++++++++++++++++++++++++++++-
14
2 files changed, 12 insertions(+), 5 deletions(-)
9
2 files changed, 147 insertions(+), 3 deletions(-)
15
10
16
diff --git a/include/hw/i2c/smbus.h b/include/hw/i2c/smbus.h
11
diff --git a/include/hw/misc/tz-mpc.h b/include/hw/misc/tz-mpc.h
17
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/i2c/smbus.h
13
--- a/include/hw/misc/tz-mpc.h
19
+++ b/include/hw/i2c/smbus.h
14
+++ b/include/hw/misc/tz-mpc.h
20
@@ -XXX,XX +XXX,XX @@ int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data);
15
@@ -XXX,XX +XXX,XX @@ struct TZMPC {
21
int smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data,
16
22
int len);
17
/*< public >*/
23
18
24
+void smbus_eeprom_init_one(I2CBus *smbus, uint8_t address, uint8_t *eeprom_buf);
19
+ /* State */
25
void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
20
+ uint32_t ctrl;
26
const uint8_t *eeprom_spd, int size);
21
+ uint32_t blk_idx;
27
22
+ uint32_t int_stat;
28
diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
23
+ uint32_t int_en;
24
+ uint32_t int_info1;
25
+ uint32_t int_info2;
26
+
27
+ uint32_t *blk_lut;
28
+
29
qemu_irq irq;
30
31
/* Properties */
32
diff --git a/hw/misc/tz-mpc.c b/hw/misc/tz-mpc.c
29
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/i2c/smbus_eeprom.c
34
--- a/hw/misc/tz-mpc.c
31
+++ b/hw/i2c/smbus_eeprom.c
35
+++ b/hw/misc/tz-mpc.c
32
@@ -XXX,XX +XXX,XX @@ static void smbus_eeprom_register_types(void)
36
@@ -XXX,XX +XXX,XX @@ enum {
33
37
34
type_init(smbus_eeprom_register_types)
38
/* Config registers */
35
39
REG32(CTRL, 0x00)
36
+void smbus_eeprom_init_one(I2CBus *smbus, uint8_t address, uint8_t *eeprom_buf)
40
+ FIELD(CTRL, SEC_RESP, 4, 1)
41
+ FIELD(CTRL, AUTOINC, 8, 1)
42
+ FIELD(CTRL, LOCKDOWN, 31, 1)
43
REG32(BLK_MAX, 0x10)
44
REG32(BLK_CFG, 0x14)
45
REG32(BLK_IDX, 0x18)
46
REG32(BLK_LUT, 0x1c)
47
REG32(INT_STAT, 0x20)
48
+ FIELD(INT_STAT, IRQ, 0, 1)
49
REG32(INT_CLEAR, 0x24)
50
+ FIELD(INT_CLEAR, IRQ, 0, 1)
51
REG32(INT_EN, 0x28)
52
+ FIELD(INT_EN, IRQ, 0, 1)
53
REG32(INT_INFO1, 0x2c)
54
REG32(INT_INFO2, 0x30)
55
REG32(INT_SET, 0x34)
56
+ FIELD(INT_SET, IRQ, 0, 1)
57
REG32(PIDR4, 0xfd0)
58
REG32(PIDR5, 0xfd4)
59
REG32(PIDR6, 0xfd8)
60
@@ -XXX,XX +XXX,XX @@ static const uint8_t tz_mpc_idregs[] = {
61
0x0d, 0xf0, 0x05, 0xb1,
62
};
63
64
+static void tz_mpc_irq_update(TZMPC *s)
37
+{
65
+{
38
+ DeviceState *dev;
66
+ qemu_set_irq(s->irq, s->int_stat && s->int_en);
39
+
40
+ dev = qdev_create((BusState *) smbus, "smbus-eeprom");
41
+ qdev_prop_set_uint8(dev, "address", address);
42
+ qdev_prop_set_ptr(dev, "data", eeprom_buf);
43
+ qdev_init_nofail(dev);
44
+}
67
+}
45
+
68
+
46
void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
69
+static void tz_mpc_autoinc_idx(TZMPC *s, unsigned access_size)
47
const uint8_t *eeprom_spd, int eeprom_spd_size)
70
+{
71
+ /* Auto-increment BLK_IDX if necessary */
72
+ if (access_size == 4 && (s->ctrl & R_CTRL_AUTOINC_MASK)) {
73
+ s->blk_idx++;
74
+ s->blk_idx %= s->blk_max;
75
+ }
76
+}
77
+
78
static MemTxResult tz_mpc_reg_read(void *opaque, hwaddr addr,
79
uint64_t *pdata,
80
unsigned size, MemTxAttrs attrs)
48
{
81
{
49
@@ -XXX,XX +XXX,XX @@ void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
82
+ TZMPC *s = TZ_MPC(opaque);
83
uint64_t r;
84
uint32_t offset = addr & ~0x3;
85
86
@@ -XXX,XX +XXX,XX @@ static MemTxResult tz_mpc_reg_read(void *opaque, hwaddr addr,
50
}
87
}
51
88
52
for (i = 0; i < nb_eeprom; i++) {
89
switch (offset) {
53
- DeviceState *eeprom;
90
+ case A_CTRL:
54
- eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
91
+ r = s->ctrl;
55
- qdev_prop_set_uint8(eeprom, "address", 0x50 + i);
92
+ break;
56
- qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
93
+ case A_BLK_MAX:
57
- qdev_init_nofail(eeprom);
94
+ r = s->blk_max;
58
+ smbus_eeprom_init_one(smbus, 0x50 + i, eeprom_buf + (i * 256));
95
+ break;
96
+ case A_BLK_CFG:
97
+ /* We are never in "init in progress state", so this just indicates
98
+ * the block size. s->blocksize == (1 << BLK_CFG + 5), so
99
+ * BLK_CFG == ctz32(s->blocksize) - 5
100
+ */
101
+ r = ctz32(s->blocksize) - 5;
102
+ break;
103
+ case A_BLK_IDX:
104
+ r = s->blk_idx;
105
+ break;
106
+ case A_BLK_LUT:
107
+ r = s->blk_lut[s->blk_idx];
108
+ tz_mpc_autoinc_idx(s, size);
109
+ break;
110
+ case A_INT_STAT:
111
+ r = s->int_stat;
112
+ break;
113
+ case A_INT_EN:
114
+ r = s->int_en;
115
+ break;
116
+ case A_INT_INFO1:
117
+ r = s->int_info1;
118
+ break;
119
+ case A_INT_INFO2:
120
+ r = s->int_info2;
121
+ break;
122
case A_PIDR4:
123
case A_PIDR5:
124
case A_PIDR6:
125
@@ -XXX,XX +XXX,XX @@ static MemTxResult tz_mpc_reg_write(void *opaque, hwaddr addr,
126
uint64_t value,
127
unsigned size, MemTxAttrs attrs)
128
{
129
+ TZMPC *s = TZ_MPC(opaque);
130
uint32_t offset = addr & ~0x3;
131
132
trace_tz_mpc_reg_write(addr, value, size);
133
@@ -XXX,XX +XXX,XX @@ static MemTxResult tz_mpc_reg_write(void *opaque, hwaddr addr,
134
uint32_t oldval;
135
136
switch (offset) {
137
- /* As we add support for registers which need expansions
138
- * other than zeroes we'll fill in cases here.
139
- */
140
+ case A_CTRL:
141
+ oldval = s->ctrl;
142
+ break;
143
+ case A_BLK_IDX:
144
+ oldval = s->blk_idx;
145
+ break;
146
+ case A_BLK_LUT:
147
+ oldval = s->blk_lut[s->blk_idx];
148
+ break;
149
default:
150
oldval = 0;
151
break;
152
@@ -XXX,XX +XXX,XX @@ static MemTxResult tz_mpc_reg_write(void *opaque, hwaddr addr,
153
value = deposit32(oldval, (addr & 3) * 8, size * 8, value);
59
}
154
}
155
156
+ if ((s->ctrl & R_CTRL_LOCKDOWN_MASK) &&
157
+ (offset == A_CTRL || offset == A_BLK_LUT || offset == A_INT_EN)) {
158
+ /* Lockdown mode makes these three registers read-only, and
159
+ * the only way out of it is to reset the device.
160
+ */
161
+ qemu_log_mask(LOG_GUEST_ERROR, "TZ MPC register write to offset 0x%x "
162
+ "while MPC is in lockdown mode\n", offset);
163
+ return MEMTX_OK;
164
+ }
165
+
166
switch (offset) {
167
+ case A_CTRL:
168
+ /* We don't implement the 'data gating' feature so all other bits
169
+ * are reserved and we make them RAZ/WI.
170
+ */
171
+ s->ctrl = value & (R_CTRL_SEC_RESP_MASK |
172
+ R_CTRL_AUTOINC_MASK |
173
+ R_CTRL_LOCKDOWN_MASK);
174
+ break;
175
+ case A_BLK_IDX:
176
+ s->blk_idx = value % s->blk_max;
177
+ break;
178
+ case A_BLK_LUT:
179
+ s->blk_lut[s->blk_idx] = value;
180
+ tz_mpc_autoinc_idx(s, size);
181
+ break;
182
+ case A_INT_CLEAR:
183
+ if (value & R_INT_CLEAR_IRQ_MASK) {
184
+ s->int_stat = 0;
185
+ tz_mpc_irq_update(s);
186
+ }
187
+ break;
188
+ case A_INT_EN:
189
+ s->int_en = value & R_INT_EN_IRQ_MASK;
190
+ tz_mpc_irq_update(s);
191
+ break;
192
+ case A_INT_SET:
193
+ if (value & R_INT_SET_IRQ_MASK) {
194
+ s->int_stat = R_INT_STAT_IRQ_MASK;
195
+ tz_mpc_irq_update(s);
196
+ }
197
+ break;
198
case A_PIDR4:
199
case A_PIDR5:
200
case A_PIDR6:
201
@@ -XXX,XX +XXX,XX @@ static int tz_mpc_num_indexes(IOMMUMemoryRegion *iommu)
202
203
static void tz_mpc_reset(DeviceState *dev)
204
{
205
+ TZMPC *s = TZ_MPC(dev);
206
+
207
+ s->ctrl = 0x00000100;
208
+ s->blk_idx = 0;
209
+ s->int_stat = 0;
210
+ s->int_en = 1;
211
+ s->int_info1 = 0;
212
+ s->int_info2 = 0;
213
+
214
+ memset(s->blk_lut, 0, s->blk_max * sizeof(uint32_t));
60
}
215
}
216
217
static void tz_mpc_init(Object *obj)
218
@@ -XXX,XX +XXX,XX @@ static void tz_mpc_realize(DeviceState *dev, Error **errp)
219
"tz-mpc-downstream");
220
address_space_init(&s->blocked_io_as, &s->blocked_io,
221
"tz-mpc-blocked-io");
222
+
223
+ s->blk_lut = g_new(uint32_t, s->blk_max);
224
+}
225
+
226
+static int tz_mpc_post_load(void *opaque, int version_id)
227
+{
228
+ TZMPC *s = TZ_MPC(opaque);
229
+
230
+ /* Check the incoming data doesn't point blk_idx off the end of blk_lut. */
231
+ if (s->blk_idx >= s->blk_max) {
232
+ return -1;
233
+ }
234
+ return 0;
235
}
236
237
static const VMStateDescription tz_mpc_vmstate = {
238
.name = "tz-mpc",
239
.version_id = 1,
240
.minimum_version_id = 1,
241
+ .post_load = tz_mpc_post_load,
242
.fields = (VMStateField[]) {
243
+ VMSTATE_UINT32(ctrl, TZMPC),
244
+ VMSTATE_UINT32(blk_idx, TZMPC),
245
+ VMSTATE_UINT32(int_stat, TZMPC),
246
+ VMSTATE_UINT32(int_en, TZMPC),
247
+ VMSTATE_UINT32(int_info1, TZMPC),
248
+ VMSTATE_UINT32(int_info2, TZMPC),
249
+ VMSTATE_VARRAY_UINT32(blk_lut, TZMPC, blk_max,
250
+ 0, vmstate_info_uint32, uint32_t),
251
VMSTATE_END_OF_LIST()
252
}
253
};
61
--
254
--
62
2.17.1
255
2.17.1
63
256
64
257
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
The MPC is guest-configurable for whether blocked accesses:
2
* should be RAZ/WI or cause a bus error
3
* should generate an interrupt or not
2
4
3
The maximum frame size includes the CRC and depends if a VLAN tag is
5
Implement this behaviour in the blocked-access handlers.
4
inserted or not. Adjust the frame size limit in the transmit handler
5
using on the FTGMAC100State buffer size and in the receive handler use
6
the packet protocol.
7
6
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20180530061711.23673-2-clg@kaod.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Message-id: 20180620132032.28865-4-peter.maydell@linaro.org
12
---
10
---
13
include/hw/net/ftgmac100.h | 7 ++++++-
11
hw/misc/tz-mpc.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++--
14
hw/net/ftgmac100.c | 23 ++++++++++++-----------
12
1 file changed, 48 insertions(+), 2 deletions(-)
15
2 files changed, 18 insertions(+), 12 deletions(-)
16
13
17
diff --git a/include/hw/net/ftgmac100.h b/include/hw/net/ftgmac100.h
14
diff --git a/hw/misc/tz-mpc.c b/hw/misc/tz-mpc.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/net/ftgmac100.h
16
--- a/hw/misc/tz-mpc.c
20
+++ b/include/hw/net/ftgmac100.h
17
+++ b/hw/misc/tz-mpc.c
21
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ REG32(INT_EN, 0x28)
22
#include "hw/sysbus.h"
19
FIELD(INT_EN, IRQ, 0, 1)
23
#include "net/net.h"
20
REG32(INT_INFO1, 0x2c)
24
21
REG32(INT_INFO2, 0x30)
25
+/*
22
+ FIELD(INT_INFO2, HMASTER, 0, 16)
26
+ * Max frame size for the receiving buffer
23
+ FIELD(INT_INFO2, HNONSEC, 16, 1)
27
+ */
24
+ FIELD(INT_INFO2, CFG_NS, 17, 1)
28
+#define FTGMAC100_MAX_FRAME_SIZE 9220
25
REG32(INT_SET, 0x34)
26
FIELD(INT_SET, IRQ, 0, 1)
27
REG32(PIDR4, 0xfd0)
28
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps tz_mpc_reg_ops = {
29
.impl.max_access_size = 4,
30
};
31
32
+static inline bool tz_mpc_cfg_ns(TZMPC *s, hwaddr addr)
33
+{
34
+ /* Return the cfg_ns bit from the LUT for the specified address */
35
+ hwaddr blknum = addr / s->blocksize;
36
+ hwaddr blkword = blknum / 32;
37
+ uint32_t blkbit = 1U << (blknum % 32);
29
+
38
+
30
typedef struct FTGMAC100State {
39
+ /* This would imply the address was larger than the size we
31
/*< private >*/
40
+ * defined this memory region to be, so it can't happen.
32
SysBusDevice parent_obj;
41
+ */
33
@@ -XXX,XX +XXX,XX @@ typedef struct FTGMAC100State {
42
+ assert(blkword < s->blk_max);
34
qemu_irq irq;
43
+ return s->blk_lut[blkword] & blkbit;
35
MemoryRegion iomem;
44
+}
36
45
+
37
- uint8_t *frame;
46
+static MemTxResult tz_mpc_handle_block(TZMPC *s, hwaddr addr, MemTxAttrs attrs)
38
+ uint8_t frame[FTGMAC100_MAX_FRAME_SIZE];
47
+{
39
48
+ /* Handle a blocked transaction: raise IRQ, capture info, etc */
40
uint32_t irq_state;
49
+ if (!s->int_stat) {
41
uint32_t isr;
50
+ /* First blocked transfer: capture information into INT_INFO1 and
42
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
51
+ * INT_INFO2. Subsequent transfers are still blocked but don't
43
index XXXXXXX..XXXXXXX 100644
52
+ * capture information until the guest clears the interrupt.
44
--- a/hw/net/ftgmac100.c
53
+ */
45
+++ b/hw/net/ftgmac100.c
54
+
46
@@ -XXX,XX +XXX,XX @@ typedef struct {
55
+ s->int_info1 = addr;
47
/*
56
+ s->int_info2 = 0;
48
* Max frame size for the receiving buffer
57
+ s->int_info2 = FIELD_DP32(s->int_info2, INT_INFO2, HMASTER,
49
*/
58
+ attrs.requester_id & 0xffff);
50
-#define FTGMAC100_MAX_FRAME_SIZE 10240
59
+ s->int_info2 = FIELD_DP32(s->int_info2, INT_INFO2, HNONSEC,
51
+#define FTGMAC100_MAX_FRAME_SIZE 9220
60
+ ~attrs.secure);
52
61
+ s->int_info2 = FIELD_DP32(s->int_info2, INT_INFO2, CFG_NS,
53
/* Limits depending on the type of the frame
62
+ tz_mpc_cfg_ns(s, addr));
54
*
63
+ s->int_stat |= R_INT_STAT_IRQ_MASK;
55
* 9216 for Jumbo frames (+ 4 for VLAN)
64
+ tz_mpc_irq_update(s);
56
* 1518 for other frames (+ 4 for VLAN)
65
+ }
57
*/
66
+
58
-static int ftgmac100_max_frame_size(FTGMAC100State *s)
67
+ /* Generate bus error if desired; otherwise RAZ/WI */
59
+static int ftgmac100_max_frame_size(FTGMAC100State *s, uint16_t proto)
68
+ return (s->ctrl & R_CTRL_SEC_RESP_MASK) ? MEMTX_ERROR : MEMTX_OK;
69
+}
70
+
71
/* Accesses only reach these read and write functions if the MPC is
72
* blocking them; non-blocked accesses go directly to the downstream
73
* memory region without passing through this code.
74
@@ -XXX,XX +XXX,XX @@ static MemTxResult tz_mpc_mem_blocked_read(void *opaque, hwaddr addr,
75
uint64_t *pdata,
76
unsigned size, MemTxAttrs attrs)
60
{
77
{
61
- return (s->maccr & FTGMAC100_MACCR_JUMBO_LF ? 9216 : 1518) + 4;
78
+ TZMPC *s = TZ_MPC(opaque);
62
+ int max = (s->maccr & FTGMAC100_MACCR_JUMBO_LF ? 9216 : 1518);
63
+
79
+
64
+ return max + (proto == ETH_P_VLAN ? 4 : 0);
80
trace_tz_mpc_mem_blocked_read(addr, size, attrs.secure);
81
82
*pdata = 0;
83
- return MEMTX_OK;
84
+ return tz_mpc_handle_block(s, addr, attrs);
65
}
85
}
66
86
67
static void ftgmac100_update_irq(FTGMAC100State *s)
87
static MemTxResult tz_mpc_mem_blocked_write(void *opaque, hwaddr addr,
68
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
88
uint64_t value,
69
uint8_t *ptr = s->frame;
89
unsigned size, MemTxAttrs attrs)
70
uint32_t addr = tx_descriptor;
90
{
71
uint32_t flags = 0;
91
+ TZMPC *s = TZ_MPC(opaque);
72
- int max_frame_size = ftgmac100_max_frame_size(s);
92
+
73
93
trace_tz_mpc_mem_blocked_write(addr, value, size, attrs.secure);
74
while (1) {
94
75
FTGMAC100Desc bd;
95
- return MEMTX_OK;
76
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
96
+ return tz_mpc_handle_block(s, addr, attrs);
77
flags = bd.des1;
78
}
79
80
- len = bd.des0 & 0x3FFF;
81
- if (frame_size + len > max_frame_size) {
82
+ len = FTGMAC100_TXDES0_TXBUF_SIZE(bd.des0);
83
+ if (frame_size + len > sizeof(s->frame)) {
84
qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %d bytes\n",
85
__func__, len);
86
- len = max_frame_size - frame_size;
87
+ s->isr |= FTGMAC100_INT_XPKT_LOST;
88
+ len = sizeof(s->frame) - frame_size;
89
}
90
91
if (dma_memory_read(&address_space_memory, bd.des3, ptr, len)) {
92
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
93
uint32_t buf_len;
94
size_t size = len;
95
uint32_t first = FTGMAC100_RXDES0_FRS;
96
- int max_frame_size = ftgmac100_max_frame_size(s);
97
+ uint16_t proto = be16_to_cpu(PKT_GET_ETH_HDR(buf)->h_proto);
98
+ int max_frame_size = ftgmac100_max_frame_size(s, proto);
99
100
if ((s->maccr & (FTGMAC100_MACCR_RXDMA_EN | FTGMAC100_MACCR_RXMAC_EN))
101
!= (FTGMAC100_MACCR_RXDMA_EN | FTGMAC100_MACCR_RXMAC_EN)) {
102
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
103
104
/* Huge frames are truncated. */
105
if (size > max_frame_size) {
106
- size = max_frame_size;
107
qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %zd bytes\n",
108
__func__, size);
109
+ size = max_frame_size;
110
flags |= FTGMAC100_RXDES0_FTL;
111
}
112
113
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_realize(DeviceState *dev, Error **errp)
114
object_get_typename(OBJECT(dev)), DEVICE(dev)->id,
115
s);
116
qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
117
-
118
- s->frame = g_malloc(FTGMAC100_MAX_FRAME_SIZE);
119
}
97
}
120
98
121
static const VMStateDescription vmstate_ftgmac100 = {
99
static const MemoryRegionOps tz_mpc_mem_blocked_ops = {
122
--
100
--
123
2.17.1
101
2.17.1
124
102
125
103
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The final part of the Memory Protection Controller we need to
2
implement is actually using the BLK_LUT data programmed by the
3
guest to determine whether to block the transaction or not.
2
4
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Since this means we now change transaction mappings when
4
Message-id: 20180606152128.449-8-f4bug@amsat.org
6
the guest writes to BLK_LUT, we must also call the IOMMU
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
notifiers at that point.
8
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
11
Message-id: 20180620132032.28865-5-peter.maydell@linaro.org
7
---
12
---
8
hw/arm/stellaris.c | 11 ++++++-----
13
hw/misc/tz-mpc.c | 53 ++++++++++++++++++++++++++++++++++++++++++--
9
1 file changed, 6 insertions(+), 5 deletions(-)
14
hw/misc/trace-events | 1 +
15
2 files changed, 52 insertions(+), 2 deletions(-)
10
16
11
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
17
diff --git a/hw/misc/tz-mpc.c b/hw/misc/tz-mpc.c
12
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/stellaris.c
19
--- a/hw/misc/tz-mpc.c
14
+++ b/hw/arm/stellaris.c
20
+++ b/hw/misc/tz-mpc.c
15
@@ -XXX,XX +XXX,XX @@ static uint64_t gptm_read(void *opaque, hwaddr offset,
21
@@ -XXX,XX +XXX,XX @@ static void tz_mpc_irq_update(TZMPC *s)
16
return s->rtc;
22
qemu_set_irq(s->irq, s->int_stat && s->int_en);
17
}
23
}
18
qemu_log_mask(LOG_UNIMP,
24
19
- "GPTM: read of TAR but timer read not supported");
25
+static void tz_mpc_iommu_notify(TZMPC *s, uint32_t lutidx,
20
+ "GPTM: read of TAR but timer read not supported\n");
26
+ uint32_t oldlut, uint32_t newlut)
21
return 0;
27
+{
22
case 0x4c: /* TBR */
28
+ /* Called when the LUT word at lutidx has changed from oldlut to newlut;
23
qemu_log_mask(LOG_UNIMP,
29
+ * must call the IOMMU notifiers for the changed blocks.
24
- "GPTM: read of TBR but timer read not supported");
30
+ */
25
+ "GPTM: read of TBR but timer read not supported\n");
31
+ IOMMUTLBEntry entry = {
26
return 0;
32
+ .addr_mask = s->blocksize - 1,
27
default:
33
+ };
28
qemu_log_mask(LOG_GUEST_ERROR,
34
+ hwaddr addr = lutidx * s->blocksize * 32;
29
@@ -XXX,XX +XXX,XX @@ static void stellaris_i2c_write(void *opaque, hwaddr offset,
35
+ int i;
36
+
37
+ for (i = 0; i < 32; i++, addr += s->blocksize) {
38
+ bool block_is_ns;
39
+
40
+ if (!((oldlut ^ newlut) & (1 << i))) {
41
+ continue;
42
+ }
43
+ /* This changes the mappings for both the S and the NS space,
44
+ * so we need to do four notifies: an UNMAP then a MAP for each.
45
+ */
46
+ block_is_ns = newlut & (1 << i);
47
+
48
+ trace_tz_mpc_iommu_notify(addr);
49
+ entry.iova = addr;
50
+ entry.translated_addr = addr;
51
+
52
+ entry.perm = IOMMU_NONE;
53
+ memory_region_notify_iommu(&s->upstream, IOMMU_IDX_S, entry);
54
+ memory_region_notify_iommu(&s->upstream, IOMMU_IDX_NS, entry);
55
+
56
+ entry.perm = IOMMU_RW;
57
+ if (block_is_ns) {
58
+ entry.target_as = &s->blocked_io_as;
59
+ } else {
60
+ entry.target_as = &s->downstream_as;
61
+ }
62
+ memory_region_notify_iommu(&s->upstream, IOMMU_IDX_S, entry);
63
+ if (block_is_ns) {
64
+ entry.target_as = &s->downstream_as;
65
+ } else {
66
+ entry.target_as = &s->blocked_io_as;
67
+ }
68
+ memory_region_notify_iommu(&s->upstream, IOMMU_IDX_NS, entry);
69
+ }
70
+}
71
+
72
static void tz_mpc_autoinc_idx(TZMPC *s, unsigned access_size)
73
{
74
/* Auto-increment BLK_IDX if necessary */
75
@@ -XXX,XX +XXX,XX @@ static MemTxResult tz_mpc_reg_write(void *opaque, hwaddr addr,
76
s->blk_idx = value % s->blk_max;
30
break;
77
break;
31
case 0x20: /* MCR */
78
case A_BLK_LUT:
32
if (value & 1) {
79
+ tz_mpc_iommu_notify(s, s->blk_idx, s->blk_lut[s->blk_idx], value);
33
- qemu_log_mask(LOG_UNIMP, "stellaris_i2c: Loopback not implemented");
80
s->blk_lut[s->blk_idx] = value;
34
+ qemu_log_mask(LOG_UNIMP,
81
tz_mpc_autoinc_idx(s, size);
35
+ "stellaris_i2c: Loopback not implemented\n");
36
}
37
if (value & 0x20) {
38
qemu_log_mask(LOG_UNIMP,
39
- "stellaris_i2c: Slave mode not implemented");
40
+ "stellaris_i2c: Slave mode not implemented\n");
41
}
42
s->mcr = value & 0x31;
43
break;
82
break;
44
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_write(void *opaque, hwaddr offset,
83
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry tz_mpc_translate(IOMMUMemoryRegion *iommu,
45
s->sspri = value;
84
/* Look at the per-block configuration for this address, and
46
break;
85
* return a TLB entry directing the transaction at either
47
case 0x28: /* PSSI */
86
* downstream_as or blocked_io_as, as appropriate.
48
- qemu_log_mask(LOG_UNIMP, "ADC: sample initiate unimplemented");
87
- * For the moment, always permit accesses.
49
+ qemu_log_mask(LOG_UNIMP, "ADC: sample initiate unimplemented\n");
88
+ * If the LUT cfg_ns bit is 1, only non-secure transactions
50
break;
89
+ * may pass. If the bit is 0, only secure transactions may pass.
51
case 0x30: /* SAC */
90
*/
52
s->sac = value;
91
- ok = true;
92
+ ok = tz_mpc_cfg_ns(s, addr) == (iommu_idx == IOMMU_IDX_NS);
93
94
trace_tz_mpc_translate(addr, flags,
95
iommu_idx == IOMMU_IDX_S ? "S" : "NS",
96
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
97
index XXXXXXX..XXXXXXX 100644
98
--- a/hw/misc/trace-events
99
+++ b/hw/misc/trace-events
100
@@ -XXX,XX +XXX,XX @@ tz_mpc_reg_write(uint32_t offset, uint64_t data, unsigned size) "TZ MPC regs wri
101
tz_mpc_mem_blocked_read(uint64_t addr, unsigned size, bool secure) "TZ MPC blocked read: offset 0x%" PRIx64 " size %u secure %d"
102
tz_mpc_mem_blocked_write(uint64_t addr, uint64_t data, unsigned size, bool secure) "TZ MPC blocked write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u secure %d"
103
tz_mpc_translate(uint64_t addr, int flags, const char *idx, const char *res) "TZ MPC translate: addr 0x%" PRIx64 " flags 0x%x iommu_idx %s: %s"
104
+tz_mpc_iommu_notify(uint64_t addr) "TZ MPC iommu: notifying UNMAP/MAP for 0x%" PRIx64
105
106
# hw/misc/tz-ppc.c
107
tz_ppc_reset(void) "TZ PPC: reset"
53
--
108
--
54
2.17.1
109
2.17.1
55
110
56
111
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
Implement the SECMPCINTSTATUS register. This is the only register
2
in the security controller that deals with Memory Protection
3
Controllers, and it simply provides a read-only view of the
4
interrupt lines from the various MPCs in the system.
2
5
3
The Witherspoon boards are OpenPOWER system hosting POWER9 Processors.
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Add support for their BMC including a couple of I2C devices as found
7
Message-id: 20180620132032.28865-6-peter.maydell@linaro.org
5
on real HW.
8
---
9
include/hw/misc/iotkit-secctl.h | 8 +++++++
10
hw/misc/iotkit-secctl.c | 38 +++++++++++++++++++++++++++++++--
11
2 files changed, 44 insertions(+), 2 deletions(-)
6
12
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
13
diff --git a/include/hw/misc/iotkit-secctl.h b/include/hw/misc/iotkit-secctl.h
8
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
9
Message-id: 20180530064049.27976-3-clg@kaod.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/aspeed.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
13
1 file changed, 49 insertions(+)
14
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed.c
15
--- a/include/hw/misc/iotkit-secctl.h
18
+++ b/hw/arm/aspeed.c
16
+++ b/include/hw/misc/iotkit-secctl.h
19
@@ -XXX,XX +XXX,XX @@ enum {
17
@@ -XXX,XX +XXX,XX @@
20
PALMETTO_BMC,
18
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_enable
21
AST2500_EVB,
19
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_clear
22
ROMULUS_BMC,
20
* + named GPIO inputs ahb_ppcexp{0,1,2,3}_irq_status
23
+ WITHERSPOON_BMC,
21
+ * Controlling the MPC in the IoTKit:
22
+ * + named GPIO input mpc_status
23
+ * Controlling each of the 16 expansion MPCs which a system using the IoTKit
24
+ * might provide:
25
+ * + named GPIO inputs mpcexp_status[0..15]
26
*/
27
28
#ifndef IOTKIT_SECCTL_H
29
@@ -XXX,XX +XXX,XX @@
30
#define IOTS_NUM_APB_PPC 2
31
#define IOTS_NUM_APB_EXP_PPC 4
32
#define IOTS_NUM_AHB_EXP_PPC 4
33
+#define IOTS_NUM_EXP_MPC 16
34
+#define IOTS_NUM_MPC 1
35
36
typedef struct IoTKitSecCtl IoTKitSecCtl;
37
38
@@ -XXX,XX +XXX,XX @@ struct IoTKitSecCtl {
39
uint32_t secrespcfg;
40
uint32_t nsccfg;
41
uint32_t brginten;
42
+ uint32_t mpcintstatus;
43
44
IoTKitSecCtlPPC apb[IOTS_NUM_APB_PPC];
45
IoTKitSecCtlPPC apbexp[IOTS_NUM_APB_EXP_PPC];
46
diff --git a/hw/misc/iotkit-secctl.c b/hw/misc/iotkit-secctl.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/misc/iotkit-secctl.c
49
+++ b/hw/misc/iotkit-secctl.c
50
@@ -XXX,XX +XXX,XX @@ static MemTxResult iotkit_secctl_s_read(void *opaque, hwaddr addr,
51
case A_NSCCFG:
52
r = s->nsccfg;
53
break;
54
+ case A_SECMPCINTSTATUS:
55
+ r = s->mpcintstatus;
56
+ break;
57
case A_SECPPCINTSTAT:
58
r = s->secppcintstat;
59
break;
60
@@ -XXX,XX +XXX,XX @@ static MemTxResult iotkit_secctl_s_read(void *opaque, hwaddr addr,
61
case A_APBSPPPCEXP3:
62
r = s->apbexp[offset_to_ppc_idx(offset)].sp;
63
break;
64
- case A_SECMPCINTSTATUS:
65
case A_SECMSCINTSTAT:
66
case A_SECMSCINTEN:
67
case A_NSMSCEXP:
68
@@ -XXX,XX +XXX,XX @@ static void iotkit_secctl_reset(DeviceState *dev)
69
foreach_ppc(s, iotkit_secctl_reset_ppc);
70
}
71
72
+static void iotkit_secctl_mpc_status(void *opaque, int n, int level)
73
+{
74
+ IoTKitSecCtl *s = IOTKIT_SECCTL(opaque);
75
+
76
+ s->mpcintstatus = deposit32(s->mpcintstatus, 0, 1, !!level);
77
+}
78
+
79
+static void iotkit_secctl_mpcexp_status(void *opaque, int n, int level)
80
+{
81
+ IoTKitSecCtl *s = IOTKIT_SECCTL(opaque);
82
+
83
+ s->mpcintstatus = deposit32(s->mpcintstatus, n + 16, 1, !!level);
84
+}
85
+
86
static void iotkit_secctl_ppc_irqstatus(void *opaque, int n, int level)
87
{
88
IoTKitSecCtlPPC *ppc = opaque;
89
@@ -XXX,XX +XXX,XX @@ static void iotkit_secctl_init(Object *obj)
90
qdev_init_gpio_out_named(dev, &s->sec_resp_cfg, "sec_resp_cfg", 1);
91
qdev_init_gpio_out_named(dev, &s->nsc_cfg_irq, "nsc_cfg", 1);
92
93
+ qdev_init_gpio_in_named(dev, iotkit_secctl_mpc_status, "mpc_status", 1);
94
+ qdev_init_gpio_in_named(dev, iotkit_secctl_mpcexp_status,
95
+ "mpcexp_status", IOTS_NUM_EXP_MPC);
96
+
97
memory_region_init_io(&s->s_regs, obj, &iotkit_secctl_s_ops,
98
s, "iotkit-secctl-s-regs", 0x1000);
99
memory_region_init_io(&s->ns_regs, obj, &iotkit_secctl_ns_ops,
100
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription iotkit_secctl_ppc_vmstate = {
101
}
24
};
102
};
25
103
26
/* Palmetto hardware value: 0x120CE416 */
104
+static const VMStateDescription iotkit_secctl_mpcintstatus_vmstate = {
27
@@ -XXX,XX +XXX,XX @@ enum {
105
+ .name = "iotkit-secctl-mpcintstatus",
28
SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
106
+ .version_id = 1,
29
SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
107
+ .minimum_version_id = 1,
30
108
+ .fields = (VMStateField[]) {
31
+/* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
109
+ VMSTATE_UINT32(mpcintstatus, IoTKitSecCtl),
32
+#define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
110
+ VMSTATE_END_OF_LIST()
111
+ }
112
+};
33
+
113
+
34
static void palmetto_bmc_i2c_init(AspeedBoardState *bmc);
114
static const VMStateDescription iotkit_secctl_vmstate = {
35
static void ast2500_evb_i2c_init(AspeedBoardState *bmc);
115
.name = "iotkit-secctl",
36
+static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc);
116
.version_id = 1,
37
117
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription iotkit_secctl_vmstate = {
38
static const AspeedBoardConfig aspeed_boards[] = {
118
VMSTATE_STRUCT_ARRAY(ahbexp, IoTKitSecCtl, IOTS_NUM_AHB_EXP_PPC, 1,
39
[PALMETTO_BMC] = {
119
iotkit_secctl_ppc_vmstate, IoTKitSecCtlPPC),
40
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
120
VMSTATE_END_OF_LIST()
41
.spi_model = "mx66l1g45g",
121
- }
42
.num_cs = 2,
122
+ },
43
},
123
+ .subsections = (const VMStateDescription*[]) {
44
+ [WITHERSPOON_BMC] = {
124
+ &iotkit_secctl_mpcintstatus_vmstate,
45
+ .soc_name = "ast2500-a1",
125
+ NULL
46
+ .hw_strap1 = WITHERSPOON_BMC_HW_STRAP1,
47
+ .fmc_model = "mx25l25635e",
48
+ .spi_model = "mx66l1g45g",
49
+ .num_cs = 2,
50
+ .i2c_init = witherspoon_bmc_i2c_init,
51
+ },
126
+ },
52
};
127
};
53
128
54
#define FIRMWARE_ADDR 0x0
129
static void iotkit_secctl_class_init(ObjectClass *klass, void *data)
55
@@ -XXX,XX +XXX,XX @@ static const TypeInfo romulus_bmc_type = {
56
.class_init = romulus_bmc_class_init,
57
};
58
59
+static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
60
+{
61
+ AspeedSoCState *soc = &bmc->soc;
62
+
63
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
64
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
65
+
66
+ /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
67
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 9), "tmp105", 0x4a);
68
+}
69
+
70
+static void witherspoon_bmc_init(MachineState *machine)
71
+{
72
+ aspeed_board_init(machine, &aspeed_boards[WITHERSPOON_BMC]);
73
+}
74
+
75
+static void witherspoon_bmc_class_init(ObjectClass *oc, void *data)
76
+{
77
+ MachineClass *mc = MACHINE_CLASS(oc);
78
+
79
+ mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
80
+ mc->init = witherspoon_bmc_init;
81
+ mc->max_cpus = 1;
82
+ mc->no_sdcard = 1;
83
+ mc->no_floppy = 1;
84
+ mc->no_cdrom = 1;
85
+ mc->no_parallel = 1;
86
+}
87
+
88
+static const TypeInfo witherspoon_bmc_type = {
89
+ .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
90
+ .parent = TYPE_MACHINE,
91
+ .class_init = witherspoon_bmc_class_init,
92
+};
93
+
94
static void aspeed_machine_init(void)
95
{
96
type_register_static(&palmetto_bmc_type);
97
type_register_static(&ast2500_evb_type);
98
type_register_static(&romulus_bmc_type);
99
+ type_register_static(&witherspoon_bmc_type);
100
}
101
102
type_init(aspeed_machine_init)
103
--
130
--
104
2.17.1
131
2.17.1
105
132
106
133
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Wire up the one MPC that is part of the IoTKit itself. For the
2
moment we don't wire up its interrupt line.
2
3
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20180606152128.449-6-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Message-id: 20180620132032.28865-7-peter.maydell@linaro.org
7
---
7
---
8
hw/core/register.c | 2 +-
8
include/hw/arm/iotkit.h | 2 ++
9
1 file changed, 1 insertion(+), 1 deletion(-)
9
hw/arm/iotkit.c | 38 +++++++++++++++++++++++++++-----------
10
2 files changed, 29 insertions(+), 11 deletions(-)
10
11
11
diff --git a/hw/core/register.c b/hw/core/register.c
12
diff --git a/include/hw/arm/iotkit.h b/include/hw/arm/iotkit.h
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/core/register.c
14
--- a/include/hw/arm/iotkit.h
14
+++ b/hw/core/register.c
15
+++ b/include/hw/arm/iotkit.h
15
@@ -XXX,XX +XXX,XX @@ void register_write(RegisterInfo *reg, uint64_t val, uint64_t we,
16
@@ -XXX,XX +XXX,XX @@
16
if (test) {
17
#include "hw/arm/armv7m.h"
17
qemu_log_mask(LOG_UNIMP,
18
#include "hw/misc/iotkit-secctl.h"
18
"%s:%s writing %#" PRIx64 " to unimplemented bits:" \
19
#include "hw/misc/tz-ppc.h"
19
- " %#" PRIx64 "",
20
+#include "hw/misc/tz-mpc.h"
20
+ " %#" PRIx64 "\n",
21
#include "hw/timer/cmsdk-apb-timer.h"
21
prefix, reg->access->name, val, ac->unimp);
22
#include "hw/misc/unimp.h"
22
}
23
#include "hw/or-irq.h"
24
@@ -XXX,XX +XXX,XX @@ typedef struct IoTKit {
25
IoTKitSecCtl secctl;
26
TZPPC apb_ppc0;
27
TZPPC apb_ppc1;
28
+ TZMPC mpc;
29
CMSDKAPBTIMER timer0;
30
CMSDKAPBTIMER timer1;
31
qemu_or_irq ppc_irq_orgate;
32
diff --git a/hw/arm/iotkit.c b/hw/arm/iotkit.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/arm/iotkit.c
35
+++ b/hw/arm/iotkit.c
36
@@ -XXX,XX +XXX,XX @@ static void iotkit_init(Object *obj)
37
TYPE_TZ_PPC);
38
init_sysbus_child(obj, "apb-ppc1", &s->apb_ppc1, sizeof(s->apb_ppc1),
39
TYPE_TZ_PPC);
40
+ init_sysbus_child(obj, "mpc", &s->mpc, sizeof(s->mpc), TYPE_TZ_MPC);
41
init_sysbus_child(obj, "timer0", &s->timer0, sizeof(s->timer0),
42
TYPE_CMSDK_APB_TIMER);
43
init_sysbus_child(obj, "timer1", &s->timer1, sizeof(s->timer1),
44
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
45
*/
46
make_alias(s, &s->alias3, "alias 3", 0x50000000, 0x10000000, 0x40000000);
47
48
- /* This RAM should be behind a Memory Protection Controller, but we
49
- * don't implement that yet.
50
- */
51
- memory_region_init_ram(&s->sram0, NULL, "iotkit.sram0", 0x00008000, &err);
52
- if (err) {
53
- error_propagate(errp, err);
54
- return;
55
- }
56
- memory_region_add_subregion(&s->container, 0x20000000, &s->sram0);
57
58
/* Security controller */
59
object_property_set_bool(OBJECT(&s->secctl), true, "realized", &err);
60
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
61
qdev_connect_gpio_out_named(dev_secctl, "sec_resp_cfg", 0,
62
qdev_get_gpio_in(dev_splitter, 0));
63
64
+ /* This RAM lives behind the Memory Protection Controller */
65
+ memory_region_init_ram(&s->sram0, NULL, "iotkit.sram0", 0x00008000, &err);
66
+ if (err) {
67
+ error_propagate(errp, err);
68
+ return;
69
+ }
70
+ object_property_set_link(OBJECT(&s->mpc), OBJECT(&s->sram0),
71
+ "downstream", &err);
72
+ if (err) {
73
+ error_propagate(errp, err);
74
+ return;
75
+ }
76
+ object_property_set_bool(OBJECT(&s->mpc), true, "realized", &err);
77
+ if (err) {
78
+ error_propagate(errp, err);
79
+ return;
80
+ }
81
+ /* Map the upstream end of the MPC into the right place... */
82
+ memory_region_add_subregion(&s->container, 0x20000000,
83
+ sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->mpc),
84
+ 1));
85
+ /* ...and its register interface */
86
+ memory_region_add_subregion(&s->container, 0x50083000,
87
+ sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->mpc),
88
+ 0));
89
+
90
/* Devices behind APB PPC0:
91
* 0x40000000: timer0
92
* 0x40001000: timer1
93
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
94
create_unimplemented_device("NS watchdog", 0x40081000, 0x1000);
95
create_unimplemented_device("S watchdog", 0x50081000, 0x1000);
96
97
- create_unimplemented_device("SRAM0 MPC", 0x50083000, 0x1000);
98
-
99
for (i = 0; i < ARRAY_SIZE(s->ppc_irq_splitter); i++) {
100
Object *splitter = OBJECT(&s->ppc_irq_splitter[i]);
23
101
24
--
102
--
25
2.17.1
103
2.17.1
26
104
27
105
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
The interrupt outputs from the MPC in the IoTKit and the expansion
2
MPCs in the board must be wired up to the security controller, and
3
also all ORed together to produce a single line to the NVIC.
2
4
3
The AST2500 EVB does not have an RTC but we can pretend that one is
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
plugged on the I2C bus header.
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 20180620132032.28865-8-peter.maydell@linaro.org
8
---
9
include/hw/arm/iotkit.h | 6 ++++
10
hw/arm/iotkit.c | 74 +++++++++++++++++++++++++++++++++++++++++
11
2 files changed, 80 insertions(+)
5
12
6
The romulus and witherspoon boards expects an Epson RX8900 I2C RTC but
13
diff --git a/include/hw/arm/iotkit.h b/include/hw/arm/iotkit.h
7
a ds1338 is good enough for the basic features we need.
8
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
11
Message-id: 20180530064049.27976-4-clg@kaod.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/aspeed.c | 19 +++++++++++++++++++
15
1 file changed, 19 insertions(+)
16
17
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/aspeed.c
15
--- a/include/hw/arm/iotkit.h
20
+++ b/hw/arm/aspeed.c
16
+++ b/include/hw/arm/iotkit.h
21
@@ -XXX,XX +XXX,XX @@ enum {
17
@@ -XXX,XX +XXX,XX @@
22
18
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_enable
23
static void palmetto_bmc_i2c_init(AspeedBoardState *bmc);
19
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_clear
24
static void ast2500_evb_i2c_init(AspeedBoardState *bmc);
20
* + named GPIO inputs ahb_ppcexp{0,1,2,3}_irq_status
25
+static void romulus_bmc_i2c_init(AspeedBoardState *bmc);
21
+ * Controlling each of the 16 expansion MPCs which a system using the IoTKit
26
static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc);
22
+ * might provide:
27
23
+ * + named GPIO inputs mpcexp_status[0..15]
28
static const AspeedBoardConfig aspeed_boards[] = {
24
*/
29
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
25
30
.fmc_model = "n25q256a",
26
#ifndef IOTKIT_H
31
.spi_model = "mx66l1g45g",
27
@@ -XXX,XX +XXX,XX @@ typedef struct IoTKit {
32
.num_cs = 2,
28
qemu_or_irq ppc_irq_orgate;
33
+ .i2c_init = romulus_bmc_i2c_init,
29
SplitIRQ sec_resp_splitter;
34
},
30
SplitIRQ ppc_irq_splitter[NUM_PPCS];
35
[WITHERSPOON_BMC] = {
31
+ SplitIRQ mpc_irq_splitter[IOTS_NUM_EXP_MPC + IOTS_NUM_MPC];
36
.soc_name = "ast2500-a1",
32
+ qemu_or_irq mpc_irq_orgate;
37
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
33
38
34
UnimplementedDeviceState dualtimer;
39
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
35
UnimplementedDeviceState s32ktimer;
40
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 7), "tmp105", 0x4d);
36
@@ -XXX,XX +XXX,XX @@ typedef struct IoTKit {
37
qemu_irq nsc_cfg_in;
38
39
qemu_irq irq_status_in[NUM_EXTERNAL_PPCS];
40
+ qemu_irq mpcexp_status_in[IOTS_NUM_EXP_MPC];
41
42
uint32_t nsccfg;
43
44
diff --git a/hw/arm/iotkit.c b/hw/arm/iotkit.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/arm/iotkit.c
47
+++ b/hw/arm/iotkit.c
48
@@ -XXX,XX +XXX,XX @@ static void iotkit_init(Object *obj)
49
init_sysbus_child(obj, "apb-ppc1", &s->apb_ppc1, sizeof(s->apb_ppc1),
50
TYPE_TZ_PPC);
51
init_sysbus_child(obj, "mpc", &s->mpc, sizeof(s->mpc), TYPE_TZ_MPC);
52
+ object_initialize(&s->mpc_irq_orgate, sizeof(s->mpc_irq_orgate),
53
+ TYPE_OR_IRQ);
54
+ object_property_add_child(obj, "mpc-irq-orgate",
55
+ OBJECT(&s->mpc_irq_orgate), &error_abort);
56
+ for (i = 0; i < ARRAY_SIZE(s->mpc_irq_splitter); i++) {
57
+ char *name = g_strdup_printf("mpc-irq-splitter-%d", i);
58
+ SplitIRQ *splitter = &s->mpc_irq_splitter[i];
41
+
59
+
42
+ /* The AST2500 EVB does not have an RTC. Let's pretend that one is
60
+ object_initialize(splitter, sizeof(*splitter), TYPE_SPLIT_IRQ);
43
+ * plugged on the I2C bus header */
61
+ object_property_add_child(obj, name, OBJECT(splitter), &error_abort);
44
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
62
+ g_free(name);
63
+ }
64
init_sysbus_child(obj, "timer0", &s->timer0, sizeof(s->timer0),
65
TYPE_CMSDK_APB_TIMER);
66
init_sysbus_child(obj, "timer1", &s->timer1, sizeof(s->timer1),
67
@@ -XXX,XX +XXX,XX @@ static void iotkit_exp_irq(void *opaque, int n, int level)
68
qemu_set_irq(s->exp_irqs[n], level);
45
}
69
}
46
70
47
static void ast2500_evb_init(MachineState *machine)
71
+static void iotkit_mpcexp_status(void *opaque, int n, int level)
48
@@ -XXX,XX +XXX,XX @@ static const TypeInfo ast2500_evb_type = {
49
.class_init = ast2500_evb_class_init,
50
};
51
52
+static void romulus_bmc_i2c_init(AspeedBoardState *bmc)
53
+{
72
+{
54
+ AspeedSoCState *soc = &bmc->soc;
73
+ IoTKit *s = IOTKIT(opaque);
55
+
74
+ qemu_set_irq(s->mpcexp_status_in[n], level);
56
+ /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
57
+ * good enough */
58
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
59
+}
75
+}
60
+
76
+
61
static void romulus_bmc_init(MachineState *machine)
77
static void iotkit_realize(DeviceState *dev, Error **errp)
62
{
78
{
63
aspeed_board_init(machine, &aspeed_boards[ROMULUS_BMC]);
79
IoTKit *s = IOTKIT(dev);
64
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
80
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
65
81
sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->mpc),
66
/* The Witherspoon expects a TMP275 but a TMP105 is compatible */
82
0));
67
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 9), "tmp105", 0x4a);
83
84
+ /* We must OR together lines from the MPC splitters to go to the NVIC */
85
+ object_property_set_int(OBJECT(&s->mpc_irq_orgate),
86
+ IOTS_NUM_EXP_MPC + IOTS_NUM_MPC, "num-lines", &err);
87
+ if (err) {
88
+ error_propagate(errp, err);
89
+ return;
90
+ }
91
+ object_property_set_bool(OBJECT(&s->mpc_irq_orgate), true,
92
+ "realized", &err);
93
+ if (err) {
94
+ error_propagate(errp, err);
95
+ return;
96
+ }
97
+ qdev_connect_gpio_out(DEVICE(&s->mpc_irq_orgate), 0,
98
+ qdev_get_gpio_in(DEVICE(&s->armv7m), 9));
68
+
99
+
69
+ /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
100
/* Devices behind APB PPC0:
70
+ * good enough */
101
* 0x40000000: timer0
71
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
102
* 0x40001000: timer1
72
}
103
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
73
104
g_free(gpioname);
74
static void witherspoon_bmc_init(MachineState *machine)
105
}
106
107
+ /* Wire up the splitters for the MPC IRQs */
108
+ for (i = 0; i < IOTS_NUM_EXP_MPC + IOTS_NUM_MPC; i++) {
109
+ SplitIRQ *splitter = &s->mpc_irq_splitter[i];
110
+ DeviceState *dev_splitter = DEVICE(splitter);
111
+
112
+ object_property_set_int(OBJECT(splitter), 2, "num-lines", &err);
113
+ if (err) {
114
+ error_propagate(errp, err);
115
+ return;
116
+ }
117
+ object_property_set_bool(OBJECT(splitter), true, "realized", &err);
118
+ if (err) {
119
+ error_propagate(errp, err);
120
+ return;
121
+ }
122
+
123
+ if (i < IOTS_NUM_EXP_MPC) {
124
+ /* Splitter input is from GPIO input line */
125
+ s->mpcexp_status_in[i] = qdev_get_gpio_in(dev_splitter, 0);
126
+ qdev_connect_gpio_out(dev_splitter, 0,
127
+ qdev_get_gpio_in_named(dev_secctl,
128
+ "mpcexp_status", i));
129
+ } else {
130
+ /* Splitter input is from our own MPC */
131
+ qdev_connect_gpio_out_named(DEVICE(&s->mpc), "irq", 0,
132
+ qdev_get_gpio_in(dev_splitter, 0));
133
+ qdev_connect_gpio_out(dev_splitter, 0,
134
+ qdev_get_gpio_in_named(dev_secctl,
135
+ "mpc_status", 0));
136
+ }
137
+
138
+ qdev_connect_gpio_out(dev_splitter, 1,
139
+ qdev_get_gpio_in(DEVICE(&s->mpc_irq_orgate), i));
140
+ }
141
+ /* Create GPIO inputs which will pass the line state for our
142
+ * mpcexp_irq inputs to the correct splitter devices.
143
+ */
144
+ qdev_init_gpio_in_named(dev, iotkit_mpcexp_status, "mpcexp_status",
145
+ IOTS_NUM_EXP_MPC);
146
+
147
iotkit_forward_sec_resp_cfg(s);
148
149
system_clock_scale = NANOSECONDS_PER_SECOND / s->mainclk_frq;
75
--
150
--
76
2.17.1
151
2.17.1
77
152
78
153
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
Instantiate and wire up the Memory Protection Controllers
2
in the MPS2 board itself.
2
3
3
Signed-off-by: Cédric Le Goater <clg@kaod.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180530064049.27976-2-clg@kaod.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Message-id: 20180620132032.28865-9-peter.maydell@linaro.org
7
---
7
---
8
hw/arm/aspeed.c | 3 ---
8
hw/arm/mps2-tz.c | 71 ++++++++++++++++++++++++++++++------------------
9
1 file changed, 3 deletions(-)
9
1 file changed, 44 insertions(+), 27 deletions(-)
10
10
11
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
11
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/aspeed.c
13
--- a/hw/arm/mps2-tz.c
14
+++ b/hw/arm/aspeed.c
14
+++ b/hw/arm/mps2-tz.c
15
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_class_init(ObjectClass *oc, void *data)
15
@@ -XXX,XX +XXX,XX @@
16
mc->no_floppy = 1;
16
#include "hw/timer/cmsdk-apb-timer.h"
17
mc->no_cdrom = 1;
17
#include "hw/misc/mps2-scc.h"
18
mc->no_parallel = 1;
18
#include "hw/misc/mps2-fpgaio.h"
19
- mc->ignore_memory_transaction_failures = true;
19
+#include "hw/misc/tz-mpc.h"
20
#include "hw/arm/iotkit.h"
21
#include "hw/devices.h"
22
#include "net/net.h"
23
@@ -XXX,XX +XXX,XX @@ typedef struct {
24
25
IoTKit iotkit;
26
MemoryRegion psram;
27
- MemoryRegion ssram1;
28
+ MemoryRegion ssram[3];
29
MemoryRegion ssram1_m;
30
- MemoryRegion ssram23;
31
MPS2SCC scc;
32
MPS2FPGAIO fpgaio;
33
TZPPC ppc[5];
34
- UnimplementedDeviceState ssram_mpc[3];
35
+ TZMPC ssram_mpc[3];
36
UnimplementedDeviceState spi[5];
37
UnimplementedDeviceState i2c[4];
38
UnimplementedDeviceState i2s_audio;
39
@@ -XXX,XX +XXX,XX @@ typedef struct {
40
/* Main SYSCLK frequency in Hz */
41
#define SYSCLK_FRQ 20000000
42
43
-/* Initialize the auxiliary RAM region @mr and map it into
44
- * the memory map at @base.
45
- */
46
-static void make_ram(MemoryRegion *mr, const char *name,
47
- hwaddr base, hwaddr size)
48
-{
49
- memory_region_init_ram(mr, NULL, name, size, &error_fatal);
50
- memory_region_add_subregion(get_system_memory(), base, mr);
51
-}
52
-
53
/* Create an alias of an entire original MemoryRegion @orig
54
* located at @base in the memory map.
55
*/
56
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_eth_dev(MPS2TZMachineState *mms, void *opaque,
57
return sysbus_mmio_get_region(s, 0);
20
}
58
}
21
59
22
static const TypeInfo palmetto_bmc_type = {
60
+static MemoryRegion *make_mpc(MPS2TZMachineState *mms, void *opaque,
23
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_class_init(ObjectClass *oc, void *data)
61
+ const char *name, hwaddr size)
24
mc->no_floppy = 1;
62
+{
25
mc->no_cdrom = 1;
63
+ TZMPC *mpc = opaque;
26
mc->no_parallel = 1;
64
+ int i = mpc - &mms->ssram_mpc[0];
27
- mc->ignore_memory_transaction_failures = true;
65
+ MemoryRegion *ssram = &mms->ssram[i];
28
}
66
+ MemoryRegion *upstream;
29
67
+ char *mpcname = g_strdup_printf("%s-mpc", name);
30
static const TypeInfo ast2500_evb_type = {
68
+ static uint32_t ramsize[] = { 0x00400000, 0x00200000, 0x00200000 };
31
@@ -XXX,XX +XXX,XX @@ static void romulus_bmc_class_init(ObjectClass *oc, void *data)
69
+ static uint32_t rambase[] = { 0x00000000, 0x28000000, 0x28200000 };
32
mc->no_floppy = 1;
70
+
33
mc->no_cdrom = 1;
71
+ memory_region_init_ram(ssram, NULL, name, ramsize[i], &error_fatal);
34
mc->no_parallel = 1;
72
+
35
- mc->ignore_memory_transaction_failures = true;
73
+ init_sysbus_child(OBJECT(mms), mpcname, mpc,
36
}
74
+ sizeof(mms->ssram_mpc[0]), TYPE_TZ_MPC);
37
75
+ object_property_set_link(OBJECT(mpc), OBJECT(ssram),
38
static const TypeInfo romulus_bmc_type = {
76
+ "downstream", &error_fatal);
77
+ object_property_set_bool(OBJECT(mpc), true, "realized", &error_fatal);
78
+ /* Map the upstream end of the MPC into system memory */
79
+ upstream = sysbus_mmio_get_region(SYS_BUS_DEVICE(mpc), 1);
80
+ memory_region_add_subregion(get_system_memory(), rambase[i], upstream);
81
+ /* and connect its interrupt to the IoTKit */
82
+ qdev_connect_gpio_out_named(DEVICE(mpc), "irq", 0,
83
+ qdev_get_gpio_in_named(DEVICE(&mms->iotkit),
84
+ "mpcexp_status", i));
85
+
86
+ /* The first SSRAM is a special case as it has an alias; accesses to
87
+ * the alias region at 0x00400000 must also go to the MPC upstream.
88
+ */
89
+ if (i == 0) {
90
+ make_ram_alias(&mms->ssram1_m, "mps.ssram1_m", upstream, 0x00400000);
91
+ }
92
+
93
+ g_free(mpcname);
94
+ /* Return the register interface MR for our caller to map behind the PPC */
95
+ return sysbus_mmio_get_region(SYS_BUS_DEVICE(mpc), 0);
96
+}
97
+
98
static void mps2tz_common_init(MachineState *machine)
99
{
100
MPS2TZMachineState *mms = MPS2TZ_MACHINE(machine);
101
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
102
NULL, "mps.ram", 0x01000000);
103
memory_region_add_subregion(system_memory, 0x80000000, &mms->psram);
104
105
- /* The SSRAM memories should all be behind Memory Protection Controllers,
106
- * but we don't implement that yet.
107
- */
108
- make_ram(&mms->ssram1, "mps.ssram1", 0x00000000, 0x00400000);
109
- make_ram_alias(&mms->ssram1_m, "mps.ssram1_m", &mms->ssram1, 0x00400000);
110
-
111
- make_ram(&mms->ssram23, "mps.ssram23", 0x28000000, 0x00400000);
112
-
113
/* The overflow IRQs for all UARTs are ORed together.
114
* Tx, Rx and "combined" IRQs are sent to the NVIC separately.
115
* Create the OR gate for this.
116
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
117
const PPCInfo ppcs[] = { {
118
.name = "apb_ppcexp0",
119
.ports = {
120
- { "ssram-mpc0", make_unimp_dev, &mms->ssram_mpc[0],
121
- 0x58007000, 0x1000 },
122
- { "ssram-mpc1", make_unimp_dev, &mms->ssram_mpc[1],
123
- 0x58008000, 0x1000 },
124
- { "ssram-mpc2", make_unimp_dev, &mms->ssram_mpc[2],
125
- 0x58009000, 0x1000 },
126
+ { "ssram-0", make_mpc, &mms->ssram_mpc[0], 0x58007000, 0x1000 },
127
+ { "ssram-1", make_mpc, &mms->ssram_mpc[1], 0x58008000, 0x1000 },
128
+ { "ssram-2", make_mpc, &mms->ssram_mpc[2], 0x58009000, 0x1000 },
129
},
130
}, {
131
.name = "apb_ppcexp1",
39
--
132
--
40
2.17.1
133
2.17.1
41
134
42
135
diff view generated by jsdifflib
Deleted patch
1
From: Cédric Le Goater <clg@kaod.org>
2
1
3
The Aspeed boards have at least one EEPROM to hold the Vital Product
4
Data (VPD).
5
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
8
Message-id: 20180530064049.27976-6-clg@kaod.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/aspeed.c | 13 +++++++++++++
12
1 file changed, 13 insertions(+)
13
14
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/aspeed.c
17
+++ b/hw/arm/aspeed.c
18
@@ -XXX,XX +XXX,XX @@
19
#include "hw/arm/arm.h"
20
#include "hw/arm/aspeed_soc.h"
21
#include "hw/boards.h"
22
+#include "hw/i2c/smbus.h"
23
#include "qemu/log.h"
24
#include "sysemu/block-backend.h"
25
#include "hw/loader.h"
26
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_i2c_init(AspeedBoardState *bmc)
27
{
28
AspeedSoCState *soc = &bmc->soc;
29
DeviceState *dev;
30
+ uint8_t *eeprom_buf = g_malloc0(32 * 1024);
31
32
/* The palmetto platform expects a ds3231 RTC but a ds1338 is
33
* enough to provide basic RTC features. Alarms will be missing */
34
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 0), "ds1338", 0x68);
35
36
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 0), 0x50,
37
+ eeprom_buf);
38
+
39
/* add a TMP423 temperature sensor */
40
dev = i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 2),
41
"tmp423", 0x4c);
42
@@ -XXX,XX +XXX,XX @@ static const TypeInfo palmetto_bmc_type = {
43
static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
44
{
45
AspeedSoCState *soc = &bmc->soc;
46
+ uint8_t *eeprom_buf = g_malloc0(8 * 1024);
47
+
48
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 3), 0x50,
49
+ eeprom_buf);
50
51
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
52
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 7), "tmp105", 0x4d);
53
@@ -XXX,XX +XXX,XX @@ static const TypeInfo romulus_bmc_type = {
54
static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
55
{
56
AspeedSoCState *soc = &bmc->soc;
57
+ uint8_t *eeprom_buf = g_malloc0(8 * 1024);
58
59
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
60
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
61
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
62
/* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
63
* good enough */
64
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
65
+
66
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), 0x51,
67
+ eeprom_buf);
68
}
69
70
static void witherspoon_bmc_init(MachineState *machine)
71
--
72
2.17.1
73
74
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Julia Suvorova <jusual@mail.ru>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
This feature is intended to distinguish ARMv8-M variants: Baseline and
4
Message-id: 20180606152128.449-2-f4bug@amsat.org
4
Mainline. ARMv7-M compatibility requires the Main Extension. ARMv6-M
5
compatibility is provided by all ARMv8-M implementations.
6
7
Signed-off-by: Julia Suvorova <jusual@mail.ru>
8
Message-id: 20180622080138.17702-2-jusual@mail.ru
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
hw/sd/milkymist-memcard.c | 2 +-
12
target/arm/cpu.h | 1 +
9
1 file changed, 1 insertion(+), 1 deletion(-)
13
target/arm/cpu.c | 3 +++
14
2 files changed, 4 insertions(+)
10
15
11
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/sd/milkymist-memcard.c
18
--- a/target/arm/cpu.h
14
+++ b/hw/sd/milkymist-memcard.c
19
+++ b/target/arm/cpu.h
15
@@ -XXX,XX +XXX,XX @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
20
@@ -XXX,XX +XXX,XX @@ enum arm_features {
16
r = s->response[s->response_read_ptr++];
21
ARM_FEATURE_V8_RDM, /* implements v8.1 simd round multiply */
17
if (s->response_read_ptr > s->response_len) {
22
ARM_FEATURE_V8_FP16, /* implements v8.2 half-precision float */
18
qemu_log_mask(LOG_GUEST_ERROR, "milkymist_memcard: "
23
ARM_FEATURE_V8_FCMA, /* has complex number part of v8.3 extensions. */
19
- "read more cmd bytes than available. Clipping.");
24
+ ARM_FEATURE_M_MAIN, /* M profile Main Extension */
20
+ "read more cmd bytes than available: clipping\n");
25
};
21
s->response_read_ptr = 0;
26
22
}
27
static inline int arm_feature(CPUARMState *env, int feature)
23
}
28
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/cpu.c
31
+++ b/target/arm/cpu.c
32
@@ -XXX,XX +XXX,XX @@ static void cortex_m3_initfn(Object *obj)
33
ARMCPU *cpu = ARM_CPU(obj);
34
set_feature(&cpu->env, ARM_FEATURE_V7);
35
set_feature(&cpu->env, ARM_FEATURE_M);
36
+ set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
37
cpu->midr = 0x410fc231;
38
cpu->pmsav7_dregion = 8;
39
cpu->id_pfr0 = 0x00000030;
40
@@ -XXX,XX +XXX,XX @@ static void cortex_m4_initfn(Object *obj)
41
42
set_feature(&cpu->env, ARM_FEATURE_V7);
43
set_feature(&cpu->env, ARM_FEATURE_M);
44
+ set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
45
set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
46
cpu->midr = 0x410fc240; /* r0p0 */
47
cpu->pmsav7_dregion = 8;
48
@@ -XXX,XX +XXX,XX @@ static void cortex_m33_initfn(Object *obj)
49
50
set_feature(&cpu->env, ARM_FEATURE_V8);
51
set_feature(&cpu->env, ARM_FEATURE_M);
52
+ set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
53
set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
54
set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
55
cpu->midr = 0x410fd213; /* r0p3 */
24
--
56
--
25
2.17.1
57
2.17.1
26
58
27
59
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Julia Suvorova <jusual@mail.ru>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Unlike ARMv7-M, ARMv6-M and ARMv8-M Baseline only supports naturally
4
Message-id: 20180606152128.449-7-f4bug@amsat.org
4
aligned memory accesses for load/store instructions.
5
6
Signed-off-by: Julia Suvorova <jusual@mail.ru>
7
Message-id: 20180622080138.17702-3-jusual@mail.ru
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
hw/mips/boston.c | 8 ++++----
11
target/arm/translate.c | 18 ++++++++++++++++--
9
1 file changed, 4 insertions(+), 4 deletions(-)
12
1 file changed, 16 insertions(+), 2 deletions(-)
10
13
11
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/mips/boston.c
16
--- a/target/arm/translate.c
14
+++ b/hw/mips/boston.c
17
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static uint64_t boston_platreg_read(void *opaque, hwaddr addr,
18
@@ -XXX,XX +XXX,XX @@ static inline TCGv gen_aa32_addr(DisasContext *s, TCGv_i32 a32, TCGMemOp op)
16
uint32_t gic_freq, val;
19
static void gen_aa32_ld_i32(DisasContext *s, TCGv_i32 val, TCGv_i32 a32,
17
20
int index, TCGMemOp opc)
18
if (size != 4) {
19
- qemu_log_mask(LOG_UNIMP, "%uB platform register read", size);
20
+ qemu_log_mask(LOG_UNIMP, "%uB platform register read\n", size);
21
return 0;
22
}
23
24
@@ -XXX,XX +XXX,XX @@ static uint64_t boston_platreg_read(void *opaque, hwaddr addr,
25
val |= PLAT_DDR_CFG_MHZ;
26
return val;
27
default:
28
- qemu_log_mask(LOG_UNIMP, "Read platform register 0x%" HWADDR_PRIx,
29
+ qemu_log_mask(LOG_UNIMP, "Read platform register 0x%" HWADDR_PRIx "\n",
30
addr & 0xffff);
31
return 0;
32
}
33
@@ -XXX,XX +XXX,XX @@ static void boston_platreg_write(void *opaque, hwaddr addr,
34
uint64_t val, unsigned size)
35
{
21
{
36
if (size != 4) {
22
- TCGv addr = gen_aa32_addr(s, a32, opc);
37
- qemu_log_mask(LOG_UNIMP, "%uB platform register write", size);
23
+ TCGv addr;
38
+ qemu_log_mask(LOG_UNIMP, "%uB platform register write\n", size);
24
+
39
return;
25
+ if (arm_dc_feature(s, ARM_FEATURE_M) &&
40
}
26
+ !arm_dc_feature(s, ARM_FEATURE_M_MAIN)) {
41
27
+ opc |= MO_ALIGN;
42
@@ -XXX,XX +XXX,XX @@ static void boston_platreg_write(void *opaque, hwaddr addr,
28
+ }
43
break;
29
+
44
default:
30
+ addr = gen_aa32_addr(s, a32, opc);
45
qemu_log_mask(LOG_UNIMP, "Write platform register 0x%" HWADDR_PRIx
31
tcg_gen_qemu_ld_i32(val, addr, index, opc);
46
- " = 0x%" PRIx64, addr & 0xffff, val);
32
tcg_temp_free(addr);
47
+ " = 0x%" PRIx64 "\n", addr & 0xffff, val);
33
}
48
break;
34
@@ -XXX,XX +XXX,XX @@ static void gen_aa32_ld_i32(DisasContext *s, TCGv_i32 val, TCGv_i32 a32,
49
}
35
static void gen_aa32_st_i32(DisasContext *s, TCGv_i32 val, TCGv_i32 a32,
36
int index, TCGMemOp opc)
37
{
38
- TCGv addr = gen_aa32_addr(s, a32, opc);
39
+ TCGv addr;
40
+
41
+ if (arm_dc_feature(s, ARM_FEATURE_M) &&
42
+ !arm_dc_feature(s, ARM_FEATURE_M_MAIN)) {
43
+ opc |= MO_ALIGN;
44
+ }
45
+
46
+ addr = gen_aa32_addr(s, a32, opc);
47
tcg_gen_qemu_st_i32(val, addr, index, opc);
48
tcg_temp_free(addr);
50
}
49
}
51
--
50
--
52
2.17.1
51
2.17.1
53
52
54
53
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
checkpatch reminds us that statics shouldn't be zero-initialized:
2
2
3
Based on the multicast hash calculation of the FTGMAC100 Linux driver.
3
ERROR: do not initialise statics to 0 or NULL
4
#35: FILE: vl.c:157:
5
+static int num_serial_hds = 0;
4
6
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
ERROR: do not initialise statics to 0 or NULL
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
#36: FILE: vl.c:158:
7
Message-id: 20180530061711.23673-4-clg@kaod.org
9
+static Chardev **serial_hds = NULL;
10
11
I forgot to fix this in 6af2692e86f9fdfb3d; do so now.
12
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Thomas Huth <thuth@redhat.com>
15
Message-id: 20180426140253.3918-1-peter.maydell@linaro.org
9
---
16
---
10
hw/net/ftgmac100.c | 4 ++--
17
vl.c | 4 ++--
11
1 file changed, 2 insertions(+), 2 deletions(-)
18
1 file changed, 2 insertions(+), 2 deletions(-)
12
19
13
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
20
diff --git a/vl.c b/vl.c
14
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/net/ftgmac100.c
22
--- a/vl.c
16
+++ b/hw/net/ftgmac100.c
23
+++ b/vl.c
17
@@ -XXX,XX +XXX,XX @@ static int ftgmac100_filter(FTGMAC100State *s, const uint8_t *buf, size_t len)
24
@@ -XXX,XX +XXX,XX @@ QEMUClockType rtc_clock;
18
return 0;
25
int vga_interface_type = VGA_NONE;
19
}
26
static DisplayOptions dpy;
20
27
int no_frame;
21
- /* TODO: this does not seem to work for ftgmac100 */
28
-static int num_serial_hds = 0;
22
- mcast_idx = net_crc32(buf, ETH_ALEN) >> 26;
29
-static Chardev **serial_hds = NULL;
23
+ mcast_idx = net_crc32_le(buf, ETH_ALEN);
30
+static int num_serial_hds;
24
+ mcast_idx = (~(mcast_idx >> 2)) & 0x3f;
31
+static Chardev **serial_hds;
25
if (!(s->math[mcast_idx / 32] & (1 << (mcast_idx % 32)))) {
32
Chardev *parallel_hds[MAX_PARALLEL_PORTS];
26
return 0;
33
Chardev *virtcon_hds[MAX_VIRTIO_CONSOLES];
27
}
34
int win2k_install_hack = 0;
28
--
35
--
29
2.17.1
36
2.17.1
30
37
31
38
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Message-id: 20180606191801.6331-1-f4bug@amsat.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
Makefile.objs | 1 +
9
hw/i2c/core.c | 25 ++++++++++++++++++-------
10
hw/i2c/trace-events | 7 +++++++
11
3 files changed, 26 insertions(+), 7 deletions(-)
12
create mode 100644 hw/i2c/trace-events
13
14
diff --git a/Makefile.objs b/Makefile.objs
15
index XXXXXXX..XXXXXXX 100644
16
--- a/Makefile.objs
17
+++ b/Makefile.objs
18
@@ -XXX,XX +XXX,XX @@ trace-events-subdirs += hw/char
19
trace-events-subdirs += hw/display
20
trace-events-subdirs += hw/dma
21
trace-events-subdirs += hw/hppa
22
+trace-events-subdirs += hw/i2c
23
trace-events-subdirs += hw/i386
24
trace-events-subdirs += hw/i386/xen
25
trace-events-subdirs += hw/ide
26
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/i2c/core.c
29
+++ b/hw/i2c/core.c
30
@@ -XXX,XX +XXX,XX @@
31
32
#include "qemu/osdep.h"
33
#include "hw/i2c/i2c.h"
34
+#include "trace.h"
35
36
#define I2C_BROADCAST 0x00
37
38
@@ -XXX,XX +XXX,XX @@ int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv)
39
}
40
41
QLIST_FOREACH(node, &bus->current_devs, next) {
42
+ I2CSlave *s = node->elt;
43
int rv;
44
45
- sc = I2C_SLAVE_GET_CLASS(node->elt);
46
+ sc = I2C_SLAVE_GET_CLASS(s);
47
/* If the bus is already busy, assume this is a repeated
48
start condition. */
49
50
if (sc->event) {
51
- rv = sc->event(node->elt, recv ? I2C_START_RECV : I2C_START_SEND);
52
+ trace_i2c_event("start", s->address);
53
+ rv = sc->event(s, recv ? I2C_START_RECV : I2C_START_SEND);
54
if (rv && !bus->broadcast) {
55
if (bus_scanned) {
56
/* First call, terminate the transfer. */
57
@@ -XXX,XX +XXX,XX @@ void i2c_end_transfer(I2CBus *bus)
58
I2CNode *node, *next;
59
60
QLIST_FOREACH_SAFE(node, &bus->current_devs, next, next) {
61
- sc = I2C_SLAVE_GET_CLASS(node->elt);
62
+ I2CSlave *s = node->elt;
63
+ sc = I2C_SLAVE_GET_CLASS(s);
64
if (sc->event) {
65
- sc->event(node->elt, I2C_FINISH);
66
+ trace_i2c_event("finish", s->address);
67
+ sc->event(s, I2C_FINISH);
68
}
69
QLIST_REMOVE(node, next);
70
g_free(node);
71
@@ -XXX,XX +XXX,XX @@ void i2c_end_transfer(I2CBus *bus)
72
int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send)
73
{
74
I2CSlaveClass *sc;
75
+ I2CSlave *s;
76
I2CNode *node;
77
int ret = 0;
78
79
if (send) {
80
QLIST_FOREACH(node, &bus->current_devs, next) {
81
- sc = I2C_SLAVE_GET_CLASS(node->elt);
82
+ s = node->elt;
83
+ sc = I2C_SLAVE_GET_CLASS(s);
84
if (sc->send) {
85
- ret = ret || sc->send(node->elt, *data);
86
+ trace_i2c_send(s->address, *data);
87
+ ret = ret || sc->send(s, *data);
88
} else {
89
ret = -1;
90
}
91
@@ -XXX,XX +XXX,XX @@ int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send)
92
93
sc = I2C_SLAVE_GET_CLASS(QLIST_FIRST(&bus->current_devs)->elt);
94
if (sc->recv) {
95
- ret = sc->recv(QLIST_FIRST(&bus->current_devs)->elt);
96
+ s = QLIST_FIRST(&bus->current_devs)->elt;
97
+ ret = sc->recv(s);
98
+ trace_i2c_recv(s->address, ret);
99
if (ret < 0) {
100
return ret;
101
} else {
102
@@ -XXX,XX +XXX,XX @@ void i2c_nack(I2CBus *bus)
103
QLIST_FOREACH(node, &bus->current_devs, next) {
104
sc = I2C_SLAVE_GET_CLASS(node->elt);
105
if (sc->event) {
106
+ trace_i2c_event("nack", node->elt->address);
107
sc->event(node->elt, I2C_NACK);
108
}
109
}
110
diff --git a/hw/i2c/trace-events b/hw/i2c/trace-events
111
new file mode 100644
112
index XXXXXXX..XXXXXXX
113
--- /dev/null
114
+++ b/hw/i2c/trace-events
115
@@ -XXX,XX +XXX,XX @@
116
+# See docs/devel/tracing.txt for syntax documentation.
117
+
118
+# hw/i2c/core.c
119
+
120
+i2c_event(const char *event, uint8_t address) "%s(addr:0x%02x)"
121
+i2c_send(uint8_t address, uint8_t data) "send(addr:0x%02x) data:0x%02x"
122
+i2c_recv(uint8_t address, uint8_t data) "recv(addr:0x%02x) data:0x%02x"
123
--
124
2.17.1
125
126
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The xen pci_assign_dev_load_option_rom() currently creates a RAM
2
memory region with memory_region_init_ram_nomigrate(), and then
3
manually registers it with vmstate_register_ram(). In fact for
4
its only callsite, the 'owner' pointer we use for the init call
5
and the '&dev->qdev' pointer we use for the vmstate_register_ram()
6
call refer to the same object. Simplify the function to only
7
take a pointer to the device once instead of twice, and use
8
memory_region_init_ram() which automatically does the vmstate
9
register for us.
2
10
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
4
Message-id: 20180606152128.449-3-f4bug@amsat.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
13
---
8
hw/char/digic-uart.c | 4 ++--
14
hw/xen/xen_pt.h | 2 +-
9
hw/timer/digic-timer.c | 4 ++--
15
hw/xen/xen_pt_graphics.c | 2 +-
10
2 files changed, 4 insertions(+), 4 deletions(-)
16
hw/xen/xen_pt_load_rom.c | 6 +++---
17
3 files changed, 5 insertions(+), 5 deletions(-)
11
18
12
diff --git a/hw/char/digic-uart.c b/hw/char/digic-uart.c
19
diff --git a/hw/xen/xen_pt.h b/hw/xen/xen_pt.h
13
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/char/digic-uart.c
21
--- a/hw/xen/xen_pt.h
15
+++ b/hw/char/digic-uart.c
22
+++ b/hw/xen/xen_pt.h
16
@@ -XXX,XX +XXX,XX @@ static uint64_t digic_uart_read(void *opaque, hwaddr addr,
23
@@ -XXX,XX +XXX,XX @@ static inline bool xen_pt_has_msix_mapping(XenPCIPassthroughState *s, int bar)
17
default:
18
qemu_log_mask(LOG_UNIMP,
19
"digic-uart: read access to unknown register 0x"
20
- TARGET_FMT_plx, addr << 2);
21
+ TARGET_FMT_plx "\n", addr << 2);
22
}
23
24
return ret;
25
@@ -XXX,XX +XXX,XX @@ static void digic_uart_write(void *opaque, hwaddr addr, uint64_t value,
26
default:
27
qemu_log_mask(LOG_UNIMP,
28
"digic-uart: write access to unknown register 0x"
29
- TARGET_FMT_plx, addr << 2);
30
+ TARGET_FMT_plx "\n", addr << 2);
31
}
32
}
24
}
33
25
34
diff --git a/hw/timer/digic-timer.c b/hw/timer/digic-timer.c
26
extern void *pci_assign_dev_load_option_rom(PCIDevice *dev,
27
- struct Object *owner, int *size,
28
+ int *size,
29
unsigned int domain,
30
unsigned int bus, unsigned int slot,
31
unsigned int function);
32
diff --git a/hw/xen/xen_pt_graphics.c b/hw/xen/xen_pt_graphics.c
35
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/timer/digic-timer.c
34
--- a/hw/xen/xen_pt_graphics.c
37
+++ b/hw/timer/digic-timer.c
35
+++ b/hw/xen/xen_pt_graphics.c
38
@@ -XXX,XX +XXX,XX @@ static uint64_t digic_timer_read(void *opaque, hwaddr offset, unsigned size)
36
@@ -XXX,XX +XXX,XX @@ int xen_pt_unregister_vga_regions(XenHostPCIDevice *dev)
39
default:
37
static void *get_vgabios(XenPCIPassthroughState *s, int *size,
40
qemu_log_mask(LOG_UNIMP,
38
XenHostPCIDevice *dev)
41
"digic-timer: read access to unknown register 0x"
39
{
42
- TARGET_FMT_plx, offset);
40
- return pci_assign_dev_load_option_rom(&s->dev, OBJECT(&s->dev), size,
43
+ TARGET_FMT_plx "\n", offset);
41
+ return pci_assign_dev_load_option_rom(&s->dev, size,
44
}
42
dev->domain, dev->bus,
45
43
dev->dev, dev->func);
46
return ret;
47
@@ -XXX,XX +XXX,XX @@ static void digic_timer_write(void *opaque, hwaddr offset,
48
default:
49
qemu_log_mask(LOG_UNIMP,
50
"digic-timer: read access to unknown register 0x"
51
- TARGET_FMT_plx, offset);
52
+ TARGET_FMT_plx "\n", offset);
53
}
54
}
44
}
45
diff --git a/hw/xen/xen_pt_load_rom.c b/hw/xen/xen_pt_load_rom.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/hw/xen/xen_pt_load_rom.c
48
+++ b/hw/xen/xen_pt_load_rom.c
49
@@ -XXX,XX +XXX,XX @@
50
* load the corresponding ROM data to RAM. If an error occurs while loading an
51
* option ROM, we just ignore that option ROM and continue with the next one.
52
*/
53
-void *pci_assign_dev_load_option_rom(PCIDevice *dev, struct Object *owner,
54
+void *pci_assign_dev_load_option_rom(PCIDevice *dev,
55
int *size, unsigned int domain,
56
unsigned int bus, unsigned int slot,
57
unsigned int function)
58
@@ -XXX,XX +XXX,XX @@ void *pci_assign_dev_load_option_rom(PCIDevice *dev, struct Object *owner,
59
uint8_t val;
60
struct stat st;
61
void *ptr = NULL;
62
+ Object *owner = OBJECT(dev);
63
64
/* If loading ROM from file, pci handles it */
65
if (dev->romfile || !dev->rom_bar) {
66
@@ -XXX,XX +XXX,XX @@ void *pci_assign_dev_load_option_rom(PCIDevice *dev, struct Object *owner,
67
fseek(fp, 0, SEEK_SET);
68
69
snprintf(name, sizeof(name), "%s.rom", object_get_typename(owner));
70
- memory_region_init_ram_nomigrate(&dev->rom, owner, name, st.st_size, &error_abort);
71
- vmstate_register_ram(&dev->rom, &dev->qdev);
72
+ memory_region_init_ram(&dev->rom, owner, name, st.st_size, &error_abort);
73
ptr = memory_region_get_ram_ptr(&dev->rom);
74
memset(ptr, 0xff, st.st_size);
55
75
56
--
76
--
57
2.17.1
77
2.17.1
58
78
59
79
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20180606152128.449-4-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
hw/display/xlnx_dp.c | 4 +++-
9
1 file changed, 3 insertions(+), 1 deletion(-)
10
11
diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/display/xlnx_dp.c
14
+++ b/hw/display/xlnx_dp.c
15
@@ -XXX,XX +XXX,XX @@ static void xlnx_dp_avbufm_write(void *opaque, hwaddr offset, uint64_t value,
16
case AV_BUF_STC_SNAPSHOT1:
17
case AV_BUF_HCOUNT_VCOUNT_INT0:
18
case AV_BUF_HCOUNT_VCOUNT_INT1:
19
- qemu_log_mask(LOG_UNIMP, "avbufm: unimplmented");
20
+ qemu_log_mask(LOG_UNIMP, "avbufm: unimplemented register 0x%04"
21
+ PRIx64 "\n",
22
+ offset << 2);
23
break;
24
default:
25
s->avbufm_registers[offset] = value;
26
--
27
2.17.1
28
29
diff view generated by jsdifflib