1
Latest run of arm patches -- most of these are Philippe's SD card
1
Arm queue. I still have a lot of stuff in my to-review queue, so
2
cleanups. I have more in my queue to review, but 32 is enough
2
won't be long til the next one.
3
patches to warrant sending out.
3
4
I've thrown in a couple of minor non-arm patches (a xen code
5
cleanup and a vl.c codestyle issue).
4
6
5
thanks
7
thanks
6
-- PMM
8
-- PMM
7
9
8
The following changes since commit ff8689611a1d954897d857b28f7ef404e11cfa2c:
10
The following changes since commit de44c044420d1139480fa50c2d5be19223391218:
9
11
10
Merge remote-tracking branch 'remotes/mcayland/tags/qemu-openbios-signed' into staging (2018-02-22 11:37:05 +0000)
12
Merge remote-tracking branch 'remotes/stsquad/tags/pull-tcg-testing-revivial-210618-2' into staging (2018-06-22 10:57:47 +0100)
11
13
12
are available in the Git repository at:
14
are available in the Git repository at:
13
15
14
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180222
16
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180622
15
17
16
for you to fetch changes up to 4e5cc6756586e967993187657dfcdde4e00288d9:
18
for you to fetch changes up to 6dad8260e82b69bd278685ee25209f5824360455:
17
19
18
sdcard: simplify SD_SEND_OP_COND (ACMD41) (2018-02-22 15:12:54 +0000)
20
xen: Don't use memory_region_init_ram_nomigrate() in pci_assign_dev_load_option_rom() (2018-06-22 13:28:42 +0100)
19
21
20
----------------------------------------------------------------
22
----------------------------------------------------------------
21
* New "raspi3" machine emulating RaspberryPi 3
23
target-arm queue:
22
* Fix bad register definitions for VMIDR and VMPIDR (which caused
24
* hw/intc/arm_gicv3: fix wrong values when reading IPRIORITYR
23
assertions for 64-bit guest CPUs with EL2 on big-endian hosts)
25
* target/arm: fix read of freed memory in kvm_arm_machine_init_done()
24
* hw/char/stm32f2xx_usart: fix TXE/TC bit handling
26
* virt: support up to 512 CPUs
25
* Fix ast2500 protection register emulation
27
* virt: support 256MB ECAM PCI region (for more PCI devices)
26
* Lots of SD card emulation cleanups and bugfixes
28
* xlnx-zynqmp: Use Cortex-R5F, not Cortex-R5
29
* mps2-tz: Implement and use the TrustZone Memory Protection Controller
30
* target/arm: enforce alignment checking for v6M cores
31
* xen: Don't use memory_region_init_ram_nomigrate() in pci_assign_dev_load_option_rom()
32
* vl.c: Don't zero-initialize statics for serial_hds
27
33
28
----------------------------------------------------------------
34
----------------------------------------------------------------
29
Hugo Landau (1):
35
Amol Surati (1):
30
Fix ast2500 protection register emulation
36
hw/intc/arm_gicv3: fix an extra left-shift when reading IPRIORITYR
31
37
32
Pekka Enberg (1):
38
Edgar E. Iglesias (2):
33
raspi: Add "raspi3" machine type
39
target-arm: Add the Cortex-R5F
40
xlnx-zynqmp: Swap Cortex-R5 for Cortex-R5F
34
41
35
Peter Maydell (1):
42
Eric Auger (11):
36
target/arm: Fix register definitions for VMIDR and VMPIDR
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
37
54
38
Philippe Mathieu-Daudé (28):
55
Julia Suvorova (3):
39
hw/sd/milkymist-memcard: use qemu_log_mask()
56
target/arm: Minor cleanup for ARMv6-M 32-bit instructions
40
hw/sd/milkymist-memcard: split realize() out of SysBusDevice init()
57
target/arm: Introduce ARM_FEATURE_M_MAIN
41
hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it
58
target/arm: Strict alignment for ARMv6-M and ARMv8-M Baseline
42
hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus
43
sdcard: reorder SDState struct members
44
sdcard: replace DPRINTF() by trace events
45
sdcard: add a trace event for command responses
46
sdcard: replace fprintf() by qemu_hexdump()
47
sdcard: add more trace events
48
sdcard: define SDMMC_CMD_MAX instead of using the magic '64'
49
sdcard: use G_BYTE from cutils
50
sdcard: use the registerfields API to access the OCR register
51
sdcard: Don't always set the high capacity bit
52
sdcard: update the CSD CRC register regardless the CSD structure version
53
sdcard: fix the 'maximum data transfer rate' to 25MHz
54
sdcard: clean the SCR register and add few comments
55
sdcard: remove commands from unsupported old MMC specification
56
sdcard: simplify using the ldst API
57
sdcard: use the correct masked OCR in the R3 reply
58
sdcard: use the registerfields API for the CARD_STATUS register masks
59
sdcard: handle CMD54 (SDIO)
60
sdcard: handle the Security Specification commands
61
sdcard: use a more descriptive label 'unimplemented_spi_cmd'
62
sdcard: handles more commands in SPI mode
63
sdcard: check the card is in correct state for APP CMD (CMD55)
64
sdcard: warn if host uses an incorrect address for APP CMD (CMD55)
65
sdcard: simplify SEND_IF_COND (CMD8)
66
sdcard: simplify SD_SEND_OP_COND (ACMD41)
67
59
68
Richard Braun (1):
60
Peter Maydell (10):
69
hw/char/stm32f2xx_usart: fix TXE/TC bit handling
61
hw/misc/tz-mpc.c: Implement the Arm TrustZone Memory Protection Controller
62
hw/misc/tz-mpc.c: Implement registers
63
hw/misc/tz-mpc.c: Implement correct blocked-access behaviour
64
hw/misc/tz_mpc.c: Honour the BLK_LUT settings in translate
65
hw/misc/iotkit-secctl.c: Implement SECMPCINTSTATUS
66
hw/arm/iotkit: Instantiate MPC
67
hw/arm/iotkit: Wire up MPC interrupt lines
68
hw/arm/mps2-tz.c: Instantiate MPCs
69
vl.c: Don't zero-initialize statics for serial_hds
70
xen: Don't use memory_region_init_ram_nomigrate() in pci_assign_dev_load_option_rom()
70
71
71
hw/sd/sdmmc-internal.h | 15 ++
72
Zheng Xiang (1):
72
include/hw/char/stm32f2xx_usart.h | 7 +-
73
target-arm: fix a segmentation fault due to illegal memory access
73
include/hw/sd/sd.h | 1 -
74
hw/arm/raspi.c | 23 ++
75
hw/char/stm32f2xx_usart.c | 12 +-
76
hw/misc/aspeed_scu.c | 6 +-
77
hw/misc/aspeed_sdmc.c | 8 +-
78
hw/sd/milkymist-memcard.c | 87 +++----
79
hw/sd/sd.c | 467 +++++++++++++++++++++++---------------
80
hw/sd/ssi-sd.c | 32 +--
81
target/arm/helper.c | 8 +-
82
hw/sd/trace-events | 20 ++
83
12 files changed, 446 insertions(+), 240 deletions(-)
84
create mode 100644 hw/sd/sdmmc-internal.h
85
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
replace switch(single case) -> if()
3
When either GICD_IPRIORITYR or GICR_IPRIORITYR is read as a 32-bit
4
register, the post left-shift operator in the for loop causes an
5
extra shift after the least significant byte has been placed.
4
6
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
The 32-bit value actually returned is therefore the expected value
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
8
shifted left by 8 bits.
7
Message-id: 20180215221325.7611-17-f4bug@amsat.org
9
10
Signed-off-by: Amol Surati <suratiamol@gmail.com>
11
Message-id: 20180614054857.26248-1-suratiamol@gmail.com
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
14
---
10
hw/sd/sd.c | 56 ++++++++++++++++++++++++++------------------------------
15
hw/intc/arm_gicv3_dist.c | 3 ++-
11
1 file changed, 26 insertions(+), 30 deletions(-)
16
hw/intc/arm_gicv3_redist.c | 3 ++-
17
2 files changed, 4 insertions(+), 2 deletions(-)
12
18
13
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
14
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/sd.c
21
--- a/hw/intc/arm_gicv3_dist.c
16
+++ b/hw/sd/sd.c
22
+++ b/hw/intc/arm_gicv3_dist.c
17
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
23
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicd_readl(GICv3State *s, hwaddr offset,
18
sd->state = sd_transfer_state;
24
int i, irq = offset - GICD_IPRIORITYR;
19
return sd_r1;
25
uint32_t value = 0;
26
27
- for (i = irq + 3; i >= irq; i--, value <<= 8) {
28
+ for (i = irq + 3; i >= irq; i--) {
29
+ value <<= 8;
30
value |= gicd_read_ipriorityr(s, attrs, i);
20
}
31
}
21
- switch (sd->state) {
32
*data = value;
22
- case sd_idle_state:
33
diff --git a/hw/intc/arm_gicv3_redist.c b/hw/intc/arm_gicv3_redist.c
23
- /* If it's the first ACMD41 since reset, we need to decide
34
index XXXXXXX..XXXXXXX 100644
24
- * whether to power up. If this is not an enquiry ACMD41,
35
--- a/hw/intc/arm_gicv3_redist.c
25
- * we immediately report power on and proceed below to the
36
+++ b/hw/intc/arm_gicv3_redist.c
26
- * ready state, but if it is, we set a timer to model a
37
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicr_readl(GICv3CPUState *cs, hwaddr offset,
27
- * delay for power up. This works around a bug in EDK2
38
int i, irq = offset - GICR_IPRIORITYR;
28
- * UEFI, which sends an initial enquiry ACMD41, but
39
uint32_t value = 0;
29
- * assumes that the card is in ready state as soon as it
40
30
- * sees the power up bit set. */
41
- for (i = irq + 3; i >= irq; i--, value <<= 8) {
31
- if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) {
42
+ for (i = irq + 3; i >= irq; i--) {
32
- if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
43
+ value <<= 8;
33
- timer_del(sd->ocr_power_timer);
44
value |= gicr_read_ipriorityr(cs, attrs, i);
34
- sd_ocr_powerup(sd);
35
- } else {
36
- trace_sdcard_inquiry_cmd41();
37
- if (!timer_pending(sd->ocr_power_timer)) {
38
- timer_mod_ns(sd->ocr_power_timer,
39
- (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
40
- + OCR_POWER_DELAY_NS));
41
- }
42
+ if (sd->state != sd_idle_state) {
43
+ break;
44
+ }
45
+ /* If it's the first ACMD41 since reset, we need to decide
46
+ * whether to power up. If this is not an enquiry ACMD41,
47
+ * we immediately report power on and proceed below to the
48
+ * ready state, but if it is, we set a timer to model a
49
+ * delay for power up. This works around a bug in EDK2
50
+ * UEFI, which sends an initial enquiry ACMD41, but
51
+ * assumes that the card is in ready state as soon as it
52
+ * sees the power up bit set. */
53
+ if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) {
54
+ if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
55
+ timer_del(sd->ocr_power_timer);
56
+ sd_ocr_powerup(sd);
57
+ } else {
58
+ trace_sdcard_inquiry_cmd41();
59
+ if (!timer_pending(sd->ocr_power_timer)) {
60
+ timer_mod_ns(sd->ocr_power_timer,
61
+ (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
62
+ + OCR_POWER_DELAY_NS));
63
}
64
}
65
+ }
66
67
+ if (FIELD_EX32(sd->ocr & req.arg, OCR, VDD_VOLTAGE_WINDOW)) {
68
/* We accept any voltage. 10000 V is nothing.
69
*
70
* Once we're powered up, we advance straight to ready state
71
* unless it's an enquiry ACMD41 (bits 23:0 == 0).
72
*/
73
- if (req.arg & ACMD41_ENQUIRY_MASK) {
74
- sd->state = sd_ready_state;
75
- }
76
-
77
- return sd_r3;
78
-
79
- default:
80
- break;
81
+ sd->state = sd_ready_state;
82
}
45
}
83
- break;
46
*data = value;
84
+
85
+ return sd_r3;
86
87
case 42:    /* ACMD42: SET_CLR_CARD_DETECT */
88
switch (sd->state) {
89
--
47
--
90
2.16.1
48
2.17.1
91
49
92
50
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
The arrays were made static, "if" was simplified because V7M and V8M
4
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
4
define V6 feature.
5
Message-id: 20180215221325.7611-15-f4bug@amsat.org
5
6
Signed-off-by: Julia Suvorova <jusual@mail.ru>
7
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
8
Message-id: 20180618214604.6777-1-jusual@mail.ru
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/sd.c | 5 +++++
12
target/arm/translate.c | 27 +++++++++++++--------------
9
1 file changed, 5 insertions(+)
13
1 file changed, 13 insertions(+), 14 deletions(-)
10
14
11
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
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/sd/sd.c
17
--- a/target/arm/translate.c
14
+++ b/hw/sd/sd.c
18
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
19
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
16
case sd_identification_state:
20
!arm_dc_feature(s, ARM_FEATURE_V7)) {
17
case sd_inactive_state:
21
int i;
18
return sd_illegal;
22
bool found = false;
19
+ case sd_idle_state:
23
- const uint32_t armv6m_insn[] = {0xf3808000 /* msr */,
20
+ if (rca) {
24
- 0xf3b08040 /* dsb */,
21
+ qemu_log_mask(LOG_GUEST_ERROR,
25
- 0xf3b08050 /* dmb */,
22
+ "SD: illegal RCA 0x%04x for APP_CMD\n", req.cmd);
26
- 0xf3b08060 /* isb */,
23
+ }
27
- 0xf3e08000 /* mrs */,
24
default:
28
- 0xf000d000 /* bl */};
25
break;
29
- const uint32_t armv6m_mask[] = {0xffe0d000,
26
}
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;
27
--
60
--
28
2.16.1
61
2.17.1
29
62
30
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
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
The elements of kvm_devices_head list are freed in kvm_arm_machine_init_done(),
4
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
4
but we still access these illegal memory in kvm_arm_devlistener_del().
5
Message-id: 20180215221325.7611-14-f4bug@amsat.org
5
6
This will cause segment fault when booting guest with MALLOC_PERTURB_=1.
7
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>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
hw/sd/sd.c | 8 ++++++++
13
target/arm/kvm.c | 1 +
9
1 file changed, 8 insertions(+)
14
1 file changed, 1 insertion(+)
10
15
11
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
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/sd/sd.c
18
--- a/target/arm/kvm.c
14
+++ b/hw/sd/sd.c
19
+++ b/target/arm/kvm.c
15
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
20
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_machine_init_done(Notifier *notifier, void *data)
16
21
kvm_arm_set_device_addr(kd);
17
/* Application specific commands (Class 8) */
22
}
18
case 55:    /* CMD55: APP_CMD */
23
memory_region_unref(kd->mr);
19
+ switch (sd->state) {
24
+ QSLIST_REMOVE_HEAD(&kvm_devices_head, entries);
20
+ case sd_ready_state:
25
g_free(kd);
21
+ case sd_identification_state:
26
}
22
+ case sd_inactive_state:
27
memory_listener_unregister(&devlistener);
23
+ return sd_illegal;
24
+ default:
25
+ break;
26
+ }
27
if (!sd->spi) {
28
if (sd->rca != rca) {
29
return sd_r0;
30
--
28
--
31
2.16.1
29
2.17.1
32
30
33
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@xilinx.com>
4
b357bf6023a948cf6a9472f07a1b0caac0e4f8e8
5
Message-id: 20180215221325.7611-13-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
hw/sd/sd.c | 29 ++++++++++++++++++++++++++---
12
include/standard-headers/linux/pci_regs.h | 8 ++++++++
9
1 file changed, 26 insertions(+), 3 deletions(-)
13
include/standard-headers/linux/virtio_gpu.h | 1 +
10
14
include/standard-headers/linux/virtio_net.h | 3 +++
11
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
15
linux-headers/asm-arm/kvm.h | 1 +
12
index XXXXXXX..XXXXXXX 100644
16
linux-headers/asm-arm/unistd-common.h | 1 +
13
--- a/hw/sd/sd.c
17
linux-headers/asm-arm64/kvm.h | 1 +
14
+++ b/hw/sd/sd.c
18
linux-headers/asm-generic/unistd.h | 4 +++-
15
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
19
linux-headers/asm-powerpc/unistd.h | 1 +
16
20
linux-headers/asm-x86/unistd_32.h | 2 ++
17
/* Application specific commands (Class 8) */
21
linux-headers/asm-x86/unistd_64.h | 2 ++
18
case 55:    /* CMD55: APP_CMD */
22
linux-headers/asm-x86/unistd_x32.h | 2 ++
19
- if (sd->rca != rca)
23
linux-headers/linux/kvm.h | 5 +++--
20
- return sd_r0;
24
linux-headers/linux/psp-sev.h | 12 ++++++++++++
21
-
25
linux-headers/LICENSES/exceptions/Linux-syscall-note | 2 +-
22
+ if (!sd->spi) {
26
linux-headers/LICENSES/preferred/GPL-2.0 | 6 ++++++
23
+ if (sd->rca != rca) {
27
15 files changed, 47 insertions(+), 4 deletions(-)
24
+ return sd_r0;
28
25
+ }
29
diff --git a/include/standard-headers/linux/pci_regs.h b/include/standard-headers/linux/pci_regs.h
26
+ }
30
index XXXXXXX..XXXXXXX 100644
27
sd->expecting_acmd = true;
31
--- a/include/standard-headers/linux/pci_regs.h
28
sd->card_status |= APP_CMD;
32
+++ b/include/standard-headers/linux/pci_regs.h
29
return sd_r1;
33
@@ -XXX,XX +XXX,XX @@
30
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
34
#define PCI_EXP_DEVCTL_READRQ_256B 0x1000 /* 256 Bytes */
31
}
35
#define PCI_EXP_DEVCTL_READRQ_512B 0x2000 /* 512 Bytes */
32
break;
36
#define PCI_EXP_DEVCTL_READRQ_1024B 0x3000 /* 1024 Bytes */
33
37
+#define PCI_EXP_DEVCTL_READRQ_2048B 0x4000 /* 2048 Bytes */
34
+ case 58: /* CMD58: READ_OCR (SPI) */
38
+#define PCI_EXP_DEVCTL_READRQ_4096B 0x5000 /* 4096 Bytes */
35
+ if (!sd->spi) {
39
#define PCI_EXP_DEVCTL_BCR_FLR 0x8000 /* Bridge Configuration Retry / FLR */
36
+ goto bad_cmd;
40
#define PCI_EXP_DEVSTA        10    /* Device Status */
37
+ }
41
#define PCI_EXP_DEVSTA_CED    0x0001    /* Correctable Error Detected */
38
+ return sd_r3;
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 {
67
};
68
69
#define VIRTIO_GPU_CAPSET_VIRGL 1
70
+#define VIRTIO_GPU_CAPSET_VIRGL2 2
71
72
/* VIRTIO_GPU_CMD_GET_CAPSET_INFO */
73
struct virtio_gpu_get_capset_info {
74
diff --git a/include/standard-headers/linux/virtio_net.h b/include/standard-headers/linux/virtio_net.h
75
index XXXXXXX..XXXXXXX 100644
76
--- a/include/standard-headers/linux/virtio_net.h
77
+++ b/include/standard-headers/linux/virtio_net.h
78
@@ -XXX,XX +XXX,XX @@
79
                     * Steering */
80
#define VIRTIO_NET_F_CTRL_MAC_ADDR 23    /* Set MAC address */
81
82
+#define VIRTIO_NET_F_STANDBY     62    /* Act as standby for another device
83
+                     * with the same MAC.
84
+                     */
85
#define VIRTIO_NET_F_SPEED_DUPLEX 63    /* Device set linkspeed and duplex */
86
87
#ifndef VIRTIO_NET_NO_LEGACY
88
diff --git a/linux-headers/asm-arm/kvm.h b/linux-headers/asm-arm/kvm.h
89
index XXXXXXX..XXXXXXX 100644
90
--- a/linux-headers/asm-arm/kvm.h
91
+++ b/linux-headers/asm-arm/kvm.h
92
@@ -XXX,XX +XXX,XX @@ struct kvm_regs {
93
#define KVM_VGIC_V3_ADDR_TYPE_DIST    2
94
#define KVM_VGIC_V3_ADDR_TYPE_REDIST    3
95
#define KVM_VGIC_ITS_ADDR_TYPE        4
96
+#define KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION    5
97
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));
39
+
239
+
40
+ case 59: /* CMD59: CRC_ON_OFF (SPI) */
240
/**
41
+ if (!sd->spi) {
241
* struct sev_issue_cmd - SEV ioctl parameters
42
+ goto bad_cmd;
242
*
43
+ }
243
diff --git a/linux-headers/LICENSES/exceptions/Linux-syscall-note b/linux-headers/LICENSES/exceptions/Linux-syscall-note
44
+ goto unimplemented_spi_cmd;
244
index XXXXXXX..XXXXXXX 100644
45
+
245
--- a/linux-headers/LICENSES/exceptions/Linux-syscall-note
46
default:
246
+++ b/linux-headers/LICENSES/exceptions/Linux-syscall-note
47
bad_cmd:
247
@@ -XXX,XX +XXX,XX @@
48
qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
248
SPDX-Exception-Identifier: Linux-syscall-note
49
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
249
SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html
50
sd->card_status |= APP_CMD;
250
-SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+
51
switch (req.cmd) {
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
52
case 6:    /* ACMD6: SET_BUS_WIDTH */
252
Usage-Guide:
53
+ if (sd->spi) {
253
This exception is used together with one of the above SPDX-Licenses
54
+ goto unimplemented_spi_cmd;
254
to mark user space API (uapi) header files so they can be included
55
+ }
255
diff --git a/linux-headers/LICENSES/preferred/GPL-2.0 b/linux-headers/LICENSES/preferred/GPL-2.0
56
switch (sd->state) {
256
index XXXXXXX..XXXXXXX 100644
57
case sd_transfer_state:
257
--- a/linux-headers/LICENSES/preferred/GPL-2.0
58
sd->sd_status[0] &= 0x3f;
258
+++ b/linux-headers/LICENSES/preferred/GPL-2.0
59
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
259
@@ -XXX,XX +XXX,XX @@
60
default:
260
Valid-License-Identifier: GPL-2.0
61
/* Fall back to standard commands. */
261
+Valid-License-Identifier: GPL-2.0-only
62
return sd_normal_command(sd, req);
262
Valid-License-Identifier: GPL-2.0+
63
+
263
+Valid-License-Identifier: GPL-2.0-or-later
64
+ unimplemented_spi_cmd:
264
SPDX-URL: https://spdx.org/licenses/GPL-2.0.html
65
+ /* Commands that are recognised but not yet implemented in SPI mode. */
265
Usage-Guide:
66
+ qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
266
To use this license in source code, put one of the following SPDX
67
+ req.cmd);
267
@@ -XXX,XX +XXX,XX @@ Usage-Guide:
68
+ return sd_illegal;
268
guidelines in the licensing rules documentation.
69
}
269
For 'GNU General Public License (GPL) version 2 only' use:
70
270
SPDX-License-Identifier: GPL-2.0
71
qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
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
72
--
280
--
73
2.16.1
281
2.17.1
74
282
75
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
Suggested-by: Alistair Francis <alistair.francis@xilinx.com>
3
for KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION attribute, the attribute
4
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
data pointed to by kvm_device_attr.addr is a OR of the
5
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
5
redistributor region address and other fields such as the index
6
Message-id: 20180215221325.7611-12-f4bug@amsat.org
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
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
21
---
9
hw/sd/sd.c | 22 +++++++++++++---------
22
target/arm/kvm_arm.h | 3 ++-
10
1 file changed, 13 insertions(+), 9 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(-)
11
28
12
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
29
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
13
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/sd/sd.c
31
--- a/target/arm/kvm_arm.h
15
+++ b/hw/sd/sd.c
32
+++ b/target/arm/kvm_arm.h
16
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
33
@@ -XXX,XX +XXX,XX @@ int kvm_arm_vcpu_init(CPUState *cs);
17
34
* @group: device control API group for setting addresses
18
/* Block write commands (Class 4) */
35
* @attr: device control API address type
19
case 24:    /* CMD24: WRITE_SINGLE_BLOCK */
36
* @dev_fd: device control device file descriptor (or -1 if not supported)
20
- if (sd->spi)
37
+ * @addr_ormask: value to be OR'ed with resolved address
21
- goto unimplemented_cmd;
38
*
22
+ if (sd->spi) {
39
* Remember the memory region @mr, and when it is mapped by the
23
+ goto unimplemented_spi_cmd;
40
* machine model, tell the kernel that base address using the
24
+ }
41
@@ -XXX,XX +XXX,XX @@ int kvm_arm_vcpu_init(CPUState *cs);
25
switch (sd->state) {
42
* address at the point where machine init is complete.
26
case sd_transfer_state:
43
*/
27
/* Writing in SPI mode not implemented. */
44
void kvm_arm_register_device(MemoryRegion *mr, uint64_t devid, uint64_t group,
28
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
45
- uint64_t attr, int dev_fd);
29
break;
46
+ uint64_t attr, int dev_fd, uint64_t addr_ormask);
30
47
31
case 25:    /* CMD25: WRITE_MULTIPLE_BLOCK */
48
/**
32
- if (sd->spi)
49
* kvm_arm_init_cpreg_list:
33
- goto unimplemented_cmd;
50
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
34
+ if (sd->spi) {
51
index XXXXXXX..XXXXXXX 100644
35
+ goto unimplemented_spi_cmd;
52
--- a/hw/intc/arm_gic_kvm.c
36
+ }
53
+++ b/hw/intc/arm_gic_kvm.c
37
switch (sd->state) {
54
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
38
case sd_transfer_state:
55
| KVM_VGIC_V2_ADDR_TYPE_DIST,
39
/* Writing in SPI mode not implemented. */
56
KVM_DEV_ARM_VGIC_GRP_ADDR,
40
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
57
KVM_VGIC_V2_ADDR_TYPE_DIST,
41
break;
58
- s->dev_fd);
42
59
+ s->dev_fd, 0);
43
case 27:    /* CMD27: PROGRAM_CSD */
60
/* CPU interface for current core. Unlike arm_gic, we don't
44
- if (sd->spi)
61
* provide the "interface for core #N" memory regions, because
45
- goto unimplemented_cmd;
62
* cores with a VGIC don't have those.
46
+ if (sd->spi) {
63
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
47
+ goto unimplemented_spi_cmd;
64
| KVM_VGIC_V2_ADDR_TYPE_CPU,
48
+ }
65
KVM_DEV_ARM_VGIC_GRP_ADDR,
49
switch (sd->state) {
66
KVM_VGIC_V2_ADDR_TYPE_CPU,
50
case sd_transfer_state:
67
- s->dev_fd);
51
sd->state = sd_receivingdata_state;
68
+ s->dev_fd, 0);
52
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
69
53
70
if (kvm_has_gsi_routing()) {
54
/* Lock card commands (Class 7) */
71
/* set up irq routing */
55
case 42:    /* CMD42: LOCK_UNLOCK */
72
diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
56
- if (sd->spi)
73
index XXXXXXX..XXXXXXX 100644
57
- goto unimplemented_cmd;
74
--- a/hw/intc/arm_gicv3_its_kvm.c
58
+ if (sd->spi) {
75
+++ b/hw/intc/arm_gicv3_its_kvm.c
59
+ goto unimplemented_spi_cmd;
76
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
60
+ }
77
61
switch (sd->state) {
78
/* register the base address */
62
case sd_transfer_state:
79
kvm_arm_register_device(&s->iomem_its_cntrl, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
63
sd->state = sd_receivingdata_state;
80
- KVM_VGIC_ITS_ADDR_TYPE, s->dev_fd);
64
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
81
+ KVM_VGIC_ITS_ADDR_TYPE, s->dev_fd, 0);
65
qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
82
66
return sd_illegal;
83
gicv3_its_init_mmio(s, NULL);
67
84
68
- unimplemented_cmd:
85
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
69
+ unimplemented_spi_cmd:
86
index XXXXXXX..XXXXXXX 100644
70
/* Commands that are recognised but not yet implemented in SPI mode. */
87
--- a/hw/intc/arm_gicv3_kvm.c
71
qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
88
+++ b/hw/intc/arm_gicv3_kvm.c
72
req.cmd);
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)
136
{
137
KVMDevice *kd;
138
139
@@ -XXX,XX +XXX,XX @@ void kvm_arm_register_device(MemoryRegion *mr, uint64_t devid, uint64_t group,
140
kd->kdattr.group = group;
141
kd->kdattr.attr = attr;
142
kd->dev_fd = dev_fd;
143
+ kd->kda_addr_ormask = addr_ormask;
144
QSLIST_INSERT_HEAD(&kvm_devices_head, kd, entries);
145
memory_region_ref(kd->mr);
146
}
73
--
147
--
74
2.16.1
148
2.17.1
75
149
76
150
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
To prepare for multiple redistributor regions, we introduce
4
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
4
an array of uint32_t properties that stores the redistributor
5
Message-id: 20180215220540.6556-12-f4bug@amsat.org
5
count of each redistributor region.
6
7
Non accelerated VGICv3 only supports a single redistributor region.
8
The capacity of all redist regions is checked against the number of
9
vcpus.
10
11
Machvirt is updated to set those properties, ie. a single
12
redistributor region with count set to the number of vcpus
13
capped by 123.
14
15
Signed-off-by: Eric Auger <eric.auger@redhat.com>
16
Reviewed-by: Andrew Jones <drjones@redhat.com>
17
Message-id: 1529072910-16156-4-git-send-email-eric.auger@redhat.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
19
---
8
include/hw/sd/sd.h | 1 -
20
include/hw/intc/arm_gicv3_common.h | 8 +++++--
9
hw/sd/sd.c | 21 +++++++++++++--------
21
hw/arm/virt.c | 11 ++++++++-
10
2 files changed, 13 insertions(+), 9 deletions(-)
22
hw/intc/arm_gicv3.c | 12 +++++++++-
11
23
hw/intc/arm_gicv3_common.c | 38 ++++++++++++++++++++++++++----
12
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
24
hw/intc/arm_gicv3_kvm.c | 9 +++++--
13
index XXXXXXX..XXXXXXX 100644
25
5 files changed, 67 insertions(+), 11 deletions(-)
14
--- a/include/hw/sd/sd.h
26
15
+++ b/include/hw/sd/sd.h
27
diff --git a/include/hw/intc/arm_gicv3_common.h b/include/hw/intc/arm_gicv3_common.h
28
index XXXXXXX..XXXXXXX 100644
29
--- a/include/hw/intc/arm_gicv3_common.h
30
+++ b/include/hw/intc/arm_gicv3_common.h
16
@@ -XXX,XX +XXX,XX @@
31
@@ -XXX,XX +XXX,XX @@
17
#define READY_FOR_DATA        (1 << 8)
32
#define GICV3_MAXIRQ 1020
18
#define APP_CMD            (1 << 5)
33
#define GICV3_MAXSPI (GICV3_MAXIRQ - GIC_INTERNAL)
19
#define AKE_SEQ_ERROR        (1 << 3)
34
20
-#define OCR_CCS_BITN 30
35
+#define GICV3_REDIST_SIZE 0x20000
21
36
+
22
typedef enum {
37
/* Number of SGI target-list bits */
23
SD_VOLTAGE_0_4V = 400, /* currently not supported */
38
#define GICV3_TARGETLIST_BITS 16
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
39
25
index XXXXXXX..XXXXXXX 100644
40
@@ -XXX,XX +XXX,XX @@ struct GICv3State {
26
--- a/hw/sd/sd.c
41
/*< public >*/
27
+++ b/hw/sd/sd.c
42
28
@@ -XXX,XX +XXX,XX @@
43
MemoryRegion iomem_dist; /* Distributor */
29
#include "qemu/osdep.h"
44
- MemoryRegion iomem_redist; /* Redistributors */
30
#include "hw/qdev.h"
45
+ MemoryRegion *iomem_redist; /* Redistributor Regions */
31
#include "hw/hw.h"
46
+ uint32_t *redist_region_count; /* redistributor count within each region */
32
+#include "hw/registerfields.h"
47
+ uint32_t nb_redist_regions; /* number of redist regions */
33
#include "sysemu/block-backend.h"
48
34
#include "hw/sd/sd.h"
49
uint32_t num_cpu;
35
#include "qapi/error.h"
50
uint32_t num_irq;
36
@@ -XXX,XX +XXX,XX @@
51
@@ -XXX,XX +XXX,XX @@ typedef struct ARMGICv3CommonClass {
37
//#define DEBUG_SD 1
52
} ARMGICv3CommonClass;
38
53
39
#define ACMD41_ENQUIRY_MASK 0x00ffffff
54
void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
40
-#define OCR_POWER_UP 0x80000000
55
- const MemoryRegionOps *ops);
41
-#define OCR_POWER_DELAY_NS 500000 /* 0.5ms */
56
+ const MemoryRegionOps *ops, Error **errp);
42
57
43
typedef enum {
58
#endif
44
sd_r0 = 0, /* no response */
59
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
45
@@ -XXX,XX +XXX,XX @@ static uint16_t sd_crc16(void *message, size_t width)
60
index XXXXXXX..XXXXXXX 100644
46
return shift_reg;
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);
47
}
110
}
48
111
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
49
+#define OCR_POWER_DELAY_NS 500000 /* 0.5ms */
112
index XXXXXXX..XXXXXXX 100644
50
+
113
--- a/hw/intc/arm_gicv3_common.c
51
+FIELD(OCR, CARD_CAPACITY, 30, 1) /* 0:SDSC, 1:SDHC/SDXC */
114
+++ b/hw/intc/arm_gicv3_common.c
52
+FIELD(OCR, CARD_POWER_UP, 31, 1)
115
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_gicv3 = {
53
+
116
};
54
static void sd_set_ocr(SDState *sd)
117
118
void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
119
- const MemoryRegionOps *ops)
120
+ const MemoryRegionOps *ops, Error **errp)
55
{
121
{
56
/* All voltages OK, Standard Capacity SD Memory Card, not yet powered up */
122
SysBusDevice *sbd = SYS_BUS_DEVICE(s);
57
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
123
+ int rdist_capacity = 0;
58
SDState *sd = opaque;
124
int i;
59
125
60
trace_sdcard_powerup();
126
+ for (i = 0; i < s->nb_redist_regions; i++) {
61
- /* Set powered up bit in OCR */
127
+ rdist_capacity += s->redist_region_count[i];
62
- assert(!(sd->ocr & OCR_POWER_UP));
128
+ }
63
- sd->ocr |= OCR_POWER_UP;
129
+ if (rdist_capacity < s->num_cpu) {
64
+ assert(!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP));
130
+ error_setg(errp, "Capacity of the redist regions(%d) "
65
+
131
+ "is less than number of vcpus(%d)",
66
+ /* card power-up OK */
132
+ rdist_capacity, s->num_cpu);
67
+ sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_POWER_UP, 1);
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
+ }
68
}
159
}
69
160
70
static void sd_set_scr(SDState *sd)
161
static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
71
@@ -XXX,XX +XXX,XX @@ static bool sd_ocr_vmstate_needed(void *opaque)
162
@@ -XXX,XX +XXX,XX @@ static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
72
SDState *sd = opaque;
163
}
73
74
/* Include the OCR state (and timer) if it is not yet powered up */
75
- return !(sd->ocr & OCR_POWER_UP);
76
+ return !FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP);
77
}
164
}
78
165
79
static const VMStateDescription sd_ocr_vmstate = {
166
+static void arm_gicv3_finalize(Object *obj)
80
@@ -XXX,XX +XXX,XX @@ static void sd_erase(SDState *sd)
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(),
183
};
184
185
@@ -XXX,XX +XXX,XX @@ static const TypeInfo arm_gicv3_common_type = {
186
.instance_size = sizeof(GICv3State),
187
.class_size = sizeof(ARMGICv3CommonClass),
188
.class_init = arm_gicv3_common_class_init,
189
+ .instance_finalize = arm_gicv3_finalize,
190
.abstract = true,
191
.interfaces = (InterfaceInfo []) {
192
{ TYPE_ARM_LINUX_BOOT_IF },
193
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
194
index XXXXXXX..XXXXXXX 100644
195
--- a/hw/intc/arm_gicv3_kvm.c
196
+++ b/hw/intc/arm_gicv3_kvm.c
197
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
81
return;
198
return;
82
}
199
}
83
200
84
- if (extract32(sd->ocr, OCR_CCS_BITN, 1)) {
201
- gicv3_init_irqs_and_mmio(s, kvm_arm_gicv3_set_irq, NULL);
85
+ if (FIELD_EX32(sd->ocr, OCR, CARD_CAPACITY)) {
202
+ gicv3_init_irqs_and_mmio(s, kvm_arm_gicv3_set_irq, NULL, &local_err);
86
/* High capacity memory card: erase units are 512 byte blocks */
203
+ if (local_err) {
87
erase_start *= 512;
204
+ error_propagate(errp, local_err);
88
erase_end *= 512;
205
+ return;
89
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
206
+ }
90
* UEFI, which sends an initial enquiry ACMD41, but
207
91
* assumes that the card is in ready state as soon as it
208
for (i = 0; i < s->num_cpu; i++) {
92
* sees the power up bit set. */
209
ARMCPU *cpu = ARM_CPU(qemu_get_cpu(i));
93
- if (!(sd->ocr & OCR_POWER_UP)) {
210
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
94
+ if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) {
211
95
if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
212
kvm_arm_register_device(&s->iomem_dist, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
96
timer_del(sd->ocr_power_timer);
213
KVM_VGIC_V3_ADDR_TYPE_DIST, s->dev_fd, 0);
97
sd_ocr_powerup(sd);
214
- kvm_arm_register_device(&s->iomem_redist, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
215
+ kvm_arm_register_device(&s->iomem_redist[0], -1,
216
+ KVM_DEV_ARM_VGIC_GRP_ADDR,
217
KVM_VGIC_V3_ADDR_TYPE_REDIST, s->dev_fd, 0);
218
219
if (kvm_has_gsi_routing()) {
98
--
220
--
99
2.16.1
221
2.17.1
100
222
101
223
diff view generated by jsdifflib
1
From: Hugo Landau <hlandau@devever.net>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Some register blocks of the ast2500 are protected by protection key
3
Let's check if KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION is supported.
4
registers which require the right magic value to be written to those
4
If not, we check the number of redist region is equal to 1 and use the
5
registers to allow those registers to be mutated.
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.
6
8
7
Register manuals indicate that writing the correct magic value to these
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
8
registers should cause subsequent reads from those values to return 1,
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
and writing any other value should cause subsequent reads to return 0.
11
Reviewed-by: Andrew Jones <drjones@redhat.com>
10
12
Message-id: 1529072910-16156-5-git-send-email-eric.auger@redhat.com
11
Previously, qemu implemented these registers incorrectly: the registers
12
were handled as simple memory, meaning that writing some value x to a
13
protection key register would result in subsequent reads from that
14
register returning the same value x. The protection was implemented by
15
ensuring that the current value of that register equaled the magic
16
value.
17
18
This modifies qemu to have the correct behaviour: attempts to write to a
19
ast2500 protection register results in a transition to 1 or 0 depending
20
on whether the written value is the correct magic. The protection logic
21
is updated to ensure that the value of the register is nonzero.
22
23
This bug caused deadlocks with u-boot HEAD: when u-boot is done with a
24
protectable register block, it attempts to lock it by writing the
25
bitwise inverse of the correct magic value, and then spinning forever
26
until the register reads as zero. Since qemu implemented writes to these
27
registers as ordinary memory writes, writing the inverse of the magic
28
value resulted in subsequent reads returning that value, leading to
29
u-boot spinning forever.
30
31
Signed-off-by: Hugo Landau <hlandau@devever.net>
32
Reviewed-by: Cédric Le Goater <clg@kaod.org>
33
Acked-by: Andrew Jeffery <andrew@aj.id.au>
34
Message-id: 20180220132627.4163-1-hlandau@devever.net
35
[PMM: fixed incorrect code indentation]
36
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
37
---
14
---
38
hw/misc/aspeed_scu.c | 6 +++++-
15
hw/intc/arm_gicv3_kvm.c | 37 ++++++++++++++++++++++++++++++++++---
39
hw/misc/aspeed_sdmc.c | 8 +++++++-
16
1 file changed, 34 insertions(+), 3 deletions(-)
40
2 files changed, 12 insertions(+), 2 deletions(-)
41
17
42
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
18
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
43
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
44
--- a/hw/misc/aspeed_scu.c
20
--- a/hw/intc/arm_gicv3_kvm.c
45
+++ b/hw/misc/aspeed_scu.c
21
+++ b/hw/intc/arm_gicv3_kvm.c
46
@@ -XXX,XX +XXX,XX @@ static void aspeed_scu_write(void *opaque, hwaddr offset, uint64_t data,
22
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
47
}
23
{
48
24
GICv3State *s = KVM_ARM_GICV3(dev);
49
if (reg > PROT_KEY && reg < CPU2_BASE_SEG1 &&
25
KVMARMGICv3Class *kgc = KVM_ARM_GICV3_GET_CLASS(s);
50
- s->regs[PROT_KEY] != ASPEED_SCU_PROT_KEY) {
26
+ bool multiple_redist_region_allowed;
51
+ !s->regs[PROT_KEY]) {
27
Error *local_err = NULL;
52
qemu_log_mask(LOG_GUEST_ERROR, "%s: SCU is locked!\n", __func__);
28
int i;
29
30
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
53
return;
31
return;
54
}
32
}
55
@@ -XXX,XX +XXX,XX @@ static void aspeed_scu_write(void *opaque, hwaddr offset, uint64_t data,
33
56
trace_aspeed_scu_write(offset, size, data);
34
+ multiple_redist_region_allowed =
57
35
+ kvm_device_check_attr(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
58
switch (reg) {
36
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION);
59
+ case PROT_KEY:
60
+ s->regs[reg] = (data == ASPEED_SCU_PROT_KEY) ? 1 : 0;
61
+ return;
62
+
37
+
63
case FREQ_CNTR_EVAL:
38
+ if (!multiple_redist_region_allowed && s->nb_redist_regions > 1) {
64
case VGA_SCRATCH1 ... VGA_SCRATCH8:
39
+ error_setg(errp, "Multiple VGICv3 redistributor regions are not "
65
case RNG_DATA:
40
+ "supported by this host kernel");
66
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
41
+ error_append_hint(errp, "A maximum of %d VCPUs can be used",
67
index XXXXXXX..XXXXXXX 100644
42
+ s->redist_region_count[0]);
68
--- a/hw/misc/aspeed_sdmc.c
69
+++ b/hw/misc/aspeed_sdmc.c
70
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_write(void *opaque, hwaddr addr, uint64_t data,
71
return;
72
}
73
74
- if (addr != R_PROT && s->regs[R_PROT] != PROT_KEY_UNLOCK) {
75
+ if (addr == R_PROT) {
76
+ s->regs[addr] = (data == PROT_KEY_UNLOCK) ? 1 : 0;
77
+ return;
43
+ return;
78
+ }
44
+ }
79
+
45
+
80
+ if (!s->regs[R_PROT]) {
46
kvm_device_access(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_NR_IRQS,
81
qemu_log_mask(LOG_GUEST_ERROR, "%s: SDMC is locked!\n", __func__);
47
0, &s->num_irq, true, &error_abort);
82
return;
48
83
}
49
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
84
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_write(void *opaque, hwaddr addr, uint64_t data,
50
85
data &= ~ASPEED_SDMC_READONLY_MASK;
51
kvm_arm_register_device(&s->iomem_dist, -1, KVM_DEV_ARM_VGIC_GRP_ADDR,
86
break;
52
KVM_VGIC_V3_ADDR_TYPE_DIST, s->dev_fd, 0);
87
case AST2500_A0_SILICON_REV:
53
- kvm_arm_register_device(&s->iomem_redist[0], -1,
88
+ case AST2500_A1_SILICON_REV:
54
- KVM_DEV_ARM_VGIC_GRP_ADDR,
89
data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
55
- KVM_VGIC_V3_ADDR_TYPE_REDIST, s->dev_fd, 0);
90
break;
56
+
91
default:
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 */
92
--
80
--
93
2.16.1
81
2.17.1
94
82
95
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
returning sd_illegal, since they are not implemented.
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
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Please refer to kernel documentation for further node details:
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
9
Documentation/devicetree/bindings/interrupt-controller/arm,gic-v3.txt
7
Message-id: 20180215221325.7611-11-f4bug@amsat.org
10
8
[PMM: tweak multiline comment format]
11
Signed-off-by: Eric Auger <eric.auger@redhat.com>
12
Reviewed-by: Andrew Jones <drjones@redhat.com>
13
Message-id: 1529072910-16156-6-git-send-email-eric.auger@redhat.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
15
---
11
hw/sd/sd.c | 12 ++++++++++++
16
include/hw/arm/virt.h | 14 ++++++++++++++
12
1 file changed, 12 insertions(+)
17
hw/arm/virt.c | 29 ++++++++++++++++++++++++-----
18
2 files changed, 38 insertions(+), 5 deletions(-)
13
19
14
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
15
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/sd/sd.c
22
--- a/include/hw/arm/virt.h
17
+++ b/hw/sd/sd.c
23
+++ b/include/hw/arm/virt.h
18
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
24
@@ -XXX,XX +XXX,XX @@
19
}
25
#include "qemu/notify.h"
20
break;
26
#include "hw/boards.h"
21
27
#include "hw/arm/arm.h"
22
+ case 18: /* Reserved for SD security applications */
28
+#include "sysemu/kvm.h"
23
+ case 25:
29
+#include "hw/intc/arm_gicv3_common.h"
24
+ case 26:
30
25
+ case 38:
31
#define NUM_GICV2M_SPIS 64
26
+ case 43 ... 49:
32
#define NUM_VIRTIO_TRANSPORTS 32
27
+ /* Refer to the "SD Specifications Part3 Security Specification" for
33
@@ -XXX,XX +XXX,XX @@ enum {
28
+ * information about the SD Security Features.
34
VIRT_GIC_V2M,
29
+ */
35
VIRT_GIC_ITS,
30
+ qemu_log_mask(LOG_UNIMP, "SD: CMD%i Security not implemented\n",
36
VIRT_GIC_REDIST,
31
+ req.cmd);
37
+ VIRT_GIC_REDIST2,
32
+ return sd_illegal;
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;
33
+
50
+
34
default:
51
+ assert(vms->gic_version == 3);
35
/* Fall back to standard commands. */
52
+
36
return sd_normal_command(sd, req);
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,
37
--
106
--
38
2.16.1
107
2.17.1
39
108
40
109
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
replace switch(single case) -> if()
3
Depending on the number of smp_cpus we now register one or two
4
GICR structures.
4
5
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Eric Auger <eric.auger@redhat.com>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
7
Reviewed-by: Andrew Jones <drjones@redhat.com>
7
Message-id: 20180215221325.7611-16-f4bug@amsat.org
8
Message-id: 1529072910-16156-7-git-send-email-eric.auger@redhat.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
hw/sd/sd.c | 26 +++++++++++---------------
11
hw/arm/virt-acpi-build.c | 9 +++++++++
11
1 file changed, 11 insertions(+), 15 deletions(-)
12
1 file changed, 9 insertions(+)
12
13
13
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
14
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/sd.c
16
--- a/hw/arm/virt-acpi-build.c
16
+++ b/hw/sd/sd.c
17
+++ b/hw/arm/virt-acpi-build.c
17
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
18
@@ -XXX,XX +XXX,XX @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
18
19
19
case 8:    /* CMD8: SEND_IF_COND */
20
if (vms->gic_version == 3) {
20
/* Physical Layer Specification Version 2.00 command */
21
AcpiMadtGenericTranslator *gic_its;
21
- switch (sd->state) {
22
+ int nb_redist_regions = virt_gicv3_redist_region_count(vms);
22
- case sd_idle_state:
23
AcpiMadtGenericRedistributor *gicr = acpi_data_push(table_data,
23
- sd->vhs = 0;
24
sizeof *gicr);
24
-
25
25
- /* No response if not exactly one VHS bit is set. */
26
@@ -XXX,XX +XXX,XX @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
26
- if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) {
27
gicr->base_address = cpu_to_le64(memmap[VIRT_GIC_REDIST].base);
27
- return sd->spi ? sd_r7 : sd_r0;
28
gicr->range_length = cpu_to_le32(memmap[VIRT_GIC_REDIST].size);
28
- }
29
29
-
30
+ if (nb_redist_regions == 2) {
30
- /* Accept. */
31
+ gicr = acpi_data_push(table_data, sizeof(*gicr));
31
- sd->vhs = req.arg;
32
+ gicr->type = ACPI_APIC_GENERIC_REDISTRIBUTOR;
32
- return sd_r7;
33
+ gicr->length = sizeof(*gicr);
33
-
34
+ gicr->base_address = cpu_to_le64(memmap[VIRT_GIC_REDIST2].base);
34
- default:
35
+ gicr->range_length = cpu_to_le32(memmap[VIRT_GIC_REDIST2].size);
35
+ if (sd->state != sd_idle_state) {
36
break;
37
}
38
- break;
39
+ sd->vhs = 0;
40
+
41
+ /* No response if not exactly one VHS bit is set. */
42
+ if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) {
43
+ return sd->spi ? sd_r7 : sd_r0;
44
+ }
36
+ }
45
+
37
+
46
+ /* Accept. */
38
if (its_class_name() && !vmc->no_its) {
47
+ sd->vhs = req.arg;
39
gic_its = acpi_data_push(table_data, sizeof *gic_its);
48
+ return sd_r7;
40
gic_its->type = ACPI_APIC_GENERIC_TRANSLATOR;
49
50
case 9:    /* CMD9: SEND_CSD */
51
switch (sd->state) {
52
--
41
--
53
2.16.1
42
2.17.1
54
43
55
44
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Linux uses it to poll the bus before polling for a card.
3
With a VGICv3 KVM device, if the number of vcpus exceeds the
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.
4
8
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Registering this second redistributor region is possible if the
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
10
host kernel supports the following VGICv3 KVM device group/attribute:
7
Message-id: 20180215221325.7611-10-f4bug@amsat.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
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
25
---
10
hw/sd/sd.c | 5 ++---
26
hw/arm/virt.c | 18 +++++++++++++++++-
11
1 file changed, 2 insertions(+), 3 deletions(-)
27
1 file changed, 17 insertions(+), 1 deletion(-)
12
28
13
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
29
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
14
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/sd.c
31
--- a/hw/arm/virt.c
16
+++ b/hw/sd/sd.c
32
+++ b/hw/arm/virt.c
17
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
33
@@ -XXX,XX +XXX,XX @@ static void create_gic(VirtMachineState *vms, qemu_irq *pic)
18
}
34
SysBusDevice *gicbusdev;
19
break;
35
const char *gictype;
20
36
int type = vms->gic_version, i;
21
- case 52:
37
+ uint32_t nb_redist_regions = 0;
22
- case 53:
38
23
- /* CMD52, CMD53: reserved for SDIO cards
39
gictype = (type == 3) ? gicv3_class_name() : gic_class_name();
24
+ case 52 ... 54:
40
25
+ /* CMD52, CMD53, CMD54: reserved for SDIO cards
41
@@ -XXX,XX +XXX,XX @@ static void create_gic(VirtMachineState *vms, qemu_irq *pic)
26
* (see the SDIO Simplified Specification V2.0)
42
vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;
27
* Handle as illegal command but do not complain
43
uint32_t redist0_count = MIN(smp_cpus, redist0_capacity);
28
* on stderr, as some OSes may use these in their
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
+ }
59
}
60
qdev_init_nofail(gicdev);
61
gicbusdev = SYS_BUS_DEVICE(gicdev);
62
sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base);
63
if (type == 3) {
64
sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_REDIST].base);
65
+ if (nb_redist_regions == 2) {
66
+ sysbus_mmio_map(gicbusdev, 2, vms->memmap[VIRT_GIC_REDIST2].base);
67
+ }
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;
78
}
29
--
79
--
30
2.16.1
80
2.17.1
31
81
32
82
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
This patch defines a new ECAM region located after the 256GB limit.
4
Acked-by: Alistair Francis <alistair.francis@xilinx.com>
4
5
Message-id: 20180215221325.7611-9-f4bug@amsat.org
5
The virt machine state is augmented with a new highmem_ecam field
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
which guards the usage of this new ECAM region instead of the legacy
7
16MB one. With the highmem ECAM region, up to 256 PCIe buses can be
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
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
15
---
9
hw/sd/sd.c | 48 +++++++++++++++++++++++++++++++++++++++++++++---
16
include/hw/arm/virt.h | 4 ++++
10
1 file changed, 45 insertions(+), 3 deletions(-)
17
hw/arm/virt-acpi-build.c | 21 +++++++++++++--------
18
hw/arm/virt.c | 12 ++++++++----
19
3 files changed, 25 insertions(+), 12 deletions(-)
11
20
12
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
21
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
13
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/sd/sd.c
23
--- a/include/hw/arm/virt.h
15
+++ b/hw/sd/sd.c
24
+++ b/include/hw/arm/virt.h
16
@@ -XXX,XX +XXX,XX @@ static void sd_set_rca(SDState *sd)
25
@@ -XXX,XX +XXX,XX @@ enum {
17
sd->rca += 0x4567;
26
VIRT_PCIE_MMIO,
27
VIRT_PCIE_PIO,
28
VIRT_PCIE_ECAM,
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)
46
+
47
#define TYPE_VIRT_MACHINE MACHINE_TYPE_NAME("virt")
48
#define VIRT_MACHINE(obj) \
49
OBJECT_CHECK(VirtMachineState, (obj), TYPE_VIRT_MACHINE)
50
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/virt-acpi-build.c
53
+++ b/hw/arm/virt-acpi-build.c
54
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_virtio(Aml *scope,
18
}
55
}
19
56
20
+FIELD(CSR, AKE_SEQ_ERROR, 3, 1)
57
static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
21
+FIELD(CSR, APP_CMD, 5, 1)
58
- uint32_t irq, bool use_highmem)
22
+FIELD(CSR, FX_EVENT, 6, 1)
59
+ uint32_t irq, bool use_highmem, bool highmem_ecam)
23
+FIELD(CSR, READY_FOR_DATA, 8, 1)
24
+FIELD(CSR, CURRENT_STATE, 9, 4)
25
+FIELD(CSR, ERASE_RESET, 13, 1)
26
+FIELD(CSR, CARD_ECC_DISABLED, 14, 1)
27
+FIELD(CSR, WP_ERASE_SKIP, 15, 1)
28
+FIELD(CSR, CSD_OVERWRITE, 16, 1)
29
+FIELD(CSR, DEFERRED_RESPONSE, 17, 1)
30
+FIELD(CSR, ERROR, 19, 1)
31
+FIELD(CSR, CC_ERROR, 20, 1)
32
+FIELD(CSR, CARD_ECC_FAILED, 21, 1)
33
+FIELD(CSR, ILLEGAL_COMMAND, 22, 1)
34
+FIELD(CSR, COM_CRC_ERROR, 23, 1)
35
+FIELD(CSR, LOCK_UNLOCK_FAILED, 24, 1)
36
+FIELD(CSR, CARD_IS_LOCKED, 25, 1)
37
+FIELD(CSR, WP_VIOLATION, 26, 1)
38
+FIELD(CSR, ERASE_PARAM, 27, 1)
39
+FIELD(CSR, ERASE_SEQ_ERROR, 28, 1)
40
+FIELD(CSR, BLOCK_LEN_ERROR, 29, 1)
41
+FIELD(CSR, ADDRESS_ERROR, 30, 1)
42
+FIELD(CSR, OUT_OF_RANGE, 31, 1)
43
+
44
/* Card status bits, split by clear condition:
45
* A : According to the card current state
46
* B : Always related to the previous command
47
* C : Cleared by read
48
*/
49
-#define CARD_STATUS_A    0x02004100
50
-#define CARD_STATUS_B    0x00c01e00
51
-#define CARD_STATUS_C    0xfd39a028
52
+#define CARD_STATUS_A (R_CSR_READY_FOR_DATA_MASK \
53
+ | R_CSR_CARD_ECC_DISABLED_MASK \
54
+ | R_CSR_CARD_IS_LOCKED_MASK)
55
+#define CARD_STATUS_B (R_CSR_CURRENT_STATE_MASK \
56
+ | R_CSR_ILLEGAL_COMMAND_MASK \
57
+ | R_CSR_COM_CRC_ERROR_MASK)
58
+#define CARD_STATUS_C (R_CSR_AKE_SEQ_ERROR_MASK \
59
+ | R_CSR_APP_CMD_MASK \
60
+ | R_CSR_ERASE_RESET_MASK \
61
+ | R_CSR_WP_ERASE_SKIP_MASK \
62
+ | R_CSR_CSD_OVERWRITE_MASK \
63
+ | R_CSR_ERROR_MASK \
64
+ | R_CSR_CC_ERROR_MASK \
65
+ | R_CSR_CARD_ECC_FAILED_MASK \
66
+ | R_CSR_LOCK_UNLOCK_FAILED_MASK \
67
+ | R_CSR_WP_VIOLATION_MASK \
68
+ | R_CSR_ERASE_PARAM_MASK \
69
+ | R_CSR_ERASE_SEQ_ERROR_MASK \
70
+ | R_CSR_BLOCK_LEN_ERROR_MASK \
71
+ | R_CSR_ADDRESS_ERROR_MASK \
72
+ | R_CSR_OUT_OF_RANGE_MASK)
73
74
static void sd_set_cardstatus(SDState *sd)
75
{
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);
76
--
168
--
77
2.16.1
169
2.17.1
78
170
79
171
diff view generated by jsdifflib
1
From: Pekka Enberg <penberg@iki.fi>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
This patch adds a "raspi3" machine type, which can now be selected as
3
Add virt-3.0 machine type.
4
the machine to run on by users via the "-M" command line option to QEMU.
5
4
6
The machine type does *not* ignore memory transaction failures so we
5
Signed-off-by: Eric Auger <eric.auger@redhat.com>
7
likely need to add some dummy devices later when people run something
6
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
8
more complicated than what I'm using for testing.
7
Reviewed-by: Andrew Jones <drjones@redhat.com>
9
8
Message-id: 1529072910-16156-10-git-send-email-eric.auger@redhat.com
10
Signed-off-by: Pekka Enberg <penberg@iki.fi>
11
[PMM: added #ifdef TARGET_AARCH64 so we don't provide the 64-bit
12
board in the 32-bit only arm-softmmu build.]
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
10
---
17
hw/arm/raspi.c | 23 +++++++++++++++++++++++
11
hw/arm/virt.c | 15 +++++++++++++--
18
1 file changed, 23 insertions(+)
12
1 file changed, 13 insertions(+), 2 deletions(-)
19
13
20
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
14
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/raspi.c
16
--- a/hw/arm/virt.c
23
+++ b/hw/arm/raspi.c
17
+++ b/hw/arm/virt.c
24
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
18
@@ -XXX,XX +XXX,XX @@ type_init(machvirt_machine_init);
25
mc->ignore_memory_transaction_failures = true;
19
#define VIRT_COMPAT_2_12 \
26
};
20
HW_COMPAT_2_12
27
DEFINE_MACHINE("raspi2", raspi2_machine_init)
21
22
-static void virt_2_12_instance_init(Object *obj)
23
+static void virt_3_0_instance_init(Object *obj)
24
{
25
VirtMachineState *vms = VIRT_MACHINE(obj);
26
VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
27
@@ -XXX,XX +XXX,XX @@ static void virt_2_12_instance_init(Object *obj)
28
vms->irqmap = a15irqmap;
29
}
30
31
+static void virt_machine_3_0_options(MachineClass *mc)
32
+{
33
+}
34
+DEFINE_VIRT_MACHINE_AS_LATEST(3, 0)
28
+
35
+
29
+#ifdef TARGET_AARCH64
36
+static void virt_2_12_instance_init(Object *obj)
30
+static void raspi3_init(MachineState *machine)
31
+{
37
+{
32
+ raspi_init(machine, 3);
38
+ virt_3_0_instance_init(obj);
33
+}
39
+}
34
+
40
+
35
+static void raspi3_machine_init(MachineClass *mc)
41
static void virt_machine_2_12_options(MachineClass *mc)
36
+{
42
{
37
+ mc->desc = "Raspberry Pi 3";
43
+ virt_machine_3_0_options(mc);
38
+ mc->init = raspi3_init;
44
SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_12);
39
+ mc->block_default_type = IF_SD;
45
}
40
+ mc->no_parallel = 1;
46
-DEFINE_VIRT_MACHINE_AS_LATEST(2, 12)
41
+ mc->no_floppy = 1;
47
+DEFINE_VIRT_MACHINE(2, 12)
42
+ mc->no_cdrom = 1;
48
43
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53");
49
#define VIRT_COMPAT_2_11 \
44
+ mc->max_cpus = BCM2836_NCPUS;
50
HW_COMPAT_2_11
45
+ mc->min_cpus = BCM2836_NCPUS;
46
+ mc->default_cpus = BCM2836_NCPUS;
47
+ mc->default_ram_size = 1024 * 1024 * 1024;
48
+}
49
+DEFINE_MACHINE("raspi3", raspi3_machine_init)
50
+#endif
51
--
51
--
52
2.16.1
52
2.17.1
53
53
54
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
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
4
by default instead of the legacy 16MB one, if highmem is set
5
Message-id: 20180215220540.6556-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/sd/sd.c | 16 +---------------
15
include/hw/arm/virt.h | 1 +
9
1 file changed, 1 insertion(+), 15 deletions(-)
16
hw/arm/virt.c | 10 ++++++++++
17
2 files changed, 11 insertions(+)
10
18
11
diff --git a/hw/sd/sd.c b/hw/sd/sd.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/sd/sd.c
21
--- a/include/hw/arm/virt.h
14
+++ b/hw/sd/sd.c
22
+++ b/include/hw/arm/virt.h
15
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ typedef struct {
16
24
bool no_pmu;
17
//#define DEBUG_SD 1
25
bool claim_edge_triggered_timers;
18
26
bool smbios_old_sys_ver;
19
-#ifdef DEBUG_SD
27
+ bool no_highmem_ecam;
20
-#define DPRINTF(fmt, ...) \
28
} VirtMachineClass;
21
-do { fprintf(stderr, "SD: " fmt , ## __VA_ARGS__); } while (0)
29
22
-#else
30
typedef struct {
23
-#define DPRINTF(fmt, ...) do {} while(0)
31
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
24
-#endif
32
index XXXXXXX..XXXXXXX 100644
25
-
33
--- a/hw/arm/virt.c
26
#define ACMD41_ENQUIRY_MASK 0x00ffffff
34
+++ b/hw/arm/virt.c
27
#define OCR_POWER_UP 0x80000000
35
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
28
#define OCR_POWER_DELAY_NS 500000 /* 0.5ms */
36
int n, virt_max_cpus;
29
@@ -XXX,XX +XXX,XX @@ send_response:
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));
30
}
54
}
31
55
32
#ifdef DEBUG_SD
56
+ vms->highmem_ecam &= vms->highmem && (!firmware_loaded || aarch64);
33
- if (rsplen) {
57
+
34
- int i;
58
create_rtc(vms, pic);
35
- DPRINTF("Response:");
59
36
- for (i = 0; i < rsplen; i++) {
60
create_pcie(vms, pic);
37
- DPRINTF(" %02x", response[i]);
61
@@ -XXX,XX +XXX,XX @@ static void virt_3_0_instance_init(Object *obj)
38
- }
62
"Set GIC version. "
39
- DPRINTF(" state %d\n", sd->state);
63
"Valid values are 2, 3 and host", NULL);
40
- }
64
41
+ qemu_hexdump((const char *)response, stderr, "Response", rsplen);
65
+ vms->highmem_ecam = !vmc->no_highmem_ecam;
42
#endif
66
+
43
67
if (vmc->no_its) {
44
return rsplen;
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)
73
{
74
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
75
+
76
virt_machine_3_0_options(mc);
77
SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_12);
78
+ vmc->no_highmem_ecam = true;
79
}
80
DEFINE_VIRT_MACHINE(2, 12)
81
45
--
82
--
46
2.16.1
83
2.17.1
47
84
48
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: Alistair Francis <alistair.francis@xilinx.com>
4
types, max_cpus was set to 255 and any attempt to start the
5
Message-id: 20180215221325.7611-5-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
hw/sd/sd.c | 9 ++++++---
18
hw/arm/virt.c | 7 ++++---
9
1 file changed, 6 insertions(+), 3 deletions(-)
19
1 file changed, 4 insertions(+), 3 deletions(-)
10
20
11
diff --git a/hw/sd/sd.c b/hw/sd/sd.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/hw/sd/sd.c
23
--- a/hw/arm/virt.c
14
+++ b/hw/sd/sd.c
24
+++ b/hw/arm/virt.c
15
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
25
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
16
26
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
17
static void sd_set_scr(SDState *sd)
27
18
{
28
mc->init = machvirt_init;
19
- sd->scr[0] = 0x00;        /* SCR Structure */
29
- /* Start max_cpus at the maximum QEMU supports. We'll further restrict
20
- sd->scr[1] = 0x2f;        /* SD Security Support */
30
- * it later in machvirt_init, where we have more information about the
21
- sd->scr[2] = 0x00;
31
+ /* Start with max_cpus set to 512, which is the maximum supported by KVM.
22
+ sd->scr[0] = (0 << 4) /* SCR version 1.0 */
32
+ * The value may be reduced later when we have more information about the
23
+ | 0; /* Spec Versions 1.0 and 1.01 */
33
* configuration of the particular instance.
24
+ sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
34
*/
25
+ | 0b0101; /* 1-bit or 4-bit width bus modes */
35
- mc->max_cpus = 255;
26
+ sd->scr[2] = 0x00; /* Extended Security is not supported. */
36
+ mc->max_cpus = 512;
27
sd->scr[3] = 0x00;
37
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_CALXEDA_XGMAC);
28
+ /* reserved for manufacturer usage */
38
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE);
29
sd->scr[4] = 0x00;
39
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
30
sd->scr[5] = 0x00;
40
@@ -XXX,XX +XXX,XX @@ static void virt_machine_2_12_options(MachineClass *mc)
31
sd->scr[6] = 0x00;
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;
45
}
46
DEFINE_VIRT_MACHINE(2, 12)
47
32
--
48
--
33
2.16.1
49
2.17.1
34
50
35
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
using the sdbus_*() API.
3
Add the Cortex-R5F with the optional FPU enabled.
4
4
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Acked-by: Michael Walle <michael@walle.cc>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20180216022933.10945-4-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
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
12
---
11
hw/sd/milkymist-memcard.c | 38 +++++++++++++++++++++-----------------
13
target/arm/cpu.c | 9 +++++++++
12
1 file changed, 21 insertions(+), 17 deletions(-)
14
1 file changed, 9 insertions(+)
13
15
14
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
16
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/sd/milkymist-memcard.c
18
--- a/target/arm/cpu.c
17
+++ b/hw/sd/milkymist-memcard.c
19
+++ b/target/arm/cpu.c
18
@@ -XXX,XX +XXX,XX @@ struct MilkymistMemcardState {
20
@@ -XXX,XX +XXX,XX @@ static void cortex_r5_initfn(Object *obj)
19
SysBusDevice parent_obj;
21
define_arm_cp_regs(cpu, cortexr5_cp_reginfo);
20
21
MemoryRegion regs_region;
22
- SDState *card;
23
+ SDBus sdbus;
24
25
int command_write_ptr;
26
int response_read_ptr;
27
@@ -XXX,XX +XXX,XX @@ static void memcard_sd_command(MilkymistMemcardState *s)
28
req.crc = s->command[5];
29
30
s->response[0] = req.cmd;
31
- s->response_len = sd_do_command(s->card, &req, s->response+1);
32
+ s->response_len = sdbus_do_command(&s->sdbus, &req, s->response + 1);
33
s->response_read_ptr = 0;
34
35
if (s->response_len == 16) {
36
@@ -XXX,XX +XXX,XX @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
37
r = 0xffffffff;
38
} else {
39
r = 0;
40
- r |= sd_read_data(s->card) << 24;
41
- r |= sd_read_data(s->card) << 16;
42
- r |= sd_read_data(s->card) << 8;
43
- r |= sd_read_data(s->card);
44
+ r |= sdbus_read_data(&s->sdbus) << 24;
45
+ r |= sdbus_read_data(&s->sdbus) << 16;
46
+ r |= sdbus_read_data(&s->sdbus) << 8;
47
+ r |= sdbus_read_data(&s->sdbus);
48
}
49
break;
50
case R_CLK2XDIV:
51
@@ -XXX,XX +XXX,XX @@ static void memcard_write(void *opaque, hwaddr addr, uint64_t value,
52
if (!s->enabled) {
53
break;
54
}
55
- sd_write_data(s->card, (value >> 24) & 0xff);
56
- sd_write_data(s->card, (value >> 16) & 0xff);
57
- sd_write_data(s->card, (value >> 8) & 0xff);
58
- sd_write_data(s->card, value & 0xff);
59
+ sdbus_write_data(&s->sdbus, (value >> 24) & 0xff);
60
+ sdbus_write_data(&s->sdbus, (value >> 16) & 0xff);
61
+ sdbus_write_data(&s->sdbus, (value >> 8) & 0xff);
62
+ sdbus_write_data(&s->sdbus, value & 0xff);
63
break;
64
case R_ENABLE:
65
s->regs[addr] = value;
66
@@ -XXX,XX +XXX,XX @@ static void milkymist_memcard_reset(DeviceState *d)
67
for (i = 0; i < R_MAX; i++) {
68
s->regs[i] = 0;
69
}
70
- /* Since we're still using the legacy SD API the card is not plugged
71
- * into any bus, and we must reset it manually.
72
- */
73
- device_reset(DEVICE(s->card));
74
}
22
}
75
23
76
static void milkymist_memcard_init(Object *obj)
24
+static void cortex_r5f_initfn(Object *obj)
77
@@ -XXX,XX +XXX,XX @@ static void milkymist_memcard_init(Object *obj)
25
+{
78
static void milkymist_memcard_realize(DeviceState *dev, Error **errp)
26
+ ARMCPU *cpu = ARM_CPU(obj);
79
{
80
MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
81
+ DeviceState *carddev;
82
BlockBackend *blk;
83
DriveInfo *dinfo;
84
+ Error *err = NULL;
85
86
+ qbus_create_inplace(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS,
87
+ dev, "sd-bus");
88
+
27
+
89
+ /* Create and plug in the sd card */
28
+ cortex_r5_initfn(obj);
90
/* FIXME use a qdev drive property instead of drive_get_next() */
29
+ set_feature(&cpu->env, ARM_FEATURE_VFP3);
91
dinfo = drive_get_next(IF_SD);
30
+}
92
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
31
+
93
- s->card = sd_init(blk, false);
32
static const ARMCPRegInfo cortexa8_cp_reginfo[] = {
94
- if (s->card == NULL) {
33
{ .name = "L2LOCKDOWN", .cp = 15, .crn = 9, .crm = 0, .opc1 = 1, .opc2 = 0,
95
- error_setg(errp, "failed to init SD card");
34
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
96
+ carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
35
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo arm_cpus[] = {
97
+ qdev_prop_set_drive(carddev, "drive", blk, &err);
36
{ .name = "cortex-m33", .initfn = cortex_m33_initfn,
98
+ object_property_set_bool(OBJECT(carddev), true, "realized", &err);
37
.class_init = arm_v7m_class_init },
99
+ if (err) {
38
{ .name = "cortex-r5", .initfn = cortex_r5_initfn },
100
+ error_setg(errp, "failed to init SD card: %s", error_get_pretty(err));
39
+ { .name = "cortex-r5f", .initfn = cortex_r5f_initfn },
101
return;
40
{ .name = "cortex-a7", .initfn = cortex_a7_initfn },
102
}
41
{ .name = "cortex-a8", .initfn = cortex_a8_initfn },
103
s->enabled = blk && blk_is_inserted(blk);
42
{ .name = "cortex-a9", .initfn = cortex_a9_initfn },
104
--
43
--
105
2.16.1
44
2.17.1
106
45
107
46
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
This device does not model MMCA Specification previous to v4.2
3
The ZynqMP has Cortex-R5Fs with the optional FPU enabled.
4
4
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20180215221325.7611-6-f4bug@amsat.org
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
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
12
---
10
hw/sd/sd.c | 33 ---------------------------------
13
hw/arm/xlnx-zcu102.c | 2 +-
11
1 file changed, 33 deletions(-)
14
hw/arm/xlnx-zynqmp.c | 2 +-
15
2 files changed, 2 insertions(+), 2 deletions(-)
12
16
13
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
17
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/sd.c
19
--- a/hw/arm/xlnx-zcu102.c
16
+++ b/hw/sd/sd.c
20
+++ b/hw/arm/xlnx-zcu102.c
17
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
21
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
18
}
22
{
19
break;
23
MachineClass *mc = MACHINE_CLASS(oc);
20
24
21
- case 11:    /* CMD11: READ_DAT_UNTIL_STOP */
25
- mc->desc = "Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5s based on " \
22
- if (sd->spi)
26
+ mc->desc = "Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5Fs based on " \
23
- goto bad_cmd;
27
"the value of smp";
24
- switch (sd->state) {
28
mc->init = xlnx_zcu102_init;
25
- case sd_transfer_state:
29
mc->block_default_type = IF_IDE;
26
- sd->state = sd_sendingdata_state;
30
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
27
- sd->data_start = req.arg;
31
index XXXXXXX..XXXXXXX 100644
28
- sd->data_offset = 0;
32
--- a/hw/arm/xlnx-zynqmp.c
29
-
33
+++ b/hw/arm/xlnx-zynqmp.c
30
- if (sd->data_start + sd->blk_len > sd->size)
34
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_rpu(XlnxZynqMPState *s, const char *boot_cpu,
31
- sd->card_status |= ADDRESS_ERROR;
35
char *name;
32
- return sd_r0;
36
33
-
37
object_initialize(&s->rpu_cpu[i], sizeof(s->rpu_cpu[i]),
34
- default:
38
- "cortex-r5-" TYPE_ARM_CPU);
35
- break;
39
+ "cortex-r5f-" TYPE_ARM_CPU);
36
- }
40
object_property_add_child(OBJECT(s), "rpu-cpu[*]",
37
- break;
41
OBJECT(&s->rpu_cpu[i]), &error_abort);
38
-
39
case 12:    /* CMD12: STOP_TRANSMISSION */
40
switch (sd->state) {
41
case sd_sendingdata_state:
42
@@ -XXX,XX +XXX,XX @@ uint8_t sd_read_data(SDState *sd)
43
sd->state = sd_transfer_state;
44
break;
45
46
- case 11:    /* CMD11: READ_DAT_UNTIL_STOP */
47
- if (sd->data_offset == 0)
48
- BLK_READ_BLOCK(sd->data_start, io_len);
49
- ret = sd->data[sd->data_offset ++];
50
-
51
- if (sd->data_offset >= io_len) {
52
- sd->data_start += io_len;
53
- sd->data_offset = 0;
54
- if (sd->data_start + io_len > sd->size) {
55
- sd->card_status |= ADDRESS_ERROR;
56
- break;
57
- }
58
- }
59
- break;
60
-
61
case 13:    /* ACMD13: SD_STATUS */
62
ret = sd->sd_status[sd->data_offset ++];
63
42
64
--
43
--
65
2.16.1
44
2.17.1
66
45
67
46
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.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
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
We implement the MPC as a QEMU IOMMU, which will direct transactions
4
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
6
either through to the devices and memory behind it or to a special
5
Message-id: 20180215220540.6556-8-f4bug@amsat.org
7
"never works" AddressSpace if they are blocked.
8
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
14
6
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
7
---
19
---
8
hw/sd/sdmmc-internal.h | 15 +++++++++++++++
20
hw/misc/Makefile.objs | 1 +
9
hw/sd/sd.c | 22 ++++++++++++++++------
21
include/hw/misc/tz-mpc.h | 70 ++++++
10
2 files changed, 31 insertions(+), 6 deletions(-)
22
hw/misc/tz-mpc.c | 399 ++++++++++++++++++++++++++++++++
11
create mode 100644 hw/sd/sdmmc-internal.h
23
MAINTAINERS | 2 +
24
default-configs/arm-softmmu.mak | 1 +
25
hw/misc/trace-events | 7 +
26
6 files changed, 480 insertions(+)
27
create mode 100644 include/hw/misc/tz-mpc.h
28
create mode 100644 hw/misc/tz-mpc.c
12
29
13
diff --git a/hw/sd/sdmmc-internal.h b/hw/sd/sdmmc-internal.h
30
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
31
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/misc/Makefile.objs
33
+++ b/hw/misc/Makefile.objs
34
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_MIPS_ITU) += mips_itu.o
35
obj-$(CONFIG_MPS2_FPGAIO) += mps2-fpgaio.o
36
obj-$(CONFIG_MPS2_SCC) += mps2-scc.o
37
38
+obj-$(CONFIG_TZ_MPC) += tz-mpc.o
39
obj-$(CONFIG_TZ_PPC) += tz-ppc.o
40
obj-$(CONFIG_IOTKIT_SECCTL) += iotkit-secctl.o
41
42
diff --git a/include/hw/misc/tz-mpc.h b/include/hw/misc/tz-mpc.h
14
new file mode 100644
43
new file mode 100644
15
index XXXXXXX..XXXXXXX
44
index XXXXXXX..XXXXXXX
16
--- /dev/null
45
--- /dev/null
17
+++ b/hw/sd/sdmmc-internal.h
46
+++ b/include/hw/misc/tz-mpc.h
18
@@ -XXX,XX +XXX,XX @@
47
@@ -XXX,XX +XXX,XX @@
19
+/*
48
+/*
20
+ * SD/MMC cards common
49
+ * ARM AHB5 TrustZone Memory Protection Controller emulation
21
+ *
50
+ *
22
+ * Copyright (c) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
51
+ * Copyright (c) 2018 Linaro Limited
23
+ *
52
+ * Written by Peter Maydell
24
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
53
+ *
25
+ * See the COPYING file in the top-level directory.
54
+ * This program is free software; you can redistribute it and/or modify
26
+ * SPDX-License-Identifier: GPL-2.0-or-later
55
+ * it under the terms of the GNU General Public License version 2 or
56
+ * (at your option) any later version.
27
+ */
57
+ */
28
+#ifndef SD_INTERNAL_H
58
+
29
+#define SD_INTERNAL_H
59
+/* This is a model of the TrustZone memory protection controller (MPC).
30
+
60
+ * It is documented in the ARM CoreLink SIE-200 System IP for Embedded TRM
31
+#define SDMMC_CMD_MAX 64
61
+ * (DDI 0571G):
62
+ * https://developer.arm.com/products/architecture/m-profile/docs/ddi0571/g
63
+ *
64
+ * The MPC sits in front of memory and allows secure software to
65
+ * configure it to either pass through or reject transactions.
66
+ * Rejected transactions may be configured to either be aborted, or to
67
+ * behave as RAZ/WI. An interrupt can be signalled for a rejected transaction.
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 {
93
+ /*< private >*/
94
+ SysBusDevice parent_obj;
95
+
96
+ /*< public >*/
97
+
98
+ qemu_irq irq;
99
+
100
+ /* Properties */
101
+ MemoryRegion *downstream;
102
+
103
+ hwaddr blocksize;
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
+};
32
+
116
+
33
+#endif
117
+#endif
34
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
118
diff --git a/hw/misc/tz-mpc.c b/hw/misc/tz-mpc.c
119
new file mode 100644
120
index XXXXXXX..XXXXXXX
121
--- /dev/null
122
+++ b/hw/misc/tz-mpc.c
123
@@ -XXX,XX +XXX,XX @@
124
+/*
125
+ * ARM AHB5 TrustZone Memory Protection Controller emulation
126
+ *
127
+ * Copyright (c) 2018 Linaro Limited
128
+ * Written by Peter Maydell
129
+ *
130
+ * This program is free software; you can redistribute it and/or modify
131
+ * it under the terms of the GNU General Public License version 2 or
132
+ * (at your option) any later version.
133
+ */
134
+
135
+#include "qemu/osdep.h"
136
+#include "qemu/log.h"
137
+#include "qapi/error.h"
138
+#include "trace.h"
139
+#include "hw/sysbus.h"
140
+#include "hw/registerfields.h"
141
+#include "hw/misc/tz-mpc.h"
142
+
143
+/* Our IOMMU has two IOMMU indexes, one for secure transactions and one for
144
+ * non-secure transactions.
145
+ */
146
+enum {
147
+ IOMMU_IDX_S,
148
+ IOMMU_IDX_NS,
149
+ IOMMU_NUM_INDEXES,
150
+};
151
+
152
+/* Config registers */
153
+REG32(CTRL, 0x00)
154
+REG32(BLK_MAX, 0x10)
155
+REG32(BLK_CFG, 0x14)
156
+REG32(BLK_IDX, 0x18)
157
+REG32(BLK_LUT, 0x1c)
158
+REG32(INT_STAT, 0x20)
159
+REG32(INT_CLEAR, 0x24)
160
+REG32(INT_EN, 0x28)
161
+REG32(INT_INFO1, 0x2c)
162
+REG32(INT_INFO2, 0x30)
163
+REG32(INT_SET, 0x34)
164
+REG32(PIDR4, 0xfd0)
165
+REG32(PIDR5, 0xfd4)
166
+REG32(PIDR6, 0xfd8)
167
+REG32(PIDR7, 0xfdc)
168
+REG32(PIDR0, 0xfe0)
169
+REG32(PIDR1, 0xfe4)
170
+REG32(PIDR2, 0xfe8)
171
+REG32(PIDR3, 0xfec)
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
+ */
269
+ default:
270
+ oldval = 0;
271
+ break;
272
+ }
273
+ value = deposit32(oldval, (addr & 3) * 8, size * 8, value);
274
+ }
275
+
276
+ switch (offset) {
277
+ case A_PIDR4:
278
+ case A_PIDR5:
279
+ case A_PIDR6:
280
+ case A_PIDR7:
281
+ case A_PIDR0:
282
+ case A_PIDR1:
283
+ case A_PIDR2:
284
+ case A_PIDR3:
285
+ case A_CIDR0:
286
+ case A_CIDR1:
287
+ case A_CIDR2:
288
+ case A_CIDR3:
289
+ qemu_log_mask(LOG_GUEST_ERROR,
290
+ "TZ MPC register write: read-only offset 0x%x\n", offset);
291
+ break;
292
+ default:
293
+ qemu_log_mask(LOG_GUEST_ERROR,
294
+ "TZ MPC register write: bad offset 0x%x\n", offset);
295
+ break;
296
+ }
297
+
298
+ return MEMTX_OK;
299
+}
300
+
301
+static const MemoryRegionOps tz_mpc_reg_ops = {
302
+ .read_with_attrs = tz_mpc_reg_read,
303
+ .write_with_attrs = tz_mpc_reg_write,
304
+ .endianness = DEVICE_LITTLE_ENDIAN,
305
+ .valid.min_access_size = 1,
306
+ .valid.max_access_size = 4,
307
+ .impl.min_access_size = 1,
308
+ .impl.max_access_size = 4,
309
+};
310
+
311
+/* Accesses only reach these read and write functions if the MPC is
312
+ * blocking them; non-blocked accesses go directly to the downstream
313
+ * memory region without passing through this code.
314
+ */
315
+static MemTxResult tz_mpc_mem_blocked_read(void *opaque, hwaddr addr,
316
+ uint64_t *pdata,
317
+ unsigned size, MemTxAttrs attrs)
318
+{
319
+ trace_tz_mpc_mem_blocked_read(addr, size, attrs.secure);
320
+
321
+ *pdata = 0;
322
+ return MEMTX_OK;
323
+}
324
+
325
+static MemTxResult tz_mpc_mem_blocked_write(void *opaque, hwaddr addr,
326
+ uint64_t value,
327
+ unsigned size, MemTxAttrs attrs)
328
+{
329
+ trace_tz_mpc_mem_blocked_write(addr, value, size, attrs.secure);
330
+
331
+ return MEMTX_OK;
332
+}
333
+
334
+static const MemoryRegionOps tz_mpc_mem_blocked_ops = {
335
+ .read_with_attrs = tz_mpc_mem_blocked_read,
336
+ .write_with_attrs = tz_mpc_mem_blocked_write,
337
+ .endianness = DEVICE_LITTLE_ENDIAN,
338
+ .valid.min_access_size = 1,
339
+ .valid.max_access_size = 8,
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.
362
+ */
363
+ ok = true;
364
+
365
+ trace_tz_mpc_translate(addr, flags,
366
+ iommu_idx == IOMMU_IDX_S ? "S" : "NS",
367
+ ok ? "pass" : "block");
368
+
369
+ ret.target_as = ok ? &s->downstream_as : &s->blocked_io_as;
370
+ return ret;
371
+}
372
+
373
+static int tz_mpc_attrs_to_index(IOMMUMemoryRegion *iommu, MemTxAttrs attrs)
374
+{
375
+ /* We treat unspecified attributes like secure. Transactions with
376
+ * unspecified attributes come from places like
377
+ * cpu_physical_memory_write_rom() for initial image load, and we want
378
+ * those to pass through the from-reset "everything is secure" config.
379
+ * All the real during-emulation transactions from the CPU will
380
+ * specify attributes.
381
+ */
382
+ return (attrs.unspecified || attrs.secure) ? IOMMU_IDX_S : IOMMU_IDX_NS;
383
+}
384
+
385
+static int tz_mpc_num_indexes(IOMMUMemoryRegion *iommu)
386
+{
387
+ return IOMMU_NUM_INDEXES;
388
+}
389
+
390
+static void tz_mpc_reset(DeviceState *dev)
391
+{
392
+}
393
+
394
+static void tz_mpc_init(Object *obj)
395
+{
396
+ DeviceState *dev = DEVICE(obj);
397
+ TZMPC *s = TZ_MPC(obj);
398
+
399
+ qdev_init_gpio_out_named(dev, &s->irq, "irq", 1);
400
+}
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,
471
+ .fields = (VMStateField[]) {
472
+ VMSTATE_END_OF_LIST()
473
+ }
474
+};
475
+
476
+static Property tz_mpc_properties[] = {
477
+ DEFINE_PROP_LINK("downstream", TZMPC, downstream,
478
+ TYPE_MEMORY_REGION, MemoryRegion *),
479
+ DEFINE_PROP_END_OF_LIST(),
480
+};
481
+
482
+static void tz_mpc_class_init(ObjectClass *klass, void *data)
483
+{
484
+ DeviceClass *dc = DEVICE_CLASS(klass);
485
+
486
+ dc->realize = tz_mpc_realize;
487
+ dc->vmsd = &tz_mpc_vmstate;
488
+ dc->reset = tz_mpc_reset;
489
+ dc->props = tz_mpc_properties;
490
+}
491
+
492
+static const TypeInfo tz_mpc_info = {
493
+ .name = TYPE_TZ_MPC,
494
+ .parent = TYPE_SYS_BUS_DEVICE,
495
+ .instance_size = sizeof(TZMPC),
496
+ .instance_init = tz_mpc_init,
497
+ .class_init = tz_mpc_class_init,
498
+};
499
+
500
+static void tz_mpc_iommu_memory_region_class_init(ObjectClass *klass,
501
+ void *data)
502
+{
503
+ IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_CLASS(klass);
504
+
505
+ imrc->translate = tz_mpc_translate;
506
+ imrc->attrs_to_index = tz_mpc_attrs_to_index;
507
+ imrc->num_indexes = tz_mpc_num_indexes;
508
+}
509
+
510
+static const TypeInfo tz_mpc_iommu_memory_region_info = {
511
+ .name = TYPE_TZ_MPC_IOMMU_MEMORY_REGION,
512
+ .parent = TYPE_IOMMU_MEMORY_REGION,
513
+ .class_init = tz_mpc_iommu_memory_region_class_init,
514
+};
515
+
516
+static void tz_mpc_register_types(void)
517
+{
518
+ type_register_static(&tz_mpc_info);
519
+ type_register_static(&tz_mpc_iommu_memory_region_info);
520
+}
521
+
522
+type_init(tz_mpc_register_types);
523
diff --git a/MAINTAINERS b/MAINTAINERS
35
index XXXXXXX..XXXXXXX 100644
524
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/sd/sd.c
525
--- a/MAINTAINERS
37
+++ b/hw/sd/sd.c
526
+++ b/MAINTAINERS
38
@@ -XXX,XX +XXX,XX @@
527
@@ -XXX,XX +XXX,XX @@ F: hw/char/cmsdk-apb-uart.c
39
#include "qemu/error-report.h"
528
F: include/hw/char/cmsdk-apb-uart.h
40
#include "qemu/timer.h"
529
F: hw/misc/tz-ppc.c
41
#include "qemu/log.h"
530
F: include/hw/misc/tz-ppc.h
42
+#include "sdmmc-internal.h"
531
+F: hw/misc/tz-mpc.c
43
#include "trace.h"
532
+F: include/hw/misc/tz-mpc.h
44
533
45
//#define DEBUG_SD 1
534
ARM cores
46
@@ -XXX,XX +XXX,XX @@ static void sd_set_mode(SDState *sd)
535
M: Peter Maydell <peter.maydell@linaro.org>
47
}
536
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
48
}
537
index XXXXXXX..XXXXXXX 100644
49
538
--- a/default-configs/arm-softmmu.mak
50
-static const sd_cmd_type_t sd_cmd_type[64] = {
539
+++ b/default-configs/arm-softmmu.mak
51
+static const sd_cmd_type_t sd_cmd_type[SDMMC_CMD_MAX] = {
540
@@ -XXX,XX +XXX,XX @@ CONFIG_CMSDK_APB_UART=y
52
sd_bc, sd_none, sd_bcr, sd_bcr, sd_none, sd_none, sd_none, sd_ac,
541
CONFIG_MPS2_FPGAIO=y
53
sd_bcr, sd_ac, sd_ac, sd_adtc, sd_ac, sd_ac, sd_none, sd_ac,
542
CONFIG_MPS2_SCC=y
54
+ /* 16 */
543
55
sd_ac, sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
544
+CONFIG_TZ_MPC=y
56
sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac, sd_ac, sd_adtc, sd_none,
545
CONFIG_TZ_PPC=y
57
+ /* 32 */
546
CONFIG_IOTKIT=y
58
sd_ac, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
547
CONFIG_IOTKIT_SECCTL=y
59
sd_none, sd_none, sd_bc, sd_none, sd_none, sd_none, sd_none, sd_none,
548
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
60
+ /* 48 */
549
index XXXXXXX..XXXXXXX 100644
61
sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
550
--- a/hw/misc/trace-events
62
sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
551
+++ b/hw/misc/trace-events
63
};
552
@@ -XXX,XX +XXX,XX @@ mos6522_set_sr_int(void) "set sr_int"
64
553
mos6522_write(uint64_t addr, uint64_t val) "reg=0x%"PRIx64 " val=0x%"PRIx64
65
-static const int sd_cmd_class[64] = {
554
mos6522_read(uint64_t addr, unsigned val) "reg=0x%"PRIx64 " val=0x%x"
66
+static const int sd_cmd_class[SDMMC_CMD_MAX] = {
555
67
0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0,
556
+# hw/misc/tz-mpc.c
68
2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6,
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"
69
5, 5, 10, 10, 10, 10, 5, 9, 9, 9, 7, 7, 7, 7, 7, 7,
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"
70
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
559
+tz_mpc_mem_blocked_read(uint64_t addr, unsigned size, bool secure) "TZ MPC blocked read: offset 0x%" PRIx64 " size %u secure %d"
71
/* Not interpreting this as an app command */
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"
72
sd->card_status &= ~APP_CMD;
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"
73
562
+
74
- if (sd_cmd_type[req.cmd & 0x3F] == sd_ac
563
# hw/misc/tz-ppc.c
75
- || sd_cmd_type[req.cmd & 0x3F] == sd_adtc) {
564
tz_ppc_reset(void) "TZ PPC: reset"
76
+ if (sd_cmd_type[req.cmd] == sd_ac
565
tz_ppc_cfg_nonsec(int n, int level) "TZ PPC: cfg_nonsec[%d] = %d"
77
+ || sd_cmd_type[req.cmd] == sd_adtc) {
78
rca = req.arg >> 16;
79
}
80
81
@@ -XXX,XX +XXX,XX @@ static int cmd_valid_while_locked(SDState *sd, SDRequest *req)
82
if (req->cmd == 16 || req->cmd == 55) {
83
return 1;
84
}
85
- return sd_cmd_class[req->cmd & 0x3F] == 0
86
- || sd_cmd_class[req->cmd & 0x3F] == 7;
87
+ return sd_cmd_class[req->cmd] == 0
88
+ || sd_cmd_class[req->cmd] == 7;
89
}
90
91
int sd_do_command(SDState *sd, SDRequest *req,
92
@@ -XXX,XX +XXX,XX @@ int sd_do_command(SDState *sd, SDRequest *req,
93
goto send_response;
94
}
95
96
+ if (req->cmd >= SDMMC_CMD_MAX) {
97
+ qemu_log_mask(LOG_GUEST_ERROR, "SD: incorrect command 0x%02x\n",
98
+ req->cmd);
99
+ req->cmd &= 0x3f;
100
+ }
101
+
102
if (sd->card_status & CARD_IS_LOCKED) {
103
if (!cmd_valid_while_locked(sd, req)) {
104
sd->card_status |= ILLEGAL_COMMAND;
105
--
566
--
106
2.16.1
567
2.17.1
107
568
108
569
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Implement the missing registers for the TZ MPC.
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
5
Message-id: 20180215220540.6556-3-f4bug@amsat.org
6
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
7
---
6
---
8
hw/sd/sd.c | 32 ++++++++++++++++++++++++++------
7
include/hw/misc/tz-mpc.h | 10 +++
9
hw/sd/trace-events | 6 ++++++
8
hw/misc/tz-mpc.c | 140 ++++++++++++++++++++++++++++++++++++++-
10
2 files changed, 32 insertions(+), 6 deletions(-)
9
2 files changed, 147 insertions(+), 3 deletions(-)
11
10
12
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
11
diff --git a/include/hw/misc/tz-mpc.h b/include/hw/misc/tz-mpc.h
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/sd/sd.c
13
--- a/include/hw/misc/tz-mpc.h
15
+++ b/hw/sd/sd.c
14
+++ b/include/hw/misc/tz-mpc.h
16
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@ struct TZMPC {
17
#include "qemu/error-report.h"
16
18
#include "qemu/timer.h"
17
/*< public >*/
19
#include "qemu/log.h"
18
20
+#include "trace.h"
19
+ /* State */
21
20
+ uint32_t ctrl;
22
//#define DEBUG_SD 1
21
+ uint32_t blk_idx;
23
22
+ uint32_t int_stat;
24
@@ -XXX,XX +XXX,XX @@ struct SDState {
23
+ uint32_t int_en;
25
bool cmd_line;
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
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/misc/tz-mpc.c
35
+++ b/hw/misc/tz-mpc.c
36
@@ -XXX,XX +XXX,XX @@ enum {
37
38
/* Config registers */
39
REG32(CTRL, 0x00)
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,
26
};
62
};
27
63
28
+static const char *sd_state_name(enum SDCardStates state)
64
+static void tz_mpc_irq_update(TZMPC *s)
29
+{
65
+{
30
+ static const char *state_name[] = {
66
+ qemu_set_irq(s->irq, s->int_stat && s->int_en);
31
+ [sd_idle_state] = "idle",
67
+}
32
+ [sd_ready_state] = "ready",
68
+
33
+ [sd_identification_state] = "identification",
69
+static void tz_mpc_autoinc_idx(TZMPC *s, unsigned access_size)
34
+ [sd_standby_state] = "standby",
70
+{
35
+ [sd_transfer_state] = "transfer",
71
+ /* Auto-increment BLK_IDX if necessary */
36
+ [sd_sendingdata_state] = "sendingdata",
72
+ if (access_size == 4 && (s->ctrl & R_CTRL_AUTOINC_MASK)) {
37
+ [sd_receivingdata_state] = "receivingdata",
73
+ s->blk_idx++;
38
+ [sd_programming_state] = "programming",
74
+ s->blk_idx %= s->blk_max;
39
+ [sd_disconnect_state] = "disconnect",
40
+ };
41
+ if (state == sd_inactive_state) {
42
+ return "inactive";
43
+ }
75
+ }
44
+ assert(state <= ARRAY_SIZE(state_name));
45
+ return state_name[state];
46
+}
76
+}
47
+
77
+
48
static uint8_t sd_get_dat_lines(SDState *sd)
78
static MemTxResult tz_mpc_reg_read(void *opaque, hwaddr addr,
79
uint64_t *pdata,
80
unsigned size, MemTxAttrs attrs)
49
{
81
{
50
return sd->enable ? sd->dat_lines : 0;
82
+ TZMPC *s = TZ_MPC(opaque);
51
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
83
uint64_t r;
52
uint32_t rca = 0x0000;
84
uint32_t offset = addr & ~0x3;
53
uint64_t addr = (sd->ocr & (1 << 30)) ? (uint64_t) req.arg << 9 : req.arg;
85
54
86
@@ -XXX,XX +XXX,XX @@ static MemTxResult tz_mpc_reg_read(void *opaque, hwaddr addr,
55
+ trace_sdcard_normal_command(req.cmd, req.arg, sd_state_name(sd->state));
56
+
57
/* Not interpreting this as an app command */
58
sd->card_status &= ~APP_CMD;
59
60
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
61
sd->multi_blk_cnt = 0;
62
}
87
}
63
88
64
- DPRINTF("CMD%d 0x%08x state %d\n", req.cmd, req.arg, sd->state);
89
switch (offset) {
65
switch (req.cmd) {
90
+ case A_CTRL:
66
/* Basic commands (Class 0 and Class 1) */
91
+ r = s->ctrl;
67
case 0:    /* CMD0: GO_IDLE_STATE */
92
+ break;
68
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
93
+ case A_BLK_MAX:
69
return sd_r1;
94
+ r = s->blk_max;
70
95
+ break;
71
case 56:    /* CMD56: GEN_CMD */
96
+ case A_BLK_CFG:
72
- fprintf(stderr, "SD: GEN_CMD 0x%08x\n", req.arg);
97
+ /* We are never in "init in progress state", so this just indicates
73
-
98
+ * the block size. s->blocksize == (1 << BLK_CFG + 5), so
74
switch (sd->state) {
99
+ * BLK_CFG == ctz32(s->blocksize) - 5
75
case sd_transfer_state:
100
+ */
76
sd->data_offset = 0;
101
+ r = ctz32(s->blocksize) - 5;
77
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
102
+ break;
78
static sd_rsp_type_t sd_app_command(SDState *sd,
103
+ case A_BLK_IDX:
79
SDRequest req)
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)
80
{
128
{
81
- DPRINTF("ACMD%d 0x%08x\n", req.cmd, req.arg);
129
+ TZMPC *s = TZ_MPC(opaque);
82
+ trace_sdcard_app_command(req.cmd, req.arg);
130
uint32_t offset = addr & ~0x3;
83
sd->card_status |= APP_CMD;
131
84
switch (req.cmd) {
132
trace_tz_mpc_reg_write(addr, value, size);
85
case 6:    /* ACMD6: SET_BUS_WIDTH */
133
@@ -XXX,XX +XXX,XX @@ static MemTxResult tz_mpc_reg_write(void *opaque, hwaddr addr,
86
@@ -XXX,XX +XXX,XX @@ send_response:
134
uint32_t oldval;
87
135
88
static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
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);
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)
89
{
204
{
90
- DPRINTF("sd_blk_read: addr = 0x%08llx, len = %d\n",
205
+ TZMPC *s = TZ_MPC(dev);
91
- (unsigned long long) addr, len);
206
+
92
+ trace_sdcard_read_block(addr, len);
207
+ s->ctrl = 0x00000100;
93
if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
208
+ s->blk_idx = 0;
94
fprintf(stderr, "sd_blk_read: read error on host side\n");
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));
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()
95
}
252
}
96
@@ -XXX,XX +XXX,XX @@ static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
253
};
97
98
static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
99
{
100
+ trace_sdcard_write_block(addr, len);
101
if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
102
fprintf(stderr, "sd_blk_write: write error on host side\n");
103
}
104
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
105
index XXXXXXX..XXXXXXX 100644
106
--- a/hw/sd/trace-events
107
+++ b/hw/sd/trace-events
108
@@ -XXX,XX +XXX,XX @@ sdhci_read_dataport(uint16_t data_count) "all %u bytes of data have been read fr
109
sdhci_write_dataport(uint16_t data_count) "write buffer filled with %u bytes of data"
110
sdhci_capareg(const char *desc, uint16_t val) "%s: %u"
111
112
+# hw/sd/sd.c
113
+sdcard_normal_command(uint8_t cmd, uint32_t arg, const char *state) "CMD%d arg 0x%08x (state %s)"
114
+sdcard_app_command(uint8_t acmd, uint32_t arg) "ACMD%d arg 0x%08x"
115
+sdcard_read_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
116
+sdcard_write_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
117
+
118
# hw/sd/milkymist-memcard.c
119
milkymist_memcard_memory_read(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
120
milkymist_memcard_memory_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
121
--
254
--
122
2.16.1
255
2.17.1
123
256
124
257
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.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
use the registerfields API to access the OCR register
5
Implement this behaviour in the blocked-access handlers.
4
6
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
7
Message-id: 20180215221325.7611-8-f4bug@amsat.org
8
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
9
---
10
---
10
hw/sd/sd.c | 21 ++++++++++++++++-----
11
hw/misc/tz-mpc.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++--
11
1 file changed, 16 insertions(+), 5 deletions(-)
12
1 file changed, 48 insertions(+), 2 deletions(-)
12
13
13
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
14
diff --git a/hw/misc/tz-mpc.c b/hw/misc/tz-mpc.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/sd.c
16
--- a/hw/misc/tz-mpc.c
16
+++ b/hw/sd/sd.c
17
+++ b/hw/misc/tz-mpc.c
17
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ REG32(INT_EN, 0x28)
18
19
FIELD(INT_EN, IRQ, 0, 1)
19
//#define DEBUG_SD 1
20
REG32(INT_INFO1, 0x2c)
20
21
REG32(INT_INFO2, 0x30)
21
-#define ACMD41_ENQUIRY_MASK 0x00ffffff
22
+ FIELD(INT_INFO2, HMASTER, 0, 16)
22
-
23
+ FIELD(INT_INFO2, HNONSEC, 16, 1)
23
typedef enum {
24
+ FIELD(INT_INFO2, CFG_NS, 17, 1)
24
sd_r0 = 0, /* no response */
25
REG32(INT_SET, 0x34)
25
sd_r1, /* normal response command */
26
FIELD(INT_SET, IRQ, 0, 1)
26
@@ -XXX,XX +XXX,XX @@ static uint16_t sd_crc16(void *message, size_t width)
27
REG32(PIDR4, 0xfd0)
27
28
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps tz_mpc_reg_ops = {
28
#define OCR_POWER_DELAY_NS 500000 /* 0.5ms */
29
.impl.max_access_size = 4,
29
30
};
30
+FIELD(OCR, VDD_VOLTAGE_WINDOW, 0, 24)
31
31
+FIELD(OCR, VDD_VOLTAGE_WIN_LO, 0, 8)
32
+static inline bool tz_mpc_cfg_ns(TZMPC *s, hwaddr addr)
32
+FIELD(OCR, DUAL_VOLTAGE_CARD, 7, 1)
33
+{
33
+FIELD(OCR, VDD_VOLTAGE_WIN_HI, 8, 16)
34
+ /* Return the cfg_ns bit from the LUT for the specified address */
34
+FIELD(OCR, ACCEPT_SWITCH_1V8, 24, 1) /* Only UHS-I */
35
+ hwaddr blknum = addr / s->blocksize;
35
+FIELD(OCR, UHS_II_CARD, 29, 1) /* Only UHS-II */
36
+ hwaddr blkword = blknum / 32;
36
FIELD(OCR, CARD_CAPACITY, 30, 1) /* 0:SDSC, 1:SDHC/SDXC */
37
+ uint32_t blkbit = 1U << (blknum % 32);
37
FIELD(OCR, CARD_POWER_UP, 31, 1)
38
39
+#define ACMD41_ENQUIRY_MASK 0x00ffffff
40
+#define ACMD41_R3_MASK (R_OCR_VDD_VOLTAGE_WIN_HI_MASK \
41
+ | R_OCR_ACCEPT_SWITCH_1V8_MASK \
42
+ | R_OCR_UHS_II_CARD_MASK \
43
+ | R_OCR_CARD_CAPACITY_MASK \
44
+ | R_OCR_CARD_POWER_UP_MASK)
45
+
38
+
46
static void sd_set_ocr(SDState *sd)
39
+ /* This would imply the address was larger than the size we
40
+ * defined this memory region to be, so it can't happen.
41
+ */
42
+ assert(blkword < s->blk_max);
43
+ return s->blk_lut[blkword] & blkbit;
44
+}
45
+
46
+static MemTxResult tz_mpc_handle_block(TZMPC *s, hwaddr addr, MemTxAttrs attrs)
47
+{
48
+ /* Handle a blocked transaction: raise IRQ, capture info, etc */
49
+ if (!s->int_stat) {
50
+ /* First blocked transfer: capture information into INT_INFO1 and
51
+ * INT_INFO2. Subsequent transfers are still blocked but don't
52
+ * capture information until the guest clears the interrupt.
53
+ */
54
+
55
+ s->int_info1 = addr;
56
+ s->int_info2 = 0;
57
+ s->int_info2 = FIELD_DP32(s->int_info2, INT_INFO2, HMASTER,
58
+ attrs.requester_id & 0xffff);
59
+ s->int_info2 = FIELD_DP32(s->int_info2, INT_INFO2, HNONSEC,
60
+ ~attrs.secure);
61
+ s->int_info2 = FIELD_DP32(s->int_info2, INT_INFO2, CFG_NS,
62
+ tz_mpc_cfg_ns(s, addr));
63
+ s->int_stat |= R_INT_STAT_IRQ_MASK;
64
+ tz_mpc_irq_update(s);
65
+ }
66
+
67
+ /* Generate bus error if desired; otherwise RAZ/WI */
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)
47
{
77
{
48
- /* All voltages OK, Standard Capacity SD Memory Card, not yet powered up */
78
+ TZMPC *s = TZ_MPC(opaque);
49
- sd->ocr = 0x00ffff00;
79
+
50
+ /* All voltages OK */
80
trace_tz_mpc_mem_blocked_read(addr, size, attrs.secure);
51
+ sd->ocr = R_OCR_VDD_VOLTAGE_WIN_HI_MASK;
81
82
*pdata = 0;
83
- return MEMTX_OK;
84
+ return tz_mpc_handle_block(s, addr, attrs);
52
}
85
}
53
86
54
static void sd_ocr_powerup(void *opaque)
87
static MemTxResult tz_mpc_mem_blocked_write(void *opaque, hwaddr addr,
55
@@ -XXX,XX +XXX,XX @@ static void sd_response_r1_make(SDState *sd, uint8_t *response)
88
uint64_t value,
56
89
unsigned size, MemTxAttrs attrs)
57
static void sd_response_r3_make(SDState *sd, uint8_t *response)
58
{
90
{
59
- stl_be_p(response, sd->ocr);
91
+ TZMPC *s = TZ_MPC(opaque);
60
+ stl_be_p(response, sd->ocr & ACMD41_R3_MASK);
92
+
93
trace_tz_mpc_mem_blocked_write(addr, value, size, attrs.secure);
94
95
- return MEMTX_OK;
96
+ return tz_mpc_handle_block(s, addr, attrs);
61
}
97
}
62
98
63
static void sd_response_r6_make(SDState *sd, uint8_t *response)
99
static const MemoryRegionOps tz_mpc_mem_blocked_ops = {
64
--
100
--
65
2.16.1
101
2.17.1
66
102
67
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
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
6
the guest writes to BLK_LUT, we must also call the IOMMU
5
Message-id: 20180215221325.7611-3-f4bug@amsat.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/sd/sd.c | 3 +--
13
hw/misc/tz-mpc.c | 53 ++++++++++++++++++++++++++++++++++++++++++--
9
1 file changed, 1 insertion(+), 2 deletions(-)
14
hw/misc/trace-events | 1 +
15
2 files changed, 52 insertions(+), 2 deletions(-)
10
16
11
diff --git a/hw/sd/sd.c b/hw/sd/sd.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/sd/sd.c
19
--- a/hw/misc/tz-mpc.c
14
+++ b/hw/sd/sd.c
20
+++ b/hw/misc/tz-mpc.c
15
@@ -XXX,XX +XXX,XX @@ static void sd_set_csd(SDState *sd, uint64_t size)
21
@@ -XXX,XX +XXX,XX @@ static void tz_mpc_irq_update(TZMPC *s)
16
sd->csd[13] = 0x20 |    /* Max. write data block length */
22
qemu_set_irq(s->irq, s->int_stat && s->int_en);
17
((HWBLOCK_SHIFT << 6) & 0xc0);
18
sd->csd[14] = 0x00;    /* File format group */
19
- sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
20
} else {            /* SDHC */
21
size /= 512 * 1024;
22
size -= 1;
23
@@ -XXX,XX +XXX,XX @@ static void sd_set_csd(SDState *sd, uint64_t size)
24
sd->csd[12] = 0x0a;
25
sd->csd[13] = 0x40;
26
sd->csd[14] = 0x00;
27
- sd->csd[15] = 0x00;
28
}
29
+ sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
30
}
23
}
31
24
32
static void sd_set_rca(SDState *sd)
25
+static void tz_mpc_iommu_notify(TZMPC *s, uint32_t lutidx,
26
+ uint32_t oldlut, uint32_t newlut)
27
+{
28
+ /* Called when the LUT word at lutidx has changed from oldlut to newlut;
29
+ * must call the IOMMU notifiers for the changed blocks.
30
+ */
31
+ IOMMUTLBEntry entry = {
32
+ .addr_mask = s->blocksize - 1,
33
+ };
34
+ hwaddr addr = lutidx * s->blocksize * 32;
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;
77
break;
78
case A_BLK_LUT:
79
+ tz_mpc_iommu_notify(s, s->blk_idx, s->blk_lut[s->blk_idx], value);
80
s->blk_lut[s->blk_idx] = value;
81
tz_mpc_autoinc_idx(s, size);
82
break;
83
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry tz_mpc_translate(IOMMUMemoryRegion *iommu,
84
/* Look at the per-block configuration for this address, and
85
* return a TLB entry directing the transaction at either
86
* downstream_as or blocked_io_as, as appropriate.
87
- * For the moment, always permit accesses.
88
+ * If the LUT cfg_ns bit is 1, only non-secure transactions
89
+ * may pass. If the bit is 0, only secure transactions may pass.
90
*/
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"
33
--
108
--
34
2.16.1
109
2.17.1
35
110
36
111
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.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
Create the SDCard in the realize() function.
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20180620132032.28865-6-peter.maydell@linaro.org
8
---
9
include/hw/misc/iotkit-secctl.h | 8 +++++++
10
hw/misc/iotkit-secctl.c | 38 +++++++++++++++++++++++++++++++--
11
2 files changed, 44 insertions(+), 2 deletions(-)
4
12
5
Suggested-by: Michael Walle <michael@walle.cc>
13
diff --git a/include/hw/misc/iotkit-secctl.h b/include/hw/misc/iotkit-secctl.h
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
8
Acked-by: Michael Walle <michael@walle.cc>
9
Message-id: 20180216022933.10945-3-f4bug@amsat.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/sd/milkymist-memcard.c | 28 ++++++++++++++++------------
13
1 file changed, 16 insertions(+), 12 deletions(-)
14
15
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/sd/milkymist-memcard.c
15
--- a/include/hw/misc/iotkit-secctl.h
18
+++ b/hw/sd/milkymist-memcard.c
16
+++ b/include/hw/misc/iotkit-secctl.h
19
@@ -XXX,XX +XXX,XX @@ static void milkymist_memcard_reset(DeviceState *d)
17
@@ -XXX,XX +XXX,XX @@
20
device_reset(DEVICE(s->card));
18
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_enable
19
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_clear
20
* + named GPIO inputs ahb_ppcexp{0,1,2,3}_irq_status
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);
21
}
70
}
22
71
23
-static int milkymist_memcard_init(SysBusDevice *dev)
72
+static void iotkit_secctl_mpc_status(void *opaque, int n, int level)
24
+static void milkymist_memcard_init(Object *obj)
25
+{
73
+{
26
+ MilkymistMemcardState *s = MILKYMIST_MEMCARD(obj);
74
+ IoTKitSecCtl *s = IOTKIT_SECCTL(opaque);
27
+ SysBusDevice *dev = SYS_BUS_DEVICE(obj);
28
+
75
+
29
+ memory_region_init_io(&s->regs_region, OBJECT(s), &memcard_mmio_ops, s,
76
+ s->mpcintstatus = deposit32(s->mpcintstatus, 0, 1, !!level);
30
+ "milkymist-memcard", R_MAX * 4);
31
+ sysbus_init_mmio(dev, &s->regs_region);
32
+}
77
+}
33
+
78
+
34
+static void milkymist_memcard_realize(DeviceState *dev, Error **errp)
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)
35
{
87
{
36
MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
88
IoTKitSecCtlPPC *ppc = opaque;
37
- DriveInfo *dinfo;
89
@@ -XXX,XX +XXX,XX @@ static void iotkit_secctl_init(Object *obj)
38
BlockBackend *blk;
90
qdev_init_gpio_out_named(dev, &s->sec_resp_cfg, "sec_resp_cfg", 1);
39
+ DriveInfo *dinfo;
91
qdev_init_gpio_out_named(dev, &s->nsc_cfg_irq, "nsc_cfg", 1);
40
92
41
/* FIXME use a qdev drive property instead of drive_get_next() */
93
+ qdev_init_gpio_in_named(dev, iotkit_secctl_mpc_status, "mpc_status", 1);
42
dinfo = drive_get_next(IF_SD);
94
+ qdev_init_gpio_in_named(dev, iotkit_secctl_mpcexp_status,
43
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
95
+ "mpcexp_status", IOTS_NUM_EXP_MPC);
44
s->card = sd_init(blk, false);
96
+
45
if (s->card == NULL) {
97
memory_region_init_io(&s->s_regs, obj, &iotkit_secctl_s_ops,
46
- return -1;
98
s, "iotkit-secctl-s-regs", 0x1000);
47
+ error_setg(errp, "failed to init SD card");
99
memory_region_init_io(&s->ns_regs, obj, &iotkit_secctl_ns_ops,
48
+ return;
100
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription iotkit_secctl_ppc_vmstate = {
49
}
101
}
50
-
51
s->enabled = blk && blk_is_inserted(blk);
52
-
53
- memory_region_init_io(&s->regs_region, OBJECT(s), &memcard_mmio_ops, s,
54
- "milkymist-memcard", R_MAX * 4);
55
- sysbus_init_mmio(dev, &s->regs_region);
56
-
57
- return 0;
58
}
59
60
static const VMStateDescription vmstate_milkymist_memcard = {
61
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_milkymist_memcard = {
62
static void milkymist_memcard_class_init(ObjectClass *klass, void *data)
63
{
64
DeviceClass *dc = DEVICE_CLASS(klass);
65
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
66
67
- k->init = milkymist_memcard_init;
68
+ dc->realize = milkymist_memcard_realize;
69
dc->reset = milkymist_memcard_reset;
70
dc->vmsd = &vmstate_milkymist_memcard;
71
/* Reason: init() method uses drive_get_next() */
72
@@ -XXX,XX +XXX,XX @@ static const TypeInfo milkymist_memcard_info = {
73
.name = TYPE_MILKYMIST_MEMCARD,
74
.parent = TYPE_SYS_BUS_DEVICE,
75
.instance_size = sizeof(MilkymistMemcardState),
76
+ .instance_init = milkymist_memcard_init,
77
.class_init = milkymist_memcard_class_init,
78
};
102
};
79
103
104
+static const VMStateDescription iotkit_secctl_mpcintstatus_vmstate = {
105
+ .name = "iotkit-secctl-mpcintstatus",
106
+ .version_id = 1,
107
+ .minimum_version_id = 1,
108
+ .fields = (VMStateField[]) {
109
+ VMSTATE_UINT32(mpcintstatus, IoTKitSecCtl),
110
+ VMSTATE_END_OF_LIST()
111
+ }
112
+};
113
+
114
static const VMStateDescription iotkit_secctl_vmstate = {
115
.name = "iotkit-secctl",
116
.version_id = 1,
117
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription iotkit_secctl_vmstate = {
118
VMSTATE_STRUCT_ARRAY(ahbexp, IoTKitSecCtl, IOTS_NUM_AHB_EXP_PPC, 1,
119
iotkit_secctl_ppc_vmstate, IoTKitSecCtlPPC),
120
VMSTATE_END_OF_LIST()
121
- }
122
+ },
123
+ .subsections = (const VMStateDescription*[]) {
124
+ &iotkit_secctl_mpcintstatus_vmstate,
125
+ NULL
126
+ },
127
};
128
129
static void iotkit_secctl_class_init(ObjectClass *klass, void *data)
80
--
130
--
81
2.16.1
131
2.17.1
82
132
83
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
To comply with Spec v1.10 (and 2.00, 3.01):
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
---
8
include/hw/arm/iotkit.h | 2 ++
9
hw/arm/iotkit.c | 38 +++++++++++++++++++++++++++-----------
10
2 files changed, 29 insertions(+), 11 deletions(-)
4
11
5
. TRAN_SPEED
12
diff --git a/include/hw/arm/iotkit.h b/include/hw/arm/iotkit.h
6
7
for current SD Memory Cards that field must be always 0_0110_010b (032h) which is
8
equal to 25MHz - the mandatory maximum operating frequency of SD Memory Card.
9
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
12
Message-id: 20180215221325.7611-4-f4bug@amsat.org
13
[PMM: fixed comment indent]
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/sd/sd.c | 2 +-
17
1 file changed, 1 insertion(+), 1 deletion(-)
18
19
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
20
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/sd/sd.c
14
--- a/include/hw/arm/iotkit.h
22
+++ b/hw/sd/sd.c
15
+++ b/include/hw/arm/iotkit.h
23
@@ -XXX,XX +XXX,XX @@ static void sd_set_csd(SDState *sd, uint64_t size)
16
@@ -XXX,XX +XXX,XX @@
24
sd->csd[0] = 0x00;    /* CSD structure */
17
#include "hw/arm/armv7m.h"
25
sd->csd[1] = 0x26;    /* Data read access-time-1 */
18
#include "hw/misc/iotkit-secctl.h"
26
sd->csd[2] = 0x00;    /* Data read access-time-2 */
19
#include "hw/misc/tz-ppc.h"
27
- sd->csd[3] = 0x5a;    /* Max. data transfer rate */
20
+#include "hw/misc/tz-mpc.h"
28
+ sd->csd[3] = 0x32; /* Max. data transfer rate: 25 MHz */
21
#include "hw/timer/cmsdk-apb-timer.h"
29
sd->csd[4] = 0x5f;    /* Card Command Classes */
22
#include "hw/misc/unimp.h"
30
sd->csd[5] = 0x50 |    /* Max. read data block length */
23
#include "hw/or-irq.h"
31
HWBLOCK_SHIFT;
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]);
101
32
--
102
--
33
2.16.1
103
2.17.1
34
104
35
105
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.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
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
5
Acked-by: Michael Walle <michael@walle.cc>
6
Message-id: 20180216022933.10945-2-f4bug@amsat.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 20180620132032.28865-8-peter.maydell@linaro.org
8
---
8
---
9
hw/sd/milkymist-memcard.c | 17 ++++++++++-------
9
include/hw/arm/iotkit.h | 6 ++++
10
1 file changed, 10 insertions(+), 7 deletions(-)
10
hw/arm/iotkit.c | 74 +++++++++++++++++++++++++++++++++++++++++
11
2 files changed, 80 insertions(+)
11
12
12
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
13
diff --git a/include/hw/arm/iotkit.h b/include/hw/arm/iotkit.h
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/sd/milkymist-memcard.c
15
--- a/include/hw/arm/iotkit.h
15
+++ b/hw/sd/milkymist-memcard.c
16
+++ b/include/hw/arm/iotkit.h
16
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@
18
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_enable
19
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_clear
20
* + named GPIO inputs ahb_ppcexp{0,1,2,3}_irq_status
21
+ * Controlling each of the 16 expansion MPCs which a system using the IoTKit
22
+ * might provide:
23
+ * + named GPIO inputs mpcexp_status[0..15]
17
*/
24
*/
18
25
19
#include "qemu/osdep.h"
26
#ifndef IOTKIT_H
20
+#include "qemu/log.h"
27
@@ -XXX,XX +XXX,XX @@ typedef struct IoTKit {
21
#include "hw/hw.h"
28
qemu_or_irq ppc_irq_orgate;
22
#include "hw/sysbus.h"
29
SplitIRQ sec_resp_splitter;
23
#include "sysemu/sysemu.h"
30
SplitIRQ ppc_irq_splitter[NUM_PPCS];
24
#include "trace.h"
31
+ SplitIRQ mpc_irq_splitter[IOTS_NUM_EXP_MPC + IOTS_NUM_MPC];
25
-#include "qemu/error-report.h"
32
+ qemu_or_irq mpc_irq_orgate;
26
+#include "include/qapi/error.h"
33
27
#include "sysemu/block-backend.h"
34
UnimplementedDeviceState dualtimer;
28
#include "sysemu/blockdev.h"
35
UnimplementedDeviceState s32ktimer;
29
#include "hw/sd/sd.h"
36
@@ -XXX,XX +XXX,XX @@ typedef struct IoTKit {
30
@@ -XXX,XX +XXX,XX @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
37
qemu_irq nsc_cfg_in;
31
} else {
38
32
r = s->response[s->response_read_ptr++];
39
qemu_irq irq_status_in[NUM_EXTERNAL_PPCS];
33
if (s->response_read_ptr > s->response_len) {
40
+ qemu_irq mpcexp_status_in[IOTS_NUM_EXP_MPC];
34
- error_report("milkymist_memcard: "
41
35
- "read more cmd bytes than available. Clipping.");
42
uint32_t nsccfg;
36
+ qemu_log_mask(LOG_GUEST_ERROR, "milkymist_memcard: "
43
37
+ "read more cmd bytes than available. Clipping.");
44
diff --git a/hw/arm/iotkit.c b/hw/arm/iotkit.c
38
s->response_read_ptr = 0;
45
index XXXXXXX..XXXXXXX 100644
39
}
46
--- a/hw/arm/iotkit.c
40
}
47
+++ b/hw/arm/iotkit.c
41
@@ -XXX,XX +XXX,XX @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
48
@@ -XXX,XX +XXX,XX @@ static void iotkit_init(Object *obj)
42
break;
49
init_sysbus_child(obj, "apb-ppc1", &s->apb_ppc1, sizeof(s->apb_ppc1),
43
50
TYPE_TZ_PPC);
44
default:
51
init_sysbus_child(obj, "mpc", &s->mpc, sizeof(s->mpc), TYPE_TZ_MPC);
45
- error_report("milkymist_memcard: read access to unknown register 0x"
52
+ object_initialize(&s->mpc_irq_orgate, sizeof(s->mpc_irq_orgate),
46
- TARGET_FMT_plx, addr << 2);
53
+ TYPE_OR_IRQ);
47
+ qemu_log_mask(LOG_UNIMP, "milkymist_memcard: "
54
+ object_property_add_child(obj, "mpc-irq-orgate",
48
+ "read access to unknown register 0x%" HWADDR_PRIx "\n",
55
+ OBJECT(&s->mpc_irq_orgate), &error_abort);
49
+ addr << 2);
56
+ for (i = 0; i < ARRAY_SIZE(s->mpc_irq_splitter); i++) {
50
break;
57
+ char *name = g_strdup_printf("mpc-irq-splitter-%d", i);
58
+ SplitIRQ *splitter = &s->mpc_irq_splitter[i];
59
+
60
+ object_initialize(splitter, sizeof(*splitter), TYPE_SPLIT_IRQ);
61
+ object_property_add_child(obj, name, OBJECT(splitter), &error_abort);
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);
69
}
70
71
+static void iotkit_mpcexp_status(void *opaque, int n, int level)
72
+{
73
+ IoTKit *s = IOTKIT(opaque);
74
+ qemu_set_irq(s->mpcexp_status_in[n], level);
75
+}
76
+
77
static void iotkit_realize(DeviceState *dev, Error **errp)
78
{
79
IoTKit *s = IOTKIT(dev);
80
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
81
sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->mpc),
82
0));
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));
99
+
100
/* Devices behind APB PPC0:
101
* 0x40000000: timer0
102
* 0x40001000: timer1
103
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
104
g_free(gpioname);
51
}
105
}
52
106
53
@@ -XXX,XX +XXX,XX @@ static void memcard_write(void *opaque, hwaddr addr, uint64_t value,
107
+ /* Wire up the splitters for the MPC IRQs */
54
break;
108
+ for (i = 0; i < IOTS_NUM_EXP_MPC + IOTS_NUM_MPC; i++) {
55
109
+ SplitIRQ *splitter = &s->mpc_irq_splitter[i];
56
default:
110
+ DeviceState *dev_splitter = DEVICE(splitter);
57
- error_report("milkymist_memcard: write access to unknown register 0x"
111
+
58
- TARGET_FMT_plx, addr << 2);
112
+ object_property_set_int(OBJECT(splitter), 2, "num-lines", &err);
59
+ qemu_log_mask(LOG_UNIMP, "milkymist_memcard: "
113
+ if (err) {
60
+ "write access to unknown register 0x%" HWADDR_PRIx " "
114
+ error_propagate(errp, err);
61
+ "(value 0x%" PRIx64 ")\n", addr << 2, value);
115
+ return;
62
break;
116
+ }
63
}
117
+ object_property_set_bool(OBJECT(splitter), true, "realized", &err);
64
}
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;
65
--
150
--
66
2.16.1
151
2.17.1
67
152
68
153
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Instantiate and wire up the Memory Protection Controllers
2
in the MPS2 board itself.
2
3
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Message-id: 20180215220540.6556-4-f4bug@amsat.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.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/sd/sd.c | 27 ++++++++++++++++++++++++---
8
hw/arm/mps2-tz.c | 71 ++++++++++++++++++++++++++++++------------------
9
hw/sd/trace-events | 1 +
9
1 file changed, 44 insertions(+), 27 deletions(-)
10
2 files changed, 25 insertions(+), 3 deletions(-)
11
10
12
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
11
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/sd/sd.c
13
--- a/hw/arm/mps2-tz.c
15
+++ b/hw/sd/sd.c
14
+++ b/hw/arm/mps2-tz.c
16
@@ -XXX,XX +XXX,XX @@ static const char *sd_state_name(enum SDCardStates state)
15
@@ -XXX,XX +XXX,XX @@
17
return state_name[state];
16
#include "hw/timer/cmsdk-apb-timer.h"
17
#include "hw/misc/mps2-scc.h"
18
#include "hw/misc/mps2-fpgaio.h"
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);
18
}
58
}
19
59
20
+static const char *sd_response_name(sd_rsp_type_t rsp)
60
+static MemoryRegion *make_mpc(MPS2TZMachineState *mms, void *opaque,
61
+ const char *name, hwaddr size)
21
+{
62
+{
22
+ static const char *response_name[] = {
63
+ TZMPC *mpc = opaque;
23
+ [sd_r0] = "RESP#0 (no response)",
64
+ int i = mpc - &mms->ssram_mpc[0];
24
+ [sd_r1] = "RESP#1 (normal cmd)",
65
+ MemoryRegion *ssram = &mms->ssram[i];
25
+ [sd_r2_i] = "RESP#2 (CID reg)",
66
+ MemoryRegion *upstream;
26
+ [sd_r2_s] = "RESP#2 (CSD reg)",
67
+ char *mpcname = g_strdup_printf("%s-mpc", name);
27
+ [sd_r3] = "RESP#3 (OCR reg)",
68
+ static uint32_t ramsize[] = { 0x00400000, 0x00200000, 0x00200000 };
28
+ [sd_r6] = "RESP#6 (RCA)",
69
+ static uint32_t rambase[] = { 0x00000000, 0x28000000, 0x28200000 };
29
+ [sd_r7] = "RESP#7 (operating voltage)",
70
+
30
+ };
71
+ memory_region_init_ram(ssram, NULL, name, ramsize[i], &error_fatal);
31
+ if (rsp == sd_illegal) {
72
+
32
+ return "ILLEGAL RESP";
73
+ init_sysbus_child(OBJECT(mms), mpcname, mpc,
74
+ sizeof(mms->ssram_mpc[0]), TYPE_TZ_MPC);
75
+ object_property_set_link(OBJECT(mpc), OBJECT(ssram),
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);
33
+ }
91
+ }
34
+ if (rsp == sd_r1b) {
92
+
35
+ rsp = sd_r1;
93
+ g_free(mpcname);
36
+ }
94
+ /* Return the register interface MR for our caller to map behind the PPC */
37
+ assert(rsp <= ARRAY_SIZE(response_name));
95
+ return sysbus_mmio_get_region(SYS_BUS_DEVICE(mpc), 0);
38
+ return response_name[rsp];
39
+}
96
+}
40
+
97
+
41
static uint8_t sd_get_dat_lines(SDState *sd)
98
static void mps2tz_common_init(MachineState *machine)
42
{
99
{
43
return sd->enable ? sd->dat_lines : 0;
100
MPS2TZMachineState *mms = MPS2TZ_MACHINE(machine);
44
@@ -XXX,XX +XXX,XX @@ send_response:
101
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
45
102
NULL, "mps.ram", 0x01000000);
46
case sd_r0:
103
memory_region_add_subregion(system_memory, 0x80000000, &mms->psram);
47
case sd_illegal:
104
48
- default:
105
- /* The SSRAM memories should all be behind Memory Protection Controllers,
49
rsplen = 0;
106
- * but we don't implement that yet.
50
break;
107
- */
51
+ default:
108
- make_ram(&mms->ssram1, "mps.ssram1", 0x00000000, 0x00400000);
52
+ g_assert_not_reached();
109
- make_ram_alias(&mms->ssram1_m, "mps.ssram1_m", &mms->ssram1, 0x00400000);
53
}
110
-
54
+ trace_sdcard_response(sd_response_name(rtype), rsplen);
111
- make_ram(&mms->ssram23, "mps.ssram23", 0x28000000, 0x00400000);
55
112
-
56
if (rtype != sd_illegal) {
113
/* The overflow IRQs for all UARTs are ORed together.
57
/* Clear the "clear on valid command" status bits now we've
114
* Tx, Rx and "combined" IRQs are sent to the NVIC separately.
58
@@ -XXX,XX +XXX,XX @@ send_response:
115
* Create the OR gate for this.
59
DPRINTF(" %02x", response[i]);
116
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
60
}
117
const PPCInfo ppcs[] = { {
61
DPRINTF(" state %d\n", sd->state);
118
.name = "apb_ppcexp0",
62
- } else {
119
.ports = {
63
- DPRINTF("No response %d\n", sd->state);
120
- { "ssram-mpc0", make_unimp_dev, &mms->ssram_mpc[0],
64
}
121
- 0x58007000, 0x1000 },
65
#endif
122
- { "ssram-mpc1", make_unimp_dev, &mms->ssram_mpc[1],
66
123
- 0x58008000, 0x1000 },
67
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
124
- { "ssram-mpc2", make_unimp_dev, &mms->ssram_mpc[2],
68
index XXXXXXX..XXXXXXX 100644
125
- 0x58009000, 0x1000 },
69
--- a/hw/sd/trace-events
126
+ { "ssram-0", make_mpc, &mms->ssram_mpc[0], 0x58007000, 0x1000 },
70
+++ b/hw/sd/trace-events
127
+ { "ssram-1", make_mpc, &mms->ssram_mpc[1], 0x58008000, 0x1000 },
71
@@ -XXX,XX +XXX,XX @@ sdhci_capareg(const char *desc, uint16_t val) "%s: %u"
128
+ { "ssram-2", make_mpc, &mms->ssram_mpc[2], 0x58009000, 0x1000 },
72
# hw/sd/sd.c
129
},
73
sdcard_normal_command(uint8_t cmd, uint32_t arg, const char *state) "CMD%d arg 0x%08x (state %s)"
130
}, {
74
sdcard_app_command(uint8_t acmd, uint32_t arg) "ACMD%d arg 0x%08x"
131
.name = "apb_ppcexp1",
75
+sdcard_response(const char *rspdesc, int rsplen) "%s (sz:%d)"
76
sdcard_read_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
77
sdcard_write_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
78
79
--
132
--
80
2.16.1
133
2.17.1
81
134
82
135
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Julia Suvorova <jusual@mail.ru>
2
2
3
the code is easier to review/refactor.
3
This feature is intended to distinguish ARMv8-M variants: Baseline and
4
Mainline. ARMv7-M compatibility requires the Main Extension. ARMv6-M
5
compatibility is provided by all ARMv8-M implementations.
4
6
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Julia Suvorova <jusual@mail.ru>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
8
Message-id: 20180622080138.17702-2-jusual@mail.ru
7
Message-id: 20180215221325.7611-7-f4bug@amsat.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
hw/sd/sd.c | 38 +++++++++-----------------------------
12
target/arm/cpu.h | 1 +
12
1 file changed, 9 insertions(+), 29 deletions(-)
13
target/arm/cpu.c | 3 +++
14
2 files changed, 4 insertions(+)
13
15
14
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/sd/sd.c
18
--- a/target/arm/cpu.h
17
+++ b/hw/sd/sd.c
19
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@ static int sd_req_crc_validate(SDRequest *req)
20
@@ -XXX,XX +XXX,XX @@ enum arm_features {
19
{
21
ARM_FEATURE_V8_RDM, /* implements v8.1 simd round multiply */
20
uint8_t buffer[5];
22
ARM_FEATURE_V8_FP16, /* implements v8.2 half-precision float */
21
buffer[0] = 0x40 | req->cmd;
23
ARM_FEATURE_V8_FCMA, /* has complex number part of v8.3 extensions. */
22
- buffer[1] = (req->arg >> 24) & 0xff;
24
+ ARM_FEATURE_M_MAIN, /* M profile Main Extension */
23
- buffer[2] = (req->arg >> 16) & 0xff;
25
};
24
- buffer[3] = (req->arg >> 8) & 0xff;
26
25
- buffer[4] = (req->arg >> 0) & 0xff;
27
static inline int arm_feature(CPUARMState *env, int feature)
26
+ stl_be_p(&buffer[1], req->arg);
28
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
27
return 0;
29
index XXXXXXX..XXXXXXX 100644
28
return sd_crc7(buffer, 5) != req->crc;    /* TODO */
30
--- a/target/arm/cpu.c
29
}
31
+++ b/target/arm/cpu.c
30
32
@@ -XXX,XX +XXX,XX @@ static void cortex_m3_initfn(Object *obj)
31
static void sd_response_r1_make(SDState *sd, uint8_t *response)
33
ARMCPU *cpu = ARM_CPU(obj);
32
{
34
set_feature(&cpu->env, ARM_FEATURE_V7);
33
- uint32_t status = sd->card_status;
35
set_feature(&cpu->env, ARM_FEATURE_M);
34
+ stl_be_p(response, sd->card_status);
36
+ set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
35
+
37
cpu->midr = 0x410fc231;
36
/* Clear the "clear on read" status bits */
38
cpu->pmsav7_dregion = 8;
37
sd->card_status &= ~CARD_STATUS_C;
39
cpu->id_pfr0 = 0x00000030;
38
-
40
@@ -XXX,XX +XXX,XX @@ static void cortex_m4_initfn(Object *obj)
39
- response[0] = (status >> 24) & 0xff;
41
40
- response[1] = (status >> 16) & 0xff;
42
set_feature(&cpu->env, ARM_FEATURE_V7);
41
- response[2] = (status >> 8) & 0xff;
43
set_feature(&cpu->env, ARM_FEATURE_M);
42
- response[3] = (status >> 0) & 0xff;
44
+ set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
43
}
45
set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
44
46
cpu->midr = 0x410fc240; /* r0p0 */
45
static void sd_response_r3_make(SDState *sd, uint8_t *response)
47
cpu->pmsav7_dregion = 8;
46
{
48
@@ -XXX,XX +XXX,XX @@ static void cortex_m33_initfn(Object *obj)
47
- response[0] = (sd->ocr >> 24) & 0xff;
49
48
- response[1] = (sd->ocr >> 16) & 0xff;
50
set_feature(&cpu->env, ARM_FEATURE_V8);
49
- response[2] = (sd->ocr >> 8) & 0xff;
51
set_feature(&cpu->env, ARM_FEATURE_M);
50
- response[3] = (sd->ocr >> 0) & 0xff;
52
+ set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
51
+ stl_be_p(response, sd->ocr);
53
set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
52
}
54
set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
53
55
cpu->midr = 0x410fd213; /* r0p3 */
54
static void sd_response_r6_make(SDState *sd, uint8_t *response)
55
{
56
- uint16_t arg;
57
uint16_t status;
58
59
- arg = sd->rca;
60
status = ((sd->card_status >> 8) & 0xc000) |
61
((sd->card_status >> 6) & 0x2000) |
62
(sd->card_status & 0x1fff);
63
sd->card_status &= ~(CARD_STATUS_C & 0xc81fff);
64
-
65
- response[0] = (arg >> 8) & 0xff;
66
- response[1] = arg & 0xff;
67
- response[2] = (status >> 8) & 0xff;
68
- response[3] = status & 0xff;
69
+ stw_be_p(response + 0, sd->rca);
70
+ stw_be_p(response + 2, status);
71
}
72
73
static void sd_response_r7_make(SDState *sd, uint8_t *response)
74
{
75
- response[0] = (sd->vhs >> 24) & 0xff;
76
- response[1] = (sd->vhs >> 16) & 0xff;
77
- response[2] = (sd->vhs >> 8) & 0xff;
78
- response[3] = (sd->vhs >> 0) & 0xff;
79
+ stl_be_p(response, sd->vhs);
80
}
81
82
static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
83
@@ -XXX,XX +XXX,XX @@ static uint32_t sd_wpbits(SDState *sd, uint64_t addr)
84
85
static void sd_function_switch(SDState *sd, uint32_t arg)
86
{
87
- int i, mode, new_func, crc;
88
+ int i, mode, new_func;
89
mode = !!(arg & 0x80000000);
90
91
sd->data[0] = 0x00;        /* Maximum current consumption */
92
@@ -XXX,XX +XXX,XX @@ static void sd_function_switch(SDState *sd, uint32_t arg)
93
sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
94
}
95
memset(&sd->data[17], 0, 47);
96
- crc = sd_crc16(sd->data, 64);
97
- sd->data[65] = crc >> 8;
98
- sd->data[66] = crc & 0xff;
99
+ stw_be_p(sd->data + 65, sd_crc16(sd->data, 64));
100
}
101
102
static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
103
--
56
--
104
2.16.1
57
2.17.1
105
58
106
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
Acked-by: Alistair Francis <alistair.francis@xilinx.com>
4
aligned memory accesses for load/store instructions.
5
Message-id: 20180215220540.6556-6-f4bug@amsat.org
5
6
Signed-off-by: Julia Suvorova <jusual@mail.ru>
7
Message-id: 20180622080138.17702-3-jusual@mail.ru
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
10
---
9
hw/sd/sd.c | 32 ++++++++++++++++++++++++++------
11
target/arm/translate.c | 18 ++++++++++++++++--
10
hw/sd/trace-events | 13 +++++++++++++
12
1 file changed, 16 insertions(+), 2 deletions(-)
11
2 files changed, 39 insertions(+), 6 deletions(-)
12
13
13
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/sd.c
16
--- a/target/arm/translate.c
16
+++ b/hw/sd/sd.c
17
+++ b/target/arm/translate.c
17
@@ -XXX,XX +XXX,XX @@ static bool sd_get_cmd_line(SDState *sd)
18
@@ -XXX,XX +XXX,XX @@ static inline TCGv gen_aa32_addr(DisasContext *s, TCGv_i32 a32, TCGMemOp op)
18
19
static void gen_aa32_ld_i32(DisasContext *s, TCGv_i32 val, TCGv_i32 a32,
19
static void sd_set_voltage(SDState *sd, uint16_t millivolts)
20
int index, TCGMemOp opc)
20
{
21
{
21
+ trace_sdcard_set_voltage(millivolts);
22
- TCGv addr = gen_aa32_addr(s, a32, opc);
23
+ TCGv addr;
22
+
24
+
23
switch (millivolts) {
25
+ if (arm_dc_feature(s, ARM_FEATURE_M) &&
24
case 3001 ... 3600: /* SD_VOLTAGE_3_3V */
26
+ !arm_dc_feature(s, ARM_FEATURE_M_MAIN)) {
25
case 2001 ... 3000: /* SD_VOLTAGE_3_0V */
27
+ opc |= MO_ALIGN;
26
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
28
+ }
29
+
30
+ addr = gen_aa32_addr(s, a32, opc);
31
tcg_gen_qemu_ld_i32(val, addr, index, opc);
32
tcg_temp_free(addr);
33
}
34
@@ -XXX,XX +XXX,XX @@ static void gen_aa32_ld_i32(DisasContext *s, TCGv_i32 val, TCGv_i32 a32,
35
static void gen_aa32_st_i32(DisasContext *s, TCGv_i32 val, TCGv_i32 a32,
36
int index, TCGMemOp opc)
27
{
37
{
28
SDState *sd = opaque;
38
- TCGv addr = gen_aa32_addr(s, a32, opc);
29
39
+ TCGv addr;
30
+ trace_sdcard_powerup();
40
+
31
/* Set powered up bit in OCR */
41
+ if (arm_dc_feature(s, ARM_FEATURE_M) &&
32
assert(!(sd->ocr & OCR_POWER_UP));
42
+ !arm_dc_feature(s, ARM_FEATURE_M_MAIN)) {
33
sd->ocr |= OCR_POWER_UP;
43
+ opc |= MO_ALIGN;
34
@@ -XXX,XX +XXX,XX @@ static void sd_reset(DeviceState *dev)
35
uint64_t size;
36
uint64_t sect;
37
38
+ trace_sdcard_reset();
39
if (sd->blk) {
40
blk_get_geometry(sd->blk, &sect);
41
} else {
42
@@ -XXX,XX +XXX,XX @@ static void sd_cardchange(void *opaque, bool load, Error **errp)
43
bool readonly = sd_get_readonly(sd);
44
45
if (inserted) {
46
+ trace_sdcard_inserted(readonly);
47
sd_reset(dev);
48
+ } else {
49
+ trace_sdcard_ejected();
50
}
51
52
/* The IRQ notification is for legacy non-QOM SD controller devices;
53
@@ -XXX,XX +XXX,XX @@ static void sd_erase(SDState *sd)
54
uint64_t erase_start = sd->erase_start;
55
uint64_t erase_end = sd->erase_end;
56
57
+ trace_sdcard_erase();
58
if (!sd->erase_start || !sd->erase_end) {
59
sd->card_status |= ERASE_SEQ_ERROR;
60
return;
61
@@ -XXX,XX +XXX,XX @@ static void sd_lock_command(SDState *sd)
62
else
63
pwd_len = 0;
64
65
+ if (lock) {
66
+ trace_sdcard_lock();
67
+ } else {
68
+ trace_sdcard_unlock();
69
+ }
44
+ }
70
if (erase) {
45
+
71
if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 ||
46
+ addr = gen_aa32_addr(s, a32, opc);
72
set_pwd || clr_pwd || lock || sd->wp_switch ||
47
tcg_gen_qemu_st_i32(val, addr, index, opc);
73
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
48
tcg_temp_free(addr);
74
case 16:    /* CMD16: SET_BLOCKLEN */
49
}
75
switch (sd->state) {
76
case sd_transfer_state:
77
- if (req.arg > (1 << HWBLOCK_SHIFT))
78
+ if (req.arg > (1 << HWBLOCK_SHIFT)) {
79
sd->card_status |= BLOCK_LEN_ERROR;
80
- else
81
+ } else {
82
+ trace_sdcard_set_blocklen(req.arg);
83
sd->blk_len = req.arg;
84
+ }
85
86
return sd_r1;
87
88
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
89
if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
90
timer_del(sd->ocr_power_timer);
91
sd_ocr_powerup(sd);
92
- } else if (!timer_pending(sd->ocr_power_timer)) {
93
- timer_mod_ns(sd->ocr_power_timer,
94
- (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
95
- + OCR_POWER_DELAY_NS));
96
+ } else {
97
+ trace_sdcard_inquiry_cmd41();
98
+ if (!timer_pending(sd->ocr_power_timer)) {
99
+ timer_mod_ns(sd->ocr_power_timer,
100
+ (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
101
+ + OCR_POWER_DELAY_NS));
102
+ }
103
}
104
}
105
106
@@ -XXX,XX +XXX,XX @@ void sd_write_data(SDState *sd, uint8_t value)
107
if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
108
return;
109
110
+ trace_sdcard_write_data(sd->current_cmd, value);
111
switch (sd->current_cmd) {
112
case 24:    /* CMD24: WRITE_SINGLE_BLOCK */
113
sd->data[sd->data_offset ++] = value;
114
@@ -XXX,XX +XXX,XX @@ uint8_t sd_read_data(SDState *sd)
115
116
io_len = (sd->ocr & (1 << 30)) ? 512 : sd->blk_len;
117
118
+ trace_sdcard_read_data(sd->current_cmd, io_len);
119
switch (sd->current_cmd) {
120
case 6:    /* CMD6: SWITCH_FUNCTION */
121
ret = sd->data[sd->data_offset ++];
122
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
123
index XXXXXXX..XXXXXXX 100644
124
--- a/hw/sd/trace-events
125
+++ b/hw/sd/trace-events
126
@@ -XXX,XX +XXX,XX @@ sdhci_capareg(const char *desc, uint16_t val) "%s: %u"
127
sdcard_normal_command(uint8_t cmd, uint32_t arg, const char *state) "CMD%d arg 0x%08x (state %s)"
128
sdcard_app_command(uint8_t acmd, uint32_t arg) "ACMD%d arg 0x%08x"
129
sdcard_response(const char *rspdesc, int rsplen) "%s (sz:%d)"
130
+sdcard_powerup(void) ""
131
+sdcard_inquiry_cmd41(void) ""
132
+sdcard_set_enable(bool current_state, bool new_state) "%u -> %u"
133
+sdcard_reset(void) ""
134
+sdcard_set_blocklen(uint16_t length) "0x%04x"
135
+sdcard_inserted(bool readonly) "read_only: %u"
136
+sdcard_ejected(void) ""
137
+sdcard_erase(void) ""
138
+sdcard_lock(void) ""
139
+sdcard_unlock(void) ""
140
sdcard_read_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
141
sdcard_write_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
142
+sdcard_write_data(uint8_t cmd, uint8_t value) "CMD%02d value 0x%02x"
143
+sdcard_read_data(uint8_t cmd, int length) "CMD%02d len %d"
144
+sdcard_set_voltage(uint16_t millivolts) "%u mV"
145
146
# hw/sd/milkymist-memcard.c
147
milkymist_memcard_memory_read(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
148
--
50
--
149
2.16.1
51
2.17.1
150
52
151
53
diff view generated by jsdifflib
1
The register definitions for VMIDR and VMPIDR have separate
1
checkpatch reminds us that statics shouldn't be zero-initialized:
2
reginfo structs for the AArch32 and AArch64 registers. However
3
the 32-bit versions are wrong:
4
* they use offsetof instead of offsetoflow32 to mark where
5
the 32-bit value lives in the uint64_t CPU state field
6
* they don't mark themselves as ARM_CP_ALIAS
7
2
8
In particular this means that if you try to use an Arm guest CPU
3
ERROR: do not initialise statics to 0 or NULL
9
which enables EL2 on a big-endian host it will assert at reset:
4
#35: FILE: vl.c:157:
10
target/arm/cpu.c:114: cp_reg_check_reset: Assertion `oldvalue == newvalue' failed.
5
+static int num_serial_hds = 0;
11
6
12
because the reset of the 32-bit register writes to the top
7
ERROR: do not initialise statics to 0 or NULL
13
half of the uint64_t.
8
#36: FILE: vl.c:158:
9
+static Chardev **serial_hds = NULL;
14
10
15
Correct the errors in the structures.
11
I forgot to fix this in 6af2692e86f9fdfb3d; do so now.
16
12
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Thomas Huth <thuth@redhat.com>
15
Message-id: 20180426140253.3918-1-peter.maydell@linaro.org
19
---
16
---
20
This is necessary for 'make check' to pass on big endian
17
vl.c | 4 ++--
21
systems with the 'raspi3' board enabled, which is the
18
1 file changed, 2 insertions(+), 2 deletions(-)
22
first board which has an EL2-enabled-by-default CPU.
23
---
24
target/arm/helper.c | 8 ++++----
25
1 file changed, 4 insertions(+), 4 deletions(-)
26
19
27
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
diff --git a/vl.c b/vl.c
28
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/helper.c
22
--- a/vl.c
30
+++ b/target/arm/helper.c
23
+++ b/vl.c
31
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
24
@@ -XXX,XX +XXX,XX @@ QEMUClockType rtc_clock;
32
{ .name = "VPIDR", .state = ARM_CP_STATE_AA32,
25
int vga_interface_type = VGA_NONE;
33
.cp = 15, .opc1 = 4, .crn = 0, .crm = 0, .opc2 = 0,
26
static DisplayOptions dpy;
34
.access = PL2_RW, .accessfn = access_el3_aa32ns,
27
int no_frame;
35
- .resetvalue = cpu->midr,
28
-static int num_serial_hds = 0;
36
- .fieldoffset = offsetof(CPUARMState, cp15.vpidr_el2) },
29
-static Chardev **serial_hds = NULL;
37
+ .resetvalue = cpu->midr, .type = ARM_CP_ALIAS,
30
+static int num_serial_hds;
38
+ .fieldoffset = offsetoflow32(CPUARMState, cp15.vpidr_el2) },
31
+static Chardev **serial_hds;
39
{ .name = "VPIDR_EL2", .state = ARM_CP_STATE_AA64,
32
Chardev *parallel_hds[MAX_PARALLEL_PORTS];
40
.opc0 = 3, .opc1 = 4, .crn = 0, .crm = 0, .opc2 = 0,
33
Chardev *virtcon_hds[MAX_VIRTIO_CONSOLES];
41
.access = PL2_RW, .resetvalue = cpu->midr,
34
int win2k_install_hack = 0;
42
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
43
{ .name = "VMPIDR", .state = ARM_CP_STATE_AA32,
44
.cp = 15, .opc1 = 4, .crn = 0, .crm = 0, .opc2 = 5,
45
.access = PL2_RW, .accessfn = access_el3_aa32ns,
46
- .resetvalue = vmpidr_def,
47
- .fieldoffset = offsetof(CPUARMState, cp15.vmpidr_el2) },
48
+ .resetvalue = vmpidr_def, .type = ARM_CP_ALIAS,
49
+ .fieldoffset = offsetoflow32(CPUARMState, cp15.vmpidr_el2) },
50
{ .name = "VMPIDR_EL2", .state = ARM_CP_STATE_AA64,
51
.opc0 = 3, .opc1 = 4, .crn = 0, .crm = 0, .opc2 = 5,
52
.access = PL2_RW,
53
--
35
--
54
2.16.1
36
2.17.1
55
37
56
38
diff view generated by jsdifflib
Deleted patch
1
From: Richard Braun <rbraun@sceen.net>
2
1
3
I/O currently being synchronous, there is no reason to ever clear the
4
SR_TXE bit. However the SR_TC bit may be cleared by software writing
5
to the SR register, so set it on each write.
6
7
In addition, fix the reset value of the USART status register.
8
9
Signed-off-by: Richard Braun <rbraun@sceen.net>
10
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
11
[PMM: removed XXX tag from comment, since it isn't something
12
we need to come back and fix in QEMU]
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
include/hw/char/stm32f2xx_usart.h | 7 ++++++-
16
hw/char/stm32f2xx_usart.c | 12 ++++++++----
17
2 files changed, 14 insertions(+), 5 deletions(-)
18
19
diff --git a/include/hw/char/stm32f2xx_usart.h b/include/hw/char/stm32f2xx_usart.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/char/stm32f2xx_usart.h
22
+++ b/include/hw/char/stm32f2xx_usart.h
23
@@ -XXX,XX +XXX,XX @@
24
#define USART_CR3 0x14
25
#define USART_GTPR 0x18
26
27
-#define USART_SR_RESET 0x00C00000
28
+/*
29
+ * NB: The reset value mentioned in "24.6.1 Status register" seems bogus.
30
+ * Looking at "Table 98 USART register map and reset values", it seems it
31
+ * should be 0xc0, and that's how real hardware behaves.
32
+ */
33
+#define USART_SR_RESET (USART_SR_TXE | USART_SR_TC)
34
35
#define USART_SR_TXE (1 << 7)
36
#define USART_SR_TC (1 << 6)
37
diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/char/stm32f2xx_usart.c
40
+++ b/hw/char/stm32f2xx_usart.c
41
@@ -XXX,XX +XXX,XX @@ static uint64_t stm32f2xx_usart_read(void *opaque, hwaddr addr,
42
switch (addr) {
43
case USART_SR:
44
retvalue = s->usart_sr;
45
- s->usart_sr &= ~USART_SR_TC;
46
qemu_chr_fe_accept_input(&s->chr);
47
return retvalue;
48
case USART_DR:
49
DB_PRINT("Value: 0x%" PRIx32 ", %c\n", s->usart_dr, (char) s->usart_dr);
50
- s->usart_sr |= USART_SR_TXE;
51
s->usart_sr &= ~USART_SR_RXNE;
52
qemu_chr_fe_accept_input(&s->chr);
53
qemu_set_irq(s->irq, 0);
54
@@ -XXX,XX +XXX,XX @@ static void stm32f2xx_usart_write(void *opaque, hwaddr addr,
55
switch (addr) {
56
case USART_SR:
57
if (value <= 0x3FF) {
58
- s->usart_sr = value;
59
+ /* I/O being synchronous, TXE is always set. In addition, it may
60
+ only be set by hardware, so keep it set here. */
61
+ s->usart_sr = value | USART_SR_TXE;
62
} else {
63
s->usart_sr &= value;
64
}
65
@@ -XXX,XX +XXX,XX @@ static void stm32f2xx_usart_write(void *opaque, hwaddr addr,
66
/* XXX this blocks entire thread. Rewrite to use
67
* qemu_chr_fe_write and background I/O callbacks */
68
qemu_chr_fe_write_all(&s->chr, &ch, 1);
69
+ /* XXX I/O are currently synchronous, making it impossible for
70
+ software to observe transient states where TXE or TC aren't
71
+ set. Unlike TXE however, which is read-only, software may
72
+ clear TC by writing 0 to the SR register, so set it again
73
+ on each write. */
74
s->usart_sr |= USART_SR_TC;
75
- s->usart_sr &= ~USART_SR_TXE;
76
}
77
return;
78
case USART_BRR:
79
--
80
2.16.1
81
82
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
On reset the bus will reset the card,
4
we can now drop the device_reset() call.
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
8
Message-id: 20180216022933.10945-5-f4bug@amsat.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/sd/ssi-sd.c | 32 +++++++++++++++++++-------------
12
1 file changed, 19 insertions(+), 13 deletions(-)
13
14
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/sd/ssi-sd.c
17
+++ b/hw/sd/ssi-sd.c
18
@@ -XXX,XX +XXX,XX @@ typedef struct {
19
int32_t arglen;
20
int32_t response_pos;
21
int32_t stopping;
22
- SDState *sd;
23
+ SDBus sdbus;
24
} ssi_sd_state;
25
26
#define TYPE_SSI_SD "ssi-sd"
27
@@ -XXX,XX +XXX,XX @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
28
request.arg = (s->cmdarg[0] << 24) | (s->cmdarg[1] << 16)
29
| (s->cmdarg[2] << 8) | s->cmdarg[3];
30
DPRINTF("CMD%d arg 0x%08x\n", s->cmd, request.arg);
31
- s->arglen = sd_do_command(s->sd, &request, longresp);
32
+ s->arglen = sdbus_do_command(&s->sdbus, &request, longresp);
33
if (s->arglen <= 0) {
34
s->arglen = 1;
35
s->response[0] = 4;
36
@@ -XXX,XX +XXX,XX @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
37
DPRINTF("Response 0x%02x\n", s->response[s->response_pos]);
38
return s->response[s->response_pos++];
39
}
40
- if (sd_data_ready(s->sd)) {
41
+ if (sdbus_data_ready(&s->sdbus)) {
42
DPRINTF("Data read\n");
43
s->mode = SSI_SD_DATA_START;
44
} else {
45
@@ -XXX,XX +XXX,XX @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
46
s->mode = SSI_SD_DATA_READ;
47
return 0xfe;
48
case SSI_SD_DATA_READ:
49
- val = sd_read_data(s->sd);
50
- if (!sd_data_ready(s->sd)) {
51
+ val = sdbus_read_data(&s->sdbus);
52
+ if (!sdbus_data_ready(&s->sdbus)) {
53
DPRINTF("Data read end\n");
54
s->mode = SSI_SD_CMD;
55
}
56
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_ssi_sd = {
57
static void ssi_sd_realize(SSISlave *d, Error **errp)
58
{
59
ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, d);
60
+ DeviceState *carddev;
61
DriveInfo *dinfo;
62
+ Error *err = NULL;
63
64
+ qbus_create_inplace(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS,
65
+ DEVICE(d), "sd-bus");
66
+
67
+ /* Create and plug in the sd card */
68
/* FIXME use a qdev drive property instead of drive_get_next() */
69
dinfo = drive_get_next(IF_SD);
70
- s->sd = sd_init(dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, true);
71
- if (s->sd == NULL) {
72
- error_setg(errp, "Device initialization failed.");
73
+ carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
74
+ if (dinfo) {
75
+ qdev_prop_set_drive(carddev, "drive", blk_by_legacy_dinfo(dinfo), &err);
76
+ }
77
+ object_property_set_bool(OBJECT(carddev), true, "spi", &err);
78
+ object_property_set_bool(OBJECT(carddev), true, "realized", &err);
79
+ if (err) {
80
+ error_setg(errp, "failed to init SD card: %s", error_get_pretty(err));
81
return;
82
}
83
}
84
@@ -XXX,XX +XXX,XX @@ static void ssi_sd_reset(DeviceState *dev)
85
s->arglen = 0;
86
s->response_pos = 0;
87
s->stopping = 0;
88
-
89
- /* Since we're still using the legacy SD API the card is not plugged
90
- * into any bus, and we must reset it manually.
91
- */
92
- device_reset(DEVICE(s->sd));
93
}
94
95
static void ssi_sd_class_init(ObjectClass *klass, void *data)
96
--
97
2.16.1
98
99
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
place card registers first, this will ease further code movements.
4
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
7
Message-id: 20180215220540.6556-2-f4bug@amsat.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
hw/sd/sd.c | 16 +++++++++-------
11
1 file changed, 9 insertions(+), 7 deletions(-)
12
13
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/sd.c
16
+++ b/hw/sd/sd.c
17
@@ -XXX,XX +XXX,XX @@ enum SDCardStates {
18
struct SDState {
19
DeviceState parent_obj;
20
21
- uint32_t mode; /* current card mode, one of SDCardModes */
22
- int32_t state; /* current card state, one of SDCardStates */
23
+ /* SD Memory Card Registers */
24
uint32_t ocr;
25
- QEMUTimer *ocr_power_timer;
26
uint8_t scr[8];
27
uint8_t cid[16];
28
uint8_t csd[16];
29
uint16_t rca;
30
uint32_t card_status;
31
uint8_t sd_status[64];
32
+
33
+ /* Configurable properties */
34
+ BlockBackend *blk;
35
+ bool spi;
36
+
37
+ uint32_t mode; /* current card mode, one of SDCardModes */
38
+ int32_t state; /* current card state, one of SDCardStates */
39
uint32_t vhs;
40
bool wp_switch;
41
unsigned long *wp_groups;
42
@@ -XXX,XX +XXX,XX @@ struct SDState {
43
uint8_t pwd[16];
44
uint32_t pwd_len;
45
uint8_t function_group[6];
46
-
47
- bool spi;
48
uint8_t current_cmd;
49
/* True if we will handle the next command as an ACMD. Note that this does
50
* *not* track the APP_CMD status bit!
51
@@ -XXX,XX +XXX,XX @@ struct SDState {
52
uint8_t data[512];
53
qemu_irq readonly_cb;
54
qemu_irq inserted_cb;
55
- BlockBackend *blk;
56
-
57
+ QEMUTimer *ocr_power_timer;
58
bool enable;
59
uint8_t dat_lines;
60
bool cmd_line;
61
--
62
2.16.1
63
64
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
code is now easier to read.
4
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
7
Message-id: 20180215220540.6556-11-f4bug@amsat.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
hw/sd/sd.c | 3 ++-
11
1 file changed, 2 insertions(+), 1 deletion(-)
12
13
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/sd.c
16
+++ b/hw/sd/sd.c
17
@@ -XXX,XX +XXX,XX @@
18
#include "hw/sd/sd.h"
19
#include "qapi/error.h"
20
#include "qemu/bitmap.h"
21
+#include "qemu/cutils.h"
22
#include "hw/qdev-properties.h"
23
#include "qemu/error-report.h"
24
#include "qemu/timer.h"
25
@@ -XXX,XX +XXX,XX @@ static void sd_set_csd(SDState *sd, uint64_t size)
26
uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
27
uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
28
29
- if (size <= 0x40000000) {    /* Standard Capacity SD */
30
+ if (size <= 1 * G_BYTE) { /* Standard Capacity SD */
31
sd->csd[0] = 0x00;    /* CSD structure */
32
sd->csd[1] = 0x26;    /* Data read access-time-1 */
33
sd->csd[2] = 0x00;    /* Data read access-time-2 */
34
--
35
2.16.1
36
37
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
Don't set the high capacity bit by default as it will be set if required
11
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
4
in the sd_set_csd() function.
5
6
[based on a patch from Alistair Francis <alistair.francis@xilinx.com>
7
and Peter Ogden <ogden@xilinx.com> from qemu/xilinx tag xilinx-v2015.4]
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
10
Message-id: 20180215221325.7611-2-f4bug@amsat.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
---
13
hw/sd/sd.c | 5 ++++-
14
hw/xen/xen_pt.h | 2 +-
14
1 file changed, 4 insertions(+), 1 deletion(-)
15
hw/xen/xen_pt_graphics.c | 2 +-
16
hw/xen/xen_pt_load_rom.c | 6 +++---
17
3 files changed, 5 insertions(+), 5 deletions(-)
15
18
16
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
19
diff --git a/hw/xen/xen_pt.h b/hw/xen/xen_pt.h
17
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/sd/sd.c
21
--- a/hw/xen/xen_pt.h
19
+++ b/hw/sd/sd.c
22
+++ b/hw/xen/xen_pt.h
20
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
23
@@ -XXX,XX +XXX,XX @@ static inline bool xen_pt_has_msix_mapping(XenPCIPassthroughState *s, int bar)
21
22
/* card power-up OK */
23
sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_POWER_UP, 1);
24
+
25
+ if (sd->size > 1 * G_BYTE) {
26
+ sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_CAPACITY, 1);
27
+ }
28
}
24
}
29
25
30
static void sd_set_scr(SDState *sd)
26
extern void *pci_assign_dev_load_option_rom(PCIDevice *dev,
31
@@ -XXX,XX +XXX,XX @@ static void sd_set_csd(SDState *sd, uint64_t size)
27
- struct Object *owner, int *size,
32
sd->csd[13] = 0x40;
28
+ int *size,
33
sd->csd[14] = 0x00;
29
unsigned int domain,
34
sd->csd[15] = 0x00;
30
unsigned int bus, unsigned int slot,
35
- sd->ocr |= 1 << 30; /* High Capacity SD Memory Card */
31
unsigned int function);
36
}
32
diff --git a/hw/xen/xen_pt_graphics.c b/hw/xen/xen_pt_graphics.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/xen/xen_pt_graphics.c
35
+++ b/hw/xen/xen_pt_graphics.c
36
@@ -XXX,XX +XXX,XX @@ int xen_pt_unregister_vga_regions(XenHostPCIDevice *dev)
37
static void *get_vgabios(XenPCIPassthroughState *s, int *size,
38
XenHostPCIDevice *dev)
39
{
40
- return pci_assign_dev_load_option_rom(&s->dev, OBJECT(&s->dev), size,
41
+ return pci_assign_dev_load_option_rom(&s->dev, size,
42
dev->domain, dev->bus,
43
dev->dev, dev->func);
37
}
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);
38
75
39
--
76
--
40
2.16.1
77
2.17.1
41
78
42
79
diff view generated by jsdifflib