1
The following changes since commit ae35f033b874c627d81d51070187fbf55f0bf1a7:
1
The following changes since commit bd2e12310b18b51aefbf834e6d54989fd175976f:
2
2
3
Update version for v9.2.0 release (2024-12-10 16:20:54 +0000)
3
Merge tag 'qga-pull-2024-01-30' of https://github.com/kostyanf14/qemu into staging (2024-01-30 15:53:46 +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-20241211
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20240201
8
8
9
for you to fetch changes up to 124f4dc0d832c1bf3a4513c05a2b93bac0a5fac0:
9
for you to fetch changes up to 649b8ed20543f1b7f7e3dd8fd409092639bb345e:
10
10
11
test/qtest/ast2700-smc-test: Support to test AST2700 (2024-12-11 07:25:53 +0100)
11
hw/fsi: Update MAINTAINER list (2024-02-01 08:33:18 +0100)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
aspeed queue:
14
aspeed queue:
15
15
16
* Removed tacoma-bmc machine
16
* Update of buildroot images to 2023.11 (6.6.3 kernel)
17
* Added support for SDHCI on AST2700 SoC
17
* Check of the valid CPU type supported by aspeed machines
18
* Improved functional tests
18
* Simplified models for the IBM's FSI bus and the Aspeed
19
* Extended SMC qtest to all Aspeed SoCs
19
controller bridge
20
20
21
Changes since v1:
22
23
- Endianness fix
24
- Renamed test file to match other filenames
25
- Fixed file list in MAINTAINER
26
21
----------------------------------------------------------------
27
----------------------------------------------------------------
22
Cédric Le Goater (8):
28
Cédric Le Goater (1):
23
arm: Remove tacoma-bmc machine
29
tests/avocado/machine_aspeed.py: Update buildroot images to 2023.11
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
31
30
32
Jamin Lin (16):
31
Ninad Palsule (11):
33
hw/sd/aspeed_sdhci: Fix coding style
32
hw/fsi: Introduce IBM's Local bus
34
hw/arm/aspeed: Fix coding style
33
hw/fsi: Introduce IBM's scratchpad device
35
hw:sdhci: Introduce a new "capareg" class member to set the different Capability Registers
34
hw/fsi: Introduce IBM's FSI Bus
36
hw/sd/aspeed_sdhci: Add AST2700 Support
35
hw/fsi: Introduce IBM's fsi-slave model
37
aspeed/soc: Support SDHCI for AST2700
36
hw/fsi: Introduce IBM's cfam
38
aspeed/soc: Support eMMC for AST2700
37
hw/fsi: Introduce IBM's FSI master
39
test/qtest/aspeed_smc-test: Move testcases to test_palmetto_bmc function
38
hw/fsi: Aspeed APB2OPB & On-chip peripheral bus
40
test/qtest/aspeed_smc-test: Introduce a new TestData to test different BMC SOCs
39
hw/arm: Hook up FSI module in AST2600
41
test/qtest/aspeed_smc-test: Support to test all CE pins
40
hw/fsi: Added qtest
42
test/qtest/aspeed_smc-test: Introducing a "page_addr" data field
41
hw/fsi: Added FSI documentation
43
test/qtest/aspeed_smc-test: Support to test AST2500
42
hw/fsi: Update MAINTAINER list
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
49
43
50
docs/about/deprecated.rst | 8 -
44
Philippe Mathieu-Daudé (5):
51
docs/about/removed-features.rst | 10 +
45
hw/arm/aspeed: Remove dead code
52
docs/system/arm/aspeed.rst | 1 -
46
hw/arm/aspeed: Set default CPU count using aspeed_soc_num_cpus()
53
include/hw/sd/aspeed_sdhci.h | 13 +-
47
hw/arm/aspeed: Init CPU defaults in a common helper
54
tests/qtest/aspeed-smc-utils.h | 95 ++++
48
hw/arm/aspeed: Introduce aspeed_soc_cpu_type() helper
55
hw/arm/aspeed.c | 28 -
49
hw/arm/aspeed: Check for CPU types in machine_run_board_init()
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
86
50
51
MAINTAINERS | 9 +
52
docs/specs/fsi.rst | 122 +++++++++++++
53
docs/specs/index.rst | 1 +
54
meson.build | 1 +
55
hw/fsi/trace.h | 1 +
56
include/hw/arm/aspeed_soc.h | 8 +-
57
include/hw/fsi/aspeed_apb2opb.h | 46 +++++
58
include/hw/fsi/cfam.h | 34 ++++
59
include/hw/fsi/fsi-master.h | 32 ++++
60
include/hw/fsi/fsi.h | 37 ++++
61
include/hw/fsi/lbus.h | 43 +++++
62
hw/arm/aspeed.c | 70 ++++----
63
hw/arm/aspeed_ast10x0.c | 8 +-
64
hw/arm/aspeed_ast2400.c | 15 +-
65
hw/arm/aspeed_ast2600.c | 28 ++-
66
hw/arm/aspeed_soc_common.c | 8 +
67
hw/fsi/aspeed_apb2opb.c | 367 ++++++++++++++++++++++++++++++++++++++++
68
hw/fsi/cfam.c | 168 ++++++++++++++++++
69
hw/fsi/fsi-master.c | 170 +++++++++++++++++++
70
hw/fsi/fsi.c | 102 +++++++++++
71
hw/fsi/lbus.c | 117 +++++++++++++
72
tests/qtest/aspeed_fsi-test.c | 205 ++++++++++++++++++++++
73
hw/Kconfig | 1 +
74
hw/arm/Kconfig | 1 +
75
hw/fsi/Kconfig | 7 +
76
hw/fsi/meson.build | 2 +
77
hw/fsi/trace-events | 13 ++
78
hw/meson.build | 1 +
79
tests/avocado/machine_aspeed.py | 18 +-
80
tests/qtest/meson.build | 1 +
81
30 files changed, 1578 insertions(+), 58 deletions(-)
82
create mode 100644 docs/specs/fsi.rst
83
create mode 100644 hw/fsi/trace.h
84
create mode 100644 include/hw/fsi/aspeed_apb2opb.h
85
create mode 100644 include/hw/fsi/cfam.h
86
create mode 100644 include/hw/fsi/fsi-master.h
87
create mode 100644 include/hw/fsi/fsi.h
88
create mode 100644 include/hw/fsi/lbus.h
89
create mode 100644 hw/fsi/aspeed_apb2opb.c
90
create mode 100644 hw/fsi/cfam.c
91
create mode 100644 hw/fsi/fsi-master.c
92
create mode 100644 hw/fsi/fsi.c
93
create mode 100644 hw/fsi/lbus.c
94
create mode 100644 tests/qtest/aspeed_fsi-test.c
95
create mode 100644 hw/fsi/Kconfig
96
create mode 100644 hw/fsi/meson.build
97
create mode 100644 hw/fsi/trace-events
87
98
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
Compared to mainline buildroot, these images have some customization :
2
2
3
Add test_ast1030_evb function and reused testcases for AST1030 testing.
3
- Linux version is bumped to 6.6.3 and built with a custom config
4
The base address, flash base address and ce index of fmc_cs0 are
4
- U-Boot is switched to the one provided by OpenBMC for more support
5
0x7E620000, 0x80000000 and 0, respectively.
5
- defconfigs extra tools for dev
6
The default flash model of fmc_cs0 is "w25q80bl" whose size is 1MB,
7
so set jedec_id 0xef4014.
8
6
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
See branch [1] for more details.
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
11
Link: https://lore.kernel.org/r/20241127091543.1243114-8-jamin_lin@aspeedtech.com
9
There are a few changes since last update, commit ed1f5ff84209. Images
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
10
all have a password now and I2C devices have been updated in the Linux
11
ast2600-evb device tree [2]. Do the necessary adjustements.
12
13
[1] https://github.com/legoater/buildroot/commits/aspeed-2023.11
14
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9deb10cf160e
15
16
Signed-off-by: Cédric Le Goater <clg@kaod.org>
13
---
17
---
14
tests/qtest/aspeed_smc-test.c | 42 +++++++++++++++++++++++++++++++++++
18
tests/avocado/machine_aspeed.py | 18 +++++++++---------
15
1 file changed, 42 insertions(+)
19
1 file changed, 9 insertions(+), 9 deletions(-)
16
20
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
21
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
18
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/qtest/aspeed_smc-test.c
23
--- a/tests/avocado/machine_aspeed.py
20
+++ b/tests/qtest/aspeed_smc-test.c
24
+++ b/tests/avocado/machine_aspeed.py
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
25
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'
22
qtest_add_data_func("/ast2600/smc/read_status_reg",
26
time.sleep(0.1)
23
data, test_read_status_reg);
27
exec_command(self, 'root')
24
}
28
time.sleep(0.1)
25
+
29
+ exec_command(self, "passw0rd")
26
+static void test_ast1030_evb(TestData *data)
30
27
+{
31
def do_test_arm_aspeed_buildroot_poweroff(self):
28
+ int ret;
32
exec_command_and_wait_for_pattern(self, 'poweroff',
29
+ int fd;
33
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2500_evb_buildroot(self):
30
+
34
"""
31
+ fd = g_file_open_tmp("qtest.m25p80.w25q80bl.XXXXXX",
35
32
+ &data->tmp_path, NULL);
36
image_url = ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
33
+ g_assert(fd >= 0);
37
- 'images/ast2500-evb/buildroot-2022.11-2-g15d3648df9/flash.img')
34
+ ret = ftruncate(fd, 1 * 1024 * 1024);
38
- image_hash = ('f96d11db521fe7a2787745e9e391225deeeec3318ee0fc07c8b799b8833dd474')
35
+ g_assert(ret == 0);
39
+ 'images/ast2500-evb/buildroot-2023.11/flash.img')
36
+ close(fd);
40
+ image_hash = ('c23db6160cf77d0258397eb2051162c8473a56c441417c52a91ba217186e715f')
37
+
41
image_path = self.fetch_asset(image_url, asset_hash=image_hash,
38
+ data->s = qtest_initf("-machine ast1030-evb "
42
algorithm='sha256')
39
+ "-drive file=%s,format=raw,if=mtd",
43
40
+ data->tmp_path);
44
self.vm.add_args('-device',
41
+
45
'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
42
+ /* fmc cs0 with w25q80bl flash */
46
- self.do_test_arm_aspeed_buildroot_start(image_path, '0x0')
43
+ data->flash_base = 0x80000000;
47
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0x0', 'Aspeed AST2500 EVB')
44
+ data->spi_base = 0x7E620000;
48
45
+ data->jedec_id = 0xef4014;
49
exec_command_and_wait_for_pattern(self,
46
+ data->cs = 0;
50
'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
47
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
51
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_buildroot(self):
48
+ /* beyond 512KB */
52
"""
49
+ data->page_addr = 0x800 * FLASH_PAGE_SIZE;
53
50
+
54
image_url = ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
51
+ qtest_add_data_func("/ast1030/smc/read_jedec", data, test_read_jedec);
55
- 'images/ast2600-evb/buildroot-2022.11-2-g15d3648df9/flash.img')
52
+ qtest_add_data_func("/ast1030/smc/erase_sector", data, test_erase_sector);
56
- image_hash = ('e598d86e5ea79671ca8b59212a326c911bc8bea728dec1a1f5390d717a28bb8b')
53
+ qtest_add_data_func("/ast1030/smc/erase_all", data, test_erase_all);
57
+ 'images/ast2600-evb/buildroot-2023.11/flash.img')
54
+ qtest_add_data_func("/ast1030/smc/write_page", data, test_write_page);
58
+ image_hash = ('b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
55
+ qtest_add_data_func("/ast1030/smc/read_page_mem",
59
image_path = self.fetch_asset(image_url, asset_hash=image_hash,
56
+ data, test_read_page_mem);
60
algorithm='sha256')
57
+ qtest_add_data_func("/ast1030/smc/write_page_mem",
61
58
+ data, test_write_page_mem);
62
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_buildroot(self):
59
+ qtest_add_data_func("/ast1030/smc/read_status_reg",
63
'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
60
+ data, test_read_status_reg);
64
self.vm.add_args('-device',
61
+}
65
'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
62
+
66
- self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00')
63
int main(int argc, char **argv)
67
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
64
{
68
65
TestData palmetto_data;
69
exec_command_and_wait_for_pattern(self,
66
TestData ast2500_evb_data;
70
'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
67
TestData ast2600_evb_data;
71
'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
68
+ TestData ast1030_evb_data;
72
exec_command_and_wait_for_pattern(self,
69
int ret;
73
- 'cat /sys/class/hwmon/hwmon0/temp1_input', '0')
70
74
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
71
g_test_init(&argc, &argv, NULL);
75
self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
72
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
76
property='temperature', value=18000);
73
test_palmetto_bmc(&palmetto_data);
77
exec_command_and_wait_for_pattern(self,
74
test_ast2500_evb(&ast2500_evb_data);
78
- 'cat /sys/class/hwmon/hwmon0/temp1_input', '18000')
75
test_ast2600_evb(&ast2600_evb_data);
79
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
76
+ test_ast1030_evb(&ast1030_evb_data);
80
77
ret = g_test_run();
81
exec_command_and_wait_for_pattern(self,
78
82
'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-3/device/new_device',
79
qtest_quit(palmetto_data.s);
83
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_buildroot_tpm(self):
80
qtest_quit(ast2500_evb_data.s);
84
self.vm.add_args('-device',
81
qtest_quit(ast2600_evb_data.s);
85
'tpm-tis-i2c,tpmdev=tpm0,bus=aspeed.i2c.bus.12,address=0x2e')
82
+ qtest_quit(ast1030_evb_data.s);
86
self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
83
unlink(palmetto_data.tmp_path);
87
- exec_command(self, "passw0rd")
84
unlink(ast2500_evb_data.tmp_path);
88
85
unlink(ast2600_evb_data.tmp_path);
89
exec_command_and_wait_for_pattern(self,
86
+ unlink(ast1030_evb_data.tmp_path);
90
'echo tpm_tis_i2c 0x2e > /sys/bus/i2c/devices/i2c-12/new_device',
87
return ret;
88
}
89
--
91
--
90
2.47.1
92
2.43.0
91
93
92
94
diff view generated by jsdifflib
1
Removal was scheduled for 10.0. Use the rainier-bmc machine or the
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
ast2600-evb as a replacement.
3
2
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Remove copy/paste typo from commit 6c323aba40 ("hw/arm/aspeed:
5
Link: https://lore.kernel.org/r/20241119071352.515790-1-clg@redhat.com
4
Adding new machine Tiogapass in QEMU").
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Gavin Shan <gshan@redhat.com>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
---
11
---
8
docs/about/deprecated.rst | 8 --------
12
hw/arm/aspeed.c | 1 -
9
docs/about/removed-features.rst | 10 ++++++++++
13
1 file changed, 1 deletion(-)
10
docs/system/arm/aspeed.rst | 1 -
11
hw/arm/aspeed.c | 28 ----------------------------
12
4 files changed, 10 insertions(+), 37 deletions(-)
13
14
14
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
15
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/about/deprecated.rst
17
+++ b/docs/about/deprecated.rst
18
@@ -XXX,XX +XXX,XX @@ images are not available, OpenWRT dropped support in 2019, U-Boot in
19
2017, Linux also is dropping support in 2024. It is time to let go of
20
this ancient hardware and focus on newer CPUs and platforms.
21
22
-Arm ``tacoma-bmc`` machine (since 9.1)
23
-''''''''''''''''''''''''''''''''''''''''
24
-
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
66
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
67
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/arm/aspeed.c
17
--- a/hw/arm/aspeed.c
69
+++ b/hw/arm/aspeed.c
18
+++ b/hw/arm/aspeed.c
70
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
71
#define AST2700_EVB_HW_STRAP2 0x00000003
20
mc->default_ram_size = 1 * GiB;
72
#endif
21
mc->default_cpus = mc->min_cpus = mc->max_cpus =
73
22
aspeed_soc_num_cpus(amc->soc_name);
74
-/* Tacoma hardware value */
23
- aspeed_soc_num_cpus(amc->soc_name);
75
-#define TACOMA_BMC_HW_STRAP1 0x00000000
76
-#define TACOMA_BMC_HW_STRAP2 0x00000040
77
-
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
81
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
82
aspeed_machine_ast2600_class_emmc_init(oc);
83
};
24
};
84
25
85
-static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
26
static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
86
-{
87
- MachineClass *mc = MACHINE_CLASS(oc);
88
- AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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,
119
--
27
--
120
2.47.1
28
2.43.0
121
29
122
30
diff view generated by jsdifflib
Deleted patch
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
1
3
Fix coding style issues from checkpatch.pl.
4
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
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>
9
---
10
hw/sd/aspeed_sdhci.c | 6 ++++--
11
1 file changed, 4 insertions(+), 2 deletions(-)
12
13
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/aspeed_sdhci.c
16
+++ b/hw/sd/aspeed_sdhci.c
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_write(void *opaque, hwaddr addr, uint64_t val,
18
sdhci->regs[TO_REG(addr)] = (uint32_t)val & ~ASPEED_SDHCI_INFO_RESET;
19
break;
20
case ASPEED_SDHCI_SDIO_140:
21
- sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg, 0, 32, val);
22
+ sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg,
23
+ 0, 32, val);
24
break;
25
case ASPEED_SDHCI_SDIO_144:
26
- sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg, 32, 32, val);
27
+ sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg,
28
+ 32, 32, val);
29
break;
30
case ASPEED_SDHCI_SDIO_148:
31
sdhci->slots[0].maxcurr = deposit64(sdhci->slots[0].maxcurr,
32
--
33
2.47.1
34
35
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Currently, these test cases only support to test CE0. To test all CE pins,
3
Since commit b7f1a0cb76 ("arm/aspeed: Compute the number
4
introduces new ce and node members in TestData structure. The ce member is used
4
of CPUs from the SoC definition") Aspeed machines use the
5
for saving the ce index and node member is used for saving the node path,
5
aspeed_soc_num_cpus() helper to set the number of CPUs.
6
respectively.
7
6
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Use it for the ast1030-evb (commit 356b230ed1 "aspeed/soc:
9
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Add AST1030 support") and supermicrox11-bmc (commit 40a38df55e
10
Link: https://lore.kernel.org/r/20241127091543.1243114-4-jamin_lin@aspeedtech.com
9
"hw/arm/aspeed: Add board model for Supermicro X11 BMC") machines.
11
Signed-off-by: Cédric Le Goater <clg@redhat.com>
10
11
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
12
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
Reviewed-by: Gavin Shan <gshan@redhat.com>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
---
15
---
13
tests/qtest/aspeed_smc-test.c | 77 ++++++++++++++++++-----------------
16
hw/arm/aspeed.c | 5 ++++-
14
1 file changed, 40 insertions(+), 37 deletions(-)
17
1 file changed, 4 insertions(+), 1 deletion(-)
15
18
16
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
19
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
17
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/qtest/aspeed_smc-test.c
21
--- a/hw/arm/aspeed.c
19
+++ b/tests/qtest/aspeed_smc-test.c
22
+++ b/hw/arm/aspeed.c
20
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
21
* ASPEED SPI Controller registers
24
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
22
*/
25
amc->i2c_init = palmetto_bmc_i2c_init;
23
#define R_CONF 0x00
26
mc->default_ram_size = 256 * MiB;
24
-#define CONF_ENABLE_W0 (1 << 16)
27
+ mc->default_cpus = mc->min_cpus = mc->max_cpus =
25
+#define CONF_ENABLE_W0 16
28
+ aspeed_soc_num_cpus(amc->soc_name);
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
}
29
}
55
30
56
static void spi_ctrl_start_user(const TestData *data)
31
static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
57
{
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
58
- uint32_t ctrl = spi_readl(data, R_CTRL0);
33
mc->init = aspeed_minibmc_machine_init;
59
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
34
amc->i2c_init = ast1030_evb_i2c_init;
60
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
35
mc->default_ram_size = 0;
61
36
- mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
62
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
37
amc->fmc_model = "sst25vf032b";
63
- spi_writel(data, R_CTRL0, ctrl);
38
amc->spi_model = "sst25vf032b";
64
+ spi_writel(data, ctrl_reg, ctrl);
39
amc->num_cs = 2;
65
40
amc->macs_mask = 0;
66
ctrl &= ~CTRL_CE_STOP_ACTIVE;
41
+ mc->default_cpus = mc->min_cpus = mc->max_cpus =
67
- spi_writel(data, R_CTRL0, ctrl);
42
+ aspeed_soc_num_cpus(amc->soc_name);
68
+ spi_writel(data, ctrl_reg, ctrl);
69
}
43
}
70
44
71
static void spi_ctrl_stop_user(const TestData *data)
45
static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
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
--
46
--
274
2.47.1
47
2.43.0
275
48
276
49
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Add test_ast2600_evb function and reused testcases for AST2600 testing.
3
Rework aspeed_soc_num_cpus() as a new init_cpus_defaults()
4
The spi base address, flash base address and ce index of fmc_cs0 are
4
helper to reduce code duplication.
5
0x1E620000, 0x20000000 and 0, respectively.
5
6
The default flash model of fmc_cs0 is "mx66u51235f" whose size is 64MB,
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
so set jedec_id 0xc2253a.
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
8
Reviewed-by: Gavin Shan <gshan@redhat.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-7-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
13
---
11
---
14
tests/qtest/aspeed_smc-test.c | 41 +++++++++++++++++++++++++++++++++++
12
hw/arm/aspeed.c | 71 +++++++++++++++++++------------------------------
15
1 file changed, 41 insertions(+)
13
1 file changed, 28 insertions(+), 43 deletions(-)
16
14
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/qtest/aspeed_smc-test.c
17
--- a/hw/arm/aspeed.c
20
+++ b/tests/qtest/aspeed_smc-test.c
18
+++ b/hw/arm/aspeed.c
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_class_props_init(ObjectClass *oc)
22
qtest_add_data_func("/ast2500/smc/read_status_reg",
20
"Change the SPI Flash model");
23
data, test_read_status_reg);
21
}
24
}
22
23
-static int aspeed_soc_num_cpus(const char *soc_name)
24
+static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
25
{
26
- AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
27
- return sc->num_cpus;
28
+ AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
29
+ AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
25
+
30
+
26
+static void test_ast2600_evb(TestData *data)
31
+ mc->default_cpus = sc->num_cpus;
27
+{
32
+ mc->min_cpus = sc->num_cpus;
28
+ int ret;
33
+ mc->max_cpus = sc->num_cpus;
29
+ int fd;
34
}
30
+
35
31
+ fd = g_file_open_tmp("qtest.m25p80.mx66u51235f.XXXXXX",
36
static void aspeed_machine_class_init(ObjectClass *oc, void *data)
32
+ &data->tmp_path, NULL);
37
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
33
+ g_assert(fd >= 0);
38
amc->num_cs = 1;
34
+ ret = ftruncate(fd, 64 * 1024 * 1024);
39
amc->i2c_init = palmetto_bmc_i2c_init;
35
+ g_assert(ret == 0);
40
mc->default_ram_size = 256 * MiB;
36
+ close(fd);
41
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
37
+
42
- aspeed_soc_num_cpus(amc->soc_name);
38
+ data->s = qtest_initf("-machine ast2600-evb "
43
+ aspeed_machine_class_init_cpus_defaults(mc);
39
+ "-drive file=%s,format=raw,if=mtd",
44
};
40
+ data->tmp_path);
45
41
+
46
static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
42
+ /* fmc cs0 with mx66u51235f flash */
47
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
43
+ data->flash_base = 0x20000000;
48
amc->num_cs = 1;
44
+ data->spi_base = 0x1E620000;
49
amc->i2c_init = quanta_q71l_bmc_i2c_init;
45
+ data->jedec_id = 0xc2253a;
50
mc->default_ram_size = 128 * MiB;
46
+ data->cs = 0;
51
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
47
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
52
- aspeed_soc_num_cpus(amc->soc_name);
48
+ /* beyond 16MB */
53
+ aspeed_machine_class_init_cpus_defaults(mc);
49
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
54
}
50
+
55
51
+ qtest_add_data_func("/ast2600/smc/read_jedec", data, test_read_jedec);
56
static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
52
+ qtest_add_data_func("/ast2600/smc/erase_sector", data, test_erase_sector);
57
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
53
+ qtest_add_data_func("/ast2600/smc/erase_all", data, test_erase_all);
58
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
54
+ qtest_add_data_func("/ast2600/smc/write_page", data, test_write_page);
59
amc->i2c_init = palmetto_bmc_i2c_init;
55
+ qtest_add_data_func("/ast2600/smc/read_page_mem",
60
mc->default_ram_size = 256 * MiB;
56
+ data, test_read_page_mem);
61
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
57
+ qtest_add_data_func("/ast2600/smc/write_page_mem",
62
- aspeed_soc_num_cpus(amc->soc_name);
58
+ data, test_write_page_mem);
63
+ aspeed_machine_class_init_cpus_defaults(mc);
59
+ qtest_add_data_func("/ast2600/smc/read_status_reg",
64
}
60
+ data, test_read_status_reg);
65
61
+}
66
static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
62
int main(int argc, char **argv)
67
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
63
{
68
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
64
TestData palmetto_data;
69
amc->i2c_init = palmetto_bmc_i2c_init;
65
TestData ast2500_evb_data;
70
mc->default_ram_size = 512 * MiB;
66
+ TestData ast2600_evb_data;
71
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
67
int ret;
72
- aspeed_soc_num_cpus(amc->soc_name);
68
73
+ aspeed_machine_class_init_cpus_defaults(mc);
69
g_test_init(&argc, &argv, NULL);
74
}
70
75
71
test_palmetto_bmc(&palmetto_data);
76
static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
72
test_ast2500_evb(&ast2500_evb_data);
77
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
73
+ test_ast2600_evb(&ast2600_evb_data);
78
amc->num_cs = 1;
74
ret = g_test_run();
79
amc->i2c_init = ast2500_evb_i2c_init;
75
80
mc->default_ram_size = 512 * MiB;
76
qtest_quit(palmetto_data.s);
81
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
77
qtest_quit(ast2500_evb_data.s);
82
- aspeed_soc_num_cpus(amc->soc_name);
78
+ qtest_quit(ast2600_evb_data.s);
83
+ aspeed_machine_class_init_cpus_defaults(mc);
79
unlink(palmetto_data.tmp_path);
84
};
80
unlink(ast2500_evb_data.tmp_path);
85
81
+ unlink(ast2600_evb_data.tmp_path);
86
static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
82
return ret;
87
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
83
}
88
amc->num_cs = 2;
89
amc->i2c_init = yosemitev2_bmc_i2c_init;
90
mc->default_ram_size = 512 * MiB;
91
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
92
- aspeed_soc_num_cpus(amc->soc_name);
93
+ aspeed_machine_class_init_cpus_defaults(mc);
94
};
95
96
static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
97
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
98
amc->num_cs = 2;
99
amc->i2c_init = romulus_bmc_i2c_init;
100
mc->default_ram_size = 512 * MiB;
101
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
102
- aspeed_soc_num_cpus(amc->soc_name);
103
+ aspeed_machine_class_init_cpus_defaults(mc);
104
};
105
106
static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
107
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
108
amc->num_cs = 2;
109
amc->i2c_init = tiogapass_bmc_i2c_init;
110
mc->default_ram_size = 1 * GiB;
111
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
112
- aspeed_soc_num_cpus(amc->soc_name);
113
+ aspeed_machine_class_init_cpus_defaults(mc);
114
};
115
116
static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
117
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
118
amc->num_cs = 2;
119
amc->i2c_init = sonorapass_bmc_i2c_init;
120
mc->default_ram_size = 512 * MiB;
121
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
122
- aspeed_soc_num_cpus(amc->soc_name);
123
+ aspeed_machine_class_init_cpus_defaults(mc);
124
};
125
126
static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
127
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
128
amc->num_cs = 2;
129
amc->i2c_init = witherspoon_bmc_i2c_init;
130
mc->default_ram_size = 512 * MiB;
131
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
132
- aspeed_soc_num_cpus(amc->soc_name);
133
+ aspeed_machine_class_init_cpus_defaults(mc);
134
};
135
136
static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
137
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
138
ASPEED_MAC3_ON;
139
amc->i2c_init = ast2600_evb_i2c_init;
140
mc->default_ram_size = 1 * GiB;
141
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
142
- aspeed_soc_num_cpus(amc->soc_name);
143
+ aspeed_machine_class_init_cpus_defaults(mc);
144
};
145
146
static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
147
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
148
amc->macs_mask = ASPEED_MAC2_ON;
149
amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */
150
mc->default_ram_size = 1 * GiB;
151
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
152
- aspeed_soc_num_cpus(amc->soc_name);
153
+ aspeed_machine_class_init_cpus_defaults(mc);
154
};
155
156
static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
157
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
158
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
159
amc->i2c_init = g220a_bmc_i2c_init;
160
mc->default_ram_size = 1024 * MiB;
161
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
162
- aspeed_soc_num_cpus(amc->soc_name);
163
+ aspeed_machine_class_init_cpus_defaults(mc);
164
};
165
166
static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
167
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
168
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
169
amc->i2c_init = fp5280g2_bmc_i2c_init;
170
mc->default_ram_size = 512 * MiB;
171
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
172
- aspeed_soc_num_cpus(amc->soc_name);
173
+ aspeed_machine_class_init_cpus_defaults(mc);
174
};
175
176
static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
177
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
178
amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
179
amc->i2c_init = rainier_bmc_i2c_init;
180
mc->default_ram_size = 1 * GiB;
181
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
182
- aspeed_soc_num_cpus(amc->soc_name);
183
+ aspeed_machine_class_init_cpus_defaults(mc);
184
};
185
186
#define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
187
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
188
amc->i2c_init = fuji_bmc_i2c_init;
189
amc->uart_default = ASPEED_DEV_UART1;
190
mc->default_ram_size = FUJI_BMC_RAM_SIZE;
191
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
192
- aspeed_soc_num_cpus(amc->soc_name);
193
+ aspeed_machine_class_init_cpus_defaults(mc);
194
};
195
196
#define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
197
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
198
amc->macs_mask = ASPEED_MAC2_ON;
199
amc->i2c_init = bletchley_bmc_i2c_init;
200
mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
201
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
202
- aspeed_soc_num_cpus(amc->soc_name);
203
+ aspeed_machine_class_init_cpus_defaults(mc);
204
}
205
206
static void fby35_reset(MachineState *state, ShutdownCause reason)
207
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
208
amc->i2c_init = fby35_i2c_init;
209
/* FIXME: Replace this macro with something more general */
210
mc->default_ram_size = FUJI_BMC_RAM_SIZE;
211
+ aspeed_machine_class_init_cpus_defaults(mc);
212
}
213
214
#define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
215
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
216
amc->spi_model = "sst25vf032b";
217
amc->num_cs = 2;
218
amc->macs_mask = 0;
219
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
220
- aspeed_soc_num_cpus(amc->soc_name);
221
+ aspeed_machine_class_init_cpus_defaults(mc);
222
}
223
224
static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
225
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
226
amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
227
amc->i2c_init = qcom_dc_scm_bmc_i2c_init;
228
mc->default_ram_size = 1 * GiB;
229
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
230
- aspeed_soc_num_cpus(amc->soc_name);
231
+ aspeed_machine_class_init_cpus_defaults(mc);
232
};
233
234
static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
235
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
236
amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
237
amc->i2c_init = qcom_dc_scm_firework_i2c_init;
238
mc->default_ram_size = 1 * GiB;
239
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
240
- aspeed_soc_num_cpus(amc->soc_name);
241
+ aspeed_machine_class_init_cpus_defaults(mc);
242
};
243
244
static const TypeInfo aspeed_machine_types[] = {
84
--
245
--
85
2.47.1
246
2.43.0
86
247
87
248
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Currently, it set the hardcode value of capability registers to all ASPEED SOCs
3
In order to alter AspeedSoCClass::cpu_type in the next
4
However, the value of capability registers should be different for all ASPEED
4
commit, introduce the aspeed_soc_cpu_type() helper to
5
SOCs. For example: the bit 28 of the Capability Register 1 should be 1 for
5
retrieve the per-SoC CPU type from AspeedSoCClass.
6
64-bits System Bus support for AST2700.
7
6
8
Introduce a new "capareg" class member whose data type is uint_64 to set the
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
different Capability Registers to all ASPEED SOCs.
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Gavin Shan <gshan@redhat.com>
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
---
13
include/hw/arm/aspeed_soc.h | 1 +
14
hw/arm/aspeed_ast10x0.c | 2 +-
15
hw/arm/aspeed_ast2400.c | 3 ++-
16
hw/arm/aspeed_ast2600.c | 3 ++-
17
hw/arm/aspeed_soc_common.c | 5 +++++
18
5 files changed, 11 insertions(+), 3 deletions(-)
10
19
11
The value of Capability Register is "0x0000000001e80080" for AST2400 and
20
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
12
AST2500. The value of Capability Register is "0x0000000701f80080" for AST2600.
13
14
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
15
Reviewed-by: Cédric Le Goater <clg@redhat.com>
16
Link: https://lore.kernel.org/r/20241204084453.610660-4-jamin_lin@aspeedtech.com
17
Signed-off-by: Cédric Le Goater <clg@redhat.com>
18
---
19
include/hw/sd/aspeed_sdhci.h | 12 +++++++--
20
hw/arm/aspeed_ast2400.c | 3 ++-
21
hw/arm/aspeed_ast2600.c | 7 +++---
22
hw/sd/aspeed_sdhci.c | 47 +++++++++++++++++++++++++++++++++++-
23
4 files changed, 61 insertions(+), 8 deletions(-)
24
25
diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
26
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
27
--- a/include/hw/sd/aspeed_sdhci.h
22
--- a/include/hw/arm/aspeed_soc.h
28
+++ b/include/hw/sd/aspeed_sdhci.h
23
+++ b/include/hw/arm/aspeed_soc.h
29
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCClass {
30
#include "qom/object.h"
25
qemu_irq (*get_irq)(AspeedSoCState *s, int dev);
31
32
#define TYPE_ASPEED_SDHCI "aspeed.sdhci"
33
-OBJECT_DECLARE_SIMPLE_TYPE(AspeedSDHCIState, ASPEED_SDHCI)
34
+#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
35
+#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
36
+#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
37
+OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
38
39
-#define ASPEED_SDHCI_CAPABILITIES 0x01E80080
40
#define ASPEED_SDHCI_NUM_SLOTS 2
41
#define ASPEED_SDHCI_NUM_REGS (ASPEED_SDHCI_REG_SIZE / sizeof(uint32_t))
42
#define ASPEED_SDHCI_REG_SIZE 0x100
43
@@ -XXX,XX +XXX,XX @@ struct AspeedSDHCIState {
44
uint32_t regs[ASPEED_SDHCI_NUM_REGS];
45
};
26
};
46
27
47
+struct AspeedSDHCIClass {
28
+const char *aspeed_soc_cpu_type(AspeedSoCClass *sc);
48
+ SysBusDeviceClass parent_class;
29
49
+
30
enum {
50
+ uint64_t capareg;
31
ASPEED_DEV_SPI_BOOT,
51
+};
32
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
52
+
33
index XXXXXXX..XXXXXXX 100644
53
#endif /* ASPEED_SDHCI_H */
34
--- a/hw/arm/aspeed_ast10x0.c
35
+++ b/hw/arm/aspeed_ast10x0.c
36
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
37
/* AST1030 CPU Core */
38
armv7m = DEVICE(&a->armv7m);
39
qdev_prop_set_uint32(armv7m, "num-irq", 256);
40
- qdev_prop_set_string(armv7m, "cpu-type", sc->cpu_type);
41
+ qdev_prop_set_string(armv7m, "cpu-type", aspeed_soc_cpu_type(sc));
42
qdev_connect_clock_in(armv7m, "cpuclk", s->sysclk);
43
object_property_set_link(OBJECT(&a->armv7m), "memory",
44
OBJECT(s->memory), &error_abort);
54
diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
45
diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
55
index XXXXXXX..XXXXXXX 100644
46
index XXXXXXX..XXXXXXX 100644
56
--- a/hw/arm/aspeed_ast2400.c
47
--- a/hw/arm/aspeed_ast2400.c
57
+++ b/hw/arm/aspeed_ast2400.c
48
+++ b/hw/arm/aspeed_ast2400.c
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
49
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
59
snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname);
50
}
60
object_initialize_child(obj, "gpio", &s->gpio, typename);
51
61
52
for (i = 0; i < sc->num_cpus; i++) {
62
- object_initialize_child(obj, "sdc", &s->sdhci, TYPE_ASPEED_SDHCI);
53
- object_initialize_child(obj, "cpu[*]", &a->cpu[i], sc->cpu_type);
63
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
54
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i],
64
+ object_initialize_child(obj, "sdc", &s->sdhci, typename);
55
+ aspeed_soc_cpu_type(sc));
65
56
}
66
object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
57
67
58
snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
68
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
59
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
69
index XXXXXXX..XXXXXXX 100644
60
index XXXXXXX..XXXXXXX 100644
70
--- a/hw/arm/aspeed_ast2600.c
61
--- a/hw/arm/aspeed_ast2600.c
71
+++ b/hw/arm/aspeed_ast2600.c
62
+++ b/hw/arm/aspeed_ast2600.c
72
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
63
@@ -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
}
64
}
86
65
87
- object_initialize_child(obj, "emmc-controller", &s->emmc,
66
for (i = 0; i < sc->num_cpus; i++) {
88
- TYPE_ASPEED_SDHCI);
67
- object_initialize_child(obj, "cpu[*]", &a->cpu[i], sc->cpu_type);
89
+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
68
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i],
90
69
+ aspeed_soc_cpu_type(sc));
91
object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
70
}
92
71
93
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
72
snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
73
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
94
index XXXXXXX..XXXXXXX 100644
74
index XXXXXXX..XXXXXXX 100644
95
--- a/hw/sd/aspeed_sdhci.c
75
--- a/hw/arm/aspeed_soc_common.c
96
+++ b/hw/sd/aspeed_sdhci.c
76
+++ b/hw/arm/aspeed_soc_common.c
97
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
77
@@ -XXX,XX +XXX,XX @@
98
{
78
#include "hw/char/serial.h"
99
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
79
100
AspeedSDHCIState *sdhci = ASPEED_SDHCI(dev);
80
101
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_GET_CLASS(sdhci);
81
+const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
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);
116
}
117
118
+static void aspeed_2400_sdhci_class_init(ObjectClass *klass, void *data)
119
+{
82
+{
120
+ DeviceClass *dc = DEVICE_CLASS(klass);
83
+ return sc->cpu_type;
121
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
122
+
123
+ dc->desc = "ASPEED 2400 SDHCI Controller";
124
+ asc->capareg = 0x0000000001e80080;
125
+}
84
+}
126
+
85
+
127
+static void aspeed_2500_sdhci_class_init(ObjectClass *klass, void *data)
86
qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
128
+{
87
{
129
+ DeviceClass *dc = DEVICE_CLASS(klass);
88
return ASPEED_SOC_GET_CLASS(s)->get_irq(s, dev);
130
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
131
+
132
+ dc->desc = "ASPEED 2500 SDHCI Controller";
133
+ asc->capareg = 0x0000000001e80080;
134
+}
135
+
136
+static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
137
+{
138
+ DeviceClass *dc = DEVICE_CLASS(klass);
139
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
140
+
141
+ dc->desc = "ASPEED 2600 SDHCI Controller";
142
+ asc->capareg = 0x0000000701f80080;
143
+}
144
+
145
static const TypeInfo aspeed_sdhci_types[] = {
146
{
147
.name = TYPE_ASPEED_SDHCI,
148
.parent = TYPE_SYS_BUS_DEVICE,
149
.instance_size = sizeof(AspeedSDHCIState),
150
.class_init = aspeed_sdhci_class_init,
151
+ .class_size = sizeof(AspeedSDHCIClass),
152
+ .abstract = true,
153
+ },
154
+ {
155
+ .name = TYPE_ASPEED_2400_SDHCI,
156
+ .parent = TYPE_ASPEED_SDHCI,
157
+ .class_init = aspeed_2400_sdhci_class_init,
158
+ },
159
+ {
160
+ .name = TYPE_ASPEED_2500_SDHCI,
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
171
--
89
--
172
2.47.1
90
2.43.0
173
91
174
92
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Fix coding style issues from checkpatch.pl.
3
Aspeed SoCs use a single CPU type (set as AspeedSoCClass::cpu_type).
4
Convert it to a NULL-terminated array (of a single non-NULL element).
4
5
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Set MachineClass::valid_cpu_types[] to use the common machine code
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
to provide hints when the requested CPU is invalid (see commit
7
Link: https://lore.kernel.org/r/20241204084453.610660-3-jamin_lin@aspeedtech.com
8
e702cbc19e ("machine: Improve is_cpu_type_supported()").
8
Signed-off-by: Cédric Le Goater <clg@redhat.com>
9
10
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Gavin Shan <gshan@redhat.com>
13
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
15
---
10
hw/arm/aspeed_ast2600.c | 3 ++-
16
include/hw/arm/aspeed_soc.h | 3 ++-
11
1 file changed, 2 insertions(+), 1 deletion(-)
17
hw/arm/aspeed.c | 1 +
18
hw/arm/aspeed_ast10x0.c | 6 +++++-
19
hw/arm/aspeed_ast2400.c | 12 ++++++++++--
20
hw/arm/aspeed_ast2600.c | 6 +++++-
21
hw/arm/aspeed_soc_common.c | 5 ++++-
22
6 files changed, 27 insertions(+), 6 deletions(-)
12
23
24
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
25
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/arm/aspeed_soc.h
27
+++ b/include/hw/arm/aspeed_soc.h
28
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCClass {
29
DeviceClass parent_class;
30
31
const char *name;
32
- const char *cpu_type;
33
+ /** valid_cpu_types: NULL terminated array of a single CPU type. */
34
+ const char * const *valid_cpu_types;
35
uint32_t silicon_rev;
36
uint64_t sram_size;
37
uint64_t secsram_size;
38
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/arm/aspeed.c
41
+++ b/hw/arm/aspeed.c
42
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
43
mc->default_cpus = sc->num_cpus;
44
mc->min_cpus = sc->num_cpus;
45
mc->max_cpus = sc->num_cpus;
46
+ mc->valid_cpu_types = sc->valid_cpu_types;
47
}
48
49
static void aspeed_machine_class_init(ObjectClass *oc, void *data)
50
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/aspeed_ast10x0.c
53
+++ b/hw/arm/aspeed_ast10x0.c
54
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
55
56
static void aspeed_soc_ast1030_class_init(ObjectClass *klass, void *data)
57
{
58
+ static const char * const valid_cpu_types[] = {
59
+ ARM_CPU_TYPE_NAME("cortex-m4"), /* TODO cortex-m4f */
60
+ NULL
61
+ };
62
DeviceClass *dc = DEVICE_CLASS(klass);
63
AspeedSoCClass *sc = ASPEED_SOC_CLASS(dc);
64
65
dc->realize = aspeed_soc_ast1030_realize;
66
67
sc->name = "ast1030-a1";
68
- sc->cpu_type = ARM_CPU_TYPE_NAME("cortex-m4"); /* TODO cortex-m4f */
69
+ sc->valid_cpu_types = valid_cpu_types;
70
sc->silicon_rev = AST1030_A1_SILICON_REV;
71
sc->sram_size = 0xc0000;
72
sc->secsram_size = 0x40000; /* 256 * KiB */
73
diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/hw/arm/aspeed_ast2400.c
76
+++ b/hw/arm/aspeed_ast2400.c
77
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
78
79
static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
80
{
81
+ static const char * const valid_cpu_types[] = {
82
+ ARM_CPU_TYPE_NAME("arm926"),
83
+ NULL
84
+ };
85
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
86
DeviceClass *dc = DEVICE_CLASS(oc);
87
88
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
89
dc->user_creatable = false;
90
91
sc->name = "ast2400-a1";
92
- sc->cpu_type = ARM_CPU_TYPE_NAME("arm926");
93
+ sc->valid_cpu_types = valid_cpu_types;
94
sc->silicon_rev = AST2400_A1_SILICON_REV;
95
sc->sram_size = 0x8000;
96
sc->spis_num = 1;
97
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
98
99
static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
100
{
101
+ static const char * const valid_cpu_types[] = {
102
+ ARM_CPU_TYPE_NAME("arm1176"),
103
+ NULL
104
+ };
105
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
106
DeviceClass *dc = DEVICE_CLASS(oc);
107
108
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
109
dc->user_creatable = false;
110
111
sc->name = "ast2500-a1";
112
- sc->cpu_type = ARM_CPU_TYPE_NAME("arm1176");
113
+ sc->valid_cpu_types = valid_cpu_types;
114
sc->silicon_rev = AST2500_A1_SILICON_REV;
115
sc->sram_size = 0x9000;
116
sc->spis_num = 2;
13
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
117
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
14
index XXXXXXX..XXXXXXX 100644
118
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/aspeed_ast2600.c
119
--- a/hw/arm/aspeed_ast2600.c
16
+++ b/hw/arm/aspeed_ast2600.c
120
+++ b/hw/arm/aspeed_ast2600.c
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
121
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
18
if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
122
19
return;
123
static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
20
}
124
{
21
- aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_DEV_GPIO]);
125
+ static const char * const valid_cpu_types[] = {
22
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0,
126
+ ARM_CPU_TYPE_NAME("cortex-a7"),
23
+ sc->memmap[ASPEED_DEV_GPIO]);
127
+ NULL
24
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
128
+ };
25
aspeed_soc_get_irq(s, ASPEED_DEV_GPIO));
129
DeviceClass *dc = DEVICE_CLASS(oc);
26
130
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
131
132
dc->realize = aspeed_soc_ast2600_realize;
133
134
sc->name = "ast2600-a3";
135
- sc->cpu_type = ARM_CPU_TYPE_NAME("cortex-a7");
136
+ sc->valid_cpu_types = valid_cpu_types;
137
sc->silicon_rev = AST2600_A3_SILICON_REV;
138
sc->sram_size = 0x16400;
139
sc->spis_num = 2;
140
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
141
index XXXXXXX..XXXXXXX 100644
142
--- a/hw/arm/aspeed_soc_common.c
143
+++ b/hw/arm/aspeed_soc_common.c
144
@@ -XXX,XX +XXX,XX @@
145
146
const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
147
{
148
- return sc->cpu_type;
149
+ assert(sc->valid_cpu_types);
150
+ assert(sc->valid_cpu_types[0]);
151
+ assert(!sc->valid_cpu_types[1]);
152
+ return sc->valid_cpu_types[0];
153
}
154
155
qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
27
--
156
--
28
2.47.1
157
2.43.0
29
158
30
159
diff view generated by jsdifflib
Deleted patch
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
1
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".
5
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Link: https://lore.kernel.org/r/20241204084453.610660-5-jamin_lin@aspeedtech.com
9
Signed-off-by: Cédric Le Goater <clg@redhat.com>
10
---
11
include/hw/sd/aspeed_sdhci.h | 1 +
12
hw/sd/aspeed_sdhci.c | 14 ++++++++++++++
13
2 files changed, 15 insertions(+)
14
15
diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/sd/aspeed_sdhci.h
18
+++ b/include/hw/sd/aspeed_sdhci.h
19
@@ -XXX,XX +XXX,XX @@
20
#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
21
#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
22
#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
23
+#define TYPE_ASPEED_2700_SDHCI TYPE_ASPEED_SDHCI "-ast2700"
24
OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
25
26
#define ASPEED_SDHCI_NUM_SLOTS 2
27
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/sd/aspeed_sdhci.c
30
+++ b/hw/sd/aspeed_sdhci.c
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
32
asc->capareg = 0x0000000701f80080;
33
}
34
35
+static void aspeed_2700_sdhci_class_init(ObjectClass *klass, void *data)
36
+{
37
+ DeviceClass *dc = DEVICE_CLASS(klass);
38
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
39
+
40
+ dc->desc = "ASPEED 2700 SDHCI Controller";
41
+ asc->capareg = 0x0000000719f80080;
42
+}
43
+
44
static const TypeInfo aspeed_sdhci_types[] = {
45
{
46
.name = TYPE_ASPEED_SDHCI,
47
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_sdhci_types[] = {
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
+ },
56
};
57
58
DEFINE_TYPES(aspeed_sdhci_types)
59
--
60
2.47.1
61
62
diff view generated by jsdifflib
1
This moves the ast2500-evb tests to a new test file and extends the
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
aspeed module with routines used to run the buildroot and sdk
3
tests. No changes in the test.
4
2
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
3
This is a part of patchset where IBM's Flexible Service Interface is
6
Link: https://lore.kernel.org/r/20241206131132.520911-5-clg@redhat.com
4
introduced.
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
5
6
The LBUS is modelled to maintain mapped memory for the devices. The
7
memory is mapped after CFAM config, peek table and FSI slave registers.
8
9
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
10
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
[ clg: - removed lbus_add_device() bc unused
13
- removed lbus_create_device() bc used only once
14
- removed "address" property
15
- updated meson.build to build fsi dir
16
- included an empty hw/fsi/trace-events ]
17
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
18
---
9
tests/functional/aspeed.py | 33 ++++++++++++
19
meson.build | 1 +
10
tests/functional/meson.build | 2 +
20
hw/fsi/trace.h | 1 +
11
tests/functional/test_arm_aspeed.py | 44 ---------------
21
include/hw/fsi/lbus.h | 32 ++++++++++++++++++++++++++++++++
12
tests/functional/test_arm_aspeed_ast2500.py | 59 +++++++++++++++++++++
22
hw/fsi/lbus.c | 43 +++++++++++++++++++++++++++++++++++++++++++
13
4 files changed, 94 insertions(+), 44 deletions(-)
23
hw/Kconfig | 1 +
14
create mode 100644 tests/functional/test_arm_aspeed_ast2500.py
24
hw/fsi/Kconfig | 2 ++
25
hw/fsi/meson.build | 1 +
26
hw/fsi/trace-events | 0
27
hw/meson.build | 1 +
28
9 files changed, 82 insertions(+)
29
create mode 100644 hw/fsi/trace.h
30
create mode 100644 include/hw/fsi/lbus.h
31
create mode 100644 hw/fsi/lbus.c
32
create mode 100644 hw/fsi/Kconfig
33
create mode 100644 hw/fsi/meson.build
34
create mode 100644 hw/fsi/trace-events
15
35
16
diff --git a/tests/functional/aspeed.py b/tests/functional/aspeed.py
36
diff --git a/meson.build b/meson.build
17
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/functional/aspeed.py
38
--- a/meson.build
19
+++ b/tests/functional/aspeed.py
39
+++ b/meson.build
20
@@ -XXX,XX +XXX,XX @@
40
@@ -XXX,XX +XXX,XX @@ if have_system
21
#
41
'hw/char',
22
# SPDX-License-Identifier: GPL-2.0-or-later
42
'hw/display',
23
43
'hw/dma',
24
+from qemu_test import exec_command_and_wait_for_pattern
44
+ 'hw/fsi',
25
from qemu_test import LinuxKernelTest
45
'hw/hyperv',
26
46
'hw/i2c',
27
class AspeedTest(LinuxKernelTest):
47
'hw/i386',
28
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed(self, machine, image):
48
diff --git a/hw/fsi/trace.h b/hw/fsi/trace.h
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
49
new file mode 100644
148
index XXXXXXX..XXXXXXX
50
index XXXXXXX..XXXXXXX
149
--- /dev/null
51
--- /dev/null
150
+++ b/tests/functional/test_arm_aspeed_ast2500.py
52
+++ b/hw/fsi/trace.h
53
@@ -0,0 +1 @@
54
+#include "trace/trace-hw_fsi.h"
55
diff --git a/include/hw/fsi/lbus.h b/include/hw/fsi/lbus.h
56
new file mode 100644
57
index XXXXXXX..XXXXXXX
58
--- /dev/null
59
+++ b/include/hw/fsi/lbus.h
151
@@ -XXX,XX +XXX,XX @@
60
@@ -XXX,XX +XXX,XX @@
152
+#!/usr/bin/env python3
61
+/*
153
+#
62
+ * SPDX-License-Identifier: GPL-2.0-or-later
154
+# Functional test that boots the ASPEED machines
63
+ * Copyright (C) 2024 IBM Corp.
155
+#
64
+ *
156
+# SPDX-License-Identifier: GPL-2.0-or-later
65
+ * IBM Local bus and connected device structures.
66
+ */
67
+#ifndef FSI_LBUS_H
68
+#define FSI_LBUS_H
157
+
69
+
158
+from qemu_test import Asset
70
+#include "hw/qdev-core.h"
159
+from aspeed import AspeedTest
71
+#include "qemu/units.h"
160
+from qemu_test import exec_command_and_wait_for_pattern
72
+#include "exec/memory.h"
161
+from qemu_test.utils import archive_extract
162
+
73
+
163
+class AST2500Machine(AspeedTest):
74
+#define TYPE_FSI_LBUS_DEVICE "fsi.lbus.device"
75
+OBJECT_DECLARE_SIMPLE_TYPE(FSILBusDevice, FSI_LBUS_DEVICE)
164
+
76
+
165
+ ASSET_BR2_202311_AST2500_FLASH = Asset(
77
+typedef struct FSILBusDevice {
166
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
78
+ DeviceState parent;
167
+ 'images/ast2500-evb/buildroot-2023.11/flash.img'),
168
+ 'c23db6160cf77d0258397eb2051162c8473a56c441417c52a91ba217186e715f')
169
+
79
+
170
+ def test_arm_ast2500_evb_buildroot(self):
80
+ MemoryRegion iomem;
171
+ self.set_machine('ast2500-evb')
81
+} FSILBusDevice;
172
+
82
+
173
+ image_path = self.ASSET_BR2_202311_AST2500_FLASH.fetch()
83
+#define TYPE_FSI_LBUS "fsi.lbus"
84
+OBJECT_DECLARE_SIMPLE_TYPE(FSILBus, FSI_LBUS)
174
+
85
+
175
+ self.vm.add_args('-device',
86
+typedef struct FSILBus {
176
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
87
+ BusState bus;
177
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0x0',
178
+ 'ast2500-evb login:')
179
+
88
+
180
+ exec_command_and_wait_for_pattern(self,
89
+ MemoryRegion mr;
181
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
90
+} FSILBus;
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
+
91
+
190
+ self.do_test_arm_aspeed_buildroot_poweroff()
92
+#endif /* FSI_LBUS_H */
93
diff --git a/hw/fsi/lbus.c b/hw/fsi/lbus.c
94
new file mode 100644
95
index XXXXXXX..XXXXXXX
96
--- /dev/null
97
+++ b/hw/fsi/lbus.c
98
@@ -XXX,XX +XXX,XX @@
99
+/*
100
+ * SPDX-License-Identifier: GPL-2.0-or-later
101
+ * Copyright (C) 2024 IBM Corp.
102
+ *
103
+ * IBM Local bus where FSI slaves are connected
104
+ */
191
+
105
+
192
+ ASSET_SDK_V806_AST2500 = Asset(
106
+#include "qemu/osdep.h"
193
+ 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2500-default-obmc.tar.gz',
107
+#include "qapi/error.h"
194
+ 'e1755f3cadff69190438c688d52dd0f0d399b70a1e14b1d3d5540fc4851d38ca')
108
+#include "hw/fsi/lbus.h"
195
+
109
+
196
+ def test_arm_ast2500_evb_sdk(self):
110
+#include "hw/qdev-properties.h"
197
+ self.set_machine('ast2500-evb')
198
+
111
+
199
+ image_path = self.ASSET_SDK_V806_AST2500.fetch()
112
+#include "trace.h"
200
+
113
+
201
+ archive_extract(image_path, self.workdir)
114
+static void fsi_lbus_init(Object *o)
115
+{
116
+ FSILBus *lbus = FSI_LBUS(o);
202
+
117
+
203
+ self.do_test_arm_aspeed_sdk_start(
118
+ memory_region_init(&lbus->mr, OBJECT(lbus), TYPE_FSI_LBUS, 1 * MiB);
204
+ self.workdir + '/ast2500-default/image-bmc')
119
+}
205
+
120
+
206
+ self.wait_for_console_pattern('ast2500-default login:')
121
+static const TypeInfo fsi_lbus_info = {
122
+ .name = TYPE_FSI_LBUS,
123
+ .parent = TYPE_BUS,
124
+ .instance_init = fsi_lbus_init,
125
+ .instance_size = sizeof(FSILBus),
126
+};
207
+
127
+
128
+static const TypeInfo fsi_lbus_device_type_info = {
129
+ .name = TYPE_FSI_LBUS_DEVICE,
130
+ .parent = TYPE_DEVICE,
131
+ .instance_size = sizeof(FSILBusDevice),
132
+ .abstract = true,
133
+};
208
+
134
+
209
+if __name__ == '__main__':
135
+static void fsi_lbus_register_types(void)
210
+ AspeedTest.main()
136
+{
137
+ type_register_static(&fsi_lbus_info);
138
+ type_register_static(&fsi_lbus_device_type_info);
139
+}
140
+
141
+type_init(fsi_lbus_register_types);
142
diff --git a/hw/Kconfig b/hw/Kconfig
143
index XXXXXXX..XXXXXXX 100644
144
--- a/hw/Kconfig
145
+++ b/hw/Kconfig
146
@@ -XXX,XX +XXX,XX @@ source core/Kconfig
147
source cxl/Kconfig
148
source display/Kconfig
149
source dma/Kconfig
150
+source fsi/Kconfig
151
source gpio/Kconfig
152
source hyperv/Kconfig
153
source i2c/Kconfig
154
diff --git a/hw/fsi/Kconfig b/hw/fsi/Kconfig
155
new file mode 100644
156
index XXXXXXX..XXXXXXX
157
--- /dev/null
158
+++ b/hw/fsi/Kconfig
159
@@ -XXX,XX +XXX,XX @@
160
+config FSI
161
+ bool
162
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
163
new file mode 100644
164
index XXXXXXX..XXXXXXX
165
--- /dev/null
166
+++ b/hw/fsi/meson.build
167
@@ -0,0 +1 @@
168
+system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c'))
169
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
170
new file mode 100644
171
index XXXXXXX..XXXXXXX
172
diff --git a/hw/meson.build b/hw/meson.build
173
index XXXXXXX..XXXXXXX 100644
174
--- a/hw/meson.build
175
+++ b/hw/meson.build
176
@@ -XXX,XX +XXX,XX @@ subdir('virtio')
177
subdir('watchdog')
178
subdir('xen')
179
subdir('xenpv')
180
+subdir('fsi')
181
182
subdir('alpha')
183
subdir('arm')
211
--
184
--
212
2.47.1
185
2.43.0
213
186
214
187
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
Add a new testcase for write page command with QPI mode testing.
3
This is a part of patchset where IBM's Flexible Service Interface is
4
Currently, only run this testcase for AST2500, AST2600 and AST1030.
4
introduced.
5
5
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
The scratchpad provides a set of non-functional registers. The firmware
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
is free to use them, hardware does not support any special management
8
Link: https://lore.kernel.org/r/20241127091543.1243114-9-jamin_lin@aspeedtech.com
8
support. The scratchpad registers can be read or written from LBUS
9
Signed-off-by: Cédric Le Goater <clg@redhat.com>
9
slave. The scratch pad is managed under FSI CFAM state.
10
11
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
12
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
13
Reviewed-by: Cédric Le Goater <clg@kaod.org>
14
[ clg: - moved object FSIScratchPad under FSICFAMState
15
- moved FSIScratchPad code under cfam.c ]
16
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
17
---
11
tests/qtest/aspeed_smc-test.c | 74 +++++++++++++++++++++++++++++++++++
18
include/hw/fsi/lbus.h | 11 ++++++
12
1 file changed, 74 insertions(+)
19
hw/fsi/lbus.c | 78 +++++++++++++++++++++++++++++++++++++++++--
20
hw/fsi/trace-events | 2 ++
21
3 files changed, 89 insertions(+), 2 deletions(-)
13
22
14
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
23
diff --git a/include/hw/fsi/lbus.h b/include/hw/fsi/lbus.h
15
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
16
--- a/tests/qtest/aspeed_smc-test.c
25
--- a/include/hw/fsi/lbus.h
17
+++ b/tests/qtest/aspeed_smc-test.c
26
+++ b/include/hw/fsi/lbus.h
27
@@ -XXX,XX +XXX,XX @@ typedef struct FSILBus {
28
MemoryRegion mr;
29
} FSILBus;
30
31
+#define TYPE_FSI_SCRATCHPAD "fsi.scratchpad"
32
+#define SCRATCHPAD(obj) OBJECT_CHECK(FSIScratchPad, (obj), TYPE_FSI_SCRATCHPAD)
33
+
34
+#define FSI_SCRATCHPAD_NR_REGS 4
35
+
36
+typedef struct FSIScratchPad {
37
+ FSILBusDevice parent;
38
+
39
+ uint32_t regs[FSI_SCRATCHPAD_NR_REGS];
40
+} FSIScratchPad;
41
+
42
#endif /* FSI_LBUS_H */
43
diff --git a/hw/fsi/lbus.c b/hw/fsi/lbus.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/fsi/lbus.c
46
+++ b/hw/fsi/lbus.c
18
@@ -XXX,XX +XXX,XX @@
47
@@ -XXX,XX +XXX,XX @@
19
#define R_CE_CTRL 0x04
48
#include "qemu/osdep.h"
20
#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
49
#include "qapi/error.h"
21
#define R_CTRL0 0x10
50
#include "hw/fsi/lbus.h"
22
+#define CTRL_IO_QUAD_IO BIT(31)
51
-
23
#define CTRL_CE_STOP_ACTIVE BIT(2)
52
#include "hw/qdev-properties.h"
24
#define CTRL_READMODE 0x0
53
-
25
#define CTRL_FREADMODE 0x1
54
+#include "qemu/log.h"
26
@@ -XXX,XX +XXX,XX @@ enum {
55
#include "trace.h"
27
ERASE_SECTOR = 0xd8,
56
57
+#define TO_REG(offset) ((offset) >> 2)
58
+
59
static void fsi_lbus_init(Object *o)
60
{
61
FSILBus *lbus = FSI_LBUS(o);
62
@@ -XXX,XX +XXX,XX @@ static const TypeInfo fsi_lbus_device_type_info = {
63
.abstract = true,
28
};
64
};
29
65
30
+#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
66
+static uint64_t fsi_scratchpad_read(void *opaque, hwaddr addr, unsigned size)
31
#define FLASH_PAGE_SIZE 256
32
33
typedef struct TestData {
34
@@ -XXX,XX +XXX,XX @@ static void spi_ctrl_stop_user(const TestData *data)
35
spi_writel(data, ctrl_reg, ctrl);
36
}
37
38
+static void spi_ctrl_set_io_mode(const TestData *data, uint32_t value)
39
+{
67
+{
40
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
68
+ FSIScratchPad *s = SCRATCHPAD(opaque);
41
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
69
+ int reg = TO_REG(addr);
42
+ uint32_t mode;
43
+
70
+
44
+ mode = value & CTRL_IO_MODE_MASK;
71
+ trace_fsi_scratchpad_read(addr, size);
45
+ ctrl &= ~CTRL_IO_MODE_MASK;
72
+
46
+ ctrl |= mode;
73
+ if (reg >= FSI_SCRATCHPAD_NR_REGS) {
47
+ spi_writel(data, ctrl_reg, ctrl);
74
+ qemu_log_mask(LOG_GUEST_ERROR,
75
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
76
+ __func__, addr);
77
+ return 0;
78
+ }
79
+
80
+ return s->regs[reg];
48
+}
81
+}
49
+
82
+
50
static void flash_reset(const TestData *data)
83
+static void fsi_scratchpad_write(void *opaque, hwaddr addr, uint64_t data,
51
{
84
+ unsigned size)
52
spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
53
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(const void *data)
54
flash_reset(test_data);
55
}
56
57
+static void test_write_page_qpi(const void *data)
58
+{
85
+{
59
+ const TestData *test_data = (const TestData *)data;
86
+ FSIScratchPad *s = SCRATCHPAD(opaque);
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;
67
+
87
+
68
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
88
+ trace_fsi_scratchpad_write(addr, size, data);
89
+ int reg = TO_REG(addr);
69
+
90
+
70
+ spi_ctrl_start_user(test_data);
91
+ if (reg >= FSI_SCRATCHPAD_NR_REGS) {
71
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
92
+ qemu_log_mask(LOG_GUEST_ERROR,
72
+ flash_writeb(test_data, 0, WREN);
93
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
73
+ flash_writeb(test_data, 0, PP);
94
+ __func__, addr);
74
+ flash_writel(test_data, 0, make_be32(my_page_addr));
95
+ return;
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
+ }
96
+ }
83
+
97
+
84
+ /* Fill the page with its own addresses */
98
+ s->regs[reg] = data;
85
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
86
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
87
+ }
88
+
89
+ /* Restore io mode */
90
+ spi_ctrl_set_io_mode(test_data, 0);
91
+ spi_ctrl_stop_user(test_data);
92
+
93
+ /* Check what was written */
94
+ read_page(test_data, my_page_addr, page);
95
+ for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
96
+ g_assert_cmphex(page[i], ==, page_pattern[i]);
97
+ }
98
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
99
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
100
+ }
101
+
102
+ /* Check some other page. It should be full of 0xff */
103
+ read_page(test_data, some_page_addr, page);
104
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
105
+ g_assert_cmphex(page[i], ==, 0xffffffff);
106
+ }
107
+
108
+ flash_reset(test_data);
109
+}
99
+}
110
+
100
+
111
static void test_palmetto_bmc(TestData *data)
101
+static const struct MemoryRegionOps scratchpad_ops = {
102
+ .read = fsi_scratchpad_read,
103
+ .write = fsi_scratchpad_write,
104
+ .endianness = DEVICE_BIG_ENDIAN,
105
+};
106
+
107
+static void fsi_scratchpad_realize(DeviceState *dev, Error **errp)
108
+{
109
+ FSILBusDevice *ldev = FSI_LBUS_DEVICE(dev);
110
+
111
+ memory_region_init_io(&ldev->iomem, OBJECT(ldev), &scratchpad_ops,
112
+ ldev, TYPE_FSI_SCRATCHPAD, 0x400);
113
+}
114
+
115
+static void fsi_scratchpad_reset(DeviceState *dev)
116
+{
117
+ FSIScratchPad *s = SCRATCHPAD(dev);
118
+
119
+ memset(s->regs, 0, sizeof(s->regs));
120
+}
121
+
122
+static void fsi_scratchpad_class_init(ObjectClass *klass, void *data)
123
+{
124
+ DeviceClass *dc = DEVICE_CLASS(klass);
125
+
126
+ dc->bus_type = TYPE_FSI_LBUS;
127
+ dc->realize = fsi_scratchpad_realize;
128
+ dc->reset = fsi_scratchpad_reset;
129
+}
130
+
131
+static const TypeInfo fsi_scratchpad_info = {
132
+ .name = TYPE_FSI_SCRATCHPAD,
133
+ .parent = TYPE_FSI_LBUS_DEVICE,
134
+ .instance_size = sizeof(FSIScratchPad),
135
+ .class_init = fsi_scratchpad_class_init,
136
+};
137
+
138
static void fsi_lbus_register_types(void)
112
{
139
{
113
int ret;
140
type_register_static(&fsi_lbus_info);
114
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
141
type_register_static(&fsi_lbus_device_type_info);
115
data, test_write_page_mem);
142
+ type_register_static(&fsi_scratchpad_info);
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);
120
}
143
}
121
144
122
static void test_ast2600_evb(TestData *data)
145
type_init(fsi_lbus_register_types);
123
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
146
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
124
data, test_write_page_mem);
147
index XXXXXXX..XXXXXXX 100644
125
qtest_add_data_func("/ast2600/smc/read_status_reg",
148
--- a/hw/fsi/trace-events
126
data, test_read_status_reg);
149
+++ b/hw/fsi/trace-events
127
+ qtest_add_data_func("/ast2600/smc/write_page_qpi",
150
@@ -XXX,XX +XXX,XX @@
128
+ data, test_write_page_qpi);
151
+fsi_scratchpad_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
129
}
152
+fsi_scratchpad_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
130
131
static void test_ast1030_evb(TestData *data)
132
@@ -XXX,XX +XXX,XX @@ static void test_ast1030_evb(TestData *data)
133
data, test_write_page_mem);
134
qtest_add_data_func("/ast1030/smc/read_status_reg",
135
data, test_read_status_reg);
136
+ qtest_add_data_func("/ast1030/smc/write_page_qpi",
137
+ data, test_write_page_qpi);
138
}
139
140
int main(int argc, char **argv)
141
--
153
--
142
2.47.1
154
2.43.0
143
155
144
156
diff view generated by jsdifflib
1
This simply moves the romulus-bmc test to a new test file. No changes
1
From: Ninad Palsule <ninad@linux.ibm.com>
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.
4
2
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
3
This is a part of patchset where FSI bus is introduced.
6
Link: https://lore.kernel.org/r/20241206131132.520911-4-clg@redhat.com
4
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
5
The FSI bus is a simple bus where FSI master is attached.
6
7
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
8
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
9
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
[ clg: - removed include/hw/fsi/engine-scratchpad.h and
11
     hw/fsi/engine-scratchpad.c
12
- dropped FSI_SCRATCHPAD
13
- included FSIBus definition
14
- dropped hw/fsi/trace-events changes ]
15
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
16
---
9
tests/functional/meson.build | 2 ++
17
include/hw/fsi/fsi.h | 19 +++++++++++++++++++
10
tests/functional/test_arm_aspeed.py | 26 ---------------------
18
hw/fsi/fsi.c | 22 ++++++++++++++++++++++
11
tests/functional/test_arm_aspeed_romulus.py | 24 +++++++++++++++++++
19
hw/fsi/meson.build | 2 +-
12
3 files changed, 26 insertions(+), 26 deletions(-)
20
3 files changed, 42 insertions(+), 1 deletion(-)
13
create mode 100644 tests/functional/test_arm_aspeed_romulus.py
21
create mode 100644 include/hw/fsi/fsi.h
22
create mode 100644 hw/fsi/fsi.c
14
23
15
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
24
diff --git a/include/hw/fsi/fsi.h b/include/hw/fsi/fsi.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/functional/meson.build
18
+++ b/tests/functional/meson.build
19
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
20
'aarch64_virt' : 720,
21
'acpi_bits' : 420,
22
'arm_aspeed_palmetto' : 120,
23
+ 'arm_aspeed_romulus' : 120,
24
'arm_aspeed' : 600,
25
'arm_bpim2u' : 500,
26
'arm_collie' : 180,
27
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
28
'arm_aspeed',
29
'arm_aspeed_ast1030',
30
'arm_aspeed_palmetto',
31
+ 'arm_aspeed_romulus',
32
'arm_bpim2u',
33
'arm_canona1100',
34
'arm_collie',
35
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
36
index XXXXXXX..XXXXXXX 100755
37
--- a/tests/functional/test_arm_aspeed.py
38
+++ b/tests/functional/test_arm_aspeed.py
39
@@ -XXX,XX +XXX,XX @@
40
41
class AST2x00Machine(LinuxKernelTest):
42
43
- def do_test_arm_aspeed(self, machine, image):
44
- self.set_machine(machine)
45
- self.vm.set_console()
46
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
47
- '-net', 'nic', '-snapshot')
48
- self.vm.launch()
49
-
50
- self.wait_for_console_pattern("U-Boot 2016.07")
51
- self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
52
- self.wait_for_console_pattern("Starting kernel ...")
53
- self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
54
- self.wait_for_console_pattern(
55
- "aspeed-smc 1e620000.spi: read control register: 203b0641")
56
- self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
57
- self.wait_for_console_pattern("systemd[1]: Set hostname to")
58
-
59
- ASSET_ROMULUS_FLASH = Asset(
60
- ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
61
- 'obmc-phosphor-image-romulus.static.mtd'),
62
- '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
63
-
64
- def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
65
- image_path = self.ASSET_ROMULUS_FLASH.fetch()
66
-
67
- self.do_test_arm_aspeed('romulus-bmc', image_path)
68
-
69
def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
70
self.require_netdev('user')
71
self.vm.set_console()
72
diff --git a/tests/functional/test_arm_aspeed_romulus.py b/tests/functional/test_arm_aspeed_romulus.py
73
new file mode 100644
25
new file mode 100644
74
index XXXXXXX..XXXXXXX
26
index XXXXXXX..XXXXXXX
75
--- /dev/null
27
--- /dev/null
76
+++ b/tests/functional/test_arm_aspeed_romulus.py
28
+++ b/include/hw/fsi/fsi.h
77
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@
78
+#!/usr/bin/env python3
30
+/*
79
+#
31
+ * SPDX-License-Identifier: GPL-2.0-or-later
80
+# Functional test that boots the ASPEED machines
32
+ * Copyright (C) 2024 IBM Corp.
81
+#
33
+ *
82
+# SPDX-License-Identifier: GPL-2.0-or-later
34
+ * IBM Flexible Service Interface
35
+ */
36
+#ifndef FSI_FSI_H
37
+#define FSI_FSI_H
83
+
38
+
84
+from qemu_test import Asset
39
+#include "hw/qdev-core.h"
85
+from aspeed import AspeedTest
86
+
40
+
87
+class RomulusMachine(AspeedTest):
41
+#define TYPE_FSI_BUS "fsi.bus"
42
+OBJECT_DECLARE_SIMPLE_TYPE(FSIBus, FSI_BUS)
88
+
43
+
89
+ ASSET_ROMULUS_FLASH = Asset(
44
+typedef struct FSIBus {
90
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
45
+ BusState bus;
91
+ 'obmc-phosphor-image-romulus.static.mtd'),
46
+} FSIBus;
92
+ '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
93
+
47
+
94
+ def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
48
+#endif /* FSI_FSI_H */
95
+ image_path = self.ASSET_ROMULUS_FLASH.fetch()
49
diff --git a/hw/fsi/fsi.c b/hw/fsi/fsi.c
50
new file mode 100644
51
index XXXXXXX..XXXXXXX
52
--- /dev/null
53
+++ b/hw/fsi/fsi.c
54
@@ -XXX,XX +XXX,XX @@
55
+/*
56
+ * SPDX-License-Identifier: GPL-2.0-or-later
57
+ * Copyright (C) 2024 IBM Corp.
58
+ *
59
+ * IBM Flexible Service Interface
60
+ */
61
+#include "qemu/osdep.h"
96
+
62
+
97
+ self.do_test_arm_aspeed('romulus-bmc', image_path)
63
+#include "hw/fsi/fsi.h"
98
+
64
+
65
+static const TypeInfo fsi_bus_info = {
66
+ .name = TYPE_FSI_BUS,
67
+ .parent = TYPE_BUS,
68
+ .instance_size = sizeof(FSIBus),
69
+};
99
+
70
+
100
+if __name__ == '__main__':
71
+static void fsi_bus_register_types(void)
101
+ AspeedTest.main()
72
+{
73
+ type_register_static(&fsi_bus_info);
74
+}
75
+
76
+type_init(fsi_bus_register_types);
77
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
78
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/fsi/meson.build
80
+++ b/hw/fsi/meson.build
81
@@ -1 +1 @@
82
-system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c'))
83
+system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c'))
102
--
84
--
103
2.47.1
85
2.43.0
104
86
105
87
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
Currently, these test cases are only used for testing fmc_cs0 for AST2400.
3
This is a part of patchset where IBM's Flexible Service Interface is
4
To test others BMC SOCs, introduces a new TestData structure.
4
introduced.
5
Users can set the spi base address, flash base address, jedesc id and so on
6
for different BMC SOCs and flash model testing.
7
5
8
Introduce new helper functions to make the test case more readable.
6
The FSI slave: The slave is the terminal point of the FSI bus for
7
FSI symbols addressed to it. Slaves can be cascaded off of one
8
another. The slave's configuration registers appear in address space
9
of the CFAM to which it is attached.
9
10
10
Set spi base address 0x1E620000, flash_base address 0x20000000
11
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
11
and jedec id 0x20ba19 for fmc_cs0 with n25q256a flash for AST2400
12
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
12
SMC model testing.
13
Reviewed-by: Cédric Le Goater <clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
16
include/hw/fsi/fsi.h | 18 ++++++++++
17
hw/fsi/fsi.c | 84 ++++++++++++++++++++++++++++++++++++++++++--
18
hw/fsi/trace-events | 2 ++
19
3 files changed, 102 insertions(+), 2 deletions(-)
13
20
14
To pass the TestData into the test case, replace qtest_add_func with
21
diff --git a/include/hw/fsi/fsi.h b/include/hw/fsi/fsi.h
15
qtest_add_data_func.
16
17
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
18
Reviewed-by: Cédric Le Goater <clg@redhat.com>
19
Link: https://lore.kernel.org/r/20241127091543.1243114-3-jamin_lin@aspeedtech.com
20
Signed-off-by: Cédric Le Goater <clg@redhat.com>
21
---
22
tests/qtest/aspeed_smc-test.c | 546 +++++++++++++++++++---------------
23
1 file changed, 299 insertions(+), 247 deletions(-)
24
25
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
26
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
27
--- a/tests/qtest/aspeed_smc-test.c
23
--- a/include/hw/fsi/fsi.h
28
+++ b/tests/qtest/aspeed_smc-test.c
24
+++ b/include/hw/fsi/fsi.h
29
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@
30
#define CTRL_USERMODE 0x3
26
#ifndef FSI_FSI_H
31
#define SR_WEL BIT(1)
27
#define FSI_FSI_H
32
28
33
-#define ASPEED_FMC_BASE 0x1E620000
29
+#include "exec/memory.h"
34
-#define ASPEED_FLASH_BASE 0x20000000
30
#include "hw/qdev-core.h"
35
-
31
+#include "hw/fsi/lbus.h"
36
/*
32
+#include "qemu/bitops.h"
37
* Flash commands
33
+
34
+/* Bitwise operations at the word level. */
35
+#define BE_GENMASK(hb, lb) MAKE_64BIT_MASK((lb), ((hb) - (lb) + 1))
36
37
#define TYPE_FSI_BUS "fsi.bus"
38
OBJECT_DECLARE_SIMPLE_TYPE(FSIBus, FSI_BUS)
39
@@ -XXX,XX +XXX,XX @@ typedef struct FSIBus {
40
BusState bus;
41
} FSIBus;
42
43
+#define TYPE_FSI_SLAVE "fsi.slave"
44
+OBJECT_DECLARE_SIMPLE_TYPE(FSISlaveState, FSI_SLAVE)
45
+
46
+#define FSI_SLAVE_CONTROL_NR_REGS ((0x40 >> 2) + 1)
47
+
48
+typedef struct FSISlaveState {
49
+ DeviceState parent;
50
+
51
+ MemoryRegion iomem;
52
+ uint32_t regs[FSI_SLAVE_CONTROL_NR_REGS];
53
+} FSISlaveState;
54
+
55
#endif /* FSI_FSI_H */
56
diff --git a/hw/fsi/fsi.c b/hw/fsi/fsi.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/fsi/fsi.c
59
+++ b/hw/fsi/fsi.c
60
@@ -XXX,XX +XXX,XX @@
61
* IBM Flexible Service Interface
38
*/
62
*/
39
@@ -XXX,XX +XXX,XX @@ enum {
63
#include "qemu/osdep.h"
40
ERASE_SECTOR = 0xd8,
64
+#include "qapi/error.h"
65
+#include "qemu/log.h"
66
+#include "trace.h"
67
68
#include "hw/fsi/fsi.h"
69
70
+#define TO_REG(x) ((x) >> 2)
71
+
72
static const TypeInfo fsi_bus_info = {
73
.name = TYPE_FSI_BUS,
74
.parent = TYPE_BUS,
75
.instance_size = sizeof(FSIBus),
41
};
76
};
42
77
43
-#define FLASH_JEDEC 0x20ba19 /* n25q256a */
78
-static void fsi_bus_register_types(void)
44
-#define FLASH_SIZE (32 * 1024 * 1024)
79
+static uint64_t fsi_slave_read(void *opaque, hwaddr addr, unsigned size)
45
-
80
+{
46
#define FLASH_PAGE_SIZE 256
81
+ FSISlaveState *s = FSI_SLAVE(opaque);
47
82
+ int reg = TO_REG(addr);
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;
55
+
83
+
56
/*
84
+ trace_fsi_slave_read(addr, size);
57
* Use an explicit bswap for the values read/wrote to the flash region
85
+
58
* as they are BE and the Aspeed CPU is LE.
86
+ if (reg >= FSI_SLAVE_CONTROL_NR_REGS) {
59
@@ -XXX,XX +XXX,XX @@ static inline uint32_t make_be32(uint32_t data)
87
+ qemu_log_mask(LOG_GUEST_ERROR,
60
return bswap32(data);
88
+ "%s: Out of bounds read: 0x%"HWADDR_PRIx" for %u\n",
61
}
89
+ __func__, addr, size);
62
90
+ return 0;
63
-static void spi_conf(uint32_t value)
91
+ }
64
+static inline void spi_writel(const TestData *data, uint64_t offset,
92
+
65
+ uint32_t value)
93
+ return s->regs[reg];
66
+{
67
+ qtest_writel(data->s, data->spi_base + offset, value);
68
+}
94
+}
69
+
95
+
70
+static inline uint32_t spi_readl(const TestData *data, uint64_t offset)
96
+static void fsi_slave_write(void *opaque, hwaddr addr, uint64_t data,
97
+ unsigned size)
71
+{
98
+{
72
+ return qtest_readl(data->s, data->spi_base + offset);
99
+ FSISlaveState *s = FSI_SLAVE(opaque);
100
+ int reg = TO_REG(addr);
101
+
102
+ trace_fsi_slave_write(addr, size, data);
103
+
104
+ if (reg >= FSI_SLAVE_CONTROL_NR_REGS) {
105
+ qemu_log_mask(LOG_GUEST_ERROR,
106
+ "%s: Out of bounds write: 0x%"HWADDR_PRIx" for %u\n",
107
+ __func__, addr, size);
108
+ return;
109
+ }
110
+
111
+ s->regs[reg] = data;
73
+}
112
+}
74
+
113
+
75
+static inline void flash_writeb(const TestData *data, uint64_t offset,
114
+static const struct MemoryRegionOps fsi_slave_ops = {
76
+ uint8_t value)
115
+ .read = fsi_slave_read,
116
+ .write = fsi_slave_write,
117
+ .endianness = DEVICE_BIG_ENDIAN,
118
+};
119
+
120
+static void fsi_slave_reset(DeviceState *dev)
77
+{
121
+{
78
+ qtest_writeb(data->s, data->flash_base + offset, value);
122
+ FSISlaveState *s = FSI_SLAVE(dev);
123
+
124
+ /* Initialize registers */
125
+ memset(s->regs, 0, sizeof(s->regs));
79
+}
126
+}
80
+
127
+
81
+static inline void flash_writel(const TestData *data, uint64_t offset,
128
+static void fsi_slave_init(Object *o)
82
+ uint32_t value)
83
+{
129
+{
84
+ qtest_writel(data->s, data->flash_base + offset, value);
130
+ FSISlaveState *s = FSI_SLAVE(o);
131
+
132
+ memory_region_init_io(&s->iomem, OBJECT(s), &fsi_slave_ops,
133
+ s, TYPE_FSI_SLAVE, 0x400);
85
+}
134
+}
86
+
135
+
87
+static inline uint8_t flash_readb(const TestData *data, uint64_t offset)
136
+static void fsi_slave_class_init(ObjectClass *klass, void *data)
88
{
137
+{
89
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CONF);
138
+ DeviceClass *dc = DEVICE_CLASS(klass);
90
+ return qtest_readb(data->s, data->flash_base + offset);
139
+
140
+ dc->bus_type = TYPE_FSI_BUS;
141
+ dc->desc = "FSI Slave";
142
+ dc->reset = fsi_slave_reset;
91
+}
143
+}
92
+
144
+
93
+static inline uint32_t flash_readl(const TestData *data, uint64_t offset)
145
+static const TypeInfo fsi_slave_info = {
94
+{
146
+ .name = TYPE_FSI_SLAVE,
95
+ return qtest_readl(data->s, data->flash_base + offset);
147
+ .parent = TYPE_DEVICE,
96
+}
148
+ .instance_init = fsi_slave_init,
149
+ .instance_size = sizeof(FSISlaveState),
150
+ .class_init = fsi_slave_class_init,
151
+};
97
+
152
+
98
+static void spi_conf(const TestData *data, uint32_t value)
153
+static void fsi_register_types(void)
99
+{
154
{
100
+ uint32_t conf = spi_readl(data, R_CONF);
155
type_register_static(&fsi_bus_info);
101
156
+ type_register_static(&fsi_slave_info);
102
conf |= value;
103
- writel(ASPEED_FMC_BASE + R_CONF, conf);
104
+ spi_writel(data, R_CONF, conf);
105
}
157
}
106
158
107
-static void spi_conf_remove(uint32_t value)
159
-type_init(fsi_bus_register_types);
108
+static void spi_conf_remove(const TestData *data, uint32_t value)
160
+type_init(fsi_register_types);
109
{
161
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
110
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CONF);
162
index XXXXXXX..XXXXXXX 100644
111
+ uint32_t conf = spi_readl(data, R_CONF);
163
--- a/hw/fsi/trace-events
112
164
+++ b/hw/fsi/trace-events
113
conf &= ~value;
165
@@ -XXX,XX +XXX,XX @@
114
- writel(ASPEED_FMC_BASE + R_CONF, conf);
166
fsi_scratchpad_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
115
+ spi_writel(data, R_CONF, conf);
167
fsi_scratchpad_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
116
}
168
+fsi_slave_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
117
169
+fsi_slave_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
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
}
927
--
170
--
928
2.47.1
171
2.43.0
929
172
930
173
diff view generated by jsdifflib
1
This introduces a new aspeed module for sharing code between tests and
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
moves the palmetto test to a new test file. No changes in the test.
2
3
3
This is a part of patchset where IBM's Flexible Service Interface is
4
Reviewed-by: Thomas Huth <thuth@redhat.com>
4
introduced.
5
Link: https://lore.kernel.org/r/20241206131132.520911-3-clg@redhat.com
5
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
6
The Common FRU Access Macro (CFAM), an address space containing
7
various "engines" that drive accesses on busses internal and external
8
to the POWER chip. Examples include the SBEFIFO and I2C masters. The
9
engines hang off of an internal Local Bus (LBUS) which is described
10
by the CFAM configuration block.
11
12
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
13
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
15
[ clg: - moved object FSIScratchPad under FSICFAMState
16
- moved FSIScratchPad code under cfam.c
17
- introduced fsi_cfam_instance_init()
18
- reworked fsi_cfam_realize() ]
19
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
---
20
---
8
tests/functional/aspeed.py | 23 +++++++++++++++++++
21
include/hw/fsi/cfam.h | 34 +++++++++
9
tests/functional/meson.build | 2 ++
22
hw/fsi/cfam.c | 168 ++++++++++++++++++++++++++++++++++++++++++
10
tests/functional/test_arm_aspeed.py | 10 --------
23
hw/fsi/meson.build | 2 +-
11
tests/functional/test_arm_aspeed_palmetto.py | 24 ++++++++++++++++++++
24
hw/fsi/trace-events | 5 ++
12
4 files changed, 49 insertions(+), 10 deletions(-)
25
4 files changed, 208 insertions(+), 1 deletion(-)
13
create mode 100644 tests/functional/aspeed.py
26
create mode 100644 include/hw/fsi/cfam.h
14
create mode 100644 tests/functional/test_arm_aspeed_palmetto.py
27
create mode 100644 hw/fsi/cfam.c
15
28
16
diff --git a/tests/functional/aspeed.py b/tests/functional/aspeed.py
29
diff --git a/include/hw/fsi/cfam.h b/include/hw/fsi/cfam.h
17
new file mode 100644
30
new file mode 100644
18
index XXXXXXX..XXXXXXX
31
index XXXXXXX..XXXXXXX
19
--- /dev/null
32
--- /dev/null
20
+++ b/tests/functional/aspeed.py
33
+++ b/include/hw/fsi/cfam.h
21
@@ -XXX,XX +XXX,XX @@
34
@@ -XXX,XX +XXX,XX @@
22
+# Test class to boot aspeed machines
35
+/*
23
+#
36
+ * SPDX-License-Identifier: GPL-2.0-or-later
24
+# SPDX-License-Identifier: GPL-2.0-or-later
37
+ * Copyright (C) 2024 IBM Corp.
25
+
38
+ *
26
+from qemu_test import LinuxKernelTest
39
+ * IBM Common FRU Access Macro
27
+
40
+ */
28
+class AspeedTest(LinuxKernelTest):
41
+#ifndef FSI_CFAM_H
29
+
42
+#define FSI_CFAM_H
30
+ def do_test_arm_aspeed(self, machine, image):
43
+
31
+ self.set_machine(machine)
44
+#include "exec/memory.h"
32
+ self.vm.set_console()
45
+
33
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
46
+#include "hw/fsi/fsi.h"
34
+ '-net', 'nic', '-snapshot')
47
+#include "hw/fsi/lbus.h"
35
+ self.vm.launch()
48
+
36
+
49
+#define TYPE_FSI_CFAM "cfam"
37
+ self.wait_for_console_pattern("U-Boot 2016.07")
50
+#define FSI_CFAM(obj) OBJECT_CHECK(FSICFAMState, (obj), TYPE_FSI_CFAM)
38
+ self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
51
+
39
+ self.wait_for_console_pattern("Starting kernel ...")
52
+/* P9-ism */
40
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
53
+#define CFAM_CONFIG_NR_REGS 0x28
41
+ self.wait_for_console_pattern(
54
+
42
+ "aspeed-smc 1e620000.spi: read control register: 203b0641")
55
+typedef struct FSICFAMState {
43
+ self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
56
+ /* < private > */
44
+ self.wait_for_console_pattern("systemd[1]: Set hostname to")
57
+ FSISlaveState parent;
45
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
58
+
46
index XXXXXXX..XXXXXXX 100644
59
+ /* CFAM config address space */
47
--- a/tests/functional/meson.build
60
+ MemoryRegion config_iomem;
48
+++ b/tests/functional/meson.build
61
+
49
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
62
+ MemoryRegion mr;
50
'aarch64_tuxrun' : 240,
63
+
51
'aarch64_virt' : 720,
64
+ FSILBus lbus;
52
'acpi_bits' : 420,
65
+ FSIScratchPad scratchpad;
53
+ 'arm_aspeed_palmetto' : 120,
66
+} FSICFAMState;
54
'arm_aspeed' : 600,
67
+
55
'arm_bpim2u' : 500,
68
+#endif /* FSI_CFAM_H */
56
'arm_collie' : 180,
69
diff --git a/hw/fsi/cfam.c b/hw/fsi/cfam.c
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
70
new file mode 100644
88
index XXXXXXX..XXXXXXX
71
index XXXXXXX..XXXXXXX
89
--- /dev/null
72
--- /dev/null
90
+++ b/tests/functional/test_arm_aspeed_palmetto.py
73
+++ b/hw/fsi/cfam.c
91
@@ -XXX,XX +XXX,XX @@
74
@@ -XXX,XX +XXX,XX @@
92
+#!/usr/bin/env python3
75
+/*
93
+#
76
+ * SPDX-License-Identifier: GPL-2.0-or-later
94
+# Functional test that boots the ASPEED machines
77
+ * Copyright (C) 2024 IBM Corp.
95
+#
78
+ *
96
+# SPDX-License-Identifier: GPL-2.0-or-later
79
+ * IBM Common FRU Access Macro
97
+
80
+ */
98
+from qemu_test import Asset
81
+
99
+from aspeed import AspeedTest
82
+#include "qemu/osdep.h"
100
+
83
+#include "qemu/units.h"
101
+class PalmettoMachine(AspeedTest):
84
+
102
+
85
+#include "qapi/error.h"
103
+ ASSET_PALMETTO_FLASH = Asset(
86
+#include "trace.h"
104
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
87
+
105
+ 'obmc-phosphor-image-palmetto.static.mtd'),
88
+#include "hw/fsi/cfam.h"
106
+ '3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d');
89
+#include "hw/fsi/fsi.h"
107
+
90
+
108
+ def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
91
+#include "hw/qdev-properties.h"
109
+ image_path = self.ASSET_PALMETTO_FLASH.fetch()
92
+
110
+
93
+#define ENGINE_CONFIG_NEXT BIT(31)
111
+ self.do_test_arm_aspeed('palmetto-bmc', image_path)
94
+#define ENGINE_CONFIG_TYPE_PEEK (0x02 << 4)
112
+
95
+#define ENGINE_CONFIG_TYPE_FSI (0x03 << 4)
113
+
96
+#define ENGINE_CONFIG_TYPE_SCRATCHPAD (0x06 << 4)
114
+if __name__ == '__main__':
97
+
115
+ AspeedTest.main()
98
+/* Valid, slots, version, type, crc */
99
+#define CFAM_CONFIG_REG(__VER, __TYPE, __CRC) \
100
+ (ENGINE_CONFIG_NEXT | \
101
+ 0x00010000 | \
102
+ (__VER) | \
103
+ (__TYPE) | \
104
+ (__CRC))
105
+
106
+#define TO_REG(x) ((x) >> 2)
107
+
108
+#define CFAM_CONFIG_CHIP_ID TO_REG(0x00)
109
+#define CFAM_CONFIG_PEEK_STATUS TO_REG(0x04)
110
+#define CFAM_CONFIG_CHIP_ID_P9 0xc0022d15
111
+#define CFAM_CONFIG_CHIP_ID_BREAK 0xc0de0000
112
+
113
+static uint64_t fsi_cfam_config_read(void *opaque, hwaddr addr, unsigned size)
114
+{
115
+ trace_fsi_cfam_config_read(addr, size);
116
+
117
+ switch (addr) {
118
+ case 0x00:
119
+ return CFAM_CONFIG_CHIP_ID_P9;
120
+ case 0x04:
121
+ return CFAM_CONFIG_REG(0x1000, ENGINE_CONFIG_TYPE_PEEK, 0xc);
122
+ case 0x08:
123
+ return CFAM_CONFIG_REG(0x5000, ENGINE_CONFIG_TYPE_FSI, 0xa);
124
+ case 0xc:
125
+ return CFAM_CONFIG_REG(0x1000, ENGINE_CONFIG_TYPE_SCRATCHPAD, 0x7);
126
+ default:
127
+ /*
128
+ * The config table contains different engines from 0xc onwards.
129
+ * The scratch pad is already added at address 0xc. We need to add
130
+ * future engines from address 0x10 onwards. Returning 0 as engine
131
+ * is not implemented.
132
+ */
133
+ return 0;
134
+ }
135
+}
136
+
137
+static void fsi_cfam_config_write(void *opaque, hwaddr addr, uint64_t data,
138
+ unsigned size)
139
+{
140
+ FSICFAMState *cfam = FSI_CFAM(opaque);
141
+
142
+ trace_fsi_cfam_config_write(addr, size, data);
143
+
144
+ switch (TO_REG(addr)) {
145
+ case CFAM_CONFIG_CHIP_ID:
146
+ case CFAM_CONFIG_PEEK_STATUS:
147
+ if (data == CFAM_CONFIG_CHIP_ID_BREAK) {
148
+ bus_cold_reset(BUS(&cfam->lbus));
149
+ }
150
+ break;
151
+ default:
152
+ trace_fsi_cfam_config_write_noaddr(addr, size, data);
153
+ }
154
+}
155
+
156
+static const struct MemoryRegionOps cfam_config_ops = {
157
+ .read = fsi_cfam_config_read,
158
+ .write = fsi_cfam_config_write,
159
+ .valid.max_access_size = 4,
160
+ .valid.min_access_size = 4,
161
+ .impl.max_access_size = 4,
162
+ .impl.min_access_size = 4,
163
+ .endianness = DEVICE_BIG_ENDIAN,
164
+};
165
+
166
+static uint64_t fsi_cfam_unimplemented_read(void *opaque, hwaddr addr,
167
+ unsigned size)
168
+{
169
+ trace_fsi_cfam_unimplemented_read(addr, size);
170
+
171
+ return 0;
172
+}
173
+
174
+static void fsi_cfam_unimplemented_write(void *opaque, hwaddr addr,
175
+ uint64_t data, unsigned size)
176
+{
177
+ trace_fsi_cfam_unimplemented_write(addr, size, data);
178
+}
179
+
180
+static const struct MemoryRegionOps fsi_cfam_unimplemented_ops = {
181
+ .read = fsi_cfam_unimplemented_read,
182
+ .write = fsi_cfam_unimplemented_write,
183
+ .endianness = DEVICE_BIG_ENDIAN,
184
+};
185
+
186
+static void fsi_cfam_instance_init(Object *obj)
187
+{
188
+ FSICFAMState *s = FSI_CFAM(obj);
189
+
190
+ object_initialize_child(obj, "scratchpad", &s->scratchpad,
191
+ TYPE_FSI_SCRATCHPAD);
192
+}
193
+
194
+static void fsi_cfam_realize(DeviceState *dev, Error **errp)
195
+{
196
+ FSICFAMState *cfam = FSI_CFAM(dev);
197
+ FSISlaveState *slave = FSI_SLAVE(dev);
198
+
199
+ /* Each slave has a 2MiB address space */
200
+ memory_region_init_io(&cfam->mr, OBJECT(cfam), &fsi_cfam_unimplemented_ops,
201
+ cfam, TYPE_FSI_CFAM, 2 * MiB);
202
+
203
+ qbus_init(&cfam->lbus, sizeof(cfam->lbus), TYPE_FSI_LBUS, DEVICE(cfam),
204
+ NULL);
205
+
206
+ memory_region_init_io(&cfam->config_iomem, OBJECT(cfam), &cfam_config_ops,
207
+ cfam, TYPE_FSI_CFAM ".config", 0x400);
208
+
209
+ memory_region_add_subregion(&cfam->mr, 0, &cfam->config_iomem);
210
+ memory_region_add_subregion(&cfam->mr, 0x800, &slave->iomem);
211
+ memory_region_add_subregion(&cfam->mr, 0xc00, &cfam->lbus.mr);
212
+
213
+ /* Add scratchpad engine */
214
+ if (!qdev_realize(DEVICE(&cfam->scratchpad), BUS(&cfam->lbus), errp)) {
215
+ return;
216
+ }
217
+
218
+ FSILBusDevice *fsi_dev = FSI_LBUS_DEVICE(&cfam->scratchpad);
219
+ memory_region_add_subregion(&cfam->lbus.mr, 0, &fsi_dev->iomem);
220
+}
221
+
222
+static void fsi_cfam_class_init(ObjectClass *klass, void *data)
223
+{
224
+ DeviceClass *dc = DEVICE_CLASS(klass);
225
+ dc->bus_type = TYPE_FSI_BUS;
226
+ dc->realize = fsi_cfam_realize;
227
+}
228
+
229
+static const TypeInfo fsi_cfam_info = {
230
+ .name = TYPE_FSI_CFAM,
231
+ .parent = TYPE_FSI_SLAVE,
232
+ .instance_init = fsi_cfam_instance_init,
233
+ .instance_size = sizeof(FSICFAMState),
234
+ .class_init = fsi_cfam_class_init,
235
+};
236
+
237
+static void fsi_cfam_register_types(void)
238
+{
239
+ type_register_static(&fsi_cfam_info);
240
+}
241
+
242
+type_init(fsi_cfam_register_types);
243
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
244
index XXXXXXX..XXXXXXX 100644
245
--- a/hw/fsi/meson.build
246
+++ b/hw/fsi/meson.build
247
@@ -1 +1 @@
248
-system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c'))
249
+system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c','cfam.c'))
250
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
251
index XXXXXXX..XXXXXXX 100644
252
--- a/hw/fsi/trace-events
253
+++ b/hw/fsi/trace-events
254
@@ -XXX,XX +XXX,XX @@ fsi_scratchpad_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
255
fsi_scratchpad_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
256
fsi_slave_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
257
fsi_slave_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
258
+fsi_cfam_config_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
259
+fsi_cfam_config_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
260
+fsi_cfam_unimplemented_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
261
+fsi_cfam_unimplemented_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
262
+fsi_cfam_config_write_noaddr(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
116
--
263
--
117
2.47.1
264
2.43.0
118
265
119
266
diff view generated by jsdifflib
1
This simply moves the ast1030 tests to a new test file. No changes.
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
Reviewed-by: Thomas Huth <thuth@redhat.com>
3
This is a part of patchset where IBM's Flexible Service Interface is
4
Link: https://lore.kernel.org/r/20241206131132.520911-2-clg@redhat.com
4
introduced.
5
Signed-off-by: Cédric Le Goater <clg@redhat.com>
5
6
This commit models the FSI master. CFAM is hanging out of FSI master which is a bus controller.
7
8
The FSI master: A controller in the platform service processor (e.g.
9
BMC) driving CFAM engine accesses into the POWER chip. At the
10
hardware level FSI is a bit-based protocol supporting synchronous and
11
DMA-driven accesses of engines in a CFAM.
12
13
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
14
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
15
Reviewed-by: Cédric Le Goater <clg@kaod.org>
16
[ clg: - move FSICFAMState object under FSIMasterState
17
- introduced fsi_master_init()
18
- reworked fsi_master_realize()
19
- dropped FSIBus definition ]
20
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
---
21
---
7
tests/functional/meson.build | 1 +
22
include/hw/fsi/fsi-master.h | 32 +++++++
8
tests/functional/test_arm_aspeed.py | 64 ----------------
23
hw/fsi/fsi-master.c | 170 ++++++++++++++++++++++++++++++++++++
9
tests/functional/test_arm_aspeed_ast1030.py | 81 +++++++++++++++++++++
24
hw/fsi/meson.build | 2 +-
10
3 files changed, 82 insertions(+), 64 deletions(-)
25
hw/fsi/trace-events | 2 +
11
create mode 100644 tests/functional/test_arm_aspeed_ast1030.py
26
4 files changed, 205 insertions(+), 1 deletion(-)
12
27
create mode 100644 include/hw/fsi/fsi-master.h
13
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
28
create mode 100644 hw/fsi/fsi-master.c
14
index XXXXXXX..XXXXXXX 100644
29
15
--- a/tests/functional/meson.build
30
diff --git a/include/hw/fsi/fsi-master.h b/include/hw/fsi/fsi-master.h
16
+++ b/tests/functional/meson.build
17
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
18
19
tests_arm_system_thorough = [
20
'arm_aspeed',
21
+ 'arm_aspeed_ast1030',
22
'arm_bpim2u',
23
'arm_canona1100',
24
'arm_collie',
25
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
26
index XXXXXXX..XXXXXXX 100755
27
--- a/tests/functional/test_arm_aspeed.py
28
+++ b/tests/functional/test_arm_aspeed.py
29
@@ -XXX,XX +XXX,XX @@
30
from zipfile import ZipFile
31
from unittest import skipUnless
32
33
-class AST1030Machine(LinuxKernelTest):
34
-
35
- ASSET_ZEPHYR_1_04 = Asset(
36
- ('https://github.com/AspeedTech-BMC'
37
- '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip'),
38
- '4ac6210adcbc61294927918707c6762483fd844dde5e07f3ba834ad1f91434d3')
39
-
40
- def test_ast1030_zephyros_1_04(self):
41
- self.set_machine('ast1030-evb')
42
-
43
- zip_file = self.ASSET_ZEPHYR_1_04.fetch()
44
-
45
- kernel_name = "ast1030-evb-demo/zephyr.elf"
46
- with ZipFile(zip_file, 'r') as zf:
47
- zf.extract(kernel_name, path=self.workdir)
48
- kernel_file = os.path.join(self.workdir, kernel_name)
49
-
50
- self.vm.set_console()
51
- self.vm.add_args('-kernel', kernel_file, '-nographic')
52
- self.vm.launch()
53
- self.wait_for_console_pattern("Booting Zephyr OS")
54
- exec_command_and_wait_for_pattern(self, "help",
55
- "Available commands")
56
-
57
- ASSET_ZEPHYR_1_07 = Asset(
58
- ('https://github.com/AspeedTech-BMC'
59
- '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip'),
60
- 'ad52e27959746988afaed8429bf4e12ab988c05c4d07c9d90e13ec6f7be4574c')
61
-
62
- def test_ast1030_zephyros_1_07(self):
63
- self.set_machine('ast1030-evb')
64
-
65
- zip_file = self.ASSET_ZEPHYR_1_07.fetch()
66
-
67
- kernel_name = "ast1030-evb-demo/zephyr.bin"
68
- with ZipFile(zip_file, 'r') as zf:
69
- zf.extract(kernel_name, path=self.workdir)
70
- kernel_file = os.path.join(self.workdir, kernel_name)
71
-
72
- self.vm.set_console()
73
- self.vm.add_args('-kernel', kernel_file, '-nographic')
74
- self.vm.launch()
75
- self.wait_for_console_pattern("Booting Zephyr OS")
76
- for shell_cmd in [
77
- 'kernel stacks',
78
- 'otp info conf',
79
- 'otp info scu',
80
- 'hwinfo devid',
81
- 'crypto aes256_cbc_vault',
82
- 'random get',
83
- 'jtag JTAG1 sw_xfer high TMS',
84
- 'adc ADC0 resolution 12',
85
- 'adc ADC0 read 42',
86
- 'adc ADC1 read 69',
87
- 'i2c scan I2C_0',
88
- 'i3c attach I3C_0',
89
- 'hash test',
90
- 'kernel uptime',
91
- 'kernel reboot warm',
92
- 'kernel uptime',
93
- 'kernel reboot cold',
94
- 'kernel uptime',
95
- ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
96
-
97
class AST2x00Machine(LinuxKernelTest):
98
99
def do_test_arm_aspeed(self, machine, image):
100
diff --git a/tests/functional/test_arm_aspeed_ast1030.py b/tests/functional/test_arm_aspeed_ast1030.py
101
new file mode 100644
31
new file mode 100644
102
index XXXXXXX..XXXXXXX
32
index XXXXXXX..XXXXXXX
103
--- /dev/null
33
--- /dev/null
104
+++ b/tests/functional/test_arm_aspeed_ast1030.py
34
+++ b/include/hw/fsi/fsi-master.h
105
@@ -XXX,XX +XXX,XX @@
35
@@ -XXX,XX +XXX,XX @@
106
+#!/usr/bin/env python3
36
+/*
107
+#
37
+ * SPDX-License-Identifier: GPL-2.0-or-later
108
+# Functional test that boots the ASPEED SoCs with firmware
38
+ * Copyright (C) 2024 IBM Corp.
109
+#
39
+ *
110
+# Copyright (C) 2022 ASPEED Technology Inc
40
+ * IBM Flexible Service Interface Master
111
+#
41
+ */
112
+# SPDX-License-Identifier: GPL-2.0-or-later
42
+#ifndef FSI_FSI_MASTER_H
113
+
43
+#define FSI_FSI_MASTER_H
114
+import os
44
+
115
+
45
+#include "exec/memory.h"
116
+from qemu_test import LinuxKernelTest, Asset
46
+#include "hw/qdev-core.h"
117
+from qemu_test import exec_command_and_wait_for_pattern
47
+#include "hw/fsi/fsi.h"
118
+from zipfile import ZipFile
48
+#include "hw/fsi/cfam.h"
119
+
49
+
120
+class AST1030Machine(LinuxKernelTest):
50
+#define TYPE_FSI_MASTER "fsi.master"
121
+
51
+OBJECT_DECLARE_SIMPLE_TYPE(FSIMasterState, FSI_MASTER)
122
+ ASSET_ZEPHYR_1_04 = Asset(
52
+
123
+ ('https://github.com/AspeedTech-BMC'
53
+#define FSI_MASTER_NR_REGS ((0x2e0 >> 2) + 1)
124
+ '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip'),
54
+
125
+ '4ac6210adcbc61294927918707c6762483fd844dde5e07f3ba834ad1f91434d3')
55
+typedef struct FSIMasterState {
126
+
56
+ DeviceState parent;
127
+ def test_ast1030_zephyros_1_04(self):
57
+ MemoryRegion iomem;
128
+ self.set_machine('ast1030-evb')
58
+ MemoryRegion opb2fsi;
129
+
59
+
130
+ zip_file = self.ASSET_ZEPHYR_1_04.fetch()
60
+ FSIBus bus;
131
+
61
+
132
+ kernel_name = "ast1030-evb-demo/zephyr.elf"
62
+ uint32_t regs[FSI_MASTER_NR_REGS];
133
+ with ZipFile(zip_file, 'r') as zf:
63
+ FSICFAMState cfam;
134
+ zf.extract(kernel_name, path=self.workdir)
64
+} FSIMasterState;
135
+ kernel_file = os.path.join(self.workdir, kernel_name)
65
+
136
+
66
+
137
+ self.vm.set_console()
67
+#endif /* FSI_FSI_H */
138
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
68
diff --git a/hw/fsi/fsi-master.c b/hw/fsi/fsi-master.c
139
+ self.vm.launch()
69
new file mode 100644
140
+ self.wait_for_console_pattern("Booting Zephyr OS")
70
index XXXXXXX..XXXXXXX
141
+ exec_command_and_wait_for_pattern(self, "help",
71
--- /dev/null
142
+ "Available commands")
72
+++ b/hw/fsi/fsi-master.c
143
+
73
@@ -XXX,XX +XXX,XX @@
144
+ ASSET_ZEPHYR_1_07 = Asset(
74
+/*
145
+ ('https://github.com/AspeedTech-BMC'
75
+ * SPDX-License-Identifier: GPL-2.0-or-later
146
+ '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip'),
76
+ * Copyright (C) 2024 IBM Corp.
147
+ 'ad52e27959746988afaed8429bf4e12ab988c05c4d07c9d90e13ec6f7be4574c')
77
+ *
148
+
78
+ * IBM Flexible Service Interface master
149
+ def test_ast1030_zephyros_1_07(self):
79
+ */
150
+ self.set_machine('ast1030-evb')
80
+
151
+
81
+#include "qemu/osdep.h"
152
+ zip_file = self.ASSET_ZEPHYR_1_07.fetch()
82
+#include "qapi/error.h"
153
+
83
+#include "qemu/log.h"
154
+ kernel_name = "ast1030-evb-demo/zephyr.bin"
84
+#include "trace.h"
155
+ with ZipFile(zip_file, 'r') as zf:
85
+
156
+ zf.extract(kernel_name, path=self.workdir)
86
+#include "hw/fsi/fsi-master.h"
157
+ kernel_file = os.path.join(self.workdir, kernel_name)
87
+
158
+
88
+#define TYPE_OP_BUS "opb"
159
+ self.vm.set_console()
89
+
160
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
90
+#define TO_REG(x) ((x) >> 2)
161
+ self.vm.launch()
91
+
162
+ self.wait_for_console_pattern("Booting Zephyr OS")
92
+#define FSI_MENP0 TO_REG(0x010)
163
+ for shell_cmd in [
93
+#define FSI_MENP32 TO_REG(0x014)
164
+ 'kernel stacks',
94
+#define FSI_MSENP0 TO_REG(0x018)
165
+ 'otp info conf',
95
+#define FSI_MLEVP0 TO_REG(0x018)
166
+ 'otp info scu',
96
+#define FSI_MSENP32 TO_REG(0x01c)
167
+ 'hwinfo devid',
97
+#define FSI_MLEVP32 TO_REG(0x01c)
168
+ 'crypto aes256_cbc_vault',
98
+#define FSI_MCENP0 TO_REG(0x020)
169
+ 'random get',
99
+#define FSI_MREFP0 TO_REG(0x020)
170
+ 'jtag JTAG1 sw_xfer high TMS',
100
+#define FSI_MCENP32 TO_REG(0x024)
171
+ 'adc ADC0 resolution 12',
101
+#define FSI_MREFP32 TO_REG(0x024)
172
+ 'adc ADC0 read 42',
102
+
173
+ 'adc ADC1 read 69',
103
+#define FSI_MVER TO_REG(0x074)
174
+ 'i2c scan I2C_0',
104
+#define FSI_MRESP0 TO_REG(0x0d0)
175
+ 'i3c attach I3C_0',
105
+
176
+ 'hash test',
106
+#define FSI_MRESB0 TO_REG(0x1d0)
177
+ 'kernel uptime',
107
+#define FSI_MRESB0_RESET_GENERAL BIT(31)
178
+ 'kernel reboot warm',
108
+#define FSI_MRESB0_RESET_ERROR BIT(30)
179
+ 'kernel uptime',
109
+
180
+ 'kernel reboot cold',
110
+static uint64_t fsi_master_read(void *opaque, hwaddr addr, unsigned size)
181
+ 'kernel uptime',
111
+{
182
+ ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
112
+ FSIMasterState *s = FSI_MASTER(opaque);
183
+
113
+ int reg = TO_REG(addr);
184
+
114
+
185
+if __name__ == '__main__':
115
+ trace_fsi_master_read(addr, size);
186
+ LinuxKernelTest.main()
116
+
117
+ if (reg >= FSI_MASTER_NR_REGS) {
118
+ qemu_log_mask(LOG_GUEST_ERROR,
119
+ "%s: Out of bounds read: 0x%"HWADDR_PRIx" for %u\n",
120
+ __func__, addr, size);
121
+ return 0;
122
+ }
123
+
124
+ return s->regs[reg];
125
+}
126
+
127
+static void fsi_master_write(void *opaque, hwaddr addr, uint64_t data,
128
+ unsigned size)
129
+{
130
+ FSIMasterState *s = FSI_MASTER(opaque);
131
+ int reg = TO_REG(addr);
132
+
133
+ trace_fsi_master_write(addr, size, data);
134
+
135
+ if (reg >= FSI_MASTER_NR_REGS) {
136
+ qemu_log_mask(LOG_GUEST_ERROR,
137
+ "%s: Out of bounds write: %"HWADDR_PRIx" for %u\n",
138
+ __func__, addr, size);
139
+ return;
140
+ }
141
+
142
+ switch (reg) {
143
+ case FSI_MENP0:
144
+ s->regs[FSI_MENP0] = data;
145
+ break;
146
+ case FSI_MENP32:
147
+ s->regs[FSI_MENP32] = data;
148
+ break;
149
+ case FSI_MSENP0:
150
+ s->regs[FSI_MENP0] |= data;
151
+ break;
152
+ case FSI_MSENP32:
153
+ s->regs[FSI_MENP32] |= data;
154
+ break;
155
+ case FSI_MCENP0:
156
+ s->regs[FSI_MENP0] &= ~data;
157
+ break;
158
+ case FSI_MCENP32:
159
+ s->regs[FSI_MENP32] &= ~data;
160
+ break;
161
+ case FSI_MRESP0:
162
+ /* Perform necessary resets leave register 0 to indicate no errors */
163
+ break;
164
+ case FSI_MRESB0:
165
+ if (data & FSI_MRESB0_RESET_GENERAL) {
166
+ device_cold_reset(DEVICE(opaque));
167
+ }
168
+ if (data & FSI_MRESB0_RESET_ERROR) {
169
+ /* FIXME: this seems dubious */
170
+ device_cold_reset(DEVICE(opaque));
171
+ }
172
+ break;
173
+ default:
174
+ s->regs[reg] = data;
175
+ }
176
+}
177
+
178
+static const struct MemoryRegionOps fsi_master_ops = {
179
+ .read = fsi_master_read,
180
+ .write = fsi_master_write,
181
+ .endianness = DEVICE_BIG_ENDIAN,
182
+};
183
+
184
+static void fsi_master_init(Object *o)
185
+{
186
+ FSIMasterState *s = FSI_MASTER(o);
187
+
188
+ object_initialize_child(o, "cfam", &s->cfam, TYPE_FSI_CFAM);
189
+
190
+ qbus_init(&s->bus, sizeof(s->bus), TYPE_FSI_BUS, DEVICE(s), NULL);
191
+
192
+ memory_region_init_io(&s->iomem, OBJECT(s), &fsi_master_ops, s,
193
+ TYPE_FSI_MASTER, 0x10000000);
194
+ memory_region_init(&s->opb2fsi, OBJECT(s), "fsi.opb2fsi", 0x10000000);
195
+}
196
+
197
+static void fsi_master_realize(DeviceState *dev, Error **errp)
198
+{
199
+ FSIMasterState *s = FSI_MASTER(dev);
200
+
201
+ if (!qdev_realize(DEVICE(&s->cfam), BUS(&s->bus), errp)) {
202
+ return;
203
+ }
204
+
205
+ /* address ? */
206
+ memory_region_add_subregion(&s->opb2fsi, 0, &s->cfam.mr);
207
+}
208
+
209
+static void fsi_master_reset(DeviceState *dev)
210
+{
211
+ FSIMasterState *s = FSI_MASTER(dev);
212
+
213
+ /* Initialize registers */
214
+ memset(s->regs, 0, sizeof(s->regs));
215
+
216
+ /* ASPEED default */
217
+ s->regs[FSI_MVER] = 0xe0050101;
218
+}
219
+
220
+static void fsi_master_class_init(ObjectClass *klass, void *data)
221
+{
222
+ DeviceClass *dc = DEVICE_CLASS(klass);
223
+
224
+ dc->bus_type = TYPE_OP_BUS;
225
+ dc->desc = "FSI Master";
226
+ dc->realize = fsi_master_realize;
227
+ dc->reset = fsi_master_reset;
228
+}
229
+
230
+static const TypeInfo fsi_master_info = {
231
+ .name = TYPE_FSI_MASTER,
232
+ .parent = TYPE_DEVICE,
233
+ .instance_init = fsi_master_init,
234
+ .instance_size = sizeof(FSIMasterState),
235
+ .class_init = fsi_master_class_init,
236
+};
237
+
238
+static void fsi_register_types(void)
239
+{
240
+ type_register_static(&fsi_master_info);
241
+}
242
+
243
+type_init(fsi_register_types);
244
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
245
index XXXXXXX..XXXXXXX 100644
246
--- a/hw/fsi/meson.build
247
+++ b/hw/fsi/meson.build
248
@@ -1 +1 @@
249
-system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c','cfam.c'))
250
+system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c','cfam.c','fsi-master.c'))
251
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
252
index XXXXXXX..XXXXXXX 100644
253
--- a/hw/fsi/trace-events
254
+++ b/hw/fsi/trace-events
255
@@ -XXX,XX +XXX,XX @@ fsi_cfam_config_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64
256
fsi_cfam_unimplemented_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
257
fsi_cfam_unimplemented_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
258
fsi_cfam_config_write_noaddr(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
259
+fsi_master_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
260
+fsi_master_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
187
--
261
--
188
2.47.1
262
2.43.0
189
263
190
264
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
The testcases for ASPEED SMC model were placed in aspeed_smc-test.c.
3
This is a part of patchset where IBM's Flexible Service Interface is
4
However, this test file only supports for ARM32. To support all ASPEED SOCs
4
introduced.
5
such as AST2700 whose CPU architecture is aarch64, introduces a new
5
6
aspeed-smc-utils source file and move all common APIs and testcases
6
An APB-to-OPB bridge enabling access to the OPB from the ARM core in
7
from aspeed_smc-test.c to aspeed-smc-utils.c.
7
the AST2600. Hardware limitations prevent the OPB from being directly
8
8
mapped into APB, so all accesses are indirect through the bridge.
9
Finally, users are able to re-used these testcase for AST2700 and future
9
10
ASPEED SOCs testing.
10
The On-Chip Peripheral Bus (OPB): A low-speed bus typically found in
11
11
POWER processors. This now makes an appearance in the ASPEED SoC due
12
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
12
to tight integration of the FSI master IP with the OPB, mainly the
13
Reviewed-by: Cédric Le Goater <clg@redhat.com>
13
existence of an MMIO-mapping of the CFAM address straight onto a
14
Link: https://lore.kernel.org/r/20241127091543.1243114-10-jamin_lin@aspeedtech.com
14
sub-region of the OPB address space.
15
Signed-off-by: Cédric Le Goater <clg@redhat.com>
15
16
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
17
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
18
Reviewed-by: Cédric Le Goater <clg@kaod.org>
19
[ clg: - moved FSIMasterState under AspeedAPB2OPBState
20
- modified fsi_opb_fsi_master_address() and
21
fsi_opb_opb2fsi_address()
22
- instroduced fsi_aspeed_apb2opb_init()
23
- reworked fsi_aspeed_apb2opb_realize()
24
- removed FSIMasterState object and fsi_opb_realize()
25
- simplified OPBus
26
- introduced fsi_aspeed_apb2opb_rw to fix endianness issue ]
27
Signed-off-by: Cédric Le Goater <clg@kaod.org>
16
---
28
---
17
tests/qtest/aspeed-smc-utils.h | 95 ++++
29
include/hw/fsi/aspeed_apb2opb.h | 46 ++++
18
tests/qtest/aspeed-smc-utils.c | 686 ++++++++++++++++++++++++++++
30
hw/fsi/aspeed_apb2opb.c | 367 ++++++++++++++++++++++++++++++++
19
tests/qtest/aspeed_smc-test.c | 800 +++------------------------------
31
hw/arm/Kconfig | 1 +
20
tests/qtest/meson.build | 1 +
32
hw/fsi/Kconfig | 5 +
21
4 files changed, 841 insertions(+), 741 deletions(-)
33
hw/fsi/meson.build | 1 +
22
create mode 100644 tests/qtest/aspeed-smc-utils.h
34
hw/fsi/trace-events | 2 +
23
create mode 100644 tests/qtest/aspeed-smc-utils.c
35
6 files changed, 422 insertions(+)
24
36
create mode 100644 include/hw/fsi/aspeed_apb2opb.h
25
diff --git a/tests/qtest/aspeed-smc-utils.h b/tests/qtest/aspeed-smc-utils.h
37
create mode 100644 hw/fsi/aspeed_apb2opb.c
38
39
diff --git a/include/hw/fsi/aspeed_apb2opb.h b/include/hw/fsi/aspeed_apb2opb.h
26
new file mode 100644
40
new file mode 100644
27
index XXXXXXX..XXXXXXX
41
index XXXXXXX..XXXXXXX
28
--- /dev/null
42
--- /dev/null
29
+++ b/tests/qtest/aspeed-smc-utils.h
43
+++ b/include/hw/fsi/aspeed_apb2opb.h
30
@@ -XXX,XX +XXX,XX @@
44
@@ -XXX,XX +XXX,XX @@
31
+/*
45
+/*
32
+ * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
46
+ * SPDX-License-Identifier: GPL-2.0-or-later
33
+ * Controller)
47
+ * Copyright (C) 2024 IBM Corp.
34
+ *
48
+ *
35
+ * Copyright (C) 2016 IBM Corp.
49
+ * ASPEED APB2OPB Bridge
36
+ *
50
+ * IBM On-Chip Peripheral Bus
37
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
38
+ * of this software and associated documentation files (the "Software"), to deal
39
+ * in the Software without restriction, including without limitation the rights
40
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
41
+ * copies of the Software, and to permit persons to whom the Software is
42
+ * furnished to do so, subject to the following conditions:
43
+ *
44
+ * The above copyright notice and this permission notice shall be included in
45
+ * all copies or substantial portions of the Software.
46
+ *
47
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
48
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
49
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
50
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
51
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
52
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
53
+ * THE SOFTWARE.
54
+ */
51
+ */
55
+
52
+#ifndef FSI_ASPEED_APB2OPB_H
56
+#ifndef TESTS_ASPEED_SMC_UTILS_H
53
+#define FSI_ASPEED_APB2OPB_H
57
+#define TESTS_ASPEED_SMC_UTILS_H
54
+
58
+
55
+#include "exec/memory.h"
59
+#include "qemu/osdep.h"
56
+#include "hw/fsi/fsi-master.h"
60
+#include "qemu/bswap.h"
57
+#include "hw/sysbus.h"
61
+#include "libqtest-single.h"
58
+
62
+#include "qemu/bitops.h"
59
+#define TYPE_FSI_OPB "fsi.opb"
63
+
60
+
64
+/*
61
+#define TYPE_OP_BUS "opb"
65
+ * ASPEED SPI Controller registers
62
+OBJECT_DECLARE_SIMPLE_TYPE(OPBus, OP_BUS)
66
+ */
63
+
67
+#define R_CONF 0x00
64
+typedef struct OPBus {
68
+#define CONF_ENABLE_W0 16
65
+ BusState bus;
69
+#define R_CE_CTRL 0x04
66
+
70
+#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
67
+ MemoryRegion mr;
71
+#define R_CTRL0 0x10
68
+ AddressSpace as;
72
+#define CTRL_IO_QUAD_IO BIT(31)
69
+} OPBus;
73
+#define CTRL_CE_STOP_ACTIVE BIT(2)
70
+
74
+#define CTRL_READMODE 0x0
71
+#define TYPE_ASPEED_APB2OPB "aspeed.apb2opb"
75
+#define CTRL_FREADMODE 0x1
72
+OBJECT_DECLARE_SIMPLE_TYPE(AspeedAPB2OPBState, ASPEED_APB2OPB)
76
+#define CTRL_WRITEMODE 0x2
73
+
77
+#define CTRL_USERMODE 0x3
74
+#define ASPEED_APB2OPB_NR_REGS ((0xe8 >> 2) + 1)
78
+#define SR_WEL BIT(1)
75
+
79
+
76
+#define ASPEED_FSI_NUM 2
80
+/*
77
+
81
+ * Flash commands
78
+typedef struct AspeedAPB2OPBState {
82
+ */
79
+ SysBusDevice parent_obj;
83
+enum {
80
+
84
+ JEDEC_READ = 0x9f,
81
+ MemoryRegion iomem;
85
+ RDSR = 0x5,
82
+
86
+ WRDI = 0x4,
83
+ uint32_t regs[ASPEED_APB2OPB_NR_REGS];
87
+ BULK_ERASE = 0xc7,
84
+ qemu_irq irq;
88
+ READ = 0x03,
85
+
89
+ PP = 0x02,
86
+ OPBus opb[ASPEED_FSI_NUM];
90
+ WRSR = 0x1,
87
+ FSIMasterState fsi[ASPEED_FSI_NUM];
91
+ WREN = 0x6,
88
+} AspeedAPB2OPBState;
92
+ SRWD = 0x80,
89
+
93
+ RESET_ENABLE = 0x66,
90
+#endif /* FSI_ASPEED_APB2OPB_H */
94
+ RESET_MEMORY = 0x99,
91
diff --git a/hw/fsi/aspeed_apb2opb.c b/hw/fsi/aspeed_apb2opb.c
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
92
new file mode 100644
128
index XXXXXXX..XXXXXXX
93
index XXXXXXX..XXXXXXX
129
--- /dev/null
94
--- /dev/null
130
+++ b/tests/qtest/aspeed-smc-utils.c
95
+++ b/hw/fsi/aspeed_apb2opb.c
131
@@ -XXX,XX +XXX,XX @@
96
@@ -XXX,XX +XXX,XX @@
132
+/*
97
+/*
133
+ * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
98
+ * SPDX-License-Identifier: GPL-2.0-or-later
134
+ * Controller)
99
+ * Copyright (C) 2024 IBM Corp.
135
+ *
100
+ *
136
+ * Copyright (C) 2016 IBM Corp.
101
+ * ASPEED APB-OPB FSI interface
137
+ *
102
+ * IBM On-chip Peripheral Bus
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
+ */
103
+ */
156
+
104
+
157
+#include "qemu/osdep.h"
105
+#include "qemu/osdep.h"
158
+#include "qemu/bswap.h"
106
+#include "qemu/log.h"
159
+#include "libqtest-single.h"
107
+#include "qom/object.h"
160
+#include "qemu/bitops.h"
108
+#include "qapi/error.h"
161
+#include "aspeed-smc-utils.h"
109
+#include "trace.h"
110
+
111
+#include "hw/fsi/aspeed_apb2opb.h"
112
+#include "hw/qdev-core.h"
113
+
114
+#define TO_REG(x) (x >> 2)
115
+
116
+#define APB2OPB_VERSION TO_REG(0x00)
117
+#define APB2OPB_TRIGGER TO_REG(0x04)
118
+
119
+#define APB2OPB_CONTROL TO_REG(0x08)
120
+#define APB2OPB_CONTROL_OFF BE_GENMASK(31, 13)
121
+
122
+#define APB2OPB_OPB2FSI TO_REG(0x0c)
123
+#define APB2OPB_OPB2FSI_OFF BE_GENMASK(31, 22)
124
+
125
+#define APB2OPB_OPB0_SEL TO_REG(0x10)
126
+#define APB2OPB_OPB1_SEL TO_REG(0x28)
127
+#define APB2OPB_OPB_SEL_EN BIT(0)
128
+
129
+#define APB2OPB_OPB0_MODE TO_REG(0x14)
130
+#define APB2OPB_OPB1_MODE TO_REG(0x2c)
131
+#define APB2OPB_OPB_MODE_RD BIT(0)
132
+
133
+#define APB2OPB_OPB0_XFER TO_REG(0x18)
134
+#define APB2OPB_OPB1_XFER TO_REG(0x30)
135
+#define APB2OPB_OPB_XFER_FULL BIT(1)
136
+#define APB2OPB_OPB_XFER_HALF BIT(0)
137
+
138
+#define APB2OPB_OPB0_ADDR TO_REG(0x1c)
139
+#define APB2OPB_OPB0_WRITE_DATA TO_REG(0x20)
140
+
141
+#define APB2OPB_OPB1_ADDR TO_REG(0x34)
142
+#define APB2OPB_OPB1_WRITE_DATA TO_REG(0x38)
143
+
144
+#define APB2OPB_IRQ_STS TO_REG(0x48)
145
+#define APB2OPB_IRQ_STS_OPB1_TX_ACK BIT(17)
146
+#define APB2OPB_IRQ_STS_OPB0_TX_ACK BIT(16)
147
+
148
+#define APB2OPB_OPB0_WRITE_WORD_ENDIAN TO_REG(0x4c)
149
+#define APB2OPB_OPB0_WRITE_WORD_ENDIAN_BE 0x0011101b
150
+#define APB2OPB_OPB0_WRITE_BYTE_ENDIAN TO_REG(0x50)
151
+#define APB2OPB_OPB0_WRITE_BYTE_ENDIAN_BE 0x0c330f3f
152
+#define APB2OPB_OPB1_WRITE_WORD_ENDIAN TO_REG(0x54)
153
+#define APB2OPB_OPB1_WRITE_BYTE_ENDIAN TO_REG(0x58)
154
+#define APB2OPB_OPB0_READ_BYTE_ENDIAN TO_REG(0x5c)
155
+#define APB2OPB_OPB1_READ_BYTE_ENDIAN TO_REG(0x60)
156
+#define APB2OPB_OPB0_READ_WORD_ENDIAN_BE 0x00030b1b
157
+
158
+#define APB2OPB_OPB0_READ_DATA TO_REG(0x84)
159
+#define APB2OPB_OPB1_READ_DATA TO_REG(0x90)
162
+
160
+
163
+/*
161
+/*
164
+ * Use an explicit bswap for the values read/wrote to the flash region
162
+ * The following magic values came from AST2600 data sheet
165
+ * as they are BE and the Aspeed CPU is LE.
163
+ * The register values are defined under section "FSI controller"
164
+ * as initial values.
166
+ */
165
+ */
167
+static inline uint32_t make_be32(uint32_t data)
166
+static const uint32_t aspeed_apb2opb_reset[ASPEED_APB2OPB_NR_REGS] = {
168
+{
167
+ [APB2OPB_VERSION] = 0x000000a1,
169
+ return bswap32(data);
168
+ [APB2OPB_OPB0_WRITE_WORD_ENDIAN] = 0x0044eee4,
170
+}
169
+ [APB2OPB_OPB0_WRITE_BYTE_ENDIAN] = 0x0055aaff,
171
+
170
+ [APB2OPB_OPB1_WRITE_WORD_ENDIAN] = 0x00117717,
172
+static inline void spi_writel(const AspeedSMCTestData *data, uint64_t offset,
171
+ [APB2OPB_OPB1_WRITE_BYTE_ENDIAN] = 0xffaa5500,
173
+ uint32_t value)
172
+ [APB2OPB_OPB0_READ_BYTE_ENDIAN] = 0x0044eee4,
174
+{
173
+ [APB2OPB_OPB1_READ_BYTE_ENDIAN] = 0x00117717
175
+ qtest_writel(data->s, data->spi_base + offset, value);
174
+};
176
+}
175
+
177
+
176
+static void fsi_opb_fsi_master_address(FSIMasterState *fsi, hwaddr addr)
178
+static inline uint32_t spi_readl(const AspeedSMCTestData *data, uint64_t offset)
177
+{
179
+{
178
+ memory_region_transaction_begin();
180
+ return qtest_readl(data->s, data->spi_base + offset);
179
+ memory_region_set_address(&fsi->iomem, addr);
181
+}
180
+ memory_region_transaction_commit();
182
+
181
+}
183
+static inline void flash_writeb(const AspeedSMCTestData *data, uint64_t offset,
182
+
184
+ uint8_t value)
183
+static void fsi_opb_opb2fsi_address(FSIMasterState *fsi, hwaddr addr)
185
+{
184
+{
186
+ qtest_writeb(data->s, data->flash_base + offset, value);
185
+ memory_region_transaction_begin();
187
+}
186
+ memory_region_set_address(&fsi->opb2fsi, addr);
188
+
187
+ memory_region_transaction_commit();
189
+static inline void flash_writel(const AspeedSMCTestData *data, uint64_t offset,
188
+}
190
+ uint32_t value)
189
+
191
+{
190
+static uint64_t fsi_aspeed_apb2opb_read(void *opaque, hwaddr addr,
192
+ qtest_writel(data->s, data->flash_base + offset, value);
191
+ unsigned size)
193
+}
192
+{
194
+
193
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(opaque);
195
+static inline uint8_t flash_readb(const AspeedSMCTestData *data,
194
+ unsigned int reg = TO_REG(addr);
196
+ uint64_t offset)
195
+
197
+{
196
+ trace_fsi_aspeed_apb2opb_read(addr, size);
198
+ return qtest_readb(data->s, data->flash_base + offset);
197
+
199
+}
198
+ if (reg >= ASPEED_APB2OPB_NR_REGS) {
200
+
199
+ qemu_log_mask(LOG_GUEST_ERROR,
201
+static inline uint32_t flash_readl(const AspeedSMCTestData *data,
200
+ "%s: Out of bounds read: 0x%"HWADDR_PRIx" for %u\n",
202
+ uint64_t offset)
201
+ __func__, addr, size);
203
+{
202
+ return 0;
204
+ return qtest_readl(data->s, data->flash_base + offset);
203
+ }
205
+}
204
+
206
+
205
+ return s->regs[reg];
207
+static void spi_conf(const AspeedSMCTestData *data, uint32_t value)
206
+}
208
+{
207
+
209
+ uint32_t conf = spi_readl(data, R_CONF);
208
+static MemTxResult fsi_aspeed_apb2opb_rw(AddressSpace *as, hwaddr addr,
210
+
209
+ MemTxAttrs attrs, uint32_t *data,
211
+ conf |= value;
210
+ uint32_t size, bool is_write)
212
+ spi_writel(data, R_CONF, conf);
211
+{
213
+}
212
+ MemTxResult res;
214
+
213
+
215
+static void spi_conf_remove(const AspeedSMCTestData *data, uint32_t value)
214
+ if (is_write) {
216
+{
215
+ switch (size) {
217
+ uint32_t conf = spi_readl(data, R_CONF);
216
+ case 4:
218
+
217
+ address_space_stl_le(as, addr, *data, attrs, &res);
219
+ conf &= ~value;
218
+ break;
220
+ spi_writel(data, R_CONF, conf);
219
+ case 2:
221
+}
220
+ address_space_stw_le(as, addr, *data, attrs, &res);
222
+
221
+ break;
223
+static void spi_ce_ctrl(const AspeedSMCTestData *data, uint32_t value)
222
+ case 1:
224
+{
223
+ address_space_stb(as, addr, *data, attrs, &res);
225
+ uint32_t conf = spi_readl(data, R_CE_CTRL);
224
+ break;
226
+
225
+ default:
227
+ conf |= value;
226
+ g_assert_not_reached();
228
+ spi_writel(data, R_CE_CTRL, conf);
227
+ }
229
+}
228
+ } else {
230
+
229
+ switch (size) {
231
+static void spi_ctrl_setmode(const AspeedSMCTestData *data, uint8_t mode,
230
+ case 4:
232
+ uint8_t cmd)
231
+ *data = address_space_ldl_le(as, addr, attrs, &res);
233
+{
232
+ break;
234
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
233
+ case 2:
235
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
234
+ *data = address_space_lduw_le(as, addr, attrs, &res);
236
+ ctrl &= ~(CTRL_USERMODE | 0xff << 16);
235
+ break;
237
+ ctrl |= mode | (cmd << 16);
236
+ case 1:
238
+ spi_writel(data, ctrl_reg, ctrl);
237
+ *data = address_space_ldub(as, addr, attrs, &res);
239
+}
238
+ break;
240
+
239
+ default:
241
+static void spi_ctrl_start_user(const AspeedSMCTestData *data)
240
+ g_assert_not_reached();
242
+{
241
+ }
243
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
242
+ }
244
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
243
+ return res;
245
+
244
+}
246
+ ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
245
+
247
+ spi_writel(data, ctrl_reg, ctrl);
246
+static void fsi_aspeed_apb2opb_write(void *opaque, hwaddr addr, uint64_t data,
248
+
247
+ unsigned size)
249
+ ctrl &= ~CTRL_CE_STOP_ACTIVE;
248
+{
250
+ spi_writel(data, ctrl_reg, ctrl);
249
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(opaque);
251
+}
250
+ unsigned int reg = TO_REG(addr);
252
+
251
+
253
+static void spi_ctrl_stop_user(const AspeedSMCTestData *data)
252
+ trace_fsi_aspeed_apb2opb_write(addr, size, data);
254
+{
253
+
255
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
254
+ if (reg >= ASPEED_APB2OPB_NR_REGS) {
256
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
255
+ qemu_log_mask(LOG_GUEST_ERROR,
257
+
256
+ "%s: Out of bounds write: %"HWADDR_PRIx" for %u\n",
258
+ ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
257
+ __func__, addr, size);
259
+ spi_writel(data, ctrl_reg, ctrl);
258
+ return;
260
+}
259
+ }
261
+
260
+
262
+static void spi_ctrl_set_io_mode(const AspeedSMCTestData *data, uint32_t value)
261
+ switch (reg) {
263
+{
262
+ case APB2OPB_CONTROL:
264
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
263
+ fsi_opb_fsi_master_address(&s->fsi[0],
265
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
264
+ data & APB2OPB_CONTROL_OFF);
266
+ uint32_t mode;
265
+ break;
267
+
266
+ case APB2OPB_OPB2FSI:
268
+ mode = value & CTRL_IO_MODE_MASK;
267
+ fsi_opb_opb2fsi_address(&s->fsi[0],
269
+ ctrl &= ~CTRL_IO_MODE_MASK;
268
+ data & APB2OPB_OPB2FSI_OFF);
270
+ ctrl |= mode;
269
+ break;
271
+ spi_writel(data, ctrl_reg, ctrl);
270
+ case APB2OPB_OPB0_WRITE_WORD_ENDIAN:
272
+}
271
+ if (data != APB2OPB_OPB0_WRITE_WORD_ENDIAN_BE) {
273
+
272
+ qemu_log_mask(LOG_GUEST_ERROR,
274
+static void flash_reset(const AspeedSMCTestData *data)
273
+ "%s: Bridge needs to be driven as BE (0x%x)\n",
275
+{
274
+ __func__, APB2OPB_OPB0_WRITE_WORD_ENDIAN_BE);
276
+ spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
275
+ }
277
+
276
+ break;
278
+ spi_ctrl_start_user(data);
277
+ case APB2OPB_OPB0_WRITE_BYTE_ENDIAN:
279
+ flash_writeb(data, 0, RESET_ENABLE);
278
+ if (data != APB2OPB_OPB0_WRITE_BYTE_ENDIAN_BE) {
280
+ flash_writeb(data, 0, RESET_MEMORY);
279
+ qemu_log_mask(LOG_GUEST_ERROR,
281
+ flash_writeb(data, 0, WREN);
280
+ "%s: Bridge needs to be driven as BE (0x%x)\n",
282
+ flash_writeb(data, 0, BULK_ERASE);
281
+ __func__, APB2OPB_OPB0_WRITE_BYTE_ENDIAN_BE);
283
+ flash_writeb(data, 0, WRDI);
282
+ }
284
+ spi_ctrl_stop_user(data);
283
+ break;
285
+
284
+ case APB2OPB_OPB0_READ_BYTE_ENDIAN:
286
+ spi_conf_remove(data, 1 << (CONF_ENABLE_W0 + data->cs));
285
+ if (data != APB2OPB_OPB0_READ_WORD_ENDIAN_BE) {
287
+}
286
+ qemu_log_mask(LOG_GUEST_ERROR,
288
+
287
+ "%s: Bridge needs to be driven as BE (0x%x)\n",
289
+static void read_page(const AspeedSMCTestData *data, uint32_t addr,
288
+ __func__, APB2OPB_OPB0_READ_WORD_ENDIAN_BE);
290
+ uint32_t *page)
289
+ }
291
+{
290
+ break;
291
+ case APB2OPB_TRIGGER:
292
+ {
293
+ uint32_t opb, op_mode, op_size, op_addr, op_data;
294
+ MemTxResult result;
295
+ bool is_write;
296
+ int index;
297
+ AddressSpace *as;
298
+
299
+ assert((s->regs[APB2OPB_OPB0_SEL] & APB2OPB_OPB_SEL_EN) ^
300
+ (s->regs[APB2OPB_OPB1_SEL] & APB2OPB_OPB_SEL_EN));
301
+
302
+ if (s->regs[APB2OPB_OPB0_SEL] & APB2OPB_OPB_SEL_EN) {
303
+ opb = 0;
304
+ op_mode = s->regs[APB2OPB_OPB0_MODE];
305
+ op_size = s->regs[APB2OPB_OPB0_XFER];
306
+ op_addr = s->regs[APB2OPB_OPB0_ADDR];
307
+ op_data = s->regs[APB2OPB_OPB0_WRITE_DATA];
308
+ } else if (s->regs[APB2OPB_OPB1_SEL] & APB2OPB_OPB_SEL_EN) {
309
+ opb = 1;
310
+ op_mode = s->regs[APB2OPB_OPB1_MODE];
311
+ op_size = s->regs[APB2OPB_OPB1_XFER];
312
+ op_addr = s->regs[APB2OPB_OPB1_ADDR];
313
+ op_data = s->regs[APB2OPB_OPB1_WRITE_DATA];
314
+ } else {
315
+ qemu_log_mask(LOG_GUEST_ERROR,
316
+ "%s: Invalid operation: 0x%"HWADDR_PRIx" for %u\n",
317
+ __func__, addr, size);
318
+ return;
319
+ }
320
+
321
+ if (op_size & ~(APB2OPB_OPB_XFER_HALF | APB2OPB_OPB_XFER_FULL)) {
322
+ qemu_log_mask(LOG_GUEST_ERROR,
323
+ "OPB transaction failed: Unrecognized access width: %d\n",
324
+ op_size);
325
+ return;
326
+ }
327
+
328
+ op_size += 1;
329
+ is_write = !(op_mode & APB2OPB_OPB_MODE_RD);
330
+ index = opb ? APB2OPB_OPB1_READ_DATA : APB2OPB_OPB0_READ_DATA;
331
+ as = &s->opb[opb].as;
332
+
333
+ result = fsi_aspeed_apb2opb_rw(as, op_addr, MEMTXATTRS_UNSPECIFIED,
334
+ &op_data, op_size, is_write);
335
+ if (result != MEMTX_OK) {
336
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: OPB %s failed @%08x\n",
337
+ __func__, is_write ? "write" : "read", op_addr);
338
+ return;
339
+ }
340
+
341
+ if (!is_write) {
342
+ s->regs[index] = op_data;
343
+ }
344
+
345
+ s->regs[APB2OPB_IRQ_STS] |= opb ? APB2OPB_IRQ_STS_OPB1_TX_ACK
346
+ : APB2OPB_IRQ_STS_OPB0_TX_ACK;
347
+ break;
348
+ }
349
+ }
350
+
351
+ s->regs[reg] = data;
352
+}
353
+
354
+static const struct MemoryRegionOps aspeed_apb2opb_ops = {
355
+ .read = fsi_aspeed_apb2opb_read,
356
+ .write = fsi_aspeed_apb2opb_write,
357
+ .valid.max_access_size = 4,
358
+ .valid.min_access_size = 4,
359
+ .impl.max_access_size = 4,
360
+ .impl.min_access_size = 4,
361
+ .endianness = DEVICE_LITTLE_ENDIAN,
362
+};
363
+
364
+static void fsi_aspeed_apb2opb_init(Object *o)
365
+{
366
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(o);
292
+ int i;
367
+ int i;
293
+
368
+
294
+ spi_ctrl_start_user(data);
369
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
295
+
370
+ object_initialize_child(o, "fsi-master[*]", &s->fsi[i],
296
+ flash_writeb(data, 0, EN_4BYTE_ADDR);
371
+ TYPE_FSI_MASTER);
297
+ flash_writeb(data, 0, READ);
372
+ }
298
+ flash_writel(data, 0, make_be32(addr));
373
+}
299
+
374
+
300
+ /* Continuous read are supported */
375
+static void fsi_aspeed_apb2opb_realize(DeviceState *dev, Error **errp)
301
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
376
+{
302
+ page[i] = make_be32(flash_readl(data, 0));
377
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
303
+ }
378
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(dev);
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;
379
+ int i;
311
+
380
+
312
+ /* move out USER mode to use direct reads from the AHB bus */
313
+ spi_ctrl_setmode(data, CTRL_READMODE, READ);
314
+
315
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
316
+ page[i] = make_be32(flash_readl(data, addr + i * 4));
317
+ }
318
+}
319
+
320
+static void write_page_mem(const AspeedSMCTestData *data, uint32_t addr,
321
+ uint32_t write_value)
322
+{
323
+ spi_ctrl_setmode(data, CTRL_WRITEMODE, PP);
324
+
325
+ for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
326
+ flash_writel(data, addr + i * 4, write_value);
327
+ }
328
+}
329
+
330
+static void assert_page_mem(const AspeedSMCTestData *data, uint32_t addr,
331
+ uint32_t expected_value)
332
+{
333
+ uint32_t page[FLASH_PAGE_SIZE / 4];
334
+ read_page_mem(data, addr, page);
335
+ for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
336
+ g_assert_cmphex(page[i], ==, expected_value);
337
+ }
338
+}
339
+
340
+void aspeed_smc_test_read_jedec(const void *data)
341
+{
342
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
343
+ uint32_t jedec = 0x0;
344
+
345
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
346
+
347
+ spi_ctrl_start_user(test_data);
348
+ flash_writeb(test_data, 0, JEDEC_READ);
349
+ jedec |= flash_readb(test_data, 0) << 16;
350
+ jedec |= flash_readb(test_data, 0) << 8;
351
+ jedec |= flash_readb(test_data, 0);
352
+ spi_ctrl_stop_user(test_data);
353
+
354
+ flash_reset(test_data);
355
+
356
+ g_assert_cmphex(jedec, ==, test_data->jedec_id);
357
+}
358
+
359
+void aspeed_smc_test_erase_sector(const void *data)
360
+{
361
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
362
+ uint32_t some_page_addr = test_data->page_addr;
363
+ uint32_t page[FLASH_PAGE_SIZE / 4];
364
+ int i;
365
+
366
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
367
+
368
+ /*
381
+ /*
369
+ * Previous page should be full of 0xffs after backend is
382
+ * TODO: The OPBus model initializes the OPB address space in
370
+ * initialized
383
+ * the .instance_init handler and this is problematic for test
384
+ * device-introspect-test. To avoid a memory corruption and a QEMU
385
+ * crash, qbus_init() should be called from realize(). Something to
386
+ * improve. Possibly, OPBus could also be removed.
371
+ */
387
+ */
372
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
388
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
373
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
389
+ qbus_init(&s->opb[i], sizeof(s->opb[i]), TYPE_OP_BUS, DEVICE(s),
374
+ g_assert_cmphex(page[i], ==, 0xffffffff);
390
+ NULL);
375
+ }
391
+ }
376
+
392
+
377
+ spi_ctrl_start_user(test_data);
393
+ sysbus_init_irq(sbd, &s->irq);
378
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
394
+
379
+ flash_writeb(test_data, 0, WREN);
395
+ memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_apb2opb_ops, s,
380
+ flash_writeb(test_data, 0, PP);
396
+ TYPE_ASPEED_APB2OPB, 0x1000);
381
+ flash_writel(test_data, 0, make_be32(some_page_addr));
397
+ sysbus_init_mmio(sbd, &s->iomem);
382
+
398
+
383
+ /* Fill the page with its own addresses */
399
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
384
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
400
+ if (!qdev_realize(DEVICE(&s->fsi[i]), BUS(&s->opb[i]), errp)) {
385
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
401
+ return;
386
+ }
402
+ }
387
+ spi_ctrl_stop_user(test_data);
403
+
388
+
404
+ memory_region_add_subregion(&s->opb[i].mr, 0x80000000,
389
+ /* Check the page is correctly written */
405
+ &s->fsi[i].iomem);
390
+ read_page(test_data, some_page_addr, page);
406
+
391
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
407
+ memory_region_add_subregion(&s->opb[i].mr, 0xa0000000,
392
+ g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
408
+ &s->fsi[i].opb2fsi);
393
+ }
409
+ }
394
+
410
+}
395
+ spi_ctrl_start_user(test_data);
411
+
396
+ flash_writeb(test_data, 0, WREN);
412
+static void fsi_aspeed_apb2opb_reset(DeviceState *dev)
397
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
413
+{
398
+ flash_writeb(test_data, 0, ERASE_SECTOR);
414
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(dev);
399
+ flash_writel(test_data, 0, make_be32(some_page_addr));
415
+
400
+ spi_ctrl_stop_user(test_data);
416
+ memcpy(s->regs, aspeed_apb2opb_reset, ASPEED_APB2OPB_NR_REGS);
401
+
417
+}
402
+ /* Check the page is erased */
418
+
403
+ read_page(test_data, some_page_addr, page);
419
+static void fsi_aspeed_apb2opb_class_init(ObjectClass *klass, void *data)
404
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
420
+{
405
+ g_assert_cmphex(page[i], ==, 0xffffffff);
421
+ DeviceClass *dc = DEVICE_CLASS(klass);
406
+ }
422
+
407
+
423
+ dc->desc = "ASPEED APB2OPB Bridge";
408
+ flash_reset(test_data);
424
+ dc->realize = fsi_aspeed_apb2opb_realize;
409
+}
425
+ dc->reset = fsi_aspeed_apb2opb_reset;
410
+
426
+}
411
+void aspeed_smc_test_erase_all(const void *data)
427
+
412
+{
428
+static const TypeInfo aspeed_apb2opb_info = {
413
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
429
+ .name = TYPE_ASPEED_APB2OPB,
414
+ uint32_t some_page_addr = test_data->page_addr;
430
+ .parent = TYPE_SYS_BUS_DEVICE,
415
+ uint32_t page[FLASH_PAGE_SIZE / 4];
431
+ .instance_init = fsi_aspeed_apb2opb_init,
416
+ int i;
432
+ .instance_size = sizeof(AspeedAPB2OPBState),
417
+
433
+ .class_init = fsi_aspeed_apb2opb_class_init,
418
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
434
+};
419
+
435
+
420
+ /*
436
+static void aspeed_apb2opb_register_types(void)
421
+ * Previous page should be full of 0xffs after backend is
437
+{
422
+ * initialized
438
+ type_register_static(&aspeed_apb2opb_info);
423
+ */
439
+}
424
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
440
+
425
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
441
+type_init(aspeed_apb2opb_register_types);
426
+ g_assert_cmphex(page[i], ==, 0xffffffff);
442
+
427
+ }
443
+static void fsi_opb_init(Object *o)
428
+
444
+{
429
+ spi_ctrl_start_user(test_data);
445
+ OPBus *opb = OP_BUS(o);
430
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
446
+
431
+ flash_writeb(test_data, 0, WREN);
447
+ memory_region_init(&opb->mr, 0, TYPE_FSI_OPB, UINT32_MAX);
432
+ flash_writeb(test_data, 0, PP);
448
+ address_space_init(&opb->as, &opb->mr, TYPE_FSI_OPB);
433
+ flash_writel(test_data, 0, make_be32(some_page_addr));
449
+}
434
+
450
+
435
+ /* Fill the page with its own addresses */
451
+static const TypeInfo opb_info = {
436
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
452
+ .name = TYPE_OP_BUS,
437
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
453
+ .parent = TYPE_BUS,
438
+ }
454
+ .instance_init = fsi_opb_init,
439
+ spi_ctrl_stop_user(test_data);
455
+ .instance_size = sizeof(OPBus),
440
+
456
+};
441
+ /* Check the page is correctly written */
457
+
442
+ read_page(test_data, some_page_addr, page);
458
+static void fsi_opb_register_types(void)
443
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
459
+{
444
+ g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
460
+ type_register_static(&opb_info);
445
+ }
461
+}
446
+
462
+
447
+ spi_ctrl_start_user(test_data);
463
+type_init(fsi_opb_register_types);
448
+ flash_writeb(test_data, 0, WREN);
464
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
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
465
index XXXXXXX..XXXXXXX 100644
820
--- a/tests/qtest/aspeed_smc-test.c
466
--- a/hw/arm/Kconfig
821
+++ b/tests/qtest/aspeed_smc-test.c
467
+++ b/hw/arm/Kconfig
468
@@ -XXX,XX +XXX,XX @@ config ASPEED_SOC
469
select LED
470
select PMBUS
471
select MAX31785
472
+ select FSI_APB2OPB_ASPEED
473
474
config MPS2
475
bool
476
diff --git a/hw/fsi/Kconfig b/hw/fsi/Kconfig
477
index XXXXXXX..XXXXXXX 100644
478
--- a/hw/fsi/Kconfig
479
+++ b/hw/fsi/Kconfig
822
@@ -XXX,XX +XXX,XX @@
480
@@ -XXX,XX +XXX,XX @@
823
#include "qemu/bswap.h"
481
+config FSI_APB2OPB_ASPEED
824
#include "libqtest-single.h"
482
+ bool
825
#include "qemu/bitops.h"
483
+ depends on ASPEED_SOC
826
+#include "aspeed-smc-utils.h"
484
+ select FSI
827
485
+
828
-/*
486
config FSI
829
- * ASPEED SPI Controller registers
487
bool
830
- */
488
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
831
-#define R_CONF 0x00
832
-#define CONF_ENABLE_W0 16
833
-#define R_CE_CTRL 0x04
834
-#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
835
-#define R_CTRL0 0x10
836
-#define CTRL_IO_QUAD_IO BIT(31)
837
-#define CTRL_CE_STOP_ACTIVE BIT(2)
838
-#define CTRL_READMODE 0x0
839
-#define CTRL_FREADMODE 0x1
840
-#define CTRL_WRITEMODE 0x2
841
-#define CTRL_USERMODE 0x3
842
-#define SR_WEL BIT(1)
843
-
844
-/*
845
- * Flash commands
846
- */
847
-enum {
848
- JEDEC_READ = 0x9f,
849
- RDSR = 0x5,
850
- WRDI = 0x4,
851
- BULK_ERASE = 0xc7,
852
- READ = 0x03,
853
- PP = 0x02,
854
- WRSR = 0x1,
855
- WREN = 0x6,
856
- SRWD = 0x80,
857
- RESET_ENABLE = 0x66,
858
- RESET_MEMORY = 0x99,
859
- EN_4BYTE_ADDR = 0xB7,
860
- ERASE_SECTOR = 0xd8,
861
-};
862
-
863
-#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
864
-#define FLASH_PAGE_SIZE 256
865
-
866
-typedef struct TestData {
867
- QTestState *s;
868
- uint64_t spi_base;
869
- uint64_t flash_base;
870
- uint32_t jedec_id;
871
- char *tmp_path;
872
- uint8_t cs;
873
- const char *node;
874
- uint32_t page_addr;
875
-} TestData;
876
-
877
-/*
878
- * Use an explicit bswap for the values read/wrote to the flash region
879
- * as they are BE and the Aspeed CPU is LE.
880
- */
881
-static inline uint32_t make_be32(uint32_t data)
882
-{
883
- return bswap32(data);
884
-}
885
-
886
-static inline void spi_writel(const TestData *data, uint64_t offset,
887
- uint32_t value)
888
-{
889
- qtest_writel(data->s, data->spi_base + offset, value);
890
-}
891
-
892
-static inline uint32_t spi_readl(const TestData *data, uint64_t offset)
893
-{
894
- return qtest_readl(data->s, data->spi_base + offset);
895
-}
896
-
897
-static inline void flash_writeb(const TestData *data, uint64_t offset,
898
- uint8_t value)
899
-{
900
- qtest_writeb(data->s, data->flash_base + offset, value);
901
-}
902
-
903
-static inline void flash_writel(const TestData *data, uint64_t offset,
904
- uint32_t value)
905
-{
906
- qtest_writel(data->s, data->flash_base + offset, value);
907
-}
908
-
909
-static inline uint8_t flash_readb(const TestData *data, uint64_t offset)
910
-{
911
- return qtest_readb(data->s, data->flash_base + offset);
912
-}
913
-
914
-static inline uint32_t flash_readl(const TestData *data, uint64_t offset)
915
-{
916
- return qtest_readl(data->s, data->flash_base + offset);
917
-}
918
-
919
-static void spi_conf(const TestData *data, uint32_t value)
920
-{
921
- uint32_t conf = spi_readl(data, R_CONF);
922
-
923
- conf |= value;
924
- spi_writel(data, R_CONF, conf);
925
-}
926
-
927
-static void spi_conf_remove(const TestData *data, uint32_t value)
928
-{
929
- uint32_t conf = spi_readl(data, R_CONF);
930
-
931
- conf &= ~value;
932
- spi_writel(data, R_CONF, conf);
933
-}
934
-
935
-static void spi_ce_ctrl(const TestData *data, uint32_t value)
936
-{
937
- uint32_t conf = spi_readl(data, R_CE_CTRL);
938
-
939
- conf |= value;
940
- spi_writel(data, R_CE_CTRL, conf);
941
-}
942
-
943
-static void spi_ctrl_setmode(const TestData *data, uint8_t mode, uint8_t cmd)
944
-{
945
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
946
- uint32_t ctrl = spi_readl(data, ctrl_reg);
947
- ctrl &= ~(CTRL_USERMODE | 0xff << 16);
948
- ctrl |= mode | (cmd << 16);
949
- spi_writel(data, ctrl_reg, ctrl);
950
-}
951
-
952
-static void spi_ctrl_start_user(const TestData *data)
953
-{
954
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
955
- uint32_t ctrl = spi_readl(data, ctrl_reg);
956
-
957
- ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
958
- spi_writel(data, ctrl_reg, ctrl);
959
-
960
- ctrl &= ~CTRL_CE_STOP_ACTIVE;
961
- spi_writel(data, ctrl_reg, ctrl);
962
-}
963
-
964
-static void spi_ctrl_stop_user(const TestData *data)
965
-{
966
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
967
- uint32_t ctrl = spi_readl(data, ctrl_reg);
968
-
969
- ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
970
- spi_writel(data, ctrl_reg, ctrl);
971
-}
972
-
973
-static void spi_ctrl_set_io_mode(const TestData *data, uint32_t value)
974
-{
975
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
976
- uint32_t ctrl = spi_readl(data, ctrl_reg);
977
- uint32_t mode;
978
-
979
- mode = value & CTRL_IO_MODE_MASK;
980
- ctrl &= ~CTRL_IO_MODE_MASK;
981
- ctrl |= mode;
982
- spi_writel(data, ctrl_reg, ctrl);
983
-}
984
-
985
-static void flash_reset(const TestData *data)
986
-{
987
- spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
988
-
989
- spi_ctrl_start_user(data);
990
- flash_writeb(data, 0, RESET_ENABLE);
991
- flash_writeb(data, 0, RESET_MEMORY);
992
- flash_writeb(data, 0, WREN);
993
- flash_writeb(data, 0, BULK_ERASE);
994
- flash_writeb(data, 0, WRDI);
995
- spi_ctrl_stop_user(data);
996
-
997
- spi_conf_remove(data, 1 << (CONF_ENABLE_W0 + data->cs));
998
-}
999
-
1000
-static void test_read_jedec(const void *data)
1001
-{
1002
- const TestData *test_data = (const TestData *)data;
1003
- uint32_t jedec = 0x0;
1004
-
1005
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1006
-
1007
- spi_ctrl_start_user(test_data);
1008
- flash_writeb(test_data, 0, JEDEC_READ);
1009
- jedec |= flash_readb(test_data, 0) << 16;
1010
- jedec |= flash_readb(test_data, 0) << 8;
1011
- jedec |= flash_readb(test_data, 0);
1012
- spi_ctrl_stop_user(test_data);
1013
-
1014
- flash_reset(test_data);
1015
-
1016
- g_assert_cmphex(jedec, ==, test_data->jedec_id);
1017
-}
1018
-
1019
-static void read_page(const TestData *data, uint32_t addr, uint32_t *page)
1020
-{
1021
- int i;
1022
-
1023
- spi_ctrl_start_user(data);
1024
-
1025
- flash_writeb(data, 0, EN_4BYTE_ADDR);
1026
- flash_writeb(data, 0, READ);
1027
- flash_writel(data, 0, make_be32(addr));
1028
-
1029
- /* Continuous read are supported */
1030
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1031
- page[i] = make_be32(flash_readl(data, 0));
1032
- }
1033
- spi_ctrl_stop_user(data);
1034
-}
1035
-
1036
-static void read_page_mem(const TestData *data, uint32_t addr, uint32_t *page)
1037
-{
1038
- int i;
1039
-
1040
- /* move out USER mode to use direct reads from the AHB bus */
1041
- spi_ctrl_setmode(data, CTRL_READMODE, READ);
1042
-
1043
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1044
- page[i] = make_be32(flash_readl(data, addr + i * 4));
1045
- }
1046
-}
1047
-
1048
-static void write_page_mem(const TestData *data, uint32_t addr,
1049
- uint32_t write_value)
1050
-{
1051
- spi_ctrl_setmode(data, CTRL_WRITEMODE, PP);
1052
-
1053
- for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1054
- flash_writel(data, addr + i * 4, write_value);
1055
- }
1056
-}
1057
-
1058
-static void assert_page_mem(const TestData *data, uint32_t addr,
1059
- uint32_t expected_value)
1060
-{
1061
- uint32_t page[FLASH_PAGE_SIZE / 4];
1062
- read_page_mem(data, addr, page);
1063
- for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1064
- g_assert_cmphex(page[i], ==, expected_value);
1065
- }
1066
-}
1067
-
1068
-static void test_erase_sector(const void *data)
1069
-{
1070
- const TestData *test_data = (const TestData *)data;
1071
- uint32_t some_page_addr = test_data->page_addr;
1072
- uint32_t page[FLASH_PAGE_SIZE / 4];
1073
- int i;
1074
-
1075
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1076
-
1077
- /*
1078
- * Previous page should be full of 0xffs after backend is
1079
- * initialized
1080
- */
1081
- read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
1082
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1083
- g_assert_cmphex(page[i], ==, 0xffffffff);
1084
- }
1085
-
1086
- spi_ctrl_start_user(test_data);
1087
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1088
- flash_writeb(test_data, 0, WREN);
1089
- flash_writeb(test_data, 0, PP);
1090
- flash_writel(test_data, 0, make_be32(some_page_addr));
1091
-
1092
- /* Fill the page with its own addresses */
1093
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1094
- flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
1095
- }
1096
- spi_ctrl_stop_user(test_data);
1097
-
1098
- /* Check the page is correctly written */
1099
- read_page(test_data, some_page_addr, page);
1100
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1101
- g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
1102
- }
1103
-
1104
- spi_ctrl_start_user(test_data);
1105
- flash_writeb(test_data, 0, WREN);
1106
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1107
- flash_writeb(test_data, 0, ERASE_SECTOR);
1108
- flash_writel(test_data, 0, make_be32(some_page_addr));
1109
- spi_ctrl_stop_user(test_data);
1110
-
1111
- /* Check the page is erased */
1112
- read_page(test_data, some_page_addr, page);
1113
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1114
- g_assert_cmphex(page[i], ==, 0xffffffff);
1115
- }
1116
-
1117
- flash_reset(test_data);
1118
-}
1119
-
1120
-static void test_erase_all(const void *data)
1121
-{
1122
- const TestData *test_data = (const TestData *)data;
1123
- uint32_t some_page_addr = test_data->page_addr;
1124
- uint32_t page[FLASH_PAGE_SIZE / 4];
1125
- int i;
1126
-
1127
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1128
-
1129
- /*
1130
- * Previous page should be full of 0xffs after backend is
1131
- * initialized
1132
- */
1133
- read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
1134
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1135
- g_assert_cmphex(page[i], ==, 0xffffffff);
1136
- }
1137
-
1138
- spi_ctrl_start_user(test_data);
1139
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1140
- flash_writeb(test_data, 0, WREN);
1141
- flash_writeb(test_data, 0, PP);
1142
- flash_writel(test_data, 0, make_be32(some_page_addr));
1143
-
1144
- /* Fill the page with its own addresses */
1145
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1146
- flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
1147
- }
1148
- spi_ctrl_stop_user(test_data);
1149
-
1150
- /* Check the page is correctly written */
1151
- read_page(test_data, some_page_addr, page);
1152
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1153
- g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
1154
- }
1155
-
1156
- spi_ctrl_start_user(test_data);
1157
- flash_writeb(test_data, 0, WREN);
1158
- flash_writeb(test_data, 0, BULK_ERASE);
1159
- spi_ctrl_stop_user(test_data);
1160
-
1161
- /* Check the page is erased */
1162
- read_page(test_data, some_page_addr, page);
1163
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1164
- g_assert_cmphex(page[i], ==, 0xffffffff);
1165
- }
1166
-
1167
- flash_reset(test_data);
1168
-}
1169
-
1170
-static void test_write_page(const void *data)
1171
-{
1172
- const TestData *test_data = (const TestData *)data;
1173
- uint32_t my_page_addr = test_data->page_addr;
1174
- uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
1175
- uint32_t page[FLASH_PAGE_SIZE / 4];
1176
- int i;
1177
-
1178
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1179
-
1180
- spi_ctrl_start_user(test_data);
1181
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1182
- flash_writeb(test_data, 0, WREN);
1183
- flash_writeb(test_data, 0, PP);
1184
- flash_writel(test_data, 0, make_be32(my_page_addr));
1185
-
1186
- /* Fill the page with its own addresses */
1187
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1188
- flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
1189
- }
1190
- spi_ctrl_stop_user(test_data);
1191
-
1192
- /* Check what was written */
1193
- read_page(test_data, my_page_addr, page);
1194
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1195
- g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
1196
- }
1197
-
1198
- /* Check some other page. It should be full of 0xff */
1199
- read_page(test_data, some_page_addr, page);
1200
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1201
- g_assert_cmphex(page[i], ==, 0xffffffff);
1202
- }
1203
-
1204
- flash_reset(test_data);
1205
-}
1206
-
1207
-static void test_read_page_mem(const void *data)
1208
-{
1209
- const TestData *test_data = (const TestData *)data;
1210
- uint32_t my_page_addr = test_data->page_addr;
1211
- uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
1212
- uint32_t page[FLASH_PAGE_SIZE / 4];
1213
- int i;
1214
-
1215
- /*
1216
- * Enable 4BYTE mode for controller.
1217
- */
1218
- spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
1219
-
1220
- /* Enable 4BYTE mode for flash. */
1221
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1222
- spi_ctrl_start_user(test_data);
1223
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1224
- flash_writeb(test_data, 0, WREN);
1225
- flash_writeb(test_data, 0, PP);
1226
- flash_writel(test_data, 0, make_be32(my_page_addr));
1227
-
1228
- /* Fill the page with its own addresses */
1229
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1230
- flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
1231
- }
1232
- spi_ctrl_stop_user(test_data);
1233
- spi_conf_remove(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1234
-
1235
- /* Check what was written */
1236
- read_page_mem(test_data, my_page_addr, page);
1237
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1238
- g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
1239
- }
1240
-
1241
- /* Check some other page. It should be full of 0xff */
1242
- read_page_mem(test_data, some_page_addr, page);
1243
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1244
- g_assert_cmphex(page[i], ==, 0xffffffff);
1245
- }
1246
-
1247
- flash_reset(test_data);
1248
-}
1249
-
1250
-static void test_write_page_mem(const void *data)
1251
-{
1252
- const TestData *test_data = (const TestData *)data;
1253
- uint32_t my_page_addr = test_data->page_addr;
1254
- uint32_t page[FLASH_PAGE_SIZE / 4];
1255
- int i;
1256
-
1257
- /*
1258
- * Enable 4BYTE mode for controller.
1259
- */
1260
- spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
1261
-
1262
- /* Enable 4BYTE mode for flash. */
1263
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1264
- spi_ctrl_start_user(test_data);
1265
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1266
- flash_writeb(test_data, 0, WREN);
1267
- spi_ctrl_stop_user(test_data);
1268
-
1269
- /* move out USER mode to use direct writes to the AHB bus */
1270
- spi_ctrl_setmode(test_data, CTRL_WRITEMODE, PP);
1271
-
1272
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1273
- flash_writel(test_data, my_page_addr + i * 4,
1274
- make_be32(my_page_addr + i * 4));
1275
- }
1276
-
1277
- /* Check what was written */
1278
- read_page_mem(test_data, my_page_addr, page);
1279
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1280
- g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
1281
- }
1282
-
1283
- flash_reset(test_data);
1284
-}
1285
-
1286
-static void test_read_status_reg(const void *data)
1287
-{
1288
- const TestData *test_data = (const TestData *)data;
1289
- uint8_t r;
1290
-
1291
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1292
-
1293
- spi_ctrl_start_user(test_data);
1294
- flash_writeb(test_data, 0, RDSR);
1295
- r = flash_readb(test_data, 0);
1296
- spi_ctrl_stop_user(test_data);
1297
-
1298
- g_assert_cmphex(r & SR_WEL, ==, 0);
1299
- g_assert(!qtest_qom_get_bool
1300
- (test_data->s, test_data->node, "write-enable"));
1301
-
1302
- spi_ctrl_start_user(test_data);
1303
- flash_writeb(test_data, 0, WREN);
1304
- flash_writeb(test_data, 0, RDSR);
1305
- r = flash_readb(test_data, 0);
1306
- spi_ctrl_stop_user(test_data);
1307
-
1308
- g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
1309
- g_assert(qtest_qom_get_bool
1310
- (test_data->s, test_data->node, "write-enable"));
1311
-
1312
- spi_ctrl_start_user(test_data);
1313
- flash_writeb(test_data, 0, WRDI);
1314
- flash_writeb(test_data, 0, RDSR);
1315
- r = flash_readb(test_data, 0);
1316
- spi_ctrl_stop_user(test_data);
1317
-
1318
- g_assert_cmphex(r & SR_WEL, ==, 0);
1319
- g_assert(!qtest_qom_get_bool
1320
- (test_data->s, test_data->node, "write-enable"));
1321
-
1322
- flash_reset(test_data);
1323
-}
1324
-
1325
-static void test_status_reg_write_protection(const void *data)
1326
-{
1327
- const TestData *test_data = (const TestData *)data;
1328
- uint8_t r;
1329
-
1330
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1331
-
1332
- /* default case: WP# is high and SRWD is low -> status register writable */
1333
- spi_ctrl_start_user(test_data);
1334
- flash_writeb(test_data, 0, WREN);
1335
- /* test ability to write SRWD */
1336
- flash_writeb(test_data, 0, WRSR);
1337
- flash_writeb(test_data, 0, SRWD);
1338
- flash_writeb(test_data, 0, RDSR);
1339
- r = flash_readb(test_data, 0);
1340
- spi_ctrl_stop_user(test_data);
1341
- g_assert_cmphex(r & SRWD, ==, SRWD);
1342
-
1343
- /* WP# high and SRWD high -> status register writable */
1344
- spi_ctrl_start_user(test_data);
1345
- flash_writeb(test_data, 0, WREN);
1346
- /* test ability to write SRWD */
1347
- flash_writeb(test_data, 0, WRSR);
1348
- flash_writeb(test_data, 0, 0);
1349
- flash_writeb(test_data, 0, RDSR);
1350
- r = flash_readb(test_data, 0);
1351
- spi_ctrl_stop_user(test_data);
1352
- g_assert_cmphex(r & SRWD, ==, 0);
1353
-
1354
- /* WP# low and SRWD low -> status register writable */
1355
- qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 0);
1356
- spi_ctrl_start_user(test_data);
1357
- flash_writeb(test_data, 0, WREN);
1358
- /* test ability to write SRWD */
1359
- flash_writeb(test_data, 0, WRSR);
1360
- flash_writeb(test_data, 0, SRWD);
1361
- flash_writeb(test_data, 0, RDSR);
1362
- r = flash_readb(test_data, 0);
1363
- spi_ctrl_stop_user(test_data);
1364
- g_assert_cmphex(r & SRWD, ==, SRWD);
1365
-
1366
- /* WP# low and SRWD high -> status register NOT writable */
1367
- spi_ctrl_start_user(test_data);
1368
- flash_writeb(test_data, 0 , WREN);
1369
- /* test ability to write SRWD */
1370
- flash_writeb(test_data, 0, WRSR);
1371
- flash_writeb(test_data, 0, 0);
1372
- flash_writeb(test_data, 0, RDSR);
1373
- r = flash_readb(test_data, 0);
1374
- spi_ctrl_stop_user(test_data);
1375
- /* write is not successful */
1376
- g_assert_cmphex(r & SRWD, ==, SRWD);
1377
-
1378
- qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 1);
1379
- flash_reset(test_data);
1380
-}
1381
-
1382
-static void test_write_block_protect(const void *data)
1383
-{
1384
- const TestData *test_data = (const TestData *)data;
1385
- uint32_t sector_size = 65536;
1386
- uint32_t n_sectors = 512;
1387
-
1388
- spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
1389
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1390
-
1391
- uint32_t bp_bits = 0b0;
1392
-
1393
- for (int i = 0; i < 16; i++) {
1394
- bp_bits = ((i & 0b1000) << 3) | ((i & 0b0111) << 2);
1395
-
1396
- spi_ctrl_start_user(test_data);
1397
- flash_writeb(test_data, 0, WREN);
1398
- flash_writeb(test_data, 0, BULK_ERASE);
1399
- flash_writeb(test_data, 0, WREN);
1400
- flash_writeb(test_data, 0, WRSR);
1401
- flash_writeb(test_data, 0, bp_bits);
1402
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1403
- flash_writeb(test_data, 0, WREN);
1404
- spi_ctrl_stop_user(test_data);
1405
-
1406
- uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
1407
- uint32_t protection_start = n_sectors - num_protected_sectors;
1408
- uint32_t protection_end = n_sectors;
1409
-
1410
- for (int sector = 0; sector < n_sectors; sector++) {
1411
- uint32_t addr = sector * sector_size;
1412
-
1413
- assert_page_mem(test_data, addr, 0xffffffff);
1414
- write_page_mem(test_data, addr, make_be32(0xabcdef12));
1415
-
1416
- uint32_t expected_value = protection_start <= sector
1417
- && sector < protection_end
1418
- ? 0xffffffff : 0xabcdef12;
1419
-
1420
- assert_page_mem(test_data, addr, expected_value);
1421
- }
1422
- }
1423
-
1424
- flash_reset(test_data);
1425
-}
1426
-
1427
-static void test_write_block_protect_bottom_bit(const void *data)
1428
-{
1429
- const TestData *test_data = (const TestData *)data;
1430
- uint32_t sector_size = 65536;
1431
- uint32_t n_sectors = 512;
1432
-
1433
- spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
1434
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1435
-
1436
- /* top bottom bit is enabled */
1437
- uint32_t bp_bits = 0b00100 << 3;
1438
-
1439
- for (int i = 0; i < 16; i++) {
1440
- bp_bits = (((i & 0b1000) | 0b0100) << 3) | ((i & 0b0111) << 2);
1441
-
1442
- spi_ctrl_start_user(test_data);
1443
- flash_writeb(test_data, 0, WREN);
1444
- flash_writeb(test_data, 0, BULK_ERASE);
1445
- flash_writeb(test_data, 0, WREN);
1446
- flash_writeb(test_data, 0, WRSR);
1447
- flash_writeb(test_data, 0, bp_bits);
1448
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1449
- flash_writeb(test_data, 0, WREN);
1450
- spi_ctrl_stop_user(test_data);
1451
-
1452
- uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
1453
- uint32_t protection_start = 0;
1454
- uint32_t protection_end = num_protected_sectors;
1455
-
1456
- for (int sector = 0; sector < n_sectors; sector++) {
1457
- uint32_t addr = sector * sector_size;
1458
-
1459
- assert_page_mem(test_data, addr, 0xffffffff);
1460
- write_page_mem(test_data, addr, make_be32(0xabcdef12));
1461
-
1462
- uint32_t expected_value = protection_start <= sector
1463
- && sector < protection_end
1464
- ? 0xffffffff : 0xabcdef12;
1465
-
1466
- assert_page_mem(test_data, addr, expected_value);
1467
- }
1468
- }
1469
-
1470
- flash_reset(test_data);
1471
-}
1472
-
1473
-static void test_write_page_qpi(const void *data)
1474
-{
1475
- const TestData *test_data = (const TestData *)data;
1476
- uint32_t my_page_addr = test_data->page_addr;
1477
- uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
1478
- uint32_t page[FLASH_PAGE_SIZE / 4];
1479
- uint32_t page_pattern[] = {
1480
- 0xebd8c134, 0x5da196bc, 0xae15e729, 0x5085ccdf
1481
- };
1482
- int i;
1483
-
1484
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
1485
-
1486
- spi_ctrl_start_user(test_data);
1487
- flash_writeb(test_data, 0, EN_4BYTE_ADDR);
1488
- flash_writeb(test_data, 0, WREN);
1489
- flash_writeb(test_data, 0, PP);
1490
- flash_writel(test_data, 0, make_be32(my_page_addr));
1491
-
1492
- /* Set QPI mode */
1493
- spi_ctrl_set_io_mode(test_data, CTRL_IO_QUAD_IO);
1494
-
1495
- /* Fill the page pattern */
1496
- for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
1497
- flash_writel(test_data, 0, make_be32(page_pattern[i]));
1498
- }
1499
-
1500
- /* Fill the page with its own addresses */
1501
- for (; i < FLASH_PAGE_SIZE / 4; i++) {
1502
- flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
1503
- }
1504
-
1505
- /* Restore io mode */
1506
- spi_ctrl_set_io_mode(test_data, 0);
1507
- spi_ctrl_stop_user(test_data);
1508
-
1509
- /* Check what was written */
1510
- read_page(test_data, my_page_addr, page);
1511
- for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
1512
- g_assert_cmphex(page[i], ==, page_pattern[i]);
1513
- }
1514
- for (; i < FLASH_PAGE_SIZE / 4; i++) {
1515
- g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
1516
- }
1517
-
1518
- /* Check some other page. It should be full of 0xff */
1519
- read_page(test_data, some_page_addr, page);
1520
- for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
1521
- g_assert_cmphex(page[i], ==, 0xffffffff);
1522
- }
1523
-
1524
- flash_reset(test_data);
1525
-}
1526
-
1527
-static void test_palmetto_bmc(TestData *data)
1528
+static void test_palmetto_bmc(AspeedSMCTestData *data)
1529
{
1530
int ret;
1531
int fd;
1532
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
1533
/* beyond 16MB */
1534
data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
1535
1536
- qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
1537
- qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
1538
- qtest_add_data_func("/ast2400/smc/erase_all", data, test_erase_all);
1539
- qtest_add_data_func("/ast2400/smc/write_page", data, test_write_page);
1540
+ qtest_add_data_func("/ast2400/smc/read_jedec",
1541
+ data, aspeed_smc_test_read_jedec);
1542
+ qtest_add_data_func("/ast2400/smc/erase_sector",
1543
+ data, aspeed_smc_test_erase_sector);
1544
+ qtest_add_data_func("/ast2400/smc/erase_all",
1545
+ data, aspeed_smc_test_erase_all);
1546
+ qtest_add_data_func("/ast2400/smc/write_page",
1547
+ data, aspeed_smc_test_write_page);
1548
qtest_add_data_func("/ast2400/smc/read_page_mem",
1549
- data, test_read_page_mem);
1550
+ data, aspeed_smc_test_read_page_mem);
1551
qtest_add_data_func("/ast2400/smc/write_page_mem",
1552
- data, test_write_page_mem);
1553
+ data, aspeed_smc_test_write_page_mem);
1554
qtest_add_data_func("/ast2400/smc/read_status_reg",
1555
- data, test_read_status_reg);
1556
+ data, aspeed_smc_test_read_status_reg);
1557
qtest_add_data_func("/ast2400/smc/status_reg_write_protection",
1558
- data, test_status_reg_write_protection);
1559
+ data, aspeed_smc_test_status_reg_write_protection);
1560
qtest_add_data_func("/ast2400/smc/write_block_protect",
1561
- data, test_write_block_protect);
1562
+ data, aspeed_smc_test_write_block_protect);
1563
qtest_add_data_func("/ast2400/smc/write_block_protect_bottom_bit",
1564
- data, test_write_block_protect_bottom_bit);
1565
+ data, aspeed_smc_test_write_block_protect_bottom_bit);
1566
}
1567
1568
-static void test_ast2500_evb(TestData *data)
1569
+static void test_ast2500_evb(AspeedSMCTestData *data)
1570
{
1571
int ret;
1572
int fd;
1573
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
1574
/* beyond 16MB */
1575
data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
1576
1577
- qtest_add_data_func("/ast2500/smc/read_jedec", data, test_read_jedec);
1578
- qtest_add_data_func("/ast2500/smc/erase_sector", data, test_erase_sector);
1579
- qtest_add_data_func("/ast2500/smc/erase_all", data, test_erase_all);
1580
- qtest_add_data_func("/ast2500/smc/write_page", data, test_write_page);
1581
+ qtest_add_data_func("/ast2500/smc/read_jedec",
1582
+ data, aspeed_smc_test_read_jedec);
1583
+ qtest_add_data_func("/ast2500/smc/erase_sector",
1584
+ data, aspeed_smc_test_erase_sector);
1585
+ qtest_add_data_func("/ast2500/smc/erase_all",
1586
+ data, aspeed_smc_test_erase_all);
1587
+ qtest_add_data_func("/ast2500/smc/write_page",
1588
+ data, aspeed_smc_test_write_page);
1589
qtest_add_data_func("/ast2500/smc/read_page_mem",
1590
- data, test_read_page_mem);
1591
+ data, aspeed_smc_test_read_page_mem);
1592
qtest_add_data_func("/ast2500/smc/write_page_mem",
1593
- data, test_write_page_mem);
1594
+ data, aspeed_smc_test_write_page_mem);
1595
qtest_add_data_func("/ast2500/smc/read_status_reg",
1596
- data, test_read_status_reg);
1597
+ data, aspeed_smc_test_read_status_reg);
1598
qtest_add_data_func("/ast2500/smc/write_page_qpi",
1599
- data, test_write_page_qpi);
1600
+ data, aspeed_smc_test_write_page_qpi);
1601
}
1602
1603
-static void test_ast2600_evb(TestData *data)
1604
+static void test_ast2600_evb(AspeedSMCTestData *data)
1605
{
1606
int ret;
1607
int fd;
1608
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
1609
/* beyond 16MB */
1610
data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
1611
1612
- qtest_add_data_func("/ast2600/smc/read_jedec", data, test_read_jedec);
1613
- qtest_add_data_func("/ast2600/smc/erase_sector", data, test_erase_sector);
1614
- qtest_add_data_func("/ast2600/smc/erase_all", data, test_erase_all);
1615
- qtest_add_data_func("/ast2600/smc/write_page", data, test_write_page);
1616
+ qtest_add_data_func("/ast2600/smc/read_jedec",
1617
+ data, aspeed_smc_test_read_jedec);
1618
+ qtest_add_data_func("/ast2600/smc/erase_sector",
1619
+ data, aspeed_smc_test_erase_sector);
1620
+ qtest_add_data_func("/ast2600/smc/erase_all",
1621
+ data, aspeed_smc_test_erase_all);
1622
+ qtest_add_data_func("/ast2600/smc/write_page",
1623
+ data, aspeed_smc_test_write_page);
1624
qtest_add_data_func("/ast2600/smc/read_page_mem",
1625
- data, test_read_page_mem);
1626
+ data, aspeed_smc_test_read_page_mem);
1627
qtest_add_data_func("/ast2600/smc/write_page_mem",
1628
- data, test_write_page_mem);
1629
+ data, aspeed_smc_test_write_page_mem);
1630
qtest_add_data_func("/ast2600/smc/read_status_reg",
1631
- data, test_read_status_reg);
1632
+ data, aspeed_smc_test_read_status_reg);
1633
qtest_add_data_func("/ast2600/smc/write_page_qpi",
1634
- data, test_write_page_qpi);
1635
+ data, aspeed_smc_test_write_page_qpi);
1636
}
1637
1638
-static void test_ast1030_evb(TestData *data)
1639
+static void test_ast1030_evb(AspeedSMCTestData *data)
1640
{
1641
int ret;
1642
int fd;
1643
@@ -XXX,XX +XXX,XX @@ static void test_ast1030_evb(TestData *data)
1644
/* beyond 512KB */
1645
data->page_addr = 0x800 * FLASH_PAGE_SIZE;
1646
1647
- qtest_add_data_func("/ast1030/smc/read_jedec", data, test_read_jedec);
1648
- qtest_add_data_func("/ast1030/smc/erase_sector", data, test_erase_sector);
1649
- qtest_add_data_func("/ast1030/smc/erase_all", data, test_erase_all);
1650
- qtest_add_data_func("/ast1030/smc/write_page", data, test_write_page);
1651
+ qtest_add_data_func("/ast1030/smc/read_jedec",
1652
+ data, aspeed_smc_test_read_jedec);
1653
+ qtest_add_data_func("/ast1030/smc/erase_sector",
1654
+ data, aspeed_smc_test_erase_sector);
1655
+ qtest_add_data_func("/ast1030/smc/erase_all",
1656
+ data, aspeed_smc_test_erase_all);
1657
+ qtest_add_data_func("/ast1030/smc/write_page",
1658
+ data, aspeed_smc_test_write_page);
1659
qtest_add_data_func("/ast1030/smc/read_page_mem",
1660
- data, test_read_page_mem);
1661
+ data, aspeed_smc_test_read_page_mem);
1662
qtest_add_data_func("/ast1030/smc/write_page_mem",
1663
- data, test_write_page_mem);
1664
+ data, aspeed_smc_test_write_page_mem);
1665
qtest_add_data_func("/ast1030/smc/read_status_reg",
1666
- data, test_read_status_reg);
1667
+ data, aspeed_smc_test_read_status_reg);
1668
qtest_add_data_func("/ast1030/smc/write_page_qpi",
1669
- data, test_write_page_qpi);
1670
+ data, aspeed_smc_test_write_page_qpi);
1671
}
1672
1673
int main(int argc, char **argv)
1674
{
1675
- TestData palmetto_data;
1676
- TestData ast2500_evb_data;
1677
- TestData ast2600_evb_data;
1678
- TestData ast1030_evb_data;
1679
+ AspeedSMCTestData palmetto_data;
1680
+ AspeedSMCTestData ast2500_evb_data;
1681
+ AspeedSMCTestData ast2600_evb_data;
1682
+ AspeedSMCTestData ast1030_evb_data;
1683
int ret;
1684
1685
g_test_init(&argc, &argv, NULL);
1686
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
1687
index XXXXXXX..XXXXXXX 100644
489
index XXXXXXX..XXXXXXX 100644
1688
--- a/tests/qtest/meson.build
490
--- a/hw/fsi/meson.build
1689
+++ b/tests/qtest/meson.build
491
+++ b/hw/fsi/meson.build
1690
@@ -XXX,XX +XXX,XX @@ qtests = {
492
@@ -1 +1,2 @@
1691
'virtio-net-failover': files('migration-helpers.c'),
493
system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c','cfam.c','fsi-master.c'))
1692
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
494
+system_ss.add(when: 'CONFIG_FSI_APB2OPB_ASPEED', if_true: files('aspeed_apb2opb.c'))
1693
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
495
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
1694
+ 'aspeed_smc-test': files('aspeed-smc-utils.c', 'aspeed_smc-test.c'),
496
index XXXXXXX..XXXXXXX 100644
1695
}
497
--- a/hw/fsi/trace-events
1696
498
+++ b/hw/fsi/trace-events
1697
if vnc.found()
499
@@ -XXX,XX +XXX,XX @@ fsi_cfam_unimplemented_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%"
500
fsi_cfam_config_write_noaddr(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
501
fsi_master_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
502
fsi_master_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
503
+fsi_aspeed_apb2opb_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
504
+fsi_aspeed_apb2opb_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
1698
--
505
--
1699
2.47.1
506
2.43.0
1700
507
1701
508
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
Add SDHCI model for AST2700 SDHCI support. The SDHCI controller only support 1
3
This patchset introduces IBM's Flexible Service Interface(FSI).
4
slot and registers base address is start at 0x1408_0000 and its interrupt is
5
connected to GICINT133_INTC at bit 1.
6
4
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
5
Time for some fun with inter-processor buses. FSI allows a service
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
6
processor access to the internal buses of a host POWER processor to
9
Link: https://lore.kernel.org/r/20241204084453.610660-6-jamin_lin@aspeedtech.com
7
perform configuration or debugging.
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
9
FSI has long existed in POWER processes and so comes with some baggage,
10
including how it has been integrated into the ASPEED SoC.
11
12
Working backwards from the POWER processor, the fundamental pieces of
13
interest for the implementation are:
14
15
1. The Common FRU Access Macro (CFAM), an address space containing
16
various "engines" that drive accesses on buses internal and external
17
to the POWER chip. Examples include the SBEFIFO and I2C masters. The
18
engines hang off of an internal Local Bus (LBUS) which is described
19
by the CFAM configuration block.
20
21
2. The FSI slave: The slave is the terminal point of the FSI bus for
22
FSI symbols addressed to it. Slaves can be cascaded off of one
23
another. The slave's configuration registers appear in address space
24
of the CFAM to which it is attached.
25
26
3. The FSI master: A controller in the platform service processor (e.g.
27
BMC) driving CFAM engine accesses into the POWER chip. At the
28
hardware level FSI is a bit-based protocol supporting synchronous and
29
DMA-driven accesses of engines in a CFAM.
30
31
4. The On-Chip Peripheral Bus (OPB): A low-speed bus typically found in
32
POWER processors. This now makes an appearance in the ASPEED SoC due
33
to tight integration of the FSI master IP with the OPB, mainly the
34
existence of an MMIO-mapping of the CFAM address straight onto a
35
sub-region of the OPB address space.
36
37
5. An APB-to-OPB bridge enabling access to the OPB from the ARM core in
38
the AST2600. Hardware limitations prevent the OPB from being directly
39
mapped into APB, so all accesses are indirect through the bridge.
40
41
The implementation appears as following in the qemu device tree:
42
43
(qemu) info qtree
44
bus: main-system-bus
45
type System
46
...
47
dev: aspeed.apb2opb, id ""
48
gpio-out "sysbus-irq" 1
49
mmio 000000001e79b000/0000000000001000
50
bus: opb.1
51
type opb
52
dev: fsi.master, id ""
53
bus: fsi.bus.1
54
type fsi.bus
55
dev: cfam.config, id ""
56
dev: cfam, id ""
57
bus: fsi.lbus.1
58
type lbus
59
dev: scratchpad, id ""
60
address = 0 (0x0)
61
bus: opb.0
62
type opb
63
dev: fsi.master, id ""
64
bus: fsi.bus.0
65
type fsi.bus
66
dev: cfam.config, id ""
67
dev: cfam, id ""
68
bus: fsi.lbus.0
69
type lbus
70
dev: scratchpad, id ""
71
address = 0 (0x0)
72
73
The LBUS is modelled to maintain the qdev bus hierarchy and to take
74
advantage of the object model to automatically generate the CFAM
75
configuration block. The configuration block presents engines in the
76
order they are attached to the CFAM's LBUS. Engine implementations
77
should subclass the LBusDevice and set the 'config' member of
78
LBusDeviceClass to match the engine's type.
79
80
CFAM designs offer a lot of flexibility, for instance it is possible for
81
a CFAM to be simultaneously driven from multiple FSI links. The modeling
82
is not so complete; it's assumed that each CFAM is attached to a single
83
FSI slave (as a consequence the CFAM subclasses the FSI slave).
84
85
As for FSI, its symbols and wire-protocol are not modelled at all. This
86
is not necessary to get FSI off the ground thanks to the mapping of the
87
CFAM address space onto the OPB address space - the models follow this
88
directly and map the CFAM memory region into the OPB's memory region.
89
Future work includes supporting more advanced accesses that drive the
90
FSI master directly rather than indirectly via the CFAM mapping, which
91
will require implementing the FSI state machine and methods for each of
92
the FSI symbols on the slave. Further down the track we can also look at
93
supporting the bitbanged SoftFSI drivers in Linux by extending the FSI
94
slave model to resolve sequences of GPIO IRQs into FSI symbols, and
95
calling the associated symbol method on the slave to map the access onto
96
the CFAM.
97
98
Testing:
99
Tested by reading cfam config address 0 on rainier machine type.
100
101
root@p10bmc:~# pdbg -a getcfam 0x0
102
p0: 0x0 = 0xc0022d15
103
104
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
105
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
106
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
107
Reviewed-by: Cédric Le Goater <clg@kaod.org>
108
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
109
---
12
hw/arm/aspeed_ast27x0.c | 20 ++++++++++++++++++++
110
include/hw/arm/aspeed_soc.h | 4 ++++
13
1 file changed, 20 insertions(+)
111
hw/arm/aspeed_ast2600.c | 19 +++++++++++++++++++
112
2 files changed, 23 insertions(+)
14
113
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
114
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
16
index XXXXXXX..XXXXXXX 100644
115
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed_ast27x0.c
116
--- a/include/hw/arm/aspeed_soc.h
18
+++ b/hw/arm/aspeed_ast27x0.c
117
+++ b/include/hw/arm/aspeed_soc.h
19
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2700_memmap[] = {
118
@@ -XXX,XX +XXX,XX @@
20
[ASPEED_DEV_I2C] = 0x14C0F000,
119
#include "hw/misc/aspeed_lpc.h"
21
[ASPEED_DEV_GPIO] = 0x14C0B000,
120
#include "hw/misc/unimp.h"
22
[ASPEED_DEV_RTC] = 0x12C0F000,
121
#include "hw/misc/aspeed_peci.h"
23
+ [ASPEED_DEV_SDHCI] = 0x14080000,
122
+#include "hw/fsi/aspeed_apb2opb.h"
123
#include "hw/char/serial.h"
124
125
#define ASPEED_SPIS_NUM 2
126
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
127
UnimplementedDeviceState udc;
128
UnimplementedDeviceState sgpiom;
129
UnimplementedDeviceState jtag[ASPEED_JTAG_NUM];
130
+ AspeedAPB2OPBState fsi[2];
24
};
131
};
25
132
26
#define AST2700_MAX_IRQ 256
133
#define TYPE_ASPEED_SOC "aspeed-soc"
27
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_irqmap[] = {
134
@@ -XXX,XX +XXX,XX @@ enum {
28
[ASPEED_DEV_KCS] = 128,
135
ASPEED_DEV_SGPIOM,
29
[ASPEED_DEV_DP] = 28,
136
ASPEED_DEV_JTAG0,
30
[ASPEED_DEV_I3C] = 131,
137
ASPEED_DEV_JTAG1,
31
+ [ASPEED_DEV_SDHCI] = 133,
138
+ ASPEED_DEV_FSI1,
139
+ ASPEED_DEV_FSI2,
32
};
140
};
33
141
34
/* GICINT 128 */
142
#define ASPEED_SOC_SPI_BOOT_ADDR 0x0
35
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_gic132_intcmap[] = {
143
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
36
144
index XXXXXXX..XXXXXXX 100644
37
/* GICINT 133 */
145
--- a/hw/arm/aspeed_ast2600.c
38
static const int aspeed_soc_ast2700_gic133_intcmap[] = {
146
+++ b/hw/arm/aspeed_ast2600.c
39
+ [ASPEED_DEV_SDHCI] = 1,
147
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2600_memmap[] = {
40
[ASPEED_DEV_PECI] = 4,
148
[ASPEED_DEV_UART12] = 0x1E790600,
149
[ASPEED_DEV_UART13] = 0x1E790700,
150
[ASPEED_DEV_VUART] = 0x1E787000,
151
+ [ASPEED_DEV_FSI1] = 0x1E79B000,
152
+ [ASPEED_DEV_FSI2] = 0x1E79B100,
153
[ASPEED_DEV_I3C] = 0x1E7A0000,
154
[ASPEED_DEV_SDRAM] = 0x80000000,
41
};
155
};
42
156
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2600_irqmap[] = {
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
157
[ASPEED_DEV_ETH4] = 33,
44
object_initialize_child(obj, "gpio", &s->gpio, typename);
158
[ASPEED_DEV_KCS] = 138, /* 138 -> 142 */
45
159
[ASPEED_DEV_DP] = 62,
46
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
160
+ [ASPEED_DEV_FSI1] = 100,
161
+ [ASPEED_DEV_FSI2] = 101,
162
[ASPEED_DEV_I3C] = 102, /* 102 -> 107 */
163
};
164
165
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
166
object_initialize_child(obj, "emmc-boot-controller",
167
&s->emmc_boot_controller,
168
TYPE_UNIMPLEMENTED_DEVICE);
47
+
169
+
48
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
170
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
49
+ object_initialize_child(obj, "sd-controller", &s->sdhci, typename);
171
+ object_initialize_child(obj, "fsi[*]", &s->fsi[i], TYPE_ASPEED_APB2OPB);
50
+ object_property_set_int(OBJECT(&s->sdhci), "num-slots", 1, &error_abort);
172
+ }
173
}
174
175
/*
176
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
177
return;
178
}
179
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sbc), 0, sc->memmap[ASPEED_DEV_SBC]);
51
+
180
+
52
+ /* Init sd card slot class here so that they're under the correct parent */
181
+ /* FSI */
53
+ object_initialize_child(obj, "sd-controller.sdhci",
182
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
54
+ &s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
183
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->fsi[i]), errp)) {
184
+ return;
185
+ }
186
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->fsi[i]), 0,
187
+ sc->memmap[ASPEED_DEV_FSI1 + i]);
188
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->fsi[i]), 0,
189
+ aspeed_soc_get_irq(s, ASPEED_DEV_FSI1 + i));
190
+ }
55
}
191
}
56
192
57
/*
193
static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
59
sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0,
60
aspeed_soc_get_irq(s, ASPEED_DEV_RTC));
61
62
+ /* SDHCI */
63
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
64
+ return;
65
+ }
66
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sdhci), 0,
67
+ sc->memmap[ASPEED_DEV_SDHCI]);
68
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
69
+ aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
70
+
71
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
72
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
73
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
74
--
194
--
75
2.47.1
195
2.43.0
76
196
77
197
diff view generated by jsdifflib
Deleted patch
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
1
3
Add SDHCI model for AST2700 eMMC support. The eMMC controller only support 1
4
slot and registers base address is start at 0x1209_0000 and its interrupt is
5
connected to GICINT 15.
6
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Link: https://lore.kernel.org/r/20241204084453.610660-7-jamin_lin@aspeedtech.com
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
11
---
12
hw/arm/aspeed_ast27x0.c | 15 +++++++++++++++
13
1 file changed, 15 insertions(+)
14
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed_ast27x0.c
18
+++ b/hw/arm/aspeed_ast27x0.c
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
20
/* Init sd card slot class here so that they're under the correct parent */
21
object_initialize_child(obj, "sd-controller.sdhci",
22
&s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
23
+
24
+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
25
+ object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
26
+
27
+ object_initialize_child(obj, "emmc-controller.sdhci", &s->emmc.slots[0],
28
+ TYPE_SYSBUS_SDHCI);
29
}
30
31
/*
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
33
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
34
aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
35
36
+ /* eMMC */
37
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
38
+ return;
39
+ }
40
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->emmc), 0,
41
+ sc->memmap[ASPEED_DEV_EMMC]);
42
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->emmc), 0,
43
+ aspeed_soc_get_irq(s, ASPEED_DEV_EMMC));
44
+
45
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
46
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
47
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
48
--
49
2.47.1
50
51
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
Add test_ast2700_evb function and reused testcases which are from
3
Added basic qtests for FSI model.
4
aspeed_smc-test.c for AST2700 testing. The base address, flash base address
4
5
and ce index of fmc_cs0 are 0x14000000, 0x100000000 and 0, respectively.
5
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
6
The default flash model of fmc_cs0 is "w25q01jvq" whose size is 128MB,
6
Acked-by: Thomas Huth <thuth@redhat.com>
7
so set jedec_id 0xef4021.
7
[ clg: aspeed-fsi-test.c -> aspeed_fsi-test.c to match other filenames ]
8
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-11-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
13
---
9
---
14
tests/qtest/ast2700-smc-test.c | 71 ++++++++++++++++++++++++++++++++++
10
tests/qtest/aspeed_fsi-test.c | 205 ++++++++++++++++++++++++++++++++++
15
tests/qtest/meson.build | 4 +-
11
tests/qtest/meson.build | 1 +
16
2 files changed, 74 insertions(+), 1 deletion(-)
12
2 files changed, 206 insertions(+)
17
create mode 100644 tests/qtest/ast2700-smc-test.c
13
create mode 100644 tests/qtest/aspeed_fsi-test.c
18
14
19
diff --git a/tests/qtest/ast2700-smc-test.c b/tests/qtest/ast2700-smc-test.c
15
diff --git a/tests/qtest/aspeed_fsi-test.c b/tests/qtest/aspeed_fsi-test.c
20
new file mode 100644
16
new file mode 100644
21
index XXXXXXX..XXXXXXX
17
index XXXXXXX..XXXXXXX
22
--- /dev/null
18
--- /dev/null
23
+++ b/tests/qtest/ast2700-smc-test.c
19
+++ b/tests/qtest/aspeed_fsi-test.c
24
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
25
+/*
21
+/*
26
+ * QTest testcase for the M25P80 Flash using the ASPEED SPI Controller since
22
+ * QTest testcases for IBM's Flexible Service Interface (FSI)
27
+ * AST2700.
28
+ *
23
+ *
29
+ * SPDX-License-Identifier: GPL-2.0-or-later
24
+ * Copyright (c) 2023 IBM Corporation
30
+ * Copyright (C) 2024 ASPEED Technology Inc.
25
+ *
26
+ * Authors:
27
+ * Ninad Palsule <ninad@linux.ibm.com>
28
+ *
29
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
30
+ * See the COPYING file in the top-level directory.
31
+ */
31
+ */
32
+
32
+
33
+#include "qemu/osdep.h"
33
+#include "qemu/osdep.h"
34
+#include "qemu/bswap.h"
34
+#include <glib/gstdio.h>
35
+
36
+#include "qemu/module.h"
35
+#include "libqtest-single.h"
37
+#include "libqtest-single.h"
36
+#include "qemu/bitops.h"
38
+
37
+#include "aspeed-smc-utils.h"
39
+/* Registers from ast2600 specifications */
38
+
40
+#define ASPEED_FSI_ENGINER_TRIGGER 0x04
39
+static void test_ast2700_evb(AspeedSMCTestData *data)
41
+#define ASPEED_FSI_OPB0_BUS_SELECT 0x10
40
+{
42
+#define ASPEED_FSI_OPB1_BUS_SELECT 0x28
41
+ int ret;
43
+#define ASPEED_FSI_OPB0_RW_DIRECTION 0x14
42
+ int fd;
44
+#define ASPEED_FSI_OPB1_RW_DIRECTION 0x2c
43
+
45
+#define ASPEED_FSI_OPB0_XFER_SIZE 0x18
44
+ fd = g_file_open_tmp("qtest.m25p80.w25q01jvq.XXXXXX",
46
+#define ASPEED_FSI_OPB1_XFER_SIZE 0x30
45
+ &data->tmp_path, NULL);
47
+#define ASPEED_FSI_OPB0_BUS_ADDR 0x1c
46
+ g_assert(fd >= 0);
48
+#define ASPEED_FSI_OPB1_BUS_ADDR 0x34
47
+ ret = ftruncate(fd, 128 * 1024 * 1024);
49
+#define ASPEED_FSI_INTRRUPT_CLEAR 0x40
48
+ g_assert(ret == 0);
50
+#define ASPEED_FSI_INTRRUPT_STATUS 0x48
49
+ close(fd);
51
+#define ASPEED_FSI_OPB0_BUS_STATUS 0x80
50
+
52
+#define ASPEED_FSI_OPB1_BUS_STATUS 0x8c
51
+ data->s = qtest_initf("-machine ast2700-evb "
53
+#define ASPEED_FSI_OPB0_READ_DATA 0x84
52
+ "-drive file=%s,format=raw,if=mtd",
54
+#define ASPEED_FSI_OPB1_READ_DATA 0x90
53
+ data->tmp_path);
55
+
54
+
56
+/*
55
+ /* fmc cs0 with w25q01jvq flash */
57
+ * FSI Base addresses from the ast2600 specifications.
56
+ data->flash_base = 0x100000000;
58
+ */
57
+ data->spi_base = 0x14000000;
59
+#define AST2600_OPB_FSI0_BASE_ADDR 0x1e79b000
58
+ data->jedec_id = 0xef4021;
60
+#define AST2600_OPB_FSI1_BASE_ADDR 0x1e79b100
59
+ data->cs = 0;
61
+
60
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
62
+static uint32_t aspeed_fsi_base_addr;
61
+ /* beyond 64MB */
63
+
62
+ data->page_addr = 0x40000 * FLASH_PAGE_SIZE;
64
+static uint32_t aspeed_fsi_readl(QTestState *s, uint32_t reg)
63
+
65
+{
64
+ qtest_add_data_func("/ast2700/smc/read_jedec",
66
+ return qtest_readl(s, aspeed_fsi_base_addr + reg);
65
+ data, aspeed_smc_test_read_jedec);
67
+}
66
+ qtest_add_data_func("/ast2700/smc/erase_sector",
68
+
67
+ data, aspeed_smc_test_erase_sector);
69
+static void aspeed_fsi_writel(QTestState *s, uint32_t reg, uint32_t val)
68
+ qtest_add_data_func("/ast2700/smc/erase_all",
70
+{
69
+ data, aspeed_smc_test_erase_all);
71
+ qtest_writel(s, aspeed_fsi_base_addr + reg, val);
70
+ qtest_add_data_func("/ast2700/smc/write_page",
72
+}
71
+ data, aspeed_smc_test_write_page);
73
+
72
+ qtest_add_data_func("/ast2700/smc/read_page_mem",
74
+/* Setup base address and select register */
73
+ data, aspeed_smc_test_read_page_mem);
75
+static void test_fsi_setup(QTestState *s, uint32_t base_addr)
74
+ qtest_add_data_func("/ast2700/smc/write_page_mem",
76
+{
75
+ data, aspeed_smc_test_write_page_mem);
77
+ uint32_t curval;
76
+ qtest_add_data_func("/ast2700/smc/read_status_reg",
78
+
77
+ data, aspeed_smc_test_read_status_reg);
79
+ aspeed_fsi_base_addr = base_addr;
78
+ qtest_add_data_func("/ast2700/smc/write_page_qpi",
80
+
79
+ data, aspeed_smc_test_write_page_qpi);
81
+ /* Set the base select register */
82
+ if (base_addr == AST2600_OPB_FSI0_BASE_ADDR) {
83
+ /* Unselect FSI1 */
84
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_SELECT, 0x0);
85
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_SELECT);
86
+ g_assert_cmpuint(curval, ==, 0x0);
87
+
88
+ /* Select FSI0 */
89
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_SELECT, 0x1);
90
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_SELECT);
91
+ g_assert_cmpuint(curval, ==, 0x1);
92
+ } else if (base_addr == AST2600_OPB_FSI1_BASE_ADDR) {
93
+ /* Unselect FSI0 */
94
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_SELECT, 0x0);
95
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_SELECT);
96
+ g_assert_cmpuint(curval, ==, 0x0);
97
+
98
+ /* Select FSI1 */
99
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_SELECT, 0x1);
100
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_SELECT);
101
+ g_assert_cmpuint(curval, ==, 0x1);
102
+ } else {
103
+ g_assert_not_reached();
104
+ }
105
+}
106
+
107
+static void test_fsi_reg_change(QTestState *s, uint32_t reg, uint32_t newval)
108
+{
109
+ uint32_t base;
110
+ uint32_t curval;
111
+
112
+ base = aspeed_fsi_readl(s, reg);
113
+ aspeed_fsi_writel(s, reg, newval);
114
+ curval = aspeed_fsi_readl(s, reg);
115
+ g_assert_cmpuint(curval, ==, newval);
116
+ aspeed_fsi_writel(s, reg, base);
117
+ curval = aspeed_fsi_readl(s, reg);
118
+ g_assert_cmpuint(curval, ==, base);
119
+}
120
+
121
+static void test_fsi0_master_regs(const void *data)
122
+{
123
+ QTestState *s = (QTestState *)data;
124
+
125
+ test_fsi_setup(s, AST2600_OPB_FSI0_BASE_ADDR);
126
+
127
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_RW_DIRECTION, 0xF3F4F514);
128
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_XFER_SIZE, 0xF3F4F518);
129
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_BUS_ADDR, 0xF3F4F51c);
130
+ test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_CLEAR, 0xF3F4F540);
131
+ test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_STATUS, 0xF3F4F548);
132
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_BUS_STATUS, 0xF3F4F580);
133
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_READ_DATA, 0xF3F4F584);
134
+}
135
+
136
+static void test_fsi1_master_regs(const void *data)
137
+{
138
+ QTestState *s = (QTestState *)data;
139
+
140
+ test_fsi_setup(s, AST2600_OPB_FSI1_BASE_ADDR);
141
+
142
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_RW_DIRECTION, 0xF3F4F514);
143
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_XFER_SIZE, 0xF3F4F518);
144
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_BUS_ADDR, 0xF3F4F51c);
145
+ test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_CLEAR, 0xF3F4F540);
146
+ test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_STATUS, 0xF3F4F548);
147
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_BUS_STATUS, 0xF3F4F580);
148
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_READ_DATA, 0xF3F4F584);
149
+}
150
+
151
+static void test_fsi0_getcfam_addr0(const void *data)
152
+{
153
+ QTestState *s = (QTestState *)data;
154
+ uint32_t curval;
155
+
156
+ test_fsi_setup(s, AST2600_OPB_FSI0_BASE_ADDR);
157
+
158
+ /* Master access direction read */
159
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_RW_DIRECTION, 0x1);
160
+ /* word */
161
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_XFER_SIZE, 0x3);
162
+ /* Address */
163
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_ADDR, 0xa0000000);
164
+ aspeed_fsi_writel(s, ASPEED_FSI_INTRRUPT_CLEAR, 0x1);
165
+ aspeed_fsi_writel(s, ASPEED_FSI_ENGINER_TRIGGER, 0x1);
166
+
167
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_INTRRUPT_STATUS);
168
+ g_assert_cmpuint(curval, ==, 0x10000);
169
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_STATUS);
170
+ g_assert_cmpuint(curval, ==, 0x0);
171
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_READ_DATA);
172
+ g_assert_cmpuint(curval, ==, 0x152d02c0);
173
+}
174
+
175
+static void test_fsi1_getcfam_addr0(const void *data)
176
+{
177
+ QTestState *s = (QTestState *)data;
178
+ uint32_t curval;
179
+
180
+ test_fsi_setup(s, AST2600_OPB_FSI1_BASE_ADDR);
181
+
182
+ /* Master access direction read */
183
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_RW_DIRECTION, 0x1);
184
+
185
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_XFER_SIZE, 0x3);
186
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_ADDR, 0xa0000000);
187
+ aspeed_fsi_writel(s, ASPEED_FSI_INTRRUPT_CLEAR, 0x1);
188
+ aspeed_fsi_writel(s, ASPEED_FSI_ENGINER_TRIGGER, 0x1);
189
+
190
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_INTRRUPT_STATUS);
191
+ g_assert_cmpuint(curval, ==, 0x20000);
192
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_STATUS);
193
+ g_assert_cmpuint(curval, ==, 0x0);
194
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_READ_DATA);
195
+ g_assert_cmpuint(curval, ==, 0x152d02c0);
80
+}
196
+}
81
+
197
+
82
+int main(int argc, char **argv)
198
+int main(int argc, char **argv)
83
+{
199
+{
84
+ AspeedSMCTestData ast2700_evb_data;
200
+ int ret = -1;
85
+ int ret;
201
+ QTestState *s;
86
+
202
+
87
+ g_test_init(&argc, &argv, NULL);
203
+ g_test_init(&argc, &argv, NULL);
88
+
204
+
89
+ test_ast2700_evb(&ast2700_evb_data);
205
+ s = qtest_init("-machine ast2600-evb ");
206
+
207
+ /* Tests for OPB/FSI0 */
208
+ qtest_add_data_func("/aspeed-fsi-test/test_fsi0_master_regs", s,
209
+ test_fsi0_master_regs);
210
+
211
+ qtest_add_data_func("/aspeed-fsi-test/test_fsi0_getcfam_addr0", s,
212
+ test_fsi0_getcfam_addr0);
213
+
214
+ /* Tests for OPB/FSI1 */
215
+ qtest_add_data_func("/aspeed-fsi-test/test_fsi1_master_regs", s,
216
+ test_fsi1_master_regs);
217
+
218
+ qtest_add_data_func("/aspeed-fsi-test/test_fsi1_getcfam_addr0", s,
219
+ test_fsi1_getcfam_addr0);
220
+
90
+ ret = g_test_run();
221
+ ret = g_test_run();
91
+
222
+ qtest_quit(s);
92
+ qtest_quit(ast2700_evb_data.s);
223
+
93
+ unlink(ast2700_evb_data.tmp_path);
94
+ return ret;
224
+ return ret;
95
+}
225
+}
96
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
226
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
97
index XXXXXXX..XXXXXXX 100644
227
index XXXXXXX..XXXXXXX 100644
98
--- a/tests/qtest/meson.build
228
--- a/tests/qtest/meson.build
99
+++ b/tests/qtest/meson.build
229
+++ b/tests/qtest/meson.build
100
@@ -XXX,XX +XXX,XX @@ qtests_aspeed = \
230
@@ -XXX,XX +XXX,XX @@ qtests_arm = \
101
'aspeed_smc-test',
231
(config_all_devices.has_key('CONFIG_VEXPRESS') ? ['test-arm-mptimer'] : []) + \
102
'aspeed_gpio-test']
232
(config_all_devices.has_key('CONFIG_MICROBIT') ? ['microbit-test'] : []) + \
103
qtests_aspeed64 = \
233
(config_all_devices.has_key('CONFIG_STM32L4X5_SOC') ? qtests_stm32l4x5 : []) + \
104
- ['ast2700-gpio-test']
234
+ (config_all_devices.has_key('CONFIG_FSI_APB2OPB_ASPEED') ? ['aspeed_fsi-test'] : []) + \
105
+ ['ast2700-gpio-test',
235
['arm-cpu-features',
106
+ 'ast2700-smc-test']
236
'boot-serial-test']
107
237
108
qtests_stm32l4x5 = \
109
['stm32l4x5_exti-test',
110
@@ -XXX,XX +XXX,XX @@ qtests = {
111
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
112
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
113
'aspeed_smc-test': files('aspeed-smc-utils.c', 'aspeed_smc-test.c'),
114
+ 'ast2700-smc-test': files('aspeed-smc-utils.c', 'ast2700-smc-test.c'),
115
}
116
117
if vnc.found()
118
--
238
--
119
2.47.1
239
2.43.0
120
240
121
241
diff view generated by jsdifflib
1
This moves the ast2600-evb tests to a new test file. No changes in the
1
From: Ninad Palsule <ninad@linux.ibm.com>
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.
4
2
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
3
Documentation for IBM FSI model.
6
Link: https://lore.kernel.org/r/20241206131132.520911-6-clg@redhat.com
4
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
5
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
[ clg : - Removed source file list
8
- Fixed aspeed machine reference ]
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
10
---
9
tests/functional/meson.build | 2 +
11
docs/specs/fsi.rst | 122 +++++++++++++++++++++++++++++++++++++++++++
10
tests/functional/test_arm_aspeed.py | 155 --------------------
12
docs/specs/index.rst | 1 +
11
tests/functional/test_arm_aspeed_ast2600.py | 143 ++++++++++++++++++
13
2 files changed, 123 insertions(+)
12
3 files changed, 145 insertions(+), 155 deletions(-)
14
create mode 100644 docs/specs/fsi.rst
13
create mode 100644 tests/functional/test_arm_aspeed_ast2600.py
14
15
15
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
16
diff --git a/docs/specs/fsi.rst b/docs/specs/fsi.rst
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
17
new file mode 100644
203
index XXXXXXX..XXXXXXX
18
index XXXXXXX..XXXXXXX
204
--- /dev/null
19
--- /dev/null
205
+++ b/tests/functional/test_arm_aspeed_ast2600.py
20
+++ b/docs/specs/fsi.rst
206
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@
207
+#!/usr/bin/env python3
22
+======================================
208
+#
23
+IBM's Flexible Service Interface (FSI)
209
+# Functional test that boots the ASPEED machines
24
+======================================
210
+#
211
+# SPDX-License-Identifier: GPL-2.0-or-later
212
+
25
+
213
+import os
26
+The QEMU FSI emulation implements hardware interfaces between ASPEED SOC, FSI
214
+import time
27
+master/slave and the end engine.
215
+import tempfile
216
+import subprocess
217
+
28
+
218
+from qemu_test import Asset
29
+FSI is a point-to-point two wire interface which is capable of supporting
219
+from aspeed import AspeedTest
30
+distances of up to 4 meters. FSI interfaces have been used successfully for
220
+from qemu_test import exec_command_and_wait_for_pattern
31
+many years in IBM servers to attach IBM Flexible Support Processors(FSP) to
221
+from qemu_test import has_cmd
32
+CPUs and IBM ASICs.
222
+from qemu_test.utils import archive_extract
223
+from unittest import skipUnless
224
+
33
+
225
+class AST2600Machine(AspeedTest):
34
+FSI allows a service processor access to the internal buses of a host POWER
35
+processor to perform configuration or debugging. FSI has long existed in POWER
36
+processes and so comes with some baggage, including how it has been integrated
37
+into the ASPEED SoC.
226
+
38
+
227
+ ASSET_BR2_202311_AST2600_FLASH = Asset(
39
+Working backwards from the POWER processor, the fundamental pieces of interest
228
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
40
+for the implementation are: (see the `FSI specification`_ for more details)
229
+ 'images/ast2600-evb/buildroot-2023.11/flash.img'),
230
+ 'b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
231
+
41
+
232
+ def test_arm_ast2600_evb_buildroot(self):
42
+1. The Common FRU Access Macro (CFAM), an address space containing various
233
+ self.set_machine('ast2600-evb')
43
+ "engines" that drive accesses on buses internal and external to the POWER
44
+ chip. Examples include the SBEFIFO and I2C masters. The engines hang off of
45
+ an internal Local Bus (LBUS) which is described by the CFAM configuration
46
+ block.
234
+
47
+
235
+ image_path = self.ASSET_BR2_202311_AST2600_FLASH.fetch()
48
+2. The FSI slave: The slave is the terminal point of the FSI bus for FSI
49
+ symbols addressed to it. Slaves can be cascaded off of one another. The
50
+ slave's configuration registers appear in address space of the CFAM to
51
+ which it is attached.
236
+
52
+
237
+ self.vm.add_args('-device',
53
+3. The FSI master: A controller in the platform service processor (e.g. BMC)
238
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
54
+ driving CFAM engine accesses into the POWER chip. At the hardware level
239
+ self.vm.add_args('-device',
55
+ FSI is a bit-based protocol supporting synchronous and DMA-driven accesses
240
+ 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
56
+ of engines in a CFAM.
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
+
57
+
246
+ exec_command_and_wait_for_pattern(self,
58
+4. The On-Chip Peripheral Bus (OPB): A low-speed bus typically found in POWER
247
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
59
+ processors. This now makes an appearance in the ASPEED SoC due to tight
248
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
60
+ integration of the FSI master IP with the OPB, mainly the existence of an
249
+ exec_command_and_wait_for_pattern(self,
61
+ MMIO-mapping of the CFAM address straight onto a sub-region of the OPB
250
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
62
+ address space.
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
+
63
+
256
+ exec_command_and_wait_for_pattern(self,
64
+5. An APB-to-OPB bridge enabling access to the OPB from the ARM core in the
257
+ 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-3/device/new_device',
65
+ AST2600. Hardware limitations prevent the OPB from being directly mapped
258
+ 'i2c i2c-3: new_device: Instantiated device ds1307 at 0x32');
66
+ into APB, so all accesses are indirect through the bridge.
259
+ year = time.strftime("%Y")
260
+ exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
261
+
67
+
262
+ exec_command_and_wait_for_pattern(self,
68
+The LBUS is modelled to maintain the qdev bus hierarchy and to take advantages
263
+ 'echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-3/new_device',
69
+of the object model to automatically generate the CFAM configuration block.
264
+ 'i2c i2c-3: new_device: Instantiated device slave-24c02 at 0x64');
70
+The configuration block presents engines in the order they are attached to the
265
+ exec_command_and_wait_for_pattern(self,
71
+CFAM's LBUS. Engine implementations should subclass the LBusDevice and set the
266
+ 'i2cset -y 3 0x42 0x64 0x00 0xaa i', '#');
72
+'config' member of LBusDeviceClass to match the engine's type.
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
+
73
+
272
+ ASSET_BR2_202302_AST2600_TPM_FLASH = Asset(
74
+CFAM designs offer a lot of flexibility, for instance it is possible for a
273
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
75
+CFAM to be simultaneously driven from multiple FSI links. The modeling is not
274
+ 'images/ast2600-evb/buildroot-2023.02-tpm/flash.img'),
76
+so complete; it's assumed that each CFAM is attached to a single FSI slave (as
275
+ 'a46009ae8a5403a0826d607215e731a8c68d27c14c41e55331706b8f9c7bd997')
77
+a consequence the CFAM subclasses the FSI slave).
276
+
78
+
277
+ @skipUnless(*has_cmd('swtpm'))
79
+As for FSI, its symbols and wire-protocol are not modelled at all. This is not
278
+ def test_arm_ast2600_evb_buildroot_tpm(self):
80
+necessary to get FSI off the ground thanks to the mapping of the CFAM address
279
+ self.set_machine('ast2600-evb')
81
+space onto the OPB address space - the models follow this directly and map the
82
+CFAM memory region into the OPB's memory region.
280
+
83
+
281
+ image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch()
84
+The following commands start the ``rainier-bmc`` machine with built-in FSI
85
+model. There are no model specific arguments. Please check this document to
86
+learn more about Aspeed ``rainier-bmc`` machine: (:doc:`../../system/arm/aspeed`)
282
+
87
+
283
+ tpmstate_dir = tempfile.TemporaryDirectory(prefix="qemu_")
88
+.. code-block:: console
284
+ socket = os.path.join(tpmstate_dir.name, 'swtpm-socket')
285
+
89
+
286
+ # We must put the TPM state dir in /tmp/, not the build dir,
90
+ qemu-system-arm -M rainier-bmc -nographic \
287
+ # because some distros use AppArmor to lock down swtpm and
91
+ -kernel fitImage-linux.bin \
288
+ # restrict the set of locations it can access files in.
92
+ -dtb aspeed-bmc-ibm-rainier.dtb \
289
+ subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
93
+ -initrd obmc-phosphor-initramfs.rootfs.cpio.xz \
290
+ '--tpmstate', f'dir={tpmstate_dir.name}',
94
+ -drive file=obmc-phosphor-image.rootfs.wic.qcow2,if=sd,index=2 \
291
+ '--ctrl', f'type=unixio,path={socket}'])
95
+ -append "rootwait console=ttyS4,115200n8 root=PARTLABEL=rofs-a"
292
+
96
+
293
+ self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
97
+The implementation appears as following in the qemu device tree:
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
+
98
+
299
+ exec_command_and_wait_for_pattern(self,
99
+.. code-block:: console
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
+
100
+
306
+ self.do_test_arm_aspeed_buildroot_poweroff()
101
+ (qemu) info qtree
102
+ bus: main-system-bus
103
+ type System
104
+ ...
105
+ dev: aspeed.apb2opb, id ""
106
+ gpio-out "sysbus-irq" 1
107
+ mmio 000000001e79b000/0000000000001000
108
+ bus: opb.1
109
+ type opb
110
+ dev: fsi.master, id ""
111
+ bus: fsi.bus.1
112
+ type fsi.bus
113
+ dev: cfam.config, id ""
114
+ dev: cfam, id ""
115
+ bus: lbus.1
116
+ type lbus
117
+ dev: scratchpad, id ""
118
+ address = 0 (0x0)
119
+ bus: opb.0
120
+ type opb
121
+ dev: fsi.master, id ""
122
+ bus: fsi.bus.0
123
+ type fsi.bus
124
+ dev: cfam.config, id ""
125
+ dev: cfam, id ""
126
+ bus: lbus.0
127
+ type lbus
128
+ dev: scratchpad, id ""
129
+ address = 0 (0x0)
307
+
130
+
308
+ ASSET_SDK_V806_AST2600_A2 = Asset(
131
+pdbg is a simple application to allow debugging of the host POWER processors
309
+ 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2600-a2-obmc.tar.gz',
132
+from the BMC. (see the `pdbg source repository`_ for more details)
310
+ '9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
311
+
133
+
312
+ def test_arm_ast2600_evb_sdk(self):
134
+.. code-block:: console
313
+ self.set_machine('ast2600-evb')
314
+
135
+
315
+ image_path = self.ASSET_SDK_V806_AST2600_A2.fetch()
136
+ root@p10bmc:~# pdbg -a getcfam 0x0
137
+ p0: 0x0 = 0xc0022d15
316
+
138
+
317
+ archive_extract(image_path, self.workdir)
139
+.. _FSI specification:
140
+ https://openpowerfoundation.org/specifications/fsi/
318
+
141
+
319
+ self.vm.add_args('-device',
142
+.. _pdbg source repository:
320
+ 'tmp105,bus=aspeed.i2c.bus.5,address=0x4d,id=tmp-test');
143
+ https://github.com/open-power/pdbg
321
+ self.vm.add_args('-device',
144
diff --git a/docs/specs/index.rst b/docs/specs/index.rst
322
+ 'ds1338,bus=aspeed.i2c.bus.5,address=0x32');
145
index XXXXXXX..XXXXXXX 100644
323
+ self.do_test_arm_aspeed_sdk_start(
146
--- a/docs/specs/index.rst
324
+ self.workdir + '/ast2600-a2/image-bmc')
147
+++ b/docs/specs/index.rst
325
+
148
@@ -XXX,XX +XXX,XX @@ guest hardware that is specific to QEMU.
326
+ self.wait_for_console_pattern('ast2600-a2 login:')
149
acpi_erst
327
+
150
sev-guest-firmware
328
+ exec_command_and_wait_for_pattern(self, 'root', 'Password:')
151
fw_cfg
329
+ exec_command_and_wait_for_pattern(self, '0penBmc', 'root@ast2600-a2:~#')
152
+ fsi
330
+
153
vmw_pvscsi-spec
331
+ exec_command_and_wait_for_pattern(self,
154
edu
332
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-5/device/new_device',
155
ivshmem-spec
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
--
156
--
351
2.47.1
157
2.43.0
352
158
353
159
diff view generated by jsdifflib
Deleted 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.
3
1
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
Deleted patch
1
This simply moves the debian boot test from the avocado testsuite to
2
the new functional testsuite. No changes in the test.
3
1
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(-)
11
12
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
13
index XXXXXXX..XXXXXXX 100644
14
--- a/tests/avocado/boot_linux_console.py
15
+++ b/tests/avocado/boot_linux_console.py
16
@@ -XXX,XX +XXX,XX @@ def test_arm_quanta_gsj_initrd(self):
17
self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
18
self.wait_for_console_pattern(
19
'Give root password for system maintenance')
20
-
21
- def test_arm_ast2600_debian(self):
22
- """
23
- :avocado: tags=arch:arm
24
- :avocado: tags=machine:rainier-bmc
25
- """
26
- deb_url = ('http://snapshot.debian.org/archive/debian/'
27
- '20220606T211338Z/'
28
- 'pool/main/l/linux/'
29
- 'linux-image-5.17.0-2-armmp_5.17.6-1%2Bb1_armhf.deb')
30
- deb_hash = '8acb2b4439faedc2f3ed4bdb2847ad4f6e0491f73debaeb7f660c8abe4dcdc0e'
31
- deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash,
32
- algorithm='sha256')
33
- kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.17.0-2-armmp')
34
- dtb_path = self.extract_from_deb(deb_path,
35
- '/usr/lib/linux-image-5.17.0-2-armmp/aspeed-bmc-ibm-rainier.dtb')
36
-
37
- self.vm.set_console()
38
- self.vm.add_args('-kernel', kernel_path,
39
- '-dtb', dtb_path,
40
- '-net', 'nic')
41
- self.vm.launch()
42
- self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
43
- self.wait_for_console_pattern("SMP: Total of 2 processors activated")
44
- self.wait_for_console_pattern("No filesystem could mount root")
45
-
46
diff --git a/tests/functional/test_arm_aspeed_rainier.py b/tests/functional/test_arm_aspeed_rainier.py
47
index XXXXXXX..XXXXXXX 100644
48
--- a/tests/functional/test_arm_aspeed_rainier.py
49
+++ b/tests/functional/test_arm_aspeed_rainier.py
50
@@ -XXX,XX +XXX,XX @@ def test_arm_aspeed_emmc_boot(self):
51
self.wait_for_console_pattern('mmcblk0: p1 p2 p3 p4 p5 p6 p7')
52
self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')
53
54
+ ASSET_DEBIAN_LINUX_ARMHF_DEB = Asset(
55
+ ('http://snapshot.debian.org/archive/debian/20220606T211338Z/pool/main/l/linux/linux-image-5.17.0-2-armmp_5.17.6-1%2Bb1_armhf.deb'),
56
+ '8acb2b4439faedc2f3ed4bdb2847ad4f6e0491f73debaeb7f660c8abe4dcdc0e')
57
+
58
+ def test_arm_debian_kernel_boot(self):
59
+ self.set_machine('rainier-bmc')
60
+
61
+ deb_path = self.ASSET_DEBIAN_LINUX_ARMHF_DEB.fetch()
62
+
63
+ kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.17.0-2-armmp')
64
+ dtb_path = self.extract_from_deb(deb_path,
65
+ '/usr/lib/linux-image-5.17.0-2-armmp/aspeed-bmc-ibm-rainier.dtb')
66
+
67
+ self.vm.set_console()
68
+ self.vm.add_args('-kernel', kernel_path,
69
+ '-dtb', dtb_path,
70
+ '-net', 'nic')
71
+ self.vm.launch()
72
+
73
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
74
+ self.wait_for_console_pattern("SMP: Total of 2 processors activated")
75
+ self.wait_for_console_pattern("No filesystem could mount root")
76
+
77
+
78
if __name__ == '__main__':
79
AspeedTest.main()
80
--
81
2.47.1
82
83
diff view generated by jsdifflib
Deleted patch
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
1
3
So far, the test cases are used for testing SMC model with AST2400 BMC.
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.
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-2-jamin_lin@aspeedtech.com
11
Signed-off-by: Cédric Le Goater <clg@redhat.com>
12
---
13
tests/qtest/aspeed_smc-test.c | 16 ++++++++++++----
14
1 file changed, 12 insertions(+), 4 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 @@ static void test_write_block_protect_bottom_bit(void)
21
flash_reset();
22
}
23
24
-int main(int argc, char **argv)
25
+static int test_palmetto_bmc(void)
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);
43
+
44
+ return ret;
45
+}
46
+
47
+int main(int argc, char **argv)
48
+{
49
+ int ret;
50
+
51
+ g_test_init(&argc, &argv, NULL);
52
+ ret = test_palmetto_bmc();
53
+
54
return ret;
55
}
56
--
57
2.47.1
58
59
diff view generated by jsdifflib
Deleted patch
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
1
3
Currently, these test cases used the hardcode offset 0x1400000 (0x14000 * 256)
4
which was beyond the 16MB flash size for flash page read/write command testing.
5
However, the default fmc flash model of ast1030-a1 EVB is "w25q80bl" whose size
6
is 1MB. To test SoC flash models, introduces a new page_addr member in TestData
7
structure, so users can set the offset for flash page read/write command
8
testing.
9
10
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
11
Reviewed-by: Cédric Le Goater <clg@redhat.com>
12
Link: https://lore.kernel.org/r/20241127091543.1243114-5-jamin_lin@aspeedtech.com
13
Signed-off-by: Cédric Le Goater <clg@redhat.com>
14
---
15
tests/qtest/aspeed_smc-test.c | 17 ++++++++++-------
16
1 file changed, 10 insertions(+), 7 deletions(-)
17
18
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/tests/qtest/aspeed_smc-test.c
21
+++ b/tests/qtest/aspeed_smc-test.c
22
@@ -XXX,XX +XXX,XX @@ typedef struct TestData {
23
char *tmp_path;
24
uint8_t cs;
25
const char *node;
26
+ uint32_t page_addr;
27
} TestData;
28
29
/*
30
@@ -XXX,XX +XXX,XX @@ static void assert_page_mem(const TestData *data, uint32_t addr,
31
static void test_erase_sector(const void *data)
32
{
33
const TestData *test_data = (const TestData *)data;
34
- uint32_t some_page_addr = 0x600 * FLASH_PAGE_SIZE;
35
+ uint32_t some_page_addr = test_data->page_addr;
36
uint32_t page[FLASH_PAGE_SIZE / 4];
37
int i;
38
39
@@ -XXX,XX +XXX,XX @@ static void test_erase_sector(const void *data)
40
static void test_erase_all(const void *data)
41
{
42
const TestData *test_data = (const TestData *)data;
43
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
44
+ uint32_t some_page_addr = test_data->page_addr;
45
uint32_t page[FLASH_PAGE_SIZE / 4];
46
int i;
47
48
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(const void *data)
49
static void test_write_page(const void *data)
50
{
51
const TestData *test_data = (const TestData *)data;
52
- uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
53
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
54
+ uint32_t my_page_addr = test_data->page_addr;
55
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
56
uint32_t page[FLASH_PAGE_SIZE / 4];
57
int i;
58
59
@@ -XXX,XX +XXX,XX @@ static void test_write_page(const void *data)
60
static void test_read_page_mem(const void *data)
61
{
62
const TestData *test_data = (const TestData *)data;
63
- uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
64
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
65
+ uint32_t my_page_addr = test_data->page_addr;
66
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
67
uint32_t page[FLASH_PAGE_SIZE / 4];
68
int i;
69
70
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
71
static void test_write_page_mem(const void *data)
72
{
73
const TestData *test_data = (const TestData *)data;
74
- uint32_t my_page_addr = 0x15000 * FLASH_PAGE_SIZE;
75
+ uint32_t my_page_addr = test_data->page_addr;
76
uint32_t page[FLASH_PAGE_SIZE / 4];
77
int i;
78
79
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
80
data->jedec_id = 0x20ba19;
81
data->cs = 0;
82
data->node = "/machine/soc/fmc/ssi.0/child[0]";
83
+ /* beyond 16MB */
84
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
85
86
qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
87
qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
88
--
89
2.47.1
90
91
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
Add test_ast2500_evb function and reused testcases for AST2500 testing.
3
Add maintainer for IBM FSI model
4
The spi base address, flash base address and ce index of fmc_cs0 are
5
0x1E620000, 0x20000000 and 0, respectively.
6
The default flash model of fmc_cs0 is "mx25l25635e" whose size is 32MB,
7
so set jedec_id 0xc22019.
8
4
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
5
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-6-jamin_lin@aspeedtech.com
7
[ clg: - slight change in commit log
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
- fixed file list ]
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
13
---
10
---
14
tests/qtest/aspeed_smc-test.c | 40 +++++++++++++++++++++++++++++++++++
11
MAINTAINERS | 9 +++++++++
15
1 file changed, 40 insertions(+)
12
1 file changed, 9 insertions(+)
16
13
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
14
diff --git a/MAINTAINERS b/MAINTAINERS
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/qtest/aspeed_smc-test.c
16
--- a/MAINTAINERS
20
+++ b/tests/qtest/aspeed_smc-test.c
17
+++ b/MAINTAINERS
21
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
18
@@ -XXX,XX +XXX,XX @@ F: tests/qtest/adm1272-test.c
22
data, test_write_block_protect_bottom_bit);
19
F: tests/qtest/max34451-test.c
23
}
20
F: tests/qtest/isl_pmbus_vr-test.c
24
21
25
+static void test_ast2500_evb(TestData *data)
22
+FSI
26
+{
23
+M: Ninad Palsule <ninad@linux.ibm.com>
27
+ int ret;
24
+R: Cédric Le Goater <clg@kaod.org>
28
+ int fd;
25
+S: Maintained
26
+F: hw/fsi/*
27
+F: include/hw/fsi/*
28
+F: docs/specs/fsi.rst
29
+F: tests/qtest/aspeed_fsi-test.c
29
+
30
+
30
+ fd = g_file_open_tmp("qtest.m25p80.mx25l25635e.XXXXXX",
31
Firmware schema specifications
31
+ &data->tmp_path, NULL);
32
M: Philippe Mathieu-Daudé <philmd@linaro.org>
32
+ g_assert(fd >= 0);
33
R: Daniel P. Berrange <berrange@redhat.com>
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;
78
}
79
--
34
--
80
2.47.1
35
2.43.0
81
36
82
37
diff view generated by jsdifflib