1
Big pullreq this week, since it's got RTH's PAN/UAO/ATS1E1
1
The following changes since commit b367db48126d4ee14579af6cf5cdbffeb9496627:
2
implementation in it, and also Philippe's raspi board model
3
cleanup patchset, as well as a scattering of smaller stuff.
4
2
5
-- PMM
3
Merge remote-tracking branch 'remotes/aperard/tags/pull-xen-20220127' into staging (2022-01-28 11:05:29 +0000)
6
7
8
The following changes since commit 7ce9ce89930ce260af839fb3e3e5f9101f5c69a0:
9
10
Merge remote-tracking branch 'remotes/kraxel/tags/ui-20200212-pull-request' into staging (2020-02-13 11:06:32 +0000)
11
4
12
are available in the Git repository at:
5
are available in the Git repository at:
13
6
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200213
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220128
15
8
16
for you to fetch changes up to dc7a88d0810ad272bdcd2e0869359af78fdd9114:
9
for you to fetch changes up to 2c023d3675a3ffb54fc30504dcd715bc6f6e234f:
17
10
18
target/arm: Implement ARMv8.1-VMID16 extension (2020-02-13 14:30:51 +0000)
11
target/arm: Use correct entrypoint for SVC taken from Hyp to Hyp (2022-01-28 14:30:36 +0000)
19
12
20
----------------------------------------------------------------
13
----------------------------------------------------------------
21
target-arm queue:
14
target-arm queue:
22
* i.MX: Fix inverted sense of register bits in watchdog timer
15
* Update copyright dates to 2022
23
* i.MX: Add support for WDT on i.MX6
16
* hw/armv7m: Fix broken VMStateDescription
24
* arm/virt: cleanups to ACPI tables
17
* hw/char/exynos4210_uart: Fix crash on trying to load VM state
25
* Implement ARMv8.1-VMID16 extension
18
* rtc: Move RTC function prototypes to their own header
26
* Implement ARMv8.1-PAN
19
* xlnx-versal-virt: Support PMC SLCR
27
* Implement ARMv8.2-UAO
20
* xlnx-versal-virt: Support OSPI flash memory controller
28
* Implement ARMv8.2-ATS1E1
21
* scripts: Explain the difference between linux-headers and standard-headers
29
* ast2400/2500/2600: Wire up EHCI controllers
22
* target/arm: Log CPU index in 'Taking exception' log
30
* hw/char/exynos4210_uart: Fix memleaks in exynos4210_uart_init
23
* arm_gicv3_its: Various bugfixes and cleanups
31
* hw/arm/raspi: Clean up the board code
24
* arm_gicv3_its: Implement the missing MOVI and MOVALL commands
25
* ast2600: Fix address mapping of second SPI controller
26
* target/arm: Use correct entrypoint for SVC taken from Hyp to Hyp
32
27
33
----------------------------------------------------------------
28
----------------------------------------------------------------
34
Chen Qun (1):
29
Andrew Baumann (1):
35
hw/char/exynos4210_uart: Fix memleaks in exynos4210_uart_init
30
MAINTAINERS: Remove myself (for raspi).
36
31
37
Guenter Roeck (2):
32
Cédric Le Goater (1):
38
hw/arm: ast2400/ast2500: Wire up EHCI controllers
33
hw/arm: ast2600: Fix address mapping of second SPI controller
39
hw/arm: ast2600: Wire up EHCI controllers
40
34
41
Heyi Guo (7):
35
Francisco Iglesias (10):
42
bios-tables-test: prepare to change ARM virt ACPI DSDT
36
hw/misc: Add a model of Versal's PMC SLCR
43
arm/virt/acpi: remove meaningless sub device "RP0" from PCI0
37
hw/arm/xlnx-versal: 'Or' the interrupts from the BBRAM and RTC models
44
arm/virt/acpi: remove _ADR from devices identified by _HID
38
hw/arm/xlnx-versal: Connect Versal's PMC SLCR
45
arm/acpi: fix PCI _PRT definition
39
include/hw/dma/xlnx_csu_dma: Add in missing includes in the header
46
arm/acpi: fix duplicated _UID of PCI interrupt link devices
40
hw/dma/xlnx_csu_dma: Support starting a read transfer through a class method
47
arm/acpi: simplify the description of PCI _CRS
41
hw/ssi: Add a model of Xilinx Versal's OSPI flash memory controller
48
virt/acpi: update golden masters for DSDT update
42
hw/arm/xlnx-versal: Connect the OSPI flash memory controller model
43
hw/block/m25p80: Add support for Micron Xccela flash mt35xu01g
44
hw/arm/xlnx-versal-virt: Connect mt35xu01g flashes to the OSPI
45
MAINTAINERS: Add an entry for Xilinx Versal OSPI
49
46
50
Peter Maydell (1):
47
Peter Maydell (20):
51
target/arm: Implement ARMv8.1-VMID16 extension
48
Update copyright dates to 2022
49
hw/armv7m: Fix broken VMStateDescription
50
hw/char/exynos4210_uart: Fix crash on trying to load VM state
51
rtc: Move RTC function prototypes to their own header
52
scripts: Explain the difference between linux-headers and standard-headers
53
target/arm: Log CPU index in 'Taking exception' log
54
hw/intc/arm_gicv3_its: Add tracepoints
55
hw/intc/arm_gicv3: Initialise dma_as in GIC, not ITS
56
hw/intc/arm_gicv3_its: Don't clear GITS_CREADR when GITS_CTLR.ENABLED is set
57
hw/intc/arm_gicv3_its: Don't clear GITS_CWRITER on writes to GITS_CBASER
58
hw/intc/arm_gicv3: Honour GICD_CTLR.EnableGrp1NS for LPIs
59
hw/intc/arm_gicv3_its: Sort ITS command list into numeric order
60
hw/intc/arm_gicv3_redist: Remove unnecessary zero checks
61
hw/intc/arm_gicv3: Set GICR_CTLR.CES if LPIs are supported
62
hw/intc/arm_gicv3_its: Provide read accessor for translation_ops
63
hw/intc/arm_gicv3_its: Make GITS_BASER<n> RAZ/WI for unimplemented registers
64
hw/intc/arm_gicv3_its: Check table bounds against correct limit
65
hw/intc/arm_gicv3_its: Implement MOVALL
66
hw/intc/arm_gicv3_its: Implement MOVI
67
target/arm: Use correct entrypoint for SVC taken from Hyp to Hyp
52
68
53
Philippe Mathieu-Daudé (13):
69
docs/conf.py | 2 +-
54
hw/arm/raspi: Use BCM2708 machine type with pre Device Tree kernels
70
hw/intc/gicv3_internal.h | 43 +-
55
hw/arm/raspi: Correct the board descriptions
71
include/hw/arm/xlnx-versal.h | 30 +-
56
hw/arm/raspi: Extract the version from the board revision
72
include/hw/dma/xlnx_csu_dma.h | 24 +-
57
hw/arm/raspi: Extract the RAM size from the board revision
73
include/hw/intc/arm_gicv3_its_common.h | 1 -
58
hw/arm/raspi: Extract the processor type from the board revision
74
include/hw/misc/xlnx-versal-pmc-iou-slcr.h | 78 ++
59
hw/arm/raspi: Trivial code movement
75
include/hw/ssi/xlnx-versal-ospi.h | 111 ++
60
hw/arm/raspi: Make machines children of abstract RaspiMachineClass
76
include/qemu-common.h | 5 +-
61
hw/arm/raspi: Make board_rev a field of RaspiMachineClass
77
include/sysemu/rtc.h | 58 +
62
hw/arm/raspi: Let class_init() directly call raspi_machine_init()
78
target/arm/internals.h | 2 +-
63
hw/arm/raspi: Set default RAM size to size encoded in board revision
79
hw/arm/armv7m.c | 4 +-
64
hw/arm/raspi: Extract the board model from the board revision
80
hw/arm/aspeed_ast2600.c | 2 +-
65
hw/arm/raspi: Use a unique raspi_machine_class_init() method
81
hw/arm/omap1.c | 2 +-
66
hw/arm/raspi: Extract the cores count from the board revision
82
hw/arm/pxa2xx.c | 2 +-
83
hw/arm/strongarm.c | 2 +-
84
hw/arm/xlnx-versal-virt.c | 25 +-
85
hw/arm/xlnx-versal.c | 190 ++-
86
hw/block/m25p80.c | 2 +
87
hw/char/exynos4210_uart.c | 2 +-
88
hw/dma/xlnx_csu_dma.c | 17 +
89
hw/intc/arm_gicv3.c | 1 +
90
hw/intc/arm_gicv3_common.c | 9 +
91
hw/intc/arm_gicv3_its.c | 258 +++-
92
hw/intc/arm_gicv3_redist.c | 115 +-
93
hw/misc/mac_via.c | 2 +-
94
hw/misc/macio/cuda.c | 2 +-
95
hw/misc/macio/pmu.c | 2 +-
96
hw/misc/xlnx-versal-pmc-iou-slcr.c | 1446 ++++++++++++++++++++++
97
hw/ppc/spapr_rtc.c | 2 +-
98
hw/rtc/allwinner-rtc.c | 2 +-
99
hw/rtc/aspeed_rtc.c | 2 +-
100
hw/rtc/ds1338.c | 2 +-
101
hw/rtc/exynos4210_rtc.c | 2 +-
102
hw/rtc/goldfish_rtc.c | 2 +-
103
hw/rtc/m41t80.c | 2 +-
104
hw/rtc/m48t59.c | 2 +-
105
hw/rtc/mc146818rtc.c | 2 +-
106
hw/rtc/pl031.c | 2 +-
107
hw/rtc/twl92230.c | 2 +-
108
hw/rtc/xlnx-zynqmp-rtc.c | 2 +-
109
hw/s390x/tod-tcg.c | 2 +-
110
hw/scsi/megasas.c | 2 +-
111
hw/ssi/xlnx-versal-ospi.c | 1853 ++++++++++++++++++++++++++++
112
net/dump.c | 2 +-
113
softmmu/rtc.c | 2 +-
114
target/arm/helper.c | 13 +-
115
target/arm/m_helper.c | 2 +-
116
MAINTAINERS | 7 +-
117
hw/intc/trace-events | 8 +
118
hw/misc/meson.build | 5 +-
119
hw/ssi/meson.build | 1 +
120
scripts/update-linux-headers.sh | 16 +
121
52 files changed, 4300 insertions(+), 74 deletions(-)
122
create mode 100644 include/hw/misc/xlnx-versal-pmc-iou-slcr.h
123
create mode 100644 include/hw/ssi/xlnx-versal-ospi.h
124
create mode 100644 include/sysemu/rtc.h
125
create mode 100644 hw/misc/xlnx-versal-pmc-iou-slcr.c
126
create mode 100644 hw/ssi/xlnx-versal-ospi.c
67
127
68
Richard Henderson (20):
69
target/arm: Add arm_mmu_idx_is_stage1_of_2
70
target/arm: Add mmu_idx for EL1 and EL2 w/ PAN enabled
71
target/arm: Add isar_feature tests for PAN + ATS1E1
72
target/arm: Move LOR regdefs to file scope
73
target/arm: Split out aarch32_cpsr_valid_mask
74
target/arm: Mask CPSR_J when Jazelle is not enabled
75
target/arm: Replace CPSR_ERET_MASK with aarch32_cpsr_valid_mask
76
target/arm: Use aarch32_cpsr_valid_mask in helper_exception_return
77
target/arm: Remove CPSR_RESERVED
78
target/arm: Introduce aarch64_pstate_valid_mask
79
target/arm: Update MSR access for PAN
80
target/arm: Update arm_mmu_idx_el for PAN
81
target/arm: Enforce PAN semantics in get_S1prot
82
target/arm: Set PAN bit as required on exception entry
83
target/arm: Implement ATS1E1 system registers
84
target/arm: Enable ARMv8.2-ATS1E1 in -cpu max
85
target/arm: Add ID_AA64MMFR2_EL1
86
target/arm: Update MSR access to UAO
87
target/arm: Implement UAO semantics
88
target/arm: Enable ARMv8.2-UAO in -cpu max
89
90
Roman Kapl (2):
91
i.MX: Fix inverted register bits in wdt code.
92
i.MX: Add support for WDT on i.MX6
93
94
include/hw/arm/aspeed_soc.h | 6 +
95
include/hw/arm/fsl-imx6.h | 3 +
96
target/arm/cpu-param.h | 2 +-
97
target/arm/cpu.h | 95 ++++++++---
98
target/arm/internals.h | 85 ++++++++++
99
hw/arm/aspeed_ast2600.c | 23 +++
100
hw/arm/aspeed_soc.c | 25 +++
101
hw/arm/fsl-imx6.c | 21 +++
102
hw/arm/raspi.c | 190 ++++++++++++++++------
103
hw/arm/virt-acpi-build.c | 25 +--
104
hw/char/exynos4210_uart.c | 5 +-
105
hw/misc/imx2_wdt.c | 2 +-
106
target/arm/cpu.c | 4 +
107
target/arm/cpu64.c | 10 ++
108
target/arm/helper-a64.c | 6 +-
109
target/arm/helper.c | 327 +++++++++++++++++++++++++++++---------
110
target/arm/kvm64.c | 2 +
111
target/arm/op_helper.c | 14 +-
112
target/arm/translate-a64.c | 31 ++++
113
target/arm/translate.c | 42 +++--
114
tests/data/acpi/virt/DSDT | Bin 18462 -> 5307 bytes
115
tests/data/acpi/virt/DSDT.memhp | Bin 19799 -> 6644 bytes
116
tests/data/acpi/virt/DSDT.numamem | Bin 18462 -> 5307 bytes
117
23 files changed, 731 insertions(+), 187 deletions(-)
118
diff view generated by jsdifflib
Deleted patch
1
From: Roman Kapl <rka@sysgo.com>
2
1
3
Documentation says for WDA '0: Assert WDOG output.' and for SRS
4
'0: Assert system reset signal.'.
5
6
Signed-off-by: Roman Kapl <rka@sysgo.com>
7
Message-id: 20200207095409.11227-1-rka@sysgo.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/misc/imx2_wdt.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/hw/misc/imx2_wdt.c b/hw/misc/imx2_wdt.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/misc/imx2_wdt.c
17
+++ b/hw/misc/imx2_wdt.c
18
@@ -XXX,XX +XXX,XX @@ static void imx2_wdt_write(void *opaque, hwaddr addr,
19
uint64_t value, unsigned int size)
20
{
21
if (addr == IMX2_WDT_WCR &&
22
- (value & (IMX2_WDT_WCR_WDA | IMX2_WDT_WCR_SRS))) {
23
+ (~value & (IMX2_WDT_WCR_WDA | IMX2_WDT_WCR_SRS))) {
24
watchdog_perform_action();
25
}
26
}
27
--
28
2.20.1
29
30
diff view generated by jsdifflib
Deleted patch
1
From: Roman Kapl <rka@sysgo.com>
2
1
3
Uses the i.MX2 rudimentary watchdog driver.
4
5
Signed-off-by: Roman Kapl <rka@sysgo.com>
6
Message-id: 20200207095529.11309-1-rka@sysgo.com
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
[PMM: removed accidental duplicate #include line]
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/arm/fsl-imx6.h | 3 +++
12
hw/arm/fsl-imx6.c | 21 +++++++++++++++++++++
13
2 files changed, 24 insertions(+)
14
15
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/fsl-imx6.h
18
+++ b/include/hw/arm/fsl-imx6.h
19
@@ -XXX,XX +XXX,XX @@
20
#include "hw/cpu/a9mpcore.h"
21
#include "hw/misc/imx6_ccm.h"
22
#include "hw/misc/imx6_src.h"
23
+#include "hw/misc/imx2_wdt.h"
24
#include "hw/char/imx_serial.h"
25
#include "hw/timer/imx_gpt.h"
26
#include "hw/timer/imx_epit.h"
27
@@ -XXX,XX +XXX,XX @@
28
#define FSL_IMX6_NUM_GPIOS 7
29
#define FSL_IMX6_NUM_ESDHCS 4
30
#define FSL_IMX6_NUM_ECSPIS 5
31
+#define FSL_IMX6_NUM_WDTS 2
32
33
typedef struct FslIMX6State {
34
/*< private >*/
35
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
36
IMXGPIOState gpio[FSL_IMX6_NUM_GPIOS];
37
SDHCIState esdhc[FSL_IMX6_NUM_ESDHCS];
38
IMXSPIState spi[FSL_IMX6_NUM_ECSPIS];
39
+ IMX2WdtState wdt[FSL_IMX6_NUM_WDTS];
40
IMXFECState eth;
41
MemoryRegion rom;
42
MemoryRegion caam;
43
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/arm/fsl-imx6.c
46
+++ b/hw/arm/fsl-imx6.c
47
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_init(Object *obj)
48
sysbus_init_child_obj(obj, name, &s->spi[i], sizeof(s->spi[i]),
49
TYPE_IMX_SPI);
50
}
51
+ for (i = 0; i < FSL_IMX6_NUM_WDTS; i++) {
52
+ snprintf(name, NAME_SIZE, "wdt%d", i);
53
+ sysbus_init_child_obj(obj, name, &s->wdt[i], sizeof(s->wdt[i]),
54
+ TYPE_IMX2_WDT);
55
+ }
56
+
57
58
sysbus_init_child_obj(obj, "eth", &s->eth, sizeof(s->eth), TYPE_IMX_ENET);
59
}
60
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
61
qdev_get_gpio_in(DEVICE(&s->a9mpcore),
62
FSL_IMX6_ENET_MAC_1588_IRQ));
63
64
+ /*
65
+ * Watchdog
66
+ */
67
+ for (i = 0; i < FSL_IMX6_NUM_WDTS; i++) {
68
+ static const hwaddr FSL_IMX6_WDOGn_ADDR[FSL_IMX6_NUM_WDTS] = {
69
+ FSL_IMX6_WDOG1_ADDR,
70
+ FSL_IMX6_WDOG2_ADDR,
71
+ };
72
+
73
+ object_property_set_bool(OBJECT(&s->wdt[i]), true, "realized",
74
+ &error_abort);
75
+
76
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, FSL_IMX6_WDOGn_ADDR[i]);
77
+ }
78
+
79
/* ROM memory */
80
memory_region_init_rom(&s->rom, NULL, "imx6.rom",
81
FSL_IMX6_ROM_SIZE, &err);
82
--
83
2.20.1
84
85
diff view generated by jsdifflib
Deleted patch
1
From: Heyi Guo <guoheyi@huawei.com>
2
1
3
We are going to change ARM virt ACPI DSDT table, which will cause make
4
check to fail, so temporarily add related golden masters to ignore
5
list.
6
7
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
8
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
9
Message-id: 20200204014325.16279-2-guoheyi@huawei.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
13
1 file changed, 3 insertions(+)
14
15
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/qtest/bios-tables-test-allowed-diff.h
18
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
19
@@ -1 +1,4 @@
20
/* List of comma-separated changed AML files to ignore */
21
+"tests/data/acpi/virt/DSDT",
22
+"tests/data/acpi/virt/DSDT.memhp",
23
+"tests/data/acpi/virt/DSDT.numamem",
24
--
25
2.20.1
26
27
diff view generated by jsdifflib
Deleted patch
1
From: Heyi Guo <guoheyi@huawei.com>
2
1
3
The sub device "RP0" under PCI0 in ACPI/DSDT does not contain any
4
method or property other than "_ADR", so it is safe to remove it.
5
6
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
7
Acked-by: "Michael S. Tsirkin" <mst@redhat.com>
8
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
9
Message-id: 20200204014325.16279-3-guoheyi@huawei.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/virt-acpi-build.c | 4 ----
13
1 file changed, 4 deletions(-)
14
15
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/virt-acpi-build.c
18
+++ b/hw/arm/virt-acpi-build.c
19
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
20
aml_append(method, aml_return(buf));
21
aml_append(dev, method);
22
23
- Aml *dev_rp0 = aml_device("%s", "RP0");
24
- aml_append(dev_rp0, aml_name_decl("_ADR", aml_int(0)));
25
- aml_append(dev, dev_rp0);
26
-
27
Aml *dev_res0 = aml_device("%s", "RES0");
28
aml_append(dev_res0, aml_name_decl("_HID", aml_string("PNP0C02")));
29
crs = aml_resource_template();
30
--
31
2.20.1
32
33
diff view generated by jsdifflib
Deleted patch
1
From: Heyi Guo <guoheyi@huawei.com>
2
1
3
According to ACPI spec, _ADR should be used for device on a bus that
4
has a standard enumeration algorithm, but not for device which is on
5
system bus and must be enumerated by OSPM. And it is not recommended
6
to contain both _HID and _ADR in a single device.
7
8
See ACPI 6.3, section 6.1, top of page 343:
9
10
A device object must contain either an _HID object or an _ADR object,
11
but should not contain both.
12
13
(https://uefi.org/sites/default/files/resources/ACPI_6_3_May16.pdf)
14
15
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
16
Acked-by: Igor Mammedov <imammedo@redhat.com>
17
Acked-by: Michael S. Tsirkin <mst@redhat.com>
18
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
19
Message-id: 20200204014325.16279-4-guoheyi@huawei.com
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
22
hw/arm/virt-acpi-build.c | 8 --------
23
1 file changed, 8 deletions(-)
24
25
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/arm/virt-acpi-build.c
28
+++ b/hw/arm/virt-acpi-build.c
29
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_uart(Aml *scope, const MemMapEntry *uart_memmap,
30
AML_EXCLUSIVE, &uart_irq, 1));
31
aml_append(dev, aml_name_decl("_CRS", crs));
32
33
- /* The _ADR entry is used to link this device to the UART described
34
- * in the SPCR table, i.e. SPCR.base_address.address == _ADR.
35
- */
36
- aml_append(dev, aml_name_decl("_ADR", aml_int(uart_memmap->base)));
37
-
38
aml_append(scope, dev);
39
}
40
41
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
42
aml_append(dev, aml_name_decl("_CID", aml_string("PNP0A03")));
43
aml_append(dev, aml_name_decl("_SEG", aml_int(0)));
44
aml_append(dev, aml_name_decl("_BBN", aml_int(0)));
45
- aml_append(dev, aml_name_decl("_ADR", aml_int(0)));
46
aml_append(dev, aml_name_decl("_UID", aml_string("PCI0")));
47
aml_append(dev, aml_name_decl("_STR", aml_unicode("PCIe 0 Device")));
48
aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
49
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_gpio(Aml *scope, const MemMapEntry *gpio_memmap,
50
{
51
Aml *dev = aml_device("GPO0");
52
aml_append(dev, aml_name_decl("_HID", aml_string("ARMH0061")));
53
- aml_append(dev, aml_name_decl("_ADR", aml_int(0)));
54
aml_append(dev, aml_name_decl("_UID", aml_int(0)));
55
56
Aml *crs = aml_resource_template();
57
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_power_button(Aml *scope)
58
{
59
Aml *dev = aml_device(ACPI_POWER_BUTTON_DEVICE);
60
aml_append(dev, aml_name_decl("_HID", aml_string("PNP0C0C")));
61
- aml_append(dev, aml_name_decl("_ADR", aml_int(0)));
62
aml_append(dev, aml_name_decl("_UID", aml_int(0)));
63
aml_append(scope, dev);
64
}
65
--
66
2.20.1
67
68
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
It's a new year; update the copyright strings for our
2
help/version/about information and for our documentation.
2
3
3
The count of ARM cores is encoded in the board revision. Add a
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
helper to extract the number of cores, and use it. This will be
5
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
5
helpful when we add the Raspi0/1 that have a single core.
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20220120124713.288303-1-peter.maydell@linaro.org
8
---
9
docs/conf.py | 2 +-
10
include/qemu-common.h | 2 +-
11
2 files changed, 2 insertions(+), 2 deletions(-)
6
12
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
diff --git a/docs/conf.py b/docs/conf.py
8
Message-id: 20200208165645.15657-14-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
[PMM: tweaked commit message as suggested by Igor]
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/arm/raspi.c | 19 ++++++++++++++++---
14
1 file changed, 16 insertions(+), 3 deletions(-)
15
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
15
--- a/docs/conf.py
19
+++ b/hw/arm/raspi.c
16
+++ b/docs/conf.py
20
@@ -XXX,XX +XXX,XX @@ static const char *board_soc_type(uint32_t board_rev)
17
@@ -XXX,XX +XXX,XX @@
21
return soc_types[proc_id];
18
22
}
19
# General information about the project.
23
20
project = u'QEMU'
24
+static int cores_count(uint32_t board_rev)
21
-copyright = u'2021, The QEMU Project Developers'
25
+{
22
+copyright = u'2022, The QEMU Project Developers'
26
+ static const int soc_cores_count[] = {
23
author = u'The QEMU Project Developers'
27
+ 0, BCM283X_NCPUS, BCM283X_NCPUS,
24
28
+ };
25
# The version info for the project you're documenting, acts as replacement for
29
+ int proc_id = board_processor_id(board_rev);
26
diff --git a/include/qemu-common.h b/include/qemu-common.h
30
+
27
index XXXXXXX..XXXXXXX 100644
31
+ if (proc_id >= ARRAY_SIZE(soc_cores_count) || !soc_cores_count[proc_id]) {
28
--- a/include/qemu-common.h
32
+ error_report("Unsupported processor id '%d' (board revision: 0x%x)",
29
+++ b/include/qemu-common.h
33
+ proc_id, board_rev);
30
@@ -XXX,XX +XXX,XX @@
34
+ exit(1);
31
#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
35
+ }
32
36
+ return soc_cores_count[proc_id];
33
/* Copyright string for -version arguments, About dialogs, etc */
37
+}
34
-#define QEMU_COPYRIGHT "Copyright (c) 2003-2021 " \
38
+
35
+#define QEMU_COPYRIGHT "Copyright (c) 2003-2022 " \
39
static const char *board_type(uint32_t board_rev)
36
"Fabrice Bellard and the QEMU Project developers"
40
{
37
41
static const char *types[] = {
38
/* Bug reporting information for --help arguments, About dialogs, etc */
42
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_class_init(ObjectClass *oc, void *data)
43
mc->no_parallel = 1;
44
mc->no_floppy = 1;
45
mc->no_cdrom = 1;
46
- mc->max_cpus = BCM283X_NCPUS;
47
- mc->min_cpus = BCM283X_NCPUS;
48
- mc->default_cpus = BCM283X_NCPUS;
49
+ mc->default_cpus = mc->min_cpus = mc->max_cpus = cores_count(board_rev);
50
mc->default_ram_size = board_ram_size(board_rev);
51
if (board_version(board_rev) == 2) {
52
mc->ignore_memory_transaction_failures = true;
53
--
39
--
54
2.20.1
40
2.25.1
55
41
56
42
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
In commit d5093d961585f02 we added a VMStateDescription to
2
the TYPE_ARMV7M object, to handle migration of its Clocks.
3
However a cut-and-paste error meant we used the wrong struct
4
name in the VMSTATE_CLOCK() macro arguments. The result was
5
that attempting a 'savevm' might result in an assertion
6
failure.
2
7
3
We added a helper to extract the RAM size from the board
8
Cc: qemu-stable@nongnu.org
4
revision, and made board_rev a field of RaspiMachineClass.
9
Buglink: https://gitlab.com/qemu-project/qemu/-/issues/803
5
The class_init() can now use the helper to extract from the
10
Fixes: d5093d961585f02
6
board revision the board-specific amount of RAM.
7
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20200208165645.15657-11-f4bug@amsat.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Ani Sinha <ani@anisinha.ca>
13
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20220120151609.433555-1-peter.maydell@linaro.org
12
---
16
---
13
hw/arm/raspi.c | 4 ++--
17
hw/arm/armv7m.c | 4 ++--
14
1 file changed, 2 insertions(+), 2 deletions(-)
18
1 file changed, 2 insertions(+), 2 deletions(-)
15
19
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
20
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
17
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
22
--- a/hw/arm/armv7m.c
19
+++ b/hw/arm/raspi.c
23
+++ b/hw/arm/armv7m.c
20
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
24
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_armv7m = {
21
mc->max_cpus = BCM283X_NCPUS;
25
.version_id = 1,
22
mc->min_cpus = BCM283X_NCPUS;
26
.minimum_version_id = 1,
23
mc->default_cpus = BCM283X_NCPUS;
27
.fields = (VMStateField[]) {
24
- mc->default_ram_size = 1 * GiB;
28
- VMSTATE_CLOCK(refclk, SysTickState),
25
+ mc->default_ram_size = board_ram_size(board_rev);
29
- VMSTATE_CLOCK(cpuclk, SysTickState),
26
mc->ignore_memory_transaction_failures = true;
30
+ VMSTATE_CLOCK(refclk, ARMv7MState),
31
+ VMSTATE_CLOCK(cpuclk, ARMv7MState),
32
VMSTATE_END_OF_LIST()
33
}
27
};
34
};
28
29
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_class_init(ObjectClass *oc, void *data)
30
mc->max_cpus = BCM283X_NCPUS;
31
mc->min_cpus = BCM283X_NCPUS;
32
mc->default_cpus = BCM283X_NCPUS;
33
- mc->default_ram_size = 1 * GiB;
34
+ mc->default_ram_size = board_ram_size(board_rev);
35
}
36
#endif
37
38
--
35
--
39
2.20.1
36
2.25.1
40
37
41
38
diff view generated by jsdifflib
1
From: Chen Qun <kuhn.chenqun@huawei.com>
1
The exynos4210_uart_post_load() function assumes that it is passed
2
the Exynos4210UartState, but it has been attached to the
3
VMStateDescription for the Exynos4210UartFIFO type. The result is a
4
SIGSEGV when attempting to load VM state for any machine type
5
including this device.
2
6
3
It's easy to reproduce as follow:
7
Fix the bug by attaching the post-load function to the VMSD for the
4
virsh qemu-monitor-command vm1 --pretty '{"execute": "device-list-properties",
8
Exynos4210UartState. This is the logical place for it, because the
5
"arguments":{"typename":"exynos4210.uart"}}'
9
actions it does relate to the entire UART state, not just the FIFO.
6
10
7
ASAN shows memory leak stack:
11
Thanks to the bug reporter @TrungNguyen1909 for the clear bug
8
#1 0xfffd896d71cb in g_malloc0 (/lib64/libglib-2.0.so.0+0x571cb)
12
description and the suggested fix.
9
#2 0xaaad270beee3 in timer_new_full /qemu/include/qemu/timer.h:530
10
#3 0xaaad270beee3 in timer_new /qemu/include/qemu/timer.h:551
11
#4 0xaaad270beee3 in timer_new_ns /qemu/include/qemu/timer.h:569
12
#5 0xaaad270beee3 in exynos4210_uart_init /qemu/hw/char/exynos4210_uart.c:677
13
#6 0xaaad275c8f4f in object_initialize_with_type /qemu/qom/object.c:516
14
#7 0xaaad275c91bb in object_new_with_type /qemu/qom/object.c:684
15
#8 0xaaad2755df2f in qmp_device_list_properties /qemu/qom/qom-qmp-cmds.c:152
16
13
17
Reported-by: Euler Robot <euler.robot@huawei.com>
14
Fixes: c9d3396d80fe7ece9b
18
Signed-off-by: Chen Qun <kuhn.chenqun@huawei.com>
15
("hw/char/exynos4210_uart: Implement post_load function")
19
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
16
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/638
20
Message-id: 20200213025603.149432-1-kuhn.chenqun@huawei.com
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
19
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
Message-id: 20220120151648.433736-1-peter.maydell@linaro.org
22
---
21
---
23
hw/char/exynos4210_uart.c | 5 +++--
22
hw/char/exynos4210_uart.c | 2 +-
24
1 file changed, 3 insertions(+), 2 deletions(-)
23
1 file changed, 1 insertion(+), 1 deletion(-)
25
24
26
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
25
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
27
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/char/exynos4210_uart.c
27
--- a/hw/char/exynos4210_uart.c
29
+++ b/hw/char/exynos4210_uart.c
28
+++ b/hw/char/exynos4210_uart.c
30
@@ -XXX,XX +XXX,XX @@ static void exynos4210_uart_init(Object *obj)
29
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_exynos4210_uart_fifo = {
31
SysBusDevice *dev = SYS_BUS_DEVICE(obj);
30
.name = "exynos4210.uart.fifo",
32
Exynos4210UartState *s = EXYNOS4210_UART(dev);
31
.version_id = 1,
33
32
.minimum_version_id = 1,
34
- s->fifo_timeout_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
33
- .post_load = exynos4210_uart_post_load,
35
- exynos4210_uart_timeout_int, s);
34
.fields = (VMStateField[]) {
36
s->wordtime = NANOSECONDS_PER_SECOND * 10 / 9600;
35
VMSTATE_UINT32(sp, Exynos4210UartFIFO),
37
36
VMSTATE_UINT32(rp, Exynos4210UartFIFO),
38
/* memory mapping */
37
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_exynos4210_uart = {
39
@@ -XXX,XX +XXX,XX @@ static void exynos4210_uart_realize(DeviceState *dev, Error **errp)
38
.name = "exynos4210.uart",
40
{
39
.version_id = 1,
41
Exynos4210UartState *s = EXYNOS4210_UART(dev);
40
.minimum_version_id = 1,
42
41
+ .post_load = exynos4210_uart_post_load,
43
+ s->fifo_timeout_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
42
.fields = (VMStateField[]) {
44
+ exynos4210_uart_timeout_int, s);
43
VMSTATE_STRUCT(rx, Exynos4210UartState, 1,
45
+
44
vmstate_exynos4210_uart_fifo, Exynos4210UartFIFO),
46
qemu_chr_fe_set_handlers(&s->chr, exynos4210_uart_can_receive,
47
exynos4210_uart_receive, exynos4210_uart_event,
48
NULL, s, NULL, true);
49
--
45
--
50
2.20.1
46
2.25.1
51
47
52
48
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
softmmu/rtc.c defines two public functions: qemu_get_timedate() and
2
qemu_timedate_diff(). Currently we keep the prototypes for these in
3
qemu-common.h, but most files don't need them. Move them to their
4
own header, a new include/sysemu/rtc.h.
2
5
3
Use a common predicate for querying stage1-ness.
6
Since the C files using these two functions did not need to include
7
qemu-common.h for any other reason, we can remove those include lines
8
when we add the include of the new rtc.h.
4
9
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
The license for the .h file follows that of the softmmu/rtc.c
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
where both the functions are defined.
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
8
Message-id: 20200208125816.14954-2-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
---
15
---
11
target/arm/internals.h | 18 ++++++++++++++++++
16
include/qemu-common.h | 3 ---
12
target/arm/helper.c | 8 +++-----
17
include/sysemu/rtc.h | 58 ++++++++++++++++++++++++++++++++++++++++
13
2 files changed, 21 insertions(+), 5 deletions(-)
18
hw/arm/omap1.c | 2 +-
19
hw/arm/pxa2xx.c | 2 +-
20
hw/arm/strongarm.c | 2 +-
21
hw/misc/mac_via.c | 2 +-
22
hw/misc/macio/cuda.c | 2 +-
23
hw/misc/macio/pmu.c | 2 +-
24
hw/ppc/spapr_rtc.c | 2 +-
25
hw/rtc/allwinner-rtc.c | 2 +-
26
hw/rtc/aspeed_rtc.c | 2 +-
27
hw/rtc/ds1338.c | 2 +-
28
hw/rtc/exynos4210_rtc.c | 2 +-
29
hw/rtc/goldfish_rtc.c | 2 +-
30
hw/rtc/m41t80.c | 2 +-
31
hw/rtc/m48t59.c | 2 +-
32
hw/rtc/mc146818rtc.c | 2 +-
33
hw/rtc/pl031.c | 2 +-
34
hw/rtc/twl92230.c | 2 +-
35
hw/rtc/xlnx-zynqmp-rtc.c | 2 +-
36
hw/s390x/tod-tcg.c | 2 +-
37
hw/scsi/megasas.c | 2 +-
38
net/dump.c | 2 +-
39
softmmu/rtc.c | 2 +-
40
24 files changed, 80 insertions(+), 25 deletions(-)
41
create mode 100644 include/sysemu/rtc.h
14
42
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
43
diff --git a/include/qemu-common.h b/include/qemu-common.h
16
index XXXXXXX..XXXXXXX 100644
44
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/internals.h
45
--- a/include/qemu-common.h
18
+++ b/target/arm/internals.h
46
+++ b/include/qemu-common.h
19
@@ -XXX,XX +XXX,XX @@ static inline ARMMMUIdx arm_stage1_mmu_idx(CPUARMState *env)
47
@@ -XXX,XX +XXX,XX @@
20
ARMMMUIdx arm_stage1_mmu_idx(CPUARMState *env);
48
int qemu_main(int argc, char **argv, char **envp);
21
#endif
49
#endif
22
50
51
-void qemu_get_timedate(struct tm *tm, int offset);
52
-int qemu_timedate_diff(struct tm *tm);
53
-
54
void *qemu_oom_check(void *ptr);
55
56
ssize_t qemu_write_full(int fd, const void *buf, size_t count)
57
diff --git a/include/sysemu/rtc.h b/include/sysemu/rtc.h
58
new file mode 100644
59
index XXXXXXX..XXXXXXX
60
--- /dev/null
61
+++ b/include/sysemu/rtc.h
62
@@ -XXX,XX +XXX,XX @@
63
+/*
64
+ * RTC configuration and clock read
65
+ *
66
+ * Copyright (c) 2003-2021 QEMU contributors
67
+ *
68
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
69
+ * of this software and associated documentation files (the "Software"), to deal
70
+ * in the Software without restriction, including without limitation the rights
71
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
72
+ * copies of the Software, and to permit persons to whom the Software is
73
+ * furnished to do so, subject to the following conditions:
74
+ *
75
+ * The above copyright notice and this permission notice shall be included in
76
+ * all copies or substantial portions of the Software.
77
+ *
78
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
79
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
80
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
81
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
82
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
83
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
84
+ * THE SOFTWARE.
85
+ */
86
+
87
+#ifndef SYSEMU_RTC_H
88
+#define SYSEMU_RTC_H
89
+
23
+/**
90
+/**
24
+ * arm_mmu_idx_is_stage1_of_2:
91
+ * qemu_get_timedate: Get the current RTC time
25
+ * @mmu_idx: The ARMMMUIdx to test
92
+ * @tm: struct tm to fill in with RTC time
26
+ *
93
+ * @offset: offset in seconds to adjust the RTC time by before
27
+ * Return true if @mmu_idx is a NOTLB mmu_idx that is the
94
+ * converting to struct tm format.
28
+ * first stage of a two stage regime.
95
+ *
96
+ * This function fills in @tm with the current RTC time, as adjusted
97
+ * by @offset (for example, if @offset is 3600 then the returned time/date
98
+ * will be one hour further ahead than the current RTC time).
99
+ *
100
+ * The usual use is by RTC device models, which should call this function
101
+ * to find the time/date value that they should return to the guest
102
+ * when it reads the RTC registers.
103
+ *
104
+ * The behaviour of the clock whose value this function returns will
105
+ * depend on the -rtc command line option passed by the user.
29
+ */
106
+ */
30
+static inline bool arm_mmu_idx_is_stage1_of_2(ARMMMUIdx mmu_idx)
107
+void qemu_get_timedate(struct tm *tm, int offset);
31
+{
32
+ switch (mmu_idx) {
33
+ case ARMMMUIdx_Stage1_E0:
34
+ case ARMMMUIdx_Stage1_E1:
35
+ return true;
36
+ default:
37
+ return false;
38
+ }
39
+}
40
+
108
+
41
/*
109
+/**
42
* Parameters of a given virtual address, as extracted from the
110
+ * qemu_timedate_diff: Return difference between a struct tm and the RTC
43
* translation control register (TCR) for a given regime.
111
+ * @tm: struct tm containing the date/time to compare against
44
diff --git a/target/arm/helper.c b/target/arm/helper.c
112
+ *
45
index XXXXXXX..XXXXXXX 100644
113
+ * Returns the difference in seconds between the RTC clock time
46
--- a/target/arm/helper.c
114
+ * and the date/time specified in @tm. For example, if @tm specifies
47
+++ b/target/arm/helper.c
115
+ * a timestamp one hour further ahead than the current RTC time
48
@@ -XXX,XX +XXX,XX @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
116
+ * then this function will return 3600.
49
bool take_exc = false;
117
+ */
50
118
+int qemu_timedate_diff(struct tm *tm);
51
if (fi.s1ptw && current_el == 1 && !arm_is_secure(env)
119
+
52
- && (mmu_idx == ARMMMUIdx_Stage1_E1 ||
120
+#endif
53
- mmu_idx == ARMMMUIdx_Stage1_E0)) {
121
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
54
+ && arm_mmu_idx_is_stage1_of_2(mmu_idx)) {
122
index XXXXXXX..XXXXXXX 100644
55
/*
123
--- a/hw/arm/omap1.c
56
* Synchronous stage 2 fault on an access made as part of the
124
+++ b/hw/arm/omap1.c
57
* translation table walk for AT S1E0* or AT S1E1* insn
125
@@ -XXX,XX +XXX,XX @@
58
@@ -XXX,XX +XXX,XX @@ static inline bool regime_translation_disabled(CPUARMState *env,
126
#include "qemu/error-report.h"
59
}
127
#include "qemu/main-loop.h"
60
}
128
#include "qapi/error.h"
61
129
-#include "qemu-common.h"
62
- if ((env->cp15.hcr_el2 & HCR_DC) &&
130
#include "cpu.h"
63
- (mmu_idx == ARMMMUIdx_Stage1_E0 || mmu_idx == ARMMMUIdx_Stage1_E1)) {
131
#include "exec/address-spaces.h"
64
+ if ((env->cp15.hcr_el2 & HCR_DC) && arm_mmu_idx_is_stage1_of_2(mmu_idx)) {
132
#include "hw/hw.h"
65
/* HCR.DC means SCTLR_EL1.M behaves as 0 */
133
@@ -XXX,XX +XXX,XX @@
66
return true;
134
#include "sysemu/qtest.h"
67
}
135
#include "sysemu/reset.h"
68
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
136
#include "sysemu/runstate.h"
69
hwaddr addr, MemTxAttrs txattrs,
137
+#include "sysemu/rtc.h"
70
ARMMMUFaultInfo *fi)
138
#include "qemu/range.h"
71
{
139
#include "hw/sysbus.h"
72
- if ((mmu_idx == ARMMMUIdx_Stage1_E0 || mmu_idx == ARMMMUIdx_Stage1_E1) &&
140
#include "qemu/cutils.h"
73
+ if (arm_mmu_idx_is_stage1_of_2(mmu_idx) &&
141
diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
74
!regime_translation_disabled(env, ARMMMUIdx_Stage2)) {
142
index XXXXXXX..XXXXXXX 100644
75
target_ulong s2size;
143
--- a/hw/arm/pxa2xx.c
76
hwaddr s2pa;
144
+++ b/hw/arm/pxa2xx.c
145
@@ -XXX,XX +XXX,XX @@
146
*/
147
148
#include "qemu/osdep.h"
149
-#include "qemu-common.h"
150
#include "qemu/error-report.h"
151
#include "qemu/module.h"
152
#include "qapi/error.h"
153
@@ -XXX,XX +XXX,XX @@
154
#include "chardev/char-fe.h"
155
#include "sysemu/blockdev.h"
156
#include "sysemu/qtest.h"
157
+#include "sysemu/rtc.h"
158
#include "qemu/cutils.h"
159
#include "qemu/log.h"
160
#include "qom/object.h"
161
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
162
index XXXXXXX..XXXXXXX 100644
163
--- a/hw/arm/strongarm.c
164
+++ b/hw/arm/strongarm.c
165
@@ -XXX,XX +XXX,XX @@
166
*/
167
168
#include "qemu/osdep.h"
169
-#include "qemu-common.h"
170
#include "cpu.h"
171
#include "hw/irq.h"
172
#include "hw/qdev-properties.h"
173
@@ -XXX,XX +XXX,XX @@
174
#include "chardev/char-fe.h"
175
#include "chardev/char-serial.h"
176
#include "sysemu/sysemu.h"
177
+#include "sysemu/rtc.h"
178
#include "hw/ssi/ssi.h"
179
#include "qapi/error.h"
180
#include "qemu/cutils.h"
181
diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
182
index XXXXXXX..XXXXXXX 100644
183
--- a/hw/misc/mac_via.c
184
+++ b/hw/misc/mac_via.c
185
@@ -XXX,XX +XXX,XX @@
186
*/
187
188
#include "qemu/osdep.h"
189
-#include "qemu-common.h"
190
#include "migration/vmstate.h"
191
#include "hw/sysbus.h"
192
#include "hw/irq.h"
193
@@ -XXX,XX +XXX,XX @@
194
#include "hw/qdev-properties.h"
195
#include "hw/qdev-properties-system.h"
196
#include "sysemu/block-backend.h"
197
+#include "sysemu/rtc.h"
198
#include "trace.h"
199
#include "qemu/log.h"
200
201
diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
202
index XXXXXXX..XXXXXXX 100644
203
--- a/hw/misc/macio/cuda.c
204
+++ b/hw/misc/macio/cuda.c
205
@@ -XXX,XX +XXX,XX @@
206
*/
207
208
#include "qemu/osdep.h"
209
-#include "qemu-common.h"
210
#include "hw/ppc/mac.h"
211
#include "hw/qdev-properties.h"
212
#include "migration/vmstate.h"
213
@@ -XXX,XX +XXX,XX @@
214
#include "qapi/error.h"
215
#include "qemu/timer.h"
216
#include "sysemu/runstate.h"
217
+#include "sysemu/rtc.h"
218
#include "qapi/error.h"
219
#include "qemu/cutils.h"
220
#include "qemu/log.h"
221
diff --git a/hw/misc/macio/pmu.c b/hw/misc/macio/pmu.c
222
index XXXXXXX..XXXXXXX 100644
223
--- a/hw/misc/macio/pmu.c
224
+++ b/hw/misc/macio/pmu.c
225
@@ -XXX,XX +XXX,XX @@
226
*/
227
228
#include "qemu/osdep.h"
229
-#include "qemu-common.h"
230
#include "hw/ppc/mac.h"
231
#include "hw/qdev-properties.h"
232
#include "migration/vmstate.h"
233
@@ -XXX,XX +XXX,XX @@
234
#include "qapi/error.h"
235
#include "qemu/timer.h"
236
#include "sysemu/runstate.h"
237
+#include "sysemu/rtc.h"
238
#include "qapi/error.h"
239
#include "qemu/cutils.h"
240
#include "qemu/log.h"
241
diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
242
index XXXXXXX..XXXXXXX 100644
243
--- a/hw/ppc/spapr_rtc.c
244
+++ b/hw/ppc/spapr_rtc.c
245
@@ -XXX,XX +XXX,XX @@
246
*/
247
248
#include "qemu/osdep.h"
249
-#include "qemu-common.h"
250
#include "qemu/timer.h"
251
#include "sysemu/sysemu.h"
252
+#include "sysemu/rtc.h"
253
#include "hw/ppc/spapr.h"
254
#include "migration/vmstate.h"
255
#include "qapi/error.h"
256
diff --git a/hw/rtc/allwinner-rtc.c b/hw/rtc/allwinner-rtc.c
257
index XXXXXXX..XXXXXXX 100644
258
--- a/hw/rtc/allwinner-rtc.c
259
+++ b/hw/rtc/allwinner-rtc.c
260
@@ -XXX,XX +XXX,XX @@
261
#include "migration/vmstate.h"
262
#include "qemu/log.h"
263
#include "qemu/module.h"
264
-#include "qemu-common.h"
265
#include "hw/qdev-properties.h"
266
#include "hw/rtc/allwinner-rtc.h"
267
+#include "sysemu/rtc.h"
268
#include "trace.h"
269
270
/* RTC registers */
271
diff --git a/hw/rtc/aspeed_rtc.c b/hw/rtc/aspeed_rtc.c
272
index XXXXXXX..XXXXXXX 100644
273
--- a/hw/rtc/aspeed_rtc.c
274
+++ b/hw/rtc/aspeed_rtc.c
275
@@ -XXX,XX +XXX,XX @@
276
*/
277
278
#include "qemu/osdep.h"
279
-#include "qemu-common.h"
280
#include "hw/rtc/aspeed_rtc.h"
281
#include "migration/vmstate.h"
282
#include "qemu/log.h"
283
#include "qemu/timer.h"
284
+#include "sysemu/rtc.h"
285
286
#include "trace.h"
287
288
diff --git a/hw/rtc/ds1338.c b/hw/rtc/ds1338.c
289
index XXXXXXX..XXXXXXX 100644
290
--- a/hw/rtc/ds1338.c
291
+++ b/hw/rtc/ds1338.c
292
@@ -XXX,XX +XXX,XX @@
293
*/
294
295
#include "qemu/osdep.h"
296
-#include "qemu-common.h"
297
#include "hw/i2c/i2c.h"
298
#include "migration/vmstate.h"
299
#include "qemu/bcd.h"
300
#include "qemu/module.h"
301
#include "qom/object.h"
302
+#include "sysemu/rtc.h"
303
304
/* Size of NVRAM including both the user-accessible area and the
305
* secondary register area.
306
diff --git a/hw/rtc/exynos4210_rtc.c b/hw/rtc/exynos4210_rtc.c
307
index XXXXXXX..XXXXXXX 100644
308
--- a/hw/rtc/exynos4210_rtc.c
309
+++ b/hw/rtc/exynos4210_rtc.c
310
@@ -XXX,XX +XXX,XX @@
311
*/
312
313
#include "qemu/osdep.h"
314
-#include "qemu-common.h"
315
#include "qemu/log.h"
316
#include "qemu/module.h"
317
#include "hw/sysbus.h"
318
@@ -XXX,XX +XXX,XX @@
319
320
#include "hw/arm/exynos4210.h"
321
#include "qom/object.h"
322
+#include "sysemu/rtc.h"
323
324
#define DEBUG_RTC 0
325
326
diff --git a/hw/rtc/goldfish_rtc.c b/hw/rtc/goldfish_rtc.c
327
index XXXXXXX..XXXXXXX 100644
328
--- a/hw/rtc/goldfish_rtc.c
329
+++ b/hw/rtc/goldfish_rtc.c
330
@@ -XXX,XX +XXX,XX @@
331
*/
332
333
#include "qemu/osdep.h"
334
-#include "qemu-common.h"
335
#include "hw/rtc/goldfish_rtc.h"
336
#include "migration/vmstate.h"
337
#include "hw/irq.h"
338
@@ -XXX,XX +XXX,XX @@
339
#include "qemu/bitops.h"
340
#include "qemu/timer.h"
341
#include "sysemu/sysemu.h"
342
+#include "sysemu/rtc.h"
343
#include "qemu/cutils.h"
344
#include "qemu/log.h"
345
346
diff --git a/hw/rtc/m41t80.c b/hw/rtc/m41t80.c
347
index XXXXXXX..XXXXXXX 100644
348
--- a/hw/rtc/m41t80.c
349
+++ b/hw/rtc/m41t80.c
350
@@ -XXX,XX +XXX,XX @@
351
*/
352
353
#include "qemu/osdep.h"
354
-#include "qemu-common.h"
355
#include "qemu/log.h"
356
#include "qemu/module.h"
357
#include "qemu/timer.h"
358
#include "qemu/bcd.h"
359
#include "hw/i2c/i2c.h"
360
#include "qom/object.h"
361
+#include "sysemu/rtc.h"
362
363
#define TYPE_M41T80 "m41t80"
364
OBJECT_DECLARE_SIMPLE_TYPE(M41t80State, M41T80)
365
diff --git a/hw/rtc/m48t59.c b/hw/rtc/m48t59.c
366
index XXXXXXX..XXXXXXX 100644
367
--- a/hw/rtc/m48t59.c
368
+++ b/hw/rtc/m48t59.c
369
@@ -XXX,XX +XXX,XX @@
370
*/
371
372
#include "qemu/osdep.h"
373
-#include "qemu-common.h"
374
#include "hw/irq.h"
375
#include "hw/qdev-properties.h"
376
#include "hw/rtc/m48t59.h"
377
#include "qemu/timer.h"
378
#include "sysemu/runstate.h"
379
+#include "sysemu/rtc.h"
380
#include "sysemu/sysemu.h"
381
#include "hw/sysbus.h"
382
#include "qapi/error.h"
383
diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
384
index XXXXXXX..XXXXXXX 100644
385
--- a/hw/rtc/mc146818rtc.c
386
+++ b/hw/rtc/mc146818rtc.c
387
@@ -XXX,XX +XXX,XX @@
388
*/
389
390
#include "qemu/osdep.h"
391
-#include "qemu-common.h"
392
#include "qemu/cutils.h"
393
#include "qemu/module.h"
394
#include "qemu/bcd.h"
395
@@ -XXX,XX +XXX,XX @@
396
#include "sysemu/replay.h"
397
#include "sysemu/reset.h"
398
#include "sysemu/runstate.h"
399
+#include "sysemu/rtc.h"
400
#include "hw/rtc/mc146818rtc.h"
401
#include "hw/rtc/mc146818rtc_regs.h"
402
#include "migration/vmstate.h"
403
diff --git a/hw/rtc/pl031.c b/hw/rtc/pl031.c
404
index XXXXXXX..XXXXXXX 100644
405
--- a/hw/rtc/pl031.c
406
+++ b/hw/rtc/pl031.c
407
@@ -XXX,XX +XXX,XX @@
408
*/
409
410
#include "qemu/osdep.h"
411
-#include "qemu-common.h"
412
#include "hw/rtc/pl031.h"
413
#include "migration/vmstate.h"
414
#include "hw/irq.h"
415
@@ -XXX,XX +XXX,XX @@
416
#include "hw/sysbus.h"
417
#include "qemu/timer.h"
418
#include "sysemu/sysemu.h"
419
+#include "sysemu/rtc.h"
420
#include "qemu/cutils.h"
421
#include "qemu/log.h"
422
#include "qemu/module.h"
423
diff --git a/hw/rtc/twl92230.c b/hw/rtc/twl92230.c
424
index XXXXXXX..XXXXXXX 100644
425
--- a/hw/rtc/twl92230.c
426
+++ b/hw/rtc/twl92230.c
427
@@ -XXX,XX +XXX,XX @@
428
*/
429
430
#include "qemu/osdep.h"
431
-#include "qemu-common.h"
432
#include "qemu/timer.h"
433
#include "hw/i2c/i2c.h"
434
#include "hw/irq.h"
435
#include "migration/qemu-file-types.h"
436
#include "migration/vmstate.h"
437
#include "sysemu/sysemu.h"
438
+#include "sysemu/rtc.h"
439
#include "qemu/bcd.h"
440
#include "qemu/module.h"
441
#include "qom/object.h"
442
diff --git a/hw/rtc/xlnx-zynqmp-rtc.c b/hw/rtc/xlnx-zynqmp-rtc.c
443
index XXXXXXX..XXXXXXX 100644
444
--- a/hw/rtc/xlnx-zynqmp-rtc.c
445
+++ b/hw/rtc/xlnx-zynqmp-rtc.c
446
@@ -XXX,XX +XXX,XX @@
447
*/
448
449
#include "qemu/osdep.h"
450
-#include "qemu-common.h"
451
#include "hw/sysbus.h"
452
#include "hw/register.h"
453
#include "qemu/bitops.h"
454
@@ -XXX,XX +XXX,XX @@
455
#include "hw/irq.h"
456
#include "qemu/cutils.h"
457
#include "sysemu/sysemu.h"
458
+#include "sysemu/rtc.h"
459
#include "trace.h"
460
#include "hw/rtc/xlnx-zynqmp-rtc.h"
461
#include "migration/vmstate.h"
462
diff --git a/hw/s390x/tod-tcg.c b/hw/s390x/tod-tcg.c
463
index XXXXXXX..XXXXXXX 100644
464
--- a/hw/s390x/tod-tcg.c
465
+++ b/hw/s390x/tod-tcg.c
466
@@ -XXX,XX +XXX,XX @@
467
*/
468
469
#include "qemu/osdep.h"
470
-#include "qemu-common.h"
471
#include "qapi/error.h"
472
#include "hw/s390x/tod.h"
473
#include "qemu/timer.h"
474
@@ -XXX,XX +XXX,XX @@
475
#include "qemu/module.h"
476
#include "cpu.h"
477
#include "tcg/tcg_s390x.h"
478
+#include "sysemu/rtc.h"
479
480
static void qemu_s390_tod_get(const S390TODState *td, S390TOD *tod,
481
Error **errp)
482
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
483
index XXXXXXX..XXXXXXX 100644
484
--- a/hw/scsi/megasas.c
485
+++ b/hw/scsi/megasas.c
486
@@ -XXX,XX +XXX,XX @@
487
*/
488
489
#include "qemu/osdep.h"
490
-#include "qemu-common.h"
491
#include "hw/pci/pci.h"
492
#include "hw/qdev-properties.h"
493
#include "sysemu/dma.h"
494
#include "sysemu/block-backend.h"
495
+#include "sysemu/rtc.h"
496
#include "hw/pci/msi.h"
497
#include "hw/pci/msix.h"
498
#include "qemu/iov.h"
499
diff --git a/net/dump.c b/net/dump.c
500
index XXXXXXX..XXXXXXX 100644
501
--- a/net/dump.c
502
+++ b/net/dump.c
503
@@ -XXX,XX +XXX,XX @@
504
*/
505
506
#include "qemu/osdep.h"
507
-#include "qemu-common.h"
508
#include "clients.h"
509
#include "qapi/error.h"
510
#include "qemu/error-report.h"
511
@@ -XXX,XX +XXX,XX @@
512
#include "qapi/visitor.h"
513
#include "net/filter.h"
514
#include "qom/object.h"
515
+#include "sysemu/rtc.h"
516
517
typedef struct DumpState {
518
int64_t start_ts;
519
diff --git a/softmmu/rtc.c b/softmmu/rtc.c
520
index XXXXXXX..XXXXXXX 100644
521
--- a/softmmu/rtc.c
522
+++ b/softmmu/rtc.c
523
@@ -XXX,XX +XXX,XX @@
524
*/
525
526
#include "qemu/osdep.h"
527
-#include "qemu-common.h"
528
#include "qemu/cutils.h"
529
#include "qapi/error.h"
530
#include "qapi/qmp/qerror.h"
531
@@ -XXX,XX +XXX,XX @@
532
#include "qom/object.h"
533
#include "sysemu/replay.h"
534
#include "sysemu/sysemu.h"
535
+#include "sysemu/rtc.h"
536
537
static enum {
538
RTC_BASE_UTC,
77
--
539
--
78
2.20.1
540
2.25.1
79
541
80
542
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
QOM'ify RaspiMachineState. Now machines inherit of RaspiMachineClass.
3
Add a model of Versal's PMC SLCR (system-level control registers).
4
4
5
Cc: Igor Mammedov <imammedo@redhat.com>
5
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
8
Message-id: 20200208165645.15657-8-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Luc Michel <luc@lmichel.fr>
9
Message-id: 20220121161141.14389-2-francisco.iglesias@xilinx.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
11
---
12
hw/arm/raspi.c | 56 +++++++++++++++++++++++++++++++++++++++++++-------
12
include/hw/misc/xlnx-versal-pmc-iou-slcr.h | 78 ++
13
1 file changed, 49 insertions(+), 7 deletions(-)
13
hw/misc/xlnx-versal-pmc-iou-slcr.c | 1446 ++++++++++++++++++++
14
hw/misc/meson.build | 5 +-
15
3 files changed, 1528 insertions(+), 1 deletion(-)
16
create mode 100644 include/hw/misc/xlnx-versal-pmc-iou-slcr.h
17
create mode 100644 hw/misc/xlnx-versal-pmc-iou-slcr.c
14
18
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
19
diff --git a/include/hw/misc/xlnx-versal-pmc-iou-slcr.h b/include/hw/misc/xlnx-versal-pmc-iou-slcr.h
16
index XXXXXXX..XXXXXXX 100644
20
new file mode 100644
17
--- a/hw/arm/raspi.c
21
index XXXXXXX..XXXXXXX
18
+++ b/hw/arm/raspi.c
22
--- /dev/null
23
+++ b/include/hw/misc/xlnx-versal-pmc-iou-slcr.h
19
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@
20
/* Registered machine type (matches RPi Foundation bootloader and U-Boot) */
25
+/*
21
#define MACH_TYPE_BCM2708 3138
26
+ * Header file for the Xilinx Versal's PMC IOU SLCR
22
27
+ *
23
-typedef struct RasPiState {
28
+ * Copyright (C) 2021 Xilinx Inc
24
+typedef struct RaspiMachineState {
29
+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>
25
+ /*< private >*/
30
+ *
26
+ MachineState parent_obj;
31
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
27
+ /*< public >*/
32
+ * of this software and associated documentation files (the "Software"), to deal
28
BCM283XState soc;
33
+ * in the Software without restriction, including without limitation the rights
29
MemoryRegion ram;
34
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
30
-} RasPiState;
35
+ * copies of the Software, and to permit persons to whom the Software is
31
+} RaspiMachineState;
36
+ * furnished to do so, subject to the following conditions:
32
+
37
+ *
33
+typedef struct RaspiMachineClass {
38
+ * The above copyright notice and this permission notice shall be included in
34
+ /*< private >*/
39
+ * all copies or substantial portions of the Software.
35
+ MachineClass parent_obj;
40
+ *
36
+ /*< public >*/
41
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
37
+} RaspiMachineClass;
42
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
38
+
43
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
39
+#define TYPE_RASPI_MACHINE MACHINE_TYPE_NAME("raspi-common")
44
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
40
+#define RASPI_MACHINE(obj) \
45
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
41
+ OBJECT_CHECK(RaspiMachineState, (obj), TYPE_RASPI_MACHINE)
46
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
42
+
47
+ * THE SOFTWARE.
43
+#define RASPI_MACHINE_CLASS(klass) \
48
+ */
44
+ OBJECT_CLASS_CHECK(RaspiMachineClass, (klass), TYPE_RASPI_MACHINE)
49
+
45
+#define RASPI_MACHINE_GET_CLASS(obj) \
50
+/*
46
+ OBJECT_GET_CLASS(RaspiMachineClass, (obj), TYPE_RASPI_MACHINE)
51
+ * This is a model of Xilinx Versal's PMC I/O Peripheral Control and Status
47
52
+ * module documented in Versal's Technical Reference manual [1] and the Versal
48
/*
53
+ * ACAP Register reference [2].
49
* Board revision codes:
54
+ *
50
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
55
+ * References:
51
56
+ *
52
static void raspi_init(MachineState *machine, uint32_t board_rev)
57
+ * [1] Versal ACAP Technical Reference Manual,
53
{
58
+ * https://www.xilinx.com/support/documentation/architecture-manuals/am011-versal-acap-trm.pdf
54
- RasPiState *s = g_new0(RasPiState, 1);
59
+ *
55
+ RaspiMachineState *s = RASPI_MACHINE(machine);
60
+ * [2] Versal ACAP Register Reference,
56
int version = board_version(board_rev);
61
+ * https://www.xilinx.com/html_docs/registers/am012/am012-versal-register-reference.html#mod___pmc_iop_slcr.html
57
uint64_t ram_size = board_ram_size(board_rev);
62
+ *
58
uint32_t vcram_size;
63
+ * QEMU interface:
59
@@ -XXX,XX +XXX,XX @@ static void raspi2_init(MachineState *machine)
64
+ * + sysbus MMIO region 0: MemoryRegion for the device's registers
60
raspi_init(machine, 0xa21041);
65
+ * + sysbus IRQ 0: PMC (AXI and APB) parity error interrupt detected by the PMC
61
}
66
+ * I/O peripherals.
62
67
+ * + sysbus IRQ 1: Device interrupt.
63
-static void raspi2_machine_init(MachineClass *mc)
68
+ * + Named GPIO output "sd-emmc-sel[0]": Enables 0: SD mode or 1: eMMC mode on
64
+static void raspi2_machine_class_init(ObjectClass *oc, void *data)
69
+ * SD/eMMC controller 0.
65
{
70
+ * + Named GPIO output "sd-emmc-sel[1]": Enables 0: SD mode or 1: eMMC mode on
66
+ MachineClass *mc = MACHINE_CLASS(oc);
71
+ * SD/eMMC controller 1.
67
+
72
+ * + Named GPIO output "qspi-ospi-mux-sel": Selects 0: QSPI linear region or 1:
68
mc->desc = "Raspberry Pi 2B";
73
+ * OSPI linear region.
69
mc->init = raspi2_init;
74
+ * + Named GPIO output "ospi-mux-sel": Selects 0: OSPI Indirect access mode or
70
mc->block_default_type = IF_SD;
75
+ * 1: OSPI direct access mode.
71
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
76
+ */
72
mc->default_ram_size = 1 * GiB;
77
+
73
mc->ignore_memory_transaction_failures = true;
78
+#ifndef XILINX_VERSAL_PMC_IOU_SLCR_H
74
};
79
+#define XILINX_VERSAL_PMC_IOU_SLCR_H
75
-DEFINE_MACHINE("raspi2", raspi2_machine_init)
80
+
76
81
+#include "hw/register.h"
77
#ifdef TARGET_AARCH64
82
+
78
static void raspi3_init(MachineState *machine)
83
+#define TYPE_XILINX_VERSAL_PMC_IOU_SLCR "xlnx.versal-pmc-iou-slcr"
79
@@ -XXX,XX +XXX,XX @@ static void raspi3_init(MachineState *machine)
84
+
80
raspi_init(machine, 0xa02082);
85
+OBJECT_DECLARE_SIMPLE_TYPE(XlnxVersalPmcIouSlcr, XILINX_VERSAL_PMC_IOU_SLCR)
81
}
86
+
82
87
+#define XILINX_VERSAL_PMC_IOU_SLCR_R_MAX (0x828 / 4 + 1)
83
-static void raspi3_machine_init(MachineClass *mc)
88
+
84
+static void raspi3_machine_class_init(ObjectClass *oc, void *data)
89
+struct XlnxVersalPmcIouSlcr {
85
{
90
+ SysBusDevice parent_obj;
86
+ MachineClass *mc = MACHINE_CLASS(oc);
91
+ MemoryRegion iomem;
87
+
92
+ qemu_irq irq_parity_imr;
88
mc->desc = "Raspberry Pi 3B";
93
+ qemu_irq irq_imr;
89
mc->init = raspi3_init;
94
+ qemu_irq sd_emmc_sel[2];
90
mc->block_default_type = IF_SD;
95
+ qemu_irq qspi_ospi_mux_sel;
91
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_init(MachineClass *mc)
96
+ qemu_irq ospi_mux_sel;
92
mc->default_cpus = BCM283X_NCPUS;
97
+
93
mc->default_ram_size = 1 * GiB;
98
+ uint32_t regs[XILINX_VERSAL_PMC_IOU_SLCR_R_MAX];
94
}
99
+ RegisterInfo regs_info[XILINX_VERSAL_PMC_IOU_SLCR_R_MAX];
95
-DEFINE_MACHINE("raspi3", raspi3_machine_init)
100
+};
96
#endif
101
+
97
+
102
+#endif /* XILINX_VERSAL_PMC_IOU_SLCR_H */
98
+static const TypeInfo raspi_machine_types[] = {
103
diff --git a/hw/misc/xlnx-versal-pmc-iou-slcr.c b/hw/misc/xlnx-versal-pmc-iou-slcr.c
99
+ {
104
new file mode 100644
100
+ .name = MACHINE_TYPE_NAME("raspi2"),
105
index XXXXXXX..XXXXXXX
101
+ .parent = TYPE_RASPI_MACHINE,
106
--- /dev/null
102
+ .class_init = raspi2_machine_class_init,
107
+++ b/hw/misc/xlnx-versal-pmc-iou-slcr.c
103
+#ifdef TARGET_AARCH64
108
@@ -XXX,XX +XXX,XX @@
104
+ }, {
109
+/*
105
+ .name = MACHINE_TYPE_NAME("raspi3"),
110
+ * QEMU model of Versal's PMC IOU SLCR (system level control registers)
106
+ .parent = TYPE_RASPI_MACHINE,
111
+ *
107
+ .class_init = raspi3_machine_class_init,
112
+ * Copyright (c) 2021 Xilinx Inc.
113
+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>
114
+ *
115
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
116
+ * of this software and associated documentation files (the "Software"), to deal
117
+ * in the Software without restriction, including without limitation the rights
118
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
119
+ * copies of the Software, and to permit persons to whom the Software is
120
+ * furnished to do so, subject to the following conditions:
121
+ *
122
+ * The above copyright notice and this permission notice shall be included in
123
+ * all copies or substantial portions of the Software.
124
+ *
125
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
126
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
127
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
128
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
129
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
130
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
131
+ * THE SOFTWARE.
132
+ */
133
+
134
+#include "qemu/osdep.h"
135
+#include "hw/sysbus.h"
136
+#include "hw/register.h"
137
+#include "hw/irq.h"
138
+#include "qemu/bitops.h"
139
+#include "qemu/log.h"
140
+#include "migration/vmstate.h"
141
+#include "hw/qdev-properties.h"
142
+#include "hw/misc/xlnx-versal-pmc-iou-slcr.h"
143
+
144
+#ifndef XILINX_VERSAL_PMC_IOU_SLCR_ERR_DEBUG
145
+#define XILINX_VERSAL_PMC_IOU_SLCR_ERR_DEBUG 0
108
+#endif
146
+#endif
109
+ }, {
147
+
110
+ .name = TYPE_RASPI_MACHINE,
148
+REG32(MIO_PIN_0, 0x0)
111
+ .parent = TYPE_MACHINE,
149
+ FIELD(MIO_PIN_0, L3_SEL, 7, 3)
112
+ .instance_size = sizeof(RaspiMachineState),
150
+ FIELD(MIO_PIN_0, L2_SEL, 5, 2)
113
+ .class_size = sizeof(RaspiMachineClass),
151
+ FIELD(MIO_PIN_0, L1_SEL, 3, 2)
114
+ .abstract = true,
152
+ FIELD(MIO_PIN_0, L0_SEL, 1, 2)
153
+REG32(MIO_PIN_1, 0x4)
154
+ FIELD(MIO_PIN_1, L3_SEL, 7, 3)
155
+ FIELD(MIO_PIN_1, L2_SEL, 5, 2)
156
+ FIELD(MIO_PIN_1, L1_SEL, 3, 2)
157
+ FIELD(MIO_PIN_1, L0_SEL, 1, 2)
158
+REG32(MIO_PIN_2, 0x8)
159
+ FIELD(MIO_PIN_2, L3_SEL, 7, 3)
160
+ FIELD(MIO_PIN_2, L2_SEL, 5, 2)
161
+ FIELD(MIO_PIN_2, L1_SEL, 3, 2)
162
+ FIELD(MIO_PIN_2, L0_SEL, 1, 2)
163
+REG32(MIO_PIN_3, 0xc)
164
+ FIELD(MIO_PIN_3, L3_SEL, 7, 3)
165
+ FIELD(MIO_PIN_3, L2_SEL, 5, 2)
166
+ FIELD(MIO_PIN_3, L1_SEL, 3, 2)
167
+ FIELD(MIO_PIN_3, L0_SEL, 1, 2)
168
+REG32(MIO_PIN_4, 0x10)
169
+ FIELD(MIO_PIN_4, L3_SEL, 7, 3)
170
+ FIELD(MIO_PIN_4, L2_SEL, 5, 2)
171
+ FIELD(MIO_PIN_4, L1_SEL, 3, 2)
172
+ FIELD(MIO_PIN_4, L0_SEL, 1, 2)
173
+REG32(MIO_PIN_5, 0x14)
174
+ FIELD(MIO_PIN_5, L3_SEL, 7, 3)
175
+ FIELD(MIO_PIN_5, L2_SEL, 5, 2)
176
+ FIELD(MIO_PIN_5, L1_SEL, 3, 2)
177
+ FIELD(MIO_PIN_5, L0_SEL, 1, 2)
178
+REG32(MIO_PIN_6, 0x18)
179
+ FIELD(MIO_PIN_6, L3_SEL, 7, 3)
180
+ FIELD(MIO_PIN_6, L2_SEL, 5, 2)
181
+ FIELD(MIO_PIN_6, L1_SEL, 3, 2)
182
+ FIELD(MIO_PIN_6, L0_SEL, 1, 2)
183
+REG32(MIO_PIN_7, 0x1c)
184
+ FIELD(MIO_PIN_7, L3_SEL, 7, 3)
185
+ FIELD(MIO_PIN_7, L2_SEL, 5, 2)
186
+ FIELD(MIO_PIN_7, L1_SEL, 3, 2)
187
+ FIELD(MIO_PIN_7, L0_SEL, 1, 2)
188
+REG32(MIO_PIN_8, 0x20)
189
+ FIELD(MIO_PIN_8, L3_SEL, 7, 3)
190
+ FIELD(MIO_PIN_8, L2_SEL, 5, 2)
191
+ FIELD(MIO_PIN_8, L1_SEL, 3, 2)
192
+ FIELD(MIO_PIN_8, L0_SEL, 1, 2)
193
+REG32(MIO_PIN_9, 0x24)
194
+ FIELD(MIO_PIN_9, L3_SEL, 7, 3)
195
+ FIELD(MIO_PIN_9, L2_SEL, 5, 2)
196
+ FIELD(MIO_PIN_9, L1_SEL, 3, 2)
197
+ FIELD(MIO_PIN_9, L0_SEL, 1, 2)
198
+REG32(MIO_PIN_10, 0x28)
199
+ FIELD(MIO_PIN_10, L3_SEL, 7, 3)
200
+ FIELD(MIO_PIN_10, L2_SEL, 5, 2)
201
+ FIELD(MIO_PIN_10, L1_SEL, 3, 2)
202
+ FIELD(MIO_PIN_10, L0_SEL, 1, 2)
203
+REG32(MIO_PIN_11, 0x2c)
204
+ FIELD(MIO_PIN_11, L3_SEL, 7, 3)
205
+ FIELD(MIO_PIN_11, L2_SEL, 5, 2)
206
+ FIELD(MIO_PIN_11, L1_SEL, 3, 2)
207
+ FIELD(MIO_PIN_11, L0_SEL, 1, 2)
208
+REG32(MIO_PIN_12, 0x30)
209
+ FIELD(MIO_PIN_12, L3_SEL, 7, 3)
210
+ FIELD(MIO_PIN_12, L2_SEL, 5, 2)
211
+ FIELD(MIO_PIN_12, L1_SEL, 3, 2)
212
+ FIELD(MIO_PIN_12, L0_SEL, 1, 2)
213
+REG32(MIO_PIN_13, 0x34)
214
+ FIELD(MIO_PIN_13, L3_SEL, 7, 3)
215
+ FIELD(MIO_PIN_13, L2_SEL, 5, 2)
216
+ FIELD(MIO_PIN_13, L1_SEL, 3, 2)
217
+ FIELD(MIO_PIN_13, L0_SEL, 1, 2)
218
+REG32(MIO_PIN_14, 0x38)
219
+ FIELD(MIO_PIN_14, L3_SEL, 7, 3)
220
+ FIELD(MIO_PIN_14, L2_SEL, 5, 2)
221
+ FIELD(MIO_PIN_14, L1_SEL, 3, 2)
222
+ FIELD(MIO_PIN_14, L0_SEL, 1, 2)
223
+REG32(MIO_PIN_15, 0x3c)
224
+ FIELD(MIO_PIN_15, L3_SEL, 7, 3)
225
+ FIELD(MIO_PIN_15, L2_SEL, 5, 2)
226
+ FIELD(MIO_PIN_15, L1_SEL, 3, 2)
227
+ FIELD(MIO_PIN_15, L0_SEL, 1, 2)
228
+REG32(MIO_PIN_16, 0x40)
229
+ FIELD(MIO_PIN_16, L3_SEL, 7, 3)
230
+ FIELD(MIO_PIN_16, L2_SEL, 5, 2)
231
+ FIELD(MIO_PIN_16, L1_SEL, 3, 2)
232
+ FIELD(MIO_PIN_16, L0_SEL, 1, 2)
233
+REG32(MIO_PIN_17, 0x44)
234
+ FIELD(MIO_PIN_17, L3_SEL, 7, 3)
235
+ FIELD(MIO_PIN_17, L2_SEL, 5, 2)
236
+ FIELD(MIO_PIN_17, L1_SEL, 3, 2)
237
+ FIELD(MIO_PIN_17, L0_SEL, 1, 2)
238
+REG32(MIO_PIN_18, 0x48)
239
+ FIELD(MIO_PIN_18, L3_SEL, 7, 3)
240
+ FIELD(MIO_PIN_18, L2_SEL, 5, 2)
241
+ FIELD(MIO_PIN_18, L1_SEL, 3, 2)
242
+ FIELD(MIO_PIN_18, L0_SEL, 1, 2)
243
+REG32(MIO_PIN_19, 0x4c)
244
+ FIELD(MIO_PIN_19, L3_SEL, 7, 3)
245
+ FIELD(MIO_PIN_19, L2_SEL, 5, 2)
246
+ FIELD(MIO_PIN_19, L1_SEL, 3, 2)
247
+ FIELD(MIO_PIN_19, L0_SEL, 1, 2)
248
+REG32(MIO_PIN_20, 0x50)
249
+ FIELD(MIO_PIN_20, L3_SEL, 7, 3)
250
+ FIELD(MIO_PIN_20, L2_SEL, 5, 2)
251
+ FIELD(MIO_PIN_20, L1_SEL, 3, 2)
252
+ FIELD(MIO_PIN_20, L0_SEL, 1, 2)
253
+REG32(MIO_PIN_21, 0x54)
254
+ FIELD(MIO_PIN_21, L3_SEL, 7, 3)
255
+ FIELD(MIO_PIN_21, L2_SEL, 5, 2)
256
+ FIELD(MIO_PIN_21, L1_SEL, 3, 2)
257
+ FIELD(MIO_PIN_21, L0_SEL, 1, 2)
258
+REG32(MIO_PIN_22, 0x58)
259
+ FIELD(MIO_PIN_22, L3_SEL, 7, 3)
260
+ FIELD(MIO_PIN_22, L2_SEL, 5, 2)
261
+ FIELD(MIO_PIN_22, L1_SEL, 3, 2)
262
+ FIELD(MIO_PIN_22, L0_SEL, 1, 2)
263
+REG32(MIO_PIN_23, 0x5c)
264
+ FIELD(MIO_PIN_23, L3_SEL, 7, 3)
265
+ FIELD(MIO_PIN_23, L2_SEL, 5, 2)
266
+ FIELD(MIO_PIN_23, L1_SEL, 3, 2)
267
+ FIELD(MIO_PIN_23, L0_SEL, 1, 2)
268
+REG32(MIO_PIN_24, 0x60)
269
+ FIELD(MIO_PIN_24, L3_SEL, 7, 3)
270
+ FIELD(MIO_PIN_24, L2_SEL, 5, 2)
271
+ FIELD(MIO_PIN_24, L1_SEL, 3, 2)
272
+ FIELD(MIO_PIN_24, L0_SEL, 1, 2)
273
+REG32(MIO_PIN_25, 0x64)
274
+ FIELD(MIO_PIN_25, L3_SEL, 7, 3)
275
+ FIELD(MIO_PIN_25, L2_SEL, 5, 2)
276
+ FIELD(MIO_PIN_25, L1_SEL, 3, 2)
277
+ FIELD(MIO_PIN_25, L0_SEL, 1, 2)
278
+REG32(MIO_PIN_26, 0x68)
279
+ FIELD(MIO_PIN_26, L3_SEL, 7, 3)
280
+ FIELD(MIO_PIN_26, L2_SEL, 5, 2)
281
+ FIELD(MIO_PIN_26, L1_SEL, 3, 2)
282
+ FIELD(MIO_PIN_26, L0_SEL, 1, 2)
283
+REG32(MIO_PIN_27, 0x6c)
284
+ FIELD(MIO_PIN_27, L3_SEL, 7, 3)
285
+ FIELD(MIO_PIN_27, L2_SEL, 5, 2)
286
+ FIELD(MIO_PIN_27, L1_SEL, 3, 2)
287
+ FIELD(MIO_PIN_27, L0_SEL, 1, 2)
288
+REG32(MIO_PIN_28, 0x70)
289
+ FIELD(MIO_PIN_28, L3_SEL, 7, 3)
290
+ FIELD(MIO_PIN_28, L2_SEL, 5, 2)
291
+ FIELD(MIO_PIN_28, L1_SEL, 3, 2)
292
+ FIELD(MIO_PIN_28, L0_SEL, 1, 2)
293
+REG32(MIO_PIN_29, 0x74)
294
+ FIELD(MIO_PIN_29, L3_SEL, 7, 3)
295
+ FIELD(MIO_PIN_29, L2_SEL, 5, 2)
296
+ FIELD(MIO_PIN_29, L1_SEL, 3, 2)
297
+ FIELD(MIO_PIN_29, L0_SEL, 1, 2)
298
+REG32(MIO_PIN_30, 0x78)
299
+ FIELD(MIO_PIN_30, L3_SEL, 7, 3)
300
+ FIELD(MIO_PIN_30, L2_SEL, 5, 2)
301
+ FIELD(MIO_PIN_30, L1_SEL, 3, 2)
302
+ FIELD(MIO_PIN_30, L0_SEL, 1, 2)
303
+REG32(MIO_PIN_31, 0x7c)
304
+ FIELD(MIO_PIN_31, L3_SEL, 7, 3)
305
+ FIELD(MIO_PIN_31, L2_SEL, 5, 2)
306
+ FIELD(MIO_PIN_31, L1_SEL, 3, 2)
307
+ FIELD(MIO_PIN_31, L0_SEL, 1, 2)
308
+REG32(MIO_PIN_32, 0x80)
309
+ FIELD(MIO_PIN_32, L3_SEL, 7, 3)
310
+ FIELD(MIO_PIN_32, L2_SEL, 5, 2)
311
+ FIELD(MIO_PIN_32, L1_SEL, 3, 2)
312
+ FIELD(MIO_PIN_32, L0_SEL, 1, 2)
313
+REG32(MIO_PIN_33, 0x84)
314
+ FIELD(MIO_PIN_33, L3_SEL, 7, 3)
315
+ FIELD(MIO_PIN_33, L2_SEL, 5, 2)
316
+ FIELD(MIO_PIN_33, L1_SEL, 3, 2)
317
+ FIELD(MIO_PIN_33, L0_SEL, 1, 2)
318
+REG32(MIO_PIN_34, 0x88)
319
+ FIELD(MIO_PIN_34, L3_SEL, 7, 3)
320
+ FIELD(MIO_PIN_34, L2_SEL, 5, 2)
321
+ FIELD(MIO_PIN_34, L1_SEL, 3, 2)
322
+ FIELD(MIO_PIN_34, L0_SEL, 1, 2)
323
+REG32(MIO_PIN_35, 0x8c)
324
+ FIELD(MIO_PIN_35, L3_SEL, 7, 3)
325
+ FIELD(MIO_PIN_35, L2_SEL, 5, 2)
326
+ FIELD(MIO_PIN_35, L1_SEL, 3, 2)
327
+ FIELD(MIO_PIN_35, L0_SEL, 1, 2)
328
+REG32(MIO_PIN_36, 0x90)
329
+ FIELD(MIO_PIN_36, L3_SEL, 7, 3)
330
+ FIELD(MIO_PIN_36, L2_SEL, 5, 2)
331
+ FIELD(MIO_PIN_36, L1_SEL, 3, 2)
332
+ FIELD(MIO_PIN_36, L0_SEL, 1, 2)
333
+REG32(MIO_PIN_37, 0x94)
334
+ FIELD(MIO_PIN_37, L3_SEL, 7, 3)
335
+ FIELD(MIO_PIN_37, L2_SEL, 5, 2)
336
+ FIELD(MIO_PIN_37, L1_SEL, 3, 2)
337
+ FIELD(MIO_PIN_37, L0_SEL, 1, 2)
338
+REG32(MIO_PIN_38, 0x98)
339
+ FIELD(MIO_PIN_38, L3_SEL, 7, 3)
340
+ FIELD(MIO_PIN_38, L2_SEL, 5, 2)
341
+ FIELD(MIO_PIN_38, L1_SEL, 3, 2)
342
+ FIELD(MIO_PIN_38, L0_SEL, 1, 2)
343
+REG32(MIO_PIN_39, 0x9c)
344
+ FIELD(MIO_PIN_39, L3_SEL, 7, 3)
345
+ FIELD(MIO_PIN_39, L2_SEL, 5, 2)
346
+ FIELD(MIO_PIN_39, L1_SEL, 3, 2)
347
+ FIELD(MIO_PIN_39, L0_SEL, 1, 2)
348
+REG32(MIO_PIN_40, 0xa0)
349
+ FIELD(MIO_PIN_40, L3_SEL, 7, 3)
350
+ FIELD(MIO_PIN_40, L2_SEL, 5, 2)
351
+ FIELD(MIO_PIN_40, L1_SEL, 3, 2)
352
+ FIELD(MIO_PIN_40, L0_SEL, 1, 2)
353
+REG32(MIO_PIN_41, 0xa4)
354
+ FIELD(MIO_PIN_41, L3_SEL, 7, 3)
355
+ FIELD(MIO_PIN_41, L2_SEL, 5, 2)
356
+ FIELD(MIO_PIN_41, L1_SEL, 3, 2)
357
+ FIELD(MIO_PIN_41, L0_SEL, 1, 2)
358
+REG32(MIO_PIN_42, 0xa8)
359
+ FIELD(MIO_PIN_42, L3_SEL, 7, 3)
360
+ FIELD(MIO_PIN_42, L2_SEL, 5, 2)
361
+ FIELD(MIO_PIN_42, L1_SEL, 3, 2)
362
+ FIELD(MIO_PIN_42, L0_SEL, 1, 2)
363
+REG32(MIO_PIN_43, 0xac)
364
+ FIELD(MIO_PIN_43, L3_SEL, 7, 3)
365
+ FIELD(MIO_PIN_43, L2_SEL, 5, 2)
366
+ FIELD(MIO_PIN_43, L1_SEL, 3, 2)
367
+ FIELD(MIO_PIN_43, L0_SEL, 1, 2)
368
+REG32(MIO_PIN_44, 0xb0)
369
+ FIELD(MIO_PIN_44, L3_SEL, 7, 3)
370
+ FIELD(MIO_PIN_44, L2_SEL, 5, 2)
371
+ FIELD(MIO_PIN_44, L1_SEL, 3, 2)
372
+ FIELD(MIO_PIN_44, L0_SEL, 1, 2)
373
+REG32(MIO_PIN_45, 0xb4)
374
+ FIELD(MIO_PIN_45, L3_SEL, 7, 3)
375
+ FIELD(MIO_PIN_45, L2_SEL, 5, 2)
376
+ FIELD(MIO_PIN_45, L1_SEL, 3, 2)
377
+ FIELD(MIO_PIN_45, L0_SEL, 1, 2)
378
+REG32(MIO_PIN_46, 0xb8)
379
+ FIELD(MIO_PIN_46, L3_SEL, 7, 3)
380
+ FIELD(MIO_PIN_46, L2_SEL, 5, 2)
381
+ FIELD(MIO_PIN_46, L1_SEL, 3, 2)
382
+ FIELD(MIO_PIN_46, L0_SEL, 1, 2)
383
+REG32(MIO_PIN_47, 0xbc)
384
+ FIELD(MIO_PIN_47, L3_SEL, 7, 3)
385
+ FIELD(MIO_PIN_47, L2_SEL, 5, 2)
386
+ FIELD(MIO_PIN_47, L1_SEL, 3, 2)
387
+ FIELD(MIO_PIN_47, L0_SEL, 1, 2)
388
+REG32(MIO_PIN_48, 0xc0)
389
+ FIELD(MIO_PIN_48, L3_SEL, 7, 3)
390
+ FIELD(MIO_PIN_48, L2_SEL, 5, 2)
391
+ FIELD(MIO_PIN_48, L1_SEL, 3, 2)
392
+ FIELD(MIO_PIN_48, L0_SEL, 1, 2)
393
+REG32(MIO_PIN_49, 0xc4)
394
+ FIELD(MIO_PIN_49, L3_SEL, 7, 3)
395
+ FIELD(MIO_PIN_49, L2_SEL, 5, 2)
396
+ FIELD(MIO_PIN_49, L1_SEL, 3, 2)
397
+ FIELD(MIO_PIN_49, L0_SEL, 1, 2)
398
+REG32(MIO_PIN_50, 0xc8)
399
+ FIELD(MIO_PIN_50, L3_SEL, 7, 3)
400
+ FIELD(MIO_PIN_50, L2_SEL, 5, 2)
401
+ FIELD(MIO_PIN_50, L1_SEL, 3, 2)
402
+ FIELD(MIO_PIN_50, L0_SEL, 1, 2)
403
+REG32(MIO_PIN_51, 0xcc)
404
+ FIELD(MIO_PIN_51, L3_SEL, 7, 3)
405
+ FIELD(MIO_PIN_51, L2_SEL, 5, 2)
406
+ FIELD(MIO_PIN_51, L1_SEL, 3, 2)
407
+ FIELD(MIO_PIN_51, L0_SEL, 1, 2)
408
+REG32(BNK0_EN_RX, 0x100)
409
+ FIELD(BNK0_EN_RX, BNK0_EN_RX, 0, 26)
410
+REG32(BNK0_SEL_RX0, 0x104)
411
+REG32(BNK0_SEL_RX1, 0x108)
412
+ FIELD(BNK0_SEL_RX1, BNK0_SEL_RX, 0, 20)
413
+REG32(BNK0_EN_RX_SCHMITT_HYST, 0x10c)
414
+ FIELD(BNK0_EN_RX_SCHMITT_HYST, BNK0_EN_RX_SCHMITT_HYST, 0, 26)
415
+REG32(BNK0_EN_WK_PD, 0x110)
416
+ FIELD(BNK0_EN_WK_PD, BNK0_EN_WK_PD, 0, 26)
417
+REG32(BNK0_EN_WK_PU, 0x114)
418
+ FIELD(BNK0_EN_WK_PU, BNK0_EN_WK_PU, 0, 26)
419
+REG32(BNK0_SEL_DRV0, 0x118)
420
+REG32(BNK0_SEL_DRV1, 0x11c)
421
+ FIELD(BNK0_SEL_DRV1, BNK0_SEL_DRV, 0, 20)
422
+REG32(BNK0_SEL_SLEW, 0x120)
423
+ FIELD(BNK0_SEL_SLEW, BNK0_SEL_SLEW, 0, 26)
424
+REG32(BNK0_EN_DFT_OPT_INV, 0x124)
425
+ FIELD(BNK0_EN_DFT_OPT_INV, BNK0_EN_DFT_OPT_INV, 0, 26)
426
+REG32(BNK0_EN_PAD2PAD_LOOPBACK, 0x128)
427
+ FIELD(BNK0_EN_PAD2PAD_LOOPBACK, BNK0_EN_PAD2PAD_LOOPBACK, 0, 13)
428
+REG32(BNK0_RX_SPARE0, 0x12c)
429
+REG32(BNK0_RX_SPARE1, 0x130)
430
+ FIELD(BNK0_RX_SPARE1, BNK0_RX_SPARE, 0, 20)
431
+REG32(BNK0_TX_SPARE0, 0x134)
432
+REG32(BNK0_TX_SPARE1, 0x138)
433
+ FIELD(BNK0_TX_SPARE1, BNK0_TX_SPARE, 0, 20)
434
+REG32(BNK0_SEL_EN1P8, 0x13c)
435
+ FIELD(BNK0_SEL_EN1P8, BNK0_SEL_EN1P8, 0, 1)
436
+REG32(BNK0_EN_B_POR_DETECT, 0x140)
437
+ FIELD(BNK0_EN_B_POR_DETECT, BNK0_EN_B_POR_DETECT, 0, 1)
438
+REG32(BNK0_LPF_BYP_POR_DETECT, 0x144)
439
+ FIELD(BNK0_LPF_BYP_POR_DETECT, BNK0_LPF_BYP_POR_DETECT, 0, 1)
440
+REG32(BNK0_EN_LATCH, 0x148)
441
+ FIELD(BNK0_EN_LATCH, BNK0_EN_LATCH, 0, 1)
442
+REG32(BNK0_VBG_LPF_BYP_B, 0x14c)
443
+ FIELD(BNK0_VBG_LPF_BYP_B, BNK0_VBG_LPF_BYP_B, 0, 1)
444
+REG32(BNK0_EN_AMP_B, 0x150)
445
+ FIELD(BNK0_EN_AMP_B, BNK0_EN_AMP_B, 0, 2)
446
+REG32(BNK0_SPARE_BIAS, 0x154)
447
+ FIELD(BNK0_SPARE_BIAS, BNK0_SPARE_BIAS, 0, 4)
448
+REG32(BNK0_DRIVER_BIAS, 0x158)
449
+ FIELD(BNK0_DRIVER_BIAS, BNK0_DRIVER_BIAS, 0, 15)
450
+REG32(BNK0_VMODE, 0x15c)
451
+ FIELD(BNK0_VMODE, BNK0_VMODE, 0, 1)
452
+REG32(BNK0_SEL_AUX_IO_RX, 0x160)
453
+ FIELD(BNK0_SEL_AUX_IO_RX, BNK0_SEL_AUX_IO_RX, 0, 26)
454
+REG32(BNK0_EN_TX_HS_MODE, 0x164)
455
+ FIELD(BNK0_EN_TX_HS_MODE, BNK0_EN_TX_HS_MODE, 0, 26)
456
+REG32(MIO_MST_TRI0, 0x200)
457
+ FIELD(MIO_MST_TRI0, PIN_25_TRI, 25, 1)
458
+ FIELD(MIO_MST_TRI0, PIN_24_TRI, 24, 1)
459
+ FIELD(MIO_MST_TRI0, PIN_23_TRI, 23, 1)
460
+ FIELD(MIO_MST_TRI0, PIN_22_TRI, 22, 1)
461
+ FIELD(MIO_MST_TRI0, PIN_21_TRI, 21, 1)
462
+ FIELD(MIO_MST_TRI0, PIN_20_TRI, 20, 1)
463
+ FIELD(MIO_MST_TRI0, PIN_19_TRI, 19, 1)
464
+ FIELD(MIO_MST_TRI0, PIN_18_TRI, 18, 1)
465
+ FIELD(MIO_MST_TRI0, PIN_17_TRI, 17, 1)
466
+ FIELD(MIO_MST_TRI0, PIN_16_TRI, 16, 1)
467
+ FIELD(MIO_MST_TRI0, PIN_15_TRI, 15, 1)
468
+ FIELD(MIO_MST_TRI0, PIN_14_TRI, 14, 1)
469
+ FIELD(MIO_MST_TRI0, PIN_13_TRI, 13, 1)
470
+ FIELD(MIO_MST_TRI0, PIN_12_TRI, 12, 1)
471
+ FIELD(MIO_MST_TRI0, PIN_11_TRI, 11, 1)
472
+ FIELD(MIO_MST_TRI0, PIN_10_TRI, 10, 1)
473
+ FIELD(MIO_MST_TRI0, PIN_09_TRI, 9, 1)
474
+ FIELD(MIO_MST_TRI0, PIN_08_TRI, 8, 1)
475
+ FIELD(MIO_MST_TRI0, PIN_07_TRI, 7, 1)
476
+ FIELD(MIO_MST_TRI0, PIN_06_TRI, 6, 1)
477
+ FIELD(MIO_MST_TRI0, PIN_05_TRI, 5, 1)
478
+ FIELD(MIO_MST_TRI0, PIN_04_TRI, 4, 1)
479
+ FIELD(MIO_MST_TRI0, PIN_03_TRI, 3, 1)
480
+ FIELD(MIO_MST_TRI0, PIN_02_TRI, 2, 1)
481
+ FIELD(MIO_MST_TRI0, PIN_01_TRI, 1, 1)
482
+ FIELD(MIO_MST_TRI0, PIN_00_TRI, 0, 1)
483
+REG32(MIO_MST_TRI1, 0x204)
484
+ FIELD(MIO_MST_TRI1, PIN_51_TRI, 25, 1)
485
+ FIELD(MIO_MST_TRI1, PIN_50_TRI, 24, 1)
486
+ FIELD(MIO_MST_TRI1, PIN_49_TRI, 23, 1)
487
+ FIELD(MIO_MST_TRI1, PIN_48_TRI, 22, 1)
488
+ FIELD(MIO_MST_TRI1, PIN_47_TRI, 21, 1)
489
+ FIELD(MIO_MST_TRI1, PIN_46_TRI, 20, 1)
490
+ FIELD(MIO_MST_TRI1, PIN_45_TRI, 19, 1)
491
+ FIELD(MIO_MST_TRI1, PIN_44_TRI, 18, 1)
492
+ FIELD(MIO_MST_TRI1, PIN_43_TRI, 17, 1)
493
+ FIELD(MIO_MST_TRI1, PIN_42_TRI, 16, 1)
494
+ FIELD(MIO_MST_TRI1, PIN_41_TRI, 15, 1)
495
+ FIELD(MIO_MST_TRI1, PIN_40_TRI, 14, 1)
496
+ FIELD(MIO_MST_TRI1, PIN_39_TRI, 13, 1)
497
+ FIELD(MIO_MST_TRI1, PIN_38_TRI, 12, 1)
498
+ FIELD(MIO_MST_TRI1, PIN_37_TRI, 11, 1)
499
+ FIELD(MIO_MST_TRI1, PIN_36_TRI, 10, 1)
500
+ FIELD(MIO_MST_TRI1, PIN_35_TRI, 9, 1)
501
+ FIELD(MIO_MST_TRI1, PIN_34_TRI, 8, 1)
502
+ FIELD(MIO_MST_TRI1, PIN_33_TRI, 7, 1)
503
+ FIELD(MIO_MST_TRI1, PIN_32_TRI, 6, 1)
504
+ FIELD(MIO_MST_TRI1, PIN_31_TRI, 5, 1)
505
+ FIELD(MIO_MST_TRI1, PIN_30_TRI, 4, 1)
506
+ FIELD(MIO_MST_TRI1, PIN_29_TRI, 3, 1)
507
+ FIELD(MIO_MST_TRI1, PIN_28_TRI, 2, 1)
508
+ FIELD(MIO_MST_TRI1, PIN_27_TRI, 1, 1)
509
+ FIELD(MIO_MST_TRI1, PIN_26_TRI, 0, 1)
510
+REG32(BNK1_EN_RX, 0x300)
511
+ FIELD(BNK1_EN_RX, BNK1_EN_RX, 0, 26)
512
+REG32(BNK1_SEL_RX0, 0x304)
513
+REG32(BNK1_SEL_RX1, 0x308)
514
+ FIELD(BNK1_SEL_RX1, BNK1_SEL_RX, 0, 20)
515
+REG32(BNK1_EN_RX_SCHMITT_HYST, 0x30c)
516
+ FIELD(BNK1_EN_RX_SCHMITT_HYST, BNK1_EN_RX_SCHMITT_HYST, 0, 26)
517
+REG32(BNK1_EN_WK_PD, 0x310)
518
+ FIELD(BNK1_EN_WK_PD, BNK1_EN_WK_PD, 0, 26)
519
+REG32(BNK1_EN_WK_PU, 0x314)
520
+ FIELD(BNK1_EN_WK_PU, BNK1_EN_WK_PU, 0, 26)
521
+REG32(BNK1_SEL_DRV0, 0x318)
522
+REG32(BNK1_SEL_DRV1, 0x31c)
523
+ FIELD(BNK1_SEL_DRV1, BNK1_SEL_DRV, 0, 20)
524
+REG32(BNK1_SEL_SLEW, 0x320)
525
+ FIELD(BNK1_SEL_SLEW, BNK1_SEL_SLEW, 0, 26)
526
+REG32(BNK1_EN_DFT_OPT_INV, 0x324)
527
+ FIELD(BNK1_EN_DFT_OPT_INV, BNK1_EN_DFT_OPT_INV, 0, 26)
528
+REG32(BNK1_EN_PAD2PAD_LOOPBACK, 0x328)
529
+ FIELD(BNK1_EN_PAD2PAD_LOOPBACK, BNK1_EN_PAD2PAD_LOOPBACK, 0, 13)
530
+REG32(BNK1_RX_SPARE0, 0x32c)
531
+REG32(BNK1_RX_SPARE1, 0x330)
532
+ FIELD(BNK1_RX_SPARE1, BNK1_RX_SPARE, 0, 20)
533
+REG32(BNK1_TX_SPARE0, 0x334)
534
+REG32(BNK1_TX_SPARE1, 0x338)
535
+ FIELD(BNK1_TX_SPARE1, BNK1_TX_SPARE, 0, 20)
536
+REG32(BNK1_SEL_EN1P8, 0x33c)
537
+ FIELD(BNK1_SEL_EN1P8, BNK1_SEL_EN1P8, 0, 1)
538
+REG32(BNK1_EN_B_POR_DETECT, 0x340)
539
+ FIELD(BNK1_EN_B_POR_DETECT, BNK1_EN_B_POR_DETECT, 0, 1)
540
+REG32(BNK1_LPF_BYP_POR_DETECT, 0x344)
541
+ FIELD(BNK1_LPF_BYP_POR_DETECT, BNK1_LPF_BYP_POR_DETECT, 0, 1)
542
+REG32(BNK1_EN_LATCH, 0x348)
543
+ FIELD(BNK1_EN_LATCH, BNK1_EN_LATCH, 0, 1)
544
+REG32(BNK1_VBG_LPF_BYP_B, 0x34c)
545
+ FIELD(BNK1_VBG_LPF_BYP_B, BNK1_VBG_LPF_BYP_B, 0, 1)
546
+REG32(BNK1_EN_AMP_B, 0x350)
547
+ FIELD(BNK1_EN_AMP_B, BNK1_EN_AMP_B, 0, 2)
548
+REG32(BNK1_SPARE_BIAS, 0x354)
549
+ FIELD(BNK1_SPARE_BIAS, BNK1_SPARE_BIAS, 0, 4)
550
+REG32(BNK1_DRIVER_BIAS, 0x358)
551
+ FIELD(BNK1_DRIVER_BIAS, BNK1_DRIVER_BIAS, 0, 15)
552
+REG32(BNK1_VMODE, 0x35c)
553
+ FIELD(BNK1_VMODE, BNK1_VMODE, 0, 1)
554
+REG32(BNK1_SEL_AUX_IO_RX, 0x360)
555
+ FIELD(BNK1_SEL_AUX_IO_RX, BNK1_SEL_AUX_IO_RX, 0, 26)
556
+REG32(BNK1_EN_TX_HS_MODE, 0x364)
557
+ FIELD(BNK1_EN_TX_HS_MODE, BNK1_EN_TX_HS_MODE, 0, 26)
558
+REG32(SD0_CLK_CTRL, 0x400)
559
+ FIELD(SD0_CLK_CTRL, SDIO0_FBCLK_SEL, 2, 1)
560
+ FIELD(SD0_CLK_CTRL, SDIO0_RX_SRC_SEL, 0, 2)
561
+REG32(SD0_CTRL_REG, 0x404)
562
+ FIELD(SD0_CTRL_REG, SD0_EMMC_SEL, 0, 1)
563
+REG32(SD0_CONFIG_REG1, 0x410)
564
+ FIELD(SD0_CONFIG_REG1, SD0_BASECLK, 7, 8)
565
+ FIELD(SD0_CONFIG_REG1, SD0_TUNIGCOUNT, 1, 6)
566
+ FIELD(SD0_CONFIG_REG1, SD0_ASYNCWKPENA, 0, 1)
567
+REG32(SD0_CONFIG_REG2, 0x414)
568
+ FIELD(SD0_CONFIG_REG2, SD0_SLOTTYPE, 12, 2)
569
+ FIELD(SD0_CONFIG_REG2, SD0_ASYCINTR, 11, 1)
570
+ FIELD(SD0_CONFIG_REG2, SD0_64BIT, 10, 1)
571
+ FIELD(SD0_CONFIG_REG2, SD0_1P8V, 9, 1)
572
+ FIELD(SD0_CONFIG_REG2, SD0_3P0V, 8, 1)
573
+ FIELD(SD0_CONFIG_REG2, SD0_3P3V, 7, 1)
574
+ FIELD(SD0_CONFIG_REG2, SD0_SUSPRES, 6, 1)
575
+ FIELD(SD0_CONFIG_REG2, SD0_SDMA, 5, 1)
576
+ FIELD(SD0_CONFIG_REG2, SD0_HIGHSPEED, 4, 1)
577
+ FIELD(SD0_CONFIG_REG2, SD0_ADMA2, 3, 1)
578
+ FIELD(SD0_CONFIG_REG2, SD0_8BIT, 2, 1)
579
+ FIELD(SD0_CONFIG_REG2, SD0_MAXBLK, 0, 2)
580
+REG32(SD0_CONFIG_REG3, 0x418)
581
+ FIELD(SD0_CONFIG_REG3, SD0_TUNINGSDR50, 10, 1)
582
+ FIELD(SD0_CONFIG_REG3, SD0_RETUNETMR, 6, 4)
583
+ FIELD(SD0_CONFIG_REG3, SD0_DDRIVER, 5, 1)
584
+ FIELD(SD0_CONFIG_REG3, SD0_CDRIVER, 4, 1)
585
+ FIELD(SD0_CONFIG_REG3, SD0_ADRIVER, 3, 1)
586
+ FIELD(SD0_CONFIG_REG3, SD0_DDR50, 2, 1)
587
+ FIELD(SD0_CONFIG_REG3, SD0_SDR104, 1, 1)
588
+ FIELD(SD0_CONFIG_REG3, SD0_SDR50, 0, 1)
589
+REG32(SD0_INITPRESET, 0x41c)
590
+ FIELD(SD0_INITPRESET, SD0_INITPRESET, 0, 13)
591
+REG32(SD0_DSPPRESET, 0x420)
592
+ FIELD(SD0_DSPPRESET, SD0_DSPPRESET, 0, 13)
593
+REG32(SD0_HSPDPRESET, 0x424)
594
+ FIELD(SD0_HSPDPRESET, SD0_HSPDPRESET, 0, 13)
595
+REG32(SD0_SDR12PRESET, 0x428)
596
+ FIELD(SD0_SDR12PRESET, SD0_SDR12PRESET, 0, 13)
597
+REG32(SD0_SDR25PRESET, 0x42c)
598
+ FIELD(SD0_SDR25PRESET, SD0_SDR25PRESET, 0, 13)
599
+REG32(SD0_SDR50PRSET, 0x430)
600
+ FIELD(SD0_SDR50PRSET, SD0_SDR50PRESET, 0, 13)
601
+REG32(SD0_SDR104PRST, 0x434)
602
+ FIELD(SD0_SDR104PRST, SD0_SDR104PRESET, 0, 13)
603
+REG32(SD0_DDR50PRESET, 0x438)
604
+ FIELD(SD0_DDR50PRESET, SD0_DDR50PRESET, 0, 13)
605
+REG32(SD0_MAXCUR1P8, 0x43c)
606
+ FIELD(SD0_MAXCUR1P8, SD0_MAXCUR1P8, 0, 8)
607
+REG32(SD0_MAXCUR3P0, 0x440)
608
+ FIELD(SD0_MAXCUR3P0, SD0_MAXCUR3P0, 0, 8)
609
+REG32(SD0_MAXCUR3P3, 0x444)
610
+ FIELD(SD0_MAXCUR3P3, SD0_MAXCUR3P3, 0, 8)
611
+REG32(SD0_DLL_CTRL, 0x448)
612
+ FIELD(SD0_DLL_CTRL, SD0_CLKSTABLE_CFG, 9, 1)
613
+ FIELD(SD0_DLL_CTRL, SD0_DLL_CFG, 5, 4)
614
+ FIELD(SD0_DLL_CTRL, SD0_DLL_PSDONE, 4, 1)
615
+ FIELD(SD0_DLL_CTRL, SD0_DLL_OVF, 3, 1)
616
+ FIELD(SD0_DLL_CTRL, SD0_DLL_RST, 2, 1)
617
+ FIELD(SD0_DLL_CTRL, SD0_DLL_TESTMODE, 1, 1)
618
+ FIELD(SD0_DLL_CTRL, SD0_DLL_LOCK, 0, 1)
619
+REG32(SD0_CDN_CTRL, 0x44c)
620
+ FIELD(SD0_CDN_CTRL, SD0_CDN_CTRL, 0, 1)
621
+REG32(SD0_DLL_TEST, 0x450)
622
+ FIELD(SD0_DLL_TEST, DLL_DIV, 16, 8)
623
+ FIELD(SD0_DLL_TEST, DLL_TX_SEL, 9, 7)
624
+ FIELD(SD0_DLL_TEST, DLL_RX_SEL, 0, 9)
625
+REG32(SD0_RX_TUNING_SEL, 0x454)
626
+ FIELD(SD0_RX_TUNING_SEL, SD0_RX_SEL, 0, 9)
627
+REG32(SD0_DLL_DIV_MAP0, 0x458)
628
+ FIELD(SD0_DLL_DIV_MAP0, DIV_3, 24, 8)
629
+ FIELD(SD0_DLL_DIV_MAP0, DIV_2, 16, 8)
630
+ FIELD(SD0_DLL_DIV_MAP0, DIV_1, 8, 8)
631
+ FIELD(SD0_DLL_DIV_MAP0, DIV_0, 0, 8)
632
+REG32(SD0_DLL_DIV_MAP1, 0x45c)
633
+ FIELD(SD0_DLL_DIV_MAP1, DIV_7, 24, 8)
634
+ FIELD(SD0_DLL_DIV_MAP1, DIV_6, 16, 8)
635
+ FIELD(SD0_DLL_DIV_MAP1, DIV_5, 8, 8)
636
+ FIELD(SD0_DLL_DIV_MAP1, DIV_4, 0, 8)
637
+REG32(SD0_IOU_COHERENT_CTRL, 0x460)
638
+ FIELD(SD0_IOU_COHERENT_CTRL, SD0_AXI_COH, 0, 4)
639
+REG32(SD0_IOU_INTERCONNECT_ROUTE, 0x464)
640
+ FIELD(SD0_IOU_INTERCONNECT_ROUTE, SD0, 0, 1)
641
+REG32(SD0_IOU_RAM, 0x468)
642
+ FIELD(SD0_IOU_RAM, EMASA0, 6, 1)
643
+ FIELD(SD0_IOU_RAM, EMAB0, 3, 3)
644
+ FIELD(SD0_IOU_RAM, EMAA0, 0, 3)
645
+REG32(SD0_IOU_INTERCONNECT_QOS, 0x46c)
646
+ FIELD(SD0_IOU_INTERCONNECT_QOS, SD0_QOS, 0, 4)
647
+REG32(SD1_CLK_CTRL, 0x480)
648
+ FIELD(SD1_CLK_CTRL, SDIO1_FBCLK_SEL, 1, 1)
649
+ FIELD(SD1_CLK_CTRL, SDIO1_RX_SRC_SEL, 0, 1)
650
+REG32(SD1_CTRL_REG, 0x484)
651
+ FIELD(SD1_CTRL_REG, SD1_EMMC_SEL, 0, 1)
652
+REG32(SD1_CONFIG_REG1, 0x490)
653
+ FIELD(SD1_CONFIG_REG1, SD1_BASECLK, 7, 8)
654
+ FIELD(SD1_CONFIG_REG1, SD1_TUNIGCOUNT, 1, 6)
655
+ FIELD(SD1_CONFIG_REG1, SD1_ASYNCWKPENA, 0, 1)
656
+REG32(SD1_CONFIG_REG2, 0x494)
657
+ FIELD(SD1_CONFIG_REG2, SD1_SLOTTYPE, 12, 2)
658
+ FIELD(SD1_CONFIG_REG2, SD1_ASYCINTR, 11, 1)
659
+ FIELD(SD1_CONFIG_REG2, SD1_64BIT, 10, 1)
660
+ FIELD(SD1_CONFIG_REG2, SD1_1P8V, 9, 1)
661
+ FIELD(SD1_CONFIG_REG2, SD1_3P0V, 8, 1)
662
+ FIELD(SD1_CONFIG_REG2, SD1_3P3V, 7, 1)
663
+ FIELD(SD1_CONFIG_REG2, SD1_SUSPRES, 6, 1)
664
+ FIELD(SD1_CONFIG_REG2, SD1_SDMA, 5, 1)
665
+ FIELD(SD1_CONFIG_REG2, SD1_HIGHSPEED, 4, 1)
666
+ FIELD(SD1_CONFIG_REG2, SD1_ADMA2, 3, 1)
667
+ FIELD(SD1_CONFIG_REG2, SD1_8BIT, 2, 1)
668
+ FIELD(SD1_CONFIG_REG2, SD1_MAXBLK, 0, 2)
669
+REG32(SD1_CONFIG_REG3, 0x498)
670
+ FIELD(SD1_CONFIG_REG3, SD1_TUNINGSDR50, 10, 1)
671
+ FIELD(SD1_CONFIG_REG3, SD1_RETUNETMR, 6, 4)
672
+ FIELD(SD1_CONFIG_REG3, SD1_DDRIVER, 5, 1)
673
+ FIELD(SD1_CONFIG_REG3, SD1_CDRIVER, 4, 1)
674
+ FIELD(SD1_CONFIG_REG3, SD1_ADRIVER, 3, 1)
675
+ FIELD(SD1_CONFIG_REG3, SD1_DDR50, 2, 1)
676
+ FIELD(SD1_CONFIG_REG3, SD1_SDR104, 1, 1)
677
+ FIELD(SD1_CONFIG_REG3, SD1_SDR50, 0, 1)
678
+REG32(SD1_INITPRESET, 0x49c)
679
+ FIELD(SD1_INITPRESET, SD1_INITPRESET, 0, 13)
680
+REG32(SD1_DSPPRESET, 0x4a0)
681
+ FIELD(SD1_DSPPRESET, SD1_DSPPRESET, 0, 13)
682
+REG32(SD1_HSPDPRESET, 0x4a4)
683
+ FIELD(SD1_HSPDPRESET, SD1_HSPDPRESET, 0, 13)
684
+REG32(SD1_SDR12PRESET, 0x4a8)
685
+ FIELD(SD1_SDR12PRESET, SD1_SDR12PRESET, 0, 13)
686
+REG32(SD1_SDR25PRESET, 0x4ac)
687
+ FIELD(SD1_SDR25PRESET, SD1_SDR25PRESET, 0, 13)
688
+REG32(SD1_SDR50PRSET, 0x4b0)
689
+ FIELD(SD1_SDR50PRSET, SD1_SDR50PRESET, 0, 13)
690
+REG32(SD1_SDR104PRST, 0x4b4)
691
+ FIELD(SD1_SDR104PRST, SD1_SDR104PRESET, 0, 13)
692
+REG32(SD1_DDR50PRESET, 0x4b8)
693
+ FIELD(SD1_DDR50PRESET, SD1_DDR50PRESET, 0, 13)
694
+REG32(SD1_MAXCUR1P8, 0x4bc)
695
+ FIELD(SD1_MAXCUR1P8, SD1_MAXCUR1P8, 0, 8)
696
+REG32(SD1_MAXCUR3P0, 0x4c0)
697
+ FIELD(SD1_MAXCUR3P0, SD1_MAXCUR3P0, 0, 8)
698
+REG32(SD1_MAXCUR3P3, 0x4c4)
699
+ FIELD(SD1_MAXCUR3P3, SD1_MAXCUR3P3, 0, 8)
700
+REG32(SD1_DLL_CTRL, 0x4c8)
701
+ FIELD(SD1_DLL_CTRL, SD1_CLKSTABLE_CFG, 9, 1)
702
+ FIELD(SD1_DLL_CTRL, SD1_DLL_CFG, 5, 4)
703
+ FIELD(SD1_DLL_CTRL, SD1_DLL_PSDONE, 4, 1)
704
+ FIELD(SD1_DLL_CTRL, SD1_DLL_OVF, 3, 1)
705
+ FIELD(SD1_DLL_CTRL, SD1_DLL_RST, 2, 1)
706
+ FIELD(SD1_DLL_CTRL, SD1_DLL_TESTMODE, 1, 1)
707
+ FIELD(SD1_DLL_CTRL, SD1_DLL_LOCK, 0, 1)
708
+REG32(SD1_CDN_CTRL, 0x4cc)
709
+ FIELD(SD1_CDN_CTRL, SD1_CDN_CTRL, 0, 1)
710
+REG32(SD1_DLL_TEST, 0x4d0)
711
+ FIELD(SD1_DLL_TEST, DLL_DIV, 16, 8)
712
+ FIELD(SD1_DLL_TEST, DLL_TX_SEL, 9, 7)
713
+ FIELD(SD1_DLL_TEST, DLL_RX_SEL, 0, 9)
714
+REG32(SD1_RX_TUNING_SEL, 0x4d4)
715
+ FIELD(SD1_RX_TUNING_SEL, SD1_RX_SEL, 0, 9)
716
+REG32(SD1_DLL_DIV_MAP0, 0x4d8)
717
+ FIELD(SD1_DLL_DIV_MAP0, DIV_3, 24, 8)
718
+ FIELD(SD1_DLL_DIV_MAP0, DIV_2, 16, 8)
719
+ FIELD(SD1_DLL_DIV_MAP0, DIV_1, 8, 8)
720
+ FIELD(SD1_DLL_DIV_MAP0, DIV_0, 0, 8)
721
+REG32(SD1_DLL_DIV_MAP1, 0x4dc)
722
+ FIELD(SD1_DLL_DIV_MAP1, DIV_7, 24, 8)
723
+ FIELD(SD1_DLL_DIV_MAP1, DIV_6, 16, 8)
724
+ FIELD(SD1_DLL_DIV_MAP1, DIV_5, 8, 8)
725
+ FIELD(SD1_DLL_DIV_MAP1, DIV_4, 0, 8)
726
+REG32(SD1_IOU_COHERENT_CTRL, 0x4e0)
727
+ FIELD(SD1_IOU_COHERENT_CTRL, SD1_AXI_COH, 0, 4)
728
+REG32(SD1_IOU_INTERCONNECT_ROUTE, 0x4e4)
729
+ FIELD(SD1_IOU_INTERCONNECT_ROUTE, SD1, 0, 1)
730
+REG32(SD1_IOU_RAM, 0x4e8)
731
+ FIELD(SD1_IOU_RAM, EMASA0, 6, 1)
732
+ FIELD(SD1_IOU_RAM, EMAB0, 3, 3)
733
+ FIELD(SD1_IOU_RAM, EMAA0, 0, 3)
734
+REG32(SD1_IOU_INTERCONNECT_QOS, 0x4ec)
735
+ FIELD(SD1_IOU_INTERCONNECT_QOS, SD1_QOS, 0, 4)
736
+REG32(OSPI_QSPI_IOU_AXI_MUX_SEL, 0x504)
737
+ FIELD(OSPI_QSPI_IOU_AXI_MUX_SEL, OSPI_MUX_SEL, 1, 1)
738
+ FIELD(OSPI_QSPI_IOU_AXI_MUX_SEL, QSPI_OSPI_MUX_SEL, 0, 1)
739
+REG32(QSPI_IOU_COHERENT_CTRL, 0x508)
740
+ FIELD(QSPI_IOU_COHERENT_CTRL, QSPI_AXI_COH, 0, 4)
741
+REG32(QSPI_IOU_INTERCONNECT_ROUTE, 0x50c)
742
+ FIELD(QSPI_IOU_INTERCONNECT_ROUTE, QSPI, 0, 1)
743
+REG32(QSPI_IOU_RAM, 0x510)
744
+ FIELD(QSPI_IOU_RAM, EMASA1, 13, 1)
745
+ FIELD(QSPI_IOU_RAM, EMAB1, 10, 3)
746
+ FIELD(QSPI_IOU_RAM, EMAA1, 7, 3)
747
+ FIELD(QSPI_IOU_RAM, EMASA0, 6, 1)
748
+ FIELD(QSPI_IOU_RAM, EMAB0, 3, 3)
749
+ FIELD(QSPI_IOU_RAM, EMAA0, 0, 3)
750
+REG32(QSPI_IOU_INTERCONNECT_QOS, 0x514)
751
+ FIELD(QSPI_IOU_INTERCONNECT_QOS, QSPI_QOS, 0, 4)
752
+REG32(OSPI_IOU_COHERENT_CTRL, 0x530)
753
+ FIELD(OSPI_IOU_COHERENT_CTRL, OSPI_AXI_COH, 0, 4)
754
+REG32(OSPI_IOU_INTERCONNECT_ROUTE, 0x534)
755
+ FIELD(OSPI_IOU_INTERCONNECT_ROUTE, OSPI, 0, 1)
756
+REG32(OSPI_IOU_RAM, 0x538)
757
+ FIELD(OSPI_IOU_RAM, EMAS0, 5, 1)
758
+ FIELD(OSPI_IOU_RAM, EMAW0, 3, 2)
759
+ FIELD(OSPI_IOU_RAM, EMA0, 0, 3)
760
+REG32(OSPI_IOU_INTERCONNECT_QOS, 0x53c)
761
+ FIELD(OSPI_IOU_INTERCONNECT_QOS, OSPI_QOS, 0, 4)
762
+REG32(OSPI_REFCLK_DLY_CTRL, 0x540)
763
+ FIELD(OSPI_REFCLK_DLY_CTRL, DLY1, 3, 2)
764
+ FIELD(OSPI_REFCLK_DLY_CTRL, DLY0, 0, 3)
765
+REG32(CUR_PWR_ST, 0x600)
766
+ FIELD(CUR_PWR_ST, U2PMU, 0, 2)
767
+REG32(CONNECT_ST, 0x604)
768
+ FIELD(CONNECT_ST, U2PMU, 0, 1)
769
+REG32(PW_STATE_REQ, 0x608)
770
+ FIELD(PW_STATE_REQ, BIT_1_0, 0, 2)
771
+REG32(HOST_U2_PORT_DISABLE, 0x60c)
772
+ FIELD(HOST_U2_PORT_DISABLE, BIT_0, 0, 1)
773
+REG32(DBG_U2PMU, 0x610)
774
+REG32(DBG_U2PMU_EXT1, 0x614)
775
+REG32(DBG_U2PMU_EXT2, 0x618)
776
+ FIELD(DBG_U2PMU_EXT2, BIT_67_64, 0, 4)
777
+REG32(PME_GEN_U2PMU, 0x61c)
778
+ FIELD(PME_GEN_U2PMU, BIT_0, 0, 1)
779
+REG32(PWR_CONFIG_USB2, 0x620)
780
+ FIELD(PWR_CONFIG_USB2, STRAP, 0, 30)
781
+REG32(PHY_HUB, 0x624)
782
+ FIELD(PHY_HUB, VBUS_CTRL, 1, 1)
783
+ FIELD(PHY_HUB, OVER_CURRENT, 0, 1)
784
+REG32(CTRL, 0x700)
785
+ FIELD(CTRL, SLVERR_ENABLE, 0, 1)
786
+REG32(ISR, 0x800)
787
+ FIELD(ISR, ADDR_DECODE_ERR, 0, 1)
788
+REG32(IMR, 0x804)
789
+ FIELD(IMR, ADDR_DECODE_ERR, 0, 1)
790
+REG32(IER, 0x808)
791
+ FIELD(IER, ADDR_DECODE_ERR, 0, 1)
792
+REG32(IDR, 0x80c)
793
+ FIELD(IDR, ADDR_DECODE_ERR, 0, 1)
794
+REG32(ITR, 0x810)
795
+ FIELD(ITR, ADDR_DECODE_ERR, 0, 1)
796
+REG32(PARITY_ISR, 0x814)
797
+ FIELD(PARITY_ISR, PERR_AXI_SD1_IOU, 12, 1)
798
+ FIELD(PARITY_ISR, PERR_AXI_SD0_IOU, 11, 1)
799
+ FIELD(PARITY_ISR, PERR_AXI_QSPI_IOU, 10, 1)
800
+ FIELD(PARITY_ISR, PERR_AXI_OSPI_IOU, 9, 1)
801
+ FIELD(PARITY_ISR, PERR_IOU_SD1, 8, 1)
802
+ FIELD(PARITY_ISR, PERR_IOU_SD0, 7, 1)
803
+ FIELD(PARITY_ISR, PERR_IOU_QSPI1, 6, 1)
804
+ FIELD(PARITY_ISR, PERR_IOUSLCR_SECURE_APB, 5, 1)
805
+ FIELD(PARITY_ISR, PERR_IOUSLCR_APB, 4, 1)
806
+ FIELD(PARITY_ISR, PERR_QSPI0_APB, 3, 1)
807
+ FIELD(PARITY_ISR, PERR_OSPI_APB, 2, 1)
808
+ FIELD(PARITY_ISR, PERR_I2C_APB, 1, 1)
809
+ FIELD(PARITY_ISR, PERR_GPIO_APB, 0, 1)
810
+REG32(PARITY_IMR, 0x818)
811
+ FIELD(PARITY_IMR, PERR_AXI_SD1_IOU, 12, 1)
812
+ FIELD(PARITY_IMR, PERR_AXI_SD0_IOU, 11, 1)
813
+ FIELD(PARITY_IMR, PERR_AXI_QSPI_IOU, 10, 1)
814
+ FIELD(PARITY_IMR, PERR_AXI_OSPI_IOU, 9, 1)
815
+ FIELD(PARITY_IMR, PERR_IOU_SD1, 8, 1)
816
+ FIELD(PARITY_IMR, PERR_IOU_SD0, 7, 1)
817
+ FIELD(PARITY_IMR, PERR_IOU_QSPI1, 6, 1)
818
+ FIELD(PARITY_IMR, PERR_IOUSLCR_SECURE_APB, 5, 1)
819
+ FIELD(PARITY_IMR, PERR_IOUSLCR_APB, 4, 1)
820
+ FIELD(PARITY_IMR, PERR_QSPI0_APB, 3, 1)
821
+ FIELD(PARITY_IMR, PERR_OSPI_APB, 2, 1)
822
+ FIELD(PARITY_IMR, PERR_I2C_APB, 1, 1)
823
+ FIELD(PARITY_IMR, PERR_GPIO_APB, 0, 1)
824
+REG32(PARITY_IER, 0x81c)
825
+ FIELD(PARITY_IER, PERR_AXI_SD1_IOU, 12, 1)
826
+ FIELD(PARITY_IER, PERR_AXI_SD0_IOU, 11, 1)
827
+ FIELD(PARITY_IER, PERR_AXI_QSPI_IOU, 10, 1)
828
+ FIELD(PARITY_IER, PERR_AXI_OSPI_IOU, 9, 1)
829
+ FIELD(PARITY_IER, PERR_IOU_SD1, 8, 1)
830
+ FIELD(PARITY_IER, PERR_IOU_SD0, 7, 1)
831
+ FIELD(PARITY_IER, PERR_IOU_QSPI1, 6, 1)
832
+ FIELD(PARITY_IER, PERR_IOUSLCR_SECURE_APB, 5, 1)
833
+ FIELD(PARITY_IER, PERR_IOUSLCR_APB, 4, 1)
834
+ FIELD(PARITY_IER, PERR_QSPI0_APB, 3, 1)
835
+ FIELD(PARITY_IER, PERR_OSPI_APB, 2, 1)
836
+ FIELD(PARITY_IER, PERR_I2C_APB, 1, 1)
837
+ FIELD(PARITY_IER, PERR_GPIO_APB, 0, 1)
838
+REG32(PARITY_IDR, 0x820)
839
+ FIELD(PARITY_IDR, PERR_AXI_SD1_IOU, 12, 1)
840
+ FIELD(PARITY_IDR, PERR_AXI_SD0_IOU, 11, 1)
841
+ FIELD(PARITY_IDR, PERR_AXI_QSPI_IOU, 10, 1)
842
+ FIELD(PARITY_IDR, PERR_AXI_OSPI_IOU, 9, 1)
843
+ FIELD(PARITY_IDR, PERR_IOU_SD1, 8, 1)
844
+ FIELD(PARITY_IDR, PERR_IOU_SD0, 7, 1)
845
+ FIELD(PARITY_IDR, PERR_IOU_QSPI1, 6, 1)
846
+ FIELD(PARITY_IDR, PERR_IOUSLCR_SECURE_APB, 5, 1)
847
+ FIELD(PARITY_IDR, PERR_IOUSLCR_APB, 4, 1)
848
+ FIELD(PARITY_IDR, PERR_QSPI0_APB, 3, 1)
849
+ FIELD(PARITY_IDR, PERR_OSPI_APB, 2, 1)
850
+ FIELD(PARITY_IDR, PERR_I2C_APB, 1, 1)
851
+ FIELD(PARITY_IDR, PERR_GPIO_APB, 0, 1)
852
+REG32(PARITY_ITR, 0x824)
853
+ FIELD(PARITY_ITR, PERR_AXI_SD1_IOU, 12, 1)
854
+ FIELD(PARITY_ITR, PERR_AXI_SD0_IOU, 11, 1)
855
+ FIELD(PARITY_ITR, PERR_AXI_QSPI_IOU, 10, 1)
856
+ FIELD(PARITY_ITR, PERR_AXI_OSPI_IOU, 9, 1)
857
+ FIELD(PARITY_ITR, PERR_IOU_SD1, 8, 1)
858
+ FIELD(PARITY_ITR, PERR_IOU_SD0, 7, 1)
859
+ FIELD(PARITY_ITR, PERR_IOU_QSPI1, 6, 1)
860
+ FIELD(PARITY_ITR, PERR_IOUSLCR_SECURE_APB, 5, 1)
861
+ FIELD(PARITY_ITR, PERR_IOUSLCR_APB, 4, 1)
862
+ FIELD(PARITY_ITR, PERR_QSPI0_APB, 3, 1)
863
+ FIELD(PARITY_ITR, PERR_OSPI_APB, 2, 1)
864
+ FIELD(PARITY_ITR, PERR_I2C_APB, 1, 1)
865
+ FIELD(PARITY_ITR, PERR_GPIO_APB, 0, 1)
866
+REG32(WPROT0, 0x828)
867
+ FIELD(WPROT0, ACTIVE, 0, 1)
868
+
869
+static void parity_imr_update_irq(XlnxVersalPmcIouSlcr *s)
870
+{
871
+ bool pending = s->regs[R_PARITY_ISR] & ~s->regs[R_PARITY_IMR];
872
+ qemu_set_irq(s->irq_parity_imr, pending);
873
+}
874
+
875
+static void parity_isr_postw(RegisterInfo *reg, uint64_t val64)
876
+{
877
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
878
+ parity_imr_update_irq(s);
879
+}
880
+
881
+static uint64_t parity_ier_prew(RegisterInfo *reg, uint64_t val64)
882
+{
883
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
884
+ uint32_t val = val64;
885
+
886
+ s->regs[R_PARITY_IMR] &= ~val;
887
+ parity_imr_update_irq(s);
888
+ return 0;
889
+}
890
+
891
+static uint64_t parity_idr_prew(RegisterInfo *reg, uint64_t val64)
892
+{
893
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
894
+ uint32_t val = val64;
895
+
896
+ s->regs[R_PARITY_IMR] |= val;
897
+ parity_imr_update_irq(s);
898
+ return 0;
899
+}
900
+
901
+static uint64_t parity_itr_prew(RegisterInfo *reg, uint64_t val64)
902
+{
903
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
904
+ uint32_t val = val64;
905
+
906
+ s->regs[R_PARITY_ISR] |= val;
907
+ parity_imr_update_irq(s);
908
+ return 0;
909
+}
910
+
911
+static void imr_update_irq(XlnxVersalPmcIouSlcr *s)
912
+{
913
+ bool pending = s->regs[R_ISR] & ~s->regs[R_IMR];
914
+ qemu_set_irq(s->irq_imr, pending);
915
+}
916
+
917
+static void isr_postw(RegisterInfo *reg, uint64_t val64)
918
+{
919
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
920
+ imr_update_irq(s);
921
+}
922
+
923
+static uint64_t ier_prew(RegisterInfo *reg, uint64_t val64)
924
+{
925
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
926
+ uint32_t val = val64;
927
+
928
+ s->regs[R_IMR] &= ~val;
929
+ imr_update_irq(s);
930
+ return 0;
931
+}
932
+
933
+static uint64_t idr_prew(RegisterInfo *reg, uint64_t val64)
934
+{
935
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
936
+ uint32_t val = val64;
937
+
938
+ s->regs[R_IMR] |= val;
939
+ imr_update_irq(s);
940
+ return 0;
941
+}
942
+
943
+static uint64_t itr_prew(RegisterInfo *reg, uint64_t val64)
944
+{
945
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
946
+ uint32_t val = val64;
947
+
948
+ s->regs[R_ISR] |= val;
949
+ imr_update_irq(s);
950
+ return 0;
951
+}
952
+
953
+static uint64_t sd0_ctrl_reg_prew(RegisterInfo *reg, uint64_t val64)
954
+{
955
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
956
+ uint32_t prev = ARRAY_FIELD_EX32(s->regs, SD0_CTRL_REG, SD0_EMMC_SEL);
957
+
958
+ if (prev != (val64 & R_SD0_CTRL_REG_SD0_EMMC_SEL_MASK)) {
959
+ qemu_set_irq(s->sd_emmc_sel[0], !!val64);
960
+ }
961
+
962
+ return val64;
963
+}
964
+
965
+static uint64_t sd1_ctrl_reg_prew(RegisterInfo *reg, uint64_t val64)
966
+{
967
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
968
+ uint32_t prev = ARRAY_FIELD_EX32(s->regs, SD1_CTRL_REG, SD1_EMMC_SEL);
969
+
970
+ if (prev != (val64 & R_SD1_CTRL_REG_SD1_EMMC_SEL_MASK)) {
971
+ qemu_set_irq(s->sd_emmc_sel[1], !!val64);
972
+ }
973
+
974
+ return val64;
975
+}
976
+
977
+static uint64_t ospi_qspi_iou_axi_mux_sel_prew(RegisterInfo *reg,
978
+ uint64_t val64)
979
+{
980
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(reg->opaque);
981
+ uint32_t val32 = (uint32_t) val64;
982
+ uint8_t ospi_mux_sel = FIELD_EX32(val32, OSPI_QSPI_IOU_AXI_MUX_SEL,
983
+ OSPI_MUX_SEL);
984
+ uint8_t qspi_ospi_mux_sel = FIELD_EX32(val32, OSPI_QSPI_IOU_AXI_MUX_SEL,
985
+ QSPI_OSPI_MUX_SEL);
986
+
987
+ if (ospi_mux_sel !=
988
+ ARRAY_FIELD_EX32(s->regs, OSPI_QSPI_IOU_AXI_MUX_SEL, OSPI_MUX_SEL)) {
989
+ qemu_set_irq(s->ospi_mux_sel, !!ospi_mux_sel);
990
+ }
991
+
992
+ if (qspi_ospi_mux_sel !=
993
+ ARRAY_FIELD_EX32(s->regs, OSPI_QSPI_IOU_AXI_MUX_SEL,
994
+ QSPI_OSPI_MUX_SEL)) {
995
+ qemu_set_irq(s->qspi_ospi_mux_sel, !!qspi_ospi_mux_sel);
996
+ }
997
+
998
+ return val64;
999
+}
1000
+
1001
+static RegisterAccessInfo pmc_iou_slcr_regs_info[] = {
1002
+ { .name = "MIO_PIN_0", .addr = A_MIO_PIN_0,
1003
+ .rsvd = 0xfffffc01,
1004
+ },{ .name = "MIO_PIN_1", .addr = A_MIO_PIN_1,
1005
+ .rsvd = 0xfffffc01,
1006
+ },{ .name = "MIO_PIN_2", .addr = A_MIO_PIN_2,
1007
+ .rsvd = 0xfffffc01,
1008
+ },{ .name = "MIO_PIN_3", .addr = A_MIO_PIN_3,
1009
+ .rsvd = 0xfffffc01,
1010
+ },{ .name = "MIO_PIN_4", .addr = A_MIO_PIN_4,
1011
+ .rsvd = 0xfffffc01,
1012
+ },{ .name = "MIO_PIN_5", .addr = A_MIO_PIN_5,
1013
+ .rsvd = 0xfffffc01,
1014
+ },{ .name = "MIO_PIN_6", .addr = A_MIO_PIN_6,
1015
+ .rsvd = 0xfffffc01,
1016
+ },{ .name = "MIO_PIN_7", .addr = A_MIO_PIN_7,
1017
+ .rsvd = 0xfffffc01,
1018
+ },{ .name = "MIO_PIN_8", .addr = A_MIO_PIN_8,
1019
+ .rsvd = 0xfffffc01,
1020
+ },{ .name = "MIO_PIN_9", .addr = A_MIO_PIN_9,
1021
+ .rsvd = 0xfffffc01,
1022
+ },{ .name = "MIO_PIN_10", .addr = A_MIO_PIN_10,
1023
+ .rsvd = 0xfffffc01,
1024
+ },{ .name = "MIO_PIN_11", .addr = A_MIO_PIN_11,
1025
+ .rsvd = 0xfffffc01,
1026
+ },{ .name = "MIO_PIN_12", .addr = A_MIO_PIN_12,
1027
+ .rsvd = 0xfffffc01,
1028
+ },{ .name = "MIO_PIN_13", .addr = A_MIO_PIN_13,
1029
+ .rsvd = 0xfffffc01,
1030
+ },{ .name = "MIO_PIN_14", .addr = A_MIO_PIN_14,
1031
+ .rsvd = 0xfffffc01,
1032
+ },{ .name = "MIO_PIN_15", .addr = A_MIO_PIN_15,
1033
+ .rsvd = 0xfffffc01,
1034
+ },{ .name = "MIO_PIN_16", .addr = A_MIO_PIN_16,
1035
+ .rsvd = 0xfffffc01,
1036
+ },{ .name = "MIO_PIN_17", .addr = A_MIO_PIN_17,
1037
+ .rsvd = 0xfffffc01,
1038
+ },{ .name = "MIO_PIN_18", .addr = A_MIO_PIN_18,
1039
+ .rsvd = 0xfffffc01,
1040
+ },{ .name = "MIO_PIN_19", .addr = A_MIO_PIN_19,
1041
+ .rsvd = 0xfffffc01,
1042
+ },{ .name = "MIO_PIN_20", .addr = A_MIO_PIN_20,
1043
+ .rsvd = 0xfffffc01,
1044
+ },{ .name = "MIO_PIN_21", .addr = A_MIO_PIN_21,
1045
+ .rsvd = 0xfffffc01,
1046
+ },{ .name = "MIO_PIN_22", .addr = A_MIO_PIN_22,
1047
+ .rsvd = 0xfffffc01,
1048
+ },{ .name = "MIO_PIN_23", .addr = A_MIO_PIN_23,
1049
+ .rsvd = 0xfffffc01,
1050
+ },{ .name = "MIO_PIN_24", .addr = A_MIO_PIN_24,
1051
+ .rsvd = 0xfffffc01,
1052
+ },{ .name = "MIO_PIN_25", .addr = A_MIO_PIN_25,
1053
+ .rsvd = 0xfffffc01,
1054
+ },{ .name = "MIO_PIN_26", .addr = A_MIO_PIN_26,
1055
+ .rsvd = 0xfffffc01,
1056
+ },{ .name = "MIO_PIN_27", .addr = A_MIO_PIN_27,
1057
+ .rsvd = 0xfffffc01,
1058
+ },{ .name = "MIO_PIN_28", .addr = A_MIO_PIN_28,
1059
+ .rsvd = 0xfffffc01,
1060
+ },{ .name = "MIO_PIN_29", .addr = A_MIO_PIN_29,
1061
+ .rsvd = 0xfffffc01,
1062
+ },{ .name = "MIO_PIN_30", .addr = A_MIO_PIN_30,
1063
+ .rsvd = 0xfffffc01,
1064
+ },{ .name = "MIO_PIN_31", .addr = A_MIO_PIN_31,
1065
+ .rsvd = 0xfffffc01,
1066
+ },{ .name = "MIO_PIN_32", .addr = A_MIO_PIN_32,
1067
+ .rsvd = 0xfffffc01,
1068
+ },{ .name = "MIO_PIN_33", .addr = A_MIO_PIN_33,
1069
+ .rsvd = 0xfffffc01,
1070
+ },{ .name = "MIO_PIN_34", .addr = A_MIO_PIN_34,
1071
+ .rsvd = 0xfffffc01,
1072
+ },{ .name = "MIO_PIN_35", .addr = A_MIO_PIN_35,
1073
+ .rsvd = 0xfffffc01,
1074
+ },{ .name = "MIO_PIN_36", .addr = A_MIO_PIN_36,
1075
+ .rsvd = 0xfffffc01,
1076
+ },{ .name = "MIO_PIN_37", .addr = A_MIO_PIN_37,
1077
+ .rsvd = 0xfffffc01,
1078
+ },{ .name = "MIO_PIN_38", .addr = A_MIO_PIN_38,
1079
+ .rsvd = 0xfffffc01,
1080
+ },{ .name = "MIO_PIN_39", .addr = A_MIO_PIN_39,
1081
+ .rsvd = 0xfffffc01,
1082
+ },{ .name = "MIO_PIN_40", .addr = A_MIO_PIN_40,
1083
+ .rsvd = 0xfffffc01,
1084
+ },{ .name = "MIO_PIN_41", .addr = A_MIO_PIN_41,
1085
+ .rsvd = 0xfffffc01,
1086
+ },{ .name = "MIO_PIN_42", .addr = A_MIO_PIN_42,
1087
+ .rsvd = 0xfffffc01,
1088
+ },{ .name = "MIO_PIN_43", .addr = A_MIO_PIN_43,
1089
+ .rsvd = 0xfffffc01,
1090
+ },{ .name = "MIO_PIN_44", .addr = A_MIO_PIN_44,
1091
+ .rsvd = 0xfffffc01,
1092
+ },{ .name = "MIO_PIN_45", .addr = A_MIO_PIN_45,
1093
+ .rsvd = 0xfffffc01,
1094
+ },{ .name = "MIO_PIN_46", .addr = A_MIO_PIN_46,
1095
+ .rsvd = 0xfffffc01,
1096
+ },{ .name = "MIO_PIN_47", .addr = A_MIO_PIN_47,
1097
+ .rsvd = 0xfffffc01,
1098
+ },{ .name = "MIO_PIN_48", .addr = A_MIO_PIN_48,
1099
+ .rsvd = 0xfffffc01,
1100
+ },{ .name = "MIO_PIN_49", .addr = A_MIO_PIN_49,
1101
+ .rsvd = 0xfffffc01,
1102
+ },{ .name = "MIO_PIN_50", .addr = A_MIO_PIN_50,
1103
+ .rsvd = 0xfffffc01,
1104
+ },{ .name = "MIO_PIN_51", .addr = A_MIO_PIN_51,
1105
+ .rsvd = 0xfffffc01,
1106
+ },{ .name = "BNK0_EN_RX", .addr = A_BNK0_EN_RX,
1107
+ .reset = 0x3ffffff,
1108
+ .rsvd = 0xfc000000,
1109
+ },{ .name = "BNK0_SEL_RX0", .addr = A_BNK0_SEL_RX0,
1110
+ .reset = 0xffffffff,
1111
+ },{ .name = "BNK0_SEL_RX1", .addr = A_BNK0_SEL_RX1,
1112
+ .reset = 0xfffff,
1113
+ .rsvd = 0xfff00000,
1114
+ },{ .name = "BNK0_EN_RX_SCHMITT_HYST", .addr = A_BNK0_EN_RX_SCHMITT_HYST,
1115
+ .rsvd = 0xfc000000,
1116
+ },{ .name = "BNK0_EN_WK_PD", .addr = A_BNK0_EN_WK_PD,
1117
+ .rsvd = 0xfc000000,
1118
+ },{ .name = "BNK0_EN_WK_PU", .addr = A_BNK0_EN_WK_PU,
1119
+ .reset = 0x3ffffff,
1120
+ .rsvd = 0xfc000000,
1121
+ },{ .name = "BNK0_SEL_DRV0", .addr = A_BNK0_SEL_DRV0,
1122
+ .reset = 0xffffffff,
1123
+ },{ .name = "BNK0_SEL_DRV1", .addr = A_BNK0_SEL_DRV1,
1124
+ .reset = 0xfffff,
1125
+ .rsvd = 0xfff00000,
1126
+ },{ .name = "BNK0_SEL_SLEW", .addr = A_BNK0_SEL_SLEW,
1127
+ .rsvd = 0xfc000000,
1128
+ },{ .name = "BNK0_EN_DFT_OPT_INV", .addr = A_BNK0_EN_DFT_OPT_INV,
1129
+ .rsvd = 0xfc000000,
1130
+ },{ .name = "BNK0_EN_PAD2PAD_LOOPBACK",
1131
+ .addr = A_BNK0_EN_PAD2PAD_LOOPBACK,
1132
+ .rsvd = 0xffffe000,
1133
+ },{ .name = "BNK0_RX_SPARE0", .addr = A_BNK0_RX_SPARE0,
1134
+ },{ .name = "BNK0_RX_SPARE1", .addr = A_BNK0_RX_SPARE1,
1135
+ .rsvd = 0xfff00000,
1136
+ },{ .name = "BNK0_TX_SPARE0", .addr = A_BNK0_TX_SPARE0,
1137
+ },{ .name = "BNK0_TX_SPARE1", .addr = A_BNK0_TX_SPARE1,
1138
+ .rsvd = 0xfff00000,
1139
+ },{ .name = "BNK0_SEL_EN1P8", .addr = A_BNK0_SEL_EN1P8,
1140
+ .rsvd = 0xfffffffe,
1141
+ },{ .name = "BNK0_EN_B_POR_DETECT", .addr = A_BNK0_EN_B_POR_DETECT,
1142
+ .rsvd = 0xfffffffe,
1143
+ },{ .name = "BNK0_LPF_BYP_POR_DETECT", .addr = A_BNK0_LPF_BYP_POR_DETECT,
1144
+ .reset = 0x1,
1145
+ .rsvd = 0xfffffffe,
1146
+ },{ .name = "BNK0_EN_LATCH", .addr = A_BNK0_EN_LATCH,
1147
+ .rsvd = 0xfffffffe,
1148
+ },{ .name = "BNK0_VBG_LPF_BYP_B", .addr = A_BNK0_VBG_LPF_BYP_B,
1149
+ .reset = 0x1,
1150
+ .rsvd = 0xfffffffe,
1151
+ },{ .name = "BNK0_EN_AMP_B", .addr = A_BNK0_EN_AMP_B,
1152
+ .rsvd = 0xfffffffc,
1153
+ },{ .name = "BNK0_SPARE_BIAS", .addr = A_BNK0_SPARE_BIAS,
1154
+ .rsvd = 0xfffffff0,
1155
+ },{ .name = "BNK0_DRIVER_BIAS", .addr = A_BNK0_DRIVER_BIAS,
1156
+ .rsvd = 0xffff8000,
1157
+ },{ .name = "BNK0_VMODE", .addr = A_BNK0_VMODE,
1158
+ .rsvd = 0xfffffffe,
1159
+ .ro = 0x1,
1160
+ },{ .name = "BNK0_SEL_AUX_IO_RX", .addr = A_BNK0_SEL_AUX_IO_RX,
1161
+ .rsvd = 0xfc000000,
1162
+ },{ .name = "BNK0_EN_TX_HS_MODE", .addr = A_BNK0_EN_TX_HS_MODE,
1163
+ .rsvd = 0xfc000000,
1164
+ },{ .name = "MIO_MST_TRI0", .addr = A_MIO_MST_TRI0,
1165
+ .reset = 0x3ffffff,
1166
+ .rsvd = 0xfc000000,
1167
+ },{ .name = "MIO_MST_TRI1", .addr = A_MIO_MST_TRI1,
1168
+ .reset = 0x3ffffff,
1169
+ .rsvd = 0xfc000000,
1170
+ },{ .name = "BNK1_EN_RX", .addr = A_BNK1_EN_RX,
1171
+ .reset = 0x3ffffff,
1172
+ .rsvd = 0xfc000000,
1173
+ },{ .name = "BNK1_SEL_RX0", .addr = A_BNK1_SEL_RX0,
1174
+ .reset = 0xffffffff,
1175
+ },{ .name = "BNK1_SEL_RX1", .addr = A_BNK1_SEL_RX1,
1176
+ .reset = 0xfffff,
1177
+ .rsvd = 0xfff00000,
1178
+ },{ .name = "BNK1_EN_RX_SCHMITT_HYST", .addr = A_BNK1_EN_RX_SCHMITT_HYST,
1179
+ .rsvd = 0xfc000000,
1180
+ },{ .name = "BNK1_EN_WK_PD", .addr = A_BNK1_EN_WK_PD,
1181
+ .rsvd = 0xfc000000,
1182
+ },{ .name = "BNK1_EN_WK_PU", .addr = A_BNK1_EN_WK_PU,
1183
+ .reset = 0x3ffffff,
1184
+ .rsvd = 0xfc000000,
1185
+ },{ .name = "BNK1_SEL_DRV0", .addr = A_BNK1_SEL_DRV0,
1186
+ .reset = 0xffffffff,
1187
+ },{ .name = "BNK1_SEL_DRV1", .addr = A_BNK1_SEL_DRV1,
1188
+ .reset = 0xfffff,
1189
+ .rsvd = 0xfff00000,
1190
+ },{ .name = "BNK1_SEL_SLEW", .addr = A_BNK1_SEL_SLEW,
1191
+ .rsvd = 0xfc000000,
1192
+ },{ .name = "BNK1_EN_DFT_OPT_INV", .addr = A_BNK1_EN_DFT_OPT_INV,
1193
+ .rsvd = 0xfc000000,
1194
+ },{ .name = "BNK1_EN_PAD2PAD_LOOPBACK",
1195
+ .addr = A_BNK1_EN_PAD2PAD_LOOPBACK,
1196
+ .rsvd = 0xffffe000,
1197
+ },{ .name = "BNK1_RX_SPARE0", .addr = A_BNK1_RX_SPARE0,
1198
+ },{ .name = "BNK1_RX_SPARE1", .addr = A_BNK1_RX_SPARE1,
1199
+ .rsvd = 0xfff00000,
1200
+ },{ .name = "BNK1_TX_SPARE0", .addr = A_BNK1_TX_SPARE0,
1201
+ },{ .name = "BNK1_TX_SPARE1", .addr = A_BNK1_TX_SPARE1,
1202
+ .rsvd = 0xfff00000,
1203
+ },{ .name = "BNK1_SEL_EN1P8", .addr = A_BNK1_SEL_EN1P8,
1204
+ .rsvd = 0xfffffffe,
1205
+ },{ .name = "BNK1_EN_B_POR_DETECT", .addr = A_BNK1_EN_B_POR_DETECT,
1206
+ .rsvd = 0xfffffffe,
1207
+ },{ .name = "BNK1_LPF_BYP_POR_DETECT", .addr = A_BNK1_LPF_BYP_POR_DETECT,
1208
+ .reset = 0x1,
1209
+ .rsvd = 0xfffffffe,
1210
+ },{ .name = "BNK1_EN_LATCH", .addr = A_BNK1_EN_LATCH,
1211
+ .rsvd = 0xfffffffe,
1212
+ },{ .name = "BNK1_VBG_LPF_BYP_B", .addr = A_BNK1_VBG_LPF_BYP_B,
1213
+ .reset = 0x1,
1214
+ .rsvd = 0xfffffffe,
1215
+ },{ .name = "BNK1_EN_AMP_B", .addr = A_BNK1_EN_AMP_B,
1216
+ .rsvd = 0xfffffffc,
1217
+ },{ .name = "BNK1_SPARE_BIAS", .addr = A_BNK1_SPARE_BIAS,
1218
+ .rsvd = 0xfffffff0,
1219
+ },{ .name = "BNK1_DRIVER_BIAS", .addr = A_BNK1_DRIVER_BIAS,
1220
+ .rsvd = 0xffff8000,
1221
+ },{ .name = "BNK1_VMODE", .addr = A_BNK1_VMODE,
1222
+ .rsvd = 0xfffffffe,
1223
+ .ro = 0x1,
1224
+ },{ .name = "BNK1_SEL_AUX_IO_RX", .addr = A_BNK1_SEL_AUX_IO_RX,
1225
+ .rsvd = 0xfc000000,
1226
+ },{ .name = "BNK1_EN_TX_HS_MODE", .addr = A_BNK1_EN_TX_HS_MODE,
1227
+ .rsvd = 0xfc000000,
1228
+ },{ .name = "SD0_CLK_CTRL", .addr = A_SD0_CLK_CTRL,
1229
+ .rsvd = 0xfffffff8,
1230
+ },{ .name = "SD0_CTRL_REG", .addr = A_SD0_CTRL_REG,
1231
+ .rsvd = 0xfffffffe,
1232
+ .pre_write = sd0_ctrl_reg_prew,
1233
+ },{ .name = "SD0_CONFIG_REG1", .addr = A_SD0_CONFIG_REG1,
1234
+ .reset = 0x3250,
1235
+ .rsvd = 0xffff8000,
1236
+ },{ .name = "SD0_CONFIG_REG2", .addr = A_SD0_CONFIG_REG2,
1237
+ .reset = 0xffc,
1238
+ .rsvd = 0xffffc000,
1239
+ },{ .name = "SD0_CONFIG_REG3", .addr = A_SD0_CONFIG_REG3,
1240
+ .reset = 0x407,
1241
+ .rsvd = 0xfffff800,
1242
+ },{ .name = "SD0_INITPRESET", .addr = A_SD0_INITPRESET,
1243
+ .reset = 0x100,
1244
+ .rsvd = 0xffffe000,
1245
+ },{ .name = "SD0_DSPPRESET", .addr = A_SD0_DSPPRESET,
1246
+ .reset = 0x4,
1247
+ .rsvd = 0xffffe000,
1248
+ },{ .name = "SD0_HSPDPRESET", .addr = A_SD0_HSPDPRESET,
1249
+ .reset = 0x2,
1250
+ .rsvd = 0xffffe000,
1251
+ },{ .name = "SD0_SDR12PRESET", .addr = A_SD0_SDR12PRESET,
1252
+ .reset = 0x4,
1253
+ .rsvd = 0xffffe000,
1254
+ },{ .name = "SD0_SDR25PRESET", .addr = A_SD0_SDR25PRESET,
1255
+ .reset = 0x2,
1256
+ .rsvd = 0xffffe000,
1257
+ },{ .name = "SD0_SDR50PRSET", .addr = A_SD0_SDR50PRSET,
1258
+ .reset = 0x1,
1259
+ .rsvd = 0xffffe000,
1260
+ },{ .name = "SD0_SDR104PRST", .addr = A_SD0_SDR104PRST,
1261
+ .rsvd = 0xffffe000,
1262
+ },{ .name = "SD0_DDR50PRESET", .addr = A_SD0_DDR50PRESET,
1263
+ .reset = 0x2,
1264
+ .rsvd = 0xffffe000,
1265
+ },{ .name = "SD0_MAXCUR1P8", .addr = A_SD0_MAXCUR1P8,
1266
+ .rsvd = 0xffffff00,
1267
+ },{ .name = "SD0_MAXCUR3P0", .addr = A_SD0_MAXCUR3P0,
1268
+ .rsvd = 0xffffff00,
1269
+ },{ .name = "SD0_MAXCUR3P3", .addr = A_SD0_MAXCUR3P3,
1270
+ .rsvd = 0xffffff00,
1271
+ },{ .name = "SD0_DLL_CTRL", .addr = A_SD0_DLL_CTRL,
1272
+ .reset = 0x1,
1273
+ .rsvd = 0xfffffc00,
1274
+ .ro = 0x19,
1275
+ },{ .name = "SD0_CDN_CTRL", .addr = A_SD0_CDN_CTRL,
1276
+ .rsvd = 0xfffffffe,
1277
+ },{ .name = "SD0_DLL_TEST", .addr = A_SD0_DLL_TEST,
1278
+ .rsvd = 0xff000000,
1279
+ },{ .name = "SD0_RX_TUNING_SEL", .addr = A_SD0_RX_TUNING_SEL,
1280
+ .rsvd = 0xfffffe00,
1281
+ .ro = 0x1ff,
1282
+ },{ .name = "SD0_DLL_DIV_MAP0", .addr = A_SD0_DLL_DIV_MAP0,
1283
+ .reset = 0x50505050,
1284
+ },{ .name = "SD0_DLL_DIV_MAP1", .addr = A_SD0_DLL_DIV_MAP1,
1285
+ .reset = 0x50505050,
1286
+ },{ .name = "SD0_IOU_COHERENT_CTRL", .addr = A_SD0_IOU_COHERENT_CTRL,
1287
+ .rsvd = 0xfffffff0,
1288
+ },{ .name = "SD0_IOU_INTERCONNECT_ROUTE",
1289
+ .addr = A_SD0_IOU_INTERCONNECT_ROUTE,
1290
+ .rsvd = 0xfffffffe,
1291
+ },{ .name = "SD0_IOU_RAM", .addr = A_SD0_IOU_RAM,
1292
+ .reset = 0x24,
1293
+ .rsvd = 0xffffff80,
1294
+ },{ .name = "SD0_IOU_INTERCONNECT_QOS",
1295
+ .addr = A_SD0_IOU_INTERCONNECT_QOS,
1296
+ .rsvd = 0xfffffff0,
1297
+ },{ .name = "SD1_CLK_CTRL", .addr = A_SD1_CLK_CTRL,
1298
+ .rsvd = 0xfffffffc,
1299
+ },{ .name = "SD1_CTRL_REG", .addr = A_SD1_CTRL_REG,
1300
+ .rsvd = 0xfffffffe,
1301
+ .pre_write = sd1_ctrl_reg_prew,
1302
+ },{ .name = "SD1_CONFIG_REG1", .addr = A_SD1_CONFIG_REG1,
1303
+ .reset = 0x3250,
1304
+ .rsvd = 0xffff8000,
1305
+ },{ .name = "SD1_CONFIG_REG2", .addr = A_SD1_CONFIG_REG2,
1306
+ .reset = 0xffc,
1307
+ .rsvd = 0xffffc000,
1308
+ },{ .name = "SD1_CONFIG_REG3", .addr = A_SD1_CONFIG_REG3,
1309
+ .reset = 0x407,
1310
+ .rsvd = 0xfffff800,
1311
+ },{ .name = "SD1_INITPRESET", .addr = A_SD1_INITPRESET,
1312
+ .reset = 0x100,
1313
+ .rsvd = 0xffffe000,
1314
+ },{ .name = "SD1_DSPPRESET", .addr = A_SD1_DSPPRESET,
1315
+ .reset = 0x4,
1316
+ .rsvd = 0xffffe000,
1317
+ },{ .name = "SD1_HSPDPRESET", .addr = A_SD1_HSPDPRESET,
1318
+ .reset = 0x2,
1319
+ .rsvd = 0xffffe000,
1320
+ },{ .name = "SD1_SDR12PRESET", .addr = A_SD1_SDR12PRESET,
1321
+ .reset = 0x4,
1322
+ .rsvd = 0xffffe000,
1323
+ },{ .name = "SD1_SDR25PRESET", .addr = A_SD1_SDR25PRESET,
1324
+ .reset = 0x2,
1325
+ .rsvd = 0xffffe000,
1326
+ },{ .name = "SD1_SDR50PRSET", .addr = A_SD1_SDR50PRSET,
1327
+ .reset = 0x1,
1328
+ .rsvd = 0xffffe000,
1329
+ },{ .name = "SD1_SDR104PRST", .addr = A_SD1_SDR104PRST,
1330
+ .rsvd = 0xffffe000,
1331
+ },{ .name = "SD1_DDR50PRESET", .addr = A_SD1_DDR50PRESET,
1332
+ .reset = 0x2,
1333
+ .rsvd = 0xffffe000,
1334
+ },{ .name = "SD1_MAXCUR1P8", .addr = A_SD1_MAXCUR1P8,
1335
+ .rsvd = 0xffffff00,
1336
+ },{ .name = "SD1_MAXCUR3P0", .addr = A_SD1_MAXCUR3P0,
1337
+ .rsvd = 0xffffff00,
1338
+ },{ .name = "SD1_MAXCUR3P3", .addr = A_SD1_MAXCUR3P3,
1339
+ .rsvd = 0xffffff00,
1340
+ },{ .name = "SD1_DLL_CTRL", .addr = A_SD1_DLL_CTRL,
1341
+ .reset = 0x1,
1342
+ .rsvd = 0xfffffc00,
1343
+ .ro = 0x19,
1344
+ },{ .name = "SD1_CDN_CTRL", .addr = A_SD1_CDN_CTRL,
1345
+ .rsvd = 0xfffffffe,
1346
+ },{ .name = "SD1_DLL_TEST", .addr = A_SD1_DLL_TEST,
1347
+ .rsvd = 0xff000000,
1348
+ },{ .name = "SD1_RX_TUNING_SEL", .addr = A_SD1_RX_TUNING_SEL,
1349
+ .rsvd = 0xfffffe00,
1350
+ .ro = 0x1ff,
1351
+ },{ .name = "SD1_DLL_DIV_MAP0", .addr = A_SD1_DLL_DIV_MAP0,
1352
+ .reset = 0x50505050,
1353
+ },{ .name = "SD1_DLL_DIV_MAP1", .addr = A_SD1_DLL_DIV_MAP1,
1354
+ .reset = 0x50505050,
1355
+ },{ .name = "SD1_IOU_COHERENT_CTRL", .addr = A_SD1_IOU_COHERENT_CTRL,
1356
+ .rsvd = 0xfffffff0,
1357
+ },{ .name = "SD1_IOU_INTERCONNECT_ROUTE",
1358
+ .addr = A_SD1_IOU_INTERCONNECT_ROUTE,
1359
+ .rsvd = 0xfffffffe,
1360
+ },{ .name = "SD1_IOU_RAM", .addr = A_SD1_IOU_RAM,
1361
+ .reset = 0x24,
1362
+ .rsvd = 0xffffff80,
1363
+ },{ .name = "SD1_IOU_INTERCONNECT_QOS",
1364
+ .addr = A_SD1_IOU_INTERCONNECT_QOS,
1365
+ .rsvd = 0xfffffff0,
1366
+ },{ .name = "OSPI_QSPI_IOU_AXI_MUX_SEL",
1367
+ .addr = A_OSPI_QSPI_IOU_AXI_MUX_SEL,
1368
+ .reset = 0x1,
1369
+ .rsvd = 0xfffffffc,
1370
+ .pre_write = ospi_qspi_iou_axi_mux_sel_prew,
1371
+ },{ .name = "QSPI_IOU_COHERENT_CTRL", .addr = A_QSPI_IOU_COHERENT_CTRL,
1372
+ .rsvd = 0xfffffff0,
1373
+ },{ .name = "QSPI_IOU_INTERCONNECT_ROUTE",
1374
+ .addr = A_QSPI_IOU_INTERCONNECT_ROUTE,
1375
+ .rsvd = 0xfffffffe,
1376
+ },{ .name = "QSPI_IOU_RAM", .addr = A_QSPI_IOU_RAM,
1377
+ .reset = 0x1224,
1378
+ .rsvd = 0xffffc000,
1379
+ },{ .name = "QSPI_IOU_INTERCONNECT_QOS",
1380
+ .addr = A_QSPI_IOU_INTERCONNECT_QOS,
1381
+ .rsvd = 0xfffffff0,
1382
+ },{ .name = "OSPI_IOU_COHERENT_CTRL", .addr = A_OSPI_IOU_COHERENT_CTRL,
1383
+ .rsvd = 0xfffffff0,
1384
+ },{ .name = "OSPI_IOU_INTERCONNECT_ROUTE",
1385
+ .addr = A_OSPI_IOU_INTERCONNECT_ROUTE,
1386
+ .rsvd = 0xfffffffe,
1387
+ },{ .name = "OSPI_IOU_RAM", .addr = A_OSPI_IOU_RAM,
1388
+ .reset = 0xa,
1389
+ .rsvd = 0xffffffc0,
1390
+ },{ .name = "OSPI_IOU_INTERCONNECT_QOS",
1391
+ .addr = A_OSPI_IOU_INTERCONNECT_QOS,
1392
+ .rsvd = 0xfffffff0,
1393
+ },{ .name = "OSPI_REFCLK_DLY_CTRL", .addr = A_OSPI_REFCLK_DLY_CTRL,
1394
+ .reset = 0x13,
1395
+ .rsvd = 0xffffffe0,
1396
+ },{ .name = "CUR_PWR_ST", .addr = A_CUR_PWR_ST,
1397
+ .rsvd = 0xfffffffc,
1398
+ .ro = 0x3,
1399
+ },{ .name = "CONNECT_ST", .addr = A_CONNECT_ST,
1400
+ .rsvd = 0xfffffffe,
1401
+ .ro = 0x1,
1402
+ },{ .name = "PW_STATE_REQ", .addr = A_PW_STATE_REQ,
1403
+ .rsvd = 0xfffffffc,
1404
+ },{ .name = "HOST_U2_PORT_DISABLE", .addr = A_HOST_U2_PORT_DISABLE,
1405
+ .rsvd = 0xfffffffe,
1406
+ },{ .name = "DBG_U2PMU", .addr = A_DBG_U2PMU,
1407
+ .ro = 0xffffffff,
1408
+ },{ .name = "DBG_U2PMU_EXT1", .addr = A_DBG_U2PMU_EXT1,
1409
+ .ro = 0xffffffff,
1410
+ },{ .name = "DBG_U2PMU_EXT2", .addr = A_DBG_U2PMU_EXT2,
1411
+ .rsvd = 0xfffffff0,
1412
+ .ro = 0xf,
1413
+ },{ .name = "PME_GEN_U2PMU", .addr = A_PME_GEN_U2PMU,
1414
+ .rsvd = 0xfffffffe,
1415
+ .ro = 0x1,
1416
+ },{ .name = "PWR_CONFIG_USB2", .addr = A_PWR_CONFIG_USB2,
1417
+ .rsvd = 0xc0000000,
1418
+ },{ .name = "PHY_HUB", .addr = A_PHY_HUB,
1419
+ .rsvd = 0xfffffffc,
1420
+ .ro = 0x2,
1421
+ },{ .name = "CTRL", .addr = A_CTRL,
1422
+ },{ .name = "ISR", .addr = A_ISR,
1423
+ .w1c = 0x1,
1424
+ .post_write = isr_postw,
1425
+ },{ .name = "IMR", .addr = A_IMR,
1426
+ .reset = 0x1,
1427
+ .ro = 0x1,
1428
+ },{ .name = "IER", .addr = A_IER,
1429
+ .pre_write = ier_prew,
1430
+ },{ .name = "IDR", .addr = A_IDR,
1431
+ .pre_write = idr_prew,
1432
+ },{ .name = "ITR", .addr = A_ITR,
1433
+ .pre_write = itr_prew,
1434
+ },{ .name = "PARITY_ISR", .addr = A_PARITY_ISR,
1435
+ .w1c = 0x1fff,
1436
+ .post_write = parity_isr_postw,
1437
+ },{ .name = "PARITY_IMR", .addr = A_PARITY_IMR,
1438
+ .reset = 0x1fff,
1439
+ .ro = 0x1fff,
1440
+ },{ .name = "PARITY_IER", .addr = A_PARITY_IER,
1441
+ .pre_write = parity_ier_prew,
1442
+ },{ .name = "PARITY_IDR", .addr = A_PARITY_IDR,
1443
+ .pre_write = parity_idr_prew,
1444
+ },{ .name = "PARITY_ITR", .addr = A_PARITY_ITR,
1445
+ .pre_write = parity_itr_prew,
1446
+ },{ .name = "WPROT0", .addr = A_WPROT0,
1447
+ .reset = 0x1,
115
+ }
1448
+ }
116
+};
1449
+};
117
+
1450
+
118
+DEFINE_TYPES(raspi_machine_types)
1451
+static void xlnx_versal_pmc_iou_slcr_reset_init(Object *obj, ResetType type)
1452
+{
1453
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(obj);
1454
+ unsigned int i;
1455
+
1456
+ for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
1457
+ register_reset(&s->regs_info[i]);
1458
+ }
1459
+}
1460
+
1461
+static void xlnx_versal_pmc_iou_slcr_reset_hold(Object *obj)
1462
+{
1463
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(obj);
1464
+
1465
+ parity_imr_update_irq(s);
1466
+ imr_update_irq(s);
1467
+
1468
+ /*
1469
+ * Setup OSPI_QSPI mux
1470
+ * By default axi slave interface is enabled for ospi-dma
1471
+ */
1472
+ qemu_set_irq(s->ospi_mux_sel, 0);
1473
+ qemu_set_irq(s->qspi_ospi_mux_sel, 1);
1474
+}
1475
+
1476
+static const MemoryRegionOps pmc_iou_slcr_ops = {
1477
+ .read = register_read_memory,
1478
+ .write = register_write_memory,
1479
+ .endianness = DEVICE_LITTLE_ENDIAN,
1480
+ .valid = {
1481
+ .min_access_size = 4,
1482
+ .max_access_size = 4,
1483
+ },
1484
+};
1485
+
1486
+static void xlnx_versal_pmc_iou_slcr_realize(DeviceState *dev, Error **errp)
1487
+{
1488
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(dev);
1489
+
1490
+ qdev_init_gpio_out_named(dev, s->sd_emmc_sel, "sd-emmc-sel", 2);
1491
+ qdev_init_gpio_out_named(dev, &s->qspi_ospi_mux_sel,
1492
+ "qspi-ospi-mux-sel", 1);
1493
+ qdev_init_gpio_out_named(dev, &s->ospi_mux_sel, "ospi-mux-sel", 1);
1494
+}
1495
+
1496
+static void xlnx_versal_pmc_iou_slcr_init(Object *obj)
1497
+{
1498
+ XlnxVersalPmcIouSlcr *s = XILINX_VERSAL_PMC_IOU_SLCR(obj);
1499
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
1500
+ RegisterInfoArray *reg_array;
1501
+
1502
+ memory_region_init(&s->iomem, obj, TYPE_XILINX_VERSAL_PMC_IOU_SLCR,
1503
+ XILINX_VERSAL_PMC_IOU_SLCR_R_MAX * 4);
1504
+ reg_array =
1505
+ register_init_block32(DEVICE(obj), pmc_iou_slcr_regs_info,
1506
+ ARRAY_SIZE(pmc_iou_slcr_regs_info),
1507
+ s->regs_info, s->regs,
1508
+ &pmc_iou_slcr_ops,
1509
+ XILINX_VERSAL_PMC_IOU_SLCR_ERR_DEBUG,
1510
+ XILINX_VERSAL_PMC_IOU_SLCR_R_MAX * 4);
1511
+ memory_region_add_subregion(&s->iomem,
1512
+ 0x0,
1513
+ &reg_array->mem);
1514
+ sysbus_init_mmio(sbd, &s->iomem);
1515
+ sysbus_init_irq(sbd, &s->irq_parity_imr);
1516
+ sysbus_init_irq(sbd, &s->irq_imr);
1517
+}
1518
+
1519
+static const VMStateDescription vmstate_pmc_iou_slcr = {
1520
+ .name = TYPE_XILINX_VERSAL_PMC_IOU_SLCR,
1521
+ .version_id = 1,
1522
+ .minimum_version_id = 1,
1523
+ .fields = (VMStateField[]) {
1524
+ VMSTATE_UINT32_ARRAY(regs, XlnxVersalPmcIouSlcr,
1525
+ XILINX_VERSAL_PMC_IOU_SLCR_R_MAX),
1526
+ VMSTATE_END_OF_LIST(),
1527
+ }
1528
+};
1529
+
1530
+static void xlnx_versal_pmc_iou_slcr_class_init(ObjectClass *klass, void *data)
1531
+{
1532
+ DeviceClass *dc = DEVICE_CLASS(klass);
1533
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
1534
+
1535
+ dc->realize = xlnx_versal_pmc_iou_slcr_realize;
1536
+ dc->vmsd = &vmstate_pmc_iou_slcr;
1537
+ rc->phases.enter = xlnx_versal_pmc_iou_slcr_reset_init;
1538
+ rc->phases.hold = xlnx_versal_pmc_iou_slcr_reset_hold;
1539
+}
1540
+
1541
+static const TypeInfo xlnx_versal_pmc_iou_slcr_info = {
1542
+ .name = TYPE_XILINX_VERSAL_PMC_IOU_SLCR,
1543
+ .parent = TYPE_SYS_BUS_DEVICE,
1544
+ .instance_size = sizeof(XlnxVersalPmcIouSlcr),
1545
+ .class_init = xlnx_versal_pmc_iou_slcr_class_init,
1546
+ .instance_init = xlnx_versal_pmc_iou_slcr_init,
1547
+};
1548
+
1549
+static void xlnx_versal_pmc_iou_slcr_register_types(void)
1550
+{
1551
+ type_register_static(&xlnx_versal_pmc_iou_slcr_info);
1552
+}
1553
+
1554
+type_init(xlnx_versal_pmc_iou_slcr_register_types)
1555
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
1556
index XXXXXXX..XXXXXXX 100644
1557
--- a/hw/misc/meson.build
1558
+++ b/hw/misc/meson.build
1559
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files(
1560
))
1561
softmmu_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c'))
1562
softmmu_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c'))
1563
-softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal-xramc.c'))
1564
+softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files(
1565
+ 'xlnx-versal-xramc.c',
1566
+ 'xlnx-versal-pmc-iou-slcr.c',
1567
+))
1568
softmmu_ss.add(when: 'CONFIG_STM32F2XX_SYSCFG', if_true: files('stm32f2xx_syscfg.c'))
1569
softmmu_ss.add(when: 'CONFIG_STM32F4XX_SYSCFG', if_true: files('stm32f4xx_syscfg.c'))
1570
softmmu_ss.add(when: 'CONFIG_STM32F4XX_EXTI', if_true: files('stm32f4xx_exti.c'))
119
--
1571
--
120
2.20.1
1572
2.25.1
121
1573
122
1574
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
We want to have a common class_init(). The only value that
3
Add an orgate and 'or' the interrupts from the BBRAM and RTC models.
4
matters (and changes) is the board revision.
5
Pass the board_rev as class_data to class_init().
6
4
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
8
Message-id: 20200208165645.15657-9-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Message-id: 20220121161141.14389-3-francisco.iglesias@xilinx.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
hw/arm/raspi.c | 17 ++++++++++++++---
11
include/hw/arm/xlnx-versal.h | 5 +++--
13
1 file changed, 14 insertions(+), 3 deletions(-)
12
hw/arm/xlnx-versal-virt.c | 2 +-
13
hw/arm/xlnx-versal.c | 28 ++++++++++++++++++++++++++--
14
3 files changed, 30 insertions(+), 5 deletions(-)
14
15
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
16
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/raspi.c
18
--- a/include/hw/arm/xlnx-versal.h
18
+++ b/hw/arm/raspi.c
19
+++ b/include/hw/arm/xlnx-versal.h
19
@@ -XXX,XX +XXX,XX @@ typedef struct RaspiMachineClass {
20
@@ -XXX,XX +XXX,XX @@ struct Versal {
20
/*< private >*/
21
XlnxEFuse efuse;
21
MachineClass parent_obj;
22
XlnxVersalEFuseCtrl efuse_ctrl;
22
/*< public >*/
23
XlnxVersalEFuseCache efuse_cache;
23
+ uint32_t board_rev;
24
+
24
} RaspiMachineClass;
25
+ qemu_or_irq apb_irq_orgate;
25
26
} pmc;
26
#define TYPE_RASPI_MACHINE MACHINE_TYPE_NAME("raspi-common")
27
27
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
28
struct {
28
arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
29
@@ -XXX,XX +XXX,XX @@ struct Versal {
30
#define VERSAL_GEM1_WAKE_IRQ_0 59
31
#define VERSAL_ADMA_IRQ_0 60
32
#define VERSAL_XRAM_IRQ_0 79
33
-#define VERSAL_BBRAM_APB_IRQ_0 121
34
-#define VERSAL_RTC_APB_ERR_IRQ 121
35
+#define VERSAL_PMC_APB_IRQ 121
36
#define VERSAL_SD0_IRQ_0 126
37
#define VERSAL_EFUSE_IRQ 139
38
#define VERSAL_RTC_ALARM_IRQ 142
39
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/hw/arm/xlnx-versal-virt.c
42
+++ b/hw/arm/xlnx-versal-virt.c
43
@@ -XXX,XX +XXX,XX @@ static void fdt_add_bbram_node(VersalVirt *s)
44
qemu_fdt_add_subnode(s->fdt, name);
45
46
qemu_fdt_setprop_cells(s->fdt, name, "interrupts",
47
- GIC_FDT_IRQ_TYPE_SPI, VERSAL_BBRAM_APB_IRQ_0,
48
+ GIC_FDT_IRQ_TYPE_SPI, VERSAL_PMC_APB_IRQ,
49
GIC_FDT_IRQ_FLAGS_LEVEL_HI);
50
qemu_fdt_setprop(s->fdt, name, "interrupt-names",
51
interrupt_names, sizeof(interrupt_names));
52
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/hw/arm/xlnx-versal.c
55
+++ b/hw/arm/xlnx-versal.c
56
@@ -XXX,XX +XXX,XX @@
57
#define XLNX_VERSAL_ACPU_TYPE ARM_CPU_TYPE_NAME("cortex-a72")
58
#define GEM_REVISION 0x40070106
59
60
+#define VERSAL_NUM_PMC_APB_IRQS 2
61
+
62
static void versal_create_apu_cpus(Versal *s)
63
{
64
int i;
65
@@ -XXX,XX +XXX,XX @@ static void versal_create_sds(Versal *s, qemu_irq *pic)
66
}
29
}
67
}
30
68
31
-static void raspi_init(MachineState *machine, uint32_t board_rev)
69
+static void versal_create_pmc_apb_irq_orgate(Versal *s, qemu_irq *pic)
32
+static void raspi_init(MachineState *machine)
70
+{
71
+ DeviceState *orgate;
72
+
73
+ /*
74
+ * The VERSAL_PMC_APB_IRQ is an 'or' of the interrupts from the following
75
+ * models:
76
+ * - RTC
77
+ * - BBRAM
78
+ */
79
+ object_initialize_child(OBJECT(s), "pmc-apb-irq-orgate",
80
+ &s->pmc.apb_irq_orgate, TYPE_OR_IRQ);
81
+ orgate = DEVICE(&s->pmc.apb_irq_orgate);
82
+ object_property_set_int(OBJECT(orgate),
83
+ "num-lines", VERSAL_NUM_PMC_APB_IRQS, &error_fatal);
84
+ qdev_realize(orgate, NULL, &error_fatal);
85
+ qdev_connect_gpio_out(orgate, 0, pic[VERSAL_PMC_APB_IRQ]);
86
+}
87
+
88
static void versal_create_rtc(Versal *s, qemu_irq *pic)
33
{
89
{
34
+ RaspiMachineClass *mc = RASPI_MACHINE_GET_CLASS(machine);
90
SysBusDevice *sbd;
35
RaspiMachineState *s = RASPI_MACHINE(machine);
91
@@ -XXX,XX +XXX,XX @@ static void versal_create_rtc(Versal *s, qemu_irq *pic)
36
+ uint32_t board_rev = mc->board_rev;
92
* TODO: Connect the ALARM and SECONDS interrupts once our RTC model
37
int version = board_version(board_rev);
93
* supports them.
38
uint64_t ram_size = board_ram_size(board_rev);
94
*/
39
uint32_t vcram_size;
95
- sysbus_connect_irq(sbd, 1, pic[VERSAL_RTC_APB_ERR_IRQ]);
40
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
96
+ sysbus_connect_irq(sbd, 1,
41
97
+ qdev_get_gpio_in(DEVICE(&s->pmc.apb_irq_orgate), 0));
42
static void raspi2_init(MachineState *machine)
43
{
44
- raspi_init(machine, 0xa21041);
45
+ raspi_init(machine);
46
}
98
}
47
99
48
static void raspi2_machine_class_init(ObjectClass *oc, void *data)
100
static void versal_create_xrams(Versal *s, qemu_irq *pic)
49
{
101
@@ -XXX,XX +XXX,XX @@ static void versal_create_bbram(Versal *s, qemu_irq *pic)
50
MachineClass *mc = MACHINE_CLASS(oc);
102
sysbus_realize(sbd, &error_fatal);
51
+ RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
103
memory_region_add_subregion(&s->mr_ps, MM_PMC_BBRAM_CTRL,
52
+ uint32_t board_rev = (uint32_t)(uintptr_t)data;
104
sysbus_mmio_get_region(sbd, 0));
53
105
- sysbus_connect_irq(sbd, 0, pic[VERSAL_BBRAM_APB_IRQ_0]);
54
+ rmc->board_rev = board_rev;
106
+ sysbus_connect_irq(sbd, 0,
55
mc->desc = "Raspberry Pi 2B";
107
+ qdev_get_gpio_in(DEVICE(&s->pmc.apb_irq_orgate), 1));
56
mc->init = raspi2_init;
57
mc->block_default_type = IF_SD;
58
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
59
#ifdef TARGET_AARCH64
60
static void raspi3_init(MachineState *machine)
61
{
62
- raspi_init(machine, 0xa02082);
63
+ raspi_init(machine);
64
}
108
}
65
109
66
static void raspi3_machine_class_init(ObjectClass *oc, void *data)
110
static void versal_realize_efuse_part(Versal *s, Object *dev, hwaddr base)
67
{
111
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
68
MachineClass *mc = MACHINE_CLASS(oc);
112
versal_create_gems(s, pic);
69
+ RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
113
versal_create_admas(s, pic);
70
+ uint32_t board_rev = (uint32_t)(uintptr_t)data;
114
versal_create_sds(s, pic);
71
115
+ versal_create_pmc_apb_irq_orgate(s, pic);
72
+ rmc->board_rev = board_rev;
116
versal_create_rtc(s, pic);
73
mc->desc = "Raspberry Pi 3B";
117
versal_create_xrams(s, pic);
74
mc->init = raspi3_init;
118
versal_create_bbram(s, pic);
75
mc->block_default_type = IF_SD;
76
@@ -XXX,XX +XXX,XX @@ static const TypeInfo raspi_machine_types[] = {
77
.name = MACHINE_TYPE_NAME("raspi2"),
78
.parent = TYPE_RASPI_MACHINE,
79
.class_init = raspi2_machine_class_init,
80
+ .class_data = (void *)0xa21041,
81
#ifdef TARGET_AARCH64
82
}, {
83
.name = MACHINE_TYPE_NAME("raspi3"),
84
.parent = TYPE_RASPI_MACHINE,
85
.class_init = raspi3_machine_class_init,
86
+ .class_data = (void *)0xa02082,
87
#endif
88
}, {
89
.name = TYPE_RASPI_MACHINE,
90
--
119
--
91
2.20.1
120
2.25.1
92
121
93
122
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Connect Versal's PMC SLCR (system-level control registers) model.
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
5
Message-id: 20200208125816.14954-19-richard.henderson@linaro.org
5
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
7
Message-id: 20220121161141.14389-4-francisco.iglesias@xilinx.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
9
---
8
target/arm/cpu.h | 6 ++++++
10
include/hw/arm/xlnx-versal.h | 5 +++
9
target/arm/internals.h | 3 +++
11
hw/arm/xlnx-versal.c | 71 +++++++++++++++++++++++++++++++++++-
10
target/arm/helper.c | 21 +++++++++++++++++++++
12
2 files changed, 75 insertions(+), 1 deletion(-)
11
target/arm/translate-a64.c | 14 ++++++++++++++
12
4 files changed, 44 insertions(+)
13
13
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.h
16
--- a/include/hw/arm/xlnx-versal.h
17
+++ b/target/arm/cpu.h
17
+++ b/include/hw/arm/xlnx-versal.h
18
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
18
@@ -XXX,XX +XXX,XX @@
19
#define PSTATE_IL (1U << 20)
19
#include "hw/misc/xlnx-versal-xramc.h"
20
#define PSTATE_SS (1U << 21)
20
#include "hw/nvram/xlnx-bbram.h"
21
#define PSTATE_PAN (1U << 22)
21
#include "hw/nvram/xlnx-versal-efuse.h"
22
+#define PSTATE_UAO (1U << 23)
22
+#include "hw/misc/xlnx-versal-pmc-iou-slcr.h"
23
#define PSTATE_V (1U << 28)
23
24
#define PSTATE_C (1U << 29)
24
#define TYPE_XLNX_VERSAL "xlnx-versal"
25
#define PSTATE_Z (1U << 30)
25
OBJECT_DECLARE_SIMPLE_TYPE(Versal, XLNX_VERSAL)
26
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id)
26
@@ -XXX,XX +XXX,XX @@ struct Versal {
27
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2;
27
struct {
28
struct {
29
SDHCIState sd[XLNX_VERSAL_NR_SDS];
30
+ XlnxVersalPmcIouSlcr slcr;
31
} iou;
32
33
XlnxZynqMPRTC rtc;
34
@@ -XXX,XX +XXX,XX @@ struct Versal {
35
#define MM_FPD_FPD_APU 0xfd5c0000
36
#define MM_FPD_FPD_APU_SIZE 0x100
37
38
+#define MM_PMC_PMC_IOU_SLCR 0xf1060000
39
+#define MM_PMC_PMC_IOU_SLCR_SIZE 0x10000
40
+
41
#define MM_PMC_SD0 0xf1040000U
42
#define MM_PMC_SD0_SIZE 0x10000
43
#define MM_PMC_BBRAM_CTRL 0xf11f0000
44
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/arm/xlnx-versal.c
47
+++ b/hw/arm/xlnx-versal.c
48
@@ -XXX,XX +XXX,XX @@
49
#include "kvm_arm.h"
50
#include "hw/misc/unimp.h"
51
#include "hw/arm/xlnx-versal.h"
52
+#include "qemu/log.h"
53
+#include "hw/sysbus.h"
54
55
#define XLNX_VERSAL_ACPU_TYPE ARM_CPU_TYPE_NAME("cortex-a72")
56
#define GEM_REVISION 0x40070106
57
58
-#define VERSAL_NUM_PMC_APB_IRQS 2
59
+#define VERSAL_NUM_PMC_APB_IRQS 3
60
61
static void versal_create_apu_cpus(Versal *s)
62
{
63
@@ -XXX,XX +XXX,XX @@ static void versal_create_pmc_apb_irq_orgate(Versal *s, qemu_irq *pic)
64
* models:
65
* - RTC
66
* - BBRAM
67
+ * - PMC SLCR
68
*/
69
object_initialize_child(OBJECT(s), "pmc-apb-irq-orgate",
70
&s->pmc.apb_irq_orgate, TYPE_OR_IRQ);
71
@@ -XXX,XX +XXX,XX @@ static void versal_create_efuse(Versal *s, qemu_irq *pic)
72
sysbus_connect_irq(SYS_BUS_DEVICE(ctrl), 0, pic[VERSAL_EFUSE_IRQ]);
28
}
73
}
29
74
30
+static inline bool isar_feature_aa64_uao(const ARMISARegisters *id)
75
+static void versal_create_pmc_iou_slcr(Versal *s, qemu_irq *pic)
31
+{
76
+{
32
+ return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, UAO) != 0;
77
+ SysBusDevice *sbd;
78
+
79
+ object_initialize_child(OBJECT(s), "versal-pmc-iou-slcr", &s->pmc.iou.slcr,
80
+ TYPE_XILINX_VERSAL_PMC_IOU_SLCR);
81
+
82
+ sbd = SYS_BUS_DEVICE(&s->pmc.iou.slcr);
83
+ sysbus_realize(sbd, &error_fatal);
84
+
85
+ memory_region_add_subregion(&s->mr_ps, MM_PMC_PMC_IOU_SLCR,
86
+ sysbus_mmio_get_region(sbd, 0));
87
+
88
+ sysbus_connect_irq(sbd, 0,
89
+ qdev_get_gpio_in(DEVICE(&s->pmc.apb_irq_orgate), 2));
33
+}
90
+}
34
+
91
+
35
static inline bool isar_feature_aa64_bti(const ARMISARegisters *id)
92
/* This takes the board allocated linear DDR memory and creates aliases
36
{
93
* for each split DDR range/aperture on the Versal address map.
37
return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0;
94
*/
38
diff --git a/target/arm/internals.h b/target/arm/internals.h
95
@@ -XXX,XX +XXX,XX @@ static void versal_unimp_area(Versal *s, const char *name,
39
index XXXXXXX..XXXXXXX 100644
96
memory_region_add_subregion(mr, base, mr_dev);
40
--- a/target/arm/internals.h
41
+++ b/target/arm/internals.h
42
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch64_pstate_valid_mask(const ARMISARegisters *id)
43
if (isar_feature_aa64_pan(id)) {
44
valid |= PSTATE_PAN;
45
}
46
+ if (isar_feature_aa64_uao(id)) {
47
+ valid |= PSTATE_UAO;
48
+ }
49
50
return valid;
51
}
97
}
52
diff --git a/target/arm/helper.c b/target/arm/helper.c
98
53
index XXXXXXX..XXXXXXX 100644
99
+static void versal_unimp_sd_emmc_sel(void *opaque, int n, int level)
54
--- a/target/arm/helper.c
55
+++ b/target/arm/helper.c
56
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo pan_reginfo = {
57
.readfn = aa64_pan_read, .writefn = aa64_pan_write
58
};
59
60
+static uint64_t aa64_uao_read(CPUARMState *env, const ARMCPRegInfo *ri)
61
+{
100
+{
62
+ return env->pstate & PSTATE_UAO;
101
+ qemu_log_mask(LOG_UNIMP,
102
+ "Selecting between enabling SD mode or eMMC mode on "
103
+ "controller %d is not yet implemented\n", n);
63
+}
104
+}
64
+
105
+
65
+static void aa64_uao_write(CPUARMState *env, const ARMCPRegInfo *ri,
106
+static void versal_unimp_qspi_ospi_mux_sel(void *opaque, int n, int level)
66
+ uint64_t value)
67
+{
107
+{
68
+ env->pstate = (env->pstate & ~PSTATE_UAO) | (value & PSTATE_UAO);
108
+ qemu_log_mask(LOG_UNIMP,
109
+ "Selecting between enabling the QSPI or OSPI linear address "
110
+ "region is not yet implemented\n");
69
+}
111
+}
70
+
112
+
71
+static const ARMCPRegInfo uao_reginfo = {
113
+static void versal_unimp_irq_parity_imr(void *opaque, int n, int level)
72
+ .name = "UAO", .state = ARM_CP_STATE_AA64,
114
+{
73
+ .opc0 = 3, .opc1 = 0, .crn = 4, .crm = 2, .opc2 = 4,
115
+ qemu_log_mask(LOG_UNIMP,
74
+ .type = ARM_CP_NO_RAW, .access = PL1_RW,
116
+ "PMC SLCR parity interrupt behaviour "
75
+ .readfn = aa64_uao_read, .writefn = aa64_uao_write
117
+ "is not yet implemented\n");
76
+};
118
+}
77
+
119
+
78
static CPAccessResult aa64_cacheop_access(CPUARMState *env,
120
static void versal_unimp(Versal *s)
79
const ARMCPRegInfo *ri,
121
{
80
bool isread)
122
+ qemu_irq gpio_in;
81
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
82
define_arm_cp_regs(cpu, ats1cp_reginfo);
83
}
84
#endif
85
+ if (cpu_isar_feature(aa64_uao, cpu)) {
86
+ define_one_arm_cp_reg(cpu, &uao_reginfo);
87
+ }
88
89
if (arm_feature(env, ARM_FEATURE_EL2) && cpu_isar_feature(aa64_vh, cpu)) {
90
define_arm_cp_regs(cpu, vhe_reginfo);
91
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
92
index XXXXXXX..XXXXXXX 100644
93
--- a/target/arm/translate-a64.c
94
+++ b/target/arm/translate-a64.c
95
@@ -XXX,XX +XXX,XX @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
96
s->base.is_jmp = DISAS_NEXT;
97
break;
98
99
+ case 0x03: /* UAO */
100
+ if (!dc_isar_feature(aa64_uao, s) || s->current_el == 0) {
101
+ goto do_unallocated;
102
+ }
103
+ if (crm & 1) {
104
+ set_pstate_bits(PSTATE_UAO);
105
+ } else {
106
+ clear_pstate_bits(PSTATE_UAO);
107
+ }
108
+ t1 = tcg_const_i32(s->current_el);
109
+ gen_helper_rebuild_hflags_a64(cpu_env, t1);
110
+ tcg_temp_free_i32(t1);
111
+ break;
112
+
123
+
113
case 0x04: /* PAN */
124
versal_unimp_area(s, "psm", &s->mr_ps,
114
if (!dc_isar_feature(aa64_pan, s) || s->current_el == 0) {
125
MM_PSM_START, MM_PSM_END - MM_PSM_START);
115
goto do_unallocated;
126
versal_unimp_area(s, "crl", &s->mr_ps,
127
@@ -XXX,XX +XXX,XX @@ static void versal_unimp(Versal *s)
128
MM_IOU_SCNTR, MM_IOU_SCNTR_SIZE);
129
versal_unimp_area(s, "iou-scntr-seucre", &s->mr_ps,
130
MM_IOU_SCNTRS, MM_IOU_SCNTRS_SIZE);
131
+
132
+ qdev_init_gpio_in_named(DEVICE(s), versal_unimp_sd_emmc_sel,
133
+ "sd-emmc-sel-dummy", 2);
134
+ qdev_init_gpio_in_named(DEVICE(s), versal_unimp_qspi_ospi_mux_sel,
135
+ "qspi-ospi-mux-sel-dummy", 1);
136
+ qdev_init_gpio_in_named(DEVICE(s), versal_unimp_irq_parity_imr,
137
+ "irq-parity-imr-dummy", 1);
138
+
139
+ gpio_in = qdev_get_gpio_in_named(DEVICE(s), "sd-emmc-sel-dummy", 0);
140
+ qdev_connect_gpio_out_named(DEVICE(&s->pmc.iou.slcr), "sd-emmc-sel", 0,
141
+ gpio_in);
142
+
143
+ gpio_in = qdev_get_gpio_in_named(DEVICE(s), "sd-emmc-sel-dummy", 1);
144
+ qdev_connect_gpio_out_named(DEVICE(&s->pmc.iou.slcr), "sd-emmc-sel", 1,
145
+ gpio_in);
146
+
147
+ gpio_in = qdev_get_gpio_in_named(DEVICE(s), "qspi-ospi-mux-sel-dummy", 0);
148
+ qdev_connect_gpio_out_named(DEVICE(&s->pmc.iou.slcr),
149
+ "qspi-ospi-mux-sel", 0,
150
+ gpio_in);
151
+
152
+ gpio_in = qdev_get_gpio_in_named(DEVICE(s), "irq-parity-imr-dummy", 0);
153
+ qdev_connect_gpio_out_named(DEVICE(&s->pmc.iou.slcr),
154
+ SYSBUS_DEVICE_GPIO_IRQ, 0,
155
+ gpio_in);
156
}
157
158
static void versal_realize(DeviceState *dev, Error **errp)
159
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
160
versal_create_xrams(s, pic);
161
versal_create_bbram(s, pic);
162
versal_create_efuse(s, pic);
163
+ versal_create_pmc_iou_slcr(s, pic);
164
versal_map_ddr(s);
165
versal_unimp(s);
166
116
--
167
--
117
2.20.1
168
2.25.1
118
169
119
170
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
With the exception of the ignore_memory_transaction_failures
3
Add in the missing includes in the header for being able to build the DMA
4
flag set for the raspi2, both machine_class_init() methods
4
model when reusing it.
5
are now identical. Merge them to keep a unique method.
6
5
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
8
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20200208165645.15657-13-f4bug@amsat.org
8
Reviewed-by: Luc Michel <luc@lmichel.fr>
9
Message-id: 20220121161141.14389-5-francisco.iglesias@xilinx.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
11
---
12
hw/arm/raspi.c | 31 ++++++-------------------------
12
include/hw/dma/xlnx_csu_dma.h | 5 +++++
13
1 file changed, 6 insertions(+), 25 deletions(-)
13
1 file changed, 5 insertions(+)
14
14
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
diff --git a/include/hw/dma/xlnx_csu_dma.h b/include/hw/dma/xlnx_csu_dma.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/raspi.c
17
--- a/include/hw/dma/xlnx_csu_dma.h
18
+++ b/hw/arm/raspi.c
18
+++ b/include/hw/dma/xlnx_csu_dma.h
19
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_init(MachineState *machine)
19
@@ -XXX,XX +XXX,XX @@
20
setup_boot(machine, version, machine->ram_size - vcram_size);
20
#ifndef XLNX_CSU_DMA_H
21
}
21
#define XLNX_CSU_DMA_H
22
22
23
-static void raspi2_machine_class_init(ObjectClass *oc, void *data)
23
+#include "hw/sysbus.h"
24
+static void raspi_machine_class_init(ObjectClass *oc, void *data)
24
+#include "hw/register.h"
25
{
25
+#include "hw/ptimer.h"
26
MachineClass *mc = MACHINE_CLASS(oc);
26
+#include "hw/stream.h"
27
RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
27
+
28
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
28
#define TYPE_XLNX_CSU_DMA "xlnx.csu_dma"
29
mc->min_cpus = BCM283X_NCPUS;
29
30
mc->default_cpus = BCM283X_NCPUS;
30
#define XLNX_CSU_DMA_R_MAX (0x2c / 4)
31
mc->default_ram_size = board_ram_size(board_rev);
32
- mc->ignore_memory_transaction_failures = true;
33
+ if (board_version(board_rev) == 2) {
34
+ mc->ignore_memory_transaction_failures = true;
35
+ }
36
};
37
38
-#ifdef TARGET_AARCH64
39
-static void raspi3_machine_class_init(ObjectClass *oc, void *data)
40
-{
41
- MachineClass *mc = MACHINE_CLASS(oc);
42
- RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
43
- uint32_t board_rev = (uint32_t)(uintptr_t)data;
44
-
45
- rmc->board_rev = board_rev;
46
- mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev));
47
- mc->init = raspi_machine_init;
48
- mc->block_default_type = IF_SD;
49
- mc->no_parallel = 1;
50
- mc->no_floppy = 1;
51
- mc->no_cdrom = 1;
52
- mc->max_cpus = BCM283X_NCPUS;
53
- mc->min_cpus = BCM283X_NCPUS;
54
- mc->default_cpus = BCM283X_NCPUS;
55
- mc->default_ram_size = board_ram_size(board_rev);
56
-}
57
-#endif
58
-
59
static const TypeInfo raspi_machine_types[] = {
60
{
61
.name = MACHINE_TYPE_NAME("raspi2"),
62
.parent = TYPE_RASPI_MACHINE,
63
- .class_init = raspi2_machine_class_init,
64
+ .class_init = raspi_machine_class_init,
65
.class_data = (void *)0xa21041,
66
#ifdef TARGET_AARCH64
67
}, {
68
.name = MACHINE_TYPE_NAME("raspi3"),
69
.parent = TYPE_RASPI_MACHINE,
70
- .class_init = raspi3_machine_class_init,
71
+ .class_init = raspi_machine_class_init,
72
.class_data = (void *)0xa02082,
73
#endif
74
}, {
75
--
31
--
76
2.20.1
32
2.25.1
77
33
78
34
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
The board revision encode the model type. Add a helper
3
An option on real hardware when embedding a DMA engine into a peripheral
4
to extract the model, and use it.
4
is to make the peripheral control the engine through a custom DMA control
5
(hardware) interface between the two. Software drivers in this scenario
6
configure and trigger DMA operations through the controlling peripheral's
7
register API (for example, writing a specific bit in a register could
8
propagate down to a transfer start signal on the DMA control interface).
9
At the same time the status, results and interrupts for the transfer might
10
still be intended to be read and caught through the DMA engine's register
11
API (and signals).
5
12
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
This patch adds a class 'read' method for allowing to start read transfers
7
Message-id: 20200208165645.15657-12-f4bug@amsat.org
14
from peripherals embedding and controlling the Xilinx CSU DMA engine as in
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
above scenario.
16
17
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
18
Reviewed-by: Luc Michel <luc@lmichel.fr>
19
Message-id: 20220121161141.14389-6-francisco.iglesias@xilinx.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
21
---
11
hw/arm/raspi.c | 18 ++++++++++++++++--
22
include/hw/dma/xlnx_csu_dma.h | 19 +++++++++++++++++--
12
1 file changed, 16 insertions(+), 2 deletions(-)
23
hw/dma/xlnx_csu_dma.c | 17 +++++++++++++++++
24
2 files changed, 34 insertions(+), 2 deletions(-)
13
25
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
26
diff --git a/include/hw/dma/xlnx_csu_dma.h b/include/hw/dma/xlnx_csu_dma.h
15
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
28
--- a/include/hw/dma/xlnx_csu_dma.h
17
+++ b/hw/arm/raspi.c
29
+++ b/include/hw/dma/xlnx_csu_dma.h
18
@@ -XXX,XX +XXX,XX @@ static const char *board_soc_type(uint32_t board_rev)
30
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxCSUDMA {
19
return soc_types[proc_id];
31
RegisterInfo regs_info[XLNX_CSU_DMA_R_MAX];
32
} XlnxCSUDMA;
33
34
-#define XLNX_CSU_DMA(obj) \
35
- OBJECT_CHECK(XlnxCSUDMA, (obj), TYPE_XLNX_CSU_DMA)
36
+OBJECT_DECLARE_TYPE(XlnxCSUDMA, XlnxCSUDMAClass, XLNX_CSU_DMA)
37
+
38
+struct XlnxCSUDMAClass {
39
+ SysBusDeviceClass parent_class;
40
+
41
+ /*
42
+ * read: Start a read transfer on a Xilinx CSU DMA engine
43
+ *
44
+ * @s: the Xilinx CSU DMA engine to start the transfer on
45
+ * @addr: the address to read
46
+ * @len: the number of bytes to read at 'addr'
47
+ *
48
+ * @return a MemTxResult indicating whether the operation succeeded ('len'
49
+ * bytes were read) or failed.
50
+ */
51
+ MemTxResult (*read)(XlnxCSUDMA *s, hwaddr addr, uint32_t len);
52
+};
53
54
#endif
55
diff --git a/hw/dma/xlnx_csu_dma.c b/hw/dma/xlnx_csu_dma.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/hw/dma/xlnx_csu_dma.c
58
+++ b/hw/dma/xlnx_csu_dma.c
59
@@ -XXX,XX +XXX,XX @@ static uint64_t addr_msb_pre_write(RegisterInfo *reg, uint64_t val)
60
return val & R_ADDR_MSB_ADDR_MSB_MASK;
20
}
61
}
21
62
22
+static const char *board_type(uint32_t board_rev)
63
+static MemTxResult xlnx_csu_dma_class_read(XlnxCSUDMA *s, hwaddr addr,
64
+ uint32_t len)
23
+{
65
+{
24
+ static const char *types[] = {
66
+ RegisterInfo *reg = &s->regs_info[R_SIZE];
25
+ "A", "B", "A+", "B+", "2B", "Alpha", "CM1", NULL, "3B", "Zero",
67
+ uint64_t we = MAKE_64BIT_MASK(0, 4 * 8);
26
+ "CM3", NULL, "Zero W", "3B+", "3A+", NULL, "CM3+", "4B",
68
+
27
+ };
69
+ s->regs[R_ADDR] = addr;
28
+ assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
70
+ s->regs[R_ADDR_MSB] = (uint64_t)addr >> 32;
29
+ int bt = FIELD_EX32(board_rev, REV_CODE, TYPE);
71
+
30
+ if (bt >= ARRAY_SIZE(types) || !types[bt]) {
72
+ register_write(reg, len, we, object_get_typename(OBJECT(s)), false);
31
+ return "Unknown";
73
+
32
+ }
74
+ return (s->regs[R_SIZE] == 0) ? MEMTX_OK : MEMTX_ERROR;
33
+ return types[bt];
34
+}
75
+}
35
+
76
+
36
static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
77
static const RegisterAccessInfo *xlnx_csu_dma_regs_info[] = {
78
#define DMACH_REGINFO(NAME, snd) \
79
(const RegisterAccessInfo []) { \
80
@@ -XXX,XX +XXX,XX @@ static void xlnx_csu_dma_class_init(ObjectClass *klass, void *data)
37
{
81
{
38
static const uint32_t smpboot[] = {
82
DeviceClass *dc = DEVICE_CLASS(klass);
39
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
83
StreamSinkClass *ssc = STREAM_SINK_CLASS(klass);
40
uint32_t board_rev = (uint32_t)(uintptr_t)data;
84
+ XlnxCSUDMAClass *xcdc = XLNX_CSU_DMA_CLASS(klass);
41
85
42
rmc->board_rev = board_rev;
86
dc->reset = xlnx_csu_dma_reset;
43
- mc->desc = "Raspberry Pi 2B";
87
dc->realize = xlnx_csu_dma_realize;
44
+ mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev));
88
@@ -XXX,XX +XXX,XX @@ static void xlnx_csu_dma_class_init(ObjectClass *klass, void *data)
45
mc->init = raspi_machine_init;
89
46
mc->block_default_type = IF_SD;
90
ssc->push = xlnx_csu_dma_stream_push;
47
mc->no_parallel = 1;
91
ssc->can_push = xlnx_csu_dma_stream_can_push;
48
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_class_init(ObjectClass *oc, void *data)
92
+
49
uint32_t board_rev = (uint32_t)(uintptr_t)data;
93
+ xcdc->read = xlnx_csu_dma_class_read;
50
94
}
51
rmc->board_rev = board_rev;
95
52
- mc->desc = "Raspberry Pi 3B";
96
static void xlnx_csu_dma_init(Object *obj)
53
+ mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev));
54
mc->init = raspi_machine_init;
55
mc->block_default_type = IF_SD;
56
mc->no_parallel = 1;
57
--
97
--
58
2.20.1
98
2.25.1
59
99
60
100
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
The PAN bit is preserved, or set as per SCTLR_ELx.SPAN,
3
Add a model of Xilinx Versal's OSPI flash memory controller.
4
plus several other conditions listed in the ARM ARM.
5
4
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Message-id: 20200208125816.14954-15-richard.henderson@linaro.org
7
Message-id: 20220121161141.14389-7-francisco.iglesias@xilinx.com
8
[PMM: fixed indent]
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/helper.c | 53 ++++++++++++++++++++++++++++++++++++++++++---
11
include/hw/ssi/xlnx-versal-ospi.h | 111 ++
12
1 file changed, 50 insertions(+), 3 deletions(-)
12
hw/ssi/xlnx-versal-ospi.c | 1853 +++++++++++++++++++++++++++++
13
hw/ssi/meson.build | 1 +
14
3 files changed, 1965 insertions(+)
15
create mode 100644 include/hw/ssi/xlnx-versal-ospi.h
16
create mode 100644 hw/ssi/xlnx-versal-ospi.c
13
17
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
18
diff --git a/include/hw/ssi/xlnx-versal-ospi.h b/include/hw/ssi/xlnx-versal-ospi.h
15
index XXXXXXX..XXXXXXX 100644
19
new file mode 100644
16
--- a/target/arm/helper.c
20
index XXXXXXX..XXXXXXX
17
+++ b/target/arm/helper.c
21
--- /dev/null
18
@@ -XXX,XX +XXX,XX @@ static void take_aarch32_exception(CPUARMState *env, int new_mode,
22
+++ b/include/hw/ssi/xlnx-versal-ospi.h
19
uint32_t mask, uint32_t offset,
23
@@ -XXX,XX +XXX,XX @@
20
uint32_t newpc)
24
+/*
21
{
25
+ * Header file for the Xilinx Versal's OSPI controller
22
+ int new_el;
26
+ *
23
+
27
+ * Copyright (C) 2021 Xilinx Inc
24
/* Change the CPU state so as to actually take the exception. */
28
+ * Written by Francisco Iglesias <francisco.iglesias@xilinx.com>
25
switch_mode(env, new_mode);
29
+ *
26
+ new_el = arm_current_el(env);
30
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
27
+
31
+ * of this software and associated documentation files (the "Software"), to deal
28
/*
32
+ * in the Software without restriction, including without limitation the rights
29
* For exceptions taken to AArch32 we must clear the SS bit in both
33
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
30
* PSTATE and in the old-state value we save to SPSR_<mode>, so zero it now.
34
+ * copies of the Software, and to permit persons to whom the Software is
31
@@ -XXX,XX +XXX,XX @@ static void take_aarch32_exception(CPUARMState *env, int new_mode,
35
+ * furnished to do so, subject to the following conditions:
32
env->uncached_cpsr = (env->uncached_cpsr & ~CPSR_M) | new_mode;
36
+ *
33
/* Set new mode endianness */
37
+ * The above copyright notice and this permission notice shall be included in
34
env->uncached_cpsr &= ~CPSR_E;
38
+ * all copies or substantial portions of the Software.
35
- if (env->cp15.sctlr_el[arm_current_el(env)] & SCTLR_EE) {
39
+ *
36
+ if (env->cp15.sctlr_el[new_el] & SCTLR_EE) {
40
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
37
env->uncached_cpsr |= CPSR_E;
41
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
38
}
42
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
39
/* J and IL must always be cleared for exception entry */
43
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
40
@@ -XXX,XX +XXX,XX @@ static void take_aarch32_exception(CPUARMState *env, int new_mode,
44
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
41
env->thumb = (env->cp15.sctlr_el[2] & SCTLR_TE) != 0;
45
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
42
env->elr_el[2] = env->regs[15];
46
+ * THE SOFTWARE.
43
} else {
47
+ */
44
+ /* CPSR.PAN is normally preserved preserved unless... */
48
+
45
+ if (cpu_isar_feature(aa64_pan, env_archcpu(env))) {
49
+/*
46
+ switch (new_el) {
50
+ * This is a model of Xilinx Versal's Octal SPI flash memory controller
47
+ case 3:
51
+ * documented in Versal's Technical Reference manual [1] and the Versal ACAP
48
+ if (!arm_is_secure_below_el3(env)) {
52
+ * Register reference [2].
49
+ /* ... the target is EL3, from non-secure state. */
53
+ *
50
+ env->uncached_cpsr &= ~CPSR_PAN;
54
+ * References:
51
+ break;
55
+ *
52
+ }
56
+ * [1] Versal ACAP Technical Reference Manual,
53
+ /* ... the target is EL3, from secure state ... */
57
+ * https://www.xilinx.com/support/documentation/architecture-manuals/am011-versal-acap-trm.pdf
54
+ /* fall through */
58
+ *
55
+ case 1:
59
+ * [2] Versal ACAP Register Reference,
56
+ /* ... the target is EL1 and SCTLR.SPAN is 0. */
60
+ * https://www.xilinx.com/html_docs/registers/am012/am012-versal-register-reference.html#mod___ospi.html
57
+ if (!(env->cp15.sctlr_el[new_el] & SCTLR_SPAN)) {
61
+ *
58
+ env->uncached_cpsr |= CPSR_PAN;
62
+ *
59
+ }
63
+ * QEMU interface:
60
+ break;
64
+ * + sysbus MMIO region 0: MemoryRegion for the device's registers
61
+ }
65
+ * + sysbus MMIO region 1: MemoryRegion for flash memory linear address space
62
+ }
66
+ * (data transfer).
63
/*
67
+ * + sysbus IRQ 0: Device interrupt.
64
* this is a lie, as there was no c1_sys on V4T/V5, but who cares
68
+ * + Named GPIO input "ospi-mux-sel": 0: enables indirect access mode
65
* and we should just guard the thumb mode on V4
69
+ * and 1: enables direct access mode.
66
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
70
+ * + Property "dac-with-indac": Allow both direct accesses and indirect
67
unsigned int new_el = env->exception.target_el;
71
+ * accesses simultaneously.
68
target_ulong addr = env->cp15.vbar_el[new_el];
72
+ * + Property "indac-write-disabled": Disable indirect access writes.
69
unsigned int new_mode = aarch64_pstate_mode(new_el, true);
73
+ */
70
+ unsigned int old_mode;
74
+
71
unsigned int cur_el = arm_current_el(env);
75
+#ifndef XILINX_VERSAL_OSPI_H
72
76
+#define XILINX_VERSAL_OSPI_H
73
/*
77
+
74
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
78
+#include "hw/register.h"
75
}
79
+#include "hw/ssi/ssi.h"
76
80
+#include "qemu/fifo8.h"
77
if (is_a64(env)) {
81
+#include "hw/dma/xlnx_csu_dma.h"
78
- env->banked_spsr[aarch64_banked_spsr_index(new_el)] = pstate_read(env);
82
+
79
+ old_mode = pstate_read(env);
83
+#define TYPE_XILINX_VERSAL_OSPI "xlnx.versal-ospi"
80
aarch64_save_sp(env, arm_current_el(env));
84
+
81
env->elr_el[new_el] = env->pc;
85
+OBJECT_DECLARE_SIMPLE_TYPE(XlnxVersalOspi, XILINX_VERSAL_OSPI)
82
} else {
86
+
83
- env->banked_spsr[aarch64_banked_spsr_index(new_el)] = cpsr_read(env);
87
+#define XILINX_VERSAL_OSPI_R_MAX (0xfc / 4 + 1)
84
+ old_mode = cpsr_read(env);
88
+
85
env->elr_el[new_el] = env->regs[15];
89
+/*
86
90
+ * Indirect operations
87
aarch64_sync_32_to_64(env);
91
+ */
88
92
+typedef struct IndOp {
89
env->condexec_bits = 0;
93
+ uint32_t flash_addr;
90
}
94
+ uint32_t num_bytes;
91
+ env->banked_spsr[aarch64_banked_spsr_index(new_el)] = old_mode;
95
+ uint32_t done_bytes;
92
+
96
+ bool completed;
93
qemu_log_mask(CPU_LOG_INT, "...with ELR 0x%" PRIx64 "\n",
97
+} IndOp;
94
env->elr_el[new_el]);
98
+
95
99
+struct XlnxVersalOspi {
96
+ if (cpu_isar_feature(aa64_pan, cpu)) {
100
+ SysBusDevice parent_obj;
97
+ /* The value of PSTATE.PAN is normally preserved, except when ... */
101
+
98
+ new_mode |= old_mode & PSTATE_PAN;
102
+ MemoryRegion iomem;
99
+ switch (new_el) {
103
+ MemoryRegion iomem_dac;
100
+ case 2:
104
+
101
+ /* ... the target is EL2 with HCR_EL2.{E2H,TGE} == '11' ... */
105
+ uint8_t num_cs;
102
+ if ((arm_hcr_el2_eff(env) & (HCR_E2H | HCR_TGE))
106
+ qemu_irq *cs_lines;
103
+ != (HCR_E2H | HCR_TGE)) {
107
+
104
+ break;
108
+ SSIBus *spi;
105
+ }
109
+
106
+ /* fall through */
110
+ Fifo8 rx_fifo;
107
+ case 1:
111
+ Fifo8 tx_fifo;
108
+ /* ... the target is EL1 ... */
112
+
109
+ /* ... and SCTLR_ELx.SPAN == 0, then set to 1. */
113
+ Fifo8 rx_sram;
110
+ if ((env->cp15.sctlr_el[new_el] & SCTLR_SPAN) == 0) {
114
+ Fifo8 tx_sram;
111
+ new_mode |= PSTATE_PAN;
115
+
112
+ }
116
+ qemu_irq irq;
117
+
118
+ XlnxCSUDMA *dma_src;
119
+ bool ind_write_disabled;
120
+ bool dac_with_indac;
121
+ bool dac_enable;
122
+ bool src_dma_inprog;
123
+
124
+ IndOp rd_ind_op[2];
125
+ IndOp wr_ind_op[2];
126
+
127
+ uint32_t regs[XILINX_VERSAL_OSPI_R_MAX];
128
+ RegisterInfo regs_info[XILINX_VERSAL_OSPI_R_MAX];
129
+
130
+ /* Maximum inferred membank size is 512 bytes */
131
+ uint8_t stig_membank[512];
132
+};
133
+
134
+#endif /* XILINX_VERSAL_OSPI_H */
135
diff --git a/hw/ssi/xlnx-versal-ospi.c b/hw/ssi/xlnx-versal-ospi.c
136
new file mode 100644
137
index XXXXXXX..XXXXXXX
138
--- /dev/null
139
+++ b/hw/ssi/xlnx-versal-ospi.c
140
@@ -XXX,XX +XXX,XX @@
141
+/*
142
+ * QEMU model of Xilinx Versal's OSPI controller.
143
+ *
144
+ * Copyright (c) 2021 Xilinx Inc.
145
+ * Written by Francisco Iglesias <francisco.iglesias@xilinx.com>
146
+ *
147
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
148
+ * of this software and associated documentation files (the "Software"), to deal
149
+ * in the Software without restriction, including without limitation the rights
150
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
151
+ * copies of the Software, and to permit persons to whom the Software is
152
+ * furnished to do so, subject to the following conditions:
153
+ *
154
+ * The above copyright notice and this permission notice shall be included in
155
+ * all copies or substantial portions of the Software.
156
+ *
157
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
158
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
159
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
160
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
161
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
162
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
163
+ * THE SOFTWARE.
164
+ */
165
+#include "qemu/osdep.h"
166
+#include "hw/sysbus.h"
167
+#include "migration/vmstate.h"
168
+#include "hw/qdev-properties.h"
169
+#include "qemu/bitops.h"
170
+#include "qemu/log.h"
171
+#include "hw/irq.h"
172
+#include "hw/ssi/xlnx-versal-ospi.h"
173
+
174
+#ifndef XILINX_VERSAL_OSPI_ERR_DEBUG
175
+#define XILINX_VERSAL_OSPI_ERR_DEBUG 0
176
+#endif
177
+
178
+REG32(CONFIG_REG, 0x0)
179
+ FIELD(CONFIG_REG, IDLE_FLD, 31, 1)
180
+ FIELD(CONFIG_REG, DUAL_BYTE_OPCODE_EN_FLD, 30, 1)
181
+ FIELD(CONFIG_REG, CRC_ENABLE_FLD, 29, 1)
182
+ FIELD(CONFIG_REG, CONFIG_RESV2_FLD, 26, 3)
183
+ FIELD(CONFIG_REG, PIPELINE_PHY_FLD, 25, 1)
184
+ FIELD(CONFIG_REG, ENABLE_DTR_PROTOCOL_FLD, 24, 1)
185
+ FIELD(CONFIG_REG, ENABLE_AHB_DECODER_FLD, 23, 1)
186
+ FIELD(CONFIG_REG, MSTR_BAUD_DIV_FLD, 19, 4)
187
+ FIELD(CONFIG_REG, ENTER_XIP_MODE_IMM_FLD, 18, 1)
188
+ FIELD(CONFIG_REG, ENTER_XIP_MODE_FLD, 17, 1)
189
+ FIELD(CONFIG_REG, ENB_AHB_ADDR_REMAP_FLD, 16, 1)
190
+ FIELD(CONFIG_REG, ENB_DMA_IF_FLD, 15, 1)
191
+ FIELD(CONFIG_REG, WR_PROT_FLASH_FLD, 14, 1)
192
+ FIELD(CONFIG_REG, PERIPH_CS_LINES_FLD, 10, 4)
193
+ FIELD(CONFIG_REG, PERIPH_SEL_DEC_FLD, 9, 1)
194
+ FIELD(CONFIG_REG, ENB_LEGACY_IP_MODE_FLD, 8, 1)
195
+ FIELD(CONFIG_REG, ENB_DIR_ACC_CTLR_FLD, 7, 1)
196
+ FIELD(CONFIG_REG, RESET_CFG_FLD, 6, 1)
197
+ FIELD(CONFIG_REG, RESET_PIN_FLD, 5, 1)
198
+ FIELD(CONFIG_REG, HOLD_PIN_FLD, 4, 1)
199
+ FIELD(CONFIG_REG, PHY_MODE_ENABLE_FLD, 3, 1)
200
+ FIELD(CONFIG_REG, SEL_CLK_PHASE_FLD, 2, 1)
201
+ FIELD(CONFIG_REG, SEL_CLK_POL_FLD, 1, 1)
202
+ FIELD(CONFIG_REG, ENB_SPI_FLD, 0, 1)
203
+REG32(DEV_INSTR_RD_CONFIG_REG, 0x4)
204
+ FIELD(DEV_INSTR_RD_CONFIG_REG, RD_INSTR_RESV5_FLD, 29, 3)
205
+ FIELD(DEV_INSTR_RD_CONFIG_REG, DUMMY_RD_CLK_CYCLES_FLD, 24, 5)
206
+ FIELD(DEV_INSTR_RD_CONFIG_REG, RD_INSTR_RESV4_FLD, 21, 3)
207
+ FIELD(DEV_INSTR_RD_CONFIG_REG, MODE_BIT_ENABLE_FLD, 20, 1)
208
+ FIELD(DEV_INSTR_RD_CONFIG_REG, RD_INSTR_RESV3_FLD, 18, 2)
209
+ FIELD(DEV_INSTR_RD_CONFIG_REG, DATA_XFER_TYPE_EXT_MODE_FLD, 16, 2)
210
+ FIELD(DEV_INSTR_RD_CONFIG_REG, RD_INSTR_RESV2_FLD, 14, 2)
211
+ FIELD(DEV_INSTR_RD_CONFIG_REG, ADDR_XFER_TYPE_STD_MODE_FLD, 12, 2)
212
+ FIELD(DEV_INSTR_RD_CONFIG_REG, PRED_DIS_FLD, 11, 1)
213
+ FIELD(DEV_INSTR_RD_CONFIG_REG, DDR_EN_FLD, 10, 1)
214
+ FIELD(DEV_INSTR_RD_CONFIG_REG, INSTR_TYPE_FLD, 8, 2)
215
+ FIELD(DEV_INSTR_RD_CONFIG_REG, RD_OPCODE_NON_XIP_FLD, 0, 8)
216
+REG32(DEV_INSTR_WR_CONFIG_REG, 0x8)
217
+ FIELD(DEV_INSTR_WR_CONFIG_REG, WR_INSTR_RESV4_FLD, 29, 3)
218
+ FIELD(DEV_INSTR_WR_CONFIG_REG, DUMMY_WR_CLK_CYCLES_FLD, 24, 5)
219
+ FIELD(DEV_INSTR_WR_CONFIG_REG, WR_INSTR_RESV3_FLD, 18, 6)
220
+ FIELD(DEV_INSTR_WR_CONFIG_REG, DATA_XFER_TYPE_EXT_MODE_FLD, 16, 2)
221
+ FIELD(DEV_INSTR_WR_CONFIG_REG, WR_INSTR_RESV2_FLD, 14, 2)
222
+ FIELD(DEV_INSTR_WR_CONFIG_REG, ADDR_XFER_TYPE_STD_MODE_FLD, 12, 2)
223
+ FIELD(DEV_INSTR_WR_CONFIG_REG, WR_INSTR_RESV1_FLD, 9, 3)
224
+ FIELD(DEV_INSTR_WR_CONFIG_REG, WEL_DIS_FLD, 8, 1)
225
+ FIELD(DEV_INSTR_WR_CONFIG_REG, WR_OPCODE_FLD, 0, 8)
226
+REG32(DEV_DELAY_REG, 0xc)
227
+ FIELD(DEV_DELAY_REG, D_NSS_FLD, 24, 8)
228
+ FIELD(DEV_DELAY_REG, D_BTWN_FLD, 16, 8)
229
+ FIELD(DEV_DELAY_REG, D_AFTER_FLD, 8, 8)
230
+ FIELD(DEV_DELAY_REG, D_INIT_FLD, 0, 8)
231
+REG32(RD_DATA_CAPTURE_REG, 0x10)
232
+ FIELD(RD_DATA_CAPTURE_REG, RD_DATA_RESV3_FLD, 20, 12)
233
+ FIELD(RD_DATA_CAPTURE_REG, DDR_READ_DELAY_FLD, 16, 4)
234
+ FIELD(RD_DATA_CAPTURE_REG, RD_DATA_RESV2_FLD, 9, 7)
235
+ FIELD(RD_DATA_CAPTURE_REG, DQS_ENABLE_FLD, 8, 1)
236
+ FIELD(RD_DATA_CAPTURE_REG, RD_DATA_RESV1_FLD, 6, 2)
237
+ FIELD(RD_DATA_CAPTURE_REG, SAMPLE_EDGE_SEL_FLD, 5, 1)
238
+ FIELD(RD_DATA_CAPTURE_REG, DELAY_FLD, 1, 4)
239
+ FIELD(RD_DATA_CAPTURE_REG, BYPASS_FLD, 0, 1)
240
+REG32(DEV_SIZE_CONFIG_REG, 0x14)
241
+ FIELD(DEV_SIZE_CONFIG_REG, DEV_SIZE_RESV_FLD, 29, 3)
242
+ FIELD(DEV_SIZE_CONFIG_REG, MEM_SIZE_ON_CS3_FLD, 27, 2)
243
+ FIELD(DEV_SIZE_CONFIG_REG, MEM_SIZE_ON_CS2_FLD, 25, 2)
244
+ FIELD(DEV_SIZE_CONFIG_REG, MEM_SIZE_ON_CS1_FLD, 23, 2)
245
+ FIELD(DEV_SIZE_CONFIG_REG, MEM_SIZE_ON_CS0_FLD, 21, 2)
246
+ FIELD(DEV_SIZE_CONFIG_REG, BYTES_PER_SUBSECTOR_FLD, 16, 5)
247
+ FIELD(DEV_SIZE_CONFIG_REG, BYTES_PER_DEVICE_PAGE_FLD, 4, 12)
248
+ FIELD(DEV_SIZE_CONFIG_REG, NUM_ADDR_BYTES_FLD, 0, 4)
249
+REG32(SRAM_PARTITION_CFG_REG, 0x18)
250
+ FIELD(SRAM_PARTITION_CFG_REG, SRAM_PARTITION_RESV_FLD, 8, 24)
251
+ FIELD(SRAM_PARTITION_CFG_REG, ADDR_FLD, 0, 8)
252
+REG32(IND_AHB_ADDR_TRIGGER_REG, 0x1c)
253
+REG32(DMA_PERIPH_CONFIG_REG, 0x20)
254
+ FIELD(DMA_PERIPH_CONFIG_REG, DMA_PERIPH_RESV2_FLD, 12, 20)
255
+ FIELD(DMA_PERIPH_CONFIG_REG, NUM_BURST_REQ_BYTES_FLD, 8, 4)
256
+ FIELD(DMA_PERIPH_CONFIG_REG, DMA_PERIPH_RESV1_FLD, 4, 4)
257
+ FIELD(DMA_PERIPH_CONFIG_REG, NUM_SINGLE_REQ_BYTES_FLD, 0, 4)
258
+REG32(REMAP_ADDR_REG, 0x24)
259
+REG32(MODE_BIT_CONFIG_REG, 0x28)
260
+ FIELD(MODE_BIT_CONFIG_REG, RX_CRC_DATA_LOW_FLD, 24, 8)
261
+ FIELD(MODE_BIT_CONFIG_REG, RX_CRC_DATA_UP_FLD, 16, 8)
262
+ FIELD(MODE_BIT_CONFIG_REG, CRC_OUT_ENABLE_FLD, 15, 1)
263
+ FIELD(MODE_BIT_CONFIG_REG, MODE_BIT_RESV1_FLD, 11, 4)
264
+ FIELD(MODE_BIT_CONFIG_REG, CHUNK_SIZE_FLD, 8, 3)
265
+ FIELD(MODE_BIT_CONFIG_REG, MODE_FLD, 0, 8)
266
+REG32(SRAM_FILL_REG, 0x2c)
267
+ FIELD(SRAM_FILL_REG, SRAM_FILL_INDAC_WRITE_FLD, 16, 16)
268
+ FIELD(SRAM_FILL_REG, SRAM_FILL_INDAC_READ_FLD, 0, 16)
269
+REG32(TX_THRESH_REG, 0x30)
270
+ FIELD(TX_THRESH_REG, TX_THRESH_RESV_FLD, 5, 27)
271
+ FIELD(TX_THRESH_REG, LEVEL_FLD, 0, 5)
272
+REG32(RX_THRESH_REG, 0x34)
273
+ FIELD(RX_THRESH_REG, RX_THRESH_RESV_FLD, 5, 27)
274
+ FIELD(RX_THRESH_REG, LEVEL_FLD, 0, 5)
275
+REG32(WRITE_COMPLETION_CTRL_REG, 0x38)
276
+ FIELD(WRITE_COMPLETION_CTRL_REG, POLL_REP_DELAY_FLD, 24, 8)
277
+ FIELD(WRITE_COMPLETION_CTRL_REG, POLL_COUNT_FLD, 16, 8)
278
+ FIELD(WRITE_COMPLETION_CTRL_REG, ENABLE_POLLING_EXP_FLD, 15, 1)
279
+ FIELD(WRITE_COMPLETION_CTRL_REG, DISABLE_POLLING_FLD, 14, 1)
280
+ FIELD(WRITE_COMPLETION_CTRL_REG, POLLING_POLARITY_FLD, 13, 1)
281
+ FIELD(WRITE_COMPLETION_CTRL_REG, WR_COMP_CTRL_RESV1_FLD, 12, 1)
282
+ FIELD(WRITE_COMPLETION_CTRL_REG, POLLING_ADDR_EN_FLD, 11, 1)
283
+ FIELD(WRITE_COMPLETION_CTRL_REG, POLLING_BIT_INDEX_FLD, 8, 3)
284
+ FIELD(WRITE_COMPLETION_CTRL_REG, OPCODE_FLD, 0, 8)
285
+REG32(NO_OF_POLLS_BEF_EXP_REG, 0x3c)
286
+REG32(IRQ_STATUS_REG, 0x40)
287
+ FIELD(IRQ_STATUS_REG, IRQ_STAT_RESV_FLD, 20, 12)
288
+ FIELD(IRQ_STATUS_REG, ECC_FAIL_FLD, 19, 1)
289
+ FIELD(IRQ_STATUS_REG, TX_CRC_CHUNK_BRK_FLD, 18, 1)
290
+ FIELD(IRQ_STATUS_REG, RX_CRC_DATA_VAL_FLD, 17, 1)
291
+ FIELD(IRQ_STATUS_REG, RX_CRC_DATA_ERR_FLD, 16, 1)
292
+ FIELD(IRQ_STATUS_REG, IRQ_STAT_RESV1_FLD, 15, 1)
293
+ FIELD(IRQ_STATUS_REG, STIG_REQ_INT_FLD, 14, 1)
294
+ FIELD(IRQ_STATUS_REG, POLL_EXP_INT_FLD, 13, 1)
295
+ FIELD(IRQ_STATUS_REG, INDRD_SRAM_FULL_FLD, 12, 1)
296
+ FIELD(IRQ_STATUS_REG, RX_FIFO_FULL_FLD, 11, 1)
297
+ FIELD(IRQ_STATUS_REG, RX_FIFO_NOT_EMPTY_FLD, 10, 1)
298
+ FIELD(IRQ_STATUS_REG, TX_FIFO_FULL_FLD, 9, 1)
299
+ FIELD(IRQ_STATUS_REG, TX_FIFO_NOT_FULL_FLD, 8, 1)
300
+ FIELD(IRQ_STATUS_REG, RECV_OVERFLOW_FLD, 7, 1)
301
+ FIELD(IRQ_STATUS_REG, INDIRECT_XFER_LEVEL_BREACH_FLD, 6, 1)
302
+ FIELD(IRQ_STATUS_REG, ILLEGAL_ACCESS_DET_FLD, 5, 1)
303
+ FIELD(IRQ_STATUS_REG, PROT_WR_ATTEMPT_FLD, 4, 1)
304
+ FIELD(IRQ_STATUS_REG, INDIRECT_TRANSFER_REJECT_FLD, 3, 1)
305
+ FIELD(IRQ_STATUS_REG, INDIRECT_OP_DONE_FLD, 2, 1)
306
+ FIELD(IRQ_STATUS_REG, UNDERFLOW_DET_FLD, 1, 1)
307
+ FIELD(IRQ_STATUS_REG, MODE_M_FAIL_FLD, 0, 1)
308
+REG32(IRQ_MASK_REG, 0x44)
309
+ FIELD(IRQ_MASK_REG, IRQ_MASK_RESV_FLD, 20, 12)
310
+ FIELD(IRQ_MASK_REG, ECC_FAIL_MASK_FLD, 19, 1)
311
+ FIELD(IRQ_MASK_REG, TX_CRC_CHUNK_BRK_MASK_FLD, 18, 1)
312
+ FIELD(IRQ_MASK_REG, RX_CRC_DATA_VAL_MASK_FLD, 17, 1)
313
+ FIELD(IRQ_MASK_REG, RX_CRC_DATA_ERR_MASK_FLD, 16, 1)
314
+ FIELD(IRQ_MASK_REG, IRQ_MASK_RESV1_FLD, 15, 1)
315
+ FIELD(IRQ_MASK_REG, STIG_REQ_MASK_FLD, 14, 1)
316
+ FIELD(IRQ_MASK_REG, POLL_EXP_INT_MASK_FLD, 13, 1)
317
+ FIELD(IRQ_MASK_REG, INDRD_SRAM_FULL_MASK_FLD, 12, 1)
318
+ FIELD(IRQ_MASK_REG, RX_FIFO_FULL_MASK_FLD, 11, 1)
319
+ FIELD(IRQ_MASK_REG, RX_FIFO_NOT_EMPTY_MASK_FLD, 10, 1)
320
+ FIELD(IRQ_MASK_REG, TX_FIFO_FULL_MASK_FLD, 9, 1)
321
+ FIELD(IRQ_MASK_REG, TX_FIFO_NOT_FULL_MASK_FLD, 8, 1)
322
+ FIELD(IRQ_MASK_REG, RECV_OVERFLOW_MASK_FLD, 7, 1)
323
+ FIELD(IRQ_MASK_REG, INDIRECT_XFER_LEVEL_BREACH_MASK_FLD, 6, 1)
324
+ FIELD(IRQ_MASK_REG, ILLEGAL_ACCESS_DET_MASK_FLD, 5, 1)
325
+ FIELD(IRQ_MASK_REG, PROT_WR_ATTEMPT_MASK_FLD, 4, 1)
326
+ FIELD(IRQ_MASK_REG, INDIRECT_TRANSFER_REJECT_MASK_FLD, 3, 1)
327
+ FIELD(IRQ_MASK_REG, INDIRECT_OP_DONE_MASK_FLD, 2, 1)
328
+ FIELD(IRQ_MASK_REG, UNDERFLOW_DET_MASK_FLD, 1, 1)
329
+ FIELD(IRQ_MASK_REG, MODE_M_FAIL_MASK_FLD, 0, 1)
330
+REG32(LOWER_WR_PROT_REG, 0x50)
331
+REG32(UPPER_WR_PROT_REG, 0x54)
332
+REG32(WR_PROT_CTRL_REG, 0x58)
333
+ FIELD(WR_PROT_CTRL_REG, WR_PROT_CTRL_RESV_FLD, 2, 30)
334
+ FIELD(WR_PROT_CTRL_REG, ENB_FLD, 1, 1)
335
+ FIELD(WR_PROT_CTRL_REG, INV_FLD, 0, 1)
336
+REG32(INDIRECT_READ_XFER_CTRL_REG, 0x60)
337
+ FIELD(INDIRECT_READ_XFER_CTRL_REG, INDIR_RD_XFER_RESV_FLD, 8, 24)
338
+ FIELD(INDIRECT_READ_XFER_CTRL_REG, NUM_IND_OPS_DONE_FLD, 6, 2)
339
+ FIELD(INDIRECT_READ_XFER_CTRL_REG, IND_OPS_DONE_STATUS_FLD, 5, 1)
340
+ FIELD(INDIRECT_READ_XFER_CTRL_REG, RD_QUEUED_FLD, 4, 1)
341
+ FIELD(INDIRECT_READ_XFER_CTRL_REG, SRAM_FULL_FLD, 3, 1)
342
+ FIELD(INDIRECT_READ_XFER_CTRL_REG, RD_STATUS_FLD, 2, 1)
343
+ FIELD(INDIRECT_READ_XFER_CTRL_REG, CANCEL_FLD, 1, 1)
344
+ FIELD(INDIRECT_READ_XFER_CTRL_REG, START_FLD, 0, 1)
345
+REG32(INDIRECT_READ_XFER_WATERMARK_REG, 0x64)
346
+REG32(INDIRECT_READ_XFER_START_REG, 0x68)
347
+REG32(INDIRECT_READ_XFER_NUM_BYTES_REG, 0x6c)
348
+REG32(INDIRECT_WRITE_XFER_CTRL_REG, 0x70)
349
+ FIELD(INDIRECT_WRITE_XFER_CTRL_REG, INDIR_WR_XFER_RESV2_FLD, 8, 24)
350
+ FIELD(INDIRECT_WRITE_XFER_CTRL_REG, NUM_IND_OPS_DONE_FLD, 6, 2)
351
+ FIELD(INDIRECT_WRITE_XFER_CTRL_REG, IND_OPS_DONE_STATUS_FLD, 5, 1)
352
+ FIELD(INDIRECT_WRITE_XFER_CTRL_REG, WR_QUEUED_FLD, 4, 1)
353
+ FIELD(INDIRECT_WRITE_XFER_CTRL_REG, INDIR_WR_XFER_RESV1_FLD, 3, 1)
354
+ FIELD(INDIRECT_WRITE_XFER_CTRL_REG, WR_STATUS_FLD, 2, 1)
355
+ FIELD(INDIRECT_WRITE_XFER_CTRL_REG, CANCEL_FLD, 1, 1)
356
+ FIELD(INDIRECT_WRITE_XFER_CTRL_REG, START_FLD, 0, 1)
357
+REG32(INDIRECT_WRITE_XFER_WATERMARK_REG, 0x74)
358
+REG32(INDIRECT_WRITE_XFER_START_REG, 0x78)
359
+REG32(INDIRECT_WRITE_XFER_NUM_BYTES_REG, 0x7c)
360
+REG32(INDIRECT_TRIGGER_ADDR_RANGE_REG, 0x80)
361
+ FIELD(INDIRECT_TRIGGER_ADDR_RANGE_REG, IND_RANGE_RESV1_FLD, 4, 28)
362
+ FIELD(INDIRECT_TRIGGER_ADDR_RANGE_REG, IND_RANGE_WIDTH_FLD, 0, 4)
363
+REG32(FLASH_COMMAND_CTRL_MEM_REG, 0x8c)
364
+ FIELD(FLASH_COMMAND_CTRL_MEM_REG, FLASH_COMMAND_CTRL_MEM_RESV1_FLD, 29, 3)
365
+ FIELD(FLASH_COMMAND_CTRL_MEM_REG, MEM_BANK_ADDR_FLD, 20, 9)
366
+ FIELD(FLASH_COMMAND_CTRL_MEM_REG, FLASH_COMMAND_CTRL_MEM_RESV2_FLD, 19, 1)
367
+ FIELD(FLASH_COMMAND_CTRL_MEM_REG, NB_OF_STIG_READ_BYTES_FLD, 16, 3)
368
+ FIELD(FLASH_COMMAND_CTRL_MEM_REG, MEM_BANK_READ_DATA_FLD, 8, 8)
369
+ FIELD(FLASH_COMMAND_CTRL_MEM_REG, FLASH_COMMAND_CTRL_MEM_RESV3_FLD, 2, 6)
370
+ FIELD(FLASH_COMMAND_CTRL_MEM_REG, MEM_BANK_REQ_IN_PROGRESS_FLD, 1, 1)
371
+ FIELD(FLASH_COMMAND_CTRL_MEM_REG, TRIGGER_MEM_BANK_REQ_FLD, 0, 1)
372
+REG32(FLASH_CMD_CTRL_REG, 0x90)
373
+ FIELD(FLASH_CMD_CTRL_REG, CMD_OPCODE_FLD, 24, 8)
374
+ FIELD(FLASH_CMD_CTRL_REG, ENB_READ_DATA_FLD, 23, 1)
375
+ FIELD(FLASH_CMD_CTRL_REG, NUM_RD_DATA_BYTES_FLD, 20, 3)
376
+ FIELD(FLASH_CMD_CTRL_REG, ENB_COMD_ADDR_FLD, 19, 1)
377
+ FIELD(FLASH_CMD_CTRL_REG, ENB_MODE_BIT_FLD, 18, 1)
378
+ FIELD(FLASH_CMD_CTRL_REG, NUM_ADDR_BYTES_FLD, 16, 2)
379
+ FIELD(FLASH_CMD_CTRL_REG, ENB_WRITE_DATA_FLD, 15, 1)
380
+ FIELD(FLASH_CMD_CTRL_REG, NUM_WR_DATA_BYTES_FLD, 12, 3)
381
+ FIELD(FLASH_CMD_CTRL_REG, NUM_DUMMY_CYCLES_FLD, 7, 5)
382
+ FIELD(FLASH_CMD_CTRL_REG, FLASH_CMD_CTRL_RESV1_FLD, 3, 4)
383
+ FIELD(FLASH_CMD_CTRL_REG, STIG_MEM_BANK_EN_FLD, 2, 1)
384
+ FIELD(FLASH_CMD_CTRL_REG, CMD_EXEC_STATUS_FLD, 1, 1)
385
+ FIELD(FLASH_CMD_CTRL_REG, CMD_EXEC_FLD, 0, 1)
386
+REG32(FLASH_CMD_ADDR_REG, 0x94)
387
+REG32(FLASH_RD_DATA_LOWER_REG, 0xa0)
388
+REG32(FLASH_RD_DATA_UPPER_REG, 0xa4)
389
+REG32(FLASH_WR_DATA_LOWER_REG, 0xa8)
390
+REG32(FLASH_WR_DATA_UPPER_REG, 0xac)
391
+REG32(POLLING_FLASH_STATUS_REG, 0xb0)
392
+ FIELD(POLLING_FLASH_STATUS_REG, DEVICE_STATUS_RSVD_FLD2, 21, 11)
393
+ FIELD(POLLING_FLASH_STATUS_REG, DEVICE_STATUS_NB_DUMMY, 16, 5)
394
+ FIELD(POLLING_FLASH_STATUS_REG, DEVICE_STATUS_RSVD_FLD1, 9, 7)
395
+ FIELD(POLLING_FLASH_STATUS_REG, DEVICE_STATUS_VALID_FLD, 8, 1)
396
+ FIELD(POLLING_FLASH_STATUS_REG, DEVICE_STATUS_FLD, 0, 8)
397
+REG32(PHY_CONFIGURATION_REG, 0xb4)
398
+ FIELD(PHY_CONFIGURATION_REG, PHY_CONFIG_RESYNC_FLD, 31, 1)
399
+ FIELD(PHY_CONFIGURATION_REG, PHY_CONFIG_RESET_FLD, 30, 1)
400
+ FIELD(PHY_CONFIGURATION_REG, PHY_CONFIG_RX_DLL_BYPASS_FLD, 29, 1)
401
+ FIELD(PHY_CONFIGURATION_REG, PHY_CONFIG_RESV2_FLD, 23, 6)
402
+ FIELD(PHY_CONFIGURATION_REG, PHY_CONFIG_TX_DLL_DELAY_FLD, 16, 7)
403
+ FIELD(PHY_CONFIGURATION_REG, PHY_CONFIG_RESV1_FLD, 7, 9)
404
+ FIELD(PHY_CONFIGURATION_REG, PHY_CONFIG_RX_DLL_DELAY_FLD, 0, 7)
405
+REG32(PHY_MASTER_CONTROL_REG, 0xb8)
406
+ FIELD(PHY_MASTER_CONTROL_REG, PHY_MASTER_CONTROL_RESV3_FLD, 25, 7)
407
+ FIELD(PHY_MASTER_CONTROL_REG, PHY_MASTER_LOCK_MODE_FLD, 24, 1)
408
+ FIELD(PHY_MASTER_CONTROL_REG, PHY_MASTER_BYPASS_MODE_FLD, 23, 1)
409
+ FIELD(PHY_MASTER_CONTROL_REG, PHY_MASTER_PHASE_DETECT_SELECTOR_FLD, 20, 3)
410
+ FIELD(PHY_MASTER_CONTROL_REG, PHY_MASTER_CONTROL_RESV2_FLD, 19, 1)
411
+ FIELD(PHY_MASTER_CONTROL_REG, PHY_MASTER_NB_INDICATIONS_FLD, 16, 3)
412
+ FIELD(PHY_MASTER_CONTROL_REG, PHY_MASTER_CONTROL_RESV1_FLD, 7, 9)
413
+ FIELD(PHY_MASTER_CONTROL_REG, PHY_MASTER_INITIAL_DELAY_FLD, 0, 7)
414
+REG32(DLL_OBSERVABLE_LOWER_REG, 0xbc)
415
+ FIELD(DLL_OBSERVABLE_LOWER_REG,
416
+ DLL_OBSERVABLE_LOWER_DLL_LOCK_INC_FLD, 24, 8)
417
+ FIELD(DLL_OBSERVABLE_LOWER_REG,
418
+ DLL_OBSERVABLE_LOWER_DLL_LOCK_DEC_FLD, 16, 8)
419
+ FIELD(DLL_OBSERVABLE_LOWER_REG,
420
+ DLL_OBSERVABLE_LOWER_LOOPBACK_LOCK_FLD, 15, 1)
421
+ FIELD(DLL_OBSERVABLE_LOWER_REG,
422
+ DLL_OBSERVABLE_LOWER_LOCK_VALUE_FLD, 8, 7)
423
+ FIELD(DLL_OBSERVABLE_LOWER_REG,
424
+ DLL_OBSERVABLE_LOWER_UNLOCK_COUNTER_FLD, 3, 5)
425
+ FIELD(DLL_OBSERVABLE_LOWER_REG,
426
+ DLL_OBSERVABLE_LOWER_LOCK_MODE_FLD, 1, 2)
427
+ FIELD(DLL_OBSERVABLE_LOWER_REG,
428
+ DLL_OBSERVABLE_LOWER_DLL_LOCK_FLD, 0, 1)
429
+REG32(DLL_OBSERVABLE_UPPER_REG, 0xc0)
430
+ FIELD(DLL_OBSERVABLE_UPPER_REG,
431
+ DLL_OBSERVABLE_UPPER_RESV2_FLD, 23, 9)
432
+ FIELD(DLL_OBSERVABLE_UPPER_REG,
433
+ DLL_OBSERVABLE_UPPER_TX_DECODER_OUTPUT_FLD, 16, 7)
434
+ FIELD(DLL_OBSERVABLE_UPPER_REG,
435
+ DLL_OBSERVABLE_UPPER_RESV1_FLD, 7, 9)
436
+ FIELD(DLL_OBSERVABLE_UPPER_REG,
437
+ DLL_OBSERVABLE__UPPER_RX_DECODER_OUTPUT_FLD, 0, 7)
438
+REG32(OPCODE_EXT_LOWER_REG, 0xe0)
439
+ FIELD(OPCODE_EXT_LOWER_REG, EXT_READ_OPCODE_FLD, 24, 8)
440
+ FIELD(OPCODE_EXT_LOWER_REG, EXT_WRITE_OPCODE_FLD, 16, 8)
441
+ FIELD(OPCODE_EXT_LOWER_REG, EXT_POLL_OPCODE_FLD, 8, 8)
442
+ FIELD(OPCODE_EXT_LOWER_REG, EXT_STIG_OPCODE_FLD, 0, 8)
443
+REG32(OPCODE_EXT_UPPER_REG, 0xe4)
444
+ FIELD(OPCODE_EXT_UPPER_REG, WEL_OPCODE_FLD, 24, 8)
445
+ FIELD(OPCODE_EXT_UPPER_REG, EXT_WEL_OPCODE_FLD, 16, 8)
446
+ FIELD(OPCODE_EXT_UPPER_REG, OPCODE_EXT_UPPER_RESV1_FLD, 0, 16)
447
+REG32(MODULE_ID_REG, 0xfc)
448
+ FIELD(MODULE_ID_REG, FIX_PATCH_FLD, 24, 8)
449
+ FIELD(MODULE_ID_REG, MODULE_ID_FLD, 8, 16)
450
+ FIELD(MODULE_ID_REG, MODULE_ID_RESV_FLD, 2, 6)
451
+ FIELD(MODULE_ID_REG, CONF_FLD, 0, 2)
452
+
453
+#define RXFF_SZ 1024
454
+#define TXFF_SZ 1024
455
+
456
+#define MAX_RX_DEC_OUT 8
457
+
458
+#define SZ_512MBIT (512 * 1024 * 1024)
459
+#define SZ_1GBIT (1024 * 1024 * 1024)
460
+#define SZ_2GBIT (2ULL * SZ_1GBIT)
461
+#define SZ_4GBIT (4ULL * SZ_1GBIT)
462
+
463
+#define IS_IND_DMA_START(op) (op->done_bytes == 0)
464
+/*
465
+ * Bit field size of R_INDIRECT_WRITE_XFER_CTRL_REG_NUM_IND_OPS_DONE_FLD
466
+ * is 2 bits, which can record max of 3 indac operations.
467
+ */
468
+#define IND_OPS_DONE_MAX 3
469
+
470
+typedef enum {
471
+ WREN = 0x6,
472
+} FlashCMD;
473
+
474
+static unsigned int ospi_stig_addr_len(XlnxVersalOspi *s)
475
+{
476
+ /* Num address bytes is NUM_ADDR_BYTES_FLD + 1 */
477
+ return ARRAY_FIELD_EX32(s->regs,
478
+ FLASH_CMD_CTRL_REG, NUM_ADDR_BYTES_FLD) + 1;
479
+}
480
+
481
+static unsigned int ospi_stig_wr_data_len(XlnxVersalOspi *s)
482
+{
483
+ /* Num write data bytes is NUM_WR_DATA_BYTES_FLD + 1 */
484
+ return ARRAY_FIELD_EX32(s->regs,
485
+ FLASH_CMD_CTRL_REG, NUM_WR_DATA_BYTES_FLD) + 1;
486
+}
487
+
488
+static unsigned int ospi_stig_rd_data_len(XlnxVersalOspi *s)
489
+{
490
+ /* Num read data bytes is NUM_RD_DATA_BYTES_FLD + 1 */
491
+ return ARRAY_FIELD_EX32(s->regs,
492
+ FLASH_CMD_CTRL_REG, NUM_RD_DATA_BYTES_FLD) + 1;
493
+}
494
+
495
+/*
496
+ * Status bits in R_IRQ_STATUS_REG are set when the event occurs and the
497
+ * interrupt is enabled in the mask register ([1] Section 2.3.17)
498
+ */
499
+static void set_irq(XlnxVersalOspi *s, uint32_t set_mask)
500
+{
501
+ s->regs[R_IRQ_STATUS_REG] |= s->regs[R_IRQ_MASK_REG] & set_mask;
502
+}
503
+
504
+static void ospi_update_irq_line(XlnxVersalOspi *s)
505
+{
506
+ qemu_set_irq(s->irq, !!(s->regs[R_IRQ_STATUS_REG] &
507
+ s->regs[R_IRQ_MASK_REG]));
508
+}
509
+
510
+static uint8_t ospi_get_wr_opcode(XlnxVersalOspi *s)
511
+{
512
+ return ARRAY_FIELD_EX32(s->regs,
513
+ DEV_INSTR_WR_CONFIG_REG, WR_OPCODE_FLD);
514
+}
515
+
516
+static uint8_t ospi_get_rd_opcode(XlnxVersalOspi *s)
517
+{
518
+ return ARRAY_FIELD_EX32(s->regs,
519
+ DEV_INSTR_RD_CONFIG_REG, RD_OPCODE_NON_XIP_FLD);
520
+}
521
+
522
+static uint32_t ospi_get_num_addr_bytes(XlnxVersalOspi *s)
523
+{
524
+ /* Num address bytes is NUM_ADDR_BYTES_FLD + 1 */
525
+ return ARRAY_FIELD_EX32(s->regs,
526
+ DEV_SIZE_CONFIG_REG, NUM_ADDR_BYTES_FLD) + 1;
527
+}
528
+
529
+static void ospi_stig_membank_req(XlnxVersalOspi *s)
530
+{
531
+ int idx = ARRAY_FIELD_EX32(s->regs,
532
+ FLASH_COMMAND_CTRL_MEM_REG, MEM_BANK_ADDR_FLD);
533
+
534
+ ARRAY_FIELD_DP32(s->regs, FLASH_COMMAND_CTRL_MEM_REG,
535
+ MEM_BANK_READ_DATA_FLD, s->stig_membank[idx]);
536
+}
537
+
538
+static int ospi_stig_membank_rd_bytes(XlnxVersalOspi *s)
539
+{
540
+ int rd_data_fld = ARRAY_FIELD_EX32(s->regs, FLASH_COMMAND_CTRL_MEM_REG,
541
+ NB_OF_STIG_READ_BYTES_FLD);
542
+ static const int sizes[6] = { 16, 32, 64, 128, 256, 512 };
543
+ return (rd_data_fld < 6) ? sizes[rd_data_fld] : 0;
544
+}
545
+
546
+static uint32_t ospi_get_page_sz(XlnxVersalOspi *s)
547
+{
548
+ return ARRAY_FIELD_EX32(s->regs,
549
+ DEV_SIZE_CONFIG_REG, BYTES_PER_DEVICE_PAGE_FLD);
550
+}
551
+
552
+static bool ospi_ind_rd_watermark_enabled(XlnxVersalOspi *s)
553
+{
554
+ return s->regs[R_INDIRECT_READ_XFER_WATERMARK_REG];
555
+}
556
+
557
+static void ind_op_advance(IndOp *op, unsigned int len)
558
+{
559
+ op->done_bytes += len;
560
+ assert(op->done_bytes <= op->num_bytes);
561
+ if (op->done_bytes == op->num_bytes) {
562
+ op->completed = true;
563
+ }
564
+}
565
+
566
+static uint32_t ind_op_next_byte(IndOp *op)
567
+{
568
+ return op->flash_addr + op->done_bytes;
569
+}
570
+
571
+static uint32_t ind_op_end_byte(IndOp *op)
572
+{
573
+ return op->flash_addr + op->num_bytes;
574
+}
575
+
576
+static void ospi_ind_op_next(IndOp *op)
577
+{
578
+ op[0] = op[1];
579
+ op[1].completed = true;
580
+}
581
+
582
+static void ind_op_setup(IndOp *op, uint32_t flash_addr, uint32_t num_bytes)
583
+{
584
+ if (num_bytes & 0x3) {
585
+ qemu_log_mask(LOG_GUEST_ERROR,
586
+ "OSPI indirect op num bytes not word aligned\n");
587
+ }
588
+ op->flash_addr = flash_addr;
589
+ op->num_bytes = num_bytes;
590
+ op->done_bytes = 0;
591
+ op->completed = false;
592
+}
593
+
594
+static bool ospi_ind_op_completed(IndOp *op)
595
+{
596
+ return op->completed;
597
+}
598
+
599
+static bool ospi_ind_op_all_completed(XlnxVersalOspi *s)
600
+{
601
+ return s->rd_ind_op[0].completed && s->wr_ind_op[0].completed;
602
+}
603
+
604
+static void ospi_ind_op_cancel(IndOp *op)
605
+{
606
+ op[0].completed = true;
607
+ op[1].completed = true;
608
+}
609
+
610
+static bool ospi_ind_op_add(IndOp *op, Fifo8 *fifo,
611
+ uint32_t flash_addr, uint32_t num_bytes)
612
+{
613
+ /* Check if first indirect op has been completed */
614
+ if (op->completed) {
615
+ fifo8_reset(fifo);
616
+ ind_op_setup(op, flash_addr, num_bytes);
617
+ return false;
618
+ }
619
+
620
+ /* Check if second indirect op has been completed */
621
+ op++;
622
+ if (op->completed) {
623
+ ind_op_setup(op, flash_addr, num_bytes);
624
+ return false;
625
+ }
626
+ return true;
627
+}
628
+
629
+static void ospi_ind_op_queue_up_rd(XlnxVersalOspi *s)
630
+{
631
+ uint32_t num_bytes = s->regs[R_INDIRECT_READ_XFER_NUM_BYTES_REG];
632
+ uint32_t flash_addr = s->regs[R_INDIRECT_READ_XFER_START_REG];
633
+ bool failed;
634
+
635
+ failed = ospi_ind_op_add(s->rd_ind_op, &s->rx_sram, flash_addr, num_bytes);
636
+ /* If two already queued set rd reject interrupt */
637
+ if (failed) {
638
+ set_irq(s, R_IRQ_STATUS_REG_INDIRECT_TRANSFER_REJECT_FLD_MASK);
639
+ }
640
+}
641
+
642
+static void ospi_ind_op_queue_up_wr(XlnxVersalOspi *s)
643
+{
644
+ uint32_t num_bytes = s->regs[R_INDIRECT_WRITE_XFER_NUM_BYTES_REG];
645
+ uint32_t flash_addr = s->regs[R_INDIRECT_WRITE_XFER_START_REG];
646
+ bool failed;
647
+
648
+ failed = ospi_ind_op_add(s->wr_ind_op, &s->tx_sram, flash_addr, num_bytes);
649
+ /* If two already queued set rd reject interrupt */
650
+ if (failed) {
651
+ set_irq(s, R_IRQ_STATUS_REG_INDIRECT_TRANSFER_REJECT_FLD_MASK);
652
+ }
653
+}
654
+
655
+static uint64_t flash_sz(XlnxVersalOspi *s, unsigned int cs)
656
+{
657
+ /* Flash sizes in MB */
658
+ static const uint64_t sizes[4] = { SZ_512MBIT / 8, SZ_1GBIT / 8,
659
+ SZ_2GBIT / 8, SZ_4GBIT / 8 };
660
+ uint32_t v = s->regs[R_DEV_SIZE_CONFIG_REG];
661
+
662
+ v >>= cs * R_DEV_SIZE_CONFIG_REG_MEM_SIZE_ON_CS0_FLD_LENGTH;
663
+ return sizes[FIELD_EX32(v, DEV_SIZE_CONFIG_REG, MEM_SIZE_ON_CS0_FLD)];
664
+}
665
+
666
+static unsigned int ospi_get_block_sz(XlnxVersalOspi *s)
667
+{
668
+ unsigned int block_fld = ARRAY_FIELD_EX32(s->regs,
669
+ DEV_SIZE_CONFIG_REG,
670
+ BYTES_PER_SUBSECTOR_FLD);
671
+ return 1 << block_fld;
672
+}
673
+
674
+static unsigned int flash_blocks(XlnxVersalOspi *s, unsigned int cs)
675
+{
676
+ unsigned int b_sz = ospi_get_block_sz(s);
677
+ unsigned int f_sz = flash_sz(s, cs);
678
+
679
+ return f_sz / b_sz;
680
+}
681
+
682
+static int ospi_ahb_decoder_cs(XlnxVersalOspi *s, hwaddr addr)
683
+{
684
+ uint64_t end_addr = 0;
685
+ int cs;
686
+
687
+ for (cs = 0; cs < s->num_cs; cs++) {
688
+ end_addr += flash_sz(s, cs);
689
+ if (addr < end_addr) {
113
+ break;
690
+ break;
114
+ }
691
+ }
115
+ }
692
+ }
116
+
693
+
117
pstate_write(env, PSTATE_DAIF | new_mode);
694
+ if (cs == s->num_cs) {
118
env->aarch64 = 1;
695
+ /* Address is out of range */
119
aarch64_restore_sp(env, new_el);
696
+ qemu_log_mask(LOG_GUEST_ERROR,
697
+ "OSPI flash address does not fit in configuration\n");
698
+ return -1;
699
+ }
700
+ return cs;
701
+}
702
+
703
+static void ospi_ahb_decoder_enable_cs(XlnxVersalOspi *s, hwaddr addr)
704
+{
705
+ int cs = ospi_ahb_decoder_cs(s, addr);
706
+
707
+ if (cs >= 0) {
708
+ for (int i = 0; i < s->num_cs; i++) {
709
+ qemu_set_irq(s->cs_lines[i], cs != i);
710
+ }
711
+ }
712
+}
713
+
714
+static unsigned int single_cs(XlnxVersalOspi *s)
715
+{
716
+ unsigned int field = ARRAY_FIELD_EX32(s->regs,
717
+ CONFIG_REG, PERIPH_CS_LINES_FLD);
718
+
719
+ /*
720
+ * Below one liner is a trick that finds the rightmost zero and makes sure
721
+ * all other bits are turned to 1. It is a variant of the 'Isolate the
722
+ * rightmost 0-bit' trick found below at the time of writing:
723
+ *
724
+ * https://emre.me/computer-science/bit-manipulation-tricks/
725
+ *
726
+ * 4'bXXX0 -> 4'b1110
727
+ * 4'bXX01 -> 4'b1101
728
+ * 4'bX011 -> 4'b1011
729
+ * 4'b0111 -> 4'b0111
730
+ * 4'b1111 -> 4'b1111
731
+ */
732
+ return (field | ~(field + 1)) & 0xf;
733
+}
734
+
735
+static void ospi_update_cs_lines(XlnxVersalOspi *s)
736
+{
737
+ unsigned int all_cs;
738
+ int i;
739
+
740
+ if (ARRAY_FIELD_EX32(s->regs, CONFIG_REG, PERIPH_SEL_DEC_FLD)) {
741
+ all_cs = ARRAY_FIELD_EX32(s->regs, CONFIG_REG, PERIPH_CS_LINES_FLD);
742
+ } else {
743
+ all_cs = single_cs(s);
744
+ }
745
+
746
+ for (i = 0; i < s->num_cs; i++) {
747
+ bool cs = (all_cs >> i) & 1;
748
+
749
+ qemu_set_irq(s->cs_lines[i], cs);
750
+ }
751
+}
752
+
753
+static void ospi_dac_cs(XlnxVersalOspi *s, hwaddr addr)
754
+{
755
+ if (ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENABLE_AHB_DECODER_FLD)) {
756
+ ospi_ahb_decoder_enable_cs(s, addr);
757
+ } else {
758
+ ospi_update_cs_lines(s);
759
+ }
760
+}
761
+
762
+static void ospi_disable_cs(XlnxVersalOspi *s)
763
+{
764
+ int i;
765
+
766
+ for (i = 0; i < s->num_cs; i++) {
767
+ qemu_set_irq(s->cs_lines[i], 1);
768
+ }
769
+}
770
+
771
+static void ospi_flush_txfifo(XlnxVersalOspi *s)
772
+{
773
+ while (!fifo8_is_empty(&s->tx_fifo)) {
774
+ uint32_t tx_rx = fifo8_pop(&s->tx_fifo);
775
+
776
+ tx_rx = ssi_transfer(s->spi, tx_rx);
777
+ fifo8_push(&s->rx_fifo, tx_rx);
778
+ }
779
+}
780
+
781
+static void ospi_tx_fifo_push_address_raw(XlnxVersalOspi *s,
782
+ uint32_t flash_addr,
783
+ unsigned int addr_bytes)
784
+{
785
+ /* Push write address */
786
+ if (addr_bytes == 4) {
787
+ fifo8_push(&s->tx_fifo, flash_addr >> 24);
788
+ }
789
+ if (addr_bytes >= 3) {
790
+ fifo8_push(&s->tx_fifo, flash_addr >> 16);
791
+ }
792
+ if (addr_bytes >= 2) {
793
+ fifo8_push(&s->tx_fifo, flash_addr >> 8);
794
+ }
795
+ fifo8_push(&s->tx_fifo, flash_addr);
796
+}
797
+
798
+static void ospi_tx_fifo_push_address(XlnxVersalOspi *s, uint32_t flash_addr)
799
+{
800
+ /* Push write address */
801
+ int addr_bytes = ospi_get_num_addr_bytes(s);
802
+
803
+ ospi_tx_fifo_push_address_raw(s, flash_addr, addr_bytes);
804
+}
805
+
806
+static void ospi_tx_fifo_push_stig_addr(XlnxVersalOspi *s)
807
+{
808
+ uint32_t flash_addr = s->regs[R_FLASH_CMD_ADDR_REG];
809
+ unsigned int addr_bytes = ospi_stig_addr_len(s);
810
+
811
+ ospi_tx_fifo_push_address_raw(s, flash_addr, addr_bytes);
812
+}
813
+
814
+static void ospi_tx_fifo_push_rd_op_addr(XlnxVersalOspi *s, uint32_t flash_addr)
815
+{
816
+ uint8_t inst_code = ospi_get_rd_opcode(s);
817
+
818
+ fifo8_reset(&s->tx_fifo);
819
+
820
+ /* Push read opcode */
821
+ fifo8_push(&s->tx_fifo, inst_code);
822
+
823
+ /* Push read address */
824
+ ospi_tx_fifo_push_address(s, flash_addr);
825
+}
826
+
827
+static void ospi_tx_fifo_push_stig_wr_data(XlnxVersalOspi *s)
828
+{
829
+ uint64_t data = s->regs[R_FLASH_WR_DATA_LOWER_REG];
830
+ int wr_data_len = ospi_stig_wr_data_len(s);
831
+ int i;
832
+
833
+ data |= (uint64_t) s->regs[R_FLASH_WR_DATA_UPPER_REG] << 32;
834
+ for (i = 0; i < wr_data_len; i++) {
835
+ int shift = i * 8;
836
+ fifo8_push(&s->tx_fifo, data >> shift);
837
+ }
838
+}
839
+
840
+static void ospi_tx_fifo_push_stig_rd_data(XlnxVersalOspi *s)
841
+{
842
+ int rd_data_len;
843
+ int i;
844
+
845
+ if (ARRAY_FIELD_EX32(s->regs, FLASH_CMD_CTRL_REG, STIG_MEM_BANK_EN_FLD)) {
846
+ rd_data_len = ospi_stig_membank_rd_bytes(s);
847
+ } else {
848
+ rd_data_len = ospi_stig_rd_data_len(s);
849
+ }
850
+
851
+ /* transmit second part (data) */
852
+ for (i = 0; i < rd_data_len; ++i) {
853
+ fifo8_push(&s->tx_fifo, 0);
854
+ }
855
+}
856
+
857
+static void ospi_rx_fifo_pop_stig_rd_data(XlnxVersalOspi *s)
858
+{
859
+ int size = ospi_stig_rd_data_len(s);
860
+ uint8_t bytes[8] = {};
861
+ int i;
862
+
863
+ size = MIN(fifo8_num_used(&s->rx_fifo), size);
864
+
865
+ assert(size <= 8);
866
+
867
+ for (i = 0; i < size; i++) {
868
+ bytes[i] = fifo8_pop(&s->rx_fifo);
869
+ }
870
+
871
+ s->regs[R_FLASH_RD_DATA_LOWER_REG] = ldl_le_p(bytes);
872
+ s->regs[R_FLASH_RD_DATA_UPPER_REG] = ldl_le_p(bytes + 4);
873
+}
874
+
875
+static void ospi_ind_read(XlnxVersalOspi *s, uint32_t flash_addr, uint32_t len)
876
+{
877
+ int i;
878
+
879
+ /* Create first section of read cmd */
880
+ ospi_tx_fifo_push_rd_op_addr(s, flash_addr);
881
+
882
+ /* transmit first part */
883
+ ospi_update_cs_lines(s);
884
+ ospi_flush_txfifo(s);
885
+
886
+ fifo8_reset(&s->rx_fifo);
887
+
888
+ /* transmit second part (data) */
889
+ for (i = 0; i < len; ++i) {
890
+ fifo8_push(&s->tx_fifo, 0);
891
+ }
892
+ ospi_flush_txfifo(s);
893
+
894
+ for (i = 0; i < len; ++i) {
895
+ fifo8_push(&s->rx_sram, fifo8_pop(&s->rx_fifo));
896
+ }
897
+
898
+ /* done */
899
+ ospi_disable_cs(s);
900
+}
901
+
902
+static unsigned int ospi_dma_burst_size(XlnxVersalOspi *s)
903
+{
904
+ return 1 << ARRAY_FIELD_EX32(s->regs,
905
+ DMA_PERIPH_CONFIG_REG,
906
+ NUM_BURST_REQ_BYTES_FLD);
907
+}
908
+
909
+static unsigned int ospi_dma_single_size(XlnxVersalOspi *s)
910
+{
911
+ return 1 << ARRAY_FIELD_EX32(s->regs,
912
+ DMA_PERIPH_CONFIG_REG,
913
+ NUM_SINGLE_REQ_BYTES_FLD);
914
+}
915
+
916
+static void ind_rd_inc_num_done(XlnxVersalOspi *s)
917
+{
918
+ unsigned int done = ARRAY_FIELD_EX32(s->regs,
919
+ INDIRECT_READ_XFER_CTRL_REG,
920
+ NUM_IND_OPS_DONE_FLD);
921
+ if (done < IND_OPS_DONE_MAX) {
922
+ done++;
923
+ }
924
+ done &= 0x3;
925
+ ARRAY_FIELD_DP32(s->regs, INDIRECT_READ_XFER_CTRL_REG,
926
+ NUM_IND_OPS_DONE_FLD, done);
927
+}
928
+
929
+static void ospi_ind_rd_completed(XlnxVersalOspi *s)
930
+{
931
+ ARRAY_FIELD_DP32(s->regs, INDIRECT_READ_XFER_CTRL_REG,
932
+ IND_OPS_DONE_STATUS_FLD, 1);
933
+
934
+ ind_rd_inc_num_done(s);
935
+ ospi_ind_op_next(s->rd_ind_op);
936
+ if (ospi_ind_op_all_completed(s)) {
937
+ set_irq(s, R_IRQ_STATUS_REG_INDIRECT_OP_DONE_FLD_MASK);
938
+ }
939
+}
940
+
941
+static void ospi_dma_read(XlnxVersalOspi *s)
942
+{
943
+ IndOp *op = s->rd_ind_op;
944
+ uint32_t dma_len = op->num_bytes;
945
+ uint32_t burst_sz = ospi_dma_burst_size(s);
946
+ uint32_t single_sz = ospi_dma_single_size(s);
947
+ uint32_t ind_trig_range;
948
+ uint32_t remainder;
949
+ XlnxCSUDMAClass *xcdc = XLNX_CSU_DMA_GET_CLASS(s->dma_src);
950
+
951
+ ind_trig_range = (1 << ARRAY_FIELD_EX32(s->regs,
952
+ INDIRECT_TRIGGER_ADDR_RANGE_REG,
953
+ IND_RANGE_WIDTH_FLD));
954
+ remainder = dma_len % burst_sz;
955
+ remainder = remainder % single_sz;
956
+ if (burst_sz > ind_trig_range || single_sz > ind_trig_range ||
957
+ remainder != 0) {
958
+ qemu_log_mask(LOG_GUEST_ERROR,
959
+ "OSPI DMA burst size / single size config error\n");
960
+ }
961
+
962
+ s->src_dma_inprog = true;
963
+ if (xcdc->read(s->dma_src, 0, dma_len) != MEMTX_OK) {
964
+ qemu_log_mask(LOG_GUEST_ERROR, "OSPI DMA configuration error\n");
965
+ }
966
+ s->src_dma_inprog = false;
967
+}
968
+
969
+static void ospi_do_ind_read(XlnxVersalOspi *s)
970
+{
971
+ IndOp *op = s->rd_ind_op;
972
+ uint32_t next_b;
973
+ uint32_t end_b;
974
+ uint32_t len;
975
+ bool start_dma = IS_IND_DMA_START(op) && !s->src_dma_inprog;
976
+
977
+ /* Continue to read flash until we run out of space in sram */
978
+ while (!ospi_ind_op_completed(op) &&
979
+ !fifo8_is_full(&s->rx_sram)) {
980
+ /* Read reqested number of bytes, max bytes limited to size of sram */
981
+ next_b = ind_op_next_byte(op);
982
+ end_b = next_b + fifo8_num_free(&s->rx_sram);
983
+ end_b = MIN(end_b, ind_op_end_byte(op));
984
+
985
+ len = end_b - next_b;
986
+ ospi_ind_read(s, next_b, len);
987
+ ind_op_advance(op, len);
988
+
989
+ if (ospi_ind_rd_watermark_enabled(s)) {
990
+ ARRAY_FIELD_DP32(s->regs, IRQ_STATUS_REG,
991
+ INDIRECT_XFER_LEVEL_BREACH_FLD, 1);
992
+ set_irq(s,
993
+ R_IRQ_STATUS_REG_INDIRECT_XFER_LEVEL_BREACH_FLD_MASK);
994
+ }
995
+
996
+ if (!s->src_dma_inprog &&
997
+ ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENB_DMA_IF_FLD)) {
998
+ ospi_dma_read(s);
999
+ }
1000
+ }
1001
+
1002
+ /* Set sram full */
1003
+ if (fifo8_num_used(&s->rx_sram) == RXFF_SZ) {
1004
+ ARRAY_FIELD_DP32(s->regs,
1005
+ INDIRECT_READ_XFER_CTRL_REG, SRAM_FULL_FLD, 1);
1006
+ set_irq(s, R_IRQ_STATUS_REG_INDRD_SRAM_FULL_FLD_MASK);
1007
+ }
1008
+
1009
+ /* Signal completion if done, unless inside recursion via ospi_dma_read */
1010
+ if (!ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENB_DMA_IF_FLD) || start_dma) {
1011
+ if (ospi_ind_op_completed(op)) {
1012
+ ospi_ind_rd_completed(s);
1013
+ }
1014
+ }
1015
+}
1016
+
1017
+/* Transmit write enable instruction */
1018
+static void ospi_transmit_wel(XlnxVersalOspi *s, bool ahb_decoder_cs,
1019
+ hwaddr addr)
1020
+{
1021
+ fifo8_reset(&s->tx_fifo);
1022
+ fifo8_push(&s->tx_fifo, WREN);
1023
+
1024
+ if (ahb_decoder_cs) {
1025
+ ospi_ahb_decoder_enable_cs(s, addr);
1026
+ } else {
1027
+ ospi_update_cs_lines(s);
1028
+ }
1029
+
1030
+ ospi_flush_txfifo(s);
1031
+ ospi_disable_cs(s);
1032
+
1033
+ fifo8_reset(&s->rx_fifo);
1034
+}
1035
+
1036
+static void ospi_ind_write(XlnxVersalOspi *s, uint32_t flash_addr, uint32_t len)
1037
+{
1038
+ bool ahb_decoder_cs = false;
1039
+ uint8_t inst_code;
1040
+ int i;
1041
+
1042
+ assert(fifo8_num_used(&s->tx_sram) >= len);
1043
+
1044
+ if (!ARRAY_FIELD_EX32(s->regs, DEV_INSTR_WR_CONFIG_REG, WEL_DIS_FLD)) {
1045
+ ospi_transmit_wel(s, ahb_decoder_cs, 0);
1046
+ }
1047
+
1048
+ /* reset fifos */
1049
+ fifo8_reset(&s->tx_fifo);
1050
+ fifo8_reset(&s->rx_fifo);
1051
+
1052
+ /* Push write opcode */
1053
+ inst_code = ospi_get_wr_opcode(s);
1054
+ fifo8_push(&s->tx_fifo, inst_code);
1055
+
1056
+ /* Push write address */
1057
+ ospi_tx_fifo_push_address(s, flash_addr);
1058
+
1059
+ /* data */
1060
+ for (i = 0; i < len; i++) {
1061
+ fifo8_push(&s->tx_fifo, fifo8_pop(&s->tx_sram));
1062
+ }
1063
+
1064
+ /* transmit */
1065
+ ospi_update_cs_lines(s);
1066
+ ospi_flush_txfifo(s);
1067
+
1068
+ /* done */
1069
+ ospi_disable_cs(s);
1070
+ fifo8_reset(&s->rx_fifo);
1071
+}
1072
+
1073
+static void ind_wr_inc_num_done(XlnxVersalOspi *s)
1074
+{
1075
+ unsigned int done = ARRAY_FIELD_EX32(s->regs, INDIRECT_WRITE_XFER_CTRL_REG,
1076
+ NUM_IND_OPS_DONE_FLD);
1077
+ if (done < IND_OPS_DONE_MAX) {
1078
+ done++;
1079
+ }
1080
+ done &= 0x3;
1081
+ ARRAY_FIELD_DP32(s->regs, INDIRECT_WRITE_XFER_CTRL_REG,
1082
+ NUM_IND_OPS_DONE_FLD, done);
1083
+}
1084
+
1085
+static void ospi_ind_wr_completed(XlnxVersalOspi *s)
1086
+{
1087
+ ARRAY_FIELD_DP32(s->regs, INDIRECT_WRITE_XFER_CTRL_REG,
1088
+ IND_OPS_DONE_STATUS_FLD, 1);
1089
+ ind_wr_inc_num_done(s);
1090
+ ospi_ind_op_next(s->wr_ind_op);
1091
+ /* Set indirect op done interrupt if enabled */
1092
+ if (ospi_ind_op_all_completed(s)) {
1093
+ set_irq(s, R_IRQ_STATUS_REG_INDIRECT_OP_DONE_FLD_MASK);
1094
+ }
1095
+}
1096
+
1097
+static void ospi_do_indirect_write(XlnxVersalOspi *s)
1098
+{
1099
+ uint32_t write_watermark = s->regs[R_INDIRECT_WRITE_XFER_WATERMARK_REG];
1100
+ uint32_t pagesz = ospi_get_page_sz(s);
1101
+ uint32_t page_mask = ~(pagesz - 1);
1102
+ IndOp *op = s->wr_ind_op;
1103
+ uint32_t next_b;
1104
+ uint32_t end_b;
1105
+ uint32_t len;
1106
+
1107
+ /* Write out tx_fifo in maximum page sz chunks */
1108
+ while (!ospi_ind_op_completed(op) && fifo8_num_used(&s->tx_sram) > 0) {
1109
+ next_b = ind_op_next_byte(op);
1110
+ end_b = next_b + MIN(fifo8_num_used(&s->tx_sram), pagesz);
1111
+
1112
+ /* Dont cross page boundary */
1113
+ if ((end_b & page_mask) > next_b) {
1114
+ end_b &= page_mask;
1115
+ }
1116
+
1117
+ len = end_b - next_b;
1118
+ len = MIN(len, op->num_bytes - op->done_bytes);
1119
+ ospi_ind_write(s, next_b, len);
1120
+ ind_op_advance(op, len);
1121
+ }
1122
+
1123
+ /*
1124
+ * Always set indirect transfer level breached interrupt if enabled
1125
+ * (write watermark > 0) since the tx_sram always will be emptied
1126
+ */
1127
+ if (write_watermark > 0) {
1128
+ set_irq(s, R_IRQ_STATUS_REG_INDIRECT_XFER_LEVEL_BREACH_FLD_MASK);
1129
+ }
1130
+
1131
+ /* Signal completions if done */
1132
+ if (ospi_ind_op_completed(op)) {
1133
+ ospi_ind_wr_completed(s);
1134
+ }
1135
+}
1136
+
1137
+static void ospi_stig_fill_membank(XlnxVersalOspi *s)
1138
+{
1139
+ int num_rd_bytes = ospi_stig_membank_rd_bytes(s);
1140
+ int idx = num_rd_bytes - 8; /* first of last 8 */
1141
+ int i;
1142
+
1143
+ for (i = 0; i < num_rd_bytes; i++) {
1144
+ s->stig_membank[i] = fifo8_pop(&s->rx_fifo);
1145
+ }
1146
+
1147
+ g_assert((idx + 4) < ARRAY_SIZE(s->stig_membank));
1148
+
1149
+ /* Fill in lower upper regs */
1150
+ s->regs[R_FLASH_RD_DATA_LOWER_REG] = ldl_le_p(&s->stig_membank[idx]);
1151
+ s->regs[R_FLASH_RD_DATA_UPPER_REG] = ldl_le_p(&s->stig_membank[idx + 4]);
1152
+}
1153
+
1154
+static void ospi_stig_cmd_exec(XlnxVersalOspi *s)
1155
+{
1156
+ uint8_t inst_code;
1157
+
1158
+ /* Reset fifos */
1159
+ fifo8_reset(&s->tx_fifo);
1160
+ fifo8_reset(&s->rx_fifo);
1161
+
1162
+ /* Push write opcode */
1163
+ inst_code = ARRAY_FIELD_EX32(s->regs, FLASH_CMD_CTRL_REG, CMD_OPCODE_FLD);
1164
+ fifo8_push(&s->tx_fifo, inst_code);
1165
+
1166
+ /* Push address if enabled */
1167
+ if (ARRAY_FIELD_EX32(s->regs, FLASH_CMD_CTRL_REG, ENB_COMD_ADDR_FLD)) {
1168
+ ospi_tx_fifo_push_stig_addr(s);
1169
+ }
1170
+
1171
+ /* Enable cs */
1172
+ ospi_update_cs_lines(s);
1173
+
1174
+ /* Data */
1175
+ if (ARRAY_FIELD_EX32(s->regs, FLASH_CMD_CTRL_REG, ENB_WRITE_DATA_FLD)) {
1176
+ ospi_tx_fifo_push_stig_wr_data(s);
1177
+ } else if (ARRAY_FIELD_EX32(s->regs,
1178
+ FLASH_CMD_CTRL_REG, ENB_READ_DATA_FLD)) {
1179
+ /* transmit first part */
1180
+ ospi_flush_txfifo(s);
1181
+ fifo8_reset(&s->rx_fifo);
1182
+ ospi_tx_fifo_push_stig_rd_data(s);
1183
+ }
1184
+
1185
+ /* Transmit */
1186
+ ospi_flush_txfifo(s);
1187
+ ospi_disable_cs(s);
1188
+
1189
+ if (ARRAY_FIELD_EX32(s->regs, FLASH_CMD_CTRL_REG, ENB_READ_DATA_FLD)) {
1190
+ if (ARRAY_FIELD_EX32(s->regs,
1191
+ FLASH_CMD_CTRL_REG, STIG_MEM_BANK_EN_FLD)) {
1192
+ ospi_stig_fill_membank(s);
1193
+ } else {
1194
+ ospi_rx_fifo_pop_stig_rd_data(s);
1195
+ }
1196
+ }
1197
+}
1198
+
1199
+static uint32_t ospi_block_address(XlnxVersalOspi *s, unsigned int block)
1200
+{
1201
+ unsigned int block_sz = ospi_get_block_sz(s);
1202
+ unsigned int cs = 0;
1203
+ uint32_t addr = 0;
1204
+
1205
+ while (cs < s->num_cs && block >= flash_blocks(s, cs)) {
1206
+ block -= flash_blocks(s, 0);
1207
+ addr += flash_sz(s, cs);
1208
+ }
1209
+ addr += block * block_sz;
1210
+ return addr;
1211
+}
1212
+
1213
+static uint32_t ospi_get_wr_prot_addr_low(XlnxVersalOspi *s)
1214
+{
1215
+ unsigned int block = s->regs[R_LOWER_WR_PROT_REG];
1216
+
1217
+ return ospi_block_address(s, block);
1218
+}
1219
+
1220
+static uint32_t ospi_get_wr_prot_addr_upper(XlnxVersalOspi *s)
1221
+{
1222
+ unsigned int block = s->regs[R_UPPER_WR_PROT_REG];
1223
+
1224
+ /* Get address of first block out of defined range */
1225
+ return ospi_block_address(s, block + 1);
1226
+}
1227
+
1228
+static bool ospi_is_write_protected(XlnxVersalOspi *s, hwaddr addr)
1229
+{
1230
+ uint32_t wr_prot_addr_upper = ospi_get_wr_prot_addr_upper(s);
1231
+ uint32_t wr_prot_addr_low = ospi_get_wr_prot_addr_low(s);
1232
+ bool in_range = false;
1233
+
1234
+ if (addr >= wr_prot_addr_low && addr < wr_prot_addr_upper) {
1235
+ in_range = true;
1236
+ }
1237
+
1238
+ if (ARRAY_FIELD_EX32(s->regs, WR_PROT_CTRL_REG, INV_FLD)) {
1239
+ in_range = !in_range;
1240
+ }
1241
+ return in_range;
1242
+}
1243
+
1244
+static uint64_t ospi_rx_sram_read(XlnxVersalOspi *s, unsigned int size)
1245
+{
1246
+ uint8_t bytes[8] = {};
1247
+ int i;
1248
+
1249
+ if (size < 4 && fifo8_num_used(&s->rx_sram) >= 4) {
1250
+ qemu_log_mask(LOG_GUEST_ERROR,
1251
+ "OSPI only last read of internal "
1252
+ "sram is allowed to be < 32 bits\n");
1253
+ }
1254
+
1255
+ size = MIN(fifo8_num_used(&s->rx_sram), size);
1256
+
1257
+ assert(size <= 8);
1258
+
1259
+ for (i = 0; i < size; i++) {
1260
+ bytes[i] = fifo8_pop(&s->rx_sram);
1261
+ }
1262
+
1263
+ return ldq_le_p(bytes);
1264
+}
1265
+
1266
+static void ospi_tx_sram_write(XlnxVersalOspi *s, uint64_t value,
1267
+ unsigned int size)
1268
+{
1269
+ int i;
1270
+ for (i = 0; i < size && !fifo8_is_full(&s->tx_sram); i++) {
1271
+ fifo8_push(&s->tx_sram, value >> 8 * i);
1272
+ }
1273
+}
1274
+
1275
+static uint64_t ospi_do_dac_read(void *opaque, hwaddr addr, unsigned int size)
1276
+{
1277
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(opaque);
1278
+ uint8_t bytes[8] = {};
1279
+ int i;
1280
+
1281
+ /* Create first section of read cmd */
1282
+ ospi_tx_fifo_push_rd_op_addr(s, (uint32_t) addr);
1283
+
1284
+ /* Enable cs and transmit first part */
1285
+ ospi_dac_cs(s, addr);
1286
+ ospi_flush_txfifo(s);
1287
+
1288
+ fifo8_reset(&s->rx_fifo);
1289
+
1290
+ /* transmit second part (data) */
1291
+ for (i = 0; i < size; ++i) {
1292
+ fifo8_push(&s->tx_fifo, 0);
1293
+ }
1294
+ ospi_flush_txfifo(s);
1295
+
1296
+ /* fill in result */
1297
+ size = MIN(fifo8_num_used(&s->rx_fifo), size);
1298
+
1299
+ assert(size <= 8);
1300
+
1301
+ for (i = 0; i < size; i++) {
1302
+ bytes[i] = fifo8_pop(&s->rx_fifo);
1303
+ }
1304
+
1305
+ /* done */
1306
+ ospi_disable_cs(s);
1307
+
1308
+ return ldq_le_p(bytes);
1309
+}
1310
+
1311
+static void ospi_do_dac_write(void *opaque,
1312
+ hwaddr addr,
1313
+ uint64_t value,
1314
+ unsigned int size)
1315
+{
1316
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(opaque);
1317
+ bool ahb_decoder_cs = ARRAY_FIELD_EX32(s->regs, CONFIG_REG,
1318
+ ENABLE_AHB_DECODER_FLD);
1319
+ uint8_t inst_code;
1320
+ unsigned int i;
1321
+
1322
+ if (!ARRAY_FIELD_EX32(s->regs, DEV_INSTR_WR_CONFIG_REG, WEL_DIS_FLD)) {
1323
+ ospi_transmit_wel(s, ahb_decoder_cs, addr);
1324
+ }
1325
+
1326
+ /* reset fifos */
1327
+ fifo8_reset(&s->tx_fifo);
1328
+ fifo8_reset(&s->rx_fifo);
1329
+
1330
+ /* Push write opcode */
1331
+ inst_code = ospi_get_wr_opcode(s);
1332
+ fifo8_push(&s->tx_fifo, inst_code);
1333
+
1334
+ /* Push write address */
1335
+ ospi_tx_fifo_push_address(s, addr);
1336
+
1337
+ /* data */
1338
+ for (i = 0; i < size; i++) {
1339
+ fifo8_push(&s->tx_fifo, value >> 8 * i);
1340
+ }
1341
+
1342
+ /* Enable cs and transmit */
1343
+ ospi_dac_cs(s, addr);
1344
+ ospi_flush_txfifo(s);
1345
+ ospi_disable_cs(s);
1346
+
1347
+ fifo8_reset(&s->rx_fifo);
1348
+}
1349
+
1350
+static void flash_cmd_ctrl_mem_reg_post_write(RegisterInfo *reg,
1351
+ uint64_t val)
1352
+{
1353
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1354
+ if (ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENB_SPI_FLD)) {
1355
+ if (ARRAY_FIELD_EX32(s->regs,
1356
+ FLASH_COMMAND_CTRL_MEM_REG,
1357
+ TRIGGER_MEM_BANK_REQ_FLD)) {
1358
+ ospi_stig_membank_req(s);
1359
+ ARRAY_FIELD_DP32(s->regs, FLASH_COMMAND_CTRL_MEM_REG,
1360
+ TRIGGER_MEM_BANK_REQ_FLD, 0);
1361
+ }
1362
+ }
1363
+}
1364
+
1365
+static void flash_cmd_ctrl_reg_post_write(RegisterInfo *reg, uint64_t val)
1366
+{
1367
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1368
+
1369
+ if (ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENB_SPI_FLD) &&
1370
+ ARRAY_FIELD_EX32(s->regs, FLASH_CMD_CTRL_REG, CMD_EXEC_FLD)) {
1371
+ ospi_stig_cmd_exec(s);
1372
+ set_irq(s, R_IRQ_STATUS_REG_STIG_REQ_INT_FLD_MASK);
1373
+ ARRAY_FIELD_DP32(s->regs, FLASH_CMD_CTRL_REG, CMD_EXEC_FLD, 0);
1374
+ }
1375
+}
1376
+
1377
+static uint64_t ind_wr_dec_num_done(XlnxVersalOspi *s, uint64_t val)
1378
+{
1379
+ unsigned int done = ARRAY_FIELD_EX32(s->regs, INDIRECT_WRITE_XFER_CTRL_REG,
1380
+ NUM_IND_OPS_DONE_FLD);
1381
+ done--;
1382
+ done &= 0x3;
1383
+ val = FIELD_DP32(val, INDIRECT_WRITE_XFER_CTRL_REG,
1384
+ NUM_IND_OPS_DONE_FLD, done);
1385
+ return val;
1386
+}
1387
+
1388
+static bool ind_wr_clearing_op_done(XlnxVersalOspi *s, uint64_t new_val)
1389
+{
1390
+ bool set_in_reg = ARRAY_FIELD_EX32(s->regs, INDIRECT_WRITE_XFER_CTRL_REG,
1391
+ IND_OPS_DONE_STATUS_FLD);
1392
+ bool set_in_new_val = FIELD_EX32(new_val, INDIRECT_WRITE_XFER_CTRL_REG,
1393
+ IND_OPS_DONE_STATUS_FLD);
1394
+ /* return true if clearing bit */
1395
+ return set_in_reg && !set_in_new_val;
1396
+}
1397
+
1398
+static uint64_t ind_wr_xfer_ctrl_reg_pre_write(RegisterInfo *reg,
1399
+ uint64_t val)
1400
+{
1401
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1402
+
1403
+ if (ind_wr_clearing_op_done(s, val)) {
1404
+ val = ind_wr_dec_num_done(s, val);
1405
+ }
1406
+ return val;
1407
+}
1408
+
1409
+static void ind_wr_xfer_ctrl_reg_post_write(RegisterInfo *reg, uint64_t val)
1410
+{
1411
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1412
+
1413
+ if (s->ind_write_disabled) {
1414
+ return;
1415
+ }
1416
+
1417
+ if (ARRAY_FIELD_EX32(s->regs, INDIRECT_WRITE_XFER_CTRL_REG, START_FLD)) {
1418
+ ospi_ind_op_queue_up_wr(s);
1419
+ ospi_do_indirect_write(s);
1420
+ ARRAY_FIELD_DP32(s->regs, INDIRECT_WRITE_XFER_CTRL_REG, START_FLD, 0);
1421
+ }
1422
+
1423
+ if (ARRAY_FIELD_EX32(s->regs, INDIRECT_WRITE_XFER_CTRL_REG, CANCEL_FLD)) {
1424
+ ospi_ind_op_cancel(s->wr_ind_op);
1425
+ fifo8_reset(&s->tx_sram);
1426
+ ARRAY_FIELD_DP32(s->regs, INDIRECT_WRITE_XFER_CTRL_REG, CANCEL_FLD, 0);
1427
+ }
1428
+}
1429
+
1430
+static uint64_t ind_wr_xfer_ctrl_reg_post_read(RegisterInfo *reg,
1431
+ uint64_t val)
1432
+{
1433
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1434
+ IndOp *op = s->wr_ind_op;
1435
+
1436
+ /* Check if ind ops is ongoing */
1437
+ if (!ospi_ind_op_completed(&op[0])) {
1438
+ /* Check if two ind ops are queued */
1439
+ if (!ospi_ind_op_completed(&op[1])) {
1440
+ val = FIELD_DP32(val, INDIRECT_WRITE_XFER_CTRL_REG,
1441
+ WR_QUEUED_FLD, 1);
1442
+ }
1443
+ val = FIELD_DP32(val, INDIRECT_WRITE_XFER_CTRL_REG, WR_STATUS_FLD, 1);
1444
+ }
1445
+ return val;
1446
+}
1447
+
1448
+static uint64_t ind_rd_dec_num_done(XlnxVersalOspi *s, uint64_t val)
1449
+{
1450
+ unsigned int done = ARRAY_FIELD_EX32(s->regs, INDIRECT_READ_XFER_CTRL_REG,
1451
+ NUM_IND_OPS_DONE_FLD);
1452
+ done--;
1453
+ done &= 0x3;
1454
+ val = FIELD_DP32(val, INDIRECT_READ_XFER_CTRL_REG,
1455
+ NUM_IND_OPS_DONE_FLD, done);
1456
+ return val;
1457
+}
1458
+
1459
+static uint64_t ind_rd_xfer_ctrl_reg_pre_write(RegisterInfo *reg,
1460
+ uint64_t val)
1461
+{
1462
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1463
+
1464
+ if (FIELD_EX32(val, INDIRECT_READ_XFER_CTRL_REG,
1465
+ IND_OPS_DONE_STATUS_FLD)) {
1466
+ val = ind_rd_dec_num_done(s, val);
1467
+ val &= ~R_INDIRECT_READ_XFER_CTRL_REG_IND_OPS_DONE_STATUS_FLD_MASK;
1468
+ }
1469
+ return val;
1470
+}
1471
+
1472
+static void ind_rd_xfer_ctrl_reg_post_write(RegisterInfo *reg, uint64_t val)
1473
+{
1474
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1475
+
1476
+ if (ARRAY_FIELD_EX32(s->regs, INDIRECT_READ_XFER_CTRL_REG, START_FLD)) {
1477
+ ospi_ind_op_queue_up_rd(s);
1478
+ ospi_do_ind_read(s);
1479
+ ARRAY_FIELD_DP32(s->regs, INDIRECT_READ_XFER_CTRL_REG, START_FLD, 0);
1480
+ }
1481
+
1482
+ if (ARRAY_FIELD_EX32(s->regs, INDIRECT_READ_XFER_CTRL_REG, CANCEL_FLD)) {
1483
+ ospi_ind_op_cancel(s->rd_ind_op);
1484
+ fifo8_reset(&s->rx_sram);
1485
+ ARRAY_FIELD_DP32(s->regs, INDIRECT_READ_XFER_CTRL_REG, CANCEL_FLD, 0);
1486
+ }
1487
+}
1488
+
1489
+static uint64_t ind_rd_xfer_ctrl_reg_post_read(RegisterInfo *reg,
1490
+ uint64_t val)
1491
+{
1492
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1493
+ IndOp *op = s->rd_ind_op;
1494
+
1495
+ /* Check if ind ops is ongoing */
1496
+ if (!ospi_ind_op_completed(&op[0])) {
1497
+ /* Check if two ind ops are queued */
1498
+ if (!ospi_ind_op_completed(&op[1])) {
1499
+ val = FIELD_DP32(val, INDIRECT_READ_XFER_CTRL_REG,
1500
+ RD_QUEUED_FLD, 1);
1501
+ }
1502
+ val = FIELD_DP32(val, INDIRECT_READ_XFER_CTRL_REG, RD_STATUS_FLD, 1);
1503
+ }
1504
+ return val;
1505
+}
1506
+
1507
+static uint64_t sram_fill_reg_post_read(RegisterInfo *reg, uint64_t val)
1508
+{
1509
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1510
+ val = ((fifo8_num_used(&s->tx_sram) & 0xFFFF) << 16) |
1511
+ (fifo8_num_used(&s->rx_sram) & 0xFFFF);
1512
+ return val;
1513
+}
1514
+
1515
+static uint64_t dll_obs_upper_reg_post_read(RegisterInfo *reg, uint64_t val)
1516
+{
1517
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(reg->opaque);
1518
+ uint32_t rx_dec_out;
1519
+
1520
+ rx_dec_out = FIELD_EX32(val, DLL_OBSERVABLE_UPPER_REG,
1521
+ DLL_OBSERVABLE__UPPER_RX_DECODER_OUTPUT_FLD);
1522
+
1523
+ if (rx_dec_out < MAX_RX_DEC_OUT) {
1524
+ ARRAY_FIELD_DP32(s->regs, DLL_OBSERVABLE_UPPER_REG,
1525
+ DLL_OBSERVABLE__UPPER_RX_DECODER_OUTPUT_FLD,
1526
+ rx_dec_out + 1);
1527
+ }
1528
+
1529
+ return val;
1530
+}
1531
+
1532
+
1533
+static void xlnx_versal_ospi_reset(DeviceState *dev)
1534
+{
1535
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(dev);
1536
+ unsigned int i;
1537
+
1538
+ for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
1539
+ register_reset(&s->regs_info[i]);
1540
+ }
1541
+
1542
+ fifo8_reset(&s->rx_fifo);
1543
+ fifo8_reset(&s->tx_fifo);
1544
+ fifo8_reset(&s->rx_sram);
1545
+ fifo8_reset(&s->tx_sram);
1546
+
1547
+ s->rd_ind_op[0].completed = true;
1548
+ s->rd_ind_op[1].completed = true;
1549
+ s->wr_ind_op[0].completed = true;
1550
+ s->wr_ind_op[1].completed = true;
1551
+ ARRAY_FIELD_DP32(s->regs, DLL_OBSERVABLE_LOWER_REG,
1552
+ DLL_OBSERVABLE_LOWER_DLL_LOCK_FLD, 1);
1553
+ ARRAY_FIELD_DP32(s->regs, DLL_OBSERVABLE_LOWER_REG,
1554
+ DLL_OBSERVABLE_LOWER_LOOPBACK_LOCK_FLD, 1);
1555
+}
1556
+
1557
+static RegisterAccessInfo ospi_regs_info[] = {
1558
+ { .name = "CONFIG_REG",
1559
+ .addr = A_CONFIG_REG,
1560
+ .reset = 0x80780081,
1561
+ .ro = 0x9c000000,
1562
+ },{ .name = "DEV_INSTR_RD_CONFIG_REG",
1563
+ .addr = A_DEV_INSTR_RD_CONFIG_REG,
1564
+ .reset = 0x3,
1565
+ .ro = 0xe0ecc800,
1566
+ },{ .name = "DEV_INSTR_WR_CONFIG_REG",
1567
+ .addr = A_DEV_INSTR_WR_CONFIG_REG,
1568
+ .reset = 0x2,
1569
+ .ro = 0xe0fcce00,
1570
+ },{ .name = "DEV_DELAY_REG",
1571
+ .addr = A_DEV_DELAY_REG,
1572
+ },{ .name = "RD_DATA_CAPTURE_REG",
1573
+ .addr = A_RD_DATA_CAPTURE_REG,
1574
+ .reset = 0x1,
1575
+ .ro = 0xfff0fec0,
1576
+ },{ .name = "DEV_SIZE_CONFIG_REG",
1577
+ .addr = A_DEV_SIZE_CONFIG_REG,
1578
+ .reset = 0x101002,
1579
+ .ro = 0xe0000000,
1580
+ },{ .name = "SRAM_PARTITION_CFG_REG",
1581
+ .addr = A_SRAM_PARTITION_CFG_REG,
1582
+ .reset = 0x80,
1583
+ .ro = 0xffffff00,
1584
+ },{ .name = "IND_AHB_ADDR_TRIGGER_REG",
1585
+ .addr = A_IND_AHB_ADDR_TRIGGER_REG,
1586
+ },{ .name = "DMA_PERIPH_CONFIG_REG",
1587
+ .addr = A_DMA_PERIPH_CONFIG_REG,
1588
+ .ro = 0xfffff0f0,
1589
+ },{ .name = "REMAP_ADDR_REG",
1590
+ .addr = A_REMAP_ADDR_REG,
1591
+ },{ .name = "MODE_BIT_CONFIG_REG",
1592
+ .addr = A_MODE_BIT_CONFIG_REG,
1593
+ .reset = 0x200,
1594
+ .ro = 0xffff7800,
1595
+ },{ .name = "SRAM_FILL_REG",
1596
+ .addr = A_SRAM_FILL_REG,
1597
+ .ro = 0xffffffff,
1598
+ .post_read = sram_fill_reg_post_read,
1599
+ },{ .name = "TX_THRESH_REG",
1600
+ .addr = A_TX_THRESH_REG,
1601
+ .reset = 0x1,
1602
+ .ro = 0xffffffe0,
1603
+ },{ .name = "RX_THRESH_REG",
1604
+ .addr = A_RX_THRESH_REG,
1605
+ .reset = 0x1,
1606
+ .ro = 0xffffffe0,
1607
+ },{ .name = "WRITE_COMPLETION_CTRL_REG",
1608
+ .addr = A_WRITE_COMPLETION_CTRL_REG,
1609
+ .reset = 0x10005,
1610
+ .ro = 0x1800,
1611
+ },{ .name = "NO_OF_POLLS_BEF_EXP_REG",
1612
+ .addr = A_NO_OF_POLLS_BEF_EXP_REG,
1613
+ .reset = 0xffffffff,
1614
+ },{ .name = "IRQ_STATUS_REG",
1615
+ .addr = A_IRQ_STATUS_REG,
1616
+ .ro = 0xfff08000,
1617
+ .w1c = 0xf7fff,
1618
+ },{ .name = "IRQ_MASK_REG",
1619
+ .addr = A_IRQ_MASK_REG,
1620
+ .ro = 0xfff08000,
1621
+ },{ .name = "LOWER_WR_PROT_REG",
1622
+ .addr = A_LOWER_WR_PROT_REG,
1623
+ },{ .name = "UPPER_WR_PROT_REG",
1624
+ .addr = A_UPPER_WR_PROT_REG,
1625
+ },{ .name = "WR_PROT_CTRL_REG",
1626
+ .addr = A_WR_PROT_CTRL_REG,
1627
+ .ro = 0xfffffffc,
1628
+ },{ .name = "INDIRECT_READ_XFER_CTRL_REG",
1629
+ .addr = A_INDIRECT_READ_XFER_CTRL_REG,
1630
+ .ro = 0xffffffd4,
1631
+ .w1c = 0x08,
1632
+ .pre_write = ind_rd_xfer_ctrl_reg_pre_write,
1633
+ .post_write = ind_rd_xfer_ctrl_reg_post_write,
1634
+ .post_read = ind_rd_xfer_ctrl_reg_post_read,
1635
+ },{ .name = "INDIRECT_READ_XFER_WATERMARK_REG",
1636
+ .addr = A_INDIRECT_READ_XFER_WATERMARK_REG,
1637
+ },{ .name = "INDIRECT_READ_XFER_START_REG",
1638
+ .addr = A_INDIRECT_READ_XFER_START_REG,
1639
+ },{ .name = "INDIRECT_READ_XFER_NUM_BYTES_REG",
1640
+ .addr = A_INDIRECT_READ_XFER_NUM_BYTES_REG,
1641
+ },{ .name = "INDIRECT_WRITE_XFER_CTRL_REG",
1642
+ .addr = A_INDIRECT_WRITE_XFER_CTRL_REG,
1643
+ .ro = 0xffffffdc,
1644
+ .w1c = 0x20,
1645
+ .pre_write = ind_wr_xfer_ctrl_reg_pre_write,
1646
+ .post_write = ind_wr_xfer_ctrl_reg_post_write,
1647
+ .post_read = ind_wr_xfer_ctrl_reg_post_read,
1648
+ },{ .name = "INDIRECT_WRITE_XFER_WATERMARK_REG",
1649
+ .addr = A_INDIRECT_WRITE_XFER_WATERMARK_REG,
1650
+ .reset = 0xffffffff,
1651
+ },{ .name = "INDIRECT_WRITE_XFER_START_REG",
1652
+ .addr = A_INDIRECT_WRITE_XFER_START_REG,
1653
+ },{ .name = "INDIRECT_WRITE_XFER_NUM_BYTES_REG",
1654
+ .addr = A_INDIRECT_WRITE_XFER_NUM_BYTES_REG,
1655
+ },{ .name = "INDIRECT_TRIGGER_ADDR_RANGE_REG",
1656
+ .addr = A_INDIRECT_TRIGGER_ADDR_RANGE_REG,
1657
+ .reset = 0x4,
1658
+ .ro = 0xfffffff0,
1659
+ },{ .name = "FLASH_COMMAND_CTRL_MEM_REG",
1660
+ .addr = A_FLASH_COMMAND_CTRL_MEM_REG,
1661
+ .ro = 0xe008fffe,
1662
+ .post_write = flash_cmd_ctrl_mem_reg_post_write,
1663
+ },{ .name = "FLASH_CMD_CTRL_REG",
1664
+ .addr = A_FLASH_CMD_CTRL_REG,
1665
+ .ro = 0x7a,
1666
+ .post_write = flash_cmd_ctrl_reg_post_write,
1667
+ },{ .name = "FLASH_CMD_ADDR_REG",
1668
+ .addr = A_FLASH_CMD_ADDR_REG,
1669
+ },{ .name = "FLASH_RD_DATA_LOWER_REG",
1670
+ .addr = A_FLASH_RD_DATA_LOWER_REG,
1671
+ .ro = 0xffffffff,
1672
+ },{ .name = "FLASH_RD_DATA_UPPER_REG",
1673
+ .addr = A_FLASH_RD_DATA_UPPER_REG,
1674
+ .ro = 0xffffffff,
1675
+ },{ .name = "FLASH_WR_DATA_LOWER_REG",
1676
+ .addr = A_FLASH_WR_DATA_LOWER_REG,
1677
+ },{ .name = "FLASH_WR_DATA_UPPER_REG",
1678
+ .addr = A_FLASH_WR_DATA_UPPER_REG,
1679
+ },{ .name = "POLLING_FLASH_STATUS_REG",
1680
+ .addr = A_POLLING_FLASH_STATUS_REG,
1681
+ .ro = 0xfff0ffff,
1682
+ },{ .name = "PHY_CONFIGURATION_REG",
1683
+ .addr = A_PHY_CONFIGURATION_REG,
1684
+ .reset = 0x40000000,
1685
+ .ro = 0x1f80ff80,
1686
+ },{ .name = "PHY_MASTER_CONTROL_REG",
1687
+ .addr = A_PHY_MASTER_CONTROL_REG,
1688
+ .reset = 0x800000,
1689
+ .ro = 0xfe08ff80,
1690
+ },{ .name = "DLL_OBSERVABLE_LOWER_REG",
1691
+ .addr = A_DLL_OBSERVABLE_LOWER_REG,
1692
+ .ro = 0xffffffff,
1693
+ },{ .name = "DLL_OBSERVABLE_UPPER_REG",
1694
+ .addr = A_DLL_OBSERVABLE_UPPER_REG,
1695
+ .ro = 0xffffffff,
1696
+ .post_read = dll_obs_upper_reg_post_read,
1697
+ },{ .name = "OPCODE_EXT_LOWER_REG",
1698
+ .addr = A_OPCODE_EXT_LOWER_REG,
1699
+ .reset = 0x13edfa00,
1700
+ },{ .name = "OPCODE_EXT_UPPER_REG",
1701
+ .addr = A_OPCODE_EXT_UPPER_REG,
1702
+ .reset = 0x6f90000,
1703
+ .ro = 0xffff,
1704
+ },{ .name = "MODULE_ID_REG",
1705
+ .addr = A_MODULE_ID_REG,
1706
+ .reset = 0x300,
1707
+ .ro = 0xffffffff,
1708
+ }
1709
+};
1710
+
1711
+/* Return dev-obj from reg-region created by register_init_block32 */
1712
+static XlnxVersalOspi *xilinx_ospi_of_mr(void *mr_accessor)
1713
+{
1714
+ RegisterInfoArray *reg_array = mr_accessor;
1715
+ Object *dev;
1716
+
1717
+ dev = reg_array->mem.owner;
1718
+ assert(dev);
1719
+
1720
+ return XILINX_VERSAL_OSPI(dev);
1721
+}
1722
+
1723
+static void ospi_write(void *opaque, hwaddr addr, uint64_t value,
1724
+ unsigned int size)
1725
+{
1726
+ XlnxVersalOspi *s = xilinx_ospi_of_mr(opaque);
1727
+
1728
+ register_write_memory(opaque, addr, value, size);
1729
+ ospi_update_irq_line(s);
1730
+}
1731
+
1732
+static const MemoryRegionOps ospi_ops = {
1733
+ .read = register_read_memory,
1734
+ .write = ospi_write,
1735
+ .endianness = DEVICE_LITTLE_ENDIAN,
1736
+ .valid = {
1737
+ .min_access_size = 4,
1738
+ .max_access_size = 4,
1739
+ },
1740
+};
1741
+
1742
+static uint64_t ospi_indac_read(void *opaque, unsigned int size)
1743
+{
1744
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(opaque);
1745
+ uint64_t ret = ospi_rx_sram_read(s, size);
1746
+
1747
+ if (!ospi_ind_op_completed(s->rd_ind_op)) {
1748
+ ospi_do_ind_read(s);
1749
+ }
1750
+ return ret;
1751
+}
1752
+
1753
+static void ospi_indac_write(void *opaque, uint64_t value, unsigned int size)
1754
+{
1755
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(opaque);
1756
+
1757
+ g_assert(!s->ind_write_disabled);
1758
+
1759
+ if (!ospi_ind_op_completed(s->wr_ind_op)) {
1760
+ ospi_tx_sram_write(s, value, size);
1761
+ ospi_do_indirect_write(s);
1762
+ } else {
1763
+ qemu_log_mask(LOG_GUEST_ERROR,
1764
+ "OSPI wr into indac area while no ongoing indac wr\n");
1765
+ }
1766
+}
1767
+
1768
+static bool is_inside_indac_range(XlnxVersalOspi *s, hwaddr addr)
1769
+{
1770
+ uint32_t range_start;
1771
+ uint32_t range_end;
1772
+
1773
+ if (ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENB_DMA_IF_FLD)) {
1774
+ return true;
1775
+ }
1776
+
1777
+ range_start = s->regs[R_IND_AHB_ADDR_TRIGGER_REG];
1778
+ range_end = range_start +
1779
+ (1 << ARRAY_FIELD_EX32(s->regs,
1780
+ INDIRECT_TRIGGER_ADDR_RANGE_REG,
1781
+ IND_RANGE_WIDTH_FLD));
1782
+
1783
+ addr += s->regs[R_IND_AHB_ADDR_TRIGGER_REG] & 0xF0000000;
1784
+
1785
+ return addr >= range_start && addr < range_end;
1786
+}
1787
+
1788
+static bool ospi_is_indac_active(XlnxVersalOspi *s)
1789
+{
1790
+ /*
1791
+ * When dac and indac cannot be active at the same time,
1792
+ * return true when dac is disabled.
1793
+ */
1794
+ return s->dac_with_indac || !s->dac_enable;
1795
+}
1796
+
1797
+static uint64_t ospi_dac_read(void *opaque, hwaddr addr, unsigned int size)
1798
+{
1799
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(opaque);
1800
+
1801
+ if (ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENB_SPI_FLD)) {
1802
+ if (ospi_is_indac_active(s) &&
1803
+ is_inside_indac_range(s, addr)) {
1804
+ return ospi_indac_read(s, size);
1805
+ }
1806
+ if (ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENB_DIR_ACC_CTLR_FLD)
1807
+ && s->dac_enable) {
1808
+ if (ARRAY_FIELD_EX32(s->regs,
1809
+ CONFIG_REG, ENB_AHB_ADDR_REMAP_FLD)) {
1810
+ addr += s->regs[R_REMAP_ADDR_REG];
1811
+ }
1812
+ return ospi_do_dac_read(opaque, addr, size);
1813
+ } else {
1814
+ qemu_log_mask(LOG_GUEST_ERROR, "OSPI AHB rd while DAC disabled\n");
1815
+ }
1816
+ } else {
1817
+ qemu_log_mask(LOG_GUEST_ERROR, "OSPI AHB rd while OSPI disabled\n");
1818
+ }
1819
+
1820
+ return 0;
1821
+}
1822
+
1823
+static void ospi_dac_write(void *opaque, hwaddr addr, uint64_t value,
1824
+ unsigned int size)
1825
+{
1826
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(opaque);
1827
+
1828
+ if (ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENB_SPI_FLD)) {
1829
+ if (ospi_is_indac_active(s) &&
1830
+ !s->ind_write_disabled &&
1831
+ is_inside_indac_range(s, addr)) {
1832
+ return ospi_indac_write(s, value, size);
1833
+ }
1834
+ if (ARRAY_FIELD_EX32(s->regs, CONFIG_REG, ENB_DIR_ACC_CTLR_FLD) &&
1835
+ s->dac_enable) {
1836
+ if (ARRAY_FIELD_EX32(s->regs,
1837
+ CONFIG_REG, ENB_AHB_ADDR_REMAP_FLD)) {
1838
+ addr += s->regs[R_REMAP_ADDR_REG];
1839
+ }
1840
+ /* Check if addr is write protected */
1841
+ if (ARRAY_FIELD_EX32(s->regs, WR_PROT_CTRL_REG, ENB_FLD) &&
1842
+ ospi_is_write_protected(s, addr)) {
1843
+ set_irq(s, R_IRQ_STATUS_REG_PROT_WR_ATTEMPT_FLD_MASK);
1844
+ ospi_update_irq_line(s);
1845
+ qemu_log_mask(LOG_GUEST_ERROR,
1846
+ "OSPI writing into write protected area\n");
1847
+ return;
1848
+ }
1849
+ ospi_do_dac_write(opaque, addr, value, size);
1850
+ } else {
1851
+ qemu_log_mask(LOG_GUEST_ERROR, "OSPI AHB wr while DAC disabled\n");
1852
+ }
1853
+ } else {
1854
+ qemu_log_mask(LOG_GUEST_ERROR, "OSPI AHB wr while OSPI disabled\n");
1855
+ }
1856
+}
1857
+
1858
+static const MemoryRegionOps ospi_dac_ops = {
1859
+ .read = ospi_dac_read,
1860
+ .write = ospi_dac_write,
1861
+ .endianness = DEVICE_LITTLE_ENDIAN,
1862
+ .valid = {
1863
+ .min_access_size = 4,
1864
+ .max_access_size = 4,
1865
+ },
1866
+};
1867
+
1868
+static void ospi_update_dac_status(void *opaque, int n, int level)
1869
+{
1870
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(opaque);
1871
+
1872
+ s->dac_enable = level;
1873
+}
1874
+
1875
+static void xlnx_versal_ospi_realize(DeviceState *dev, Error **errp)
1876
+{
1877
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(dev);
1878
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
1879
+
1880
+ s->num_cs = 4;
1881
+ s->spi = ssi_create_bus(dev, "spi0");
1882
+ s->cs_lines = g_new0(qemu_irq, s->num_cs);
1883
+ for (int i = 0; i < s->num_cs; ++i) {
1884
+ sysbus_init_irq(sbd, &s->cs_lines[i]);
1885
+ }
1886
+
1887
+ fifo8_create(&s->rx_fifo, RXFF_SZ);
1888
+ fifo8_create(&s->tx_fifo, TXFF_SZ);
1889
+ fifo8_create(&s->rx_sram, RXFF_SZ);
1890
+ fifo8_create(&s->tx_sram, TXFF_SZ);
1891
+}
1892
+
1893
+static void xlnx_versal_ospi_init(Object *obj)
1894
+{
1895
+ XlnxVersalOspi *s = XILINX_VERSAL_OSPI(obj);
1896
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
1897
+ DeviceState *dev = DEVICE(obj);
1898
+ RegisterInfoArray *reg_array;
1899
+
1900
+ memory_region_init(&s->iomem, obj, TYPE_XILINX_VERSAL_OSPI,
1901
+ XILINX_VERSAL_OSPI_R_MAX * 4);
1902
+ reg_array =
1903
+ register_init_block32(DEVICE(obj), ospi_regs_info,
1904
+ ARRAY_SIZE(ospi_regs_info),
1905
+ s->regs_info, s->regs,
1906
+ &ospi_ops,
1907
+ XILINX_VERSAL_OSPI_ERR_DEBUG,
1908
+ XILINX_VERSAL_OSPI_R_MAX * 4);
1909
+ memory_region_add_subregion(&s->iomem, 0x0, &reg_array->mem);
1910
+ sysbus_init_mmio(sbd, &s->iomem);
1911
+
1912
+ memory_region_init_io(&s->iomem_dac, obj, &ospi_dac_ops, s,
1913
+ TYPE_XILINX_VERSAL_OSPI "-dac", 0x20000000);
1914
+ sysbus_init_mmio(sbd, &s->iomem_dac);
1915
+
1916
+ sysbus_init_irq(sbd, &s->irq);
1917
+
1918
+ object_property_add_link(obj, "dma-src", TYPE_XLNX_CSU_DMA,
1919
+ (Object **)&s->dma_src,
1920
+ object_property_allow_set_link,
1921
+ OBJ_PROP_LINK_STRONG);
1922
+
1923
+ qdev_init_gpio_in_named(dev, ospi_update_dac_status, "ospi-mux-sel", 1);
1924
+}
1925
+
1926
+static const VMStateDescription vmstate_ind_op = {
1927
+ .name = "OSPIIndOp",
1928
+ .version_id = 1,
1929
+ .minimum_version_id = 1,
1930
+ .fields = (VMStateField[]) {
1931
+ VMSTATE_UINT32(flash_addr, IndOp),
1932
+ VMSTATE_UINT32(num_bytes, IndOp),
1933
+ VMSTATE_UINT32(done_bytes, IndOp),
1934
+ VMSTATE_BOOL(completed, IndOp),
1935
+ VMSTATE_END_OF_LIST()
1936
+ }
1937
+};
1938
+
1939
+static const VMStateDescription vmstate_xlnx_versal_ospi = {
1940
+ .name = TYPE_XILINX_VERSAL_OSPI,
1941
+ .version_id = 1,
1942
+ .minimum_version_id = 1,
1943
+ .minimum_version_id_old = 1,
1944
+ .fields = (VMStateField[]) {
1945
+ VMSTATE_FIFO8(rx_fifo, XlnxVersalOspi),
1946
+ VMSTATE_FIFO8(tx_fifo, XlnxVersalOspi),
1947
+ VMSTATE_FIFO8(rx_sram, XlnxVersalOspi),
1948
+ VMSTATE_FIFO8(tx_sram, XlnxVersalOspi),
1949
+ VMSTATE_BOOL(ind_write_disabled, XlnxVersalOspi),
1950
+ VMSTATE_BOOL(dac_with_indac, XlnxVersalOspi),
1951
+ VMSTATE_BOOL(dac_enable, XlnxVersalOspi),
1952
+ VMSTATE_BOOL(src_dma_inprog, XlnxVersalOspi),
1953
+ VMSTATE_STRUCT_ARRAY(rd_ind_op, XlnxVersalOspi, 2, 1,
1954
+ vmstate_ind_op, IndOp),
1955
+ VMSTATE_STRUCT_ARRAY(wr_ind_op, XlnxVersalOspi, 2, 1,
1956
+ vmstate_ind_op, IndOp),
1957
+ VMSTATE_UINT32_ARRAY(regs, XlnxVersalOspi, XILINX_VERSAL_OSPI_R_MAX),
1958
+ VMSTATE_UINT8_ARRAY(stig_membank, XlnxVersalOspi, 512),
1959
+ VMSTATE_END_OF_LIST(),
1960
+ }
1961
+};
1962
+
1963
+static Property xlnx_versal_ospi_properties[] = {
1964
+ DEFINE_PROP_BOOL("dac-with-indac", XlnxVersalOspi, dac_with_indac, false),
1965
+ DEFINE_PROP_BOOL("indac-write-disabled", XlnxVersalOspi,
1966
+ ind_write_disabled, false),
1967
+ DEFINE_PROP_END_OF_LIST(),
1968
+};
1969
+
1970
+static void xlnx_versal_ospi_class_init(ObjectClass *klass, void *data)
1971
+{
1972
+ DeviceClass *dc = DEVICE_CLASS(klass);
1973
+
1974
+ dc->reset = xlnx_versal_ospi_reset;
1975
+ dc->realize = xlnx_versal_ospi_realize;
1976
+ dc->vmsd = &vmstate_xlnx_versal_ospi;
1977
+ device_class_set_props(dc, xlnx_versal_ospi_properties);
1978
+}
1979
+
1980
+static const TypeInfo xlnx_versal_ospi_info = {
1981
+ .name = TYPE_XILINX_VERSAL_OSPI,
1982
+ .parent = TYPE_SYS_BUS_DEVICE,
1983
+ .instance_size = sizeof(XlnxVersalOspi),
1984
+ .class_init = xlnx_versal_ospi_class_init,
1985
+ .instance_init = xlnx_versal_ospi_init,
1986
+};
1987
+
1988
+static void xlnx_versal_ospi_register_types(void)
1989
+{
1990
+ type_register_static(&xlnx_versal_ospi_info);
1991
+}
1992
+
1993
+type_init(xlnx_versal_ospi_register_types)
1994
diff --git a/hw/ssi/meson.build b/hw/ssi/meson.build
1995
index XXXXXXX..XXXXXXX 100644
1996
--- a/hw/ssi/meson.build
1997
+++ b/hw/ssi/meson.build
1998
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_SSI', if_true: files('ssi.c'))
1999
softmmu_ss.add(when: 'CONFIG_STM32F2XX_SPI', if_true: files('stm32f2xx_spi.c'))
2000
softmmu_ss.add(when: 'CONFIG_XILINX_SPI', if_true: files('xilinx_spi.c'))
2001
softmmu_ss.add(when: 'CONFIG_XILINX_SPIPS', if_true: files('xilinx_spips.c'))
2002
+softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal-ospi.c'))
2003
softmmu_ss.add(when: 'CONFIG_IMX', if_true: files('imx_spi.c'))
2004
softmmu_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_spi.c'))
120
--
2005
--
121
2.20.1
2006
2.25.1
122
2007
123
2008
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
The board revision encode the processor type. Add a helper
3
Connect the OSPI flash memory controller model (including the source and
4
to extract the type, and use it.
4
destination DMA).
5
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
Message-id: 20200208165645.15657-6-f4bug@amsat.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20220121161141.14389-8-francisco.iglesias@xilinx.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
hw/arm/raspi.c | 18 ++++++++++++++++--
11
include/hw/arm/xlnx-versal.h | 20 ++++++++
12
1 file changed, 16 insertions(+), 2 deletions(-)
12
hw/arm/xlnx-versal.c | 93 ++++++++++++++++++++++++++++++++++++
13
2 files changed, 113 insertions(+)
13
14
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
17
--- a/include/hw/arm/xlnx-versal.h
17
+++ b/hw/arm/raspi.c
18
+++ b/include/hw/arm/xlnx-versal.h
18
@@ -XXX,XX +XXX,XX @@ static int board_version(uint32_t board_rev)
19
@@ -XXX,XX +XXX,XX @@
19
return board_processor_id(board_rev) + 1;
20
#include "hw/misc/xlnx-versal-xramc.h"
21
#include "hw/nvram/xlnx-bbram.h"
22
#include "hw/nvram/xlnx-versal-efuse.h"
23
+#include "hw/ssi/xlnx-versal-ospi.h"
24
+#include "hw/dma/xlnx_csu_dma.h"
25
#include "hw/misc/xlnx-versal-pmc-iou-slcr.h"
26
27
#define TYPE_XLNX_VERSAL "xlnx-versal"
28
@@ -XXX,XX +XXX,XX @@ struct Versal {
29
struct {
30
SDHCIState sd[XLNX_VERSAL_NR_SDS];
31
XlnxVersalPmcIouSlcr slcr;
32
+
33
+ struct {
34
+ XlnxVersalOspi ospi;
35
+ XlnxCSUDMA dma_src;
36
+ XlnxCSUDMA dma_dst;
37
+ MemoryRegion linear_mr;
38
+ qemu_or_irq irq_orgate;
39
+ } ospi;
40
} iou;
41
42
XlnxZynqMPRTC rtc;
43
@@ -XXX,XX +XXX,XX @@ struct Versal {
44
#define VERSAL_ADMA_IRQ_0 60
45
#define VERSAL_XRAM_IRQ_0 79
46
#define VERSAL_PMC_APB_IRQ 121
47
+#define VERSAL_OSPI_IRQ 124
48
#define VERSAL_SD0_IRQ_0 126
49
#define VERSAL_EFUSE_IRQ 139
50
#define VERSAL_RTC_ALARM_IRQ 142
51
@@ -XXX,XX +XXX,XX @@ struct Versal {
52
#define MM_PMC_PMC_IOU_SLCR 0xf1060000
53
#define MM_PMC_PMC_IOU_SLCR_SIZE 0x10000
54
55
+#define MM_PMC_OSPI 0xf1010000
56
+#define MM_PMC_OSPI_SIZE 0x10000
57
+
58
+#define MM_PMC_OSPI_DAC 0xc0000000
59
+#define MM_PMC_OSPI_DAC_SIZE 0x20000000
60
+
61
+#define MM_PMC_OSPI_DMA_DST 0xf1011800
62
+#define MM_PMC_OSPI_DMA_SRC 0xf1011000
63
+
64
#define MM_PMC_SD0 0xf1040000U
65
#define MM_PMC_SD0_SIZE 0x10000
66
#define MM_PMC_BBRAM_CTRL 0xf11f0000
67
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/hw/arm/xlnx-versal.c
70
+++ b/hw/arm/xlnx-versal.c
71
@@ -XXX,XX +XXX,XX @@
72
#define GEM_REVISION 0x40070106
73
74
#define VERSAL_NUM_PMC_APB_IRQS 3
75
+#define NUM_OSPI_IRQ_LINES 3
76
77
static void versal_create_apu_cpus(Versal *s)
78
{
79
@@ -XXX,XX +XXX,XX @@ static void versal_create_pmc_iou_slcr(Versal *s, qemu_irq *pic)
80
qdev_get_gpio_in(DEVICE(&s->pmc.apb_irq_orgate), 2));
20
}
81
}
21
82
22
+static const char *board_soc_type(uint32_t board_rev)
83
+static void versal_create_ospi(Versal *s, qemu_irq *pic)
23
+{
84
+{
24
+ static const char *soc_types[] = {
85
+ SysBusDevice *sbd;
25
+ NULL, TYPE_BCM2836, TYPE_BCM2837,
86
+ MemoryRegion *mr_dac;
26
+ };
87
+ qemu_irq ospi_mux_sel;
27
+ int proc_id = board_processor_id(board_rev);
88
+ DeviceState *orgate;
28
+
89
+
29
+ if (proc_id >= ARRAY_SIZE(soc_types) || !soc_types[proc_id]) {
90
+ memory_region_init(&s->pmc.iou.ospi.linear_mr, OBJECT(s),
30
+ error_report("Unsupported processor id '%d' (board revision: 0x%x)",
91
+ "versal-ospi-linear-mr" , MM_PMC_OSPI_DAC_SIZE);
31
+ proc_id, board_rev);
92
+
32
+ exit(1);
93
+ object_initialize_child(OBJECT(s), "versal-ospi", &s->pmc.iou.ospi.ospi,
33
+ }
94
+ TYPE_XILINX_VERSAL_OSPI);
34
+ return soc_types[proc_id];
95
+
96
+ mr_dac = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->pmc.iou.ospi.ospi), 1);
97
+ memory_region_add_subregion(&s->pmc.iou.ospi.linear_mr, 0x0, mr_dac);
98
+
99
+ /* Create the OSPI destination DMA */
100
+ object_initialize_child(OBJECT(s), "versal-ospi-dma-dst",
101
+ &s->pmc.iou.ospi.dma_dst,
102
+ TYPE_XLNX_CSU_DMA);
103
+
104
+ object_property_set_link(OBJECT(&s->pmc.iou.ospi.dma_dst),
105
+ "dma", OBJECT(get_system_memory()),
106
+ &error_abort);
107
+
108
+ sbd = SYS_BUS_DEVICE(&s->pmc.iou.ospi.dma_dst);
109
+ sysbus_realize(sbd, &error_fatal);
110
+
111
+ memory_region_add_subregion(&s->mr_ps, MM_PMC_OSPI_DMA_DST,
112
+ sysbus_mmio_get_region(sbd, 0));
113
+
114
+ /* Create the OSPI source DMA */
115
+ object_initialize_child(OBJECT(s), "versal-ospi-dma-src",
116
+ &s->pmc.iou.ospi.dma_src,
117
+ TYPE_XLNX_CSU_DMA);
118
+
119
+ object_property_set_bool(OBJECT(&s->pmc.iou.ospi.dma_src), "is-dst",
120
+ false, &error_abort);
121
+
122
+ object_property_set_link(OBJECT(&s->pmc.iou.ospi.dma_src),
123
+ "dma", OBJECT(mr_dac), &error_abort);
124
+
125
+ object_property_set_link(OBJECT(&s->pmc.iou.ospi.dma_src),
126
+ "stream-connected-dma",
127
+ OBJECT(&s->pmc.iou.ospi.dma_dst),
128
+ &error_abort);
129
+
130
+ sbd = SYS_BUS_DEVICE(&s->pmc.iou.ospi.dma_src);
131
+ sysbus_realize(sbd, &error_fatal);
132
+
133
+ memory_region_add_subregion(&s->mr_ps, MM_PMC_OSPI_DMA_SRC,
134
+ sysbus_mmio_get_region(sbd, 0));
135
+
136
+ /* Realize the OSPI */
137
+ object_property_set_link(OBJECT(&s->pmc.iou.ospi.ospi), "dma-src",
138
+ OBJECT(&s->pmc.iou.ospi.dma_src), &error_abort);
139
+
140
+ sbd = SYS_BUS_DEVICE(&s->pmc.iou.ospi.ospi);
141
+ sysbus_realize(sbd, &error_fatal);
142
+
143
+ memory_region_add_subregion(&s->mr_ps, MM_PMC_OSPI,
144
+ sysbus_mmio_get_region(sbd, 0));
145
+
146
+ memory_region_add_subregion(&s->mr_ps, MM_PMC_OSPI_DAC,
147
+ &s->pmc.iou.ospi.linear_mr);
148
+
149
+ /* ospi_mux_sel */
150
+ ospi_mux_sel = qdev_get_gpio_in_named(DEVICE(&s->pmc.iou.ospi.ospi),
151
+ "ospi-mux-sel", 0);
152
+ qdev_connect_gpio_out_named(DEVICE(&s->pmc.iou.slcr), "ospi-mux-sel", 0,
153
+ ospi_mux_sel);
154
+
155
+ /* OSPI irq */
156
+ object_initialize_child(OBJECT(s), "ospi-irq-orgate",
157
+ &s->pmc.iou.ospi.irq_orgate, TYPE_OR_IRQ);
158
+ object_property_set_int(OBJECT(&s->pmc.iou.ospi.irq_orgate),
159
+ "num-lines", NUM_OSPI_IRQ_LINES, &error_fatal);
160
+
161
+ orgate = DEVICE(&s->pmc.iou.ospi.irq_orgate);
162
+ qdev_realize(orgate, NULL, &error_fatal);
163
+
164
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->pmc.iou.ospi.ospi), 0,
165
+ qdev_get_gpio_in(orgate, 0));
166
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->pmc.iou.ospi.dma_src), 0,
167
+ qdev_get_gpio_in(orgate, 1));
168
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->pmc.iou.ospi.dma_dst), 0,
169
+ qdev_get_gpio_in(orgate, 2));
170
+
171
+ qdev_connect_gpio_out(orgate, 0, pic[VERSAL_OSPI_IRQ]);
35
+}
172
+}
36
+
173
+
37
static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
174
/* This takes the board allocated linear DDR memory and creates aliases
38
{
175
* for each split DDR range/aperture on the Versal address map.
39
static const uint32_t smpboot[] = {
176
*/
40
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
177
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
41
}
178
versal_create_bbram(s, pic);
42
179
versal_create_efuse(s, pic);
43
object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
180
versal_create_pmc_iou_slcr(s, pic);
44
- version == 3 ? TYPE_BCM2837 : TYPE_BCM2836,
181
+ versal_create_ospi(s, pic);
45
- &error_abort, NULL);
182
versal_map_ddr(s);
46
+ board_soc_type(board_rev), &error_abort, NULL);
183
versal_unimp(s);
47
184
48
/* Allocate and map RAM */
49
memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
50
--
185
--
51
2.20.1
186
2.25.1
52
187
53
188
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
raspi_machine_init() access to board_rev via RaspiMachineClass.
3
Add support for Micron Xccela flash mt35xu01g.
4
raspi2_init() and raspi3_init() do nothing. Call raspi_machine_init
5
directly.
6
4
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
8
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
6
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Message-id: 20200208165645.15657-10-f4bug@amsat.org
7
Message-id: 20220121161141.14389-9-francisco.iglesias@xilinx.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
9
---
12
hw/arm/raspi.c | 16 +++-------------
10
hw/block/m25p80.c | 2 ++
13
1 file changed, 3 insertions(+), 13 deletions(-)
11
1 file changed, 2 insertions(+)
14
12
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
13
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/raspi.c
15
--- a/hw/block/m25p80.c
18
+++ b/hw/arm/raspi.c
16
+++ b/hw/block/m25p80.c
19
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
17
@@ -XXX,XX +XXX,XX @@ static const FlashPartInfo known_devices[] = {
20
arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
18
{ INFO("n25q512a", 0x20ba20, 0, 64 << 10, 1024, ER_4K) },
21
}
19
{ INFO("n25q512ax3", 0x20ba20, 0x1000, 64 << 10, 1024, ER_4K) },
22
20
{ INFO("mt25ql512ab", 0x20ba20, 0x1044, 64 << 10, 1024, ER_4K | ER_32K) },
23
-static void raspi_init(MachineState *machine)
21
+ { INFO_STACKED("mt35xu01g", 0x2c5b1b, 0x104100, 128 << 10, 1024,
24
+static void raspi_machine_init(MachineState *machine)
22
+ ER_4K | ER_32K, 2) },
25
{
23
{ INFO_STACKED("n25q00", 0x20ba21, 0x1000, 64 << 10, 2048, ER_4K, 4) },
26
RaspiMachineClass *mc = RASPI_MACHINE_GET_CLASS(machine);
24
{ INFO_STACKED("n25q00a", 0x20bb21, 0x1000, 64 << 10, 2048, ER_4K, 4) },
27
RaspiMachineState *s = RASPI_MACHINE(machine);
25
{ INFO_STACKED("mt25ql01g", 0x20ba21, 0x1040, 64 << 10, 2048, ER_4K, 2) },
28
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine)
29
setup_boot(machine, version, machine->ram_size - vcram_size);
30
}
31
32
-static void raspi2_init(MachineState *machine)
33
-{
34
- raspi_init(machine);
35
-}
36
-
37
static void raspi2_machine_class_init(ObjectClass *oc, void *data)
38
{
39
MachineClass *mc = MACHINE_CLASS(oc);
40
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
41
42
rmc->board_rev = board_rev;
43
mc->desc = "Raspberry Pi 2B";
44
- mc->init = raspi2_init;
45
+ mc->init = raspi_machine_init;
46
mc->block_default_type = IF_SD;
47
mc->no_parallel = 1;
48
mc->no_floppy = 1;
49
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
50
};
51
52
#ifdef TARGET_AARCH64
53
-static void raspi3_init(MachineState *machine)
54
-{
55
- raspi_init(machine);
56
-}
57
-
58
static void raspi3_machine_class_init(ObjectClass *oc, void *data)
59
{
60
MachineClass *mc = MACHINE_CLASS(oc);
61
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_class_init(ObjectClass *oc, void *data)
62
63
rmc->board_rev = board_rev;
64
mc->desc = "Raspberry Pi 3B";
65
- mc->init = raspi3_init;
66
+ mc->init = raspi_machine_init;
67
mc->block_default_type = IF_SD;
68
mc->no_parallel = 1;
69
mc->no_floppy = 1;
70
--
26
--
71
2.20.1
27
2.25.1
72
28
73
29
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
The board revision encode the board version. Add a helper
3
Connect Micron Xccela mt35xu01g flashes to the OSPI flash memory
4
to extract the version, and use it.
4
controller.
5
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
Message-id: 20200208165645.15657-4-f4bug@amsat.org
7
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220121161141.14389-10-francisco.iglesias@xilinx.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
hw/arm/raspi.c | 31 +++++++++++++++++++++++++++----
12
hw/arm/xlnx-versal-virt.c | 23 +++++++++++++++++++++++
12
1 file changed, 27 insertions(+), 4 deletions(-)
13
1 file changed, 23 insertions(+)
13
14
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
17
--- a/hw/arm/xlnx-versal-virt.c
17
+++ b/hw/arm/raspi.c
18
+++ b/hw/arm/xlnx-versal-virt.c
18
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
19
#include "qapi/error.h"
20
#define TYPE_XLNX_VERSAL_VIRT_MACHINE MACHINE_TYPE_NAME("xlnx-versal-virt")
20
#include "cpu.h"
21
OBJECT_DECLARE_SIMPLE_TYPE(VersalVirt, XLNX_VERSAL_VIRT_MACHINE)
21
#include "hw/arm/bcm2836.h"
22
22
+#include "hw/registerfields.h"
23
+#define XLNX_VERSAL_NUM_OSPI_FLASH 4
23
#include "qemu/error-report.h"
24
#include "hw/boards.h"
25
#include "hw/loader.h"
26
@@ -XXX,XX +XXX,XX @@ typedef struct RasPiState {
27
MemoryRegion ram;
28
} RasPiState;
29
30
+/*
31
+ * Board revision codes:
32
+ * www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/
33
+ */
34
+FIELD(REV_CODE, REVISION, 0, 4);
35
+FIELD(REV_CODE, TYPE, 4, 8);
36
+FIELD(REV_CODE, PROCESSOR, 12, 4);
37
+FIELD(REV_CODE, MANUFACTURER, 16, 4);
38
+FIELD(REV_CODE, MEMORY_SIZE, 20, 3);
39
+FIELD(REV_CODE, STYLE, 23, 1);
40
+
24
+
41
+static int board_processor_id(uint32_t board_rev)
25
struct VersalVirt {
42
+{
26
MachineState parent_obj;
43
+ assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
27
44
+ return FIELD_EX32(board_rev, REV_CODE, PROCESSOR);
28
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
45
+}
29
exit(EXIT_FAILURE);
30
}
31
}
46
+
32
+
47
+static int board_version(uint32_t board_rev)
33
+ for (i = 0; i < XLNX_VERSAL_NUM_OSPI_FLASH; i++) {
48
+{
34
+ BusState *spi_bus;
49
+ return board_processor_id(board_rev) + 1;
35
+ DeviceState *flash_dev;
50
+}
36
+ qemu_irq cs_line;
37
+ DriveInfo *dinfo = drive_get(IF_MTD, 0, i);
51
+
38
+
52
static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
39
+ spi_bus = qdev_get_child_bus(DEVICE(&s->soc.pmc.iou.ospi), "spi0");
53
{
40
+
54
static const uint32_t smpboot[] = {
41
+ flash_dev = qdev_new("mt35xu01g");
55
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
42
+ if (dinfo) {
56
arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
43
+ qdev_prop_set_drive_err(flash_dev, "drive",
44
+ blk_by_legacy_dinfo(dinfo), &error_fatal);
45
+ }
46
+ qdev_realize_and_unref(flash_dev, spi_bus, &error_fatal);
47
+
48
+ cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
49
+
50
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->soc.pmc.iou.ospi),
51
+ i + 1, cs_line);
52
+ }
57
}
53
}
58
54
59
-static void raspi_init(MachineState *machine, int version)
55
static void versal_virt_machine_instance_init(Object *obj)
60
+static void raspi_init(MachineState *machine, uint32_t board_rev)
61
{
62
RasPiState *s = g_new0(RasPiState, 1);
63
+ int version = board_version(board_rev);
64
uint32_t vcram_size;
65
DriveInfo *di;
66
BlockBackend *blk;
67
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
68
/* Setup the SOC */
69
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
70
&error_abort);
71
- int board_rev = version == 3 ? 0xa02082 : 0xa21041;
72
object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
73
&error_abort);
74
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_abort);
75
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
76
77
static void raspi2_init(MachineState *machine)
78
{
79
- raspi_init(machine, 2);
80
+ raspi_init(machine, 0xa21041);
81
}
82
83
static void raspi2_machine_init(MachineClass *mc)
84
@@ -XXX,XX +XXX,XX @@ DEFINE_MACHINE("raspi2", raspi2_machine_init)
85
#ifdef TARGET_AARCH64
86
static void raspi3_init(MachineState *machine)
87
{
88
- raspi_init(machine, 3);
89
+ raspi_init(machine, 0xa02082);
90
}
91
92
static void raspi3_machine_init(MachineClass *mc)
93
--
56
--
94
2.20.1
57
2.25.1
95
58
96
59
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Francisco Iglesias <francisco.iglesias@xilinx.com>
2
2
3
There is no point in creating the SoC object before allocating the RAM.
3
List myself as maintainer for the Xilinx Versal OSPI controller.
4
Move the call to keep all the SoC-related calls together.
5
4
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
6
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Message-id: 20200208165645.15657-7-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20220121161141.14389-11-francisco.iglesias@xilinx.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
hw/arm/raspi.c | 5 ++---
11
MAINTAINERS | 6 ++++++
13
1 file changed, 2 insertions(+), 3 deletions(-)
12
1 file changed, 6 insertions(+)
14
13
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
14
diff --git a/MAINTAINERS b/MAINTAINERS
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/raspi.c
16
--- a/MAINTAINERS
18
+++ b/hw/arm/raspi.c
17
+++ b/MAINTAINERS
19
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
18
@@ -XXX,XX +XXX,XX @@ F: hw/display/dpcd.c
20
exit(1);
19
F: include/hw/display/dpcd.h
21
}
20
F: docs/system/arm/xlnx-versal-virt.rst
22
21
23
- object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
22
+Xilinx Versal OSPI
24
- board_soc_type(board_rev), &error_abort, NULL);
23
+M: Francisco Iglesias <francisco.iglesias@xilinx.com>
25
-
24
+S: Maintained
26
/* Allocate and map RAM */
25
+F: hw/ssi/xlnx-versal-ospi.c
27
memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
26
+F: include/hw/ssi/xlnx-versal-ospi.h
28
machine->ram_size);
27
+
29
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
28
ARM ACPI Subsystem
30
memory_region_add_subregion_overlap(get_system_memory(), 0, &s->ram, 0);
29
M: Shannon Zhao <shannon.zhaosl@gmail.com>
31
30
L: qemu-arm@nongnu.org
32
/* Setup the SOC */
33
+ object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
34
+ board_soc_type(board_rev), &error_abort, NULL);
35
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
36
&error_abort);
37
object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
38
--
31
--
39
2.20.1
32
2.25.1
40
33
41
34
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Andrew Baumann <Andrew.Baumann@microsoft.com>
2
2
3
We hardcode the board revision as 0xa21041 for the raspi2, and
3
Signed-off-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
4
0xa02082 for the raspi3:
4
Message-id: MW4PR21MB1940E8BB52F4053C943B1FCD9E219@MW4PR21MB1940.namprd21.prod.outlook.com
5
6
166 static void raspi_init(MachineState *machine, int version)
7
167 {
8
...
9
194 int board_rev = version == 3 ? 0xa02082 : 0xa21041;
10
11
These revision codes are for the 2B and 3B models, see:
12
https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
13
14
Correct the board description.
15
16
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20200208165645.15657-3-f4bug@amsat.org
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
6
---
21
hw/arm/raspi.c | 4 ++--
7
MAINTAINERS | 1 -
22
1 file changed, 2 insertions(+), 2 deletions(-)
8
1 file changed, 1 deletion(-)
23
9
24
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
10
diff --git a/MAINTAINERS b/MAINTAINERS
25
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/raspi.c
12
--- a/MAINTAINERS
27
+++ b/hw/arm/raspi.c
13
+++ b/MAINTAINERS
28
@@ -XXX,XX +XXX,XX @@ static void raspi2_init(MachineState *machine)
14
@@ -XXX,XX +XXX,XX @@ F: docs/system/arm/palm.rst
29
15
30
static void raspi2_machine_init(MachineClass *mc)
16
Raspberry Pi
31
{
17
M: Peter Maydell <peter.maydell@linaro.org>
32
- mc->desc = "Raspberry Pi 2";
18
-R: Andrew Baumann <Andrew.Baumann@microsoft.com>
33
+ mc->desc = "Raspberry Pi 2B";
19
R: Philippe Mathieu-Daudé <f4bug@amsat.org>
34
mc->init = raspi2_init;
20
L: qemu-arm@nongnu.org
35
mc->block_default_type = IF_SD;
21
S: Odd Fixes
36
mc->no_parallel = 1;
37
@@ -XXX,XX +XXX,XX @@ static void raspi3_init(MachineState *machine)
38
39
static void raspi3_machine_init(MachineClass *mc)
40
{
41
- mc->desc = "Raspberry Pi 3";
42
+ mc->desc = "Raspberry Pi 3B";
43
mc->init = raspi3_init;
44
mc->block_default_type = IF_SD;
45
mc->no_parallel = 1;
46
--
22
--
47
2.20.1
23
2.25.1
48
24
49
25
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
If you don't know it, it's hard to figure out the difference between
2
the linux-headers folder and the include/standard-headers folder.
3
So let's add a short explanation to clarify the difference.
2
4
3
When booting without device tree, the Linux kernels uses the $R1
5
Suggested-by: Thomas Huth <thuth@redhat.com>
4
register to determine the machine type. The list of values is
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
registered at [1].
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
9
Reviewed-by: Thomas Huth <thuth@redhat.com>
10
---
11
scripts/update-linux-headers.sh | 16 ++++++++++++++++
12
1 file changed, 16 insertions(+)
6
13
7
There are two entries for the Raspberry Pi:
14
diff --git a/scripts/update-linux-headers.sh b/scripts/update-linux-headers.sh
8
15
index XXXXXXX..XXXXXXX 100755
9
- https://www.arm.linux.org.uk/developer/machines/list.php?mid=3138
16
--- a/scripts/update-linux-headers.sh
10
name: MACH_TYPE_BCM2708
17
+++ b/scripts/update-linux-headers.sh
11
value: 0xc42 (3138)
12
status: Active, not mainlined
13
date: 15 Oct 2010
14
15
- https://www.arm.linux.org.uk/developer/machines/list.php?mid=4828
16
name: MACH_TYPE_BCM2835
17
value: 4828
18
status: Active, mainlined
19
date: 6 Dec 2013
20
21
QEMU always used the non-mainlined type MACH_TYPE_BCM2708.
22
The value 0xc43 is registered to 'MX51_GGC' (processor i.MX51), and
23
0xc44 to 'Western Digital Sharespace NAS' (processor Marvell 88F5182).
24
25
The Raspberry Pi foundation bootloader only sets the BCM2708 machine
26
type, see [2] or [3]:
27
28
133 9:
29
134 mov r0, #0
30
135 ldr r1, =3138 @ BCM2708 machine id
31
136 ldr r2, atags @ ATAGS
32
137 bx r4
33
34
U-Boot only uses MACH_TYPE_BCM2708 (see [4]):
35
36
25 /*
37
26 * 2835 is a SKU in a series for which the 2708 is the first or primary SoC,
38
27 * so 2708 has historically been used rather than a dedicated 2835 ID.
39
28 *
40
29 * We don't define a machine type for bcm2709/bcm2836 since the RPi Foundation
41
30 * chose to use someone else's previously registered machine ID (3139, MX51_GGC)
42
31 * rather than obtaining a valid ID:-/
43
32 *
44
33 * For the bcm2837, hopefully a machine type is not needed, since everything
45
34 * is DT.
46
35 */
47
48
While the definition MACH_BCM2709 with value 0xc43 was introduced in
49
a commit described "Add 2709 platform for Raspberry Pi 2" out of the
50
mainline Linux kernel, it does not seem used, and the platform is
51
introduced with Device Tree support anyway (see [5] and [6]).
52
53
Remove the unused values (0xc43 introduced in commit 1df7d1f9303aef
54
"raspi: add raspberry pi 2 machine" and 0xc44 in commit bade58166f4
55
"raspi: Raspberry Pi 3 support"), keeping only MACH_TYPE_BCM2708.
56
57
[1] https://www.arm.linux.org.uk/developer/machines/
58
[2] https://github.com/raspberrypi/tools/blob/920c7ed2e/armstubs/armstub7.S#L135
59
[3] https://github.com/raspberrypi/tools/blob/49719d554/armstubs/armstub7.S#L64
60
[4] https://gitlab.denx.de/u-boot/u-boot/blob/v2015.04/include/configs/rpi-common.h#L18
61
[5] https://github.com/raspberrypi/linux/commit/d9fac63adac#diff-6722037d79570df5b392a49e0e006573R526
62
[6] http://lists.infradead.org/pipermail/linux-rpi-kernel/2015-February/001268.html
63
64
Cc: Zoltán Baldaszti <bztemail@gmail.com>
65
Cc: Pekka Enberg <penberg@iki.fi>
66
Cc: Stephen Warren <swarren@nvidia.com>
67
Cc: Kshitij Soni <kshitij.soni@broadcom.com>
68
Cc: Michael Chan <michael.chan@broadcom.com>
69
Cc: Andrew Baumann <Andrew.Baumann@microsoft.com>
70
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
71
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
72
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
73
Message-id: 20200208165645.15657-2-f4bug@amsat.org
74
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
75
---
76
hw/arm/raspi.c | 6 +++---
77
1 file changed, 3 insertions(+), 3 deletions(-)
78
79
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
80
index XXXXXXX..XXXXXXX 100644
81
--- a/hw/arm/raspi.c
82
+++ b/hw/arm/raspi.c
83
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
84
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
19
#
85
#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
20
# This work is licensed under the terms of the GNU GPL version 2.
86
21
# See the COPYING file in the top-level directory.
87
-/* Table of Linux board IDs for different Pi versions */
22
+#
88
-static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
23
+# The script will copy the headers into two target folders:
89
+/* Registered machine type (matches RPi Foundation bootloader and U-Boot) */
24
+#
90
+#define MACH_TYPE_BCM2708 3138
25
+# - linux-headers/ for files that are required for compiling for a
91
26
+# Linux host. Generally we have these so we can use kernel structs
92
typedef struct RasPiState {
27
+# and defines that are more recent than the headers that might be
93
BCM283XState soc;
28
+# installed on the host system. Usually this script can do simple
94
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
29
+# file copies for these headers.
95
static struct arm_boot_info binfo;
30
+#
96
int r;
31
+# - include/standard-headers/ for files that are used for guest
97
32
+# device emulation and are required on all hosts. For instance, we
98
- binfo.board_id = raspi_boardid[version];
33
+# get our definitions of the virtio structures from the Linux
99
+ binfo.board_id = MACH_TYPE_BCM2708;
34
+# kernel headers, but we need those definitions regardless of which
100
binfo.ram_size = ram_size;
35
+# host OS we are building for. This script has to be careful to
101
binfo.nb_cpus = machine->smp.cpus;
36
+# sanitize the headers to remove any use of Linux-specifics such as
102
37
+# types like "__u64". This work is done in the cp_portable function.
38
39
tmpdir=$(mktemp -d)
40
linux="$1"
103
--
41
--
104
2.20.1
42
2.25.1
105
43
106
44
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
In an SMP system it can be unclear which CPU is taking an exception;
2
add the CPU index (which is the same value used in the TCG 'Trace
3
%d:' logging) to the "Taking exception" log line to clarify it.
2
4
3
To implement PAN, we will want to swap, for short periods
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
of time, to a different privileged mmu_idx. In addition,
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
we cannot do this with flushing alone, because the AT*
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
instructions have both PAN and PAN-less versions.
8
Message-id: 20220122182444.724087-2-peter.maydell@linaro.org
9
---
10
target/arm/internals.h | 2 +-
11
target/arm/helper.c | 9 ++++++---
12
target/arm/m_helper.c | 2 +-
13
3 files changed, 8 insertions(+), 5 deletions(-)
7
14
8
Add the ARMMMUIdx*_PAN constants where necessary next to
9
the corresponding ARMMMUIdx* constant.
10
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20200208125816.14954-3-richard.henderson@linaro.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
target/arm/cpu-param.h | 2 +-
18
target/arm/cpu.h | 33 ++++++++++++++-------
19
target/arm/internals.h | 9 ++++++
20
target/arm/helper.c | 60 +++++++++++++++++++++++++++++++-------
21
target/arm/translate-a64.c | 3 ++
22
target/arm/translate.c | 2 ++
23
6 files changed, 87 insertions(+), 22 deletions(-)
24
25
diff --git a/target/arm/cpu-param.h b/target/arm/cpu-param.h
26
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/cpu-param.h
28
+++ b/target/arm/cpu-param.h
29
@@ -XXX,XX +XXX,XX @@
30
# define TARGET_PAGE_BITS_MIN 10
31
#endif
32
33
-#define NB_MMU_MODES 9
34
+#define NB_MMU_MODES 12
35
36
#endif
37
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
38
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/cpu.h
40
+++ b/target/arm/cpu.h
41
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
42
* 5. we want to be able to use the TLB for accesses done as part of a
43
* stage1 page table walk, rather than having to walk the stage2 page
44
* table over and over.
45
+ * 6. we need separate EL1/EL2 mmu_idx for handling the Privileged Access
46
+ * Never (PAN) bit within PSTATE.
47
*
48
* This gives us the following list of cases:
49
*
50
* NS EL0 EL1&0 stage 1+2 (aka NS PL0)
51
* NS EL1 EL1&0 stage 1+2 (aka NS PL1)
52
+ * NS EL1 EL1&0 stage 1+2 +PAN
53
* NS EL0 EL2&0
54
- * NS EL2 EL2&0
55
+ * NS EL2 EL2&0 +PAN
56
* NS EL2 (aka NS PL2)
57
* S EL0 EL1&0 (aka S PL0)
58
* S EL1 EL1&0 (not used if EL3 is 32 bit)
59
+ * S EL1 EL1&0 +PAN
60
* S EL3 (aka S PL1)
61
* NS EL1&0 stage 2
62
*
63
- * for a total of 9 different mmu_idx.
64
+ * for a total of 12 different mmu_idx.
65
*
66
* R profile CPUs have an MPU, but can use the same set of MMU indexes
67
* as A profile. They only need to distinguish NS EL0 and NS EL1 (and
68
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
69
/*
70
* A-profile.
71
*/
72
- ARMMMUIdx_E10_0 = 0 | ARM_MMU_IDX_A,
73
- ARMMMUIdx_E20_0 = 1 | ARM_MMU_IDX_A,
74
+ ARMMMUIdx_E10_0 = 0 | ARM_MMU_IDX_A,
75
+ ARMMMUIdx_E20_0 = 1 | ARM_MMU_IDX_A,
76
77
- ARMMMUIdx_E10_1 = 2 | ARM_MMU_IDX_A,
78
+ ARMMMUIdx_E10_1 = 2 | ARM_MMU_IDX_A,
79
+ ARMMMUIdx_E10_1_PAN = 3 | ARM_MMU_IDX_A,
80
81
- ARMMMUIdx_E2 = 3 | ARM_MMU_IDX_A,
82
- ARMMMUIdx_E20_2 = 4 | ARM_MMU_IDX_A,
83
+ ARMMMUIdx_E2 = 4 | ARM_MMU_IDX_A,
84
+ ARMMMUIdx_E20_2 = 5 | ARM_MMU_IDX_A,
85
+ ARMMMUIdx_E20_2_PAN = 6 | ARM_MMU_IDX_A,
86
87
- ARMMMUIdx_SE10_0 = 5 | ARM_MMU_IDX_A,
88
- ARMMMUIdx_SE10_1 = 6 | ARM_MMU_IDX_A,
89
- ARMMMUIdx_SE3 = 7 | ARM_MMU_IDX_A,
90
+ ARMMMUIdx_SE10_0 = 7 | ARM_MMU_IDX_A,
91
+ ARMMMUIdx_SE10_1 = 8 | ARM_MMU_IDX_A,
92
+ ARMMMUIdx_SE10_1_PAN = 9 | ARM_MMU_IDX_A,
93
+ ARMMMUIdx_SE3 = 10 | ARM_MMU_IDX_A,
94
95
- ARMMMUIdx_Stage2 = 8 | ARM_MMU_IDX_A,
96
+ ARMMMUIdx_Stage2 = 11 | ARM_MMU_IDX_A,
97
98
/*
99
* These are not allocated TLBs and are used only for AT system
100
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
101
*/
102
ARMMMUIdx_Stage1_E0 = 0 | ARM_MMU_IDX_NOTLB,
103
ARMMMUIdx_Stage1_E1 = 1 | ARM_MMU_IDX_NOTLB,
104
+ ARMMMUIdx_Stage1_E1_PAN = 2 | ARM_MMU_IDX_NOTLB,
105
106
/*
107
* M-profile.
108
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdxBit {
109
TO_CORE_BIT(E10_0),
110
TO_CORE_BIT(E20_0),
111
TO_CORE_BIT(E10_1),
112
+ TO_CORE_BIT(E10_1_PAN),
113
TO_CORE_BIT(E2),
114
TO_CORE_BIT(E20_2),
115
+ TO_CORE_BIT(E20_2_PAN),
116
TO_CORE_BIT(SE10_0),
117
TO_CORE_BIT(SE10_1),
118
+ TO_CORE_BIT(SE10_1_PAN),
119
TO_CORE_BIT(SE3),
120
TO_CORE_BIT(Stage2),
121
122
diff --git a/target/arm/internals.h b/target/arm/internals.h
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
123
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
124
--- a/target/arm/internals.h
17
--- a/target/arm/internals.h
125
+++ b/target/arm/internals.h
18
+++ b/target/arm/internals.h
126
@@ -XXX,XX +XXX,XX @@ static inline bool regime_has_2_ranges(ARMMMUIdx mmu_idx)
19
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
127
switch (mmu_idx) {
20
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
128
case ARMMMUIdx_Stage1_E0:
21
__attribute__((nonnull));
129
case ARMMMUIdx_Stage1_E1:
22
130
+ case ARMMMUIdx_Stage1_E1_PAN:
23
-void arm_log_exception(int idx);
131
case ARMMMUIdx_E10_0:
24
+void arm_log_exception(CPUState *cs);
132
case ARMMMUIdx_E10_1:
25
133
+ case ARMMMUIdx_E10_1_PAN:
26
#endif /* !CONFIG_USER_ONLY */
134
case ARMMMUIdx_E20_0:
27
135
case ARMMMUIdx_E20_2:
136
+ case ARMMMUIdx_E20_2_PAN:
137
case ARMMMUIdx_SE10_0:
138
case ARMMMUIdx_SE10_1:
139
+ case ARMMMUIdx_SE10_1_PAN:
140
return true;
141
default:
142
return false;
143
@@ -XXX,XX +XXX,XX @@ static inline bool regime_is_secure(CPUARMState *env, ARMMMUIdx mmu_idx)
144
switch (mmu_idx) {
145
case ARMMMUIdx_E10_0:
146
case ARMMMUIdx_E10_1:
147
+ case ARMMMUIdx_E10_1_PAN:
148
case ARMMMUIdx_E20_0:
149
case ARMMMUIdx_E20_2:
150
+ case ARMMMUIdx_E20_2_PAN:
151
case ARMMMUIdx_Stage1_E0:
152
case ARMMMUIdx_Stage1_E1:
153
+ case ARMMMUIdx_Stage1_E1_PAN:
154
case ARMMMUIdx_E2:
155
case ARMMMUIdx_Stage2:
156
case ARMMMUIdx_MPrivNegPri:
157
@@ -XXX,XX +XXX,XX @@ static inline bool regime_is_secure(CPUARMState *env, ARMMMUIdx mmu_idx)
158
case ARMMMUIdx_SE3:
159
case ARMMMUIdx_SE10_0:
160
case ARMMMUIdx_SE10_1:
161
+ case ARMMMUIdx_SE10_1_PAN:
162
case ARMMMUIdx_MSPrivNegPri:
163
case ARMMMUIdx_MSUserNegPri:
164
case ARMMMUIdx_MSPriv:
165
@@ -XXX,XX +XXX,XX @@ static inline bool arm_mmu_idx_is_stage1_of_2(ARMMMUIdx mmu_idx)
166
switch (mmu_idx) {
167
case ARMMMUIdx_Stage1_E0:
168
case ARMMMUIdx_Stage1_E1:
169
+ case ARMMMUIdx_Stage1_E1_PAN:
170
return true;
171
default:
172
return false;
173
diff --git a/target/arm/helper.c b/target/arm/helper.c
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
174
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
175
--- a/target/arm/helper.c
30
--- a/target/arm/helper.c
176
+++ b/target/arm/helper.c
31
+++ b/target/arm/helper.c
177
@@ -XXX,XX +XXX,XX @@ static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
32
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
178
33
return target_el;
179
tlb_flush_by_mmuidx(cs,
180
ARMMMUIdxBit_E10_1 |
181
+ ARMMMUIdxBit_E10_1_PAN |
182
ARMMMUIdxBit_E10_0 |
183
ARMMMUIdxBit_Stage2);
184
}
34
}
185
@@ -XXX,XX +XXX,XX @@ static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
35
186
36
-void arm_log_exception(int idx)
187
tlb_flush_by_mmuidx_all_cpus_synced(cs,
37
+void arm_log_exception(CPUState *cs)
188
ARMMMUIdxBit_E10_1 |
189
+ ARMMMUIdxBit_E10_1_PAN |
190
ARMMMUIdxBit_E10_0 |
191
ARMMMUIdxBit_Stage2);
192
}
193
@@ -XXX,XX +XXX,XX @@ static int gt_phys_redir_timeridx(CPUARMState *env)
194
switch (arm_mmu_idx(env)) {
195
case ARMMMUIdx_E20_0:
196
case ARMMMUIdx_E20_2:
197
+ case ARMMMUIdx_E20_2_PAN:
198
return GTIMER_HYP;
199
default:
200
return GTIMER_PHYS;
201
@@ -XXX,XX +XXX,XX @@ static int gt_virt_redir_timeridx(CPUARMState *env)
202
switch (arm_mmu_idx(env)) {
203
case ARMMMUIdx_E20_0:
204
case ARMMMUIdx_E20_2:
205
+ case ARMMMUIdx_E20_2_PAN:
206
return GTIMER_HYPVIRT;
207
default:
208
return GTIMER_VIRT;
209
@@ -XXX,XX +XXX,XX @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
210
format64 = arm_s1_regime_using_lpae_format(env, mmu_idx);
211
212
if (arm_feature(env, ARM_FEATURE_EL2)) {
213
- if (mmu_idx == ARMMMUIdx_E10_0 || mmu_idx == ARMMMUIdx_E10_1) {
214
+ if (mmu_idx == ARMMMUIdx_E10_0 ||
215
+ mmu_idx == ARMMMUIdx_E10_1 ||
216
+ mmu_idx == ARMMMUIdx_E10_1_PAN) {
217
format64 |= env->cp15.hcr_el2 & (HCR_VM | HCR_DC);
218
} else {
219
format64 |= arm_current_el(env) == 2;
220
@@ -XXX,XX +XXX,XX @@ static void vmsa_tcr_ttbr_el2_write(CPUARMState *env, const ARMCPRegInfo *ri,
221
if (extract64(raw_read(env, ri) ^ value, 48, 16) &&
222
(arm_hcr_el2_eff(env) & HCR_E2H)) {
223
tlb_flush_by_mmuidx(env_cpu(env),
224
- ARMMMUIdxBit_E20_2 | ARMMMUIdxBit_E20_0);
225
+ ARMMMUIdxBit_E20_2 |
226
+ ARMMMUIdxBit_E20_2_PAN |
227
+ ARMMMUIdxBit_E20_0);
228
}
229
raw_write(env, ri, value);
230
}
231
@@ -XXX,XX +XXX,XX @@ static void vttbr_write(CPUARMState *env, const ARMCPRegInfo *ri,
232
if (raw_read(env, ri) != value) {
233
tlb_flush_by_mmuidx(cs,
234
ARMMMUIdxBit_E10_1 |
235
+ ARMMMUIdxBit_E10_1_PAN |
236
ARMMMUIdxBit_E10_0 |
237
ARMMMUIdxBit_Stage2);
238
raw_write(env, ri, value);
239
@@ -XXX,XX +XXX,XX @@ static int vae1_tlbmask(CPUARMState *env)
240
{
38
{
241
/* Since we exclude secure first, we may read HCR_EL2 directly. */
39
+ int idx = cs->exception_index;
242
if (arm_is_secure_below_el3(env)) {
40
+
243
- return ARMMMUIdxBit_SE10_1 | ARMMMUIdxBit_SE10_0;
41
if (qemu_loglevel_mask(CPU_LOG_INT)) {
244
+ return ARMMMUIdxBit_SE10_1 |
42
const char *exc = NULL;
245
+ ARMMMUIdxBit_SE10_1_PAN |
43
static const char * const excnames[] = {
246
+ ARMMMUIdxBit_SE10_0;
44
@@ -XXX,XX +XXX,XX @@ void arm_log_exception(int idx)
247
} else if ((env->cp15.hcr_el2 & (HCR_E2H | HCR_TGE))
45
if (!exc) {
248
== (HCR_E2H | HCR_TGE)) {
46
exc = "unknown";
249
- return ARMMMUIdxBit_E20_2 | ARMMMUIdxBit_E20_0;
47
}
250
+ return ARMMMUIdxBit_E20_2 |
48
- qemu_log_mask(CPU_LOG_INT, "Taking exception %d [%s]\n", idx, exc);
251
+ ARMMMUIdxBit_E20_2_PAN |
49
+ qemu_log_mask(CPU_LOG_INT, "Taking exception %d [%s] on CPU %d\n",
252
+ ARMMMUIdxBit_E20_0;
50
+ idx, exc, cs->cpu_index);
253
} else {
254
- return ARMMMUIdxBit_E10_1 | ARMMMUIdxBit_E10_0;
255
+ return ARMMMUIdxBit_E10_1 |
256
+ ARMMMUIdxBit_E10_1_PAN |
257
+ ARMMMUIdxBit_E10_0;
258
}
51
}
259
}
52
}
260
53
261
@@ -XXX,XX +XXX,XX @@ static int alle1_tlbmask(CPUARMState *env)
54
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
262
* stage 1 translations.
55
263
*/
56
assert(!arm_feature(env, ARM_FEATURE_M));
264
if (arm_is_secure_below_el3(env)) {
57
265
- return ARMMMUIdxBit_SE10_1 | ARMMMUIdxBit_SE10_0;
58
- arm_log_exception(cs->exception_index);
266
+ return ARMMMUIdxBit_SE10_1 |
59
+ arm_log_exception(cs);
267
+ ARMMMUIdxBit_SE10_1_PAN |
60
qemu_log_mask(CPU_LOG_INT, "...from EL%d to EL%d\n", arm_current_el(env),
268
+ ARMMMUIdxBit_SE10_0;
61
new_el);
269
} else if (arm_feature(env, ARM_FEATURE_EL2)) {
62
if (qemu_loglevel_mask(CPU_LOG_INT)
270
- return ARMMMUIdxBit_E10_1 | ARMMMUIdxBit_E10_0 | ARMMMUIdxBit_Stage2;
63
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
271
+ return ARMMMUIdxBit_E10_1 |
272
+ ARMMMUIdxBit_E10_1_PAN |
273
+ ARMMMUIdxBit_E10_0 |
274
+ ARMMMUIdxBit_Stage2;
275
} else {
276
- return ARMMMUIdxBit_E10_1 | ARMMMUIdxBit_E10_0;
277
+ return ARMMMUIdxBit_E10_1 |
278
+ ARMMMUIdxBit_E10_1_PAN |
279
+ ARMMMUIdxBit_E10_0;
280
}
281
}
282
283
static int e2_tlbmask(CPUARMState *env)
284
{
285
/* TODO: ARMv8.4-SecEL2 */
286
- return ARMMMUIdxBit_E20_0 | ARMMMUIdxBit_E20_2 | ARMMMUIdxBit_E2;
287
+ return ARMMMUIdxBit_E20_0 |
288
+ ARMMMUIdxBit_E20_2 |
289
+ ARMMMUIdxBit_E20_2_PAN |
290
+ ARMMMUIdxBit_E2;
291
}
292
293
static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
294
@@ -XXX,XX +XXX,XX @@ static uint32_t regime_el(CPUARMState *env, ARMMMUIdx mmu_idx)
295
switch (mmu_idx) {
296
case ARMMMUIdx_E20_0:
297
case ARMMMUIdx_E20_2:
298
+ case ARMMMUIdx_E20_2_PAN:
299
case ARMMMUIdx_Stage2:
300
case ARMMMUIdx_E2:
301
return 2;
302
@@ -XXX,XX +XXX,XX @@ static uint32_t regime_el(CPUARMState *env, ARMMMUIdx mmu_idx)
303
case ARMMMUIdx_SE10_0:
304
return arm_el_is_aa64(env, 3) ? 1 : 3;
305
case ARMMMUIdx_SE10_1:
306
+ case ARMMMUIdx_SE10_1_PAN:
307
case ARMMMUIdx_Stage1_E0:
308
case ARMMMUIdx_Stage1_E1:
309
+ case ARMMMUIdx_Stage1_E1_PAN:
310
case ARMMMUIdx_E10_0:
311
case ARMMMUIdx_E10_1:
312
+ case ARMMMUIdx_E10_1_PAN:
313
case ARMMMUIdx_MPrivNegPri:
314
case ARMMMUIdx_MUserNegPri:
315
case ARMMMUIdx_MPriv:
316
@@ -XXX,XX +XXX,XX @@ static inline ARMMMUIdx stage_1_mmu_idx(ARMMMUIdx mmu_idx)
317
return ARMMMUIdx_Stage1_E0;
318
case ARMMMUIdx_E10_1:
319
return ARMMMUIdx_Stage1_E1;
320
+ case ARMMMUIdx_E10_1_PAN:
321
+ return ARMMMUIdx_Stage1_E1_PAN;
322
default:
323
return mmu_idx;
324
}
325
@@ -XXX,XX +XXX,XX @@ static inline bool regime_is_user(CPUARMState *env, ARMMMUIdx mmu_idx)
326
return false;
327
case ARMMMUIdx_E10_0:
328
case ARMMMUIdx_E10_1:
329
+ case ARMMMUIdx_E10_1_PAN:
330
g_assert_not_reached();
331
}
332
}
333
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
334
target_ulong *page_size,
335
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
336
{
337
- if (mmu_idx == ARMMMUIdx_E10_0 || mmu_idx == ARMMMUIdx_E10_1) {
338
+ if (mmu_idx == ARMMMUIdx_E10_0 ||
339
+ mmu_idx == ARMMMUIdx_E10_1 ||
340
+ mmu_idx == ARMMMUIdx_E10_1_PAN) {
341
/* Call ourselves recursively to do the stage 1 and then stage 2
342
* translations.
343
*/
344
@@ -XXX,XX +XXX,XX @@ int arm_mmu_idx_to_el(ARMMMUIdx mmu_idx)
345
case ARMMMUIdx_SE10_0:
346
return 0;
347
case ARMMMUIdx_E10_1:
348
+ case ARMMMUIdx_E10_1_PAN:
349
case ARMMMUIdx_SE10_1:
350
+ case ARMMMUIdx_SE10_1_PAN:
351
return 1;
352
case ARMMMUIdx_E2:
353
case ARMMMUIdx_E20_2:
354
+ case ARMMMUIdx_E20_2_PAN:
355
return 2;
356
case ARMMMUIdx_SE3:
357
return 3;
358
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
359
/* TODO: ARMv8.2-UAO */
360
switch (mmu_idx) {
361
case ARMMMUIdx_E10_1:
362
+ case ARMMMUIdx_E10_1_PAN:
363
case ARMMMUIdx_SE10_1:
364
+ case ARMMMUIdx_SE10_1_PAN:
365
/* TODO: ARMv8.3-NV */
366
flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
367
break;
368
case ARMMMUIdx_E20_2:
369
+ case ARMMMUIdx_E20_2_PAN:
370
/* TODO: ARMv8.4-SecEL2 */
371
/*
372
* Note that E20_2 is gated by HCR_EL2.E2H == 1, but E20_0 is
373
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
374
index XXXXXXX..XXXXXXX 100644
64
index XXXXXXX..XXXXXXX 100644
375
--- a/target/arm/translate-a64.c
65
--- a/target/arm/m_helper.c
376
+++ b/target/arm/translate-a64.c
66
+++ b/target/arm/m_helper.c
377
@@ -XXX,XX +XXX,XX @@ static int get_a64_user_mem_index(DisasContext *s)
67
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
378
*/
68
uint32_t lr;
379
switch (useridx) {
69
bool ignore_stackfaults;
380
case ARMMMUIdx_E10_1:
70
381
+ case ARMMMUIdx_E10_1_PAN:
71
- arm_log_exception(cs->exception_index);
382
useridx = ARMMMUIdx_E10_0;
72
+ arm_log_exception(cs);
383
break;
73
384
case ARMMMUIdx_E20_2:
74
/*
385
+ case ARMMMUIdx_E20_2_PAN:
75
* For exceptions we just mark as pending on the NVIC, and let that
386
useridx = ARMMMUIdx_E20_0;
387
break;
388
case ARMMMUIdx_SE10_1:
389
+ case ARMMMUIdx_SE10_1_PAN:
390
useridx = ARMMMUIdx_SE10_0;
391
break;
392
default:
393
diff --git a/target/arm/translate.c b/target/arm/translate.c
394
index XXXXXXX..XXXXXXX 100644
395
--- a/target/arm/translate.c
396
+++ b/target/arm/translate.c
397
@@ -XXX,XX +XXX,XX @@ static inline int get_a32_user_mem_index(DisasContext *s)
398
case ARMMMUIdx_E2: /* this one is UNPREDICTABLE */
399
case ARMMMUIdx_E10_0:
400
case ARMMMUIdx_E10_1:
401
+ case ARMMMUIdx_E10_1_PAN:
402
return arm_to_core_mmu_idx(ARMMMUIdx_E10_0);
403
case ARMMMUIdx_SE3:
404
case ARMMMUIdx_SE10_0:
405
case ARMMMUIdx_SE10_1:
406
+ case ARMMMUIdx_SE10_1_PAN:
407
return arm_to_core_mmu_idx(ARMMMUIdx_SE10_0);
408
case ARMMMUIdx_MUser:
409
case ARMMMUIdx_MPriv:
410
--
76
--
411
2.20.1
77
2.25.1
412
78
413
79
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The ITS currently has no tracepoints; add a minimal set
2
that allows basic monitoring of guest register accesses and
3
reading of commands from the command queue.
2
4
3
The board revision encode the amount of RAM. Add a helper
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
to extract the RAM size, and use it.
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Since the amount of RAM is fixed (it is impossible to physically
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
modify to have more or less RAM), do not allow sizes different
8
Message-id: 20220122182444.724087-3-peter.maydell@linaro.org
7
than the one anounced by the manufacturer.
9
---
10
hw/intc/arm_gicv3_its.c | 11 +++++++++++
11
hw/intc/trace-events | 8 ++++++++
12
2 files changed, 19 insertions(+)
8
13
9
Acked-by: Igor Mammedov <imammedo@redhat.com>
14
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200208165645.15657-5-f4bug@amsat.org
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/arm/raspi.c | 15 ++++++++++++---
16
1 file changed, 12 insertions(+), 3 deletions(-)
17
18
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/raspi.c
16
--- a/hw/intc/arm_gicv3_its.c
21
+++ b/hw/arm/raspi.c
17
+++ b/hw/intc/arm_gicv3_its.c
22
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
23
19
24
#include "qemu/osdep.h"
20
#include "qemu/osdep.h"
25
#include "qemu/units.h"
21
#include "qemu/log.h"
26
+#include "qemu/cutils.h"
22
+#include "trace.h"
27
#include "qapi/error.h"
23
#include "hw/qdev-properties.h"
28
#include "cpu.h"
24
#include "hw/intc/arm_gicv3_its_common.h"
29
#include "hw/arm/bcm2836.h"
25
#include "gicv3_internal.h"
30
@@ -XXX,XX +XXX,XX @@ FIELD(REV_CODE, MANUFACTURER, 16, 4);
26
@@ -XXX,XX +XXX,XX @@ static void process_cmdq(GICv3ITSState *s)
31
FIELD(REV_CODE, MEMORY_SIZE, 20, 3);
27
32
FIELD(REV_CODE, STYLE, 23, 1);
28
cmd = (data & CMD_MASK);
33
29
34
+static uint64_t board_ram_size(uint32_t board_rev)
30
+ trace_gicv3_its_process_command(rd_offset, cmd);
35
+{
36
+ assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
37
+ return 256 * MiB << FIELD_EX32(board_rev, REV_CODE, MEMORY_SIZE);
38
+}
39
+
31
+
40
static int board_processor_id(uint32_t board_rev)
32
switch (cmd) {
41
{
33
case GITS_CMD_INT:
42
assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
34
result = process_its_cmd(s, data, cq_offset, INTERRUPT);
43
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
35
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicv3_its_translation_write(void *opaque, hwaddr offset,
44
{
36
bool result = true;
45
RasPiState *s = g_new0(RasPiState, 1);
37
uint32_t devid = 0;
46
int version = board_version(board_rev);
38
47
+ uint64_t ram_size = board_ram_size(board_rev);
39
+ trace_gicv3_its_translation_write(offset, data, size, attrs.requester_id);
48
uint32_t vcram_size;
40
+
49
DriveInfo *di;
41
switch (offset) {
50
BlockBackend *blk;
42
case GITS_TRANSLATER:
51
BusState *bus;
43
if (s->ctlr & R_GITS_CTLR_ENABLED_MASK) {
52
DeviceState *carddev;
44
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicv3_its_read(void *opaque, hwaddr offset, uint64_t *data,
53
45
qemu_log_mask(LOG_GUEST_ERROR,
54
- if (machine->ram_size > 1 * GiB) {
46
"%s: invalid guest read at offset " TARGET_FMT_plx
55
- error_report("Requested ram size is too large for this machine: "
47
"size %u\n", __func__, offset, size);
56
- "maximum is 1GB");
48
+ trace_gicv3_its_badread(offset, size);
57
+ if (machine->ram_size != ram_size) {
49
/*
58
+ char *size_str = size_to_str(ram_size);
50
* The spec requires that reserved registers are RAZ/WI;
59
+ error_report("Invalid RAM size, should be %s", size_str);
51
* so use false returns from leaf functions as a way to
60
+ g_free(size_str);
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicv3_its_read(void *opaque, hwaddr offset, uint64_t *data,
61
exit(1);
53
* the caller, or we'll cause a spurious guest data abort.
54
*/
55
*data = 0;
56
+ } else {
57
+ trace_gicv3_its_read(offset, *data, size);
62
}
58
}
63
59
return MEMTX_OK;
60
}
61
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicv3_its_write(void *opaque, hwaddr offset, uint64_t data,
62
qemu_log_mask(LOG_GUEST_ERROR,
63
"%s: invalid guest write at offset " TARGET_FMT_plx
64
"size %u\n", __func__, offset, size);
65
+ trace_gicv3_its_badwrite(offset, data, size);
66
/*
67
* The spec requires that reserved registers are RAZ/WI;
68
* so use false returns from leaf functions as a way to
69
* trigger the guest-error logging but don't return it to
70
* the caller, or we'll cause a spurious guest data abort.
71
*/
72
+ } else {
73
+ trace_gicv3_its_write(offset, data, size);
74
}
75
return MEMTX_OK;
76
}
77
diff --git a/hw/intc/trace-events b/hw/intc/trace-events
78
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/intc/trace-events
80
+++ b/hw/intc/trace-events
81
@@ -XXX,XX +XXX,XX @@ gicv3_redist_badwrite(uint32_t cpu, uint64_t offset, uint64_t data, unsigned siz
82
gicv3_redist_set_irq(uint32_t cpu, int irq, int level) "GICv3 redistributor 0x%x interrupt %d level changed to %d"
83
gicv3_redist_send_sgi(uint32_t cpu, int irq) "GICv3 redistributor 0x%x pending SGI %d"
84
85
+# arm_gicv3_its.c
86
+gicv3_its_read(uint64_t offset, uint64_t data, unsigned size) "GICv3 ITS read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
87
+gicv3_its_badread(uint64_t offset, unsigned size) "GICv3 ITS read: offset 0x%" PRIx64 " size %u: error"
88
+gicv3_its_write(uint64_t offset, uint64_t data, unsigned size) "GICv3 ITS write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
89
+gicv3_its_badwrite(uint64_t offset, uint64_t data, unsigned size) "GICv3 ITS write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u: error"
90
+gicv3_its_translation_write(uint64_t offset, uint64_t data, unsigned size, uint32_t requester_id) "GICv3 ITS TRANSLATER write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u requester_id 0x%x"
91
+gicv3_its_process_command(uint32_t rd_offset, uint8_t cmd) "GICv3 ITS: processing command at offset 0x%x: 0x%x"
92
+
93
# armv7m_nvic.c
94
nvic_recompute_state(int vectpending, int vectpending_prio, int exception_prio) "NVIC state recomputed: vectpending %d vectpending_prio %d exception_prio %d"
95
nvic_recompute_state_secure(int vectpending, bool vectpending_is_s_banked, int vectpending_prio, int exception_prio) "NVIC state recomputed: vectpending %d is_s_banked %d vectpending_prio %d exception_prio %d"
64
--
96
--
65
2.20.1
97
2.25.1
66
98
67
99
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
In our implementation, all ITSes connected to a GIC share a single
2
AddressSpace, which we keep in the GICv3State::dma_as field and
3
initialized based on the GIC's 'sysmem' property. The right place
4
to set it up by calling address_space_init() is therefore in the
5
GIC's realize method, not the ITS's realize.
2
6
3
Initialize EHCI controllers on AST2400 and AST2500 using the existing
7
This fixes a theoretical bug where QEMU hangs on startup if the board
4
TYPE_PLATFORM_EHCI. After this change, booting ast2500-evb into Linux
8
model creates two ITSes connected to the same GIC -- we would call
5
successfully instantiates a USB interface.
9
address_space_init() twice on the same AddressSpace*, which creates
10
an infinite loop in the QTAILQ that softmmu/memory.c uses to store
11
its list of AddressSpaces and causes any subsequent attempt to
12
iterate through that list to loop forever. There aren't any board
13
models like that in the tree at the moment, though.
6
14
7
ehci-platform 1e6a3000.usb: EHCI Host Controller
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
ehci-platform 1e6a3000.usb: new USB bus registered, assigned bus number 1
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
ehci-platform 1e6a3000.usb: irq 21, io mem 0x1e6a3000
17
Message-id: 20220122182444.724087-4-peter.maydell@linaro.org
10
ehci-platform 1e6a3000.usb: USB 2.0 started, EHCI 1.00
18
---
11
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.05
19
hw/intc/arm_gicv3_common.c | 5 +++++
12
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
20
hw/intc/arm_gicv3_its.c | 3 ---
13
usb usb1: Product: EHCI Host Controller
21
2 files changed, 5 insertions(+), 3 deletions(-)
14
22
15
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
23
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
16
Reviewed-by: Cédric Le Goater <clg@kaod.org>
17
Reviewed-by: Joel Stanley <joel@jms.id.au>
18
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
19
Message-id: 20200206183437.3979-1-linux@roeck-us.net
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
22
include/hw/arm/aspeed_soc.h | 6 ++++++
23
hw/arm/aspeed_soc.c | 25 +++++++++++++++++++++++++
24
2 files changed, 31 insertions(+)
25
26
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
27
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/aspeed_soc.h
25
--- a/hw/intc/arm_gicv3_common.c
29
+++ b/include/hw/arm/aspeed_soc.h
26
+++ b/hw/intc/arm_gicv3_common.c
30
@@ -XXX,XX +XXX,XX @@
27
@@ -XXX,XX +XXX,XX @@ static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
31
#include "target/arm/cpu.h"
28
return;
32
#include "hw/gpio/aspeed_gpio.h"
33
#include "hw/sd/aspeed_sdhci.h"
34
+#include "hw/usb/hcd-ehci.h"
35
36
#define ASPEED_SPIS_NUM 2
37
+#define ASPEED_EHCIS_NUM 2
38
#define ASPEED_WDTS_NUM 4
39
#define ASPEED_CPUS_NUM 2
40
#define ASPEED_MACS_NUM 4
41
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCState {
42
AspeedXDMAState xdma;
43
AspeedSMCState fmc;
44
AspeedSMCState spi[ASPEED_SPIS_NUM];
45
+ EHCISysBusState ehci[ASPEED_EHCIS_NUM];
46
AspeedSDMCState sdmc;
47
AspeedWDTState wdt[ASPEED_WDTS_NUM];
48
FTGMAC100State ftgmac100[ASPEED_MACS_NUM];
49
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCClass {
50
uint32_t silicon_rev;
51
uint64_t sram_size;
52
int spis_num;
53
+ int ehcis_num;
54
int wdts_num;
55
int macs_num;
56
const int *irqmap;
57
@@ -XXX,XX +XXX,XX @@ enum {
58
ASPEED_FMC,
59
ASPEED_SPI1,
60
ASPEED_SPI2,
61
+ ASPEED_EHCI1,
62
+ ASPEED_EHCI2,
63
ASPEED_VIC,
64
ASPEED_SDMC,
65
ASPEED_SCU,
66
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/arm/aspeed_soc.c
69
+++ b/hw/arm/aspeed_soc.c
70
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2400_memmap[] = {
71
[ASPEED_IOMEM] = 0x1E600000,
72
[ASPEED_FMC] = 0x1E620000,
73
[ASPEED_SPI1] = 0x1E630000,
74
+ [ASPEED_EHCI1] = 0x1E6A1000,
75
[ASPEED_VIC] = 0x1E6C0000,
76
[ASPEED_SDMC] = 0x1E6E0000,
77
[ASPEED_SCU] = 0x1E6E2000,
78
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2500_memmap[] = {
79
[ASPEED_FMC] = 0x1E620000,
80
[ASPEED_SPI1] = 0x1E630000,
81
[ASPEED_SPI2] = 0x1E631000,
82
+ [ASPEED_EHCI1] = 0x1E6A1000,
83
+ [ASPEED_EHCI2] = 0x1E6A3000,
84
[ASPEED_VIC] = 0x1E6C0000,
85
[ASPEED_SDMC] = 0x1E6E0000,
86
[ASPEED_SCU] = 0x1E6E2000,
87
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2400_irqmap[] = {
88
[ASPEED_UART5] = 10,
89
[ASPEED_VUART] = 8,
90
[ASPEED_FMC] = 19,
91
+ [ASPEED_EHCI1] = 5,
92
+ [ASPEED_EHCI2] = 13,
93
[ASPEED_SDMC] = 0,
94
[ASPEED_SCU] = 21,
95
[ASPEED_ADC] = 31,
96
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
97
sizeof(s->spi[i]), typename);
98
}
29
}
99
30
100
+ for (i = 0; i < sc->ehcis_num; i++) {
31
+ if (s->lpi_enable) {
101
+ sysbus_init_child_obj(obj, "ehci[*]", OBJECT(&s->ehci[i]),
32
+ address_space_init(&s->dma_as, s->dma,
102
+ sizeof(s->ehci[i]), TYPE_PLATFORM_EHCI);
33
+ "gicv3-its-sysmem");
103
+ }
34
+ }
104
+
35
+
105
snprintf(typename, sizeof(typename), "aspeed.sdmc-%s", socname);
36
s->cpu = g_new0(GICv3CPUState, s->num_cpu);
106
sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc),
37
107
typename);
38
for (i = 0; i < s->num_cpu; i++) {
108
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
39
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
109
s->spi[i].ctrl->flash_window_base);
40
index XXXXXXX..XXXXXXX 100644
110
}
41
--- a/hw/intc/arm_gicv3_its.c
111
42
+++ b/hw/intc/arm_gicv3_its.c
112
+ /* EHCI */
43
@@ -XXX,XX +XXX,XX @@ static void gicv3_arm_its_realize(DeviceState *dev, Error **errp)
113
+ for (i = 0; i < sc->ehcis_num; i++) {
44
114
+ object_property_set_bool(OBJECT(&s->ehci[i]), true, "realized", &err);
45
gicv3_its_init_mmio(s, &gicv3_its_control_ops, &gicv3_its_translation_ops);
115
+ if (err) {
46
116
+ error_propagate(errp, err);
47
- address_space_init(&s->gicv3->dma_as, s->gicv3->dma,
117
+ return;
48
- "gicv3-its-sysmem");
118
+ }
49
-
119
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
50
/* set the ITS default features supported */
120
+ sc->memmap[ASPEED_EHCI1 + i]);
51
s->typer = FIELD_DP64(s->typer, GITS_TYPER, PHYSICAL, 1);
121
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci[i]), 0,
52
s->typer = FIELD_DP64(s->typer, GITS_TYPER, ITT_ENTRY_SIZE,
122
+ aspeed_soc_get_irq(s, ASPEED_EHCI1 + i));
123
+ }
124
+
125
/* SDMC - SDRAM Memory Controller */
126
object_property_set_bool(OBJECT(&s->sdmc), true, "realized", &err);
127
if (err) {
128
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
129
sc->silicon_rev = AST2400_A1_SILICON_REV;
130
sc->sram_size = 0x8000;
131
sc->spis_num = 1;
132
+ sc->ehcis_num = 1;
133
sc->wdts_num = 2;
134
sc->macs_num = 2;
135
sc->irqmap = aspeed_soc_ast2400_irqmap;
136
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
137
sc->silicon_rev = AST2500_A1_SILICON_REV;
138
sc->sram_size = 0x9000;
139
sc->spis_num = 2;
140
+ sc->ehcis_num = 2;
141
sc->wdts_num = 3;
142
sc->macs_num = 2;
143
sc->irqmap = aspeed_soc_ast2500_irqmap;
144
--
53
--
145
2.20.1
54
2.25.1
146
55
147
56
diff view generated by jsdifflib
1
From: Heyi Guo <guoheyi@huawei.com>
1
The current ITS code clears GITS_CREADR when GITS_CTLR.ENABLED is set.
2
This is not correct -- guest code can validly clear ENABLED and then
3
set it again and expect the ITS to continue processing where it left
4
off. Remove the erroneous assignment.
2
5
3
The original code defines a named object for the resource template but
4
then returns the resource template object itself; the resulted output
5
is like below:
6
7
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
8
{
9
Name (RBUF, ResourceTemplate ()
10
{
11
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
12
0x0000, // Granularity
13
0x0000, // Range Minimum
14
0x00FF, // Range Maximum
15
0x0000, // Translation Offset
16
0x0100, // Length
17
,, )
18
......
19
})
20
Return (ResourceTemplate ()
21
{
22
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
23
0x0000, // Granularity
24
0x0000, // Range Minimum
25
0x00FF, // Range Maximum
26
0x0000, // Translation Offset
27
0x0100, // Length
28
,, )
29
......
30
})
31
}
32
33
So the named object "RBUF" is actually useless. The more natural way
34
is to return RBUF instead, or simply drop RBUF definition.
35
36
Choose the latter one to simplify the code.
37
38
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
39
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
40
Message-id: 20200204014325.16279-7-guoheyi@huawei.com
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220122182444.724087-5-peter.maydell@linaro.org
42
---
9
---
43
hw/arm/virt-acpi-build.c | 1 -
10
hw/intc/arm_gicv3_its.c | 1 -
44
1 file changed, 1 deletion(-)
11
1 file changed, 1 deletion(-)
45
12
46
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
13
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
47
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/virt-acpi-build.c
15
--- a/hw/intc/arm_gicv3_its.c
49
+++ b/hw/arm/virt-acpi-build.c
16
+++ b/hw/intc/arm_gicv3_its.c
50
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
17
@@ -XXX,XX +XXX,XX @@ static bool its_writel(GICv3ITSState *s, hwaddr offset,
51
size_mmio_high));
18
s->ctlr |= R_GITS_CTLR_ENABLED_MASK;
52
}
19
extract_table_params(s);
53
20
extract_cmdq_params(s);
54
- aml_append(method, aml_name_decl("RBUF", rbuf));
21
- s->creadr = 0;
55
aml_append(method, aml_return(rbuf));
22
process_cmdq(s);
56
aml_append(dev, method);
23
} else {
57
24
s->ctlr &= ~R_GITS_CTLR_ENABLED_MASK;
58
--
25
--
59
2.20.1
26
2.25.1
60
27
61
28
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The ITS specification says that when the guest writes to GITS_CBASER
2
this causes GITS_CREADR to be cleared. However it does not have an
3
equivalent clause for GITS_CWRITER. (This is because GITS_CREADR is
4
read-only, but GITS_CWRITER is writable and the guest can initialize
5
it.) Remove the code that clears GITS_CWRITER on GITS_CBASER writes.
2
6
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20200208125816.14954-21-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220122182444.724087-6-peter.maydell@linaro.org
7
---
10
---
8
target/arm/cpu64.c | 4 ++++
11
hw/intc/arm_gicv3_its.c | 3 ---
9
1 file changed, 4 insertions(+)
12
1 file changed, 3 deletions(-)
10
13
11
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
14
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/cpu64.c
16
--- a/hw/intc/arm_gicv3_its.c
14
+++ b/target/arm/cpu64.c
17
+++ b/hw/intc/arm_gicv3_its.c
15
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
18
@@ -XXX,XX +XXX,XX @@ static bool its_writel(GICv3ITSState *s, hwaddr offset,
16
t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
19
if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) {
17
cpu->isar.id_aa64mmfr1 = t;
20
s->cbaser = deposit64(s->cbaser, 0, 32, value);
18
21
s->creadr = 0;
19
+ t = cpu->isar.id_aa64mmfr2;
22
- s->cwriter = s->creadr;
20
+ t = FIELD_DP64(t, ID_AA64MMFR2, UAO, 1);
23
}
21
+ cpu->isar.id_aa64mmfr2 = t;
24
break;
22
+
25
case GITS_CBASER + 4:
23
/* Replicate the same data to the 32-bit id registers. */
26
@@ -XXX,XX +XXX,XX @@ static bool its_writel(GICv3ITSState *s, hwaddr offset,
24
u = cpu->isar.id_isar5;
27
if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) {
25
u = FIELD_DP32(u, ID_ISAR5, AES, 2); /* AES + PMULL */
28
s->cbaser = deposit64(s->cbaser, 32, 32, value);
29
s->creadr = 0;
30
- s->cwriter = s->creadr;
31
}
32
break;
33
case GITS_CWRITER:
34
@@ -XXX,XX +XXX,XX @@ static bool its_writell(GICv3ITSState *s, hwaddr offset,
35
if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) {
36
s->cbaser = value;
37
s->creadr = 0;
38
- s->cwriter = s->creadr;
39
}
40
break;
41
case GITS_CWRITER:
26
--
42
--
27
2.20.1
43
2.25.1
28
44
29
45
diff view generated by jsdifflib
1
The ARMv8.1-VMID16 extension extends the VMID from 8 bits to 16 bits:
1
The GICD_CTLR distributor register has enable bits which control
2
2
whether the different interrupt groups (Group 0, Non-secure Group 1
3
* the ID_AA64MMFR1_EL1.VMIDBits field specifies whether the VMID is
3
and Secure Group 1) are forwarded to the CPU. We get this right for
4
8 or 16 bits
4
traditional interrupts, but forgot to account for it when adding
5
* the VMID field in VTTBR_EL2 is extended to 16 bits
5
LPIs. LPIs are always Group 1 NS and if the EnableGrp1NS bit is not
6
* VTCR_EL2.VS lets the guest specify whether to use the full 16 bits,
6
set we must not forward them to the CPU.
7
or use the backwards-compatible 8 bits
8
9
For QEMU implementing this is trivial:
10
* we do not track VMIDs in TLB entries, so we never use the VMID field
11
* we treat any write to VTTBR_EL2, not just a change to the VMID field
12
bits, as a "possible VMID change" that causes us to throw away TLB
13
entries, so that code doesn't need changing
14
* we allow the guest to read/write the VTCR_EL2.VS bit already
15
16
So all that's missing is the ID register part: report that we support
17
VMID16 in our 'max' CPU.
18
7
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
21
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
22
Message-id: 20200210120146.17631-1-peter.maydell@linaro.org
10
Message-id: 20220122182444.724087-7-peter.maydell@linaro.org
23
---
11
---
24
target/arm/cpu64.c | 1 +
12
hw/intc/arm_gicv3.c | 1 +
25
1 file changed, 1 insertion(+)
13
1 file changed, 1 insertion(+)
26
14
27
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
15
diff --git a/hw/intc/arm_gicv3.c b/hw/intc/arm_gicv3.c
28
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/cpu64.c
17
--- a/hw/intc/arm_gicv3.c
30
+++ b/target/arm/cpu64.c
18
+++ b/hw/intc/arm_gicv3.c
31
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
19
@@ -XXX,XX +XXX,XX @@ static void gicv3_redist_update_noirqset(GICv3CPUState *cs)
32
t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
20
}
33
t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1);
21
34
t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
22
if ((cs->gicr_ctlr & GICR_CTLR_ENABLE_LPIS) && cs->gic->lpi_enable &&
35
+ t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2); /* VMID16 */
23
+ (cs->gic->gicd_ctlr & GICD_CTLR_EN_GRP1NS) &&
36
cpu->isar.id_aa64mmfr1 = t;
24
(cs->hpplpi.prio != 0xff)) {
37
25
if (irqbetter(cs, cs->hpplpi.irq, cs->hpplpi.prio)) {
38
t = cpu->isar.id_aa64mmfr2;
26
cs->hppi.irq = cs->hpplpi.irq;
39
--
27
--
40
2.20.1
28
2.25.1
41
29
42
30
diff view generated by jsdifflib
1
From: Heyi Guo <guoheyi@huawei.com>
1
The list of #defines for the ITS command packet numbers is neither
2
in alphabetical nor numeric order. Sort it into numeric order.
2
3
3
The address field in each _PRT mapping package should be constructed
4
with high word for device# and low word for function#, so it is wrong
5
to use bus_no as the high word. The existing code adds a bunch useless
6
entries with device #s above 31. Enumerate all possible slots
7
(i.e. PCI_SLOT_MAX) instead.
8
9
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
10
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
11
Message-id: 20200204014325.16279-5-guoheyi@huawei.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220122182444.724087-8-peter.maydell@linaro.org
13
---
8
---
14
hw/arm/virt-acpi-build.c | 10 +++++-----
9
hw/intc/gicv3_internal.h | 10 +++++-----
15
1 file changed, 5 insertions(+), 5 deletions(-)
10
1 file changed, 5 insertions(+), 5 deletions(-)
16
11
17
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
12
diff --git a/hw/intc/gicv3_internal.h b/hw/intc/gicv3_internal.h
18
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/virt-acpi-build.c
14
--- a/hw/intc/gicv3_internal.h
20
+++ b/hw/arm/virt-acpi-build.c
15
+++ b/hw/intc/gicv3_internal.h
21
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
16
@@ -XXX,XX +XXX,XX @@ FIELD(GITS_TYPER, CIL, 36, 1)
22
{
17
#define CMD_MASK 0xff
23
int ecam_id = VIRT_ECAM_ID(highmem_ecam);
18
24
Aml *method, *crs, *ifctx, *UUID, *ifctx1, *elsectx, *buf;
19
/* ITS Commands */
25
- int i, bus_no;
20
-#define GITS_CMD_CLEAR 0x04
26
+ int i, slot_no;
21
-#define GITS_CMD_DISCARD 0x0F
27
hwaddr base_mmio = memmap[VIRT_PCIE_MMIO].base;
22
#define GITS_CMD_INT 0x03
28
hwaddr size_mmio = memmap[VIRT_PCIE_MMIO].size;
23
-#define GITS_CMD_MAPC 0x09
29
hwaddr base_pio = memmap[VIRT_PCIE_PIO].base;
24
+#define GITS_CMD_CLEAR 0x04
30
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
25
+#define GITS_CMD_SYNC 0x05
31
aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
26
#define GITS_CMD_MAPD 0x08
32
27
-#define GITS_CMD_MAPI 0x0B
33
/* Declare the PCI Routing Table. */
28
+#define GITS_CMD_MAPC 0x09
34
- Aml *rt_pkg = aml_varpackage(nr_pcie_buses * PCI_NUM_PINS);
29
#define GITS_CMD_MAPTI 0x0A
35
- for (bus_no = 0; bus_no < nr_pcie_buses; bus_no++) {
30
+#define GITS_CMD_MAPI 0x0B
36
+ Aml *rt_pkg = aml_varpackage(PCI_SLOT_MAX * PCI_NUM_PINS);
31
#define GITS_CMD_INV 0x0C
37
+ for (slot_no = 0; slot_no < PCI_SLOT_MAX; slot_no++) {
32
#define GITS_CMD_INVALL 0x0D
38
for (i = 0; i < PCI_NUM_PINS; i++) {
33
-#define GITS_CMD_SYNC 0x05
39
- int gsi = (i + bus_no) % PCI_NUM_PINS;
34
+#define GITS_CMD_DISCARD 0x0F
40
+ int gsi = (i + slot_no) % PCI_NUM_PINS;
35
41
Aml *pkg = aml_package(4);
36
/* MAPC command fields */
42
- aml_append(pkg, aml_int((bus_no << 16) | 0xFFFF));
37
#define ICID_LENGTH 16
43
+ aml_append(pkg, aml_int((slot_no << 16) | 0xFFFF));
44
aml_append(pkg, aml_int(i));
45
aml_append(pkg, aml_name("GSI%d", gsi));
46
aml_append(pkg, aml_int(0));
47
--
38
--
48
2.20.1
39
2.25.1
49
40
50
41
diff view generated by jsdifflib
Deleted patch
1
From: Heyi Guo <guoheyi@huawei.com>
2
1
3
Using _UID of 0 for all PCI interrupt link devices absolutely violates
4
the spec. Simply increase one by one.
5
6
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
7
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
8
Message-id: 20200204014325.16279-6-guoheyi@huawei.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/virt-acpi-build.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/virt-acpi-build.c
17
+++ b/hw/arm/virt-acpi-build.c
18
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
19
uint32_t irqs = irq + i;
20
Aml *dev_gsi = aml_device("GSI%d", i);
21
aml_append(dev_gsi, aml_name_decl("_HID", aml_string("PNP0C0F")));
22
- aml_append(dev_gsi, aml_name_decl("_UID", aml_int(0)));
23
+ aml_append(dev_gsi, aml_name_decl("_UID", aml_int(i)));
24
crs = aml_resource_template();
25
aml_append(crs,
26
aml_interrupt(AML_CONSUMER, AML_LEVEL, AML_ACTIVE_HIGH,
27
--
28
2.20.1
29
30
diff view generated by jsdifflib
Deleted patch
1
From: Heyi Guo <guoheyi@huawei.com>
2
1
3
Differences between disassembled ASL files:
4
5
@@ -XXX,XX +XXX,XX @@
6
*
7
* Disassembling to symbolic ASL+ operators
8
*
9
- * Disassembly of DSDT, Thu Jan 23 16:00:04 2020
10
+ * Disassembly of DSDT.new, Thu Jan 23 16:47:12 2020
11
*
12
* Original Table Header:
13
* Signature "DSDT"
14
- * Length 0x0000481E (18462)
15
+ * Length 0x000014BB (5307)
16
* Revision 0x02
17
- * Checksum 0x60
18
+ * Checksum 0xD1
19
* OEM ID "BOCHS "
20
* OEM Table ID "BXPCDSDT"
21
* OEM Revision 0x00000001 (1)
22
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
23
0x00000021,
24
}
25
})
26
- Name (_ADR, 0x09000000) // _ADR: Address
27
}
28
29
Device (FLS0)
30
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
31
Name (_CID, "PNP0A03" /* PCI Bus */) // _CID: Compatible ID
32
Name (_SEG, Zero) // _SEG: PCI Segment
33
Name (_BBN, Zero) // _BBN: BIOS Bus Number
34
- Name (_ADR, Zero) // _ADR: Address
35
Name (_UID, "PCI0") // _UID: Unique ID
36
Name (_STR, Unicode ("PCIe 0 Device")) // _STR: Description String
37
Name (_CCA, One) // _CCA: Cache Coherency Attribute
38
- Name (_PRT, Package (0x0400) // _PRT: PCI Routing Table
39
+ Name (_PRT, Package (0x80) // _PRT: PCI Routing Table
40
{
41
Package (0x04)
42
{
43
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
44
0x03,
45
GSI2,
46
Zero
47
- },
48
-
49
- Package (0x04)
50
- {
51
- 0x0020FFFF,
52
- Zero,
53
- GSI0,
54
- Zero
55
- },
56
-
57
- *Omit the other (4 * (256 - 32) - 2) packages*
58
-
59
- Package (0x04)
60
- {
61
- 0x00FFFFFF,
62
- 0x03,
63
- GSI2,
64
- Zero
65
}
66
})
67
Device (GSI0)
68
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
69
Device (GSI1)
70
{
71
Name (_HID, "PNP0C0F" /* PCI Interrupt Link Device */) // _HID: Hardware ID
72
- Name (_UID, Zero) // _UID: Unique ID
73
+ Name (_UID, One) // _UID: Unique ID
74
Name (_PRS, ResourceTemplate () // _PRS: Possible Resource Settings
75
{
76
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, )
77
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
78
Device (GSI2)
79
{
80
Name (_HID, "PNP0C0F" /* PCI Interrupt Link Device */) // _HID: Hardware ID
81
- Name (_UID, Zero) // _UID: Unique ID
82
+ Name (_UID, 0x02) // _UID: Unique ID
83
Name (_PRS, ResourceTemplate () // _PRS: Possible Resource Settings
84
{
85
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, )
86
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
87
Device (GSI3)
88
{
89
Name (_HID, "PNP0C0F" /* PCI Interrupt Link Device */) // _HID: Hardware ID
90
- Name (_UID, Zero) // _UID: Unique ID
91
+ Name (_UID, 0x03) // _UID: Unique ID
92
Name (_PRS, ResourceTemplate () // _PRS: Possible Resource Settings
93
{
94
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, )
95
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
96
97
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
98
{
99
- Name (RBUF, ResourceTemplate ()
100
- {
101
- WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
102
- 0x0000, // Granularity
103
- 0x0000, // Range Minimum
104
- 0x00FF, // Range Maximum
105
- 0x0000, // Translation Offset
106
- 0x0100, // Length
107
- ,, )
108
- DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
109
- 0x00000000, // Granularity
110
- 0x10000000, // Range Minimum
111
- 0x3EFEFFFF, // Range Maximum
112
- 0x00000000, // Translation Offset
113
- 0x2EFF0000, // Length
114
- ,, , AddressRangeMemory, TypeStatic)
115
- DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
116
- 0x00000000, // Granularity
117
- 0x00000000, // Range Minimum
118
- 0x0000FFFF, // Range Maximum
119
- 0x3EFF0000, // Translation Offset
120
- 0x00010000, // Length
121
- ,, , TypeStatic, DenseTranslation)
122
- QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
123
- 0x0000000000000000, // Granularity
124
- 0x0000008000000000, // Range Minimum
125
- 0x000000FFFFFFFFFF, // Range Maximum
126
- 0x0000000000000000, // Translation Offset
127
- 0x0000008000000000, // Length
128
- ,, , AddressRangeMemory, TypeStatic)
129
- })
130
Return (ResourceTemplate ()
131
{
132
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
133
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
134
})
135
}
136
137
- Device (RP0)
138
- {
139
- Name (_ADR, Zero) // _ADR: Address
140
- }
141
-
142
Device (RES0)
143
{
144
Name (_HID, "PNP0C02" /* PNP Motherboard Resources */) // _HID: Hardware ID
145
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
146
Device (PWRB)
147
{
148
Name (_HID, "PNP0C0C" /* Power Button Device */) // _HID: Hardware ID
149
- Name (_ADR, Zero) // _ADR: Address
150
Name (_UID, Zero) // _UID: Unique ID
151
}
152
}
153
154
The differences between the two versions of DSDT.memhp are almost the
155
same as the above, except for total length and checksum.
156
157
DSDT.numamem binary is just the same with DSDT on virt machine, so we
158
don't show the differences again.
159
160
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
161
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
162
Message-id: 20200204014325.16279-8-guoheyi@huawei.com
163
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
164
---
165
tests/qtest/bios-tables-test-allowed-diff.h | 3 ---
166
tests/data/acpi/virt/DSDT | Bin 18462 -> 5307 bytes
167
tests/data/acpi/virt/DSDT.memhp | Bin 19799 -> 6644 bytes
168
tests/data/acpi/virt/DSDT.numamem | Bin 18462 -> 5307 bytes
169
4 files changed, 3 deletions(-)
170
171
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
172
index XXXXXXX..XXXXXXX 100644
173
--- a/tests/qtest/bios-tables-test-allowed-diff.h
174
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
175
@@ -1,4 +1 @@
176
/* List of comma-separated changed AML files to ignore */
177
-"tests/data/acpi/virt/DSDT",
178
-"tests/data/acpi/virt/DSDT.memhp",
179
-"tests/data/acpi/virt/DSDT.numamem",
180
diff --git a/tests/data/acpi/virt/DSDT b/tests/data/acpi/virt/DSDT
181
index XXXXXXX..XXXXXXX 100644
182
GIT binary patch
183
delta 156
184
zcmbO?fpNDcmrJlq$Zin^2BwP>xulufJQ*iyC^K43^tIeLL4lLWeZ}O>oO+X=b6T<Z
185
z6mvCfR_C%{pDgc^#>hCi&BajKi^V<I(}*M9!_$Q~z%RhS*}#o~BR<sAg^OwOMVP!X
186
lHhJdBGOmtnjvVpMLBX3Jy81CrwsAkqC^^YPgaxRb0RT`TDiQzy
187
188
literal 18462
189
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
265
A00000
266
267
diff --git a/tests/data/acpi/virt/DSDT.memhp b/tests/data/acpi/virt/DSDT.memhp
268
index XXXXXXX..XXXXXXX 100644
269
GIT binary patch
270
delta 173
271
zcmcaUi}8ywmrJlq$QMZl2ByY|T++<_a~LOTC^K43^tIeLL4lLWeZ}O>oO+X=b6T<Z
272
z6mvCfR_C%{pDgc^#>hCi&BajKi^V<I(}*M9!_$Q~z%RhS*}#o~BR<sAg^OwOMVP!X
273
pHhJdBGOmtnjvVpMLBX3Jy81D0wsHT%Dk&Kd9^{0q-Wg&Z0|3#tFC_o~
274
275
literal 19799
276
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
365
DDbP3`
366
367
diff --git a/tests/data/acpi/virt/DSDT.numamem b/tests/data/acpi/virt/DSDT.numamem
368
index XXXXXXX..XXXXXXX 100644
369
GIT binary patch
370
delta 156
371
zcmbO?fpNDcmrJlq$Zin^2BwP>xulufJQ*iyC^K43^tIeLL4lLWeZ}O>oO+X=b6T<Z
372
z6mvCfR_C%{pDgc^#>hCi&BajKi^V<I(}*M9!_$Q~z%RhS*}#o~BR<sAg^OwOMVP!X
373
lHhJdBGOmtnjvVpMLBX3Jy81CrwsAkqC^^YPgaxRb0RT`TDiQzy
374
375
literal 18462
376
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
452
A00000
453
454
--
455
2.20.1
456
457
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The ITS-related parts of the redistributor code make some checks for
2
whether registers like GICR_PROPBASER and GICR_PENDBASER are zero.
3
There is no requirement in the specification for treating zeroes in
4
these address registers specially -- they contain guest physical
5
addresses and it is entirely valid (if unusual) for the guest to
6
choose to put the tables they address at guest physical address zero.
7
We use these values only to calculate guest addresses, and attempts
8
by the guest to use a bad address will be handled by the
9
address_space_* functions which we use to do the loads and stores.
2
10
3
For static const regdefs, file scope is preferred.
11
Remove the unnecessary checks.
4
12
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20200208125816.14954-5-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20220122182444.724087-9-peter.maydell@linaro.org
9
---
16
---
10
target/arm/helper.c | 57 +++++++++++++++++++++++----------------------
17
hw/intc/arm_gicv3_redist.c | 8 +++-----
11
1 file changed, 29 insertions(+), 28 deletions(-)
18
1 file changed, 3 insertions(+), 5 deletions(-)
12
19
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
diff --git a/hw/intc/arm_gicv3_redist.c b/hw/intc/arm_gicv3_redist.c
14
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
22
--- a/hw/intc/arm_gicv3_redist.c
16
+++ b/target/arm/helper.c
23
+++ b/hw/intc/arm_gicv3_redist.c
17
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_lor_other(CPUARMState *env,
24
@@ -XXX,XX +XXX,XX @@ void gicv3_redist_update_lpi_only(GICv3CPUState *cs)
18
return access_lor_ns(env);
25
idbits = MIN(FIELD_EX64(cs->gicr_propbaser, GICR_PROPBASER, IDBITS),
19
}
26
GICD_TYPER_IDBITS);
20
27
21
+/*
28
- if (!(cs->gicr_ctlr & GICR_CTLR_ENABLE_LPIS) || !cs->gicr_propbaser ||
22
+ * A trivial implementation of ARMv8.1-LOR leaves all of these
29
- !cs->gicr_pendbaser) {
23
+ * registers fixed at 0, which indicates that there are zero
30
+ if (!(cs->gicr_ctlr & GICR_CTLR_ENABLE_LPIS)) {
24
+ * supported Limited Ordering regions.
31
return;
25
+ */
26
+static const ARMCPRegInfo lor_reginfo[] = {
27
+ { .name = "LORSA_EL1", .state = ARM_CP_STATE_AA64,
28
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 0,
29
+ .access = PL1_RW, .accessfn = access_lor_other,
30
+ .type = ARM_CP_CONST, .resetvalue = 0 },
31
+ { .name = "LOREA_EL1", .state = ARM_CP_STATE_AA64,
32
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 1,
33
+ .access = PL1_RW, .accessfn = access_lor_other,
34
+ .type = ARM_CP_CONST, .resetvalue = 0 },
35
+ { .name = "LORN_EL1", .state = ARM_CP_STATE_AA64,
36
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 2,
37
+ .access = PL1_RW, .accessfn = access_lor_other,
38
+ .type = ARM_CP_CONST, .resetvalue = 0 },
39
+ { .name = "LORC_EL1", .state = ARM_CP_STATE_AA64,
40
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 3,
41
+ .access = PL1_RW, .accessfn = access_lor_other,
42
+ .type = ARM_CP_CONST, .resetvalue = 0 },
43
+ { .name = "LORID_EL1", .state = ARM_CP_STATE_AA64,
44
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 7,
45
+ .access = PL1_R, .accessfn = access_lorid,
46
+ .type = ARM_CP_CONST, .resetvalue = 0 },
47
+ REGINFO_SENTINEL
48
+};
49
+
50
#ifdef TARGET_AARCH64
51
static CPAccessResult access_pauth(CPUARMState *env, const ARMCPRegInfo *ri,
52
bool isread)
53
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
54
}
32
}
55
33
56
if (cpu_isar_feature(aa64_lor, cpu)) {
34
@@ -XXX,XX +XXX,XX @@ void gicv3_redist_process_lpi(GICv3CPUState *cs, int irq, int level)
57
- /*
35
idbits = MIN(FIELD_EX64(cs->gicr_propbaser, GICR_PROPBASER, IDBITS),
58
- * A trivial implementation of ARMv8.1-LOR leaves all of these
36
GICD_TYPER_IDBITS);
59
- * registers fixed at 0, which indicates that there are zero
37
60
- * supported Limited Ordering regions.
38
- if (!(cs->gicr_ctlr & GICR_CTLR_ENABLE_LPIS) || !cs->gicr_propbaser ||
61
- */
39
- !cs->gicr_pendbaser || (irq > (1ULL << (idbits + 1)) - 1) ||
62
- static const ARMCPRegInfo lor_reginfo[] = {
40
- irq < GICV3_LPI_INTID_START) {
63
- { .name = "LORSA_EL1", .state = ARM_CP_STATE_AA64,
41
+ if (!(cs->gicr_ctlr & GICR_CTLR_ENABLE_LPIS) ||
64
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 0,
42
+ (irq > (1ULL << (idbits + 1)) - 1) || irq < GICV3_LPI_INTID_START) {
65
- .access = PL1_RW, .accessfn = access_lor_other,
43
return;
66
- .type = ARM_CP_CONST, .resetvalue = 0 },
67
- { .name = "LOREA_EL1", .state = ARM_CP_STATE_AA64,
68
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 1,
69
- .access = PL1_RW, .accessfn = access_lor_other,
70
- .type = ARM_CP_CONST, .resetvalue = 0 },
71
- { .name = "LORN_EL1", .state = ARM_CP_STATE_AA64,
72
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 2,
73
- .access = PL1_RW, .accessfn = access_lor_other,
74
- .type = ARM_CP_CONST, .resetvalue = 0 },
75
- { .name = "LORC_EL1", .state = ARM_CP_STATE_AA64,
76
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 3,
77
- .access = PL1_RW, .accessfn = access_lor_other,
78
- .type = ARM_CP_CONST, .resetvalue = 0 },
79
- { .name = "LORID_EL1", .state = ARM_CP_STATE_AA64,
80
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 7,
81
- .access = PL1_R, .accessfn = access_lorid,
82
- .type = ARM_CP_CONST, .resetvalue = 0 },
83
- REGINFO_SENTINEL
84
- };
85
define_arm_cp_regs(cpu, lor_reginfo);
86
}
44
}
87
45
88
--
46
--
89
2.20.1
47
2.25.1
90
48
91
49
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The GICR_CTLR.CES bit is a read-only bit which is set to 1 to indicate
2
that the GICR_CTLR.EnableLPIs bit can be written to 0 to disable
3
LPIs (as opposed to allowing LPIs to be enabled but not subsequently
4
disabled). Our implementation permits this, so advertise it
5
by setting CES to 1.
2
6
3
We need only override the current condition under which
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
TBFLAG_A64.UNPRIV is set.
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220122182444.724087-10-peter.maydell@linaro.org
10
---
11
hw/intc/gicv3_internal.h | 1 +
12
hw/intc/arm_gicv3_common.c | 4 ++++
13
2 files changed, 5 insertions(+)
5
14
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
diff --git a/hw/intc/gicv3_internal.h b/hw/intc/gicv3_internal.h
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200208125816.14954-20-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.c | 41 +++++++++++++++++++++--------------------
12
1 file changed, 21 insertions(+), 20 deletions(-)
13
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
17
--- a/hw/intc/gicv3_internal.h
17
+++ b/target/arm/helper.c
18
+++ b/hw/intc/gicv3_internal.h
18
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
19
@@ -XXX,XX +XXX,XX @@
19
}
20
#define GICR_NSACR (GICR_SGI_OFFSET + 0x0E00)
20
21
21
/* Compute the condition for using AccType_UNPRIV for LDTR et al. */
22
#define GICR_CTLR_ENABLE_LPIS (1U << 0)
22
- /* TODO: ARMv8.2-UAO */
23
+#define GICR_CTLR_CES (1U << 1)
23
- switch (mmu_idx) {
24
#define GICR_CTLR_RWP (1U << 3)
24
- case ARMMMUIdx_E10_1:
25
#define GICR_CTLR_DPG0 (1U << 24)
25
- case ARMMMUIdx_E10_1_PAN:
26
#define GICR_CTLR_DPG1NS (1U << 25)
26
- case ARMMMUIdx_SE10_1:
27
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
27
- case ARMMMUIdx_SE10_1_PAN:
28
index XXXXXXX..XXXXXXX 100644
28
- /* TODO: ARMv8.3-NV */
29
--- a/hw/intc/arm_gicv3_common.c
29
- flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
30
+++ b/hw/intc/arm_gicv3_common.c
30
- break;
31
@@ -XXX,XX +XXX,XX @@ static void arm_gicv3_common_reset(DeviceState *dev)
31
- case ARMMMUIdx_E20_2:
32
32
- case ARMMMUIdx_E20_2_PAN:
33
cs->level = 0;
33
- /* TODO: ARMv8.4-SecEL2 */
34
cs->gicr_ctlr = 0;
34
- /*
35
+ if (s->lpi_enable) {
35
- * Note that E20_2 is gated by HCR_EL2.E2H == 1, but E20_0 is
36
+ /* Our implementation supports clearing GICR_CTLR.EnableLPIs */
36
- * gated by HCR_EL2.<E2H,TGE> == '11', and so is LDTR.
37
+ cs->gicr_ctlr |= GICR_CTLR_CES;
37
- */
38
+ }
38
- if (env->cp15.hcr_el2 & HCR_TGE) {
39
cs->gicr_statusr[GICV3_S] = 0;
39
+ if (!(env->pstate & PSTATE_UAO)) {
40
cs->gicr_statusr[GICV3_NS] = 0;
40
+ switch (mmu_idx) {
41
cs->gicr_waker = GICR_WAKER_ProcessorSleep | GICR_WAKER_ChildrenAsleep;
41
+ case ARMMMUIdx_E10_1:
42
+ case ARMMMUIdx_E10_1_PAN:
43
+ case ARMMMUIdx_SE10_1:
44
+ case ARMMMUIdx_SE10_1_PAN:
45
+ /* TODO: ARMv8.3-NV */
46
flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
47
+ break;
48
+ case ARMMMUIdx_E20_2:
49
+ case ARMMMUIdx_E20_2_PAN:
50
+ /* TODO: ARMv8.4-SecEL2 */
51
+ /*
52
+ * Note that EL20_2 is gated by HCR_EL2.E2H == 1, but EL20_0 is
53
+ * gated by HCR_EL2.<E2H,TGE> == '11', and so is LDTR.
54
+ */
55
+ if (env->cp15.hcr_el2 & HCR_TGE) {
56
+ flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
57
+ }
58
+ break;
59
+ default:
60
+ break;
61
}
62
- break;
63
- default:
64
- break;
65
}
66
67
return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
68
--
42
--
69
2.20.1
43
2.25.1
70
44
71
45
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The MemoryRegionOps gicv3_its_translation_ops currently provides only
2
a .write_with_attrs function, because the only register in this
3
region is the write-only GITS_TRANSLATER. However, if you don't
4
provide a read function and the guest tries reading from this memory
5
region, QEMU will crash because
6
memory_region_read_with_attrs_accessor() calls a NULL pointer.
2
7
3
If we have a PAN-enforcing mmu_idx, set prot == 0 if user_rw != 0.
8
Add a read function which always returns 0, to cover both bogus
9
attempts to read GITS_TRANSLATER and also reads from the rest of the
10
region, which is documented to be reserved, RES0.
4
11
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200208125816.14954-14-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20220122182444.724087-11-peter.maydell@linaro.org
10
---
16
---
11
target/arm/internals.h | 13 +++++++++++++
17
hw/intc/arm_gicv3_its.c | 13 +++++++++++++
12
target/arm/helper.c | 3 +++
18
1 file changed, 13 insertions(+)
13
2 files changed, 16 insertions(+)
14
19
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
20
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
16
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/internals.h
22
--- a/hw/intc/arm_gicv3_its.c
18
+++ b/target/arm/internals.h
23
+++ b/hw/intc/arm_gicv3_its.c
19
@@ -XXX,XX +XXX,XX @@ static inline bool regime_is_secure(CPUARMState *env, ARMMMUIdx mmu_idx)
24
@@ -XXX,XX +XXX,XX @@ static void extract_cmdq_params(GICv3ITSState *s)
20
}
25
}
21
}
26
}
22
27
23
+static inline bool regime_is_pan(CPUARMState *env, ARMMMUIdx mmu_idx)
28
+static MemTxResult gicv3_its_translation_read(void *opaque, hwaddr offset,
29
+ uint64_t *data, unsigned size,
30
+ MemTxAttrs attrs)
24
+{
31
+{
25
+ switch (mmu_idx) {
32
+ /*
26
+ case ARMMMUIdx_Stage1_E1_PAN:
33
+ * GITS_TRANSLATER is write-only, and all other addresses
27
+ case ARMMMUIdx_E10_1_PAN:
34
+ * in the interrupt translation space frame are RES0.
28
+ case ARMMMUIdx_E20_2_PAN:
35
+ */
29
+ case ARMMMUIdx_SE10_1_PAN:
36
+ *data = 0;
30
+ return true;
37
+ return MEMTX_OK;
31
+ default:
32
+ return false;
33
+ }
34
+}
38
+}
35
+
39
+
36
/* Return the FSR value for a debug exception (watchpoint, hardware
40
static MemTxResult gicv3_its_translation_write(void *opaque, hwaddr offset,
37
* breakpoint or BKPT insn) targeting the specified exception level.
41
uint64_t data, unsigned size,
38
*/
42
MemTxAttrs attrs)
39
diff --git a/target/arm/helper.c b/target/arm/helper.c
43
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps gicv3_its_control_ops = {
40
index XXXXXXX..XXXXXXX 100644
44
};
41
--- a/target/arm/helper.c
45
42
+++ b/target/arm/helper.c
46
static const MemoryRegionOps gicv3_its_translation_ops = {
43
@@ -XXX,XX +XXX,XX @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
47
+ .read_with_attrs = gicv3_its_translation_read,
44
if (is_user) {
48
.write_with_attrs = gicv3_its_translation_write,
45
prot_rw = user_rw;
49
.valid.min_access_size = 2,
46
} else {
50
.valid.max_access_size = 4,
47
+ if (user_rw && regime_is_pan(env, mmu_idx)) {
48
+ return 0;
49
+ }
50
prot_rw = simple_ap_to_rw_prot_is_user(ap, false);
51
}
52
53
--
51
--
54
2.20.1
52
2.25.1
55
53
56
54
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The ITS has a bank of 8 GITS_BASER<n> registers, which allow the
2
guest to specify the base address of various data tables. Each
3
register has a read-only type field indicating which table it is for
4
and a read-write field where the guest can write in the base address
5
(among other things). We currently allow the guest to write the
6
writeable fields for all eight registers, even if the type field is 0
7
indicating "Unimplemented". This means the guest can provoke QEMU
8
into asserting by writing an address into one of these unimplemented
9
base registers, which bypasses the "if (!value) continue" check in
10
extract_table_params() and lets us hit the assertion that the type
11
field is one of the permitted table types.
2
12
3
Using ~0 as the mask on the aarch64->aarch32 exception return
13
Prevent the assertion by not allowing the guest to write to the
4
was not even as correct as the CPSR_ERET_MASK that we had used
14
unimplemented base registers. This means their value will remain 0
5
on the aarch32->aarch32 exception return.
15
and extract_table_params() will ignore them.
6
16
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-9-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-id: 20220122182444.724087-12-peter.maydell@linaro.org
11
---
20
---
12
target/arm/helper-a64.c | 5 +++--
21
hw/intc/arm_gicv3_its.c | 8 ++++++++
13
1 file changed, 3 insertions(+), 2 deletions(-)
22
1 file changed, 8 insertions(+)
14
23
15
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
24
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
16
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.c
26
--- a/hw/intc/arm_gicv3_its.c
18
+++ b/target/arm/helper-a64.c
27
+++ b/hw/intc/arm_gicv3_its.c
19
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
28
@@ -XXX,XX +XXX,XX @@ static bool its_writel(GICv3ITSState *s, hwaddr offset,
20
{
29
if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) {
21
int cur_el = arm_current_el(env);
30
index = (offset - GITS_BASER) / 8;
22
unsigned int spsr_idx = aarch64_banked_spsr_index(cur_el);
31
23
- uint32_t spsr = env->banked_spsr[spsr_idx];
32
+ if (s->baser[index] == 0) {
24
+ uint32_t mask, spsr = env->banked_spsr[spsr_idx];
33
+ /* Unimplemented GITS_BASERn: RAZ/WI */
25
int new_el;
34
+ break;
26
bool return_to_aa64 = (spsr & PSTATE_nRW) == 0;
35
+ }
27
36
if (offset & 7) {
28
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
37
value <<= 32;
29
* will sort the register banks out for us, and we've already
38
value &= ~GITS_BASER_RO_MASK;
30
* caught all the bad-mode cases in el_from_spsr().
39
@@ -XXX,XX +XXX,XX @@ static bool its_writell(GICv3ITSState *s, hwaddr offset,
31
*/
40
*/
32
- cpsr_write(env, spsr, ~0, CPSRWriteRaw);
41
if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) {
33
+ mask = aarch32_cpsr_valid_mask(env->features, &env_archcpu(env)->isar);
42
index = (offset - GITS_BASER) / 8;
34
+ cpsr_write(env, spsr, mask, CPSRWriteRaw);
43
+ if (s->baser[index] == 0) {
35
if (!arm_singlestep_active(env)) {
44
+ /* Unimplemented GITS_BASERn: RAZ/WI */
36
env->uncached_cpsr &= ~PSTATE_SS;
45
+ break;
46
+ }
47
s->baser[index] &= GITS_BASER_RO_MASK;
48
s->baser[index] |= (value & ~GITS_BASER_RO_MASK);
37
}
49
}
38
--
50
--
39
2.20.1
51
2.25.1
40
52
41
53
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Currently when we fill in a TableDesc based on the value the guest
2
has written to the GITS_BASER<n> register, we calculate both:
3
* num_entries : the number of entries in the table, constrained
4
by the amount of memory the guest has given it
5
* num_ids : the number of IDs we support for this table,
6
constrained by the implementation choices and the architecture
7
(eg DeviceIDs are 16 bits, so num_ids is 1 << 16)
2
8
3
Split this helper out of msr_mask in translate.c. At the same time,
9
When validating ITS commands, however, we check only num_ids,
4
transform the negative reductive logic to positive accumulative logic.
10
thus allowing a broken guest to specify table entries that
5
It will be usable along the exception paths.
11
index off the end of it. This will only corrupt guest memory,
12
but the ITS is supposed to reject such commands as invalid.
6
13
7
While touching msr_mask, fix up formatting.
14
Instead of calculating both num_entries and num_ids, set
15
num_entries to the minimum of the two limits, and check that.
8
16
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20200208125816.14954-6-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-id: 20220122182444.724087-13-peter.maydell@linaro.org
13
---
20
---
14
target/arm/internals.h | 21 +++++++++++++++++++++
21
include/hw/intc/arm_gicv3_its_common.h | 1 -
15
target/arm/translate.c | 40 +++++++++++++++++-----------------------
22
hw/intc/arm_gicv3_its.c | 18 +++++++++---------
16
2 files changed, 38 insertions(+), 23 deletions(-)
23
2 files changed, 9 insertions(+), 10 deletions(-)
17
24
18
diff --git a/target/arm/internals.h b/target/arm/internals.h
25
diff --git a/include/hw/intc/arm_gicv3_its_common.h b/include/hw/intc/arm_gicv3_its_common.h
19
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/internals.h
27
--- a/include/hw/intc/arm_gicv3_its_common.h
21
+++ b/target/arm/internals.h
28
+++ b/include/hw/intc/arm_gicv3_its_common.h
22
@@ -XXX,XX +XXX,XX @@ static inline bool arm_mmu_idx_is_stage1_of_2(ARMMMUIdx mmu_idx)
29
@@ -XXX,XX +XXX,XX @@ typedef struct {
30
uint16_t entry_sz;
31
uint32_t page_sz;
32
uint32_t num_entries;
33
- uint32_t num_ids;
34
uint64_t base_addr;
35
} TableDesc;
36
37
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/intc/arm_gicv3_its.c
40
+++ b/hw/intc/arm_gicv3_its.c
41
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_its_cmd(GICv3ITSState *s, uint64_t value,
42
43
eventid = (value & EVENTID_MASK);
44
45
- if (devid >= s->dt.num_ids) {
46
+ if (devid >= s->dt.num_entries) {
47
qemu_log_mask(LOG_GUEST_ERROR,
48
"%s: invalid command attributes: devid %d>=%d",
49
- __func__, devid, s->dt.num_ids);
50
+ __func__, devid, s->dt.num_entries);
51
return CMD_CONTINUE;
52
}
53
54
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_its_cmd(GICv3ITSState *s, uint64_t value,
55
return CMD_CONTINUE;
56
}
57
58
- if (icid >= s->ct.num_ids) {
59
+ if (icid >= s->ct.num_entries) {
60
qemu_log_mask(LOG_GUEST_ERROR,
61
"%s: invalid ICID 0x%x in ITE (table corrupted?)\n",
62
__func__, icid);
63
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_mapti(GICv3ITSState *s, uint64_t value,
64
65
icid = value & ICID_MASK;
66
67
- if (devid >= s->dt.num_ids) {
68
+ if (devid >= s->dt.num_entries) {
69
qemu_log_mask(LOG_GUEST_ERROR,
70
"%s: invalid command attributes: devid %d>=%d",
71
- __func__, devid, s->dt.num_ids);
72
+ __func__, devid, s->dt.num_entries);
73
return CMD_CONTINUE;
74
}
75
76
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_mapti(GICv3ITSState *s, uint64_t value,
77
num_eventids = 1ULL << (FIELD_EX64(dte, DTE, SIZE) + 1);
78
num_intids = 1ULL << (GICD_TYPER_IDBITS + 1);
79
80
- if ((icid >= s->ct.num_ids)
81
+ if ((icid >= s->ct.num_entries)
82
|| !dte_valid || (eventid >= num_eventids) ||
83
(((pIntid < GICV3_LPI_INTID_START) || (pIntid >= num_intids)) &&
84
(pIntid != INTID_SPURIOUS))) {
85
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_mapc(GICv3ITSState *s, uint32_t offset)
86
87
valid = (value & CMD_FIELD_VALID_MASK);
88
89
- if ((icid >= s->ct.num_ids) || (rdbase >= s->gicv3->num_cpu)) {
90
+ if ((icid >= s->ct.num_entries) || (rdbase >= s->gicv3->num_cpu)) {
91
qemu_log_mask(LOG_GUEST_ERROR,
92
"ITS MAPC: invalid collection table attributes "
93
"icid %d rdbase %" PRIu64 "\n", icid, rdbase);
94
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_mapd(GICv3ITSState *s, uint64_t value,
95
96
valid = (value & CMD_FIELD_VALID_MASK);
97
98
- if ((devid >= s->dt.num_ids) ||
99
+ if ((devid >= s->dt.num_entries) ||
100
(size > FIELD_EX64(s->typer, GITS_TYPER, IDBITS))) {
101
qemu_log_mask(LOG_GUEST_ERROR,
102
"ITS MAPD: invalid device table attributes "
103
@@ -XXX,XX +XXX,XX @@ static void extract_table_params(GICv3ITSState *s)
104
L1TABLE_ENTRY_SIZE) *
105
(page_sz / td->entry_sz));
106
}
107
- td->num_ids = 1ULL << idbits;
108
+ td->num_entries = MIN(td->num_entries, 1ULL << idbits);
23
}
109
}
24
}
110
}
25
111
26
+static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
27
+ const ARMISARegisters *id)
28
+{
29
+ uint32_t valid = CPSR_M | CPSR_AIF | CPSR_IL | CPSR_NZCV | CPSR_J;
30
+
31
+ if ((features >> ARM_FEATURE_V4T) & 1) {
32
+ valid |= CPSR_T;
33
+ }
34
+ if ((features >> ARM_FEATURE_V5) & 1) {
35
+ valid |= CPSR_Q; /* V5TE in reality*/
36
+ }
37
+ if ((features >> ARM_FEATURE_V6) & 1) {
38
+ valid |= CPSR_E | CPSR_GE;
39
+ }
40
+ if ((features >> ARM_FEATURE_THUMB2) & 1) {
41
+ valid |= CPSR_IT;
42
+ }
43
+
44
+ return valid;
45
+}
46
+
47
/*
48
* Parameters of a given virtual address, as extracted from the
49
* translation control register (TCR) for a given regime.
50
diff --git a/target/arm/translate.c b/target/arm/translate.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/arm/translate.c
53
+++ b/target/arm/translate.c
54
@@ -XXX,XX +XXX,XX @@ static inline void gen_mulxy(TCGv_i32 t0, TCGv_i32 t1, int x, int y)
55
/* Return the mask of PSR bits set by a MSR instruction. */
56
static uint32_t msr_mask(DisasContext *s, int flags, int spsr)
57
{
58
- uint32_t mask;
59
+ uint32_t mask = 0;
60
61
- mask = 0;
62
- if (flags & (1 << 0))
63
+ if (flags & (1 << 0)) {
64
mask |= 0xff;
65
- if (flags & (1 << 1))
66
+ }
67
+ if (flags & (1 << 1)) {
68
mask |= 0xff00;
69
- if (flags & (1 << 2))
70
+ }
71
+ if (flags & (1 << 2)) {
72
mask |= 0xff0000;
73
- if (flags & (1 << 3))
74
+ }
75
+ if (flags & (1 << 3)) {
76
mask |= 0xff000000;
77
+ }
78
79
- /* Mask out undefined bits. */
80
- mask &= ~CPSR_RESERVED;
81
- if (!arm_dc_feature(s, ARM_FEATURE_V4T)) {
82
- mask &= ~CPSR_T;
83
- }
84
- if (!arm_dc_feature(s, ARM_FEATURE_V5)) {
85
- mask &= ~CPSR_Q; /* V5TE in reality*/
86
- }
87
- if (!arm_dc_feature(s, ARM_FEATURE_V6)) {
88
- mask &= ~(CPSR_E | CPSR_GE);
89
- }
90
- if (!arm_dc_feature(s, ARM_FEATURE_THUMB2)) {
91
- mask &= ~CPSR_IT;
92
- }
93
- /* Mask out execution state and reserved bits. */
94
+ /* Mask out undefined and reserved bits. */
95
+ mask &= aarch32_cpsr_valid_mask(s->features, s->isar);
96
+
97
+ /* Mask out execution state. */
98
if (!spsr) {
99
- mask &= ~(CPSR_EXEC | CPSR_RESERVED);
100
+ mask &= ~CPSR_EXEC;
101
}
102
+
103
/* Mask out privileged bits. */
104
- if (IS_USER(s))
105
+ if (IS_USER(s)) {
106
mask &= CPSR_USER;
107
+ }
108
return mask;
109
}
110
111
--
112
--
112
2.20.1
113
2.25.1
113
114
114
115
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Implement the ITS MOVALL command, which takes all the pending
2
interrupts on a source redistributor and makes the not-pending on
3
that source redistributor and pending on a destination redistributor.
2
4
3
Include definitions for all of the bits in ID_MMFR3.
5
This is a GICv3 ITS command which we forgot to implement. (It is
4
We already have a definition for ID_AA64MMFR1.PAN.
6
not used by Linux guests.)
5
7
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-4-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20220122182444.724087-14-peter.maydell@linaro.org
11
---
11
---
12
target/arm/cpu.h | 29 +++++++++++++++++++++++++++++
12
hw/intc/gicv3_internal.h | 16 +++++++++++
13
1 file changed, 29 insertions(+)
13
hw/intc/arm_gicv3_its.c | 55 ++++++++++++++++++++++++++++++++++++++
14
hw/intc/arm_gicv3_redist.c | 54 +++++++++++++++++++++++++++++++++++++
15
3 files changed, 125 insertions(+)
14
16
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
diff --git a/hw/intc/gicv3_internal.h b/hw/intc/gicv3_internal.h
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/cpu.h
19
--- a/hw/intc/gicv3_internal.h
18
+++ b/target/arm/cpu.h
20
+++ b/hw/intc/gicv3_internal.h
19
@@ -XXX,XX +XXX,XX @@ FIELD(ID_ISAR6, FHM, 8, 4)
21
@@ -XXX,XX +XXX,XX @@ FIELD(GITS_TYPER, CIL, 36, 1)
20
FIELD(ID_ISAR6, SB, 12, 4)
22
#define GITS_CMD_MAPI 0x0B
21
FIELD(ID_ISAR6, SPECRES, 16, 4)
23
#define GITS_CMD_INV 0x0C
22
24
#define GITS_CMD_INVALL 0x0D
23
+FIELD(ID_MMFR3, CMAINTVA, 0, 4)
25
+#define GITS_CMD_MOVALL 0x0E
24
+FIELD(ID_MMFR3, CMAINTSW, 4, 4)
26
#define GITS_CMD_DISCARD 0x0F
25
+FIELD(ID_MMFR3, BPMAINT, 8, 4)
27
26
+FIELD(ID_MMFR3, MAINTBCST, 12, 4)
28
/* MAPC command fields */
27
+FIELD(ID_MMFR3, PAN, 16, 4)
29
@@ -XXX,XX +XXX,XX @@ FIELD(MAPC, RDBASE, 16, 32)
28
+FIELD(ID_MMFR3, COHWALK, 20, 4)
30
#define L2_TABLE_VALID_MASK CMD_FIELD_VALID_MASK
29
+FIELD(ID_MMFR3, CMEMSZ, 24, 4)
31
#define TABLE_ENTRY_VALID_MASK (1ULL << 0)
30
+FIELD(ID_MMFR3, SUPERSEC, 28, 4)
32
33
+/* MOVALL command fields */
34
+FIELD(MOVALL_2, RDBASE1, 16, 36)
35
+FIELD(MOVALL_3, RDBASE2, 16, 36)
31
+
36
+
32
FIELD(ID_MMFR4, SPECSEI, 0, 4)
37
/*
33
FIELD(ID_MMFR4, AC2, 4, 4)
38
* 12 bytes Interrupt translation Table Entry size
34
FIELD(ID_MMFR4, XNX, 8, 4)
39
* as per Table 5.3 in GICv3 spec
35
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_vminmaxnm(const ARMISARegisters *id)
40
@@ -XXX,XX +XXX,XX @@ void gicv3_redist_update_lpi(GICv3CPUState *cs);
36
return FIELD_EX64(id->mvfr2, MVFR2, FPMISC) >= 4;
41
* an incoming migration has loaded new state.
42
*/
43
void gicv3_redist_update_lpi_only(GICv3CPUState *cs);
44
+/**
45
+ * gicv3_redist_movall_lpis:
46
+ * @src: source redistributor
47
+ * @dest: destination redistributor
48
+ *
49
+ * Scan the LPI pending table for @src, and for each pending LPI there
50
+ * mark it as not-pending for @src and pending for @dest, as required
51
+ * by the ITS MOVALL command.
52
+ */
53
+void gicv3_redist_movall_lpis(GICv3CPUState *src, GICv3CPUState *dest);
54
+
55
void gicv3_redist_send_sgi(GICv3CPUState *cs, int grp, int irq, bool ns);
56
void gicv3_init_cpuif(GICv3State *s);
57
58
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/hw/intc/arm_gicv3_its.c
61
+++ b/hw/intc/arm_gicv3_its.c
62
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_mapd(GICv3ITSState *s, uint64_t value,
63
return update_dte(s, devid, valid, size, itt_addr) ? CMD_CONTINUE : CMD_STALL;
37
}
64
}
38
65
39
+static inline bool isar_feature_aa32_pan(const ARMISARegisters *id)
66
+static ItsCmdResult process_movall(GICv3ITSState *s, uint64_t value,
67
+ uint32_t offset)
40
+{
68
+{
41
+ return FIELD_EX64(id->mvfr0, ID_MMFR3, PAN) != 0;
69
+ AddressSpace *as = &s->gicv3->dma_as;
42
+}
70
+ MemTxResult res = MEMTX_OK;
71
+ uint64_t rd1, rd2;
43
+
72
+
44
+static inline bool isar_feature_aa32_ats1e1(const ARMISARegisters *id)
73
+ /* No fields in dwords 0 or 1 */
45
+{
74
+ offset += NUM_BYTES_IN_DW;
46
+ return FIELD_EX64(id->mvfr0, ID_MMFR3, PAN) >= 2;
75
+ offset += NUM_BYTES_IN_DW;
76
+ value = address_space_ldq_le(as, s->cq.base_addr + offset,
77
+ MEMTXATTRS_UNSPECIFIED, &res);
78
+ if (res != MEMTX_OK) {
79
+ return CMD_STALL;
80
+ }
81
+
82
+ rd1 = FIELD_EX64(value, MOVALL_2, RDBASE1);
83
+ if (rd1 >= s->gicv3->num_cpu) {
84
+ qemu_log_mask(LOG_GUEST_ERROR,
85
+ "%s: RDBASE1 %" PRId64
86
+ " out of range (must be less than %d)\n",
87
+ __func__, rd1, s->gicv3->num_cpu);
88
+ return CMD_CONTINUE;
89
+ }
90
+
91
+ offset += NUM_BYTES_IN_DW;
92
+ value = address_space_ldq_le(as, s->cq.base_addr + offset,
93
+ MEMTXATTRS_UNSPECIFIED, &res);
94
+ if (res != MEMTX_OK) {
95
+ return CMD_STALL;
96
+ }
97
+
98
+ rd2 = FIELD_EX64(value, MOVALL_3, RDBASE2);
99
+ if (rd2 >= s->gicv3->num_cpu) {
100
+ qemu_log_mask(LOG_GUEST_ERROR,
101
+ "%s: RDBASE2 %" PRId64
102
+ " out of range (must be less than %d)\n",
103
+ __func__, rd2, s->gicv3->num_cpu);
104
+ return CMD_CONTINUE;
105
+ }
106
+
107
+ if (rd1 == rd2) {
108
+ /* Move to same target must succeed as a no-op */
109
+ return CMD_CONTINUE;
110
+ }
111
+
112
+ /* Move all pending LPIs from redistributor 1 to redistributor 2 */
113
+ gicv3_redist_movall_lpis(&s->gicv3->cpu[rd1], &s->gicv3->cpu[rd2]);
114
+
115
+ return CMD_CONTINUE;
47
+}
116
+}
48
+
117
+
49
/*
118
/*
50
* 64-bit feature tests via id registers.
119
* Current implementation blocks until all
51
*/
120
* commands are processed
52
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_lor(const ARMISARegisters *id)
121
@@ -XXX,XX +XXX,XX @@ static void process_cmdq(GICv3ITSState *s)
53
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, LO) != 0;
122
gicv3_redist_update_lpi(&s->gicv3->cpu[i]);
123
}
124
break;
125
+ case GITS_CMD_MOVALL:
126
+ result = process_movall(s, data, cq_offset);
127
+ break;
128
default:
129
break;
130
}
131
diff --git a/hw/intc/arm_gicv3_redist.c b/hw/intc/arm_gicv3_redist.c
132
index XXXXXXX..XXXXXXX 100644
133
--- a/hw/intc/arm_gicv3_redist.c
134
+++ b/hw/intc/arm_gicv3_redist.c
135
@@ -XXX,XX +XXX,XX @@ void gicv3_redist_process_lpi(GICv3CPUState *cs, int irq, int level)
136
gicv3_redist_lpi_pending(cs, irq, level);
54
}
137
}
55
138
56
+static inline bool isar_feature_aa64_pan(const ARMISARegisters *id)
139
+void gicv3_redist_movall_lpis(GICv3CPUState *src, GICv3CPUState *dest)
57
+{
140
+{
58
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) != 0;
141
+ /*
142
+ * We must move all pending LPIs from the source redistributor
143
+ * to the destination. That is, for every pending LPI X on
144
+ * src, we must set it not-pending on src and pending on dest.
145
+ * LPIs that are already pending on dest are not cleared.
146
+ *
147
+ * If LPIs are disabled on dest this is CONSTRAINED UNPREDICTABLE:
148
+ * we choose to NOP. If LPIs are disabled on source there's nothing
149
+ * to be transferred anyway.
150
+ */
151
+ AddressSpace *as = &src->gic->dma_as;
152
+ uint64_t idbits;
153
+ uint32_t pendt_size;
154
+ uint64_t src_baddr, dest_baddr;
155
+ int i;
156
+
157
+ if (!(src->gicr_ctlr & GICR_CTLR_ENABLE_LPIS) ||
158
+ !(dest->gicr_ctlr & GICR_CTLR_ENABLE_LPIS)) {
159
+ return;
160
+ }
161
+
162
+ idbits = MIN(FIELD_EX64(src->gicr_propbaser, GICR_PROPBASER, IDBITS),
163
+ GICD_TYPER_IDBITS);
164
+ idbits = MIN(FIELD_EX64(dest->gicr_propbaser, GICR_PROPBASER, IDBITS),
165
+ idbits);
166
+
167
+ pendt_size = 1ULL << (idbits + 1);
168
+ src_baddr = src->gicr_pendbaser & R_GICR_PENDBASER_PHYADDR_MASK;
169
+ dest_baddr = dest->gicr_pendbaser & R_GICR_PENDBASER_PHYADDR_MASK;
170
+
171
+ for (i = GICV3_LPI_INTID_START / 8; i < pendt_size / 8; i++) {
172
+ uint8_t src_pend, dest_pend;
173
+
174
+ address_space_read(as, src_baddr + i, MEMTXATTRS_UNSPECIFIED,
175
+ &src_pend, sizeof(src_pend));
176
+ if (!src_pend) {
177
+ continue;
178
+ }
179
+ address_space_read(as, dest_baddr + i, MEMTXATTRS_UNSPECIFIED,
180
+ &dest_pend, sizeof(dest_pend));
181
+ dest_pend |= src_pend;
182
+ src_pend = 0;
183
+ address_space_write(as, src_baddr + i, MEMTXATTRS_UNSPECIFIED,
184
+ &src_pend, sizeof(src_pend));
185
+ address_space_write(as, dest_baddr + i, MEMTXATTRS_UNSPECIFIED,
186
+ &dest_pend, sizeof(dest_pend));
187
+ }
188
+
189
+ gicv3_redist_update_lpi(src);
190
+ gicv3_redist_update_lpi(dest);
59
+}
191
+}
60
+
192
+
61
+static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id)
193
void gicv3_redist_set_irq(GICv3CPUState *cs, int irq, int level)
62
+{
63
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2;
64
+}
65
+
66
static inline bool isar_feature_aa64_bti(const ARMISARegisters *id)
67
{
194
{
68
return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0;
195
/* Update redistributor state for a change in an external PPI input line */
69
--
196
--
70
2.20.1
197
2.25.1
71
198
72
199
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
The J bit signals Jazelle mode, and so of course is RES0
4
when the feature is not enabled.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20200208125816.14954-7-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/internals.h | 5 ++++-
12
1 file changed, 4 insertions(+), 1 deletion(-)
13
14
diff --git a/target/arm/internals.h b/target/arm/internals.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/internals.h
17
+++ b/target/arm/internals.h
18
@@ -XXX,XX +XXX,XX @@ static inline bool arm_mmu_idx_is_stage1_of_2(ARMMMUIdx mmu_idx)
19
static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
20
const ARMISARegisters *id)
21
{
22
- uint32_t valid = CPSR_M | CPSR_AIF | CPSR_IL | CPSR_NZCV | CPSR_J;
23
+ uint32_t valid = CPSR_M | CPSR_AIF | CPSR_IL | CPSR_NZCV;
24
25
if ((features >> ARM_FEATURE_V4T) & 1) {
26
valid |= CPSR_T;
27
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
28
if ((features >> ARM_FEATURE_THUMB2) & 1) {
29
valid |= CPSR_IT;
30
}
31
+ if (isar_feature_jazelle(id)) {
32
+ valid |= CPSR_J;
33
+ }
34
35
return valid;
36
}
37
--
38
2.20.1
39
40
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
CPSR_ERET_MASK was a useless renaming of CPSR_RESERVED.
4
The function also takes into account bits that the cpu
5
does not support.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-8-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 2 --
13
target/arm/op_helper.c | 5 ++++-
14
2 files changed, 4 insertions(+), 3 deletions(-)
15
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
19
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
21
#define CPSR_USER (CPSR_NZCV | CPSR_Q | CPSR_GE)
22
/* Execution state bits. MRS read as zero, MSR writes ignored. */
23
#define CPSR_EXEC (CPSR_T | CPSR_IT | CPSR_J | CPSR_IL)
24
-/* Mask of bits which may be set by exception return copying them from SPSR */
25
-#define CPSR_ERET_MASK (~CPSR_RESERVED)
26
27
/* Bit definitions for M profile XPSR. Most are the same as CPSR. */
28
#define XPSR_EXCP 0x1ffU
29
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/op_helper.c
32
+++ b/target/arm/op_helper.c
33
@@ -XXX,XX +XXX,XX @@ void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask)
34
/* Write the CPSR for a 32-bit exception return */
35
void HELPER(cpsr_write_eret)(CPUARMState *env, uint32_t val)
36
{
37
+ uint32_t mask;
38
+
39
qemu_mutex_lock_iothread();
40
arm_call_pre_el_change_hook(env_archcpu(env));
41
qemu_mutex_unlock_iothread();
42
43
- cpsr_write(env, val, CPSR_ERET_MASK, CPSRWriteExceptionReturn);
44
+ mask = aarch32_cpsr_valid_mask(env->features, &env_archcpu(env)->isar);
45
+ cpsr_write(env, val, mask, CPSRWriteExceptionReturn);
46
47
/* Generated code has already stored the new PC value, but
48
* without masking out its low bits, because which bits need
49
--
50
2.20.1
51
52
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
The only remaining use was in op_helper.c. Use PSTATE_SS
4
directly, and move the commentary so that it is more obvious
5
what is going on.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20200208125816.14954-10-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 6 ------
13
target/arm/op_helper.c | 9 ++++++++-
14
2 files changed, 8 insertions(+), 7 deletions(-)
15
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
19
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
21
#define CPSR_IT_2_7 (0xfc00U)
22
#define CPSR_GE (0xfU << 16)
23
#define CPSR_IL (1U << 20)
24
-/* Note that the RESERVED bits include bit 21, which is PSTATE_SS in
25
- * an AArch64 SPSR but RES0 in AArch32 SPSR and CPSR. In QEMU we use
26
- * env->uncached_cpsr bit 21 to store PSTATE.SS when executing in AArch32,
27
- * where it is live state but not accessible to the AArch32 code.
28
- */
29
-#define CPSR_RESERVED (0x7U << 21)
30
#define CPSR_J (1U << 24)
31
#define CPSR_IT_0_1 (3U << 25)
32
#define CPSR_Q (1U << 27)
33
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/op_helper.c
36
+++ b/target/arm/op_helper.c
37
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_bkpt_insn)(CPUARMState *env, uint32_t syndrome)
38
39
uint32_t HELPER(cpsr_read)(CPUARMState *env)
40
{
41
- return cpsr_read(env) & ~(CPSR_EXEC | CPSR_RESERVED);
42
+ /*
43
+ * We store the ARMv8 PSTATE.SS bit in env->uncached_cpsr.
44
+ * This is convenient for populating SPSR_ELx, but must be
45
+ * hidden from aarch32 mode, where it is not visible.
46
+ *
47
+ * TODO: ARMv8.4-DIT -- need to move SS somewhere else.
48
+ */
49
+ return cpsr_read(env) & ~(CPSR_EXEC | PSTATE_SS);
50
}
51
52
void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask)
53
--
54
2.20.1
55
56
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Implement the ITS MOVI command. This command specifies a (physical) LPI
2
2
by DeviceID and EventID and provides a new ICID for it. The ITS must
3
Use this along the exception return path, where we previously
3
find the interrupt translation table entry for the LPI, which will
4
accepted any values.
4
tell it the old ICID. It then moves the pending state of the LPI from
5
5
the old redistributor to the new one and updates the ICID field in
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
the translation table entry.
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
8
Message-id: 20200208125816.14954-11-richard.henderson@linaro.org
8
This is another GICv3 ITS command that we forgot to implement. Linux
9
does use this one, but only if the guest powers off one of its CPUs.
10
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20220122182444.724087-15-peter.maydell@linaro.org
10
---
14
---
11
target/arm/internals.h | 12 ++++++++++++
15
hw/intc/gicv3_internal.h | 16 ++++
12
target/arm/helper-a64.c | 1 +
16
hw/intc/arm_gicv3_its.c | 146 +++++++++++++++++++++++++++++++++++++
13
2 files changed, 13 insertions(+)
17
hw/intc/arm_gicv3_redist.c | 53 ++++++++++++++
14
18
3 files changed, 215 insertions(+)
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
19
20
diff --git a/hw/intc/gicv3_internal.h b/hw/intc/gicv3_internal.h
16
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/internals.h
22
--- a/hw/intc/gicv3_internal.h
18
+++ b/target/arm/internals.h
23
+++ b/hw/intc/gicv3_internal.h
19
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
24
@@ -XXX,XX +XXX,XX @@ FIELD(GITS_TYPER, CIL, 36, 1)
20
return valid;
25
#define CMD_MASK 0xff
26
27
/* ITS Commands */
28
+#define GITS_CMD_MOVI 0x01
29
#define GITS_CMD_INT 0x03
30
#define GITS_CMD_CLEAR 0x04
31
#define GITS_CMD_SYNC 0x05
32
@@ -XXX,XX +XXX,XX @@ FIELD(MAPC, RDBASE, 16, 32)
33
FIELD(MOVALL_2, RDBASE1, 16, 36)
34
FIELD(MOVALL_3, RDBASE2, 16, 36)
35
36
+/* MOVI command fields */
37
+FIELD(MOVI_0, DEVICEID, 32, 32)
38
+FIELD(MOVI_1, EVENTID, 0, 32)
39
+FIELD(MOVI_2, ICID, 0, 16)
40
+
41
/*
42
* 12 bytes Interrupt translation Table Entry size
43
* as per Table 5.3 in GICv3 spec
44
@@ -XXX,XX +XXX,XX @@ void gicv3_redist_update_lpi(GICv3CPUState *cs);
45
* an incoming migration has loaded new state.
46
*/
47
void gicv3_redist_update_lpi_only(GICv3CPUState *cs);
48
+/**
49
+ * gicv3_redist_mov_lpi:
50
+ * @src: source redistributor
51
+ * @dest: destination redistributor
52
+ * @irq: LPI to update
53
+ *
54
+ * Move the pending state of the specified LPI from @src to @dest,
55
+ * as required by the ITS MOVI command.
56
+ */
57
+void gicv3_redist_mov_lpi(GICv3CPUState *src, GICv3CPUState *dest, int irq);
58
/**
59
* gicv3_redist_movall_lpis:
60
* @src: source redistributor
61
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/hw/intc/arm_gicv3_its.c
64
+++ b/hw/intc/arm_gicv3_its.c
65
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_movall(GICv3ITSState *s, uint64_t value,
66
return CMD_CONTINUE;
21
}
67
}
22
68
23
+static inline uint32_t aarch64_pstate_valid_mask(const ARMISARegisters *id)
69
+static ItsCmdResult process_movi(GICv3ITSState *s, uint64_t value,
70
+ uint32_t offset)
24
+{
71
+{
25
+ uint32_t valid;
72
+ AddressSpace *as = &s->gicv3->dma_as;
26
+
73
+ MemTxResult res = MEMTX_OK;
27
+ valid = PSTATE_M | PSTATE_DAIF | PSTATE_IL | PSTATE_SS | PSTATE_NZCV;
74
+ uint32_t devid, eventid, intid;
28
+ if (isar_feature_aa64_bti(id)) {
75
+ uint16_t old_icid, new_icid;
29
+ valid |= PSTATE_BTYPE;
76
+ uint64_t old_cte, new_cte;
30
+ }
77
+ uint64_t old_rdbase, new_rdbase;
31
+
78
+ uint64_t dte;
32
+ return valid;
79
+ bool dte_valid, ite_valid, cte_valid;
80
+ uint64_t num_eventids;
81
+ IteEntry ite = {};
82
+
83
+ devid = FIELD_EX64(value, MOVI_0, DEVICEID);
84
+
85
+ offset += NUM_BYTES_IN_DW;
86
+ value = address_space_ldq_le(as, s->cq.base_addr + offset,
87
+ MEMTXATTRS_UNSPECIFIED, &res);
88
+ if (res != MEMTX_OK) {
89
+ return CMD_STALL;
90
+ }
91
+ eventid = FIELD_EX64(value, MOVI_1, EVENTID);
92
+
93
+ offset += NUM_BYTES_IN_DW;
94
+ value = address_space_ldq_le(as, s->cq.base_addr + offset,
95
+ MEMTXATTRS_UNSPECIFIED, &res);
96
+ if (res != MEMTX_OK) {
97
+ return CMD_STALL;
98
+ }
99
+ new_icid = FIELD_EX64(value, MOVI_2, ICID);
100
+
101
+ if (devid >= s->dt.num_entries) {
102
+ qemu_log_mask(LOG_GUEST_ERROR,
103
+ "%s: invalid command attributes: devid %d>=%d",
104
+ __func__, devid, s->dt.num_entries);
105
+ return CMD_CONTINUE;
106
+ }
107
+ dte = get_dte(s, devid, &res);
108
+ if (res != MEMTX_OK) {
109
+ return CMD_STALL;
110
+ }
111
+
112
+ dte_valid = FIELD_EX64(dte, DTE, VALID);
113
+ if (!dte_valid) {
114
+ qemu_log_mask(LOG_GUEST_ERROR,
115
+ "%s: invalid command attributes: "
116
+ "invalid dte: %"PRIx64" for %d\n",
117
+ __func__, dte, devid);
118
+ return CMD_CONTINUE;
119
+ }
120
+
121
+ num_eventids = 1ULL << (FIELD_EX64(dte, DTE, SIZE) + 1);
122
+ if (eventid >= num_eventids) {
123
+ qemu_log_mask(LOG_GUEST_ERROR,
124
+ "%s: invalid command attributes: eventid %d >= %"
125
+ PRId64 "\n",
126
+ __func__, eventid, num_eventids);
127
+ return CMD_CONTINUE;
128
+ }
129
+
130
+ ite_valid = get_ite(s, eventid, dte, &old_icid, &intid, &res);
131
+ if (res != MEMTX_OK) {
132
+ return CMD_STALL;
133
+ }
134
+
135
+ if (!ite_valid) {
136
+ qemu_log_mask(LOG_GUEST_ERROR,
137
+ "%s: invalid command attributes: invalid ITE\n",
138
+ __func__);
139
+ return CMD_CONTINUE;
140
+ }
141
+
142
+ if (old_icid >= s->ct.num_entries) {
143
+ qemu_log_mask(LOG_GUEST_ERROR,
144
+ "%s: invalid ICID 0x%x in ITE (table corrupted?)\n",
145
+ __func__, old_icid);
146
+ return CMD_CONTINUE;
147
+ }
148
+
149
+ if (new_icid >= s->ct.num_entries) {
150
+ qemu_log_mask(LOG_GUEST_ERROR,
151
+ "%s: invalid command attributes: ICID 0x%x\n",
152
+ __func__, new_icid);
153
+ return CMD_CONTINUE;
154
+ }
155
+
156
+ cte_valid = get_cte(s, old_icid, &old_cte, &res);
157
+ if (res != MEMTX_OK) {
158
+ return CMD_STALL;
159
+ }
160
+ if (!cte_valid) {
161
+ qemu_log_mask(LOG_GUEST_ERROR,
162
+ "%s: invalid command attributes: "
163
+ "invalid cte: %"PRIx64"\n",
164
+ __func__, old_cte);
165
+ return CMD_CONTINUE;
166
+ }
167
+
168
+ cte_valid = get_cte(s, new_icid, &new_cte, &res);
169
+ if (res != MEMTX_OK) {
170
+ return CMD_STALL;
171
+ }
172
+ if (!cte_valid) {
173
+ qemu_log_mask(LOG_GUEST_ERROR,
174
+ "%s: invalid command attributes: "
175
+ "invalid cte: %"PRIx64"\n",
176
+ __func__, new_cte);
177
+ return CMD_CONTINUE;
178
+ }
179
+
180
+ old_rdbase = FIELD_EX64(old_cte, CTE, RDBASE);
181
+ if (old_rdbase >= s->gicv3->num_cpu) {
182
+ qemu_log_mask(LOG_GUEST_ERROR,
183
+ "%s: CTE has invalid rdbase 0x%"PRIx64"\n",
184
+ __func__, old_rdbase);
185
+ return CMD_CONTINUE;
186
+ }
187
+
188
+ new_rdbase = FIELD_EX64(new_cte, CTE, RDBASE);
189
+ if (new_rdbase >= s->gicv3->num_cpu) {
190
+ qemu_log_mask(LOG_GUEST_ERROR,
191
+ "%s: CTE has invalid rdbase 0x%"PRIx64"\n",
192
+ __func__, new_rdbase);
193
+ return CMD_CONTINUE;
194
+ }
195
+
196
+ if (old_rdbase != new_rdbase) {
197
+ /* Move the LPI from the old redistributor to the new one */
198
+ gicv3_redist_mov_lpi(&s->gicv3->cpu[old_rdbase],
199
+ &s->gicv3->cpu[new_rdbase],
200
+ intid);
201
+ }
202
+
203
+ /* Update the ICID field in the interrupt translation table entry */
204
+ ite.itel = FIELD_DP64(ite.itel, ITE_L, VALID, 1);
205
+ ite.itel = FIELD_DP64(ite.itel, ITE_L, INTTYPE, ITE_INTTYPE_PHYSICAL);
206
+ ite.itel = FIELD_DP64(ite.itel, ITE_L, INTID, intid);
207
+ ite.itel = FIELD_DP64(ite.itel, ITE_L, DOORBELL, INTID_SPURIOUS);
208
+ ite.iteh = FIELD_DP32(ite.iteh, ITE_H, ICID, new_icid);
209
+ return update_ite(s, eventid, dte, ite) ? CMD_CONTINUE : CMD_STALL;
33
+}
210
+}
34
+
211
+
35
/*
212
/*
36
* Parameters of a given virtual address, as extracted from the
213
* Current implementation blocks until all
37
* translation control register (TCR) for a given regime.
214
* commands are processed
38
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
215
@@ -XXX,XX +XXX,XX @@ static void process_cmdq(GICv3ITSState *s)
216
gicv3_redist_update_lpi(&s->gicv3->cpu[i]);
217
}
218
break;
219
+ case GITS_CMD_MOVI:
220
+ result = process_movi(s, data, cq_offset);
221
+ break;
222
case GITS_CMD_MOVALL:
223
result = process_movall(s, data, cq_offset);
224
break;
225
diff --git a/hw/intc/arm_gicv3_redist.c b/hw/intc/arm_gicv3_redist.c
39
index XXXXXXX..XXXXXXX 100644
226
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/helper-a64.c
227
--- a/hw/intc/arm_gicv3_redist.c
41
+++ b/target/arm/helper-a64.c
228
+++ b/hw/intc/arm_gicv3_redist.c
42
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
229
@@ -XXX,XX +XXX,XX @@ void gicv3_redist_process_lpi(GICv3CPUState *cs, int irq, int level)
43
cur_el, new_el, env->regs[15]);
230
gicv3_redist_lpi_pending(cs, irq, level);
44
} else {
231
}
45
env->aarch64 = 1;
232
46
+ spsr &= aarch64_pstate_valid_mask(&env_archcpu(env)->isar);
233
+void gicv3_redist_mov_lpi(GICv3CPUState *src, GICv3CPUState *dest, int irq)
47
pstate_write(env, spsr);
234
+{
48
if (!arm_singlestep_active(env)) {
235
+ /*
49
env->pstate &= ~PSTATE_SS;
236
+ * Move the specified LPI's pending state from the source redistributor
237
+ * to the destination.
238
+ *
239
+ * If LPIs are disabled on dest this is CONSTRAINED UNPREDICTABLE:
240
+ * we choose to NOP. If LPIs are disabled on source there's nothing
241
+ * to be transferred anyway.
242
+ */
243
+ AddressSpace *as = &src->gic->dma_as;
244
+ uint64_t idbits;
245
+ uint32_t pendt_size;
246
+ uint64_t src_baddr;
247
+ uint8_t src_pend;
248
+
249
+ if (!(src->gicr_ctlr & GICR_CTLR_ENABLE_LPIS) ||
250
+ !(dest->gicr_ctlr & GICR_CTLR_ENABLE_LPIS)) {
251
+ return;
252
+ }
253
+
254
+ idbits = MIN(FIELD_EX64(src->gicr_propbaser, GICR_PROPBASER, IDBITS),
255
+ GICD_TYPER_IDBITS);
256
+ idbits = MIN(FIELD_EX64(dest->gicr_propbaser, GICR_PROPBASER, IDBITS),
257
+ idbits);
258
+
259
+ pendt_size = 1ULL << (idbits + 1);
260
+ if ((irq / 8) >= pendt_size) {
261
+ return;
262
+ }
263
+
264
+ src_baddr = src->gicr_pendbaser & R_GICR_PENDBASER_PHYADDR_MASK;
265
+
266
+ address_space_read(as, src_baddr + (irq / 8),
267
+ MEMTXATTRS_UNSPECIFIED, &src_pend, sizeof(src_pend));
268
+ if (!extract32(src_pend, irq % 8, 1)) {
269
+ /* Not pending on source, nothing to do */
270
+ return;
271
+ }
272
+ src_pend &= ~(1 << (irq % 8));
273
+ address_space_write(as, src_baddr + (irq / 8),
274
+ MEMTXATTRS_UNSPECIFIED, &src_pend, sizeof(src_pend));
275
+ if (irq == src->hpplpi.irq) {
276
+ /*
277
+ * We just made this LPI not-pending so only need to update
278
+ * if it was previously the highest priority pending LPI
279
+ */
280
+ gicv3_redist_update_lpi(src);
281
+ }
282
+ /* Mark it pending on the destination */
283
+ gicv3_redist_lpi_pending(dest, irq, 1);
284
+}
285
+
286
void gicv3_redist_movall_lpis(GICv3CPUState *src, GICv3CPUState *dest)
287
{
288
/*
50
--
289
--
51
2.20.1
290
2.25.1
52
291
53
292
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
For aarch64, there's a dedicated msr (imm, reg) insn.
4
For aarch32, this is done via msr to cpsr. Writes from el0
5
are ignored, which is already handled by the CPSR_USER mask.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-12-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 2 ++
13
target/arm/internals.h | 6 ++++++
14
target/arm/helper.c | 21 +++++++++++++++++++++
15
target/arm/translate-a64.c | 14 ++++++++++++++
16
4 files changed, 43 insertions(+)
17
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.h
21
+++ b/target/arm/cpu.h
22
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
23
#define CPSR_IT_2_7 (0xfc00U)
24
#define CPSR_GE (0xfU << 16)
25
#define CPSR_IL (1U << 20)
26
+#define CPSR_PAN (1U << 22)
27
#define CPSR_J (1U << 24)
28
#define CPSR_IT_0_1 (3U << 25)
29
#define CPSR_Q (1U << 27)
30
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
31
#define PSTATE_BTYPE (3U << 10)
32
#define PSTATE_IL (1U << 20)
33
#define PSTATE_SS (1U << 21)
34
+#define PSTATE_PAN (1U << 22)
35
#define PSTATE_V (1U << 28)
36
#define PSTATE_C (1U << 29)
37
#define PSTATE_Z (1U << 30)
38
diff --git a/target/arm/internals.h b/target/arm/internals.h
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/internals.h
41
+++ b/target/arm/internals.h
42
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
43
if (isar_feature_jazelle(id)) {
44
valid |= CPSR_J;
45
}
46
+ if (isar_feature_aa32_pan(id)) {
47
+ valid |= CPSR_PAN;
48
+ }
49
50
return valid;
51
}
52
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch64_pstate_valid_mask(const ARMISARegisters *id)
53
if (isar_feature_aa64_bti(id)) {
54
valid |= PSTATE_BTYPE;
55
}
56
+ if (isar_feature_aa64_pan(id)) {
57
+ valid |= PSTATE_PAN;
58
+ }
59
60
return valid;
61
}
62
diff --git a/target/arm/helper.c b/target/arm/helper.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/target/arm/helper.c
65
+++ b/target/arm/helper.c
66
@@ -XXX,XX +XXX,XX @@ static void aa64_daif_write(CPUARMState *env, const ARMCPRegInfo *ri,
67
env->daif = value & PSTATE_DAIF;
68
}
69
70
+static uint64_t aa64_pan_read(CPUARMState *env, const ARMCPRegInfo *ri)
71
+{
72
+ return env->pstate & PSTATE_PAN;
73
+}
74
+
75
+static void aa64_pan_write(CPUARMState *env, const ARMCPRegInfo *ri,
76
+ uint64_t value)
77
+{
78
+ env->pstate = (env->pstate & ~PSTATE_PAN) | (value & PSTATE_PAN);
79
+}
80
+
81
+static const ARMCPRegInfo pan_reginfo = {
82
+ .name = "PAN", .state = ARM_CP_STATE_AA64,
83
+ .opc0 = 3, .opc1 = 0, .crn = 4, .crm = 2, .opc2 = 3,
84
+ .type = ARM_CP_NO_RAW, .access = PL1_RW,
85
+ .readfn = aa64_pan_read, .writefn = aa64_pan_write
86
+};
87
+
88
static CPAccessResult aa64_cacheop_access(CPUARMState *env,
89
const ARMCPRegInfo *ri,
90
bool isread)
91
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
92
if (cpu_isar_feature(aa64_lor, cpu)) {
93
define_arm_cp_regs(cpu, lor_reginfo);
94
}
95
+ if (cpu_isar_feature(aa64_pan, cpu)) {
96
+ define_one_arm_cp_reg(cpu, &pan_reginfo);
97
+ }
98
99
if (arm_feature(env, ARM_FEATURE_EL2) && cpu_isar_feature(aa64_vh, cpu)) {
100
define_arm_cp_regs(cpu, vhe_reginfo);
101
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
102
index XXXXXXX..XXXXXXX 100644
103
--- a/target/arm/translate-a64.c
104
+++ b/target/arm/translate-a64.c
105
@@ -XXX,XX +XXX,XX @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
106
s->base.is_jmp = DISAS_NEXT;
107
break;
108
109
+ case 0x04: /* PAN */
110
+ if (!dc_isar_feature(aa64_pan, s) || s->current_el == 0) {
111
+ goto do_unallocated;
112
+ }
113
+ if (crm & 1) {
114
+ set_pstate_bits(PSTATE_PAN);
115
+ } else {
116
+ clear_pstate_bits(PSTATE_PAN);
117
+ }
118
+ t1 = tcg_const_i32(s->current_el);
119
+ gen_helper_rebuild_hflags_a64(cpu_env, t1);
120
+ tcg_temp_free_i32(t1);
121
+ break;
122
+
123
case 0x05: /* SPSel */
124
if (s->current_el == 0) {
125
goto do_unallocated;
126
--
127
2.20.1
128
129
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Examine the PAN bit for EL1, EL2, and Secure EL1 to
4
determine if it applies.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-13-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/helper.c | 9 +++++++++
13
1 file changed, 9 insertions(+)
14
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
18
+++ b/target/arm/helper.c
19
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_mmu_idx_el(CPUARMState *env, int el)
20
return ARMMMUIdx_E10_0;
21
case 1:
22
if (arm_is_secure_below_el3(env)) {
23
+ if (env->pstate & PSTATE_PAN) {
24
+ return ARMMMUIdx_SE10_1_PAN;
25
+ }
26
return ARMMMUIdx_SE10_1;
27
}
28
+ if (env->pstate & PSTATE_PAN) {
29
+ return ARMMMUIdx_E10_1_PAN;
30
+ }
31
return ARMMMUIdx_E10_1;
32
case 2:
33
/* TODO: ARMv8.4-SecEL2 */
34
/* Note that TGE does not apply at EL2. */
35
if ((env->cp15.hcr_el2 & HCR_E2H) && arm_el_is_aa64(env, 2)) {
36
+ if (env->pstate & PSTATE_PAN) {
37
+ return ARMMMUIdx_E20_2_PAN;
38
+ }
39
return ARMMMUIdx_E20_2;
40
}
41
return ARMMMUIdx_E2;
42
--
43
2.20.1
44
45
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
Initialize EHCI controllers on AST2600 using the existing
3
Address should be 0x1E631000 and not 0x1E641000 as initially introduced.
4
TYPE_PLATFORM_EHCI. After this change, booting ast2600-evb
5
into Linux successfully instantiates a USB interface after
6
the necessary changes are made to its devicetree files.
7
4
8
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
5
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/838
9
ehci-platform: EHCI generic platform driver
6
Fixes: f25c0ae1079d ("aspeed/soc: Add AST2600 support")
10
ehci-platform 1e6a3000.usb: EHCI Host Controller
7
Suggested-by: Troy Lee <troy_lee@aspeedtech.com>
11
ehci-platform 1e6a3000.usb: new USB bus registered, assigned bus number 1
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
ehci-platform 1e6a3000.usb: irq 25, io mem 0x1e6a3000
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
ehci-platform 1e6a3000.usb: USB 2.0 started, EHCI 1.00
10
Message-id: 20220126083520.4135713-1-clg@kaod.org
14
usb usb1: Manufacturer: Linux 5.5.0-09825-ga0802f2d0ef5-dirty ehci_hcd
15
usb 1-1: new high-speed USB device number 2 using ehci-platform
16
17
Reviewed-by: Cédric Le Goater <clg@kaod.org>
18
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
19
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
20
Message-id: 20200207174548.9087-1-linux@roeck-us.net
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
12
---
23
hw/arm/aspeed_ast2600.c | 23 +++++++++++++++++++++++
13
hw/arm/aspeed_ast2600.c | 2 +-
24
1 file changed, 23 insertions(+)
14
1 file changed, 1 insertion(+), 1 deletion(-)
25
15
26
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
16
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
27
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/arm/aspeed_ast2600.c
18
--- a/hw/arm/aspeed_ast2600.c
29
+++ b/hw/arm/aspeed_ast2600.c
19
+++ b/hw/arm/aspeed_ast2600.c
30
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2600_memmap[] = {
20
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2600_memmap[] = {
31
[ASPEED_FMC] = 0x1E620000,
21
[ASPEED_DEV_PWM] = 0x1E610000,
32
[ASPEED_SPI1] = 0x1E630000,
22
[ASPEED_DEV_FMC] = 0x1E620000,
33
[ASPEED_SPI2] = 0x1E641000,
23
[ASPEED_DEV_SPI1] = 0x1E630000,
34
+ [ASPEED_EHCI1] = 0x1E6A1000,
24
- [ASPEED_DEV_SPI2] = 0x1E641000,
35
+ [ASPEED_EHCI2] = 0x1E6A3000,
25
+ [ASPEED_DEV_SPI2] = 0x1E631000,
36
[ASPEED_MII1] = 0x1E650000,
26
[ASPEED_DEV_EHCI1] = 0x1E6A1000,
37
[ASPEED_MII2] = 0x1E650008,
27
[ASPEED_DEV_EHCI2] = 0x1E6A3000,
38
[ASPEED_MII3] = 0x1E650010,
28
[ASPEED_DEV_MII1] = 0x1E650000,
39
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2600_irqmap[] = {
40
[ASPEED_ADC] = 78,
41
[ASPEED_XDMA] = 6,
42
[ASPEED_SDHCI] = 43,
43
+ [ASPEED_EHCI1] = 5,
44
+ [ASPEED_EHCI2] = 9,
45
[ASPEED_EMMC] = 15,
46
[ASPEED_GPIO] = 40,
47
[ASPEED_GPIO_1_8V] = 11,
48
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
49
sizeof(s->spi[i]), typename);
50
}
51
52
+ for (i = 0; i < sc->ehcis_num; i++) {
53
+ sysbus_init_child_obj(obj, "ehci[*]", OBJECT(&s->ehci[i]),
54
+ sizeof(s->ehci[i]), TYPE_PLATFORM_EHCI);
55
+ }
56
+
57
snprintf(typename, sizeof(typename), "aspeed.sdmc-%s", socname);
58
sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc),
59
typename);
60
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
61
s->spi[i].ctrl->flash_window_base);
62
}
63
64
+ /* EHCI */
65
+ for (i = 0; i < sc->ehcis_num; i++) {
66
+ object_property_set_bool(OBJECT(&s->ehci[i]), true, "realized", &err);
67
+ if (err) {
68
+ error_propagate(errp, err);
69
+ return;
70
+ }
71
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
72
+ sc->memmap[ASPEED_EHCI1 + i]);
73
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci[i]), 0,
74
+ aspeed_soc_get_irq(s, ASPEED_EHCI1 + i));
75
+ }
76
+
77
/* SDMC - SDRAM Memory Controller */
78
object_property_set_bool(OBJECT(&s->sdmc), true, "realized", &err);
79
if (err) {
80
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
81
sc->silicon_rev = AST2600_A0_SILICON_REV;
82
sc->sram_size = 0x10000;
83
sc->spis_num = 2;
84
+ sc->ehcis_num = 2;
85
sc->wdts_num = 4;
86
sc->macs_num = 4;
87
sc->irqmap = aspeed_soc_ast2600_irqmap;
88
--
29
--
89
2.20.1
30
2.25.1
90
31
91
32
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The exception caused by an SVC instruction may be taken to AArch32
2
Hyp mode for two reasons:
3
* HCR.TGE indicates that exceptions from EL0 should trap to EL2
4
* we were already in Hyp mode
2
5
3
This is a minor enhancement over ARMv8.1-PAN.
6
The entrypoint in the vector table to be used differs in these two
4
The *_PAN mmu_idx are used with the existing do_ats_write.
7
cases: for an exception routed to Hyp mode from EL0, we enter at the
8
common 0x14 "hyp trap" entrypoint. For SVC from Hyp mode to Hyp
9
mode, we enter at the 0x08 (svc/hvc trap) entrypoint.
10
In the v8A Arm ARM pseudocode this is done in AArch32.TakeSVCException.
5
11
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
QEMU incorrectly routed both of these exceptions to the 0x14
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
entrypoint. Correct the entrypoint for SVC from Hyp to Hyp by making
8
Message-id: 20200208125816.14954-16-richard.henderson@linaro.org
14
use of the existing logic which handles "normal entrypoint for
15
Hyp-to-Hyp, otherwise 0x14" for traps like UNDEF and data/prefetch
16
aborts (reproduced here since it's outside the visible context
17
in the diff for this commit):
18
19
if (arm_current_el(env) != 2 && addr < 0x14) {
20
addr = 0x14;
21
}
22
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
25
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
26
Message-id: 20220117131953.3936137-1-peter.maydell@linaro.org
10
---
27
---
11
target/arm/helper.c | 56 ++++++++++++++++++++++++++++++++++++++++-----
28
target/arm/helper.c | 4 ++--
12
1 file changed, 50 insertions(+), 6 deletions(-)
29
1 file changed, 2 insertions(+), 2 deletions(-)
13
30
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
31
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
33
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
34
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
35
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch32_hyp(CPUState *cs)
19
36
* separately here.
20
switch (ri->opc2 & 6) {
37
*
21
case 0:
38
* The vector table entry used is always the 0x14 Hyp mode entry point,
22
- /* stage 1 current state PL1: ATS1CPR, ATS1CPW */
39
- * unless this is an UNDEF/HVC/abort taken from Hyp to Hyp.
23
+ /* stage 1 current state PL1: ATS1CPR, ATS1CPW, ATS1CPRP, ATS1CPWP */
40
+ * unless this is an UNDEF/SVC/HVC/abort taken from Hyp to Hyp.
24
switch (el) {
41
* The offset applied to the preferred return address is always zero
25
case 3:
42
* (see DDI0487C.a section G1.12.3).
26
mmu_idx = ARMMMUIdx_SE3;
43
* PSTATE A/I/F masks are set based only on the SCR.EA/IRQ/FIQ values.
27
break;
44
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch32_hyp(CPUState *cs)
28
case 2:
45
addr = 0x04;
29
- mmu_idx = ARMMMUIdx_Stage1_E1;
46
break;
30
- break;
47
case EXCP_SWI:
31
+ g_assert(!secure); /* TODO: ARMv8.4-SecEL2 */
48
- addr = 0x14;
32
+ /* fall through */
49
+ addr = 0x08;
33
case 1:
50
break;
34
- mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
51
case EXCP_BKPT:
35
+ if (ri->crm == 9 && (env->uncached_cpsr & CPSR_PAN)) {
52
/* Fall through to prefetch abort. */
36
+ mmu_idx = (secure ? ARMMMUIdx_SE10_1_PAN
37
+ : ARMMMUIdx_Stage1_E1_PAN);
38
+ } else {
39
+ mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
40
+ }
41
break;
42
default:
43
g_assert_not_reached();
44
@@ -XXX,XX +XXX,XX @@ static void ats_write64(CPUARMState *env, const ARMCPRegInfo *ri,
45
switch (ri->opc2 & 6) {
46
case 0:
47
switch (ri->opc1) {
48
- case 0: /* AT S1E1R, AT S1E1W */
49
- mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
50
+ case 0: /* AT S1E1R, AT S1E1W, AT S1E1RP, AT S1E1WP */
51
+ if (ri->crm == 9 && (env->pstate & PSTATE_PAN)) {
52
+ mmu_idx = (secure ? ARMMMUIdx_SE10_1_PAN
53
+ : ARMMMUIdx_Stage1_E1_PAN);
54
+ } else {
55
+ mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
56
+ }
57
break;
58
case 4: /* AT S1E2R, AT S1E2W */
59
mmu_idx = ARMMMUIdx_E2;
60
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vhe_reginfo[] = {
61
REGINFO_SENTINEL
62
};
63
64
+#ifndef CONFIG_USER_ONLY
65
+static const ARMCPRegInfo ats1e1_reginfo[] = {
66
+ { .name = "AT_S1E1R", .state = ARM_CP_STATE_AA64,
67
+ .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 9, .opc2 = 0,
68
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
69
+ .writefn = ats_write64 },
70
+ { .name = "AT_S1E1W", .state = ARM_CP_STATE_AA64,
71
+ .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 9, .opc2 = 1,
72
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
73
+ .writefn = ats_write64 },
74
+ REGINFO_SENTINEL
75
+};
76
+
77
+static const ARMCPRegInfo ats1cp_reginfo[] = {
78
+ { .name = "ATS1CPRP",
79
+ .cp = 15, .opc1 = 0, .crn = 7, .crm = 9, .opc2 = 0,
80
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
81
+ .writefn = ats_write },
82
+ { .name = "ATS1CPWP",
83
+ .cp = 15, .opc1 = 0, .crn = 7, .crm = 9, .opc2 = 1,
84
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
85
+ .writefn = ats_write },
86
+ REGINFO_SENTINEL
87
+};
88
+#endif
89
+
90
void register_cp_regs_for_features(ARMCPU *cpu)
91
{
92
/* Register all the coprocessor registers based on feature bits */
93
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
94
if (cpu_isar_feature(aa64_pan, cpu)) {
95
define_one_arm_cp_reg(cpu, &pan_reginfo);
96
}
97
+#ifndef CONFIG_USER_ONLY
98
+ if (cpu_isar_feature(aa64_ats1e1, cpu)) {
99
+ define_arm_cp_regs(cpu, ats1e1_reginfo);
100
+ }
101
+ if (cpu_isar_feature(aa32_ats1e1, cpu)) {
102
+ define_arm_cp_regs(cpu, ats1cp_reginfo);
103
+ }
104
+#endif
105
106
if (arm_feature(env, ARM_FEATURE_EL2) && cpu_isar_feature(aa64_vh, cpu)) {
107
define_arm_cp_regs(cpu, vhe_reginfo);
108
--
53
--
109
2.20.1
54
2.25.1
110
55
111
56
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
This includes enablement of ARMv8.1-PAN.
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20200208125816.14954-17-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/cpu.c | 4 ++++
11
target/arm/cpu64.c | 5 +++++
12
2 files changed, 9 insertions(+)
13
14
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.c
17
+++ b/target/arm/cpu.c
18
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
19
t = FIELD_DP32(t, MVFR2, FPMISC, 4); /* FP MaxNum */
20
cpu->isar.mvfr2 = t;
21
22
+ t = cpu->id_mmfr3;
23
+ t = FIELD_DP32(t, ID_MMFR3, PAN, 2); /* ATS1E1 */
24
+ cpu->id_mmfr3 = t;
25
+
26
t = cpu->id_mmfr4;
27
t = FIELD_DP32(t, ID_MMFR4, HPDS, 1); /* AA32HPD */
28
cpu->id_mmfr4 = t;
29
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/cpu64.c
32
+++ b/target/arm/cpu64.c
33
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
34
t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* HPD */
35
t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
36
t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1);
37
+ t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
38
cpu->isar.id_aa64mmfr1 = t;
39
40
/* Replicate the same data to the 32-bit id registers. */
41
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
42
u = FIELD_DP32(u, ID_ISAR6, SPECRES, 1);
43
cpu->isar.id_isar6 = u;
44
45
+ u = cpu->id_mmfr3;
46
+ u = FIELD_DP32(u, ID_MMFR3, PAN, 2); /* ATS1E1 */
47
+ cpu->id_mmfr3 = u;
48
+
49
/*
50
* FIXME: We do not yet support ARMv8.2-fp16 for AArch32 yet,
51
* so do not set MVFR1.FPHP. Strictly speaking this is not legal,
52
--
53
2.20.1
54
55
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Add definitions for all of the fields, up to ARMv8.5.
4
Convert the existing RESERVED register to a full register.
5
Query KVM for the value of the register for the host.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-18-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 17 +++++++++++++++++
13
target/arm/helper.c | 4 ++--
14
target/arm/kvm64.c | 2 ++
15
3 files changed, 21 insertions(+), 2 deletions(-)
16
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
22
uint64_t id_aa64pfr1;
23
uint64_t id_aa64mmfr0;
24
uint64_t id_aa64mmfr1;
25
+ uint64_t id_aa64mmfr2;
26
} isar;
27
uint32_t midr;
28
uint32_t revidr;
29
@@ -XXX,XX +XXX,XX @@ FIELD(ID_AA64MMFR1, PAN, 20, 4)
30
FIELD(ID_AA64MMFR1, SPECSEI, 24, 4)
31
FIELD(ID_AA64MMFR1, XNX, 28, 4)
32
33
+FIELD(ID_AA64MMFR2, CNP, 0, 4)
34
+FIELD(ID_AA64MMFR2, UAO, 4, 4)
35
+FIELD(ID_AA64MMFR2, LSM, 8, 4)
36
+FIELD(ID_AA64MMFR2, IESB, 12, 4)
37
+FIELD(ID_AA64MMFR2, VARANGE, 16, 4)
38
+FIELD(ID_AA64MMFR2, CCIDX, 20, 4)
39
+FIELD(ID_AA64MMFR2, NV, 24, 4)
40
+FIELD(ID_AA64MMFR2, ST, 28, 4)
41
+FIELD(ID_AA64MMFR2, AT, 32, 4)
42
+FIELD(ID_AA64MMFR2, IDS, 36, 4)
43
+FIELD(ID_AA64MMFR2, FWB, 40, 4)
44
+FIELD(ID_AA64MMFR2, TTL, 48, 4)
45
+FIELD(ID_AA64MMFR2, BBM, 52, 4)
46
+FIELD(ID_AA64MMFR2, EVT, 56, 4)
47
+FIELD(ID_AA64MMFR2, E0PD, 60, 4)
48
+
49
FIELD(ID_DFR0, COPDBG, 0, 4)
50
FIELD(ID_DFR0, COPSDBG, 4, 4)
51
FIELD(ID_DFR0, MMAPDBG, 8, 4)
52
diff --git a/target/arm/helper.c b/target/arm/helper.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/target/arm/helper.c
55
+++ b/target/arm/helper.c
56
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
57
.access = PL1_R, .type = ARM_CP_CONST,
58
.accessfn = access_aa64_tid3,
59
.resetvalue = cpu->isar.id_aa64mmfr1 },
60
- { .name = "ID_AA64MMFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
61
+ { .name = "ID_AA64MMFR2_EL1", .state = ARM_CP_STATE_AA64,
62
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 2,
63
.access = PL1_R, .type = ARM_CP_CONST,
64
.accessfn = access_aa64_tid3,
65
- .resetvalue = 0 },
66
+ .resetvalue = cpu->isar.id_aa64mmfr2 },
67
{ .name = "ID_AA64MMFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
68
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 3,
69
.access = PL1_R, .type = ARM_CP_CONST,
70
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
71
index XXXXXXX..XXXXXXX 100644
72
--- a/target/arm/kvm64.c
73
+++ b/target/arm/kvm64.c
74
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
75
ARM64_SYS_REG(3, 0, 0, 7, 0));
76
err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr1,
77
ARM64_SYS_REG(3, 0, 0, 7, 1));
78
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr2,
79
+ ARM64_SYS_REG(3, 0, 0, 7, 2));
80
81
/*
82
* Note that if AArch32 support is not present in the host,
83
--
84
2.20.1
85
86
diff view generated by jsdifflib