1
The following changes since commit f5643914a9e8f79c606a76e6a9d7ea82a3fc3e65:
1
The following changes since commit ae35f033b874c627d81d51070187fbf55f0bf1a7:
2
2
3
Merge tag 'pull-9p-20220501' of https://github.com/cschoenebeck/qemu into staging (2022-05-01 07:48:11 -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-20220503
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20241211
8
8
9
for you to fetch changes up to e056c52233910ef156e6d790ce41b33cd838bad6:
9
for you to fetch changes up to 124f4dc0d832c1bf3a4513c05a2b93bac0a5fac0:
10
10
11
aspeed/hace: Support AST1030 HACE (2022-05-03 07:17:20 +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
* New AST1030 SoC and eval board
16
* Removed tacoma-bmc machine
17
* Accumulative mode support for HACE controller
17
* Added support for SDHCI on AST2700 SoC
18
* GPIO fix and unit test
18
* Improved functional tests
19
* Clock modeling adjustments for the AST2600
19
* Extended SMC qtest to all Aspeed SoCs
20
* Dummy eMMC Boot Controller model
21
* Change of AST2500 EVB and AST2600 EVB flash model (for quad IO)
22
20
23
----------------------------------------------------------------
21
----------------------------------------------------------------
24
Jae Hyun Yoo (1):
22
Cédric Le Goater (8):
25
hw/arm/aspeed: fix AST2500/AST2600 EVB fmc model
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
26
31
27
Jamin Lin (2):
32
Jamin Lin (16):
28
aspeed: Add an AST1030 eval board
33
hw/sd/aspeed_sdhci: Fix coding style
29
test/avocado/machine_aspeed.py: Add ast1030 test case
34
hw/arm/aspeed: Fix coding style
35
hw:sdhci: Introduce a new "capareg" class member to set the different Capability Registers
36
hw/sd/aspeed_sdhci: Add AST2700 Support
37
aspeed/soc: Support SDHCI for AST2700
38
aspeed/soc: Support eMMC for AST2700
39
test/qtest/aspeed_smc-test: Move testcases to test_palmetto_bmc function
40
test/qtest/aspeed_smc-test: Introduce a new TestData to test different BMC SOCs
41
test/qtest/aspeed_smc-test: Support to test all CE pins
42
test/qtest/aspeed_smc-test: Introducing a "page_addr" data field
43
test/qtest/aspeed_smc-test: Support to test AST2500
44
test/qtest/aspeed_smc-test: Support to test AST2600
45
test/qtest/aspeed_smc-test: Support to test AST1030
46
test/qtest/aspeed_smc-test: Support write page command with QPI mode
47
test/qtest: Introduce a new aspeed-smc-utils.c to place common testcases
48
test/qtest/ast2700-smc-test: Support to test AST2700
30
49
31
Joel Stanley (2):
50
docs/about/deprecated.rst | 8 -
32
aspeed: sbc: Correct default reset values
51
docs/about/removed-features.rst | 10 +
33
aspeed: Add eMMC Boot Controller stub
52
docs/system/arm/aspeed.rst | 1 -
53
include/hw/sd/aspeed_sdhci.h | 13 +-
54
tests/qtest/aspeed-smc-utils.h | 95 ++++
55
hw/arm/aspeed.c | 28 -
56
hw/arm/aspeed_ast2400.c | 3 +-
57
hw/arm/aspeed_ast2600.c | 10 +-
58
hw/arm/aspeed_ast27x0.c | 35 ++
59
hw/sd/aspeed_sdhci.c | 67 ++-
60
tests/qtest/aspeed-smc-utils.c | 686 ++++++++++++++++++++++++
61
tests/qtest/aspeed_smc-test.c | 775 ++++++---------------------
62
tests/qtest/ast2700-smc-test.c | 71 +++
63
tests/avocado/boot_linux_console.py | 26 -
64
tests/functional/aspeed.py | 56 ++
65
tests/functional/meson.build | 13 +-
66
tests/functional/test_arm_aspeed.py | 351 ------------
67
tests/functional/test_arm_aspeed_ast1030.py | 81 +++
68
tests/functional/test_arm_aspeed_ast2500.py | 59 ++
69
tests/functional/test_arm_aspeed_ast2600.py | 143 +++++
70
tests/functional/test_arm_aspeed_palmetto.py | 24 +
71
tests/functional/test_arm_aspeed_rainier.py | 64 +++
72
tests/functional/test_arm_aspeed_romulus.py | 24 +
73
tests/qtest/meson.build | 5 +-
74
24 files changed, 1623 insertions(+), 1025 deletions(-)
75
create mode 100644 tests/qtest/aspeed-smc-utils.h
76
create mode 100644 tests/qtest/aspeed-smc-utils.c
77
create mode 100644 tests/qtest/ast2700-smc-test.c
78
create mode 100644 tests/functional/aspeed.py
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
34
86
35
Peter Delevoryas (1):
36
hw/gpio/aspeed_gpio: Fix QOM pin property
37
87
38
Steven Lee (13):
39
hw: aspeed_scu: Add AST2600 apb_freq and hpll calculation function
40
hw: aspeed_scu: Introduce clkin_25Mhz attribute
41
aspeed/adc: Add AST1030 support
42
aspeed/smc: Add AST1030 support
43
aspeed/wdt: Fix ast2500/ast2600 default reload value
44
aspeed/wdt: Add AST1030 support
45
aspeed/timer: Add AST1030 support
46
aspeed/scu: Add AST1030 support
47
aspeed/soc : Add AST1030 support
48
aspeed/hace: Support HMAC Key Buffer register.
49
aspeed/hace: Support AST2600 HACE
50
tests/qtest: Add test for Aspeed HACE accumulative mode
51
aspeed/hace: Support AST1030 HACE
52
53
include/hw/adc/aspeed_adc.h | 1 +
54
include/hw/arm/aspeed_soc.h | 4 +
55
include/hw/misc/aspeed_hace.h | 7 +
56
include/hw/misc/aspeed_scu.h | 45 ++++++
57
include/hw/timer/aspeed_timer.h | 1 +
58
include/hw/watchdog/wdt_aspeed.h | 3 +
59
hw/adc/aspeed_adc.c | 16 +++
60
hw/arm/aspeed.c | 70 ++++++++-
61
hw/arm/aspeed_ast10x0.c | 299 +++++++++++++++++++++++++++++++++++++++
62
hw/arm/aspeed_ast2600.c | 6 +
63
hw/gpio/aspeed_gpio.c | 2 +-
64
hw/misc/aspeed_hace.c | 159 ++++++++++++++++++++-
65
hw/misc/aspeed_sbc.c | 7 +-
66
hw/misc/aspeed_scu.c | 108 +++++++++++++-
67
hw/ssi/aspeed_smc.c | 157 ++++++++++++++++++++
68
hw/timer/aspeed_timer.c | 17 +++
69
hw/watchdog/wdt_aspeed.c | 34 ++++-
70
tests/qtest/aspeed_gpio-test.c | 87 ++++++++++++
71
tests/qtest/aspeed_hace-test.c | 147 +++++++++++++++++++
72
hw/arm/meson.build | 6 +-
73
tests/avocado/machine_aspeed.py | 36 +++++
74
tests/qtest/meson.build | 3 +-
75
22 files changed, 1199 insertions(+), 16 deletions(-)
76
create mode 100644 hw/arm/aspeed_ast10x0.c
77
create mode 100644 tests/qtest/aspeed_gpio-test.c
78
create mode 100644 tests/avocado/machine_aspeed.py
diff view generated by jsdifflib
1
From: Jae Hyun Yoo <quic_jaehyoo@quicinc.com>
1
Removal was scheduled for 10.0. Use the rainier-bmc machine or the
2
ast2600-evb as a replacement.
2
3
3
Current fmc model of AST2500 EVB and AST2600 EVB can't emulate quad
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
mode properly so fix them using equivalent mx25l25635e and mx66u51235f
5
Link: https://lore.kernel.org/r/20241119071352.515790-1-clg@redhat.com
5
respectively.
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(-)
6
13
7
These default settings still can be overridden using the 'fmc-model'
14
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
8
command line option.
15
index XXXXXXX..XXXXXXX 100644
9
16
--- a/docs/about/deprecated.rst
10
Reported-by: Graeme Gregory <quic_ggregory@quicinc.com>
17
+++ b/docs/about/deprecated.rst
11
Signed-off-by: Jae Hyun Yoo <quic_jaehyoo@quicinc.com>
18
@@ -XXX,XX +XXX,XX @@ images are not available, OpenWRT dropped support in 2019, U-Boot in
12
Reviewed-by: Cédric Le Goater <clg@kaod.org>
19
2017, Linux also is dropping support in 2024. It is time to let go of
13
Message-Id: <20220402184427.4010304-1-quic_jaehyoo@quicinc.com>
20
this ancient hardware and focus on newer CPUs and platforms.
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
21
15
---
22
-Arm ``tacoma-bmc`` machine (since 9.1)
16
hw/arm/aspeed.c | 4 ++--
23
-''''''''''''''''''''''''''''''''''''''''
17
1 file changed, 2 insertions(+), 2 deletions(-)
24
-
18
25
-The ``tacoma-bmc`` machine was a board including an AST2600 SoC based
26
-BMC and a witherspoon like OpenPOWER system. It was used for bring up
27
-of the AST2600 SoC in labs. It can be easily replaced by the
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
19
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
20
index XXXXXXX..XXXXXXX 100644
67
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/aspeed.c
68
--- a/hw/arm/aspeed.c
22
+++ b/hw/arm/aspeed.c
69
+++ b/hw/arm/aspeed.c
23
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
70
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
24
mc->desc = "Aspeed AST2500 EVB (ARM1176)";
71
#define AST2700_EVB_HW_STRAP2 0x00000003
25
amc->soc_name = "ast2500-a1";
72
#endif
26
amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
73
27
- amc->fmc_model = "w25q256";
74
-/* Tacoma hardware value */
28
+ amc->fmc_model = "mx25l25635e";
75
-#define TACOMA_BMC_HW_STRAP1 0x00000000
29
amc->spi_model = "mx25l25635e";
76
-#define TACOMA_BMC_HW_STRAP2 0x00000040
30
amc->num_cs = 1;
77
-
31
amc->i2c_init = ast2500_evb_i2c_init;
78
/* Rainier hardware value: (QEMU prototype) */
79
#define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
80
#define RAINIER_BMC_HW_STRAP2 0x80000848
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
81
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
33
amc->soc_name = "ast2600-a3";
82
aspeed_machine_ast2600_class_emmc_init(oc);
34
amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
83
};
35
amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
84
36
- amc->fmc_model = "w25q512jv";
85
-static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
37
+ amc->fmc_model = "mx66u51235f";
86
-{
38
amc->spi_model = "mx66u51235f";
87
- MachineClass *mc = MACHINE_CLASS(oc);
39
amc->num_cs = 1;
88
- AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
40
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
89
-
90
- mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)";
91
- amc->soc_name = "ast2600-a3";
92
- amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
93
- amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
94
- amc->fmc_model = "mx66l1g45g";
95
- amc->spi_model = "mx66l1g45g";
96
- amc->num_cs = 2;
97
- amc->macs_mask = ASPEED_MAC2_ON;
98
- amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */
99
- mc->default_ram_size = 1 * GiB;
100
- aspeed_machine_class_init_cpus_defaults(mc);
101
-
102
- mc->deprecation_reason = "Please use the similar 'rainier-bmc' machine";
103
-};
104
-
105
static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
106
{
107
MachineClass *mc = MACHINE_CLASS(oc);
108
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_machine_types[] = {
109
.name = MACHINE_TYPE_NAME("yosemitev2-bmc"),
110
.parent = TYPE_ASPEED_MACHINE,
111
.class_init = aspeed_machine_yosemitev2_class_init,
112
- }, {
113
- .name = MACHINE_TYPE_NAME("tacoma-bmc"),
114
- .parent = TYPE_ASPEED_MACHINE,
115
- .class_init = aspeed_machine_tacoma_class_init,
116
}, {
117
.name = MACHINE_TYPE_NAME("tiogapass-bmc"),
118
.parent = TYPE_ASPEED_MACHINE,
41
--
119
--
42
2.35.1
120
2.47.1
43
121
44
122
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Per ast1030_v7.pdf, AST1030 HACE engine is identical to AST2600's HACE
3
Fix coding style issues from checkpatch.pl.
4
engine.
5
4
6
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-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
include/hw/misc/aspeed_hace.h | 2 ++
10
hw/sd/aspeed_sdhci.c | 6 ++++--
10
hw/misc/aspeed_hace.c | 20 ++++++++++++++++++++
11
1 file changed, 4 insertions(+), 2 deletions(-)
11
2 files changed, 22 insertions(+)
12
12
13
diff --git a/include/hw/misc/aspeed_hace.h b/include/hw/misc/aspeed_hace.h
13
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/misc/aspeed_hace.h
15
--- a/hw/sd/aspeed_sdhci.c
16
+++ b/include/hw/misc/aspeed_hace.h
16
+++ b/hw/sd/aspeed_sdhci.c
17
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_write(void *opaque, hwaddr addr, uint64_t val,
18
#define TYPE_ASPEED_AST2400_HACE TYPE_ASPEED_HACE "-ast2400"
18
sdhci->regs[TO_REG(addr)] = (uint32_t)val & ~ASPEED_SDHCI_INFO_RESET;
19
#define TYPE_ASPEED_AST2500_HACE TYPE_ASPEED_HACE "-ast2500"
19
break;
20
#define TYPE_ASPEED_AST2600_HACE TYPE_ASPEED_HACE "-ast2600"
20
case ASPEED_SDHCI_SDIO_140:
21
+#define TYPE_ASPEED_AST1030_HACE TYPE_ASPEED_HACE "-ast1030"
21
- sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg, 0, 32, val);
22
+
22
+ sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg,
23
OBJECT_DECLARE_TYPE(AspeedHACEState, AspeedHACEClass, ASPEED_HACE)
23
+ 0, 32, val);
24
24
break;
25
#define ASPEED_HACE_NR_REGS (0x64 >> 2)
25
case ASPEED_SDHCI_SDIO_144:
26
diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
26
- sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg, 32, 32, val);
27
index XXXXXXX..XXXXXXX 100644
27
+ sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg,
28
--- a/hw/misc/aspeed_hace.c
28
+ 32, 32, val);
29
+++ b/hw/misc/aspeed_hace.c
29
break;
30
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_ast2600_hace_info = {
30
case ASPEED_SDHCI_SDIO_148:
31
.class_init = aspeed_ast2600_hace_class_init,
31
sdhci->slots[0].maxcurr = deposit64(sdhci->slots[0].maxcurr,
32
};
33
34
+static void aspeed_ast1030_hace_class_init(ObjectClass *klass, void *data)
35
+{
36
+ DeviceClass *dc = DEVICE_CLASS(klass);
37
+ AspeedHACEClass *ahc = ASPEED_HACE_CLASS(klass);
38
+
39
+ dc->desc = "AST1030 Hash and Crypto Engine";
40
+
41
+ ahc->src_mask = 0x7FFFFFFF;
42
+ ahc->dest_mask = 0x7FFFFFF8;
43
+ ahc->key_mask = 0x7FFFFFF8;
44
+ ahc->hash_mask = 0x00147FFF;
45
+}
46
+
47
+static const TypeInfo aspeed_ast1030_hace_info = {
48
+ .name = TYPE_ASPEED_AST1030_HACE,
49
+ .parent = TYPE_ASPEED_HACE,
50
+ .class_init = aspeed_ast1030_hace_class_init,
51
+};
52
+
53
static void aspeed_hace_register_types(void)
54
{
55
type_register_static(&aspeed_ast2400_hace_info);
56
type_register_static(&aspeed_ast2500_hace_info);
57
type_register_static(&aspeed_ast2600_hace_info);
58
+ type_register_static(&aspeed_ast1030_hace_info);
59
type_register_static(&aspeed_hace_info);
60
}
61
62
--
32
--
63
2.35.1
33
2.47.1
64
34
65
35
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Guest code (u-boot) pokes at this on boot. No functionality is required
3
Fix coding style issues from checkpatch.pl.
4
for guest code to work correctly, but it helps to document the region
5
being read from.
6
4
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Message-Id: <20220318092211.723938-1-joel@jms.id.au>
7
Link: https://lore.kernel.org/r/20241204084453.610660-3-jamin_lin@aspeedtech.com
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@redhat.com>
11
---
9
---
12
include/hw/arm/aspeed_soc.h | 1 +
10
hw/arm/aspeed_ast2600.c | 3 ++-
13
hw/arm/aspeed_ast2600.c | 6 ++++++
11
1 file changed, 2 insertions(+), 1 deletion(-)
14
2 files changed, 7 insertions(+)
15
12
16
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/aspeed_soc.h
19
+++ b/include/hw/arm/aspeed_soc.h
20
@@ -XXX,XX +XXX,XX @@ enum {
21
ASPEED_DEV_SCU,
22
ASPEED_DEV_ADC,
23
ASPEED_DEV_SBC,
24
+ ASPEED_DEV_EMMC_BC,
25
ASPEED_DEV_VIDEO,
26
ASPEED_DEV_SRAM,
27
ASPEED_DEV_SDHCI,
28
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
13
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
29
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/arm/aspeed_ast2600.c
15
--- a/hw/arm/aspeed_ast2600.c
31
+++ b/hw/arm/aspeed_ast2600.c
16
+++ b/hw/arm/aspeed_ast2600.c
32
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2600_memmap[] = {
33
[ASPEED_DEV_ADC] = 0x1E6E9000,
34
[ASPEED_DEV_DP] = 0x1E6EB000,
35
[ASPEED_DEV_SBC] = 0x1E6F2000,
36
+ [ASPEED_DEV_EMMC_BC] = 0x1E6f5000,
37
[ASPEED_DEV_VIDEO] = 0x1E700000,
38
[ASPEED_DEV_SDHCI] = 0x1E740000,
39
[ASPEED_DEV_EMMC] = 0x1E750000,
40
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
41
create_unimplemented_device("aspeed.video", sc->memmap[ASPEED_DEV_VIDEO],
18
if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
42
0x1000);
19
return;
43
20
}
44
+ /* eMMC Boot Controller stub */
21
- aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_DEV_GPIO]);
45
+ create_unimplemented_device("aspeed.emmc-boot-controller",
22
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0,
46
+ sc->memmap[ASPEED_DEV_EMMC_BC],
23
+ sc->memmap[ASPEED_DEV_GPIO]);
47
+ 0x1000);
24
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
48
+
25
aspeed_soc_get_irq(s, ASPEED_DEV_GPIO));
49
/* CPU */
26
50
for (i = 0; i < sc->num_cpus; i++) {
51
if (sc->num_cpus > 1) {
52
--
27
--
53
2.35.1
28
2.47.1
54
29
55
30
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Per ast1030_v07.pdf, AST1030 SOC doesn't have SCU300, the pclk divider
3
Currently, it set the hardcode value of capability registers to all ASPEED SOCs
4
selection is defined in SCU310[11:8].
4
However, the value of capability registers should be different for all ASPEED
5
Add a get_apb_freq function and a class init handler for ast1030.
5
SOCs. For example: the bit 28 of the Capability Register 1 should be 1 for
6
64-bits System Bus support for AST2700.
6
7
7
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
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
14
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
15
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Reviewed-by: Cédric Le Goater <clg@kaod.org>
16
Link: https://lore.kernel.org/r/20241204084453.610660-4-jamin_lin@aspeedtech.com
11
Message-Id: <20220401083850.15266-7-jamin_lin@aspeedtech.com>
17
Signed-off-by: Cédric Le Goater <clg@redhat.com>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
13
---
18
---
14
include/hw/misc/aspeed_scu.h | 25 ++++++++++++++
19
include/hw/sd/aspeed_sdhci.h | 12 +++++++--
15
hw/misc/aspeed_scu.c | 63 ++++++++++++++++++++++++++++++++++++
20
hw/arm/aspeed_ast2400.c | 3 ++-
16
2 files changed, 88 insertions(+)
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/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
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/include/hw/misc/aspeed_scu.h
27
--- a/include/hw/sd/aspeed_sdhci.h
21
+++ b/include/hw/misc/aspeed_scu.h
28
+++ b/include/hw/sd/aspeed_sdhci.h
22
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedSCUState, AspeedSCUClass, ASPEED_SCU)
29
@@ -XXX,XX +XXX,XX @@
23
#define TYPE_ASPEED_2400_SCU TYPE_ASPEED_SCU "-ast2400"
30
#include "qom/object.h"
24
#define TYPE_ASPEED_2500_SCU TYPE_ASPEED_SCU "-ast2500"
31
25
#define TYPE_ASPEED_2600_SCU TYPE_ASPEED_SCU "-ast2600"
32
#define TYPE_ASPEED_SDHCI "aspeed.sdhci"
26
+#define TYPE_ASPEED_1030_SCU TYPE_ASPEED_SCU "-ast1030"
33
-OBJECT_DECLARE_SIMPLE_TYPE(AspeedSDHCIState, ASPEED_SDHCI)
27
34
+#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
28
#define ASPEED_SCU_NR_REGS (0x1A8 >> 2)
35
+#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
29
#define ASPEED_AST2600_SCU_NR_REGS (0xE20 >> 2)
36
+#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
30
@@ -XXX,XX +XXX,XX @@ struct AspeedSCUState {
37
+OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
31
#define AST2600_A1_SILICON_REV 0x05010303U
38
32
#define AST2600_A2_SILICON_REV 0x05020303U
39
-#define ASPEED_SDHCI_CAPABILITIES 0x01E80080
33
#define AST2600_A3_SILICON_REV 0x05030303U
40
#define ASPEED_SDHCI_NUM_SLOTS 2
34
+#define AST1030_A0_SILICON_REV 0x80000000U
41
#define ASPEED_SDHCI_NUM_REGS (ASPEED_SDHCI_REG_SIZE / sizeof(uint32_t))
35
+#define AST1030_A1_SILICON_REV 0x80010000U
42
#define ASPEED_SDHCI_REG_SIZE 0x100
36
43
@@ -XXX,XX +XXX,XX @@ struct AspeedSDHCIState {
37
#define ASPEED_IS_AST2500(si_rev) ((((si_rev) >> 24) & 0xff) == 0x04)
44
uint32_t regs[ASPEED_SDHCI_NUM_REGS];
38
45
};
39
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
46
40
#define SCU_AST2600_H_PLL_BYPASS_EN (0x1 << 24)
47
+struct AspeedSDHCIClass {
41
#define SCU_AST2600_H_PLL_OFF (0x1 << 23)
48
+ SysBusDeviceClass parent_class;
42
43
+/*
44
+ * SCU310 Clock Selection Register Set 4 (for Aspeed AST1030 SOC)
45
+ *
46
+ * 31 I3C Clock Source selection
47
+ * 30:28 I3C clock divider selection
48
+ * 26:24 MAC AHB clock divider selection
49
+ * 22:20 RGMII 125MHz clock divider ration
50
+ * 19:16 RGMII 50MHz clock divider ration
51
+ * 15 LHCLK clock generation/output enable control
52
+ * 14:12 LHCLK divider selection
53
+ * 11:8 APB Bus PCLK divider selection
54
+ * 7 Select PECI clock source
55
+ * 6 Select UART debug port clock source
56
+ * 5 Select UART6 clock source
57
+ * 4 Select UART5 clock source
58
+ * 3 Select UART4 clock source
59
+ * 2 Select UART3 clock source
60
+ * 1 Select UART2 clock source
61
+ * 0 Select UART1 clock source
62
+ */
63
+#define SCU_AST1030_CLK_GET_PCLK_DIV(x) (((x) >> 8) & 0xf)
64
+
49
+
65
#endif /* ASPEED_SCU_H */
50
+ uint64_t capareg;
66
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
51
+};
52
+
53
#endif /* ASPEED_SDHCI_H */
54
diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
67
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/misc/aspeed_scu.c
56
--- a/hw/arm/aspeed_ast2400.c
69
+++ b/hw/misc/aspeed_scu.c
57
+++ b/hw/arm/aspeed_ast2400.c
70
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2600_scu_get_apb_freq(AspeedSCUState *s)
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
71
/ asc->apb_divider;
59
snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname);
60
object_initialize_child(obj, "gpio", &s->gpio, typename);
61
62
- object_initialize_child(obj, "sdc", &s->sdhci, TYPE_ASPEED_SDHCI);
63
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
64
+ object_initialize_child(obj, "sdc", &s->sdhci, typename);
65
66
object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
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)
98
{
99
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
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);
72
}
116
}
73
117
74
+static uint32_t aspeed_1030_scu_get_apb_freq(AspeedSCUState *s)
118
+static void aspeed_2400_sdhci_class_init(ObjectClass *klass, void *data)
75
+{
119
+{
76
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
120
+ DeviceClass *dc = DEVICE_CLASS(klass);
77
+ uint32_t hpll = asc->calc_hpll(s, s->regs[AST2600_HPLL_PARAM]);
121
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
78
+
122
+
79
+ return hpll / (SCU_AST1030_CLK_GET_PCLK_DIV(s->regs[AST2600_CLK_SEL4]) + 1)
123
+ dc->desc = "ASPEED 2400 SDHCI Controller";
80
+ / asc->apb_divider;
124
+ asc->capareg = 0x0000000001e80080;
81
+}
125
+}
82
+
126
+
83
static uint64_t aspeed_scu_read(void *opaque, hwaddr offset, unsigned size)
127
+static void aspeed_2500_sdhci_class_init(ObjectClass *klass, void *data)
84
{
128
+{
85
AspeedSCUState *s = ASPEED_SCU(opaque);
129
+ DeviceClass *dc = DEVICE_CLASS(klass);
86
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_silicon_revs[] = {
130
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
87
AST2600_A1_SILICON_REV,
88
AST2600_A2_SILICON_REV,
89
AST2600_A3_SILICON_REV,
90
+ AST1030_A0_SILICON_REV,
91
+ AST1030_A1_SILICON_REV,
92
};
93
94
bool is_supported_silicon_rev(uint32_t silicon_rev)
95
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_scu_info = {
96
.class_init = aspeed_2600_scu_class_init,
97
};
98
99
+static const uint32_t ast1030_a1_resets[ASPEED_AST2600_SCU_NR_REGS] = {
100
+ [AST2600_SYS_RST_CTRL] = 0xFFC3FED8,
101
+ [AST2600_SYS_RST_CTRL2] = 0x09FFFFFC,
102
+ [AST2600_CLK_STOP_CTRL] = 0xFFFF7F8A,
103
+ [AST2600_CLK_STOP_CTRL2] = 0xFFF0FFF0,
104
+ [AST2600_DEBUG_CTRL2] = 0x00000000,
105
+ [AST2600_HPLL_PARAM] = 0x10004077,
106
+ [AST2600_HPLL_EXT] = 0x00000031,
107
+ [AST2600_CLK_SEL4] = 0x43F90900,
108
+ [AST2600_CLK_SEL5] = 0x40000000,
109
+ [AST2600_CHIP_ID0] = 0xDEADBEEF,
110
+ [AST2600_CHIP_ID1] = 0x0BADCAFE,
111
+};
112
+
131
+
113
+static void aspeed_ast1030_scu_reset(DeviceState *dev)
132
+ dc->desc = "ASPEED 2500 SDHCI Controller";
114
+{
133
+ asc->capareg = 0x0000000001e80080;
115
+ AspeedSCUState *s = ASPEED_SCU(dev);
116
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(dev);
117
+
118
+ memcpy(s->regs, asc->resets, asc->nr_regs * 4);
119
+
120
+ s->regs[AST2600_SILICON_REV] = AST1030_A1_SILICON_REV;
121
+ s->regs[AST2600_SILICON_REV2] = s->silicon_rev;
122
+ s->regs[AST2600_HW_STRAP1] = s->hw_strap1;
123
+ s->regs[AST2600_HW_STRAP2] = s->hw_strap2;
124
+ s->regs[PROT_KEY] = s->hw_prot_key;
125
+}
134
+}
126
+
135
+
127
+static void aspeed_1030_scu_class_init(ObjectClass *klass, void *data)
136
+static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
128
+{
137
+{
129
+ DeviceClass *dc = DEVICE_CLASS(klass);
138
+ DeviceClass *dc = DEVICE_CLASS(klass);
130
+ AspeedSCUClass *asc = ASPEED_SCU_CLASS(klass);
139
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
131
+
140
+
132
+ dc->desc = "ASPEED 1030 System Control Unit";
141
+ dc->desc = "ASPEED 2600 SDHCI Controller";
133
+ dc->reset = aspeed_ast1030_scu_reset;
142
+ asc->capareg = 0x0000000701f80080;
134
+ asc->resets = ast1030_a1_resets;
135
+ asc->calc_hpll = aspeed_2600_scu_calc_hpll;
136
+ asc->get_apb = aspeed_1030_scu_get_apb_freq;
137
+ asc->apb_divider = 2;
138
+ asc->nr_regs = ASPEED_AST2600_SCU_NR_REGS;
139
+ asc->clkin_25Mhz = true;
140
+ asc->ops = &aspeed_ast2600_scu_ops;
141
+}
143
+}
142
+
144
+
143
+static const TypeInfo aspeed_1030_scu_info = {
145
static const TypeInfo aspeed_sdhci_types[] = {
144
+ .name = TYPE_ASPEED_1030_SCU,
146
{
145
+ .parent = TYPE_ASPEED_SCU,
147
.name = TYPE_ASPEED_SDHCI,
146
+ .instance_size = sizeof(AspeedSCUState),
148
.parent = TYPE_SYS_BUS_DEVICE,
147
+ .class_init = aspeed_1030_scu_class_init,
149
.instance_size = sizeof(AspeedSDHCIState),
148
+};
150
.class_init = aspeed_sdhci_class_init,
149
+
151
+ .class_size = sizeof(AspeedSDHCIClass),
150
static void aspeed_scu_register_types(void)
152
+ .abstract = true,
151
{
153
+ },
152
type_register_static(&aspeed_scu_info);
154
+ {
153
type_register_static(&aspeed_2400_scu_info);
155
+ .name = TYPE_ASPEED_2400_SDHCI,
154
type_register_static(&aspeed_2500_scu_info);
156
+ .parent = TYPE_ASPEED_SDHCI,
155
type_register_static(&aspeed_2600_scu_info);
157
+ .class_init = aspeed_2400_sdhci_class_init,
156
+ type_register_static(&aspeed_1030_scu_info);
158
+ },
157
}
159
+ {
158
160
+ .name = TYPE_ASPEED_2500_SDHCI,
159
type_init(aspeed_scu_register_types);
161
+ .parent = TYPE_ASPEED_SDHCI,
162
+ .class_init = aspeed_2500_sdhci_class_init,
163
+ },
164
+ {
165
+ .name = TYPE_ASPEED_2600_SDHCI,
166
+ .parent = TYPE_ASPEED_SDHCI,
167
+ .class_init = aspeed_2600_sdhci_class_init,
168
},
169
};
170
160
--
171
--
161
2.35.1
172
2.47.1
162
173
163
174
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Per ast1030_v7.pdf, AST1030 ADC engine is identical to AST2600's ADC.
3
Introduce a new ast2700 class to support AST2700. Add a new ast2700 SDHCI class
4
init function and set the value of capability register to "0x0000000719f80080".
4
5
5
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Link: https://lore.kernel.org/r/20241204084453.610660-5-jamin_lin@aspeedtech.com
9
Message-Id: <20220401083850.15266-2-jamin_lin@aspeedtech.com>
9
Signed-off-by: Cédric Le Goater <clg@redhat.com>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
10
---
12
include/hw/adc/aspeed_adc.h | 1 +
11
include/hw/sd/aspeed_sdhci.h | 1 +
13
hw/adc/aspeed_adc.c | 16 ++++++++++++++++
12
hw/sd/aspeed_sdhci.c | 14 ++++++++++++++
14
2 files changed, 17 insertions(+)
13
2 files changed, 15 insertions(+)
15
14
16
diff --git a/include/hw/adc/aspeed_adc.h b/include/hw/adc/aspeed_adc.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/adc/aspeed_adc.h
17
--- a/include/hw/sd/aspeed_sdhci.h
19
+++ b/include/hw/adc/aspeed_adc.h
18
+++ b/include/hw/sd/aspeed_sdhci.h
20
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
21
#define TYPE_ASPEED_2400_ADC TYPE_ASPEED_ADC "-ast2400"
20
#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
22
#define TYPE_ASPEED_2500_ADC TYPE_ASPEED_ADC "-ast2500"
21
#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
23
#define TYPE_ASPEED_2600_ADC TYPE_ASPEED_ADC "-ast2600"
22
#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
24
+#define TYPE_ASPEED_1030_ADC TYPE_ASPEED_ADC "-ast1030"
23
+#define TYPE_ASPEED_2700_SDHCI TYPE_ASPEED_SDHCI "-ast2700"
25
OBJECT_DECLARE_TYPE(AspeedADCState, AspeedADCClass, ASPEED_ADC)
24
OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
26
25
27
#define TYPE_ASPEED_ADC_ENGINE "aspeed.adc.engine"
26
#define ASPEED_SDHCI_NUM_SLOTS 2
28
diff --git a/hw/adc/aspeed_adc.c b/hw/adc/aspeed_adc.c
27
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
29
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/adc/aspeed_adc.c
29
--- a/hw/sd/aspeed_sdhci.c
31
+++ b/hw/adc/aspeed_adc.c
30
+++ b/hw/sd/aspeed_sdhci.c
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_adc_class_init(ObjectClass *klass, void *data)
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
33
aac->nr_engines = 2;
32
asc->capareg = 0x0000000701f80080;
34
}
33
}
35
34
36
+static void aspeed_1030_adc_class_init(ObjectClass *klass, void *data)
35
+static void aspeed_2700_sdhci_class_init(ObjectClass *klass, void *data)
37
+{
36
+{
38
+ DeviceClass *dc = DEVICE_CLASS(klass);
37
+ DeviceClass *dc = DEVICE_CLASS(klass);
39
+ AspeedADCClass *aac = ASPEED_ADC_CLASS(klass);
38
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
40
+
39
+
41
+ dc->desc = "ASPEED 1030 ADC Controller";
40
+ dc->desc = "ASPEED 2700 SDHCI Controller";
42
+ aac->nr_engines = 2;
41
+ asc->capareg = 0x0000000719f80080;
43
+}
42
+}
44
+
43
+
45
static const TypeInfo aspeed_adc_info = {
44
static const TypeInfo aspeed_sdhci_types[] = {
46
.name = TYPE_ASPEED_ADC,
45
{
47
.parent = TYPE_SYS_BUS_DEVICE,
46
.name = TYPE_ASPEED_SDHCI,
48
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_adc_info = {
47
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_sdhci_types[] = {
49
.class_init = aspeed_2600_adc_class_init,
48
.parent = TYPE_ASPEED_SDHCI,
49
.class_init = aspeed_2600_sdhci_class_init,
50
},
51
+ {
52
+ .name = TYPE_ASPEED_2700_SDHCI,
53
+ .parent = TYPE_ASPEED_SDHCI,
54
+ .class_init = aspeed_2700_sdhci_class_init,
55
+ },
50
};
56
};
51
57
52
+static const TypeInfo aspeed_1030_adc_info = {
58
DEFINE_TYPES(aspeed_sdhci_types)
53
+ .name = TYPE_ASPEED_1030_ADC,
54
+ .parent = TYPE_ASPEED_ADC,
55
+ .class_init = aspeed_1030_adc_class_init, /* No change since AST2600 */
56
+};
57
+
58
static void aspeed_adc_register_types(void)
59
{
60
type_register_static(&aspeed_adc_engine_info);
61
@@ -XXX,XX +XXX,XX @@ static void aspeed_adc_register_types(void)
62
type_register_static(&aspeed_2400_adc_info);
63
type_register_static(&aspeed_2500_adc_info);
64
type_register_static(&aspeed_2600_adc_info);
65
+ type_register_static(&aspeed_1030_adc_info);
66
}
67
68
type_init(aspeed_adc_register_types);
69
--
59
--
70
2.35.1
60
2.47.1
71
61
72
62
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Support HACE28: Hash HMAC Key Buffer Base Address Register.
3
Add SDHCI model for AST2700 SDHCI support. The SDHCI controller only support 1
4
slot and registers base address is start at 0x1408_0000 and its interrupt is
5
connected to GICINT133_INTC at bit 1.
4
6
5
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Link: https://lore.kernel.org/r/20241204084453.610660-6-jamin_lin@aspeedtech.com
8
Message-Id: <20220426021120.28255-2-steven_lee@aspeedtech.com>
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
11
---
11
include/hw/misc/aspeed_hace.h | 1 +
12
hw/arm/aspeed_ast27x0.c | 20 ++++++++++++++++++++
12
hw/misc/aspeed_hace.c | 7 +++++++
13
1 file changed, 20 insertions(+)
13
2 files changed, 8 insertions(+)
14
14
15
diff --git a/include/hw/misc/aspeed_hace.h b/include/hw/misc/aspeed_hace.h
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/misc/aspeed_hace.h
17
--- a/hw/arm/aspeed_ast27x0.c
18
+++ b/include/hw/misc/aspeed_hace.h
18
+++ b/hw/arm/aspeed_ast27x0.c
19
@@ -XXX,XX +XXX,XX @@ struct AspeedHACEClass {
19
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2700_memmap[] = {
20
20
[ASPEED_DEV_I2C] = 0x14C0F000,
21
uint32_t src_mask;
21
[ASPEED_DEV_GPIO] = 0x14C0B000,
22
uint32_t dest_mask;
22
[ASPEED_DEV_RTC] = 0x12C0F000,
23
+ uint32_t key_mask;
23
+ [ASPEED_DEV_SDHCI] = 0x14080000,
24
uint32_t hash_mask;
25
};
24
};
26
25
27
diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
26
#define AST2700_MAX_IRQ 256
28
index XXXXXXX..XXXXXXX 100644
27
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_irqmap[] = {
29
--- a/hw/misc/aspeed_hace.c
28
[ASPEED_DEV_KCS] = 128,
30
+++ b/hw/misc/aspeed_hace.c
29
[ASPEED_DEV_DP] = 28,
31
@@ -XXX,XX +XXX,XX @@
30
[ASPEED_DEV_I3C] = 131,
32
31
+ [ASPEED_DEV_SDHCI] = 133,
33
#define R_HASH_SRC (0x20 / 4)
32
};
34
#define R_HASH_DEST (0x24 / 4)
33
35
+#define R_HASH_KEY_BUFF (0x28 / 4)
34
/* GICINT 128 */
36
#define R_HASH_SRC_LEN (0x2c / 4)
35
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_gic132_intcmap[] = {
37
36
38
#define R_HASH_CMD (0x30 / 4)
37
/* GICINT 133 */
39
@@ -XXX,XX +XXX,XX @@ static void aspeed_hace_write(void *opaque, hwaddr addr, uint64_t data,
38
static const int aspeed_soc_ast2700_gic133_intcmap[] = {
40
case R_HASH_DEST:
39
+ [ASPEED_DEV_SDHCI] = 1,
41
data &= ahc->dest_mask;
40
[ASPEED_DEV_PECI] = 4,
42
break;
41
};
43
+ case R_HASH_KEY_BUFF:
42
44
+ data &= ahc->key_mask;
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
45
+ break;
44
object_initialize_child(obj, "gpio", &s->gpio, typename);
46
case R_HASH_SRC_LEN:
45
47
data &= 0x0FFFFFFF;
46
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
48
break;
47
+
49
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_hace_class_init(ObjectClass *klass, void *data)
48
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
50
49
+ object_initialize_child(obj, "sd-controller", &s->sdhci, typename);
51
ahc->src_mask = 0x0FFFFFFF;
50
+ object_property_set_int(OBJECT(&s->sdhci), "num-slots", 1, &error_abort);
52
ahc->dest_mask = 0x0FFFFFF8;
51
+
53
+ ahc->key_mask = 0x0FFFFFC0;
52
+ /* Init sd card slot class here so that they're under the correct parent */
54
ahc->hash_mask = 0x000003ff; /* No SG or SHA512 modes */
53
+ object_initialize_child(obj, "sd-controller.sdhci",
54
+ &s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
55
}
55
}
56
56
57
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2500_hace_class_init(ObjectClass *klass, void *data)
57
/*
58
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
59
ahc->src_mask = 0x3fffffff;
59
sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0,
60
ahc->dest_mask = 0x3ffffff8;
60
aspeed_soc_get_irq(s, ASPEED_DEV_RTC));
61
+ ahc->key_mask = 0x3FFFFFC0;
61
62
ahc->hash_mask = 0x000003ff; /* No SG or SHA512 modes */
62
+ /* SDHCI */
63
}
63
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
64
64
+ return;
65
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2600_hace_class_init(ObjectClass *klass, void *data)
65
+ }
66
66
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sdhci), 0,
67
ahc->src_mask = 0x7FFFFFFF;
67
+ sc->memmap[ASPEED_DEV_SDHCI]);
68
ahc->dest_mask = 0x7FFFFFF8;
68
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
69
+ ahc->key_mask = 0x7FFFFFF8;
69
+ aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
70
ahc->hash_mask = 0x00147FFF;
70
+
71
}
71
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
72
72
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
73
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
73
--
74
--
74
2.35.1
75
2.47.1
75
76
76
77
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST2600 clkin is always 25MHz, introduce clkin_25Mhz attribute
3
Add SDHCI model for AST2700 eMMC support. The eMMC controller only support 1
4
for aspeed_scu_get_clkin() to return the correct clkin for ast2600.
4
slot and registers base address is start at 0x1209_0000 and its interrupt is
5
connected to GICINT 15.
5
6
6
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Message-Id: <20220315075753.8591-3-steven_lee@aspeedtech.com>
9
Link: https://lore.kernel.org/r/20241204084453.610660-7-jamin_lin@aspeedtech.com
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
10
---
11
---
11
include/hw/misc/aspeed_scu.h | 1 +
12
hw/arm/aspeed_ast27x0.c | 15 +++++++++++++++
12
hw/misc/aspeed_scu.c | 6 +++++-
13
1 file changed, 15 insertions(+)
13
2 files changed, 6 insertions(+), 1 deletion(-)
14
14
15
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/misc/aspeed_scu.h
17
--- a/hw/arm/aspeed_ast27x0.c
18
+++ b/include/hw/misc/aspeed_scu.h
18
+++ b/hw/arm/aspeed_ast27x0.c
19
@@ -XXX,XX +XXX,XX @@ struct AspeedSCUClass {
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
20
uint32_t (*get_apb)(AspeedSCUState *s);
20
/* Init sd card slot class here so that they're under the correct parent */
21
uint32_t apb_divider;
21
object_initialize_child(obj, "sd-controller.sdhci",
22
uint32_t nr_regs;
22
&s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
23
+ bool clkin_25Mhz;
23
+
24
const MemoryRegionOps *ops;
24
+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
25
};
25
+ object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
26
26
+
27
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
27
+ object_initialize_child(obj, "emmc-controller.sdhci", &s->emmc.slots[0],
28
index XXXXXXX..XXXXXXX 100644
28
+ TYPE_SYSBUS_SDHCI);
29
--- a/hw/misc/aspeed_scu.c
30
+++ b/hw/misc/aspeed_scu.c
31
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_ast2500_scu_ops = {
32
33
static uint32_t aspeed_scu_get_clkin(AspeedSCUState *s)
34
{
35
- if (s->hw_strap1 & SCU_HW_STRAP_CLK_25M_IN) {
36
+ if (s->hw_strap1 & SCU_HW_STRAP_CLK_25M_IN ||
37
+ ASPEED_SCU_GET_CLASS(s)->clkin_25Mhz) {
38
return 25000000;
39
} else if (s->hw_strap1 & SCU_HW_STRAP_CLK_48M_IN) {
40
return 48000000;
41
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_scu_class_init(ObjectClass *klass, void *data)
42
asc->get_apb = aspeed_2400_scu_get_apb_freq;
43
asc->apb_divider = 2;
44
asc->nr_regs = ASPEED_SCU_NR_REGS;
45
+ asc->clkin_25Mhz = false;
46
asc->ops = &aspeed_ast2400_scu_ops;
47
}
29
}
48
30
49
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_scu_class_init(ObjectClass *klass, void *data)
31
/*
50
asc->get_apb = aspeed_2400_scu_get_apb_freq;
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
51
asc->apb_divider = 4;
33
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
52
asc->nr_regs = ASPEED_SCU_NR_REGS;
34
aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
53
+ asc->clkin_25Mhz = false;
35
54
asc->ops = &aspeed_ast2500_scu_ops;
36
+ /* eMMC */
55
}
37
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
56
38
+ return;
57
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_scu_class_init(ObjectClass *klass, void *data)
39
+ }
58
asc->get_apb = aspeed_2600_scu_get_apb_freq;
40
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->emmc), 0,
59
asc->apb_divider = 4;
41
+ sc->memmap[ASPEED_DEV_EMMC]);
60
asc->nr_regs = ASPEED_AST2600_SCU_NR_REGS;
42
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->emmc), 0,
61
+ asc->clkin_25Mhz = true;
43
+ aspeed_soc_get_irq(s, ASPEED_DEV_EMMC));
62
asc->ops = &aspeed_ast2600_scu_ops;
44
+
63
}
45
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
64
46
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
47
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
65
--
48
--
66
2.35.1
49
2.47.1
67
50
68
51
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
This simply moves the ast1030 tests to a new test file. No changes.
2
2
3
Add test case to test "ast1030-evb" machine with zephyr os
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
4
12
5
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
13
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
14
index XXXXXXX..XXXXXXX 100644
7
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
15
--- a/tests/functional/meson.build
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
16
+++ b/tests/functional/meson.build
9
Message-Id: <20220401083850.15266-10-jamin_lin@aspeedtech.com>
17
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
18
11
---
19
tests_arm_system_thorough = [
12
tests/avocado/machine_aspeed.py | 36 +++++++++++++++++++++++++++++++++
20
'arm_aspeed',
13
1 file changed, 36 insertions(+)
21
+ 'arm_aspeed_ast1030',
14
create mode 100644 tests/avocado/machine_aspeed.py
22
'arm_bpim2u',
15
23
'arm_canona1100',
16
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
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
17
new file mode 100644
101
new file mode 100644
18
index XXXXXXX..XXXXXXX
102
index XXXXXXX..XXXXXXX
19
--- /dev/null
103
--- /dev/null
20
+++ b/tests/avocado/machine_aspeed.py
104
+++ b/tests/functional/test_arm_aspeed_ast1030.py
21
@@ -XXX,XX +XXX,XX @@
105
@@ -XXX,XX +XXX,XX @@
106
+#!/usr/bin/env python3
107
+#
22
+# Functional test that boots the ASPEED SoCs with firmware
108
+# Functional test that boots the ASPEED SoCs with firmware
23
+#
109
+#
24
+# Copyright (C) 2022 ASPEED Technology Inc
110
+# Copyright (C) 2022 ASPEED Technology Inc
25
+#
111
+#
26
+# This work is licensed under the terms of the GNU GPL, version 2 or
112
+# SPDX-License-Identifier: GPL-2.0-or-later
27
+# later. See the COPYING file in the top-level directory.
28
+
113
+
29
+from avocado_qemu import QemuSystemTest
114
+import os
30
+from avocado_qemu import wait_for_console_pattern
115
+
31
+from avocado_qemu import exec_command_and_wait_for_pattern
116
+from qemu_test import LinuxKernelTest, Asset
32
+from avocado.utils import archive
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:~$")
33
+
183
+
34
+
184
+
35
+class AST1030Machine(QemuSystemTest):
185
+if __name__ == '__main__':
36
+ """Boots the zephyr os and checks that the console is operational"""
186
+ LinuxKernelTest.main()
37
+
38
+ timeout = 10
39
+
40
+ def test_ast1030_zephyros(self):
41
+ """
42
+ :avocado: tags=arch:arm
43
+ :avocado: tags=machine:ast1030-evb
44
+ """
45
+ tar_url = ('https://github.com/AspeedTech-BMC'
46
+ '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip')
47
+ tar_hash = '4c6a8ce3a8ba76ef1a65dae419ae3409343c4b20'
48
+ tar_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
49
+ archive.extract(tar_path, self.workdir)
50
+ kernel_file = self.workdir + "/ast1030-evb-demo/zephyr.elf"
51
+ self.vm.set_console()
52
+ self.vm.add_args('-kernel', kernel_file,
53
+ '-nographic')
54
+ self.vm.launch()
55
+ wait_for_console_pattern(self, "Booting Zephyr OS")
56
+ exec_command_and_wait_for_pattern(self, "help",
57
+ "Available commands")
58
--
187
--
59
2.35.1
188
2.47.1
60
189
61
190
diff view generated by jsdifflib
New patch
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.
1
3
4
Reviewed-by: Thomas Huth <thuth@redhat.com>
5
Link: https://lore.kernel.org/r/20241206131132.520911-3-clg@redhat.com
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
15
16
diff --git a/tests/functional/aspeed.py b/tests/functional/aspeed.py
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/tests/functional/aspeed.py
21
@@ -XXX,XX +XXX,XX @@
22
+# Test class to boot aspeed machines
23
+#
24
+# SPDX-License-Identifier: GPL-2.0-or-later
25
+
26
+from qemu_test import LinuxKernelTest
27
+
28
+class AspeedTest(LinuxKernelTest):
29
+
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()
36
+
37
+ self.wait_for_console_pattern("U-Boot 2016.07")
38
+ self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
39
+ self.wait_for_console_pattern("Starting kernel ...")
40
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
41
+ self.wait_for_console_pattern(
42
+ "aspeed-smc 1e620000.spi: read control register: 203b0641")
43
+ self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
44
+ self.wait_for_console_pattern("systemd[1]: Set hostname to")
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
87
new file mode 100644
88
index XXXXXXX..XXXXXXX
89
--- /dev/null
90
+++ b/tests/functional/test_arm_aspeed_palmetto.py
91
@@ -XXX,XX +XXX,XX @@
92
+#!/usr/bin/env python3
93
+#
94
+# Functional test that boots the ASPEED machines
95
+#
96
+# SPDX-License-Identifier: GPL-2.0-or-later
97
+
98
+from qemu_test import Asset
99
+from aspeed import AspeedTest
100
+
101
+class PalmettoMachine(AspeedTest):
102
+
103
+ ASSET_PALMETTO_FLASH = Asset(
104
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
105
+ 'obmc-phosphor-image-palmetto.static.mtd'),
106
+ '3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d');
107
+
108
+ def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
109
+ image_path = self.ASSET_PALMETTO_FLASH.fetch()
110
+
111
+ self.do_test_arm_aspeed('palmetto-bmc', image_path)
112
+
113
+
114
+if __name__ == '__main__':
115
+ AspeedTest.main()
116
--
117
2.47.1
118
119
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
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.
2
4
3
In order to correctly report secure boot running firmware, these values
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
4
must be set. They are taken from a running machine when secure boot is
6
Link: https://lore.kernel.org/r/20241206131132.520911-4-clg@redhat.com
5
enabled.
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
6
14
7
We don't yet have documentation from ASPEED on what they mean. Set the
15
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
8
raw values for now, and in the future improve the model with properties
9
to set these on a per-machine basis.
10
11
Signed-off-by: Joel Stanley <joel@jms.id.au>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-Id: <20220310052159.183975-1-joel@jms.id.au>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
16
hw/misc/aspeed_sbc.c | 7 +++++--
17
1 file changed, 5 insertions(+), 2 deletions(-)
18
19
diff --git a/hw/misc/aspeed_sbc.c b/hw/misc/aspeed_sbc.c
20
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/misc/aspeed_sbc.c
17
--- a/tests/functional/meson.build
22
+++ b/hw/misc/aspeed_sbc.c
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
23
@@ -XXX,XX +XXX,XX @@
39
@@ -XXX,XX +XXX,XX @@
24
40
25
#define R_PROT (0x000 / 4)
41
class AST2x00Machine(LinuxKernelTest):
26
#define R_STATUS (0x014 / 4)
42
27
+#define R_QSR (0x040 / 4)
43
- def do_test_arm_aspeed(self, machine, image):
28
44
- self.set_machine(machine)
29
static uint64_t aspeed_sbc_read(void *opaque, hwaddr addr, unsigned int size)
45
- self.vm.set_console()
30
{
46
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_sbc_write(void *opaque, hwaddr addr, uint64_t data,
47
- '-net', 'nic', '-snapshot')
32
48
- self.vm.launch()
33
switch (addr) {
49
-
34
case R_STATUS:
50
- self.wait_for_console_pattern("U-Boot 2016.07")
35
+ case R_QSR:
51
- self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
36
qemu_log_mask(LOG_GUEST_ERROR,
52
- self.wait_for_console_pattern("Starting kernel ...")
37
"%s: write to read only register 0x%" HWADDR_PRIx "\n",
53
- self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
38
__func__, addr << 2);
54
- self.wait_for_console_pattern(
39
@@ -XXX,XX +XXX,XX @@ static void aspeed_sbc_reset(DeviceState *dev)
55
- "aspeed-smc 1e620000.spi: read control register: 203b0641")
40
56
- self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
41
memset(s->regs, 0, sizeof(s->regs));
57
- self.wait_for_console_pattern("systemd[1]: Set hostname to")
42
58
-
43
- /* Set secure boot enabled, and boot from emmc/spi */
59
- ASSET_ROMULUS_FLASH = Asset(
44
- s->regs[R_STATUS] = 1 << 6 | 1 << 5;
60
- ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
45
+ /* Set secure boot enabled with RSA4096_SHA256 and enable eMMC ABR */
61
- 'obmc-phosphor-image-romulus.static.mtd'),
46
+ s->regs[R_STATUS] = 0x000044C6;
62
- '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
47
+ s->regs[R_QSR] = 0x07C07C89;
63
-
48
}
64
- def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
49
65
- image_path = self.ASSET_ROMULUS_FLASH.fetch()
50
static void aspeed_sbc_realize(DeviceState *dev, Error **errp)
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()
51
--
102
--
52
2.35.1
103
2.47.1
53
104
54
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
New patch
1
This moves the ast2600-evb tests to a new test file. No changes in the
2
test. The routines used to run the buildroot and sdk tests are removed
3
from the test_arm_aspeed.py file because now unused.
1
4
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
Link: https://lore.kernel.org/r/20241206131132.520911-6-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 | 155 --------------------
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
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
'arm_aspeed_palmetto' : 120,
21
'arm_aspeed_romulus' : 120,
22
'arm_aspeed_ast2500' : 480,
23
+ 'arm_aspeed_ast2600' : 720,
24
'arm_aspeed' : 600,
25
'arm_bpim2u' : 500,
26
'arm_collie' : 180,
27
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
28
'arm_aspeed_palmetto',
29
'arm_aspeed_romulus',
30
'arm_aspeed_ast2500',
31
+ 'arm_aspeed_ast2600',
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
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()
350
--
351
2.47.1
352
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: Steven Lee <steven_lee@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
This add two addition test cases for accumulative mode under sg enabled.
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
The input vector was manually craft with "abc" + bit 1 + padding zeros + L.
12
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
6
The padding length depends on algorithm, i.e. SHA512 (1024 bit),
7
SHA256 (512 bit).
8
9
The result was calculated by command line sha512sum/sha256sum utilities
10
without padding, i.e. only "abc" ascii text.
11
12
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
13
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
14
Acked-by: Thomas Huth <thuth@redhat.com>
15
Reviewed-by: Joel Stanley <joel@jms.id.au>
16
[ clg: checkpatch fixes ]
17
Message-Id: <20220426021120.28255-4-steven_lee@aspeedtech.com>
18
Signed-off-by: Cédric Le Goater <clg@kaod.org>
19
---
20
tests/qtest/aspeed_hace-test.c | 147 +++++++++++++++++++++++++++++++++
21
1 file changed, 147 insertions(+)
22
23
diff --git a/tests/qtest/aspeed_hace-test.c b/tests/qtest/aspeed_hace-test.c
24
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
25
--- a/tests/qtest/aspeed_hace-test.c
14
--- a/tests/avocado/boot_linux_console.py
26
+++ b/tests/qtest/aspeed_hace-test.c
15
+++ b/tests/avocado/boot_linux_console.py
27
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ def test_arm_quanta_gsj_initrd(self):
28
#define HACE_ALGO_SHA512 (BIT(5) | BIT(6))
17
self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
29
#define HACE_ALGO_SHA384 (BIT(5) | BIT(6) | BIT(10))
18
self.wait_for_console_pattern(
30
#define HACE_SG_EN BIT(18)
19
'Give root password for system maintenance')
31
+#define HACE_ACCUM_EN BIT(8)
20
-
32
21
- def test_arm_ast2600_debian(self):
33
#define HACE_STS 0x1c
22
- """
34
#define HACE_RSA_ISR BIT(13)
23
- :avocado: tags=arch:arm
35
@@ -XXX,XX +XXX,XX @@ static const uint8_t test_result_sg_sha256[] = {
24
- :avocado: tags=machine:rainier-bmc
36
0x55, 0x1e, 0x1e, 0xc5, 0x80, 0xdd, 0x6d, 0x5a, 0x6e, 0xcd, 0xe9, 0xf3,
25
- """
37
0xd3, 0x5e, 0x6e, 0x4a, 0x71, 0x7f, 0xbd, 0xe4};
26
- deb_url = ('http://snapshot.debian.org/archive/debian/'
38
27
- '20220606T211338Z/'
39
+/*
28
- 'pool/main/l/linux/'
40
+ * The accumulative mode requires firmware to provide internal initial state
29
- 'linux-image-5.17.0-2-armmp_5.17.6-1%2Bb1_armhf.deb')
41
+ * and message padding (including length L at the end of padding).
30
- deb_hash = '8acb2b4439faedc2f3ed4bdb2847ad4f6e0491f73debaeb7f660c8abe4dcdc0e'
42
+ *
31
- deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash,
43
+ * This test vector is a ascii text "abc" with padding message.
32
- algorithm='sha256')
44
+ *
33
- kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.17.0-2-armmp')
45
+ * Expected results were generated using command line utitiles:
34
- dtb_path = self.extract_from_deb(deb_path,
46
+ *
35
- '/usr/lib/linux-image-5.17.0-2-armmp/aspeed-bmc-ibm-rainier.dtb')
47
+ * echo -n -e 'abc' | dd of=/tmp/test
36
-
48
+ * for hash in sha512sum sha256sum; do $hash /tmp/test; done
37
- self.vm.set_console()
49
+ */
38
- self.vm.add_args('-kernel', kernel_path,
50
+static const uint8_t test_vector_accum_512[] = {
39
- '-dtb', dtb_path,
51
+ 0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
40
- '-net', 'nic')
52
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41
- self.vm.launch()
53
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42
- self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
54
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43
- self.wait_for_console_pattern("SMP: Total of 2 processors activated")
55
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44
- self.wait_for_console_pattern("No filesystem could mount root")
56
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45
-
57
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46
diff --git a/tests/functional/test_arm_aspeed_rainier.py b/tests/functional/test_arm_aspeed_rainier.py
58
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47
index XXXXXXX..XXXXXXX 100644
59
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48
--- a/tests/functional/test_arm_aspeed_rainier.py
60
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49
+++ b/tests/functional/test_arm_aspeed_rainier.py
61
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50
@@ -XXX,XX +XXX,XX @@ def test_arm_aspeed_emmc_boot(self):
62
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51
self.wait_for_console_pattern('mmcblk0: p1 p2 p3 p4 p5 p6 p7')
63
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52
self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')
64
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53
65
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54
+ ASSET_DEBIAN_LINUX_ARMHF_DEB = Asset(
66
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
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')
67
+
57
+
68
+static const uint8_t test_vector_accum_256[] = {
58
+ def test_arm_debian_kernel_boot(self):
69
+ 0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
59
+ self.set_machine('rainier-bmc')
70
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
77
+
60
+
78
+static const uint8_t test_result_accum_sha512[] = {
61
+ deb_path = self.ASSET_DEBIAN_LINUX_ARMHF_DEB.fetch()
79
+ 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49,
80
+ 0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
81
+ 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a,
82
+ 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
83
+ 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f,
84
+ 0xa5, 0x4c, 0xa4, 0x9f};
85
+
62
+
86
+static const uint8_t test_result_accum_sha256[] = {
63
+ kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.17.0-2-armmp')
87
+ 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde,
64
+ dtb_path = self.extract_from_deb(deb_path,
88
+ 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
65
+ '/usr/lib/linux-image-5.17.0-2-armmp/aspeed-bmc-ibm-rainier.dtb')
89
+ 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad};
90
91
static void write_regs(QTestState *s, uint32_t base, uint32_t src,
92
uint32_t length, uint32_t out, uint32_t method)
93
@@ -XXX,XX +XXX,XX @@ static void test_sha512_sg(const char *machine, const uint32_t base,
94
qtest_quit(s);
95
}
96
97
+static void test_sha256_accum(const char *machine, const uint32_t base,
98
+ const uint32_t src_addr)
99
+{
100
+ QTestState *s = qtest_init(machine);
101
+
66
+
102
+ const uint32_t buffer_addr = src_addr + 0x1000000;
67
+ self.vm.set_console()
103
+ const uint32_t digest_addr = src_addr + 0x4000000;
68
+ self.vm.add_args('-kernel', kernel_path,
104
+ uint8_t digest[32] = {0};
69
+ '-dtb', dtb_path,
105
+ struct AspeedSgList array[] = {
70
+ '-net', 'nic')
106
+ { cpu_to_le32(sizeof(test_vector_accum_256) | SG_LIST_LEN_LAST),
71
+ self.vm.launch()
107
+ cpu_to_le32(buffer_addr) },
108
+ };
109
+
72
+
110
+ /* Check engine is idle, no busy or irq bits set */
73
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
111
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
74
+ self.wait_for_console_pattern("SMP: Total of 2 processors activated")
75
+ self.wait_for_console_pattern("No filesystem could mount root")
112
+
76
+
113
+ /* Write test vector into memory */
114
+ qtest_memwrite(s, buffer_addr, test_vector_accum_256,
115
+ sizeof(test_vector_accum_256));
116
+ qtest_memwrite(s, src_addr, array, sizeof(array));
117
+
77
+
118
+ write_regs(s, base, src_addr, sizeof(test_vector_accum_256),
78
if __name__ == '__main__':
119
+ digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN | HACE_ACCUM_EN);
79
AspeedTest.main()
120
+
121
+ /* Check hash IRQ status is asserted */
122
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
123
+
124
+ /* Clear IRQ status and check status is deasserted */
125
+ qtest_writel(s, base + HACE_STS, 0x00000200);
126
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
127
+
128
+ /* Read computed digest from memory */
129
+ qtest_memread(s, digest_addr, digest, sizeof(digest));
130
+
131
+ /* Check result of computation */
132
+ g_assert_cmpmem(digest, sizeof(digest),
133
+ test_result_accum_sha256, sizeof(digest));
134
+
135
+ qtest_quit(s);
136
+}
137
+
138
+static void test_sha512_accum(const char *machine, const uint32_t base,
139
+ const uint32_t src_addr)
140
+{
141
+ QTestState *s = qtest_init(machine);
142
+
143
+ const uint32_t buffer_addr = src_addr + 0x1000000;
144
+ const uint32_t digest_addr = src_addr + 0x4000000;
145
+ uint8_t digest[64] = {0};
146
+ struct AspeedSgList array[] = {
147
+ { cpu_to_le32(sizeof(test_vector_accum_512) | SG_LIST_LEN_LAST),
148
+ cpu_to_le32(buffer_addr) },
149
+ };
150
+
151
+ /* Check engine is idle, no busy or irq bits set */
152
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
153
+
154
+ /* Write test vector into memory */
155
+ qtest_memwrite(s, buffer_addr, test_vector_accum_512,
156
+ sizeof(test_vector_accum_512));
157
+ qtest_memwrite(s, src_addr, array, sizeof(array));
158
+
159
+ write_regs(s, base, src_addr, sizeof(test_vector_accum_512),
160
+ digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN | HACE_ACCUM_EN);
161
+
162
+ /* Check hash IRQ status is asserted */
163
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
164
+
165
+ /* Clear IRQ status and check status is deasserted */
166
+ qtest_writel(s, base + HACE_STS, 0x00000200);
167
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
168
+
169
+ /* Read computed digest from memory */
170
+ qtest_memread(s, digest_addr, digest, sizeof(digest));
171
+
172
+ /* Check result of computation */
173
+ g_assert_cmpmem(digest, sizeof(digest),
174
+ test_result_accum_sha512, sizeof(digest));
175
+
176
+ qtest_quit(s);
177
+}
178
+
179
struct masks {
180
uint32_t src;
181
uint32_t dest;
182
@@ -XXX,XX +XXX,XX @@ static void test_sha512_sg_ast2600(void)
183
test_sha512_sg("-machine ast2600-evb", 0x1e6d0000, 0x80000000);
184
}
185
186
+static void test_sha256_accum_ast2600(void)
187
+{
188
+ test_sha256_accum("-machine ast2600-evb", 0x1e6d0000, 0x80000000);
189
+}
190
+
191
+static void test_sha512_accum_ast2600(void)
192
+{
193
+ test_sha512_accum("-machine ast2600-evb", 0x1e6d0000, 0x80000000);
194
+}
195
+
196
static void test_addresses_ast2600(void)
197
{
198
test_addresses("-machine ast2600-evb", 0x1e6d0000, &ast2600_masks);
199
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
200
qtest_add_func("ast2600/hace/sha512_sg", test_sha512_sg_ast2600);
201
qtest_add_func("ast2600/hace/sha256_sg", test_sha256_sg_ast2600);
202
203
+ qtest_add_func("ast2600/hace/sha512_accum", test_sha512_accum_ast2600);
204
+ qtest_add_func("ast2600/hace/sha256_accum", test_sha256_accum_ast2600);
205
+
206
qtest_add_func("ast2500/hace/addresses", test_addresses_ast2500);
207
qtest_add_func("ast2500/hace/sha512", test_sha512_ast2500);
208
qtest_add_func("ast2500/hace/sha256", test_sha256_ast2500);
209
--
80
--
210
2.35.1
81
2.47.1
211
82
212
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
The image should be supplied with ELF binary.
3
So far, the test cases are used for testing SMC model with AST2400 BMC.
4
$ qemu-system-arm -M ast1030-evb -kernel zephyr.elf -nographic
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
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
9
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
Link: https://lore.kernel.org/r/20241127091543.1243114-2-jamin_lin@aspeedtech.com
10
Message-Id: <20220401083850.15266-9-jamin_lin@aspeedtech.com>
11
Signed-off-by: Cédric Le Goater <clg@redhat.com>
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
---
12
---
13
hw/arm/aspeed.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++
13
tests/qtest/aspeed_smc-test.c | 16 ++++++++++++----
14
1 file changed, 66 insertions(+)
14
1 file changed, 12 insertions(+), 4 deletions(-)
15
15
16
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
16
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/aspeed.c
18
--- a/tests/qtest/aspeed_smc-test.c
19
+++ b/hw/arm/aspeed.c
19
+++ b/tests/qtest/aspeed_smc-test.c
20
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
21
#include "hw/loader.h"
21
flash_reset();
22
#include "qemu/error-report.h"
23
#include "qemu/units.h"
24
+#include "hw/qdev-clock.h"
25
26
static struct arm_boot_info aspeed_board_binfo = {
27
.board_id = -1, /* device-tree-only board */
28
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
29
aspeed_soc_num_cpus(amc->soc_name);
30
}
22
}
31
23
32
+#define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
24
-int main(int argc, char **argv)
33
+/* Main SYSCLK frequency in Hz (200MHz) */
25
+static int test_palmetto_bmc(void)
34
+#define SYSCLK_FRQ 200000000ULL
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);
35
+
43
+
36
+static void aspeed_minibmc_machine_init(MachineState *machine)
44
+ return ret;
37
+{
38
+ AspeedMachineState *bmc = ASPEED_MACHINE(machine);
39
+ AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
40
+ Clock *sysclk;
41
+
42
+ sysclk = clock_new(OBJECT(machine), "SYSCLK");
43
+ clock_set_hz(sysclk, SYSCLK_FRQ);
44
+
45
+ object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
46
+ qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
47
+
48
+ qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
49
+ amc->uart_default);
50
+ qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
51
+
52
+ aspeed_board_init_flashes(&bmc->soc.fmc,
53
+ bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
54
+ amc->num_cs,
55
+ 0);
56
+
57
+ aspeed_board_init_flashes(&bmc->soc.spi[0],
58
+ bmc->spi_model ? bmc->spi_model : amc->spi_model,
59
+ amc->num_cs, amc->num_cs);
60
+
61
+ aspeed_board_init_flashes(&bmc->soc.spi[1],
62
+ bmc->spi_model ? bmc->spi_model : amc->spi_model,
63
+ amc->num_cs, (amc->num_cs * 2));
64
+
65
+ if (amc->i2c_init) {
66
+ amc->i2c_init(bmc);
67
+ }
68
+
69
+ armv7m_load_kernel(ARM_CPU(first_cpu),
70
+ machine->kernel_filename,
71
+ AST1030_INTERNAL_FLASH_SIZE);
72
+}
45
+}
73
+
46
+
74
+static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
47
+int main(int argc, char **argv)
75
+ void *data)
76
+{
48
+{
77
+ MachineClass *mc = MACHINE_CLASS(oc);
49
+ int ret;
78
+ AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
79
+
50
+
80
+ mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
51
+ g_test_init(&argc, &argv, NULL);
81
+ amc->soc_name = "ast1030-a1";
52
+ ret = test_palmetto_bmc();
82
+ amc->hw_strap1 = 0;
83
+ amc->hw_strap2 = 0;
84
+ mc->init = aspeed_minibmc_machine_init;
85
+ mc->default_ram_size = 0;
86
+ mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
87
+ amc->fmc_model = "sst25vf032b";
88
+ amc->spi_model = "sst25vf032b";
89
+ amc->num_cs = 2;
90
+ amc->macs_mask = 0;
91
+}
92
+
53
+
93
static const TypeInfo aspeed_machine_types[] = {
54
return ret;
94
{
55
}
95
.name = MACHINE_TYPE_NAME("palmetto-bmc"),
96
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_machine_types[] = {
97
.name = MACHINE_TYPE_NAME("bletchley-bmc"),
98
.parent = TYPE_ASPEED_MACHINE,
99
.class_init = aspeed_machine_bletchley_class_init,
100
+ }, {
101
+ .name = MACHINE_TYPE_NAME("ast1030-evb"),
102
+ .parent = TYPE_ASPEED_MACHINE,
103
+ .class_init = aspeed_minibmc_machine_ast1030_evb_class_init,
104
}, {
105
.name = TYPE_ASPEED_MACHINE,
106
.parent = TYPE_MACHINE,
107
--
56
--
108
2.35.1
57
2.47.1
109
58
110
59
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST1030 spi controller's address decoding unit is 1MB that is identical
3
Currently, these test cases are only used for testing fmc_cs0 for AST2400.
4
to ast2600, but fmc address decoding unit is 512kb.
4
To test others BMC SOCs, introduces a new TestData structure.
5
Introduce seg_to_reg and reg_to_seg handlers for ast1030 fmc controller.
5
Users can set the spi base address, flash base address, jedesc id and so on
6
In addition, add ast1030 fmc, spi1, and spi2 class init handler.
6
for different BMC SOCs and flash model testing.
7
7
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
8
Introduce new helper functions to make the test case more readable.
9
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
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
17
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
18
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
19
Link: https://lore.kernel.org/r/20241127091543.1243114-3-jamin_lin@aspeedtech.com
12
Message-Id: <20220401083850.15266-3-jamin_lin@aspeedtech.com>
20
Signed-off-by: Cédric Le Goater <clg@redhat.com>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
---
21
---
15
hw/ssi/aspeed_smc.c | 157 ++++++++++++++++++++++++++++++++++++++++++++
22
tests/qtest/aspeed_smc-test.c | 546 +++++++++++++++++++---------------
16
1 file changed, 157 insertions(+)
23
1 file changed, 299 insertions(+), 247 deletions(-)
17
24
18
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
19
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/ssi/aspeed_smc.c
27
--- a/tests/qtest/aspeed_smc-test.c
21
+++ b/hw/ssi/aspeed_smc.c
28
+++ b/tests/qtest/aspeed_smc-test.c
22
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_spi2_info = {
29
@@ -XXX,XX +XXX,XX @@
23
.class_init = aspeed_2600_spi2_class_init,
30
#define CTRL_USERMODE 0x3
31
#define SR_WEL BIT(1)
32
33
-#define ASPEED_FMC_BASE 0x1E620000
34
-#define ASPEED_FLASH_BASE 0x20000000
35
-
36
/*
37
* Flash commands
38
*/
39
@@ -XXX,XX +XXX,XX @@ enum {
40
ERASE_SECTOR = 0xd8,
24
};
41
};
25
42
26
+/*
43
-#define FLASH_JEDEC 0x20ba19 /* n25q256a */
27
+ * The FMC Segment Registers of the AST1030 have a 512KB unit.
44
-#define FLASH_SIZE (32 * 1024 * 1024)
28
+ * Only bits [27:19] are used for decoding.
45
-
29
+ */
46
#define FLASH_PAGE_SIZE 256
30
+#define AST1030_SEG_ADDR_MASK 0x0ff80000
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;
31
+
55
+
32
+static uint32_t aspeed_1030_smc_segment_to_reg(const AspeedSMCState *s,
56
/*
33
+ 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)
34
+{
66
+{
35
+ uint32_t reg = 0;
67
+ qtest_writel(data->s, data->spi_base + offset, value);
36
+
37
+ /* Disabled segments have a nil register */
38
+ if (!seg->size) {
39
+ return 0;
40
+ }
41
+
42
+ reg |= (seg->addr & AST1030_SEG_ADDR_MASK) >> 16; /* start offset */
43
+ reg |= (seg->addr + seg->size - 1) & AST1030_SEG_ADDR_MASK; /* end offset */
44
+ return reg;
45
+}
68
+}
46
+
69
+
47
+static void aspeed_1030_smc_reg_to_segment(const AspeedSMCState *s,
70
+static inline uint32_t spi_readl(const TestData *data, uint64_t offset)
48
+ uint32_t reg, AspeedSegments *seg)
49
+{
71
+{
50
+ uint32_t start_offset = (reg << 16) & AST1030_SEG_ADDR_MASK;
72
+ return qtest_readl(data->s, data->spi_base + offset);
51
+ uint32_t end_offset = reg & AST1030_SEG_ADDR_MASK;
52
+ AspeedSMCClass *asc = ASPEED_SMC_GET_CLASS(s);
53
+
54
+ if (reg) {
55
+ seg->addr = asc->flash_window_base + start_offset;
56
+ seg->size = end_offset + (512 * KiB) - start_offset;
57
+ } else {
58
+ seg->addr = asc->flash_window_base;
59
+ seg->size = 0;
60
+ }
61
+}
73
+}
62
+
74
+
63
+static const uint32_t aspeed_1030_fmc_resets[ASPEED_SMC_R_MAX] = {
75
+static inline void flash_writeb(const TestData *data, uint64_t offset,
64
+ [R_CONF] = (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0 |
76
+ uint8_t value)
65
+ CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1),
66
+};
67
+
68
+static const AspeedSegments aspeed_1030_fmc_segments[] = {
69
+ { 0x0, 128 * MiB }, /* start address is readonly */
70
+ { 128 * MiB, 128 * MiB }, /* default is disabled but needed for -kernel */
71
+ { 0x0, 0 }, /* disabled */
72
+};
73
+
74
+static void aspeed_1030_fmc_class_init(ObjectClass *klass, void *data)
75
+{
77
+{
76
+ DeviceClass *dc = DEVICE_CLASS(klass);
78
+ qtest_writeb(data->s, data->flash_base + offset, value);
77
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
78
+
79
+ dc->desc = "Aspeed 1030 FMC Controller";
80
+ asc->r_conf = R_CONF;
81
+ asc->r_ce_ctrl = R_CE_CTRL;
82
+ asc->r_ctrl0 = R_CTRL0;
83
+ asc->r_timings = R_TIMINGS;
84
+ asc->nregs_timings = 2;
85
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
86
+ asc->cs_num_max = 2;
87
+ asc->segments = aspeed_1030_fmc_segments;
88
+ asc->segment_addr_mask = 0x0ff80ff8;
89
+ asc->resets = aspeed_1030_fmc_resets;
90
+ asc->flash_window_base = 0x80000000;
91
+ asc->flash_window_size = 0x10000000;
92
+ asc->features = ASPEED_SMC_FEATURE_DMA;
93
+ asc->dma_flash_mask = 0x0FFFFFFC;
94
+ asc->dma_dram_mask = 0x000BFFFC;
95
+ asc->nregs = ASPEED_SMC_R_MAX;
96
+ asc->segment_to_reg = aspeed_1030_smc_segment_to_reg;
97
+ asc->reg_to_segment = aspeed_1030_smc_reg_to_segment;
98
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
99
+}
79
+}
100
+
80
+
101
+static const TypeInfo aspeed_1030_fmc_info = {
81
+static inline void flash_writel(const TestData *data, uint64_t offset,
102
+ .name = "aspeed.fmc-ast1030",
82
+ uint32_t value)
103
+ .parent = TYPE_ASPEED_SMC,
104
+ .class_init = aspeed_1030_fmc_class_init,
105
+};
106
+
107
+static const AspeedSegments aspeed_1030_spi1_segments[] = {
108
+ { 0x0, 128 * MiB }, /* start address is readonly */
109
+ { 0x0, 0 }, /* disabled */
110
+};
111
+
112
+static void aspeed_1030_spi1_class_init(ObjectClass *klass, void *data)
113
+{
83
+{
114
+ DeviceClass *dc = DEVICE_CLASS(klass);
84
+ qtest_writel(data->s, data->flash_base + offset, value);
115
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
116
+
117
+ dc->desc = "Aspeed 1030 SPI1 Controller";
118
+ asc->r_conf = R_CONF;
119
+ asc->r_ce_ctrl = R_CE_CTRL;
120
+ asc->r_ctrl0 = R_CTRL0;
121
+ asc->r_timings = R_TIMINGS;
122
+ asc->nregs_timings = 2;
123
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
124
+ asc->cs_num_max = 2;
125
+ asc->segments = aspeed_1030_spi1_segments;
126
+ asc->segment_addr_mask = 0x0ff00ff0;
127
+ asc->flash_window_base = 0x90000000;
128
+ asc->flash_window_size = 0x10000000;
129
+ asc->features = ASPEED_SMC_FEATURE_DMA;
130
+ asc->dma_flash_mask = 0x0FFFFFFC;
131
+ asc->dma_dram_mask = 0x000BFFFC;
132
+ asc->nregs = ASPEED_SMC_R_MAX;
133
+ asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
134
+ asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
135
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
136
+}
85
+}
137
+
86
+
138
+static const TypeInfo aspeed_1030_spi1_info = {
87
+static inline uint8_t flash_readb(const TestData *data, uint64_t offset)
139
+ .name = "aspeed.spi1-ast1030",
88
{
140
+ .parent = TYPE_ASPEED_SMC,
89
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CONF);
141
+ .class_init = aspeed_1030_spi1_class_init,
90
+ return qtest_readb(data->s, data->flash_base + offset);
142
+};
143
+static const AspeedSegments aspeed_1030_spi2_segments[] = {
144
+ { 0x0, 128 * MiB }, /* start address is readonly */
145
+ { 0x0, 0 }, /* disabled */
146
+};
147
+
148
+static void aspeed_1030_spi2_class_init(ObjectClass *klass, void *data)
149
+{
150
+ DeviceClass *dc = DEVICE_CLASS(klass);
151
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
152
+
153
+ dc->desc = "Aspeed 1030 SPI2 Controller";
154
+ asc->r_conf = R_CONF;
155
+ asc->r_ce_ctrl = R_CE_CTRL;
156
+ asc->r_ctrl0 = R_CTRL0;
157
+ asc->r_timings = R_TIMINGS;
158
+ asc->nregs_timings = 2;
159
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
160
+ asc->cs_num_max = 2;
161
+ asc->segments = aspeed_1030_spi2_segments;
162
+ asc->segment_addr_mask = 0x0ff00ff0;
163
+ asc->flash_window_base = 0xb0000000;
164
+ asc->flash_window_size = 0x10000000;
165
+ asc->features = ASPEED_SMC_FEATURE_DMA;
166
+ asc->dma_flash_mask = 0x0FFFFFFC;
167
+ asc->dma_dram_mask = 0x000BFFFC;
168
+ asc->nregs = ASPEED_SMC_R_MAX;
169
+ asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
170
+ asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
171
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
172
+}
91
+}
173
+
92
+
174
+static const TypeInfo aspeed_1030_spi2_info = {
93
+static inline uint32_t flash_readl(const TestData *data, uint64_t offset)
175
+ .name = "aspeed.spi2-ast1030",
94
+{
176
+ .parent = TYPE_ASPEED_SMC,
95
+ return qtest_readl(data->s, data->flash_base + offset);
177
+ .class_init = aspeed_1030_spi2_class_init,
96
+}
178
+};
179
+
97
+
180
static void aspeed_smc_register_types(void)
98
+static void spi_conf(const TestData *data, uint32_t value)
181
{
99
+{
182
type_register_static(&aspeed_smc_flash_info);
100
+ uint32_t conf = spi_readl(data, R_CONF);
183
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_register_types(void)
101
184
type_register_static(&aspeed_2600_fmc_info);
102
conf |= value;
185
type_register_static(&aspeed_2600_spi1_info);
103
- writel(ASPEED_FMC_BASE + R_CONF, conf);
186
type_register_static(&aspeed_2600_spi2_info);
104
+ spi_writel(data, R_CONF, conf);
187
+ type_register_static(&aspeed_1030_fmc_info);
105
}
188
+ type_register_static(&aspeed_1030_spi1_info);
106
189
+ type_register_static(&aspeed_1030_spi2_info);
107
-static void spi_conf_remove(uint32_t value)
190
}
108
+static void spi_conf_remove(const TestData *data, uint32_t value)
191
109
{
192
type_init(aspeed_smc_register_types)
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);
888
+
889
+ /* fmc cs0 with n25q256a flash */
890
+ data->flash_base = 0x20000000;
891
+ data->spi_base = 0x1E620000;
892
+ data->jedec_id = 0x20ba19;
893
+
894
+ qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
895
+ qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
896
+ qtest_add_data_func("/ast2400/smc/erase_all", data, test_erase_all);
897
+ qtest_add_data_func("/ast2400/smc/write_page", data, test_write_page);
898
+ qtest_add_data_func("/ast2400/smc/read_page_mem",
899
+ data, test_read_page_mem);
900
+ qtest_add_data_func("/ast2400/smc/write_page_mem",
901
+ data, test_write_page_mem);
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
}
193
--
927
--
194
2.35.1
928
2.47.1
195
929
196
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: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
The aspeed ast2600 accumulative mode is described in datasheet
3
Currently, these test cases used the hardcode offset 0x1400000 (0x14000 * 256)
4
ast2600v10.pdf section 25.6.4:
4
which was beyond the 16MB flash size for flash page read/write command testing.
5
1. Allocating and initiating accumulative hash digest write buffer
5
However, the default fmc flash model of ast1030-a1 EVB is "w25q80bl" whose size
6
with initial state.
6
is 1MB. To test SoC flash models, introduces a new page_addr member in TestData
7
* Since QEMU crypto/hash api doesn't provide the API to set initial
7
structure, so users can set the offset for flash page read/write command
8
state of hash library, and the initial state is already set by
8
testing.
9
crypto library (gcrypt/glib/...), so skip this step.
10
2. Calculating accumulative hash digest.
11
(a) When receiving the last accumulative data, software need to add
12
padding message at the end of the accumulative data. Padding
13
message described in specific of MD5, SHA-1, SHA224, SHA256,
14
SHA512, SHA512/224, SHA512/256.
15
* Since the crypto library (gcrypt/glib) already pad the
16
padding message internally.
17
* This patch is to remove the padding message which fed byguest
18
machine driver.
19
9
20
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
10
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
21
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
11
Reviewed-by: Cédric Le Goater <clg@redhat.com>
22
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
Link: https://lore.kernel.org/r/20241127091543.1243114-5-jamin_lin@aspeedtech.com
23
Message-Id: <20220426021120.28255-3-steven_lee@aspeedtech.com>
13
Signed-off-by: Cédric Le Goater <clg@redhat.com>
24
Signed-off-by: Cédric Le Goater <clg@kaod.org>
25
---
14
---
26
include/hw/misc/aspeed_hace.h | 4 ++
15
tests/qtest/aspeed_smc-test.c | 17 ++++++++++-------
27
hw/misc/aspeed_hace.c | 132 ++++++++++++++++++++++++++++++++--
16
1 file changed, 10 insertions(+), 7 deletions(-)
28
2 files changed, 131 insertions(+), 5 deletions(-)
29
17
30
diff --git a/include/hw/misc/aspeed_hace.h b/include/hw/misc/aspeed_hace.h
18
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
31
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
32
--- a/include/hw/misc/aspeed_hace.h
20
--- a/tests/qtest/aspeed_smc-test.c
33
+++ b/include/hw/misc/aspeed_hace.h
21
+++ b/tests/qtest/aspeed_smc-test.c
34
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ typedef struct TestData {
35
OBJECT_DECLARE_TYPE(AspeedHACEState, AspeedHACEClass, ASPEED_HACE)
23
char *tmp_path;
36
24
uint8_t cs;
37
#define ASPEED_HACE_NR_REGS (0x64 >> 2)
25
const char *node;
38
+#define ASPEED_HACE_MAX_SG 256 /* max number of entries */
26
+ uint32_t page_addr;
39
27
} TestData;
40
struct AspeedHACEState {
28
41
SysBusDevice parent;
29
/*
42
@@ -XXX,XX +XXX,XX @@ struct AspeedHACEState {
30
@@ -XXX,XX +XXX,XX @@ static void assert_page_mem(const TestData *data, uint32_t addr,
43
MemoryRegion iomem;
31
static void test_erase_sector(const void *data)
44
qemu_irq irq;
45
46
+ struct iovec iov_cache[ASPEED_HACE_MAX_SG];
47
uint32_t regs[ASPEED_HACE_NR_REGS];
48
+ uint32_t total_req_len;
49
+ uint32_t iov_count;
50
51
MemoryRegion *dram_mr;
52
AddressSpace dram_as;
53
diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/misc/aspeed_hace.c
56
+++ b/hw/misc/aspeed_hace.c
57
@@ -XXX,XX +XXX,XX @@
58
#define SG_LIST_ADDR_SIZE 4
59
#define SG_LIST_ADDR_MASK 0x7FFFFFFF
60
#define SG_LIST_ENTRY_SIZE (SG_LIST_LEN_SIZE + SG_LIST_ADDR_SIZE)
61
-#define ASPEED_HACE_MAX_SG 256 /* max number of entries */
62
63
static const struct {
64
uint32_t mask;
65
@@ -XXX,XX +XXX,XX @@ static int hash_algo_lookup(uint32_t reg)
66
return -1;
67
}
68
69
-static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode)
70
+/**
71
+ * Check whether the request contains padding message.
72
+ *
73
+ * @param s aspeed hace state object
74
+ * @param iov iov of current request
75
+ * @param req_len length of the current request
76
+ * @param total_msg_len length of all acc_mode requests(excluding padding msg)
77
+ * @param pad_offset start offset of padding message
78
+ */
79
+static bool has_padding(AspeedHACEState *s, struct iovec *iov,
80
+ hwaddr req_len, uint32_t *total_msg_len,
81
+ uint32_t *pad_offset)
82
+{
83
+ *total_msg_len = (uint32_t)(ldq_be_p(iov->iov_base + req_len - 8) / 8);
84
+ /*
85
+ * SG_LIST_LEN_LAST asserted in the request length doesn't mean it is the
86
+ * last request. The last request should contain padding message.
87
+ * We check whether message contains padding by
88
+ * 1. Get total message length. If the current message contains
89
+ * padding, the last 8 bytes are total message length.
90
+ * 2. Check whether the total message length is valid.
91
+ * If it is valid, the value should less than or equal to
92
+ * total_req_len.
93
+ * 3. Current request len - padding_size to get padding offset.
94
+ * The padding message's first byte should be 0x80
95
+ */
96
+ if (*total_msg_len <= s->total_req_len) {
97
+ uint32_t padding_size = s->total_req_len - *total_msg_len;
98
+ uint8_t *padding = iov->iov_base;
99
+ *pad_offset = req_len - padding_size;
100
+ if (padding[*pad_offset] == 0x80) {
101
+ return true;
102
+ }
103
+ }
104
+
105
+ return false;
106
+}
107
+
108
+static int reconstruct_iov(AspeedHACEState *s, struct iovec *iov, int id,
109
+ uint32_t *pad_offset)
110
+{
111
+ int i, iov_count;
112
+ if (*pad_offset != 0) {
113
+ s->iov_cache[s->iov_count].iov_base = iov[id].iov_base;
114
+ s->iov_cache[s->iov_count].iov_len = *pad_offset;
115
+ ++s->iov_count;
116
+ }
117
+ for (i = 0; i < s->iov_count; i++) {
118
+ iov[i].iov_base = s->iov_cache[i].iov_base;
119
+ iov[i].iov_len = s->iov_cache[i].iov_len;
120
+ }
121
+ iov_count = s->iov_count;
122
+ s->iov_count = 0;
123
+ s->total_req_len = 0;
124
+ return iov_count;
125
+}
126
+
127
+/**
128
+ * Generate iov for accumulative mode.
129
+ *
130
+ * @param s aspeed hace state object
131
+ * @param iov iov of the current request
132
+ * @param id index of the current iov
133
+ * @param req_len length of the current request
134
+ *
135
+ * @return count of iov
136
+ */
137
+static int gen_acc_mode_iov(AspeedHACEState *s, struct iovec *iov, int id,
138
+ hwaddr *req_len)
139
+{
140
+ uint32_t pad_offset;
141
+ uint32_t total_msg_len;
142
+ s->total_req_len += *req_len;
143
+
144
+ if (has_padding(s, &iov[id], *req_len, &total_msg_len, &pad_offset)) {
145
+ if (s->iov_count) {
146
+ return reconstruct_iov(s, iov, id, &pad_offset);
147
+ }
148
+
149
+ *req_len -= s->total_req_len - total_msg_len;
150
+ s->total_req_len = 0;
151
+ iov[id].iov_len = *req_len;
152
+ } else {
153
+ s->iov_cache[s->iov_count].iov_base = iov->iov_base;
154
+ s->iov_cache[s->iov_count].iov_len = *req_len;
155
+ ++s->iov_count;
156
+ }
157
+
158
+ return id + 1;
159
+}
160
+
161
+static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode,
162
+ bool acc_mode)
163
{
32
{
164
struct iovec iov[ASPEED_HACE_MAX_SG];
33
const TestData *test_data = (const TestData *)data;
165
g_autofree uint8_t *digest_buf;
34
- uint32_t some_page_addr = 0x600 * FLASH_PAGE_SIZE;
166
size_t digest_len = 0;
35
+ uint32_t some_page_addr = test_data->page_addr;
167
+ int niov = 0;
36
uint32_t page[FLASH_PAGE_SIZE / 4];
168
int i;
37
int i;
169
38
170
if (sg_mode) {
39
@@ -XXX,XX +XXX,XX @@ static void test_erase_sector(const void *data)
171
@@ -XXX,XX +XXX,XX @@ static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode)
40
static void test_erase_all(const void *data)
172
MEMTXATTRS_UNSPECIFIED, NULL);
41
{
173
addr &= SG_LIST_ADDR_MASK;
42
const TestData *test_data = (const TestData *)data;
174
43
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
175
- iov[i].iov_len = len & SG_LIST_LEN_MASK;
44
+ uint32_t some_page_addr = test_data->page_addr;
176
- plen = iov[i].iov_len;
45
uint32_t page[FLASH_PAGE_SIZE / 4];
177
+ plen = len & SG_LIST_LEN_MASK;
46
int i;
178
iov[i].iov_base = address_space_map(&s->dram_as, addr, &plen, false,
47
179
MEMTXATTRS_UNSPECIFIED);
48
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(const void *data)
180
+
49
static void test_write_page(const void *data)
181
+ if (acc_mode) {
50
{
182
+ niov = gen_acc_mode_iov(s, iov, i, &plen);
51
const TestData *test_data = (const TestData *)data;
183
+
52
- uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
184
+ } else {
53
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
185
+ iov[i].iov_len = plen;
54
+ uint32_t my_page_addr = test_data->page_addr;
186
+ }
55
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
187
}
56
uint32_t page[FLASH_PAGE_SIZE / 4];
188
} else {
57
int i;
189
hwaddr len = s->regs[R_HASH_SRC_LEN];
58
190
@@ -XXX,XX +XXX,XX @@ static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode)
59
@@ -XXX,XX +XXX,XX @@ static void test_write_page(const void *data)
191
&len, false,
60
static void test_read_page_mem(const void *data)
192
MEMTXATTRS_UNSPECIFIED);
61
{
193
i = 1;
62
const TestData *test_data = (const TestData *)data;
194
+
63
- uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
195
+ if (s->iov_count) {
64
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
196
+ /*
65
+ uint32_t my_page_addr = test_data->page_addr;
197
+ * In aspeed sdk kernel driver, sg_mode is disabled in hash_final().
66
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
198
+ * Thus if we received a request with sg_mode disabled, it is
67
uint32_t page[FLASH_PAGE_SIZE / 4];
199
+ * required to check whether cache is empty. If no, we should
68
int i;
200
+ * combine cached iov and the current iov.
69
201
+ */
70
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
202
+ uint32_t total_msg_len;
71
static void test_write_page_mem(const void *data)
203
+ uint32_t pad_offset;
72
{
204
+ s->total_req_len += len;
73
const TestData *test_data = (const TestData *)data;
205
+ if (has_padding(s, iov, len, &total_msg_len, &pad_offset)) {
74
- uint32_t my_page_addr = 0x15000 * FLASH_PAGE_SIZE;
206
+ niov = reconstruct_iov(s, iov, 0, &pad_offset);
75
+ uint32_t my_page_addr = test_data->page_addr;
207
+ }
76
uint32_t page[FLASH_PAGE_SIZE / 4];
208
+ }
77
int i;
209
+ }
78
210
+
79
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
211
+ if (niov) {
80
data->jedec_id = 0x20ba19;
212
+ i = niov;
81
data->cs = 0;
213
}
82
data->node = "/machine/soc/fmc/ssi.0/child[0]";
214
83
+ /* beyond 16MB */
215
if (qcrypto_hash_bytesv(algo, iov, i, &digest_buf, &digest_len, NULL) < 0) {
84
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
216
@@ -XXX,XX +XXX,XX @@ static void aspeed_hace_write(void *opaque, hwaddr addr, uint64_t data,
85
217
__func__, data & ahc->hash_mask);
86
qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
218
break;
87
qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
219
}
220
- do_hash_operation(s, algo, data & HASH_SG_EN);
221
+ do_hash_operation(s, algo, data & HASH_SG_EN,
222
+ ((data & HASH_HMAC_MASK) == HASH_DIGEST_ACCUM));
223
224
if (data & HASH_IRQ_EN) {
225
qemu_irq_raise(s->irq);
226
@@ -XXX,XX +XXX,XX @@ static void aspeed_hace_reset(DeviceState *dev)
227
struct AspeedHACEState *s = ASPEED_HACE(dev);
228
229
memset(s->regs, 0, sizeof(s->regs));
230
+ s->iov_count = 0;
231
+ s->total_req_len = 0;
232
}
233
234
static void aspeed_hace_realize(DeviceState *dev, Error **errp)
235
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_hace = {
236
.minimum_version_id = 1,
237
.fields = (VMStateField[]) {
238
VMSTATE_UINT32_ARRAY(regs, AspeedHACEState, ASPEED_HACE_NR_REGS),
239
+ VMSTATE_UINT32(total_req_len, AspeedHACEState),
240
+ VMSTATE_UINT32(iov_count, AspeedHACEState),
241
VMSTATE_END_OF_LIST(),
242
}
243
};
244
--
88
--
245
2.35.1
89
2.47.1
246
90
247
91
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Per ast2500_2520_datasheet_v1.8 and ast2600v11.pdf, the default value of
3
Add test_ast2500_evb function and reused testcases for AST2500 testing.
4
WDT00 and WDT04 is 0x014FB180 for ast2500/ast2600.
4
The spi base address, flash base address and ce index of fmc_cs0 are
5
Add default_status and default_reload_value attributes for storing
5
0x1E620000, 0x20000000 and 0, respectively.
6
counter status and reload value as they are different from ast2400.
6
The default flash model of fmc_cs0 is "mx25l25635e" whose size is 32MB,
7
so set jedec_id 0xc22019.
7
8
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-6-jamin_lin@aspeedtech.com
12
Message-Id: <20220401083850.15266-4-jamin_lin@aspeedtech.com>
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
---
13
---
15
include/hw/watchdog/wdt_aspeed.h | 2 ++
14
tests/qtest/aspeed_smc-test.c | 40 +++++++++++++++++++++++++++++++++++
16
hw/watchdog/wdt_aspeed.c | 10 ++++++++--
15
1 file changed, 40 insertions(+)
17
2 files changed, 10 insertions(+), 2 deletions(-)
18
16
19
diff --git a/include/hw/watchdog/wdt_aspeed.h b/include/hw/watchdog/wdt_aspeed.h
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
20
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/watchdog/wdt_aspeed.h
19
--- a/tests/qtest/aspeed_smc-test.c
22
+++ b/include/hw/watchdog/wdt_aspeed.h
20
+++ b/tests/qtest/aspeed_smc-test.c
23
@@ -XXX,XX +XXX,XX @@ struct AspeedWDTClass {
21
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
24
void (*reset_pulse)(AspeedWDTState *s, uint32_t property);
22
data, test_write_block_protect_bottom_bit);
25
void (*wdt_reload)(AspeedWDTState *s);
26
uint64_t (*sanitize_ctrl)(uint64_t data);
27
+ uint32_t default_status;
28
+ uint32_t default_reload_value;
29
};
30
31
#endif /* WDT_ASPEED_H */
32
diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/watchdog/wdt_aspeed.c
35
+++ b/hw/watchdog/wdt_aspeed.c
36
@@ -XXX,XX +XXX,XX @@ static void aspeed_wdt_reset(DeviceState *dev)
37
AspeedWDTState *s = ASPEED_WDT(dev);
38
AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(s);
39
40
- s->regs[WDT_STATUS] = 0x3EF1480;
41
- s->regs[WDT_RELOAD_VALUE] = 0x03EF1480;
42
+ s->regs[WDT_STATUS] = awc->default_status;
43
+ s->regs[WDT_RELOAD_VALUE] = awc->default_reload_value;
44
s->regs[WDT_RESTART] = 0;
45
s->regs[WDT_CTRL] = awc->sanitize_ctrl(0);
46
s->regs[WDT_RESET_WIDTH] = 0xFF;
47
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_wdt_class_init(ObjectClass *klass, void *data)
48
awc->reset_ctrl_reg = SCU_RESET_CONTROL1;
49
awc->wdt_reload = aspeed_wdt_reload;
50
awc->sanitize_ctrl = aspeed_2400_sanitize_ctrl;
51
+ awc->default_status = 0x03EF1480;
52
+ awc->default_reload_value = 0x03EF1480;
53
}
23
}
54
24
55
static const TypeInfo aspeed_2400_wdt_info = {
25
+static void test_ast2500_evb(TestData *data)
56
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_wdt_class_init(ObjectClass *klass, void *data)
26
+{
57
awc->reset_pulse = aspeed_2500_wdt_reset_pulse;
27
+ int ret;
58
awc->wdt_reload = aspeed_wdt_reload_1mhz;
28
+ int fd;
59
awc->sanitize_ctrl = aspeed_2500_sanitize_ctrl;
29
+
60
+ awc->default_status = 0x014FB180;
30
+ fd = g_file_open_tmp("qtest.m25p80.mx25l25635e.XXXXXX",
61
+ awc->default_reload_value = 0x014FB180;
31
+ &data->tmp_path, NULL);
32
+ g_assert(fd >= 0);
33
+ ret = ftruncate(fd, 32 * 1024 * 1024);
34
+ g_assert(ret == 0);
35
+ close(fd);
36
+
37
+ data->s = qtest_initf("-machine ast2500-evb "
38
+ "-drive file=%s,format=raw,if=mtd",
39
+ data->tmp_path);
40
+
41
+ /* fmc cs0 with mx25l25635e flash */
42
+ data->flash_base = 0x20000000;
43
+ data->spi_base = 0x1E620000;
44
+ data->jedec_id = 0xc22019;
45
+ data->cs = 0;
46
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
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;
62
}
78
}
63
64
static const TypeInfo aspeed_2500_wdt_info = {
65
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_wdt_class_init(ObjectClass *klass, void *data)
66
awc->reset_pulse = aspeed_2500_wdt_reset_pulse;
67
awc->wdt_reload = aspeed_wdt_reload_1mhz;
68
awc->sanitize_ctrl = aspeed_2600_sanitize_ctrl;
69
+ awc->default_status = 0x014FB180;
70
+ awc->default_reload_value = 0x014FB180;
71
}
72
73
static const TypeInfo aspeed_2600_wdt_info = {
74
--
79
--
75
2.35.1
80
2.47.1
76
81
77
82
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
ast1030 tmc(timer controller) is identical to ast2600 tmc.
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
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-7-jamin_lin@aspeedtech.com
9
Message-Id: <20220401083850.15266-6-jamin_lin@aspeedtech.com>
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
13
---
12
include/hw/timer/aspeed_timer.h | 1 +
14
tests/qtest/aspeed_smc-test.c | 41 +++++++++++++++++++++++++++++++++++
13
hw/timer/aspeed_timer.c | 17 +++++++++++++++++
15
1 file changed, 41 insertions(+)
14
2 files changed, 18 insertions(+)
15
16
16
diff --git a/include/hw/timer/aspeed_timer.h b/include/hw/timer/aspeed_timer.h
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
17
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/timer/aspeed_timer.h
19
--- a/tests/qtest/aspeed_smc-test.c
19
+++ b/include/hw/timer/aspeed_timer.h
20
+++ b/tests/qtest/aspeed_smc-test.c
20
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedTimerCtrlState, AspeedTimerClass, ASPEED_TIMER)
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
21
#define TYPE_ASPEED_2400_TIMER TYPE_ASPEED_TIMER "-ast2400"
22
qtest_add_data_func("/ast2500/smc/read_status_reg",
22
#define TYPE_ASPEED_2500_TIMER TYPE_ASPEED_TIMER "-ast2500"
23
data, test_read_status_reg);
23
#define TYPE_ASPEED_2600_TIMER TYPE_ASPEED_TIMER "-ast2600"
24
}
24
+#define TYPE_ASPEED_1030_TIMER TYPE_ASPEED_TIMER "-ast1030"
25
+
25
26
+static void test_ast2600_evb(TestData *data)
26
#define ASPEED_TIMER_NR_TIMERS 8
27
28
diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/timer/aspeed_timer.c
31
+++ b/hw/timer/aspeed_timer.c
32
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_timer_info = {
33
.class_init = aspeed_2600_timer_class_init,
34
};
35
36
+static void aspeed_1030_timer_class_init(ObjectClass *klass, void *data)
37
+{
27
+{
38
+ DeviceClass *dc = DEVICE_CLASS(klass);
28
+ int ret;
39
+ AspeedTimerClass *awc = ASPEED_TIMER_CLASS(klass);
29
+ int fd;
40
+
30
+
41
+ dc->desc = "ASPEED 1030 Timer";
31
+ fd = g_file_open_tmp("qtest.m25p80.mx66u51235f.XXXXXX",
42
+ awc->read = aspeed_2600_timer_read;
32
+ &data->tmp_path, NULL);
43
+ awc->write = aspeed_2600_timer_write;
33
+ g_assert(fd >= 0);
34
+ ret = ftruncate(fd, 64 * 1024 * 1024);
35
+ g_assert(ret == 0);
36
+ close(fd);
37
+
38
+ data->s = qtest_initf("-machine ast2600-evb "
39
+ "-drive file=%s,format=raw,if=mtd",
40
+ data->tmp_path);
41
+
42
+ /* fmc cs0 with mx66u51235f flash */
43
+ data->flash_base = 0x20000000;
44
+ data->spi_base = 0x1E620000;
45
+ data->jedec_id = 0xc2253a;
46
+ data->cs = 0;
47
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
48
+ /* beyond 16MB */
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);
44
+}
61
+}
45
+
62
int main(int argc, char **argv)
46
+static const TypeInfo aspeed_1030_timer_info = {
47
+ .name = TYPE_ASPEED_1030_TIMER,
48
+ .parent = TYPE_ASPEED_TIMER,
49
+ .class_init = aspeed_1030_timer_class_init,
50
+};
51
+
52
static void aspeed_timer_register_types(void)
53
{
63
{
54
type_register_static(&aspeed_timer_info);
64
TestData palmetto_data;
55
type_register_static(&aspeed_2400_timer_info);
65
TestData ast2500_evb_data;
56
type_register_static(&aspeed_2500_timer_info);
66
+ TestData ast2600_evb_data;
57
type_register_static(&aspeed_2600_timer_info);
67
int ret;
58
+ type_register_static(&aspeed_1030_timer_info);
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;
59
}
83
}
60
61
type_init(aspeed_timer_register_types)
62
--
84
--
63
2.35.1
85
2.47.1
64
86
65
87
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST1030 wdt controller is similiar to AST2600's wdt, but it has extra
3
Add test_ast1030_evb function and reused testcases for AST1030 testing.
4
registers.
4
The base address, flash base address and ce index of fmc_cs0 are
5
Introduce ast1030 object class and increse the number of regs(offset) of
5
0x7E620000, 0x80000000 and 0, respectively.
6
ast1030 model.
6
The default flash model of fmc_cs0 is "w25q80bl" whose size is 1MB,
7
so set jedec_id 0xef4014.
7
8
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-8-jamin_lin@aspeedtech.com
12
Message-Id: <20220401083850.15266-5-jamin_lin@aspeedtech.com>
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
---
13
---
15
include/hw/watchdog/wdt_aspeed.h | 1 +
14
tests/qtest/aspeed_smc-test.c | 42 +++++++++++++++++++++++++++++++++++
16
hw/watchdog/wdt_aspeed.c | 24 ++++++++++++++++++++++++
15
1 file changed, 42 insertions(+)
17
2 files changed, 25 insertions(+)
18
16
19
diff --git a/include/hw/watchdog/wdt_aspeed.h b/include/hw/watchdog/wdt_aspeed.h
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
20
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/watchdog/wdt_aspeed.h
19
--- a/tests/qtest/aspeed_smc-test.c
22
+++ b/include/hw/watchdog/wdt_aspeed.h
20
+++ b/tests/qtest/aspeed_smc-test.c
23
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedWDTState, AspeedWDTClass, ASPEED_WDT)
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
24
#define TYPE_ASPEED_2400_WDT TYPE_ASPEED_WDT "-ast2400"
22
qtest_add_data_func("/ast2600/smc/read_status_reg",
25
#define TYPE_ASPEED_2500_WDT TYPE_ASPEED_WDT "-ast2500"
23
data, test_read_status_reg);
26
#define TYPE_ASPEED_2600_WDT TYPE_ASPEED_WDT "-ast2600"
24
}
27
+#define TYPE_ASPEED_1030_WDT TYPE_ASPEED_WDT "-ast1030"
25
+
28
26
+static void test_ast1030_evb(TestData *data)
29
#define ASPEED_WDT_REGS_MAX (0x20 / 4)
30
31
diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/watchdog/wdt_aspeed.c
34
+++ b/hw/watchdog/wdt_aspeed.c
35
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_wdt_info = {
36
.class_init = aspeed_2600_wdt_class_init,
37
};
38
39
+static void aspeed_1030_wdt_class_init(ObjectClass *klass, void *data)
40
+{
27
+{
41
+ DeviceClass *dc = DEVICE_CLASS(klass);
28
+ int ret;
42
+ AspeedWDTClass *awc = ASPEED_WDT_CLASS(klass);
29
+ int fd;
43
+
30
+
44
+ dc->desc = "ASPEED 1030 Watchdog Controller";
31
+ fd = g_file_open_tmp("qtest.m25p80.w25q80bl.XXXXXX",
45
+ awc->offset = 0x80;
32
+ &data->tmp_path, NULL);
46
+ awc->ext_pulse_width_mask = 0xfffff; /* TODO */
33
+ g_assert(fd >= 0);
47
+ awc->reset_ctrl_reg = AST2600_SCU_RESET_CONTROL1;
34
+ ret = ftruncate(fd, 1 * 1024 * 1024);
48
+ awc->reset_pulse = aspeed_2500_wdt_reset_pulse;
35
+ g_assert(ret == 0);
49
+ awc->wdt_reload = aspeed_wdt_reload_1mhz;
36
+ close(fd);
50
+ awc->sanitize_ctrl = aspeed_2600_sanitize_ctrl;
37
+
51
+ awc->default_status = 0x014FB180;
38
+ data->s = qtest_initf("-machine ast1030-evb "
52
+ awc->default_reload_value = 0x014FB180;
39
+ "-drive file=%s,format=raw,if=mtd",
40
+ data->tmp_path);
41
+
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;
50
+
51
+ qtest_add_data_func("/ast1030/smc/read_jedec", data, test_read_jedec);
52
+ qtest_add_data_func("/ast1030/smc/erase_sector", data, test_erase_sector);
53
+ qtest_add_data_func("/ast1030/smc/erase_all", data, test_erase_all);
54
+ qtest_add_data_func("/ast1030/smc/write_page", data, test_write_page);
55
+ qtest_add_data_func("/ast1030/smc/read_page_mem",
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);
53
+}
61
+}
54
+
62
+
55
+static const TypeInfo aspeed_1030_wdt_info = {
63
int main(int argc, char **argv)
56
+ .name = TYPE_ASPEED_1030_WDT,
57
+ .parent = TYPE_ASPEED_WDT,
58
+ .instance_size = sizeof(AspeedWDTState),
59
+ .class_init = aspeed_1030_wdt_class_init,
60
+};
61
+
62
static void wdt_aspeed_register_types(void)
63
{
64
{
64
watchdog_add_model(&model);
65
TestData palmetto_data;
65
@@ -XXX,XX +XXX,XX @@ static void wdt_aspeed_register_types(void)
66
TestData ast2500_evb_data;
66
type_register_static(&aspeed_2400_wdt_info);
67
TestData ast2600_evb_data;
67
type_register_static(&aspeed_2500_wdt_info);
68
+ TestData ast1030_evb_data;
68
type_register_static(&aspeed_2600_wdt_info);
69
int ret;
69
+ type_register_static(&aspeed_1030_wdt_info);
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;
70
}
88
}
71
72
type_init(wdt_aspeed_register_types)
73
--
89
--
74
2.35.1
90
2.47.1
75
91
76
92
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST2600's HPLL register offset and bit definition are different from
3
Add a new testcase for write page command with QPI mode testing.
4
AST2500. Add a hpll calculation function and an apb frequency calculation
4
Currently, only run this testcase for AST2500, AST2600 and AST1030.
5
function based on SCU200 register description in ast2600v11.pdf.
6
5
7
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
[ clg: checkpatch fixes ]
8
Link: https://lore.kernel.org/r/20241127091543.1243114-9-jamin_lin@aspeedtech.com
10
Message-Id: <20220315075753.8591-2-steven_lee@aspeedtech.com>
9
Signed-off-by: Cédric Le Goater <clg@redhat.com>
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
---
10
---
13
include/hw/misc/aspeed_scu.h | 19 ++++++++++++++++++
11
tests/qtest/aspeed_smc-test.c | 74 +++++++++++++++++++++++++++++++++++
14
hw/misc/aspeed_scu.c | 39 +++++++++++++++++++++++++++++++++++-
12
1 file changed, 74 insertions(+)
15
2 files changed, 57 insertions(+), 1 deletion(-)
16
13
17
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
14
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/misc/aspeed_scu.h
16
--- a/tests/qtest/aspeed_smc-test.c
20
+++ b/include/hw/misc/aspeed_scu.h
17
+++ b/tests/qtest/aspeed_smc-test.c
21
@@ -XXX,XX +XXX,XX @@ struct AspeedSCUClass {
18
@@ -XXX,XX +XXX,XX @@
22
19
#define R_CE_CTRL 0x04
23
const uint32_t *resets;
20
#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
24
uint32_t (*calc_hpll)(AspeedSCUState *s, uint32_t hpll_reg);
21
#define R_CTRL0 0x10
25
+ uint32_t (*get_apb)(AspeedSCUState *s);
22
+#define CTRL_IO_QUAD_IO BIT(31)
26
uint32_t apb_divider;
23
#define CTRL_CE_STOP_ACTIVE BIT(2)
27
uint32_t nr_regs;
24
#define CTRL_READMODE 0x0
28
const MemoryRegionOps *ops;
25
#define CTRL_FREADMODE 0x1
29
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
26
@@ -XXX,XX +XXX,XX @@ enum {
30
SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
27
ERASE_SECTOR = 0xd8,
31
SCU_AST2500_HW_STRAP_RESERVED1)
28
};
32
29
33
+/*
30
+#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
34
+ * SCU200 H-PLL Parameter Register (for Aspeed AST2600 SOC)
31
#define FLASH_PAGE_SIZE 256
35
+ *
32
36
+ * 28:26 H-PLL Parameters
33
typedef struct TestData {
37
+ * 25 Enable H-PLL reset
34
@@ -XXX,XX +XXX,XX @@ static void spi_ctrl_stop_user(const TestData *data)
38
+ * 24 Enable H-PLL bypass mode
35
spi_writel(data, ctrl_reg, ctrl);
39
+ * 23 Turn off H-PLL
36
}
40
+ * 22:19 H-PLL Post Divider (P)
37
41
+ * 18:13 H-PLL Numerator (M)
38
+static void spi_ctrl_set_io_mode(const TestData *data, uint32_t value)
42
+ * 12:0 H-PLL Denumerator (N)
39
+{
43
+ *
40
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
44
+ * (Output frequency) = CLKIN(25MHz) * [(M+1) / (N+1)] / (P+1)
41
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
45
+ *
42
+ uint32_t mode;
46
+ * The default frequency is 1200Mhz when CLKIN = 25MHz
47
+ */
48
+#define SCU_AST2600_H_PLL_BYPASS_EN (0x1 << 24)
49
+#define SCU_AST2600_H_PLL_OFF (0x1 << 23)
50
+
43
+
51
#endif /* ASPEED_SCU_H */
44
+ mode = value & CTRL_IO_MODE_MASK;
52
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
45
+ ctrl &= ~CTRL_IO_MODE_MASK;
53
index XXXXXXX..XXXXXXX 100644
46
+ ctrl |= mode;
54
--- a/hw/misc/aspeed_scu.c
47
+ spi_writel(data, ctrl_reg, ctrl);
55
+++ b/hw/misc/aspeed_scu.c
56
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_scu_get_random(void)
57
}
58
59
uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s)
60
+{
61
+ return ASPEED_SCU_GET_CLASS(s)->get_apb(s);
62
+}
48
+}
63
+
49
+
64
+static uint32_t aspeed_2400_scu_get_apb_freq(AspeedSCUState *s)
50
static void flash_reset(const TestData *data)
65
{
51
{
66
AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
52
spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
67
uint32_t hpll = asc->calc_hpll(s, s->regs[HPLL_PARAM]);
53
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(const void *data)
68
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s)
54
flash_reset(test_data);
69
/ asc->apb_divider;
70
}
55
}
71
56
72
+static uint32_t aspeed_2600_scu_get_apb_freq(AspeedSCUState *s)
57
+static void test_write_page_qpi(const void *data)
73
+{
58
+{
74
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
59
+ const TestData *test_data = (const TestData *)data;
75
+ uint32_t hpll = asc->calc_hpll(s, s->regs[AST2600_HPLL_PARAM]);
60
+ uint32_t my_page_addr = test_data->page_addr;
61
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
62
+ uint32_t page[FLASH_PAGE_SIZE / 4];
63
+ uint32_t page_pattern[] = {
64
+ 0xebd8c134, 0x5da196bc, 0xae15e729, 0x5085ccdf
65
+ };
66
+ int i;
76
+
67
+
77
+ return hpll / (SCU_CLK_GET_PCLK_DIV(s->regs[AST2600_CLK_SEL]) + 1)
68
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
78
+ / asc->apb_divider;
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);
79
+}
109
+}
80
+
110
+
81
static uint64_t aspeed_scu_read(void *opaque, hwaddr offset, unsigned size)
111
static void test_palmetto_bmc(TestData *data)
82
{
112
{
83
AspeedSCUState *s = ASPEED_SCU(opaque);
113
int ret;
84
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUState *s, uint32_t hpll_reg)
114
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
85
return clkin * multiplier;
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);
86
}
120
}
87
121
88
+static uint32_t aspeed_2600_scu_calc_hpll(AspeedSCUState *s, uint32_t hpll_reg)
122
static void test_ast2600_evb(TestData *data)
89
+{
123
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
90
+ uint32_t multiplier = 1;
124
data, test_write_page_mem);
91
+ uint32_t clkin = aspeed_scu_get_clkin(s);
125
qtest_add_data_func("/ast2600/smc/read_status_reg",
92
+
126
data, test_read_status_reg);
93
+ if (hpll_reg & SCU_AST2600_H_PLL_OFF) {
127
+ qtest_add_data_func("/ast2600/smc/write_page_qpi",
94
+ return 0;
128
+ data, test_write_page_qpi);
95
+ }
129
}
96
+
130
97
+ if (!(hpll_reg & SCU_AST2600_H_PLL_BYPASS_EN)) {
131
static void test_ast1030_evb(TestData *data)
98
+ uint32_t p = (hpll_reg >> 19) & 0xf;
132
@@ -XXX,XX +XXX,XX @@ static void test_ast1030_evb(TestData *data)
99
+ uint32_t n = (hpll_reg >> 13) & 0x3f;
133
data, test_write_page_mem);
100
+ uint32_t m = hpll_reg & 0x1fff;
134
qtest_add_data_func("/ast1030/smc/read_status_reg",
101
+
135
data, test_read_status_reg);
102
+ multiplier = ((m + 1) / (n + 1)) / (p + 1);
136
+ qtest_add_data_func("/ast1030/smc/write_page_qpi",
103
+ }
137
+ data, test_write_page_qpi);
104
+
138
}
105
+ return clkin * multiplier;
139
106
+}
140
int main(int argc, char **argv)
107
+
108
static void aspeed_scu_reset(DeviceState *dev)
109
{
110
AspeedSCUState *s = ASPEED_SCU(dev);
111
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_scu_class_init(ObjectClass *klass, void *data)
112
dc->desc = "ASPEED 2400 System Control Unit";
113
asc->resets = ast2400_a0_resets;
114
asc->calc_hpll = aspeed_2400_scu_calc_hpll;
115
+ asc->get_apb = aspeed_2400_scu_get_apb_freq;
116
asc->apb_divider = 2;
117
asc->nr_regs = ASPEED_SCU_NR_REGS;
118
asc->ops = &aspeed_ast2400_scu_ops;
119
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_scu_class_init(ObjectClass *klass, void *data)
120
dc->desc = "ASPEED 2500 System Control Unit";
121
asc->resets = ast2500_a1_resets;
122
asc->calc_hpll = aspeed_2500_scu_calc_hpll;
123
+ asc->get_apb = aspeed_2400_scu_get_apb_freq;
124
asc->apb_divider = 4;
125
asc->nr_regs = ASPEED_SCU_NR_REGS;
126
asc->ops = &aspeed_ast2500_scu_ops;
127
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_scu_class_init(ObjectClass *klass, void *data)
128
dc->desc = "ASPEED 2600 System Control Unit";
129
dc->reset = aspeed_ast2600_scu_reset;
130
asc->resets = ast2600_a3_resets;
131
- asc->calc_hpll = aspeed_2500_scu_calc_hpll; /* No change since AST2500 */
132
+ asc->calc_hpll = aspeed_2600_scu_calc_hpll;
133
+ asc->get_apb = aspeed_2600_scu_get_apb_freq;
134
asc->apb_divider = 4;
135
asc->nr_regs = ASPEED_AST2600_SCU_NR_REGS;
136
asc->ops = &aspeed_ast2600_scu_ops;
137
--
141
--
138
2.35.1
142
2.47.1
139
143
140
144
diff view generated by jsdifflib
1
From: Peter Delevoryas <pdel@fb.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
I was setting gpioV4-7 to "1110" using the QOM pin property handler and
3
The testcases for ASPEED SMC model were placed in aspeed_smc-test.c.
4
noticed that lowering gpioV7 was inadvertently lowering gpioV4-6 too.
4
However, this test file only supports for ARM32. To support all ASPEED SOCs
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.
5
8
6
(qemu) qom-set /machine/soc/gpio gpioV4 true
9
Finally, users are able to re-used these testcase for AST2700 and future
7
(qemu) qom-set /machine/soc/gpio gpioV5 true
10
ASPEED SOCs testing.
8
(qemu) qom-set /machine/soc/gpio gpioV6 true
9
(qemu) qom-get /machine/soc/gpio gpioV4
10
true
11
(qemu) qom-set /machine/soc/gpio gpioV7 false
12
(qemu) qom-get /machine/soc/gpio gpioV4
13
false
14
11
15
An expression in aspeed_gpio_set_pin_level was using a logical NOT
12
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
16
operator instead of a bitwise NOT operator:
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>
16
---
17
tests/qtest/aspeed-smc-utils.h | 95 ++++
18
tests/qtest/aspeed-smc-utils.c | 686 ++++++++++++++++++++++++++++
19
tests/qtest/aspeed_smc-test.c | 800 +++------------------------------
20
tests/qtest/meson.build | 1 +
21
4 files changed, 841 insertions(+), 741 deletions(-)
22
create mode 100644 tests/qtest/aspeed-smc-utils.h
23
create mode 100644 tests/qtest/aspeed-smc-utils.c
17
24
18
value &= !pin_mask;
25
diff --git a/tests/qtest/aspeed-smc-utils.h b/tests/qtest/aspeed-smc-utils.h
19
20
The original author probably intended to make a bitwise NOT expression
21
"~", but mistakenly used a logical NOT operator "!" instead. Some
22
programming languages like Rust use "!" for both purposes.
23
24
Fixes: 4b7f956862dc ("hw/gpio: Add basic Aspeed GPIO model for AST2400 and
25
AST2500")
26
Signed-off-by: Peter Delevoryas <pdel@fb.com>
27
Message-Id: <20220502080827.244815-1-pdel@fb.com>
28
Signed-off-by: Cédric Le Goater <clg@kaod.org>
29
---
30
hw/gpio/aspeed_gpio.c | 2 +-
31
tests/qtest/aspeed_gpio-test.c | 87 ++++++++++++++++++++++++++++++++++
32
tests/qtest/meson.build | 3 +-
33
3 files changed, 90 insertions(+), 2 deletions(-)
34
create mode 100644 tests/qtest/aspeed_gpio-test.c
35
36
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/gpio/aspeed_gpio.c
39
+++ b/hw/gpio/aspeed_gpio.c
40
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_set_pin_level(AspeedGPIOState *s, uint32_t set_idx,
41
if (level) {
42
value |= pin_mask;
43
} else {
44
- value &= !pin_mask;
45
+ value &= ~pin_mask;
46
}
47
48
aspeed_gpio_update(s, &s->sets[set_idx], value);
49
diff --git a/tests/qtest/aspeed_gpio-test.c b/tests/qtest/aspeed_gpio-test.c
50
new file mode 100644
26
new file mode 100644
51
index XXXXXXX..XXXXXXX
27
index XXXXXXX..XXXXXXX
52
--- /dev/null
28
--- /dev/null
53
+++ b/tests/qtest/aspeed_gpio-test.c
29
+++ b/tests/qtest/aspeed-smc-utils.h
54
@@ -XXX,XX +XXX,XX @@
30
@@ -XXX,XX +XXX,XX @@
55
+/*
31
+/*
56
+ * QTest testcase for the Aspeed GPIO Controller.
32
+ * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
33
+ * Controller)
57
+ *
34
+ *
58
+ * Copyright (c) Meta Platforms, Inc. and affiliates. (http://www.meta.com)
35
+ * Copyright (C) 2016 IBM Corp.
59
+ *
36
+ *
60
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
37
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
61
+ * of this software and associated documentation files (the "Software"), to deal
38
+ * of this software and associated documentation files (the "Software"), to deal
62
+ * in the Software without restriction, including without limitation the rights
39
+ * in the Software without restriction, including without limitation the rights
63
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
40
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
...
...
74
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
51
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
75
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
52
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
76
+ * THE SOFTWARE.
53
+ * THE SOFTWARE.
77
+ */
54
+ */
78
+
55
+
56
+#ifndef TESTS_ASPEED_SMC_UTILS_H
57
+#define TESTS_ASPEED_SMC_UTILS_H
58
+
79
+#include "qemu/osdep.h"
59
+#include "qemu/osdep.h"
60
+#include "qemu/bswap.h"
61
+#include "libqtest-single.h"
80
+#include "qemu/bitops.h"
62
+#include "qemu/bitops.h"
81
+#include "qemu/timer.h"
63
+
82
+#include "qapi/qmp/qdict.h"
64
+/*
65
+ * ASPEED SPI Controller registers
66
+ */
67
+#define R_CONF 0x00
68
+#define CONF_ENABLE_W0 16
69
+#define R_CE_CTRL 0x04
70
+#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
71
+#define R_CTRL0 0x10
72
+#define CTRL_IO_QUAD_IO BIT(31)
73
+#define CTRL_CE_STOP_ACTIVE BIT(2)
74
+#define CTRL_READMODE 0x0
75
+#define CTRL_FREADMODE 0x1
76
+#define CTRL_WRITEMODE 0x2
77
+#define CTRL_USERMODE 0x3
78
+#define SR_WEL BIT(1)
79
+
80
+/*
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,
97
+};
98
+
99
+#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
100
+#define FLASH_PAGE_SIZE 256
101
+
102
+typedef struct AspeedSMCTestData {
103
+ QTestState *s;
104
+ uint64_t spi_base;
105
+ uint64_t flash_base;
106
+ uint32_t jedec_id;
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
127
new file mode 100644
128
index XXXXXXX..XXXXXXX
129
--- /dev/null
130
+++ b/tests/qtest/aspeed-smc-utils.c
131
@@ -XXX,XX +XXX,XX @@
132
+/*
133
+ * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
134
+ * Controller)
135
+ *
136
+ * Copyright (C) 2016 IBM Corp.
137
+ *
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.
155
+ */
156
+
157
+#include "qemu/osdep.h"
158
+#include "qemu/bswap.h"
83
+#include "libqtest-single.h"
159
+#include "libqtest-single.h"
84
+
160
+#include "qemu/bitops.h"
85
+static bool qom_get_bool(QTestState *s, const char *path, const char *property)
161
+#include "aspeed-smc-utils.h"
86
+{
162
+
87
+ QDict *r;
163
+/*
88
+ bool b;
164
+ * Use an explicit bswap for the values read/wrote to the flash region
89
+
165
+ * as they are BE and the Aspeed CPU is LE.
90
+ r = qtest_qmp(s, "{ 'execute': 'qom-get', 'arguments': "
166
+ */
91
+ "{ 'path': %s, 'property': %s } }", path, property);
167
+static inline uint32_t make_be32(uint32_t data)
92
+ b = qdict_get_bool(r, "return");
168
+{
93
+ qobject_unref(r);
169
+ return bswap32(data);
94
+
170
+}
95
+ return b;
171
+
96
+}
172
+static inline void spi_writel(const AspeedSMCTestData *data, uint64_t offset,
97
+
173
+ uint32_t value)
98
+static void qom_set_bool(QTestState *s, const char *path, const char *property,
174
+{
99
+ bool value)
175
+ qtest_writel(data->s, data->spi_base + offset, value);
100
+{
176
+}
101
+ QDict *r;
177
+
102
+
178
+static inline uint32_t spi_readl(const AspeedSMCTestData *data, uint64_t offset)
103
+ r = qtest_qmp(s, "{ 'execute': 'qom-set', 'arguments': "
179
+{
104
+ "{ 'path': %s, 'property': %s, 'value': %i } }",
180
+ return qtest_readl(data->s, data->spi_base + offset);
105
+ path, property, value);
181
+}
106
+ qobject_unref(r);
182
+
107
+}
183
+static inline void flash_writeb(const AspeedSMCTestData *data, uint64_t offset,
108
+
184
+ uint8_t value)
109
+static void test_set_colocated_pins(const void *data)
185
+{
110
+{
186
+ qtest_writeb(data->s, data->flash_base + offset, value);
111
+ QTestState *s = (QTestState *)data;
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
+{
292
+ int i;
293
+
294
+ spi_ctrl_start_user(data);
295
+
296
+ flash_writeb(data, 0, EN_4BYTE_ADDR);
297
+ flash_writeb(data, 0, READ);
298
+ flash_writel(data, 0, make_be32(addr));
299
+
300
+ /* Continuous read are supported */
301
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
302
+ page[i] = make_be32(flash_readl(data, 0));
303
+ }
304
+ spi_ctrl_stop_user(data);
305
+}
306
+
307
+static void read_page_mem(const AspeedSMCTestData *data, uint32_t addr,
308
+ uint32_t *page)
309
+{
310
+ int i;
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));
112
+
367
+
113
+ /*
368
+ /*
114
+ * gpioV4-7 occupy bits within a single 32-bit value, so we want to make
369
+ * Previous page should be full of 0xffs after backend is
115
+ * sure that modifying one doesn't affect the other.
370
+ * initialized
116
+ */
371
+ */
117
+ qom_set_bool(s, "/machine/soc/gpio", "gpioV4", true);
372
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
118
+ qom_set_bool(s, "/machine/soc/gpio", "gpioV5", false);
373
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
119
+ qom_set_bool(s, "/machine/soc/gpio", "gpioV6", true);
374
+ g_assert_cmphex(page[i], ==, 0xffffffff);
120
+ qom_set_bool(s, "/machine/soc/gpio", "gpioV7", false);
375
+ }
121
+ g_assert(qom_get_bool(s, "/machine/soc/gpio", "gpioV4"));
376
+
122
+ g_assert(!qom_get_bool(s, "/machine/soc/gpio", "gpioV5"));
377
+ spi_ctrl_start_user(test_data);
123
+ g_assert(qom_get_bool(s, "/machine/soc/gpio", "gpioV6"));
378
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
124
+ g_assert(!qom_get_bool(s, "/machine/soc/gpio", "gpioV7"));
379
+ flash_writeb(test_data, 0, WREN);
125
+}
380
+ flash_writeb(test_data, 0, PP);
126
+
381
+ flash_writel(test_data, 0, make_be32(some_page_addr));
127
+int main(int argc, char **argv)
382
+
128
+{
383
+ /* Fill the page with its own addresses */
129
+ QTestState *s;
384
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
130
+ int r;
385
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
131
+
386
+ }
132
+ g_test_init(&argc, &argv, NULL);
387
+ spi_ctrl_stop_user(test_data);
133
+
388
+
134
+ s = qtest_init("-machine ast2600-evb");
389
+ /* Check the page is correctly written */
135
+ qtest_add_data_func("/ast2600/gpio/set_colocated_pins", s,
390
+ read_page(test_data, some_page_addr, page);
136
+ test_set_colocated_pins);
391
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
137
+ r = g_test_run();
392
+ g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
138
+ qtest_quit(s);
393
+ }
139
+
394
+
140
+ return r;
395
+ spi_ctrl_start_user(test_data);
141
+}
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);
712
+ }
713
+ }
714
+
715
+ flash_reset(test_data);
716
+}
717
+
718
+void aspeed_smc_test_write_block_protect_bottom_bit(const void *data)
719
+{
720
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
721
+ uint32_t sector_size = 65536;
722
+ uint32_t n_sectors = 512;
723
+
724
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
725
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
726
+
727
+ /* top bottom bit is enabled */
728
+ uint32_t bp_bits = 0b00100 << 3;
729
+
730
+ for (int i = 0; i < 16; i++) {
731
+ bp_bits = (((i & 0b1000) | 0b0100) << 3) | ((i & 0b0111) << 2);
732
+
733
+ spi_ctrl_start_user(test_data);
734
+ flash_writeb(test_data, 0, WREN);
735
+ flash_writeb(test_data, 0, BULK_ERASE);
736
+ flash_writeb(test_data, 0, WREN);
737
+ flash_writeb(test_data, 0, WRSR);
738
+ flash_writeb(test_data, 0, bp_bits);
739
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
740
+ flash_writeb(test_data, 0, WREN);
741
+ spi_ctrl_stop_user(test_data);
742
+
743
+ uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
744
+ uint32_t protection_start = 0;
745
+ uint32_t protection_end = num_protected_sectors;
746
+
747
+ for (int sector = 0; sector < n_sectors; sector++) {
748
+ uint32_t addr = sector * sector_size;
749
+
750
+ assert_page_mem(test_data, addr, 0xffffffff);
751
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
752
+
753
+ uint32_t expected_value = protection_start <= sector
754
+ && sector < protection_end
755
+ ? 0xffffffff : 0xabcdef12;
756
+
757
+ assert_page_mem(test_data, addr, expected_value);
758
+ }
759
+ }
760
+
761
+ flash_reset(test_data);
762
+}
763
+
764
+void aspeed_smc_test_write_page_qpi(const void *data)
765
+{
766
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
767
+ uint32_t my_page_addr = test_data->page_addr;
768
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
769
+ uint32_t page[FLASH_PAGE_SIZE / 4];
770
+ uint32_t page_pattern[] = {
771
+ 0xebd8c134, 0x5da196bc, 0xae15e729, 0x5085ccdf
772
+ };
773
+ int i;
774
+
775
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
776
+
777
+ spi_ctrl_start_user(test_data);
778
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
779
+ flash_writeb(test_data, 0, WREN);
780
+ flash_writeb(test_data, 0, PP);
781
+ flash_writel(test_data, 0, make_be32(my_page_addr));
782
+
783
+ /* Set QPI mode */
784
+ spi_ctrl_set_io_mode(test_data, CTRL_IO_QUAD_IO);
785
+
786
+ /* Fill the page pattern */
787
+ for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
788
+ flash_writel(test_data, 0, make_be32(page_pattern[i]));
789
+ }
790
+
791
+ /* Fill the page with its own addresses */
792
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
793
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
794
+ }
795
+
796
+ /* Restore io mode */
797
+ spi_ctrl_set_io_mode(test_data, 0);
798
+ spi_ctrl_stop_user(test_data);
799
+
800
+ /* Check what was written */
801
+ read_page(test_data, my_page_addr, page);
802
+ for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
803
+ g_assert_cmphex(page[i], ==, page_pattern[i]);
804
+ }
805
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
806
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
807
+ }
808
+
809
+ /* Check some other page. It should be full of 0xff */
810
+ read_page(test_data, some_page_addr, page);
811
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
812
+ g_assert_cmphex(page[i], ==, 0xffffffff);
813
+ }
814
+
815
+ flash_reset(test_data);
816
+}
817
+
818
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
819
index XXXXXXX..XXXXXXX 100644
820
--- a/tests/qtest/aspeed_smc-test.c
821
+++ b/tests/qtest/aspeed_smc-test.c
822
@@ -XXX,XX +XXX,XX @@
823
#include "qemu/bswap.h"
824
#include "libqtest-single.h"
825
#include "qemu/bitops.h"
826
+#include "aspeed-smc-utils.h"
827
828
-/*
829
- * ASPEED SPI Controller registers
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);
142
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
1686
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
143
index XXXXXXX..XXXXXXX 100644
1687
index XXXXXXX..XXXXXXX 100644
144
--- a/tests/qtest/meson.build
1688
--- a/tests/qtest/meson.build
145
+++ b/tests/qtest/meson.build
1689
+++ b/tests/qtest/meson.build
146
@@ -XXX,XX +XXX,XX @@ qtests_npcm7xx = \
1690
@@ -XXX,XX +XXX,XX @@ qtests = {
147
(slirp.found() ? ['npcm7xx_emc-test'] : [])
1691
'virtio-net-failover': files('migration-helpers.c'),
148
qtests_aspeed = \
1692
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
149
['aspeed_hace-test',
1693
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
150
- 'aspeed_smc-test']
1694
+ 'aspeed_smc-test': files('aspeed-smc-utils.c', 'aspeed_smc-test.c'),
151
+ 'aspeed_smc-test',
1695
}
152
+ 'aspeed_gpio-test']
1696
153
qtests_arm = \
1697
if vnc.found()
154
(config_all_devices.has_key('CONFIG_MPS2') ? ['sse-timer-test'] : []) + \
155
(config_all_devices.has_key('CONFIG_CMSDK_APB_DUALTIMER') ? ['cmsdk-apb-dualtimer-test'] : []) + \
156
--
1698
--
157
2.35.1
1699
2.47.1
158
1700
159
1701
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
The embedded core of AST1030 SoC is ARM Coretex M4.
3
Add test_ast2700_evb function and reused testcases which are from
4
It is hard to be integrated in the common Aspeed Soc framework.
4
aspeed_smc-test.c for AST2700 testing. The base address, flash base address
5
We introduce a new ast1030 class with instance_init and realize
5
and ce index of fmc_cs0 are 0x14000000, 0x100000000 and 0, respectively.
6
handlers.
6
The default flash model of fmc_cs0 is "w25q01jvq" whose size is 128MB,
7
so set jedec_id 0xef4021.
7
8
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-11-jamin_lin@aspeedtech.com
12
[ clg: rename aspeed_ast10xx.c to aspeed_ast10x0.c to match zephyr ]
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
13
Message-Id: <20220401083850.15266-8-jamin_lin@aspeedtech.com>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
13
---
16
include/hw/arm/aspeed_soc.h | 3 +
14
tests/qtest/ast2700-smc-test.c | 71 ++++++++++++++++++++++++++++++++++
17
hw/arm/aspeed_ast10x0.c | 299 ++++++++++++++++++++++++++++++++++++
15
tests/qtest/meson.build | 4 +-
18
hw/arm/meson.build | 6 +-
16
2 files changed, 74 insertions(+), 1 deletion(-)
19
3 files changed, 307 insertions(+), 1 deletion(-)
17
create mode 100644 tests/qtest/ast2700-smc-test.c
20
create mode 100644 hw/arm/aspeed_ast10x0.c
21
18
22
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
23
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/aspeed_soc.h
25
+++ b/include/hw/arm/aspeed_soc.h
26
@@ -XXX,XX +XXX,XX @@
27
#define ASPEED_SOC_H
28
29
#include "hw/cpu/a15mpcore.h"
30
+#include "hw/arm/armv7m.h"
31
#include "hw/intc/aspeed_vic.h"
32
#include "hw/misc/aspeed_scu.h"
33
#include "hw/adc/aspeed_adc.h"
34
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
35
/*< public >*/
36
ARMCPU cpu[ASPEED_CPUS_NUM];
37
A15MPPrivState a7mpcore;
38
+ ARMv7MState armv7m;
39
MemoryRegion *dram_mr;
40
MemoryRegion sram;
41
AspeedVICState vic;
42
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
43
AspeedSDHCIState emmc;
44
AspeedLPCState lpc;
45
uint32_t uart_default;
46
+ Clock *sysclk;
47
};
48
49
#define TYPE_ASPEED_SOC "aspeed-soc"
50
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
51
new file mode 100644
20
new file mode 100644
52
index XXXXXXX..XXXXXXX
21
index XXXXXXX..XXXXXXX
53
--- /dev/null
22
--- /dev/null
54
+++ b/hw/arm/aspeed_ast10x0.c
23
+++ b/tests/qtest/ast2700-smc-test.c
55
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@
56
+/*
25
+/*
57
+ * ASPEED Ast10x0 SoC
26
+ * QTest testcase for the M25P80 Flash using the ASPEED SPI Controller since
27
+ * AST2700.
58
+ *
28
+ *
59
+ * Copyright (C) 2022 ASPEED Technology Inc.
29
+ * SPDX-License-Identifier: GPL-2.0-or-later
60
+ *
30
+ * Copyright (C) 2024 ASPEED Technology Inc.
61
+ * This code is licensed under the GPL version 2 or later. See
62
+ * the COPYING file in the top-level directory.
63
+ *
64
+ * Implementation extracted from the AST2600 and adapted for Ast10x0.
65
+ */
31
+ */
66
+
32
+
67
+#include "qemu/osdep.h"
33
+#include "qemu/osdep.h"
68
+#include "qapi/error.h"
34
+#include "qemu/bswap.h"
69
+#include "exec/address-spaces.h"
35
+#include "libqtest-single.h"
70
+#include "sysemu/sysemu.h"
36
+#include "qemu/bitops.h"
71
+#include "hw/qdev-clock.h"
37
+#include "aspeed-smc-utils.h"
72
+#include "hw/misc/unimp.h"
73
+#include "hw/char/serial.h"
74
+#include "hw/arm/aspeed_soc.h"
75
+
38
+
76
+#define ASPEED_SOC_IOMEM_SIZE 0x00200000
39
+static void test_ast2700_evb(AspeedSMCTestData *data)
40
+{
41
+ int ret;
42
+ int fd;
77
+
43
+
78
+static const hwaddr aspeed_soc_ast1030_memmap[] = {
44
+ fd = g_file_open_tmp("qtest.m25p80.w25q01jvq.XXXXXX",
79
+ [ASPEED_DEV_SRAM] = 0x00000000,
45
+ &data->tmp_path, NULL);
80
+ [ASPEED_DEV_SBC] = 0x79000000,
46
+ g_assert(fd >= 0);
81
+ [ASPEED_DEV_IOMEM] = 0x7E600000,
47
+ ret = ftruncate(fd, 128 * 1024 * 1024);
82
+ [ASPEED_DEV_PWM] = 0x7E610000,
48
+ g_assert(ret == 0);
83
+ [ASPEED_DEV_FMC] = 0x7E620000,
49
+ close(fd);
84
+ [ASPEED_DEV_SPI1] = 0x7E630000,
85
+ [ASPEED_DEV_SPI2] = 0x7E640000,
86
+ [ASPEED_DEV_SCU] = 0x7E6E2000,
87
+ [ASPEED_DEV_ADC] = 0x7E6E9000,
88
+ [ASPEED_DEV_SBC] = 0x7E6F2000,
89
+ [ASPEED_DEV_GPIO] = 0x7E780000,
90
+ [ASPEED_DEV_TIMER1] = 0x7E782000,
91
+ [ASPEED_DEV_UART5] = 0x7E784000,
92
+ [ASPEED_DEV_WDT] = 0x7E785000,
93
+ [ASPEED_DEV_LPC] = 0x7E789000,
94
+ [ASPEED_DEV_I2C] = 0x7E7B0000,
95
+};
96
+
50
+
97
+static const int aspeed_soc_ast1030_irqmap[] = {
51
+ data->s = qtest_initf("-machine ast2700-evb "
98
+ [ASPEED_DEV_UART5] = 8,
52
+ "-drive file=%s,format=raw,if=mtd",
99
+ [ASPEED_DEV_GPIO] = 11,
53
+ data->tmp_path);
100
+ [ASPEED_DEV_TIMER1] = 16,
101
+ [ASPEED_DEV_TIMER2] = 17,
102
+ [ASPEED_DEV_TIMER3] = 18,
103
+ [ASPEED_DEV_TIMER4] = 19,
104
+ [ASPEED_DEV_TIMER5] = 20,
105
+ [ASPEED_DEV_TIMER6] = 21,
106
+ [ASPEED_DEV_TIMER7] = 22,
107
+ [ASPEED_DEV_TIMER8] = 23,
108
+ [ASPEED_DEV_WDT] = 24,
109
+ [ASPEED_DEV_LPC] = 35,
110
+ [ASPEED_DEV_FMC] = 39,
111
+ [ASPEED_DEV_PWM] = 44,
112
+ [ASPEED_DEV_ADC] = 46,
113
+ [ASPEED_DEV_SPI1] = 65,
114
+ [ASPEED_DEV_SPI2] = 66,
115
+ [ASPEED_DEV_I2C] = 110, /* 110 ~ 123 */
116
+ [ASPEED_DEV_KCS] = 138, /* 138 -> 142 */
117
+};
118
+
54
+
119
+static qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int ctrl)
55
+ /* fmc cs0 with w25q01jvq flash */
120
+{
56
+ data->flash_base = 0x100000000;
121
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
57
+ data->spi_base = 0x14000000;
58
+ data->jedec_id = 0xef4021;
59
+ data->cs = 0;
60
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
61
+ /* beyond 64MB */
62
+ data->page_addr = 0x40000 * FLASH_PAGE_SIZE;
122
+
63
+
123
+ return qdev_get_gpio_in(DEVICE(&s->armv7m), sc->irqmap[ctrl]);
64
+ qtest_add_data_func("/ast2700/smc/read_jedec",
65
+ data, aspeed_smc_test_read_jedec);
66
+ qtest_add_data_func("/ast2700/smc/erase_sector",
67
+ data, aspeed_smc_test_erase_sector);
68
+ qtest_add_data_func("/ast2700/smc/erase_all",
69
+ data, aspeed_smc_test_erase_all);
70
+ qtest_add_data_func("/ast2700/smc/write_page",
71
+ data, aspeed_smc_test_write_page);
72
+ qtest_add_data_func("/ast2700/smc/read_page_mem",
73
+ data, aspeed_smc_test_read_page_mem);
74
+ qtest_add_data_func("/ast2700/smc/write_page_mem",
75
+ data, aspeed_smc_test_write_page_mem);
76
+ qtest_add_data_func("/ast2700/smc/read_status_reg",
77
+ data, aspeed_smc_test_read_status_reg);
78
+ qtest_add_data_func("/ast2700/smc/write_page_qpi",
79
+ data, aspeed_smc_test_write_page_qpi);
124
+}
80
+}
125
+
81
+
126
+static void aspeed_soc_ast1030_init(Object *obj)
82
+int main(int argc, char **argv)
127
+{
83
+{
128
+ AspeedSoCState *s = ASPEED_SOC(obj);
84
+ AspeedSMCTestData ast2700_evb_data;
129
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
85
+ int ret;
130
+ char socname[8];
131
+ char typename[64];
132
+ int i;
133
+
86
+
134
+ if (sscanf(sc->name, "%7s", socname) != 1) {
87
+ g_test_init(&argc, &argv, NULL);
135
+ g_assert_not_reached();
136
+ }
137
+
88
+
138
+ object_initialize_child(obj, "armv7m", &s->armv7m, TYPE_ARMV7M);
89
+ test_ast2700_evb(&ast2700_evb_data);
90
+ ret = g_test_run();
139
+
91
+
140
+ s->sysclk = qdev_init_clock_in(DEVICE(s), "sysclk", NULL, NULL, 0);
92
+ qtest_quit(ast2700_evb_data.s);
141
+
93
+ unlink(ast2700_evb_data.tmp_path);
142
+ snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
94
+ return ret;
143
+ object_initialize_child(obj, "scu", &s->scu, typename);
144
+ qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev", sc->silicon_rev);
145
+
146
+ object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu), "hw-strap1");
147
+ object_property_add_alias(obj, "hw-strap2", OBJECT(&s->scu), "hw-strap2");
148
+
149
+ snprintf(typename, sizeof(typename), "aspeed.timer-%s", socname);
150
+ object_initialize_child(obj, "timerctrl", &s->timerctrl, typename);
151
+
152
+ snprintf(typename, sizeof(typename), "aspeed.adc-%s", socname);
153
+ object_initialize_child(obj, "adc", &s->adc, typename);
154
+
155
+ snprintf(typename, sizeof(typename), "aspeed.fmc-%s", socname);
156
+ object_initialize_child(obj, "fmc", &s->fmc, typename);
157
+
158
+ for (i = 0; i < sc->spis_num; i++) {
159
+ snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i + 1, socname);
160
+ object_initialize_child(obj, "spi[*]", &s->spi[i], typename);
161
+ }
162
+
163
+ object_initialize_child(obj, "lpc", &s->lpc, TYPE_ASPEED_LPC);
164
+
165
+ object_initialize_child(obj, "sbc", &s->sbc, TYPE_ASPEED_SBC);
166
+
167
+ for (i = 0; i < sc->wdts_num; i++) {
168
+ snprintf(typename, sizeof(typename), "aspeed.wdt-%s", socname);
169
+ object_initialize_child(obj, "wdt[*]", &s->wdt[i], typename);
170
+ }
171
+}
95
+}
172
+
96
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
173
+static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
174
+{
175
+ AspeedSoCState *s = ASPEED_SOC(dev_soc);
176
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
177
+ MemoryRegion *system_memory = get_system_memory();
178
+ DeviceState *armv7m;
179
+ Error *err = NULL;
180
+ int i;
181
+
182
+ if (!clock_has_source(s->sysclk)) {
183
+ error_setg(errp, "sysclk clock must be wired up by the board code");
184
+ return;
185
+ }
186
+
187
+ /* General I/O memory space to catch all unimplemented device */
188
+ create_unimplemented_device("aspeed.sbc",
189
+ sc->memmap[ASPEED_DEV_SBC],
190
+ 0x40000);
191
+ create_unimplemented_device("aspeed.io",
192
+ sc->memmap[ASPEED_DEV_IOMEM],
193
+ ASPEED_SOC_IOMEM_SIZE);
194
+
195
+ /* AST1030 CPU Core */
196
+ armv7m = DEVICE(&s->armv7m);
197
+ qdev_prop_set_uint32(armv7m, "num-irq", 256);
198
+ qdev_prop_set_string(armv7m, "cpu-type", sc->cpu_type);
199
+ qdev_connect_clock_in(armv7m, "cpuclk", s->sysclk);
200
+ object_property_set_link(OBJECT(&s->armv7m), "memory",
201
+ OBJECT(system_memory), &error_abort);
202
+ sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &error_abort);
203
+
204
+ /* Internal SRAM */
205
+ memory_region_init_ram(&s->sram, NULL, "aspeed.sram", sc->sram_size, &err);
206
+ if (err != NULL) {
207
+ error_propagate(errp, err);
208
+ return;
209
+ }
210
+ memory_region_add_subregion(system_memory,
211
+ sc->memmap[ASPEED_DEV_SRAM],
212
+ &s->sram);
213
+
214
+ /* SCU */
215
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
216
+ return;
217
+ }
218
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_DEV_SCU]);
219
+
220
+ /* LPC */
221
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->lpc), errp)) {
222
+ return;
223
+ }
224
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->lpc), 0, sc->memmap[ASPEED_DEV_LPC]);
225
+
226
+ /* Connect the LPC IRQ to the GIC. It is otherwise unused. */
227
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 0,
228
+ aspeed_soc_get_irq(s, ASPEED_DEV_LPC));
229
+
230
+ /*
231
+ * On the AST1030 LPC subdevice IRQs are connected straight to the GIC.
232
+ */
233
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_1,
234
+ qdev_get_gpio_in(DEVICE(&s->armv7m),
235
+ sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_1));
236
+
237
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_2,
238
+ qdev_get_gpio_in(DEVICE(&s->armv7m),
239
+ sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_2));
240
+
241
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_3,
242
+ qdev_get_gpio_in(DEVICE(&s->armv7m),
243
+ sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_3));
244
+
245
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_4,
246
+ qdev_get_gpio_in(DEVICE(&s->armv7m),
247
+ sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_4));
248
+
249
+ /* UART5 - attach an 8250 to the IO space as our UART */
250
+ serial_mm_init(get_system_memory(), sc->memmap[ASPEED_DEV_UART5], 2,
251
+ aspeed_soc_get_irq(s, ASPEED_DEV_UART5),
252
+ 38400, serial_hd(0), DEVICE_LITTLE_ENDIAN);
253
+
254
+ /* Timer */
255
+ object_property_set_link(OBJECT(&s->timerctrl), "scu", OBJECT(&s->scu),
256
+ &error_abort);
257
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
258
+ return;
259
+ }
260
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
261
+ sc->memmap[ASPEED_DEV_TIMER1]);
262
+ for (i = 0; i < ASPEED_TIMER_NR_TIMERS; i++) {
263
+ qemu_irq irq = aspeed_soc_get_irq(s, ASPEED_DEV_TIMER1 + i);
264
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->timerctrl), i, irq);
265
+ }
266
+
267
+ /* ADC */
268
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc), errp)) {
269
+ return;
270
+ }
271
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->adc), 0, sc->memmap[ASPEED_DEV_ADC]);
272
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->adc), 0,
273
+ aspeed_soc_get_irq(s, ASPEED_DEV_ADC));
274
+
275
+ /* FMC, The number of CS is set at the board level */
276
+ object_property_set_link(OBJECT(&s->fmc), "dram", OBJECT(&s->sram),
277
+ &error_abort);
278
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
279
+ return;
280
+ }
281
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_DEV_FMC]);
282
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 1,
283
+ ASPEED_SMC_GET_CLASS(&s->fmc)->flash_window_base);
284
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0,
285
+ aspeed_soc_get_irq(s, ASPEED_DEV_FMC));
286
+
287
+ /* SPI */
288
+ for (i = 0; i < sc->spis_num; i++) {
289
+ object_property_set_link(OBJECT(&s->spi[i]), "dram",
290
+ OBJECT(&s->sram), &error_abort);
291
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
292
+ return;
293
+ }
294
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
295
+ sc->memmap[ASPEED_DEV_SPI1 + i]);
296
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 1,
297
+ ASPEED_SMC_GET_CLASS(&s->spi[i])->flash_window_base);
298
+ }
299
+
300
+ /* Secure Boot Controller */
301
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sbc), errp)) {
302
+ return;
303
+ }
304
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->sbc), 0, sc->memmap[ASPEED_DEV_SBC]);
305
+
306
+ /* Watch dog */
307
+ for (i = 0; i < sc->wdts_num; i++) {
308
+ AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(&s->wdt[i]);
309
+
310
+ object_property_set_link(OBJECT(&s->wdt[i]), "scu", OBJECT(&s->scu),
311
+ &error_abort);
312
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
313
+ return;
314
+ }
315
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
316
+ sc->memmap[ASPEED_DEV_WDT] + i * awc->offset);
317
+ }
318
+}
319
+
320
+static void aspeed_soc_ast1030_class_init(ObjectClass *klass, void *data)
321
+{
322
+ DeviceClass *dc = DEVICE_CLASS(klass);
323
+ AspeedSoCClass *sc = ASPEED_SOC_CLASS(dc);
324
+
325
+ dc->realize = aspeed_soc_ast1030_realize;
326
+
327
+ sc->name = "ast1030-a1";
328
+ sc->cpu_type = ARM_CPU_TYPE_NAME("cortex-m4");
329
+ sc->silicon_rev = AST1030_A1_SILICON_REV;
330
+ sc->sram_size = 0xc0000;
331
+ sc->spis_num = 2;
332
+ sc->ehcis_num = 0;
333
+ sc->wdts_num = 4;
334
+ sc->macs_num = 1;
335
+ sc->irqmap = aspeed_soc_ast1030_irqmap;
336
+ sc->memmap = aspeed_soc_ast1030_memmap;
337
+ sc->num_cpus = 1;
338
+}
339
+
340
+static const TypeInfo aspeed_soc_ast1030_type_info = {
341
+ .name = "ast1030-a1",
342
+ .parent = TYPE_ASPEED_SOC,
343
+ .instance_size = sizeof(AspeedSoCState),
344
+ .instance_init = aspeed_soc_ast1030_init,
345
+ .class_init = aspeed_soc_ast1030_class_init,
346
+ .class_size = sizeof(AspeedSoCClass),
347
+};
348
+
349
+static void aspeed_soc_register_types(void)
350
+{
351
+ type_register_static(&aspeed_soc_ast1030_type_info);
352
+}
353
+
354
+type_init(aspeed_soc_register_types)
355
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
356
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
357
--- a/hw/arm/meson.build
98
--- a/tests/qtest/meson.build
358
+++ b/hw/arm/meson.build
99
+++ b/tests/qtest/meson.build
359
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal.c', 'xlnx-ver
100
@@ -XXX,XX +XXX,XX @@ qtests_aspeed = \
360
arm_ss.add(when: 'CONFIG_FSL_IMX25', if_true: files('fsl-imx25.c', 'imx25_pdk.c'))
101
'aspeed_smc-test',
361
arm_ss.add(when: 'CONFIG_FSL_IMX31', if_true: files('fsl-imx31.c', 'kzm.c'))
102
'aspeed_gpio-test']
362
arm_ss.add(when: 'CONFIG_FSL_IMX6', if_true: files('fsl-imx6.c'))
103
qtests_aspeed64 = \
363
-arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_soc.c', 'aspeed.c', 'aspeed_ast2600.c'))
104
- ['ast2700-gpio-test']
364
+arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
105
+ ['ast2700-gpio-test',
365
+ 'aspeed_soc.c',
106
+ 'ast2700-smc-test']
366
+ 'aspeed.c',
107
367
+ 'aspeed_ast2600.c',
108
qtests_stm32l4x5 = \
368
+ 'aspeed_ast10x0.c'))
109
['stm32l4x5_exti-test',
369
arm_ss.add(when: 'CONFIG_MPS2', if_true: files('mps2.c'))
110
@@ -XXX,XX +XXX,XX @@ qtests = {
370
arm_ss.add(when: 'CONFIG_MPS2', if_true: files('mps2-tz.c'))
111
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
371
arm_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-soc.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()
372
--
118
--
373
2.35.1
119
2.47.1
374
120
375
121
diff view generated by jsdifflib