1
The following changes since commit 046a64b9801343e2e89eef10c7a48eec8d8c0d4f:
1
The following changes since commit ae35f033b874c627d81d51070187fbf55f0bf1a7:
2
2
3
Merge tag 'pull-request-2024-06-12' of https://gitlab.com/thuth/qemu into staging (2024-06-13 07:51:58 -0700)
3
Update version for v9.2.0 release (2024-12-10 16:20:54 +0000)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20240614
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20241211
8
8
9
for you to fetch changes up to d9f6311f5393da897e73be8a29c261125d0c1ac2:
9
for you to fetch changes up to 124f4dc0d832c1bf3a4513c05a2b93bac0a5fac0:
10
10
11
MAINTAINERS: Add reviewers for ASPEED BMCs (2024-06-14 07:36:09 +0200)
11
test/qtest/ast2700-smc-test: Support to test AST2700 (2024-12-11 07:25:53 +0100)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
aspeed queue:
14
aspeed queue:
15
15
16
* Add AST2700 support
16
* Removed tacoma-bmc machine
17
* Added support for SDHCI on AST2700 SoC
18
* Improved functional tests
19
* Extended SMC qtest to all Aspeed SoCs
17
20
18
----------------------------------------------------------------
21
----------------------------------------------------------------
19
Cédric Le Goater (1):
22
Cédric Le Goater (8):
20
aspeed/smc: Reintroduce "dram-base" property for AST2700
23
arm: Remove tacoma-bmc machine
24
tests/functional: Introduce a specific test for ast1030 SoC
25
tests/functional: Introduce a specific test for palmetto-bmc machine
26
tests/functional: Introduce a specific test for romulus-bmc machine
27
tests/functional: Introduce a specific test for ast2500 SoC
28
tests/functional: Introduce a specific test for ast2600 SoC
29
tests/functional: Introduce a specific test for rainier-bmc machine
30
tests/functional: Move debian boot test from avocado
21
31
22
Jamin Lin (18):
32
Jamin Lin (16):
23
aspeed/wdt: Add AST2700 support
33
hw/sd/aspeed_sdhci: Fix coding style
24
aspeed/sli: Add AST2700 support
34
hw/arm/aspeed: Fix coding style
25
aspeed/sdmc: remove redundant macros
35
hw:sdhci: Introduce a new "capareg" class member to set the different Capability Registers
26
aspeed/sdmc: fix coding style
36
hw/sd/aspeed_sdhci: Add AST2700 Support
27
aspeed/sdmc: Add AST2700 support
37
aspeed/soc: Support SDHCI for AST2700
28
aspeed/smc: correct device description
38
aspeed/soc: Support eMMC for AST2700
29
aspeed/smc: support dma start length and 1 byte length unit
39
test/qtest/aspeed_smc-test: Move testcases to test_palmetto_bmc function
30
aspeed/smc: support 64 bits dma dram address
40
test/qtest/aspeed_smc-test: Introduce a new TestData to test different BMC SOCs
31
aspeed/smc: support different memory region ops for SMC flash region
41
test/qtest/aspeed_smc-test: Support to test all CE pins
32
aspeed/smc: Add AST2700 support
42
test/qtest/aspeed_smc-test: Introducing a "page_addr" data field
33
aspeed/scu: Add AST2700 support
43
test/qtest/aspeed_smc-test: Support to test AST2500
34
aspeed/intc: Add AST2700 support
44
test/qtest/aspeed_smc-test: Support to test AST2600
35
aspeed/soc: Add AST2700 support
45
test/qtest/aspeed_smc-test: Support to test AST1030
36
aspeed: Add an AST2700 eval board
46
test/qtest/aspeed_smc-test: Support write page command with QPI mode
37
aspeed/soc: fix incorrect dram size for AST2700
47
test/qtest: Introduce a new aspeed-smc-utils.c to place common testcases
38
test/avocado/machine_aspeed.py: Add AST2700 test case
48
test/qtest/ast2700-smc-test: Support to test AST2700
39
docs:aspeed: Add AST2700 Evaluation board
40
MAINTAINERS: Add reviewers for ASPEED BMCs
41
49
42
MAINTAINERS | 3 +
50
docs/about/deprecated.rst | 8 -
43
docs/system/arm/aspeed.rst | 39 ++-
51
docs/about/removed-features.rst | 10 +
44
include/hw/arm/aspeed_soc.h | 30 +-
52
docs/system/arm/aspeed.rst | 1 -
45
include/hw/intc/aspeed_intc.h | 44 +++
53
include/hw/sd/aspeed_sdhci.h | 13 +-
46
include/hw/misc/aspeed_scu.h | 47 ++-
54
tests/qtest/aspeed-smc-utils.h | 95 ++++
47
include/hw/misc/aspeed_sdmc.h | 5 +-
55
hw/arm/aspeed.c | 28 -
48
include/hw/misc/aspeed_sli.h | 27 ++
56
hw/arm/aspeed_ast2400.c | 3 +-
49
include/hw/ssi/aspeed_smc.h | 3 +
57
hw/arm/aspeed_ast2600.c | 10 +-
50
include/hw/watchdog/wdt_aspeed.h | 3 +-
58
hw/arm/aspeed_ast27x0.c | 35 ++
51
hw/arm/aspeed.c | 32 ++
59
hw/sd/aspeed_sdhci.c | 67 ++-
52
hw/arm/aspeed_ast27x0.c | 648 +++++++++++++++++++++++++++++++++++++++
60
tests/qtest/aspeed-smc-utils.c | 686 ++++++++++++++++++++++++
53
hw/intc/aspeed_intc.c | 360 ++++++++++++++++++++++
61
tests/qtest/aspeed_smc-test.c | 775 ++++++---------------------
54
hw/misc/aspeed_scu.c | 306 +++++++++++++++++-
62
tests/qtest/ast2700-smc-test.c | 71 +++
55
hw/misc/aspeed_sdmc.c | 220 +++++++++++--
63
tests/avocado/boot_linux_console.py | 26 -
56
hw/misc/aspeed_sli.c | 177 +++++++++++
64
tests/functional/aspeed.py | 56 ++
57
hw/ssi/aspeed_smc.c | 347 +++++++++++++++++++--
65
tests/functional/meson.build | 13 +-
58
hw/watchdog/wdt_aspeed.c | 24 ++
66
tests/functional/test_arm_aspeed.py | 351 ------------
59
hw/arm/meson.build | 1 +
67
tests/functional/test_arm_aspeed_ast1030.py | 81 +++
60
hw/intc/meson.build | 1 +
68
tests/functional/test_arm_aspeed_ast2500.py | 59 ++
61
hw/intc/trace-events | 13 +
69
tests/functional/test_arm_aspeed_ast2600.py | 143 +++++
62
hw/misc/meson.build | 3 +-
70
tests/functional/test_arm_aspeed_palmetto.py | 24 +
63
hw/misc/trace-events | 11 +
71
tests/functional/test_arm_aspeed_rainier.py | 64 +++
64
hw/ssi/trace-events | 2 +-
72
tests/functional/test_arm_aspeed_romulus.py | 24 +
65
tests/avocado/machine_aspeed.py | 62 ++++
73
tests/qtest/meson.build | 5 +-
66
24 files changed, 2350 insertions(+), 58 deletions(-)
74
24 files changed, 1623 insertions(+), 1025 deletions(-)
67
create mode 100644 include/hw/intc/aspeed_intc.h
75
create mode 100644 tests/qtest/aspeed-smc-utils.h
68
create mode 100644 include/hw/misc/aspeed_sli.h
76
create mode 100644 tests/qtest/aspeed-smc-utils.c
69
create mode 100644 hw/arm/aspeed_ast27x0.c
77
create mode 100644 tests/qtest/ast2700-smc-test.c
70
create mode 100644 hw/intc/aspeed_intc.c
78
create mode 100644 tests/functional/aspeed.py
71
create mode 100644 hw/misc/aspeed_sli.c
79
delete mode 100755 tests/functional/test_arm_aspeed.py
80
create mode 100644 tests/functional/test_arm_aspeed_ast1030.py
81
create mode 100644 tests/functional/test_arm_aspeed_ast2500.py
82
create mode 100644 tests/functional/test_arm_aspeed_ast2600.py
83
create mode 100644 tests/functional/test_arm_aspeed_palmetto.py
84
create mode 100644 tests/functional/test_arm_aspeed_rainier.py
85
create mode 100644 tests/functional/test_arm_aspeed_romulus.py
72
86
73
87
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
Removal was scheduled for 10.0. Use the rainier-bmc machine or the
2
ast2600-evb as a replacement.
2
3
3
AST2700 CPU is ARM Cortex-A35 which is 64 bits.
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Add TARGET_AARCH64 to build this machine.
5
Link: https://lore.kernel.org/r/20241119071352.515790-1-clg@redhat.com
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
8
docs/about/deprecated.rst | 8 --------
9
docs/about/removed-features.rst | 10 ++++++++++
10
docs/system/arm/aspeed.rst | 1 -
11
hw/arm/aspeed.c | 28 ----------------------------
12
4 files changed, 10 insertions(+), 37 deletions(-)
5
13
6
According to the design of ast2700, it has a bootmcu(riscv-32) which
14
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
7
is used for executing SPL.
15
index XXXXXXX..XXXXXXX 100644
8
Then, CPUs(cortex-a35) execute u-boot, kernel and rofs.
16
--- a/docs/about/deprecated.rst
9
17
+++ b/docs/about/deprecated.rst
10
Currently, qemu not support emulate two CPU architectures
18
@@ -XXX,XX +XXX,XX @@ images are not available, OpenWRT dropped support in 2019, U-Boot in
11
at the same machine. Therefore, qemu will only support
19
2017, Linux also is dropping support in 2024. It is time to let go of
12
to emulate CPU(cortex-a35) side for ast2700
20
this ancient hardware and focus on newer CPUs and platforms.
13
21
14
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
22
-Arm ``tacoma-bmc`` machine (since 9.1)
15
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
23
-''''''''''''''''''''''''''''''''''''''''
16
Reviewed-by: Cédric Le Goater <clg@kaod.org>
24
-
17
---
25
-The ``tacoma-bmc`` machine was a board including an AST2600 SoC based
18
hw/arm/aspeed.c | 32 ++++++++++++++++++++++++++++++++
26
-BMC and a witherspoon like OpenPOWER system. It was used for bring up
19
1 file changed, 32 insertions(+)
27
-of the AST2600 SoC in labs. It can be easily replaced by the
20
28
-``rainier-bmc`` machine which is a real product.
29
-
30
Big-Endian variants of MicroBlaze ``petalogix-ml605`` and ``xlnx-zynqmp-pmu`` machines (since 9.2)
31
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
32
33
diff --git a/docs/about/removed-features.rst b/docs/about/removed-features.rst
34
index XXXXXXX..XXXXXXX 100644
35
--- a/docs/about/removed-features.rst
36
+++ b/docs/about/removed-features.rst
37
@@ -XXX,XX +XXX,XX @@ Aspeed ``swift-bmc`` machine (removed in 7.0)
38
This machine was removed because it was unused. Alternative AST2500 based
39
OpenPOWER machines are ``witherspoon-bmc`` and ``romulus-bmc``.
40
41
+Aspeed ``tacoma-bmc`` machine (removed in 10.0)
42
+'''''''''''''''''''''''''''''''''''''''''''''''
43
+
44
+The ``tacoma-bmc`` machine was removed because it didn't bring much
45
+compared to the ``rainier-bmc`` machine. Also, the ``tacoma-bmc`` was
46
+a board used for bring up of the AST2600 SoC that never left the
47
+labs. It can be easily replaced by the ``rainier-bmc`` machine, which
48
+was the actual final product, or by the ``ast2600-evb`` with some
49
+tweaks.
50
+
51
ppc ``taihu`` machine (removed in 7.2)
52
'''''''''''''''''''''''''''''''''''''''''''''
53
54
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
55
index XXXXXXX..XXXXXXX 100644
56
--- a/docs/system/arm/aspeed.rst
57
+++ b/docs/system/arm/aspeed.rst
58
@@ -XXX,XX +XXX,XX @@ AST2500 SoC based machines :
59
AST2600 SoC based machines :
60
61
- ``ast2600-evb`` Aspeed AST2600 Evaluation board (Cortex-A7)
62
-- ``tacoma-bmc`` OpenPOWER Witherspoon POWER9 AST2600 BMC
63
- ``rainier-bmc`` IBM Rainier POWER10 BMC
64
- ``fuji-bmc`` Facebook Fuji BMC
65
- ``bletchley-bmc`` Facebook Bletchley BMC
21
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
66
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
22
index XXXXXXX..XXXXXXX 100644
67
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/arm/aspeed.c
68
--- a/hw/arm/aspeed.c
24
+++ b/hw/arm/aspeed.c
69
+++ b/hw/arm/aspeed.c
25
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
70
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
26
#define AST2600_EVB_HW_STRAP1 0x000000C0
71
#define AST2700_EVB_HW_STRAP2 0x00000003
27
#define AST2600_EVB_HW_STRAP2 0x00000003
72
#endif
28
73
29
+#ifdef TARGET_AARCH64
74
-/* Tacoma hardware value */
30
+/* AST2700 evb hardware value */
75
-#define TACOMA_BMC_HW_STRAP1 0x00000000
31
+#define AST2700_EVB_HW_STRAP1 0x000000C0
76
-#define TACOMA_BMC_HW_STRAP2 0x00000040
32
+#define AST2700_EVB_HW_STRAP2 0x00000003
77
-
33
+#endif
78
/* Rainier hardware value: (QEMU prototype) */
34
+
79
#define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
35
/* Tacoma hardware value */
80
#define RAINIER_BMC_HW_STRAP2 0x80000848
36
#define TACOMA_BMC_HW_STRAP1 0x00000000
81
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
37
#define TACOMA_BMC_HW_STRAP2 0x00000040
82
aspeed_machine_ast2600_class_emmc_init(oc);
38
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
83
};
39
aspeed_machine_class_init_cpus_defaults(mc);
84
40
}
85
-static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
41
86
-{
42
+#ifdef TARGET_AARCH64
87
- MachineClass *mc = MACHINE_CLASS(oc);
43
+static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data)
88
- AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
44
+{
89
-
45
+ MachineClass *mc = MACHINE_CLASS(oc);
90
- mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)";
46
+ AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
91
- amc->soc_name = "ast2600-a3";
47
+
92
- amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
48
+ mc->desc = "Aspeed AST2700 EVB (Cortex-A35)";
93
- amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
49
+ amc->soc_name = "ast2700-a0";
94
- amc->fmc_model = "mx66l1g45g";
50
+ amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
95
- amc->spi_model = "mx66l1g45g";
51
+ amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
96
- amc->num_cs = 2;
52
+ amc->fmc_model = "w25q01jvq";
97
- amc->macs_mask = ASPEED_MAC2_ON;
53
+ amc->spi_model = "w25q512jv";
98
- amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */
54
+ amc->num_cs = 2;
99
- mc->default_ram_size = 1 * GiB;
55
+ amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
100
- aspeed_machine_class_init_cpus_defaults(mc);
56
+ amc->uart_default = ASPEED_DEV_UART12;
101
-
57
+ mc->default_ram_size = 1 * GiB;
102
- mc->deprecation_reason = "Please use the similar 'rainier-bmc' machine";
58
+ aspeed_machine_class_init_cpus_defaults(mc);
103
-};
59
+}
104
-
60
+#endif
105
static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
61
+
62
static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
63
void *data)
64
{
106
{
107
MachineClass *mc = MACHINE_CLASS(oc);
65
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_machine_types[] = {
108
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_machine_types[] = {
66
.name = MACHINE_TYPE_NAME("ast1030-evb"),
109
.name = MACHINE_TYPE_NAME("yosemitev2-bmc"),
67
.parent = TYPE_ASPEED_MACHINE,
110
.parent = TYPE_ASPEED_MACHINE,
68
.class_init = aspeed_minibmc_machine_ast1030_evb_class_init,
111
.class_init = aspeed_machine_yosemitev2_class_init,
69
+#ifdef TARGET_AARCH64
112
- }, {
70
+ }, {
113
- .name = MACHINE_TYPE_NAME("tacoma-bmc"),
71
+ .name = MACHINE_TYPE_NAME("ast2700-evb"),
114
- .parent = TYPE_ASPEED_MACHINE,
72
+ .parent = TYPE_ASPEED_MACHINE,
115
- .class_init = aspeed_machine_tacoma_class_init,
73
+ .class_init = aspeed_machine_ast2700_evb_class_init,
74
+#endif
75
}, {
116
}, {
76
.name = TYPE_ASPEED_MACHINE,
117
.name = MACHINE_TYPE_NAME("tiogapass-bmc"),
77
.parent = TYPE_MACHINE,
118
.parent = TYPE_ASPEED_MACHINE,
78
--
119
--
79
2.45.2
120
2.47.1
80
121
81
122
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Add AST2700 Evaluation board and its boot command.
3
Fix coding style issues from checkpatch.pl.
4
4
5
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Link: https://lore.kernel.org/r/20241204084453.610660-2-jamin_lin@aspeedtech.com
8
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
---
9
---
9
docs/system/arm/aspeed.rst | 39 ++++++++++++++++++++++++++++++++++----
10
hw/sd/aspeed_sdhci.c | 6 ++++--
10
1 file changed, 35 insertions(+), 4 deletions(-)
11
1 file changed, 4 insertions(+), 2 deletions(-)
11
12
12
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
13
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/docs/system/arm/aspeed.rst
15
--- a/hw/sd/aspeed_sdhci.c
15
+++ b/docs/system/arm/aspeed.rst
16
+++ b/hw/sd/aspeed_sdhci.c
16
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_write(void *opaque, hwaddr addr, uint64_t val,
17
-Aspeed family boards (``*-bmc``, ``ast2500-evb``, ``ast2600-evb``)
18
sdhci->regs[TO_REG(addr)] = (uint32_t)val & ~ASPEED_SDHCI_INFO_RESET;
18
-==================================================================
19
break;
19
+Aspeed family boards (``*-bmc``, ``ast2500-evb``, ``ast2600-evb``, ``ast2700-evb``)
20
case ASPEED_SDHCI_SDIO_140:
20
+===================================================================================
21
- sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg, 0, 32, val);
21
22
+ sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg,
22
The QEMU Aspeed machines model BMCs of various OpenPOWER systems and
23
+ 0, 32, val);
23
Aspeed evaluation boards. They are based on different releases of the
24
break;
24
Aspeed SoC : the AST2400 integrating an ARM926EJ-S CPU (400MHz), the
25
case ASPEED_SDHCI_SDIO_144:
25
-AST2500 with an ARM1176JZS CPU (800MHz) and more recently the AST2600
26
- sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg, 32, 32, val);
26
-with dual cores ARM Cortex-A7 CPUs (1.2GHz).
27
+ sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg,
27
+AST2500 with an ARM1176JZS CPU (800MHz), the AST2600
28
+ 32, 32, val);
28
+with dual cores ARM Cortex-A7 CPUs (1.2GHz) and more recently the AST2700
29
break;
29
+with quad cores ARM Cortex-A35 64 bits CPUs (1.6GHz)
30
case ASPEED_SDHCI_SDIO_148:
30
31
sdhci->slots[0].maxcurr = deposit64(sdhci->slots[0].maxcurr,
31
The SoC comes with RAM, Gigabit ethernet, USB, SD/MMC, USB, SPI, I2C,
32
etc.
33
@@ -XXX,XX +XXX,XX @@ AST2600 SoC based machines :
34
- ``qcom-dc-scm-v1-bmc`` Qualcomm DC-SCM V1 BMC
35
- ``qcom-firework-bmc`` Qualcomm Firework BMC
36
37
+AST2700 SoC based machines :
38
+
39
+- ``ast2700-evb`` Aspeed AST2700 Evaluation board (Cortex-A35)
40
+
41
Supported devices
42
-----------------
43
44
@@ -XXX,XX +XXX,XX @@ Supported devices
45
* eMMC Boot Controller (dummy)
46
* PECI Controller (minimal)
47
* I3C Controller
48
+ * Internal Bridge Controller (SLI dummy)
49
50
51
Missing devices
52
@@ -XXX,XX +XXX,XX @@ or directly from the OpenBMC GitHub release repository :
53
54
https://github.com/openbmc/openbmc/releases
55
56
+or directly from the ASPEED Forked OpenBMC GitHub release repository :
57
+
58
+ https://github.com/AspeedTech-BMC/openbmc/releases
59
+
60
To boot a kernel directly from a Linux build tree:
61
62
.. code-block:: bash
63
@@ -XXX,XX +XXX,XX @@ under Linux), use :
64
65
-M ast2500-evb,bmc-console=uart3
66
67
+
68
+Boot the AST2700 machine from the flash image, use an MTD drive :
69
+
70
+.. code-block:: bash
71
+
72
+ IMGDIR=ast2700-default
73
+ UBOOT_SIZE=$(stat --format=%s -L ${IMGDIR}/u-boot-nodtb.bin)
74
+
75
+ $ qemu-system-aarch64 -M ast2700-evb \
76
+ -device loader,force-raw=on,addr=0x400000000,file=${IMGDIR}/u-boot-nodtb.bin \
77
+ -device loader,force-raw=on,addr=$((0x400000000 + ${UBOOT_SIZE})),file=${IMGDIR}/u-boot.dtb \
78
+ -device loader,force-raw=on,addr=0x430000000,file=${IMGDIR}/bl31.bin \
79
+ -device loader,force-raw=on,addr=0x430080000,file=${IMGDIR}/optee/tee-raw.bin \
80
+ -device loader,cpu-num=0,addr=0x430000000 \
81
+ -device loader,cpu-num=1,addr=0x430000000 \
82
+ -device loader,cpu-num=2,addr=0x430000000 \
83
+ -device loader,cpu-num=3,addr=0x430000000 \
84
+ -smp 4 \
85
+ -drive file=${IMGDIR}/image-bmc,format=raw,if=mtd \
86
+ -nographic
87
+
88
Aspeed minibmc family boards (``ast1030-evb``)
89
==================================================================
90
91
--
32
--
92
2.45.2
33
2.47.1
93
34
94
35
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Fix coding style issues from checkpatch.pl
3
Fix coding style issues from checkpatch.pl.
4
4
5
Test command:
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
scripts/checkpatch.pl --no-tree -f hw/misc/aspeed_sdmc.c
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Link: https://lore.kernel.org/r/20241204084453.610660-3-jamin_lin@aspeedtech.com
8
Signed-off-by: Cédric Le Goater <clg@redhat.com>
9
---
10
hw/arm/aspeed_ast2600.c | 3 ++-
11
1 file changed, 2 insertions(+), 1 deletion(-)
7
12
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
13
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
---
12
hw/misc/aspeed_sdmc.c | 11 +++++++----
13
1 file changed, 7 insertions(+), 4 deletions(-)
14
15
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/misc/aspeed_sdmc.c
15
--- a/hw/arm/aspeed_ast2600.c
18
+++ b/hw/misc/aspeed_sdmc.c
16
+++ b/hw/arm/aspeed_ast2600.c
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg,
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
20
uint32_t data)
18
if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
21
{
22
if (reg == R_PROT) {
23
- s->regs[reg] = (data == PROT_KEY_UNLOCK) ? PROT_UNLOCKED : PROT_SOFTLOCKED;
24
+ s->regs[reg] =
25
+ (data == PROT_KEY_UNLOCK) ? PROT_UNLOCKED : PROT_SOFTLOCKED;
26
return;
19
return;
27
}
20
}
28
21
- aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_DEV_GPIO]);
29
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_sdmc_write(AspeedSDMCState *s, uint32_t reg,
22
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0,
30
uint32_t data)
23
+ sc->memmap[ASPEED_DEV_GPIO]);
31
{
24
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
32
if (reg == R_PROT) {
25
aspeed_soc_get_irq(s, ASPEED_DEV_GPIO));
33
- s->regs[reg] = (data == PROT_KEY_UNLOCK) ? PROT_UNLOCKED : PROT_SOFTLOCKED;
34
+ s->regs[reg] =
35
+ (data == PROT_KEY_UNLOCK) ? PROT_UNLOCKED : PROT_SOFTLOCKED;
36
return;
37
}
38
39
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_sdmc_write(AspeedSDMCState *s, uint32_t reg,
40
}
41
42
if (s->regs[R_PROT] == PROT_HARDLOCKED) {
43
- qemu_log_mask(LOG_GUEST_ERROR, "%s: SDMC is locked until system reset!\n",
44
- __func__);
45
+ qemu_log_mask(LOG_GUEST_ERROR,
46
+ "%s: SDMC is locked until system reset!\n",
47
+ __func__);
48
return;
49
}
50
26
51
--
27
--
52
2.45.2
28
2.47.1
53
29
54
30
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST2700 support the maximum dram size is 8GiB
3
Currently, it set the hardcode value of capability registers to all ASPEED SOCs
4
and has a "DMA DRAM Side Address High Part(0x7C)"
4
However, the value of capability registers should be different for all ASPEED
5
register to support 64 bits dma dram address.
5
SOCs. For example: the bit 28 of the Capability Register 1 should be 1 for
6
Add helper routines functions to compute the dma dram
6
64-bits System Bus support for AST2700.
7
address, new features and update trace-event
8
to support 64 bits dram address.
9
7
10
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
8
Introduce a new "capareg" class member whose data type is uint_64 to set the
9
different Capability Registers to all ASPEED SOCs.
10
11
The value of Capability Register is "0x0000000001e80080" for AST2400 and
12
AST2500. The value of Capability Register is "0x0000000701f80080" for AST2600.
13
11
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
14
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
12
Reviewed-by: Cédric Le Goater <clg@redhat.com>
15
Reviewed-by: Cédric Le Goater <clg@redhat.com>
16
Link: https://lore.kernel.org/r/20241204084453.610660-4-jamin_lin@aspeedtech.com
17
Signed-off-by: Cédric Le Goater <clg@redhat.com>
13
---
18
---
14
hw/ssi/aspeed_smc.c | 51 ++++++++++++++++++++++++++++++++++++++-------
19
include/hw/sd/aspeed_sdhci.h | 12 +++++++--
15
hw/ssi/trace-events | 2 +-
20
hw/arm/aspeed_ast2400.c | 3 ++-
16
2 files changed, 44 insertions(+), 9 deletions(-)
21
hw/arm/aspeed_ast2600.c | 7 +++---
22
hw/sd/aspeed_sdhci.c | 47 +++++++++++++++++++++++++++++++++++-
23
4 files changed, 61 insertions(+), 8 deletions(-)
17
24
18
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
25
diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
19
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/ssi/aspeed_smc.c
27
--- a/include/hw/sd/aspeed_sdhci.h
21
+++ b/hw/ssi/aspeed_smc.c
28
+++ b/include/hw/sd/aspeed_sdhci.h
22
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@
23
#define FMC_WDT2_CTRL_BOOT_SOURCE BIT(4) /* O: primary 1: alternate */
30
#include "qom/object.h"
24
#define FMC_WDT2_CTRL_EN BIT(0)
31
25
32
#define TYPE_ASPEED_SDHCI "aspeed.sdhci"
26
+/* DMA DRAM Side Address High Part (AST2700) */
33
-OBJECT_DECLARE_SIMPLE_TYPE(AspeedSDHCIState, ASPEED_SDHCI)
27
+#define R_DMA_DRAM_ADDR_HIGH (0x7c / 4)
34
+#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
35
+#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
36
+#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
37
+OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
38
39
-#define ASPEED_SDHCI_CAPABILITIES 0x01E80080
40
#define ASPEED_SDHCI_NUM_SLOTS 2
41
#define ASPEED_SDHCI_NUM_REGS (ASPEED_SDHCI_REG_SIZE / sizeof(uint32_t))
42
#define ASPEED_SDHCI_REG_SIZE 0x100
43
@@ -XXX,XX +XXX,XX @@ struct AspeedSDHCIState {
44
uint32_t regs[ASPEED_SDHCI_NUM_REGS];
45
};
46
47
+struct AspeedSDHCIClass {
48
+ SysBusDeviceClass parent_class;
28
+
49
+
29
/* DMA Control/Status Register */
50
+ uint64_t capareg;
30
#define R_DMA_CTRL (0x80 / 4)
51
+};
31
#define DMA_CTRL_REQUEST (1 << 31)
52
+
32
@@ -XXX,XX +XXX,XX @@
53
#endif /* ASPEED_SDHCI_H */
33
* 0x1FFFFFF: 32M bytes
54
diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
34
*/
55
index XXXXXXX..XXXXXXX 100644
35
#define DMA_DRAM_ADDR(asc, val) ((val) & (asc)->dma_dram_mask)
56
--- a/hw/arm/aspeed_ast2400.c
36
+#define DMA_DRAM_ADDR_HIGH(val) ((val) & 0xf)
57
+++ b/hw/arm/aspeed_ast2400.c
37
#define DMA_FLASH_ADDR(asc, val) ((val) & (asc)->dma_flash_mask)
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
38
#define DMA_LENGTH(val) ((val) & 0x01FFFFFF)
59
snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname);
39
60
object_initialize_child(obj, "gpio", &s->gpio, typename);
40
@@ -XXX,XX +XXX,XX @@ static const AspeedSegments aspeed_2500_spi2_segments[];
61
41
#define ASPEED_SMC_FEATURE_DMA 0x1
62
- object_initialize_child(obj, "sdc", &s->sdhci, TYPE_ASPEED_SDHCI);
42
#define ASPEED_SMC_FEATURE_DMA_GRANT 0x2
63
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
43
#define ASPEED_SMC_FEATURE_WDT_CONTROL 0x4
64
+ object_initialize_child(obj, "sdc", &s->sdhci, typename);
44
+#define ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH 0x08
65
45
66
object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
46
static inline bool aspeed_smc_has_dma(const AspeedSMCClass *asc)
67
68
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/hw/arm/aspeed_ast2600.c
71
+++ b/hw/arm/aspeed_ast2600.c
72
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
73
snprintf(typename, sizeof(typename), "aspeed.gpio-%s-1_8v", socname);
74
object_initialize_child(obj, "gpio_1_8v", &s->gpio_1_8v, typename);
75
76
- object_initialize_child(obj, "sd-controller", &s->sdhci,
77
- TYPE_ASPEED_SDHCI);
78
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
79
+ object_initialize_child(obj, "sd-controller", &s->sdhci, typename);
80
81
object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
82
83
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
84
&s->sdhci.slots[i], TYPE_SYSBUS_SDHCI);
85
}
86
87
- object_initialize_child(obj, "emmc-controller", &s->emmc,
88
- TYPE_ASPEED_SDHCI);
89
+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
90
91
object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
92
93
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/hw/sd/aspeed_sdhci.c
96
+++ b/hw/sd/aspeed_sdhci.c
97
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
47
{
98
{
48
@@ -XXX,XX +XXX,XX @@ static inline bool aspeed_smc_has_wdt_control(const AspeedSMCClass *asc)
99
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
49
return !!(asc->features & ASPEED_SMC_FEATURE_WDT_CONTROL);
100
AspeedSDHCIState *sdhci = ASPEED_SDHCI(dev);
101
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_GET_CLASS(sdhci);
102
103
/* Create input irqs for the slots */
104
qdev_init_gpio_in_named_with_opaque(DEVICE(sbd), aspeed_sdhci_set_irq,
105
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
106
}
107
108
if (!object_property_set_uint(sdhci_slot, "capareg",
109
- ASPEED_SDHCI_CAPABILITIES, errp)) {
110
+ asc->capareg, errp)) {
111
return;
112
}
113
114
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_class_init(ObjectClass *classp, void *data)
115
device_class_set_props(dc, aspeed_sdhci_properties);
50
}
116
}
51
117
52
+static inline bool aspeed_smc_has_dma64(const AspeedSMCClass *asc)
118
+static void aspeed_2400_sdhci_class_init(ObjectClass *klass, void *data)
53
+{
119
+{
54
+ return !!(asc->features & ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH);
120
+ DeviceClass *dc = DEVICE_CLASS(klass);
121
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
122
+
123
+ dc->desc = "ASPEED 2400 SDHCI Controller";
124
+ asc->capareg = 0x0000000001e80080;
55
+}
125
+}
56
+
126
+
57
#define aspeed_smc_error(fmt, ...) \
127
+static void aspeed_2500_sdhci_class_init(ObjectClass *klass, void *data)
58
qemu_log_mask(LOG_GUEST_ERROR, "%s: " fmt "\n", __func__, ## __VA_ARGS__)
59
60
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int size)
61
(aspeed_smc_has_dma(asc) && addr == R_DMA_CTRL) ||
62
(aspeed_smc_has_dma(asc) && addr == R_DMA_FLASH_ADDR) ||
63
(aspeed_smc_has_dma(asc) && addr == R_DMA_DRAM_ADDR) ||
64
+ (aspeed_smc_has_dma(asc) && aspeed_smc_has_dma64(asc) &&
65
+ addr == R_DMA_DRAM_ADDR_HIGH) ||
66
(aspeed_smc_has_dma(asc) && addr == R_DMA_LEN) ||
67
(aspeed_smc_has_dma(asc) && addr == R_DMA_CHECKSUM) ||
68
(addr >= R_SEG_ADDR0 &&
69
@@ -XXX,XX +XXX,XX @@ static bool aspeed_smc_inject_read_failure(AspeedSMCState *s)
70
}
71
}
72
73
+static uint64_t aspeed_smc_dma_dram_addr(AspeedSMCState *s)
74
+{
128
+{
75
+ return s->regs[R_DMA_DRAM_ADDR] |
129
+ DeviceClass *dc = DEVICE_CLASS(klass);
76
+ ((uint64_t) s->regs[R_DMA_DRAM_ADDR_HIGH] << 32);
130
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
131
+
132
+ dc->desc = "ASPEED 2500 SDHCI Controller";
133
+ asc->capareg = 0x0000000001e80080;
77
+}
134
+}
78
+
135
+
79
static uint32_t aspeed_smc_dma_len(AspeedSMCState *s)
136
+static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
80
{
137
+{
81
AspeedSMCClass *asc = ASPEED_SMC_GET_CLASS(s);
138
+ DeviceClass *dc = DEVICE_CLASS(klass);
82
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s)
139
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
83
84
static void aspeed_smc_dma_rw(AspeedSMCState *s)
85
{
86
+ AspeedSMCClass *asc = ASPEED_SMC_GET_CLASS(s);
87
+ uint64_t dma_dram_offset;
88
+ uint64_t dma_dram_addr;
89
MemTxResult result;
90
uint32_t dma_len;
91
uint32_t data;
92
93
dma_len = aspeed_smc_dma_len(s);
94
+ dma_dram_addr = aspeed_smc_dma_dram_addr(s);
95
+
140
+
96
+ if (aspeed_smc_has_dma64(asc)) {
141
+ dc->desc = "ASPEED 2600 SDHCI Controller";
97
+ dma_dram_offset = dma_dram_addr - s->dram_base;
142
+ asc->capareg = 0x0000000701f80080;
98
+ } else {
143
+}
99
+ dma_dram_offset = dma_dram_addr;
100
+ }
101
102
trace_aspeed_smc_dma_rw(s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE ?
103
"write" : "read",
104
s->regs[R_DMA_FLASH_ADDR],
105
- s->regs[R_DMA_DRAM_ADDR],
106
+ dma_dram_offset,
107
dma_len);
108
while (dma_len) {
109
if (s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE) {
110
- data = address_space_ldl_le(&s->dram_as, s->regs[R_DMA_DRAM_ADDR],
111
+ data = address_space_ldl_le(&s->dram_as, dma_dram_offset,
112
MEMTXATTRS_UNSPECIFIED, &result);
113
if (result != MEMTX_OK) {
114
- aspeed_smc_error("DRAM read failed @%08x",
115
- s->regs[R_DMA_DRAM_ADDR]);
116
+ aspeed_smc_error("DRAM read failed @%" PRIx64,
117
+ dma_dram_offset);
118
return;
119
}
120
121
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_rw(AspeedSMCState *s)
122
return;
123
}
124
125
- address_space_stl_le(&s->dram_as, s->regs[R_DMA_DRAM_ADDR],
126
+ address_space_stl_le(&s->dram_as, dma_dram_offset,
127
data, MEMTXATTRS_UNSPECIFIED, &result);
128
if (result != MEMTX_OK) {
129
- aspeed_smc_error("DRAM write failed @%08x",
130
- s->regs[R_DMA_DRAM_ADDR]);
131
+ aspeed_smc_error("DRAM write failed @%" PRIx64,
132
+ dma_dram_offset);
133
return;
134
}
135
}
136
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_rw(AspeedSMCState *s)
137
* When the DMA is on-going, the DMA registers are updated
138
* with the current working addresses and length.
139
*/
140
+ dma_dram_offset += 4;
141
+ dma_dram_addr += 4;
142
+
144
+
143
+ s->regs[R_DMA_DRAM_ADDR_HIGH] = dma_dram_addr >> 32;
145
static const TypeInfo aspeed_sdhci_types[] = {
144
+ s->regs[R_DMA_DRAM_ADDR] = dma_dram_addr & 0xffffffff;
146
{
145
s->regs[R_DMA_FLASH_ADDR] += 4;
147
.name = TYPE_ASPEED_SDHCI,
146
- s->regs[R_DMA_DRAM_ADDR] += 4;
148
.parent = TYPE_SYS_BUS_DEVICE,
147
dma_len -= 4;
149
.instance_size = sizeof(AspeedSDHCIState),
148
s->regs[R_DMA_LEN] = dma_len;
150
.class_init = aspeed_sdhci_class_init,
149
s->regs[R_DMA_CHECKSUM] += data;
151
+ .class_size = sizeof(AspeedSDHCIClass),
150
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_write(void *opaque, hwaddr addr, uint64_t data,
152
+ .abstract = true,
151
} else if (aspeed_smc_has_dma(asc) && addr == R_DMA_LEN &&
153
+ },
152
aspeed_smc_dma_granted(s)) {
154
+ {
153
s->regs[addr] = DMA_LENGTH(value);
155
+ .name = TYPE_ASPEED_2400_SDHCI,
154
+ } else if (aspeed_smc_has_dma(asc) && aspeed_smc_has_dma64(asc) &&
156
+ .parent = TYPE_ASPEED_SDHCI,
155
+ addr == R_DMA_DRAM_ADDR_HIGH) {
157
+ .class_init = aspeed_2400_sdhci_class_init,
156
+ s->regs[addr] = DMA_DRAM_ADDR_HIGH(value);
158
+ },
157
} else {
159
+ {
158
qemu_log_mask(LOG_UNIMP, "%s: not implemented: 0x%" HWADDR_PRIx "\n",
160
+ .name = TYPE_ASPEED_2500_SDHCI,
159
__func__, addr);
161
+ .parent = TYPE_ASPEED_SDHCI,
160
diff --git a/hw/ssi/trace-events b/hw/ssi/trace-events
162
+ .class_init = aspeed_2500_sdhci_class_init,
161
index XXXXXXX..XXXXXXX 100644
163
+ },
162
--- a/hw/ssi/trace-events
164
+ {
163
+++ b/hw/ssi/trace-events
165
+ .name = TYPE_ASPEED_2600_SDHCI,
164
@@ -XXX,XX +XXX,XX @@ aspeed_smc_do_snoop(int cs, int index, int dummies, int data) "CS%d index:0x%x d
166
+ .parent = TYPE_ASPEED_SDHCI,
165
aspeed_smc_flash_write(int cs, uint64_t addr, uint32_t size, uint64_t data, int mode) "CS%d @0x%" PRIx64 " size %u: 0x%" PRIx64" mode:%d"
167
+ .class_init = aspeed_2600_sdhci_class_init,
166
aspeed_smc_read(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size %u: 0x%" PRIx64
168
},
167
aspeed_smc_dma_checksum(uint32_t addr, uint32_t data) "0x%08x: 0x%08x"
169
};
168
-aspeed_smc_dma_rw(const char *dir, uint32_t flash_addr, uint32_t dram_addr, uint32_t size) "%s flash:@0x%08x dram:@0x%08x size:0x%08x"
169
+aspeed_smc_dma_rw(const char *dir, uint32_t flash_addr, uint64_t dram_addr, uint32_t size) "%s flash:@0x%08x dram:@0x%" PRIx64 " size:0x%08x"
170
aspeed_smc_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size %u: 0x%" PRIx64
171
aspeed_smc_flash_select(int cs, const char *prefix) "CS%d %sselect"
172
170
173
--
171
--
174
2.45.2
172
2.47.1
175
173
176
174
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST2700 wdt controller is similiar to AST2600's wdt, but
3
Introduce a new ast2700 class to support AST2700. Add a new ast2700 SDHCI class
4
the AST2700 has 8 watchdogs, and they each have 0x80 of registers.
4
init function and set the value of capability register to "0x0000000719f80080".
5
Introduce ast2700 object class and increase the number of regs(offset) of
6
ast2700 model.
7
5
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Link: https://lore.kernel.org/r/20241204084453.610660-5-jamin_lin@aspeedtech.com
9
Signed-off-by: Cédric Le Goater <clg@redhat.com>
11
---
10
---
12
include/hw/watchdog/wdt_aspeed.h | 3 ++-
11
include/hw/sd/aspeed_sdhci.h | 1 +
13
hw/watchdog/wdt_aspeed.c | 24 ++++++++++++++++++++++++
12
hw/sd/aspeed_sdhci.c | 14 ++++++++++++++
14
2 files changed, 26 insertions(+), 1 deletion(-)
13
2 files changed, 15 insertions(+)
15
14
16
diff --git a/include/hw/watchdog/wdt_aspeed.h b/include/hw/watchdog/wdt_aspeed.h
15
diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/watchdog/wdt_aspeed.h
17
--- a/include/hw/sd/aspeed_sdhci.h
19
+++ b/include/hw/watchdog/wdt_aspeed.h
18
+++ b/include/hw/sd/aspeed_sdhci.h
20
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedWDTState, AspeedWDTClass, ASPEED_WDT)
19
@@ -XXX,XX +XXX,XX @@
21
#define TYPE_ASPEED_2400_WDT TYPE_ASPEED_WDT "-ast2400"
20
#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
22
#define TYPE_ASPEED_2500_WDT TYPE_ASPEED_WDT "-ast2500"
21
#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
23
#define TYPE_ASPEED_2600_WDT TYPE_ASPEED_WDT "-ast2600"
22
#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
24
+#define TYPE_ASPEED_2700_WDT TYPE_ASPEED_WDT "-ast2700"
23
+#define TYPE_ASPEED_2700_SDHCI TYPE_ASPEED_SDHCI "-ast2700"
25
#define TYPE_ASPEED_1030_WDT TYPE_ASPEED_WDT "-ast1030"
24
OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
26
25
27
-#define ASPEED_WDT_REGS_MAX (0x30 / 4)
26
#define ASPEED_SDHCI_NUM_SLOTS 2
28
+#define ASPEED_WDT_REGS_MAX (0x80 / 4)
27
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
29
30
struct AspeedWDTState {
31
/*< private >*/
32
diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c
33
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/watchdog/wdt_aspeed.c
29
--- a/hw/sd/aspeed_sdhci.c
35
+++ b/hw/watchdog/wdt_aspeed.c
30
+++ b/hw/sd/aspeed_sdhci.c
36
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_1030_wdt_info = {
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
37
.class_init = aspeed_1030_wdt_class_init,
32
asc->capareg = 0x0000000701f80080;
38
};
33
}
39
34
40
+static void aspeed_2700_wdt_class_init(ObjectClass *klass, void *data)
35
+static void aspeed_2700_sdhci_class_init(ObjectClass *klass, void *data)
41
+{
36
+{
42
+ DeviceClass *dc = DEVICE_CLASS(klass);
37
+ DeviceClass *dc = DEVICE_CLASS(klass);
43
+ AspeedWDTClass *awc = ASPEED_WDT_CLASS(klass);
38
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
44
+
39
+
45
+ dc->desc = "ASPEED 2700 Watchdog Controller";
40
+ dc->desc = "ASPEED 2700 SDHCI Controller";
46
+ awc->iosize = 0x80;
41
+ asc->capareg = 0x0000000719f80080;
47
+ awc->ext_pulse_width_mask = 0xfffff; /* TODO */
48
+ awc->reset_ctrl_reg = AST2600_SCU_RESET_CONTROL1;
49
+ awc->reset_pulse = aspeed_2500_wdt_reset_pulse;
50
+ awc->wdt_reload = aspeed_wdt_reload_1mhz;
51
+ awc->sanitize_ctrl = aspeed_2600_sanitize_ctrl;
52
+ awc->default_status = 0x014FB180;
53
+ awc->default_reload_value = 0x014FB180;
54
+}
42
+}
55
+
43
+
56
+static const TypeInfo aspeed_2700_wdt_info = {
44
static const TypeInfo aspeed_sdhci_types[] = {
57
+ .name = TYPE_ASPEED_2700_WDT,
45
{
58
+ .parent = TYPE_ASPEED_WDT,
46
.name = TYPE_ASPEED_SDHCI,
59
+ .instance_size = sizeof(AspeedWDTState),
47
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_sdhci_types[] = {
60
+ .class_init = aspeed_2700_wdt_class_init,
48
.parent = TYPE_ASPEED_SDHCI,
61
+};
49
.class_init = aspeed_2600_sdhci_class_init,
62
+
50
},
63
static void wdt_aspeed_register_types(void)
51
+ {
64
{
52
+ .name = TYPE_ASPEED_2700_SDHCI,
65
type_register_static(&aspeed_wdt_info);
53
+ .parent = TYPE_ASPEED_SDHCI,
66
type_register_static(&aspeed_2400_wdt_info);
54
+ .class_init = aspeed_2700_sdhci_class_init,
67
type_register_static(&aspeed_2500_wdt_info);
55
+ },
68
type_register_static(&aspeed_2600_wdt_info);
56
};
69
+ type_register_static(&aspeed_2700_wdt_info);
57
70
type_register_static(&aspeed_1030_wdt_info);
58
DEFINE_TYPES(aspeed_sdhci_types)
71
}
72
73
--
59
--
74
2.45.2
60
2.47.1
75
61
76
62
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST2700 dram size calculation is not back compatible AST2600.
3
Add SDHCI model for AST2700 SDHCI support. The SDHCI controller only support 1
4
According to the DDR capacity hardware behavior,
4
slot and registers base address is start at 0x1408_0000 and its interrupt is
5
if users write the data to the address which is beyond the ram size,
5
connected to GICINT133_INTC at bit 1.
6
it would write the data to the "address % ram_size".
7
For example:
8
a. sdram base address "0x4 00000000"
9
b. sdram size 1 GiB
10
The available address range is from "0x4 00000000" to "0x4 3FFFFFFF".
11
If users write 0x12345678 to address "0x5 00000000",
12
the value of DRAM address 0 (base address 0x4 00000000) will be 0x12345678.
13
6
14
Add aspeed_soc_ast2700_dram_init to calculate the dram size and add
15
memory I/O whose address range is from "max_ram_size - ram_size" to max_ram_size
16
and its read/write handler to emulate DDR capacity hardware behavior.
17
18
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
19
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
20
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Link: https://lore.kernel.org/r/20241204084453.610660-6-jamin_lin@aspeedtech.com
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
21
---
11
---
22
include/hw/arm/aspeed_soc.h | 2 +
12
hw/arm/aspeed_ast27x0.c | 20 ++++++++++++++++++++
23
hw/arm/aspeed_ast27x0.c | 87 ++++++++++++++++++++++++++++++++++++-
13
1 file changed, 20 insertions(+)
24
2 files changed, 88 insertions(+), 1 deletion(-)
25
14
26
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
27
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/aspeed_soc.h
29
+++ b/include/hw/arm/aspeed_soc.h
30
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
31
MemoryRegion sram;
32
MemoryRegion spi_boot_container;
33
MemoryRegion spi_boot;
34
+ AddressSpace dram_as;
35
AspeedRtcState rtc;
36
AspeedTimerCtrlState timerctrl;
37
AspeedI2CState i2c;
38
@@ -XXX,XX +XXX,XX @@ struct Aspeed27x0SoCState {
39
ARMCPU cpu[ASPEED_CPUS_NUM];
40
AspeedINTCState intc;
41
GICv3State gic;
42
+ MemoryRegion dram_empty;
43
};
44
45
#define TYPE_ASPEED27X0_SOC "aspeed27x0-soc"
46
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
47
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/aspeed_ast27x0.c
17
--- a/hw/arm/aspeed_ast27x0.c
49
+++ b/hw/arm/aspeed_ast27x0.c
18
+++ b/hw/arm/aspeed_ast27x0.c
50
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2700_memmap[] = {
51
#include "sysemu/sysemu.h"
20
[ASPEED_DEV_I2C] = 0x14C0F000,
52
#include "hw/intc/arm_gicv3.h"
21
[ASPEED_DEV_GPIO] = 0x14C0B000,
53
#include "qapi/qmp/qlist.h"
22
[ASPEED_DEV_RTC] = 0x12C0F000,
54
+#include "qemu/log.h"
23
+ [ASPEED_DEV_SDHCI] = 0x14080000,
55
24
};
56
static const hwaddr aspeed_soc_ast2700_memmap[] = {
25
57
[ASPEED_DEV_SPI_BOOT] = 0x400000000,
26
#define AST2700_MAX_IRQ 256
58
@@ -XXX,XX +XXX,XX @@ static qemu_irq aspeed_soc_ast2700_get_irq(AspeedSoCState *s, int dev)
27
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_irqmap[] = {
59
return qdev_get_gpio_in(DEVICE(&a->gic), sc->irqmap[dev]);
28
[ASPEED_DEV_KCS] = 128,
29
[ASPEED_DEV_DP] = 28,
30
[ASPEED_DEV_I3C] = 131,
31
+ [ASPEED_DEV_SDHCI] = 133,
32
};
33
34
/* GICINT 128 */
35
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_gic132_intcmap[] = {
36
37
/* GICINT 133 */
38
static const int aspeed_soc_ast2700_gic133_intcmap[] = {
39
+ [ASPEED_DEV_SDHCI] = 1,
40
[ASPEED_DEV_PECI] = 4,
41
};
42
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
44
object_initialize_child(obj, "gpio", &s->gpio, typename);
45
46
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
47
+
48
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
49
+ object_initialize_child(obj, "sd-controller", &s->sdhci, typename);
50
+ object_property_set_int(OBJECT(&s->sdhci), "num-slots", 1, &error_abort);
51
+
52
+ /* Init sd card slot class here so that they're under the correct parent */
53
+ object_initialize_child(obj, "sd-controller.sdhci",
54
+ &s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
60
}
55
}
61
56
62
+static uint64_t aspeed_ram_capacity_read(void *opaque, hwaddr addr,
57
/*
63
+ unsigned int size)
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
64
+{
59
sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0,
65
+ qemu_log_mask(LOG_GUEST_ERROR,
60
aspeed_soc_get_irq(s, ASPEED_DEV_RTC));
66
+ "%s: DRAM read out of ram size, addr:0x%" PRIx64 "\n",
61
67
+ __func__, addr);
62
+ /* SDHCI */
68
+ return 0;
63
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
69
+}
64
+ return;
65
+ }
66
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sdhci), 0,
67
+ sc->memmap[ASPEED_DEV_SDHCI]);
68
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
69
+ aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
70
+
70
+
71
+static void aspeed_ram_capacity_write(void *opaque, hwaddr addr, uint64_t data,
71
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
72
+ unsigned int size)
72
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
73
+{
73
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
74
+ AspeedSoCState *s = ASPEED_SOC(opaque);
75
+ ram_addr_t ram_size;
76
+ MemTxResult result;
77
+
78
+ ram_size = object_property_get_uint(OBJECT(&s->sdmc), "ram-size",
79
+ &error_abort);
80
+
81
+ /*
82
+ * Emulate ddr capacity hardware behavior.
83
+ * If writes the data to the address which is beyond the ram size,
84
+ * it would write the data to the "address % ram_size".
85
+ */
86
+ result = address_space_write(&s->dram_as, addr % ram_size,
87
+ MEMTXATTRS_UNSPECIFIED, &data, 4);
88
+ if (result != MEMTX_OK) {
89
+ qemu_log_mask(LOG_GUEST_ERROR,
90
+ "%s: DRAM write failed, addr:0x%" HWADDR_PRIx
91
+ ", data :0x%" PRIx64 "\n",
92
+ __func__, addr % ram_size, data);
93
+ }
94
+}
95
+
96
+static const MemoryRegionOps aspeed_ram_capacity_ops = {
97
+ .read = aspeed_ram_capacity_read,
98
+ .write = aspeed_ram_capacity_write,
99
+ .endianness = DEVICE_LITTLE_ENDIAN,
100
+ .valid = {
101
+ .min_access_size = 1,
102
+ .max_access_size = 8,
103
+ },
104
+};
105
+
106
+/*
107
+ * SDMC should be realized first to get correct RAM size and max size
108
+ * values
109
+ */
110
+static bool aspeed_soc_ast2700_dram_init(DeviceState *dev, Error **errp)
111
+{
112
+ ram_addr_t ram_size, max_ram_size;
113
+ Aspeed27x0SoCState *a = ASPEED27X0_SOC(dev);
114
+ AspeedSoCState *s = ASPEED_SOC(dev);
115
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
116
+
117
+ ram_size = object_property_get_uint(OBJECT(&s->sdmc), "ram-size",
118
+ &error_abort);
119
+ max_ram_size = object_property_get_uint(OBJECT(&s->sdmc), "max-ram-size",
120
+ &error_abort);
121
+
122
+ memory_region_init(&s->dram_container, OBJECT(s), "ram-container",
123
+ ram_size);
124
+ memory_region_add_subregion(&s->dram_container, 0, s->dram_mr);
125
+ address_space_init(&s->dram_as, s->dram_mr, "dram");
126
+
127
+ /*
128
+ * Add a memory region beyond the RAM region to emulate
129
+ * ddr capacity hardware behavior.
130
+ */
131
+ if (ram_size < max_ram_size) {
132
+ memory_region_init_io(&a->dram_empty, OBJECT(s),
133
+ &aspeed_ram_capacity_ops, s,
134
+ "ram-empty", max_ram_size - ram_size);
135
+
136
+ memory_region_add_subregion(s->memory,
137
+ sc->memmap[ASPEED_DEV_SDRAM] + ram_size,
138
+ &a->dram_empty);
139
+ }
140
+
141
+ memory_region_add_subregion(s->memory,
142
+ sc->memmap[ASPEED_DEV_SDRAM], &s->dram_container);
143
+ return true;
144
+}
145
+
146
static void aspeed_soc_ast2700_init(Object *obj)
147
{
148
Aspeed27x0SoCState *a = ASPEED27X0_SOC(obj);
149
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
150
sc->memmap[ASPEED_DEV_SDMC]);
151
152
/* RAM */
153
- if (!aspeed_soc_dram_init(s, errp)) {
154
+ if (!aspeed_soc_ast2700_dram_init(dev, errp)) {
155
return;
156
}
157
158
--
74
--
159
2.45.2
75
2.47.1
160
76
161
77
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST2700 have two SCU controllers which are SCU and SCUIO.
3
Add SDHCI model for AST2700 eMMC support. The eMMC controller only support 1
4
Both SCU and SCUIO registers are not compatible previous SOCs
4
slot and registers base address is start at 0x1209_0000 and its interrupt is
5
, introduces new registers and adds ast2700 scu, sucio class init handler.
5
connected to GICINT 15.
6
6
7
The pclk divider selection of SCUIO is defined in SCUIO280[20:18] and
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
the pclk divider selection of SCU is defined in SCU280[25:23].
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Both of them are not compatible AST2600 SOCs, adds a get_apb_freq function
9
Link: https://lore.kernel.org/r/20241204084453.610660-7-jamin_lin@aspeedtech.com
10
and trace-event for AST2700 SCU and SCUIO.
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
11
---
12
hw/arm/aspeed_ast27x0.c | 15 +++++++++++++++
13
1 file changed, 15 insertions(+)
11
14
12
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
13
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
15
---
16
include/hw/misc/aspeed_scu.h | 47 +++++-
17
hw/misc/aspeed_scu.c | 306 ++++++++++++++++++++++++++++++++++-
18
hw/misc/trace-events | 4 +
19
3 files changed, 351 insertions(+), 6 deletions(-)
20
21
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
22
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/misc/aspeed_scu.h
17
--- a/hw/arm/aspeed_ast27x0.c
24
+++ b/include/hw/misc/aspeed_scu.h
18
+++ b/hw/arm/aspeed_ast27x0.c
25
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedSCUState, AspeedSCUClass, ASPEED_SCU)
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
26
#define TYPE_ASPEED_2400_SCU TYPE_ASPEED_SCU "-ast2400"
20
/* Init sd card slot class here so that they're under the correct parent */
27
#define TYPE_ASPEED_2500_SCU TYPE_ASPEED_SCU "-ast2500"
21
object_initialize_child(obj, "sd-controller.sdhci",
28
#define TYPE_ASPEED_2600_SCU TYPE_ASPEED_SCU "-ast2600"
22
&s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
29
+#define TYPE_ASPEED_2700_SCU TYPE_ASPEED_SCU "-ast2700"
30
+#define TYPE_ASPEED_2700_SCUIO TYPE_ASPEED_SCU "io" "-ast2700"
31
#define TYPE_ASPEED_1030_SCU TYPE_ASPEED_SCU "-ast1030"
32
33
#define ASPEED_SCU_NR_REGS (0x1A8 >> 2)
34
#define ASPEED_AST2600_SCU_NR_REGS (0xE20 >> 2)
35
+#define ASPEED_AST2700_SCU_NR_REGS (0xE20 >> 2)
36
37
struct AspeedSCUState {
38
/*< private >*/
39
@@ -XXX,XX +XXX,XX @@ struct AspeedSCUState {
40
/*< public >*/
41
MemoryRegion iomem;
42
43
- uint32_t regs[ASPEED_AST2600_SCU_NR_REGS];
44
+ uint32_t regs[ASPEED_AST2700_SCU_NR_REGS];
45
uint32_t silicon_rev;
46
uint32_t hw_strap1;
47
uint32_t hw_strap2;
48
@@ -XXX,XX +XXX,XX @@ struct AspeedSCUState {
49
#define AST2600_A3_SILICON_REV 0x05030303U
50
#define AST1030_A0_SILICON_REV 0x80000000U
51
#define AST1030_A1_SILICON_REV 0x80010000U
52
+#define AST2700_A0_SILICON_REV 0x06000103U
53
+#define AST2720_A0_SILICON_REV 0x06000203U
54
+#define AST2750_A0_SILICON_REV 0x06000003U
55
56
#define ASPEED_IS_AST2500(si_rev) ((((si_rev) >> 24) & 0xff) == 0x04)
57
58
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
59
* 1. 2012/12/29 Ryan Chen Create
60
*/
61
62
-/* SCU08 Clock Selection Register
63
+/*
64
+ * SCU08 Clock Selection Register
65
*
66
* 31 Enable Video Engine clock dynamic slow down
67
* 30:28 Video Engine clock slow down setting
68
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
69
*/
70
#define SCU_CLK_GET_PCLK_DIV(x) (((x) >> 23) & 0x7)
71
72
-/* SCU24 H-PLL Parameter Register (for Aspeed AST2400 SOC)
73
+/*
74
+ * SCU24 H-PLL Parameter Register (for Aspeed AST2400 SOC)
75
*
76
* 18 H-PLL parameter selection
77
* 0: Select H-PLL by strapping resistors
78
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
79
#define SCU_AST2400_H_PLL_BYPASS_EN (0x1 << 17)
80
#define SCU_AST2400_H_PLL_OFF (0x1 << 16)
81
82
-/* SCU24 H-PLL Parameter Register (for Aspeed AST2500 SOC)
83
+/*
84
+ * SCU24 H-PLL Parameter Register (for Aspeed AST2500 SOC)
85
*
86
* 21 Enable H-PLL reset
87
* 20 Enable H-PLL bypass mode
88
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
89
#define SCU_H_PLL_BYPASS_EN (0x1 << 20)
90
#define SCU_H_PLL_OFF (0x1 << 19)
91
92
-/* SCU70 Hardware Strapping Register definition (for Aspeed AST2400 SOC)
93
+/*
94
+ * SCU70 Hardware Strapping Register definition (for Aspeed AST2400 SOC)
95
*
96
* 31:29 Software defined strapping registers
97
* 28:27 DRAM size setting (for VGA driver use)
98
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
99
*/
100
#define SCU_AST1030_CLK_GET_PCLK_DIV(x) (((x) >> 8) & 0xf)
101
102
+/*
103
+ * SCU280 Clock Selection 1 Register (for Aspeed AST2700 SCUIO)
104
+ *
105
+ * 31:29 MHCLK_DIV
106
+ * 28 Reserved
107
+ * 27:25 RGMIICLK_DIV
108
+ * 24 Reserved
109
+ * 23:21 RMIICLK_DIV
110
+ * 20:18 PCLK_DIV
111
+ * 17:14 SDCLK_DIV
112
+ * 13 SDCLK_SEL
113
+ * 12 UART13CLK_SEL
114
+ * 11 UART12CLK_SEL
115
+ * 10 UART11CLK_SEL
116
+ * 9 UART10CLK_SEL
117
+ * 8 UART9CLK_SEL
118
+ * 7 UART8CLK_SEL
119
+ * 6 UART7CLK_SEL
120
+ * 5 UART6CLK_SEL
121
+ * 4 UARTDBCLK_SEL
122
+ * 3 UART4CLK_SEL
123
+ * 2 UART3CLK_SEL
124
+ * 1 UART2CLK_SEL
125
+ * 0 UART1CLK_SEL
126
+ */
127
+#define SCUIO_AST2700_CLK_GET_PCLK_DIV(x) (((x) >> 18) & 0x7)
128
+
23
+
129
#endif /* ASPEED_SCU_H */
24
+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
130
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
25
+ object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
131
index XXXXXXX..XXXXXXX 100644
132
--- a/hw/misc/aspeed_scu.c
133
+++ b/hw/misc/aspeed_scu.c
134
@@ -XXX,XX +XXX,XX @@
135
136
#define AST2600_CLK TO_REG(0x40)
137
138
+#define AST2700_SILICON_REV TO_REG(0x00)
139
+#define AST2700_HW_STRAP1 TO_REG(0x10)
140
+#define AST2700_HW_STRAP1_CLR TO_REG(0x14)
141
+#define AST2700_HW_STRAP1_LOCK TO_REG(0x20)
142
+#define AST2700_HW_STRAP1_SEC1 TO_REG(0x24)
143
+#define AST2700_HW_STRAP1_SEC2 TO_REG(0x28)
144
+#define AST2700_HW_STRAP1_SEC3 TO_REG(0x2C)
145
+
26
+
146
+#define AST2700_SCU_CLK_SEL_1 TO_REG(0x280)
27
+ object_initialize_child(obj, "emmc-controller.sdhci", &s->emmc.slots[0],
147
+#define AST2700_SCU_HPLL_PARAM TO_REG(0x300)
28
+ TYPE_SYSBUS_SDHCI);
148
+#define AST2700_SCU_HPLL_EXT_PARAM TO_REG(0x304)
149
+#define AST2700_SCU_DPLL_PARAM TO_REG(0x308)
150
+#define AST2700_SCU_DPLL_EXT_PARAM TO_REG(0x30c)
151
+#define AST2700_SCU_MPLL_PARAM TO_REG(0x310)
152
+#define AST2700_SCU_MPLL_EXT_PARAM TO_REG(0x314)
153
+#define AST2700_SCU_D1CLK_PARAM TO_REG(0x320)
154
+#define AST2700_SCU_D2CLK_PARAM TO_REG(0x330)
155
+#define AST2700_SCU_CRT1CLK_PARAM TO_REG(0x340)
156
+#define AST2700_SCU_CRT2CLK_PARAM TO_REG(0x350)
157
+#define AST2700_SCU_MPHYCLK_PARAM TO_REG(0x360)
158
+#define AST2700_SCU_FREQ_CNTR TO_REG(0x3b0)
159
+#define AST2700_SCU_CPU_SCRATCH_0 TO_REG(0x780)
160
+#define AST2700_SCU_CPU_SCRATCH_1 TO_REG(0x784)
161
+
162
+#define AST2700_SCUIO_CLK_STOP_CTL_1 TO_REG(0x240)
163
+#define AST2700_SCUIO_CLK_STOP_CLR_1 TO_REG(0x244)
164
+#define AST2700_SCUIO_CLK_STOP_CTL_2 TO_REG(0x260)
165
+#define AST2700_SCUIO_CLK_STOP_CLR_2 TO_REG(0x264)
166
+#define AST2700_SCUIO_CLK_SEL_1 TO_REG(0x280)
167
+#define AST2700_SCUIO_CLK_SEL_2 TO_REG(0x284)
168
+#define AST2700_SCUIO_HPLL_PARAM TO_REG(0x300)
169
+#define AST2700_SCUIO_HPLL_EXT_PARAM TO_REG(0x304)
170
+#define AST2700_SCUIO_APLL_PARAM TO_REG(0x310)
171
+#define AST2700_SCUIO_APLL_EXT_PARAM TO_REG(0x314)
172
+#define AST2700_SCUIO_DPLL_PARAM TO_REG(0x320)
173
+#define AST2700_SCUIO_DPLL_EXT_PARAM TO_REG(0x324)
174
+#define AST2700_SCUIO_DPLL_PARAM_READ TO_REG(0x328)
175
+#define AST2700_SCUIO_DPLL_EXT_PARAM_READ TO_REG(0x32c)
176
+#define AST2700_SCUIO_UARTCLK_GEN TO_REG(0x330)
177
+#define AST2700_SCUIO_HUARTCLK_GEN TO_REG(0x334)
178
+#define AST2700_SCUIO_CLK_DUTY_MEAS_RST TO_REG(0x388)
179
+
180
#define SCU_IO_REGION_SIZE 0x1000
181
182
static const uint32_t ast2400_a0_resets[ASPEED_SCU_NR_REGS] = {
183
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_1030_scu_get_apb_freq(AspeedSCUState *s)
184
/ asc->apb_divider;
185
}
29
}
186
30
187
+static uint32_t aspeed_2700_scu_get_apb_freq(AspeedSCUState *s)
31
/*
188
+{
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
189
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
33
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
190
+ uint32_t hpll = asc->calc_hpll(s, s->regs[AST2700_SCU_HPLL_PARAM]);
34
aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
191
+
35
192
+ return hpll / (SCU_CLK_GET_PCLK_DIV(s->regs[AST2700_SCU_CLK_SEL_1]) + 1)
36
+ /* eMMC */
193
+ / asc->apb_divider;
37
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
194
+}
195
+
196
+static uint32_t aspeed_2700_scuio_get_apb_freq(AspeedSCUState *s)
197
+{
198
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
199
+ uint32_t hpll = asc->calc_hpll(s, s->regs[AST2700_SCUIO_HPLL_PARAM]);
200
+
201
+ return hpll /
202
+ (SCUIO_AST2700_CLK_GET_PCLK_DIV(s->regs[AST2700_SCUIO_CLK_SEL_1]) + 1)
203
+ / asc->apb_divider;
204
+}
205
+
206
static uint64_t aspeed_scu_read(void *opaque, hwaddr offset, unsigned size)
207
{
208
AspeedSCUState *s = ASPEED_SCU(opaque);
209
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_scu_read(void *opaque, hwaddr offset, unsigned size)
210
211
switch (reg) {
212
case RNG_DATA:
213
- /* On hardware, RNG_DATA works regardless of
214
+ /*
215
+ * On hardware, RNG_DATA works regardless of
216
* the state of the enable bit in RNG_CTRL
217
*/
218
s->regs[RNG_DATA] = aspeed_scu_get_random();
219
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_silicon_revs[] = {
220
AST2600_A3_SILICON_REV,
221
AST1030_A0_SILICON_REV,
222
AST1030_A1_SILICON_REV,
223
+ AST2700_A0_SILICON_REV,
224
+ AST2720_A0_SILICON_REV,
225
+ AST2750_A0_SILICON_REV,
226
};
227
228
bool is_supported_silicon_rev(uint32_t silicon_rev)
229
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_scu_info = {
230
.class_init = aspeed_2600_scu_class_init,
231
};
232
233
+static uint64_t aspeed_ast2700_scu_read(void *opaque, hwaddr offset,
234
+ unsigned size)
235
+{
236
+ AspeedSCUState *s = ASPEED_SCU(opaque);
237
+ int reg = TO_REG(offset);
238
+
239
+ if (reg >= ASPEED_AST2700_SCU_NR_REGS) {
240
+ qemu_log_mask(LOG_GUEST_ERROR,
241
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
242
+ __func__, offset);
243
+ return 0;
244
+ }
245
+
246
+ switch (reg) {
247
+ default:
248
+ qemu_log_mask(LOG_GUEST_ERROR,
249
+ "%s: Unhandled read at offset 0x%" HWADDR_PRIx "\n",
250
+ __func__, offset);
251
+ }
252
+
253
+ trace_aspeed_ast2700_scu_read(offset, size, s->regs[reg]);
254
+ return s->regs[reg];
255
+}
256
+
257
+static void aspeed_ast2700_scu_write(void *opaque, hwaddr offset,
258
+ uint64_t data64, unsigned size)
259
+{
260
+ AspeedSCUState *s = ASPEED_SCU(opaque);
261
+ int reg = TO_REG(offset);
262
+ /* Truncate here so bitwise operations below behave as expected */
263
+ uint32_t data = data64;
264
+
265
+ if (reg >= ASPEED_AST2700_SCU_NR_REGS) {
266
+ qemu_log_mask(LOG_GUEST_ERROR,
267
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
268
+ __func__, offset);
269
+ return;
38
+ return;
270
+ }
39
+ }
40
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->emmc), 0,
41
+ sc->memmap[ASPEED_DEV_EMMC]);
42
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->emmc), 0,
43
+ aspeed_soc_get_irq(s, ASPEED_DEV_EMMC));
271
+
44
+
272
+ trace_aspeed_ast2700_scu_write(offset, size, data);
45
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
273
+
46
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
274
+ switch (reg) {
47
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
275
+ default:
276
+ qemu_log_mask(LOG_GUEST_ERROR,
277
+ "%s: Unhandeled write at offset 0x%" HWADDR_PRIx "\n",
278
+ __func__, offset);
279
+ break;
280
+ }
281
+
282
+ s->regs[reg] = data;
283
+}
284
+
285
+static const MemoryRegionOps aspeed_ast2700_scu_ops = {
286
+ .read = aspeed_ast2700_scu_read,
287
+ .write = aspeed_ast2700_scu_write,
288
+ .endianness = DEVICE_LITTLE_ENDIAN,
289
+ .valid.min_access_size = 1,
290
+ .valid.max_access_size = 8,
291
+ .valid.unaligned = false,
292
+};
293
+
294
+static const uint32_t ast2700_a0_resets[ASPEED_AST2700_SCU_NR_REGS] = {
295
+ [AST2700_SILICON_REV] = AST2700_A0_SILICON_REV,
296
+ [AST2700_HW_STRAP1] = 0x00000800,
297
+ [AST2700_HW_STRAP1_CLR] = 0xFFF0FFF0,
298
+ [AST2700_HW_STRAP1_LOCK] = 0x00000FFF,
299
+ [AST2700_HW_STRAP1_SEC1] = 0x000000FF,
300
+ [AST2700_HW_STRAP1_SEC2] = 0x00000000,
301
+ [AST2700_HW_STRAP1_SEC3] = 0x1000408F,
302
+ [AST2700_SCU_HPLL_PARAM] = 0x0000009f,
303
+ [AST2700_SCU_HPLL_EXT_PARAM] = 0x8000004f,
304
+ [AST2700_SCU_DPLL_PARAM] = 0x0080009f,
305
+ [AST2700_SCU_DPLL_EXT_PARAM] = 0x8000004f,
306
+ [AST2700_SCU_MPLL_PARAM] = 0x00000040,
307
+ [AST2700_SCU_MPLL_EXT_PARAM] = 0x80000000,
308
+ [AST2700_SCU_D1CLK_PARAM] = 0x00050002,
309
+ [AST2700_SCU_D2CLK_PARAM] = 0x00050002,
310
+ [AST2700_SCU_CRT1CLK_PARAM] = 0x00050002,
311
+ [AST2700_SCU_CRT2CLK_PARAM] = 0x00050002,
312
+ [AST2700_SCU_MPHYCLK_PARAM] = 0x0000004c,
313
+ [AST2700_SCU_FREQ_CNTR] = 0x000375eb,
314
+ [AST2700_SCU_CPU_SCRATCH_0] = 0x00000000,
315
+ [AST2700_SCU_CPU_SCRATCH_1] = 0x00000004,
316
+};
317
+
318
+static void aspeed_ast2700_scu_reset(DeviceState *dev)
319
+{
320
+ AspeedSCUState *s = ASPEED_SCU(dev);
321
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(dev);
322
+
323
+ memcpy(s->regs, asc->resets, asc->nr_regs * 4);
324
+}
325
+
326
+static void aspeed_2700_scu_class_init(ObjectClass *klass, void *data)
327
+{
328
+ DeviceClass *dc = DEVICE_CLASS(klass);
329
+ AspeedSCUClass *asc = ASPEED_SCU_CLASS(klass);
330
+
331
+ dc->desc = "ASPEED 2700 System Control Unit";
332
+ dc->reset = aspeed_ast2700_scu_reset;
333
+ asc->resets = ast2700_a0_resets;
334
+ asc->calc_hpll = aspeed_2600_scu_calc_hpll;
335
+ asc->get_apb = aspeed_2700_scu_get_apb_freq;
336
+ asc->apb_divider = 4;
337
+ asc->nr_regs = ASPEED_AST2700_SCU_NR_REGS;
338
+ asc->clkin_25Mhz = true;
339
+ asc->ops = &aspeed_ast2700_scu_ops;
340
+}
341
+
342
+static uint64_t aspeed_ast2700_scuio_read(void *opaque, hwaddr offset,
343
+ unsigned size)
344
+{
345
+ AspeedSCUState *s = ASPEED_SCU(opaque);
346
+ int reg = TO_REG(offset);
347
+ if (reg >= ASPEED_AST2700_SCU_NR_REGS) {
348
+ qemu_log_mask(LOG_GUEST_ERROR,
349
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
350
+ __func__, offset);
351
+ return 0;
352
+ }
353
+
354
+ switch (reg) {
355
+ default:
356
+ qemu_log_mask(LOG_GUEST_ERROR,
357
+ "%s: Unhandled read at offset 0x%" HWADDR_PRIx "\n",
358
+ __func__, offset);
359
+ }
360
+
361
+ trace_aspeed_ast2700_scuio_read(offset, size, s->regs[reg]);
362
+ return s->regs[reg];
363
+}
364
+
365
+static void aspeed_ast2700_scuio_write(void *opaque, hwaddr offset,
366
+ uint64_t data64, unsigned size)
367
+{
368
+ AspeedSCUState *s = ASPEED_SCU(opaque);
369
+ int reg = TO_REG(offset);
370
+ /* Truncate here so bitwise operations below behave as expected */
371
+ uint32_t data = data64;
372
+ bool updated = false;
373
+
374
+ if (reg >= ASPEED_AST2700_SCU_NR_REGS) {
375
+ qemu_log_mask(LOG_GUEST_ERROR,
376
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
377
+ __func__, offset);
378
+ return;
379
+ }
380
+
381
+ trace_aspeed_ast2700_scuio_write(offset, size, data);
382
+
383
+ switch (reg) {
384
+ case AST2700_SCUIO_CLK_STOP_CTL_1:
385
+ case AST2700_SCUIO_CLK_STOP_CTL_2:
386
+ s->regs[reg] |= data;
387
+ updated = true;
388
+ break;
389
+ case AST2700_SCUIO_CLK_STOP_CLR_1:
390
+ case AST2700_SCUIO_CLK_STOP_CLR_2:
391
+ s->regs[reg - 1] ^= data;
392
+ updated = true;
393
+ break;
394
+ default:
395
+ qemu_log_mask(LOG_GUEST_ERROR,
396
+ "%s: Unhandeled write at offset 0x%" HWADDR_PRIx "\n",
397
+ __func__, offset);
398
+ break;
399
+ }
400
+
401
+ if (!updated) {
402
+ s->regs[reg] = data;
403
+ }
404
+}
405
+
406
+static const MemoryRegionOps aspeed_ast2700_scuio_ops = {
407
+ .read = aspeed_ast2700_scuio_read,
408
+ .write = aspeed_ast2700_scuio_write,
409
+ .endianness = DEVICE_LITTLE_ENDIAN,
410
+ .valid.min_access_size = 1,
411
+ .valid.max_access_size = 8,
412
+ .valid.unaligned = false,
413
+};
414
+
415
+static const uint32_t ast2700_a0_resets_io[ASPEED_AST2700_SCU_NR_REGS] = {
416
+ [AST2700_SILICON_REV] = 0x06000003,
417
+ [AST2700_HW_STRAP1] = 0x00000504,
418
+ [AST2700_HW_STRAP1_CLR] = 0xFFF0FFF0,
419
+ [AST2700_HW_STRAP1_LOCK] = 0x00000FFF,
420
+ [AST2700_HW_STRAP1_SEC1] = 0x000000FF,
421
+ [AST2700_HW_STRAP1_SEC2] = 0x00000000,
422
+ [AST2700_HW_STRAP1_SEC3] = 0x1000408F,
423
+ [AST2700_SCUIO_CLK_STOP_CTL_1] = 0xffff8400,
424
+ [AST2700_SCUIO_CLK_STOP_CTL_2] = 0x00005f30,
425
+ [AST2700_SCUIO_CLK_SEL_1] = 0x86900000,
426
+ [AST2700_SCUIO_CLK_SEL_2] = 0x00400000,
427
+ [AST2700_SCUIO_HPLL_PARAM] = 0x10000027,
428
+ [AST2700_SCUIO_HPLL_EXT_PARAM] = 0x80000014,
429
+ [AST2700_SCUIO_APLL_PARAM] = 0x1000001f,
430
+ [AST2700_SCUIO_APLL_EXT_PARAM] = 0x8000000f,
431
+ [AST2700_SCUIO_DPLL_PARAM] = 0x106e42ce,
432
+ [AST2700_SCUIO_DPLL_EXT_PARAM] = 0x80000167,
433
+ [AST2700_SCUIO_DPLL_PARAM_READ] = 0x106e42ce,
434
+ [AST2700_SCUIO_DPLL_EXT_PARAM_READ] = 0x80000167,
435
+ [AST2700_SCUIO_UARTCLK_GEN] = 0x00014506,
436
+ [AST2700_SCUIO_HUARTCLK_GEN] = 0x000145c0,
437
+ [AST2700_SCUIO_CLK_DUTY_MEAS_RST] = 0x0c9100d2,
438
+};
439
+
440
+static void aspeed_2700_scuio_class_init(ObjectClass *klass, void *data)
441
+{
442
+ DeviceClass *dc = DEVICE_CLASS(klass);
443
+ AspeedSCUClass *asc = ASPEED_SCU_CLASS(klass);
444
+
445
+ dc->desc = "ASPEED 2700 System Control Unit I/O";
446
+ dc->reset = aspeed_ast2700_scu_reset;
447
+ asc->resets = ast2700_a0_resets_io;
448
+ asc->calc_hpll = aspeed_2600_scu_calc_hpll;
449
+ asc->get_apb = aspeed_2700_scuio_get_apb_freq;
450
+ asc->apb_divider = 2;
451
+ asc->nr_regs = ASPEED_AST2700_SCU_NR_REGS;
452
+ asc->clkin_25Mhz = true;
453
+ asc->ops = &aspeed_ast2700_scuio_ops;
454
+}
455
+
456
+static const TypeInfo aspeed_2700_scu_info = {
457
+ .name = TYPE_ASPEED_2700_SCU,
458
+ .parent = TYPE_ASPEED_SCU,
459
+ .instance_size = sizeof(AspeedSCUState),
460
+ .class_init = aspeed_2700_scu_class_init,
461
+};
462
+
463
+static const TypeInfo aspeed_2700_scuio_info = {
464
+ .name = TYPE_ASPEED_2700_SCUIO,
465
+ .parent = TYPE_ASPEED_SCU,
466
+ .instance_size = sizeof(AspeedSCUState),
467
+ .class_init = aspeed_2700_scuio_class_init,
468
+};
469
+
470
static const uint32_t ast1030_a1_resets[ASPEED_AST2600_SCU_NR_REGS] = {
471
[AST2600_SYS_RST_CTRL] = 0xFFC3FED8,
472
[AST2600_SYS_RST_CTRL2] = 0x09FFFFFC,
473
@@ -XXX,XX +XXX,XX @@ static void aspeed_scu_register_types(void)
474
type_register_static(&aspeed_2500_scu_info);
475
type_register_static(&aspeed_2600_scu_info);
476
type_register_static(&aspeed_1030_scu_info);
477
+ type_register_static(&aspeed_2700_scu_info);
478
+ type_register_static(&aspeed_2700_scuio_info);
479
}
480
481
type_init(aspeed_scu_register_types);
482
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
483
index XXXXXXX..XXXXXXX 100644
484
--- a/hw/misc/trace-events
485
+++ b/hw/misc/trace-events
486
@@ -XXX,XX +XXX,XX @@ slavio_led_mem_readw(uint32_t ret) "Read diagnostic LED 0x%04x"
487
# aspeed_scu.c
488
aspeed_scu_write(uint64_t offset, unsigned size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
489
aspeed_scu_read(uint64_t offset, unsigned size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
490
+aspeed_ast2700_scu_write(uint64_t offset, unsigned size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
491
+aspeed_ast2700_scu_read(uint64_t offset, unsigned size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
492
+aspeed_ast2700_scuio_write(uint64_t offset, unsigned size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
493
+aspeed_ast2700_scuio_read(uint64_t offset, unsigned size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
494
495
# mps2-scc.c
496
mps2_scc_read(uint64_t offset, uint64_t data, unsigned size) "MPS2 SCC read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
497
--
48
--
498
2.45.2
49
2.47.1
499
50
500
51
diff view generated by jsdifflib
New patch
1
This simply moves the ast1030 tests to a new test file. No changes.
1
2
3
Reviewed-by: Thomas Huth <thuth@redhat.com>
4
Link: https://lore.kernel.org/r/20241206131132.520911-2-clg@redhat.com
5
Signed-off-by: Cédric Le Goater <clg@redhat.com>
6
---
7
tests/functional/meson.build | 1 +
8
tests/functional/test_arm_aspeed.py | 64 ----------------
9
tests/functional/test_arm_aspeed_ast1030.py | 81 +++++++++++++++++++++
10
3 files changed, 82 insertions(+), 64 deletions(-)
11
create mode 100644 tests/functional/test_arm_aspeed_ast1030.py
12
13
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
14
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/functional/meson.build
16
+++ b/tests/functional/meson.build
17
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
18
19
tests_arm_system_thorough = [
20
'arm_aspeed',
21
+ 'arm_aspeed_ast1030',
22
'arm_bpim2u',
23
'arm_canona1100',
24
'arm_collie',
25
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
26
index XXXXXXX..XXXXXXX 100755
27
--- a/tests/functional/test_arm_aspeed.py
28
+++ b/tests/functional/test_arm_aspeed.py
29
@@ -XXX,XX +XXX,XX @@
30
from zipfile import ZipFile
31
from unittest import skipUnless
32
33
-class AST1030Machine(LinuxKernelTest):
34
-
35
- ASSET_ZEPHYR_1_04 = Asset(
36
- ('https://github.com/AspeedTech-BMC'
37
- '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip'),
38
- '4ac6210adcbc61294927918707c6762483fd844dde5e07f3ba834ad1f91434d3')
39
-
40
- def test_ast1030_zephyros_1_04(self):
41
- self.set_machine('ast1030-evb')
42
-
43
- zip_file = self.ASSET_ZEPHYR_1_04.fetch()
44
-
45
- kernel_name = "ast1030-evb-demo/zephyr.elf"
46
- with ZipFile(zip_file, 'r') as zf:
47
- zf.extract(kernel_name, path=self.workdir)
48
- kernel_file = os.path.join(self.workdir, kernel_name)
49
-
50
- self.vm.set_console()
51
- self.vm.add_args('-kernel', kernel_file, '-nographic')
52
- self.vm.launch()
53
- self.wait_for_console_pattern("Booting Zephyr OS")
54
- exec_command_and_wait_for_pattern(self, "help",
55
- "Available commands")
56
-
57
- ASSET_ZEPHYR_1_07 = Asset(
58
- ('https://github.com/AspeedTech-BMC'
59
- '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip'),
60
- 'ad52e27959746988afaed8429bf4e12ab988c05c4d07c9d90e13ec6f7be4574c')
61
-
62
- def test_ast1030_zephyros_1_07(self):
63
- self.set_machine('ast1030-evb')
64
-
65
- zip_file = self.ASSET_ZEPHYR_1_07.fetch()
66
-
67
- kernel_name = "ast1030-evb-demo/zephyr.bin"
68
- with ZipFile(zip_file, 'r') as zf:
69
- zf.extract(kernel_name, path=self.workdir)
70
- kernel_file = os.path.join(self.workdir, kernel_name)
71
-
72
- self.vm.set_console()
73
- self.vm.add_args('-kernel', kernel_file, '-nographic')
74
- self.vm.launch()
75
- self.wait_for_console_pattern("Booting Zephyr OS")
76
- for shell_cmd in [
77
- 'kernel stacks',
78
- 'otp info conf',
79
- 'otp info scu',
80
- 'hwinfo devid',
81
- 'crypto aes256_cbc_vault',
82
- 'random get',
83
- 'jtag JTAG1 sw_xfer high TMS',
84
- 'adc ADC0 resolution 12',
85
- 'adc ADC0 read 42',
86
- 'adc ADC1 read 69',
87
- 'i2c scan I2C_0',
88
- 'i3c attach I3C_0',
89
- 'hash test',
90
- 'kernel uptime',
91
- 'kernel reboot warm',
92
- 'kernel uptime',
93
- 'kernel reboot cold',
94
- 'kernel uptime',
95
- ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
96
-
97
class AST2x00Machine(LinuxKernelTest):
98
99
def do_test_arm_aspeed(self, machine, image):
100
diff --git a/tests/functional/test_arm_aspeed_ast1030.py b/tests/functional/test_arm_aspeed_ast1030.py
101
new file mode 100644
102
index XXXXXXX..XXXXXXX
103
--- /dev/null
104
+++ b/tests/functional/test_arm_aspeed_ast1030.py
105
@@ -XXX,XX +XXX,XX @@
106
+#!/usr/bin/env python3
107
+#
108
+# Functional test that boots the ASPEED SoCs with firmware
109
+#
110
+# Copyright (C) 2022 ASPEED Technology Inc
111
+#
112
+# SPDX-License-Identifier: GPL-2.0-or-later
113
+
114
+import os
115
+
116
+from qemu_test import LinuxKernelTest, Asset
117
+from qemu_test import exec_command_and_wait_for_pattern
118
+from zipfile import ZipFile
119
+
120
+class AST1030Machine(LinuxKernelTest):
121
+
122
+ ASSET_ZEPHYR_1_04 = Asset(
123
+ ('https://github.com/AspeedTech-BMC'
124
+ '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip'),
125
+ '4ac6210adcbc61294927918707c6762483fd844dde5e07f3ba834ad1f91434d3')
126
+
127
+ def test_ast1030_zephyros_1_04(self):
128
+ self.set_machine('ast1030-evb')
129
+
130
+ zip_file = self.ASSET_ZEPHYR_1_04.fetch()
131
+
132
+ kernel_name = "ast1030-evb-demo/zephyr.elf"
133
+ with ZipFile(zip_file, 'r') as zf:
134
+ zf.extract(kernel_name, path=self.workdir)
135
+ kernel_file = os.path.join(self.workdir, kernel_name)
136
+
137
+ self.vm.set_console()
138
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
139
+ self.vm.launch()
140
+ self.wait_for_console_pattern("Booting Zephyr OS")
141
+ exec_command_and_wait_for_pattern(self, "help",
142
+ "Available commands")
143
+
144
+ ASSET_ZEPHYR_1_07 = Asset(
145
+ ('https://github.com/AspeedTech-BMC'
146
+ '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip'),
147
+ 'ad52e27959746988afaed8429bf4e12ab988c05c4d07c9d90e13ec6f7be4574c')
148
+
149
+ def test_ast1030_zephyros_1_07(self):
150
+ self.set_machine('ast1030-evb')
151
+
152
+ zip_file = self.ASSET_ZEPHYR_1_07.fetch()
153
+
154
+ kernel_name = "ast1030-evb-demo/zephyr.bin"
155
+ with ZipFile(zip_file, 'r') as zf:
156
+ zf.extract(kernel_name, path=self.workdir)
157
+ kernel_file = os.path.join(self.workdir, kernel_name)
158
+
159
+ self.vm.set_console()
160
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
161
+ self.vm.launch()
162
+ self.wait_for_console_pattern("Booting Zephyr OS")
163
+ for shell_cmd in [
164
+ 'kernel stacks',
165
+ 'otp info conf',
166
+ 'otp info scu',
167
+ 'hwinfo devid',
168
+ 'crypto aes256_cbc_vault',
169
+ 'random get',
170
+ 'jtag JTAG1 sw_xfer high TMS',
171
+ 'adc ADC0 resolution 12',
172
+ 'adc ADC0 read 42',
173
+ 'adc ADC1 read 69',
174
+ 'i2c scan I2C_0',
175
+ 'i3c attach I3C_0',
176
+ 'hash test',
177
+ 'kernel uptime',
178
+ 'kernel reboot warm',
179
+ 'kernel uptime',
180
+ 'kernel reboot cold',
181
+ 'kernel uptime',
182
+ ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
183
+
184
+
185
+if __name__ == '__main__':
186
+ LinuxKernelTest.main()
187
--
188
2.47.1
189
190
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
This introduces a new aspeed module for sharing code between tests and
2
moves the palmetto test to a new test file. No changes in the test.
2
3
3
AST2700 SLI engine is designed to accelerate the
4
Reviewed-by: Thomas Huth <thuth@redhat.com>
4
throughput between cross-die connections.
5
Link: https://lore.kernel.org/r/20241206131132.520911-3-clg@redhat.com
5
It have CPU_SLI at CPU die and IO_SLI at IO die.
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
8
tests/functional/aspeed.py | 23 +++++++++++++++++++
9
tests/functional/meson.build | 2 ++
10
tests/functional/test_arm_aspeed.py | 10 --------
11
tests/functional/test_arm_aspeed_palmetto.py | 24 ++++++++++++++++++++
12
4 files changed, 49 insertions(+), 10 deletions(-)
13
create mode 100644 tests/functional/aspeed.py
14
create mode 100644 tests/functional/test_arm_aspeed_palmetto.py
6
15
7
Introduce dummy AST2700 SLI and SLIIO models.
16
diff --git a/tests/functional/aspeed.py b/tests/functional/aspeed.py
8
9
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
10
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
---
13
include/hw/misc/aspeed_sli.h | 27 ++++++
14
hw/misc/aspeed_sli.c | 177 +++++++++++++++++++++++++++++++++++
15
hw/misc/meson.build | 3 +-
16
hw/misc/trace-events | 7 ++
17
4 files changed, 213 insertions(+), 1 deletion(-)
18
create mode 100644 include/hw/misc/aspeed_sli.h
19
create mode 100644 hw/misc/aspeed_sli.c
20
21
diff --git a/include/hw/misc/aspeed_sli.h b/include/hw/misc/aspeed_sli.h
22
new file mode 100644
17
new file mode 100644
23
index XXXXXXX..XXXXXXX
18
index XXXXXXX..XXXXXXX
24
--- /dev/null
19
--- /dev/null
25
+++ b/include/hw/misc/aspeed_sli.h
20
+++ b/tests/functional/aspeed.py
26
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@
27
+/*
22
+# Test class to boot aspeed machines
28
+ * ASPEED SLI Controller
23
+#
29
+ *
24
+# SPDX-License-Identifier: GPL-2.0-or-later
30
+ * Copyright (C) 2024 ASPEED Technology Inc.
31
+ *
32
+ * SPDX-License-Identifier: GPL-2.0-or-later
33
+ */
34
+#ifndef ASPEED_SLI_H
35
+#define ASPEED_SLI_H
36
+
25
+
37
+#include "hw/sysbus.h"
26
+from qemu_test import LinuxKernelTest
38
+
27
+
39
+#define TYPE_ASPEED_SLI "aspeed.sli"
28
+class AspeedTest(LinuxKernelTest):
40
+#define TYPE_ASPEED_2700_SLI TYPE_ASPEED_SLI "-ast2700"
41
+#define TYPE_ASPEED_2700_SLIIO TYPE_ASPEED_SLI "io" "-ast2700"
42
+OBJECT_DECLARE_SIMPLE_TYPE(AspeedSLIState, ASPEED_SLI)
43
+
29
+
44
+#define ASPEED_SLI_NR_REGS (0x500 >> 2)
30
+ def do_test_arm_aspeed(self, machine, image):
31
+ self.set_machine(machine)
32
+ self.vm.set_console()
33
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
34
+ '-net', 'nic', '-snapshot')
35
+ self.vm.launch()
45
+
36
+
46
+struct AspeedSLIState {
37
+ self.wait_for_console_pattern("U-Boot 2016.07")
47
+ SysBusDevice parent;
38
+ self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
48
+ MemoryRegion iomem;
39
+ self.wait_for_console_pattern("Starting kernel ...")
49
+
40
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
50
+ uint32_t regs[ASPEED_SLI_NR_REGS];
41
+ self.wait_for_console_pattern(
51
+};
42
+ "aspeed-smc 1e620000.spi: read control register: 203b0641")
52
+
43
+ self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
53
+#endif /* ASPEED_SLI_H */
44
+ self.wait_for_console_pattern("systemd[1]: Set hostname to")
54
diff --git a/hw/misc/aspeed_sli.c b/hw/misc/aspeed_sli.c
45
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
46
index XXXXXXX..XXXXXXX 100644
47
--- a/tests/functional/meson.build
48
+++ b/tests/functional/meson.build
49
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
50
'aarch64_tuxrun' : 240,
51
'aarch64_virt' : 720,
52
'acpi_bits' : 420,
53
+ 'arm_aspeed_palmetto' : 120,
54
'arm_aspeed' : 600,
55
'arm_bpim2u' : 500,
56
'arm_collie' : 180,
57
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
58
tests_arm_system_thorough = [
59
'arm_aspeed',
60
'arm_aspeed_ast1030',
61
+ 'arm_aspeed_palmetto',
62
'arm_bpim2u',
63
'arm_canona1100',
64
'arm_collie',
65
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
66
index XXXXXXX..XXXXXXX 100755
67
--- a/tests/functional/test_arm_aspeed.py
68
+++ b/tests/functional/test_arm_aspeed.py
69
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed(self, machine, image):
70
self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
71
self.wait_for_console_pattern("systemd[1]: Set hostname to")
72
73
- ASSET_PALMETTO_FLASH = Asset(
74
- ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
75
- 'obmc-phosphor-image-palmetto.static.mtd'),
76
- '3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d');
77
-
78
- def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
79
- image_path = self.ASSET_PALMETTO_FLASH.fetch()
80
-
81
- self.do_test_arm_aspeed('palmetto-bmc', image_path)
82
-
83
ASSET_ROMULUS_FLASH = Asset(
84
('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
85
'obmc-phosphor-image-romulus.static.mtd'),
86
diff --git a/tests/functional/test_arm_aspeed_palmetto.py b/tests/functional/test_arm_aspeed_palmetto.py
55
new file mode 100644
87
new file mode 100644
56
index XXXXXXX..XXXXXXX
88
index XXXXXXX..XXXXXXX
57
--- /dev/null
89
--- /dev/null
58
+++ b/hw/misc/aspeed_sli.c
90
+++ b/tests/functional/test_arm_aspeed_palmetto.py
59
@@ -XXX,XX +XXX,XX @@
91
@@ -XXX,XX +XXX,XX @@
60
+/*
92
+#!/usr/bin/env python3
61
+ * ASPEED SLI Controller
93
+#
62
+ *
94
+# Functional test that boots the ASPEED machines
63
+ * Copyright (C) 2024 ASPEED Technology Inc.
95
+#
64
+ *
96
+# SPDX-License-Identifier: GPL-2.0-or-later
65
+ * SPDX-License-Identifier: GPL-2.0-or-later
66
+ */
67
+
97
+
68
+#include "qemu/osdep.h"
98
+from qemu_test import Asset
69
+#include "qemu/log.h"
99
+from aspeed import AspeedTest
70
+#include "qemu/error-report.h"
71
+#include "hw/qdev-properties.h"
72
+#include "hw/misc/aspeed_sli.h"
73
+#include "qapi/error.h"
74
+#include "migration/vmstate.h"
75
+#include "trace.h"
76
+
100
+
77
+#define SLI_REGION_SIZE 0x500
101
+class PalmettoMachine(AspeedTest):
78
+#define TO_REG(addr) ((addr) >> 2)
79
+
102
+
80
+static uint64_t aspeed_sli_read(void *opaque, hwaddr addr, unsigned int size)
103
+ ASSET_PALMETTO_FLASH = Asset(
81
+{
104
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
82
+ AspeedSLIState *s = ASPEED_SLI(opaque);
105
+ 'obmc-phosphor-image-palmetto.static.mtd'),
83
+ int reg = TO_REG(addr);
106
+ '3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d');
84
+
107
+
85
+ if (reg >= ARRAY_SIZE(s->regs)) {
108
+ def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
86
+ qemu_log_mask(LOG_GUEST_ERROR,
109
+ image_path = self.ASSET_PALMETTO_FLASH.fetch()
87
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
88
+ __func__, addr);
89
+ return 0;
90
+ }
91
+
110
+
92
+ trace_aspeed_sli_read(addr, size, s->regs[reg]);
111
+ self.do_test_arm_aspeed('palmetto-bmc', image_path)
93
+ return s->regs[reg];
94
+}
95
+
112
+
96
+static void aspeed_sli_write(void *opaque, hwaddr addr, uint64_t data,
97
+ unsigned int size)
98
+{
99
+ AspeedSLIState *s = ASPEED_SLI(opaque);
100
+ int reg = TO_REG(addr);
101
+
113
+
102
+ if (reg >= ARRAY_SIZE(s->regs)) {
114
+if __name__ == '__main__':
103
+ qemu_log_mask(LOG_GUEST_ERROR,
115
+ AspeedTest.main()
104
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
105
+ __func__, addr);
106
+ return;
107
+ }
108
+
109
+ trace_aspeed_sli_write(addr, size, data);
110
+ s->regs[reg] = data;
111
+}
112
+
113
+static uint64_t aspeed_sliio_read(void *opaque, hwaddr addr, unsigned int size)
114
+{
115
+ AspeedSLIState *s = ASPEED_SLI(opaque);
116
+ int reg = TO_REG(addr);
117
+
118
+ if (reg >= ARRAY_SIZE(s->regs)) {
119
+ qemu_log_mask(LOG_GUEST_ERROR,
120
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
121
+ __func__, addr);
122
+ return 0;
123
+ }
124
+
125
+ trace_aspeed_sliio_read(addr, size, s->regs[reg]);
126
+ return s->regs[reg];
127
+}
128
+
129
+static void aspeed_sliio_write(void *opaque, hwaddr addr, uint64_t data,
130
+ unsigned int size)
131
+{
132
+ AspeedSLIState *s = ASPEED_SLI(opaque);
133
+ int reg = TO_REG(addr);
134
+
135
+ if (reg >= ARRAY_SIZE(s->regs)) {
136
+ qemu_log_mask(LOG_GUEST_ERROR,
137
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
138
+ __func__, addr);
139
+ return;
140
+ }
141
+
142
+ trace_aspeed_sliio_write(addr, size, data);
143
+ s->regs[reg] = data;
144
+}
145
+
146
+static const MemoryRegionOps aspeed_sli_ops = {
147
+ .read = aspeed_sli_read,
148
+ .write = aspeed_sli_write,
149
+ .endianness = DEVICE_LITTLE_ENDIAN,
150
+ .valid = {
151
+ .min_access_size = 1,
152
+ .max_access_size = 4,
153
+ },
154
+};
155
+
156
+static const MemoryRegionOps aspeed_sliio_ops = {
157
+ .read = aspeed_sliio_read,
158
+ .write = aspeed_sliio_write,
159
+ .endianness = DEVICE_LITTLE_ENDIAN,
160
+ .valid = {
161
+ .min_access_size = 1,
162
+ .max_access_size = 4,
163
+ },
164
+};
165
+
166
+static void aspeed_sli_realize(DeviceState *dev, Error **errp)
167
+{
168
+ AspeedSLIState *s = ASPEED_SLI(dev);
169
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
170
+
171
+ memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sli_ops, s,
172
+ TYPE_ASPEED_SLI, SLI_REGION_SIZE);
173
+ sysbus_init_mmio(sbd, &s->iomem);
174
+}
175
+
176
+static void aspeed_sliio_realize(DeviceState *dev, Error **errp)
177
+{
178
+ AspeedSLIState *s = ASPEED_SLI(dev);
179
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
180
+
181
+ memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sliio_ops, s,
182
+ TYPE_ASPEED_SLI, SLI_REGION_SIZE);
183
+ sysbus_init_mmio(sbd, &s->iomem);
184
+}
185
+
186
+static void aspeed_sli_class_init(ObjectClass *klass, void *data)
187
+{
188
+ DeviceClass *dc = DEVICE_CLASS(klass);
189
+
190
+ dc->desc = "Aspeed SLI Controller";
191
+ dc->realize = aspeed_sli_realize;
192
+}
193
+
194
+static const TypeInfo aspeed_sli_info = {
195
+ .name = TYPE_ASPEED_SLI,
196
+ .parent = TYPE_SYS_BUS_DEVICE,
197
+ .instance_size = sizeof(AspeedSLIState),
198
+ .class_init = aspeed_sli_class_init,
199
+ .abstract = true,
200
+};
201
+
202
+static void aspeed_2700_sli_class_init(ObjectClass *klass, void *data)
203
+{
204
+ DeviceClass *dc = DEVICE_CLASS(klass);
205
+
206
+ dc->desc = "AST2700 SLI Controller";
207
+}
208
+
209
+static void aspeed_2700_sliio_class_init(ObjectClass *klass, void *data)
210
+{
211
+ DeviceClass *dc = DEVICE_CLASS(klass);
212
+
213
+ dc->desc = "AST2700 I/O SLI Controller";
214
+ dc->realize = aspeed_sliio_realize;
215
+}
216
+
217
+static const TypeInfo aspeed_2700_sli_info = {
218
+ .name = TYPE_ASPEED_2700_SLI,
219
+ .parent = TYPE_ASPEED_SLI,
220
+ .class_init = aspeed_2700_sli_class_init,
221
+};
222
+
223
+static const TypeInfo aspeed_2700_sliio_info = {
224
+ .name = TYPE_ASPEED_2700_SLIIO,
225
+ .parent = TYPE_ASPEED_SLI,
226
+ .class_init = aspeed_2700_sliio_class_init,
227
+};
228
+
229
+static void aspeed_sli_register_types(void)
230
+{
231
+ type_register_static(&aspeed_sli_info);
232
+ type_register_static(&aspeed_2700_sli_info);
233
+ type_register_static(&aspeed_2700_sliio_info);
234
+}
235
+
236
+type_init(aspeed_sli_register_types);
237
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
238
index XXXXXXX..XXXXXXX 100644
239
--- a/hw/misc/meson.build
240
+++ b/hw/misc/meson.build
241
@@ -XXX,XX +XXX,XX @@ system_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
242
'aspeed_sbc.c',
243
'aspeed_sdmc.c',
244
'aspeed_xdma.c',
245
- 'aspeed_peci.c'))
246
+ 'aspeed_peci.c',
247
+ 'aspeed_sli.c'))
248
249
system_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-sysreg.c'))
250
system_ss.add(when: 'CONFIG_NRF51_SOC', if_true: files('nrf51_rng.c'))
251
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
252
index XXXXXXX..XXXXXXX 100644
253
--- a/hw/misc/trace-events
254
+++ b/hw/misc/trace-events
255
@@ -XXX,XX +XXX,XX @@ djmemc_write(int reg, uint64_t value, unsigned int size) "reg=0x%x value=0x%"PRI
256
# iosb.c
257
iosb_read(int reg, uint64_t value, unsigned int size) "reg=0x%x value=0x%"PRIx64" size=%u"
258
iosb_write(int reg, uint64_t value, unsigned int size) "reg=0x%x value=0x%"PRIx64" size=%u"
259
+
260
+# aspeed_sli.c
261
+aspeed_sli_write(uint64_t offset, unsigned int size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
262
+aspeed_sli_read(uint64_t offset, unsigned int size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
263
+aspeed_sliio_write(uint64_t offset, unsigned int size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
264
+aspeed_sliio_read(uint64_t offset, unsigned int size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
265
+
266
--
116
--
267
2.45.2
117
2.47.1
268
118
269
119
diff view generated by jsdifflib
New patch
1
This simply moves the romulus-bmc test to a new test file. No changes
2
in the test. The do_test_arm_aspeed routine is removed from the
3
test_arm_aspeed.py file because it is now unused.
1
4
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
Link: https://lore.kernel.org/r/20241206131132.520911-4-clg@redhat.com
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
---
9
tests/functional/meson.build | 2 ++
10
tests/functional/test_arm_aspeed.py | 26 ---------------------
11
tests/functional/test_arm_aspeed_romulus.py | 24 +++++++++++++++++++
12
3 files changed, 26 insertions(+), 26 deletions(-)
13
create mode 100644 tests/functional/test_arm_aspeed_romulus.py
14
15
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/functional/meson.build
18
+++ b/tests/functional/meson.build
19
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
20
'aarch64_virt' : 720,
21
'acpi_bits' : 420,
22
'arm_aspeed_palmetto' : 120,
23
+ 'arm_aspeed_romulus' : 120,
24
'arm_aspeed' : 600,
25
'arm_bpim2u' : 500,
26
'arm_collie' : 180,
27
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
28
'arm_aspeed',
29
'arm_aspeed_ast1030',
30
'arm_aspeed_palmetto',
31
+ 'arm_aspeed_romulus',
32
'arm_bpim2u',
33
'arm_canona1100',
34
'arm_collie',
35
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
36
index XXXXXXX..XXXXXXX 100755
37
--- a/tests/functional/test_arm_aspeed.py
38
+++ b/tests/functional/test_arm_aspeed.py
39
@@ -XXX,XX +XXX,XX @@
40
41
class AST2x00Machine(LinuxKernelTest):
42
43
- def do_test_arm_aspeed(self, machine, image):
44
- self.set_machine(machine)
45
- self.vm.set_console()
46
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
47
- '-net', 'nic', '-snapshot')
48
- self.vm.launch()
49
-
50
- self.wait_for_console_pattern("U-Boot 2016.07")
51
- self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
52
- self.wait_for_console_pattern("Starting kernel ...")
53
- self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
54
- self.wait_for_console_pattern(
55
- "aspeed-smc 1e620000.spi: read control register: 203b0641")
56
- self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
57
- self.wait_for_console_pattern("systemd[1]: Set hostname to")
58
-
59
- ASSET_ROMULUS_FLASH = Asset(
60
- ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
61
- 'obmc-phosphor-image-romulus.static.mtd'),
62
- '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
63
-
64
- def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
65
- image_path = self.ASSET_ROMULUS_FLASH.fetch()
66
-
67
- self.do_test_arm_aspeed('romulus-bmc', image_path)
68
-
69
def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
70
self.require_netdev('user')
71
self.vm.set_console()
72
diff --git a/tests/functional/test_arm_aspeed_romulus.py b/tests/functional/test_arm_aspeed_romulus.py
73
new file mode 100644
74
index XXXXXXX..XXXXXXX
75
--- /dev/null
76
+++ b/tests/functional/test_arm_aspeed_romulus.py
77
@@ -XXX,XX +XXX,XX @@
78
+#!/usr/bin/env python3
79
+#
80
+# Functional test that boots the ASPEED machines
81
+#
82
+# SPDX-License-Identifier: GPL-2.0-or-later
83
+
84
+from qemu_test import Asset
85
+from aspeed import AspeedTest
86
+
87
+class RomulusMachine(AspeedTest):
88
+
89
+ ASSET_ROMULUS_FLASH = Asset(
90
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
91
+ 'obmc-phosphor-image-romulus.static.mtd'),
92
+ '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
93
+
94
+ def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
95
+ image_path = self.ASSET_ROMULUS_FLASH.fetch()
96
+
97
+ self.do_test_arm_aspeed('romulus-bmc', image_path)
98
+
99
+
100
+if __name__ == '__main__':
101
+ AspeedTest.main()
102
--
103
2.47.1
104
105
diff view generated by jsdifflib
New patch
1
1
This moves the ast2500-evb tests to a new test file and extends the
2
aspeed module with routines used to run the buildroot and sdk
3
tests. No changes in the test.
4
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
Link: https://lore.kernel.org/r/20241206131132.520911-5-clg@redhat.com
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
---
9
tests/functional/aspeed.py | 33 ++++++++++++
10
tests/functional/meson.build | 2 +
11
tests/functional/test_arm_aspeed.py | 44 ---------------
12
tests/functional/test_arm_aspeed_ast2500.py | 59 +++++++++++++++++++++
13
4 files changed, 94 insertions(+), 44 deletions(-)
14
create mode 100644 tests/functional/test_arm_aspeed_ast2500.py
15
16
diff --git a/tests/functional/aspeed.py b/tests/functional/aspeed.py
17
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/functional/aspeed.py
19
+++ b/tests/functional/aspeed.py
20
@@ -XXX,XX +XXX,XX @@
21
#
22
# SPDX-License-Identifier: GPL-2.0-or-later
23
24
+from qemu_test import exec_command_and_wait_for_pattern
25
from qemu_test import LinuxKernelTest
26
27
class AspeedTest(LinuxKernelTest):
28
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed(self, machine, image):
29
"aspeed-smc 1e620000.spi: read control register: 203b0641")
30
self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
31
self.wait_for_console_pattern("systemd[1]: Set hostname to")
32
+
33
+ def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
34
+ self.require_netdev('user')
35
+ self.vm.set_console()
36
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw,read-only=true',
37
+ '-net', 'nic', '-net', 'user')
38
+ self.vm.launch()
39
+
40
+ self.wait_for_console_pattern('U-Boot 2019.04')
41
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
42
+ self.wait_for_console_pattern('Starting kernel ...')
43
+ self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
44
+ self.wait_for_console_pattern('lease of 10.0.2.15')
45
+ # the line before login:
46
+ self.wait_for_console_pattern(pattern)
47
+ exec_command_and_wait_for_pattern(self, 'root', 'Password:')
48
+ exec_command_and_wait_for_pattern(self, 'passw0rd', '#')
49
+
50
+ def do_test_arm_aspeed_buildroot_poweroff(self):
51
+ exec_command_and_wait_for_pattern(self, 'poweroff',
52
+ 'reboot: System halted');
53
+
54
+ def do_test_arm_aspeed_sdk_start(self, image):
55
+ self.require_netdev('user')
56
+ self.vm.set_console()
57
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
58
+ '-net', 'nic', '-net', 'user', '-snapshot')
59
+ self.vm.launch()
60
+
61
+ self.wait_for_console_pattern('U-Boot 2019.04')
62
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
63
+ self.wait_for_console_pattern('Starting kernel ...')
64
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
65
index XXXXXXX..XXXXXXX 100644
66
--- a/tests/functional/meson.build
67
+++ b/tests/functional/meson.build
68
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
69
'acpi_bits' : 420,
70
'arm_aspeed_palmetto' : 120,
71
'arm_aspeed_romulus' : 120,
72
+ 'arm_aspeed_ast2500' : 480,
73
'arm_aspeed' : 600,
74
'arm_bpim2u' : 500,
75
'arm_collie' : 180,
76
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
77
'arm_aspeed_ast1030',
78
'arm_aspeed_palmetto',
79
'arm_aspeed_romulus',
80
+ 'arm_aspeed_ast2500',
81
'arm_bpim2u',
82
'arm_canona1100',
83
'arm_collie',
84
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
85
index XXXXXXX..XXXXXXX 100755
86
--- a/tests/functional/test_arm_aspeed.py
87
+++ b/tests/functional/test_arm_aspeed.py
88
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'
89
def do_test_arm_aspeed_buildroot_poweroff(self):
90
exec_command_and_wait_for_pattern(self, 'poweroff',
91
'reboot: System halted');
92
-
93
- ASSET_BR2_202311_AST2500_FLASH = Asset(
94
- ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
95
- 'images/ast2500-evb/buildroot-2023.11/flash.img'),
96
- 'c23db6160cf77d0258397eb2051162c8473a56c441417c52a91ba217186e715f')
97
-
98
- def test_arm_ast2500_evb_buildroot(self):
99
- self.set_machine('ast2500-evb')
100
-
101
- image_path = self.ASSET_BR2_202311_AST2500_FLASH.fetch()
102
-
103
- self.vm.add_args('-device',
104
- 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
105
- self.do_test_arm_aspeed_buildroot_start(image_path, '0x0',
106
- 'ast2500-evb login:')
107
-
108
- exec_command_and_wait_for_pattern(self,
109
- 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
110
- 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
111
- exec_command_and_wait_for_pattern(self,
112
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
113
- self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
114
- property='temperature', value=18000);
115
- exec_command_and_wait_for_pattern(self,
116
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
117
-
118
- self.do_test_arm_aspeed_buildroot_poweroff()
119
-
120
ASSET_BR2_202311_AST2600_FLASH = Asset(
121
('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
122
'images/ast2600-evb/buildroot-2023.11/flash.img'),
123
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed_sdk_start(self, image):
124
self.wait_for_console_pattern('## Loading kernel from FIT Image')
125
self.wait_for_console_pattern('Starting kernel ...')
126
127
- ASSET_SDK_V806_AST2500 = Asset(
128
- 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2500-default-obmc.tar.gz',
129
- 'e1755f3cadff69190438c688d52dd0f0d399b70a1e14b1d3d5540fc4851d38ca')
130
-
131
- def test_arm_ast2500_evb_sdk(self):
132
- self.set_machine('ast2500-evb')
133
-
134
- image_path = self.ASSET_SDK_V806_AST2500.fetch()
135
-
136
- archive_extract(image_path, self.workdir)
137
-
138
- self.do_test_arm_aspeed_sdk_start(
139
- self.workdir + '/ast2500-default/image-bmc')
140
-
141
- self.wait_for_console_pattern('ast2500-default login:')
142
-
143
ASSET_SDK_V806_AST2600_A2 = Asset(
144
'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2600-a2-obmc.tar.gz',
145
'9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
146
diff --git a/tests/functional/test_arm_aspeed_ast2500.py b/tests/functional/test_arm_aspeed_ast2500.py
147
new file mode 100644
148
index XXXXXXX..XXXXXXX
149
--- /dev/null
150
+++ b/tests/functional/test_arm_aspeed_ast2500.py
151
@@ -XXX,XX +XXX,XX @@
152
+#!/usr/bin/env python3
153
+#
154
+# Functional test that boots the ASPEED machines
155
+#
156
+# SPDX-License-Identifier: GPL-2.0-or-later
157
+
158
+from qemu_test import Asset
159
+from aspeed import AspeedTest
160
+from qemu_test import exec_command_and_wait_for_pattern
161
+from qemu_test.utils import archive_extract
162
+
163
+class AST2500Machine(AspeedTest):
164
+
165
+ ASSET_BR2_202311_AST2500_FLASH = Asset(
166
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
167
+ 'images/ast2500-evb/buildroot-2023.11/flash.img'),
168
+ 'c23db6160cf77d0258397eb2051162c8473a56c441417c52a91ba217186e715f')
169
+
170
+ def test_arm_ast2500_evb_buildroot(self):
171
+ self.set_machine('ast2500-evb')
172
+
173
+ image_path = self.ASSET_BR2_202311_AST2500_FLASH.fetch()
174
+
175
+ self.vm.add_args('-device',
176
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
177
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0x0',
178
+ 'ast2500-evb login:')
179
+
180
+ exec_command_and_wait_for_pattern(self,
181
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
182
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
183
+ exec_command_and_wait_for_pattern(self,
184
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
185
+ self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
186
+ property='temperature', value=18000);
187
+ exec_command_and_wait_for_pattern(self,
188
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
189
+
190
+ self.do_test_arm_aspeed_buildroot_poweroff()
191
+
192
+ ASSET_SDK_V806_AST2500 = Asset(
193
+ 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2500-default-obmc.tar.gz',
194
+ 'e1755f3cadff69190438c688d52dd0f0d399b70a1e14b1d3d5540fc4851d38ca')
195
+
196
+ def test_arm_ast2500_evb_sdk(self):
197
+ self.set_machine('ast2500-evb')
198
+
199
+ image_path = self.ASSET_SDK_V806_AST2500.fetch()
200
+
201
+ archive_extract(image_path, self.workdir)
202
+
203
+ self.do_test_arm_aspeed_sdk_start(
204
+ self.workdir + '/ast2500-default/image-bmc')
205
+
206
+ self.wait_for_console_pattern('ast2500-default login:')
207
+
208
+
209
+if __name__ == '__main__':
210
+ AspeedTest.main()
211
--
212
2.47.1
213
214
diff view generated by jsdifflib
1
The Aspeed SMC device model use to have a 'sdram_base' property. It
1
This moves the ast2600-evb tests to a new test file. No changes in the
2
was removed by commit d177892d4a48 ("aspeed/smc: Remove unused
2
test. The routines used to run the buildroot and sdk tests are removed
3
"sdram-base" property") because previous changes simplified the DMA
3
from the test_arm_aspeed.py file because now unused.
4
transaction model to use an offset in RAM and not the physical
5
address.
6
4
7
The AST2700 SoC has larger address space (64-bit) and a new register
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
8
DMA DRAM Side Address High Part (0x7C) is introduced to deal with the
6
Link: https://lore.kernel.org/r/20241206131132.520911-6-clg@redhat.com
9
high bits of the DMA address. To be able to compute the offset of the
10
DMA transaction, as done on the other SoCs, we will need to know where
11
the DRAM is mapped in the address space. Re-introduce a "dram-base"
12
property to hold this value.
13
14
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
15
Reviewed-by: Jamin Lin <jamin_lin@aspeedtech.com>
16
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
17
---
8
---
18
include/hw/ssi/aspeed_smc.h | 1 +
9
tests/functional/meson.build | 2 +
19
hw/ssi/aspeed_smc.c | 1 +
10
tests/functional/test_arm_aspeed.py | 155 --------------------
20
2 files changed, 2 insertions(+)
11
tests/functional/test_arm_aspeed_ast2600.py | 143 ++++++++++++++++++
12
3 files changed, 145 insertions(+), 155 deletions(-)
13
create mode 100644 tests/functional/test_arm_aspeed_ast2600.py
21
14
22
diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h
15
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
23
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/ssi/aspeed_smc.h
17
--- a/tests/functional/meson.build
25
+++ b/include/hw/ssi/aspeed_smc.h
18
+++ b/tests/functional/meson.build
26
@@ -XXX,XX +XXX,XX @@ struct AspeedSMCState {
19
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
27
AddressSpace flash_as;
20
'arm_aspeed_palmetto' : 120,
28
MemoryRegion *dram_mr;
21
'arm_aspeed_romulus' : 120,
29
AddressSpace dram_as;
22
'arm_aspeed_ast2500' : 480,
30
+ uint64_t dram_base;
23
+ 'arm_aspeed_ast2600' : 720,
31
24
'arm_aspeed' : 600,
32
AspeedSMCFlash flashes[ASPEED_SMC_CS_MAX];
25
'arm_bpim2u' : 500,
33
26
'arm_collie' : 180,
34
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
27
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
35
index XXXXXXX..XXXXXXX 100644
28
'arm_aspeed_palmetto',
36
--- a/hw/ssi/aspeed_smc.c
29
'arm_aspeed_romulus',
37
+++ b/hw/ssi/aspeed_smc.c
30
'arm_aspeed_ast2500',
38
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_smc = {
31
+ 'arm_aspeed_ast2600',
39
32
'arm_bpim2u',
40
static Property aspeed_smc_properties[] = {
33
'arm_canona1100',
41
DEFINE_PROP_BOOL("inject-failure", AspeedSMCState, inject_failure, false),
34
'arm_collie',
42
+ DEFINE_PROP_UINT64("dram-base", AspeedSMCState, dram_base, 0),
35
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
43
DEFINE_PROP_LINK("dram", AspeedSMCState, dram_mr,
36
index XXXXXXX..XXXXXXX 100755
44
TYPE_MEMORY_REGION, MemoryRegion *),
37
--- a/tests/functional/test_arm_aspeed.py
45
DEFINE_PROP_END_OF_LIST(),
38
+++ b/tests/functional/test_arm_aspeed.py
39
@@ -XXX,XX +XXX,XX @@
40
from zipfile import ZipFile
41
from unittest import skipUnless
42
43
-class AST2x00Machine(LinuxKernelTest):
44
-
45
- def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
46
- self.require_netdev('user')
47
- self.vm.set_console()
48
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw,read-only=true',
49
- '-net', 'nic', '-net', 'user')
50
- self.vm.launch()
51
-
52
- self.wait_for_console_pattern('U-Boot 2019.04')
53
- self.wait_for_console_pattern('## Loading kernel from FIT Image')
54
- self.wait_for_console_pattern('Starting kernel ...')
55
- self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
56
- self.wait_for_console_pattern('lease of 10.0.2.15')
57
- # the line before login:
58
- self.wait_for_console_pattern(pattern)
59
- exec_command_and_wait_for_pattern(self, 'root', 'Password:')
60
- exec_command_and_wait_for_pattern(self, 'passw0rd', '#')
61
-
62
- def do_test_arm_aspeed_buildroot_poweroff(self):
63
- exec_command_and_wait_for_pattern(self, 'poweroff',
64
- 'reboot: System halted');
65
- ASSET_BR2_202311_AST2600_FLASH = Asset(
66
- ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
67
- 'images/ast2600-evb/buildroot-2023.11/flash.img'),
68
- 'b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
69
-
70
- def test_arm_ast2600_evb_buildroot(self):
71
- self.set_machine('ast2600-evb')
72
-
73
- image_path = self.ASSET_BR2_202311_AST2600_FLASH.fetch()
74
-
75
- self.vm.add_args('-device',
76
- 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
77
- self.vm.add_args('-device',
78
- 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
79
- self.vm.add_args('-device',
80
- 'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
81
- self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00',
82
- 'ast2600-evb login:')
83
-
84
- exec_command_and_wait_for_pattern(self,
85
- 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
86
- 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
87
- exec_command_and_wait_for_pattern(self,
88
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
89
- self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
90
- property='temperature', value=18000);
91
- exec_command_and_wait_for_pattern(self,
92
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
93
-
94
- exec_command_and_wait_for_pattern(self,
95
- 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-3/device/new_device',
96
- 'i2c i2c-3: new_device: Instantiated device ds1307 at 0x32');
97
- year = time.strftime("%Y")
98
- exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
99
-
100
- exec_command_and_wait_for_pattern(self,
101
- 'echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-3/new_device',
102
- 'i2c i2c-3: new_device: Instantiated device slave-24c02 at 0x64');
103
- exec_command_and_wait_for_pattern(self,
104
- 'i2cset -y 3 0x42 0x64 0x00 0xaa i', '#');
105
- exec_command_and_wait_for_pattern(self,
106
- 'hexdump /sys/bus/i2c/devices/3-1064/slave-eeprom',
107
- '0000000 ffaa ffff ffff ffff ffff ffff ffff ffff');
108
- self.do_test_arm_aspeed_buildroot_poweroff()
109
-
110
- ASSET_BR2_202302_AST2600_TPM_FLASH = Asset(
111
- ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
112
- 'images/ast2600-evb/buildroot-2023.02-tpm/flash.img'),
113
- 'a46009ae8a5403a0826d607215e731a8c68d27c14c41e55331706b8f9c7bd997')
114
-
115
- @skipUnless(*has_cmd('swtpm'))
116
- def test_arm_ast2600_evb_buildroot_tpm(self):
117
- self.set_machine('ast2600-evb')
118
-
119
- image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch()
120
-
121
- tpmstate_dir = tempfile.TemporaryDirectory(prefix="qemu_")
122
- socket = os.path.join(tpmstate_dir.name, 'swtpm-socket')
123
-
124
- # We must put the TPM state dir in /tmp/, not the build dir,
125
- # because some distros use AppArmor to lock down swtpm and
126
- # restrict the set of locations it can access files in.
127
- subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
128
- '--tpmstate', f'dir={tpmstate_dir.name}',
129
- '--ctrl', f'type=unixio,path={socket}'])
130
-
131
- self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
132
- self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm')
133
- self.vm.add_args('-device',
134
- 'tpm-tis-i2c,tpmdev=tpm0,bus=aspeed.i2c.bus.12,address=0x2e')
135
- self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
136
-
137
- exec_command_and_wait_for_pattern(self,
138
- 'echo tpm_tis_i2c 0x2e > /sys/bus/i2c/devices/i2c-12/new_device',
139
- 'tpm_tis_i2c 12-002e: 2.0 TPM (device-id 0x1, rev-id 1)');
140
- exec_command_and_wait_for_pattern(self,
141
- 'cat /sys/class/tpm/tpm0/pcr-sha256/0',
142
- 'B804724EA13F52A9072BA87FE8FDCC497DFC9DF9AA15B9088694639C431688E0');
143
-
144
- self.do_test_arm_aspeed_buildroot_poweroff()
145
-
146
- def do_test_arm_aspeed_sdk_start(self, image):
147
- self.require_netdev('user')
148
- self.vm.set_console()
149
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
150
- '-net', 'nic', '-net', 'user', '-snapshot')
151
- self.vm.launch()
152
-
153
- self.wait_for_console_pattern('U-Boot 2019.04')
154
- self.wait_for_console_pattern('## Loading kernel from FIT Image')
155
- self.wait_for_console_pattern('Starting kernel ...')
156
-
157
- ASSET_SDK_V806_AST2600_A2 = Asset(
158
- 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2600-a2-obmc.tar.gz',
159
- '9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
160
-
161
- def test_arm_ast2600_evb_sdk(self):
162
- self.set_machine('ast2600-evb')
163
-
164
- image_path = self.ASSET_SDK_V806_AST2600_A2.fetch()
165
-
166
- archive_extract(image_path, self.workdir)
167
-
168
- self.vm.add_args('-device',
169
- 'tmp105,bus=aspeed.i2c.bus.5,address=0x4d,id=tmp-test');
170
- self.vm.add_args('-device',
171
- 'ds1338,bus=aspeed.i2c.bus.5,address=0x32');
172
- self.do_test_arm_aspeed_sdk_start(
173
- self.workdir + '/ast2600-a2/image-bmc')
174
-
175
- self.wait_for_console_pattern('ast2600-a2 login:')
176
-
177
- exec_command_and_wait_for_pattern(self, 'root', 'Password:')
178
- exec_command_and_wait_for_pattern(self, '0penBmc', 'root@ast2600-a2:~#')
179
-
180
- exec_command_and_wait_for_pattern(self,
181
- 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-5/device/new_device',
182
- 'i2c i2c-5: new_device: Instantiated device lm75 at 0x4d');
183
- exec_command_and_wait_for_pattern(self,
184
- 'cat /sys/class/hwmon/hwmon19/temp1_input', '0')
185
- self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
186
- property='temperature', value=18000);
187
- exec_command_and_wait_for_pattern(self,
188
- 'cat /sys/class/hwmon/hwmon19/temp1_input', '18000')
189
-
190
- exec_command_and_wait_for_pattern(self,
191
- 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-5/device/new_device',
192
- 'i2c i2c-5: new_device: Instantiated device ds1307 at 0x32');
193
- year = time.strftime("%Y")
194
- exec_command_and_wait_for_pattern(self,
195
- '/sbin/hwclock -f /dev/rtc1', year);
196
-
197
-
198
class AST2x00MachineMMC(LinuxKernelTest):
199
200
ASSET_RAINIER_EMMC = Asset(
201
diff --git a/tests/functional/test_arm_aspeed_ast2600.py b/tests/functional/test_arm_aspeed_ast2600.py
202
new file mode 100644
203
index XXXXXXX..XXXXXXX
204
--- /dev/null
205
+++ b/tests/functional/test_arm_aspeed_ast2600.py
206
@@ -XXX,XX +XXX,XX @@
207
+#!/usr/bin/env python3
208
+#
209
+# Functional test that boots the ASPEED machines
210
+#
211
+# SPDX-License-Identifier: GPL-2.0-or-later
212
+
213
+import os
214
+import time
215
+import tempfile
216
+import subprocess
217
+
218
+from qemu_test import Asset
219
+from aspeed import AspeedTest
220
+from qemu_test import exec_command_and_wait_for_pattern
221
+from qemu_test import has_cmd
222
+from qemu_test.utils import archive_extract
223
+from unittest import skipUnless
224
+
225
+class AST2600Machine(AspeedTest):
226
+
227
+ ASSET_BR2_202311_AST2600_FLASH = Asset(
228
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
229
+ 'images/ast2600-evb/buildroot-2023.11/flash.img'),
230
+ 'b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
231
+
232
+ def test_arm_ast2600_evb_buildroot(self):
233
+ self.set_machine('ast2600-evb')
234
+
235
+ image_path = self.ASSET_BR2_202311_AST2600_FLASH.fetch()
236
+
237
+ self.vm.add_args('-device',
238
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
239
+ self.vm.add_args('-device',
240
+ 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
241
+ self.vm.add_args('-device',
242
+ 'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
243
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00',
244
+ 'ast2600-evb login:')
245
+
246
+ exec_command_and_wait_for_pattern(self,
247
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
248
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
249
+ exec_command_and_wait_for_pattern(self,
250
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
251
+ self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
252
+ property='temperature', value=18000);
253
+ exec_command_and_wait_for_pattern(self,
254
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
255
+
256
+ exec_command_and_wait_for_pattern(self,
257
+ 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-3/device/new_device',
258
+ 'i2c i2c-3: new_device: Instantiated device ds1307 at 0x32');
259
+ year = time.strftime("%Y")
260
+ exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
261
+
262
+ exec_command_and_wait_for_pattern(self,
263
+ 'echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-3/new_device',
264
+ 'i2c i2c-3: new_device: Instantiated device slave-24c02 at 0x64');
265
+ exec_command_and_wait_for_pattern(self,
266
+ 'i2cset -y 3 0x42 0x64 0x00 0xaa i', '#');
267
+ exec_command_and_wait_for_pattern(self,
268
+ 'hexdump /sys/bus/i2c/devices/3-1064/slave-eeprom',
269
+ '0000000 ffaa ffff ffff ffff ffff ffff ffff ffff');
270
+ self.do_test_arm_aspeed_buildroot_poweroff()
271
+
272
+ ASSET_BR2_202302_AST2600_TPM_FLASH = Asset(
273
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
274
+ 'images/ast2600-evb/buildroot-2023.02-tpm/flash.img'),
275
+ 'a46009ae8a5403a0826d607215e731a8c68d27c14c41e55331706b8f9c7bd997')
276
+
277
+ @skipUnless(*has_cmd('swtpm'))
278
+ def test_arm_ast2600_evb_buildroot_tpm(self):
279
+ self.set_machine('ast2600-evb')
280
+
281
+ image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch()
282
+
283
+ tpmstate_dir = tempfile.TemporaryDirectory(prefix="qemu_")
284
+ socket = os.path.join(tpmstate_dir.name, 'swtpm-socket')
285
+
286
+ # We must put the TPM state dir in /tmp/, not the build dir,
287
+ # because some distros use AppArmor to lock down swtpm and
288
+ # restrict the set of locations it can access files in.
289
+ subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
290
+ '--tpmstate', f'dir={tpmstate_dir.name}',
291
+ '--ctrl', f'type=unixio,path={socket}'])
292
+
293
+ self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
294
+ self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm')
295
+ self.vm.add_args('-device',
296
+ 'tpm-tis-i2c,tpmdev=tpm0,bus=aspeed.i2c.bus.12,address=0x2e')
297
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
298
+
299
+ exec_command_and_wait_for_pattern(self,
300
+ 'echo tpm_tis_i2c 0x2e > /sys/bus/i2c/devices/i2c-12/new_device',
301
+ 'tpm_tis_i2c 12-002e: 2.0 TPM (device-id 0x1, rev-id 1)');
302
+ exec_command_and_wait_for_pattern(self,
303
+ 'cat /sys/class/tpm/tpm0/pcr-sha256/0',
304
+ 'B804724EA13F52A9072BA87FE8FDCC497DFC9DF9AA15B9088694639C431688E0');
305
+
306
+ self.do_test_arm_aspeed_buildroot_poweroff()
307
+
308
+ ASSET_SDK_V806_AST2600_A2 = Asset(
309
+ 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2600-a2-obmc.tar.gz',
310
+ '9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
311
+
312
+ def test_arm_ast2600_evb_sdk(self):
313
+ self.set_machine('ast2600-evb')
314
+
315
+ image_path = self.ASSET_SDK_V806_AST2600_A2.fetch()
316
+
317
+ archive_extract(image_path, self.workdir)
318
+
319
+ self.vm.add_args('-device',
320
+ 'tmp105,bus=aspeed.i2c.bus.5,address=0x4d,id=tmp-test');
321
+ self.vm.add_args('-device',
322
+ 'ds1338,bus=aspeed.i2c.bus.5,address=0x32');
323
+ self.do_test_arm_aspeed_sdk_start(
324
+ self.workdir + '/ast2600-a2/image-bmc')
325
+
326
+ self.wait_for_console_pattern('ast2600-a2 login:')
327
+
328
+ exec_command_and_wait_for_pattern(self, 'root', 'Password:')
329
+ exec_command_and_wait_for_pattern(self, '0penBmc', 'root@ast2600-a2:~#')
330
+
331
+ exec_command_and_wait_for_pattern(self,
332
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-5/device/new_device',
333
+ 'i2c i2c-5: new_device: Instantiated device lm75 at 0x4d');
334
+ exec_command_and_wait_for_pattern(self,
335
+ 'cat /sys/class/hwmon/hwmon19/temp1_input', '0')
336
+ self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
337
+ property='temperature', value=18000);
338
+ exec_command_and_wait_for_pattern(self,
339
+ 'cat /sys/class/hwmon/hwmon19/temp1_input', '18000')
340
+
341
+ exec_command_and_wait_for_pattern(self,
342
+ 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-5/device/new_device',
343
+ 'i2c i2c-5: new_device: Instantiated device ds1307 at 0x32');
344
+ year = time.strftime("%Y")
345
+ exec_command_and_wait_for_pattern(self,
346
+ '/sbin/hwclock -f /dev/rtc1', year);
347
+
348
+if __name__ == '__main__':
349
+ AspeedTest.main()
46
--
350
--
47
2.45.2
351
2.47.1
48
352
49
353
diff view generated by jsdifflib
New patch
1
This simply moves the rainier-bmc test to a new test file. No changes
2
in the test. The test_arm_aspeed.py is deleted.
1
3
4
Reviewed-by: Thomas Huth <thuth@redhat.com>
5
Link: https://lore.kernel.org/r/20241206131132.520911-7-clg@redhat.com
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
8
tests/functional/meson.build | 4 ++--
9
...m_aspeed.py => test_arm_aspeed_rainier.py} | 22 +++++--------------
10
2 files changed, 7 insertions(+), 19 deletions(-)
11
rename tests/functional/{test_arm_aspeed.py => test_arm_aspeed_rainier.py} (71%)
12
mode change 100755 => 100644
13
14
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
15
index XXXXXXX..XXXXXXX 100644
16
--- a/tests/functional/meson.build
17
+++ b/tests/functional/meson.build
18
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
19
'arm_aspeed_romulus' : 120,
20
'arm_aspeed_ast2500' : 480,
21
'arm_aspeed_ast2600' : 720,
22
- 'arm_aspeed' : 600,
23
+ 'arm_aspeed_rainier' : 240,
24
'arm_bpim2u' : 500,
25
'arm_collie' : 180,
26
'arm_orangepi' : 540,
27
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
28
]
29
30
tests_arm_system_thorough = [
31
- 'arm_aspeed',
32
'arm_aspeed_ast1030',
33
'arm_aspeed_palmetto',
34
'arm_aspeed_romulus',
35
'arm_aspeed_ast2500',
36
'arm_aspeed_ast2600',
37
+ 'arm_aspeed_rainier',
38
'arm_bpim2u',
39
'arm_canona1100',
40
'arm_collie',
41
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed_rainier.py
42
old mode 100755
43
new mode 100644
44
similarity index 71%
45
rename from tests/functional/test_arm_aspeed.py
46
rename to tests/functional/test_arm_aspeed_rainier.py
47
index XXXXXXX..XXXXXXX
48
--- a/tests/functional/test_arm_aspeed.py
49
+++ b/tests/functional/test_arm_aspeed_rainier.py
50
@@ -XXX,XX +XXX,XX @@
51
#!/usr/bin/env python3
52
#
53
-# Functional test that boots the ASPEED SoCs with firmware
54
-#
55
-# Copyright (C) 2022 ASPEED Technology Inc
56
+# Functional test that boots the ASPEED machines
57
#
58
# SPDX-License-Identifier: GPL-2.0-or-later
59
60
-import os
61
-import time
62
-import subprocess
63
-import tempfile
64
-
65
-from qemu_test import LinuxKernelTest, Asset
66
-from qemu_test import exec_command_and_wait_for_pattern
67
-from qemu_test import interrupt_interactive_console_until_pattern
68
-from qemu_test import has_cmd
69
-from qemu_test.utils import archive_extract
70
-from zipfile import ZipFile
71
-from unittest import skipUnless
72
+from qemu_test import Asset
73
+from aspeed import AspeedTest
74
75
-class AST2x00MachineMMC(LinuxKernelTest):
76
+class RainierMachine(AspeedTest):
77
78
ASSET_RAINIER_EMMC = Asset(
79
('https://fileserver.linaro.org/s/B6pJTwWEkzSDi36/download/'
80
@@ -XXX,XX +XXX,XX @@ def test_arm_aspeed_emmc_boot(self):
81
self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')
82
83
if __name__ == '__main__':
84
- LinuxKernelTest.main()
85
+ AspeedTest.main()
86
--
87
2.47.1
88
89
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
This simply moves the debian boot test from the avocado testsuite to
2
the new functional testsuite. No changes in the test.
2
3
3
Add a test case to test Aspeed OpenBMC SDK v09.01 on AST2700 board.
4
Reviewed-by: Thomas Huth <thuth@redhat.com>
5
Link: https://lore.kernel.org/r/20241206131132.520911-8-clg@redhat.com
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
8
tests/avocado/boot_linux_console.py | 26 ---------------------
9
tests/functional/test_arm_aspeed_rainier.py | 24 +++++++++++++++++++
10
2 files changed, 24 insertions(+), 26 deletions(-)
4
11
5
It loads u-boot-nodtb.bin, u-boot.dtb, tfa and optee-os
12
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
6
images to dram first which base address is 0x400000000.
7
Then, boot and launch 4 cpu cores.
8
9
```
10
qemu-system-aarch64 -machine ast2700-evb
11
-device loader,force-raw=on,addr=0x400000000,file=workdir/u-boot-nodtb.bin \
12
-device loader,force-raw=on,addr=uboot_dtb_load_addr,file=workdir/u-boot.dtb\
13
-device loader,force-raw=on,addr=0x430000000,file=workdir/bl31.bin\
14
-device loader,force-raw=on,addr=0x430080000,file=workdir/optee/tee-raw.bin\
15
-device loader,cpu-num=0,addr=0x430000000 \
16
-device loader,cpu-num=1,addr=0x430000000 \
17
-device loader,cpu-num=2,addr=0x430000000 \
18
-device loader,cpu-num=3,addr=0x430000000 \
19
-smp 4 \
20
-drive file=workdir/image-bmc,format=raw,if=mtd
21
```
22
23
A test image is downloaded from the ASPEED Forked OpenBMC GitHub release repository :
24
https://github.com/AspeedTech-BMC/openbmc/releases/
25
26
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
27
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
28
Reviewed-by: Cédric Le Goater <clg@kaod.org>
29
---
30
tests/avocado/machine_aspeed.py | 62 +++++++++++++++++++++++++++++++++
31
1 file changed, 62 insertions(+)
32
33
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
34
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
35
--- a/tests/avocado/machine_aspeed.py
14
--- a/tests/avocado/boot_linux_console.py
36
+++ b/tests/avocado/machine_aspeed.py
15
+++ b/tests/avocado/boot_linux_console.py
37
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed_sdk_start(self, image):
16
@@ -XXX,XX +XXX,XX @@ def test_arm_quanta_gsj_initrd(self):
38
self, 'boot', '## Loading kernel from FIT Image')
17
self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
39
self.wait_for_console_pattern('Starting kernel ...')
18
self.wait_for_console_pattern(
40
19
'Give root password for system maintenance')
41
+ def do_test_aarch64_aspeed_sdk_start(self, image):
20
-
21
- def test_arm_ast2600_debian(self):
22
- """
23
- :avocado: tags=arch:arm
24
- :avocado: tags=machine:rainier-bmc
25
- """
26
- deb_url = ('http://snapshot.debian.org/archive/debian/'
27
- '20220606T211338Z/'
28
- 'pool/main/l/linux/'
29
- 'linux-image-5.17.0-2-armmp_5.17.6-1%2Bb1_armhf.deb')
30
- deb_hash = '8acb2b4439faedc2f3ed4bdb2847ad4f6e0491f73debaeb7f660c8abe4dcdc0e'
31
- deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash,
32
- algorithm='sha256')
33
- kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.17.0-2-armmp')
34
- dtb_path = self.extract_from_deb(deb_path,
35
- '/usr/lib/linux-image-5.17.0-2-armmp/aspeed-bmc-ibm-rainier.dtb')
36
-
37
- self.vm.set_console()
38
- self.vm.add_args('-kernel', kernel_path,
39
- '-dtb', dtb_path,
40
- '-net', 'nic')
41
- self.vm.launch()
42
- self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
43
- self.wait_for_console_pattern("SMP: Total of 2 processors activated")
44
- self.wait_for_console_pattern("No filesystem could mount root")
45
-
46
diff --git a/tests/functional/test_arm_aspeed_rainier.py b/tests/functional/test_arm_aspeed_rainier.py
47
index XXXXXXX..XXXXXXX 100644
48
--- a/tests/functional/test_arm_aspeed_rainier.py
49
+++ b/tests/functional/test_arm_aspeed_rainier.py
50
@@ -XXX,XX +XXX,XX @@ def test_arm_aspeed_emmc_boot(self):
51
self.wait_for_console_pattern('mmcblk0: p1 p2 p3 p4 p5 p6 p7')
52
self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')
53
54
+ ASSET_DEBIAN_LINUX_ARMHF_DEB = Asset(
55
+ ('http://snapshot.debian.org/archive/debian/20220606T211338Z/pool/main/l/linux/linux-image-5.17.0-2-armmp_5.17.6-1%2Bb1_armhf.deb'),
56
+ '8acb2b4439faedc2f3ed4bdb2847ad4f6e0491f73debaeb7f660c8abe4dcdc0e')
57
+
58
+ def test_arm_debian_kernel_boot(self):
59
+ self.set_machine('rainier-bmc')
60
+
61
+ deb_path = self.ASSET_DEBIAN_LINUX_ARMHF_DEB.fetch()
62
+
63
+ kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.17.0-2-armmp')
64
+ dtb_path = self.extract_from_deb(deb_path,
65
+ '/usr/lib/linux-image-5.17.0-2-armmp/aspeed-bmc-ibm-rainier.dtb')
66
+
42
+ self.vm.set_console()
67
+ self.vm.set_console()
43
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw')
68
+ self.vm.add_args('-kernel', kernel_path,
44
+
69
+ '-dtb', dtb_path,
70
+ '-net', 'nic')
45
+ self.vm.launch()
71
+ self.vm.launch()
46
+
72
+
47
+ self.wait_for_console_pattern('U-Boot 2023.10')
73
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
48
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
74
+ self.wait_for_console_pattern("SMP: Total of 2 processors activated")
49
+ self.wait_for_console_pattern('Starting kernel ...')
75
+ self.wait_for_console_pattern("No filesystem could mount root")
50
+ self.wait_for_console_pattern("systemd[1]: Hostname set to")
51
+
76
+
52
@skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab')
53
54
def test_arm_ast2500_evb_sdk(self):
55
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_sdk(self):
56
'i2c i2c-5: new_device: Instantiated device ds1307 at 0x32');
57
year = time.strftime("%Y")
58
self.ssh_command_output_contains('/sbin/hwclock -f /dev/rtc1', year);
59
+
77
+
60
+ def test_aarch64_ast2700_evb_sdk_v09_01(self):
78
if __name__ == '__main__':
61
+ """
79
AspeedTest.main()
62
+ :avocado: tags=arch:aarch64
63
+ :avocado: tags=machine:ast2700-evb
64
+ """
65
+
66
+ image_url = ('https://github.com/AspeedTech-BMC/openbmc/releases/'
67
+ 'download/v09.01/ast2700-default-obmc.tar.gz')
68
+ image_hash = 'b1cc0fd73c7650d34c9c8459a243f52a91e9e27144b8608b2645ab19461d1e07'
69
+ image_path = self.fetch_asset(image_url, asset_hash=image_hash,
70
+ algorithm='sha256')
71
+ archive.extract(image_path, self.workdir)
72
+
73
+ num_cpu = 4
74
+ image_dir = self.workdir + '/ast2700-default/'
75
+ uboot_size = os.path.getsize(image_dir + 'u-boot-nodtb.bin')
76
+ uboot_dtb_load_addr = hex(0x400000000 + uboot_size)
77
+
78
+ load_images_list = [
79
+ {
80
+ 'addr': '0x400000000',
81
+ 'file': image_dir + 'u-boot-nodtb.bin'
82
+ },
83
+ {
84
+ 'addr': str(uboot_dtb_load_addr),
85
+ 'file': image_dir + 'u-boot.dtb'
86
+ },
87
+ {
88
+ 'addr': '0x430000000',
89
+ 'file': image_dir + 'bl31.bin'
90
+ },
91
+ {
92
+ 'addr': '0x430080000',
93
+ 'file': image_dir + 'optee/tee-raw.bin'
94
+ }
95
+ ]
96
+
97
+ for load_image in load_images_list:
98
+ addr = load_image['addr']
99
+ file = load_image['file']
100
+ self.vm.add_args('-device',
101
+ f'loader,force-raw=on,addr={addr},file={file}')
102
+
103
+ for i in range(num_cpu):
104
+ self.vm.add_args('-device',
105
+ f'loader,addr=0x430000000,cpu-num={i}')
106
+
107
+ self.vm.add_args('-smp', str(num_cpu))
108
+ self.do_test_aarch64_aspeed_sdk_start(image_dir + 'image-bmc')
109
+
110
--
80
--
111
2.45.2
81
2.47.1
112
82
113
83
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
DMA length is from 1 byte to 32MB for AST2600 and AST10x0
3
So far, the test cases are used for testing SMC model with AST2400 BMC.
4
and DMA length is from 4 bytes to 32MB for AST2500.
4
However, AST2400 is end off live and ASPEED is no longer support this SOC.
5
To test SMC model for AST2500, AST2600 and AST1030, move the test cases
6
from main to test_palmetto_bmc function.
5
7
6
In other words, if "R_DMA_LEN" is 0, it should move at least 1 byte
7
data for AST2600 and AST10x0 and 4 bytes data for AST2500.
8
To support all ASPEED SOCs, adds dma_start_length parameter to store
9
the start length, add helper routines function to compute the dma length
10
and update DMA_LENGTH mask to "1FFFFFF" to support dma 1 byte
11
length unit for AST2600 and AST1030.
12
Currently, only supports dma length 4 bytes aligned.
13
14
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
15
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
16
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Link: https://lore.kernel.org/r/20241127091543.1243114-2-jamin_lin@aspeedtech.com
11
Signed-off-by: Cédric Le Goater <clg@redhat.com>
17
---
12
---
18
include/hw/ssi/aspeed_smc.h | 1 +
13
tests/qtest/aspeed_smc-test.c | 16 ++++++++++++----
19
hw/ssi/aspeed_smc.c | 43 ++++++++++++++++++++++++++++++-------
14
1 file changed, 12 insertions(+), 4 deletions(-)
20
2 files changed, 36 insertions(+), 8 deletions(-)
21
15
22
diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h
16
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
23
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/ssi/aspeed_smc.h
18
--- a/tests/qtest/aspeed_smc-test.c
25
+++ b/include/hw/ssi/aspeed_smc.h
19
+++ b/tests/qtest/aspeed_smc-test.c
26
@@ -XXX,XX +XXX,XX @@ struct AspeedSMCClass {
20
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
27
uint32_t features;
21
flash_reset();
28
hwaddr dma_flash_mask;
29
hwaddr dma_dram_mask;
30
+ uint32_t dma_start_length;
31
uint32_t nregs;
32
uint32_t (*segment_to_reg)(const AspeedSMCState *s,
33
const AspeedSegments *seg);
34
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/ssi/aspeed_smc.c
37
+++ b/hw/ssi/aspeed_smc.c
38
@@ -XXX,XX +XXX,XX @@
39
* DMA flash addresses should be 4 bytes aligned and the valid address
40
* range is 0x20000000 - 0x2FFFFFFF.
41
*
42
- * DMA length is from 4 bytes to 32MB
43
+ * DMA length is from 4 bytes to 32MB (AST2500)
44
* 0: 4 bytes
45
- * 0x7FFFFF: 32M bytes
46
+ * 0x1FFFFFC: 32M bytes
47
+ *
48
+ * DMA length is from 1 byte to 32MB (AST2600, AST10x0)
49
+ * 0: 1 byte
50
+ * 0x1FFFFFF: 32M bytes
51
*/
52
#define DMA_DRAM_ADDR(asc, val) ((val) & (asc)->dma_dram_mask)
53
#define DMA_FLASH_ADDR(asc, val) ((val) & (asc)->dma_flash_mask)
54
-#define DMA_LENGTH(val) ((val) & 0x01FFFFFC)
55
+#define DMA_LENGTH(val) ((val) & 0x01FFFFFF)
56
57
/* Flash opcodes. */
58
#define SPI_OP_READ 0x03 /* Read data bytes (low frequency) */
59
@@ -XXX,XX +XXX,XX @@ static bool aspeed_smc_inject_read_failure(AspeedSMCState *s)
60
}
61
}
22
}
62
23
63
+static uint32_t aspeed_smc_dma_len(AspeedSMCState *s)
24
-int main(int argc, char **argv)
64
+{
25
+static int test_palmetto_bmc(void)
65
+ AspeedSMCClass *asc = ASPEED_SMC_GET_CLASS(s);
26
{
27
g_autofree char *tmp_path = NULL;
28
int ret;
29
int fd;
30
31
- g_test_init(&argc, &argv, NULL);
32
-
33
fd = g_file_open_tmp("qtest.m25p80.XXXXXX", &tmp_path, NULL);
34
g_assert(fd >= 0);
35
ret = ftruncate(fd, FLASH_SIZE);
36
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
37
38
flash_reset();
39
ret = g_test_run();
40
-
41
qtest_quit(global_qtest);
42
unlink(tmp_path);
66
+
43
+
67
+ return QEMU_ALIGN_UP(s->regs[R_DMA_LEN] + asc->dma_start_length, 4);
44
+ return ret;
68
+}
45
+}
69
+
46
+
70
/*
47
+int main(int argc, char **argv)
71
* Accumulate the result of the reads to provide a checksum that will
48
+{
72
* be used to validate the read timing settings.
49
+ int ret;
73
@@ -XXX,XX +XXX,XX @@ static bool aspeed_smc_inject_read_failure(AspeedSMCState *s)
74
static void aspeed_smc_dma_checksum(AspeedSMCState *s)
75
{
76
MemTxResult result;
77
+ uint32_t dma_len;
78
uint32_t data;
79
80
if (s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE) {
81
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s)
82
aspeed_smc_dma_calibration(s);
83
}
84
85
- while (s->regs[R_DMA_LEN]) {
86
+ dma_len = aspeed_smc_dma_len(s);
87
+
50
+
88
+ while (dma_len) {
51
+ g_test_init(&argc, &argv, NULL);
89
data = address_space_ldl_le(&s->flash_as, s->regs[R_DMA_FLASH_ADDR],
52
+ ret = test_palmetto_bmc();
90
MEMTXATTRS_UNSPECIFIED, &result);
91
if (result != MEMTX_OK) {
92
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s)
93
*/
94
s->regs[R_DMA_CHECKSUM] += data;
95
s->regs[R_DMA_FLASH_ADDR] += 4;
96
- s->regs[R_DMA_LEN] -= 4;
97
+ dma_len -= 4;
98
+ s->regs[R_DMA_LEN] = dma_len;
99
}
100
101
if (s->inject_failure && aspeed_smc_inject_read_failure(s)) {
102
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s)
103
static void aspeed_smc_dma_rw(AspeedSMCState *s)
104
{
105
MemTxResult result;
106
+ uint32_t dma_len;
107
uint32_t data;
108
109
+ dma_len = aspeed_smc_dma_len(s);
110
+
53
+
111
trace_aspeed_smc_dma_rw(s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE ?
54
return ret;
112
"write" : "read",
113
s->regs[R_DMA_FLASH_ADDR],
114
s->regs[R_DMA_DRAM_ADDR],
115
- s->regs[R_DMA_LEN]);
116
- while (s->regs[R_DMA_LEN]) {
117
+ dma_len);
118
+ while (dma_len) {
119
if (s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE) {
120
data = address_space_ldl_le(&s->dram_as, s->regs[R_DMA_DRAM_ADDR],
121
MEMTXATTRS_UNSPECIFIED, &result);
122
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_rw(AspeedSMCState *s)
123
*/
124
s->regs[R_DMA_FLASH_ADDR] += 4;
125
s->regs[R_DMA_DRAM_ADDR] += 4;
126
- s->regs[R_DMA_LEN] -= 4;
127
+ dma_len -= 4;
128
+ s->regs[R_DMA_LEN] = dma_len;
129
s->regs[R_DMA_CHECKSUM] += data;
130
}
131
}
55
}
132
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_fmc_class_init(ObjectClass *klass, void *data)
133
asc->features = ASPEED_SMC_FEATURE_DMA;
134
asc->dma_flash_mask = 0x0FFFFFFC;
135
asc->dma_dram_mask = 0x1FFFFFFC;
136
+ asc->dma_start_length = 4;
137
asc->nregs = ASPEED_SMC_R_MAX;
138
asc->segment_to_reg = aspeed_smc_segment_to_reg;
139
asc->reg_to_segment = aspeed_smc_reg_to_segment;
140
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_fmc_class_init(ObjectClass *klass, void *data)
141
asc->features = ASPEED_SMC_FEATURE_DMA;
142
asc->dma_flash_mask = 0x0FFFFFFC;
143
asc->dma_dram_mask = 0x3FFFFFFC;
144
+ asc->dma_start_length = 4;
145
asc->nregs = ASPEED_SMC_R_MAX;
146
asc->segment_to_reg = aspeed_smc_segment_to_reg;
147
asc->reg_to_segment = aspeed_smc_reg_to_segment;
148
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_fmc_class_init(ObjectClass *klass, void *data)
149
ASPEED_SMC_FEATURE_WDT_CONTROL;
150
asc->dma_flash_mask = 0x0FFFFFFC;
151
asc->dma_dram_mask = 0x3FFFFFFC;
152
+ asc->dma_start_length = 1;
153
asc->nregs = ASPEED_SMC_R_MAX;
154
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
155
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
156
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_spi1_class_init(ObjectClass *klass, void *data)
157
ASPEED_SMC_FEATURE_DMA_GRANT;
158
asc->dma_flash_mask = 0x0FFFFFFC;
159
asc->dma_dram_mask = 0x3FFFFFFC;
160
+ asc->dma_start_length = 1;
161
asc->nregs = ASPEED_SMC_R_MAX;
162
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
163
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
164
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_spi2_class_init(ObjectClass *klass, void *data)
165
ASPEED_SMC_FEATURE_DMA_GRANT;
166
asc->dma_flash_mask = 0x0FFFFFFC;
167
asc->dma_dram_mask = 0x3FFFFFFC;
168
+ asc->dma_start_length = 1;
169
asc->nregs = ASPEED_SMC_R_MAX;
170
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
171
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
172
@@ -XXX,XX +XXX,XX @@ static void aspeed_1030_fmc_class_init(ObjectClass *klass, void *data)
173
asc->features = ASPEED_SMC_FEATURE_DMA;
174
asc->dma_flash_mask = 0x0FFFFFFC;
175
asc->dma_dram_mask = 0x000BFFFC;
176
+ asc->dma_start_length = 1;
177
asc->nregs = ASPEED_SMC_R_MAX;
178
asc->segment_to_reg = aspeed_1030_smc_segment_to_reg;
179
asc->reg_to_segment = aspeed_1030_smc_reg_to_segment;
180
@@ -XXX,XX +XXX,XX @@ static void aspeed_1030_spi1_class_init(ObjectClass *klass, void *data)
181
asc->features = ASPEED_SMC_FEATURE_DMA;
182
asc->dma_flash_mask = 0x0FFFFFFC;
183
asc->dma_dram_mask = 0x000BFFFC;
184
+ asc->dma_start_length = 1;
185
asc->nregs = ASPEED_SMC_R_MAX;
186
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
187
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
188
@@ -XXX,XX +XXX,XX @@ static void aspeed_1030_spi2_class_init(ObjectClass *klass, void *data)
189
asc->features = ASPEED_SMC_FEATURE_DMA;
190
asc->dma_flash_mask = 0x0FFFFFFC;
191
asc->dma_dram_mask = 0x000BFFFC;
192
+ asc->dma_start_length = 1;
193
asc->nregs = ASPEED_SMC_R_MAX;
194
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
195
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
196
--
56
--
197
2.45.2
57
2.47.1
198
58
199
59
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST2700 fmc/spi controller's address decoding unit is 64KB
3
Currently, these test cases are only used for testing fmc_cs0 for AST2400.
4
and only bits [31:16] are used for decoding. Introduce seg_to_reg
4
To test others BMC SOCs, introduces a new TestData structure.
5
and reg_to_seg handlers for ast2700 fmc/spi controller.
5
Users can set the spi base address, flash base address, jedesc id and so on
6
In addition, adds ast2700 fmc, spi0, spi1, and spi2 class init handler.
6
for different BMC SOCs and flash model testing.
7
7
8
AST2700 is a 64 bits quad core CPUs(Cortex-a35). Introduce a new
8
Introduce new helper functions to make the test case more readable.
9
"aspeed_2700_smc_flash_ops" and set its valid "max_access_size"
10
8 for 64 bits data format access.
11
9
12
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
10
Set spi base address 0x1E620000, flash_base address 0x20000000
11
and jedec id 0x20ba19 for fmc_cs0 with n25q256a flash for AST2400
12
SMC model testing.
13
14
To pass the TestData into the test case, replace qtest_add_func with
15
qtest_add_data_func.
16
13
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
17
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
14
Reviewed-by: Cédric Le Goater <clg@redhat.com>
18
Reviewed-by: Cédric Le Goater <clg@redhat.com>
19
Link: https://lore.kernel.org/r/20241127091543.1243114-3-jamin_lin@aspeedtech.com
20
Signed-off-by: Cédric Le Goater <clg@redhat.com>
15
---
21
---
16
hw/ssi/aspeed_smc.c | 234 +++++++++++++++++++++++++++++++++++++++++++-
22
tests/qtest/aspeed_smc-test.c | 546 +++++++++++++++++++---------------
17
1 file changed, 233 insertions(+), 1 deletion(-)
23
1 file changed, 299 insertions(+), 247 deletions(-)
18
24
19
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
25
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
20
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/ssi/aspeed_smc.c
27
--- a/tests/qtest/aspeed_smc-test.c
22
+++ b/hw/ssi/aspeed_smc.c
28
+++ b/tests/qtest/aspeed_smc-test.c
23
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@
24
* 0: 4 bytes
30
#define CTRL_USERMODE 0x3
25
* 0x1FFFFFC: 32M bytes
31
#define SR_WEL BIT(1)
26
*
32
27
- * DMA length is from 1 byte to 32MB (AST2600, AST10x0)
33
-#define ASPEED_FMC_BASE 0x1E620000
28
+ * DMA length is from 1 byte to 32MB (AST2600, AST10x0 and AST2700)
34
-#define ASPEED_FLASH_BASE 0x20000000
29
* 0: 1 byte
35
-
30
* 0x1FFFFFF: 32M bytes
36
/*
37
* Flash commands
31
*/
38
*/
32
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_1030_spi2_info = {
39
@@ -XXX,XX +XXX,XX @@ enum {
33
.class_init = aspeed_1030_spi2_class_init,
40
ERASE_SECTOR = 0xd8,
34
};
41
};
35
42
36
+/*
43
-#define FLASH_JEDEC 0x20ba19 /* n25q256a */
37
+ * The FMC Segment Registers of the AST2700 have a 64KB unit.
44
-#define FLASH_SIZE (32 * 1024 * 1024)
38
+ * Only bits [31:16] are used for decoding.
45
-
39
+ */
46
#define FLASH_PAGE_SIZE 256
40
+#define AST2700_SEG_ADDR_MASK 0xffff0000
47
48
+typedef struct TestData {
49
+ QTestState *s;
50
+ uint64_t spi_base;
51
+ uint64_t flash_base;
52
+ uint32_t jedec_id;
53
+ char *tmp_path;
54
+} TestData;
41
+
55
+
42
+static uint32_t aspeed_2700_smc_segment_to_reg(const AspeedSMCState *s,
56
/*
43
+ const AspeedSegments *seg)
57
* Use an explicit bswap for the values read/wrote to the flash region
58
* as they are BE and the Aspeed CPU is LE.
59
@@ -XXX,XX +XXX,XX @@ static inline uint32_t make_be32(uint32_t data)
60
return bswap32(data);
61
}
62
63
-static void spi_conf(uint32_t value)
64
+static inline void spi_writel(const TestData *data, uint64_t offset,
65
+ uint32_t value)
44
+{
66
+{
45
+ uint32_t reg = 0;
67
+ qtest_writel(data->s, data->spi_base + offset, value);
46
+
47
+ /* Disabled segments have a nil register */
48
+ if (!seg->size) {
49
+ return 0;
50
+ }
51
+
52
+ reg |= (seg->addr & AST2700_SEG_ADDR_MASK) >> 16; /* start offset */
53
+ reg |= (seg->addr + seg->size - 1) & AST2700_SEG_ADDR_MASK; /* end offset */
54
+ return reg;
55
+}
68
+}
56
+
69
+
57
+static void aspeed_2700_smc_reg_to_segment(const AspeedSMCState *s,
70
+static inline uint32_t spi_readl(const TestData *data, uint64_t offset)
58
+ uint32_t reg, AspeedSegments *seg)
59
+{
71
+{
60
+ uint32_t start_offset = (reg << 16) & AST2700_SEG_ADDR_MASK;
72
+ return qtest_readl(data->s, data->spi_base + offset);
61
+ uint32_t end_offset = reg & AST2700_SEG_ADDR_MASK;
62
+ AspeedSMCClass *asc = ASPEED_SMC_GET_CLASS(s);
63
+
64
+ if (reg) {
65
+ seg->addr = asc->flash_window_base + start_offset;
66
+ seg->size = end_offset + (64 * KiB) - start_offset;
67
+ } else {
68
+ seg->addr = asc->flash_window_base;
69
+ seg->size = 0;
70
+ }
71
+}
73
+}
72
+
74
+
73
+static const uint32_t aspeed_2700_fmc_resets[ASPEED_SMC_R_MAX] = {
75
+static inline void flash_writeb(const TestData *data, uint64_t offset,
74
+ [R_CONF] = (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0 |
76
+ uint8_t value)
75
+ CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1),
76
+ [R_CE_CTRL] = 0x0000aa00,
77
+ [R_CTRL0] = 0x406b0641,
78
+ [R_CTRL1] = 0x00000400,
79
+ [R_CTRL2] = 0x00000400,
80
+ [R_CTRL3] = 0x00000400,
81
+ [R_SEG_ADDR0] = 0x08000000,
82
+ [R_SEG_ADDR1] = 0x10000800,
83
+ [R_SEG_ADDR2] = 0x00000000,
84
+ [R_SEG_ADDR3] = 0x00000000,
85
+ [R_DUMMY_DATA] = 0x00010000,
86
+ [R_DMA_DRAM_ADDR_HIGH] = 0x00000000,
87
+ [R_TIMINGS] = 0x007b0000,
88
+};
89
+
90
+static const MemoryRegionOps aspeed_2700_smc_flash_ops = {
91
+ .read = aspeed_smc_flash_read,
92
+ .write = aspeed_smc_flash_write,
93
+ .endianness = DEVICE_LITTLE_ENDIAN,
94
+ .valid = {
95
+ .min_access_size = 1,
96
+ .max_access_size = 8,
97
+ },
98
+};
99
+
100
+static const AspeedSegments aspeed_2700_fmc_segments[] = {
101
+ { 0x0, 128 * MiB }, /* start address is readonly */
102
+ { 128 * MiB, 128 * MiB }, /* default is disabled but needed for -kernel */
103
+ { 256 * MiB, 128 * MiB }, /* default is disabled but needed for -kernel */
104
+ { 0x0, 0 }, /* disabled */
105
+};
106
+
107
+static void aspeed_2700_fmc_class_init(ObjectClass *klass, void *data)
108
+{
77
+{
109
+ DeviceClass *dc = DEVICE_CLASS(klass);
78
+ qtest_writeb(data->s, data->flash_base + offset, value);
110
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
111
+
112
+ dc->desc = "Aspeed 2700 FMC Controller";
113
+ asc->r_conf = R_CONF;
114
+ asc->r_ce_ctrl = R_CE_CTRL;
115
+ asc->r_ctrl0 = R_CTRL0;
116
+ asc->r_timings = R_TIMINGS;
117
+ asc->nregs_timings = 3;
118
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
119
+ asc->cs_num_max = 3;
120
+ asc->segments = aspeed_2700_fmc_segments;
121
+ asc->segment_addr_mask = 0xffffffff;
122
+ asc->resets = aspeed_2700_fmc_resets;
123
+ asc->flash_window_base = 0x100000000;
124
+ asc->flash_window_size = 1 * GiB;
125
+ asc->features = ASPEED_SMC_FEATURE_DMA |
126
+ ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH;
127
+ asc->dma_flash_mask = 0x2FFFFFFC;
128
+ asc->dma_dram_mask = 0xFFFFFFFC;
129
+ asc->dma_start_length = 1;
130
+ asc->nregs = ASPEED_SMC_R_MAX;
131
+ asc->segment_to_reg = aspeed_2700_smc_segment_to_reg;
132
+ asc->reg_to_segment = aspeed_2700_smc_reg_to_segment;
133
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
134
+ asc->reg_ops = &aspeed_2700_smc_flash_ops;
135
+}
79
+}
136
+
80
+
137
+static const TypeInfo aspeed_2700_fmc_info = {
81
+static inline void flash_writel(const TestData *data, uint64_t offset,
138
+ .name = "aspeed.fmc-ast2700",
82
+ uint32_t value)
139
+ .parent = TYPE_ASPEED_SMC,
140
+ .class_init = aspeed_2700_fmc_class_init,
141
+};
142
+
143
+static const AspeedSegments aspeed_2700_spi0_segments[] = {
144
+ { 0x0, 128 * MiB }, /* start address is readonly */
145
+ { 128 * MiB, 128 * MiB }, /* start address is readonly */
146
+ { 0x0, 0 }, /* disabled */
147
+};
148
+
149
+static void aspeed_2700_spi0_class_init(ObjectClass *klass, void *data)
150
+{
83
+{
151
+ DeviceClass *dc = DEVICE_CLASS(klass);
84
+ qtest_writel(data->s, data->flash_base + offset, value);
152
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
153
+
154
+ dc->desc = "Aspeed 2700 SPI0 Controller";
155
+ asc->r_conf = R_CONF;
156
+ asc->r_ce_ctrl = R_CE_CTRL;
157
+ asc->r_ctrl0 = R_CTRL0;
158
+ asc->r_timings = R_TIMINGS;
159
+ asc->nregs_timings = 2;
160
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
161
+ asc->cs_num_max = 2;
162
+ asc->segments = aspeed_2700_spi0_segments;
163
+ asc->segment_addr_mask = 0xffffffff;
164
+ asc->flash_window_base = 0x180000000;
165
+ asc->flash_window_size = 1 * GiB;
166
+ asc->features = ASPEED_SMC_FEATURE_DMA |
167
+ ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH;
168
+ asc->dma_flash_mask = 0x2FFFFFFC;
169
+ asc->dma_dram_mask = 0xFFFFFFFC;
170
+ asc->dma_start_length = 1;
171
+ asc->nregs = ASPEED_SMC_R_MAX;
172
+ asc->segment_to_reg = aspeed_2700_smc_segment_to_reg;
173
+ asc->reg_to_segment = aspeed_2700_smc_reg_to_segment;
174
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
175
+ asc->reg_ops = &aspeed_2700_smc_flash_ops;
176
+}
85
+}
177
+
86
+
178
+static const TypeInfo aspeed_2700_spi0_info = {
87
+static inline uint8_t flash_readb(const TestData *data, uint64_t offset)
179
+ .name = "aspeed.spi0-ast2700",
88
{
180
+ .parent = TYPE_ASPEED_SMC,
89
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CONF);
181
+ .class_init = aspeed_2700_spi0_class_init,
90
+ return qtest_readb(data->s, data->flash_base + offset);
182
+};
183
+
184
+static const AspeedSegments aspeed_2700_spi1_segments[] = {
185
+ { 0x0, 128 * MiB }, /* start address is readonly */
186
+ { 0x0, 0 }, /* disabled */
187
+};
188
+
189
+static void aspeed_2700_spi1_class_init(ObjectClass *klass, void *data)
190
+{
191
+ DeviceClass *dc = DEVICE_CLASS(klass);
192
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
193
+
194
+ dc->desc = "Aspeed 2700 SPI1 Controller";
195
+ asc->r_conf = R_CONF;
196
+ asc->r_ce_ctrl = R_CE_CTRL;
197
+ asc->r_ctrl0 = R_CTRL0;
198
+ asc->r_timings = R_TIMINGS;
199
+ asc->nregs_timings = 2;
200
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
201
+ asc->cs_num_max = 2;
202
+ asc->segments = aspeed_2700_spi1_segments;
203
+ asc->segment_addr_mask = 0xffffffff;
204
+ asc->flash_window_base = 0x200000000;
205
+ asc->flash_window_size = 1 * GiB;
206
+ asc->features = ASPEED_SMC_FEATURE_DMA |
207
+ ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH;
208
+ asc->dma_flash_mask = 0x2FFFFFFC;
209
+ asc->dma_dram_mask = 0xFFFFFFFC;
210
+ asc->dma_start_length = 1;
211
+ asc->nregs = ASPEED_SMC_R_MAX;
212
+ asc->segment_to_reg = aspeed_2700_smc_segment_to_reg;
213
+ asc->reg_to_segment = aspeed_2700_smc_reg_to_segment;
214
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
215
+ asc->reg_ops = &aspeed_2700_smc_flash_ops;
216
+}
91
+}
217
+
92
+
218
+static const TypeInfo aspeed_2700_spi1_info = {
93
+static inline uint32_t flash_readl(const TestData *data, uint64_t offset)
219
+ .name = "aspeed.spi1-ast2700",
220
+ .parent = TYPE_ASPEED_SMC,
221
+ .class_init = aspeed_2700_spi1_class_init,
222
+};
223
+
224
+static const AspeedSegments aspeed_2700_spi2_segments[] = {
225
+ { 0x0, 128 * MiB }, /* start address is readonly */
226
+ { 0x0, 0 }, /* disabled */
227
+};
228
+
229
+static void aspeed_2700_spi2_class_init(ObjectClass *klass, void *data)
230
+{
94
+{
231
+ DeviceClass *dc = DEVICE_CLASS(klass);
95
+ return qtest_readl(data->s, data->flash_base + offset);
232
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
233
+
234
+ dc->desc = "Aspeed 2700 SPI2 Controller";
235
+ asc->r_conf = R_CONF;
236
+ asc->r_ce_ctrl = R_CE_CTRL;
237
+ asc->r_ctrl0 = R_CTRL0;
238
+ asc->r_timings = R_TIMINGS;
239
+ asc->nregs_timings = 2;
240
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
241
+ asc->cs_num_max = 2;
242
+ asc->segments = aspeed_2700_spi2_segments;
243
+ asc->segment_addr_mask = 0xffffffff;
244
+ asc->flash_window_base = 0x280000000;
245
+ asc->flash_window_size = 1 * GiB;
246
+ asc->features = ASPEED_SMC_FEATURE_DMA |
247
+ ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH;
248
+ asc->dma_flash_mask = 0x0FFFFFFC;
249
+ asc->dma_dram_mask = 0xFFFFFFFC;
250
+ asc->dma_start_length = 1;
251
+ asc->nregs = ASPEED_SMC_R_MAX;
252
+ asc->segment_to_reg = aspeed_2700_smc_segment_to_reg;
253
+ asc->reg_to_segment = aspeed_2700_smc_reg_to_segment;
254
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
255
+ asc->reg_ops = &aspeed_2700_smc_flash_ops;
256
+}
96
+}
257
+
97
+
258
+static const TypeInfo aspeed_2700_spi2_info = {
98
+static void spi_conf(const TestData *data, uint32_t value)
259
+ .name = "aspeed.spi2-ast2700",
99
+{
260
+ .parent = TYPE_ASPEED_SMC,
100
+ uint32_t conf = spi_readl(data, R_CONF);
261
+ .class_init = aspeed_2700_spi2_class_init,
101
262
+};
102
conf |= value;
103
- writel(ASPEED_FMC_BASE + R_CONF, conf);
104
+ spi_writel(data, R_CONF, conf);
105
}
106
107
-static void spi_conf_remove(uint32_t value)
108
+static void spi_conf_remove(const TestData *data, uint32_t value)
109
{
110
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CONF);
111
+ uint32_t conf = spi_readl(data, R_CONF);
112
113
conf &= ~value;
114
- writel(ASPEED_FMC_BASE + R_CONF, conf);
115
+ spi_writel(data, R_CONF, conf);
116
}
117
118
-static void spi_ce_ctrl(uint32_t value)
119
+static void spi_ce_ctrl(const TestData *data, uint32_t value)
120
{
121
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CE_CTRL);
122
+ uint32_t conf = spi_readl(data, R_CE_CTRL);
123
124
conf |= value;
125
- writel(ASPEED_FMC_BASE + R_CE_CTRL, conf);
126
+ spi_writel(data, R_CE_CTRL, conf);
127
}
128
129
-static void spi_ctrl_setmode(uint8_t mode, uint8_t cmd)
130
+static void spi_ctrl_setmode(const TestData *data, uint8_t mode, uint8_t cmd)
131
{
132
- uint32_t ctrl = readl(ASPEED_FMC_BASE + R_CTRL0);
133
+ uint32_t ctrl = spi_readl(data, R_CTRL0);
134
ctrl &= ~(CTRL_USERMODE | 0xff << 16);
135
ctrl |= mode | (cmd << 16);
136
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
137
+ spi_writel(data, R_CTRL0, ctrl);
138
}
139
140
-static void spi_ctrl_start_user(void)
141
+static void spi_ctrl_start_user(const TestData *data)
142
{
143
- uint32_t ctrl = readl(ASPEED_FMC_BASE + R_CTRL0);
144
+ uint32_t ctrl = spi_readl(data, R_CTRL0);
145
146
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
147
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
148
+ spi_writel(data, R_CTRL0, ctrl);
149
150
ctrl &= ~CTRL_CE_STOP_ACTIVE;
151
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
152
+ spi_writel(data, R_CTRL0, ctrl);
153
}
154
155
-static void spi_ctrl_stop_user(void)
156
+static void spi_ctrl_stop_user(const TestData *data)
157
{
158
- uint32_t ctrl = readl(ASPEED_FMC_BASE + R_CTRL0);
159
+ uint32_t ctrl = spi_readl(data, R_CTRL0);
160
161
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
162
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
163
+ spi_writel(data, R_CTRL0, ctrl);
164
}
165
166
-static void flash_reset(void)
167
+static void flash_reset(const TestData *data)
168
{
169
- spi_conf(CONF_ENABLE_W0);
170
+ spi_conf(data, CONF_ENABLE_W0);
171
172
- spi_ctrl_start_user();
173
- writeb(ASPEED_FLASH_BASE, RESET_ENABLE);
174
- writeb(ASPEED_FLASH_BASE, RESET_MEMORY);
175
- writeb(ASPEED_FLASH_BASE, WREN);
176
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
177
- writeb(ASPEED_FLASH_BASE, WRDI);
178
- spi_ctrl_stop_user();
179
+ spi_ctrl_start_user(data);
180
+ flash_writeb(data, 0, RESET_ENABLE);
181
+ flash_writeb(data, 0, RESET_MEMORY);
182
+ flash_writeb(data, 0, WREN);
183
+ flash_writeb(data, 0, BULK_ERASE);
184
+ flash_writeb(data, 0, WRDI);
185
+ spi_ctrl_stop_user(data);
186
187
- spi_conf_remove(CONF_ENABLE_W0);
188
+ spi_conf_remove(data, CONF_ENABLE_W0);
189
}
190
191
-static void test_read_jedec(void)
192
+static void test_read_jedec(const void *data)
193
{
194
+ const TestData *test_data = (const TestData *)data;
195
uint32_t jedec = 0x0;
196
197
- spi_conf(CONF_ENABLE_W0);
198
+ spi_conf(test_data, CONF_ENABLE_W0);
199
200
- spi_ctrl_start_user();
201
- writeb(ASPEED_FLASH_BASE, JEDEC_READ);
202
- jedec |= readb(ASPEED_FLASH_BASE) << 16;
203
- jedec |= readb(ASPEED_FLASH_BASE) << 8;
204
- jedec |= readb(ASPEED_FLASH_BASE);
205
- spi_ctrl_stop_user();
206
+ spi_ctrl_start_user(test_data);
207
+ flash_writeb(test_data, 0, JEDEC_READ);
208
+ jedec |= flash_readb(test_data, 0) << 16;
209
+ jedec |= flash_readb(test_data, 0) << 8;
210
+ jedec |= flash_readb(test_data, 0);
211
+ spi_ctrl_stop_user(test_data);
212
213
- flash_reset();
214
+ flash_reset(test_data);
215
216
- g_assert_cmphex(jedec, ==, FLASH_JEDEC);
217
+ g_assert_cmphex(jedec, ==, test_data->jedec_id);
218
}
219
220
-static void read_page(uint32_t addr, uint32_t *page)
221
+static void read_page(const TestData *data, uint32_t addr, uint32_t *page)
222
{
223
int i;
224
225
- spi_ctrl_start_user();
226
+ spi_ctrl_start_user(data);
227
228
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
229
- writeb(ASPEED_FLASH_BASE, READ);
230
- writel(ASPEED_FLASH_BASE, make_be32(addr));
231
+ flash_writeb(data, 0, EN_4BYTE_ADDR);
232
+ flash_writeb(data, 0, READ);
233
+ flash_writel(data, 0, make_be32(addr));
234
235
/* Continuous read are supported */
236
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
237
- page[i] = make_be32(readl(ASPEED_FLASH_BASE));
238
+ page[i] = make_be32(flash_readl(data, 0));
239
}
240
- spi_ctrl_stop_user();
241
+ spi_ctrl_stop_user(data);
242
}
243
244
-static void read_page_mem(uint32_t addr, uint32_t *page)
245
+static void read_page_mem(const TestData *data, uint32_t addr, uint32_t *page)
246
{
247
int i;
248
249
/* move out USER mode to use direct reads from the AHB bus */
250
- spi_ctrl_setmode(CTRL_READMODE, READ);
251
+ spi_ctrl_setmode(data, CTRL_READMODE, READ);
252
253
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
254
- page[i] = make_be32(readl(ASPEED_FLASH_BASE + addr + i * 4));
255
+ page[i] = make_be32(flash_readl(data, addr + i * 4));
256
}
257
}
258
259
-static void write_page_mem(uint32_t addr, uint32_t write_value)
260
+static void write_page_mem(const TestData *data, uint32_t addr,
261
+ uint32_t write_value)
262
{
263
- spi_ctrl_setmode(CTRL_WRITEMODE, PP);
264
+ spi_ctrl_setmode(data, CTRL_WRITEMODE, PP);
265
266
for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
267
- writel(ASPEED_FLASH_BASE + addr + i * 4, write_value);
268
+ flash_writel(data, addr + i * 4, write_value);
269
}
270
}
271
272
-static void assert_page_mem(uint32_t addr, uint32_t expected_value)
273
+static void assert_page_mem(const TestData *data, uint32_t addr,
274
+ uint32_t expected_value)
275
{
276
uint32_t page[FLASH_PAGE_SIZE / 4];
277
- read_page_mem(addr, page);
278
+ read_page_mem(data, addr, page);
279
for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
280
g_assert_cmphex(page[i], ==, expected_value);
281
}
282
}
283
284
-static void test_erase_sector(void)
285
+static void test_erase_sector(const void *data)
286
{
287
+ const TestData *test_data = (const TestData *)data;
288
uint32_t some_page_addr = 0x600 * FLASH_PAGE_SIZE;
289
uint32_t page[FLASH_PAGE_SIZE / 4];
290
int i;
291
292
- spi_conf(CONF_ENABLE_W0);
293
+ spi_conf(test_data, CONF_ENABLE_W0);
294
295
/*
296
* Previous page should be full of 0xffs after backend is
297
* initialized
298
*/
299
- read_page(some_page_addr - FLASH_PAGE_SIZE, page);
300
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
301
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
302
g_assert_cmphex(page[i], ==, 0xffffffff);
303
}
304
305
- spi_ctrl_start_user();
306
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
307
- writeb(ASPEED_FLASH_BASE, WREN);
308
- writeb(ASPEED_FLASH_BASE, PP);
309
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
310
+ spi_ctrl_start_user(test_data);
311
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
312
+ flash_writeb(test_data, 0, WREN);
313
+ flash_writeb(test_data, 0, PP);
314
+ flash_writel(test_data, 0, make_be32(some_page_addr));
315
316
/* Fill the page with its own addresses */
317
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
318
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr + i * 4));
319
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
320
}
321
- spi_ctrl_stop_user();
322
+ spi_ctrl_stop_user(test_data);
323
324
/* Check the page is correctly written */
325
- read_page(some_page_addr, page);
326
+ read_page(test_data, some_page_addr, page);
327
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
328
g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
329
}
330
331
- spi_ctrl_start_user();
332
- writeb(ASPEED_FLASH_BASE, WREN);
333
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
334
- writeb(ASPEED_FLASH_BASE, ERASE_SECTOR);
335
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
336
- spi_ctrl_stop_user();
337
+ spi_ctrl_start_user(test_data);
338
+ flash_writeb(test_data, 0, WREN);
339
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
340
+ flash_writeb(test_data, 0, ERASE_SECTOR);
341
+ flash_writel(test_data, 0, make_be32(some_page_addr));
342
+ spi_ctrl_stop_user(test_data);
343
344
/* Check the page is erased */
345
- read_page(some_page_addr, page);
346
+ read_page(test_data, some_page_addr, page);
347
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
348
g_assert_cmphex(page[i], ==, 0xffffffff);
349
}
350
351
- flash_reset();
352
+ flash_reset(test_data);
353
}
354
355
-static void test_erase_all(void)
356
+static void test_erase_all(const void *data)
357
{
358
+ const TestData *test_data = (const TestData *)data;
359
uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
360
uint32_t page[FLASH_PAGE_SIZE / 4];
361
int i;
362
363
- spi_conf(CONF_ENABLE_W0);
364
+ spi_conf(test_data, CONF_ENABLE_W0);
365
366
/*
367
* Previous page should be full of 0xffs after backend is
368
* initialized
369
*/
370
- read_page(some_page_addr - FLASH_PAGE_SIZE, page);
371
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
372
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
373
g_assert_cmphex(page[i], ==, 0xffffffff);
374
}
375
376
- spi_ctrl_start_user();
377
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
378
- writeb(ASPEED_FLASH_BASE, WREN);
379
- writeb(ASPEED_FLASH_BASE, PP);
380
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
381
+ spi_ctrl_start_user(test_data);
382
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
383
+ flash_writeb(test_data, 0, WREN);
384
+ flash_writeb(test_data, 0, PP);
385
+ flash_writel(test_data, 0, make_be32(some_page_addr));
386
387
/* Fill the page with its own addresses */
388
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
389
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr + i * 4));
390
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
391
}
392
- spi_ctrl_stop_user();
393
+ spi_ctrl_stop_user(test_data);
394
395
/* Check the page is correctly written */
396
- read_page(some_page_addr, page);
397
+ read_page(test_data, some_page_addr, page);
398
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
399
g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
400
}
401
402
- spi_ctrl_start_user();
403
- writeb(ASPEED_FLASH_BASE, WREN);
404
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
405
- spi_ctrl_stop_user();
406
+ spi_ctrl_start_user(test_data);
407
+ flash_writeb(test_data, 0, WREN);
408
+ flash_writeb(test_data, 0, BULK_ERASE);
409
+ spi_ctrl_stop_user(test_data);
410
411
/* Check the page is erased */
412
- read_page(some_page_addr, page);
413
+ read_page(test_data, some_page_addr, page);
414
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
415
g_assert_cmphex(page[i], ==, 0xffffffff);
416
}
417
418
- flash_reset();
419
+ flash_reset(test_data);
420
}
421
422
-static void test_write_page(void)
423
+static void test_write_page(const void *data)
424
{
425
+ const TestData *test_data = (const TestData *)data;
426
uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
427
uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
428
uint32_t page[FLASH_PAGE_SIZE / 4];
429
int i;
430
431
- spi_conf(CONF_ENABLE_W0);
432
+ spi_conf(test_data, CONF_ENABLE_W0);
433
434
- spi_ctrl_start_user();
435
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
436
- writeb(ASPEED_FLASH_BASE, WREN);
437
- writeb(ASPEED_FLASH_BASE, PP);
438
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr));
439
+ spi_ctrl_start_user(test_data);
440
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
441
+ flash_writeb(test_data, 0, WREN);
442
+ flash_writeb(test_data, 0, PP);
443
+ flash_writel(test_data, 0, make_be32(my_page_addr));
444
445
/* Fill the page with its own addresses */
446
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
447
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr + i * 4));
448
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
449
}
450
- spi_ctrl_stop_user();
451
+ spi_ctrl_stop_user(test_data);
452
453
/* Check what was written */
454
- read_page(my_page_addr, page);
455
+ read_page(test_data, my_page_addr, page);
456
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
457
g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
458
}
459
460
/* Check some other page. It should be full of 0xff */
461
- read_page(some_page_addr, page);
462
+ read_page(test_data, some_page_addr, page);
463
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
464
g_assert_cmphex(page[i], ==, 0xffffffff);
465
}
466
467
- flash_reset();
468
+ flash_reset(test_data);
469
}
470
471
-static void test_read_page_mem(void)
472
+static void test_read_page_mem(const void *data)
473
{
474
+ const TestData *test_data = (const TestData *)data;
475
uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
476
uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
477
uint32_t page[FLASH_PAGE_SIZE / 4];
478
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(void)
479
* Enable 4BYTE mode for controller. This is should be strapped by
480
* HW for CE0 anyhow.
481
*/
482
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
483
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
484
485
/* Enable 4BYTE mode for flash. */
486
- spi_conf(CONF_ENABLE_W0);
487
- spi_ctrl_start_user();
488
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
489
- writeb(ASPEED_FLASH_BASE, WREN);
490
- writeb(ASPEED_FLASH_BASE, PP);
491
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr));
492
+ spi_conf(test_data, CONF_ENABLE_W0);
493
+ spi_ctrl_start_user(test_data);
494
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
495
+ flash_writeb(test_data, 0, WREN);
496
+ flash_writeb(test_data, 0, PP);
497
+ flash_writel(test_data, 0, make_be32(my_page_addr));
498
499
/* Fill the page with its own addresses */
500
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
501
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr + i * 4));
502
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
503
}
504
- spi_ctrl_stop_user();
505
- spi_conf_remove(CONF_ENABLE_W0);
506
+ spi_ctrl_stop_user(test_data);
507
+ spi_conf_remove(test_data, CONF_ENABLE_W0);
508
509
/* Check what was written */
510
- read_page_mem(my_page_addr, page);
511
+ read_page_mem(test_data, my_page_addr, page);
512
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
513
g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
514
}
515
516
/* Check some other page. It should be full of 0xff */
517
- read_page_mem(some_page_addr, page);
518
+ read_page_mem(test_data, some_page_addr, page);
519
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
520
g_assert_cmphex(page[i], ==, 0xffffffff);
521
}
522
523
- flash_reset();
524
+ flash_reset(test_data);
525
}
526
527
-static void test_write_page_mem(void)
528
+static void test_write_page_mem(const void *data)
529
{
530
+ const TestData *test_data = (const TestData *)data;
531
uint32_t my_page_addr = 0x15000 * FLASH_PAGE_SIZE;
532
uint32_t page[FLASH_PAGE_SIZE / 4];
533
int i;
534
@@ -XXX,XX +XXX,XX @@ static void test_write_page_mem(void)
535
* Enable 4BYTE mode for controller. This is should be strapped by
536
* HW for CE0 anyhow.
537
*/
538
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
539
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
540
541
/* Enable 4BYTE mode for flash. */
542
- spi_conf(CONF_ENABLE_W0);
543
- spi_ctrl_start_user();
544
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
545
- writeb(ASPEED_FLASH_BASE, WREN);
546
- spi_ctrl_stop_user();
547
+ spi_conf(test_data, CONF_ENABLE_W0);
548
+ spi_ctrl_start_user(test_data);
549
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
550
+ flash_writeb(test_data, 0, WREN);
551
+ spi_ctrl_stop_user(test_data);
552
553
/* move out USER mode to use direct writes to the AHB bus */
554
- spi_ctrl_setmode(CTRL_WRITEMODE, PP);
555
+ spi_ctrl_setmode(test_data, CTRL_WRITEMODE, PP);
556
557
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
558
- writel(ASPEED_FLASH_BASE + my_page_addr + i * 4,
559
+ flash_writel(test_data, my_page_addr + i * 4,
560
make_be32(my_page_addr + i * 4));
561
}
562
563
/* Check what was written */
564
- read_page_mem(my_page_addr, page);
565
+ read_page_mem(test_data, my_page_addr, page);
566
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
567
g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
568
}
569
570
- flash_reset();
571
+ flash_reset(test_data);
572
}
573
574
-static void test_read_status_reg(void)
575
+static void test_read_status_reg(const void *data)
576
{
577
+ const TestData *test_data = (const TestData *)data;
578
uint8_t r;
579
580
- spi_conf(CONF_ENABLE_W0);
581
+ spi_conf(test_data, CONF_ENABLE_W0);
582
583
- spi_ctrl_start_user();
584
- writeb(ASPEED_FLASH_BASE, RDSR);
585
- r = readb(ASPEED_FLASH_BASE);
586
- spi_ctrl_stop_user();
587
+ spi_ctrl_start_user(test_data);
588
+ flash_writeb(test_data, 0, RDSR);
589
+ r = flash_readb(test_data, 0);
590
+ spi_ctrl_stop_user(test_data);
591
592
g_assert_cmphex(r & SR_WEL, ==, 0);
593
g_assert(!qtest_qom_get_bool
594
- (global_qtest, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
595
+ (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
596
597
- spi_ctrl_start_user();
598
- writeb(ASPEED_FLASH_BASE, WREN);
599
- writeb(ASPEED_FLASH_BASE, RDSR);
600
- r = readb(ASPEED_FLASH_BASE);
601
- spi_ctrl_stop_user();
602
+ spi_ctrl_start_user(test_data);
603
+ flash_writeb(test_data, 0, WREN);
604
+ flash_writeb(test_data, 0, RDSR);
605
+ r = flash_readb(test_data, 0);
606
+ spi_ctrl_stop_user(test_data);
607
608
g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
609
g_assert(qtest_qom_get_bool
610
- (global_qtest, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
611
+ (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
612
613
- spi_ctrl_start_user();
614
- writeb(ASPEED_FLASH_BASE, WRDI);
615
- writeb(ASPEED_FLASH_BASE, RDSR);
616
- r = readb(ASPEED_FLASH_BASE);
617
- spi_ctrl_stop_user();
618
+ spi_ctrl_start_user(test_data);
619
+ flash_writeb(test_data, 0, WRDI);
620
+ flash_writeb(test_data, 0, RDSR);
621
+ r = flash_readb(test_data, 0);
622
+ spi_ctrl_stop_user(test_data);
623
624
g_assert_cmphex(r & SR_WEL, ==, 0);
625
g_assert(!qtest_qom_get_bool
626
- (global_qtest, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
627
+ (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
628
629
- flash_reset();
630
+ flash_reset(test_data);
631
}
632
633
-static void test_status_reg_write_protection(void)
634
+static void test_status_reg_write_protection(const void *data)
635
{
636
+ const TestData *test_data = (const TestData *)data;
637
uint8_t r;
638
639
- spi_conf(CONF_ENABLE_W0);
640
+ spi_conf(test_data, CONF_ENABLE_W0);
641
642
/* default case: WP# is high and SRWD is low -> status register writable */
643
- spi_ctrl_start_user();
644
- writeb(ASPEED_FLASH_BASE, WREN);
645
+ spi_ctrl_start_user(test_data);
646
+ flash_writeb(test_data, 0, WREN);
647
/* test ability to write SRWD */
648
- writeb(ASPEED_FLASH_BASE, WRSR);
649
- writeb(ASPEED_FLASH_BASE, SRWD);
650
- writeb(ASPEED_FLASH_BASE, RDSR);
651
- r = readb(ASPEED_FLASH_BASE);
652
- spi_ctrl_stop_user();
653
+ flash_writeb(test_data, 0, WRSR);
654
+ flash_writeb(test_data, 0, SRWD);
655
+ flash_writeb(test_data, 0, RDSR);
656
+ r = flash_readb(test_data, 0);
657
+ spi_ctrl_stop_user(test_data);
658
g_assert_cmphex(r & SRWD, ==, SRWD);
659
660
/* WP# high and SRWD high -> status register writable */
661
- spi_ctrl_start_user();
662
- writeb(ASPEED_FLASH_BASE, WREN);
663
+ spi_ctrl_start_user(test_data);
664
+ flash_writeb(test_data, 0, WREN);
665
/* test ability to write SRWD */
666
- writeb(ASPEED_FLASH_BASE, WRSR);
667
- writeb(ASPEED_FLASH_BASE, 0);
668
- writeb(ASPEED_FLASH_BASE, RDSR);
669
- r = readb(ASPEED_FLASH_BASE);
670
- spi_ctrl_stop_user();
671
+ flash_writeb(test_data, 0, WRSR);
672
+ flash_writeb(test_data, 0, 0);
673
+ flash_writeb(test_data, 0, RDSR);
674
+ r = flash_readb(test_data, 0);
675
+ spi_ctrl_stop_user(test_data);
676
g_assert_cmphex(r & SRWD, ==, 0);
677
678
/* WP# low and SRWD low -> status register writable */
679
- qtest_set_irq_in(global_qtest,
680
+ qtest_set_irq_in(test_data->s,
681
"/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 0);
682
- spi_ctrl_start_user();
683
- writeb(ASPEED_FLASH_BASE, WREN);
684
+ spi_ctrl_start_user(test_data);
685
+ flash_writeb(test_data, 0, WREN);
686
/* test ability to write SRWD */
687
- writeb(ASPEED_FLASH_BASE, WRSR);
688
- writeb(ASPEED_FLASH_BASE, SRWD);
689
- writeb(ASPEED_FLASH_BASE, RDSR);
690
- r = readb(ASPEED_FLASH_BASE);
691
- spi_ctrl_stop_user();
692
+ flash_writeb(test_data, 0, WRSR);
693
+ flash_writeb(test_data, 0, SRWD);
694
+ flash_writeb(test_data, 0, RDSR);
695
+ r = flash_readb(test_data, 0);
696
+ spi_ctrl_stop_user(test_data);
697
g_assert_cmphex(r & SRWD, ==, SRWD);
698
699
/* WP# low and SRWD high -> status register NOT writable */
700
- spi_ctrl_start_user();
701
- writeb(ASPEED_FLASH_BASE, WREN);
702
+ spi_ctrl_start_user(test_data);
703
+ flash_writeb(test_data, 0 , WREN);
704
/* test ability to write SRWD */
705
- writeb(ASPEED_FLASH_BASE, WRSR);
706
- writeb(ASPEED_FLASH_BASE, 0);
707
- writeb(ASPEED_FLASH_BASE, RDSR);
708
- r = readb(ASPEED_FLASH_BASE);
709
- spi_ctrl_stop_user();
710
+ flash_writeb(test_data, 0, WRSR);
711
+ flash_writeb(test_data, 0, 0);
712
+ flash_writeb(test_data, 0, RDSR);
713
+ r = flash_readb(test_data, 0);
714
+ spi_ctrl_stop_user(test_data);
715
/* write is not successful */
716
g_assert_cmphex(r & SRWD, ==, SRWD);
717
718
- qtest_set_irq_in(global_qtest,
719
+ qtest_set_irq_in(test_data->s,
720
"/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 1);
721
- flash_reset();
722
+ flash_reset(test_data);
723
}
724
725
-static void test_write_block_protect(void)
726
+static void test_write_block_protect(const void *data)
727
{
728
+ const TestData *test_data = (const TestData *)data;
729
uint32_t sector_size = 65536;
730
uint32_t n_sectors = 512;
731
732
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
733
- spi_conf(CONF_ENABLE_W0);
734
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
735
+ spi_conf(test_data, CONF_ENABLE_W0);
736
737
uint32_t bp_bits = 0b0;
738
739
for (int i = 0; i < 16; i++) {
740
bp_bits = ((i & 0b1000) << 3) | ((i & 0b0111) << 2);
741
742
- spi_ctrl_start_user();
743
- writeb(ASPEED_FLASH_BASE, WREN);
744
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
745
- writeb(ASPEED_FLASH_BASE, WREN);
746
- writeb(ASPEED_FLASH_BASE, WRSR);
747
- writeb(ASPEED_FLASH_BASE, bp_bits);
748
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
749
- writeb(ASPEED_FLASH_BASE, WREN);
750
- spi_ctrl_stop_user();
751
+ spi_ctrl_start_user(test_data);
752
+ flash_writeb(test_data, 0, WREN);
753
+ flash_writeb(test_data, 0, BULK_ERASE);
754
+ flash_writeb(test_data, 0, WREN);
755
+ flash_writeb(test_data, 0, WRSR);
756
+ flash_writeb(test_data, 0, bp_bits);
757
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
758
+ flash_writeb(test_data, 0, WREN);
759
+ spi_ctrl_stop_user(test_data);
760
761
uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
762
uint32_t protection_start = n_sectors - num_protected_sectors;
763
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect(void)
764
for (int sector = 0; sector < n_sectors; sector++) {
765
uint32_t addr = sector * sector_size;
766
767
- assert_page_mem(addr, 0xffffffff);
768
- write_page_mem(addr, make_be32(0xabcdef12));
769
+ assert_page_mem(test_data, addr, 0xffffffff);
770
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
771
772
uint32_t expected_value = protection_start <= sector
773
&& sector < protection_end
774
? 0xffffffff : 0xabcdef12;
775
776
- assert_page_mem(addr, expected_value);
777
+ assert_page_mem(test_data, addr, expected_value);
778
}
779
}
780
781
- flash_reset();
782
+ flash_reset(test_data);
783
}
784
785
-static void test_write_block_protect_bottom_bit(void)
786
+static void test_write_block_protect_bottom_bit(const void *data)
787
{
788
+ const TestData *test_data = (const TestData *)data;
789
uint32_t sector_size = 65536;
790
uint32_t n_sectors = 512;
791
792
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
793
- spi_conf(CONF_ENABLE_W0);
794
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
795
+ spi_conf(test_data, CONF_ENABLE_W0);
796
797
/* top bottom bit is enabled */
798
uint32_t bp_bits = 0b00100 << 3;
799
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
800
for (int i = 0; i < 16; i++) {
801
bp_bits = (((i & 0b1000) | 0b0100) << 3) | ((i & 0b0111) << 2);
802
803
- spi_ctrl_start_user();
804
- writeb(ASPEED_FLASH_BASE, WREN);
805
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
806
- writeb(ASPEED_FLASH_BASE, WREN);
807
- writeb(ASPEED_FLASH_BASE, WRSR);
808
- writeb(ASPEED_FLASH_BASE, bp_bits);
809
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
810
- writeb(ASPEED_FLASH_BASE, WREN);
811
- spi_ctrl_stop_user();
812
+ spi_ctrl_start_user(test_data);
813
+ flash_writeb(test_data, 0, WREN);
814
+ flash_writeb(test_data, 0, BULK_ERASE);
815
+ flash_writeb(test_data, 0, WREN);
816
+ flash_writeb(test_data, 0, WRSR);
817
+ flash_writeb(test_data, 0, bp_bits);
818
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
819
+ flash_writeb(test_data, 0, WREN);
820
+ spi_ctrl_stop_user(test_data);
821
822
uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
823
uint32_t protection_start = 0;
824
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
825
for (int sector = 0; sector < n_sectors; sector++) {
826
uint32_t addr = sector * sector_size;
827
828
- assert_page_mem(addr, 0xffffffff);
829
- write_page_mem(addr, make_be32(0xabcdef12));
830
+ assert_page_mem(test_data, addr, 0xffffffff);
831
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
832
833
uint32_t expected_value = protection_start <= sector
834
&& sector < protection_end
835
? 0xffffffff : 0xabcdef12;
836
837
- assert_page_mem(addr, expected_value);
838
+ assert_page_mem(test_data, addr, expected_value);
839
}
840
}
841
842
- flash_reset();
843
+ flash_reset(test_data);
844
}
845
846
-static int test_palmetto_bmc(void)
847
+static void test_palmetto_bmc(TestData *data)
848
{
849
- g_autofree char *tmp_path = NULL;
850
int ret;
851
int fd;
852
853
- fd = g_file_open_tmp("qtest.m25p80.XXXXXX", &tmp_path, NULL);
854
+ fd = g_file_open_tmp("qtest.m25p80.n25q256a.XXXXXX", &data->tmp_path, NULL);
855
g_assert(fd >= 0);
856
- ret = ftruncate(fd, FLASH_SIZE);
857
+ ret = ftruncate(fd, 32 * 1024 * 1024);
858
g_assert(ret == 0);
859
close(fd);
860
861
- global_qtest = qtest_initf("-m 256 -machine palmetto-bmc "
862
- "-drive file=%s,format=raw,if=mtd",
863
- tmp_path);
864
-
865
- qtest_add_func("/ast2400/smc/read_jedec", test_read_jedec);
866
- qtest_add_func("/ast2400/smc/erase_sector", test_erase_sector);
867
- qtest_add_func("/ast2400/smc/erase_all", test_erase_all);
868
- qtest_add_func("/ast2400/smc/write_page", test_write_page);
869
- qtest_add_func("/ast2400/smc/read_page_mem", test_read_page_mem);
870
- qtest_add_func("/ast2400/smc/write_page_mem", test_write_page_mem);
871
- qtest_add_func("/ast2400/smc/read_status_reg", test_read_status_reg);
872
- qtest_add_func("/ast2400/smc/status_reg_write_protection",
873
- test_status_reg_write_protection);
874
- qtest_add_func("/ast2400/smc/write_block_protect",
875
- test_write_block_protect);
876
- qtest_add_func("/ast2400/smc/write_block_protect_bottom_bit",
877
- test_write_block_protect_bottom_bit);
878
-
879
- flash_reset();
880
- ret = g_test_run();
881
- qtest_quit(global_qtest);
882
- unlink(tmp_path);
883
-
884
- return ret;
885
+ data->s = qtest_initf("-m 256 -machine palmetto-bmc "
886
+ "-drive file=%s,format=raw,if=mtd",
887
+ data->tmp_path);
263
+
888
+
264
static void aspeed_smc_register_types(void)
889
+ /* fmc cs0 with n25q256a flash */
265
{
890
+ data->flash_base = 0x20000000;
266
type_register_static(&aspeed_smc_flash_info);
891
+ data->spi_base = 0x1E620000;
267
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_register_types(void)
892
+ data->jedec_id = 0x20ba19;
268
type_register_static(&aspeed_1030_fmc_info);
893
+
269
type_register_static(&aspeed_1030_spi1_info);
894
+ qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
270
type_register_static(&aspeed_1030_spi2_info);
895
+ qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
271
+ type_register_static(&aspeed_2700_fmc_info);
896
+ qtest_add_data_func("/ast2400/smc/erase_all", data, test_erase_all);
272
+ type_register_static(&aspeed_2700_spi0_info);
897
+ qtest_add_data_func("/ast2400/smc/write_page", data, test_write_page);
273
+ type_register_static(&aspeed_2700_spi1_info);
898
+ qtest_add_data_func("/ast2400/smc/read_page_mem",
274
+ type_register_static(&aspeed_2700_spi2_info);
899
+ data, test_read_page_mem);
275
}
900
+ qtest_add_data_func("/ast2400/smc/write_page_mem",
276
901
+ data, test_write_page_mem);
277
type_init(aspeed_smc_register_types)
902
+ qtest_add_data_func("/ast2400/smc/read_status_reg",
903
+ data, test_read_status_reg);
904
+ qtest_add_data_func("/ast2400/smc/status_reg_write_protection",
905
+ data, test_status_reg_write_protection);
906
+ qtest_add_data_func("/ast2400/smc/write_block_protect",
907
+ data, test_write_block_protect);
908
+ qtest_add_data_func("/ast2400/smc/write_block_protect_bottom_bit",
909
+ data, test_write_block_protect_bottom_bit);
910
}
911
912
int main(int argc, char **argv)
913
{
914
+ TestData palmetto_data;
915
int ret;
916
917
g_test_init(&argc, &argv, NULL);
918
- ret = test_palmetto_bmc();
919
920
+ test_palmetto_bmc(&palmetto_data);
921
+ ret = g_test_run();
922
+
923
+ qtest_quit(palmetto_data.s);
924
+ unlink(palmetto_data.tmp_path);
925
return ret;
926
}
278
--
927
--
279
2.45.2
928
2.47.1
280
929
281
930
diff view generated by jsdifflib
New patch
1
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
3
Currently, these test cases only support to test CE0. To test all CE pins,
4
introduces new ce and node members in TestData structure. The ce member is used
5
for saving the ce index and node member is used for saving the node path,
6
respectively.
7
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Link: https://lore.kernel.org/r/20241127091543.1243114-4-jamin_lin@aspeedtech.com
11
Signed-off-by: Cédric Le Goater <clg@redhat.com>
12
---
13
tests/qtest/aspeed_smc-test.c | 77 ++++++++++++++++++-----------------
14
1 file changed, 40 insertions(+), 37 deletions(-)
15
16
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/qtest/aspeed_smc-test.c
19
+++ b/tests/qtest/aspeed_smc-test.c
20
@@ -XXX,XX +XXX,XX @@
21
* ASPEED SPI Controller registers
22
*/
23
#define R_CONF 0x00
24
-#define CONF_ENABLE_W0 (1 << 16)
25
+#define CONF_ENABLE_W0 16
26
#define R_CE_CTRL 0x04
27
#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
28
#define R_CTRL0 0x10
29
-#define CTRL_CE_STOP_ACTIVE (1 << 2)
30
+#define CTRL_CE_STOP_ACTIVE BIT(2)
31
#define CTRL_READMODE 0x0
32
#define CTRL_FREADMODE 0x1
33
#define CTRL_WRITEMODE 0x2
34
@@ -XXX,XX +XXX,XX @@ typedef struct TestData {
35
uint64_t flash_base;
36
uint32_t jedec_id;
37
char *tmp_path;
38
+ uint8_t cs;
39
+ const char *node;
40
} TestData;
41
42
/*
43
@@ -XXX,XX +XXX,XX @@ static void spi_ce_ctrl(const TestData *data, uint32_t value)
44
45
static void spi_ctrl_setmode(const TestData *data, uint8_t mode, uint8_t cmd)
46
{
47
- uint32_t ctrl = spi_readl(data, R_CTRL0);
48
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
49
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
50
ctrl &= ~(CTRL_USERMODE | 0xff << 16);
51
ctrl |= mode | (cmd << 16);
52
- spi_writel(data, R_CTRL0, ctrl);
53
+ spi_writel(data, ctrl_reg, ctrl);
54
}
55
56
static void spi_ctrl_start_user(const TestData *data)
57
{
58
- uint32_t ctrl = spi_readl(data, R_CTRL0);
59
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
60
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
61
62
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
63
- spi_writel(data, R_CTRL0, ctrl);
64
+ spi_writel(data, ctrl_reg, ctrl);
65
66
ctrl &= ~CTRL_CE_STOP_ACTIVE;
67
- spi_writel(data, R_CTRL0, ctrl);
68
+ spi_writel(data, ctrl_reg, ctrl);
69
}
70
71
static void spi_ctrl_stop_user(const TestData *data)
72
{
73
- uint32_t ctrl = spi_readl(data, R_CTRL0);
74
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
75
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
76
77
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
78
- spi_writel(data, R_CTRL0, ctrl);
79
+ spi_writel(data, ctrl_reg, ctrl);
80
}
81
82
static void flash_reset(const TestData *data)
83
{
84
- spi_conf(data, CONF_ENABLE_W0);
85
+ spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
86
87
spi_ctrl_start_user(data);
88
flash_writeb(data, 0, RESET_ENABLE);
89
@@ -XXX,XX +XXX,XX @@ static void flash_reset(const TestData *data)
90
flash_writeb(data, 0, WRDI);
91
spi_ctrl_stop_user(data);
92
93
- spi_conf_remove(data, CONF_ENABLE_W0);
94
+ spi_conf_remove(data, 1 << (CONF_ENABLE_W0 + data->cs));
95
}
96
97
static void test_read_jedec(const void *data)
98
@@ -XXX,XX +XXX,XX @@ static void test_read_jedec(const void *data)
99
const TestData *test_data = (const TestData *)data;
100
uint32_t jedec = 0x0;
101
102
- spi_conf(test_data, CONF_ENABLE_W0);
103
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
104
105
spi_ctrl_start_user(test_data);
106
flash_writeb(test_data, 0, JEDEC_READ);
107
@@ -XXX,XX +XXX,XX @@ static void test_erase_sector(const void *data)
108
uint32_t page[FLASH_PAGE_SIZE / 4];
109
int i;
110
111
- spi_conf(test_data, CONF_ENABLE_W0);
112
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
113
114
/*
115
* Previous page should be full of 0xffs after backend is
116
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(const void *data)
117
uint32_t page[FLASH_PAGE_SIZE / 4];
118
int i;
119
120
- spi_conf(test_data, CONF_ENABLE_W0);
121
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
122
123
/*
124
* Previous page should be full of 0xffs after backend is
125
@@ -XXX,XX +XXX,XX @@ static void test_write_page(const void *data)
126
uint32_t page[FLASH_PAGE_SIZE / 4];
127
int i;
128
129
- spi_conf(test_data, CONF_ENABLE_W0);
130
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
131
132
spi_ctrl_start_user(test_data);
133
flash_writeb(test_data, 0, EN_4BYTE_ADDR);
134
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
135
int i;
136
137
/*
138
- * Enable 4BYTE mode for controller. This is should be strapped by
139
- * HW for CE0 anyhow.
140
+ * Enable 4BYTE mode for controller.
141
*/
142
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
143
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
144
145
/* Enable 4BYTE mode for flash. */
146
- spi_conf(test_data, CONF_ENABLE_W0);
147
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
148
spi_ctrl_start_user(test_data);
149
flash_writeb(test_data, 0, EN_4BYTE_ADDR);
150
flash_writeb(test_data, 0, WREN);
151
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
152
flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
153
}
154
spi_ctrl_stop_user(test_data);
155
- spi_conf_remove(test_data, CONF_ENABLE_W0);
156
+ spi_conf_remove(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
157
158
/* Check what was written */
159
read_page_mem(test_data, my_page_addr, page);
160
@@ -XXX,XX +XXX,XX @@ static void test_write_page_mem(const void *data)
161
int i;
162
163
/*
164
- * Enable 4BYTE mode for controller. This is should be strapped by
165
- * HW for CE0 anyhow.
166
+ * Enable 4BYTE mode for controller.
167
*/
168
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
169
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
170
171
/* Enable 4BYTE mode for flash. */
172
- spi_conf(test_data, CONF_ENABLE_W0);
173
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
174
spi_ctrl_start_user(test_data);
175
flash_writeb(test_data, 0, EN_4BYTE_ADDR);
176
flash_writeb(test_data, 0, WREN);
177
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
178
const TestData *test_data = (const TestData *)data;
179
uint8_t r;
180
181
- spi_conf(test_data, CONF_ENABLE_W0);
182
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
183
184
spi_ctrl_start_user(test_data);
185
flash_writeb(test_data, 0, RDSR);
186
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
187
188
g_assert_cmphex(r & SR_WEL, ==, 0);
189
g_assert(!qtest_qom_get_bool
190
- (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
191
+ (test_data->s, test_data->node, "write-enable"));
192
193
spi_ctrl_start_user(test_data);
194
flash_writeb(test_data, 0, WREN);
195
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
196
197
g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
198
g_assert(qtest_qom_get_bool
199
- (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
200
+ (test_data->s, test_data->node, "write-enable"));
201
202
spi_ctrl_start_user(test_data);
203
flash_writeb(test_data, 0, WRDI);
204
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
205
206
g_assert_cmphex(r & SR_WEL, ==, 0);
207
g_assert(!qtest_qom_get_bool
208
- (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
209
+ (test_data->s, test_data->node, "write-enable"));
210
211
flash_reset(test_data);
212
}
213
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(const void *data)
214
const TestData *test_data = (const TestData *)data;
215
uint8_t r;
216
217
- spi_conf(test_data, CONF_ENABLE_W0);
218
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
219
220
/* default case: WP# is high and SRWD is low -> status register writable */
221
spi_ctrl_start_user(test_data);
222
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(const void *data)
223
g_assert_cmphex(r & SRWD, ==, 0);
224
225
/* WP# low and SRWD low -> status register writable */
226
- qtest_set_irq_in(test_data->s,
227
- "/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 0);
228
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 0);
229
spi_ctrl_start_user(test_data);
230
flash_writeb(test_data, 0, WREN);
231
/* test ability to write SRWD */
232
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(const void *data)
233
/* write is not successful */
234
g_assert_cmphex(r & SRWD, ==, SRWD);
235
236
- qtest_set_irq_in(test_data->s,
237
- "/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 1);
238
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 1);
239
flash_reset(test_data);
240
}
241
242
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect(const void *data)
243
uint32_t sector_size = 65536;
244
uint32_t n_sectors = 512;
245
246
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
247
- spi_conf(test_data, CONF_ENABLE_W0);
248
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
249
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
250
251
uint32_t bp_bits = 0b0;
252
253
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(const void *data)
254
uint32_t sector_size = 65536;
255
uint32_t n_sectors = 512;
256
257
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
258
- spi_conf(test_data, CONF_ENABLE_W0);
259
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
260
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
261
262
/* top bottom bit is enabled */
263
uint32_t bp_bits = 0b00100 << 3;
264
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
265
data->flash_base = 0x20000000;
266
data->spi_base = 0x1E620000;
267
data->jedec_id = 0x20ba19;
268
+ data->cs = 0;
269
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
270
271
qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
272
qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
273
--
274
2.47.1
275
276
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Add ASPEED members "Steven Lee", "Troy Lee" and "Jamin Lin"
3
Currently, these test cases used the hardcode offset 0x1400000 (0x14000 * 256)
4
to be reviewers of ASPEED BMCs.
4
which was beyond the 16MB flash size for flash page read/write command testing.
5
However, the default fmc flash model of ast1030-a1 EVB is "w25q80bl" whose size
6
is 1MB. To test SoC flash models, introduces a new page_addr member in TestData
7
structure, so users can set the offset for flash page read/write command
8
testing.
5
9
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
8
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
9
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
12
Link: https://lore.kernel.org/r/20241127091543.1243114-5-jamin_lin@aspeedtech.com
11
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
13
Signed-off-by: Cédric Le Goater <clg@redhat.com>
12
---
14
---
13
MAINTAINERS | 3 +++
15
tests/qtest/aspeed_smc-test.c | 17 ++++++++++-------
14
1 file changed, 3 insertions(+)
16
1 file changed, 10 insertions(+), 7 deletions(-)
15
17
16
diff --git a/MAINTAINERS b/MAINTAINERS
18
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
17
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
18
--- a/MAINTAINERS
20
--- a/tests/qtest/aspeed_smc-test.c
19
+++ b/MAINTAINERS
21
+++ b/tests/qtest/aspeed_smc-test.c
20
@@ -XXX,XX +XXX,XX @@ F: docs/system/arm/emcraft-sf2.rst
22
@@ -XXX,XX +XXX,XX @@ typedef struct TestData {
21
ASPEED BMCs
23
char *tmp_path;
22
M: Cédric Le Goater <clg@kaod.org>
24
uint8_t cs;
23
M: Peter Maydell <peter.maydell@linaro.org>
25
const char *node;
24
+R: Steven Lee <steven_lee@aspeedtech.com>
26
+ uint32_t page_addr;
25
+R: Troy Lee <leetroy@gmail.com>
27
} TestData;
26
+R: Jamin Lin <jamin_lin@aspeedtech.com>
28
27
R: Andrew Jeffery <andrew@codeconstruct.com.au>
29
/*
28
R: Joel Stanley <joel@jms.id.au>
30
@@ -XXX,XX +XXX,XX @@ static void assert_page_mem(const TestData *data, uint32_t addr,
29
L: qemu-arm@nongnu.org
31
static void test_erase_sector(const void *data)
32
{
33
const TestData *test_data = (const TestData *)data;
34
- uint32_t some_page_addr = 0x600 * FLASH_PAGE_SIZE;
35
+ uint32_t some_page_addr = test_data->page_addr;
36
uint32_t page[FLASH_PAGE_SIZE / 4];
37
int i;
38
39
@@ -XXX,XX +XXX,XX @@ static void test_erase_sector(const void *data)
40
static void test_erase_all(const void *data)
41
{
42
const TestData *test_data = (const TestData *)data;
43
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
44
+ uint32_t some_page_addr = test_data->page_addr;
45
uint32_t page[FLASH_PAGE_SIZE / 4];
46
int i;
47
48
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(const void *data)
49
static void test_write_page(const void *data)
50
{
51
const TestData *test_data = (const TestData *)data;
52
- uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
53
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
54
+ uint32_t my_page_addr = test_data->page_addr;
55
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
56
uint32_t page[FLASH_PAGE_SIZE / 4];
57
int i;
58
59
@@ -XXX,XX +XXX,XX @@ static void test_write_page(const void *data)
60
static void test_read_page_mem(const void *data)
61
{
62
const TestData *test_data = (const TestData *)data;
63
- uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
64
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
65
+ uint32_t my_page_addr = test_data->page_addr;
66
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
67
uint32_t page[FLASH_PAGE_SIZE / 4];
68
int i;
69
70
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
71
static void test_write_page_mem(const void *data)
72
{
73
const TestData *test_data = (const TestData *)data;
74
- uint32_t my_page_addr = 0x15000 * FLASH_PAGE_SIZE;
75
+ uint32_t my_page_addr = test_data->page_addr;
76
uint32_t page[FLASH_PAGE_SIZE / 4];
77
int i;
78
79
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
80
data->jedec_id = 0x20ba19;
81
data->cs = 0;
82
data->node = "/machine/soc/fmc/ssi.0/child[0]";
83
+ /* beyond 16MB */
84
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
85
86
qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
87
qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
30
--
88
--
31
2.45.2
89
2.47.1
32
90
33
91
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
3
Add test_ast2500_evb function and reused testcases for AST2500 testing.
4
The spi base address, flash base address and ce index of fmc_cs0 are
5
0x1E620000, 0x20000000 and 0, respectively.
6
The default flash model of fmc_cs0 is "mx25l25635e" whose size is 32MB,
7
so set jedec_id 0xc22019.
8
4
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
5
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-6-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
6
---
13
---
7
hw/ssi/aspeed_smc.c | 6 +++---
14
tests/qtest/aspeed_smc-test.c | 40 +++++++++++++++++++++++++++++++++++
8
1 file changed, 3 insertions(+), 3 deletions(-)
15
1 file changed, 40 insertions(+)
9
16
10
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
11
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/ssi/aspeed_smc.c
19
--- a/tests/qtest/aspeed_smc-test.c
13
+++ b/hw/ssi/aspeed_smc.c
20
+++ b/tests/qtest/aspeed_smc-test.c
14
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_fmc_class_init(ObjectClass *klass, void *data)
21
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
15
DeviceClass *dc = DEVICE_CLASS(klass);
22
data, test_write_block_protect_bottom_bit);
16
AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
23
}
17
24
18
- dc->desc = "Aspeed 2600 FMC Controller";
25
+static void test_ast2500_evb(TestData *data)
19
+ dc->desc = "Aspeed 2500 FMC Controller";
26
+{
20
asc->r_conf = R_CONF;
27
+ int ret;
21
asc->r_ce_ctrl = R_CE_CTRL;
28
+ int fd;
22
asc->r_ctrl0 = R_CTRL0;
29
+
23
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_spi1_class_init(ObjectClass *klass, void *data)
30
+ fd = g_file_open_tmp("qtest.m25p80.mx25l25635e.XXXXXX",
24
DeviceClass *dc = DEVICE_CLASS(klass);
31
+ &data->tmp_path, NULL);
25
AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
32
+ g_assert(fd >= 0);
26
33
+ ret = ftruncate(fd, 32 * 1024 * 1024);
27
- dc->desc = "Aspeed 2600 SPI1 Controller";
34
+ g_assert(ret == 0);
28
+ dc->desc = "Aspeed 2500 SPI1 Controller";
35
+ close(fd);
29
asc->r_conf = R_CONF;
36
+
30
asc->r_ce_ctrl = R_CE_CTRL;
37
+ data->s = qtest_initf("-machine ast2500-evb "
31
asc->r_ctrl0 = R_CTRL0;
38
+ "-drive file=%s,format=raw,if=mtd",
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_spi2_class_init(ObjectClass *klass, void *data)
39
+ data->tmp_path);
33
DeviceClass *dc = DEVICE_CLASS(klass);
40
+
34
AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
41
+ /* fmc cs0 with mx25l25635e flash */
35
42
+ data->flash_base = 0x20000000;
36
- dc->desc = "Aspeed 2600 SPI2 Controller";
43
+ data->spi_base = 0x1E620000;
37
+ dc->desc = "Aspeed 2500 SPI2 Controller";
44
+ data->jedec_id = 0xc22019;
38
asc->r_conf = R_CONF;
45
+ data->cs = 0;
39
asc->r_ce_ctrl = R_CE_CTRL;
46
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
40
asc->r_ctrl0 = R_CTRL0;
47
+ /* beyond 16MB */
48
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
49
+
50
+ qtest_add_data_func("/ast2500/smc/read_jedec", data, test_read_jedec);
51
+ qtest_add_data_func("/ast2500/smc/erase_sector", data, test_erase_sector);
52
+ qtest_add_data_func("/ast2500/smc/erase_all", data, test_erase_all);
53
+ qtest_add_data_func("/ast2500/smc/write_page", data, test_write_page);
54
+ qtest_add_data_func("/ast2500/smc/read_page_mem",
55
+ data, test_read_page_mem);
56
+ qtest_add_data_func("/ast2500/smc/write_page_mem",
57
+ data, test_write_page_mem);
58
+ qtest_add_data_func("/ast2500/smc/read_status_reg",
59
+ data, test_read_status_reg);
60
+}
61
int main(int argc, char **argv)
62
{
63
TestData palmetto_data;
64
+ TestData ast2500_evb_data;
65
int ret;
66
67
g_test_init(&argc, &argv, NULL);
68
69
test_palmetto_bmc(&palmetto_data);
70
+ test_ast2500_evb(&ast2500_evb_data);
71
ret = g_test_run();
72
73
qtest_quit(palmetto_data.s);
74
+ qtest_quit(ast2500_evb_data.s);
75
unlink(palmetto_data.tmp_path);
76
+ unlink(ast2500_evb_data.tmp_path);
77
return ret;
78
}
41
--
79
--
42
2.45.2
80
2.47.1
43
81
44
82
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
These macros are no longer used for ASPEED SOCs, so removes them.
3
Add test_ast2600_evb function and reused testcases for AST2600 testing.
4
The spi base address, flash base address and ce index of fmc_cs0 are
5
0x1E620000, 0x20000000 and 0, respectively.
6
The default flash model of fmc_cs0 is "mx66u51235f" whose size is 64MB,
7
so set jedec_id 0xc2253a.
4
8
5
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-7-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
---
13
---
9
hw/misc/aspeed_sdmc.c | 15 ---------------
14
tests/qtest/aspeed_smc-test.c | 41 +++++++++++++++++++++++++++++++++++
10
1 file changed, 15 deletions(-)
15
1 file changed, 41 insertions(+)
11
16
12
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
13
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/misc/aspeed_sdmc.c
19
--- a/tests/qtest/aspeed_smc-test.c
15
+++ b/hw/misc/aspeed_sdmc.c
20
+++ b/tests/qtest/aspeed_smc-test.c
16
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
17
#define ASPEED_SDMC_VGA_32MB 0x2
22
qtest_add_data_func("/ast2500/smc/read_status_reg",
18
#define ASPEED_SDMC_VGA_64MB 0x3
23
data, test_read_status_reg);
19
#define ASPEED_SDMC_DRAM_SIZE(x) (x & 0x3)
24
}
20
-#define ASPEED_SDMC_DRAM_64MB 0x0
25
+
21
-#define ASPEED_SDMC_DRAM_128MB 0x1
26
+static void test_ast2600_evb(TestData *data)
22
-#define ASPEED_SDMC_DRAM_256MB 0x2
27
+{
23
-#define ASPEED_SDMC_DRAM_512MB 0x3
28
+ int ret;
24
29
+ int fd;
25
#define ASPEED_SDMC_READONLY_MASK \
30
+
26
(ASPEED_SDMC_RESERVED | ASPEED_SDMC_VGA_COMPAT | \
31
+ fd = g_file_open_tmp("qtest.m25p80.mx66u51235f.XXXXXX",
27
@@ -XXX,XX +XXX,XX @@
32
+ &data->tmp_path, NULL);
28
#define ASPEED_SDMC_CACHE_ENABLE (1 << 10) /* differs from AST2400 */
33
+ g_assert(fd >= 0);
29
#define ASPEED_SDMC_DRAM_TYPE (1 << 4) /* differs from AST2400 */
34
+ ret = ftruncate(fd, 64 * 1024 * 1024);
30
35
+ g_assert(ret == 0);
31
-/* DRAM size definitions differs */
36
+ close(fd);
32
-#define ASPEED_SDMC_AST2500_128MB 0x0
37
+
33
-#define ASPEED_SDMC_AST2500_256MB 0x1
38
+ data->s = qtest_initf("-machine ast2600-evb "
34
-#define ASPEED_SDMC_AST2500_512MB 0x2
39
+ "-drive file=%s,format=raw,if=mtd",
35
-#define ASPEED_SDMC_AST2500_1024MB 0x3
40
+ data->tmp_path);
36
-
41
+
37
-#define ASPEED_SDMC_AST2600_256MB 0x0
42
+ /* fmc cs0 with mx66u51235f flash */
38
-#define ASPEED_SDMC_AST2600_512MB 0x1
43
+ data->flash_base = 0x20000000;
39
-#define ASPEED_SDMC_AST2600_1024MB 0x2
44
+ data->spi_base = 0x1E620000;
40
-#define ASPEED_SDMC_AST2600_2048MB 0x3
45
+ data->jedec_id = 0xc2253a;
41
-
46
+ data->cs = 0;
42
#define ASPEED_SDMC_AST2500_READONLY_MASK \
47
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
43
(ASPEED_SDMC_HW_VERSION(0xf) | ASPEED_SDMC_CACHE_INITIAL_DONE | \
48
+ /* beyond 16MB */
44
ASPEED_SDMC_AST2500_RESERVED | ASPEED_SDMC_VGA_COMPAT | \
49
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
50
+
51
+ qtest_add_data_func("/ast2600/smc/read_jedec", data, test_read_jedec);
52
+ qtest_add_data_func("/ast2600/smc/erase_sector", data, test_erase_sector);
53
+ qtest_add_data_func("/ast2600/smc/erase_all", data, test_erase_all);
54
+ qtest_add_data_func("/ast2600/smc/write_page", data, test_write_page);
55
+ qtest_add_data_func("/ast2600/smc/read_page_mem",
56
+ data, test_read_page_mem);
57
+ qtest_add_data_func("/ast2600/smc/write_page_mem",
58
+ data, test_write_page_mem);
59
+ qtest_add_data_func("/ast2600/smc/read_status_reg",
60
+ data, test_read_status_reg);
61
+}
62
int main(int argc, char **argv)
63
{
64
TestData palmetto_data;
65
TestData ast2500_evb_data;
66
+ TestData ast2600_evb_data;
67
int ret;
68
69
g_test_init(&argc, &argv, NULL);
70
71
test_palmetto_bmc(&palmetto_data);
72
test_ast2500_evb(&ast2500_evb_data);
73
+ test_ast2600_evb(&ast2600_evb_data);
74
ret = g_test_run();
75
76
qtest_quit(palmetto_data.s);
77
qtest_quit(ast2500_evb_data.s);
78
+ qtest_quit(ast2600_evb_data.s);
79
unlink(palmetto_data.tmp_path);
80
unlink(ast2500_evb_data.tmp_path);
81
+ unlink(ast2600_evb_data.tmp_path);
82
return ret;
83
}
45
--
84
--
46
2.45.2
85
2.47.1
47
86
48
87
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
The SDRAM memory controller(DRAMC) controls the access to external
3
Add test_ast1030_evb function and reused testcases for AST1030 testing.
4
DDR4 and DDR5 SDRAM and power up to DDR4 and DDR5 PHY.
4
The base address, flash base address and ce index of fmc_cs0 are
5
0x7E620000, 0x80000000 and 0, respectively.
6
The default flash model of fmc_cs0 is "w25q80bl" whose size is 1MB,
7
so set jedec_id 0xef4014.
5
8
6
The DRAM memory controller of AST2700 is not backward compatible
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
to previous chips such AST2600, AST2500 and AST2400.
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-8-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
13
---
14
tests/qtest/aspeed_smc-test.c | 42 +++++++++++++++++++++++++++++++++++
15
1 file changed, 42 insertions(+)
8
16
9
Max memory is now 8GiB on the AST2700. Introduce new
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
10
aspeed_2700_sdmc and class with read/write operation and
11
reset handlers.
12
13
Define DRAMC necessary protected registers and
14
unprotected registers for AST2700 and increase
15
the register set to 0x1000.
16
17
Add unlocked property to change controller protected status.
18
19
Incrementing the version of vmstate to 2.
20
21
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
22
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
23
Reviewed-by: Cédric Le Goater <clg@kaod.org>
24
---
25
include/hw/misc/aspeed_sdmc.h | 5 +-
26
hw/misc/aspeed_sdmc.c | 194 +++++++++++++++++++++++++++++++++-
27
2 files changed, 195 insertions(+), 4 deletions(-)
28
29
diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
30
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
31
--- a/include/hw/misc/aspeed_sdmc.h
19
--- a/tests/qtest/aspeed_smc-test.c
32
+++ b/include/hw/misc/aspeed_sdmc.h
20
+++ b/tests/qtest/aspeed_smc-test.c
33
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedSDMCState, AspeedSDMCClass, ASPEED_SDMC)
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
34
#define TYPE_ASPEED_2400_SDMC TYPE_ASPEED_SDMC "-ast2400"
22
qtest_add_data_func("/ast2600/smc/read_status_reg",
35
#define TYPE_ASPEED_2500_SDMC TYPE_ASPEED_SDMC "-ast2500"
23
data, test_read_status_reg);
36
#define TYPE_ASPEED_2600_SDMC TYPE_ASPEED_SDMC "-ast2600"
24
}
37
+#define TYPE_ASPEED_2700_SDMC TYPE_ASPEED_SDMC "-ast2700"
38
39
/*
40
* SDMC has 174 documented registers. In addition the u-boot device tree
41
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedSDMCState, AspeedSDMCClass, ASPEED_SDMC)
42
* time, and the other is in the DDR-PHY IP which is used during DDR-PHY
43
* training.
44
*/
45
-#define ASPEED_SDMC_NR_REGS (0x500 >> 2)
46
+#define ASPEED_SDMC_NR_REGS (0x1000 >> 2)
47
48
struct AspeedSDMCState {
49
/*< private >*/
50
@@ -XXX,XX +XXX,XX @@ struct AspeedSDMCState {
51
uint32_t regs[ASPEED_SDMC_NR_REGS];
52
uint64_t ram_size;
53
uint64_t max_ram_size;
54
+ bool unlocked;
55
};
56
57
58
@@ -XXX,XX +XXX,XX @@ struct AspeedSDMCClass {
59
const uint64_t *valid_ram_sizes;
60
uint32_t (*compute_conf)(AspeedSDMCState *s, uint32_t data);
61
void (*write)(AspeedSDMCState *s, uint32_t reg, uint32_t data);
62
+ bool is_bus64bit;
63
};
64
65
#endif /* ASPEED_SDMC_H */
66
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/misc/aspeed_sdmc.c
69
+++ b/hw/misc/aspeed_sdmc.c
70
@@ -XXX,XX +XXX,XX @@
71
#define PROT_SOFTLOCKED 0x00
72
73
#define PROT_KEY_UNLOCK 0xFC600309
74
+#define PROT_2700_KEY_UNLOCK 0x1688A8A8
75
#define PROT_KEY_HARDLOCK 0xDEADDEAD /* AST2600 */
76
77
/* Configuration Register */
78
@@ -XXX,XX +XXX,XX @@
79
#define R_DRAM_TIME (0x8c / 4)
80
#define R_ECC_ERR_INJECT (0xb4 / 4)
81
82
+/* AST2700 Register */
83
+#define R_2700_PROT (0x00 / 4)
84
+#define R_INT_STATUS (0x04 / 4)
85
+#define R_INT_CLEAR (0x08 / 4)
86
+#define R_INT_MASK (0x0c / 4)
87
+#define R_MAIN_CONF (0x10 / 4)
88
+#define R_MAIN_CONTROL (0x14 / 4)
89
+#define R_MAIN_STATUS (0x18 / 4)
90
+#define R_ERR_STATUS (0x1c / 4)
91
+#define R_ECC_FAIL_STATUS (0x78 / 4)
92
+#define R_ECC_FAIL_ADDR (0x7c / 4)
93
+#define R_ECC_TESTING_CONTROL (0x80 / 4)
94
+#define R_PROT_REGION_LOCK_STATUS (0x94 / 4)
95
+#define R_TEST_FAIL_ADDR (0xd4 / 4)
96
+#define R_TEST_FAIL_D0 (0xd8 / 4)
97
+#define R_TEST_FAIL_D1 (0xdc / 4)
98
+#define R_TEST_FAIL_D2 (0xe0 / 4)
99
+#define R_TEST_FAIL_D3 (0xe4 / 4)
100
+#define R_DBG_STATUS (0xf4 / 4)
101
+#define R_PHY_INTERFACE_STATUS (0xf8 / 4)
102
+#define R_GRAPHIC_MEM_BASE_ADDR (0x10c / 4)
103
+#define R_PORT0_INTERFACE_MONITOR0 (0x240 / 4)
104
+#define R_PORT0_INTERFACE_MONITOR1 (0x244 / 4)
105
+#define R_PORT0_INTERFACE_MONITOR2 (0x248 / 4)
106
+#define R_PORT1_INTERFACE_MONITOR0 (0x2c0 / 4)
107
+#define R_PORT1_INTERFACE_MONITOR1 (0x2c4 / 4)
108
+#define R_PORT1_INTERFACE_MONITOR2 (0x2c8 / 4)
109
+#define R_PORT2_INTERFACE_MONITOR0 (0x340 / 4)
110
+#define R_PORT2_INTERFACE_MONITOR1 (0x344 / 4)
111
+#define R_PORT2_INTERFACE_MONITOR2 (0x348 / 4)
112
+#define R_PORT3_INTERFACE_MONITOR0 (0x3c0 / 4)
113
+#define R_PORT3_INTERFACE_MONITOR1 (0x3c4 / 4)
114
+#define R_PORT3_INTERFACE_MONITOR2 (0x3c8 / 4)
115
+#define R_PORT4_INTERFACE_MONITOR0 (0x440 / 4)
116
+#define R_PORT4_INTERFACE_MONITOR1 (0x444 / 4)
117
+#define R_PORT4_INTERFACE_MONITOR2 (0x448 / 4)
118
+#define R_PORT5_INTERFACE_MONITOR0 (0x4c0 / 4)
119
+#define R_PORT5_INTERFACE_MONITOR1 (0x4c4 / 4)
120
+#define R_PORT5_INTERFACE_MONITOR2 (0x4c8 / 4)
121
+
25
+
122
/*
26
+static void test_ast1030_evb(TestData *data)
123
* Configuration register Ox4 (for Aspeed AST2400 SOC)
27
+{
124
*
28
+ int ret;
125
@@ -XXX,XX +XXX,XX @@
29
+ int fd;
126
ASPEED_SDMC_AST2500_RESERVED | ASPEED_SDMC_VGA_COMPAT | \
127
ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB))
128
129
+/*
130
+ * Main Configuration register Ox10 (for Aspeed AST2700 SOC and higher)
131
+ *
132
+ */
133
+#define ASPEED_SDMC_AST2700_RESERVED 0xFFFF2082 /* 31:16, 13, 7, 1 */
134
+#define ASPEED_SDMC_AST2700_DATA_SCRAMBLE (1 << 8)
135
+#define ASPEED_SDMC_AST2700_ECC_ENABLE (1 << 6)
136
+#define ASPEED_SDMC_AST2700_PAGE_MATCHING_ENABLE (1 << 5)
137
+#define ASPEED_SDMC_AST2700_DRAM_SIZE(x) ((x & 0x7) << 2)
138
+
30
+
139
+#define ASPEED_SDMC_AST2700_READONLY_MASK \
31
+ fd = g_file_open_tmp("qtest.m25p80.w25q80bl.XXXXXX",
140
+ (ASPEED_SDMC_AST2700_RESERVED)
32
+ &data->tmp_path, NULL);
33
+ g_assert(fd >= 0);
34
+ ret = ftruncate(fd, 1 * 1024 * 1024);
35
+ g_assert(ret == 0);
36
+ close(fd);
141
+
37
+
142
static uint64_t aspeed_sdmc_read(void *opaque, hwaddr addr, unsigned size)
38
+ data->s = qtest_initf("-machine ast1030-evb "
143
{
39
+ "-drive file=%s,format=raw,if=mtd",
144
AspeedSDMCState *s = ASPEED_SDMC(opaque);
40
+ data->tmp_path);
145
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
146
AspeedSDMCState *s = ASPEED_SDMC(dev);
147
AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
148
149
- assert(asc->max_ram_size < 4 * GiB); /* 32-bit address bus */
150
+ assert(asc->max_ram_size < 4 * GiB || asc->is_bus64bit);
151
s->max_ram_size = asc->max_ram_size;
152
153
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sdmc_ops, s,
154
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
155
156
static const VMStateDescription vmstate_aspeed_sdmc = {
157
.name = "aspeed.sdmc",
158
- .version_id = 1,
159
- .minimum_version_id = 1,
160
+ .version_id = 2,
161
+ .minimum_version_id = 2,
162
.fields = (const VMStateField[]) {
163
VMSTATE_UINT32_ARRAY(regs, AspeedSDMCState, ASPEED_SDMC_NR_REGS),
164
VMSTATE_END_OF_LIST()
165
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_sdmc = {
166
167
static Property aspeed_sdmc_properties[] = {
168
DEFINE_PROP_UINT64("max-ram-size", AspeedSDMCState, max_ram_size, 0),
169
+ DEFINE_PROP_BOOL("unlocked", AspeedSDMCState, unlocked, false),
170
DEFINE_PROP_END_OF_LIST(),
171
};
172
173
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_sdmc_info = {
174
.class_init = aspeed_2600_sdmc_class_init,
175
};
176
177
+static void aspeed_2700_sdmc_reset(DeviceState *dev)
178
+{
179
+ AspeedSDMCState *s = ASPEED_SDMC(dev);
180
+ AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
181
+
41
+
182
+ memset(s->regs, 0, sizeof(s->regs));
42
+ /* fmc cs0 with w25q80bl flash */
43
+ data->flash_base = 0x80000000;
44
+ data->spi_base = 0x7E620000;
45
+ data->jedec_id = 0xef4014;
46
+ data->cs = 0;
47
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
48
+ /* beyond 512KB */
49
+ data->page_addr = 0x800 * FLASH_PAGE_SIZE;
183
+
50
+
184
+ /* Set ram size bit and defaults values */
51
+ qtest_add_data_func("/ast1030/smc/read_jedec", data, test_read_jedec);
185
+ s->regs[R_MAIN_CONF] = asc->compute_conf(s, 0);
52
+ qtest_add_data_func("/ast1030/smc/erase_sector", data, test_erase_sector);
186
+
53
+ qtest_add_data_func("/ast1030/smc/erase_all", data, test_erase_all);
187
+ if (s->unlocked) {
54
+ qtest_add_data_func("/ast1030/smc/write_page", data, test_write_page);
188
+ s->regs[R_2700_PROT] = PROT_UNLOCKED;
55
+ qtest_add_data_func("/ast1030/smc/read_page_mem",
189
+ }
56
+ data, test_read_page_mem);
57
+ qtest_add_data_func("/ast1030/smc/write_page_mem",
58
+ data, test_write_page_mem);
59
+ qtest_add_data_func("/ast1030/smc/read_status_reg",
60
+ data, test_read_status_reg);
190
+}
61
+}
191
+
62
+
192
+static uint32_t aspeed_2700_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
63
int main(int argc, char **argv)
193
+{
194
+ uint32_t fixed_conf = ASPEED_SDMC_AST2700_PAGE_MATCHING_ENABLE |
195
+ ASPEED_SDMC_AST2700_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
196
+
197
+ /* Make sure readonly bits are kept */
198
+ data &= ~ASPEED_SDMC_AST2700_READONLY_MASK;
199
+
200
+ return data | fixed_conf;
201
+}
202
+
203
+static void aspeed_2700_sdmc_write(AspeedSDMCState *s, uint32_t reg,
204
+ uint32_t data)
205
+{
206
+ /* Unprotected registers */
207
+ switch (reg) {
208
+ case R_INT_STATUS:
209
+ case R_INT_CLEAR:
210
+ case R_INT_MASK:
211
+ case R_MAIN_STATUS:
212
+ case R_ERR_STATUS:
213
+ case R_ECC_FAIL_STATUS:
214
+ case R_ECC_FAIL_ADDR:
215
+ case R_PROT_REGION_LOCK_STATUS:
216
+ case R_TEST_FAIL_ADDR:
217
+ case R_TEST_FAIL_D0:
218
+ case R_TEST_FAIL_D1:
219
+ case R_TEST_FAIL_D2:
220
+ case R_TEST_FAIL_D3:
221
+ case R_DBG_STATUS:
222
+ case R_PHY_INTERFACE_STATUS:
223
+ case R_GRAPHIC_MEM_BASE_ADDR:
224
+ case R_PORT0_INTERFACE_MONITOR0:
225
+ case R_PORT0_INTERFACE_MONITOR1:
226
+ case R_PORT0_INTERFACE_MONITOR2:
227
+ case R_PORT1_INTERFACE_MONITOR0:
228
+ case R_PORT1_INTERFACE_MONITOR1:
229
+ case R_PORT1_INTERFACE_MONITOR2:
230
+ case R_PORT2_INTERFACE_MONITOR0:
231
+ case R_PORT2_INTERFACE_MONITOR1:
232
+ case R_PORT2_INTERFACE_MONITOR2:
233
+ case R_PORT3_INTERFACE_MONITOR0:
234
+ case R_PORT3_INTERFACE_MONITOR1:
235
+ case R_PORT3_INTERFACE_MONITOR2:
236
+ case R_PORT4_INTERFACE_MONITOR0:
237
+ case R_PORT4_INTERFACE_MONITOR1:
238
+ case R_PORT4_INTERFACE_MONITOR2:
239
+ case R_PORT5_INTERFACE_MONITOR0:
240
+ case R_PORT5_INTERFACE_MONITOR1:
241
+ case R_PORT5_INTERFACE_MONITOR2:
242
+ s->regs[reg] = data;
243
+ return;
244
+ }
245
+
246
+ if (s->regs[R_2700_PROT] == PROT_HARDLOCKED) {
247
+ qemu_log_mask(LOG_GUEST_ERROR,
248
+ "%s: SDMC is locked until system reset!\n",
249
+ __func__);
250
+ return;
251
+ }
252
+
253
+ if (reg != R_2700_PROT && s->regs[R_2700_PROT] == PROT_SOFTLOCKED) {
254
+ qemu_log_mask(LOG_GUEST_ERROR,
255
+ "%s: SDMC is locked! (write to MCR%02x blocked)\n",
256
+ __func__, reg * 4);
257
+ return;
258
+ }
259
+
260
+ switch (reg) {
261
+ case R_2700_PROT:
262
+ if (data == PROT_2700_KEY_UNLOCK) {
263
+ data = PROT_UNLOCKED;
264
+ } else if (data == PROT_KEY_HARDLOCK) {
265
+ data = PROT_HARDLOCKED;
266
+ } else {
267
+ data = PROT_SOFTLOCKED;
268
+ }
269
+ break;
270
+ case R_MAIN_CONF:
271
+ data = aspeed_2700_sdmc_compute_conf(s, data);
272
+ break;
273
+ case R_MAIN_STATUS:
274
+ /* Will never return 'busy'. */
275
+ data &= ~PHY_BUSY_STATE;
276
+ break;
277
+ default:
278
+ break;
279
+ }
280
+
281
+ s->regs[reg] = data;
282
+}
283
+
284
+static const uint64_t
285
+ aspeed_2700_ram_sizes[] = { 256 * MiB, 512 * MiB, 1024 * MiB,
286
+ 2048 * MiB, 4096 * MiB, 8192 * MiB, 0};
287
+
288
+static void aspeed_2700_sdmc_class_init(ObjectClass *klass, void *data)
289
+{
290
+ DeviceClass *dc = DEVICE_CLASS(klass);
291
+ AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
292
+
293
+ dc->desc = "ASPEED 2700 SDRAM Memory Controller";
294
+ dc->reset = aspeed_2700_sdmc_reset;
295
+
296
+ asc->is_bus64bit = true;
297
+ asc->max_ram_size = 8 * GiB;
298
+ asc->compute_conf = aspeed_2700_sdmc_compute_conf;
299
+ asc->write = aspeed_2700_sdmc_write;
300
+ asc->valid_ram_sizes = aspeed_2700_ram_sizes;
301
+}
302
+
303
+static const TypeInfo aspeed_2700_sdmc_info = {
304
+ .name = TYPE_ASPEED_2700_SDMC,
305
+ .parent = TYPE_ASPEED_SDMC,
306
+ .class_init = aspeed_2700_sdmc_class_init,
307
+};
308
+
309
static void aspeed_sdmc_register_types(void)
310
{
64
{
311
type_register_static(&aspeed_sdmc_info);
65
TestData palmetto_data;
312
type_register_static(&aspeed_2400_sdmc_info);
66
TestData ast2500_evb_data;
313
type_register_static(&aspeed_2500_sdmc_info);
67
TestData ast2600_evb_data;
314
type_register_static(&aspeed_2600_sdmc_info);
68
+ TestData ast1030_evb_data;
315
+ type_register_static(&aspeed_2700_sdmc_info);
69
int ret;
70
71
g_test_init(&argc, &argv, NULL);
72
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
73
test_palmetto_bmc(&palmetto_data);
74
test_ast2500_evb(&ast2500_evb_data);
75
test_ast2600_evb(&ast2600_evb_data);
76
+ test_ast1030_evb(&ast1030_evb_data);
77
ret = g_test_run();
78
79
qtest_quit(palmetto_data.s);
80
qtest_quit(ast2500_evb_data.s);
81
qtest_quit(ast2600_evb_data.s);
82
+ qtest_quit(ast1030_evb_data.s);
83
unlink(palmetto_data.tmp_path);
84
unlink(ast2500_evb_data.tmp_path);
85
unlink(ast2600_evb_data.tmp_path);
86
+ unlink(ast1030_evb_data.tmp_path);
87
return ret;
316
}
88
}
317
318
type_init(aspeed_sdmc_register_types);
319
--
89
--
320
2.45.2
90
2.47.1
321
91
322
92
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
It set "aspeed_smc_flash_ops" struct which containing
3
Add a new testcase for write page command with QPI mode testing.
4
read and write callbacks to be used when I/O is performed
4
Currently, only run this testcase for AST2500, AST2600 and AST1030.
5
on the SMC flash region. And it set the valid max_access_size 4
6
by default for all ASPEED SMC models.
7
5
8
However, the valid max_access_size 4 only support 32 bits CPUs.
9
To support all ASPEED SMC model, introduce a new
10
"const MemoryRegionOps *" attribute in AspeedSMCClass and
11
use it in aspeed_smc_flash_realize function.
12
13
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
14
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
15
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Link: https://lore.kernel.org/r/20241127091543.1243114-9-jamin_lin@aspeedtech.com
9
Signed-off-by: Cédric Le Goater <clg@redhat.com>
16
---
10
---
17
include/hw/ssi/aspeed_smc.h | 1 +
11
tests/qtest/aspeed_smc-test.c | 74 +++++++++++++++++++++++++++++++++++
18
hw/ssi/aspeed_smc.c | 14 +++++++++++++-
12
1 file changed, 74 insertions(+)
19
2 files changed, 14 insertions(+), 1 deletion(-)
20
13
21
diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h
14
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
22
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/ssi/aspeed_smc.h
16
--- a/tests/qtest/aspeed_smc-test.c
24
+++ b/include/hw/ssi/aspeed_smc.h
17
+++ b/tests/qtest/aspeed_smc-test.c
25
@@ -XXX,XX +XXX,XX @@ struct AspeedSMCClass {
18
@@ -XXX,XX +XXX,XX @@
26
AspeedSegments *seg);
19
#define R_CE_CTRL 0x04
27
void (*dma_ctrl)(AspeedSMCState *s, uint32_t value);
20
#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
28
int (*addr_width)(const AspeedSMCState *s);
21
#define R_CTRL0 0x10
29
+ const MemoryRegionOps *reg_ops;
22
+#define CTRL_IO_QUAD_IO BIT(31)
23
#define CTRL_CE_STOP_ACTIVE BIT(2)
24
#define CTRL_READMODE 0x0
25
#define CTRL_FREADMODE 0x1
26
@@ -XXX,XX +XXX,XX @@ enum {
27
ERASE_SECTOR = 0xd8,
30
};
28
};
31
29
32
#endif /* ASPEED_SMC_H */
30
+#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
33
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
31
#define FLASH_PAGE_SIZE 256
34
index XXXXXXX..XXXXXXX 100644
32
35
--- a/hw/ssi/aspeed_smc.c
33
typedef struct TestData {
36
+++ b/hw/ssi/aspeed_smc.c
34
@@ -XXX,XX +XXX,XX @@ static void spi_ctrl_stop_user(const TestData *data)
37
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_flash_realize(DeviceState *dev, Error **errp)
35
spi_writel(data, ctrl_reg, ctrl);
38
* Use the default segment value to size the memory region. This
39
* can be changed by FW at runtime.
40
*/
41
- memory_region_init_io(&s->mmio, OBJECT(s), &aspeed_smc_flash_ops,
42
+ memory_region_init_io(&s->mmio, OBJECT(s), s->asc->reg_ops,
43
s, name, s->asc->segments[s->cs].size);
44
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio);
45
}
36
}
46
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_smc_class_init(ObjectClass *klass, void *data)
37
47
asc->segment_to_reg = aspeed_smc_segment_to_reg;
38
+static void spi_ctrl_set_io_mode(const TestData *data, uint32_t value)
48
asc->reg_to_segment = aspeed_smc_reg_to_segment;
39
+{
49
asc->dma_ctrl = aspeed_smc_dma_ctrl;
40
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
50
+ asc->reg_ops = &aspeed_smc_flash_ops;
41
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
42
+ uint32_t mode;
43
+
44
+ mode = value & CTRL_IO_MODE_MASK;
45
+ ctrl &= ~CTRL_IO_MODE_MASK;
46
+ ctrl |= mode;
47
+ spi_writel(data, ctrl_reg, ctrl);
48
+}
49
+
50
static void flash_reset(const TestData *data)
51
{
52
spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
53
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(const void *data)
54
flash_reset(test_data);
51
}
55
}
52
56
53
static const TypeInfo aspeed_2400_smc_info = {
57
+static void test_write_page_qpi(const void *data)
54
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_fmc_class_init(ObjectClass *klass, void *data)
58
+{
55
asc->segment_to_reg = aspeed_smc_segment_to_reg;
59
+ const TestData *test_data = (const TestData *)data;
56
asc->reg_to_segment = aspeed_smc_reg_to_segment;
60
+ uint32_t my_page_addr = test_data->page_addr;
57
asc->dma_ctrl = aspeed_smc_dma_ctrl;
61
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
58
+ asc->reg_ops = &aspeed_smc_flash_ops;
62
+ uint32_t page[FLASH_PAGE_SIZE / 4];
63
+ uint32_t page_pattern[] = {
64
+ 0xebd8c134, 0x5da196bc, 0xae15e729, 0x5085ccdf
65
+ };
66
+ int i;
67
+
68
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
69
+
70
+ spi_ctrl_start_user(test_data);
71
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
72
+ flash_writeb(test_data, 0, WREN);
73
+ flash_writeb(test_data, 0, PP);
74
+ flash_writel(test_data, 0, make_be32(my_page_addr));
75
+
76
+ /* Set QPI mode */
77
+ spi_ctrl_set_io_mode(test_data, CTRL_IO_QUAD_IO);
78
+
79
+ /* Fill the page pattern */
80
+ for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
81
+ flash_writel(test_data, 0, make_be32(page_pattern[i]));
82
+ }
83
+
84
+ /* Fill the page with its own addresses */
85
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
86
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
87
+ }
88
+
89
+ /* Restore io mode */
90
+ spi_ctrl_set_io_mode(test_data, 0);
91
+ spi_ctrl_stop_user(test_data);
92
+
93
+ /* Check what was written */
94
+ read_page(test_data, my_page_addr, page);
95
+ for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
96
+ g_assert_cmphex(page[i], ==, page_pattern[i]);
97
+ }
98
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
99
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
100
+ }
101
+
102
+ /* Check some other page. It should be full of 0xff */
103
+ read_page(test_data, some_page_addr, page);
104
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
105
+ g_assert_cmphex(page[i], ==, 0xffffffff);
106
+ }
107
+
108
+ flash_reset(test_data);
109
+}
110
+
111
static void test_palmetto_bmc(TestData *data)
112
{
113
int ret;
114
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
115
data, test_write_page_mem);
116
qtest_add_data_func("/ast2500/smc/read_status_reg",
117
data, test_read_status_reg);
118
+ qtest_add_data_func("/ast2500/smc/write_page_qpi",
119
+ data, test_write_page_qpi);
59
}
120
}
60
121
61
static const TypeInfo aspeed_2400_fmc_info = {
122
static void test_ast2600_evb(TestData *data)
62
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_spi1_class_init(ObjectClass *klass, void *data)
123
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
63
asc->reg_to_segment = aspeed_smc_reg_to_segment;
124
data, test_write_page_mem);
64
asc->dma_ctrl = aspeed_smc_dma_ctrl;
125
qtest_add_data_func("/ast2600/smc/read_status_reg",
65
asc->addr_width = aspeed_2400_spi1_addr_width;
126
data, test_read_status_reg);
66
+ asc->reg_ops = &aspeed_smc_flash_ops;
127
+ qtest_add_data_func("/ast2600/smc/write_page_qpi",
128
+ data, test_write_page_qpi);
67
}
129
}
68
130
69
static const TypeInfo aspeed_2400_spi1_info = {
131
static void test_ast1030_evb(TestData *data)
70
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_fmc_class_init(ObjectClass *klass, void *data)
132
@@ -XXX,XX +XXX,XX @@ static void test_ast1030_evb(TestData *data)
71
asc->segment_to_reg = aspeed_smc_segment_to_reg;
133
data, test_write_page_mem);
72
asc->reg_to_segment = aspeed_smc_reg_to_segment;
134
qtest_add_data_func("/ast1030/smc/read_status_reg",
73
asc->dma_ctrl = aspeed_smc_dma_ctrl;
135
data, test_read_status_reg);
74
+ asc->reg_ops = &aspeed_smc_flash_ops;
136
+ qtest_add_data_func("/ast1030/smc/write_page_qpi",
137
+ data, test_write_page_qpi);
75
}
138
}
76
139
77
static const TypeInfo aspeed_2500_fmc_info = {
140
int main(int argc, char **argv)
78
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_spi1_class_init(ObjectClass *klass, void *data)
79
asc->segment_to_reg = aspeed_smc_segment_to_reg;
80
asc->reg_to_segment = aspeed_smc_reg_to_segment;
81
asc->dma_ctrl = aspeed_smc_dma_ctrl;
82
+ asc->reg_ops = &aspeed_smc_flash_ops;
83
}
84
85
static const TypeInfo aspeed_2500_spi1_info = {
86
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_spi2_class_init(ObjectClass *klass, void *data)
87
asc->segment_to_reg = aspeed_smc_segment_to_reg;
88
asc->reg_to_segment = aspeed_smc_reg_to_segment;
89
asc->dma_ctrl = aspeed_smc_dma_ctrl;
90
+ asc->reg_ops = &aspeed_smc_flash_ops;
91
}
92
93
static const TypeInfo aspeed_2500_spi2_info = {
94
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_fmc_class_init(ObjectClass *klass, void *data)
95
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
96
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
97
asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
98
+ asc->reg_ops = &aspeed_smc_flash_ops;
99
}
100
101
static const TypeInfo aspeed_2600_fmc_info = {
102
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_spi1_class_init(ObjectClass *klass, void *data)
103
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
104
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
105
asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
106
+ asc->reg_ops = &aspeed_smc_flash_ops;
107
}
108
109
static const TypeInfo aspeed_2600_spi1_info = {
110
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_spi2_class_init(ObjectClass *klass, void *data)
111
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
112
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
113
asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
114
+ asc->reg_ops = &aspeed_smc_flash_ops;
115
}
116
117
static const TypeInfo aspeed_2600_spi2_info = {
118
@@ -XXX,XX +XXX,XX @@ static void aspeed_1030_fmc_class_init(ObjectClass *klass, void *data)
119
asc->segment_to_reg = aspeed_1030_smc_segment_to_reg;
120
asc->reg_to_segment = aspeed_1030_smc_reg_to_segment;
121
asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
122
+ asc->reg_ops = &aspeed_smc_flash_ops;
123
}
124
125
static const TypeInfo aspeed_1030_fmc_info = {
126
@@ -XXX,XX +XXX,XX @@ static void aspeed_1030_spi1_class_init(ObjectClass *klass, void *data)
127
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
128
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
129
asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
130
+ asc->reg_ops = &aspeed_smc_flash_ops;
131
}
132
133
static const TypeInfo aspeed_1030_spi1_info = {
134
@@ -XXX,XX +XXX,XX @@ static void aspeed_1030_spi2_class_init(ObjectClass *klass, void *data)
135
asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
136
asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
137
asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
138
+ asc->reg_ops = &aspeed_smc_flash_ops;
139
}
140
141
static const TypeInfo aspeed_1030_spi2_info = {
142
--
141
--
143
2.45.2
142
2.47.1
144
143
145
144
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST2700 interrupt controller(INTC) provides hardware interrupt interfaces
3
The testcases for ASPEED SMC model were placed in aspeed_smc-test.c.
4
to interrupt of processors PSP, SSP and TSP. In INTC, each interrupt of
4
However, this test file only supports for ARM32. To support all ASPEED SOCs
5
INT 128 to INT136 combines 32 interrupts.
5
such as AST2700 whose CPU architecture is aarch64, introduces a new
6
aspeed-smc-utils source file and move all common APIs and testcases
7
from aspeed_smc-test.c to aspeed-smc-utils.c.
6
8
7
Introduce a new aspeed_intc class with instance_init and realize handlers.
9
Finally, users are able to re-used these testcase for AST2700 and future
10
ASPEED SOCs testing.
8
11
9
So far, this model only supports GICINT128 to GICINT136.
10
It creates 9 GICINT or-gates to connect 32 interrupts sources
11
from GICINT128 to GICINT136 as IRQ GPIO-OUTPUT pins.
12
Then, this model registers IRQ handler with its IRQ GPIO-INPUT pins which
13
connect to GICINT or-gates. And creates 9 GICINT IRQ GPIO-OUTPUT pins which
14
connect to GIC device with GIC IRQ 128 to 136.
15
16
If one interrupt source from GICINT128 to GICINT136
17
set irq, the OR-GATE irq callback function is called and set irq to INTC by
18
OR-GATE GPIO-OUTPUT pins. Then, the INTC irq callback function is called and
19
set irq to GIC by its GICINT IRQ GPIO-OUTPUT pins. Finally, the GIC irq
20
callback function is called and set irq to CPUs and
21
CPUs execute Interrupt Service Routine (ISR).
22
23
Block diagram of GICINT132:
24
25
GICINT132
26
ETH1 +-----------+
27
+-------->+0 3|
28
ETH2 | 4|
29
+-------->+1 5|
30
ETH3 | 6|
31
+-------->+2 19| INTC GIC
32
UART0 | 20| +--------------------------+
33
+-------->+7 21| | | +--------------+
34
UART1 | 22| |orgate0 +----> output_pin0+----------->+GIC128 |
35
+-------->+8 23| | | | |
36
UART2 | 24| |orgate1 +----> output_pin1+----------->+GIC129 |
37
+-------->+9 25| | | | |
38
UART3 | 26| |orgate2 +----> output_pin2+----------->+GIC130 |
39
+--------->10 27| | | | |
40
UART5 | 28| |orgate3 +----> output_pin3+----------->+GIC131 |
41
+-------->+11 29| | | | |
42
UART6 | +----------->+orgate4 +----> output_pin4+----------->+GIC132 |
43
+-------->+12 30| | | | |
44
UART7 | 31| |orgate5 +----> output_pin5+----------->+GIC133 |
45
+-------->+13 | | | | |
46
UART8 | OR[0:31] | |orgate6 +----> output_pin6+----------->+GIC134 |
47
---------->14 | | | | |
48
UART9 | | |orgate7 +----> output_pin7+----------->+GIC135 |
49
--------->+15 | | | | |
50
UART10 | | |orgate8 +----> output_pin8+----------->+GIC136 |
51
--------->+16 | | | +--------------+
52
UART11 | | +--------------------------+
53
+-------->+17 |
54
UART12 | |
55
+--------->18 |
56
| |
57
| |
58
| |
59
+-----------+
60
61
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
62
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
12
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
63
Reviewed-by: Cédric Le Goater <clg@redhat.com>
13
Reviewed-by: Cédric Le Goater <clg@redhat.com>
14
Link: https://lore.kernel.org/r/20241127091543.1243114-10-jamin_lin@aspeedtech.com
15
Signed-off-by: Cédric Le Goater <clg@redhat.com>
64
---
16
---
65
include/hw/intc/aspeed_intc.h | 44 +++++
17
tests/qtest/aspeed-smc-utils.h | 95 ++++
66
hw/intc/aspeed_intc.c | 360 ++++++++++++++++++++++++++++++++++
18
tests/qtest/aspeed-smc-utils.c | 686 ++++++++++++++++++++++++++++
67
hw/intc/meson.build | 1 +
19
tests/qtest/aspeed_smc-test.c | 800 +++------------------------------
68
hw/intc/trace-events | 13 ++
20
tests/qtest/meson.build | 1 +
69
4 files changed, 418 insertions(+)
21
4 files changed, 841 insertions(+), 741 deletions(-)
70
create mode 100644 include/hw/intc/aspeed_intc.h
22
create mode 100644 tests/qtest/aspeed-smc-utils.h
71
create mode 100644 hw/intc/aspeed_intc.c
23
create mode 100644 tests/qtest/aspeed-smc-utils.c
72
24
73
diff --git a/include/hw/intc/aspeed_intc.h b/include/hw/intc/aspeed_intc.h
25
diff --git a/tests/qtest/aspeed-smc-utils.h b/tests/qtest/aspeed-smc-utils.h
74
new file mode 100644
26
new file mode 100644
75
index XXXXXXX..XXXXXXX
27
index XXXXXXX..XXXXXXX
76
--- /dev/null
28
--- /dev/null
77
+++ b/include/hw/intc/aspeed_intc.h
29
+++ b/tests/qtest/aspeed-smc-utils.h
78
@@ -XXX,XX +XXX,XX @@
30
@@ -XXX,XX +XXX,XX @@
79
+/*
31
+/*
80
+ * ASPEED INTC Controller
32
+ * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
33
+ * Controller)
81
+ *
34
+ *
82
+ * Copyright (C) 2024 ASPEED Technology Inc.
35
+ * Copyright (C) 2016 IBM Corp.
83
+ *
36
+ *
84
+ * SPDX-License-Identifier: GPL-2.0-or-later
37
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
38
+ * of this software and associated documentation files (the "Software"), to deal
39
+ * in the Software without restriction, including without limitation the rights
40
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
41
+ * copies of the Software, and to permit persons to whom the Software is
42
+ * furnished to do so, subject to the following conditions:
43
+ *
44
+ * The above copyright notice and this permission notice shall be included in
45
+ * all copies or substantial portions of the Software.
46
+ *
47
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
48
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
49
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
50
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
51
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
52
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
53
+ * THE SOFTWARE.
85
+ */
54
+ */
86
+#ifndef ASPEED_INTC_H
55
+
87
+#define ASPEED_INTC_H
56
+#ifndef TESTS_ASPEED_SMC_UTILS_H
88
+
57
+#define TESTS_ASPEED_SMC_UTILS_H
89
+#include "hw/sysbus.h"
58
+
90
+#include "qom/object.h"
59
+#include "qemu/osdep.h"
91
+#include "hw/or-irq.h"
60
+#include "qemu/bswap.h"
92
+
61
+#include "libqtest-single.h"
93
+#define TYPE_ASPEED_INTC "aspeed.intc"
62
+#include "qemu/bitops.h"
94
+#define TYPE_ASPEED_2700_INTC TYPE_ASPEED_INTC "-ast2700"
63
+
95
+OBJECT_DECLARE_TYPE(AspeedINTCState, AspeedINTCClass, ASPEED_INTC)
64
+/*
96
+
65
+ * ASPEED SPI Controller registers
97
+#define ASPEED_INTC_NR_REGS (0x2000 >> 2)
66
+ */
98
+#define ASPEED_INTC_NR_INTS 9
67
+#define R_CONF 0x00
99
+
68
+#define CONF_ENABLE_W0 16
100
+struct AspeedINTCState {
69
+#define R_CE_CTRL 0x04
101
+ /*< private >*/
70
+#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
102
+ SysBusDevice parent_obj;
71
+#define R_CTRL0 0x10
103
+
72
+#define CTRL_IO_QUAD_IO BIT(31)
104
+ /*< public >*/
73
+#define CTRL_CE_STOP_ACTIVE BIT(2)
105
+ MemoryRegion iomem;
74
+#define CTRL_READMODE 0x0
106
+ uint32_t regs[ASPEED_INTC_NR_REGS];
75
+#define CTRL_FREADMODE 0x1
107
+ OrIRQState orgates[ASPEED_INTC_NR_INTS];
76
+#define CTRL_WRITEMODE 0x2
108
+ qemu_irq output_pins[ASPEED_INTC_NR_INTS];
77
+#define CTRL_USERMODE 0x3
109
+
78
+#define SR_WEL BIT(1)
110
+ uint32_t enable[ASPEED_INTC_NR_INTS];
79
+
111
+ uint32_t mask[ASPEED_INTC_NR_INTS];
80
+/*
112
+ uint32_t pending[ASPEED_INTC_NR_INTS];
81
+ * Flash commands
82
+ */
83
+enum {
84
+ JEDEC_READ = 0x9f,
85
+ RDSR = 0x5,
86
+ WRDI = 0x4,
87
+ BULK_ERASE = 0xc7,
88
+ READ = 0x03,
89
+ PP = 0x02,
90
+ WRSR = 0x1,
91
+ WREN = 0x6,
92
+ SRWD = 0x80,
93
+ RESET_ENABLE = 0x66,
94
+ RESET_MEMORY = 0x99,
95
+ EN_4BYTE_ADDR = 0xB7,
96
+ ERASE_SECTOR = 0xd8,
113
+};
97
+};
114
+
98
+
115
+struct AspeedINTCClass {
99
+#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
116
+ SysBusDeviceClass parent_class;
100
+#define FLASH_PAGE_SIZE 256
117
+
101
+
118
+ uint32_t num_lines;
102
+typedef struct AspeedSMCTestData {
119
+ uint32_t num_ints;
103
+ QTestState *s;
120
+};
104
+ uint64_t spi_base;
121
+
105
+ uint64_t flash_base;
122
+#endif /* ASPEED_INTC_H */
106
+ uint32_t jedec_id;
123
diff --git a/hw/intc/aspeed_intc.c b/hw/intc/aspeed_intc.c
107
+ char *tmp_path;
108
+ uint8_t cs;
109
+ const char *node;
110
+ uint32_t page_addr;
111
+} AspeedSMCTestData;
112
+
113
+void aspeed_smc_test_read_jedec(const void *data);
114
+void aspeed_smc_test_erase_sector(const void *data);
115
+void aspeed_smc_test_erase_all(const void *data);
116
+void aspeed_smc_test_write_page(const void *data);
117
+void aspeed_smc_test_read_page_mem(const void *data);
118
+void aspeed_smc_test_write_page_mem(const void *data);
119
+void aspeed_smc_test_read_status_reg(const void *data);
120
+void aspeed_smc_test_status_reg_write_protection(const void *data);
121
+void aspeed_smc_test_write_block_protect(const void *data);
122
+void aspeed_smc_test_write_block_protect_bottom_bit(const void *data);
123
+void aspeed_smc_test_write_page_qpi(const void *data);
124
+
125
+#endif /* TESTS_ASPEED_SMC_UTILS_H */
126
diff --git a/tests/qtest/aspeed-smc-utils.c b/tests/qtest/aspeed-smc-utils.c
124
new file mode 100644
127
new file mode 100644
125
index XXXXXXX..XXXXXXX
128
index XXXXXXX..XXXXXXX
126
--- /dev/null
129
--- /dev/null
127
+++ b/hw/intc/aspeed_intc.c
130
+++ b/tests/qtest/aspeed-smc-utils.c
128
@@ -XXX,XX +XXX,XX @@
131
@@ -XXX,XX +XXX,XX @@
129
+/*
132
+/*
130
+ * ASPEED INTC Controller
133
+ * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
134
+ * Controller)
131
+ *
135
+ *
132
+ * Copyright (C) 2024 ASPEED Technology Inc.
136
+ * Copyright (C) 2016 IBM Corp.
133
+ *
137
+ *
134
+ * SPDX-License-Identifier: GPL-2.0-or-later
138
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
139
+ * of this software and associated documentation files (the "Software"), to deal
140
+ * in the Software without restriction, including without limitation the rights
141
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
142
+ * copies of the Software, and to permit persons to whom the Software is
143
+ * furnished to do so, subject to the following conditions:
144
+ *
145
+ * The above copyright notice and this permission notice shall be included in
146
+ * all copies or substantial portions of the Software.
147
+ *
148
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
149
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
150
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
151
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
152
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
153
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
154
+ * THE SOFTWARE.
135
+ */
155
+ */
136
+
156
+
137
+#include "qemu/osdep.h"
157
+#include "qemu/osdep.h"
138
+#include "hw/intc/aspeed_intc.h"
158
+#include "qemu/bswap.h"
139
+#include "hw/irq.h"
159
+#include "libqtest-single.h"
140
+#include "qemu/log.h"
160
+#include "qemu/bitops.h"
141
+#include "trace.h"
161
+#include "aspeed-smc-utils.h"
142
+#include "hw/registerfields.h"
143
+#include "qapi/error.h"
144
+
145
+/* INTC Registers */
146
+REG32(GICINT128_EN, 0x1000)
147
+REG32(GICINT128_STATUS, 0x1004)
148
+REG32(GICINT129_EN, 0x1100)
149
+REG32(GICINT129_STATUS, 0x1104)
150
+REG32(GICINT130_EN, 0x1200)
151
+REG32(GICINT130_STATUS, 0x1204)
152
+REG32(GICINT131_EN, 0x1300)
153
+REG32(GICINT131_STATUS, 0x1304)
154
+REG32(GICINT132_EN, 0x1400)
155
+REG32(GICINT132_STATUS, 0x1404)
156
+REG32(GICINT133_EN, 0x1500)
157
+REG32(GICINT133_STATUS, 0x1504)
158
+REG32(GICINT134_EN, 0x1600)
159
+REG32(GICINT134_STATUS, 0x1604)
160
+REG32(GICINT135_EN, 0x1700)
161
+REG32(GICINT135_STATUS, 0x1704)
162
+REG32(GICINT136_EN, 0x1800)
163
+REG32(GICINT136_STATUS, 0x1804)
164
+
165
+#define GICINT_STATUS_BASE R_GICINT128_STATUS
166
+
167
+static void aspeed_intc_update(AspeedINTCState *s, int irq, int level)
168
+{
169
+ AspeedINTCClass *aic = ASPEED_INTC_GET_CLASS(s);
170
+
171
+ if (irq >= aic->num_ints) {
172
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Invalid interrupt number: %d\n",
173
+ __func__, irq);
174
+ return;
175
+ }
176
+
177
+ trace_aspeed_intc_update_irq(irq, level);
178
+ qemu_set_irq(s->output_pins[irq], level);
179
+}
180
+
162
+
181
+/*
163
+/*
182
+ * The address of GICINT128 to GICINT136 are from 0x1000 to 0x1804.
164
+ * Use an explicit bswap for the values read/wrote to the flash region
183
+ * Utilize "address & 0x0f00" to get the irq and irq output pin index
165
+ * as they are BE and the Aspeed CPU is LE.
184
+ * The value of irq should be 0 to num_ints.
185
+ * The irq 0 indicates GICINT128, irq 1 indicates GICINT129 and so on.
186
+ */
166
+ */
187
+static void aspeed_intc_set_irq(void *opaque, int irq, int level)
167
+static inline uint32_t make_be32(uint32_t data)
188
+{
168
+{
189
+ AspeedINTCState *s = (AspeedINTCState *)opaque;
169
+ return bswap32(data);
190
+ AspeedINTCClass *aic = ASPEED_INTC_GET_CLASS(s);
170
+}
191
+ uint32_t status_addr = GICINT_STATUS_BASE + ((0x100 * irq) >> 2);
171
+
192
+ uint32_t select = 0;
172
+static inline void spi_writel(const AspeedSMCTestData *data, uint64_t offset,
193
+ uint32_t enable;
173
+ uint32_t value)
174
+{
175
+ qtest_writel(data->s, data->spi_base + offset, value);
176
+}
177
+
178
+static inline uint32_t spi_readl(const AspeedSMCTestData *data, uint64_t offset)
179
+{
180
+ return qtest_readl(data->s, data->spi_base + offset);
181
+}
182
+
183
+static inline void flash_writeb(const AspeedSMCTestData *data, uint64_t offset,
184
+ uint8_t value)
185
+{
186
+ qtest_writeb(data->s, data->flash_base + offset, value);
187
+}
188
+
189
+static inline void flash_writel(const AspeedSMCTestData *data, uint64_t offset,
190
+ uint32_t value)
191
+{
192
+ qtest_writel(data->s, data->flash_base + offset, value);
193
+}
194
+
195
+static inline uint8_t flash_readb(const AspeedSMCTestData *data,
196
+ uint64_t offset)
197
+{
198
+ return qtest_readb(data->s, data->flash_base + offset);
199
+}
200
+
201
+static inline uint32_t flash_readl(const AspeedSMCTestData *data,
202
+ uint64_t offset)
203
+{
204
+ return qtest_readl(data->s, data->flash_base + offset);
205
+}
206
+
207
+static void spi_conf(const AspeedSMCTestData *data, uint32_t value)
208
+{
209
+ uint32_t conf = spi_readl(data, R_CONF);
210
+
211
+ conf |= value;
212
+ spi_writel(data, R_CONF, conf);
213
+}
214
+
215
+static void spi_conf_remove(const AspeedSMCTestData *data, uint32_t value)
216
+{
217
+ uint32_t conf = spi_readl(data, R_CONF);
218
+
219
+ conf &= ~value;
220
+ spi_writel(data, R_CONF, conf);
221
+}
222
+
223
+static void spi_ce_ctrl(const AspeedSMCTestData *data, uint32_t value)
224
+{
225
+ uint32_t conf = spi_readl(data, R_CE_CTRL);
226
+
227
+ conf |= value;
228
+ spi_writel(data, R_CE_CTRL, conf);
229
+}
230
+
231
+static void spi_ctrl_setmode(const AspeedSMCTestData *data, uint8_t mode,
232
+ uint8_t cmd)
233
+{
234
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
235
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
236
+ ctrl &= ~(CTRL_USERMODE | 0xff << 16);
237
+ ctrl |= mode | (cmd << 16);
238
+ spi_writel(data, ctrl_reg, ctrl);
239
+}
240
+
241
+static void spi_ctrl_start_user(const AspeedSMCTestData *data)
242
+{
243
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
244
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
245
+
246
+ ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
247
+ spi_writel(data, ctrl_reg, ctrl);
248
+
249
+ ctrl &= ~CTRL_CE_STOP_ACTIVE;
250
+ spi_writel(data, ctrl_reg, ctrl);
251
+}
252
+
253
+static void spi_ctrl_stop_user(const AspeedSMCTestData *data)
254
+{
255
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
256
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
257
+
258
+ ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
259
+ spi_writel(data, ctrl_reg, ctrl);
260
+}
261
+
262
+static void spi_ctrl_set_io_mode(const AspeedSMCTestData *data, uint32_t value)
263
+{
264
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
265
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
266
+ uint32_t mode;
267
+
268
+ mode = value & CTRL_IO_MODE_MASK;
269
+ ctrl &= ~CTRL_IO_MODE_MASK;
270
+ ctrl |= mode;
271
+ spi_writel(data, ctrl_reg, ctrl);
272
+}
273
+
274
+static void flash_reset(const AspeedSMCTestData *data)
275
+{
276
+ spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
277
+
278
+ spi_ctrl_start_user(data);
279
+ flash_writeb(data, 0, RESET_ENABLE);
280
+ flash_writeb(data, 0, RESET_MEMORY);
281
+ flash_writeb(data, 0, WREN);
282
+ flash_writeb(data, 0, BULK_ERASE);
283
+ flash_writeb(data, 0, WRDI);
284
+ spi_ctrl_stop_user(data);
285
+
286
+ spi_conf_remove(data, 1 << (CONF_ENABLE_W0 + data->cs));
287
+}
288
+
289
+static void read_page(const AspeedSMCTestData *data, uint32_t addr,
290
+ uint32_t *page)
291
+{
194
+ int i;
292
+ int i;
195
+
293
+
196
+ if (irq >= aic->num_ints) {
294
+ spi_ctrl_start_user(data);
197
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Invalid interrupt number: %d\n",
295
+
198
+ __func__, irq);
296
+ flash_writeb(data, 0, EN_4BYTE_ADDR);
199
+ return;
297
+ flash_writeb(data, 0, READ);
200
+ }
298
+ flash_writel(data, 0, make_be32(addr));
201
+
299
+
202
+ trace_aspeed_intc_set_irq(irq, level);
300
+ /* Continuous read are supported */
203
+ enable = s->enable[irq];
301
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
204
+
302
+ page[i] = make_be32(flash_readl(data, 0));
205
+ if (!level) {
303
+ }
206
+ return;
304
+ spi_ctrl_stop_user(data);
207
+ }
305
+}
208
+
306
+
209
+ for (i = 0; i < aic->num_lines; i++) {
307
+static void read_page_mem(const AspeedSMCTestData *data, uint32_t addr,
210
+ if (s->orgates[irq].levels[i]) {
308
+ uint32_t *page)
211
+ if (enable & BIT(i)) {
309
+{
212
+ select |= BIT(i);
310
+ int i;
213
+ }
311
+
312
+ /* move out USER mode to use direct reads from the AHB bus */
313
+ spi_ctrl_setmode(data, CTRL_READMODE, READ);
314
+
315
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
316
+ page[i] = make_be32(flash_readl(data, addr + i * 4));
317
+ }
318
+}
319
+
320
+static void write_page_mem(const AspeedSMCTestData *data, uint32_t addr,
321
+ uint32_t write_value)
322
+{
323
+ spi_ctrl_setmode(data, CTRL_WRITEMODE, PP);
324
+
325
+ for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
326
+ flash_writel(data, addr + i * 4, write_value);
327
+ }
328
+}
329
+
330
+static void assert_page_mem(const AspeedSMCTestData *data, uint32_t addr,
331
+ uint32_t expected_value)
332
+{
333
+ uint32_t page[FLASH_PAGE_SIZE / 4];
334
+ read_page_mem(data, addr, page);
335
+ for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
336
+ g_assert_cmphex(page[i], ==, expected_value);
337
+ }
338
+}
339
+
340
+void aspeed_smc_test_read_jedec(const void *data)
341
+{
342
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
343
+ uint32_t jedec = 0x0;
344
+
345
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
346
+
347
+ spi_ctrl_start_user(test_data);
348
+ flash_writeb(test_data, 0, JEDEC_READ);
349
+ jedec |= flash_readb(test_data, 0) << 16;
350
+ jedec |= flash_readb(test_data, 0) << 8;
351
+ jedec |= flash_readb(test_data, 0);
352
+ spi_ctrl_stop_user(test_data);
353
+
354
+ flash_reset(test_data);
355
+
356
+ g_assert_cmphex(jedec, ==, test_data->jedec_id);
357
+}
358
+
359
+void aspeed_smc_test_erase_sector(const void *data)
360
+{
361
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
362
+ uint32_t some_page_addr = test_data->page_addr;
363
+ uint32_t page[FLASH_PAGE_SIZE / 4];
364
+ int i;
365
+
366
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
367
+
368
+ /*
369
+ * Previous page should be full of 0xffs after backend is
370
+ * initialized
371
+ */
372
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
373
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
374
+ g_assert_cmphex(page[i], ==, 0xffffffff);
375
+ }
376
+
377
+ spi_ctrl_start_user(test_data);
378
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
379
+ flash_writeb(test_data, 0, WREN);
380
+ flash_writeb(test_data, 0, PP);
381
+ flash_writel(test_data, 0, make_be32(some_page_addr));
382
+
383
+ /* Fill the page with its own addresses */
384
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
385
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
386
+ }
387
+ spi_ctrl_stop_user(test_data);
388
+
389
+ /* Check the page is correctly written */
390
+ read_page(test_data, some_page_addr, page);
391
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
392
+ g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
393
+ }
394
+
395
+ spi_ctrl_start_user(test_data);
396
+ flash_writeb(test_data, 0, WREN);
397
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
398
+ flash_writeb(test_data, 0, ERASE_SECTOR);
399
+ flash_writel(test_data, 0, make_be32(some_page_addr));
400
+ spi_ctrl_stop_user(test_data);
401
+
402
+ /* Check the page is erased */
403
+ read_page(test_data, some_page_addr, page);
404
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
405
+ g_assert_cmphex(page[i], ==, 0xffffffff);
406
+ }
407
+
408
+ flash_reset(test_data);
409
+}
410
+
411
+void aspeed_smc_test_erase_all(const void *data)
412
+{
413
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
414
+ uint32_t some_page_addr = test_data->page_addr;
415
+ uint32_t page[FLASH_PAGE_SIZE / 4];
416
+ int i;
417
+
418
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
419
+
420
+ /*
421
+ * Previous page should be full of 0xffs after backend is
422
+ * initialized
423
+ */
424
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
425
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
426
+ g_assert_cmphex(page[i], ==, 0xffffffff);
427
+ }
428
+
429
+ spi_ctrl_start_user(test_data);
430
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
431
+ flash_writeb(test_data, 0, WREN);
432
+ flash_writeb(test_data, 0, PP);
433
+ flash_writel(test_data, 0, make_be32(some_page_addr));
434
+
435
+ /* Fill the page with its own addresses */
436
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
437
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
438
+ }
439
+ spi_ctrl_stop_user(test_data);
440
+
441
+ /* Check the page is correctly written */
442
+ read_page(test_data, some_page_addr, page);
443
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
444
+ g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
445
+ }
446
+
447
+ spi_ctrl_start_user(test_data);
448
+ flash_writeb(test_data, 0, WREN);
449
+ flash_writeb(test_data, 0, BULK_ERASE);
450
+ spi_ctrl_stop_user(test_data);
451
+
452
+ /* Check the page is erased */
453
+ read_page(test_data, some_page_addr, page);
454
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
455
+ g_assert_cmphex(page[i], ==, 0xffffffff);
456
+ }
457
+
458
+ flash_reset(test_data);
459
+}
460
+
461
+void aspeed_smc_test_write_page(const void *data)
462
+{
463
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
464
+ uint32_t my_page_addr = test_data->page_addr;
465
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
466
+ uint32_t page[FLASH_PAGE_SIZE / 4];
467
+ int i;
468
+
469
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
470
+
471
+ spi_ctrl_start_user(test_data);
472
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
473
+ flash_writeb(test_data, 0, WREN);
474
+ flash_writeb(test_data, 0, PP);
475
+ flash_writel(test_data, 0, make_be32(my_page_addr));
476
+
477
+ /* Fill the page with its own addresses */
478
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
479
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
480
+ }
481
+ spi_ctrl_stop_user(test_data);
482
+
483
+ /* Check what was written */
484
+ read_page(test_data, my_page_addr, page);
485
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
486
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
487
+ }
488
+
489
+ /* Check some other page. It should be full of 0xff */
490
+ read_page(test_data, some_page_addr, page);
491
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
492
+ g_assert_cmphex(page[i], ==, 0xffffffff);
493
+ }
494
+
495
+ flash_reset(test_data);
496
+}
497
+
498
+void aspeed_smc_test_read_page_mem(const void *data)
499
+{
500
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
501
+ uint32_t my_page_addr = test_data->page_addr;
502
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
503
+ uint32_t page[FLASH_PAGE_SIZE / 4];
504
+ int i;
505
+
506
+ /*
507
+ * Enable 4BYTE mode for controller.
508
+ */
509
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
510
+
511
+ /* Enable 4BYTE mode for flash. */
512
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
513
+ spi_ctrl_start_user(test_data);
514
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
515
+ flash_writeb(test_data, 0, WREN);
516
+ flash_writeb(test_data, 0, PP);
517
+ flash_writel(test_data, 0, make_be32(my_page_addr));
518
+
519
+ /* Fill the page with its own addresses */
520
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
521
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
522
+ }
523
+ spi_ctrl_stop_user(test_data);
524
+ spi_conf_remove(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
525
+
526
+ /* Check what was written */
527
+ read_page_mem(test_data, my_page_addr, page);
528
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
529
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
530
+ }
531
+
532
+ /* Check some other page. It should be full of 0xff */
533
+ read_page_mem(test_data, some_page_addr, page);
534
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
535
+ g_assert_cmphex(page[i], ==, 0xffffffff);
536
+ }
537
+
538
+ flash_reset(test_data);
539
+}
540
+
541
+void aspeed_smc_test_write_page_mem(const void *data)
542
+{
543
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
544
+ uint32_t my_page_addr = test_data->page_addr;
545
+ uint32_t page[FLASH_PAGE_SIZE / 4];
546
+ int i;
547
+
548
+ /*
549
+ * Enable 4BYTE mode for controller.
550
+ */
551
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
552
+
553
+ /* Enable 4BYTE mode for flash. */
554
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
555
+ spi_ctrl_start_user(test_data);
556
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
557
+ flash_writeb(test_data, 0, WREN);
558
+ spi_ctrl_stop_user(test_data);
559
+
560
+ /* move out USER mode to use direct writes to the AHB bus */
561
+ spi_ctrl_setmode(test_data, CTRL_WRITEMODE, PP);
562
+
563
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
564
+ flash_writel(test_data, my_page_addr + i * 4,
565
+ make_be32(my_page_addr + i * 4));
566
+ }
567
+
568
+ /* Check what was written */
569
+ read_page_mem(test_data, my_page_addr, page);
570
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
571
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
572
+ }
573
+
574
+ flash_reset(test_data);
575
+}
576
+
577
+void aspeed_smc_test_read_status_reg(const void *data)
578
+{
579
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
580
+ uint8_t r;
581
+
582
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
583
+
584
+ spi_ctrl_start_user(test_data);
585
+ flash_writeb(test_data, 0, RDSR);
586
+ r = flash_readb(test_data, 0);
587
+ spi_ctrl_stop_user(test_data);
588
+
589
+ g_assert_cmphex(r & SR_WEL, ==, 0);
590
+ g_assert(!qtest_qom_get_bool
591
+ (test_data->s, test_data->node, "write-enable"));
592
+
593
+ spi_ctrl_start_user(test_data);
594
+ flash_writeb(test_data, 0, WREN);
595
+ flash_writeb(test_data, 0, RDSR);
596
+ r = flash_readb(test_data, 0);
597
+ spi_ctrl_stop_user(test_data);
598
+
599
+ g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
600
+ g_assert(qtest_qom_get_bool
601
+ (test_data->s, test_data->node, "write-enable"));
602
+
603
+ spi_ctrl_start_user(test_data);
604
+ flash_writeb(test_data, 0, WRDI);
605
+ flash_writeb(test_data, 0, RDSR);
606
+ r = flash_readb(test_data, 0);
607
+ spi_ctrl_stop_user(test_data);
608
+
609
+ g_assert_cmphex(r & SR_WEL, ==, 0);
610
+ g_assert(!qtest_qom_get_bool
611
+ (test_data->s, test_data->node, "write-enable"));
612
+
613
+ flash_reset(test_data);
614
+}
615
+
616
+void aspeed_smc_test_status_reg_write_protection(const void *data)
617
+{
618
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
619
+ uint8_t r;
620
+
621
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
622
+
623
+ /* default case: WP# is high and SRWD is low -> status register writable */
624
+ spi_ctrl_start_user(test_data);
625
+ flash_writeb(test_data, 0, WREN);
626
+ /* test ability to write SRWD */
627
+ flash_writeb(test_data, 0, WRSR);
628
+ flash_writeb(test_data, 0, SRWD);
629
+ flash_writeb(test_data, 0, RDSR);
630
+ r = flash_readb(test_data, 0);
631
+ spi_ctrl_stop_user(test_data);
632
+ g_assert_cmphex(r & SRWD, ==, SRWD);
633
+
634
+ /* WP# high and SRWD high -> status register writable */
635
+ spi_ctrl_start_user(test_data);
636
+ flash_writeb(test_data, 0, WREN);
637
+ /* test ability to write SRWD */
638
+ flash_writeb(test_data, 0, WRSR);
639
+ flash_writeb(test_data, 0, 0);
640
+ flash_writeb(test_data, 0, RDSR);
641
+ r = flash_readb(test_data, 0);
642
+ spi_ctrl_stop_user(test_data);
643
+ g_assert_cmphex(r & SRWD, ==, 0);
644
+
645
+ /* WP# low and SRWD low -> status register writable */
646
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 0);
647
+ spi_ctrl_start_user(test_data);
648
+ flash_writeb(test_data, 0, WREN);
649
+ /* test ability to write SRWD */
650
+ flash_writeb(test_data, 0, WRSR);
651
+ flash_writeb(test_data, 0, SRWD);
652
+ flash_writeb(test_data, 0, RDSR);
653
+ r = flash_readb(test_data, 0);
654
+ spi_ctrl_stop_user(test_data);
655
+ g_assert_cmphex(r & SRWD, ==, SRWD);
656
+
657
+ /* WP# low and SRWD high -> status register NOT writable */
658
+ spi_ctrl_start_user(test_data);
659
+ flash_writeb(test_data, 0 , WREN);
660
+ /* test ability to write SRWD */
661
+ flash_writeb(test_data, 0, WRSR);
662
+ flash_writeb(test_data, 0, 0);
663
+ flash_writeb(test_data, 0, RDSR);
664
+ r = flash_readb(test_data, 0);
665
+ spi_ctrl_stop_user(test_data);
666
+ /* write is not successful */
667
+ g_assert_cmphex(r & SRWD, ==, SRWD);
668
+
669
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 1);
670
+ flash_reset(test_data);
671
+}
672
+
673
+void aspeed_smc_test_write_block_protect(const void *data)
674
+{
675
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
676
+ uint32_t sector_size = 65536;
677
+ uint32_t n_sectors = 512;
678
+
679
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
680
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
681
+
682
+ uint32_t bp_bits = 0b0;
683
+
684
+ for (int i = 0; i < 16; i++) {
685
+ bp_bits = ((i & 0b1000) << 3) | ((i & 0b0111) << 2);
686
+
687
+ spi_ctrl_start_user(test_data);
688
+ flash_writeb(test_data, 0, WREN);
689
+ flash_writeb(test_data, 0, BULK_ERASE);
690
+ flash_writeb(test_data, 0, WREN);
691
+ flash_writeb(test_data, 0, WRSR);
692
+ flash_writeb(test_data, 0, bp_bits);
693
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
694
+ flash_writeb(test_data, 0, WREN);
695
+ spi_ctrl_stop_user(test_data);
696
+
697
+ uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
698
+ uint32_t protection_start = n_sectors - num_protected_sectors;
699
+ uint32_t protection_end = n_sectors;
700
+
701
+ for (int sector = 0; sector < n_sectors; sector++) {
702
+ uint32_t addr = sector * sector_size;
703
+
704
+ assert_page_mem(test_data, addr, 0xffffffff);
705
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
706
+
707
+ uint32_t expected_value = protection_start <= sector
708
+ && sector < protection_end
709
+ ? 0xffffffff : 0xabcdef12;
710
+
711
+ assert_page_mem(test_data, addr, expected_value);
214
+ }
712
+ }
215
+ }
713
+ }
216
+
714
+
217
+ if (!select) {
715
+ flash_reset(test_data);
218
+ return;
716
+}
219
+ }
717
+
220
+
718
+void aspeed_smc_test_write_block_protect_bottom_bit(const void *data)
221
+ trace_aspeed_intc_select(select);
719
+{
222
+
720
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
223
+ if (s->mask[irq] || s->regs[status_addr]) {
721
+ uint32_t sector_size = 65536;
224
+ /*
722
+ uint32_t n_sectors = 512;
225
+ * a. mask is not 0 means in ISR mode
723
+
226
+ * sources interrupt routine are executing.
724
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
227
+ * b. status register value is not 0 means previous
725
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
228
+ * source interrupt does not be executed, yet.
726
+
229
+ *
727
+ /* top bottom bit is enabled */
230
+ * save source interrupt to pending variable.
728
+ uint32_t bp_bits = 0b00100 << 3;
231
+ */
729
+
232
+ s->pending[irq] |= select;
730
+ for (int i = 0; i < 16; i++) {
233
+ trace_aspeed_intc_pending_irq(irq, s->pending[irq]);
731
+ bp_bits = (((i & 0b1000) | 0b0100) << 3) | ((i & 0b0111) << 2);
234
+ } else {
732
+
235
+ /*
733
+ spi_ctrl_start_user(test_data);
236
+ * notify firmware which source interrupt are coming
734
+ flash_writeb(test_data, 0, WREN);
237
+ * by setting status register
735
+ flash_writeb(test_data, 0, BULK_ERASE);
238
+ */
736
+ flash_writeb(test_data, 0, WREN);
239
+ s->regs[status_addr] = select;
737
+ flash_writeb(test_data, 0, WRSR);
240
+ trace_aspeed_intc_trigger_irq(irq, s->regs[status_addr]);
738
+ flash_writeb(test_data, 0, bp_bits);
241
+ aspeed_intc_update(s, irq, 1);
739
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
242
+ }
740
+ flash_writeb(test_data, 0, WREN);
243
+}
741
+ spi_ctrl_stop_user(test_data);
244
+
742
+
245
+static uint64_t aspeed_intc_read(void *opaque, hwaddr offset, unsigned int size)
743
+ uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
246
+{
744
+ uint32_t protection_start = 0;
247
+ AspeedINTCState *s = ASPEED_INTC(opaque);
745
+ uint32_t protection_end = num_protected_sectors;
248
+ uint32_t addr = offset >> 2;
746
+
249
+ uint32_t value = 0;
747
+ for (int sector = 0; sector < n_sectors; sector++) {
250
+
748
+ uint32_t addr = sector * sector_size;
251
+ if (addr >= ASPEED_INTC_NR_REGS) {
749
+
252
+ qemu_log_mask(LOG_GUEST_ERROR,
750
+ assert_page_mem(test_data, addr, 0xffffffff);
253
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
751
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
254
+ __func__, offset);
752
+
255
+ return 0;
753
+ uint32_t expected_value = protection_start <= sector
256
+ }
754
+ && sector < protection_end
257
+
755
+ ? 0xffffffff : 0xabcdef12;
258
+ value = s->regs[addr];
756
+
259
+ trace_aspeed_intc_read(offset, size, value);
757
+ assert_page_mem(test_data, addr, expected_value);
260
+
261
+ return value;
262
+}
263
+
264
+static void aspeed_intc_write(void *opaque, hwaddr offset, uint64_t data,
265
+ unsigned size)
266
+{
267
+ AspeedINTCState *s = ASPEED_INTC(opaque);
268
+ AspeedINTCClass *aic = ASPEED_INTC_GET_CLASS(s);
269
+ uint32_t addr = offset >> 2;
270
+ uint32_t old_enable;
271
+ uint32_t change;
272
+ uint32_t irq;
273
+
274
+ if (addr >= ASPEED_INTC_NR_REGS) {
275
+ qemu_log_mask(LOG_GUEST_ERROR,
276
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
277
+ __func__, offset);
278
+ return;
279
+ }
280
+
281
+ trace_aspeed_intc_write(offset, size, data);
282
+
283
+ switch (addr) {
284
+ case R_GICINT128_EN:
285
+ case R_GICINT129_EN:
286
+ case R_GICINT130_EN:
287
+ case R_GICINT131_EN:
288
+ case R_GICINT132_EN:
289
+ case R_GICINT133_EN:
290
+ case R_GICINT134_EN:
291
+ case R_GICINT135_EN:
292
+ case R_GICINT136_EN:
293
+ irq = (offset & 0x0f00) >> 8;
294
+
295
+ if (irq >= aic->num_ints) {
296
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Invalid interrupt number: %d\n",
297
+ __func__, irq);
298
+ return;
299
+ }
758
+ }
300
+
759
+ }
301
+ /*
760
+
302
+ * These registers are used for enable sources interrupt and
761
+ flash_reset(test_data);
303
+ * mask and unmask source interrupt while executing source ISR.
762
+}
304
+ */
763
+
305
+
764
+void aspeed_smc_test_write_page_qpi(const void *data)
306
+ /* disable all source interrupt */
765
+{
307
+ if (!data && !s->enable[irq]) {
766
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
308
+ s->regs[addr] = data;
767
+ uint32_t my_page_addr = test_data->page_addr;
309
+ return;
768
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
310
+ }
769
+ uint32_t page[FLASH_PAGE_SIZE / 4];
311
+
770
+ uint32_t page_pattern[] = {
312
+ old_enable = s->enable[irq];
771
+ 0xebd8c134, 0x5da196bc, 0xae15e729, 0x5085ccdf
313
+ s->enable[irq] |= data;
772
+ };
314
+
315
+ /* enable new source interrupt */
316
+ if (old_enable != s->enable[irq]) {
317
+ trace_aspeed_intc_enable(s->enable[irq]);
318
+ s->regs[addr] = data;
319
+ return;
320
+ }
321
+
322
+ /* mask and unmask source interrupt */
323
+ change = s->regs[addr] ^ data;
324
+ if (change & data) {
325
+ s->mask[irq] &= ~change;
326
+ trace_aspeed_intc_unmask(change, s->mask[irq]);
327
+ } else {
328
+ s->mask[irq] |= change;
329
+ trace_aspeed_intc_mask(change, s->mask[irq]);
330
+ }
331
+ s->regs[addr] = data;
332
+ break;
333
+ case R_GICINT128_STATUS:
334
+ case R_GICINT129_STATUS:
335
+ case R_GICINT130_STATUS:
336
+ case R_GICINT131_STATUS:
337
+ case R_GICINT132_STATUS:
338
+ case R_GICINT133_STATUS:
339
+ case R_GICINT134_STATUS:
340
+ case R_GICINT135_STATUS:
341
+ case R_GICINT136_STATUS:
342
+ irq = (offset & 0x0f00) >> 8;
343
+
344
+ if (irq >= aic->num_ints) {
345
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Invalid interrupt number: %d\n",
346
+ __func__, irq);
347
+ return;
348
+ }
349
+
350
+ /* clear status */
351
+ s->regs[addr] &= ~data;
352
+
353
+ /*
354
+ * These status registers are used for notify sources ISR are executed.
355
+ * If one source ISR is executed, it will clear one bit.
356
+ * If it clear all bits, it means to initialize this register status
357
+ * rather than sources ISR are executed.
358
+ */
359
+ if (data == 0xffffffff) {
360
+ return;
361
+ }
362
+
363
+ /* All source ISR execution are done */
364
+ if (!s->regs[addr]) {
365
+ trace_aspeed_intc_all_isr_done(irq);
366
+ if (s->pending[irq]) {
367
+ /*
368
+ * handle pending source interrupt
369
+ * notify firmware which source interrupt are pending
370
+ * by setting status register
371
+ */
372
+ s->regs[addr] = s->pending[irq];
373
+ s->pending[irq] = 0;
374
+ trace_aspeed_intc_trigger_irq(irq, s->regs[addr]);
375
+ aspeed_intc_update(s, irq, 1);
376
+ } else {
377
+ /* clear irq */
378
+ trace_aspeed_intc_clear_irq(irq, 0);
379
+ aspeed_intc_update(s, irq, 0);
380
+ }
381
+ }
382
+ break;
383
+ default:
384
+ s->regs[addr] = data;
385
+ break;
386
+ }
387
+
388
+ return;
389
+}
390
+
391
+static const MemoryRegionOps aspeed_intc_ops = {
392
+ .read = aspeed_intc_read,
393
+ .write = aspeed_intc_write,
394
+ .endianness = DEVICE_LITTLE_ENDIAN,
395
+ .valid = {
396
+ .min_access_size = 4,
397
+ .max_access_size = 4,
398
+ }
399
+};
400
+
401
+static void aspeed_intc_instance_init(Object *obj)
402
+{
403
+ AspeedINTCState *s = ASPEED_INTC(obj);
404
+ AspeedINTCClass *aic = ASPEED_INTC_GET_CLASS(s);
405
+ int i;
773
+ int i;
406
+
774
+
407
+ assert(aic->num_ints <= ASPEED_INTC_NR_INTS);
775
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
408
+ for (i = 0; i < aic->num_ints; i++) {
776
+
409
+ object_initialize_child(obj, "intc-orgates[*]", &s->orgates[i],
777
+ spi_ctrl_start_user(test_data);
410
+ TYPE_OR_IRQ);
778
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
411
+ object_property_set_int(OBJECT(&s->orgates[i]), "num-lines",
779
+ flash_writeb(test_data, 0, WREN);
412
+ aic->num_lines, &error_abort);
780
+ flash_writeb(test_data, 0, PP);
413
+ }
781
+ flash_writel(test_data, 0, make_be32(my_page_addr));
414
+}
782
+
415
+
783
+ /* Set QPI mode */
416
+static void aspeed_intc_reset(DeviceState *dev)
784
+ spi_ctrl_set_io_mode(test_data, CTRL_IO_QUAD_IO);
417
+{
785
+
418
+ AspeedINTCState *s = ASPEED_INTC(dev);
786
+ /* Fill the page pattern */
419
+
787
+ for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
420
+ memset(s->regs, 0, sizeof(s->regs));
788
+ flash_writel(test_data, 0, make_be32(page_pattern[i]));
421
+ memset(s->enable, 0, sizeof(s->enable));
789
+ }
422
+ memset(s->mask, 0, sizeof(s->mask));
790
+
423
+ memset(s->pending, 0, sizeof(s->pending));
791
+ /* Fill the page with its own addresses */
424
+}
792
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
425
+
793
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
426
+static void aspeed_intc_realize(DeviceState *dev, Error **errp)
794
+ }
427
+{
795
+
428
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
796
+ /* Restore io mode */
429
+ AspeedINTCState *s = ASPEED_INTC(dev);
797
+ spi_ctrl_set_io_mode(test_data, 0);
430
+ AspeedINTCClass *aic = ASPEED_INTC_GET_CLASS(s);
798
+ spi_ctrl_stop_user(test_data);
431
+ int i;
799
+
432
+
800
+ /* Check what was written */
433
+ memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_intc_ops, s,
801
+ read_page(test_data, my_page_addr, page);
434
+ TYPE_ASPEED_INTC ".regs", ASPEED_INTC_NR_REGS << 2);
802
+ for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
435
+
803
+ g_assert_cmphex(page[i], ==, page_pattern[i]);
436
+ sysbus_init_mmio(sbd, &s->iomem);
804
+ }
437
+ qdev_init_gpio_in(dev, aspeed_intc_set_irq, aic->num_ints);
805
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
438
+
806
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
439
+ for (i = 0; i < aic->num_ints; i++) {
807
+ }
440
+ if (!qdev_realize(DEVICE(&s->orgates[i]), NULL, errp)) {
808
+
441
+ return;
809
+ /* Check some other page. It should be full of 0xff */
442
+ }
810
+ read_page(test_data, some_page_addr, page);
443
+ sysbus_init_irq(sbd, &s->output_pins[i]);
811
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
444
+ }
812
+ g_assert_cmphex(page[i], ==, 0xffffffff);
445
+}
813
+ }
446
+
814
+
447
+static void aspeed_intc_class_init(ObjectClass *klass, void *data)
815
+ flash_reset(test_data);
448
+{
816
+}
449
+ DeviceClass *dc = DEVICE_CLASS(klass);
817
+
450
+
818
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
451
+ dc->desc = "ASPEED INTC Controller";
452
+ dc->realize = aspeed_intc_realize;
453
+ dc->reset = aspeed_intc_reset;
454
+ dc->vmsd = NULL;
455
+}
456
+
457
+static const TypeInfo aspeed_intc_info = {
458
+ .name = TYPE_ASPEED_INTC,
459
+ .parent = TYPE_SYS_BUS_DEVICE,
460
+ .instance_init = aspeed_intc_instance_init,
461
+ .instance_size = sizeof(AspeedINTCState),
462
+ .class_init = aspeed_intc_class_init,
463
+ .abstract = true,
464
+};
465
+
466
+static void aspeed_2700_intc_class_init(ObjectClass *klass, void *data)
467
+{
468
+ DeviceClass *dc = DEVICE_CLASS(klass);
469
+ AspeedINTCClass *aic = ASPEED_INTC_CLASS(klass);
470
+
471
+ dc->desc = "ASPEED 2700 INTC Controller";
472
+ aic->num_lines = 32;
473
+ aic->num_ints = 9;
474
+}
475
+
476
+static const TypeInfo aspeed_2700_intc_info = {
477
+ .name = TYPE_ASPEED_2700_INTC,
478
+ .parent = TYPE_ASPEED_INTC,
479
+ .class_init = aspeed_2700_intc_class_init,
480
+};
481
+
482
+static void aspeed_intc_register_types(void)
483
+{
484
+ type_register_static(&aspeed_intc_info);
485
+ type_register_static(&aspeed_2700_intc_info);
486
+}
487
+
488
+type_init(aspeed_intc_register_types);
489
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
490
index XXXXXXX..XXXXXXX 100644
819
index XXXXXXX..XXXXXXX 100644
491
--- a/hw/intc/meson.build
820
--- a/tests/qtest/aspeed_smc-test.c
492
+++ b/hw/intc/meson.build
821
+++ b/tests/qtest/aspeed_smc-test.c
493
@@ -XXX,XX +XXX,XX @@ system_ss.add(when: 'CONFIG_ARM_GICV3_TCG', if_true: files(
822
@@ -XXX,XX +XXX,XX @@
494
))
823
#include "qemu/bswap.h"
495
system_ss.add(when: 'CONFIG_ALLWINNER_A10_PIC', if_true: files('allwinner-a10-pic.c'))
824
#include "libqtest-single.h"
496
system_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_vic.c'))
825
#include "qemu/bitops.h"
497
+system_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_intc.c'))
826
+#include "aspeed-smc-utils.h"
498
system_ss.add(when: 'CONFIG_ETRAXFS', if_true: files('etraxfs_pic.c'))
827
499
system_ss.add(when: 'CONFIG_EXYNOS4', if_true: files('exynos4210_gic.c', 'exynos4210_combiner.c'))
828
-/*
500
system_ss.add(when: 'CONFIG_GOLDFISH_PIC', if_true: files('goldfish_pic.c'))
829
- * ASPEED SPI Controller registers
501
diff --git a/hw/intc/trace-events b/hw/intc/trace-events
830
- */
831
-#define R_CONF 0x00
832
-#define CONF_ENABLE_W0 16
833
-#define R_CE_CTRL 0x04
834
-#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
835
-#define R_CTRL0 0x10
836
-#define CTRL_IO_QUAD_IO BIT(31)
837
-#define CTRL_CE_STOP_ACTIVE BIT(2)
838
-#define CTRL_READMODE 0x0
839
-#define CTRL_FREADMODE 0x1
840
-#define CTRL_WRITEMODE 0x2
841
-#define CTRL_USERMODE 0x3
842
-#define SR_WEL BIT(1)
843
-
844
-/*
845
- * Flash commands
846
- */
847
-enum {
848
- JEDEC_READ = 0x9f,
849
- RDSR = 0x5,
850
- WRDI = 0x4,
851
- BULK_ERASE = 0xc7,
852
- READ = 0x03,
853
- PP = 0x02,
854
- WRSR = 0x1,
855
- WREN = 0x6,
856
- SRWD = 0x80,
857
- RESET_ENABLE = 0x66,
858
- RESET_MEMORY = 0x99,
859
- EN_4BYTE_ADDR = 0xB7,
860
- ERASE_SECTOR = 0xd8,
861
-};
862
-
863
-#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
864
-#define FLASH_PAGE_SIZE 256
865
-
866
-typedef struct TestData {
867
- QTestState *s;
868
- uint64_t spi_base;
869
- uint64_t flash_base;
870
- uint32_t jedec_id;
871
- char *tmp_path;
872
- uint8_t cs;
873
- const char *node;
874
- uint32_t page_addr;
875
-} TestData;
876
-
877
-/*
878
- * Use an explicit bswap for the values read/wrote to the flash region
879
- * as they are BE and the Aspeed CPU is LE.
880
- */
881
-static inline uint32_t make_be32(uint32_t data)
882
-{
883
- return bswap32(data);
884
-}
885
-
886
-static inline void spi_writel(const TestData *data, uint64_t offset,
887
- uint32_t value)
888
-{
889
- qtest_writel(data->s, data->spi_base + offset, value);
890
-}
891
-
892
-static inline uint32_t spi_readl(const TestData *data, uint64_t offset)
893
-{
894
- return qtest_readl(data->s, data->spi_base + offset);
895
-}
896
-
897
-static inline void flash_writeb(const TestData *data, uint64_t offset,
898
- uint8_t value)
899
-{
900
- qtest_writeb(data->s, data->flash_base + offset, value);
901
-}
902
-
903
-static inline void flash_writel(const TestData *data, uint64_t offset,
904
- uint32_t value)
905
-{
906
- qtest_writel(data->s, data->flash_base + offset, value);
907
-}
908
-
909
-static inline uint8_t flash_readb(const TestData *data, uint64_t offset)
910
-{
911
- return qtest_readb(data->s, data->flash_base + offset);
912
-}
913
-
914
-static inline uint32_t flash_readl(const TestData *data, uint64_t offset)
915
-{
916
- return qtest_readl(data->s, data->flash_base + offset);
917
-}
918
-
919
-static void spi_conf(const TestData *data, uint32_t value)
920
-{
921
- uint32_t conf = spi_readl(data, R_CONF);
922
-
923
- conf |= value;
924
- spi_writel(data, R_CONF, conf);
925
-}
926
-
927
-static void spi_conf_remove(const TestData *data, uint32_t value)
928
-{
929
- uint32_t conf = spi_readl(data, R_CONF);
930
-
931
- conf &= ~value;
932
- spi_writel(data, R_CONF, conf);
933
-}
934
-
935
-static void spi_ce_ctrl(const TestData *data, uint32_t value)
936
-{
937
- uint32_t conf = spi_readl(data, R_CE_CTRL);
938
-
939
- conf |= value;
940
- spi_writel(data, R_CE_CTRL, conf);
941
-}
942
-
943
-static void spi_ctrl_setmode(const TestData *data, uint8_t mode, uint8_t cmd)
944
-{
945
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
946
- uint32_t ctrl = spi_readl(data, ctrl_reg);
947
- ctrl &= ~(CTRL_USERMODE | 0xff << 16);
948
- ctrl |= mode | (cmd << 16);
949
- spi_writel(data, ctrl_reg, ctrl);
950
-}
951
-
952
-static void spi_ctrl_start_user(const TestData *data)
953
-{
954
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
955
- uint32_t ctrl = spi_readl(data, ctrl_reg);
956
-
957
- ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
958
- spi_writel(data, ctrl_reg, ctrl);
959
-
960
- ctrl &= ~CTRL_CE_STOP_ACTIVE;
961
- spi_writel(data, ctrl_reg, ctrl);
962
-}
963
-
964
-static void spi_ctrl_stop_user(const TestData *data)
965
-{
966
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
967
- uint32_t ctrl = spi_readl(data, ctrl_reg);
968
-
969
- ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
970
- spi_writel(data, ctrl_reg, ctrl);
971
-}
972
-
973
-static void spi_ctrl_set_io_mode(const TestData *data, uint32_t value)
974
-{
975
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
976
- uint32_t ctrl = spi_readl(data, ctrl_reg);
977
- uint32_t mode;
978
-
979
- mode = value & CTRL_IO_MODE_MASK;
980
- ctrl &= ~CTRL_IO_MODE_MASK;
981
- ctrl |= mode;
982
- spi_writel(data, ctrl_reg, ctrl);
983
-}
984
-
985
-static void flash_reset(const TestData *data)
986
-{
987
- spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
988
-
989
- spi_ctrl_start_user(data);
990
- flash_writeb(data, 0, RESET_ENABLE);
991
- flash_writeb(data, 0, RESET_MEMORY);
992
- flash_writeb(data, 0, WREN);
993
- flash_writeb(data, 0, BULK_ERASE);
994
- flash_writeb(data, 0, WRDI);
995
- spi_ctrl_stop_user(data);
996
-
997
- spi_conf_remove(data, 1 << (CONF_ENABLE_W0 + data->cs));
998
-}
999
-
1000
-static void test_read_jedec(const void *data)
1001
-{
1002
- const TestData *test_data = (const TestData *)data;
1003
- uint32_t jedec = 0x0;
1004
-
1005
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1006
-
1007
- spi_ctrl_start_user(test_data);
1008
- flash_writeb(test_data, 0, JEDEC_READ);
1009
- jedec |= flash_readb(test_data, 0) << 16;
1010
- jedec |= flash_readb(test_data, 0) << 8;
1011
- jedec |= flash_readb(test_data, 0);
1012
- spi_ctrl_stop_user(test_data);
1013
-
1014
- flash_reset(test_data);
1015
-
1016
- g_assert_cmphex(jedec, ==, test_data->jedec_id);
1017
-}
1018
-
1019
-static void read_page(const TestData *data, uint32_t addr, uint32_t *page)
1020
-{
1021
- int i;
1022
-
1023
- spi_ctrl_start_user(data);
1024
-
1025
- flash_writeb(data, 0, EN_4BYTE_ADDR);
1026
- flash_writeb(data, 0, READ);
1027
- flash_writel(data, 0, make_be32(addr));
1028
-
1029
- /* Continuous read are supported */
1030
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1031
- page[i] = make_be32(flash_readl(data, 0));
1032
- }
1033
- spi_ctrl_stop_user(data);
1034
-}
1035
-
1036
-static void read_page_mem(const TestData *data, uint32_t addr, uint32_t *page)
1037
-{
1038
- int i;
1039
-
1040
- /* move out USER mode to use direct reads from the AHB bus */
1041
- spi_ctrl_setmode(data, CTRL_READMODE, READ);
1042
-
1043
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1044
- page[i] = make_be32(flash_readl(data, addr + i * 4));
1045
- }
1046
-}
1047
-
1048
-static void write_page_mem(const TestData *data, uint32_t addr,
1049
- uint32_t write_value)
1050
-{
1051
- spi_ctrl_setmode(data, CTRL_WRITEMODE, PP);
1052
-
1053
- for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1054
- flash_writel(data, addr + i * 4, write_value);
1055
- }
1056
-}
1057
-
1058
-static void assert_page_mem(const TestData *data, uint32_t addr,
1059
- uint32_t expected_value)
1060
-{
1061
- uint32_t page[FLASH_PAGE_SIZE / 4];
1062
- read_page_mem(data, addr, page);
1063
- for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1064
- g_assert_cmphex(page[i], ==, expected_value);
1065
- }
1066
-}
1067
-
1068
-static void test_erase_sector(const void *data)
1069
-{
1070
- const TestData *test_data = (const TestData *)data;
1071
- uint32_t some_page_addr = test_data->page_addr;
1072
- uint32_t page[FLASH_PAGE_SIZE / 4];
1073
- int i;
1074
-
1075
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1076
-
1077
- /*
1078
- * Previous page should be full of 0xffs after backend is
1079
- * initialized
1080
- */
1081
- read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
1082
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1083
- g_assert_cmphex(page[i], ==, 0xffffffff);
1084
- }
1085
-
1086
- spi_ctrl_start_user(test_data);
1087
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1088
- flash_writeb(test_data, 0, WREN);
1089
- flash_writeb(test_data, 0, PP);
1090
- flash_writel(test_data, 0, make_be32(some_page_addr));
1091
-
1092
- /* Fill the page with its own addresses */
1093
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1094
- flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
1095
- }
1096
- spi_ctrl_stop_user(test_data);
1097
-
1098
- /* Check the page is correctly written */
1099
- read_page(test_data, some_page_addr, page);
1100
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1101
- g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
1102
- }
1103
-
1104
- spi_ctrl_start_user(test_data);
1105
- flash_writeb(test_data, 0, WREN);
1106
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1107
- flash_writeb(test_data, 0, ERASE_SECTOR);
1108
- flash_writel(test_data, 0, make_be32(some_page_addr));
1109
- spi_ctrl_stop_user(test_data);
1110
-
1111
- /* Check the page is erased */
1112
- read_page(test_data, some_page_addr, page);
1113
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1114
- g_assert_cmphex(page[i], ==, 0xffffffff);
1115
- }
1116
-
1117
- flash_reset(test_data);
1118
-}
1119
-
1120
-static void test_erase_all(const void *data)
1121
-{
1122
- const TestData *test_data = (const TestData *)data;
1123
- uint32_t some_page_addr = test_data->page_addr;
1124
- uint32_t page[FLASH_PAGE_SIZE / 4];
1125
- int i;
1126
-
1127
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1128
-
1129
- /*
1130
- * Previous page should be full of 0xffs after backend is
1131
- * initialized
1132
- */
1133
- read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
1134
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1135
- g_assert_cmphex(page[i], ==, 0xffffffff);
1136
- }
1137
-
1138
- spi_ctrl_start_user(test_data);
1139
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1140
- flash_writeb(test_data, 0, WREN);
1141
- flash_writeb(test_data, 0, PP);
1142
- flash_writel(test_data, 0, make_be32(some_page_addr));
1143
-
1144
- /* Fill the page with its own addresses */
1145
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1146
- flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
1147
- }
1148
- spi_ctrl_stop_user(test_data);
1149
-
1150
- /* Check the page is correctly written */
1151
- read_page(test_data, some_page_addr, page);
1152
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1153
- g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
1154
- }
1155
-
1156
- spi_ctrl_start_user(test_data);
1157
- flash_writeb(test_data, 0, WREN);
1158
- flash_writeb(test_data, 0, BULK_ERASE);
1159
- spi_ctrl_stop_user(test_data);
1160
-
1161
- /* Check the page is erased */
1162
- read_page(test_data, some_page_addr, page);
1163
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1164
- g_assert_cmphex(page[i], ==, 0xffffffff);
1165
- }
1166
-
1167
- flash_reset(test_data);
1168
-}
1169
-
1170
-static void test_write_page(const void *data)
1171
-{
1172
- const TestData *test_data = (const TestData *)data;
1173
- uint32_t my_page_addr = test_data->page_addr;
1174
- uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
1175
- uint32_t page[FLASH_PAGE_SIZE / 4];
1176
- int i;
1177
-
1178
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1179
-
1180
- spi_ctrl_start_user(test_data);
1181
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1182
- flash_writeb(test_data, 0, WREN);
1183
- flash_writeb(test_data, 0, PP);
1184
- flash_writel(test_data, 0, make_be32(my_page_addr));
1185
-
1186
- /* Fill the page with its own addresses */
1187
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1188
- flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
1189
- }
1190
- spi_ctrl_stop_user(test_data);
1191
-
1192
- /* Check what was written */
1193
- read_page(test_data, my_page_addr, page);
1194
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1195
- g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
1196
- }
1197
-
1198
- /* Check some other page. It should be full of 0xff */
1199
- read_page(test_data, some_page_addr, page);
1200
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1201
- g_assert_cmphex(page[i], ==, 0xffffffff);
1202
- }
1203
-
1204
- flash_reset(test_data);
1205
-}
1206
-
1207
-static void test_read_page_mem(const void *data)
1208
-{
1209
- const TestData *test_data = (const TestData *)data;
1210
- uint32_t my_page_addr = test_data->page_addr;
1211
- uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
1212
- uint32_t page[FLASH_PAGE_SIZE / 4];
1213
- int i;
1214
-
1215
- /*
1216
- * Enable 4BYTE mode for controller.
1217
- */
1218
- spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
1219
-
1220
- /* Enable 4BYTE mode for flash. */
1221
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1222
- spi_ctrl_start_user(test_data);
1223
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1224
- flash_writeb(test_data, 0, WREN);
1225
- flash_writeb(test_data, 0, PP);
1226
- flash_writel(test_data, 0, make_be32(my_page_addr));
1227
-
1228
- /* Fill the page with its own addresses */
1229
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1230
- flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
1231
- }
1232
- spi_ctrl_stop_user(test_data);
1233
- spi_conf_remove(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1234
-
1235
- /* Check what was written */
1236
- read_page_mem(test_data, my_page_addr, page);
1237
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1238
- g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
1239
- }
1240
-
1241
- /* Check some other page. It should be full of 0xff */
1242
- read_page_mem(test_data, some_page_addr, page);
1243
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1244
- g_assert_cmphex(page[i], ==, 0xffffffff);
1245
- }
1246
-
1247
- flash_reset(test_data);
1248
-}
1249
-
1250
-static void test_write_page_mem(const void *data)
1251
-{
1252
- const TestData *test_data = (const TestData *)data;
1253
- uint32_t my_page_addr = test_data->page_addr;
1254
- uint32_t page[FLASH_PAGE_SIZE / 4];
1255
- int i;
1256
-
1257
- /*
1258
- * Enable 4BYTE mode for controller.
1259
- */
1260
- spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
1261
-
1262
- /* Enable 4BYTE mode for flash. */
1263
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1264
- spi_ctrl_start_user(test_data);
1265
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1266
- flash_writeb(test_data, 0, WREN);
1267
- spi_ctrl_stop_user(test_data);
1268
-
1269
- /* move out USER mode to use direct writes to the AHB bus */
1270
- spi_ctrl_setmode(test_data, CTRL_WRITEMODE, PP);
1271
-
1272
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1273
- flash_writel(test_data, my_page_addr + i * 4,
1274
- make_be32(my_page_addr + i * 4));
1275
- }
1276
-
1277
- /* Check what was written */
1278
- read_page_mem(test_data, my_page_addr, page);
1279
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1280
- g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
1281
- }
1282
-
1283
- flash_reset(test_data);
1284
-}
1285
-
1286
-static void test_read_status_reg(const void *data)
1287
-{
1288
- const TestData *test_data = (const TestData *)data;
1289
- uint8_t r;
1290
-
1291
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1292
-
1293
- spi_ctrl_start_user(test_data);
1294
- flash_writeb(test_data, 0, RDSR);
1295
- r = flash_readb(test_data, 0);
1296
- spi_ctrl_stop_user(test_data);
1297
-
1298
- g_assert_cmphex(r & SR_WEL, ==, 0);
1299
- g_assert(!qtest_qom_get_bool
1300
- (test_data->s, test_data->node, "write-enable"));
1301
-
1302
- spi_ctrl_start_user(test_data);
1303
- flash_writeb(test_data, 0, WREN);
1304
- flash_writeb(test_data, 0, RDSR);
1305
- r = flash_readb(test_data, 0);
1306
- spi_ctrl_stop_user(test_data);
1307
-
1308
- g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
1309
- g_assert(qtest_qom_get_bool
1310
- (test_data->s, test_data->node, "write-enable"));
1311
-
1312
- spi_ctrl_start_user(test_data);
1313
- flash_writeb(test_data, 0, WRDI);
1314
- flash_writeb(test_data, 0, RDSR);
1315
- r = flash_readb(test_data, 0);
1316
- spi_ctrl_stop_user(test_data);
1317
-
1318
- g_assert_cmphex(r & SR_WEL, ==, 0);
1319
- g_assert(!qtest_qom_get_bool
1320
- (test_data->s, test_data->node, "write-enable"));
1321
-
1322
- flash_reset(test_data);
1323
-}
1324
-
1325
-static void test_status_reg_write_protection(const void *data)
1326
-{
1327
- const TestData *test_data = (const TestData *)data;
1328
- uint8_t r;
1329
-
1330
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1331
-
1332
- /* default case: WP# is high and SRWD is low -> status register writable */
1333
- spi_ctrl_start_user(test_data);
1334
- flash_writeb(test_data, 0, WREN);
1335
- /* test ability to write SRWD */
1336
- flash_writeb(test_data, 0, WRSR);
1337
- flash_writeb(test_data, 0, SRWD);
1338
- flash_writeb(test_data, 0, RDSR);
1339
- r = flash_readb(test_data, 0);
1340
- spi_ctrl_stop_user(test_data);
1341
- g_assert_cmphex(r & SRWD, ==, SRWD);
1342
-
1343
- /* WP# high and SRWD high -> status register writable */
1344
- spi_ctrl_start_user(test_data);
1345
- flash_writeb(test_data, 0, WREN);
1346
- /* test ability to write SRWD */
1347
- flash_writeb(test_data, 0, WRSR);
1348
- flash_writeb(test_data, 0, 0);
1349
- flash_writeb(test_data, 0, RDSR);
1350
- r = flash_readb(test_data, 0);
1351
- spi_ctrl_stop_user(test_data);
1352
- g_assert_cmphex(r & SRWD, ==, 0);
1353
-
1354
- /* WP# low and SRWD low -> status register writable */
1355
- qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 0);
1356
- spi_ctrl_start_user(test_data);
1357
- flash_writeb(test_data, 0, WREN);
1358
- /* test ability to write SRWD */
1359
- flash_writeb(test_data, 0, WRSR);
1360
- flash_writeb(test_data, 0, SRWD);
1361
- flash_writeb(test_data, 0, RDSR);
1362
- r = flash_readb(test_data, 0);
1363
- spi_ctrl_stop_user(test_data);
1364
- g_assert_cmphex(r & SRWD, ==, SRWD);
1365
-
1366
- /* WP# low and SRWD high -> status register NOT writable */
1367
- spi_ctrl_start_user(test_data);
1368
- flash_writeb(test_data, 0 , WREN);
1369
- /* test ability to write SRWD */
1370
- flash_writeb(test_data, 0, WRSR);
1371
- flash_writeb(test_data, 0, 0);
1372
- flash_writeb(test_data, 0, RDSR);
1373
- r = flash_readb(test_data, 0);
1374
- spi_ctrl_stop_user(test_data);
1375
- /* write is not successful */
1376
- g_assert_cmphex(r & SRWD, ==, SRWD);
1377
-
1378
- qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 1);
1379
- flash_reset(test_data);
1380
-}
1381
-
1382
-static void test_write_block_protect(const void *data)
1383
-{
1384
- const TestData *test_data = (const TestData *)data;
1385
- uint32_t sector_size = 65536;
1386
- uint32_t n_sectors = 512;
1387
-
1388
- spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
1389
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1390
-
1391
- uint32_t bp_bits = 0b0;
1392
-
1393
- for (int i = 0; i < 16; i++) {
1394
- bp_bits = ((i & 0b1000) << 3) | ((i & 0b0111) << 2);
1395
-
1396
- spi_ctrl_start_user(test_data);
1397
- flash_writeb(test_data, 0, WREN);
1398
- flash_writeb(test_data, 0, BULK_ERASE);
1399
- flash_writeb(test_data, 0, WREN);
1400
- flash_writeb(test_data, 0, WRSR);
1401
- flash_writeb(test_data, 0, bp_bits);
1402
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1403
- flash_writeb(test_data, 0, WREN);
1404
- spi_ctrl_stop_user(test_data);
1405
-
1406
- uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
1407
- uint32_t protection_start = n_sectors - num_protected_sectors;
1408
- uint32_t protection_end = n_sectors;
1409
-
1410
- for (int sector = 0; sector < n_sectors; sector++) {
1411
- uint32_t addr = sector * sector_size;
1412
-
1413
- assert_page_mem(test_data, addr, 0xffffffff);
1414
- write_page_mem(test_data, addr, make_be32(0xabcdef12));
1415
-
1416
- uint32_t expected_value = protection_start <= sector
1417
- && sector < protection_end
1418
- ? 0xffffffff : 0xabcdef12;
1419
-
1420
- assert_page_mem(test_data, addr, expected_value);
1421
- }
1422
- }
1423
-
1424
- flash_reset(test_data);
1425
-}
1426
-
1427
-static void test_write_block_protect_bottom_bit(const void *data)
1428
-{
1429
- const TestData *test_data = (const TestData *)data;
1430
- uint32_t sector_size = 65536;
1431
- uint32_t n_sectors = 512;
1432
-
1433
- spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
1434
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1435
-
1436
- /* top bottom bit is enabled */
1437
- uint32_t bp_bits = 0b00100 << 3;
1438
-
1439
- for (int i = 0; i < 16; i++) {
1440
- bp_bits = (((i & 0b1000) | 0b0100) << 3) | ((i & 0b0111) << 2);
1441
-
1442
- spi_ctrl_start_user(test_data);
1443
- flash_writeb(test_data, 0, WREN);
1444
- flash_writeb(test_data, 0, BULK_ERASE);
1445
- flash_writeb(test_data, 0, WREN);
1446
- flash_writeb(test_data, 0, WRSR);
1447
- flash_writeb(test_data, 0, bp_bits);
1448
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1449
- flash_writeb(test_data, 0, WREN);
1450
- spi_ctrl_stop_user(test_data);
1451
-
1452
- uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
1453
- uint32_t protection_start = 0;
1454
- uint32_t protection_end = num_protected_sectors;
1455
-
1456
- for (int sector = 0; sector < n_sectors; sector++) {
1457
- uint32_t addr = sector * sector_size;
1458
-
1459
- assert_page_mem(test_data, addr, 0xffffffff);
1460
- write_page_mem(test_data, addr, make_be32(0xabcdef12));
1461
-
1462
- uint32_t expected_value = protection_start <= sector
1463
- && sector < protection_end
1464
- ? 0xffffffff : 0xabcdef12;
1465
-
1466
- assert_page_mem(test_data, addr, expected_value);
1467
- }
1468
- }
1469
-
1470
- flash_reset(test_data);
1471
-}
1472
-
1473
-static void test_write_page_qpi(const void *data)
1474
-{
1475
- const TestData *test_data = (const TestData *)data;
1476
- uint32_t my_page_addr = test_data->page_addr;
1477
- uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
1478
- uint32_t page[FLASH_PAGE_SIZE / 4];
1479
- uint32_t page_pattern[] = {
1480
- 0xebd8c134, 0x5da196bc, 0xae15e729, 0x5085ccdf
1481
- };
1482
- int i;
1483
-
1484
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1485
-
1486
- spi_ctrl_start_user(test_data);
1487
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1488
- flash_writeb(test_data, 0, WREN);
1489
- flash_writeb(test_data, 0, PP);
1490
- flash_writel(test_data, 0, make_be32(my_page_addr));
1491
-
1492
- /* Set QPI mode */
1493
- spi_ctrl_set_io_mode(test_data, CTRL_IO_QUAD_IO);
1494
-
1495
- /* Fill the page pattern */
1496
- for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
1497
- flash_writel(test_data, 0, make_be32(page_pattern[i]));
1498
- }
1499
-
1500
- /* Fill the page with its own addresses */
1501
- for (; i < FLASH_PAGE_SIZE / 4; i++) {
1502
- flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
1503
- }
1504
-
1505
- /* Restore io mode */
1506
- spi_ctrl_set_io_mode(test_data, 0);
1507
- spi_ctrl_stop_user(test_data);
1508
-
1509
- /* Check what was written */
1510
- read_page(test_data, my_page_addr, page);
1511
- for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
1512
- g_assert_cmphex(page[i], ==, page_pattern[i]);
1513
- }
1514
- for (; i < FLASH_PAGE_SIZE / 4; i++) {
1515
- g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
1516
- }
1517
-
1518
- /* Check some other page. It should be full of 0xff */
1519
- read_page(test_data, some_page_addr, page);
1520
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1521
- g_assert_cmphex(page[i], ==, 0xffffffff);
1522
- }
1523
-
1524
- flash_reset(test_data);
1525
-}
1526
-
1527
-static void test_palmetto_bmc(TestData *data)
1528
+static void test_palmetto_bmc(AspeedSMCTestData *data)
1529
{
1530
int ret;
1531
int fd;
1532
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
1533
/* beyond 16MB */
1534
data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
1535
1536
- qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
1537
- qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
1538
- qtest_add_data_func("/ast2400/smc/erase_all", data, test_erase_all);
1539
- qtest_add_data_func("/ast2400/smc/write_page", data, test_write_page);
1540
+ qtest_add_data_func("/ast2400/smc/read_jedec",
1541
+ data, aspeed_smc_test_read_jedec);
1542
+ qtest_add_data_func("/ast2400/smc/erase_sector",
1543
+ data, aspeed_smc_test_erase_sector);
1544
+ qtest_add_data_func("/ast2400/smc/erase_all",
1545
+ data, aspeed_smc_test_erase_all);
1546
+ qtest_add_data_func("/ast2400/smc/write_page",
1547
+ data, aspeed_smc_test_write_page);
1548
qtest_add_data_func("/ast2400/smc/read_page_mem",
1549
- data, test_read_page_mem);
1550
+ data, aspeed_smc_test_read_page_mem);
1551
qtest_add_data_func("/ast2400/smc/write_page_mem",
1552
- data, test_write_page_mem);
1553
+ data, aspeed_smc_test_write_page_mem);
1554
qtest_add_data_func("/ast2400/smc/read_status_reg",
1555
- data, test_read_status_reg);
1556
+ data, aspeed_smc_test_read_status_reg);
1557
qtest_add_data_func("/ast2400/smc/status_reg_write_protection",
1558
- data, test_status_reg_write_protection);
1559
+ data, aspeed_smc_test_status_reg_write_protection);
1560
qtest_add_data_func("/ast2400/smc/write_block_protect",
1561
- data, test_write_block_protect);
1562
+ data, aspeed_smc_test_write_block_protect);
1563
qtest_add_data_func("/ast2400/smc/write_block_protect_bottom_bit",
1564
- data, test_write_block_protect_bottom_bit);
1565
+ data, aspeed_smc_test_write_block_protect_bottom_bit);
1566
}
1567
1568
-static void test_ast2500_evb(TestData *data)
1569
+static void test_ast2500_evb(AspeedSMCTestData *data)
1570
{
1571
int ret;
1572
int fd;
1573
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
1574
/* beyond 16MB */
1575
data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
1576
1577
- qtest_add_data_func("/ast2500/smc/read_jedec", data, test_read_jedec);
1578
- qtest_add_data_func("/ast2500/smc/erase_sector", data, test_erase_sector);
1579
- qtest_add_data_func("/ast2500/smc/erase_all", data, test_erase_all);
1580
- qtest_add_data_func("/ast2500/smc/write_page", data, test_write_page);
1581
+ qtest_add_data_func("/ast2500/smc/read_jedec",
1582
+ data, aspeed_smc_test_read_jedec);
1583
+ qtest_add_data_func("/ast2500/smc/erase_sector",
1584
+ data, aspeed_smc_test_erase_sector);
1585
+ qtest_add_data_func("/ast2500/smc/erase_all",
1586
+ data, aspeed_smc_test_erase_all);
1587
+ qtest_add_data_func("/ast2500/smc/write_page",
1588
+ data, aspeed_smc_test_write_page);
1589
qtest_add_data_func("/ast2500/smc/read_page_mem",
1590
- data, test_read_page_mem);
1591
+ data, aspeed_smc_test_read_page_mem);
1592
qtest_add_data_func("/ast2500/smc/write_page_mem",
1593
- data, test_write_page_mem);
1594
+ data, aspeed_smc_test_write_page_mem);
1595
qtest_add_data_func("/ast2500/smc/read_status_reg",
1596
- data, test_read_status_reg);
1597
+ data, aspeed_smc_test_read_status_reg);
1598
qtest_add_data_func("/ast2500/smc/write_page_qpi",
1599
- data, test_write_page_qpi);
1600
+ data, aspeed_smc_test_write_page_qpi);
1601
}
1602
1603
-static void test_ast2600_evb(TestData *data)
1604
+static void test_ast2600_evb(AspeedSMCTestData *data)
1605
{
1606
int ret;
1607
int fd;
1608
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
1609
/* beyond 16MB */
1610
data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
1611
1612
- qtest_add_data_func("/ast2600/smc/read_jedec", data, test_read_jedec);
1613
- qtest_add_data_func("/ast2600/smc/erase_sector", data, test_erase_sector);
1614
- qtest_add_data_func("/ast2600/smc/erase_all", data, test_erase_all);
1615
- qtest_add_data_func("/ast2600/smc/write_page", data, test_write_page);
1616
+ qtest_add_data_func("/ast2600/smc/read_jedec",
1617
+ data, aspeed_smc_test_read_jedec);
1618
+ qtest_add_data_func("/ast2600/smc/erase_sector",
1619
+ data, aspeed_smc_test_erase_sector);
1620
+ qtest_add_data_func("/ast2600/smc/erase_all",
1621
+ data, aspeed_smc_test_erase_all);
1622
+ qtest_add_data_func("/ast2600/smc/write_page",
1623
+ data, aspeed_smc_test_write_page);
1624
qtest_add_data_func("/ast2600/smc/read_page_mem",
1625
- data, test_read_page_mem);
1626
+ data, aspeed_smc_test_read_page_mem);
1627
qtest_add_data_func("/ast2600/smc/write_page_mem",
1628
- data, test_write_page_mem);
1629
+ data, aspeed_smc_test_write_page_mem);
1630
qtest_add_data_func("/ast2600/smc/read_status_reg",
1631
- data, test_read_status_reg);
1632
+ data, aspeed_smc_test_read_status_reg);
1633
qtest_add_data_func("/ast2600/smc/write_page_qpi",
1634
- data, test_write_page_qpi);
1635
+ data, aspeed_smc_test_write_page_qpi);
1636
}
1637
1638
-static void test_ast1030_evb(TestData *data)
1639
+static void test_ast1030_evb(AspeedSMCTestData *data)
1640
{
1641
int ret;
1642
int fd;
1643
@@ -XXX,XX +XXX,XX @@ static void test_ast1030_evb(TestData *data)
1644
/* beyond 512KB */
1645
data->page_addr = 0x800 * FLASH_PAGE_SIZE;
1646
1647
- qtest_add_data_func("/ast1030/smc/read_jedec", data, test_read_jedec);
1648
- qtest_add_data_func("/ast1030/smc/erase_sector", data, test_erase_sector);
1649
- qtest_add_data_func("/ast1030/smc/erase_all", data, test_erase_all);
1650
- qtest_add_data_func("/ast1030/smc/write_page", data, test_write_page);
1651
+ qtest_add_data_func("/ast1030/smc/read_jedec",
1652
+ data, aspeed_smc_test_read_jedec);
1653
+ qtest_add_data_func("/ast1030/smc/erase_sector",
1654
+ data, aspeed_smc_test_erase_sector);
1655
+ qtest_add_data_func("/ast1030/smc/erase_all",
1656
+ data, aspeed_smc_test_erase_all);
1657
+ qtest_add_data_func("/ast1030/smc/write_page",
1658
+ data, aspeed_smc_test_write_page);
1659
qtest_add_data_func("/ast1030/smc/read_page_mem",
1660
- data, test_read_page_mem);
1661
+ data, aspeed_smc_test_read_page_mem);
1662
qtest_add_data_func("/ast1030/smc/write_page_mem",
1663
- data, test_write_page_mem);
1664
+ data, aspeed_smc_test_write_page_mem);
1665
qtest_add_data_func("/ast1030/smc/read_status_reg",
1666
- data, test_read_status_reg);
1667
+ data, aspeed_smc_test_read_status_reg);
1668
qtest_add_data_func("/ast1030/smc/write_page_qpi",
1669
- data, test_write_page_qpi);
1670
+ data, aspeed_smc_test_write_page_qpi);
1671
}
1672
1673
int main(int argc, char **argv)
1674
{
1675
- TestData palmetto_data;
1676
- TestData ast2500_evb_data;
1677
- TestData ast2600_evb_data;
1678
- TestData ast1030_evb_data;
1679
+ AspeedSMCTestData palmetto_data;
1680
+ AspeedSMCTestData ast2500_evb_data;
1681
+ AspeedSMCTestData ast2600_evb_data;
1682
+ AspeedSMCTestData ast1030_evb_data;
1683
int ret;
1684
1685
g_test_init(&argc, &argv, NULL);
1686
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
502
index XXXXXXX..XXXXXXX 100644
1687
index XXXXXXX..XXXXXXX 100644
503
--- a/hw/intc/trace-events
1688
--- a/tests/qtest/meson.build
504
+++ b/hw/intc/trace-events
1689
+++ b/tests/qtest/meson.build
505
@@ -XXX,XX +XXX,XX @@ aspeed_vic_update_fiq(int flags) "Raising FIQ: %d"
1690
@@ -XXX,XX +XXX,XX @@ qtests = {
506
aspeed_vic_update_irq(int flags) "Raising IRQ: %d"
1691
'virtio-net-failover': files('migration-helpers.c'),
507
aspeed_vic_read(uint64_t offset, unsigned size, uint32_t value) "From 0x%" PRIx64 " of size %u: 0x%" PRIx32
1692
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
508
aspeed_vic_write(uint64_t offset, unsigned size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
1693
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
509
+# aspeed_intc.c
1694
+ 'aspeed_smc-test': files('aspeed-smc-utils.c', 'aspeed_smc-test.c'),
510
+aspeed_intc_read(uint64_t offset, unsigned size, uint32_t value) "From 0x%" PRIx64 " of size %u: 0x%" PRIx32
1695
}
511
+aspeed_intc_write(uint64_t offset, unsigned size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
1696
512
+aspeed_intc_set_irq(int irq, int level) "Set IRQ %d: %d"
1697
if vnc.found()
513
+aspeed_intc_clear_irq(int irq, int level) "Clear IRQ %d: %d"
514
+aspeed_intc_update_irq(int irq, int level) "Update IRQ: %d: %d"
515
+aspeed_intc_pending_irq(int irq, uint32_t value) "Pending IRQ: %d: 0x%x"
516
+aspeed_intc_trigger_irq(int irq, uint32_t value) "Trigger IRQ: %d: 0x%x"
517
+aspeed_intc_all_isr_done(int irq) "All source ISR execution are done: %d"
518
+aspeed_intc_enable(uint32_t value) "Enable: 0x%x"
519
+aspeed_intc_select(uint32_t value) "Select: 0x%x"
520
+aspeed_intc_mask(uint32_t change, uint32_t value) "Mask: 0x%x: 0x%x"
521
+aspeed_intc_unmask(uint32_t change, uint32_t value) "UnMask: 0x%x: 0x%x"
522
523
# arm_gic.c
524
gic_enable_irq(int irq) "irq %d enabled"
525
--
1698
--
526
2.45.2
1699
2.47.1
527
1700
528
1701
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Initial definitions for a simple machine using an AST2700 SOC (Cortex-a35 CPU).
3
Add test_ast2700_evb function and reused testcases which are from
4
aspeed_smc-test.c for AST2700 testing. The base address, flash base address
5
and ce index of fmc_cs0 are 0x14000000, 0x100000000 and 0, respectively.
6
The default flash model of fmc_cs0 is "w25q01jvq" whose size is 128MB,
7
so set jedec_id 0xef4021.
4
8
5
AST2700 SOC and its interrupt controller are too complex to handle
6
in the common Aspeed SoC framework. We introduce a new ast2700
7
class with instance_init and realize handlers.
8
9
AST2700 is a 64 bits quad core cpus and support 8 watchdog.
10
Update maximum ASPEED_CPUS_NUM to 4 and ASPEED_WDTS_NUM to 8.
11
In addition, update AspeedSocState to support scuio, sli, sliio and intc.
12
13
Add TYPE_ASPEED27X0_SOC machine type.
14
15
The SDMC controller is unlocked at SPL stage.
16
At present, only supports to emulate booting
17
start from u-boot stage. Set SDMC controller
18
unlocked by default.
19
20
In INTC, each interrupt of INT 128 to INT 136 combines 32 interrupts.
21
It connect GICINT IRQ GPIO-OUTPUT pins to GIC device with irq 128 to 136.
22
And, if a device irq is 128 to 136, its irq GPIO-OUTPUT pin is connected to
23
GICINT or-gates instead of GIC device.
24
25
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
26
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
27
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-11-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
28
---
13
---
29
include/hw/arm/aspeed_soc.h | 28 +-
14
tests/qtest/ast2700-smc-test.c | 71 ++++++++++++++++++++++++++++++++++
30
hw/arm/aspeed_ast27x0.c | 563 ++++++++++++++++++++++++++++++++++++
15
tests/qtest/meson.build | 4 +-
31
hw/arm/meson.build | 1 +
16
2 files changed, 74 insertions(+), 1 deletion(-)
32
3 files changed, 590 insertions(+), 2 deletions(-)
17
create mode 100644 tests/qtest/ast2700-smc-test.c
33
create mode 100644 hw/arm/aspeed_ast27x0.c
34
18
35
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
19
diff --git a/tests/qtest/ast2700-smc-test.c b/tests/qtest/ast2700-smc-test.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/include/hw/arm/aspeed_soc.h
38
+++ b/include/hw/arm/aspeed_soc.h
39
@@ -XXX,XX +XXX,XX @@
40
#include "hw/cpu/a15mpcore.h"
41
#include "hw/arm/armv7m.h"
42
#include "hw/intc/aspeed_vic.h"
43
+#include "hw/intc/aspeed_intc.h"
44
#include "hw/misc/aspeed_scu.h"
45
#include "hw/adc/aspeed_adc.h"
46
#include "hw/misc/aspeed_sdmc.h"
47
@@ -XXX,XX +XXX,XX @@
48
#include "hw/ssi/aspeed_smc.h"
49
#include "hw/misc/aspeed_hace.h"
50
#include "hw/misc/aspeed_sbc.h"
51
+#include "hw/misc/aspeed_sli.h"
52
#include "hw/watchdog/wdt_aspeed.h"
53
#include "hw/net/ftgmac100.h"
54
#include "target/arm/cpu.h"
55
@@ -XXX,XX +XXX,XX @@
56
#include "hw/misc/aspeed_peci.h"
57
#include "hw/fsi/aspeed_apb2opb.h"
58
#include "hw/char/serial.h"
59
+#include "hw/intc/arm_gicv3.h"
60
61
#define ASPEED_SPIS_NUM 2
62
#define ASPEED_EHCIS_NUM 2
63
-#define ASPEED_WDTS_NUM 4
64
-#define ASPEED_CPUS_NUM 2
65
+#define ASPEED_WDTS_NUM 8
66
+#define ASPEED_CPUS_NUM 4
67
#define ASPEED_MACS_NUM 4
68
#define ASPEED_UARTS_NUM 13
69
#define ASPEED_JTAG_NUM 2
70
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
71
AspeedI2CState i2c;
72
AspeedI3CState i3c;
73
AspeedSCUState scu;
74
+ AspeedSCUState scuio;
75
AspeedHACEState hace;
76
AspeedXDMAState xdma;
77
AspeedADCState adc;
78
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
79
AspeedSMCState spi[ASPEED_SPIS_NUM];
80
EHCISysBusState ehci[ASPEED_EHCIS_NUM];
81
AspeedSBCState sbc;
82
+ AspeedSLIState sli;
83
+ AspeedSLIState sliio;
84
MemoryRegion secsram;
85
UnimplementedDeviceState sbc_unimplemented;
86
AspeedSDMCState sdmc;
87
@@ -XXX,XX +XXX,XX @@ struct Aspeed2600SoCState {
88
#define TYPE_ASPEED2600_SOC "aspeed2600-soc"
89
OBJECT_DECLARE_SIMPLE_TYPE(Aspeed2600SoCState, ASPEED2600_SOC)
90
91
+struct Aspeed27x0SoCState {
92
+ AspeedSoCState parent;
93
+
94
+ ARMCPU cpu[ASPEED_CPUS_NUM];
95
+ AspeedINTCState intc;
96
+ GICv3State gic;
97
+};
98
+
99
+#define TYPE_ASPEED27X0_SOC "aspeed27x0-soc"
100
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed27x0SoCState, ASPEED27X0_SOC)
101
+
102
struct Aspeed10x0SoCState {
103
AspeedSoCState parent;
104
105
@@ -XXX,XX +XXX,XX @@ enum {
106
ASPEED_DEV_UART13,
107
ASPEED_DEV_VUART,
108
ASPEED_DEV_FMC,
109
+ ASPEED_DEV_SPI0,
110
ASPEED_DEV_SPI1,
111
ASPEED_DEV_SPI2,
112
ASPEED_DEV_EHCI1,
113
ASPEED_DEV_EHCI2,
114
ASPEED_DEV_VIC,
115
+ ASPEED_DEV_INTC,
116
ASPEED_DEV_SDMC,
117
ASPEED_DEV_SCU,
118
ASPEED_DEV_ADC,
119
@@ -XXX,XX +XXX,XX @@ enum {
120
ASPEED_DEV_JTAG1,
121
ASPEED_DEV_FSI1,
122
ASPEED_DEV_FSI2,
123
+ ASPEED_DEV_SCUIO,
124
+ ASPEED_DEV_SLI,
125
+ ASPEED_DEV_SLIIO,
126
+ ASPEED_GIC_DIST,
127
+ ASPEED_GIC_REDIST,
128
};
129
130
qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev);
131
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
132
new file mode 100644
20
new file mode 100644
133
index XXXXXXX..XXXXXXX
21
index XXXXXXX..XXXXXXX
134
--- /dev/null
22
--- /dev/null
135
+++ b/hw/arm/aspeed_ast27x0.c
23
+++ b/tests/qtest/ast2700-smc-test.c
136
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@
137
+/*
25
+/*
138
+ * ASPEED SoC 27x0 family
26
+ * QTest testcase for the M25P80 Flash using the ASPEED SPI Controller since
27
+ * AST2700.
139
+ *
28
+ *
29
+ * SPDX-License-Identifier: GPL-2.0-or-later
140
+ * Copyright (C) 2024 ASPEED Technology Inc.
30
+ * Copyright (C) 2024 ASPEED Technology Inc.
141
+ *
142
+ * This code is licensed under the GPL version 2 or later. See
143
+ * the COPYING file in the top-level directory.
144
+ *
145
+ * Implementation extracted from the AST2600 and adapted for AST27x0.
146
+ */
31
+ */
147
+
32
+
148
+#include "qemu/osdep.h"
33
+#include "qemu/osdep.h"
149
+#include "qapi/error.h"
34
+#include "qemu/bswap.h"
150
+#include "hw/misc/unimp.h"
35
+#include "libqtest-single.h"
151
+#include "hw/arm/aspeed_soc.h"
36
+#include "qemu/bitops.h"
152
+#include "qemu/module.h"
37
+#include "aspeed-smc-utils.h"
153
+#include "qemu/error-report.h"
154
+#include "hw/i2c/aspeed_i2c.h"
155
+#include "net/net.h"
156
+#include "sysemu/sysemu.h"
157
+#include "hw/intc/arm_gicv3.h"
158
+#include "qapi/qmp/qlist.h"
159
+
38
+
160
+static const hwaddr aspeed_soc_ast2700_memmap[] = {
39
+static void test_ast2700_evb(AspeedSMCTestData *data)
161
+ [ASPEED_DEV_SPI_BOOT] = 0x400000000,
40
+{
162
+ [ASPEED_DEV_SRAM] = 0x10000000,
41
+ int ret;
163
+ [ASPEED_DEV_SDMC] = 0x12C00000,
42
+ int fd;
164
+ [ASPEED_DEV_SCU] = 0x12C02000,
165
+ [ASPEED_DEV_SCUIO] = 0x14C02000,
166
+ [ASPEED_DEV_UART0] = 0X14C33000,
167
+ [ASPEED_DEV_UART1] = 0X14C33100,
168
+ [ASPEED_DEV_UART2] = 0X14C33200,
169
+ [ASPEED_DEV_UART3] = 0X14C33300,
170
+ [ASPEED_DEV_UART4] = 0X12C1A000,
171
+ [ASPEED_DEV_UART5] = 0X14C33400,
172
+ [ASPEED_DEV_UART6] = 0X14C33500,
173
+ [ASPEED_DEV_UART7] = 0X14C33600,
174
+ [ASPEED_DEV_UART8] = 0X14C33700,
175
+ [ASPEED_DEV_UART9] = 0X14C33800,
176
+ [ASPEED_DEV_UART10] = 0X14C33900,
177
+ [ASPEED_DEV_UART11] = 0X14C33A00,
178
+ [ASPEED_DEV_UART12] = 0X14C33B00,
179
+ [ASPEED_DEV_WDT] = 0x14C37000,
180
+ [ASPEED_DEV_VUART] = 0X14C30000,
181
+ [ASPEED_DEV_FMC] = 0x14000000,
182
+ [ASPEED_DEV_SPI0] = 0x14010000,
183
+ [ASPEED_DEV_SPI1] = 0x14020000,
184
+ [ASPEED_DEV_SPI2] = 0x14030000,
185
+ [ASPEED_DEV_SDRAM] = 0x400000000,
186
+ [ASPEED_DEV_MII1] = 0x14040000,
187
+ [ASPEED_DEV_MII2] = 0x14040008,
188
+ [ASPEED_DEV_MII3] = 0x14040010,
189
+ [ASPEED_DEV_ETH1] = 0x14050000,
190
+ [ASPEED_DEV_ETH2] = 0x14060000,
191
+ [ASPEED_DEV_ETH3] = 0x14070000,
192
+ [ASPEED_DEV_EMMC] = 0x12090000,
193
+ [ASPEED_DEV_INTC] = 0x12100000,
194
+ [ASPEED_DEV_SLI] = 0x12C17000,
195
+ [ASPEED_DEV_SLIIO] = 0x14C1E000,
196
+ [ASPEED_GIC_DIST] = 0x12200000,
197
+ [ASPEED_GIC_REDIST] = 0x12280000,
198
+};
199
+
43
+
200
+#define AST2700_MAX_IRQ 288
44
+ fd = g_file_open_tmp("qtest.m25p80.w25q01jvq.XXXXXX",
45
+ &data->tmp_path, NULL);
46
+ g_assert(fd >= 0);
47
+ ret = ftruncate(fd, 128 * 1024 * 1024);
48
+ g_assert(ret == 0);
49
+ close(fd);
201
+
50
+
202
+/* Shared Peripheral Interrupt values below are offset by -32 from datasheet */
51
+ data->s = qtest_initf("-machine ast2700-evb "
203
+static const int aspeed_soc_ast2700_irqmap[] = {
52
+ "-drive file=%s,format=raw,if=mtd",
204
+ [ASPEED_DEV_UART0] = 132,
53
+ data->tmp_path);
205
+ [ASPEED_DEV_UART1] = 132,
206
+ [ASPEED_DEV_UART2] = 132,
207
+ [ASPEED_DEV_UART3] = 132,
208
+ [ASPEED_DEV_UART4] = 8,
209
+ [ASPEED_DEV_UART5] = 132,
210
+ [ASPEED_DEV_UART6] = 132,
211
+ [ASPEED_DEV_UART7] = 132,
212
+ [ASPEED_DEV_UART8] = 132,
213
+ [ASPEED_DEV_UART9] = 132,
214
+ [ASPEED_DEV_UART10] = 132,
215
+ [ASPEED_DEV_UART11] = 132,
216
+ [ASPEED_DEV_UART12] = 132,
217
+ [ASPEED_DEV_FMC] = 131,
218
+ [ASPEED_DEV_SDMC] = 0,
219
+ [ASPEED_DEV_SCU] = 12,
220
+ [ASPEED_DEV_ADC] = 130,
221
+ [ASPEED_DEV_XDMA] = 5,
222
+ [ASPEED_DEV_EMMC] = 15,
223
+ [ASPEED_DEV_GPIO] = 11,
224
+ [ASPEED_DEV_GPIO_1_8V] = 130,
225
+ [ASPEED_DEV_RTC] = 13,
226
+ [ASPEED_DEV_TIMER1] = 16,
227
+ [ASPEED_DEV_TIMER2] = 17,
228
+ [ASPEED_DEV_TIMER3] = 18,
229
+ [ASPEED_DEV_TIMER4] = 19,
230
+ [ASPEED_DEV_TIMER5] = 20,
231
+ [ASPEED_DEV_TIMER6] = 21,
232
+ [ASPEED_DEV_TIMER7] = 22,
233
+ [ASPEED_DEV_TIMER8] = 23,
234
+ [ASPEED_DEV_WDT] = 131,
235
+ [ASPEED_DEV_PWM] = 131,
236
+ [ASPEED_DEV_LPC] = 128,
237
+ [ASPEED_DEV_IBT] = 128,
238
+ [ASPEED_DEV_I2C] = 130,
239
+ [ASPEED_DEV_PECI] = 133,
240
+ [ASPEED_DEV_ETH1] = 132,
241
+ [ASPEED_DEV_ETH2] = 132,
242
+ [ASPEED_DEV_ETH3] = 132,
243
+ [ASPEED_DEV_HACE] = 4,
244
+ [ASPEED_DEV_KCS] = 128,
245
+ [ASPEED_DEV_DP] = 28,
246
+ [ASPEED_DEV_I3C] = 131,
247
+};
248
+
54
+
249
+/* GICINT 128 */
55
+ /* fmc cs0 with w25q01jvq flash */
250
+static const int aspeed_soc_ast2700_gic128_intcmap[] = {
56
+ data->flash_base = 0x100000000;
251
+ [ASPEED_DEV_LPC] = 0,
57
+ data->spi_base = 0x14000000;
252
+ [ASPEED_DEV_IBT] = 2,
58
+ data->jedec_id = 0xef4021;
253
+ [ASPEED_DEV_KCS] = 4,
59
+ data->cs = 0;
254
+};
60
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
61
+ /* beyond 64MB */
62
+ data->page_addr = 0x40000 * FLASH_PAGE_SIZE;
255
+
63
+
256
+/* GICINT 130 */
64
+ qtest_add_data_func("/ast2700/smc/read_jedec",
257
+static const int aspeed_soc_ast2700_gic130_intcmap[] = {
65
+ data, aspeed_smc_test_read_jedec);
258
+ [ASPEED_DEV_I2C] = 0,
66
+ qtest_add_data_func("/ast2700/smc/erase_sector",
259
+ [ASPEED_DEV_ADC] = 16,
67
+ data, aspeed_smc_test_erase_sector);
260
+ [ASPEED_DEV_GPIO_1_8V] = 18,
68
+ qtest_add_data_func("/ast2700/smc/erase_all",
261
+};
69
+ data, aspeed_smc_test_erase_all);
262
+
70
+ qtest_add_data_func("/ast2700/smc/write_page",
263
+/* GICINT 131 */
71
+ data, aspeed_smc_test_write_page);
264
+static const int aspeed_soc_ast2700_gic131_intcmap[] = {
72
+ qtest_add_data_func("/ast2700/smc/read_page_mem",
265
+ [ASPEED_DEV_I3C] = 0,
73
+ data, aspeed_smc_test_read_page_mem);
266
+ [ASPEED_DEV_WDT] = 16,
74
+ qtest_add_data_func("/ast2700/smc/write_page_mem",
267
+ [ASPEED_DEV_FMC] = 25,
75
+ data, aspeed_smc_test_write_page_mem);
268
+ [ASPEED_DEV_PWM] = 29,
76
+ qtest_add_data_func("/ast2700/smc/read_status_reg",
269
+};
77
+ data, aspeed_smc_test_read_status_reg);
270
+
78
+ qtest_add_data_func("/ast2700/smc/write_page_qpi",
271
+/* GICINT 132 */
79
+ data, aspeed_smc_test_write_page_qpi);
272
+static const int aspeed_soc_ast2700_gic132_intcmap[] = {
273
+ [ASPEED_DEV_ETH1] = 0,
274
+ [ASPEED_DEV_ETH2] = 1,
275
+ [ASPEED_DEV_ETH3] = 2,
276
+ [ASPEED_DEV_UART0] = 7,
277
+ [ASPEED_DEV_UART1] = 8,
278
+ [ASPEED_DEV_UART2] = 9,
279
+ [ASPEED_DEV_UART3] = 10,
280
+ [ASPEED_DEV_UART5] = 11,
281
+ [ASPEED_DEV_UART6] = 12,
282
+ [ASPEED_DEV_UART7] = 13,
283
+ [ASPEED_DEV_UART8] = 14,
284
+ [ASPEED_DEV_UART9] = 15,
285
+ [ASPEED_DEV_UART10] = 16,
286
+ [ASPEED_DEV_UART11] = 17,
287
+ [ASPEED_DEV_UART12] = 18,
288
+};
289
+
290
+/* GICINT 133 */
291
+static const int aspeed_soc_ast2700_gic133_intcmap[] = {
292
+ [ASPEED_DEV_PECI] = 4,
293
+};
294
+
295
+/* GICINT 128 ~ 136 */
296
+struct gic_intc_irq_info {
297
+ int irq;
298
+ const int *ptr;
299
+};
300
+
301
+static const struct gic_intc_irq_info aspeed_soc_ast2700_gic_intcmap[] = {
302
+ {128, aspeed_soc_ast2700_gic128_intcmap},
303
+ {129, NULL},
304
+ {130, aspeed_soc_ast2700_gic130_intcmap},
305
+ {131, aspeed_soc_ast2700_gic131_intcmap},
306
+ {132, aspeed_soc_ast2700_gic132_intcmap},
307
+ {133, aspeed_soc_ast2700_gic133_intcmap},
308
+ {134, NULL},
309
+ {135, NULL},
310
+ {136, NULL},
311
+};
312
+
313
+static qemu_irq aspeed_soc_ast2700_get_irq(AspeedSoCState *s, int dev)
314
+{
315
+ Aspeed27x0SoCState *a = ASPEED27X0_SOC(s);
316
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
317
+ int i;
318
+
319
+ for (i = 0; i < ARRAY_SIZE(aspeed_soc_ast2700_gic_intcmap); i++) {
320
+ if (sc->irqmap[dev] == aspeed_soc_ast2700_gic_intcmap[i].irq) {
321
+ assert(aspeed_soc_ast2700_gic_intcmap[i].ptr);
322
+ return qdev_get_gpio_in(DEVICE(&a->intc.orgates[i]),
323
+ aspeed_soc_ast2700_gic_intcmap[i].ptr[dev]);
324
+ }
325
+ }
326
+
327
+ return qdev_get_gpio_in(DEVICE(&a->gic), sc->irqmap[dev]);
328
+}
80
+}
329
+
81
+
330
+static void aspeed_soc_ast2700_init(Object *obj)
82
+int main(int argc, char **argv)
331
+{
83
+{
332
+ Aspeed27x0SoCState *a = ASPEED27X0_SOC(obj);
84
+ AspeedSMCTestData ast2700_evb_data;
333
+ AspeedSoCState *s = ASPEED_SOC(obj);
85
+ int ret;
334
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
335
+ int i;
336
+ char socname[8];
337
+ char typename[64];
338
+
86
+
339
+ if (sscanf(sc->name, "%7s", socname) != 1) {
87
+ g_test_init(&argc, &argv, NULL);
340
+ g_assert_not_reached();
341
+ }
342
+
88
+
343
+ for (i = 0; i < sc->num_cpus; i++) {
89
+ test_ast2700_evb(&ast2700_evb_data);
344
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i],
90
+ ret = g_test_run();
345
+ aspeed_soc_cpu_type(sc));
346
+ }
347
+
91
+
348
+ object_initialize_child(obj, "gic", &a->gic, gicv3_class_name());
92
+ qtest_quit(ast2700_evb_data.s);
349
+
93
+ unlink(ast2700_evb_data.tmp_path);
350
+ object_initialize_child(obj, "scu", &s->scu, TYPE_ASPEED_2700_SCU);
94
+ return ret;
351
+ qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev",
352
+ sc->silicon_rev);
353
+ object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu),
354
+ "hw-strap1");
355
+ object_property_add_alias(obj, "hw-strap2", OBJECT(&s->scu),
356
+ "hw-strap2");
357
+ object_property_add_alias(obj, "hw-prot-key", OBJECT(&s->scu),
358
+ "hw-prot-key");
359
+
360
+ object_initialize_child(obj, "scuio", &s->scuio, TYPE_ASPEED_2700_SCUIO);
361
+ qdev_prop_set_uint32(DEVICE(&s->scuio), "silicon-rev",
362
+ sc->silicon_rev);
363
+
364
+ snprintf(typename, sizeof(typename), "aspeed.fmc-%s", socname);
365
+ object_initialize_child(obj, "fmc", &s->fmc, typename);
366
+
367
+ for (i = 0; i < sc->spis_num; i++) {
368
+ snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i, socname);
369
+ object_initialize_child(obj, "spi[*]", &s->spi[i], typename);
370
+ }
371
+
372
+ snprintf(typename, sizeof(typename), "aspeed.sdmc-%s", socname);
373
+ object_initialize_child(obj, "sdmc", &s->sdmc, typename);
374
+ object_property_add_alias(obj, "ram-size", OBJECT(&s->sdmc),
375
+ "ram-size");
376
+
377
+ for (i = 0; i < sc->wdts_num; i++) {
378
+ snprintf(typename, sizeof(typename), "aspeed.wdt-%s", socname);
379
+ object_initialize_child(obj, "wdt[*]", &s->wdt[i], typename);
380
+ }
381
+
382
+ for (i = 0; i < sc->macs_num; i++) {
383
+ object_initialize_child(obj, "ftgmac100[*]", &s->ftgmac100[i],
384
+ TYPE_FTGMAC100);
385
+
386
+ object_initialize_child(obj, "mii[*]", &s->mii[i], TYPE_ASPEED_MII);
387
+ }
388
+
389
+ for (i = 0; i < sc->uarts_num; i++) {
390
+ object_initialize_child(obj, "uart[*]", &s->uart[i], TYPE_SERIAL_MM);
391
+ }
392
+
393
+ object_initialize_child(obj, "sli", &s->sli, TYPE_ASPEED_2700_SLI);
394
+ object_initialize_child(obj, "sliio", &s->sliio, TYPE_ASPEED_2700_SLIIO);
395
+ object_initialize_child(obj, "intc", &a->intc, TYPE_ASPEED_2700_INTC);
396
+}
95
+}
397
+
96
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
398
+/*
399
+ * ASPEED ast2700 has 0x0 as cluster ID
400
+ *
401
+ * https://developer.arm.com/documentation/100236/0100/register-descriptions/aarch64-system-registers/multiprocessor-affinity-register--el1
402
+ */
403
+static uint64_t aspeed_calc_affinity(int cpu)
404
+{
405
+ return (0x0 << ARM_AFF1_SHIFT) | cpu;
406
+}
407
+
408
+static bool aspeed_soc_ast2700_gic_realize(DeviceState *dev, Error **errp)
409
+{
410
+ Aspeed27x0SoCState *a = ASPEED27X0_SOC(dev);
411
+ AspeedSoCState *s = ASPEED_SOC(dev);
412
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
413
+ SysBusDevice *gicbusdev;
414
+ DeviceState *gicdev;
415
+ QList *redist_region_count;
416
+ int i;
417
+
418
+ gicbusdev = SYS_BUS_DEVICE(&a->gic);
419
+ gicdev = DEVICE(&a->gic);
420
+ qdev_prop_set_uint32(gicdev, "revision", 3);
421
+ qdev_prop_set_uint32(gicdev, "num-cpu", sc->num_cpus);
422
+ qdev_prop_set_uint32(gicdev, "num-irq", AST2700_MAX_IRQ);
423
+
424
+ redist_region_count = qlist_new();
425
+ qlist_append_int(redist_region_count, sc->num_cpus);
426
+ qdev_prop_set_array(gicdev, "redist-region-count", redist_region_count);
427
+
428
+ if (!sysbus_realize(gicbusdev, errp)) {
429
+ return false;
430
+ }
431
+ sysbus_mmio_map(gicbusdev, 0, sc->memmap[ASPEED_GIC_DIST]);
432
+ sysbus_mmio_map(gicbusdev, 1, sc->memmap[ASPEED_GIC_REDIST]);
433
+
434
+ for (i = 0; i < sc->num_cpus; i++) {
435
+ DeviceState *cpudev = DEVICE(&a->cpu[i]);
436
+ int NUM_IRQS = 256, ARCH_GIC_MAINT_IRQ = 9, VIRTUAL_PMU_IRQ = 7;
437
+ int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
438
+
439
+ const int timer_irq[] = {
440
+ [GTIMER_PHYS] = 14,
441
+ [GTIMER_VIRT] = 11,
442
+ [GTIMER_HYP] = 10,
443
+ [GTIMER_SEC] = 13,
444
+ };
445
+ int j;
446
+
447
+ for (j = 0; j < ARRAY_SIZE(timer_irq); j++) {
448
+ qdev_connect_gpio_out(cpudev, j,
449
+ qdev_get_gpio_in(gicdev, ppibase + timer_irq[j]));
450
+ }
451
+
452
+ qemu_irq irq = qdev_get_gpio_in(gicdev,
453
+ ppibase + ARCH_GIC_MAINT_IRQ);
454
+ qdev_connect_gpio_out_named(cpudev, "gicv3-maintenance-interrupt",
455
+ 0, irq);
456
+ qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0,
457
+ qdev_get_gpio_in(gicdev, ppibase + VIRTUAL_PMU_IRQ));
458
+
459
+ sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
460
+ sysbus_connect_irq(gicbusdev, i + sc->num_cpus,
461
+ qdev_get_gpio_in(cpudev, ARM_CPU_FIQ));
462
+ sysbus_connect_irq(gicbusdev, i + 2 * sc->num_cpus,
463
+ qdev_get_gpio_in(cpudev, ARM_CPU_VIRQ));
464
+ sysbus_connect_irq(gicbusdev, i + 3 * sc->num_cpus,
465
+ qdev_get_gpio_in(cpudev, ARM_CPU_VFIQ));
466
+ }
467
+
468
+ return true;
469
+}
470
+
471
+static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
472
+{
473
+ int i;
474
+ Aspeed27x0SoCState *a = ASPEED27X0_SOC(dev);
475
+ AspeedSoCState *s = ASPEED_SOC(dev);
476
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
477
+ AspeedINTCClass *ic = ASPEED_INTC_GET_CLASS(&a->intc);
478
+ g_autofree char *sram_name = NULL;
479
+
480
+ /* Default boot region (SPI memory or ROMs) */
481
+ memory_region_init(&s->spi_boot_container, OBJECT(s),
482
+ "aspeed.spi_boot_container", 0x400000000);
483
+ memory_region_add_subregion(s->memory, sc->memmap[ASPEED_DEV_SPI_BOOT],
484
+ &s->spi_boot_container);
485
+
486
+ /* CPU */
487
+ for (i = 0; i < sc->num_cpus; i++) {
488
+ object_property_set_int(OBJECT(&a->cpu[i]), "mp-affinity",
489
+ aspeed_calc_affinity(i), &error_abort);
490
+
491
+ object_property_set_int(OBJECT(&a->cpu[i]), "cntfrq", 1125000000,
492
+ &error_abort);
493
+ object_property_set_link(OBJECT(&a->cpu[i]), "memory",
494
+ OBJECT(s->memory), &error_abort);
495
+
496
+ if (!qdev_realize(DEVICE(&a->cpu[i]), NULL, errp)) {
497
+ return;
498
+ }
499
+ }
500
+
501
+ /* GIC */
502
+ if (!aspeed_soc_ast2700_gic_realize(dev, errp)) {
503
+ return;
504
+ }
505
+
506
+ /* INTC */
507
+ if (!sysbus_realize(SYS_BUS_DEVICE(&a->intc), errp)) {
508
+ return;
509
+ }
510
+
511
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&a->intc), 0,
512
+ sc->memmap[ASPEED_DEV_INTC]);
513
+
514
+ /* GICINT orgates -> INTC -> GIC */
515
+ for (i = 0; i < ic->num_ints; i++) {
516
+ qdev_connect_gpio_out(DEVICE(&a->intc.orgates[i]), 0,
517
+ qdev_get_gpio_in(DEVICE(&a->intc), i));
518
+ sysbus_connect_irq(SYS_BUS_DEVICE(&a->intc), i,
519
+ qdev_get_gpio_in(DEVICE(&a->gic),
520
+ aspeed_soc_ast2700_gic_intcmap[i].irq));
521
+ }
522
+
523
+ /* SRAM */
524
+ sram_name = g_strdup_printf("aspeed.sram.%d", CPU(&a->cpu[0])->cpu_index);
525
+ if (!memory_region_init_ram(&s->sram, OBJECT(s), sram_name, sc->sram_size,
526
+ errp)) {
527
+ return;
528
+ }
529
+ memory_region_add_subregion(s->memory,
530
+ sc->memmap[ASPEED_DEV_SRAM], &s->sram);
531
+
532
+ /* SCU */
533
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
534
+ return;
535
+ }
536
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_DEV_SCU]);
537
+
538
+ /* SCU1 */
539
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->scuio), errp)) {
540
+ return;
541
+ }
542
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->scuio), 0,
543
+ sc->memmap[ASPEED_DEV_SCUIO]);
544
+
545
+ /* UART */
546
+ if (!aspeed_soc_uart_realize(s, errp)) {
547
+ return;
548
+ }
549
+
550
+ /* FMC, The number of CS is set at the board level */
551
+ object_property_set_int(OBJECT(&s->fmc), "dram-base",
552
+ sc->memmap[ASPEED_DEV_SDRAM],
553
+ &error_abort);
554
+ object_property_set_link(OBJECT(&s->fmc), "dram", OBJECT(s->dram_mr),
555
+ &error_abort);
556
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
557
+ return;
558
+ }
559
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_DEV_FMC]);
560
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->fmc), 1,
561
+ ASPEED_SMC_GET_CLASS(&s->fmc)->flash_window_base);
562
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0,
563
+ aspeed_soc_get_irq(s, ASPEED_DEV_FMC));
564
+
565
+ /* Set up an alias on the FMC CE0 region (boot default) */
566
+ MemoryRegion *fmc0_mmio = &s->fmc.flashes[0].mmio;
567
+ memory_region_init_alias(&s->spi_boot, OBJECT(s), "aspeed.spi_boot",
568
+ fmc0_mmio, 0, memory_region_size(fmc0_mmio));
569
+ memory_region_add_subregion(&s->spi_boot_container, 0x0, &s->spi_boot);
570
+
571
+ /* SPI */
572
+ for (i = 0; i < sc->spis_num; i++) {
573
+ object_property_set_link(OBJECT(&s->spi[i]), "dram",
574
+ OBJECT(s->dram_mr), &error_abort);
575
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
576
+ return;
577
+ }
578
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->spi[i]), 0,
579
+ sc->memmap[ASPEED_DEV_SPI0 + i]);
580
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->spi[i]), 1,
581
+ ASPEED_SMC_GET_CLASS(&s->spi[i])->flash_window_base);
582
+ }
583
+
584
+ /*
585
+ * SDMC - SDRAM Memory Controller
586
+ * The SDMC controller is unlocked at SPL stage.
587
+ * At present, only supports to emulate booting
588
+ * start from u-boot stage. Set SDMC controller
589
+ * unlocked by default. It is a temporarily solution.
590
+ */
591
+ object_property_set_bool(OBJECT(&s->sdmc), "unlocked", true,
592
+ &error_abort);
593
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), errp)) {
594
+ return;
595
+ }
596
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sdmc), 0,
597
+ sc->memmap[ASPEED_DEV_SDMC]);
598
+
599
+ /* RAM */
600
+ if (!aspeed_soc_dram_init(s, errp)) {
601
+ return;
602
+ }
603
+
604
+ for (i = 0; i < sc->macs_num; i++) {
605
+ object_property_set_bool(OBJECT(&s->ftgmac100[i]), "aspeed", true,
606
+ &error_abort);
607
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
608
+ return;
609
+ }
610
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
611
+ sc->memmap[ASPEED_DEV_ETH1 + i]);
612
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
613
+ aspeed_soc_get_irq(s, ASPEED_DEV_ETH1 + i));
614
+
615
+ object_property_set_link(OBJECT(&s->mii[i]), "nic",
616
+ OBJECT(&s->ftgmac100[i]), &error_abort);
617
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), errp)) {
618
+ return;
619
+ }
620
+
621
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->mii[i]), 0,
622
+ sc->memmap[ASPEED_DEV_MII1 + i]);
623
+ }
624
+
625
+ /* Watch dog */
626
+ for (i = 0; i < sc->wdts_num; i++) {
627
+ AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(&s->wdt[i]);
628
+ hwaddr wdt_offset = sc->memmap[ASPEED_DEV_WDT] + i * awc->iosize;
629
+
630
+ object_property_set_link(OBJECT(&s->wdt[i]), "scu", OBJECT(&s->scu),
631
+ &error_abort);
632
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
633
+ return;
634
+ }
635
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->wdt[i]), 0, wdt_offset);
636
+ }
637
+
638
+ /* SLI */
639
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sli), errp)) {
640
+ return;
641
+ }
642
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sli), 0, sc->memmap[ASPEED_DEV_SLI]);
643
+
644
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sliio), errp)) {
645
+ return;
646
+ }
647
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sliio), 0,
648
+ sc->memmap[ASPEED_DEV_SLIIO]);
649
+
650
+ create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
651
+ create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
652
+ create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
653
+ create_unimplemented_device("ast2700.ltpi", 0x30000000, 0x1000000);
654
+ create_unimplemented_device("ast2700.io", 0x0, 0x4000000);
655
+}
656
+
657
+static void aspeed_soc_ast2700_class_init(ObjectClass *oc, void *data)
658
+{
659
+ static const char * const valid_cpu_types[] = {
660
+ ARM_CPU_TYPE_NAME("cortex-a35"),
661
+ NULL
662
+ };
663
+ DeviceClass *dc = DEVICE_CLASS(oc);
664
+ AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
665
+
666
+ /* Reason: The Aspeed SoC can only be instantiated from a board */
667
+ dc->user_creatable = false;
668
+ dc->realize = aspeed_soc_ast2700_realize;
669
+
670
+ sc->name = "ast2700-a0";
671
+ sc->valid_cpu_types = valid_cpu_types;
672
+ sc->silicon_rev = AST2700_A0_SILICON_REV;
673
+ sc->sram_size = 0x20000;
674
+ sc->spis_num = 3;
675
+ sc->wdts_num = 8;
676
+ sc->macs_num = 1;
677
+ sc->uarts_num = 13;
678
+ sc->num_cpus = 4;
679
+ sc->uarts_base = ASPEED_DEV_UART0;
680
+ sc->irqmap = aspeed_soc_ast2700_irqmap;
681
+ sc->memmap = aspeed_soc_ast2700_memmap;
682
+ sc->get_irq = aspeed_soc_ast2700_get_irq;
683
+}
684
+
685
+static const TypeInfo aspeed_soc_ast27x0_types[] = {
686
+ {
687
+ .name = TYPE_ASPEED27X0_SOC,
688
+ .parent = TYPE_ASPEED_SOC,
689
+ .instance_size = sizeof(Aspeed27x0SoCState),
690
+ .abstract = true,
691
+ }, {
692
+ .name = "ast2700-a0",
693
+ .parent = TYPE_ASPEED27X0_SOC,
694
+ .instance_init = aspeed_soc_ast2700_init,
695
+ .class_init = aspeed_soc_ast2700_class_init,
696
+ },
697
+};
698
+
699
+DEFINE_TYPES(aspeed_soc_ast27x0_types)
700
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
701
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
702
--- a/hw/arm/meson.build
98
--- a/tests/qtest/meson.build
703
+++ b/hw/arm/meson.build
99
+++ b/tests/qtest/meson.build
704
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
100
@@ -XXX,XX +XXX,XX @@ qtests_aspeed = \
705
'aspeed_ast10x0.c',
101
'aspeed_smc-test',
706
'aspeed_eeprom.c',
102
'aspeed_gpio-test']
707
'fby35.c'))
103
qtests_aspeed64 = \
708
+arm_ss.add(when: ['CONFIG_ASPEED_SOC', 'TARGET_AARCH64'], if_true: files('aspeed_ast27x0.c'))
104
- ['ast2700-gpio-test']
709
arm_ss.add(when: 'CONFIG_MPS2', if_true: files('mps2.c'))
105
+ ['ast2700-gpio-test',
710
arm_ss.add(when: 'CONFIG_MPS2', if_true: files('mps2-tz.c'))
106
+ 'ast2700-smc-test']
711
arm_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-soc.c'))
107
108
qtests_stm32l4x5 = \
109
['stm32l4x5_exti-test',
110
@@ -XXX,XX +XXX,XX @@ qtests = {
111
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
112
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
113
'aspeed_smc-test': files('aspeed-smc-utils.c', 'aspeed_smc-test.c'),
114
+ 'ast2700-smc-test': files('aspeed-smc-utils.c', 'ast2700-smc-test.c'),
115
}
116
117
if vnc.found()
712
--
118
--
713
2.45.2
119
2.47.1
714
120
715
121
diff view generated by jsdifflib